DIR : /home/kozerus/public_html/jkwii/js/jsdoit/preload/b64_src_preloadjs_LoadQueue_js.txt

/home/kozerus/public_html/jkwii/js/jsdoit/preload

LyoKICogTG9hZFF1ZXVlCiAqIFZpc2l0IGh0dHA6Ly9jcmVhdGVqcy5jb20vIGZvciBkb2N1bWVudGF0aW9uLCB1cGRhdGVzIGFuZCBleGFtcGxlcy4KICoKICoKICogQ29weXJpZ2h0IChjKSAyMDEyIGdza2lubmVyLmNvbSwgaW5jLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgogKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgogKiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CiAqIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAogKiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKICogY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAogKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCiAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCiAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICovCgovKioKICogUHJlbG9hZEpTIHByb3ZpZGVzIGEgY29uc2lzdGVudCB3YXkgdG8gcHJlbG9hZCBjb250ZW50IGZvciB1c2UgaW4gSFRNTCBhcHBsaWNhdGlvbnMuIFByZWxvYWRpbmcgY2FuIGJlIGRvbmUgdXNpbmcKICogSFRNTCB0YWdzLCBhcyB3ZWxsIGFzIFhIUi4KICoKICogQnkgZGVmYXVsdCwgUHJlbG9hZEpTIHdpbGwgdHJ5IGFuZCBsb2FkIGNvbnRlbnQgdXNpbmcgWEhSLCBzaW5jZSBpdCBwcm92aWRlcyBiZXR0ZXIgc3VwcG9ydCBmb3IgcHJvZ3Jlc3MgYW5kCiAqIGNvbXBsZXRpb24gZXZlbnRzLCA8Yj5ob3dldmVyIGR1ZSB0byBjcm9zcy1kb21haW4gaXNzdWVzLCBpdCBtYXkgc3RpbGwgYmUgcHJlZmVyYWJsZSB0byB1c2UgdGFnLWJhc2VkIGxvYWRpbmcKICogaW5zdGVhZDwvYj4uIE5vdGUgdGhhdCBzb21lIGNvbnRlbnQgcmVxdWlyZXMgWEhSIHRvIHdvcmsgKHBsYWluIHRleHQsIHdlYiBhdWRpbyksIGFuZCBzb21lIHJlcXVpcmVzIHRhZ3MgKEhUTUwgYXVkaW8pLgogKiBOb3RlIHRoaXMgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IHdoZXJlIHBvc3NpYmxlLgogKgogKiBQcmVsb2FkSlMgY3VycmVudGx5IHN1cHBvcnRzIGFsbCBtb2Rlcm4gYnJvd3NlcnMsIGFuZCB3ZSBoYXZlIGRvbmUgb3VyIGJlc3QgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBtb3N0IG9sZGVyCiAqIGJyb3dzZXJzLiBJZiB5b3UgZmluZCBhbiBpc3N1ZSB3aXRoIGFueSBzcGVjaWZpYyBPUy9icm93c2VyIGNvbWJpbmF0aW9uLCBwbGVhc2UgdmlzaXQgaHR0cDovL2NvbW11bml0eS5jcmVhdGVqcy5jb20vCiAqIGFuZCByZXBvcnQgaXQuCiAqCiAqIDxoND5HZXR0aW5nIFN0YXJ0ZWQ8L2g0PgogKiBUbyBnZXQgc3RhcnRlZCwgY2hlY2sgb3V0IHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZSJ9fXt7L2Nyb3NzTGlua319IGNsYXNzLCB3aGljaCBpbmNsdWRlcyBhIHF1aWNrIG92ZXJ2aWV3IG9mIGhvdwogKiB0byBsb2FkIGZpbGVzIGFuZCBwcm9jZXNzIHJlc3VsdHMuCiAqCiAqIDxoND5FeGFtcGxlPC9oND4KICoKICogICAgICB2YXIgcXVldWUgPSBuZXcgY3JlYXRlanMuTG9hZFF1ZXVlKCk7CiAqICAgICAgcXVldWUuaW5zdGFsbFBsdWdpbihjcmVhdGVqcy5Tb3VuZCk7CiAqICAgICAgcXVldWUub24oImNvbXBsZXRlIiwgaGFuZGxlQ29tcGxldGUsIHRoaXMpOwogKiAgICAgIHF1ZXVlLmxvYWRGaWxlKHtpZDoic291bmQiLCBzcmM6Imh0dHA6Ly9wYXRoL3RvL3NvdW5kLm1wMyJ9KTsKICogICAgICBxdWV1ZS5sb2FkTWFuaWZlc3QoWwogKiAgICAgICAgICB7aWQ6ICJteUltYWdlIiwgc3JjOiJwYXRoL3RvL215SW1hZ2UuanBnIn0KICogICAgICBdKTsKICogICAgICBmdW5jdGlvbiBoYW5kbGVDb21wbGV0ZSgpIHsKICogICAgICAgICAgY3JlYXRlanMuU291bmQucGxheSgic291bmQiKTsKICogICAgICAgICAgdmFyIGltYWdlID0gcXVldWUuZ2V0UmVzdWx0KCJteUltYWdlIik7CiAqICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW1hZ2UpOwogKiAgICAgIH0KICoKICogPGI+SW1wb3J0YW50IG5vdGUgb24gcGx1Z2luczo8L2I+IFBsdWdpbnMgbXVzdCBiZSBpbnN0YWxsZWQgPGk+YmVmb3JlPC9pPiBpdGVtcyBhcmUgYWRkZWQgdG8gdGhlIHF1ZXVlLCBvdGhlcndpc2UKICogdGhleSB3aWxsIG5vdCBiZSBwcm9jZXNzZWQsIGV2ZW4gaWYgdGhlIGxvYWQgaGFzIG5vdCBhY3R1YWxseSBraWNrZWQgb2ZmIHlldC4gUGx1Z2luIGZ1bmN0aW9uYWxpdHkgaXMgaGFuZGxlZCB3aGVuCiAqIHRoZSBpdGVtcyBhcmUgYWRkZWQgdG8gdGhlIExvYWRRdWV1ZS4KICoKICogPGg0PkJyb3dzZXIgU3VwcG9ydDwvaDQ+CiAqIFByZWxvYWRKUyBpcyBwYXJ0aWFsbHkgc3VwcG9ydGVkIGluIGFsbCBicm93c2VycywgYW5kIGZ1bGx5IHN1cHBvcnRlZCBpbiBhbGwgbW9kZXJuIGJyb3dzZXJzLiBLbm93biBleGNlcHRpb25zOgogKiA8dWw+PGxpPlhIUiBsb2FkaW5nIG9mIGFueSBjb250ZW50IHdpbGwgbm90IHdvcmsgaW4gbWFueSBvbGRlciBicm93c2VycyAoU2VlIGEgbWF0cml4IGhlcmU6IDxhIGhyZWY9Imh0dHA6Ly9jYW5pdXNlLmNvbS94aHIyIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL2Nhbml1c2UuY29tL3hocjI8L2E+KS4KICogICAgICBJbiBtYW55IGNhc2VzLCB5b3UgY2FuIGZhbGwgYmFjayBvbiB0YWcgbG9hZGluZyAoaW1hZ2VzLCBhdWRpbywgQ1NTLCBzY3JpcHRzLCBhbmQgU1ZHKS4gVGV4dCBhbmQKICogICAgICBXZWJBdWRpbyB3aWxsIG9ubHkgd29yayB3aXRoIFhIUi48L2xpPgogKiAgICAgIDxsaT5Tb21lIGZvcm1hdHMgaGF2ZSBwb29yIHN1cHBvcnQgZm9yIGNvbXBsZXRlIGV2ZW50cyBpbiBJRSA2LCA3LCBhbmQgOCAoU1ZHLCB0YWcgbG9hZGluZyBvZiBzY3JpcHRzLCBYTUwvSlNPTik8L2xpPgogKiAgICAgIDxsaT5PcGVyYSBoYXMgcG9vciBzdXBwb3J0IGZvciBTVkcgbG9hZGluZyB3aXRoIFhIUjwvbGk+CiAqICAgICAgPGxpPkNTUyBsb2FkaW5nIGluIEFuZHJvaWQgYW5kIFNhZmFyaSB3aWxsIG5vdCB3b3JrIHdpdGggdGFncyAoY3VycmVudGx5LCBhIHdvcmthcm91bmQgaXMgaW4gcHJvZ3Jlc3MpPC9saT4KICogICAgICA8bGk+TG9jYWwgbG9hZGluZyBpcyBub3QgcGVybWl0dGVkIHdpdGggWEhSLCB3aGljaCBpcyByZXF1aXJlZCBieSBzb21lIGZpbGUgZm9ybWF0cy4gV2hlbiB0ZXN0aW5nIGxvY2FsIGNvbnRlbnQKICogICAgICB1c2UgZWl0aGVyIGEgbG9jYWwgc2VydmVyLCBvciBlbmFibGUgdGFnIGxvYWRpbmcsIHdoaWNoIGlzIHN1cHBvcnRlZCBmb3IgbW9zdCBmb3JtYXRzLiBTZWUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvc2V0VXNlWEhSIn19e3svY3Jvc3NMaW5rfX0KICogICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L2xpPgogKiA8L3VsPgogKgogKiA8aDQ+Q3Jvc3MtZG9tYWluIExvYWRpbmc8L2g0PgogKiBNb3N0IGNvbnRlbnQgdHlwZXMgY2FuIGJlIGxvYWRlZCBjcm9zcy1kb21haW4sIGFzIGxvbmcgYXMgdGhlIHNlcnZlciBzdXBwb3J0cyBDT1JTLiBQcmVsb2FkSlMgYWxzbyBoYXMgaW50ZXJuYWwKICogc3VwcG9ydCBmb3IgaW1hZ2VzIHNlcnZlZCBmcm9tIGEgQ09SUy1lbmFibGVkIHNlcnZlciwgdmlhIHRoZSBgY3Jvc3NPcmlnaW5gIGFyZ3VtZW50IG9uIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZSJ9fXt7L2Nyb3NzTGlua319CiAqIGNvbnN0cnVjdG9yLiBJZiBzZXQgdG8gYSBzdHJpbmcgdmFsdWUgKHN1Y2ggYXMgIkFub255bW91cyIpLCB0aGUgImNyb3NzT3JpZ2luIiBwcm9wZXJ0eSBvZiBpbWFnZXMgZ2VuZXJhdGVkIGJ5CiAqIFByZWxvYWRKUyBpcyBzZXQgdG8gdGhhdCB2YWx1ZS4gUGxlYXNlIG5vdGUgdGhhdCBzZXR0aW5nIGEgYGNyb3NzT3JpZ2luYCB2YWx1ZSBvbiBhbiBpbWFnZSB0aGF0IGlzIHNlcnZlZCBmcm9tIGEKICogc2VydmVyIHdpdGhvdXQgQ09SUyB3aWxsIGNhdXNlIG90aGVyIGVycm9ycy4gRm9yIG1vcmUgaW5mbyBvbiBDT1JTLCB2aXNpdCBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Dcm9zcy1vcmlnaW5fcmVzb3VyY2Vfc2hhcmluZy4KICoKICogQG1vZHVsZSBQcmVsb2FkSlMKICogQG1haW4gUHJlbG9hZEpTCiAqLwoKLy8gbmFtZXNwYWNlOgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCi8qCiBUT0RPOiBXSU5ET1dTIElTU1VFUwogKiBObyBlcnJvciBmb3IgSFRNTCBhdWRpbyBpbiBJRSA2NzgKICogU1ZHIG5vIGZhaWx1cmUgZXJyb3IgaW4gSUUgNjcgKG1heWJlIDgpIFRBR1MgQU5EIFhIUgogKiBObyBzY3JpcHQgY29tcGxldGUgaGFuZGxlciBpbiBJRSA2NyBUQUdTIChYSFIgaXMgZmluZSkKICogTm8gWE1ML0pTT04gaW4gSUU2IFRBR1MKICogTmVlZCB0byBoaWRlIGxvYWRpbmcgU1ZHIGluIE9wZXJhIFRBR1MKICogTm8gQ1NTIG9ubG9hZC9yZWFkeXN0YXRlY2hhbmdlIGluIFNhZmFyaSBvciBBbmRyb2lkIFRBR1MgKHJlcXVpcmVzIHJ1bGUgY2hlY2tpbmcpCiAqIFNWRyBubyBsb2FkIG9yIGZhaWx1cmUgaW4gT3BlcmEgWEhSCiAqIFJlcG9ydGVkIGlzc3VlcyB3aXRoIElFNy84CiAqLwoKKGZ1bmN0aW9uICgpIHsKCSJ1c2Ugc3RyaWN0IjsKCi8vIGNvbnN0cnVjdG9yCgkvKioKCSAqIFRoZSBMb2FkUXVldWUgY2xhc3MgaXMgdGhlIG1haW4gQVBJIGZvciBwcmVsb2FkaW5nIGNvbnRlbnQuIExvYWRRdWV1ZSBpcyBhIGxvYWQgbWFuYWdlciwgd2hpY2ggY2FuIHByZWxvYWQgZWl0aGVyCgkgKiBhIHNpbmdsZSBmaWxlLCBvciBxdWV1ZSBvZiBmaWxlcy4KCSAqCgkgKiA8Yj5DcmVhdGluZyBhIFF1ZXVlPC9iPjxiciAvPgoJICogVG8gdXNlIExvYWRRdWV1ZSwgY3JlYXRlIGEgTG9hZFF1ZXVlIGluc3RhbmNlLiBJZiB5b3Ugd2FudCB0byBmb3JjZSB0YWcgbG9hZGluZyB3aGVyZSBwb3NzaWJsZSwgc2V0IHRoZSBwcmVmZXJYSFIKCSAqIGFyZ3VtZW50IHRvIGZhbHNlLgoJICoKCSAqICAgICAgdmFyIHF1ZXVlID0gbmV3IGNyZWF0ZWpzLkxvYWRRdWV1ZSh0cnVlKTsKCSAqCgkgKiA8Yj5MaXN0ZW5pbmcgZm9yIEV2ZW50czwvYj48YnIgLz4KCSAqIEFkZCBhbnkgbGlzdGVuZXJzIHlvdSB3YW50IHRvIHRoZSBxdWV1ZS4gU2luY2UgUHJlbG9hZEpTIDAuMy4wLCB0aGUge3sjY3Jvc3NMaW5rICJFdmVudERpc3BhdGNoZXIifX17ey9jcm9zc0xpbmt9fQoJICogbGV0cyB5b3UgYWRkIGFzIG1hbnkgbGlzdGVuZXJzIGFzIHlvdSB3YW50IGZvciBldmVudHMuIFlvdSBjYW4gc3Vic2NyaWJlIHRvIHRoZSBmb2xsb3dpbmcgZXZlbnRzOjx1bD4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9jb21wbGV0ZTpldmVudCJ9fXt7L2Nyb3NzTGlua319OiBmaXJlZCB3aGVuIGEgcXVldWUgY29tcGxldGVzIGxvYWRpbmcgYWxsCgkgKiAgICAgZmlsZXM8L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL2Vycm9yOmV2ZW50In19e3svY3Jvc3NMaW5rfX06IGZpcmVkIHdoZW4gdGhlIHF1ZXVlIGVuY291bnRlcnMgYW4gZXJyb3Igd2l0aAoJICogICAgIGFueSBmaWxlLjwvbGk+CgkgKiAgICAgPGxpPnt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvcHJvZ3Jlc3M6ZXZlbnQifX17ey9jcm9zc0xpbmt9fTogUHJvZ3Jlc3MgZm9yIHRoZSBlbnRpcmUgcXVldWUgaGFzCgkgKiAgICAgY2hhbmdlZC48L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9maWxlbG9hZDpldmVudCJ9fXt7L2Nyb3NzTGlua319OiBBIHNpbmdsZSBmaWxlIGhhcyBjb21wbGV0ZWQgbG9hZGluZy48L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9maWxlcHJvZ3Jlc3M6ZXZlbnQifX17ey9jcm9zc0xpbmt9fTogUHJvZ3Jlc3MgZm9yIGEgc2luZ2xlIGZpbGUgaGFzIGNoYW5nZXMuIE5vdGUKCSAqICAgICB0aGF0IG9ubHkgZmlsZXMgbG9hZGVkIHdpdGggWEhSIChvciBwb3NzaWJseSBieSBwbHVnaW5zKSB3aWxsIGZpcmUgcHJvZ3Jlc3MgZXZlbnRzIG90aGVyIHRoYW4gMCBvciAxMDAlLjwvbGk+CgkgKiA8L3VsPgoJICoKCSAqICAgICAgcXVldWUub24oImZpbGVsb2FkIiwgaGFuZGxlRmlsZUxvYWQsIHRoaXMpOwoJICogICAgICBxdWV1ZS5vbigiY29tcGxldGUiLCBoYW5kbGVDb21wbGV0ZSwgdGhpcyk7CgkgKgoJICogPGI+QWRkaW5nIGZpbGVzIGFuZCBtYW5pZmVzdHM8L2I+PGJyIC8+CgkgKiBBZGQgZmlsZXMgeW91IHdhbnQgdG8gbG9hZCB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkRmlsZSJ9fXt7L2Nyb3NzTGlua319IG9yIGFkZCBtdWx0aXBsZSBmaWxlcyBhdCBhCgkgKiB0aW1lIHVzaW5nIGEgbGlzdCBvciBhIG1hbmlmZXN0IGRlZmluaXRpb24gdXNpbmcge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZE1hbmlmZXN0In19e3svY3Jvc3NMaW5rfX0uIEZpbGVzIGFyZQoJICogYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgYWN0aXZlIHF1ZXVlLCBzbyB5b3UgY2FuIHVzZSB0aGVzZSBtZXRob2RzIGFzIG1hbnkgdGltZXMgYXMgeW91IGxpa2UsIHdoZW5ldmVyIHlvdQoJICogbGlrZS4KCSAqCgkgKiAgICAgIHF1ZXVlLmxvYWRGaWxlKCJmaWxlUGF0aC9maWxlLmpwZyIpOwoJICogICAgICBxdWV1ZS5sb2FkRmlsZSh7aWQ6ImltYWdlIiwgc3JjOiJmaWxlUGF0aC9maWxlLmpwZyJ9KTsKCSAqICAgICAgcXVldWUubG9hZE1hbmlmZXN0KFsiZmlsZVBhdGgvZmlsZS5qcGciLCB7aWQ6ImltYWdlIiwgc3JjOiJmaWxlUGF0aC9maWxlLmpwZyJ9XSk7CgkgKgoJICogICAgICAvLyBVc2UgYW4gZXh0ZXJuYWwgbWFuaWZlc3QKCSAqICAgICAgcXVldWUubG9hZE1hbmlmZXN0KCJwYXRoL3RvL21hbmlmZXN0Lmpzb24iKTsKCSAqICAgICAgcXVldWUubG9hZE1hbmlmZXN0KHtzcmM6Im1hbmlmZXN0Lmpzb24iLCB0eXBlOiJtYW5pZmVzdCJ9KTsKCSAqCgkgKiBJZiB5b3UgcGFzcyBgZmFsc2VgIGFzIHRoZSBgbG9hZE5vd2AgcGFyYW1ldGVyLCB0aGUgcXVldWUgd2lsbCBub3Qga2ljayBvZiB0aGUgbG9hZCBvZiB0aGUgZmlsZXMsIGJ1dCBpdCB3aWxsIG5vdAoJICogc3RvcCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuIENhbGwgdGhlIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvbG9hZCJ9fXt7L2Nyb3NzTGlua319IG1ldGhvZCB0byBiZWdpbgoJICogYSBwYXVzZWQgcXVldWUuIE5vdGUgdGhhdCBhIHBhdXNlZCBxdWV1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzdW1lIHdoZW4gbmV3IGZpbGVzIGFyZSBhZGRlZCB0byBpdCB3aXRoIGEKCSAqIGBsb2FkTm93YCBhcmd1bWVudCBvZiBgdHJ1ZWAuCgkgKgoJICogICAgICBxdWV1ZS5sb2FkKCk7CgkgKgoJICogPGI+RmlsZSBUeXBlczwvYj48YnIgLz4KCSAqIFRoZSBmaWxlIHR5cGUgb2YgYSBtYW5pZmVzdCBpdGVtIGlzIGF1dG8tZGV0ZXJtaW5lZCBieSB0aGUgZmlsZSBleHRlbnNpb24uIFRoZSBwYXR0ZXJuIG1hdGNoaW5nIGluIFByZWxvYWRKUwoJICogc2hvdWxkIGhhbmRsZSB0aGUgbWFqb3JpdHkgb2Ygc3RhbmRhcmQgZmlsZSBhbmQgdXJsIGZvcm1hdHMsIGFuZCB3b3JrcyB3aXRoIGNvbW1vbiBmaWxlIGV4dGVuc2lvbnMuIElmIHlvdSBoYXZlCgkgKiBlaXRoZXIgYSBub24tc3RhbmRhcmQgZmlsZSBleHRlbnNpb24sIG9yIGFyZSBzZXJ2aW5nIHRoZSBmaWxlIHVzaW5nIGEgcHJveHkgc2NyaXB0LCB0aGVuIHlvdSBjYW4gcGFzcyBpbiBhCgkgKiA8Y29kZT50eXBlPC9jb2RlPiBwcm9wZXJ0eSB3aXRoIGFueSBtYW5pZmVzdCBpdGVtLgoJICoKCSAqICAgICAgcXVldWUubG9hZEZpbGUoe3NyYzoicGF0aC90by9teUZpbGUubXAzeCIsIHR5cGU6Y3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU09VTkR9KTsKCSAqCgkgKiAgICAgIC8vIE5vdGUgdGhhdCBQcmVsb2FkSlMgd2lsbCBub3QgcmVhZCBhIGZpbGUgZXh0ZW5zaW9uIGZyb20gdGhlIHF1ZXJ5IHN0cmluZwoJICogICAgICBxdWV1ZS5sb2FkRmlsZSh7c3JjOiJodHRwOi8vc2VydmVyLmNvbS9wcm94eT9maWxlPWltYWdlLmpwZyIsIHR5cGU6Y3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuSU1BR0V9KTsKCSAqCgkgKiBTdXBwb3J0ZWQgdHlwZXMgYXJlIGRlZmluZWQgb24gdGhlIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIifX17ey9jcm9zc0xpbmt9fSBjbGFzcywgYW5kIGluY2x1ZGU6CgkgKiA8dWw+CgkgKiAgICAgPGxpPnt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvQklOQVJZOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX06IFJhdyBiaW5hcnkgZGF0YSB2aWEgWEhSPC9saT4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9DU1M6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fTogQ1NTIGZpbGVzPC9saT4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9JTUFHRTpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319OiBDb21tb24gaW1hZ2UgZm9ybWF0czwvbGk+CgkgKiAgICAgPGxpPnt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvSkFWQVNDUklQVDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319OiBKYXZhU2NyaXB0IGZpbGVzPC9saT4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9KU09OOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX06IEpTT04gZGF0YTwvbGk+CgkgKiAgICAgPGxpPnt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvSlNPTlA6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fTogSlNPTiBmaWxlcyBjcm9zcy1kb21haW48L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL01BTklGRVNUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX06IEEgbGlzdCBvZiBmaWxlcyB0byBsb2FkIGluIEpTT04gZm9ybWF0LCBzZWUKCSAqICAgICB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL2xvYWRNYW5pZmVzdCJ9fXt7L2Nyb3NzTGlua319PC9saT4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9TT1VORDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319OiBBdWRpbyBmaWxlIGZvcm1hdHM8L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1NQUklURVNIRUVUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX06IEpTT04gU3ByaXRlU2hlZXQgZGVmaW5pdGVpb25zLiBUaGlzCgkgKiAgICAgd2lsbCBhbHNvIGxvYWQgc3ViLWltYWdlcywgYW5kIHByb3ZpZGUgYSB7eyNjcm9zc0xpbmsgIlNwcml0ZVNoZWV0In19e3svY3Jvc3NMaW5rfX0gaW5zdGFuY2UuPC9saT4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9TVkc6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fTogU1ZHIGZpbGVzPC9saT4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9URVhUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX06IFRleHQgZmlsZXMgLSBYSFIgb25seTwvbGk+CgkgKiAgICAgPGxpPnt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvWE1MOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX06IFhNTCBkYXRhPC9saT4KCSAqIDwvdWw+CgkgKgoJICogPGVtPk5vdGU6IExvYWRlciB0eXBlcyB1c2VkIHRvIGJlIGRlZmluZWQgb24gTG9hZFF1ZXVlLCBidXQgaGF2ZSBiZWVuIG1vdmVkIHRvIEFic3RyYWN0TG9hZGVyIGZvciBiZXR0ZXIKCSAqIHBvcnRhYmlsaXR5IG9mIGxvYWRlciBjbGFzc2VzLCB3aGljaCBjYW4gYmUgdXNlZCBpbmRpdmlkdWFsbHkgbm93LiBUaGUgcHJvcGVydGllcyBvbiBMb2FkUXVldWUgc3RpbGwgZXhpc3QsIGJ1dAoJICogYXJlIGRlcHJlY2F0ZWQuPC9lbT4KCSAqCgkgKiA8Yj5IYW5kbGluZyBSZXN1bHRzPC9iPjxiciAvPgoJICogV2hlbiBhIGZpbGUgaXMgZmluaXNoZWQgZG93bmxvYWRpbmcsIGEge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvZmlsZWxvYWQ6ZXZlbnQifX17ey9jcm9zc0xpbmt9fSBldmVudCBpcwoJICogZGlzcGF0Y2hlZC4gSW4gYW4gZXhhbXBsZSBhYm92ZSwgdGhlcmUgaXMgYW4gZXZlbnQgbGlzdGVuZXIgc25pcHBldCBmb3IgZmlsZWxvYWQuIExvYWRlZCBmaWxlcyBhcmUgdXN1YWxseSBhCgkgKiBmb3JtYXR0ZWQgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHksIGluY2x1ZGluZzoKCSAqIDx1bD4KCSAqICAgICA8bGk+QmluYXJ5OiBUaGUgYmluYXJ5IGxvYWRlZCByZXN1bHQ8L2xpPgoJICogICAgIDxsaT5DU1M6IEEgJmx0O2xpbmsgLyZndDsgdGFnPC9saT4KCSAqICAgICA8bGk+SW1hZ2U6IEFuICZsdDtpbWcgLyZndDsgdGFnPC9saT4KCSAqICAgICA8bGk+SmF2YVNjcmlwdDogQSAmbHQ7c2NyaXB0IC8mZ3Q7IHRhZzwvbGk+CgkgKiAgICAgPGxpPkpTT04vSlNPTlA6IEEgZm9ybWF0dGVkIEphdmFTY3JpcHQgT2JqZWN0PC9saT4KCSAqICAgICA8bGk+TWFuaWZlc3Q6IEEgSmF2YVNjcmlwdCBvYmplY3QuCgkgKiAgICAgPGxpPlNvdW5kOiBBbiAmbHQ7YXVkaW8gLyZndDsgdGFnPC9hPgoJICogICAgIDxsaT5TcHJpdGVTaGVldDogQSB7eyNjcm9zc0xpbmsgIlNwcml0ZVNoZWV0In19e3svY3Jvc3NMaW5rfX0gaW5zdGFuY2UsIGNvbnRhaW5pbmcgbG9hZGVkIGltYWdlcy4KCSAqICAgICA8bGk+U1ZHOiBBbiAmbHQ7b2JqZWN0IC8mZ3Q7IHRhZzwvbGk+CgkgKiAgICAgPGxpPlRleHQ6IFJhdyB0ZXh0PC9saT4KCSAqICAgICA8bGk+WE1MOiBBbiBYTUwgRE9NIG5vZGU8L2xpPgoJICogPC91bD4KCSAqCgkgKiAgICAgIGZ1bmN0aW9uIGhhbmRsZUZpbGVMb2FkKGV2ZW50KSB7CgkgKiAgICAgICAgICB2YXIgaXRlbSA9IGV2ZW50Lml0ZW07IC8vIEEgcmVmZXJlbmNlIHRvIHRoZSBpdGVtIHRoYXQgd2FzIHBhc3NlZCBpbiB0byB0aGUgTG9hZFF1ZXVlCgkgKiAgICAgICAgICB2YXIgdHlwZSA9IGl0ZW0udHlwZTsKCSAqCgkgKiAgICAgICAgICAvLyBBZGQgYW55IGltYWdlcyB0byB0aGUgcGFnZSBib2R5LgoJICogICAgICAgICAgaWYgKHR5cGUgPT0gY3JlYXRlanMuTG9hZFF1ZXVlLklNQUdFKSB7CgkgKiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChldmVudC5yZXN1bHQpOwoJICogICAgICAgICAgfQoJICogICAgICB9CgkgKgoJICogQXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGZpbGUgaGFzIGJlZW4gbG9hZGVkICh1c3VhbGx5IGFmdGVyIHRoZSBxdWV1ZSBoYXMgY29tcGxldGVkKSwgYW55IHJlc3VsdCBjYW4gYmUgbG9va2VkIHVwCgkgKiB2aWEgaXRzICJpZCIgdXNpbmcge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvZ2V0UmVzdWx0In19e3svY3Jvc3NMaW5rfX0uIElmIG5vIGlkIHdhcyBwcm92aWRlZCwgdGhlbiB0aGUKCSAqICJzcmMiIG9yIGZpbGUgcGF0aCBjYW4gYmUgdXNlZCBpbnN0ZWFkLCBpbmNsdWRpbmcgdGhlIGBwYXRoYCBkZWZpbmVkIGJ5IGEgbWFuaWZlc3QsIGJ1dCA8c3Ryb25nPm5vdCBpbmNsdWRpbmc8L3N0cm9uZz4KCSAqIGEgYmFzZSBwYXRoIGRlZmluZWQgb24gdGhlIExvYWRRdWV1ZS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gYWx3YXlzIHBhc3MgYW4gaWQgaWYgeW91IHdhbnQgdG8gbG9vayB1cCBjb250ZW50LgoJICoKCSAqICAgICAgdmFyIGltYWdlID0gcXVldWUuZ2V0UmVzdWx0KCJpbWFnZSIpOwoJICogICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGltYWdlKTsKCSAqCgkgKiBSYXcgbG9hZGVkIGNvbnRlbnQgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIHRoZSA8Y29kZT5yYXdSZXN1bHQ8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9maWxlbG9hZDpldmVudCJ9fXt7L2Nyb3NzTGlua319CgkgKiBldmVudCwgb3IgY2FuIGJlIGxvb2tlZCB1cCB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9nZXRSZXN1bHQifX17ey9jcm9zc0xpbmt9fSwgcGFzc2luZyBgdHJ1ZWAgYXMgdGhlIDJuZAoJICogYXJndW1lbnQuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjb250ZW50IHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZvciB0aGUgYnJvd3Nlciwgc3BlY2lmaWNhbGx5OiBKYXZhU2NyaXB0LAoJICogQ1NTLCBYTUwsIFNWRywgYW5kIEpTT04gb2JqZWN0cywgb3IgYW55dGhpbmcgbG9hZGVkIHdpdGggWEhSLgoJICoKCSAqICAgICAgdmFyIGltYWdlID0gcXVldWUuZ2V0UmVzdWx0KCJpbWFnZSIsIHRydWUpOyAvLyBsb2FkIHRoZSBiaW5hcnkgaW1hZ2UgZGF0YSBsb2FkZWQgd2l0aCBYSFIuCgkgKgoJICogPGI+UGx1Z2luczwvYj48YnIgLz4KCSAqIExvYWRRdWV1ZSBoYXMgYSBzaW1wbGUgcGx1Z2luIGFyY2hpdGVjdHVyZSB0byBoZWxwIHByb2Nlc3MgYW5kIHByZWxvYWQgY29udGVudC4gRm9yIGV4YW1wbGUsIHRvIHByZWxvYWQgYXVkaW8sCgkgKiBtYWtlIHN1cmUgdG8gaW5zdGFsbCB0aGUgPGEgaHJlZj0iaHR0cDovL3NvdW5kanMuY29tIj5Tb3VuZEpTPC9hPiBTb3VuZCBjbGFzcywgd2hpY2ggd2lsbCBoZWxwIGxvYWQgSFRNTCBhdWRpbywKCSAqIEZsYXNoIGF1ZGlvLCBhbmQgV2ViQXVkaW8gZmlsZXMuIFRoaXMgc2hvdWxkIGJlIGluc3RhbGxlZCA8c3Ryb25nPmJlZm9yZTwvc3Ryb25nPiBsb2FkaW5nIGFueSBhdWRpbyBmaWxlcy4KCSAqCgkgKiAgICAgIHF1ZXVlLmluc3RhbGxQbHVnaW4oY3JlYXRlanMuU291bmQpOwoJICoKCSAqIDxoND5Lbm93biBCcm93c2VyIElzc3VlczwvaDQ+CgkgKiA8dWw+CgkgKiAgICAgPGxpPkJyb3dzZXJzIHdpdGhvdXQgYXVkaW8gc3VwcG9ydCBjYW4gbm90IGxvYWQgYXVkaW8gZmlsZXMuPC9saT4KCSAqICAgICA8bGk+U2FmYXJpIG9uIE1hYyBPUyBYIGNhbiBvbmx5IHBsYXkgSFRNTCBhdWRpbyBpZiBRdWlja1RpbWUgaXMgaW5zdGFsbGVkPC9saT4KCSAqICAgICA8bGk+SFRNTCBBdWRpbyB0YWdzIHdpbGwgb25seSBkb3dubG9hZCB1bnRpbCB0aGVpciA8Y29kZT5jYW5QbGF5VGhyb3VnaDwvY29kZT4gZXZlbnQgaXMgZmlyZWQuIEJyb3dzZXJzIG90aGVyCgkgKiAgICAgdGhhbiBDaHJvbWUgd2lsbCBjb250aW51ZSB0byBkb3dubG9hZCBpbiB0aGUgYmFja2dyb3VuZC48L2xpPgoJICogICAgIDxsaT5XaGVuIGxvYWRpbmcgc2NyaXB0cyB1c2luZyB0YWdzLCB0aGV5IGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBkb2N1bWVudC48L2xpPgoJICogICAgIDxsaT5TY3JpcHRzIGxvYWRlZCB2aWEgWEhSIG1heSBub3QgYmUgcHJvcGVybHkgaW5zcGVjdGFibGUgd2l0aCBicm93c2VyIHRvb2xzLjwvbGk+CgkgKiAgICAgPGxpPklFNiBhbmQgSUU3IChhbmQgc29tZSBvdGhlciBicm93c2VycykgbWF5IG5vdCBiZSBhYmxlIHRvIGxvYWQgWE1MLCBUZXh0LCBvciBKU09OLCBzaW5jZSB0aGV5IHJlcXVpcmUKCSAqICAgICBYSFIgdG8gd29yay48L2xpPgoJICogICAgIDxsaT5Db250ZW50IGxvYWRlZCB2aWEgdGFncyB3aWxsIG5vdCBzaG93IHByb2dyZXNzLCBhbmQgd2lsbCBjb250aW51ZSB0byBkb3dubG9hZCBpbiB0aGUgYmFja2dyb3VuZCB3aGVuCgkgKiAgICAgY2FuY2VsZWQsIGFsdGhvdWdoIG5vIGV2ZW50cyB3aWxsIGJlIGRpc3BhdGNoZWQuPC9saT4KCSAqIDwvdWw+CgkgKgoJICogQGNsYXNzIExvYWRRdWV1ZQoJICogQHBhcmFtIHtCb29sZWFufSBbcHJlZmVyWEhSPXRydWVdIERldGVybWluZXMgd2hldGhlciB0aGUgcHJlbG9hZCBpbnN0YW5jZSB3aWxsIGZhdm9yIGxvYWRpbmcgd2l0aCBYSFIgKFhNTCBIVFRQCgkgKiBSZXF1ZXN0cyksIG9yIEhUTUwgdGFncy4gV2hlbiB0aGlzIGlzIGBmYWxzZWAsIHRoZSBxdWV1ZSB3aWxsIHVzZSB0YWcgbG9hZGluZyB3aGVuIHBvc3NpYmxlLCBhbmQgZmFsbCBiYWNrIG9uIFhIUgoJICogd2hlbiBuZWNlc3NhcnkuCgkgKiBAcGFyYW0ge1N0cmluZ30gW2Jhc2VQYXRoPSIiXSBBIHBhdGggdGhhdCB3aWxsIGJlIHByZXBlbmRlZCBvbiB0byB0aGUgc291cmNlIHBhcmFtZXRlciBvZiBhbGwgaXRlbXMgaW4gdGhlIHF1ZXVlCgkgKiBiZWZvcmUgdGhleSBhcmUgbG9hZGVkLiAgU291cmNlcyBiZWdpbm5pbmcgd2l0aCBhIHByb3RvY29sIHN1Y2ggYXMgYGh0dHA6Ly9gIG9yIGEgcmVsYXRpdmUgcGF0aCBzdWNoIGFzIGAuLi9gCgkgKiB3aWxsIG5vdCByZWNlaXZlIGEgYmFzZSBwYXRoLgoJICogQHBhcmFtIHtTdHJpbmd8Qm9vbGVhbn0gW2Nyb3NzT3JpZ2luPSIiXSBBbiBvcHRpb25hbCBmbGFnIHRvIHN1cHBvcnQgaW1hZ2VzIGxvYWRlZCBmcm9tIGEgQ09SUy1lbmFibGVkIHNlcnZlci4gVG8KCSAqIHVzZSBpdCwgc2V0IHRoaXMgdmFsdWUgdG8gYHRydWVgLCB3aGljaCB3aWxsIGRlZmF1bHQgdGhlIGNyb3NzT3JpZ2luIHByb3BlcnR5IG9uIGltYWdlcyB0byAiQW5vbnltb3VzIi4gQW55CgkgKiBzdHJpbmcgdmFsdWUgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCwgYnV0IG9ubHkgIiIgYW5kICJBbm9ueW1vdXMiIGFyZSByZWNvbW1lbmRlZC4gPHN0cm9uZz5Ob3RlOiBUaGUgY3Jvc3NPcmlnaW4KCSAqIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLiBVc2UgTG9hZEl0ZW0uY3Jvc3NPcmlnaW4gaW5zdGVhZDwvc3Ryb25nPgoJICoKCSAqIEBjb25zdHJ1Y3RvcgoJICogQGV4dGVuZHMgQWJzdHJhY3RMb2FkZXIKCSAqLwoJZnVuY3Rpb24gTG9hZFF1ZXVlKHByZWZlclhIUiwgYmFzZVBhdGgsIGNyb3NzT3JpZ2luKSB7CgkJdGhpcy5BYnN0cmFjdExvYWRlcl9jb25zdHJ1Y3RvcigpOwoJCXRoaXMuaW5pdChwcmVmZXJYSFIsIGJhc2VQYXRoLCBjcm9zc09yaWdpbik7Cgl9CgoJdmFyIHAgPSBjcmVhdGVqcy5leHRlbmQoTG9hZFF1ZXVlLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlcik7Cgl2YXIgcyA9IExvYWRRdWV1ZTsKCgkvKioKCSAqIDxzdHJvbmc+UkVNT1ZFRDwvc3Ryb25nPi4gUmVtb3ZlZCBpbiBmYXZvciBvZiB1c2luZyBgTXlTdXBlckNsYXNzX2NvbnN0cnVjdG9yYC4KCSAqIFNlZSB7eyNjcm9zc0xpbmsgIlV0aWxpdHkgTWV0aG9kcy9leHRlbmQifX17ey9jcm9zc0xpbmt9fSBhbmQge3sjY3Jvc3NMaW5rICJVdGlsaXR5IE1ldGhvZHMvcHJvbW90ZSJ9fXt7L2Nyb3NzTGlua319CgkgKiBmb3IgZGV0YWlscy4KCSAqCgkgKiBUaGVyZSBpcyBhbiBpbmhlcml0YW5jZSB0dXRvcmlhbCBkaXN0cmlidXRlZCB3aXRoIEVhc2VsSlMgaW4gL3R1dG9yaWFscy9Jbmhlcml0YW5jZS4KCSAqCgkgKiBAbWV0aG9kIGluaXRpYWxpemUKCSAqIEBwcm90ZWN0ZWQKCSAqIEBkZXByZWNhdGVkCgkgKi8KCS8vIHAuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKCkge307IC8vIHNlYXJjaGFibGUgZm9yIGRldnMgd29uZGVyaW5nIHdoZXJlIGl0IGlzLgoKCgkvKioKCSAqIEFuIGludGVybmFsIGluaXRpYWxpemF0aW9uIG1ldGhvZCwgd2hpY2ggaXMgdXNlZCBmb3IgaW5pdGlhbCBzZXQgdXAsIGJ1dCBhbHNvIHRvIHJlc2V0IHRoZSBMb2FkUXVldWUuCgkgKiBAbWV0aG9kIGluaXQKCSAqIEBwYXJhbSBwcmVmZXJYSFIKCSAqIEBwYXJhbSBiYXNlUGF0aAoJICogQHBhcmFtIGNyb3NzT3JpZ2luCgkgKiBAcHJpdmF0ZQoJICovCglwLmluaXQgPSBmdW5jdGlvbihwcmVmZXJYSFIsIGJhc2VQYXRoLCBjcm9zc09yaWdpbikgewoKCQkvLyBwdWJsaWMgcHJvcGVydGllcwoJCS8qKgoJCSAqIEBwcm9wZXJ0eSB1c2VYSFIKCQkgKiBAdHlwZSB7Qm9vbGVhbn0KCQkgKiBAcmVhZE9ubHkKCQkgKiBAZGVmYXVsdCB0cnVlCgkJICogQGRlcHJlY2F0ZWQgVXNlIHByZWZlclhIUiBpbnN0ZWFkLgoJCSAqLwoJCXRoaXMudXNlWEhSID0gdHJ1ZTsKCgkJLyoqCgkJICogVHJ5IGFuZCB1c2UgWE1MSHR0cFJlcXVlc3QgKFhIUikgd2hlbiBwb3NzaWJsZS4gTm90ZSB0aGF0IExvYWRRdWV1ZSB3aWxsIGRlZmF1bHQgdG8gdGFnIGxvYWRpbmcgb3IgWEhSCgkJICogbG9hZGluZyBkZXBlbmRpbmcgb24gdGhlIHJlcXVpcmVtZW50cyBmb3IgYSBtZWRpYSB0eXBlLiBGb3IgZXhhbXBsZSwgSFRNTCBhdWRpbyBjYW4gbm90IGJlIGxvYWRlZCB3aXRoIFhIUiwKCQkgKiBhbmQgcGxhaW4gdGV4dCBjYW4gbm90IGJlIGxvYWRlZCB3aXRoIHRhZ3MsIHNvIGl0IHdpbGwgZGVmYXVsdCB0aGUgdGhlIGNvcnJlY3QgdHlwZSBpbnN0ZWFkIG9mIHVzaW5nIHRoZQoJCSAqIHVzZXItZGVmaW5lZCB0eXBlLgoJCSAqIEB0eXBlIHtCb29sZWFufQoJCSAqIEBkZWZhdWx0IHRydWUKCQkgKiBAc2luY2UgMC42LjAKCQkgKi8KCQl0aGlzLnByZWZlclhIUiA9IHRydWU7IC8vVE9ETzogR2V0L1NldAoJCXRoaXMuX3ByZWZlclhIUiA9IHRydWU7CgkJdGhpcy5zZXRQcmVmZXJYSFIocHJlZmVyWEhSKTsKCgkJLyoqCgkJICogRGV0ZXJtaW5lcyBpZiB0aGUgTG9hZFF1ZXVlIHdpbGwgc3RvcCBwcm9jZXNzaW5nIHRoZSBjdXJyZW50IHF1ZXVlIHdoZW4gYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCgkJICogQHByb3BlcnR5IHN0b3BPbkVycm9yCgkJICogQHR5cGUge0Jvb2xlYW59CgkJICogQGRlZmF1bHQgZmFsc2UKCQkgKi8KCQl0aGlzLnN0b3BPbkVycm9yID0gZmFsc2U7CgoJCS8qKgoJCSAqIEVuc3VyZSBsb2FkZWQgc2NyaXB0cyAiY29tcGxldGUiIGluIHRoZSBvcmRlciB0aGV5IGFyZSBzcGVjaWZpZWQuIExvYWRlZCBzY3JpcHRzIGFyZSBhZGRlZCB0byB0aGUgZG9jdW1lbnQgaGVhZAoJCSAqIG9uY2UgdGhleSBhcmUgbG9hZGVkLiBTY3JpcHRzIGxvYWRlZCB2aWEgdGFncyB3aWxsIGxvYWQgb25lLWF0LWEtdGltZSB3aGVuIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgLCB3aGVyZWFzCgkJICogc2NyaXB0cyBsb2FkZWQgdXNpbmcgWEhSIGNhbiBsb2FkIGluIGFueSBvcmRlciwgYnV0IHdpbGwgImZpbmlzaCIgYW5kIGJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBpbiB0aGUgb3JkZXIKCQkgKiBzcGVjaWZpZWQuCgkJICoKCQkgKiBBbnkgaXRlbXMgY2FuIGJlIHNldCB0byBsb2FkIGluIG9yZGVyIGJ5IHNldHRpbmcgdGhlIHt7I2Nyb3NzTGluayAibWFpbnRhaW5PcmRlcjpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319CgkJICogcHJvcGVydHkgb24gdGhlIGxvYWQgaXRlbSwgb3IgYnkgZW5zdXJpbmcgdGhhdCBvbmx5IG9uZSBjb25uZWN0aW9uIGNhbiBiZSBvcGVuIGF0IGEgdGltZSB1c2luZwoJCSAqIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL3NldE1heENvbm5lY3Rpb25zIn19e3svY3Jvc3NMaW5rfX0uIE5vdGUgdGhhdCB3aGVuIHRoZSBgbWFpbnRhaW5TY3JpcHRPcmRlcmAgcHJvcGVydHkKCQkgKiBpcyBzZXQgdG8gYHRydWVgLCBzY3JpcHRzIGl0ZW1zIGFyZSBhdXRvbWF0aWNhbGx5IHNldCB0byBgbWFpbnRhaW5PcmRlcj10cnVlYCwgYW5kIGNoYW5naW5nIHRoZQoJCSAqIGBtYWludGFpblNjcmlwdE9yZGVyYCB0byBgZmFsc2VgIGR1cmluZyBhIGxvYWQgd2lsbCBub3QgY2hhbmdlIGl0ZW1zIGFscmVhZHkgaW4gYSBxdWV1ZS4KCQkgKgoJCSAqIDxoND5FeGFtcGxlPC9oND4KCQkgKgoJCSAqICAgICAgdmFyIHF1ZXVlID0gbmV3IGNyZWF0ZWpzLkxvYWRRdWV1ZSgpOwoJCSAqICAgICAgcXVldWUuc2V0TWF4Q29ubmVjdGlvbnMoMyk7IC8vIFNldCBhIGhpZ2hlciBudW1iZXIgdG8gbG9hZCBtdWx0aXBsZSBpdGVtcyBhdCBvbmNlCgkJICogICAgICBxdWV1ZS5tYWludGFpblNjcmlwdE9yZGVyID0gdHJ1ZTsgLy8gRW5zdXJlIHNjcmlwdHMgYXJlIGxvYWRlZCBpbiBvcmRlcgoJCSAqICAgICAgcXVldWUubG9hZE1hbmlmZXN0KFsKCQkgKiAgICAgICAgICAic2NyaXB0MS5qcyIsCgkJICogICAgICAgICAgInNjcmlwdDIuanMiLAoJCSAqICAgICAgICAgICJpbWFnZS5wbmciLCAvLyBMb2FkIGFueSB0aW1lCgkJICogICAgICAgICAge3NyYzogImltYWdlMi5wbmciLCBtYWludGFpbk9yZGVyOiB0cnVlfSAvLyBXaWxsIHdhaXQgZm9yIHNjcmlwdDIuanMKCQkgKiAgICAgICAgICAiaW1hZ2UzLnBuZyIsCgkJICogICAgICAgICAgInNjcmlwdDMuanMiIC8vIFdpbGwgd2FpdCBmb3IgaW1hZ2UyLnBuZyBiZWZvcmUgbG9hZGluZyAob3IgY29tcGxldGluZyB3aGVuIGxvYWRpbmcgd2l0aCBYSFIpCgkJICogICAgICBdKTsKCQkgKgoJCSAqIEBwcm9wZXJ0eSBtYWludGFpblNjcmlwdE9yZGVyCgkJICogQHR5cGUge0Jvb2xlYW59CgkJICogQGRlZmF1bHQgdHJ1ZQoJCSAqLwoJCXRoaXMubWFpbnRhaW5TY3JpcHRPcmRlciA9IHRydWU7CgoJCS8qKgoJCSAqIFRoZSBuZXh0IHByZWxvYWQgcXVldWUgdG8gcHJvY2VzcyB3aGVuIHRoaXMgb25lIGlzIGNvbXBsZXRlLiBJZiBhbiBlcnJvciBpcyB0aHJvd24gaW4gdGhlIGN1cnJlbnQgcXVldWUsIGFuZAoJCSAqIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL3N0b3BPbkVycm9yOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaXMgYHRydWVgLCB0aGUgbmV4dCBxdWV1ZSB3aWxsIG5vdCBiZSBwcm9jZXNzZWQuCgkJICogQHByb3BlcnR5IG5leHQKCQkgKiBAdHlwZSB7TG9hZFF1ZXVlfQoJCSAqIEBkZWZhdWx0IG51bGwKCQkgKi8KCQl0aGlzLm5leHQgPSBudWxsOwoKCQkvLyBwcm90ZWN0ZWQgcHJvcGVydGllcwoJCS8qKgoJCSAqIFdoZXRoZXIgdGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBwYXVzZWQgb3Igbm90LgoJCSAqIEBwcm9wZXJ0eSBfcGF1c2VkCgkJICogQHR5cGUge2Jvb2xlYW59CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9wYXVzZWQgPSBmYWxzZTsKCgkJLyoqCgkJICogQSBwYXRoIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgb24gdG8gdGhlIGl0ZW0ncyB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtL3NyYzpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319LiBUaGUKCQkgKiBgX2Jhc2VQYXRoYCBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgdXNlZCBpZiBhbiBpdGVtJ3Mgc291cmNlIGlzIHJlbGF0aXZlLCBhbmQgZG9lcyBub3QgaW5jbHVkZSBhIHByb3RvY29sIHN1Y2gKCQkgKiBhcyBgaHR0cDovL2AsIG9yIGEgcmVsYXRpdmUgcGF0aCBzdWNoIGFzIGAuLi9gLgoJCSAqIEBwcm9wZXJ0eSBfYmFzZVBhdGgKCQkgKiBAdHlwZSB7U3RyaW5nfQoJCSAqIEBwcml2YXRlCgkJICogQHNpbmNlIDAuMy4xCgkJICovCgkJdGhpcy5fYmFzZVBhdGggPSBiYXNlUGF0aDsKCgkJLyoqCgkJICogQW4gb3B0aW9uYWwgZmxhZyB0byBzZXQgb24gaW1hZ2VzIHRoYXQgYXJlIGxvYWRlZCB1c2luZyBQcmVsb2FkSlMsIHdoaWNoIGVuYWJsZXMgQ09SUyBzdXBwb3J0LiBJbWFnZXMgbG9hZGVkCgkJICogY3Jvc3MtZG9tYWluIGJ5IHNlcnZlcnMgdGhhdCBzdXBwb3J0IENPUlMgcmVxdWlyZSB0aGUgY3Jvc3NPcmlnaW4gZmxhZyB0byBiZSBsb2FkZWQgYW5kIGludGVyYWN0ZWQgd2l0aCBieQoJCSAqIGEgY2FudmFzLiBXaGVuIGxvYWRpbmcgbG9jYWxseSwgb3Igd2l0aCBhIHNlcnZlciB3aXRoIG5vIENPUlMgc3VwcG9ydCwgdGhpcyBmbGFnIGNhbiBjYXVzZSBvdGhlciBzZWN1cml0eSBpc3N1ZXMsCgkJICogc28gaXQgaXMgcmVjb21tZW5kZWQgdG8gb25seSBzZXQgaXQgaWYgeW91IGFyZSBzdXJlIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQuIEN1cnJlbnRseSwgc3VwcG9ydGVkIHZhbHVlcyBhcmUgIiIKCQkgKiBhbmQgIkFub255bW91cyIuCgkJICogQHByb3BlcnR5IF9jcm9zc09yaWdpbgoJCSAqIEB0eXBlIHtTdHJpbmd9CgkJICogQGRlZmF1bHQgIiIKCQkgKiBAcHJpdmF0ZQoJCSAqIEBzaW5jZSAwLjQuMQoJCSAqLwoJCXRoaXMuX2Nyb3NzT3JpZ2luID0gY3Jvc3NPcmlnaW47CgoJCS8qKgoJCSAqIEFuIG9iamVjdCBoYXNoIG9mIGNhbGxiYWNrcyB0aGF0IGFyZSBmaXJlZCBmb3IgZWFjaCBmaWxlIHR5cGUgYmVmb3JlIHRoZSBmaWxlIGlzIGxvYWRlZCwgZ2l2aW5nIHBsdWdpbnMgdGhlCgkJICogYWJpbGl0eSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzIG9mIHRoZSBsb2FkLiBQbGVhc2Ugc2VlIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9pbnN0YWxsUGx1Z2luIn19e3svY3Jvc3NMaW5rfX0KCQkgKiBtZXRob2QgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgkJICogQHByb3BlcnR5IF90eXBlQ2FsbGJhY2tzCgkJICogQHR5cGUge09iamVjdH0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX3R5cGVDYWxsYmFja3MgPSB7fTsKCgkJLyoqCgkJICogQW4gb2JqZWN0IGhhc2ggb2YgY2FsbGJhY2tzIHRoYXQgYXJlIGZpcmVkIGZvciBlYWNoIGZpbGUgZXh0ZW5zaW9uIGJlZm9yZSB0aGUgZmlsZSBpcyBsb2FkZWQsIGdpdmluZyBwbHVnaW5zIHRoZQoJCSAqIGFiaWxpdHkgdG8gb3ZlcnJpZGUgcHJvcGVydGllcyBvZiB0aGUgbG9hZC4gUGxlYXNlIHNlZSB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvaW5zdGFsbFBsdWdpbiJ9fXt7L2Nyb3NzTGlua319CgkJICogbWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLgoJCSAqIEBwcm9wZXJ0eSBfZXh0ZW5zaW9uQ2FsbGJhY2tzCgkJICogQHR5cGUge251bGx9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9leHRlbnNpb25DYWxsYmFja3MgPSB7fTsKCgkJLyoqCgkJICogRGV0ZXJtaW5lcyBpZiB0aGUgbG9hZFN0YXJ0IGV2ZW50IHdhcyBkaXNwYXRjaGVkIGFscmVhZHkuIFRoaXMgZXZlbnQgaXMgb25seSBmaXJlZCBvbmUgdGltZSwgd2hlbiB0aGUgZmlyc3QKCQkgKiBmaWxlIGlzIHJlcXVlc3RlZC4KCQkgKiBAcHJvcGVydHkgX2xvYWRTdGFydFdhc0Rpc3BhdGNoZWQKCQkgKiBAdHlwZSB7Qm9vbGVhbn0KCQkgKiBAZGVmYXVsdCBmYWxzZQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fbG9hZFN0YXJ0V2FzRGlzcGF0Y2hlZCA9IGZhbHNlOwoKCQkvKioKCQkgKiBUaGUgbnVtYmVyIG9mIG1heGltdW0gb3BlbiBjb25uZWN0aW9ucyB0aGF0IGEgbG9hZFF1ZXVlIHRyaWVzIHRvIG1haW50YWluLiBQbGVhc2Ugc2VlCgkJICoge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvc2V0TWF4Q29ubmVjdGlvbnMifX17ey9jcm9zc0xpbmt9fSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCQkgKiBAcHJvcGVydHkgX21heENvbm5lY3Rpb25zCgkJICogQHR5cGUge051bWJlcn0KCQkgKiBAZGVmYXVsdCAxCgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9tYXhDb25uZWN0aW9ucyA9IDE7CgoJCS8qKgoJCSAqIERldGVybWluZXMgaWYgdGhlcmUgaXMgY3VycmVudGx5IGEgc2NyaXB0IGxvYWRpbmcuIFRoaXMgaGVscHMgZW5zdXJlIHRoYXQgb25seSBhIHNpbmdsZSBzY3JpcHQgbG9hZHMgYXQgb25jZSB3aGVuCgkJICogdXNpbmcgYSBzY3JpcHQgdGFnIHRvIGRvIHByZWxvYWRpbmcuCgkJICogQHByb3BlcnR5IF9jdXJyZW50bHlMb2FkaW5nU2NyaXB0CgkJICogQHR5cGUge0Jvb2xlYW59CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9jdXJyZW50bHlMb2FkaW5nU2NyaXB0ID0gbnVsbDsKCgkJLyoqCgkJICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgY3VycmVudGx5IGRvd25sb2FkaW5nIGZpbGVzLgoJCSAqIEBwcm9wZXJ0eSBfY3VycmVudExvYWRzCgkJICogQHR5cGUge0FycmF5fQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fY3VycmVudExvYWRzID0gW107CgoJCS8qKgoJCSAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIHF1ZXVlZCBpdGVtcyB0aGF0IGhhdmUgbm90IHlldCBzdGFydGVkIGRvd25sb2FkaW5nLgoJCSAqIEBwcm9wZXJ0eSBfbG9hZFF1ZXVlCgkJICogQHR5cGUge0FycmF5fQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fbG9hZFF1ZXVlID0gW107CgoJCS8qKgoJCSAqIEFuIGFycmF5IGNvbnRhaW5pbmcgZG93bmxvYWRzIHRoYXQgaGF2ZSBub3QgY29tcGxldGVkLCBzbyB0aGF0IHRoZSBMb2FkUXVldWUgY2FuIGJlIHByb3Blcmx5IHJlc2V0LgoJCSAqIEBwcm9wZXJ0eSBfbG9hZFF1ZXVlQmFja3VwCgkJICogQHR5cGUge0FycmF5fQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fbG9hZFF1ZXVlQmFja3VwID0gW107CgoJCS8qKgoJCSAqIEFuIG9iamVjdCBoYXNoIG9mIGl0ZW1zIHRoYXQgaGF2ZSBmaW5pc2hlZCBkb3dubG9hZGluZywgaW5kZXhlZCBieSB0aGUge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319CgkJICogaWQuCgkJICogQHByb3BlcnR5IF9sb2FkSXRlbXNCeUlkCgkJICogQHR5cGUge09iamVjdH0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX2xvYWRJdGVtc0J5SWQgPSB7fTsKCgkJLyoqCgkJICogQW4gb2JqZWN0IGhhc2ggb2YgaXRlbXMgdGhhdCBoYXZlIGZpbmlzaGVkIGRvd25sb2FkaW5nLCBpbmRleGVkIGJ5IHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fQoJCSAqIHNvdXJjZS4KCQkgKiBAcHJvcGVydHkgX2xvYWRJdGVtc0J5U3JjCgkJICogQHR5cGUge09iamVjdH0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX2xvYWRJdGVtc0J5U3JjID0ge307CgoJCS8qKgoJCSAqIEFuIG9iamVjdCBoYXNoIG9mIGxvYWRlZCBpdGVtcywgaW5kZXhlZCBieSB0aGUgSUQgb2YgdGhlIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fS4KCQkgKiBAcHJvcGVydHkgX2xvYWRlZFJlc3VsdHMKCQkgKiBAdHlwZSB7T2JqZWN0fQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fbG9hZGVkUmVzdWx0cyA9IHt9OwoKCQkvKioKCQkgKiBBbiBvYmplY3QgaGFzaCBvZiB1bi1wYXJzZWQgbG9hZGVkIGl0ZW1zLCBpbmRleGVkIGJ5IHRoZSBJRCBvZiB0aGUge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319LgoJCSAqIEBwcm9wZXJ0eSBfbG9hZGVkUmF3UmVzdWx0cwoJCSAqIEB0eXBlIHtPYmplY3R9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9sb2FkZWRSYXdSZXN1bHRzID0ge307CgoJCS8qKgoJCSAqIFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCBoYXZlIGJlZW4gcmVxdWVzdGVkLiBUaGlzIGhlbHBzIG1hbmFnZSBhbiBvdmVyYWxsIHByb2dyZXNzIHdpdGhvdXQga25vd2luZyBob3cgbGFyZ2UKCQkgKiB0aGUgZmlsZXMgYXJlIGJlZm9yZSB0aGV5IGFyZSBkb3dubG9hZGVkLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgaXRlbXMgaW5zaWRlIG9mIGxvYWRlcnMgc3VjaCBhcyB0aGUKCQkgKiB7eyNjcm9zc0xpbmsgIk1hbmlmZXN0TG9hZGVyIn19e3svY3Jvc3NMaW5rfX0uCgkJICogQHByb3BlcnR5IF9udW1JdGVtcwoJCSAqIEB0eXBlIHtOdW1iZXJ9CgkJICogQGRlZmF1bHQgMAoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fbnVtSXRlbXMgPSAwOwoKCQkvKioKCQkgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgaGF2ZSBjb21wbGV0ZWQgbG9hZGVkLiBUaGlzIGhlbHBzIG1hbmFnZSBhbiBvdmVyYWxsIHByb2dyZXNzIHdpdGhvdXQga25vd2luZyBob3cgbGFyZ2UKCQkgKiB0aGUgZmlsZXMgYXJlIGJlZm9yZSB0aGV5IGFyZSBkb3dubG9hZGVkLgoJCSAqIEBwcm9wZXJ0eSBfbnVtSXRlbXNMb2FkZWQKCQkgKiBAdHlwZSB7TnVtYmVyfQoJCSAqIEBkZWZhdWx0IDAKCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX251bUl0ZW1zTG9hZGVkID0gMDsKCgkJLyoqCgkJICogQSBsaXN0IG9mIHNjcmlwdHMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSByZXF1ZXN0ZWQuIFRoaXMgaGVscHMgZW5zdXJlIHRoYXQgc2NyaXB0cyBhcmUgImNvbXBsZXRlZCIgaW4gdGhlIHJpZ2h0CgkJICogb3JkZXIuCgkJICogQHByb3BlcnR5IF9zY3JpcHRPcmRlcgoJCSAqIEB0eXBlIHtBcnJheX0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX3NjcmlwdE9yZGVyID0gW107CgoJCS8qKgoJCSAqIEEgbGlzdCBvZiBzY3JpcHRzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZC4gSXRlbXMgYXJlIGFkZGVkIHRvIHRoaXMgbGlzdCBhcyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHRoZXkgYXJlCgkJICogcmVxdWVzdGVkLCBjb250YWluIHRoZSBsb2FkZWQgaXRlbSBpZiBpdCBoYXMgY29tcGxldGVkLCBidXQgbm90IGJlZW4gZGlzcGF0Y2hlZCB0byB0aGUgdXNlciwgYW5kIDxjb2RlPnRydWU8L3RydWU+CgkJICogb25jZSB0aGV5IGFyZSBjb21wbGV0ZSBhbmQgaGF2ZSBiZWVuIGRpc3BhdGNoZWQuCgkJICogQHByb3BlcnR5IF9sb2FkZWRTY3JpcHRzCgkJICogQHR5cGUge0FycmF5fQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fbG9hZGVkU2NyaXB0cyA9IFtdOwoKCQkvKioKCQkgKiBUaGUgbGFzdCBwcm9ncmVzcyBhbW91bnQuIFRoaXMgaXMgdXNlZCB0byBzdXBwcmVzcyBkdXBsaWNhdGUgcHJvZ3Jlc3MgZXZlbnRzLgoJCSAqIEBwcm9wZXJ0eSBfbGFzdFByb2dyZXNzCgkJICogQHR5cGUge051bWJlcn0KCQkgKiBAcHJpdmF0ZQoJCSAqIEBzaW5jZSAwLjYuMAoJCSAqLwoJCXRoaXMuX2xhc3RQcm9ncmVzcyA9IE5hTjsKCgkJLyoqCgkJICogQW4gaW50ZXJuYWwgbGlzdCBvZiBhbGwgdGhlIGRlZmF1bHQgTG9hZGVycyB0aGF0IGFyZSBpbmNsdWRlZCB3aXRoIFByZWxvYWRKUy4gQmVmb3JlIGFuIGl0ZW0gaXMgbG9hZGVkLCB0aGUKCQkgKiBhdmFpbGFibGUgbG9hZGVyIGxpc3QgaXMgaXRlcmF0ZWQsIGluIHRoZSBvcmRlciB0aGV5IGFyZSBpbmNsdWRlZCwgYW5kIGFzIHNvb24gYXMgYSBsb2FkZXIgaW5kaWNhdGVzIGl0IGNhbgoJCSAqIGhhbmRsZSB0aGUgY29udGVudCwgaXQgd2lsbCBiZSBzZWxlY3RlZC4gVGhlIGRlZmF1bHQgbG9hZGVyLCAoe3sjY3Jvc3NMaW5rICJUZXh0TG9hZGVyIn19e3svY3Jvc3NMaW5rfX0gaXMKCQkgKiBsYXN0IGluIHRoZSBsaXN0LCBzbyBpdCB3aWxsIGJlIHVzZWQgaWYgbm8gb3RoZXIgbWF0Y2ggaXMgZm91bmQuIFR5cGljYWxseSwgbG9hZGVycyB3aWxsIG1hdGNoIGJhc2VkIG9uIHRoZQoJCSAqIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0vdHlwZSJ9fXt7L2Nyb3NzTGlua319LCB3aGljaCBpcyBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQgdXNpbmcgdGhlIGZpbGUgZXh0ZW5zaW9uIG9mCgkJICogdGhlIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0vc3JjOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0uCgkJICoKCQkgKiBMb2FkZXJzIGNhbiBiZSByZW1vdmVkIGZyb20gUHJlbG9hZEpTIGJ5IHNpbXBseSBub3QgaW5jbHVkaW5nIHRoZW0uCgkJICoKCQkgKiBDdXN0b20gbG9hZGVycyBpbnN0YWxsZWQgdXNpbmcge3sjY3Jvc3NMaW5rICJyZWdpc3RlckxvYWRlciJ9fXt7L2Nyb3NzTGlua319IHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoaXMgbGlzdAoJCSAqIHNvIHRoYXQgdGhleSBhcmUgY2hlY2tlZCBmaXJzdC4KCQkgKiBAcHJvcGVydHkgX2F2YWlsYWJsZUxvYWRlcnMKCQkgKiBAdHlwZSB7QXJyYXl9CgkJICogQHByaXZhdGUKCQkgKiBAc2luY2UgMC42LjAKCQkgKi8KCQl0aGlzLl9hdmFpbGFibGVMb2FkZXJzID0gWwoJCQljcmVhdGVqcy5JbWFnZUxvYWRlciwKCQkJY3JlYXRlanMuSmF2YVNjcmlwdExvYWRlciwKCQkJY3JlYXRlanMuQ1NTTG9hZGVyLAoJCQljcmVhdGVqcy5KU09OTG9hZGVyLAoJCQljcmVhdGVqcy5KU09OUExvYWRlciwKCQkJY3JlYXRlanMuU291bmRMb2FkZXIsCgkJCWNyZWF0ZWpzLk1hbmlmZXN0TG9hZGVyLAoJCQljcmVhdGVqcy5TcHJpdGVTaGVldExvYWRlciwKCQkJY3JlYXRlanMuWE1MTG9hZGVyLAoJCQljcmVhdGVqcy5TVkdMb2FkZXIsCgkJCWNyZWF0ZWpzLkJpbmFyeUxvYWRlciwKCQkJY3JlYXRlanMuVmlkZW9Mb2FkZXIsCgkJCWNyZWF0ZWpzLlRleHRMb2FkZXIsCgkJXTsKCgkJLyoqCgkJICogVGhlIG51bWJlciBvZiBidWlsdCBpbiBsb2FkZXJzLCBzbyB0aGV5IGNhbid0IGJlIHJlbW92ZWQgYnkge3sjY3Jvc3NMaW5rICJ1bnJlZ2lzdGVyTG9hZGVyIn19e3svY3Jvc3NMaW5rfS4KCQkgKiBAcHJvcGVydHkgX2RlZmF1bHRMb2FkZXJMZW5ndGgKCQkgKiBAdHlwZSB7TnVtYmVyfQoJCSAqIEBwcml2YXRlCgkJICogQHNpbmNlIDAuNi4wCgkJICovCgkJdGhpcy5fZGVmYXVsdExvYWRlckxlbmd0aCA9IHRoaXMuX2F2YWlsYWJsZUxvYWRlcnMubGVuZ3RoOwoJfTsKCgovLyBzdGF0aWMgcHJvcGVydGllcwoJLyoqCgkgKiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gYXNzdW1lIGEgbG9hZCBoYXMgZmFpbGVkLiBBbiB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL2Vycm9yOmV2ZW50In19e3svY3Jvc3NMaW5rfX0KCSAqIGV2ZW50IGlzIGRpc3BhdGNoZWQgaWYgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZCBiZWZvcmUgYW55IGRhdGEgaXMgcmVjZWl2ZWQuCgkgKiBAcHJvcGVydHkgbG9hZFRpbWVvdXQKCSAqIEB0eXBlIHtOdW1iZXJ9CgkgKiBAZGVmYXVsdCA4MDAwCgkgKiBAc3RhdGljCgkgKiBAc2luY2UgMC40LjEKCSAqIEBkZXByZWNhdGVkIEluIGZhdm91ciBvZiBMb2FkSXRlbS5sb2FkVGltZW91dAoJICovCglzLmxvYWRUaW1lb3V0ID0gODAwMDsKCgkvKioKCSAqIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBhc3N1bWUgYSBsb2FkIGhhcyBmYWlsZWQuCgkgKiBAcHJvcGVydHkgTE9BRF9USU1FT1VUCgkgKiBAdHlwZSB7TnVtYmVyfQoJICogQGRlZmF1bHQgMAoJICogQGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRUaW1lb3V0OnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gcHJvcGVydHkuCgkgKi8KCXMuTE9BRF9USU1FT1VUID0gMDsKCi8vIFByZWxvYWQgVHlwZXMKCS8qKgoJICogQHByb3BlcnR5IEJJTkFSWQoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IGJpbmFyeQoJICogQHN0YXRpYwoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0JJTkFSWTpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuQklOQVJZID0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuQklOQVJZOwoKCS8qKgoJICogQHByb3BlcnR5IENTUwoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IGNzcwoJICogQHN0YXRpYwoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0NTUzpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuQ1NTID0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuQ1NTOwoKCS8qKgoJICogQHByb3BlcnR5IElNQUdFCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgaW1hZ2UKCSAqIEBzdGF0aWMKCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQWJzdHJhY3RMb2FkZXIge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9DU1M6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBpbnN0ZWFkLgoJICovCglzLklNQUdFID0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuSU1BR0U7CgoJLyoqCgkgKiBAcHJvcGVydHkgSkFWQVNDUklQVAoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IGphdmFzY3JpcHQKCSAqIEBzdGF0aWMKCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQWJzdHJhY3RMb2FkZXIge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9KQVZBU0NSSVBUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaW5zdGVhZC4KCSAqLwoJcy5KQVZBU0NSSVBUID0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuSkFWQVNDUklQVDsKCgkvKioKCSAqIEBwcm9wZXJ0eSBKU09OCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQganNvbgoJICogQHN0YXRpYwoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0pTT046cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBpbnN0ZWFkLgoJICovCglzLkpTT04gPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5KU09OOwoKCS8qKgoJICogQHByb3BlcnR5IEpTT05QCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQganNvbnAKCSAqIEBzdGF0aWMKCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQWJzdHJhY3RMb2FkZXIge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9KU09OUDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuSlNPTlAgPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5KU09OUDsKCgkvKioKCSAqIEBwcm9wZXJ0eSBNQU5JRkVTVAoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IG1hbmlmZXN0CgkgKiBAc3RhdGljCgkgKiBAc2luY2UgMC40LjEKCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQWJzdHJhY3RMb2FkZXIge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9NQU5JRkVTVDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuTUFOSUZFU1QgPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5NQU5JRkVTVDsKCgkvKioKCSAqIEBwcm9wZXJ0eSBTT1VORAoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IHNvdW5kCgkgKiBAc3RhdGljCgkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIEFic3RyYWN0TG9hZGVyIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvSkFWQVNDUklQVDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuU09VTkQgPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5TT1VORDsKCgkvKioKCSAqIEBwcm9wZXJ0eSBWSURFTwoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IHZpZGVvCgkgKiBAc3RhdGljCgkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIEFic3RyYWN0TG9hZGVyIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvSkFWQVNDUklQVDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuVklERU8gPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5WSURFTzsKCgkvKioKCSAqIEBwcm9wZXJ0eSBTVkcKCSAqIEB0eXBlIHtTdHJpbmd9CgkgKiBAZGVmYXVsdCBzdmcKCSAqIEBzdGF0aWMKCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQWJzdHJhY3RMb2FkZXIge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9TVkc6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBpbnN0ZWFkLgoJICovCglzLlNWRyA9IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlNWRzsKCgkvKioKCSAqIEBwcm9wZXJ0eSBURVhUCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgdGV4dAoJICogQHN0YXRpYwoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1RFWFQ6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBpbnN0ZWFkLgoJICovCglzLlRFWFQgPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5URVhUOwoKCS8qKgoJICogQHByb3BlcnR5IFhNTAoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IHhtbAoJICogQHN0YXRpYwoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1hNTDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuWE1MID0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuWE1MOwoKCS8qKgoJICogQHByb3BlcnR5IFBPU1QKCSAqIEB0eXBlIHtzdHJpbmd9CgkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIEFic3RyYWN0TG9hZGVyIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvUE9TVDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuUE9TVCA9IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlBPU1Q7CgoJLyoqCgkgKiBAcHJvcGVydHkgR0VUCgkgKiBAdHlwZSB7c3RyaW5nfQoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0dFVDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuR0VUID0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuR0VUOwoKLy8gZXZlbnRzCgkvKioKCSAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhbiBpbmRpdmlkdWFsIGZpbGUgaGFzIGxvYWRlZCwgYW5kIGJlZW4gcHJvY2Vzc2VkLgoJICogQGV2ZW50IGZpbGVsb2FkCgkgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSBvYmplY3QgdGhhdCBkaXNwYXRjaGVkIHRoZSBldmVudC4KCSAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlLgoJICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gVGhlIGZpbGUgaXRlbSB3aGljaCB3YXMgc3BlY2lmaWVkIGluIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkRmlsZSJ9fXt7L2Nyb3NzTGlua319CgkgKiBvciB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkTWFuaWZlc3QifX17ey9jcm9zc0xpbmt9fSBjYWxsLiBJZiBvbmx5IGEgc3RyaW5nIHBhdGggb3IgdGFnIHdhcyBzcGVjaWZpZWQsIHRoZQoJICogb2JqZWN0IHdpbGwgY29udGFpbiB0aGF0IHZhbHVlIGFzIGEgYHNyY2AgcHJvcGVydHkuCgkgKiBAcGFyYW0ge09iamVjdH0gcmVzdWx0IFRoZSBIVE1MIHRhZyBvciBwYXJzZWQgcmVzdWx0IG9mIHRoZSBsb2FkZWQgaXRlbS4KCSAqIEBwYXJhbSB7T2JqZWN0fSByYXdSZXN1bHQgVGhlIHVucHJvY2Vzc2VkIHJlc3VsdCwgdXN1YWxseSB0aGUgcmF3IHRleHQgb3IgYmluYXJ5IGRhdGEgYmVmb3JlIGl0IGlzIGNvbnZlcnRlZAoJICogdG8gYSB1c2FibGUgb2JqZWN0LgoJICogQHNpbmNlIDAuMy4wCgkgKi8KCgkvKioKCSAqIFRoaXMge3sjY3Jvc3NMaW5rICJQcm9ncmVzc0V2ZW50In19e3svY3Jvc3NMaW5rfX0gdGhhdCBpcyBmaXJlZCB3aGVuIGFuIGFuIGluZGl2aWR1YWwgZmlsZSdzIHByb2dyZXNzIGNoYW5nZXMuCgkgKiBAZXZlbnQgZmlsZXByb2dyZXNzCgkgKiBAc2luY2UgMC4zLjAKCSAqLwoKCS8qKgoJICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGFuIGluZGl2aWR1YWwgZmlsZSBzdGFydHMgdG8gbG9hZC4KCSAqIEBldmVudCBmaWxlc3RhcnQKCSAqIEBwYXJhbSB7T2JqZWN0fSBUaGUgb2JqZWN0IHRoYXQgZGlzcGF0Y2hlZCB0aGUgZXZlbnQuCgkgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZS4KCSAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIFRoZSBmaWxlIGl0ZW0gd2hpY2ggd2FzIHNwZWNpZmllZCBpbiB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZEZpbGUifX17ey9jcm9zc0xpbmt9fQoJICogb3Ige3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZE1hbmlmZXN0In19e3svY3Jvc3NMaW5rfX0gY2FsbC4gSWYgb25seSBhIHN0cmluZyBwYXRoIG9yIHRhZyB3YXMgc3BlY2lmaWVkLCB0aGUKCSAqIG9iamVjdCB3aWxsIGNvbnRhaW4gdGhhdCB2YWx1ZSBhcyBhIHByb3BlcnR5LgoJICovCgovLyBwdWJsaWMgbWV0aG9kcwoJLyoqCgkgKiBSZWdpc3RlciBhIGN1c3RvbSBsb2FkZXJzIGNsYXNzLiBOZXcgbG9hZGVycyBhcmUgZ2l2ZW4gcHJlY2VkZW5jZSBvdmVyIGxvYWRlcnMgYWRkZWQgZWFybGllciBhbmQgZGVmYXVsdCBsb2FkZXJzLgoJICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBsb2FkZXJzIGV4dGVuZCB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyIn19e3svY3Jvc3NMaW5rfX0uIExvYWRlcnMgY2FuIG9ubHkgYmUgYWRkZWQKCSAqIG9uY2UsIGFuZCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbG9hZGVycy4KCSAqIEBtZXRob2QgcmVnaXN0ZXJMb2FkZXIKCSAqIEBwYXJhbSB7RnVuY3Rpb258QWJzdHJhY3RMb2FkZXJ9IGxvYWRlciBUaGUgQWJzdHJhY3RMb2FkZXIgY2xhc3MgdG8gYWRkLgoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXAucmVnaXN0ZXJMb2FkZXIgPSBmdW5jdGlvbiAobG9hZGVyKSB7CgkJaWYgKCFsb2FkZXIgfHwgIWxvYWRlci5jYW5Mb2FkSXRlbSkgewoJCQl0aHJvdyBuZXcgRXJyb3IoImxvYWRlciBpcyBvZiBhbiBpbmNvcnJlY3QgdHlwZS4iKTsKCQl9IGVsc2UgaWYgKHRoaXMuX2F2YWlsYWJsZUxvYWRlcnMuaW5kZXhPZihsb2FkZXIpICE9IC0xKSB7CgkJCXRocm93IG5ldyBFcnJvcigibG9hZGVyIGFscmVhZHkgZXhpc3RzLiIpOyAvL0xNOiBNYXliZSBqdXN0IHNpbGVudGx5IGZhaWwgaGVyZQoJCX0KCgkJdGhpcy5fYXZhaWxhYmxlTG9hZGVycy51bnNoaWZ0KGxvYWRlcik7Cgl9OwoKCS8qKgoJICogUmVtb3ZlIGEgY3VzdG9tIGxvYWRlciBhZGRlZCB1c2lnIHt7I2Nyb3NzTGluayAicmVnaXN0ZXJMb2FkZXIifX17ey9jcm9zc0xpbmt9fS4gT25seSBjdXN0b20gbG9hZGVycyBjYW4gYmUKCSAqIHVucmVnaXN0ZXJlZCwgdGhlIGRlZmF1bHQgbG9hZGVycyB3aWxsIGFsd2F5cyBiZSBhdmFpbGFibGUuCgkgKiBAbWV0aG9kIHVucmVnaXN0ZXJMb2FkZXIKCSAqIEBwYXJhbSB7RnVuY3Rpb258QWJzdHJhY3RMb2FkZXJ9IGxvYWRlciBUaGUgQWJzdHJhY3RMb2FkZXIgY2xhc3MgdG8gcmVtb3ZlCgkgKi8KCXAudW5yZWdpc3RlckxvYWRlciA9IGZ1bmN0aW9uIChsb2FkZXIpIHsKCQl2YXIgaWR4ID0gdGhpcy5fYXZhaWxhYmxlTG9hZGVycy5pbmRleE9mKGxvYWRlcik7CgkJaWYgKGlkeCAhPSAtMSAmJiBpZHggPCB0aGlzLl9kZWZhdWx0TG9hZGVyTGVuZ3RoIC0gMSkgewoJCQl0aGlzLl9hdmFpbGFibGVMb2FkZXJzLnNwbGljZShpZHgsIDEpOwoJCX0KCX07CgoJLyoqCgkgKiBAbWV0aG9kIHNldFVzZVhIUgoJICogQHBhcmFtIHtCb29sZWFufSB2YWx1ZSBUaGUgbmV3IHVzZVhIUiB2YWx1ZSB0byBzZXQuCgkgKiBAcmV0dXJuIHtCb29sZWFufSBUaGUgbmV3IHVzZVhIUiB2YWx1ZS4gSWYgWEhSIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIsIHRoaXMgd2lsbCByZXR1cm4gZmFsc2UsIGV2ZW4gaWYKCSAqIHRoZSBwcm92aWRlZCB2YWx1ZSBhcmd1bWVudCB3YXMgdHJ1ZS4KCSAqIEBzaW5jZSAwLjMuMAoJICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7eyNjcm9zc0xpbmsgInByZWZlclhIUjpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IHByb3BlcnR5LCBvciB0aGUge3sjY3Jvc3NMaW5rICJzZXRVc2VYSFIifX17ey9jcm9zc0xpbmt9fQoJICogbWV0aG9kIGluc3RlYWQuCgkgKi8KCXAuc2V0VXNlWEhSID0gZnVuY3Rpb24gKHZhbHVlKSB7CgkJcmV0dXJuIHRoaXMuc2V0UHJlZmVyWEhSKHZhbHVlKTsKCX07CgoJLyoqCgkgKiBDaGFuZ2UgdGhlIHt7I2Nyb3NzTGluayAicHJlZmVyWEhSOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gdmFsdWUuIE5vdGUgdGhhdCBpZiB0aGlzIGlzIHNldCB0byBgdHJ1ZWAsIGl0IG1heQoJICogZmFpbCwgb3IgYmUgaWdub3JlZCBkZXBlbmRpbmcgb24gdGhlIGJyb3dzZXIncyBjYXBhYmlsaXRpZXMgYW5kIHRoZSBsb2FkIHR5cGUuCgkgKiBAbWV0aG9kIHNldFByZWZlclhIUgoJICogQHBhcmFtIHtCb29sZWFufSB2YWx1ZQoJICogQHJldHVybnMge0Jvb2xlYW59IFRoZSB2YWx1ZSBvZiB7eyNjcm9zc0xpbmsgInByZWZlclhIUiJ9fXt7L2Nyb3NzTGlua319IHRoYXQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcC5zZXRQcmVmZXJYSFIgPSBmdW5jdGlvbih2YWx1ZSkgewoJCS8vIERldGVybWluZSBpZiB3ZSBjYW4gdXNlIFhIUi4gWEhSIGRlZmF1bHRzIHRvIFRSVUUsIGJ1dCB0aGUgYnJvd3NlciBtYXkgbm90IHN1cHBvcnQgaXQuCgkJLy9UT0RPOiBTaG91bGQgd2UgYmUgY2hlY2tpbmcgZm9yIHRoZSBvdGhlciBYSFIgdHlwZXM/IE1pZ2h0IGhhdmUgdG8gZG8gYSB0cnkvY2F0Y2ggb24gdGhlIGRpZmZlcmVudCB0eXBlcyBzaW1pbGFyIHRvIGNyZWF0ZVhIUi4KCQl0aGlzLnByZWZlclhIUiA9ICh2YWx1ZSAhPSBmYWxzZSAmJiB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgIT0gbnVsbCk7CgkJcmV0dXJuIHRoaXMucHJlZmVyWEhSOwoJfTsKCgkvKioKCSAqIFN0b3BzIGFsbCBxdWV1ZWQgYW5kIGxvYWRpbmcgaXRlbXMsIGFuZCBjbGVhcnMgdGhlIHF1ZXVlLiBUaGlzIGFsc28gcmVtb3ZlcyBhbGwgaW50ZXJuYWwgcmVmZXJlbmNlcyB0byBsb2FkZWQKCSAqIGNvbnRlbnQsIGFuZCBhbGxvd3MgdGhlIHF1ZXVlIHRvIGJlIHVzZWQgYWdhaW4uCgkgKiBAbWV0aG9kIHJlbW92ZUFsbAoJICogQHNpbmNlIDAuMy4wCgkgKi8KCXAucmVtb3ZlQWxsID0gZnVuY3Rpb24gKCkgewoJCXRoaXMucmVtb3ZlKCk7Cgl9OwoKCS8qKgoJICogU3RvcHMgYW4gaXRlbSBmcm9tIGJlaW5nIGxvYWRlZCwgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgcXVldWUuIElmIG5vdGhpbmcgaXMgcGFzc2VkLCBhbGwgaXRlbXMgYXJlIHJlbW92ZWQuCgkgKiBUaGlzIGFsc28gcmVtb3ZlcyBpbnRlcm5hbCByZWZlcmVuY2VzIHRvIGxvYWRlZCBpdGVtKHMpLgoJICoKCSAqIDxoND5FeGFtcGxlPC9oND4KCSAqCgkgKiAgICAgIHF1ZXVlLmxvYWRNYW5pZmVzdChbCgkgKiAgICAgICAgICB7c3JjOiJ0ZXN0LnBuZyIsIGlkOiJwbmcifSwKCSAqICAgICAgICAgIHtzcmM6InRlc3QuanBnIiwgaWQ6ImpwZyJ9LAoJICogICAgICAgICAge3NyYzoidGVzdC5tcDMiLCBpZDoibXAzIn0KCSAqICAgICAgXSk7CgkgKiAgICAgIHF1ZXVlLnJlbW92ZSgicG5nIik7IC8vIFNpbmdsZSBpdGVtIGJ5IElECgkgKiAgICAgIHF1ZXVlLnJlbW92ZSgicG5nIiwgInRlc3QuanBnIik7IC8vIEl0ZW1zIGFzIGFyZ3VtZW50cy4gTWl4ZWQgaWQgYW5kIHNyYy4KCSAqICAgICAgcXVldWUucmVtb3ZlKFsidGVzdC5wbmciLCAianBnIl0pOyAvLyBJdGVtcyBpbiBhbiBBcnJheS4gTWl4ZWQgaWQgYW5kIHNyYy4KCSAqCgkgKiBAbWV0aG9kIHJlbW92ZQoJICogQHBhcmFtIHtTdHJpbmcgfCBBcnJheX0gaWRzT3JVcmxzKiBUaGUgaWQgb3IgaWRzIHRvIHJlbW92ZSBmcm9tIHRoaXMgcXVldWUuIFlvdSBjYW4gcGFzcyBhbiBpdGVtLCBhbiBhcnJheSBvZgoJICogaXRlbXMsIG9yIG11bHRpcGxlIGl0ZW1zIGFzIGFyZ3VtZW50cy4KCSAqIEBzaW5jZSAwLjMuMAoJICovCglwLnJlbW92ZSA9IGZ1bmN0aW9uIChpZHNPclVybHMpIHsKCQl2YXIgYXJncyA9IG51bGw7CgoJCWlmIChpZHNPclVybHMgJiYgIShpZHNPclVybHMgaW5zdGFuY2VvZiBBcnJheSkpIHsKCQkJYXJncyA9IFtpZHNPclVybHNdOwoJCX0gZWxzZSBpZiAoaWRzT3JVcmxzKSB7CgkJCWFyZ3MgPSBpZHNPclVybHM7CgkJfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgaXRlbXNXZXJlUmVtb3ZlZCA9IGZhbHNlOwoKCQkvLyBEZXN0cm95IGV2ZXJ5dGhpbmcKCQlpZiAoIWFyZ3MpIHsKCQkJdGhpcy5jbG9zZSgpOwoJCQlmb3IgKHZhciBuIGluIHRoaXMuX2xvYWRJdGVtc0J5SWQpIHsKCQkJCXRoaXMuX2Rpc3Bvc2VJdGVtKHRoaXMuX2xvYWRJdGVtc0J5SWRbbl0pOwoJCQl9CgkJCXRoaXMuaW5pdCh0aGlzLnByZWZlclhIUiwgdGhpcy5fYmFzZVBhdGgpOwoKCQkJLy8gUmVtb3ZlIHNwZWNpZmljIGl0ZW1zCgkJfSBlbHNlIHsKCQkJd2hpbGUgKGFyZ3MubGVuZ3RoKSB7CgkJCQl2YXIgaXRlbSA9IGFyZ3MucG9wKCk7CgkJCQl2YXIgciA9IHRoaXMuZ2V0UmVzdWx0KGl0ZW0pOwoKCQkJCS8vUmVtb3ZlIGZyb20gdGhlIG1haW4gbG9hZCBRdWV1ZQoJCQkJZm9yIChpID0gdGhpcy5fbG9hZFF1ZXVlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQkJbG9hZEl0ZW0gPSB0aGlzLl9sb2FkUXVldWVbaV0uZ2V0SXRlbSgpOwoJCQkJCWlmIChsb2FkSXRlbS5pZCA9PSBpdGVtIHx8IGxvYWRJdGVtLnNyYyA9PSBpdGVtKSB7CgkJCQkJCXRoaXMuX2xvYWRRdWV1ZS5zcGxpY2UoaSwgMSlbMF0uY2FuY2VsKCk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCgkJCQkvL1JlbW92ZSBmcm9tIHRoZSBiYWNrdXAgcXVldWUKCQkJCWZvciAoaSA9IHRoaXMuX2xvYWRRdWV1ZUJhY2t1cC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJCWxvYWRJdGVtID0gdGhpcy5fbG9hZFF1ZXVlQmFja3VwW2ldLmdldEl0ZW0oKTsKCQkJCQlpZiAobG9hZEl0ZW0uaWQgPT0gaXRlbSB8fCBsb2FkSXRlbS5zcmMgPT0gaXRlbSkgewoJCQkJCQl0aGlzLl9sb2FkUXVldWVCYWNrdXAuc3BsaWNlKGksIDEpWzBdLmNhbmNlbCgpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKHIpIHsKCQkJCQl0aGlzLl9kaXNwb3NlSXRlbSh0aGlzLmdldEl0ZW0oaXRlbSkpOwoJCQkJfSBlbHNlIHsKCQkJCQlmb3IgKHZhciBpID0gdGhpcy5fY3VycmVudExvYWRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgkJCQkJCXZhciBsb2FkSXRlbSA9IHRoaXMuX2N1cnJlbnRMb2Fkc1tpXS5nZXRJdGVtKCk7CgkJCQkJCWlmIChsb2FkSXRlbS5pZCA9PSBpdGVtIHx8IGxvYWRJdGVtLnNyYyA9PSBpdGVtKSB7CgkJCQkJCQl0aGlzLl9jdXJyZW50TG9hZHMuc3BsaWNlKGksIDEpWzBdLmNhbmNlbCgpOwoJCQkJCQkJaXRlbXNXZXJlUmVtb3ZlZCA9IHRydWU7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gSWYgdGhpcyB3YXMgY2FsbGVkIGR1cmluZyBhIGxvYWQsIHRyeSB0byBsb2FkIHRoZSBuZXh0IGl0ZW0uCgkJCWlmIChpdGVtc1dlcmVSZW1vdmVkKSB7CgkJCQl0aGlzLl9sb2FkTmV4dCgpOwoJCQl9CgkJfQoJfTsKCgkvKioKCSAqIFN0b3BzIGFsbCBvcGVuIGxvYWRzLCBkZXN0cm95cyBhbnkgbG9hZGVkIGl0ZW1zLCBhbmQgcmVzZXRzIHRoZSBxdWV1ZSwgc28gYWxsIGl0ZW1zIGNhbgoJICogYmUgcmVsb2FkZWQgYWdhaW4gYnkgY2FsbGluZyB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL2xvYWQifX17ey9jcm9zc0xpbmt9fS4gSXRlbXMgYXJlIG5vdCByZW1vdmVkIGZyb20gdGhlCgkgKiBxdWV1ZS4gVG8gcmVtb3ZlIGl0ZW1zIHVzZSB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvcmVtb3ZlIn19e3svY3Jvc3NMaW5rfX0gb3IKCSAqIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL3JlbW92ZUFsbCJ9fXt7L2Nyb3NzTGlua319IG1ldGhvZC4KCSAqIEBtZXRob2QgcmVzZXQKCSAqIEBzaW5jZSAwLjMuMAoJICovCglwLnJlc2V0ID0gZnVuY3Rpb24gKCkgewoJCXRoaXMuY2xvc2UoKTsKCQlmb3IgKHZhciBuIGluIHRoaXMuX2xvYWRJdGVtc0J5SWQpIHsKCQkJdGhpcy5fZGlzcG9zZUl0ZW0odGhpcy5fbG9hZEl0ZW1zQnlJZFtuXSk7CgkJfQoKCQkvL1Jlc2V0IHRoZSBxdWV1ZSB0byBpdHMgc3RhcnQgc3RhdGUKCQl2YXIgYSA9IFtdOwoJCWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5fbG9hZFF1ZXVlQmFja3VwLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJCQlhLnB1c2godGhpcy5fbG9hZFF1ZXVlQmFja3VwW2ldLmdldEl0ZW0oKSk7CgkJfQoKCQl0aGlzLmxvYWRNYW5pZmVzdChhLCBmYWxzZSk7Cgl9OwoKCS8qKgoJICogUmVnaXN0ZXIgYSBwbHVnaW4uIFBsdWdpbnMgY2FuIG1hcCB0byBsb2FkIHR5cGVzIChzb3VuZCwgaW1hZ2UsIGV0YyksIG9yIHNwZWNpZmljIGV4dGVuc2lvbnMgKHBuZywgbXAzLCBldGMpLgoJICogQ3VycmVudGx5LCBvbmx5IG9uZSBwbHVnaW4gY2FuIGV4aXN0IHBlciB0eXBlL2V4dGVuc2lvbi4KCSAqCgkgKiBXaGVuIGEgcGx1Z2luIGlzIGluc3RhbGxlZCwgYSA8Y29kZT5nZXRQcmVsb2FkSGFuZGxlcnMoKTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uIGl0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbgoJICogb24gdGhpcyBtZXRob2QsIGNoZWNrIG91dCB0aGUge3sjY3Jvc3NMaW5rICJTYW1wbGVQbHVnaW4vZ2V0UHJlbG9hZEhhbmRsZXJzIn19e3svY3Jvc3NMaW5rfX0gbWV0aG9kIGluIHRoZQoJICoge3sjY3Jvc3NMaW5rICJTYW1wbGVQbHVnaW4ifX17ey9jcm9zc0xpbmt9fSBjbGFzcy4KCSAqCgkgKiBCZWZvcmUgYSBmaWxlIGlzIGxvYWRlZCwgYSBtYXRjaGluZyBwbHVnaW4gaGFzIGFuIG9wcG9ydHVuaXR5IHRvIG1vZGlmeSB0aGUgbG9hZC4gSWYgYSBgY2FsbGJhY2tgIGlzIHJldHVybmVkCgkgKiBmcm9tIHRoZSB7eyNjcm9zc0xpbmsgIlNhbXBsZVBsdWdpbi9nZXRQcmVsb2FkSGFuZGxlcnMifX17ey9jcm9zc0xpbmt9fSBtZXRob2QsIGl0IHdpbGwgYmUgaW52b2tlZCBmaXJzdCwgYW5kIGl0cwoJICogcmVzdWx0IG1heSBjYW5jZWwgb3IgbW9kaWZ5IHRoZSBpdGVtLiBUaGUgY2FsbGJhY2sgbWV0aG9kIGNhbiBhbHNvIHJldHVybiBhIGBjb21wbGV0ZUhhbmRsZXJgIHRvIGJlIGZpcmVkIHdoZW4KCSAqIHRoZSBmaWxlIGlzIGxvYWRlZCwgb3IgYSBgdGFnYCBvYmplY3QsIHdoaWNoIHdpbGwgbWFuYWdlIHRoZSBhY3R1YWwgZG93bmxvYWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlCgkgKiBtZXRob2RzLCBjaGVjayBvdXQgdGhlIHt7I2Nyb3NzTGluayAiU2FtcGxlUGx1Z2luL3ByZWxvYWRIYW5kbGVyIn19e3svY3Jvc3NMaW5rfX0gYW5kIHt7I2Nyb3NzTGluayAiU2FtcGxlUGx1Z2luL2ZpbGVMb2FkSGFuZGxlciJ9fXt7L2Nyb3NzTGlua319CgkgKiBtZXRob2RzIG9uIHRoZSB7eyNjcm9zc0xpbmsgIlNhbXBsZVBsdWdpbiJ9fXt7L2Nyb3NzTGlua319LgoJICoKCSAqIEBtZXRob2QgaW5zdGFsbFBsdWdpbgoJICogQHBhcmFtIHtGdW5jdGlvbn0gcGx1Z2luIFRoZSBwbHVnaW4gY2xhc3MgdG8gaW5zdGFsbC4KCSAqLwoJcC5pbnN0YWxsUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbikgewoJCWlmIChwbHVnaW4gPT0gbnVsbCkgeyByZXR1cm47IH0KCgkJaWYgKHBsdWdpbi5nZXRQcmVsb2FkSGFuZGxlcnMgIT0gbnVsbCkgewoJCQl2YXIgbWFwID0gcGx1Z2luLmdldFByZWxvYWRIYW5kbGVycygpOwoJCQltYXAuc2NvcGUgPSBwbHVnaW47CgoJCQlpZiAobWFwLnR5cGVzICE9IG51bGwpIHsKCQkJCWZvciAodmFyIGkgPSAwLCBsID0gbWFwLnR5cGVzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJCQkJCXRoaXMuX3R5cGVDYWxsYmFja3NbbWFwLnR5cGVzW2ldXSA9IG1hcDsKCQkJCX0KCQkJfQoKCQkJaWYgKG1hcC5leHRlbnNpb25zICE9IG51bGwpIHsKCQkJCWZvciAoaSA9IDAsIGwgPSBtYXAuZXh0ZW5zaW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJCQl0aGlzLl9leHRlbnNpb25DYWxsYmFja3NbbWFwLmV4dGVuc2lvbnNbaV1dID0gbWFwOwoJCQkJfQoJCQl9CgkJfQoJfTsKCgkvKioKCSAqIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBjb25uZWN0aW9ucy4gTm90ZSB0aGF0IGJyb3dzZXJzIGFuZCBzZXJ2ZXJzIG1heSBoYXZlIGEgYnVpbHQtaW4gbWF4aW11bQoJICogbnVtYmVyIG9mIG9wZW4gY29ubmVjdGlvbnMsIHNvIGFueSBhZGRpdGlvbmFsIGNvbm5lY3Rpb25zIG1heSByZW1haW4gaW4gYSBwZW5kaW5nIHN0YXRlIHVudGlsIHRoZSBicm93c2VyCgkgKiBvcGVucyB0aGUgY29ubmVjdGlvbi4gV2hlbiBsb2FkaW5nIHNjcmlwdHMgdXNpbmcgdGFncywgYW5kIHdoZW4ge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbWFpbnRhaW5TY3JpcHRPcmRlcjpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319CgkgKiBpcyBgdHJ1ZWAsIG9ubHkgb25lIHNjcmlwdCBpcyBsb2FkZWQgYXQgYSB0aW1lIGR1ZSB0byBicm93c2VyIGxpbWl0YXRpb25zLgoJICoKCSAqIDxoND5FeGFtcGxlPC9oND4KCSAqCgkgKiAgICAgIHZhciBxdWV1ZSA9IG5ldyBjcmVhdGVqcy5Mb2FkUXVldWUoKTsKCSAqICAgICAgcXVldWUuc2V0TWF4Q29ubmVjdGlvbnMoMTApOyAvLyBBbGxvdyAxMCBjb25jdXJyZW50IGxvYWRzCgkgKgoJICogQG1ldGhvZCBzZXRNYXhDb25uZWN0aW9ucwoJICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgb2YgY29uY3VycmVudCBsb2FkcyB0byBhbGxvdy4gQnkgZGVmYXVsdCwgb25seSBhIHNpbmdsZSBjb25uZWN0aW9uIHBlciBMb2FkUXVldWUKCSAqIGlzIG9wZW4gYXQgYW55IHRpbWUuCgkgKi8KCXAuc2V0TWF4Q29ubmVjdGlvbnMgPSBmdW5jdGlvbiAodmFsdWUpIHsKCQl0aGlzLl9tYXhDb25uZWN0aW9ucyA9IHZhbHVlOwoJCWlmICghdGhpcy5fcGF1c2VkICYmIHRoaXMuX2xvYWRRdWV1ZS5sZW5ndGggPiAwKSB7CgkJCXRoaXMuX2xvYWROZXh0KCk7CgkJfQoJfTsKCgkvKioKCSAqIExvYWQgYSBzaW5nbGUgZmlsZS4gVG8gYWRkIG11bHRpcGxlIGZpbGVzIGF0IG9uY2UsIHVzZSB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZE1hbmlmZXN0In19e3svY3Jvc3NMaW5rfX0KCSAqIG1ldGhvZC4KCSAqCgkgKiBGaWxlcyBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBjdXJyZW50IHF1ZXVlLCBzbyB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyB0byBhZGQgZmlsZXMuCgkgKiBUbyBjbGVhciB0aGUgcXVldWUgZmlyc3QsIHVzZSB0aGUge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9jbG9zZSJ9fXt7L2Nyb3NzTGlua319IG1ldGhvZC4KCSAqIEBtZXRob2QgbG9hZEZpbGUKCSAqIEBwYXJhbSB7TG9hZEl0ZW18T2JqZWN0fFN0cmluZ30gZmlsZSBUaGUgZmlsZSBvYmplY3Qgb3IgcGF0aCB0byBsb2FkLiBBIGZpbGUgY2FuIGJlIGVpdGhlcgoJICogPHVsPgoJICogICAgIDxsaT5BIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fSBpbnN0YW5jZTwvbGk+CgkgKiAgICAgPGxpPkFuIG9iamVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgZGVmaW5lZCBieSB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX08L2xpPgoJICogICAgIDxsaT5PUiBBIHN0cmluZyBwYXRoIHRvIGEgcmVzb3VyY2UuIE5vdGUgdGhhdCB0aGlzIGtpbmQgb2YgbG9hZCBpdGVtIHdpbGwgYmUgY29udmVydGVkIHRvIGEge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319CgkgKiAgICAgaW4gdGhlIGJhY2tncm91bmQuPC9saT4KCSAqIDwvdWw+CgkgKiBAcGFyYW0ge0Jvb2xlYW59IFtsb2FkTm93PXRydWVdIEtpY2sgb2ZmIGFuIGltbWVkaWF0ZSBsb2FkICh0cnVlKSBvciB3YWl0IGZvciBhIGxvYWQgY2FsbCAoZmFsc2UpLiBUaGUgZGVmYXVsdAoJICogdmFsdWUgaXMgdHJ1ZS4gSWYgdGhlIHF1ZXVlIGlzIHBhdXNlZCB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9zZXRQYXVzZWQifX17ey9jcm9zc0xpbmt9fSwgYW5kIHRoZSB2YWx1ZSBpcwoJICogYHRydWVgLCB0aGUgcXVldWUgd2lsbCByZXN1bWUgYXV0b21hdGljYWxseS4KCSAqIEBwYXJhbSB7U3RyaW5nfSBbYmFzZVBhdGhdIEEgYmFzZSBwYXRoIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gZWFjaCBmaWxlLiBUaGUgYmFzZVBhdGggYXJndW1lbnQgb3ZlcnJpZGVzIHRoZQoJICogcGF0aCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLiBOb3RlIHRoYXQgaWYgeW91IGxvYWQgYSBtYW5pZmVzdCB1c2luZyBhIGZpbGUgb2YgdHlwZSB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL01BTklGRVNUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0sCgkgKiBpdHMgZmlsZXMgd2lsbCA8c3Ryb25nPk5PVDwvc3Ryb25nPiB1c2UgdGhlIGJhc2VQYXRoIHBhcmFtZXRlci4gPHN0cm9uZz5UaGUgYmFzZVBhdGggcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQuPC9zdHJvbmc+CgkgKiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gUGxlYXNlIGVpdGhlciB1c2UgdGhlIGBiYXNlUGF0aGAgcGFyYW1ldGVyIGluIHRoZSBMb2FkUXVldWUKCSAqIGNvbnN0cnVjdG9yLCBvciBhIGBwYXRoYCBwcm9wZXJ0eSBpbiBhIG1hbmlmZXN0IGRlZmluaXRpb24uCgkgKi8KCXAubG9hZEZpbGUgPSBmdW5jdGlvbiAoZmlsZSwgbG9hZE5vdywgYmFzZVBhdGgpIHsKCQlpZiAoZmlsZSA9PSBudWxsKSB7CgkJCXZhciBldmVudCA9IG5ldyBjcmVhdGVqcy5FcnJvckV2ZW50KCJQUkVMT0FEX05PX0ZJTEUiKTsKCQkJdGhpcy5fc2VuZEVycm9yKGV2ZW50KTsKCQkJcmV0dXJuOwoJCX0KCQl0aGlzLl9hZGRJdGVtKGZpbGUsIG51bGwsIGJhc2VQYXRoKTsKCgkJaWYgKGxvYWROb3cgIT09IGZhbHNlKSB7CgkJCXRoaXMuc2V0UGF1c2VkKGZhbHNlKTsKCQl9IGVsc2UgewoJCQl0aGlzLnNldFBhdXNlZCh0cnVlKTsKCQl9Cgl9OwoKCS8qKgoJICogTG9hZCBhbiBhcnJheSBvZiBmaWxlcy4gVG8gbG9hZCBhIHNpbmdsZSBmaWxlLCB1c2UgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRGaWxlIn19e3svY3Jvc3NMaW5rfX0gbWV0aG9kLgoJICogVGhlIGZpbGVzIGluIHRoZSBtYW5pZmVzdCBhcmUgcmVxdWVzdGVkIGluIHRoZSBzYW1lIG9yZGVyLCBidXQgbWF5IGNvbXBsZXRlIGluIGEgZGlmZmVyZW50IG9yZGVyIGlmIHRoZSBtYXgKCSAqIGNvbm5lY3Rpb25zIGFyZSBzZXQgYWJvdmUgMSB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9zZXRNYXhDb25uZWN0aW9ucyJ9fXt7L2Nyb3NzTGlua319LiBTY3JpcHRzIHdpbGwgbG9hZAoJICogaW4gdGhlIHJpZ2h0IG9yZGVyIGFzIGxvbmcgYXMge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbWFpbnRhaW5TY3JpcHRPcmRlciJ9fXt7L2Nyb3NzTGlua319IGlzIHRydWUgKHdoaWNoIGlzCgkgKiBkZWZhdWx0KS4KCSAqCgkgKiBGaWxlcyBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBjdXJyZW50IHF1ZXVlLCBzbyB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyB0byBhZGQgZmlsZXMuCgkgKiBUbyBjbGVhciB0aGUgcXVldWUgZmlyc3QsIHVzZSB0aGUge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9jbG9zZSJ9fXt7L2Nyb3NzTGlua319IG1ldGhvZC4KCSAqIEBtZXRob2QgbG9hZE1hbmlmZXN0CgkgKiBAcGFyYW0ge0FycmF5fFN0cmluZ3xPYmplY3R9IG1hbmlmZXN0IEFuIGxpc3Qgb2YgZmlsZXMgdG8gbG9hZC4gVGhlIGxvYWRNYW5pZmVzdCBjYWxsIHN1cHBvcnRzIGZvdXIgdHlwZXMgb2YKCSAqIG1hbmlmZXN0czoKCSAqIDxvbD4KCSAqICAgICA8bGk+QSBzdHJpbmcgcGF0aCwgd2hpY2ggcG9pbnRzIHRvIGEgbWFuaWZlc3QgZmlsZSwgd2hpY2ggaXMgYSBKU09OIGZpbGUgdGhhdCBjb250YWlucyBhICJtYW5pZmVzdCIgcHJvcGVydHksCgkgKiAgICAgd2hpY2ggZGVmaW5lcyB0aGUgbGlzdCBvZiBmaWxlcyB0byBsb2FkLCBhbmQgY2FuIG9wdGlvbmFsbHkgY29udGFpbiBhICJwYXRoIiBwcm9wZXJ0eSwgd2hpY2ggd2lsbCBiZQoJICogICAgIHByZXBlbmRlZCB0byBlYWNoIGZpbGUgaW4gdGhlIGxpc3QuPC9saT4KCSAqICAgICA8bGk+QW4gb2JqZWN0IHdoaWNoIGRlZmluZXMgYSAic3JjIiwgd2hpY2ggaXMgYSBKU09OIG9yIEpTT05QIGZpbGUuIEEgImNhbGxiYWNrIiBjYW4gYmUgZGVmaW5lZCBmb3IgSlNPTlAKCSAqICAgICBmaWxlLiBUaGUgSlNPTi9KU09OUCBmaWxlIHNob3VsZCBjb250YWluIGEgIm1hbmlmZXN0IiBwcm9wZXJ0eSwgd2hpY2ggZGVmaW5lcyB0aGUgbGlzdCBvZiBmaWxlcyB0byBsb2FkLAoJICogICAgIGFuZCBjYW4gb3B0aW9uYWxseSBjb250YWluIGEgInBhdGgiIHByb3BlcnR5LCB3aGljaCB3aWxsIGJlIHByZXBlbmRlZCB0byBlYWNoIGZpbGUgaW4gdGhlIGxpc3QuPC9saT4KCSAqICAgICA8bGk+QW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGEgIm1hbmlmZXN0IiBwcm9wZXJ0eSwgd2hpY2ggZGVmaW5lcyB0aGUgbGlzdCBvZiBmaWxlcyB0byBsb2FkLCBhbmQgY2FuCgkgKiAgICAgb3B0aW9uYWxseSBjb250YWluIGEgInBhdGgiIHByb3BlcnR5LCB3aGljaCB3aWxsIGJlIHByZXBlbmRlZCB0byBlYWNoIGZpbGUgaW4gdGhlIGxpc3QuPC9saT4KCSAqICAgICA8bGk+QW4gQXJyYXkgb2YgZmlsZXMgdG8gbG9hZC48L2xpPgoJICogPC9vbD4KCSAqCgkgKiBFYWNoICJmaWxlIiBpbiBhIG1hbmlmZXN0IGNhbiBiZSBlaXRoZXI6CgkgKiA8dWw+CgkgKiAgICAgPGxpPkEge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319IGluc3RhbmNlPC9saT4KCSAqICAgICA8bGk+QW4gb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyBkZWZpbmVkIGJ5IHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fTwvbGk+CgkgKiAgICAgPGxpPk9SIEEgc3RyaW5nIHBhdGggdG8gYSByZXNvdXJjZS4gTm90ZSB0aGF0IHRoaXMga2luZCBvZiBsb2FkIGl0ZW0gd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX0KCSAqICAgICBpbiB0aGUgYmFja2dyb3VuZC48L2xpPgoJICogPC91bD4KCSAqCgkgKiBAcGFyYW0ge0Jvb2xlYW59IFtsb2FkTm93PXRydWVdIEtpY2sgb2ZmIGFuIGltbWVkaWF0ZSBsb2FkICh0cnVlKSBvciB3YWl0IGZvciBhIGxvYWQgY2FsbCAoZmFsc2UpLiBUaGUgZGVmYXVsdAoJICogdmFsdWUgaXMgdHJ1ZS4gSWYgdGhlIHF1ZXVlIGlzIHBhdXNlZCB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9zZXRQYXVzZWQifX17ey9jcm9zc0xpbmt9fSBhbmQgdGhpcyB2YWx1ZSBpcwoJICogYHRydWVgLCB0aGUgcXVldWUgd2lsbCByZXN1bWUgYXV0b21hdGljYWxseS4KCSAqIEBwYXJhbSB7U3RyaW5nfSBbYmFzZVBhdGhdIEEgYmFzZSBwYXRoIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gZWFjaCBmaWxlLiBUaGUgYmFzZVBhdGggYXJndW1lbnQgb3ZlcnJpZGVzIHRoZQoJICogcGF0aCBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yLiBOb3RlIHRoYXQgaWYgeW91IGxvYWQgYSBtYW5pZmVzdCB1c2luZyBhIGZpbGUgb2YgdHlwZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9NQU5JRkVTVDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319LAoJICogaXRzIGZpbGVzIHdpbGwgPHN0cm9uZz5OT1Q8L3N0cm9uZz4gdXNlIHRoZSBiYXNlUGF0aCBwYXJhbWV0ZXIuIDxzdHJvbmc+VGhlIGJhc2VQYXRoIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLjwvc3Ryb25nPgoJICogVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIFBsZWFzZSBlaXRoZXIgdXNlIHRoZSBgYmFzZVBhdGhgIHBhcmFtZXRlciBpbiB0aGUgTG9hZFF1ZXVlCgkgKiBjb25zdHJ1Y3Rvciwgb3IgYSBgcGF0aGAgcHJvcGVydHkgaW4gYSBtYW5pZmVzdCBkZWZpbml0aW9uLgoJICovCglwLmxvYWRNYW5pZmVzdCA9IGZ1bmN0aW9uIChtYW5pZmVzdCwgbG9hZE5vdywgYmFzZVBhdGgpIHsKCQl2YXIgZmlsZUxpc3QgPSBudWxsOwoJCXZhciBwYXRoID0gbnVsbDsKCgkJLy8gQXJyYXktYmFzZWQgbGlzdCBvZiBpdGVtcwoJCWlmIChtYW5pZmVzdCBpbnN0YW5jZW9mIEFycmF5KSB7CgkJCWlmIChtYW5pZmVzdC5sZW5ndGggPT0gMCkgewoJCQkJdmFyIGV2ZW50ID0gbmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIlBSRUxPQURfTUFOSUZFU1RfRU1QVFkiKTsKCQkJCXRoaXMuX3NlbmRFcnJvcihldmVudCk7CgkJCQlyZXR1cm47CgkJCX0KCQkJZmlsZUxpc3QgPSBtYW5pZmVzdDsKCgkJCS8vIFN0cmluZy1iYXNlZC4gT25seSBmaWxlIG1hbmlmZXN0cyBjYW4gYmUgc3BlY2lmaWVkIHRoaXMgd2F5LiBBbnkgb3RoZXIgdHlwZXMgd2lsbCBjYXVzZSBhbiBlcnJvciB3aGVuIGxvYWRlZC4KCQl9IGVsc2UgaWYgKHR5cGVvZihtYW5pZmVzdCkgPT09ICJzdHJpbmciKSB7CgkJCWZpbGVMaXN0ID0gWwoJCQkJewoJCQkJCXNyYzogbWFuaWZlc3QsCgkJCQkJdHlwZTogcy5NQU5JRkVTVAoJCQkJfQoJCQldOwoKCQl9IGVsc2UgaWYgKHR5cGVvZihtYW5pZmVzdCkgPT0gIm9iamVjdCIpIHsKCgkJCS8vIEFuIG9iamVjdCB0aGF0IGRlZmluZXMgYSBtYW5pZmVzdCBwYXRoCgkJCWlmIChtYW5pZmVzdC5zcmMgIT09IHVuZGVmaW5lZCkgewoJCQkJaWYgKG1hbmlmZXN0LnR5cGUgPT0gbnVsbCkgewoJCQkJCW1hbmlmZXN0LnR5cGUgPSBzLk1BTklGRVNUOwoJCQkJfSBlbHNlIGlmIChtYW5pZmVzdC50eXBlICE9IHMuTUFOSUZFU1QpIHsKCQkJCQl2YXIgZXZlbnQgPSBuZXcgY3JlYXRlanMuRXJyb3JFdmVudCgiUFJFTE9BRF9NQU5JRkVTVF9UWVBFIik7CgkJCQkJdGhpcy5fc2VuZEVycm9yKGV2ZW50KTsKCQkJCX0KCQkJCWZpbGVMaXN0ID0gW21hbmlmZXN0XTsKCgkJCQkvLyBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIGEgbWFuaWZlc3QKCQkJfSBlbHNlIGlmIChtYW5pZmVzdC5tYW5pZmVzdCAhPT0gdW5kZWZpbmVkKSB7CgkJCQlmaWxlTGlzdCA9IG1hbmlmZXN0Lm1hbmlmZXN0OwoJCQkJcGF0aCA9IG1hbmlmZXN0LnBhdGg7CgkJCX0KCgkJCS8vIFVuc3VwcG9ydGVkLiBUaGlzIHdpbGwgdGhyb3cgYW4gZXJyb3IuCgkJfSBlbHNlIHsKCQkJdmFyIGV2ZW50ID0gbmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIlBSRUxPQURfTUFOSUZFU1RfTlVMTCIpOwoJCQl0aGlzLl9zZW5kRXJyb3IoZXZlbnQpOwoJCQlyZXR1cm47CgkJfQoKCQlmb3IgKHZhciBpID0gMCwgbCA9IGZpbGVMaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykgewoJCQl0aGlzLl9hZGRJdGVtKGZpbGVMaXN0W2ldLCBwYXRoLCBiYXNlUGF0aCk7CgkJfQoKCQlpZiAobG9hZE5vdyAhPT0gZmFsc2UpIHsKCQkJdGhpcy5zZXRQYXVzZWQoZmFsc2UpOwoJCX0gZWxzZSB7CgkJCXRoaXMuc2V0UGF1c2VkKHRydWUpOwoJCX0KCgl9OwoKCS8qKgoJICogU3RhcnQgYSBMb2FkUXVldWUgdGhhdCB3YXMgY3JlYXRlZCwgYnV0IG5vdCBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQuCgkgKiBAbWV0aG9kIGxvYWQKCSAqLwoJcC5sb2FkID0gZnVuY3Rpb24gKCkgewoJCXRoaXMuc2V0UGF1c2VkKGZhbHNlKTsKCX07CgoJLyoqCgkgKiBMb29rIHVwIGEge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319IHVzaW5nIGVpdGhlciB0aGUgImlkIiBvciAic3JjIiB0aGF0IHdhcyBzcGVjaWZpZWQgd2hlbiBsb2FkaW5nIGl0LiBOb3RlIHRoYXQgaWYgbm8gImlkIiB3YXMKCSAqIHN1cHBsaWVkIHdpdGggdGhlIGxvYWQgaXRlbSwgdGhlIElEIHdpbGwgYmUgdGhlICJzcmMiLCBpbmNsdWRpbmcgYSBgcGF0aGAgcHJvcGVydHkgZGVmaW5lZCBieSBhIG1hbmlmZXN0LiBUaGUKCSAqIGBiYXNlUGF0aGAgd2lsbCBub3QgYmUgcGFydCBvZiB0aGUgSUQuCgkgKiBAbWV0aG9kIGdldEl0ZW0KCSAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSBUaGUgPGNvZGU+aWQ8L2NvZGU+IG9yIDxjb2RlPnNyYzwvY29kZT4gb2YgdGhlIGxvYWQgaXRlbS4KCSAqIEByZXR1cm4ge09iamVjdH0gVGhlIGxvYWQgaXRlbSB0aGF0IHdhcyBpbml0aWFsbHkgcmVxdWVzdGVkIHVzaW5nIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRGaWxlIn19e3svY3Jvc3NMaW5rfX0KCSAqIG9yIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRNYW5pZmVzdCJ9fXt7L2Nyb3NzTGlua319LiBUaGlzIG9iamVjdCBpcyBhbHNvIHJldHVybmVkIHZpYSB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvZmlsZWxvYWQ6ZXZlbnQifX17ey9jcm9zc0xpbmt9fQoJICogZXZlbnQgYXMgdGhlIGBpdGVtYCBwYXJhbWV0ZXIuCgkgKi8KCXAuZ2V0SXRlbSA9IGZ1bmN0aW9uICh2YWx1ZSkgewoJCXJldHVybiB0aGlzLl9sb2FkSXRlbXNCeUlkW3ZhbHVlXSB8fCB0aGlzLl9sb2FkSXRlbXNCeVNyY1t2YWx1ZV07Cgl9OwoKCS8qKgoJICogTG9vayB1cCBhIGxvYWRlZCByZXN1bHQgdXNpbmcgZWl0aGVyIHRoZSAiaWQiIG9yICJzcmMiIHRoYXQgd2FzIHNwZWNpZmllZCB3aGVuIGxvYWRpbmcgaXQuIE5vdGUgdGhhdCBpZiBubyAiaWQiCgkgKiB3YXMgc3VwcGxpZWQgd2l0aCB0aGUgbG9hZCBpdGVtLCB0aGUgSUQgd2lsbCBiZSB0aGUgInNyYyIsIGluY2x1ZGluZyBhIGBwYXRoYCBwcm9wZXJ0eSBkZWZpbmVkIGJ5IGEgbWFuaWZlc3QuIFRoZQoJICogYGJhc2VQYXRoYCB3aWxsIG5vdCBiZSBwYXJ0IG9mIHRoZSBJRC4KCSAqIEBtZXRob2QgZ2V0UmVzdWx0CgkgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgVGhlIDxjb2RlPmlkPC9jb2RlPiBvciA8Y29kZT5zcmM8L2NvZGU+IG9mIHRoZSBsb2FkIGl0ZW0uCgkgKiBAcGFyYW0ge0Jvb2xlYW59IFtyYXdSZXN1bHQ9ZmFsc2VdIFJldHVybiBhIHJhdyByZXN1bHQgaW5zdGVhZCBvZiBhIGZvcm1hdHRlZCByZXN1bHQuIFRoaXMgYXBwbGllcyB0byBjb250ZW50CgkgKiBsb2FkZWQgdmlhIFhIUiBzdWNoIGFzIHNjcmlwdHMsIFhNTCwgQ1NTLCBhbmQgSW1hZ2VzLiBJZiB0aGVyZSBpcyBubyByYXcgcmVzdWx0LCB0aGUgZm9ybWF0dGVkIHJlc3VsdCB3aWxsIGJlCgkgKiByZXR1cm5lZCBpbnN0ZWFkLgoJICogQHJldHVybiB7T2JqZWN0fSBBIHJlc3VsdCBvYmplY3QgY29udGFpbmluZyB0aGUgY29udGVudCB0aGF0IHdhcyBsb2FkZWQsIHN1Y2ggYXM6CgkgKiA8dWw+CgkgKiAgICAgIDxsaT5BbiBpbWFnZSB0YWcgKCZsdDtpbWFnZSAvJmd0OykgZm9yIGltYWdlczwvbGk+CgkgKiAgICAgIDxsaT5BIHNjcmlwdCB0YWcgZm9yIEphdmFTY3JpcHQgKCZsdDtzY3JpcHQgLyZndDspLiBOb3RlIHRoYXQgc2NyaXB0cyBhcmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgSFRNTAoJICogICAgICBET00uPC9saT4KCSAqICAgICAgPGxpPkEgc3R5bGUgdGFnIGZvciBDU1MgKCZsdDtzdHlsZSAvJmd0OyBvciAmbHQ7bGluayAmZ3Q7KTwvbGk+CgkgKiAgICAgIDxsaT5SYXcgdGV4dCBmb3IgVEVYVDwvbGk+CgkgKiAgICAgIDxsaT5BIGZvcm1hdHRlZCBKYXZhU2NyaXB0IG9iamVjdCBkZWZpbmVkIGJ5IEpTT048L2xpPgoJICogICAgICA8bGk+QW4gWE1MIGRvY3VtZW50PC9saT4KCSAqICAgICAgPGxpPkEgYmluYXJ5IGFycmF5YnVmZmVyIGxvYWRlZCBieSBYSFI8L2xpPgoJICogICAgICA8bGk+QW4gYXVkaW8gdGFnICgmbHQ7YXVkaW8gJmd0OykgZm9yIEhUTUwgYXVkaW8uIE5vdGUgdGhhdCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgU291bmRKUyBBUElzIHRvIHBsYXkKCSAqICAgICAgbG9hZGVkIGF1ZGlvLiBTcGVjaWZpY2FsbHksIGF1ZGlvIGxvYWRlZCBieSBGbGFzaCBhbmQgV2ViQXVkaW8gd2lsbCByZXR1cm4gYSBsb2FkZXIgb2JqZWN0IHVzaW5nIHRoaXMgbWV0aG9kCgkgKiAgICAgIHdoaWNoIGNhbiBub3QgYmUgdXNlZCB0byBwbGF5IGF1ZGlvIGJhY2suPC9saT4KCSAqIDwvdWw+CgkgKiBUaGlzIG9iamVjdCBpcyBhbHNvIHJldHVybmVkIHZpYSB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvZmlsZWxvYWQ6ZXZlbnQifX17ey9jcm9zc0xpbmt9fSBldmVudCBhcyB0aGUgJ2l0ZW1gCgkgKiBwYXJhbWV0ZXIuIE5vdGUgdGhhdCBpZiBhIHJhdyByZXN1bHQgaXMgcmVxdWVzdGVkLCBidXQgbm90IGZvdW5kLCB0aGUgcmVzdWx0IHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC4KCSAqLwoJcC5nZXRSZXN1bHQgPSBmdW5jdGlvbiAodmFsdWUsIHJhd1Jlc3VsdCkgewoJCXZhciBpdGVtID0gdGhpcy5fbG9hZEl0ZW1zQnlJZFt2YWx1ZV0gfHwgdGhpcy5fbG9hZEl0ZW1zQnlTcmNbdmFsdWVdOwoJCWlmIChpdGVtID09IG51bGwpIHsgcmV0dXJuIG51bGw7IH0KCQl2YXIgaWQgPSBpdGVtLmlkOwoJCWlmIChyYXdSZXN1bHQgJiYgdGhpcy5fbG9hZGVkUmF3UmVzdWx0c1tpZF0pIHsKCQkJcmV0dXJuIHRoaXMuX2xvYWRlZFJhd1Jlc3VsdHNbaWRdOwoJCX0KCQlyZXR1cm4gdGhpcy5fbG9hZGVkUmVzdWx0c1tpZF07Cgl9OwoKCS8qKgoJICogR2VuZXJhdGUgYW4gbGlzdCBvZiBpdGVtcyBsb2FkZWQgYnkgdGhpcyBxdWV1ZS4KCSAqIEBtZXRob2QgZ2V0SXRlbXMKCSAqIEBwYXJhbSB7Qm9vbGVhbn0gbG9hZGVkIERldGVybWluZXMgaWYgb25seSBpdGVtcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgc2hvdWxkIGJlIHJldHVybmVkLiBJZiBmYWxzZSwgaW4tcHJvZ3Jlc3MKCSAqIGFuZCBmYWlsZWQgbG9hZCBpdGVtcyB3aWxsIGFsc28gYmUgaW5jbHVkZWQuCgkgKiBAcmV0dXJucyB7QXJyYXl9IEEgbGlzdCBvZiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZC4gRWFjaCBpdGVtIGluY2x1ZGVzIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX0sCgkgKiByZXN1bHQsIGFuZCByYXdSZXN1bHQuCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcC5nZXRJdGVtcyA9IGZ1bmN0aW9uKGxvYWRlZCkgewoJCXZhciBhcnIgPSBbXTsKCQlmb3IgKHZhciBpPSAwLCBsPXRoaXMuX2xvYWRRdWV1ZUJhY2t1cC5sZW5ndGg7IGk8bDsgaSsrKSB7CgkJCXZhciBsb2FkZXIgPSB0aGlzLl9sb2FkUXVldWVCYWNrdXBbaV07CgkJCXZhciBpdGVtID0gbG9hZGVyLmdldEl0ZW0oKTsKCQkJaWYgKGxvYWRlZCA9PT0gdHJ1ZSAmJiAhbG9hZGVyLmxvYWRlZCkgeyBjb250aW51ZTsgfQoJCQlhcnIucHVzaCh7CgkJCQlpdGVtOiBpdGVtLAoJCQkJcmVzdWx0OiB0aGlzLmdldFJlc3VsdChpdGVtLmlkKSwKCQkJCXJhd1Jlc3VsdDogdGhpcy5nZXRSZXN1bHQoaXRlbS5pZCwgdHJ1ZSkKCQkJIH0pOwoJCX0KCQlyZXR1cm4gYXJyOwoJfTsKCgkvKioKCSAqIFBhdXNlIG9yIHJlc3VtZSB0aGUgY3VycmVudCBsb2FkLiBBY3RpdmUgbG9hZHMgd2lsbCBub3QgYmUgY2FuY2VsbGVkLCBidXQgdGhlIG5leHQgaXRlbXMgaW4gdGhlIHF1ZXVlIHdpbGwgbm90CgkgKiBiZSBwcm9jZXNzZWQgd2hlbiBhY3RpdmUgbG9hZHMgY29tcGxldGUuIExvYWRRdWV1ZXMgYXJlIG5vdCBwYXVzZWQgYnkgZGVmYXVsdC4KCSAqCgkgKiBOb3RlIHRoYXQgaWYgbmV3IGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgcXVldWUgdXNpbmcge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZEZpbGUifX17ey9jcm9zc0xpbmt9fSBvcgoJICoge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZE1hbmlmZXN0In19e3svY3Jvc3NMaW5rfX0sIGEgcGF1c2VkIHF1ZXVlIHdpbGwgYmUgcmVzdW1lZCwgdW5sZXNzIHRoZSBgbG9hZE5vd2AKCSAqIGFyZ3VtZW50IGlzIGBmYWxzZWAuCgkgKiBAbWV0aG9kIHNldFBhdXNlZAoJICogQHBhcmFtIHtCb29sZWFufSB2YWx1ZSBXaGV0aGVyIHRoZSBxdWV1ZSBzaG91bGQgYmUgcGF1c2VkIG9yIG5vdC4KCSAqLwoJcC5zZXRQYXVzZWQgPSBmdW5jdGlvbiAodmFsdWUpIHsKCQl0aGlzLl9wYXVzZWQgPSB2YWx1ZTsKCQlpZiAoIXRoaXMuX3BhdXNlZCkgewoJCQl0aGlzLl9sb2FkTmV4dCgpOwoJCX0KCX07CgoJLyoqCgkgKiBDbG9zZSB0aGUgYWN0aXZlIHF1ZXVlLiBDbG9zaW5nIGEgcXVldWUgY29tcGxldGVseSBlbXB0aWVzIHRoZSBxdWV1ZSwgYW5kIHByZXZlbnRzIGFueSByZW1haW5pbmcgaXRlbXMgZnJvbQoJICogc3RhcnRpbmcgdG8gZG93bmxvYWQuIE5vdGUgdGhhdCBjdXJyZW50bHkgYW55IGFjdGl2ZSBsb2FkcyB3aWxsIHJlbWFpbiBvcGVuLCBhbmQgZXZlbnRzIG1heSBiZSBwcm9jZXNzZWQuCgkgKgoJICogVG8gc3RvcCBhbmQgcmVzdGFydCBhIHF1ZXVlLCB1c2UgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL3NldFBhdXNlZCJ9fXt7L2Nyb3NzTGlua319IG1ldGhvZCBpbnN0ZWFkLgoJICogQG1ldGhvZCBjbG9zZQoJICovCglwLmNsb3NlID0gZnVuY3Rpb24gKCkgewoJCXdoaWxlICh0aGlzLl9jdXJyZW50TG9hZHMubGVuZ3RoKSB7CgkJCXRoaXMuX2N1cnJlbnRMb2Fkcy5wb3AoKS5jYW5jZWwoKTsKCQl9CgkJdGhpcy5fc2NyaXB0T3JkZXIubGVuZ3RoID0gMDsKCQl0aGlzLl9sb2FkZWRTY3JpcHRzLmxlbmd0aCA9IDA7CgkJdGhpcy5sb2FkU3RhcnRXYXNEaXNwYXRjaGVkID0gZmFsc2U7CgkJdGhpcy5faXRlbUNvdW50ID0gMDsKCQl0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBOYU47Cgl9OwoKLy8gcHJvdGVjdGVkIG1ldGhvZHMKCS8qKgoJICogQWRkIGFuIGl0ZW0gdG8gdGhlIHF1ZXVlLiBJdGVtcyBhcmUgZm9ybWF0dGVkIGludG8gYSB1c2FibGUgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBwcm9wZXJ0aWVzIG5lY2Vzc2FyeSB0bwoJICogbG9hZCB0aGUgY29udGVudC4gVGhlIGxvYWQgcXVldWUgaXMgcG9wdWxhdGVkIHdpdGggdGhlIGxvYWRlciBpbnN0YW5jZSB0aGF0IGhhbmRsZXMgcHJlbG9hZGluZywgYW5kIG5vdCB0aGUgbG9hZAoJICogaXRlbSB0aGF0IHdhcyBwYXNzZWQgaW4gYnkgdGhlIHVzZXIuIFRvIGxvb2sgdXAgdGhlIGxvYWQgaXRlbSBieSBpZCBvciBzcmMsIHVzZSB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUuZ2V0SXRlbSJ9fXt7L2Nyb3NzTGlua319CgkgKiBtZXRob2QuCgkgKiBAbWV0aG9kIF9hZGRJdGVtCgkgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHZhbHVlIFRoZSBpdGVtIHRvIGFkZCB0byB0aGUgcXVldWUuCgkgKiBAcGFyYW0ge1N0cmluZ30gW3BhdGhdIEFuIG9wdGlvbmFsIHBhdGggcHJlcGVuZGVkIHRvIHRoZSBgc3JjYC4gVGhlIHBhdGggd2lsbCBvbmx5IGJlIHByZXBlbmRlZCBpZiB0aGUgc3JjIGlzCgkgKiByZWxhdGl2ZSwgYW5kIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBwcm90b2NvbCBzdWNoIGFzIGBodHRwOi8vYCwgb3IgYSBwYXRoIGxpa2UgYC4uL2AuIElmIHRoZSBMb2FkUXVldWUgd2FzCgkgKiBwcm92aWRlZCBhIHt7I2Nyb3NzTGluayAiX2Jhc2VQYXRoIn19e3svY3Jvc3NMaW5rfX0sIHRoZW4gaXQgd2lsbCBvcHRpb25hbGx5IGJlIHByZXBlbmRlZCBhZnRlci4KCSAqIEBwYXJhbSB7U3RyaW5nfSBbYmFzZVBhdGhdIDxzdHJvbmc+RGVwcmVjYXRlZDwvc3Ryb25nPkFuIG9wdGlvbmFsIGJhc2VQYXRoIHBhc3NlZCBpbnRvIGEge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZE1hbmlmZXN0In19e3svY3Jvc3NMaW5rfX0KCSAqIG9yIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRGaWxlIn19e3svY3Jvc3NMaW5rfX0gY2FsbC4gVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHRhZ2dlZAoJICogdmVyc2lvbi4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2FkZEl0ZW0gPSBmdW5jdGlvbiAodmFsdWUsIHBhdGgsIGJhc2VQYXRoKSB7CgkJdmFyIGl0ZW0gPSB0aGlzLl9jcmVhdGVMb2FkSXRlbSh2YWx1ZSwgcGF0aCwgYmFzZVBhdGgpOyAvLyBiYXNlUGF0aCBhbmQgbWFuaWZlc3QgcGF0aCBhcmUgYWRkZWQgdG8gdGhlIHNyYy4KCQlpZiAoaXRlbSA9PSBudWxsKSB7IHJldHVybjsgfSAvLyBTb21ldGltZXMgcGx1Z2lucyBvciB0eXBlcyBzaG91bGQgYmUgc2tpcHBlZC4KCQl2YXIgbG9hZGVyID0gdGhpcy5fY3JlYXRlTG9hZGVyKGl0ZW0pOwoJCWlmIChsb2FkZXIgIT0gbnVsbCkgewoJCQlpdGVtLl9sb2FkZXIgPSBsb2FkZXI7CgkJCXRoaXMuX2xvYWRRdWV1ZS5wdXNoKGxvYWRlcik7CgkJCXRoaXMuX2xvYWRRdWV1ZUJhY2t1cC5wdXNoKGxvYWRlcik7CgoJCQl0aGlzLl9udW1JdGVtcysrOwoJCQl0aGlzLl91cGRhdGVQcm9ncmVzcygpOwoKCQkJLy8gT25seSB3b3JyeSBhYm91dCBzY3JpcHQgb3JkZXIgd2hlbiB1c2luZyBYSFIgdG8gbG9hZCBzY3JpcHRzLiBUYWdzIGFyZSBvbmx5IGxvYWRpbmcgb25lIGF0IGEgdGltZS4KCQkJaWYgKCh0aGlzLm1haW50YWluU2NyaXB0T3JkZXIKCQkJCSAmJiBpdGVtLnR5cGUgPT0gY3JlYXRlanMuTG9hZFF1ZXVlLkpBVkFTQ1JJUFQKCQkJCQkvLyYmIGxvYWRlciBpbnN0YW5jZW9mIGNyZWF0ZWpzLlhIUkxvYWRlciAvL05PVEU6IEhhdmUgdG8gdHJhY2sgYWxsIEpTIGZpbGVzIHRoaXMgd2F5CgkJCQkpCgkJCQl8fCBpdGVtLm1haW50YWluT3JkZXIgPT09IHRydWUpIHsKCQkJCXRoaXMuX3NjcmlwdE9yZGVyLnB1c2goaXRlbSk7CgkJCQl0aGlzLl9sb2FkZWRTY3JpcHRzLnB1c2gobnVsbCk7CgkJCX0KCQl9Cgl9OwoKCS8qKgoJICogQ3JlYXRlIGEgcmVmaW5lZCB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX0sIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgcmVxdWlyZWQgcHJvcGVydGllcy4gVGhlIHR5cGUgb2YKCSAqIGl0ZW0gaXMgZGV0ZXJtaW5lZCBieSBicm93c2VyIHN1cHBvcnQsIHJlcXVpcmVtZW50cyBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLCBhbmQgZGV2ZWxvcGVyIHNldHRpbmdzLiBGb3IgZXhhbXBsZSwKCSAqIFhIUiBpcyBvbmx5IHVzZWQgZm9yIGZpbGUgdHlwZXMgdGhhdCBzdXBwb3J0IGl0IGluIG5ldyBicm93c2Vycy4KCSAqCgkgKiBCZWZvcmUgdGhlIGl0ZW0gaXMgcmV0dXJuZWQsIGFueSBwbHVnaW5zIHJlZ2lzdGVyZWQgdG8gaGFuZGxlIHRoZSB0eXBlIG9yIGV4dGVuc2lvbiB3aWxsIGJlIGZpcmVkLCB3aGljaCBtYXkKCSAqIGFsdGVyIHRoZSBsb2FkIGl0ZW0uCgkgKiBAbWV0aG9kIF9jcmVhdGVMb2FkSXRlbQoJICogQHBhcmFtIHtTdHJpbmcgfCBPYmplY3QgfCBIVE1MQXVkaW9FbGVtZW50IHwgSFRNTEltYWdlRWxlbWVudH0gdmFsdWUgVGhlIGl0ZW0gdGhhdCBuZWVkcyB0byBiZSBwcmVsb2FkZWQuCgkgKiBAcGFyYW0ge1N0cmluZ30gW3BhdGhdIEEgcGF0aCB0byBwcmVwZW5kIHRvIHRoZSBpdGVtJ3Mgc291cmNlLiBTb3VyY2VzIGJlZ2lubmluZyB3aXRoIGh0dHA6Ly8gb3Igc2ltaWxhciB3aWxsCgkgKiBub3QgcmVjZWl2ZSBhIHBhdGguIFNpbmNlIFByZWxvYWRKUyAwLjQuMSwgdGhlIHNyYyB3aWxsIGJlIG1vZGlmaWVkIHRvIGluY2x1ZGUgdGhlIGBwYXRoYCBhbmQge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvX2Jhc2VQYXRoOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0KCSAqIHdoZW4gaXQgaXMgYWRkZWQuCgkgKiBAcGFyYW0ge1N0cmluZ30gW2Jhc2VQYXRoXSA8c3Ryb25nPkRlcHJlY3RhdGVkPC9zdHJvbmc+IEEgYmFzZSBwYXRoIHRvIHByZXBlbmQgdG8gdGhlIGl0ZW1zIHNvdXJjZSBpbiBhZGRpdGlvbiB0bwoJICogdGhlIHBhdGggYXJndW1lbnQuCgkgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBsb2FkZXIgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9jcmVhdGVMb2FkSXRlbSA9IGZ1bmN0aW9uICh2YWx1ZSwgcGF0aCwgYmFzZVBhdGgpIHsKCQl2YXIgaXRlbSA9IGNyZWF0ZWpzLkxvYWRJdGVtLmNyZWF0ZSh2YWx1ZSk7CgkJaWYgKGl0ZW0gPT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfQoKCQkvLyBEZXRlcm1pbmUgRXh0ZW5zaW9uLCBldGMuCgkJdmFyIG1hdGNoID0gY3JlYXRlanMuUmVxdWVzdFV0aWxzLnBhcnNlVVJJKGl0ZW0uc3JjKTsKCQlpZiAobWF0Y2guZXh0ZW5zaW9uKSB7IGl0ZW0uZXh0ID0gbWF0Y2guZXh0ZW5zaW9uOyB9CgkJaWYgKGl0ZW0udHlwZSA9PSBudWxsKSB7CgkJCWl0ZW0udHlwZSA9IGNyZWF0ZWpzLlJlcXVlc3RVdGlscy5nZXRUeXBlQnlFeHRlbnNpb24oaXRlbS5leHQpOwoJCX0KCgkJLy8gSW5qZWN0IHBhdGggJiBiYXNlUGF0aAoJCXZhciBicCA9ICIiOyAvLyBTdG9yZSB0aGUgZ2VuZXJhdGVkIGJhc2VQYXRoCgkJdmFyIHVzZUJhc2VQYXRoID0gYmFzZVBhdGggfHwgdGhpcy5fYmFzZVBhdGg7CgkJdmFyIGF1dG9JZCA9IGl0ZW0uc3JjOwoJCWlmICghbWF0Y2guYWJzb2x1dGUgJiYgIW1hdGNoLnJlbGF0aXZlKSB7CgkJCWlmIChwYXRoKSB7CgkJCQlicCA9IHBhdGg7CgkJCQl2YXIgcGF0aE1hdGNoID0gY3JlYXRlanMuUmVxdWVzdFV0aWxzLnBhcnNlVVJJKHBhdGgpOwoJCQkJYXV0b0lkID0gcGF0aCArIGF1dG9JZDsKCQkJCS8vIEFsc28gYXBwZW5kIGJhc2VQYXRoCgkJCQlpZiAodXNlQmFzZVBhdGggIT0gbnVsbCAmJiAhcGF0aE1hdGNoLmFic29sdXRlICYmICFwYXRoTWF0Y2gucmVsYXRpdmUpIHsKCQkJCQlicCA9IHVzZUJhc2VQYXRoICsgYnA7CgkJCQl9CgkJCX0gZWxzZSBpZiAodXNlQmFzZVBhdGggIT0gbnVsbCkgewoJCQkJYnAgPSB1c2VCYXNlUGF0aDsKCQkJfQoJCX0KCQlpdGVtLnNyYyA9IGJwICsgaXRlbS5zcmM7CgkJaXRlbS5wYXRoID0gYnA7CgoJCS8vIElmIHRoZXJlJ3Mgbm8gaWQsIHNldCBvbmUgbm93LgoJCWlmIChpdGVtLmlkID09PSB1bmRlZmluZWQgfHwgaXRlbS5pZCA9PT0gbnVsbCB8fCBpdGVtLmlkID09PSAiIikgewoJCQlpdGVtLmlkID0gYXV0b0lkOwoJCX0KCgkJLy8gR2l2ZSBwbHVnaW5zIGEgY2hhbmNlIHRvIG1vZGlmeSB0aGUgbG9hZEl0ZW06CgkJdmFyIGN1c3RvbUhhbmRsZXIgPSB0aGlzLl90eXBlQ2FsbGJhY2tzW2l0ZW0udHlwZV0gfHwgdGhpcy5fZXh0ZW5zaW9uQ2FsbGJhY2tzW2l0ZW0uZXh0XTsKCQlpZiAoY3VzdG9tSGFuZGxlcikgewoJCQkvLyBQbHVnaW5zIGFyZSBub3cgcGFzc2VkIGJvdGggdGhlIGZ1bGwgc291cmNlLCBhcyB3ZWxsIGFzIGEgY29tYmluZWQgcGF0aCtiYXNlUGF0aCAoYXBwcm9wcmlhdGVseSkKCQkJdmFyIHJlc3VsdCA9IGN1c3RvbUhhbmRsZXIuY2FsbGJhY2suY2FsbChjdXN0b21IYW5kbGVyLnNjb3BlLCBpdGVtLCB0aGlzKTsKCgkJCS8vIFRoZSBwbHVnaW4gd2lsbCBoYW5kbGUgdGhlIGxvYWQsIG9yIGhhcyBjYW5jZWxlZCBpdC4gSWdub3JlIGl0LgoJCQlpZiAocmVzdWx0ID09PSBmYWxzZSkgewoJCQkJcmV0dXJuIG51bGw7CgoJCQkJLy8gTG9hZCBhcyBub3JtYWw6CgkJCX0gZWxzZSBpZiAocmVzdWx0ID09PSB0cnVlKSB7CgkJCQkvLyBEbyBOb3RoaW5nCgoJCQkvLyBSZXN1bHQgaXMgYSBsb2FkZXIgY2xhc3M6CgkJCX0gZWxzZSBpZiAocmVzdWx0ICE9IG51bGwpIHsKCQkJCWl0ZW0uX2xvYWRlciA9IHJlc3VsdDsKCQkJfQoKCQkJLy8gVXBkYXRlIHRoZSBleHRlbnNpb24gaW4gY2FzZSB0aGUgdHlwZSBjaGFuZ2VkOgoJCQltYXRjaCA9IGNyZWF0ZWpzLlJlcXVlc3RVdGlscy5wYXJzZVVSSShpdGVtLnNyYyk7CgkJCWlmIChtYXRjaC5leHRlbnNpb24gIT0gbnVsbCkgewoJCQkJaXRlbS5leHQgPSBtYXRjaC5leHRlbnNpb247CgkJCX0KCQl9CgoJCS8vIFN0b3JlIHRoZSBpdGVtIGZvciBsb29rdXAuIFRoaXMgYWxzbyBoZWxwcyBjbGVhbi11cCBsYXRlci4KCQl0aGlzLl9sb2FkSXRlbXNCeUlkW2l0ZW0uaWRdID0gaXRlbTsKCQl0aGlzLl9sb2FkSXRlbXNCeVNyY1tpdGVtLnNyY10gPSBpdGVtOwoKCQlpZiAoaXRlbS5sb2FkVGltZW91dCA9PSBudWxsKSB7CgkJCWl0ZW0ubG9hZFRpbWVvdXQgPSBzLmxvYWRUaW1lb3V0OwoJCX0KCgkJaWYgKGl0ZW0uY3Jvc3NPcmlnaW4gPT0gbnVsbCkgewoJCQlpdGVtLmNyb3NzT3JpZ2luID0gdGhpcy5fY3Jvc3NPcmlnaW47CgkJfQoKCQlyZXR1cm4gaXRlbTsKCX07CgoJLyoqCgkgKiBDcmVhdGUgYSBsb2FkZXIgZm9yIGEgbG9hZCBpdGVtLgoJICogQG1ldGhvZCBfY3JlYXRlTG9hZGVyCgkgKiBAcGFyYW0ge09iamVjdH0gaXRlbSBBIGZvcm1hdHRlZCBsb2FkIGl0ZW0gdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIGxvYWRlci4KCSAqIEByZXR1cm4ge0Fic3RyYWN0TG9hZGVyfSBBIGxvYWRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvYWQgY29udGVudC4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2NyZWF0ZUxvYWRlciA9IGZ1bmN0aW9uIChpdGVtKSB7CgkJaWYgKGl0ZW0uX2xvYWRlciAhPSBudWxsKSB7IC8vIEEgcGx1Z2luIGFscmVhZHkgc3BlY2lmaWVkIGEgbG9hZGVyCgkJCXJldHVybiBpdGVtLl9sb2FkZXI7CgkJfQoKCQkvLyBJbml0aWFsbHksIHRyeSBhbmQgdXNlIHRoZSBwcm92aWRlZC9zdXBwb3J0ZWQgWEhSIG1vZGU6CgkJdmFyIHByZWZlclhIUiA9IHRoaXMucHJlZmVyWEhSOwoKCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2F2YWlsYWJsZUxvYWRlcnMubGVuZ3RoOyBpKyspIHsKCQkJdmFyIGxvYWRlciA9IHRoaXMuX2F2YWlsYWJsZUxvYWRlcnNbaV07CgkJCWlmIChsb2FkZXIgJiYgbG9hZGVyLmNhbkxvYWRJdGVtKGl0ZW0pKSB7CgkJCQlyZXR1cm4gbmV3IGxvYWRlcihpdGVtLCBwcmVmZXJYSFIpOwoJCQl9CgkJfQoKCQkvLyBUT0RPOiBMb2cgZXJyb3IgKHJlcXVpcmVzIGNyZWF0ZWpzLmxvZykKCQlyZXR1cm4gbnVsbDsKCX07CgoJLyoqCgkgKiBMb2FkIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXMgZW1wdHkgKGFsbCBpdGVtcyBoYXZlIGJlZW4gbG9hZGVkKSwgdGhlbiB0aGUgY29tcGxldGUgZXZlbnQKCSAqIGlzIHByb2Nlc3NlZC4gVGhlIHF1ZXVlIHdpbGwgImZpbGwgdXAiIGFueSBlbXB0eSBzbG90cywgdXAgdG8gdGhlIG1heCBjb25uZWN0aW9uIHNwZWNpZmllZCB1c2luZwoJICoge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUuc2V0TWF4Q29ubmVjdGlvbnMifX17ey9jcm9zc0xpbmt9fSBtZXRob2QuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBzY3JpcHRzIHRoYXQgYXJlIGxvYWRlZAoJICogdXNpbmcgdGFncywgd2hpY2ggaGF2ZSB0byBiZSBsb2FkZWQgb25lIGF0IGEgdGltZSB0byBtYWludGFpbiBsb2FkIG9yZGVyLgoJICogQG1ldGhvZCBfbG9hZE5leHQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2xvYWROZXh0ID0gZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9wYXVzZWQpIHsgcmV0dXJuOyB9CgoJCS8vIE9ubHkgZGlzcGF0Y2ggbG9hZHN0YXJ0IGV2ZW50IHdoZW4gdGhlIGZpcnN0IGZpbGUgaXMgbG9hZGVkLgoJCWlmICghdGhpcy5fbG9hZFN0YXJ0V2FzRGlzcGF0Y2hlZCkgewoJCQl0aGlzLl9zZW5kTG9hZFN0YXJ0KCk7CgkJCXRoaXMuX2xvYWRTdGFydFdhc0Rpc3BhdGNoZWQgPSB0cnVlOwoJCX0KCgkJLy8gVGhlIHF1ZXVlIGhhcyBjb21wbGV0ZWQuCgkJaWYgKHRoaXMuX251bUl0ZW1zID09IHRoaXMuX251bUl0ZW1zTG9hZGVkKSB7CgkJCXRoaXMubG9hZGVkID0gdHJ1ZTsKCQkJdGhpcy5fc2VuZENvbXBsZXRlKCk7CgoJCQkvLyBMb2FkIHRoZSBuZXh0IHF1ZXVlLCBpZiBpdCBoYXMgYmVlbiBkZWZpbmVkLgoJCQlpZiAodGhpcy5uZXh0ICYmIHRoaXMubmV4dC5sb2FkKSB7CgkJCQl0aGlzLm5leHQubG9hZCgpOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhpcy5sb2FkZWQgPSBmYWxzZTsKCQl9CgoJCS8vIE11c3QgaXRlcmF0ZSBmb3J3YXJkcyB0byBsb2FkIGluIHRoZSByaWdodCBvcmRlci4KCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2xvYWRRdWV1ZS5sZW5ndGg7IGkrKykgewoJCQlpZiAodGhpcy5fY3VycmVudExvYWRzLmxlbmd0aCA+PSB0aGlzLl9tYXhDb25uZWN0aW9ucykgeyBicmVhazsgfQoJCQl2YXIgbG9hZGVyID0gdGhpcy5fbG9hZFF1ZXVlW2ldOwoKCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBiZSBvbmx5IGxvYWRpbmcgb25lIHRhZy1zY3JpcHQgYXQgYSB0aW1lOgoJCQkvLyBOb3RlOiBtYWludGFpbk9yZGVyIGl0ZW1zIGRvbid0IGRvIGFueXRoaW5nIGhlcmUgYmVjYXVzZSB3ZSBjYW4gaG9sZCBvbnRvIHRoZWlyIGxvYWRlZCB2YWx1ZQoJCQlpZiAoIXRoaXMuX2NhblN0YXJ0TG9hZChsb2FkZXIpKSB7IGNvbnRpbnVlOyB9CgkJCXRoaXMuX2xvYWRRdWV1ZS5zcGxpY2UoaSwgMSk7CgkJCWktLTsKCQkJdGhpcy5fbG9hZEl0ZW0obG9hZGVyKTsKCQl9Cgl9OwoKCS8qKgoJICogQmVnaW4gbG9hZGluZyBhbiBpdGVtLiBFdmVudCBsaXN0ZW5lcnMgYXJlIG5vdCBhZGRlZCB0byB0aGUgbG9hZGVycyB1bnRpbCB0aGUgbG9hZCBzdGFydHMuCgkgKiBAbWV0aG9kIF9sb2FkSXRlbQoJICogQHBhcmFtIHtBYnN0cmFjdExvYWRlcn0gbG9hZGVyIFRoZSBsb2FkZXIgaW5zdGFuY2UgdG8gc3RhcnQuIEN1cnJlbnRseSwgdGhpcyB3aWxsIGJlIGFuIFhIUkxvYWRlciBvciBUYWdMb2FkZXIuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9sb2FkSXRlbSA9IGZ1bmN0aW9uIChsb2FkZXIpIHsKCQlsb2FkZXIub24oImZpbGVsb2FkIiwgdGhpcy5faGFuZGxlRmlsZUxvYWQsIHRoaXMpOwoJCWxvYWRlci5vbigicHJvZ3Jlc3MiLCB0aGlzLl9oYW5kbGVQcm9ncmVzcywgdGhpcyk7CgkJbG9hZGVyLm9uKCJjb21wbGV0ZSIsIHRoaXMuX2hhbmRsZUZpbGVDb21wbGV0ZSwgdGhpcyk7CgkJbG9hZGVyLm9uKCJlcnJvciIsIHRoaXMuX2hhbmRsZUVycm9yLCB0aGlzKTsKCQlsb2FkZXIub24oImZpbGVlcnJvciIsIHRoaXMuX2hhbmRsZUZpbGVFcnJvciwgdGhpcyk7CgkJdGhpcy5fY3VycmVudExvYWRzLnB1c2gobG9hZGVyKTsKCQl0aGlzLl9zZW5kRmlsZVN0YXJ0KGxvYWRlci5nZXRJdGVtKCkpOwoJCWxvYWRlci5sb2FkKCk7Cgl9OwoKCS8qKgoJICogVGhlIGNhbGxiYWNrIHRoYXQgaXMgZmlyZWQgd2hlbiBhIGxvYWRlciBsb2FkcyBhIGZpbGUuIFRoaXMgZW5hYmxlcyBsb2FkZXJzIGxpa2Uge3sjY3Jvc3NMaW5rICJNYW5pZmVzdExvYWRlciJ9fXt7L2Nyb3NzTGlua319CgkgKiB0byBtYWludGFpbiBpbnRlcm5hbCBxdWV1ZXMsIGJ1dCBmb3IgdGhpcyBxdWV1ZSB0byBkaXNwYXRjaCB0aGUge3sjY3Jvc3NMaW5rICJmaWxlbG9hZDpldmVudCJ9fXt7L2Nyb3NzTGlua319CgkgKiBldmVudHMuCgkgKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9maWxlbG9hZDpldmVudCJ9fXt7L2Nyb3NzTGlua319IGV2ZW50IGZyb20gdGhlIGxvYWRlci4KCSAqIEBwcml2YXRlCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcC5faGFuZGxlRmlsZUxvYWQgPSBmdW5jdGlvbihldmVudCkgewoJCWV2ZW50LnRhcmdldCA9IG51bGw7CgkJdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKCX07CgoJLyoqCgkgKiBUaGUgY2FsbGJhY2sgdGhhdCBpcyBmaXJlZCB3aGVuIGEgbG9hZGVyIGVuY291bnRlcnMgYW4gZXJyb3IgZnJvbSBhbiBpbnRlcm5hbCBmaWxlIGxvYWQgb3BlcmF0aW9uLiBUaGlzIGVuYWJsZXMKCSAqIGxvYWRlcnMgbGlrZSBNCgkgKiBAcGFyYW0gZXZlbnQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZUZpbGVFcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIG5ld0V2ZW50ID0gbmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIkZJTEVfTE9BRF9FUlJPUiIsIG51bGwsIGV2ZW50Lml0ZW0pOwoJCXRoaXMuX3NlbmRFcnJvcihuZXdFdmVudCk7Cgl9OwoKCS8qKgoJICogVGhlIGNhbGxiYWNrIHRoYXQgaXMgZmlyZWQgd2hlbiBhIGxvYWRlciBlbmNvdW50ZXJzIGFuIGVycm9yLiBUaGUgcXVldWUgd2lsbCBjb250aW51ZSBsb2FkaW5nIHVubGVzcyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9zdG9wT25FcnJvcjpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319CgkgKiBpcyBzZXQgdG8gYHRydWVgLgoJICogQG1ldGhvZCBfaGFuZGxlRXJyb3IKCSAqIEBwYXJhbSB7RXJyb3JFdmVudH0gZXZlbnQgVGhlIGVycm9yIGV2ZW50LCBjb250YWluaW5nIHJlbGV2YW50IGVycm9yIGluZm9ybWF0aW9uLgoJICogQHByaXZhdGUKCSAqLwoJcC5faGFuZGxlRXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl2YXIgbG9hZGVyID0gZXZlbnQudGFyZ2V0OwoJCXRoaXMuX251bUl0ZW1zTG9hZGVkKys7CgoJCXRoaXMuX2ZpbmlzaE9yZGVyZWRJdGVtKGxvYWRlciwgdHJ1ZSk7CgkJdGhpcy5fdXBkYXRlUHJvZ3Jlc3MoKTsKCgkJdmFyIG5ld0V2ZW50ID0gbmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIkZJTEVfTE9BRF9FUlJPUiIsIG51bGwsIGxvYWRlci5nZXRJdGVtKCkpOwoJCS8vIFRPRE86IFByb3BhZ2F0ZSBhY3R1YWwgZXJyb3IgbWVzc2FnZS4KCgkJdGhpcy5fc2VuZEVycm9yKG5ld0V2ZW50KTsKCgkJaWYgKCF0aGlzLnN0b3BPbkVycm9yKSB7CgkJCXRoaXMuX3JlbW92ZUxvYWRJdGVtKGxvYWRlcik7CgkJCXRoaXMuX2xvYWROZXh0KCk7CgkJfQoJfTsKCgkvKioKCSAqIEFuIGl0ZW0gaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyB0b3RhbGx5IGxvYWRlZCwgaGFzIGJlZW4gcGFyc2VkIGZvciBpbW1lZGlhdGUgdXNlLCBhbmQKCSAqIGlzIGF2YWlsYWJsZSBhcyB0aGUgInJlc3VsdCIgcHJvcGVydHkgb24gdGhlIGxvYWQgaXRlbS4gVGhlIHJhdyB0ZXh0IHJlc3VsdCBmb3IgYSBwYXJzZWQgaXRlbSAoc3VjaCBhcyBKU09OLCBYTUwsCgkgKiBDU1MsIEphdmFTY3JpcHQsIGV0YykgaXMgYXZhaWxhYmxlIGFzIHRoZSAicmF3UmVzdWx0IiBwcm9wZXJ0eSwgYW5kIGNhbiBhbHNvIGJlIGxvb2tlZCB1cCB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9nZXRSZXN1bHQifX17ey9jcm9zc0xpbmt9fS4KCSAqIEBtZXRob2QgX2hhbmRsZUZpbGVDb21wbGV0ZQoJICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IG9iamVjdCBmcm9tIHRoZSBsb2FkZXIuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9oYW5kbGVGaWxlQ29tcGxldGUgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl2YXIgbG9hZGVyID0gZXZlbnQudGFyZ2V0OwoJCXZhciBpdGVtID0gbG9hZGVyLmdldEl0ZW0oKTsKCgkJdmFyIHJlc3VsdCA9IGxvYWRlci5nZXRSZXN1bHQoKTsKCQl0aGlzLl9sb2FkZWRSZXN1bHRzW2l0ZW0uaWRdID0gcmVzdWx0OwoJCXZhciByYXdSZXN1bHQgPSBsb2FkZXIuZ2V0UmVzdWx0KHRydWUpOwoJCWlmIChyYXdSZXN1bHQgIT0gbnVsbCAmJiByYXdSZXN1bHQgIT09IHJlc3VsdCkgewoJCQl0aGlzLl9sb2FkZWRSYXdSZXN1bHRzW2l0ZW0uaWRdID0gcmF3UmVzdWx0OwoJCX0KCgkJdGhpcy5fc2F2ZUxvYWRlZEl0ZW1zKGxvYWRlcik7CgoJCS8vIENsZWFuIHVwIHRoZSBsb2FkIGl0ZW0KCQl0aGlzLl9yZW1vdmVMb2FkSXRlbShsb2FkZXIpOwoKCQlpZiAoIXRoaXMuX2ZpbmlzaE9yZGVyZWRJdGVtKGxvYWRlcikpIHsKCQkJLy8gVGhlIGl0ZW0gd2FzIE5PVCBtYW5hZ2VkLCBzbyBwcm9jZXNzIGl0IG5vdwoJCQl0aGlzLl9wcm9jZXNzRmluaXNoZWRMb2FkKGl0ZW0sIGxvYWRlcik7CgkJfQoJfTsKCgkvKioKCSAqIFNvbWUgbG9hZGVycyBtaWdodCBsb2FkIGFkZGl0aW9uYWwgY29udGVudCwgb3RoZXIgdGhhbiB0aGUgaXRlbSB0aGV5IHdlcmUgcGFzc2VkIChzdWNoIGFzIHt7I2Nyb3NzTGluayAiTWFuaWZlc3RMb2FkZXIifX17ey9jcm9zc0xpbmt9fSkuCgkgKiBBbnkgaXRlbXMgZXhwb3NlZCBieSB0aGUgbG9hZGVyIHVzaW5nIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvZ2V0TG9hZEl0ZW1zIn19e3svY3Jvc3NMaW5rfX0gYXJlIGFkZGVkIHRvIHRoZQoJICogTG9hZFF1ZXVlJ3MgbG9vay11cHMsIGluY2x1ZGluZyB7eyNjcm9zc0xpbmsgImdldEl0ZW0ifX17ey9jcm9zc0xpbmt9fSBhbmQge3sjY3Jvc3NMaW5rICJnZXRSZXN1bHQifX17ey9jcm9zc0xpbmt9fQoJICogbWV0aG9kcy4KCSAqIEBtZXRob2QgX3NhdmVMb2FkZWRJdGVtcwoJICogQHBhcmFtIHtBYnN0cmFjdExvYWRlcn0gbG9hZGVyCgkgKiBAcHJvdGVjdGVkCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcC5fc2F2ZUxvYWRlZEl0ZW1zID0gZnVuY3Rpb24obG9hZGVyKSB7CgkJLy8gVE9ETzogTm90IHN1cmUgaG93IHRvIGhhbmRsZSB0aGlzLiBXb3VsZCBiZSBuaWNlIHRvIGV4cG9zZSB0aGUgaXRlbXMuCgkJLy8gTG9hZGVycyBtYXkgbG9hZCBzdWItaXRlbXMuIFRoaXMgYWRkcyB0aGVtIHRvIHRoaXMgcXVldWUKCQl2YXIgbGlzdCA9IGxvYWRlci5nZXRMb2FkZWRJdGVtcygpOwoJCWlmIChsaXN0ID09PSBudWxsKSB7IHJldHVybjsgfQoKCQlmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKCQkJdmFyIGl0ZW0gPSBsaXN0W2ldLml0ZW07CgoJCQkvLyBTdG9yZSBpdGVtIGxvb2t1cHMKCQkJdGhpcy5fbG9hZEl0ZW1zQnlTcmNbaXRlbS5zcmNdID0gaXRlbTsKCQkJdGhpcy5fbG9hZEl0ZW1zQnlJZFtpdGVtLmlkXSA9IGl0ZW07CgoJCQkvLyBTdG9yZSBsb2FkZWQgY29udGVudAoJCQl0aGlzLl9sb2FkZWRSZXN1bHRzW2l0ZW0uaWRdID0gbGlzdFtpXS5yZXN1bHQ7CgkJCXRoaXMuX2xvYWRlZFJhd1Jlc3VsdHNbaXRlbS5pZF0gPSBsaXN0W2ldLnJhd1Jlc3VsdDsKCQl9Cgl9OwoKCS8qKgoJICogRmxhZyBhbiBpdGVtIGFzIGZpbmlzaGVkLiBJZiB0aGUgaXRlbSdzIG9yZGVyIGlzIGJlaW5nIG1hbmFnZWQsIHRoZW4gZW5zdXJlIHRoYXQgaXQgaXMgYWxsb3dlZCB0byBmaW5pc2gsIGFuZCBpZgoJICogc28sIHRyaWdnZXIgcHJpb3IgaXRlbXMgdG8gdHJpZ2dlciBhcyB3ZWxsLgoJICogQG1ldGhvZCBfZmluaXNoT3JkZXJlZEl0ZW0KCSAqIEBwYXJhbSB7QWJzdHJhY3RMb2FkZXJ9IGxvYWRlcgoJICogQHBhcmFtIHtCb29sZWFufSBsb2FkRmFpbGVkCgkgKiBAcmV0dXJuIHtCb29sZWFufSBJZiB0aGUgaXRlbSdzIG9yZGVyIGlzIGJlaW5nIG1hbmFnZWQuIFRoaXMgYWxsb3dzIHRoZSBjYWxsZXIgdG8gdGFrZSBhbiBhbHRlcm5hdGUKCSAqIGJlaGF2aW91ciBpZiBpdCBpcy4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2ZpbmlzaE9yZGVyZWRJdGVtID0gZnVuY3Rpb24gKGxvYWRlciwgbG9hZEZhaWxlZCkgewoJCXZhciBpdGVtID0gbG9hZGVyLmdldEl0ZW0oKTsKCgkJaWYgKCh0aGlzLm1haW50YWluU2NyaXB0T3JkZXIgJiYgaXRlbS50eXBlID09IGNyZWF0ZWpzLkxvYWRRdWV1ZS5KQVZBU0NSSVBUKQoJCQl8fCBpdGVtLm1haW50YWluT3JkZXIpIHsKCgkJCS8vVE9ETzogRXZhbHVhdGUgcmVtb3ZhbCBvZiB0aGUgX2N1cnJlbnRseUxvYWRpbmdTY3JpcHQKCQkJaWYgKGxvYWRlciBpbnN0YW5jZW9mIGNyZWF0ZWpzLkphdmFTY3JpcHRMb2FkZXIpIHsKCQkJCXRoaXMuX2N1cnJlbnRseUxvYWRpbmdTY3JpcHQgPSBmYWxzZTsKCQkJfQoKCQkJdmFyIGluZGV4ID0gY3JlYXRlanMuaW5kZXhPZih0aGlzLl9zY3JpcHRPcmRlciwgaXRlbSk7CgkJCWlmIChpbmRleCA9PSAtMSkgeyByZXR1cm4gZmFsc2U7IH0gLy8gVGhpcyBsb2FkZXIgbm8gbG9uZ2VyIGV4aXN0cwoJCQl0aGlzLl9sb2FkZWRTY3JpcHRzW2luZGV4XSA9IChsb2FkRmFpbGVkID09PSB0cnVlKSA/IHRydWUgOiBpdGVtOwoKCQkJdGhpcy5fY2hlY2tTY3JpcHRMb2FkT3JkZXIoKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9OwoKCS8qKgoJICogRW5zdXJlIHRoZSBzY3JpcHRzIGxvYWQgYW5kIGRpc3BhdGNoIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBXaGVuIHVzaW5nIFhIUiwgc2NyaXB0cyBhcmUgc3RvcmVkIGluIGFuIGFycmF5IGluIHRoZQoJICogb3JkZXIgdGhleSB3ZXJlIGFkZGVkLCBidXQgd2l0aCBhICJudWxsIiB2YWx1ZS4gV2hlbiB0aGV5IGFyZSBjb21wbGV0ZWQsIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIGxvYWQgaXRlbSwKCSAqIGFuZCB0aGVuIHdoZW4gdGhleSBhcmUgcHJvY2Vzc2VkIGFuZCBkaXNwYXRjaGVkLCB0aGUgdmFsdWUgaXMgc2V0IHRvIGB0cnVlYC4gVGhpcyBtZXRob2Qgc2ltcGx5CgkgKiBpdGVyYXRlcyB0aGUgYXJyYXksIGFuZCBlbnN1cmVzIHRoYXQgYW55IGxvYWRlZCBpdGVtcyB0aGF0IGFyZSBub3QgcHJlY2VkZWQgYnkgYSBgbnVsbGAgdmFsdWUgYXJlCgkgKiBkaXNwYXRjaGVkLgoJICogQG1ldGhvZCBfY2hlY2tTY3JpcHRMb2FkT3JkZXIKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2NoZWNrU2NyaXB0TG9hZE9yZGVyID0gZnVuY3Rpb24gKCkgewoJCXZhciBsID0gdGhpcy5fbG9hZGVkU2NyaXB0cy5sZW5ndGg7CgoJCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CgkJCXZhciBpdGVtID0gdGhpcy5fbG9hZGVkU2NyaXB0c1tpXTsKCQkJaWYgKGl0ZW0gPT09IG51bGwpIHsgYnJlYWs7IH0gLy8gVGhpcyBpcyBzdGlsbCBsb2FkaW5nLiBEbyBub3QgcHJvY2VzcyBmdXJ0aGVyLgoJCQlpZiAoaXRlbSA9PT0gdHJ1ZSkgeyBjb250aW51ZTsgfSAvLyBUaGlzIGhhcyBjb21wbGV0ZWQsIGFuZCBiZWVuIHByb2Nlc3NlZC4gTW92ZSBvbi4KCgkJCXZhciBsb2FkSXRlbSA9IHRoaXMuX2xvYWRlZFJlc3VsdHNbaXRlbS5pZF07CgkJCWlmIChpdGVtLnR5cGUgPT0gY3JlYXRlanMuTG9hZFF1ZXVlLkpBVkFTQ1JJUFQpIHsKCQkJCS8vIEFwcGVuZCBzY3JpcHQgdGFncyB0byB0aGUgaGVhZCBhdXRvbWF0aWNhbGx5LiBUYWdzIGRvIHRoaXMgaW4gdGhlIGxvYWRlciwgYnV0IFhIUiBzY3JpcHRzIGhhdmUgdG8gbWFpbnRhaW4gb3JkZXIuCgkJCQkoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdKS5hcHBlbmRDaGlsZChsb2FkSXRlbSk7CgkJCX0KCgkJCXZhciBsb2FkZXIgPSBpdGVtLl9sb2FkZXI7CgkJCXRoaXMuX3Byb2Nlc3NGaW5pc2hlZExvYWQoaXRlbSwgbG9hZGVyKTsKCQkJdGhpcy5fbG9hZGVkU2NyaXB0c1tpXSA9IHRydWU7CgkJfQoJfTsKCgkvKioKCSAqIEEgZmlsZSBoYXMgY29tcGxldGVkIGxvYWRpbmcsIGFuZCB0aGUgTG9hZFF1ZXVlIGNhbiBtb3ZlIG9uLiBUaGlzIHRyaWdnZXJzIHRoZSBjb21wbGV0ZSBldmVudCwgYW5kIGtpY2stc3RhcnRzCgkgKiB0aGUgbmV4dCBpdGVtLgoJICogQG1ldGhvZCBfcHJvY2Vzc0ZpbmlzaGVkTG9hZAoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGl0ZW0KCSAqIEBwYXJhbSB7QWJzdHJhY3RMb2FkZXJ9IGxvYWRlcgoJICogQHByb3RlY3RlZAoJICovCglwLl9wcm9jZXNzRmluaXNoZWRMb2FkID0gZnVuY3Rpb24gKGl0ZW0sIGxvYWRlcikgewoJCXRoaXMuX251bUl0ZW1zTG9hZGVkKys7CgkJdGhpcy5fdXBkYXRlUHJvZ3Jlc3MoKTsKCQl0aGlzLl9zZW5kRmlsZUNvbXBsZXRlKGl0ZW0sIGxvYWRlcik7CgkJdGhpcy5fbG9hZE5leHQoKTsKCX07CgoJLyoqCgkgKiBFbnN1cmUgaXRlbXMgd2l0aCBgbWFpbnRhaW5PcmRlcj10cnVlYCB0aGF0IGFyZSBiZWZvcmUgdGhlIHNwZWNpZmllZCBpdGVtIGhhdmUgbG9hZGVkLiBUaGlzIG9ubHkgYXBwbGllcyB0bwoJICogSmF2YVNjcmlwdCBpdGVtcyB0aGF0IGFyZSBiZWluZyBsb2FkZWQgd2l0aCBhIFRhZ0xvYWRlciwgc2luY2UgdGhleSBoYXZlIHRvIGJlIGxvYWRlZCBhbmQgY29tcGxldGVkIDxzdHJvbmc+YmVmb3JlPC9zdHJvbmc+CgkgKiB0aGUgc2NyaXB0IGNhbiBldmVuIGJlIHN0YXJ0ZWQsIHNpbmNlIGl0IGV4aXN0IGluIHRoZSBET00gd2hpbGUgbG9hZGluZy4KCSAqIEBtZXRob2QgX2NhblN0YXJ0TG9hZAoJICogQHBhcmFtIHtBYnN0cmFjdExvYWRlcn0gbG9hZGVyIFRoZSBsb2FkZXIgZm9yIHRoZSBpdGVtCgkgKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGNhbiBzdGFydCBhIGxvYWQgb3Igbm90LgoJICogQHByaXZhdGUKCSAqLwoJcC5fY2FuU3RhcnRMb2FkID0gZnVuY3Rpb24gKGxvYWRlcikgewoJCWlmICghdGhpcy5tYWludGFpblNjcmlwdE9yZGVyIHx8IGxvYWRlci5wcmVmZXJYSFIpIHsgcmV0dXJuIHRydWU7IH0KCQl2YXIgaXRlbSA9IGxvYWRlci5nZXRJdGVtKCk7CgkJaWYgKGl0ZW0udHlwZSAhPSBjcmVhdGVqcy5Mb2FkUXVldWUuSkFWQVNDUklQVCkgeyByZXR1cm4gdHJ1ZTsgfQoJCWlmICh0aGlzLl9jdXJyZW50bHlMb2FkaW5nU2NyaXB0KSB7IHJldHVybiBmYWxzZTsgfQoKCQl2YXIgaW5kZXggPSB0aGlzLl9zY3JpcHRPcmRlci5pbmRleE9mKGl0ZW0pOwoJCXZhciBpID0gMDsKCQl3aGlsZSAoaSA8IGluZGV4KSB7CgkJCXZhciBjaGVja0l0ZW0gPSB0aGlzLl9sb2FkZWRTY3JpcHRzW2ldOwoJCQlpZiAoY2hlY2tJdGVtID09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9CgkJCWkrKzsKCQl9CgkJdGhpcy5fY3VycmVudGx5TG9hZGluZ1NjcmlwdCA9IHRydWU7CgkJcmV0dXJuIHRydWU7Cgl9OwoKCS8qKgoJICogQSBsb2FkIGl0ZW0gaXMgY29tcGxldGVkIG9yIHdhcyBjYW5jZWxlZCwgYW5kIG5lZWRzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgTG9hZFF1ZXVlLgoJICogQG1ldGhvZCBfcmVtb3ZlTG9hZEl0ZW0KCSAqIEBwYXJhbSB7QWJzdHJhY3RMb2FkZXJ9IGxvYWRlciBBIGxvYWRlciBpbnN0YW5jZSB0byByZW1vdmUuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9yZW1vdmVMb2FkSXRlbSA9IGZ1bmN0aW9uIChsb2FkZXIpIHsKCQl2YXIgaXRlbSA9IGxvYWRlci5nZXRJdGVtKCk7CgkJZGVsZXRlIGl0ZW0uX2xvYWRlcjsKCgkJdmFyIGwgPSB0aGlzLl9jdXJyZW50TG9hZHMubGVuZ3RoOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CgkJCWlmICh0aGlzLl9jdXJyZW50TG9hZHNbaV0gPT0gbG9hZGVyKSB7CgkJCQl0aGlzLl9jdXJyZW50TG9hZHMuc3BsaWNlKGksIDEpOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9OwoKCS8qKgoJICogQW4gaXRlbSBoYXMgZGlzcGF0Y2hlZCBwcm9ncmVzcy4gUHJvcGFnYXRlIHRoYXQgcHJvZ3Jlc3MsIGFuZCB1cGRhdGUgdGhlIExvYWRRdWV1ZSdzIG92ZXJhbGwgcHJvZ3Jlc3MuCgkgKiBAbWV0aG9kIF9oYW5kbGVQcm9ncmVzcwoJICogQHBhcmFtIHtQcm9ncmVzc0V2ZW50fSBldmVudCBUaGUgcHJvZ3Jlc3MgZXZlbnQgZnJvbSB0aGUgaXRlbS4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZVByb2dyZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJdmFyIGxvYWRlciA9IGV2ZW50LnRhcmdldDsKCQl0aGlzLl9zZW5kRmlsZVByb2dyZXNzKGxvYWRlci5nZXRJdGVtKCksIGxvYWRlci5wcm9ncmVzcyk7CgkJdGhpcy5fdXBkYXRlUHJvZ3Jlc3MoKTsKCX07CgoJLyoqCgkgKiBPdmVyYWxsIHByb2dyZXNzIGhhcyBjaGFuZ2VkLCBzbyBkZXRlcm1pbmUgdGhlIG5ldyBwcm9ncmVzcyBhbW91bnQgYW5kIGRpc3BhdGNoIGl0LiBUaGlzIGNoYW5nZXMgYW55IHRpbWUgYW4KCSAqIGl0ZW0gZGlzcGF0Y2hlcyBwcm9ncmVzcyBvciBjb21wbGV0ZXMuIE5vdGUgdGhhdCBzaW5jZSB3ZSBkb24ndCBhbHdheXMga25vdyB0aGUgYWN0dWFsIGZpbGVzaXplIG9mIGl0ZW1zIGJlZm9yZQoJICogdGhleSBhcmUgbG9hZGVkLiBJbiB0aGlzIGNhc2UsIHdlIGRlZmluZSBhICJzbG90IiBmb3IgZWFjaCBpdGVtICgxIGl0ZW0gaW4gMTAgd291bGQgZ2V0IDEwJSksIGFuZCB0aGVuIGFwcGVuZAoJICogbG9hZGVkIHByb2dyZXNzIG9uIHRvcCBvZiB0aGUgYWxyZWFkeS1sb2FkZWQgaXRlbXMuCgkgKgoJICogRm9yIGV4YW1wbGUsIGlmIDUvMTAgaXRlbXMgaGF2ZSBsb2FkZWQsIGFuZCBpdGVtIDYgaXMgMjAlIGxvYWRlZCwgdGhlIHRvdGFsIHByb2dyZXNzIHdvdWxkIGJlOgoJICogPHVsPgoJICogICAgICA8bGk+NS8xMCBvZiB0aGUgaXRlbXMgaW4gdGhlIHF1ZXVlICg1MCUpPC9saT4KCSAqICAgICAgPGxpPnBsdXMgMjAlIG9mIGl0ZW0gNidzIHNsb3QgKDIlKTwvbGk+CgkgKiAgICAgIDxsaT5lcXVhbHMgNTIlPC9saT4KCSAqIDwvdWw+CgkgKiBAbWV0aG9kIF91cGRhdGVQcm9ncmVzcwoJICogQHByaXZhdGUKCSAqLwoJcC5fdXBkYXRlUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7CgkJdmFyIGxvYWRlZCA9IHRoaXMuX251bUl0ZW1zTG9hZGVkIC8gdGhpcy5fbnVtSXRlbXM7IC8vIEZ1bGx5IExvYWRlZCBQcm9ncmVzcwoJCXZhciByZW1haW5pbmcgPSB0aGlzLl9udW1JdGVtcyAtIHRoaXMuX251bUl0ZW1zTG9hZGVkOwoJCWlmIChyZW1haW5pbmcgPiAwKSB7CgkJCXZhciBjaHVuayA9IDA7CgkJCWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5fY3VycmVudExvYWRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJCQkJY2h1bmsgKz0gdGhpcy5fY3VycmVudExvYWRzW2ldLnByb2dyZXNzOwoJCQl9CgkJCWxvYWRlZCArPSAoY2h1bmsgLyByZW1haW5pbmcpICogKHJlbWFpbmluZyAvIHRoaXMuX251bUl0ZW1zKTsKCQl9CgoJCWlmICh0aGlzLl9sYXN0UHJvZ3Jlc3MgIT0gbG9hZGVkKSB7CgkJCXRoaXMuX3NlbmRQcm9ncmVzcyhsb2FkZWQpOwoJCQl0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBsb2FkZWQ7CgkJfQoJfTsKCgkvKioKCSAqIENsZWFuIG91dCBpdGVtIHJlc3VsdHMsIHRvIGZyZWUgdGhlbSBmcm9tIG1lbW9yeS4gTWFpbmx5LCB0aGUgbG9hZGVkIGl0ZW0gYW5kIHJlc3VsdHMgYXJlIGNsZWFyZWQgZnJvbSBpbnRlcm5hbAoJICogaGFzaGVzLgoJICogQG1ldGhvZCBfZGlzcG9zZUl0ZW0KCSAqIEBwYXJhbSB7TG9hZEl0ZW18T2JqZWN0fSBpdGVtIFRoZSBpdGVtIHRoYXQgd2FzIHBhc3NlZCBpbiBmb3IgcHJlbG9hZGluZy4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2Rpc3Bvc2VJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHsKCQlkZWxldGUgdGhpcy5fbG9hZGVkUmVzdWx0c1tpdGVtLmlkXTsKCQlkZWxldGUgdGhpcy5fbG9hZGVkUmF3UmVzdWx0c1tpdGVtLmlkXTsKCQlkZWxldGUgdGhpcy5fbG9hZEl0ZW1zQnlJZFtpdGVtLmlkXTsKCQlkZWxldGUgdGhpcy5fbG9hZEl0ZW1zQnlTcmNbaXRlbS5zcmNdOwoJfTsKCgkvKioKCSAqIERpc3BhdGNoIGEgImZpbGVwcm9ncmVzcyIge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319LiBQbGVhc2Ugc2VlIHRoZSBMb2FkUXVldWUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvZmlsZXByb2dyZXNzOmV2ZW50In19e3svY3Jvc3NMaW5rfX0KCSAqIGV2ZW50IGZvciBkZXRhaWxzIG9uIHRoZSBldmVudCBwYXlsb2FkLgoJICogQG1ldGhvZCBfc2VuZEZpbGVQcm9ncmVzcwoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGl0ZW0gVGhlIGl0ZW0gdGhhdCBpcyBiZWluZyBsb2FkZWQuCgkgKiBAcGFyYW0ge051bWJlcn0gcHJvZ3Jlc3MgVGhlIGFtb3VudCB0aGUgaXRlbSBoYXMgYmVlbiBsb2FkZWQgKGJldHdlZW4gMCBhbmQgMSkuCgkgKiBAcHJvdGVjdGVkCgkgKi8KCXAuX3NlbmRGaWxlUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoaXRlbSwgcHJvZ3Jlc3MpIHsKCQlpZiAodGhpcy5faXNDYW5jZWxlZCgpKSB7CgkJCXRoaXMuX2NsZWFuVXAoKTsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoIXRoaXMuaGFzRXZlbnRMaXN0ZW5lcigiZmlsZXByb2dyZXNzIikpIHsgcmV0dXJuOyB9CgoJCS8vTE06IFJld29yayBQcm9ncmVzc0V2ZW50IHRvIHN1cHBvcnQgdGhpcz8KCQl2YXIgZXZlbnQgPSBuZXcgY3JlYXRlanMuRXZlbnQoImZpbGVwcm9ncmVzcyIpOwoJCWV2ZW50LnByb2dyZXNzID0gcHJvZ3Jlc3M7CgkJZXZlbnQubG9hZGVkID0gcHJvZ3Jlc3M7CgkJZXZlbnQudG90YWwgPSAxOwoJCWV2ZW50Lml0ZW0gPSBpdGVtOwoKCQl0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwoJfTsKCgkvKioKCSAqIERpc3BhdGNoIGEgZmlsZWxvYWQge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319LiBQbGVhc2Ugc2VlIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9maWxlbG9hZDpldmVudCJ9fXt7L2Nyb3NzTGlua319IGV2ZW50IGZvcgoJICogZGV0YWlscyBvbiB0aGUgZXZlbnQgcGF5bG9hZC4KCSAqIEBtZXRob2QgX3NlbmRGaWxlQ29tcGxldGUKCSAqIEBwYXJhbSB7TG9hZEl0ZW1PYmplY3R9IGl0ZW0gVGhlIGl0ZW0gdGhhdCBpcyBiZWluZyBsb2FkZWQuCgkgKiBAcGFyYW0ge0Fic3RyYWN0TG9hZGVyfSBsb2FkZXIKCSAqIEBwcm90ZWN0ZWQKCSAqLwoJcC5fc2VuZEZpbGVDb21wbGV0ZSA9IGZ1bmN0aW9uIChpdGVtLCBsb2FkZXIpIHsKCQlpZiAodGhpcy5faXNDYW5jZWxlZCgpKSB7IHJldHVybjsgfQoKCQl2YXIgZXZlbnQgPSBuZXcgY3JlYXRlanMuRXZlbnQoImZpbGVsb2FkIik7CgkJZXZlbnQubG9hZGVyID0gbG9hZGVyOwoJCWV2ZW50Lml0ZW0gPSBpdGVtOwoJCWV2ZW50LnJlc3VsdCA9IHRoaXMuX2xvYWRlZFJlc3VsdHNbaXRlbS5pZF07CgkJZXZlbnQucmF3UmVzdWx0ID0gdGhpcy5fbG9hZGVkUmF3UmVzdWx0c1tpdGVtLmlkXTsKCgkJLy8gVGhpcyBjYWxscyBhIGhhbmRsZXIgc3BlY2lmaWVkIG9uIHRoZSBhY3R1YWwgbG9hZCBpdGVtLiBDdXJyZW50bHksIHRoZSBTb3VuZEpTIHBsdWdpbiB1c2VzIHRoaXMuCgkJaWYgKGl0ZW0uY29tcGxldGVIYW5kbGVyKSB7CgkJCWl0ZW0uY29tcGxldGVIYW5kbGVyKGV2ZW50KTsKCQl9CgoJCXRoaXMuaGFzRXZlbnRMaXN0ZW5lcigiZmlsZWxvYWQiKSAmJiB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwoJfTsKCgkvKioKCSAqIERpc3BhdGNoIGEgZmlsZXN0YXJ0IHt7I2Nyb3NzTGluayAiRXZlbnQifX17ey9jcm9zc0xpbmt9fSBpbW1lZGlhdGVseSBiZWZvcmUgYSBmaWxlIHN0YXJ0cyB0byBsb2FkLiBQbGVhc2Ugc2VlCgkgKiB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvZmlsZXN0YXJ0OmV2ZW50In19e3svY3Jvc3NMaW5rfX0gZXZlbnQgZm9yIGRldGFpbHMgb24gdGhlIGV2ZW50IHBheWxvYWQuCgkgKiBAbWV0aG9kIF9zZW5kRmlsZVN0YXJ0CgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gaXRlbSBUaGUgaXRlbSB0aGF0IGlzIGJlaW5nIGxvYWRlZC4KCSAqIEBwcm90ZWN0ZWQKCSAqLwoJcC5fc2VuZEZpbGVTdGFydCA9IGZ1bmN0aW9uIChpdGVtKSB7CgkJdmFyIGV2ZW50ID0gbmV3IGNyZWF0ZWpzLkV2ZW50KCJmaWxlc3RhcnQiKTsKCQlldmVudC5pdGVtID0gaXRlbTsKCQl0aGlzLmhhc0V2ZW50TGlzdGVuZXIoImZpbGVzdGFydCIpICYmIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7Cgl9OwoKCXAudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuICJbUHJlbG9hZEpTIExvYWRRdWV1ZV0iOwoJfTsKCgljcmVhdGVqcy5Mb2FkUXVldWUgPSBjcmVhdGVqcy5wcm9tb3RlKExvYWRRdWV1ZSwgIkFic3RyYWN0TG9hZGVyIik7Cn0oKSk7Cg==
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer