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dmVkLgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuICovCgpodG1sLCBib2R5IHsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwogIGhlaWdodDogMTAwJTsKICBtYXJnaW46IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgd2lkdGg6IDEwMCU7Cn0KCmgxIHsKICBkaXNwbGF5OiBub25lOwogIGZvbnQtc2l6ZTogMTBwdDsKICBmb250LXdlaWdodDogbm9ybWFsOwogIHBhZGRpbmc6IDBwdCAxMHB0Owp9CgpwIHsKICBmb250LXNpemU6IDhwdDsKICBwYWRkaW5nOiAwcHQgMTRwdDsKfQoKI3QgewogIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7CiAgY29sb3I6ICM2NDY0NjQ7Cn0KCiNvdXRlciB7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIGRpc3BsYXk6IGZsZXg7CiAgaGVpZ2h0OiAxMDAlOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9CgouaWNvbiB7CiAgbWF4LWhlaWdodDogMTAwJTsKICBtYXgtd2lkdGg6IDEwMCU7CiAgb3BhY2l0eTogLjM7Cn0KCkBtZWRpYSAob3JpZW50YXRpb246IGxhbmRzY2FwZSkgYW5kIChtaW4taGVpZ2h0OiAyZW0pIGFuZCAobWluLXdpZHRoOiAxNGVtKSB7CiAgI291dGVyIHsKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgfQogIC5pY29uIHsKICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICBtYXgtd2lkdGg6IDUwJTsKICB9CiAgaDEgewogICAgZGlzcGxheTogYmxvY2s7CiAgfQp9CgpAbWVkaWEgKG1pbi1oZWlnaHQ6IDdlbSkgYW5kIChtaW4td2lkdGg6IDZlbSkgewogICNvdXRlciB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIH0KICAuaWNvbiB7CiAgICBtYXgtaGVpZ2h0OiA1MCU7CiAgICBtYXgtd2lkdGg6IDEwMCU7CiAgfQogIGgxIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQo8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keSBpZD0idCIgb25sb2FkPSJub3RpZnlEaWRGaW5pc2hMb2FkaW5nKCk7Ij4KICAgIDxkaXYgaTE4bi12YWx1ZXM9InRpdGxlOm5hbWUiIGlkPSJvdXRlciI+CiAgICAgIDxpbWcgY2xhc3M9Imljb24iCiAgICAgICAgICAgc3JjPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBPSEI0SWlCb1pXbG5hSFE5SWpRNGNIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBME9DQTBPQ0lnWm1sc2JEMGlJell5TmpJMk1pSStDaUFnSUNBOGNHRjBhQ0JrUFNKTk1DQXdhRFE0ZGpRNFNEQjZJaUJtYVd4c1BTSnViMjVsSWk4K0NpQWdJQ0E4Y0dGMGFDQmtQU0pOTkRFZ01qSm9MVE4yTFRoak1DMHlMakl4TFRFdU56a3ROQzAwTFRSb0xUaFdOMk13TFRJdU56WXRNaTR5TkMwMUxUVXROWE10TlNBeUxqSTBMVFVnTlhZelNEaGpMVEl1TWpFZ01DMHpMams0SURFdU56a3RNeTQ1T0NBMGJDMHVNREVnTnk0MlNEZGpNaTQ1T0NBd0lEVXVOQ0F5TGpReUlEVXVOQ0ExTGpSVE9TNDVPQ0F6TWk0MElEY2dNekl1TkVnMExqQXhURFFnTkRCak1DQXlMakl4SURFdU56a2dOQ0EwSURSb055NDJkaTB6WXpBdE1pNDVPQ0F5TGpReUxUVXVOQ0ExTGpRdE5TNDBJREl1T1RnZ01DQTFMalFnTWk0ME1pQTFMalFnTlM0MGRqTklNelJqTWk0eU1TQXdJRFF0TVM0M09TQTBMVFIyTFRob00yTXlMamMySURBZ05TMHlMakkwSURVdE5YTXRNaTR5TkMwMUxUVXROWG9pTHo0S1BDOXpkbWMrQ2c9PSI+CiAgICAgIDxoMSBpZD0ibWVzc2FnZSI+JGkxOG57bWVzc2FnZX08L2gxPgogICAgPC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIHVzZXItc2NhbGFibGU9bm8iPgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLiAqLwoKaHRtbCwgYm9keSB7CiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHdpZHRoOiAxMDAlOwp9CgpoMSB7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEwcHQ7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBwYWRkaW5nOiAwcHQgMTBwdDsKfQoKcCB7CiAgZm9udC1zaXplOiA4cHQ7CiAgcGFkZGluZzogMHB0IDE0cHQ7Cn0KCiN0IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OwogIGNvbG9yOiAjNjQ2NDY0Owp9Cgojb3V0ZXIgewogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBkaXNwbGF5OiBmbGV4OwogIGhlaWdodDogMTAwJTsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmljb24gewogIG1heC1oZWlnaHQ6IDEwMCU7CiAgbWF4LXdpZHRoOiAxMDAlOwogIG9wYWNpdHk6IC4zOwp9CgpAbWVkaWEgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIGFuZCAobWluLWhlaWdodDogMmVtKSBhbmQgKG1pbi13aWR0aDogMTRlbSkgewogICNvdXRlciB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogIH0KICAuaWNvbiB7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiA1MCU7CiAgfQogIGgxIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQoKQG1lZGlhIChtaW4taGVpZ2h0OiA3ZW0pIGFuZCAobWluLXdpZHRoOiA2ZW0pIHsKICAjb3V0ZXIgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CiAgLmljb24gewogICAgbWF4LWhlaWdodDogNTAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogIH0KICBoMSB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9Cn0KPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHkgaWQ9InQiIG9uTG9hZD0iaW5zZXJ0TGluaygpIj4KICAgIDxkaXYgaTE4bi12YWx1ZXM9InRpdGxlOm5hbWUiIGlkPSJvdXRlciI+CiAgICAgIDxpbWcgY2xhc3M9Imljb24iCiAgICAgICAgICAgc3JjPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBPSEI0SWlCb1pXbG5hSFE5SWpRNGNIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBME9DQTBPQ0lnWm1sc2JEMGlJell5TmpJMk1pSStDaUFnSUNBOGNHRjBhQ0JrUFNKTk1DQXdhRFE0ZGpRNFNEQjZJaUJtYVd4c1BTSnViMjVsSWk4K0NpQWdJQ0E4Y0dGMGFDQmtQU0pOTkRFZ01qSm9MVE4yTFRoak1DMHlMakl4TFRFdU56a3ROQzAwTFRSb0xUaFdOMk13TFRJdU56WXRNaTR5TkMwMUxUVXROWE10TlNBeUxqSTBMVFVnTlhZelNEaGpMVEl1TWpFZ01DMHpMams0SURFdU56a3RNeTQ1T0NBMGJDMHVNREVnTnk0MlNEZGpNaTQ1T0NBd0lEVXVOQ0F5TGpReUlEVXVOQ0ExTGpSVE9TNDVPQ0F6TWk0MElEY2dNekl1TkVnMExqQXhURFFnTkRCak1DQXlMakl4SURFdU56a2dOQ0EwSURSb055NDJkaTB6WXpBdE1pNDVPQ0F5TGpReUxUVXVOQ0ExTGpRdE5TNDBJREl1T1RnZ01DQTFMalFnTWk0ME1pQTFMalFnTlM0MGRqTklNelJqTWk0eU1TQXdJRFF0TVM0M09TQTBMVFIyTFRob00yTXlMamMySURBZ05TMHlMakkwSURVdE5YTXRNaTR5TkMwMUxUVXROWG9pTHo0S1BDOXpkbWMrQ2c9PSI+CiAgICAgIDxoMSBpZD0ibWVzc2FnZSI+JGkxOG57bWVzc2FnZX08L2gxPgogICAgPC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IgogICAgICBjb250ZW50PSJpbml0aWFsLXNjYWxlPTEsIG1pbmltdW0tc2NhbGU9MSwgd2lkdGg9ZGV2aWNlLXdpZHRoIj4KICAgIDxzY3JpcHQ+CiAgICAgIHdpbmRvdy5vbmtleWRvd24gPSBmdW5jdGlvbihlKSB7CiAgICAgICAgaWYgKGUua2V5ID09ICdFbnRlcicgfHwgZS5rZXkgPT0gJyAnKSB7CiAgICAgICAgICBwbHVnaW4ub3BlblBERigpOwogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfTsKICAgIDwvc2NyaXB0PgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAyMDE3IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuICovCgphIHsKICBjb2xvcjogcmdiKDg4LCA4OCwgODgpOwp9Cgpib2R5IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogIGNvbG9yOiByZ2IoMTAwLCAxMDAsIDEwMCk7CiAgd29yZC13cmFwOiBicmVhay13b3JkOwp9CgojZGV0YWlscy1idXR0b24gewogIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgYm9yZGVyOiAwOwogIGZsb2F0OiBub25lOwogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAxMHB4IDA7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLmhpZGRlbiB7CiAgZGlzcGxheTogbm9uZTsKfQoKaHRtbCB7CiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOwogIGZvbnQtc2l6ZTogMTI1JTsKfQoKLmljb24gewogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1zaXplOiAxMDAlOwp9PC9zdHlsZT4KICAgIDxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLiAqLwoKYnV0dG9uIHsKICBib3JkZXI6IDA7CiAgYm9yZGVyLXJhZGl1czogMnB4OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgY29sb3I6ICNmZmY7CiAgY3Vyc29yOiBwb2ludGVyOwogIGZsb2F0OiByaWdodDsKICBmb250LXNpemU6IC44NzVlbTsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogMTBweCAyNHB4OwogIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMjAwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKW2Rpcj0ncnRsJ10gYnV0dG9uIHsKICBmbG9hdDogbGVmdDsKfQoKLmJhZC1jbG9jayBidXR0b24sCi5jYXB0aXZlLXBvcnRhbCBidXR0b24sCi5tYWluLWZyYW1lLWJsb2NrZWQgYnV0dG9uLAoubmV0ZXJyb3IgYnV0dG9uLAoub2ZmbGluZSBidXR0b24sCi5wZGYgYnV0dG9uLAouc3NsIGJ1dHRvbiB7CiAgYmFja2dyb3VuZDogcmdiKDY2LCAxMzMsIDI0NCk7Cn0KCmJ1dHRvbjphY3RpdmUgewogIGJhY2tncm91bmQ6IHJnYig1MCwgMTAyLCAyMTMpOwogIG91dGxpbmU6IDA7Cn0KCmJ1dHRvbjpob3ZlciB7CiAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgLjUwKTsKfQoKI2RlYnVnZ2luZyB7CiAgZGlzcGxheTogaW5saW5lOwogIG92ZXJmbG93OiBhdXRvOwp9CgouZGVidWdnaW5nLWNvbnRlbnQgewogIGxpbmUtaGVpZ2h0OiAxZW07CiAgbWFyZ2luLWJvdHRvbTogMDsKICBtYXJnaW4tdG9wOiAxZW07Cn0KCi5kZWJ1Z2dpbmctY29udGVudC1maXhlZC13aWR0aCB7CiAgZGlzcGxheTogYmxvY2s7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEuMmVtOwogIG1hcmdpbi10b3A6IDAuNWVtOwp9CgouZGVidWdnaW5nLXRpdGxlIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKI2RldGFpbHMgewogIGNvbG9yOiAjNjk2OTY5OwogIG1hcmdpbjogMCAwIDUwcHg7Cn0KCiNkZXRhaWxzIHA6bm90KDpmaXJzdC1vZi10eXBlKSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKI2RldGFpbHMtYnV0dG9uOmhvdmVyIHsKICBib3gtc2hhZG93OiBpbmhlcml0OwogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwp9CgouZXJyb3ItY29kZSB7CiAgY29sb3I6ICM2NDY0NjQ7CiAgZm9udC1zaXplOiAuODY2NjdlbTsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgojZXJyb3ItZGVidWdnaW5nLWluZm8gewogIGZvbnQtc2l6ZTogMC44ZW07Cn0KCmgxIHsKICBjb2xvcjogIzMzMzsKICBmb250LXNpemU6IDEuNmVtOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgbGluZS1oZWlnaHQ6IDEuMjVlbTsKICBtYXJnaW4tYm90dG9tOiAxNnB4Owp9CgpoMiB7CiAgZm9udC1zaXplOiAxLjJlbTsKICBmb250LXdlaWdodDogbm9ybWFsOwp9CgouaWNvbiB7CiAgaGVpZ2h0OiA3MnB4OwogIG1hcmdpbjogMCAwIDQwcHg7CiAgd2lkdGg6IDcycHg7Cn0KCmlucHV0W3R5cGU9Y2hlY2tib3hdIHsKICBvcGFjaXR5OiAwOwp9CgppbnB1dFt0eXBlPWNoZWNrYm94XTpmb2N1cyB+IC5jaGVja2JveCB7CiAgb3V0bGluZTogLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yIGF1dG8gNXB4Owp9CgouaW50ZXJzdGl0aWFsLXdyYXBwZXIgewogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgZm9udC1zaXplOiAxZW07CiAgbGluZS1oZWlnaHQ6IDEuNmVtOwogIG1hcmdpbjogMTR2aCBhdXRvIDA7CiAgbWF4LXdpZHRoOiA2MDBweDsKICB3aWR0aDogMTAwJTsKfQoKI21haW4tbWVzc2FnZSA+IHAgewogIGRpc3BsYXk6IGlubGluZTsKfQoKI2V4dGVuZGVkLXJlcG9ydGluZy1vcHQtaW4gewogIGZvbnQtc2l6ZTogLjg3NWVtOwogIG1hcmdpbi10b3A6IDM5cHg7Cn0KCiNleHRlbmRlZC1yZXBvcnRpbmctb3B0LWluIGxhYmVsIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKfQoKLm5hdi13cmFwcGVyIHsKICBtYXJnaW4tdG9wOiA1MXB4Owp9CgoubmF2LXdyYXBwZXI6OmFmdGVyIHsKICBjbGVhcjogYm90aDsKICBjb250ZW50OiAnJzsKICBkaXNwbGF5OiB0YWJsZTsKICB3aWR0aDogMTAwJTsKfQoKLnNtYWxsLWxpbmsgewogIGNvbG9yOiAjNjk2OTY5OwogIGZvbnQtc2l6ZTogLjg3NWVtOwp9CgouY2hlY2tib3hlcyB7CiAgZmxleDogMCAwIDI0cHg7Cn0KCi5jaGVja2JveCB7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyOiAxcHggc29saWQgd2hpdGU7CiAgYm9yZGVyLXJhZGl1czogMnB4OwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMTRweDsKICBsZWZ0OiAwOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICByaWdodDogMDsKICB0b3A6IDNweDsKICB3aWR0aDogMTRweDsKfQoKLmNoZWNrYm94OjpiZWZvcmUgewogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogIGJvcmRlcjogMnB4IHNvbGlkIHdoaXRlOwogIGJvcmRlci1yaWdodC13aWR0aDogMDsKICBib3JkZXItdG9wLXdpZHRoOiAwOwogIGNvbnRlbnQ6ICcnOwogIGhlaWdodDogNHB4OwogIGxlZnQ6IDJweDsKICBvcGFjaXR5OiAwOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDNweDsKICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpOwogIHdpZHRoOiA5cHg7Cn0KCmlucHV0W3R5cGU9Y2hlY2tib3hdOmNoZWNrZWQgfiAuY2hlY2tib3g6OmJlZm9yZSB7CiAgb3BhY2l0eTogMTsKfQoKI3JlY3VycmVudC1lcnJvci1tZXNzYWdlIHsKICBiYWNrZ3JvdW5kOiAjZWRlZGVkOwogIGJvcmRlci1yYWRpdXM6IDRweDsKICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgbWFyZ2luLXRvcDogMTJweDsKICBtYXJnaW4tYm90dG9tOiAxNnB4Owp9Cgouc2hvd2luZy1yZWN1cnJlbnQtZXJyb3ItbWVzc2FnZSAjZXh0ZW5kZWQtcmVwb3J0aW5nLW9wdC1pbiB7CiAgbWFyZ2luLXRvcDogMTZweDsKfQoKQG1lZGlhIChtYXgtd2lkdGg6IDcwMHB4KSB7CiAgLmludGVyc3RpdGlhbC13cmFwcGVyIHsKICAgIHBhZGRpbmc6IDAgMTAlOwogIH0KCiAgI2Vycm9yLWRlYnVnZ2luZy1pbmZvIHsKICAgIG92ZXJmbG93OiBhdXRvOwogIH0KfQoKQG1lZGlhIChtYXgtaGVpZ2h0OiA2MDBweCkgewogIC5lcnJvci1jb2RlIHsKICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgfQp9CgpAbWVkaWEgKG1heC13aWR0aDogNDIwcHgpIHsKICBidXR0b24sCiAgW2Rpcj0ncnRsJ10gYnV0dG9uLAogIC5zbWFsbC1saW5rIHsKICAgIGZsb2F0OiBub25lOwogICAgZm9udC1zaXplOiAuODI1ZW07CiAgICBmb250LXdlaWdodDogNDAwOwogICAgbWFyZ2luOiAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIHdpZHRoOiAxMDAlOwogIH0KCiAgI2RldGFpbHMgewogICAgbWFyZ2luOiAyMHB4IDAgMjBweCAwOwogIH0KCiAgI2RldGFpbHMgcDpub3QoOmZpcnN0LW9mLXR5cGUpIHsKICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgfQoKICAjZGV0YWlscy1idXR0b24gewogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgd2lkdGg6IDEwMCU7CiAgfQoKICAuaW50ZXJzdGl0aWFsLXdyYXBwZXIgewogICAgcGFkZGluZzogMCA1JTsKICB9CgogICNleHRlbmRlZC1yZXBvcnRpbmctb3B0LWluIHsKICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgfQoKICAubmF2LXdyYXBwZXIgewogICAgbWFyZ2luLXRvcDogMzBweDsKICB9Cn0KCi8qKgogKiBNb2JpbGUgc3BlY2lmaWMgc3R5bGluZy4KICogTmF2aWdhdGlvbiBidXR0b25zIGFyZSBhbmNob3JlZCB0byB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uCiAqIERldGFpbHMgbWVzc2FnZSByZXBsYWNlcyB0aGUgdG9wIGNvbnRlbnQgaW4gaXRzIG93biBzY3JvbGxhYmxlIGFyZWEuCiAqLwoKQG1lZGlhIChtYXgtd2lkdGg6IDQyMHB4KSB7CiAgI2RldGFpbHMtYnV0dG9uIHsKICAgIGJvcmRlcjogMDsKICAgIG1hcmdpbjogOHB4IDAgMDsKICB9CgogIC5zZWNvbmRhcnktYnV0dG9uIHsKICAgIC13ZWJraXQtbWFyZ2luLWVuZDogMDsKICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgfQp9CgovKiBGaXhlZCBuYXYuICovCkBtZWRpYSAobWluLXdpZHRoOiAyNDBweCkgYW5kIChtYXgtd2lkdGg6IDQyMHB4KSBhbmQKICAgICAgIChtaW4taGVpZ2h0OiA0MDFweCksCiAgICAgICAobWluLXdpZHRoOiA0MjFweCkgYW5kIChtaW4taGVpZ2h0OiAyNDBweCkgYW5kCiAgICAgICAobWF4LWhlaWdodDogNTYwcHgpIHsKICBib2R5IC5uYXYtd3JhcHBlciB7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgYm90dG9tOiAwOwogICAgYm94LXNoYWRvdzogMCAtMjJweCA0MHB4ICNmZmY7CiAgICBsZWZ0OiAwOwogICAgbWFyZ2luOiAwIGF1dG87CiAgICBtYXgtd2lkdGg6IDczNnB4OwogICAgcGFkZGluZy1sZWZ0OiAyNHB4OwogICAgcGFkZGluZy1yaWdodDogMjRweDsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHJpZ2h0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICB6LWluZGV4OiAyOwogIH0KCiAgLmludGVyc3RpdGlhbC13cmFwcGVyIHsKICAgIG1heC13aWR0aDogNzM2cHg7CiAgfQoKICAjZGV0YWlscywKICAjbWFpbi1jb250ZW50IHsKICAgIHBhZGRpbmctYm90dG9tOiA0MHB4OwogIH0KCiAgI2RldGFpbHMgewogICAgcGFkZGluZy10b3A6IDUuNXZoOwogIH0KCiAgI2RldGFpbHMtYnV0dG9uOmhvdmVyIHsKICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgfQp9CgpAbWVkaWEgKG1heC13aWR0aDogNDIwcHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSwKICAgICAgIChtYXgtaGVpZ2h0OiA1NjBweCkgewogIGJvZHkgewogICAgbWFyZ2luOiAwIGF1dG87CiAgfQoKICBidXR0b24sCiAgW2Rpcj0ncnRsJ10gYnV0dG9uLAogIGJ1dHRvbi5zbWFsbC1saW5rIHsKICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8tUmVndWxhcixIZWx2ZXRpY2E7CiAgICBmb250LXNpemU6IC45MzNlbTsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBtYXJnaW46IDZweCAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRleigwKTsKICB9CgogIC5uYXYtd3JhcHBlciB7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgcGFkZGluZy1ib3R0b206IDhweDsKICAgIHdpZHRoOiAxMDAlOwogIH0KCiAgLmVycm9yLWNvZGUgewogICAgbWFyZ2luLXRvcDogMDsKICB9CgogICNkZXRhaWxzIHsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBoZWlnaHQ6IGF1dG87CiAgICBtYXJnaW46IDA7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAyNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogIH0KCiAgI2RldGFpbHMuaGlkZGVuLAogICNtYWluLWNvbnRlbnQuaGlkZGVuIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgaGVpZ2h0OiAwOwogICAgb3BhY2l0eTogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgIHRyYW5zaXRpb246IG5vbmU7CiAgfQoKICAjZGV0YWlscy1idXR0b24gewogICAgcGFkZGluZy1ib3R0b206IDE2cHg7CiAgICBwYWRkaW5nLXRvcDogMTZweDsKICB9CgogIGgxIHsKICAgIGZvbnQtc2l6ZTogMS41ZW07CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgfQoKICAuaWNvbiB7CiAgICBtYXJnaW4tYm90dG9tOiA1LjY5dmg7CiAgfQoKICAuaW50ZXJzdGl0aWFsLXdyYXBwZXIgewogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIG1hcmdpbjogN3ZoIGF1dG8gMTJweDsKICAgIHBhZGRpbmc6IDAgMjRweDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB9CgogIC5pbnRlcnN0aXRpYWwtd3JhcHBlciBwIHsKICAgIGZvbnQtc2l6ZTogLjk1ZW07CiAgICBsaW5lLWhlaWdodDogMS42MWVtOwogICAgbWFyZ2luLXRvcDogOHB4OwogIH0KCiAgI21haW4tY29udGVudCB7CiAgICBtYXJnaW46IDA7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDEwMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgfQoKICAuc21hbGwtbGluayB7CiAgICBib3JkZXI6IDA7CiAgfQoKICAuc3VnZ2VzdGVkLWxlZnQgPiAjY29udHJvbC1idXR0b25zLAogIC5zdWdnZXN0ZWQtcmlnaHQgPiAjY29udHJvbC1idXR0b25zIHsKICAgIGZsb2F0OiBub25lOwogICAgbWFyZ2luOiAwOwogIH0KfQoKQG1lZGlhIChtaW4td2lkdGg6IDQyMXB4KSBhbmQgKG1pbi1oZWlnaHQ6IDUwMHB4KSBhbmQgKG1heC1oZWlnaHQ6IDU2MHB4KSB7CiAgLmludGVyc3RpdGlhbC13cmFwcGVyIHsKICAgIG1hcmdpbi10b3A6IDEwdmg7CiAgfQp9CgpAbWVkaWEgKG1pbi1oZWlnaHQ6IDQwMHB4KSBhbmQgKG9yaWVudGF0aW9uOnBvcnRyYWl0KSB7CiAgLmludGVyc3RpdGlhbC13cmFwcGVyIHsKICAgIG1hcmdpbi1ib3R0b206IDE0NXB4OwogIH0KfQoKQG1lZGlhIChtaW4taGVpZ2h0OiAyOTlweCkgewogIC5uYXYtd3JhcHBlciB7CiAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsKICB9Cn0KCkBtZWRpYSAobWluLWhlaWdodDogNTAwcHgpIGFuZCAobWF4LWhlaWdodDogNjUwcHgpIGFuZCAobWF4LXdpZHRoOiA0MTRweCkgYW5kCiAgICAgICAob3JpZW50YXRpb246IHBvcnRyYWl0KSB7CiAgLmludGVyc3RpdGlhbC13cmFwcGVyIHsKICAgIG1hcmdpbi10b3A6IDd2aDsKICB9Cn0KCkBtZWRpYSAobWluLWhlaWdodDogNjUwcHgpIGFuZCAobWF4LXdpZHRoOiA0MTRweCkgYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpIHsKICAuaW50ZXJzdGl0aWFsLXdyYXBwZXIgewogICAgbWFyZ2luLXRvcDogMTB2aDsKICB9Cn0KCi8qIFNtYWxsIG1vYmlsZSBzY3JlZW5zLiBObyBmaXhlZCBuYXYuICovCkBtZWRpYSAobWF4LWhlaWdodDogNDAwcHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSwKICAgICAgIChtYXgtaGVpZ2h0OiAyMzlweCkgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSwKICAgICAgIChtYXgtd2lkdGg6IDQxOXB4KSBhbmQgKG1heC1oZWlnaHQ6IDM5OXB4KSB7CiAgLmludGVyc3RpdGlhbC13cmFwcGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgbWFyZ2luLWJvdHRvbTogMDsKICB9CgogICNkZXRhaWxzIHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgb3JkZXI6IDA7CiAgfQoKICAjbWFpbi1jb250ZW50IHsKICAgIGZsZXg6IDEgMSBhdXRvOwogICAgb3JkZXI6IDA7CiAgfQoKICAubmF2LXdyYXBwZXIgewogICAgZmxleDogMCAxIGF1dG87CiAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICBvcmRlcjogMTsKICAgIHBhZGRpbmctbGVmdDogMDsKICAgIHBhZGRpbmctcmlnaHQ6IDA7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICB9Cn0KCkBtZWRpYSAobWF4LXdpZHRoOiAyMzlweCkgYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpIHsKICAubmF2LXdyYXBwZXIgewogICAgcGFkZGluZy1sZWZ0OiAwOwogICAgcGFkZGluZy1yaWdodDogMDsKICB9Cn0KPC9zdHlsZT4KICAgIDxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxNyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLiAqLwoKYm9keSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0NywgMjQ3LCAyNDcpOwogIG1hcmdpbjogMDsKfQoKI2RldGFpbHMgewogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgLjU0KTsKICBmb250LWZhbWlseTogUm9ib3RvLVJlZ3VsYXIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAwLjkzMzMzZW07CiAgaGVpZ2h0OiBhdXRvOwogIGxpbmUtaGVpZ2h0OiAxLjQ4ZW07CiAgbWFyZ2luOiAwOwogIG9wYWNpdHk6IDE7CiAgdHJhbnNpdGlvbjogb3BhY2l0eSAyNTBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwp9CgojZGV0YWlscy5oaWRkZW4gewogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMDsKICBvcGFjaXR5OiAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgcGFkZGluZy1ib3R0b206IDA7CiAgdHJhbnNpdGlvbjogbm9uZTsKfQoKI2RldGFpbHMtbGluayB7CiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgLjM4KTsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKfQoKaDEgewogIGNvbG9yOiByZ2JhKDAsIDAsIDAsIC4zOCk7CiAgZm9udC1mYW1pbHk6IFJvYm90by1SZWd1bGFyLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMC45MzMzM2VtOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgbGluZS1oZWlnaHQ6IDEuNGVtOwogIG1hcmdpbjogOHB4IDAgOHB4Owp9CgouZ2lhbnQgLmljb24gewogIGJvdHRvbTogMDsKICBsZWZ0OiAwOwogIG1hcmdpbjogYXV0bzsKICBwb3NpdGlvbjogZml4ZWQ7CiAgcmlnaHQ6IDA7CiAgdG9wOiAwOwp9CgouZ2lhbnQgI2RldGFpbHMsCi5naWFudCAjbWFpbi1tZXNzYWdlIHsKICBkaXNwbGF5OiBub25lOwp9CgouaWNvbiB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEQ5NGJXd2dkbVZ5YzJsdmJqMGlNUzR3SWlCbGJtTnZaR2x1WnowaVZWUkdMVGdpUHo0S1BITjJaeUIzYVdSMGFEMGlNakJ3ZUNJZ2FHVnBaMmgwUFNJeE5uQjRJaUIyYVdWM1FtOTRQU0l3SURBZ01qQWdNVFlpSUhabGNuTnBiMjQ5SWpFdU1TSWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklpQjRiV3h1Y3pwNGJHbHVhejBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TVRrNU9TOTRiR2x1YXlJK0NpQWdQR2NnYzNSeWIydGxQU0p1YjI1bElpQnpkSEp2YTJVdGQybGtkR2c5SWpFaUlHWnBiR3c5SW01dmJtVWlJR1pwYkd3dGNuVnNaVDBpWlhabGJtOWtaQ0krQ2lBZ0lDQThaeUIwY21GdWMyWnZjbTA5SW5SeVlXNXpiR0YwWlNndE1pNHdNREF3TURBc0lDMDBMakF3TURBd01Da2lQZ29nSUNBZ0lDQThaejRLSUNBZ0lDQWdJQ0FnSUR4d2IyeDVaMjl1SUhCdmFXNTBjejBpTUNBd0lESTBJREFnTWpRZ01qUWdNQ0F5TkNJK1BDOXdiMng1WjI5dVBnb2dJQ0FnSUNBZ0lDQWdQSEJoZEdnZ1pEMGlUVEl3TERRZ1F6SXhMRFFnTWpJc05TQXlNaXcySUV3eU1pd3hPQ0JETWpJc01Ua2dNakVzTWpBZ01qQXNNakFnVERRc01qQWdRekl1T1N3eU1DQXlMREU1TGpFZ01pd3hPQ0JNTWl3MklFTXlMRFVnTXl3MElEUXNOQ0JNTWpBc05DQmFJRTB4TkM0ek9USXpNRE16TERFMUxqUTFPVGd5TnpnZ1RERTFMalE1TkRrM05ESXNNVFF1TXpVNE1UQTJNaUJNTVRNdU1USXdOell6T1N3eE1TNDVPRFU1TXprM0lFd3hOUzQxTERrdU5qQTNOelEzTkRrZ1RERTBMak01TnpNeU9URXNPQzQxTURZd01qVTRNaUJNTVRJdU1ERTNNRGczT1N3eE1DNDRPRFF5TVRneElFdzVMall6TVRneU1EYzVMRGd1TlNCTU9DNDFNamt4TkRrNU1TdzVMall3TVRjeU1UWTJJRXd4TUM0NU1UVTBNakl5TERFeExqazROVGt6T1RjZ1REZ3VOU3d4TkM0ek9UZ3lOemd6SUV3NUxqWXdNalkzTURnNExERTFMalVnVERFeUxqQXhOekE0Tnprc01UTXVNRGcyTmpVM01TQk1NVFF1TXpreU16QXpNeXd4TlM0ME5UazRNamM0SUZvaUlHWnBiR3d0YjNCaFkybDBlVDBpTUM0eUlpQm1hV3hzUFNJak1EQXdNREF3SWo0OEwzQmhkR2crQ2lBZ0lDQWdJRHd2Wno0S0lDQWdJRHd2Wno0S0lDQThMMmMrQ2p3dmMzWm5QZz09KTsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7CiAgaGVpZ2h0OiAyMHZoOwogIG1hcmdpbjogMCBhdXRvOwogIG1heC1oZWlnaHQ6IDQ4cHg7CiAgbWF4LXdpZHRoOiA0OHB4OwogIG1pbi1oZWlnaHQ6IDE4cHg7CiAgbWluLXdpZHRoOiAxOHB4OwogIG9wYWNpdHk6IC41NDsKICB3aWR0aDogMjB2aDsKfQoKLmludGVyc3RpdGlhbC13cmFwcGVyIHsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIGhlaWdodDogMTAwdmg7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgbGluZS1oZWlnaHQ6IDEuNmVtOwogIG1hcmdpbjogMCBhdXRvOwogIG1heC13aWR0aDogNDgwcHg7CiAgcGFkZGluZzogMTZweDsKICB3aWR0aDogMTAwJTsKfQoKI21haW4tY29udGVudCB7CiAgYWxpZ24tc2VsZjogYXV0bzsKICBmbGV4OiAwIDEgYXV0bzsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCkBtZWRpYSAobWF4LWhlaWdodDoyZW0pLCAobWF4LXdpZHRoOjJlbSkgewogIC5pY29uIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9CgpAbWVkaWEgKG1pbi1oZWlnaHQ6MjVlbSkgYW5kIChtaW4td2lkdGg6MzcuNWVtKSwKICAgICAgIChtaW4taGVpZ2h0OjM3LjVlbSkgYW5kIChtaW4td2lkdGg6MjVlbSkgewogIC5pbnRlcnN0aXRpYWwtd3JhcHBlciB7CiAgICBwYWRkaW5nOiA0OHB4OwogIH0KfQoKLyogVmlld3MgdGhhdCBkb24ndCBmaXQgdGhlIGRldGFpbHMgdGV4dC4gKi8KQG1lZGlhIChtYXgtaGVpZ2h0OjExLjI1ZW0pIGFuZCAobWF4LXdpZHRoOjE4Ljc1ZW0pLAogICAgICAgKG1heC1oZWlnaHQ6MTguNzVlbSkgYW5kIChtYXgtd2lkdGg6MTEuMjVlbSksCiAgICAgICAobWF4LWhlaWdodDo1ZW0pLCAobWF4LXdpZHRoOjVlbSkgewogIC5pY29uIHsKICAgIG1heC1oZWlnaHQ6IDI0cHg7CiAgICBtYXgtd2lkdGg6IDI0cHg7CiAgfQoKICAjZGV0YWlscywKICAjbWFpbi1tZXNzYWdlIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQp9Cjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIHBhdGggewogICAgICAgIGZpbGwtb3BhY2l0eTogMC4yOwogICAgICB9CgogICAgICAuaWNvbiB7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKICAgICAgfQoKICAgICAgYnV0dG9uLAogICAgICBbZGlyPSdydGwnXSBidXR0b24gewogICAgICAgIGZsb2F0OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keSBjbGFzcz0icGRmIj4KICAgIDxkaXYgY2xhc3M9ImludGVyc3RpdGlhbC13cmFwcGVyIj4KICAgICAgPGRpdiBpZD0ibWFpbi1jb250ZW50Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJpY29uIj4KICAgICAgICAgIDwhLS0gTWF0ZXJpYWwgRGVzaWduIFBERiBpY29uIC0tPgogICAgICAgICAgPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPgogICAgICAgICAgICA8cGF0aCBkPSJNNyAxMS41aDF2LTFIN3Yxek0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTkuNSA4LjVjMCAuODMtLjY3IDEuNS0xLjUgMS41SDd2Mkg1LjVWOUg4Yy44MyAwIDEuNS42NyAxLjUgMS41djF6bTEwLTFIMTd2MWgxLjVWMTNIMTd2MmgtMS41VjloNHYxLjV6bS01IDNjMCAuODMtLjY3IDEuNS0xLjUgMS41aC0yLjVWOUgxM2MuODMgMCAxLjUuNjcgMS41IDEuNXYzem0tMi41IDBoMXYtM2gtMXYzeiI+PC9wYXRoPgogICAgICAgICAgPC9zdmc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ibWFpbi1tZXNzYWdlIj4KICAgICAgICAgIDxoMT4kaTE4bntmaWxlTmFtZX08L2gxPgogICAgICAgIDwvZGl2PgogICAgICAgIDxidXR0b24gb25jbGljaz0icGx1Z2luLm9wZW5QREYoKSI+JGkxOG57b3Blbn08L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9ib2R5Pgo8L2h0bWw+CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIHVzZXItc2NhbGFibGU9bm8iPgogIDxzY3JpcHQ+CiAgICBmdW5jdGlvbiBzZXRNZXNzYWdlKG1zZykgewogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVzc2FnZScpLnRleHRDb250ZW50ID0gbXNnOwogICAgfQogICAgZnVuY3Rpb24gbm90aWZ5RGlkRmluaXNoTG9hZGluZygpIHsKICAgICAgaWYgKHBsdWdpbi5kaWRGaW5pc2hMb2FkaW5nKQogICAgICAgIHBsdWdpbi5kaWRGaW5pc2hMb2FkaW5nKCk7CgogICAgICBpZiAocGx1Z2luLmRpZEZpbmlzaEljb25SZXBvc2l0aW9uRm9yVGVzdGluZykKICAgICAgICBwbHVnaW4uZGlkRmluaXNoSWNvblJlcG9zaXRpb25Gb3JUZXN0aW5nKCk7CiAgICB9CiAgPC9zY3JpcHQ+CiAgPHN0eWxlPi8qIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLiAqLwoKaHRtbCwgYm9keSB7CiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICBoZWlnaHQ6IDEwMCU7CiAgbWFyZ2luOiAwOwogIG92ZXJmbG93OiBoaWRkZW47CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHdpZHRoOiAxMDAlOwp9CgpoMSB7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEwcHQ7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBwYWRkaW5nOiAwcHQgMTBwdDsKfQoKcCB7CiAgZm9udC1zaXplOiA4cHQ7CiAgcGFkZGluZzogMHB0IDE0cHQ7Cn0KCiN0IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OwogIGNvbG9yOiAjNjQ2NDY0Owp9Cgojb3V0ZXIgewogIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBkaXNwbGF5OiBmbGV4OwogIGhlaWdodDogMTAwJTsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLmljb24gewogIG1heC1oZWlnaHQ6IDEwMCU7CiAgbWF4LXdpZHRoOiAxMDAlOwogIG9wYWNpdHk6IC4zOwp9CgpAbWVkaWEgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpIGFuZCAobWluLWhlaWdodDogMmVtKSBhbmQgKG1pbi13aWR0aDogMTRlbSkgewogICNvdXRlciB7CiAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogIH0KICAuaWNvbiB7CiAgICBtYXgtaGVpZ2h0OiAxMDAlOwogICAgbWF4LXdpZHRoOiA1MCU7CiAgfQogIGgxIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogIH0KfQoKQG1lZGlhIChtaW4taGVpZ2h0OiA3ZW0pIGFuZCAobWluLXdpZHRoOiA2ZW0pIHsKICAjb3V0ZXIgewogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICB9CiAgLmljb24gewogICAgbWF4LWhlaWdodDogNTAlOwogICAgbWF4LXdpZHRoOiAxMDAlOwogIH0KICBoMSB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9Cn0KPC9zdHlsZT4KICA8c3R5bGU+CiAgI291dGVyIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKICB9CiAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keSBpZD0idCIgb25sb2FkPSJub3RpZnlEaWRGaW5pc2hMb2FkaW5nKCk7Ij4KICA8ZGl2IGkxOG4tdmFsdWVzPSJ0aXRsZTpuYW1lIiBpZD0ib3V0ZXIiPgogICAgPGltZyBjbGFzcz0iaWNvbiIKICAgICAgICAgc3JjPSJkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGRwWkhSb1BTSTBPSEI0SWlCb1pXbG5hSFE5SWpRNGNIZ2lJSFpwWlhkQ2IzZzlJakFnTUNBME9DQTBPQ0lnWm1sc2JEMGlJell5TmpJMk1pSStDaUFnSUNBOGNHRjBhQ0JrUFNKTk1DQXdhRFE0ZGpRNFNEQjZJaUJtYVd4c1BTSnViMjVsSWk4K0NpQWdJQ0E4Y0dGMGFDQmtQU0pOTkRFZ01qSm9MVE4yTFRoak1DMHlMakl4TFRFdU56a3ROQzAwTFRSb0xUaFdOMk13TFRJdU56WXRNaTR5TkMwMUxUVXROWE10TlNBeUxqSTBMVFVnTlhZelNEaGpMVEl1TWpFZ01DMHpMams0SURFdU56a3RNeTQ1T0NBMGJDMHVNREVnTnk0MlNEZGpNaTQ1T0NBd0lEVXVOQ0F5TGpReUlEVXVOQ0ExTGpSVE9TNDVPQ0F6TWk0MElEY2dNekl1TkVnMExqQXhURFFnTkRCak1DQXlMakl4SURFdU56a2dOQ0EwSURSb055NDJkaTB6WXpBdE1pNDVPQ0F5TGpReUxUVXVOQ0ExTGpRdE5TNDBJREl1T1RnZ01DQTFMalFnTWk0ME1pQTFMalFnTlM0MGRqTklNelJqTWk0eU1TQXdJRFF0TVM0M09TQTBMVFIyTFRob00yTXlMamMySURBZ05TMHlMakkwSURVdE5YTXRNaTR5TkMwMUxUVXROWG9pTHo0S1BDOXpkbWMrQ2c9PSI+CiAgICA8aDEgaWQ9Im1lc3NhZ2UiPiRpMThue21lc3NhZ2V9PC9oMT4KICA8L2Rpdj4KICA8c2NyaXB0PgogICAgd2luZG93Lm9ua2V5ZG93biA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGUua2V5ID09ICdFbnRlcicgfHwgZS5rZXkgPT0gJyAnKSB7CiAgICAgICAgcGx1Z2luLnNob3dQZXJtaXNzaW9uQnViYmxlKCk7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICB9OwoKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdXRlcicpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICAgICAgcGx1Z2luLnNob3dQZXJtaXNzaW9uQnViYmxlKCk7CiAgICB9OwogIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4KPCFkb2N0eXBlIGh0bWw+CjxodG1sPgo8aGVhZD4KPG1ldGEgY2hhcnNldD0idXRmLTgiPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCB1c2VyLXNjYWxhYmxlPW5vIj4KPHNjcmlwdD4KICB3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICBpZiAocGx1Z2luLmRpZEZpbmlzaExvYWRpbmcpCiAgICAgIHBsdWdpbi5kaWRGaW5pc2hMb2FkaW5nKCk7CiAgfTsKCiAgd2luZG93Lm9ua2V5ZG93biA9IGZ1bmN0aW9uKGUpIHsKICAgIGlmIChlLmtleSA9PSAnRW50ZXInIHx8IGUua2V5ID09ICcgJykgewogICAgICBwbHVnaW4ubG9hZCgpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB9CiAgfTsKPC9zY3JpcHQ+CjxzdHlsZT4vKiBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4gKi8KCmh0bWwsIGJvZHkgewogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CiAgaGVpZ2h0OiAxMDAlOwogIG1hcmdpbjogMDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB3aWR0aDogMTAwJTsKfQoKaDEgewogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxMHB0OwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgcGFkZGluZzogMHB0IDEwcHQ7Cn0KCnAgewogIGZvbnQtc2l6ZTogOHB0OwogIHBhZGRpbmc6IDBwdCAxNHB0Owp9CgojdCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKICBjb2xvcjogIzY0NjQ2NDsKfQoKI291dGVyIHsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgZGlzcGxheTogZmxleDsKICBoZWlnaHQ6IDEwMCU7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxMDAlOwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KCi5pY29uIHsKICBtYXgtaGVpZ2h0OiAxMDAlOwogIG1heC13aWR0aDogMTAwJTsKICBvcGFjaXR5OiAuMzsKfQoKQG1lZGlhIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKSBhbmQgKG1pbi1oZWlnaHQ6IDJlbSkgYW5kIChtaW4td2lkdGg6IDE0ZW0pIHsKICAjb3V0ZXIgewogICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICB9CiAgLmljb24gewogICAgbWF4LWhlaWdodDogMTAwJTsKICAgIG1heC13aWR0aDogNTAlOwogIH0KICBoMSB7CiAgICBkaXNwbGF5OiBibG9jazsKICB9Cn0KCkBtZWRpYSAobWluLWhlaWdodDogN2VtKSBhbmQgKG1pbi13aWR0aDogNmVtKSB7CiAgI291dGVyIHsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgfQogIC5pY29uIHsKICAgIG1heC1oZWlnaHQ6IDUwJTsKICAgIG1heC13aWR0aDogMTAwJTsKICB9CiAgaDEgewogICAgZGlzcGxheTogYmxvY2s7CiAgfQp9Cjwvc3R5bGU+CjxzdHlsZT4KI291dGVyIHsKICBib3JkZXI6IG5vbmU7CiAgZmxleC1kaXJlY3Rpb246IHJvdzsKICBjdXJzb3I6IHBvaW50ZXI7Cn0KCiNzaGllbGRpbmcgewogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTsKICBoZWlnaHQ6IDEwMCU7CiAgbGVmdDogMHB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDBweDsKICB3aWR0aDogMTAwJTsKICB6LWluZGV4OiAyOwp9CgojcGx1Z2luLWljb24gewogIG9wYWNpdHk6IDAuODsKICBtYXgtaGVpZ2h0OiAxMDAlOwogIG1heC13aWR0aDogMTAwJTsKICBtaW4td2lkdGg6IDA7CiAgbWluLWhlaWdodDogMDsKfQoKI3BsdWdpbi1pY29uOmhvdmVyIHsKICBvcGFjaXR5OiAwLjk1Owp9CgojcG9zdGVyIHsKICBoZWlnaHQ6IDEwMCU7CiAgb2JqZWN0LWZpdDogY29udGFpbjsKICB3aWR0aDogMTAwJTsKICB6LWluZGV4OiAxOwp9CgojaW5uZXItY29udGFpbmVyIHsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGRpc3BsYXk6IGZsZXg7CiAgaGVpZ2h0OiAxMDAlOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIGxlZnQ6IDBweDsKICBtYXgtaGVpZ2h0OiAxMDAlOwogIG1heC13aWR0aDogMTAwJTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwcHg7CiAgd2lkdGg6IDEwMCU7CiAgei1pbmRleDogMjsKfQo8L3N0eWxlPgo8YmFzZSBpMThuLXZhbHVlcz0iaHJlZjpiYXNldXJsIj4KPC9oZWFkPgoKPGJvZHk+CiAgPGRpdiBpMThuLXZhbHVlcz0idGl0bGU6bmFtZSIgaWQ9Im91dGVyIj4KICAgIDxpbWcgaWQ9InBvc3RlciIgaTE4bi12YWx1ZXM9InNyY3NldDpwb3N0ZXIiPgogICAgPGRpdiBpZD0ic2hpZWxkaW5nIj48L2Rpdj4KICAgIDxkaXYgaWQ9ImlubmVyLWNvbnRhaW5lciIKICAgICAgICAgaTE4bi12YWx1ZXM9Ii5zdHlsZS53aWR0aDp2aXNpYmxlV2lkdGg7LnN0eWxlLmhlaWdodDp2aXNpYmxlSGVpZ2h0Ij4KICAgICAgPGltZyBpZD0icGx1Z2luLWljb24iIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFESUFBQUF5Q0FRQUFBQzBOa0E2QUFBQjRFbEVRVlI0MnIyWXNXckNZQkRITDlXWVNNVEpMQ1ZqK2hSQ25pSVA0QkFjQktsOUFmZU95ZG8za0JZYzh3NXV3UzEwRXdjTkZKRkVQb1JjazVMU1NyWEpHYm4vTjJYNmNmKzc3L0xkUVVVMVFZRTJhTkFwanBaOUtkQ0VtMGdDR2RyRDNzcE9YT0duSVVZb3NoT2xvZkFUZDJVUGV4bE1CcWtPUVBXTXJTUG1HT01seFdLK2RUd0QxT3RBcmJHK24rSU9xMmkzbjQ1MWFORUFEYk1iamRJMUVwU3VvNUhaaFVibEdHYm1jWUZYNkxpWW1kWGlVUVByTkFaYVBJRUZhaG1pdlJuZ0Fldm9zQmxBKzk4b01zUU5sR0hVaTdrSXJDS0t1am9FMXZuY05HWm1TUzVJdVptWlp5ck43SlpVRkxuU3pPNGZxNklSM2xqUjZOUXlhYXlYVzBXM2JLei9iamJxZmxxYXl4Y1VWTXgrK2xObGttZVU5NmhsZjlsUDM0bVVuV2Q4eHlKdkhjUnlDQ2pQOStLTlJ0azZJQmUzWE13clFlNnlvMzA4VVd3VDgrTDJEM3NZVjRUa1VrbTJ4Y01lWkdxdWJFUUNCRUNtMkxheW9RbWdKQzRSQWwrMlRhclpscmlnNUJueHFSQ0tiY0xQczZLbElSVkNzUzBOUVFQb1lFU0ZrR3lMb0pOREJCVkNzazB3UWVyYjlWaHVGMHZpV1VxWTVUS3l0QldXQmtsdjlSTnFxMmY1YWJIOGZoa2VFaXhQSW9iSEhjTXpsZVhCelRBNk1BeEI3T01jLzJCYXFQWDZVR2ZFWmxnV01LdzllQmM0L0tzb2xxWGFKelg5S1F0amlqNVBBQUFBQUVsRlRrU3VRbUNDIiAvPgogICAgPC9kaXY+CiAgPC9kaXY+CiAgPHNjcmlwdD4KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3N0ZXInKS5vbmVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTsKICAgIH07CgogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ291dGVyJykub25jbGljayA9IGZ1bmN0aW9uKCkgewogICAgICBwbHVnaW4ubG9hZCgpOwogICAgfTsKCiAgICB3aW5kb3cucmVzaXplUG9zdGVyID0gZnVuY3Rpb24obWFyZ2luTGVmdCwgbWFyZ2luVG9wLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW5uZXItY29udGFpbmVyJyk7CiAgICAgIGNvbnRhaW5lci5zdHlsZS5tYXJnaW5MZWZ0ID0gbWFyZ2luTGVmdDsKICAgICAgY29udGFpbmVyLnN0eWxlLm1hcmdpblRvcCA9IG1hcmdpblRvcDsKICAgICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gd2lkdGg7CiAgICAgIGNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7CgogICAgICBpZiAocGx1Z2luLmRpZEZpbmlzaEljb25SZXBvc2l0aW9uRm9yVGVzdGluZykgewogICAgICAgIC8vIERlZmVyIHVudGlsIHJlZmxvdyBjb21wbGV0ZS4KICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgIHBsdWdpbi5kaWRGaW5pc2hJY29uUmVwb3NpdGlvbkZvclRlc3RpbmcoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICA8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBhcHAgQVBJLgoKdmFyIGFwcE5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdhcHAnKTsKdmFyIHByb2Nlc3MgPSByZXF1aXJlTmF0aXZlKCdwcm9jZXNzJyk7CnZhciBleHRlbnNpb25JZCA9IHByb2Nlc3MuR2V0RXh0ZW5zaW9uSWQoKTsKdmFyIGxvZ0FjdGl2aXR5ID0gcmVxdWlyZU5hdGl2ZSgnYWN0aXZpdHlMb2dnZXInKTsKCmZ1bmN0aW9uIHdyYXBGb3JMb2dnaW5nKGZ1bikgewogIGlmICghZXh0ZW5zaW9uSWQpCiAgICByZXR1cm4gZnVuOyAgLy8gbm90aGluZyBpbnRlcmVzdGluZyB0byBsb2cgd2l0aG91dCBhbiBleHRlbnNpb24KCiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgLy8gVE9ETyhhdGFseSk6IFdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIHVzZSB0aGUgcmlnaHQgcHJvdG90eXBlIGZvcgogICAgLy8gZnVuLmFwcGx5LiBBcnJheSBzbGljZSBjYW4gZWl0aGVyIGJlIHJld3JpdHRlbiBvciBzaW1pbGFybHkgZGVmaW5lZC4KICAgIGxvZ0FjdGl2aXR5LkxvZ0FQSUNhbGwoZXh0ZW5zaW9uSWQsICJhcHAuIiArIGZ1bi5uYW1lLAogICAgICAgICRBcnJheS5zbGljZShhcmd1bWVudHMpKTsKICAgIHJldHVybiAkRnVuY3Rpb24uYXBwbHkoZnVuLCB0aGlzLCBhcmd1bWVudHMpOwogIH07Cn0KCi8vIFRoaXMgYmVjb21lcyBjaHJvbWUuYXBwCnZhciBhcHAgPSB7CiAgZ2V0SXNJbnN0YWxsZWQ6IHdyYXBGb3JMb2dnaW5nKGFwcE5hdGl2ZXMuR2V0SXNJbnN0YWxsZWQpLAogIGdldERldGFpbHM6IHdyYXBGb3JMb2dnaW5nKGFwcE5hdGl2ZXMuR2V0RGV0YWlscyksCiAgcnVubmluZ1N0YXRlOiB3cmFwRm9yTG9nZ2luZyhhcHBOYXRpdmVzLkdldFJ1bm5pbmdTdGF0ZSkKfTsKCi8vIFRyaWNreTsgImdldElzSW5zdGFsbGVkIiBpcyBhY3R1YWxseSBleHBvc2VkIGFzIHRoZSBnZXR0ZXIgImlzSW5zdGFsbGVkIiwKLy8gYnV0IHdlIGRvbid0IGhhdmUgYSB3YXkgdG8gZXhwcmVzcyB0aGlzIGluIHRoZSBzY2hlbWEgSlNPTiAobm9yIGlzIGl0Ci8vIHdvcnRoIGl0IGZvciB0aGlzIG9uZSBzcGVjaWFsIGNhc2UpLgovLwovLyBTbywgZGVmaW5lIGl0IG1hbnVhbGx5LCBhbmQgbGV0IHRoZSBnZXRJc0luc3RhbGxlZCBmdW5jdGlvbiBhY3QgYXMgaXRzCi8vIGRvY3VtZW50YXRpb24uCnZhciBpc0luc3RhbGxlZCA9IHdyYXBGb3JMb2dnaW5nKGFwcE5hdGl2ZXMuR2V0SXNJbnN0YWxsZWQpOwokT2JqZWN0LmRlZmluZVByb3BlcnR5KAogICAgYXBwLCAnaXNJbnN0YWxsZWQnLAogICAgewogICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGlzSW5zdGFsbGVkKCk7IH0sCiAgICB9KTsKCi8vIENhbGxlZCBieSBhcHBfYmluZGluZ3MuY2MuCmZ1bmN0aW9uIG9uSW5zdGFsbFN0YXRlUmVzcG9uc2Uoc3RhdGUsIGNhbGxiYWNrSWQpIHsKICB2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbY2FsbGJhY2tJZF07CiAgZGVsZXRlIGNhbGxiYWNrc1tjYWxsYmFja0lkXTsKICBpZiAodHlwZW9mIGNhbGxiYWNrID09ICdmdW5jdGlvbicpIHsKICAgIHRyeSB7CiAgICAgIGNhbGxiYWNrKHN0YXRlKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgY29uc29sZS5lcnJvcignRXhjZXB0aW9uIGluIGNocm9tZS5hcHAuaW5zdGFsbFN0YXRlIHJlc3BvbnNlIGhhbmRsZXI6ICcgKwogICAgICAgICAgICAgICAgICAgIGUuc3RhY2spOwogICAgfQogIH0KfQoKLy8gVE9ETyhrYWxtYW4pOiBtb3ZlIHRoaXMgc3R1ZmYgdG8gaXRzIG93biBjdXN0b20gYmluZGluZ3MuCnZhciBjYWxsYmFja3MgPSB7IF9fcHJvdG9fXzogbnVsbCB9Owp2YXIgbmV4dENhbGxiYWNrSWQgPSAxOwoKZnVuY3Rpb24gZ2V0SW5zdGFsbFN0YXRlKGNhbGxiYWNrKSB7CiAgdmFyIGNhbGxiYWNrSWQgPSBuZXh0Q2FsbGJhY2tJZCsrOwogIGNhbGxiYWNrc1tjYWxsYmFja0lkXSA9IGNhbGxiYWNrOwogIGFwcE5hdGl2ZXMuR2V0SW5zdGFsbFN0YXRlKGNhbGxiYWNrSWQpOwp9CgokT2JqZWN0LmRlZmluZVByb3BlcnR5KAogICAgYXBwLCAnaW5zdGFsbFN0YXRlJywKICAgIHsKICAgICAgX19wcm90b19fOiBudWxsLAogICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgIHZhbHVlOiB3cmFwRm9yTG9nZ2luZyhnZXRJbnN0YWxsU3RhdGUpLAogICAgICB3cml0YWJsZTogdHJ1ZSwKICAgIH0pOwoKZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYXBwKTsKZXhwb3J0cy4kc2V0KCdvbkluc3RhbGxTdGF0ZVJlc3BvbnNlJywgb25JbnN0YWxsU3RhdGVSZXNwb25zZSk7Ci8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZ3MgZm9yIHRoZSBhdXRvbWF0aW9uIEFQSS4KdmFyIEF1dG9tYXRpb25Ob2RlID0gcmVxdWlyZSgnYXV0b21hdGlvbk5vZGUnKS5BdXRvbWF0aW9uTm9kZTsKdmFyIEF1dG9tYXRpb25Sb290Tm9kZSA9IHJlcXVpcmUoJ2F1dG9tYXRpb25Ob2RlJykuQXV0b21hdGlvblJvb3ROb2RlOwp2YXIgYXV0b21hdGlvbiA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2F1dG9tYXRpb24nKTsKdmFyIGF1dG9tYXRpb25JbnRlcm5hbCA9CiAgICBnZXRJbnRlcm5hbEFwaSA/CiAgICAgICAgZ2V0SW50ZXJuYWxBcGkoJ2F1dG9tYXRpb25JbnRlcm5hbCcpIDoKICAgICAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2F1dG9tYXRpb25JbnRlcm5hbCcpLmdlbmVyYXRlKCk7CnZhciBleGNlcHRpb25IYW5kbGVyID0gcmVxdWlyZSgndW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXInKTsKdmFyIGxvZ2dpbmcgPSByZXF1aXJlTmF0aXZlKCdsb2dnaW5nJyk7CnZhciBuYXRpdmVBdXRvbWF0aW9uSW50ZXJuYWwgPSByZXF1aXJlTmF0aXZlKCdhdXRvbWF0aW9uSW50ZXJuYWwnKTsKdmFyIERlc3Ryb3lBY2Nlc3NpYmlsaXR5VHJlZSA9CiAgICBuYXRpdmVBdXRvbWF0aW9uSW50ZXJuYWwuRGVzdHJveUFjY2Vzc2liaWxpdHlUcmVlOwp2YXIgR2V0SW50QXR0cmlidXRlID0gbmF0aXZlQXV0b21hdGlvbkludGVybmFsLkdldEludEF0dHJpYnV0ZTsKdmFyIFN0YXJ0Q2FjaGluZ0FjY2Vzc2liaWxpdHlUcmVlcyA9CiAgICBuYXRpdmVBdXRvbWF0aW9uSW50ZXJuYWwuU3RhcnRDYWNoaW5nQWNjZXNzaWJpbGl0eVRyZWVzOwp2YXIgQWRkVHJlZUNoYW5nZU9ic2VydmVyID0gbmF0aXZlQXV0b21hdGlvbkludGVybmFsLkFkZFRyZWVDaGFuZ2VPYnNlcnZlcjsKdmFyIFJlbW92ZVRyZWVDaGFuZ2VPYnNlcnZlciA9CiAgICBuYXRpdmVBdXRvbWF0aW9uSW50ZXJuYWwuUmVtb3ZlVHJlZUNoYW5nZU9ic2VydmVyOwp2YXIgR2V0Rm9jdXNOYXRpdmUgPSBuYXRpdmVBdXRvbWF0aW9uSW50ZXJuYWwuR2V0Rm9jdXM7Cgp2YXIganNMYXN0RXJyb3IgPSBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHJlcXVpcmUoJ2xhc3RFcnJvcicpOwpmdW5jdGlvbiBoYXNMYXN0RXJyb3IoKSB7CiAgcmV0dXJuIGJpbmRpbmdVdGlsID8KICAgICAgYmluZGluZ1V0aWwuaGFzTGFzdEVycm9yKCkgOiBqc0xhc3RFcnJvci5oYXNFcnJvcihjaHJvbWUpOwp9CgovKioKICogQSBuYW1lc3BhY2UgdG8gZXhwb3J0IHV0aWxpdHkgZnVuY3Rpb25zIHRvIG90aGVyIGZpbGVzIGluIGF1dG9tYXRpb24uCiAqLwp3aW5kb3cuYXV0b21hdGlvblV0aWwgPSBmdW5jdGlvbigpIHt9OwoKLy8gVE9ETyhhYm94aGFsbCk6IExvb2sgaW50byB1c2luZyBXZWFrTWFwCnZhciBpZFRvQ2FsbGJhY2sgPSB7fTsKCnZhciBERVNLVE9QX1RSRUVfSUQgPSAwOwoKYXV0b21hdGlvblV0aWwuc3RvcmVUcmVlQ2FsbGJhY2sgPSBmdW5jdGlvbihpZCwgY2FsbGJhY2spIHsKICBpZiAoIWNhbGxiYWNrKQogICAgcmV0dXJuOwoKICB2YXIgdGFyZ2V0VHJlZSA9IEF1dG9tYXRpb25Sb290Tm9kZS5nZXQoaWQpOwogIGlmICghdGFyZ2V0VHJlZSkgewogICAgLy8gSWYgd2UgaGF2ZW4ndCBjYWNoZWQgdGhlIHRyZWUsIGhvbGQgdGhlIGNhbGxiYWNrIHVudGlsIHRoZSB0cmVlIGlzCiAgICAvLyBwb3B1bGF0ZWQgYnkgdGhlIGluaXRpYWwgb25BY2Nlc3NpYmlsaXR5RXZlbnQgY2FsbC4KICAgIGlmIChpZCBpbiBpZFRvQ2FsbGJhY2spCiAgICAgIGlkVG9DYWxsYmFja1tpZF0ucHVzaChjYWxsYmFjayk7CiAgICBlbHNlCiAgICAgIGlkVG9DYWxsYmFja1tpZF0gPSBbY2FsbGJhY2tdOwogIH0gZWxzZSB7CiAgICBjYWxsYmFjayh0YXJnZXRUcmVlKTsKICB9Cn07CgovKioKICogR2xvYmFsIGxpc3Qgb2YgdHJlZSBjaGFuZ2Ugb2JzZXJ2ZXJzLgogKiBAdHlwZSB7T2JqZWN0PG51bWJlciwgVHJlZUNoYW5nZU9ic2VydmVyPn0KICovCmF1dG9tYXRpb25VdGlsLnRyZWVDaGFuZ2VPYnNlcnZlck1hcCA9IHt9OwoKLyoqCiAqIFRoZSBpZCBvZiB0aGUgbmV4dCB0cmVlIGNoYW5nZSBvYnNlcnZlci4KICogQHR5cGUge251bWJlcn0KICovCmF1dG9tYXRpb25VdGlsLm5leHRUcmVlQ2hhbmdlT2JzZXJ2ZXJJZCA9IDE7CgovKioKICogQHR5cGUge0F1dG9tYXRpb25Ob2RlfSBUaGUgY3VycmVudCBmb2N1c2VkIG5vZGUuIFRoaXMgaXMgb25seSB1cGRhdGVkCiAqICAgd2hlbiBjYWxsaW5nIGF1dG9tYXRpb25VdGlsLnVwZGF0ZUZvY3VzZWROb2RlLgogKi8KYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUgPSBudWxsOwoKLyoqCiAqIEdldHMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIEF1dG9tYXRpb25Ob2RlLgogKiBAcmV0dXJuIHtBdXRvbWF0aW9uTm9kZX0KICovCmF1dG9tYXRpb25VdGlsLmdldEZvY3VzID0gZnVuY3Rpb24oKSB7CiAgdmFyIGZvY3VzZWROb2RlSW5mbyA9IEdldEZvY3VzTmF0aXZlKERFU0tUT1BfVFJFRV9JRCk7CiAgaWYgKCFmb2N1c2VkTm9kZUluZm8pCiAgICByZXR1cm4gbnVsbDsKICB2YXIgdHJlZSA9IEF1dG9tYXRpb25Sb290Tm9kZS5nZXRPckNyZWF0ZShmb2N1c2VkTm9kZUluZm8udHJlZUlkKTsKICBpZiAodHJlZSkKICAgIHJldHVybiBwcml2YXRlcyh0cmVlKS5pbXBsLmdldChmb2N1c2VkTm9kZUluZm8ubm9kZUlkKTsKfTsKCi8qKgogKiBVcGRhdGUgYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUgdG8gYmUgdGhlIG5vZGUgdGhhdCBjdXJyZW50bHkgaGFzIGZvY3VzLgogKi8KYXV0b21hdGlvblV0aWwudXBkYXRlRm9jdXNlZE5vZGUgPSBmdW5jdGlvbigpIHsKICBhdXRvbWF0aW9uVXRpbC5mb2N1c2VkTm9kZSA9IGF1dG9tYXRpb25VdGlsLmdldEZvY3VzKCk7Cn07CgovKioKICogVXBkYXRlcyB0aGUgZm9jdXMgb24gYmx1ci4KICovCmF1dG9tYXRpb25VdGlsLnVwZGF0ZUZvY3VzZWROb2RlT25CbHVyID0gZnVuY3Rpb24oKSB7CiAgdmFyIGZvY3VzID0gYXV0b21hdGlvblV0aWwuZ2V0Rm9jdXMoKTsKICBhdXRvbWF0aW9uVXRpbC5mb2N1c2VkTm9kZSA9IGZvY3VzID8gZm9jdXMucm9vdCA6IG51bGw7Cn07CgphdXRvbWF0aW9uLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIC8vIFRPRE8oYWJveGhhbGwsIGR0c2VuZyk6IE1ha2UgdGhpcyByZXR1cm4gdGhlIHNwZWNlZCBBdXRvbWF0aW9uUm9vdE5vZGUgb2JqLgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdnZXRUcmVlJywgZnVuY3Rpb24gZ2V0VHJlZSh0YWJJRCwgY2FsbGJhY2spIHsKICAgIFN0YXJ0Q2FjaGluZ0FjY2Vzc2liaWxpdHlUcmVlcygpOwoKICAgIC8vIGVuYWJsZVRhYigpIGVuc3VyZXMgdGhlIHJlbmRlcmVyIGZvciB0aGUgYWN0aXZlIG9yIHNwZWNpZmllZCB0YWIgaGFzCiAgICAvLyBhY2Nlc3NpYmlsaXR5IGVuYWJsZWQsIGFuZCBmZXRjaGVzIGl0cyBheCB0cmVlIGlkIHRvIHVzZSBhcwogICAgLy8gYSBrZXkgaW4gdGhlIGlkVG9BdXRvbWF0aW9uUm9vdE5vZGUgbWFwLiBUaGUgY2FsbGJhY2sgdG8KICAgIC8vIGVuYWJsZVRhYiBpcyBib3VuZCB0byB0aGUgY2FsbGJhY2sgcGFzc2VkIGluIHRvIGdldFRyZWUoKSwgc28gdGhhdCBvbmNlCiAgICAvLyB0aGUgdHJlZSBpcyBhdmFpbGFibGUgKGVpdGhlciBkdWUgdG8gaGF2aW5nIGJlZW4gY2FjaGVkIGVhcmxpZXIsIG9yIGFmdGVyCiAgICAvLyBhbiBhY2Nlc3NpYmlsaXR5IGV2ZW50IG9jY3VycyB3aGljaCBjYXVzZXMgdGhlIHRyZWUgdG8gYmUgcG9wdWxhdGVkKSwgdGhlCiAgICAvLyBjYWxsYmFjayBjYW4gYmUgY2FsbGVkLgogICAgdmFyIHBhcmFtcyA9IHsgdGFiSUQ6IHRhYklEIH07CiAgICBhdXRvbWF0aW9uSW50ZXJuYWwuZW5hYmxlVGFiKHBhcmFtcywKICAgICAgICBmdW5jdGlvbiBvbkVuYWJsZShpZCkgewogICAgICAgICAgaWYgKGhhc0xhc3RFcnJvcigpKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGF1dG9tYXRpb25VdGlsLnN0b3JlVHJlZUNhbGxiYWNrKGlkLCBjYWxsYmFjayk7CiAgICAgICAgfSk7CiAgfSk7CgogIHZhciBkZXNrdG9wVHJlZSA9IG51bGw7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2dldERlc2t0b3AnLCBmdW5jdGlvbihjYWxsYmFjaykgewogICAgU3RhcnRDYWNoaW5nQWNjZXNzaWJpbGl0eVRyZWVzKCk7CiAgICBkZXNrdG9wVHJlZSA9IEF1dG9tYXRpb25Sb290Tm9kZS5nZXQoREVTS1RPUF9UUkVFX0lEKTsKICAgIGlmICghZGVza3RvcFRyZWUpIHsKICAgICAgaWYgKERFU0tUT1BfVFJFRV9JRCBpbiBpZFRvQ2FsbGJhY2spCiAgICAgICAgaWRUb0NhbGxiYWNrW0RFU0tUT1BfVFJFRV9JRF0ucHVzaChjYWxsYmFjayk7CiAgICAgIGVsc2UKICAgICAgICBpZFRvQ2FsbGJhY2tbREVTS1RPUF9UUkVFX0lEXSA9IFtjYWxsYmFja107CgogICAgICAvLyBUT0RPKGR0c2VuZyk6IERpc2FibGUgZGVza3RvcCB0cmVlIG9uY2UgZGVza3RvcCBvYmplY3QgZ29lcyBvdXQgb2YKICAgICAgLy8gc2NvcGUuCiAgICAgIGF1dG9tYXRpb25JbnRlcm5hbC5lbmFibGVEZXNrdG9wKGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChoYXNMYXN0RXJyb3IoKSkgewogICAgICAgICAgQXV0b21hdGlvblJvb3ROb2RlLmRlc3Ryb3koREVTS1RPUF9UUkVFX0lEKTsKICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIGNhbGxiYWNrKGRlc2t0b3BUcmVlKTsKICAgIH0KICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2dldEZvY3VzJywgZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIGNhbGxiYWNrKGF1dG9tYXRpb25VdGlsLmdldEZvY3VzKCkpOwogIH0pOwoKICBmdW5jdGlvbiByZW1vdmVUcmVlQ2hhbmdlT2JzZXJ2ZXIob2JzZXJ2ZXIpIHsKICAgIGZvciAodmFyIGlkIGluIGF1dG9tYXRpb25VdGlsLnRyZWVDaGFuZ2VPYnNlcnZlck1hcCkgewogICAgICBpZiAoYXV0b21hdGlvblV0aWwudHJlZUNoYW5nZU9ic2VydmVyTWFwW2lkXSA9PSBvYnNlcnZlcikgewogICAgICAgIFJlbW92ZVRyZWVDaGFuZ2VPYnNlcnZlcihpZCk7CiAgICAgICAgZGVsZXRlIGF1dG9tYXRpb25VdGlsLnRyZWVDaGFuZ2VPYnNlcnZlck1hcFtpZF07CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdyZW1vdmVUcmVlQ2hhbmdlT2JzZXJ2ZXInLCBmdW5jdGlvbihvYnNlcnZlcikgewogICAgcmVtb3ZlVHJlZUNoYW5nZU9ic2VydmVyKG9ic2VydmVyKTsKICB9KTsKCiAgZnVuY3Rpb24gYWRkVHJlZUNoYW5nZU9ic2VydmVyKGZpbHRlciwgb2JzZXJ2ZXIpIHsKICAgIHJlbW92ZVRyZWVDaGFuZ2VPYnNlcnZlcihvYnNlcnZlcik7CiAgICB2YXIgaWQgPSBhdXRvbWF0aW9uVXRpbC5uZXh0VHJlZUNoYW5nZU9ic2VydmVySWQrKzsKICAgIEFkZFRyZWVDaGFuZ2VPYnNlcnZlcihpZCwgZmlsdGVyKTsKICAgIGF1dG9tYXRpb25VdGlsLnRyZWVDaGFuZ2VPYnNlcnZlck1hcFtpZF0gPSBvYnNlcnZlcjsKICB9CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2FkZFRyZWVDaGFuZ2VPYnNlcnZlcicsCiAgICAgIGZ1bmN0aW9uKGZpbHRlciwgb2JzZXJ2ZXIpIHsKICAgIGFkZFRyZWVDaGFuZ2VPYnNlcnZlcihmaWx0ZXIsIG9ic2VydmVyKTsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3NldERvY3VtZW50U2VsZWN0aW9uJywgZnVuY3Rpb24ocGFyYW1zKSB7CiAgICB2YXIgYW5jaG9yTm9kZUltcGwgPSBwcml2YXRlcyhwYXJhbXMuYW5jaG9yT2JqZWN0KS5pbXBsOwogICAgdmFyIGZvY3VzTm9kZUltcGwgPSBwcml2YXRlcyhwYXJhbXMuZm9jdXNPYmplY3QpLmltcGw7CiAgICBpZiAoYW5jaG9yTm9kZUltcGwudHJlZUlEICE9PSBmb2N1c05vZGVJbXBsLnRyZWVJRCkKICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWxlY3Rpb24gYW5jaG9yIGFuZCBmb2N1cyBtdXN0IGJlIGluIHRoZSBzYW1lIHRyZWUuJyk7CiAgICBpZiAoYW5jaG9yTm9kZUltcGwudHJlZUlEID09PSBERVNLVE9QX1RSRUVfSUQpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2UgQXV0b21hdGlvbk5vZGUuc2V0U2VsZWN0aW9uIHRvIHNldCB0aGUgc2VsZWN0aW9uICcgKwogICAgICAgICAgJ2luIHRoZSBkZXNrdG9wIHRyZWUuJyk7CiAgICB9CiAgICBhdXRvbWF0aW9uSW50ZXJuYWwucGVyZm9ybUFjdGlvbih7IHRyZWVJRDogYW5jaG9yTm9kZUltcGwudHJlZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aW9uTm9kZUlEOiBhbmNob3JOb2RlSW1wbC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZTogJ3NldFNlbGVjdGlvbid9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmb2N1c05vZGVJRDogZm9jdXNOb2RlSW1wbC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yT2Zmc2V0OiBwYXJhbXMuYW5jaG9yT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c09mZnNldDogcGFyYW1zLmZvY3VzT2Zmc2V0IH0pOwogIH0pOwoKfSk7CgphdXRvbWF0aW9uSW50ZXJuYWwub25DaGlsZFRyZWVJRC5hZGRMaXN0ZW5lcihmdW5jdGlvbihjaGlsZFRyZWVJZCkgewogIHZhciB0YXJnZXRUcmVlID0gQXV0b21hdGlvblJvb3ROb2RlLmdldChjaGlsZFRyZWVJZCk7CgogIC8vIElmIHRoZSB0cmVlIGlzIGFscmVhZHkgbG9kZWQsIG9yIGlmIHdlIHByZXZpb3VzbHkgcmVxdWVzdGVkIGl0IGJlIGxvYWRlZAogIC8vIChpLmUuIGhhdmUgYSBjYWxsYmFjayBmb3IgaXQpLCBkb24ndCB0cnkgdG8gZG8gc28gYWdhaW4uCiAgaWYgKHRhcmdldFRyZWUgfHwgaWRUb0NhbGxiYWNrW2NoaWxkVHJlZUlkXSkKICAgIHJldHVybjsKCiAgLy8gQSBXZWJWaWV3IGluIHRoZSBkZXNrdG9wIHRyZWUgaGFzIGEgZGlmZmVyZW50IEFYIHRyZWUgYXMgaXRzIGNoaWxkLgogIC8vIFdoZW4gd2UgZW5jb3VudGVyIGEgV2ViVmlldyB3aXRoIGEgY2hpbGQgQVggdHJlZSBpZCB0aGF0IHdlIGRvbid0CiAgLy8gY3VycmVudGx5IGhhdmUgY2FjaGVkLCBleHBsaWNpdGx5IHJlcXVlc3QgdGhhdCBBWCB0cmVlIGZyb20gdGhlCiAgLy8gYnJvd3NlciBwcm9jZXNzIGFuZCBzZXQgdXAgYSBjYWxsYmFjayB3aGVuIGl0IGxvYWRzIHRvIGF0dGFjaCB0aGF0CiAgLy8gdHJlZSBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZSBhbmQgZmlyZSBhcHByb3ByaWF0ZSBldmVudHMuCiAgYXV0b21hdGlvblV0aWwuc3RvcmVUcmVlQ2FsbGJhY2soY2hpbGRUcmVlSWQsIGZ1bmN0aW9uKHJvb3QpIHsKICAgIHByaXZhdGVzKHJvb3QpLmltcGwuZGlzcGF0Y2hFdmVudCgnbG9hZENvbXBsZXRlJywgJ3BhZ2UnKTsKICB9LCB0cnVlKTsKCiAgYXV0b21hdGlvbkludGVybmFsLmVuYWJsZUZyYW1lKGNoaWxkVHJlZUlkKTsKfSk7CgphdXRvbWF0aW9uSW50ZXJuYWwub25UcmVlQ2hhbmdlLmFkZExpc3RlbmVyKGZ1bmN0aW9uKG9ic2VydmVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUeXBlKSB7CiAgdmFyIHRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0T3JDcmVhdGUodHJlZUlEKTsKICBpZiAoIXRyZWUpCiAgICByZXR1cm47CgogIHZhciBub2RlID0gcHJpdmF0ZXModHJlZSkuaW1wbC5nZXQobm9kZUlEKTsKICBpZiAoIW5vZGUpCiAgICByZXR1cm47CgogIHZhciBvYnNlcnZlciA9IGF1dG9tYXRpb25VdGlsLnRyZWVDaGFuZ2VPYnNlcnZlck1hcFtvYnNlcnZlcklEXTsKICBpZiAoIW9ic2VydmVyKQogICAgcmV0dXJuOwoKICB0cnkgewogICAgb2JzZXJ2ZXIoe3RhcmdldDogbm9kZSwgdHlwZTogY2hhbmdlVHlwZX0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIGV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlKCdFcnJvciBpbiB0cmVlIGNoYW5nZSBvYnNlcnZlciBmb3IgJyArCiAgICAgICAgdHJlZUNoYW5nZS50eXBlLCBlKTsKICB9Cn0pOwoKYXV0b21hdGlvbkludGVybmFsLm9uTm9kZXNSZW1vdmVkLmFkZExpc3RlbmVyKGZ1bmN0aW9uKHRyZWVJRCwgbm9kZUlEcykgewogIHZhciB0cmVlID0gQXV0b21hdGlvblJvb3ROb2RlLmdldE9yQ3JlYXRlKHRyZWVJRCk7CiAgaWYgKCF0cmVlKQogICAgcmV0dXJuOwoKICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVJRHMubGVuZ3RoOyBpKyspIHsKICAgIHByaXZhdGVzKHRyZWUpLmltcGwucmVtb3ZlKG5vZGVJRHNbaV0pOwogIH0KfSk7CgovKioKICogRGlzcGF0Y2ggYWNjZXNzaWJpbGl0eSBldmVudHMgZmlyZWQgb24gaW5kaXZpZHVhbCBub2RlcyB0byBpdHMKICogY29ycmVzcG9uZGluZyBBdXRvbWF0aW9uTm9kZS4gSGFuZGxlIGZvY3VzIGV2ZW50cyBzcGVjaWFsbHkKICogKHNlZSBiZWxvdykuCiAqLwphdXRvbWF0aW9uSW50ZXJuYWwub25BY2Nlc3NpYmlsaXR5RXZlbnQuYWRkTGlzdGVuZXIoZnVuY3Rpb24oZXZlbnRQYXJhbXMpIHsKICB2YXIgaWQgPSBldmVudFBhcmFtcy50cmVlSUQ7CiAgdmFyIHRhcmdldFRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0T3JDcmVhdGUoaWQpOwogIGlmIChldmVudFBhcmFtcy5ldmVudFR5cGUgPT0gJ2JsdXInKSB7CiAgICAvLyBXb3JrIGFyb3VuZCBhbiBpc3N1ZSB3aGVyZSBDaHJvbWUgc2VuZHMgdXMgJ2JsdXInIGV2ZW50cyBvbiB0aGUKICAgIC8vIHJvb3Qgbm9kZSB3aGVuIG5vdGhpbmcgaGFzIGZvY3VzLCB3ZSBuZWVkIHRvIHRyZWF0IHRob3NlIGFzIGZvY3VzCiAgICAvLyBldmVudHMgYnV0IG90aGVyd2lzZSBub3QgaGFuZGxlIGJsdXIgZXZlbnRzIHNwZWNpYWxseS4KICAgIHZhciBub2RlID0gcHJpdmF0ZXModGFyZ2V0VHJlZSkuaW1wbC5nZXQoZXZlbnRQYXJhbXMudGFyZ2V0SUQpOwogICAgaWYgKG5vZGUgPT0gbm9kZS5yb290KQogICAgICBhdXRvbWF0aW9uVXRpbC51cGRhdGVGb2N1c2VkTm9kZU9uQmx1cigpOwogIH0gZWxzZSBpZiAoZXZlbnRQYXJhbXMuZXZlbnRUeXBlID09ICdtZWRpYVN0YXJ0ZWRQbGF5aW5nJyB8fAogICAgICBldmVudFBhcmFtcy5ldmVudFR5cGUgPT0gJ21lZGlhU3RvcHBlZFBsYXlpbmcnKSB7CiAgICAvLyBUaGVzZSBldmVudHMgYXJlIGdsb2JhbCB0byB0aGUgdHJlZS4KICAgIGV2ZW50UGFyYW1zLnRhcmdldElEID0gcHJpdmF0ZXModGFyZ2V0VHJlZSkuaW1wbC5pZDsKICB9IGVsc2UgewogICAgdmFyIHByZXZpb3VzRm9jdXNlZE5vZGUgPSBhdXRvbWF0aW9uVXRpbC5mb2N1c2VkTm9kZTsKICAgIGF1dG9tYXRpb25VdGlsLnVwZGF0ZUZvY3VzZWROb2RlKCk7CgogICAgLy8gRmlyZSBmb2N1cyBldmVudHMgaWYgbmVjZXNzYXJ5LgogICAgaWYgKGF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlICYmCiAgICAgICAgYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUgIT0gcHJldmlvdXNGb2N1c2VkTm9kZSkgewogICAgICB2YXIgZXZlbnRQYXJhbXNDb3B5ID0ge307CiAgICAgIGZvciAodmFyIGtleSBpbiBldmVudFBhcmFtcykKICAgICAgICBldmVudFBhcmFtc0NvcHlba2V5XSA9IGV2ZW50UGFyYW1zW2tleV07CiAgICAgIGV2ZW50UGFyYW1zQ29weVsnZXZlbnRUeXBlJ10gPSAnZm9jdXMnOwogICAgICBldmVudFBhcmFtc0NvcHlbJ3RyZWVJRCddID0KICAgICAgICAgIHByaXZhdGVzKGF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlLnJvb3QpLmltcGwudHJlZUlEOwogICAgICBldmVudFBhcmFtc0NvcHlbJ3RhcmdldElEJ10gPQogICAgICAgICAgcHJpdmF0ZXMoYXV0b21hdGlvblV0aWwuZm9jdXNlZE5vZGUpLmltcGwuaWQ7CiAgICAgIHByaXZhdGVzKGF1dG9tYXRpb25VdGlsLmZvY3VzZWROb2RlLnJvb3QpCiAgICAgICAgICAuaW1wbC5vbkFjY2Vzc2liaWxpdHlFdmVudChldmVudFBhcmFtc0NvcHkpOwogICAgfQogIH0KCiAgLy8gTm90ZSB0aGF0IGZvY3VzIHR5cGUgZXZlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYWJvdmUgaWYgdGhlcmUgd2FzIGEKICAvLyBmb2N1c2VkIG5vZGUuIEFsbCBvdGhlciBldmVudHMsIGV2ZW4gbm9uLWZvY3VzIGV2ZW50cyB0aGF0IHRyaWdnZXJlZCBhCiAgLy8gZm9jdXMgZGlzcGF0Y2gsIHN0aWxsIG5lZWQgdG8gaGF2ZSB0aGVpciBvcmlnaW5hbCBldmVudCBmaXJlZC4KICBpZiAoKCFhdXRvbWF0aW9uVXRpbC5mb2N1c2VkTm9kZSB8fCBldmVudFBhcmFtcy5ldmVudFR5cGUgIT0gJ2ZvY3VzJykgJiYKICAgICAgIXByaXZhdGVzKHRhcmdldFRyZWUpLmltcGwub25BY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnRQYXJhbXMpKQogICAgcmV0dXJuOwoKICAvLyBJZiB3ZSdyZSBub3Qgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGdldFRyZWUoKSwgd2UgY2FuIGVhcmx5IG91dCBoZXJlLgogIGlmICghKGlkIGluIGlkVG9DYWxsYmFjaykpCiAgICByZXR1cm47CgogIC8vIFdlIHVzdWFsbHkgZ2V0IGEgJ3BsYWNlaG9sZGVyJyB0cmVlIGZpcnN0LCB3aGljaCBkb2Vzbid0IGhhdmUgYW55IHVybAogIC8vIGF0dHJpYnV0ZSBvciBjaGlsZCBub2Rlcy4gSWYgd2UndmUgZ290IHRoYXQsIHdhaXQgZm9yIHRoZSBmdWxsIHRyZWUgYmVmb3JlCiAgLy8gY2FsbGluZyB0aGUgY2FsbGJhY2suCiAgLy8gVE9ETyhkbWF6em9uaSk6IERvbid0IHNlbmQgZG93biBwbGFjZWhvbGRlciAoY3JidWcuY29tLzM5NzU1MykKICBpZiAoaWQgIT0gREVTS1RPUF9UUkVFX0lEICYmICF0YXJnZXRUcmVlLnVybCAmJgogICAgICB0YXJnZXRUcmVlLmNoaWxkcmVuLmxlbmd0aCA9PSAwKQogICAgcmV0dXJuOwoKICAvLyBJZiB0aGUgdHJlZSB3YXNuJ3QgYXZhaWxhYmxlIHdoZW4gZ2V0VHJlZSgpIHdhcyBjYWxsZWQsIHRoZSBjYWxsYmFjayB3aWxsCiAgLy8gaGF2ZSBiZWVuIGNhY2hlZCBpbiBpZFRvQ2FsbGJhY2ssIHNvIGNhbGwgYW5kIGRlbGV0ZSBpdCBub3cgdGhhdCB3ZQogIC8vIGhhdmUgdGhlIGNvbXBsZXRlIHRyZWUuCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZFRvQ2FsbGJhY2tbaWRdLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgY2FsbGJhY2sgPSBpZFRvQ2FsbGJhY2tbaWRdW2ldOwogICAgY2FsbGJhY2sodGFyZ2V0VHJlZSk7CiAgfQogIGRlbGV0ZSBpZFRvQ2FsbGJhY2tbaWRdOwp9KTsKCmF1dG9tYXRpb25JbnRlcm5hbC5vbkFjY2Vzc2liaWxpdHlUcmVlRGVzdHJveWVkLmFkZExpc3RlbmVyKGZ1bmN0aW9uKGlkKSB7CiAgLy8gRGVzdHJveSB0aGUgQXV0b21hdGlvblJvb3ROb2RlLgogIHZhciB0YXJnZXRUcmVlID0gQXV0b21hdGlvblJvb3ROb2RlLmdldChpZCk7CiAgaWYgKHRhcmdldFRyZWUpIHsKICAgIHByaXZhdGVzKHRhcmdldFRyZWUpLmltcGwuZGVzdHJveSgpOwogICAgQXV0b21hdGlvblJvb3ROb2RlLmRlc3Ryb3koaWQpOwogIH0gZWxzZSB7CiAgICBsb2dnaW5nLldBUk5JTkcoJ25vIHRhcmdldFRyZWUgdG8gZGVzdHJveScpOwogIH0KCiAgLy8gRGVzdHJveSB0aGUgbmF0aXZlIGNhY2hlIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAgRGVzdHJveUFjY2Vzc2liaWxpdHlUcmVlKGlkKTsKfSk7CgphdXRvbWF0aW9uSW50ZXJuYWwub25BY2Nlc3NpYmlsaXR5VHJlZVNlcmlhbGl6YXRpb25FcnJvci5hZGRMaXN0ZW5lcigKICAgIGZ1bmN0aW9uKGlkKSB7CiAgYXV0b21hdGlvbkludGVybmFsLmVuYWJsZUZyYW1lKGlkKTsKfSk7CgphdXRvbWF0aW9uSW50ZXJuYWwub25BY3Rpb25SZXN1bHQuYWRkTGlzdGVuZXIoCiAgICBmdW5jdGlvbih0cmVlSUQsIHJlcXVlc3RJRCwgcmVzdWx0KSB7CiAgdmFyIHRhcmdldFRyZWUgPSBBdXRvbWF0aW9uUm9vdE5vZGUuZ2V0KHRyZWVJRCk7CiAgaWYgKCF0YXJnZXRUcmVlKQogICAgcmV0dXJuOwoKICBwcml2YXRlcyh0YXJnZXRUcmVlKS5pbXBsLm9uQWN0aW9uUmVzdWx0KHJlcXVlc3RJRCwgcmVzdWx0KTsKICAgIH0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYXV0b21hdGlvbi5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnZhciB1dGlscyA9IHJlcXVpcmUoJ3V0aWxzJyk7CgpmdW5jdGlvbiBBdXRvbWF0aW9uRXZlbnRJbXBsKHR5cGUsIHRhcmdldCwgZXZlbnRGcm9tKSB7CiAgdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZTsKICB0aGlzLnR5cGUgPSB0eXBlOwogIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogIHRoaXMuZXZlbnRQaGFzZSA9IEV2ZW50Lk5PTkU7CiAgdGhpcy5ldmVudEZyb20gPSBldmVudEZyb207Cn0KCkF1dG9tYXRpb25FdmVudEltcGwucHJvdG90eXBlID0gewogIF9fcHJvdG9fXzogbnVsbCwKICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlOwogIH0sCn07CgpmdW5jdGlvbiBBdXRvbWF0aW9uRXZlbnQoKSB7CiAgcHJpdmF0ZXMoQXV0b21hdGlvbkV2ZW50KS5jb25zdHJ1Y3RQcml2YXRlKHRoaXMsIGFyZ3VtZW50cyk7Cn0KdXRpbHMuZXhwb3NlKEF1dG9tYXRpb25FdmVudCwgQXV0b21hdGlvbkV2ZW50SW1wbCwgewogIGZ1bmN0aW9uczogWwogICAgJ3N0b3BQcm9wYWdhdGlvbicsCiAgXSwKICByZWFkb25seTogWwogICAgJ3R5cGUnLAogICAgJ3RhcmdldCcsCiAgICAnZXZlbnRQaGFzZScsCiAgICAnZXZlbnRGcm9tJywKICBdLAp9KTsKCmV4cG9ydHMuJHNldCgnQXV0b21hdGlvbkV2ZW50JywgQXV0b21hdGlvbkV2ZW50KTsKLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnZhciBBdXRvbWF0aW9uRXZlbnQgPSByZXF1aXJlKCdhdXRvbWF0aW9uRXZlbnQnKS5BdXRvbWF0aW9uRXZlbnQ7CnZhciBhdXRvbWF0aW9uSW50ZXJuYWwgPQogICAgZ2V0SW50ZXJuYWxBcGkgPwogICAgICAgIGdldEludGVybmFsQXBpKCdhdXRvbWF0aW9uSW50ZXJuYWwnKSA6CiAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdhdXRvbWF0aW9uSW50ZXJuYWwnKS5nZW5lcmF0ZSgpOwp2YXIgZXhjZXB0aW9uSGFuZGxlciA9IHJlcXVpcmUoJ3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyJyk7Cgp2YXIgbmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2F1dG9tYXRpb25JbnRlcm5hbCcpOwoKdmFyIElzSW50ZXJhY3RQZXJtaXR0ZWQgPSBuYXRpdmVzLklzSW50ZXJhY3RQZXJtaXR0ZWQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgaWQgb2YgdGhlIHJvb3Qgbm9kZS4KICovCnZhciBHZXRSb290SUQgPSBuYXRpdmVzLkdldFJvb3RJRDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQuCiAqLwp2YXIgR2V0RG9jVGl0bGUgPSBuYXRpdmVzLkdldERvY1RpdGxlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHJldHVybiB7P3N0cmluZ30gVGhlIHVybCBvZiB0aGUgZG9jdW1lbnQuCiAqLwp2YXIgR2V0RG9jVVJMID0gbmF0aXZlcy5HZXREb2NVUkw7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZG9jdW1lbnQgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCiAqLwp2YXIgR2V0RG9jTG9hZGVkID0gbmF0aXZlcy5HZXREb2NMb2FkZWQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgbG9hZGluZyBwcm9ncmVzcywgZnJvbSAwLjAgdG8gMS4wIChmdWxseSBsb2FkZWQpLgogKi8KdmFyIEdldERvY0xvYWRpbmdQcm9ncmVzcyA9CiAgICBuYXRpdmVzLkdldERvY0xvYWRpbmdQcm9ncmVzczsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBJRCBvZiB0aGUgc2VsZWN0aW9uIGFuY2hvciBvYmplY3QuCiAqLwp2YXIgR2V0QW5jaG9yT2JqZWN0SUQgPSBuYXRpdmVzLkdldEFuY2hvck9iamVjdElEOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIHNlbGVjdGlvbiBhbmNob3Igb2Zmc2V0LgogKi8KdmFyIEdldEFuY2hvck9mZnNldCA9IG5hdGl2ZXMuR2V0QW5jaG9yT2Zmc2V0OwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHJldHVybiB7P3N0cmluZ30gVGhlIHNlbGVjdGlvbiBhbmNob3IgYWZmaW5pdHkuCiAqLwp2YXIgR2V0QW5jaG9yQWZmaW5pdHkgPSBuYXRpdmVzLkdldEFuY2hvckFmZmluaXR5OwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIElEIG9mIHRoZSBzZWxlY3Rpb24gZm9jdXMgb2JqZWN0LgogKi8KdmFyIEdldEZvY3VzT2JqZWN0SUQgPSBuYXRpdmVzLkdldEZvY3VzT2JqZWN0SUQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgc2VsZWN0aW9uIGZvY3VzIG9mZnNldC4KICovCnZhciBHZXRGb2N1c09mZnNldCA9IG5hdGl2ZXMuR2V0Rm9jdXNPZmZzZXQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgc2VsZWN0aW9uIGZvY3VzIGFmZmluaXR5LgogKi8KdmFyIEdldEZvY3VzQWZmaW5pdHkgPSBuYXRpdmVzLkdldEZvY3VzQWZmaW5pdHk7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSBpZCBvZiB0aGUgbm9kZSdzIHBhcmVudCwgb3IgdW5kZWZpbmVkIGlmIGl0J3MgdGhlCiAqICAgIHJvb3Qgb2YgaXRzIHRyZWUgb3IgaWYgdGhlIHRyZWUgb3Igbm9kZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0UGFyZW50SUQgPSBuYXRpdmVzLkdldFBhcmVudElEOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoZSBub2RlLCBvciB1bmRlZmluZWQgaWYKICogICAgIHRoZSB0cmVlIG9yIG5vZGUgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldENoaWxkQ291bnQgPSBuYXRpdmVzLkdldENoaWxkQ291bnQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7bnVtYmVyfSBjaGlsZEluZGV4IEFuIGluZGV4IG9mIGEgY2hpbGQgb2YgdGhpcyBub2RlLgogKiBAcmV0dXJuIHs/bnVtYmVyfSBUaGUgaWQgb2YgdGhlIGNoaWxkIGF0IHRoZSBnaXZlbiBpbmRleCwgb3IgdW5kZWZpbmVkCiAqICAgICBpZiB0aGUgdHJlZSBvciBub2RlIG9yIGNoaWxkIGF0IHRoYXQgaW5kZXggd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldENoaWxkSURBdEluZGV4ID0gbmF0aXZlcy5HZXRDaGlsZElEQXRJbmRleDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIGlkcyBvZiB0aGUgY2hpbGRyZW4gb2YgdGhlIG5vZGUsIG9yIHVuZGVmaW5lZAogKiAgICAgaWYgdGhlIHRyZWUgb3Igbm9kZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0Q2hpbGRJZHMgPSBuYXRpdmVzLkdldENoaWxkSURzOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHs/T2JqZWN0fSBBbiBvYmplY3QgbWFwcGluZyBodG1sIGF0dHJpYnV0ZXMgdG8gdmFsdWVzLgogKi8KdmFyIEdldEh0bWxBdHRyaWJ1dGVzID0gbmF0aXZlcy5HZXRIdG1sQXR0cmlidXRlczsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7P251bWJlcn0gVGhlIGluZGV4IG9mIHRoaXMgbm9kZSBpbiBpdHMgcGFyZW50LCBvciB1bmRlZmluZWQgaWYKICogICAgIHRoZSB0cmVlIG9yIG5vZGUgb3Igbm9kZSBwYXJlbnQgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldEluZGV4SW5QYXJlbnQgPSBuYXRpdmVzLkdldEluZGV4SW5QYXJlbnQ7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4gez9PYmplY3R9IEFuIG9iamVjdCB3aXRoIGEgc3RyaW5nIGtleSBmb3IgZXZlcnkgc3RhdGUgZmxhZyBzZXQsCiAqICAgICBvciB1bmRlZmluZWQgaWYgdGhlIHRyZWUgb3Igbm9kZSBvciBub2RlIHBhcmVudCB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0U3RhdGUgPSBuYXRpdmVzLkdldFN0YXRlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByZXN0cmljdGlvbiwgb25lIG9mCiAqICJkaXNhYmxlZCIsICJyZWFkT25seSIgb3IgdW5kZWZpbmVkIGlmIGVuYWJsZWQgb3Igb3RoZXIgb2JqZWN0IG5vdCBkaXNhYmxlZAogKi8KdmFyIEdldFJlc3RyaWN0aW9uID0gbmF0aXZlcy5HZXRSZXN0cmljdGlvbjsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7c3RyaW5nfSBUaGUgY2hlY2tlZCBzdGF0ZSwgYXMgdW5kZWZpbmVkLCAidHJ1ZSIsICJmYWxzZSIgb3IgIm1peGVkIi4KICovCnZhciBHZXRDaGVja2VkID0gbmF0aXZlcy5HZXRDaGVja2VkOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByb2xlIG9mIHRoZSBub2RlLCBvciB1bmRlZmluZWQgaWYgdGhlIHRyZWUgb3IKICogICAgIG5vZGUgd2Fzbid0IGZvdW5kLgogKi8KdmFyIEdldFJvbGUgPSBuYXRpdmVzLkdldFJvbGU7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEByZXR1cm4gez9hdXRvbWF0aW9uLlJlY3R9IFRoZSBsb2NhdGlvbiBvZiB0aGUgbm9kZSwgb3IgdW5kZWZpbmVkIGlmCiAqICAgICB0aGUgdHJlZSBvciBub2RlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRMb2NhdGlvbiA9IG5hdGl2ZXMuR2V0TG9jYXRpb247CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydEluZGV4IFRoZSBzdGFydCBpbmRleCBvZiB0aGUgcmFuZ2UuCiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRJbmRleCBUaGUgZW5kIGluZGV4IG9mIHRoZSByYW5nZS4KICogQHJldHVybiB7P2F1dG9tYXRpb24uUmVjdH0gVGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgc3VicmFuZ2Ugb2YgdGhpcyBub2RlLAogKiAgICAgb3IgdGhlIGxvY2F0aW9uIGlmIHRoZXJlIGFyZSBubyBzdWJyYW5nZXMsIG9yIHVuZGVmaW5lZCBpZgogKiAgICAgdGhlIHRyZWUgb3Igbm9kZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0Qm91bmRzRm9yUmFuZ2UgPSBuYXRpdmVzLkdldEJvdW5kc0ZvclJhbmdlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHs/YXV0b21hdGlvbi5SZWN0fSBUaGUgdW5jbGlwcGVkIGxvY2F0aW9uIG9mIHRoZSBub2RlLCBvcgogKiB1bmRlZmluZWQgaWYgdGhlIHRyZWUgb3Igbm9kZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0VW5jbGlwcGVkTG9jYXRpb24gPSBuYXRpdmVzLkdldFVuY2xpcHBlZExvY2F0aW9uOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHshQXJyYXk8bnVtYmVyPn0gVGhlIHRleHQgb2Zmc2V0IHdoZXJlIGVhY2ggbGluZSBzdGFydHMsIG9yIGFuIGVtcHR5CiAqICAgICBhcnJheSBpZiB0aGlzIG5vZGUgaGFzIG5vIHRleHQgY29udGVudCwgb3IgdW5kZWZpbmVkIGlmIHRoZSB0cmVlIG9yIG5vZGUKICogICAgIHdhcyBub3QgZm91bmQuCiAqLwp2YXIgR2V0TGluZVN0YXJ0T2Zmc2V0cyA9IHJlcXVpcmVOYXRpdmUoCiAgICAnYXV0b21hdGlvbkludGVybmFsJykuR2V0TGluZVN0YXJ0T2Zmc2V0czsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYSBzdHJpbmcgYXR0cmlidXRlLgogKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUsIG9yIHVuZGVmaW5lZCBpZiB0aGUgdHJlZSwKICogICAgIG5vZGUsIG9yIGF0dHJpYnV0ZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0U3RyaW5nQXR0cmlidXRlID0gbmF0aXZlcy5HZXRTdHJpbmdBdHRyaWJ1dGU7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZS4KICogQHJldHVybiB7P2Jvb2xlYW59IFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSB0cmVlLAogKiAgICAgbm9kZSwgb3IgYXR0cmlidXRlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRCb29sQXR0cmlidXRlID0gbmF0aXZlcy5HZXRCb29sQXR0cmlidXRlOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSB0cmVlLAogKiAgICAgbm9kZSwgb3IgYXR0cmlidXRlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRJbnRBdHRyaWJ1dGUgPSBuYXRpdmVzLkdldEludEF0dHJpYnV0ZTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLgogKiBAcmV0dXJuIHs/QXJyYXk8bnVtYmVyPn0gVGhlIGlkcyBvZiBub2RlcyB3aG8gaGF2ZSBhIHJlbGF0aW9uc2hpcCBwb2ludGluZwogKiAgICAgdG8gfG5vZGVJRHwgKGEgcmV2ZXJzZSByZWxhdGlvbnNoaXApLgogKi8KdmFyIEdldEludEF0dHJpYnV0ZVJldmVyc2VSZWxhdGlvbnMgPQogICAgbmF0aXZlcy5HZXRJbnRBdHRyaWJ1dGVSZXZlcnNlUmVsYXRpb25zOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcGFyYW0ge3N0cmluZ30gYXR0ciBUaGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUuCiAqIEByZXR1cm4gez9udW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgdW5kZWZpbmVkIGlmIHRoZSB0cmVlLAogKiAgICAgbm9kZSwgb3IgYXR0cmlidXRlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRGbG9hdEF0dHJpYnV0ZSA9IG5hdGl2ZXMuR2V0RmxvYXRBdHRyaWJ1dGU7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZS4KICogQHJldHVybiB7P0FycmF5PG51bWJlcj59IFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgb3IgdW5kZWZpbmVkCiAqICAgICBpZiB0aGUgdHJlZSwgbm9kZSwgb3IgYXR0cmlidXRlIHdhc24ndCBmb3VuZC4KICovCnZhciBHZXRJbnRMaXN0QXR0cmlidXRlID0KICAgIG5hdGl2ZXMuR2V0SW50TGlzdEF0dHJpYnV0ZTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLgogKiBAcmV0dXJuIHs/QXJyYXk8bnVtYmVyPn0gVGhlIGlkcyBvZiBub2RlcyB3aG8gaGF2ZSBhIHJlbGF0aW9uc2hpcCBwb2ludGluZwogKiAgICAgdG8gfG5vZGVJRHwgKGEgcmV2ZXJzZSByZWxhdGlvbnNoaXApLgogKi8KdmFyIEdldEludExpc3RBdHRyaWJ1dGVSZXZlcnNlUmVsYXRpb25zID0KICAgIG5hdGl2ZXMuR2V0SW50TGlzdEF0dHJpYnV0ZVJldmVyc2VSZWxhdGlvbnM7CgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIFRoZSBuYW1lIG9mIGFuIEhUTUwgYXR0cmlidXRlLgogKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUsIG9yIHVuZGVmaW5lZCBpZiB0aGUgdHJlZSwKICogICAgIG5vZGUsIG9yIGF0dHJpYnV0ZSB3YXNuJ3QgZm91bmQuCiAqLwp2YXIgR2V0SHRtbEF0dHJpYnV0ZSA9IG5hdGl2ZXMuR2V0SHRtbEF0dHJpYnV0ZTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7YXV0b21hdGlvbi5OYW1lRnJvbVR5cGV9IFRoZSBzb3VyY2Ugb2YgdGhlIG5vZGUncyBuYW1lLgogKi8KdmFyIEdldE5hbWVGcm9tID0gbmF0aXZlcy5HZXROYW1lRnJvbTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7Ym9vbGVhbn0KICovCnZhciBHZXRCb2xkID0gbmF0aXZlcy5HZXRCb2xkOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHtib29sZWFufQogKi8KdmFyIEdldEl0YWxpYyA9IG5hdGl2ZXMuR2V0SXRhbGljOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHtib29sZWFufQogKi8KdmFyIEdldFVuZGVybGluZSA9IG5hdGl2ZXMuR2V0VW5kZXJsaW5lOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHtib29sZWFufQogKi8KdmFyIEdldExpbmVUaHJvdWdoID0gbmF0aXZlcy5HZXRMaW5lVGhyb3VnaDsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7P0FycmF5PGF1dG9tYXRpb24uQ3VzdG9tQWN0aW9uPn0gTGlzdCBvZiBjdXN0b20gYWN0aW9ucyBvZiB0aGUKICogICAgIG5vZGUuCiAqLwp2YXIgR2V0Q3VzdG9tQWN0aW9ucyA9IG5hdGl2ZXMuR2V0Q3VzdG9tQWN0aW9uczsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7P0FycmF5PHN0cmluZz59IExpc3Qgb2Ygc3RhbmRhcmQgYWN0aW9ucyBvZiB0aGUgbm9kZS4KICovCnZhciBHZXRTdGFuZGFyZEFjdGlvbnMgPSBuYXRpdmVzLkdldFN0YW5kYXJkQWN0aW9uczsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7YXV0b21hdGlvbi5OYW1lRnJvbVR5cGV9IFRoZSBzb3VyY2Ugb2YgdGhlIG5vZGUncyBuYW1lLgogKi8KdmFyIEdldERlZmF1bHRBY3Rpb25WZXJiID0gbmF0aXZlcy5HZXREZWZhdWx0QWN0aW9uVmVyYjsKCgovKioKICogQHBhcmFtIHtudW1iZXJ9IGF4VHJlZUlEIFRoZSBpZCBvZiB0aGUgYWNjZXNzaWJpbGl0eSB0cmVlLgogKiBAcGFyYW0ge251bWJlcn0gbm9kZUlEIFRoZSBpZCBvZiBhIG5vZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2hTdHIKICogQHBhcmFtIHtib29sZWFufSBiYWNrd2FyZAogKiBAcmV0dXJuIHt7dHJlZUlkOiBudW1iZXIsIG5vZGVJZDogbnVtYmVyfX0KICovCnZhciBHZXROZXh0VGV4dE1hdGNoID0gbmF0aXZlcy5HZXROZXh0VGV4dE1hdGNoOwoKLyoqCiAqIEBwYXJhbSB7bnVtYmVyfSBheFRyZWVJRCBUaGUgaWQgb2YgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZS4KICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJRCBUaGUgaWQgb2YgYSBub2RlLgogKiBAcmV0dXJuIHs/QXJyYXk8bnVtYmVyPn0gQSBsaXN0IG9mIGNvbHVtbiBoZWFkZXIgaWRzLgoKICogQHJldHVybiB7P251bWJlcn0gVGhlIGlkIG9mIHRoZSBjb2x1bW4gaGVhZGVyLCBpZiBpdCBleGlzdHMuCiAqLwp2YXIgR2V0VGFibGVDZWxsQ29sdW1uSGVhZGVycyA9IG5hdGl2ZXMuR2V0VGFibGVDZWxsQ29sdW1uSGVhZGVyczsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gYXhUcmVlSUQgVGhlIGlkIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUuCiAqIEBwYXJhbSB7bnVtYmVyfSBub2RlSUQgVGhlIGlkIG9mIGEgbm9kZS4KICogQHJldHVybiB7P0FycmF5PG51bWJlcj59IEEgbGlzdCBvZiByb3cgaGVhZGVyIGlkcy4KICovCnZhciBHZXRUYWJsZUNlbGxSb3dIZWFkZXJzID0gbmF0aXZlcy5HZXRUYWJsZUNlbGxSb3dIZWFkZXJzOwoKdmFyIGxvZ2dpbmcgPSByZXF1aXJlTmF0aXZlKCdsb2dnaW5nJyk7CnZhciB1dGlscyA9IHJlcXVpcmUoJ3V0aWxzJyk7CgovKioKICogQSBzaW5nbGUgbm9kZSBpbiB0aGUgQXV0b21hdGlvbiB0cmVlLgogKiBAcGFyYW0ge0F1dG9tYXRpb25Sb290Tm9kZUltcGx9IHJvb3QgVGhlIHJvb3Qgb2YgdGhlIHRyZWUuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gQXV0b21hdGlvbk5vZGVJbXBsKHJvb3QpIHsKICB0aGlzLnJvb3RJbXBsID0gcm9vdDsKICB0aGlzLmxpc3RlbmVycyA9IHtfX3Byb3RvX186IG51bGx9Owp9CgpBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlID0gewogIF9fcHJvdG9fXzogbnVsbCwKICB0cmVlSUQ6IC0xLAogIGlkOiAtMSwKICBpc1Jvb3ROb2RlOiBmYWxzZSwKCiAgZGV0YWNoOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucm9vdEltcGwgPSBudWxsOwogICAgdGhpcy5saXN0ZW5lcnMgPSB7X19wcm90b19fOiBudWxsfTsKICB9LAoKICBnZXQgcm9vdCgpIHsKICAgIHJldHVybiB0aGlzLnJvb3RJbXBsICYmIHRoaXMucm9vdEltcGwud3JhcHBlcjsKICB9LAoKICBnZXQgcGFyZW50KCkgewogICAgdmFyIGluZm8gPSBHZXRQYXJlbnRJRCh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICBpZiAoIWluZm8pCiAgICAgIHJldHVybjsKICAgIHJldHVybiBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmdldE5vZGVGcm9tVHJlZShpbmZvLnRyZWVJZCwgaW5mby5ub2RlSWQpOwogIH0sCgogIGdldCBodG1sQXR0cmlidXRlcygpIHsKICAgIHJldHVybiBHZXRIdG1sQXR0cmlidXRlcyh0aGlzLnRyZWVJRCwgdGhpcy5pZCkgfHwge307CiAgfSwKCiAgZ2V0IHN0YXRlKCkgewogICAgcmV0dXJuIEdldFN0YXRlKHRoaXMudHJlZUlELCB0aGlzLmlkKSB8fCB7fTsKICB9LAoKICBnZXQgcm9sZSgpIHsKICAgIHJldHVybiBHZXRSb2xlKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgcmVzdHJpY3Rpb24oKSB7CiAgICByZXR1cm4gR2V0UmVzdHJpY3Rpb24odGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGdldCBjaGVja2VkKCkgewogICAgcmV0dXJuIEdldENoZWNrZWQodGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGdldCBsb2NhdGlvbigpIHsKICAgIHJldHVybiBHZXRMb2NhdGlvbih0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgYm91bmRzRm9yUmFuZ2U6IGZ1bmN0aW9uKHN0YXJ0SW5kZXgsIGVuZEluZGV4KSB7CiAgICByZXR1cm4gR2V0Qm91bmRzRm9yUmFuZ2UodGhpcy50cmVlSUQsIHRoaXMuaWQsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICB9LAoKICBnZXQgdW5jbGlwcGVkTG9jYXRpb24oKSB7CiAgICB2YXIgcmVzdWx0ID0gR2V0VW5jbGlwcGVkTG9jYXRpb24odGhpcy50cmVlSUQsIHRoaXMuaWQpOwogICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKQogICAgICByZXN1bHQgPSBHZXRMb2NhdGlvbih0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0sCgogIGdldCBpbmRleEluUGFyZW50KCkgewogICAgcmV0dXJuIEdldEluZGV4SW5QYXJlbnQodGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGdldCBsaW5lU3RhcnRPZmZzZXRzKCkgewogICAgcmV0dXJuIEdldExpbmVTdGFydE9mZnNldHModGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGdldCBjaGlsZFRyZWUoKSB7CiAgICB2YXIgY2hpbGRUcmVlSUQgPSBHZXRJbnRBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsICdjaGlsZFRyZWVJZCcpOwogICAgaWYgKGNoaWxkVHJlZUlEKQogICAgICByZXR1cm4gQXV0b21hdGlvblJvb3ROb2RlSW1wbC5nZXQoY2hpbGRUcmVlSUQpOwogIH0sCgogIGdldCBmaXJzdENoaWxkKCkgewogICAgaWYgKEdldENoaWxkQ291bnQodGhpcy50cmVlSUQsIHRoaXMuaWQpID09IDApCiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB2YXIgaW5mbyA9IEdldENoaWxkSURBdEluZGV4KHRoaXMudHJlZUlELCB0aGlzLmlkLCAwKTsKICAgIGlmIChpbmZvKQogICAgICByZXR1cm4gQXV0b21hdGlvblJvb3ROb2RlSW1wbC5nZXROb2RlRnJvbVRyZWUoaW5mby50cmVlSWQsIGluZm8ubm9kZUlkKTsKICB9LAoKICBnZXQgbGFzdENoaWxkKCkgewogICAgdmFyIGNvdW50ID0gR2V0Q2hpbGRDb3VudCh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICBpZiAoY291bnQgPT0gMCkKICAgICAgcmV0dXJuOwoKICAgIHZhciBpbmZvID0gR2V0Q2hpbGRJREF0SW5kZXgodGhpcy50cmVlSUQsIHRoaXMuaWQsIGNvdW50IC0gMSk7CiAgICBpZiAoaW5mbykKICAgICAgcmV0dXJuIEF1dG9tYXRpb25Sb290Tm9kZUltcGwuZ2V0Tm9kZUZyb21UcmVlKGluZm8udHJlZUlkLCBpbmZvLm5vZGVJZCk7CiAgfSwKCiAgZ2V0IGNoaWxkcmVuKCkgewogICAgdmFyIGluZm8gPSBHZXRDaGlsZElkcyh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICBpZiAoIWluZm8pCiAgICAgIHJldHVybiBbXTsKCiAgICB2YXIgY2hpbGRyZW4gPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5mby5ub2RlSWRzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBjaGlsZElEID0gaW5mby5ub2RlSWRzW2ldOwogICAgICB2YXIgY2hpbGQgPSBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmdldE5vZGVGcm9tVHJlZShpbmZvLnRyZWVJZCwgY2hpbGRJRCk7CiAgICAgIGlmIChjaGlsZCkKICAgICAgICAkQXJyYXkucHVzaChjaGlsZHJlbiwgY2hpbGQpOwogICAgfQogICAgcmV0dXJuIGNoaWxkcmVuOwogIH0sCgogIGdldCBwcmV2aW91c1NpYmxpbmcoKSB7CiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CiAgICBpZiAoIXBhcmVudCkKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIHBhcmVudCA9IHByaXZhdGVzKHBhcmVudCkuaW1wbDsKICAgIHZhciBpbmRleEluUGFyZW50ID0gR2V0SW5kZXhJblBhcmVudCh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICB2YXIgaW5mbyA9IEdldENoaWxkSURBdEluZGV4KHBhcmVudC50cmVlSUQsIHBhcmVudC5pZCwgaW5kZXhJblBhcmVudCAtIDEpOwogICAgaWYgKGluZm8pCiAgICAgIHJldHVybiBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmdldE5vZGVGcm9tVHJlZShpbmZvLnRyZWVJZCwgaW5mby5ub2RlSWQpOwogIH0sCgogIGdldCBuZXh0U2libGluZygpIHsKICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDsKICAgIGlmICghcGFyZW50KQogICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgcGFyZW50ID0gcHJpdmF0ZXMocGFyZW50KS5pbXBsOwogICAgdmFyIGluZGV4SW5QYXJlbnQgPSBHZXRJbmRleEluUGFyZW50KHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIHZhciBpbmZvID0gR2V0Q2hpbGRJREF0SW5kZXgocGFyZW50LnRyZWVJRCwgcGFyZW50LmlkLCBpbmRleEluUGFyZW50ICsgMSk7CiAgICBpZiAoaW5mbykKICAgICAgcmV0dXJuIEF1dG9tYXRpb25Sb290Tm9kZUltcGwuZ2V0Tm9kZUZyb21UcmVlKGluZm8udHJlZUlkLCBpbmZvLm5vZGVJZCk7CiAgfSwKCiAgZ2V0IG5hbWVGcm9tKCkgewogICAgcmV0dXJuIEdldE5hbWVGcm9tKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgYm9sZCgpIHsKICAgIHJldHVybiBHZXRCb2xkKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICB9LAoKICBnZXQgaXRhbGljKCkgewogICAgcmV0dXJuIEdldEl0YWxpYyh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IHVuZGVybGluZSgpIHsKICAgIHJldHVybiBHZXRVbmRlcmxpbmUodGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGdldCBsaW5lVGhyb3VnaCgpIHsKICAgIHJldHVybiBHZXRMaW5lVGhyb3VnaCh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IGN1c3RvbUFjdGlvbnMoKSB7CiAgICByZXR1cm4gR2V0Q3VzdG9tQWN0aW9ucyh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IHN0YW5kYXJkQWN0aW9ucygpIHsKICAgIHJldHVybiBHZXRTdGFuZGFyZEFjdGlvbnModGhpcy50cmVlSUQsIHRoaXMuaWQpOwogIH0sCgogIGdldCBkZWZhdWx0QWN0aW9uVmVyYigpIHsKICAgIHJldHVybiBHZXREZWZhdWx0QWN0aW9uVmVyYih0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgfSwKCiAgZ2V0IHRhYmxlQ2VsbENvbHVtbkhlYWRlcnMoKSB7CiAgICB2YXIgaWRzID0gR2V0VGFibGVDZWxsQ29sdW1uSGVhZGVycyh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICBpZiAoaWRzICYmIHRoaXMucm9vdEltcGwpIHsKICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykKICAgICAgICByZXN1bHQucHVzaCh0aGlzLnJvb3RJbXBsLmdldChpZHNbaV0pKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICB9LAoKICBnZXQgdGFibGVDZWxsUm93SGVhZGVycygpIHsKICAgIHZhciBpZCA9IEdldFRhYmxlQ2VsbFJvd0hlYWRlcnModGhpcy50cmVlSUQsIHRoaXMuaWQpOwogICAgaWYgKGlkcyAmJiB0aGlzLnJvb3RJbXBsKSB7CiAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspCiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5yb290SW1wbC5nZXQoaWRzW2ldKSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgfSwKCiAgZG9EZWZhdWx0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ2RvRGVmYXVsdCcpOwogIH0sCgogIGZvY3VzOiBmdW5jdGlvbigpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ2ZvY3VzJyk7CiAgfSwKCiAgZ2V0SW1hZ2VEYXRhOiBmdW5jdGlvbihtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdnZXRJbWFnZURhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICB7IG1heFdpZHRoOiBtYXhXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IG1heEhlaWdodCB9KTsKICB9LAoKICBoaXRUZXN0OiBmdW5jdGlvbih4LCB5LCBldmVudFRvRmlyZSkgewogICAgdGhpcy5oaXRUZXN0SW50ZXJuYWwoeCwgeSwgZXZlbnRUb0ZpcmUpOwogIH0sCgogIGhpdFRlc3RXaXRoUmVwbHk6IGZ1bmN0aW9uKHgsIHksIG9wdF9jYWxsYmFjaykgewogICAgdGhpcy5oaXRUZXN0SW50ZXJuYWwoeCwgeSwgJ2hpdFRlc3RSZXN1bHQnLCBvcHRfY2FsbGJhY2spOwogIH0sCgogIGhpdFRlc3RJbnRlcm5hbDogZnVuY3Rpb24oeCwgeSwgZXZlbnRUb0ZpcmUsIG9wdF9jYWxsYmFjaykgewogICAgLy8gQ29udmVydCBmcm9tIGdsb2JhbCB0byB0cmVlLXJlbGF0aXZlIGNvb3JkaW5hdGVzLgogICAgdmFyIGxvY2F0aW9uID0gR2V0TG9jYXRpb24odGhpcy50cmVlSUQsIEdldFJvb3RJRCh0aGlzLnRyZWVJRCkpOwogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnaGl0VGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHsgeDogTWF0aC5mbG9vcih4IC0gbG9jYXRpb24ubGVmdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgeTogTWF0aC5mbG9vcih5IC0gbG9jYXRpb24udG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFRvRmlyZTogZXZlbnRUb0ZpcmUgfSwKICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2NhbGxiYWNrKTsKICB9LAoKICBtYWtlVmlzaWJsZTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzY3JvbGxUb01ha2VWaXNpYmxlJyk7CiAgfSwKCiAgcGVyZm9ybUN1c3RvbUFjdGlvbjogZnVuY3Rpb24oY3VzdG9tQWN0aW9uSWQpIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ2N1c3RvbUFjdGlvbicsIHsgY3VzdG9tQWN0aW9uSUQ6IGN1c3RvbUFjdGlvbklkIH0pOwogIH0sCgogIHBlcmZvcm1TdGFuZGFyZEFjdGlvbjogZnVuY3Rpb24oYWN0aW9uKSB7CiAgICB2YXIgc3RhbmRhcmRBY3Rpb25zID0gR2V0U3RhbmRhcmRBY3Rpb25zKHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIGlmICghc3RhbmRhcmRBY3Rpb25zIHx8CiAgICAgICAgIXN0YW5kYXJkQWN0aW9ucy5maW5kKGl0ZW0gPT4gYWN0aW9uID09IGl0ZW0pKSB7CiAgICAgIHRocm93ICdJbmFwcGxpY2FibGUgYWN0aW9uIGZvciBub2RlOiAnICsgYWN0aW9uOwogICAgfQogICAgdGhpcy5wZXJmb3JtQWN0aW9uXyhhY3Rpb24pOwogIH0sCgogIHJlcGxhY2VTZWxlY3RlZFRleHQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBpZiAodGhpcy5zdGF0ZS5lZGl0YWJsZSkgewogICAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdyZXBsYWNlU2VsZWN0ZWRUZXh0JywgeyB2YWx1ZTogdmFsdWV9KTsKICAgIH0KICB9LAoKICByZXN1bWVNZWRpYTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdyZXN1bWVNZWRpYScpOwogIH0sCgogIHNjcm9sbEJhY2t3YXJkOiBmdW5jdGlvbihvcHRfY2FsbGJhY2spIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3Njcm9sbEJhY2t3YXJkJywge30sIG9wdF9jYWxsYmFjayk7CiAgfSwKCiAgc2Nyb2xsRm9yd2FyZDogZnVuY3Rpb24ob3B0X2NhbGxiYWNrKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzY3JvbGxGb3J3YXJkJywge30sIG9wdF9jYWxsYmFjayk7CiAgfSwKCiAgc2Nyb2xsVXA6IGZ1bmN0aW9uKG9wdF9jYWxsYmFjaykgewogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnc2Nyb2xsVXAnLCB7fSwgb3B0X2NhbGxiYWNrKTsKICB9LAoKICBzY3JvbGxEb3duOiBmdW5jdGlvbihvcHRfY2FsbGJhY2spIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3Njcm9sbERvd24nLCB7fSwgb3B0X2NhbGxiYWNrKTsKICB9LAoKICBzY3JvbGxMZWZ0OiBmdW5jdGlvbihvcHRfY2FsbGJhY2spIHsKICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3Njcm9sbExlZnQnLCB7fSwgb3B0X2NhbGxiYWNrKTsKICB9LAoKICBzY3JvbGxSaWdodDogZnVuY3Rpb24ob3B0X2NhbGxiYWNrKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzY3JvbGxSaWdodCcsIHt9LCBvcHRfY2FsbGJhY2spOwogIH0sCgogIHNldFNlbGVjdGlvbjogZnVuY3Rpb24oc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgIGlmICh0aGlzLnN0YXRlLmVkaXRhYmxlKSB7CiAgICAgIHRoaXMucGVyZm9ybUFjdGlvbl8oJ3NldFNlbGVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmb2N1c05vZGVJRDogdGhpcy5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvck9mZnNldDogc3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzT2Zmc2V0OiBlbmRJbmRleCB9KTsKICAgIH0KICB9LAoKICBzZXRTZXF1ZW50aWFsRm9jdXNOYXZpZ2F0aW9uU3RhcnRpbmdQb2ludDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzZXRTZXF1ZW50aWFsRm9jdXNOYXZpZ2F0aW9uU3RhcnRpbmdQb2ludCcpOwogIH0sCgogIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKHRoaXMuc3RhdGUuZWRpdGFibGUpIHsKICAgICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnc2V0VmFsdWUnLCB7IHZhbHVlOiB2YWx1ZX0pOwogICAgfQogIH0sCgogIHNob3dDb250ZXh0TWVudTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzaG93Q29udGV4dE1lbnUnKTsKICB9LAoKICBzdGFydER1Y2tpbmdNZWRpYTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzdGFydER1Y2tpbmdNZWRpYScpOwogIH0sCgogIHN0b3BEdWNraW5nTWVkaWE6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wZXJmb3JtQWN0aW9uXygnc3RvcER1Y2tpbmdNZWRpYScpOwogIH0sCgogIHN1c3BlbmRNZWRpYTogZnVuY3Rpb24oKSB7CiAgICB0aGlzLnBlcmZvcm1BY3Rpb25fKCdzdXNwZW5kTWVkaWEnKTsKICB9LAoKICBkb21RdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvciwgY2FsbGJhY2spIHsKICAgIGlmICghdGhpcy5yb290SW1wbCkKICAgICAgY2FsbGJhY2soKTsKICAgIGF1dG9tYXRpb25JbnRlcm5hbC5xdWVyeVNlbGVjdG9yKAogICAgICB7IHRyZWVJRDogdGhpcy5yb290SW1wbC50cmVlSUQsCiAgICAgICAgYXV0b21hdGlvbk5vZGVJRDogdGhpcy5pZCwKICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IgfSwKICAgICAgJEZ1bmN0aW9uLmJpbmQodGhpcy5kb21RdWVyeVNlbGVjdG9yQ2FsbGJhY2tfLCB0aGlzLCBjYWxsYmFjaykpOwogIH0sCgogIGZpbmQ6IGZ1bmN0aW9uKHBhcmFtcykgewogICAgcmV0dXJuIHRoaXMuZmluZEludGVybmFsXyhwYXJhbXMpOwogIH0sCgogIGZpbmRBbGw6IGZ1bmN0aW9uKHBhcmFtcykgewogICAgcmV0dXJuIHRoaXMuZmluZEludGVybmFsXyhwYXJhbXMsIFtdKTsKICB9LAoKICBtYXRjaGVzOiBmdW5jdGlvbihwYXJhbXMpIHsKICAgIHJldHVybiB0aGlzLm1hdGNoSW50ZXJuYWxfKHBhcmFtcyk7CiAgfSwKCiAgZ2V0TmV4dFRleHRNYXRjaDogZnVuY3Rpb24oc2VhcmNoU3RyLCBiYWNrd2FyZCkgewogICAgdmFyIGluZm8gPSBHZXROZXh0VGV4dE1hdGNoKHRoaXMudHJlZUlELCB0aGlzLmlkLCBzZWFyY2hTdHIsIGJhY2t3YXJkKTsKCiAgICBpZiAoIWluZm8pCiAgICAgIHJldHVybjsKCiAgICB2YXIgaW1wbCA9IHByaXZhdGVzKEF1dG9tYXRpb25Sb290Tm9kZUltcGwuZ2V0KGluZm8udHJlZUlkKSkuaW1wbDsKICAgIGlmIChpbXBsKQogICAgICByZXR1cm4gaW1wbC5nZXQoaW5mby5ub2RlSWQpOwogIH0sCgogIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGNhcHR1cmUpIHsKICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrKTsKICAgIGlmICghdGhpcy5saXN0ZW5lcnNbZXZlbnRUeXBlXSkKICAgICAgdGhpcy5saXN0ZW5lcnNbZXZlbnRUeXBlXSA9IFtdOwogICAgJEFycmF5LnB1c2godGhpcy5saXN0ZW5lcnNbZXZlbnRUeXBlXSwgewogICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgIGNhbGxiYWNrOiBjYWxsYmFjaywKICAgICAgY2FwdHVyZTogISFjYXB0dXJlLAogICAgfSk7CiAgfSwKCiAgLy8gVE9ETyhkdHNlbmcvYWJveGhhbGwpOiBDaGVjayB0aGlzIGltcGwgYWdhaW5zdCBzcGVjLgogIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKGV2ZW50VHlwZSwgY2FsbGJhY2spIHsKICAgIGlmICh0aGlzLmxpc3RlbmVyc1tldmVudFR5cGVdKSB7CiAgICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc1tldmVudFR5cGVdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChjYWxsYmFjayA9PT0gbGlzdGVuZXJzW2ldLmNhbGxiYWNrKQogICAgICAgICAgJEFycmF5LnNwbGljZShsaXN0ZW5lcnMsIGksIDEpOwogICAgICB9CiAgICB9CiAgfSwKCiAgdG9KU09OOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB7IHRyZWVJRDogdGhpcy50cmVlSUQsCiAgICAgICAgICAgICBpZDogdGhpcy5pZCwKICAgICAgICAgICAgIHJvbGU6IHRoaXMucm9sZSwKICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRoaXMuYXR0cmlidXRlcyB9OwogIH0sCgogIGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50VHlwZSwgZXZlbnRGcm9tLCBtb3VzZVgsIG1vdXNlWSkgewogICAgdmFyIHBhdGggPSBbXTsKICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDsKICAgIHdoaWxlIChwYXJlbnQpIHsKICAgICAgJEFycmF5LnB1c2gocGF0aCwgcGFyZW50KTsKICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDsKICAgIH0KICAgIHZhciBldmVudCA9IG5ldyBBdXRvbWF0aW9uRXZlbnQoZXZlbnRUeXBlLCB0aGlzLndyYXBwZXIsIGV2ZW50RnJvbSk7CiAgICBldmVudC5tb3VzZVggPSBtb3VzZVg7CiAgICBldmVudC5tb3VzZVkgPSBtb3VzZVk7CgogICAgLy8gRGlzcGF0Y2ggdGhlIGV2ZW50IHRocm91Z2ggdGhlIHByb3BhZ2F0aW9uIHBhdGggaW4gdGhyZWUgcGhhc2VzOgogICAgLy8gLSBjYXB0dXJpbmc6IHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgYW5kIGdvaW5nIGRvd24gdG8gdGhlIHRhcmdldCdzIHBhcmVudAogICAgLy8gLSB0YXJnZXRpbmc6IGRpc3BhdGNoaW5nIHRoZSBldmVudCBvbiB0aGUgdGFyZ2V0IGl0c2VsZgogICAgLy8gLSBidWJibGluZzogc3RhcnRpbmcgZnJvbSB0aGUgdGFyZ2V0J3MgcGFyZW50LCBnb2luZyBiYWNrIHVwIHRvIHRoZSByb290LgogICAgLy8gQXQgYW55IHN0YWdlLCBhIGxpc3RlbmVyIG1heSBjYWxsIHN0b3BQcm9wYWdhdGlvbigpIG9uIHRoZSBldmVudCwgd2hpY2gKICAgIC8vIHdpbGwgaW1tZWRpYXRlbHkgc3RvcCBldmVudCBwcm9wYWdhdGlvbiB0aHJvdWdoIHRoaXMgcGF0aC4KICAgIGlmICh0aGlzLmRpc3BhdGNoRXZlbnRBdENhcHR1cmluZ18oZXZlbnQsIHBhdGgpKSB7CiAgICAgIGlmICh0aGlzLmRpc3BhdGNoRXZlbnRBdFRhcmdldGluZ18oZXZlbnQsIHBhdGgpKQogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudEF0QnViYmxpbmdfKGV2ZW50LCBwYXRoKTsKICAgIH0KICB9LAoKICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFyZW50SUQgPSBHZXRQYXJlbnRJRCh0aGlzLnRyZWVJRCwgdGhpcy5pZCk7CiAgICBwYXJlbnRJRCA9IHBhcmVudElEID8gcGFyZW50SUQubm9kZUlkIDogbnVsbDsKICAgIHZhciBjaGlsZFRyZWVJRCA9IEdldEludEF0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgJ2NoaWxkVHJlZUlkJyk7CiAgICB2YXIgY291bnQgPSBHZXRDaGlsZENvdW50KHRoaXMudHJlZUlELCB0aGlzLmlkKTsKICAgIHZhciBjaGlsZElEcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgIHZhciBjaGlsZElEID0gR2V0Q2hpbGRJREF0SW5kZXgodGhpcy50cmVlSUQsIHRoaXMuaWQsIGkpLm5vZGVJZDsKICAgICAgJEFycmF5LnB1c2goY2hpbGRJRHMsIGNoaWxkSUQpOwogICAgfQogICAgdmFyIG5hbWUgPSBHZXRTdHJpbmdBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsICduYW1lJyk7CgogICAgdmFyIHJlc3VsdCA9ICdub2RlIGlkPScgKyB0aGlzLmlkICsKICAgICAgICAnIHJvbGU9JyArIHRoaXMucm9sZSArCiAgICAgICAgJyBzdGF0ZT0nICsgJEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdGUpICsKICAgICAgICAnIHBhcmVudElEPScgKyBwYXJlbnRJRCArCiAgICAgICAgJyBjaGlsZElkcz0nICsgJEpTT04uc3RyaW5naWZ5KGNoaWxkSURzKTsKICAgIGlmIChjaGlsZFRyZWVJRCkKICAgICAgcmVzdWx0ICs9ICcgY2hpbGRUcmVlSUQ9JyArIGNoaWxkVHJlZUlEOwogICAgaWYgKG5hbWUpCiAgICAgIHJlc3VsdCArPSAnIG5hbWU9JyArIG5hbWU7CiAgICByZXR1cm4gcmVzdWx0OwogIH0sCgogIGRpc3BhdGNoRXZlbnRBdENhcHR1cmluZ186IGZ1bmN0aW9uKGV2ZW50LCBwYXRoKSB7CiAgICBwcml2YXRlcyhldmVudCkuaW1wbC5ldmVudFBoYXNlID0gRXZlbnQuQ0FQVFVSSU5HX1BIQVNFOwogICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdGhpcy5maXJlRXZlbnRMaXN0ZW5lcnNfKHBhdGhbaV0sIGV2ZW50KTsKICAgICAgaWYgKHByaXZhdGVzKGV2ZW50KS5pbXBsLnByb3BhZ2F0aW9uU3RvcHBlZCkKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICBkaXNwYXRjaEV2ZW50QXRUYXJnZXRpbmdfOiBmdW5jdGlvbihldmVudCkgewogICAgcHJpdmF0ZXMoZXZlbnQpLmltcGwuZXZlbnRQaGFzZSA9IEV2ZW50LkFUX1RBUkdFVDsKICAgIHRoaXMuZmlyZUV2ZW50TGlzdGVuZXJzXyh0aGlzLndyYXBwZXIsIGV2ZW50KTsKICAgIHJldHVybiAhcHJpdmF0ZXMoZXZlbnQpLmltcGwucHJvcGFnYXRpb25TdG9wcGVkOwogIH0sCgogIGRpc3BhdGNoRXZlbnRBdEJ1YmJsaW5nXzogZnVuY3Rpb24oZXZlbnQsIHBhdGgpIHsKICAgIHByaXZhdGVzKGV2ZW50KS5pbXBsLmV2ZW50UGhhc2UgPSBFdmVudC5CVUJCTElOR19QSEFTRTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICB0aGlzLmZpcmVFdmVudExpc3RlbmVyc18ocGF0aFtpXSwgZXZlbnQpOwogICAgICBpZiAocHJpdmF0ZXMoZXZlbnQpLmltcGwucHJvcGFnYXRpb25TdG9wcGVkKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0sCgogIGZpcmVFdmVudExpc3RlbmVyc186IGZ1bmN0aW9uKG5vZGUsIGV2ZW50KSB7CiAgICB2YXIgbm9kZUltcGwgPSBwcml2YXRlcyhub2RlKS5pbXBsOwogICAgaWYgKCFub2RlSW1wbC5yb290SW1wbCkKICAgICAgcmV0dXJuOwoKICAgIHZhciBsaXN0ZW5lcnMgPSBub2RlSW1wbC5saXN0ZW5lcnNbZXZlbnQudHlwZV07CiAgICBpZiAoIWxpc3RlbmVycykKICAgICAgcmV0dXJuOwogICAgdmFyIGV2ZW50UGhhc2UgPSBldmVudC5ldmVudFBoYXNlOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGV2ZW50UGhhc2UgPT0gRXZlbnQuQ0FQVFVSSU5HX1BIQVNFICYmICFsaXN0ZW5lcnNbaV0uY2FwdHVyZSkKICAgICAgICBjb250aW51ZTsKICAgICAgaWYgKGV2ZW50UGhhc2UgPT0gRXZlbnQuQlVCQkxJTkdfUEhBU0UgJiYgbGlzdGVuZXJzW2ldLmNhcHR1cmUpCiAgICAgICAgY29udGludWU7CgogICAgICB0cnkgewogICAgICAgIGxpc3RlbmVyc1tpXS5jYWxsYmFjayhldmVudCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBleGNlcHRpb25IYW5kbGVyLmhhbmRsZSgnRXJyb3IgaW4gZXZlbnQgaGFuZGxlciBmb3IgJyArIGV2ZW50LnR5cGUgKwogICAgICAgICAgICAnIGR1cmluZyBwaGFzZSAnICsgZXZlbnRQaGFzZSwgZSk7CiAgICAgIH0KICAgIH0KICB9LAoKICBwZXJmb3JtQWN0aW9uXzogZnVuY3Rpb24oYWN0aW9uVHlwZSwgb3B0X2FyZ3MsIG9wdF9jYWxsYmFjaykgewogICAgaWYgKCF0aGlzLnJvb3RJbXBsKQogICAgICByZXR1cm47CgogICAgLy8gTm90IHlldCBpbml0aWFsaXplZC4KICAgIGlmICh0aGlzLnJvb3RJbXBsLnRyZWVJRCA9PT0gdW5kZWZpbmVkIHx8CiAgICAgICAgdGhpcy5pZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBDaGVjayBwZXJtaXNzaW9ucy4KICAgIGlmICghSXNJbnRlcmFjdFBlcm1pdHRlZCgpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcihhY3Rpb25UeXBlICsgJyByZXF1aXJlcyB7ImRlc2t0b3AiOiB0cnVlfSBvcicgKwogICAgICAgICAgJyB7ImludGVyYWN0IjogdHJ1ZX0gaW4gdGhlICJhdXRvbWF0aW9uIiBtYW5pZmVzdCBrZXkuJyk7CiAgICB9CiAgICB2YXIgcmVxdWVzdElEID0gLTE7CiAgICBpZiAob3B0X2NhbGxiYWNrKSB7CiAgICAgIHJlcXVlc3RJRCA9IHRoaXMucm9vdEltcGwuYWRkQWN0aW9uUmVzdWx0Q2FsbGJhY2sob3B0X2NhbGxiYWNrKTsKICAgIH0KCiAgICBhdXRvbWF0aW9uSW50ZXJuYWwucGVyZm9ybUFjdGlvbih7IHRyZWVJRDogdGhpcy5yb290SW1wbC50cmVlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpb25Ob2RlSUQ6IHRoaXMuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvblR5cGU6IGFjdGlvblR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJRDogcmVxdWVzdElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9hcmdzIHx8IHt9KTsKICB9LAoKICBkb21RdWVyeVNlbGVjdG9yQ2FsbGJhY2tfOiBmdW5jdGlvbih1c2VyQ2FsbGJhY2ssIHJlc3VsdEF1dG9tYXRpb25Ob2RlSUQpIHsKICAgIC8vIHJlc3VsdEF1dG9tYXRpb25Ob2RlSUQgY291bGQgYmUgemVybyBvciB1bmRlZmluZWQgb3IgKHVubGlrZWx5KSBudWxsOwogICAgLy8gdGhleSBhbGwgYW1vdW50IHRvIHRoZSBzYW1lIHRoaW5nIGhlcmUsIHdoaWNoIGlzIHRoYXQgbm8gbm9kZSB3YXMKICAgIC8vIHJldHVybmVkLgogICAgaWYgKCFyZXN1bHRBdXRvbWF0aW9uTm9kZUlEIHx8ICF0aGlzLnJvb3RJbXBsKSB7CiAgICAgIHVzZXJDYWxsYmFjayhudWxsKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIHJlc3VsdE5vZGUgPSB0aGlzLnJvb3RJbXBsLmdldChyZXN1bHRBdXRvbWF0aW9uTm9kZUlEKTsKICAgIGlmICghcmVzdWx0Tm9kZSkgewogICAgICBsb2dnaW5nLldBUk5JTkcoJ1F1ZXJ5IHNlbGVjdG9yIHJlc3VsdCBub3QgaW4gdHJlZTogJyArCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRBdXRvbWF0aW9uTm9kZUlEKTsKICAgICAgdXNlckNhbGxiYWNrKG51bGwpOwogICAgfQogICAgdXNlckNhbGxiYWNrKHJlc3VsdE5vZGUpOwogIH0sCgogIGZpbmRJbnRlcm5hbF86IGZ1bmN0aW9uKHBhcmFtcywgb3B0X3Jlc3VsdHMpIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgdGhpcy5mb3JBbGxEZXNjZW5kYW50c18oZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAocHJpdmF0ZXMobm9kZSkuaW1wbC5tYXRjaEludGVybmFsXyhwYXJhbXMpKSB7CiAgICAgICAgaWYgKG9wdF9yZXN1bHRzKQogICAgICAgICAgJEFycmF5LnB1c2gob3B0X3Jlc3VsdHMsIG5vZGUpOwogICAgICAgIGVsc2UKICAgICAgICAgIHJlc3VsdCA9IG5vZGU7CiAgICAgICAgcmV0dXJuICFvcHRfcmVzdWx0czsKICAgICAgfQogICAgfSk7CiAgICBpZiAob3B0X3Jlc3VsdHMpCiAgICAgIHJldHVybiBvcHRfcmVzdWx0czsKICAgIHJldHVybiByZXN1bHQ7CiAgfSwKCiAgLyoqCiAgICogRXhlY3V0ZXMgYSBjbG9zdXJlIGZvciBhbGwgb2YgdGhpcyBub2RlJ3MgZGVzY2VuZGFudHMsIGluIHByZS1vcmRlci4KICAgKiBFYXJseS1vdXRzIGlmIHRoZSBjbG9zdXJlIHJldHVybnMgdHJ1ZS4KICAgKiBAcGFyYW0ge0Z1bmN0aW9uKEF1dG9tYXRpb25Ob2RlKTpib29sZWFufSBjbG9zdXJlIENsb3N1cmUgdG8gYmUgZXhlY3V0ZWQKICAgKiAgICAgZm9yIGVhY2ggbm9kZS4gUmV0dXJuIHRydWUgdG8gZWFybHktb3V0IHRoZSB0cmF2ZXJzYWwuCiAgICovCiAgZm9yQWxsRGVzY2VuZGFudHNfOiBmdW5jdGlvbihjbG9zdXJlKSB7CiAgICB2YXIgc3RhY2sgPSAkQXJyYXkucmV2ZXJzZSh0aGlzLndyYXBwZXIuY2hpbGRyZW4pOwogICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIG5vZGUgPSAkQXJyYXkucG9wKHN0YWNrKTsKICAgICAgaWYgKGNsb3N1cmUobm9kZSkpCiAgICAgICAgcmV0dXJuOwoKICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgICAgZm9yICh2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgICRBcnJheS5wdXNoKHN0YWNrLCBjaGlsZHJlbltpXSk7CiAgICB9CiAgfSwKCiAgbWF0Y2hJbnRlcm5hbF86IGZ1bmN0aW9uKHBhcmFtcykgewogICAgaWYgKCRPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCkKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGlmICgncm9sZScgaW4gcGFyYW1zICYmIHRoaXMucm9sZSAhPSBwYXJhbXMucm9sZSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgaWYgKCdzdGF0ZScgaW4gcGFyYW1zKSB7CiAgICAgIGZvciAodmFyIHN0YXRlIGluIHBhcmFtcy5zdGF0ZSkgewogICAgICAgIGlmIChwYXJhbXMuc3RhdGVbc3RhdGVdICE9IChzdGF0ZSBpbiB0aGlzLnN0YXRlKSkKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKCdhdHRyaWJ1dGVzJyBpbiBwYXJhbXMpIHsKICAgICAgZm9yICh2YXIgYXR0cmlidXRlIGluIHBhcmFtcy5hdHRyaWJ1dGVzKSB7CiAgICAgICAgdmFyIGF0dHJWYWx1ZSA9IHBhcmFtcy5hdHRyaWJ1dGVzW2F0dHJpYnV0ZV07CiAgICAgICAgaWYgKHR5cGVvZiBhdHRyVmFsdWUgIT0gJ29iamVjdCcpIHsKICAgICAgICAgIGlmICh0aGlzW2F0dHJpYnV0ZV0gIT09IGF0dHJWYWx1ZSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0gZWxzZSBpZiAoYXR0clZhbHVlIGluc3RhbmNlb2YgJFJlZ0V4cC5zZWxmKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbYXR0cmlidXRlXSAhPSAnc3RyaW5nJykKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgaWYgKCFhdHRyVmFsdWUudGVzdCh0aGlzW2F0dHJpYnV0ZV0pKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFRPRE8oYWJveGhhbGwpOiBoYW5kbGUgaW50bGlzdCBjYXNlLgogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQp9OwoKdmFyIHN0cmluZ0F0dHJpYnV0ZXMgPSBbCiAgICAnYWNjZXNzS2V5JywKICAgICdhcmlhSW52YWxpZFZhbHVlJywKICAgICdhdXRvQ29tcGxldGUnLAogICAgJ2NsYXNzTmFtZScsCiAgICAnY29udGFpbmVyTGl2ZVJlbGV2YW50JywKICAgICdjb250YWluZXJMaXZlU3RhdHVzJywKICAgICdkZXNjcmlwdGlvbicsCiAgICAnZGlzcGxheScsCiAgICAnaHRtbFRhZycsCiAgICAnaW1hZ2VEYXRhVXJsJywKICAgICdsYW5ndWFnZScsCiAgICAnbGl2ZVJlbGV2YW50JywKICAgICdsaXZlU3RhdHVzJywKICAgICduYW1lJywKICAgICdwbGFjZWhvbGRlcicsCiAgICAncm9sZURlc2NyaXB0aW9uJywKICAgICd0ZXh0SW5wdXRUeXBlJywKICAgICd1cmwnLAogICAgJ3ZhbHVlJ107Cgp2YXIgYm9vbEF0dHJpYnV0ZXMgPSBbCiAgICAnYnVzeScsCiAgICAnY2xpY2thYmxlJywKICAgICdjb250YWluZXJMaXZlQXRvbWljJywKICAgICdjb250YWluZXJMaXZlQnVzeScsCiAgICAnbGl2ZUF0b21pYycsCiAgICAnbW9kYWwnLAogICAgJ3Njcm9sbGFibGUnLAogICAgJ3NlbGVjdGVkJwpdOwoKdmFyIGludEF0dHJpYnV0ZXMgPSBbCiAgICAnYmFja2dyb3VuZENvbG9yJywKICAgICdjb2xvcicsCiAgICAnY29sb3JWYWx1ZScsCiAgICAnaGllcmFyY2hpY2FsTGV2ZWwnLAogICAgJ3Bvc0luU2V0JywKICAgICdzY3JvbGxYJywKICAgICdzY3JvbGxYTWF4JywKICAgICdzY3JvbGxYTWluJywKICAgICdzY3JvbGxZJywKICAgICdzY3JvbGxZTWF4JywKICAgICdzY3JvbGxZTWluJywKICAgICdzZXRTaXplJywKICAgICd0YWJsZUNlbGxDb2x1bW5JbmRleCcsCiAgICAnYXJpYUNlbGxDb2x1bW5JbmRleCcsCiAgICAndGFibGVDZWxsQ29sdW1uU3BhbicsCiAgICAndGFibGVDZWxsUm93SW5kZXgnLAogICAgJ2FyaWFDZWxsUm93SW5kZXgnLAogICAgJ3RhYmxlQ2VsbFJvd1NwYW4nLAogICAgJ3RhYmxlQ29sdW1uQ291bnQnLAogICAgJ2FyaWFDb2x1bW5Db3VudCcsCiAgICAndGFibGVDb2x1bW5JbmRleCcsCiAgICAndGFibGVSb3dDb3VudCcsCiAgICAnYXJpYVJvd0NvdW50JywKICAgICd0YWJsZVJvd0luZGV4JywKICAgICd0ZXh0U2VsRW5kJywKICAgICd0ZXh0U2VsU3RhcnQnXTsKCi8vIEludCBhdHRyaWJ1dGUsIHJlbGF0aW9uIHByb3BlcnR5IHRvIGV4cG9zZSwgcmV2ZXJzZSByZWxhdGlvbiB0byBleHBvc2UuCnZhciBub2RlUmVmQXR0cmlidXRlcyA9IFsKICAgIFsnYWN0aXZlZGVzY2VuZGFudElkJywgJ2FjdGl2ZURlc2NlbmRhbnQnLCAnYWN0aXZlRGVzY2VuZGFudEZvciddLAogICAgWydkZXRhaWxzSWQnLCAnZGV0YWlscycsICdkZXRhaWxzRm9yJ10sCiAgICBbJ2Vycm9yTWVzc2FnZUlkJywgJ2Vycm9yTWVzc2FnZScsICdlcnJvck1lc3NhZ2VGb3InXSwKICAgIFsnaW5QYWdlTGlua1RhcmdldElkJywgJ2luUGFnZUxpbmtUYXJnZXQnLCBudWxsXSwKICAgIFsnbmV4dEZvY3VzSWQnLCAnbmV4dEZvY3VzJywgbnVsbF0sCiAgICBbJ25leHRPbkxpbmVJZCcsICduZXh0T25MaW5lJywgbnVsbF0sCiAgICBbJ3ByZXZpb3VzRm9jdXNJZCcsICdwcmV2aW91c0ZvY3VzJywgbnVsbF0sCiAgICBbJ3ByZXZpb3VzT25MaW5lSWQnLCAncHJldmlvdXNPbkxpbmUnLCBudWxsXSwKICAgIFsndGFibGVDb2x1bW5IZWFkZXJJZCcsICd0YWJsZUNvbHVtbkhlYWRlcicsIG51bGxdLAogICAgWyd0YWJsZUhlYWRlcklkJywgJ3RhYmxlSGVhZGVyJywgbnVsbF0sCiAgICBbJ3RhYmxlUm93SGVhZGVySWQnLCAndGFibGVSb3dIZWFkZXInLCBudWxsXV07Cgp2YXIgaW50TGlzdEF0dHJpYnV0ZXMgPSBbCiAgICAnbGluZUJyZWFrcycsCiAgICAnbWFya2VyRW5kcycsCiAgICAnbWFya2VyU3RhcnRzJywKICAgICdtYXJrZXJUeXBlcycsCiAgICAnd29yZEVuZHMnLAogICAgJ3dvcmRTdGFydHMnXTsKCi8vIEludGxpc3QgYXR0cmlidXRlLCByZWxhdGlvbiBwcm9wZXJ0eSB0byBleHBvc2UsIHJldmVyc2UgcmVsYXRpb24gdG8gZXhwb3NlLgp2YXIgbm9kZVJlZkxpc3RBdHRyaWJ1dGVzID0gWwogICAgWydjb250cm9sc0lkcycsICdjb250cm9scycsICdjb250cm9sbGVkQnknXSwKICAgIFsnZGVzY3JpYmVkYnlJZHMnLCAnZGVzY3JpYmVkQnknLCAnZGVzY3JpcHRpb25Gb3InXSwKICAgIFsnZmxvd3RvSWRzJywgJ2Zsb3dUbycsICdmbG93RnJvbSddLAogICAgWydsYWJlbGxlZGJ5SWRzJywgJ2xhYmVsbGVkQnknLCAnbGFiZWxGb3InXV07Cgp2YXIgZmxvYXRBdHRyaWJ1dGVzID0gWwogICAgJ3ZhbHVlRm9yUmFuZ2UnLAogICAgJ21pblZhbHVlRm9yUmFuZ2UnLAogICAgJ21heFZhbHVlRm9yUmFuZ2UnXTsKCnZhciBodG1sQXR0cmlidXRlcyA9IFsKICAgIFsndHlwZScsICdpbnB1dFR5cGUnXV07Cgp2YXIgcHVibGljQXR0cmlidXRlcyA9IFtdOwoKJEFycmF5LmZvckVhY2goc3RyaW5nQXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cmlidXRlTmFtZSkgewogICRBcnJheS5wdXNoKHB1YmxpY0F0dHJpYnV0ZXMsIGF0dHJpYnV0ZU5hbWUpOwogICRPYmplY3QuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvbk5vZGVJbXBsLnByb3RvdHlwZSwgYXR0cmlidXRlTmFtZSwgewogICAgX19wcm90b19fOiBudWxsLAogICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIEdldFN0cmluZ0F0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgYXR0cmlidXRlTmFtZSk7CiAgICB9CiAgfSk7Cn0pOwoKJEFycmF5LmZvckVhY2goYm9vbEF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWUpIHsKICAkQXJyYXkucHVzaChwdWJsaWNBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVOYW1lKTsKICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsIGF0dHJpYnV0ZU5hbWUsIHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBHZXRCb29sQXR0cmlidXRlKHRoaXMudHJlZUlELCB0aGlzLmlkLCBhdHRyaWJ1dGVOYW1lKTsKICAgIH0KICB9KTsKfSk7CgokQXJyYXkuZm9yRWFjaChpbnRBdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyaWJ1dGVOYW1lKSB7CiAgJEFycmF5LnB1c2gocHVibGljQXR0cmlidXRlcywgYXR0cmlidXRlTmFtZSk7CiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlLCBhdHRyaWJ1dGVOYW1lLCB7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gR2V0SW50QXR0cmlidXRlKHRoaXMudHJlZUlELCB0aGlzLmlkLCBhdHRyaWJ1dGVOYW1lKTsKICAgIH0KICB9KTsKfSk7CgokQXJyYXkuZm9yRWFjaChub2RlUmVmQXR0cmlidXRlcywgZnVuY3Rpb24ocGFyYW1zKSB7CiAgdmFyIHNyY0F0dHJpYnV0ZU5hbWUgPSBwYXJhbXNbMF07CiAgdmFyIGRzdEF0dHJpYnV0ZU5hbWUgPSBwYXJhbXNbMV07CiAgdmFyIGRzdFJldmVyc2VBdHRyaWJ1dGVOYW1lID0gcGFyYW1zWzJdOwogICRBcnJheS5wdXNoKHB1YmxpY0F0dHJpYnV0ZXMsIGRzdEF0dHJpYnV0ZU5hbWUpOwogICRPYmplY3QuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvbk5vZGVJbXBsLnByb3RvdHlwZSwgZHN0QXR0cmlidXRlTmFtZSwgewogICAgX19wcm90b19fOiBudWxsLAogICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGlkID0gR2V0SW50QXR0cmlidXRlKHRoaXMudHJlZUlELCB0aGlzLmlkLCBzcmNBdHRyaWJ1dGVOYW1lKTsKICAgICAgaWYgKGlkICYmIHRoaXMucm9vdEltcGwpCiAgICAgICAgcmV0dXJuIHRoaXMucm9vdEltcGwuZ2V0KGlkKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgfSk7CiAgaWYgKGRzdFJldmVyc2VBdHRyaWJ1dGVOYW1lKSB7CiAgICAkQXJyYXkucHVzaChwdWJsaWNBdHRyaWJ1dGVzLCBkc3RSZXZlcnNlQXR0cmlidXRlTmFtZSk7CiAgICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJldmVyc2VBdHRyaWJ1dGVOYW1lLCB7CiAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaWRzID0gR2V0SW50QXR0cmlidXRlUmV2ZXJzZVJlbGF0aW9ucygKICAgICAgICAgICAgdGhpcy50cmVlSUQsIHRoaXMuaWQsIHNyY0F0dHJpYnV0ZU5hbWUpOwogICAgICAgIGlmICghaWRzIHx8ICF0aGlzLnJvb3RJbXBsKQogICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHZhciBub2RlID0gdGhpcy5yb290SW1wbC5nZXQoaWRzW2ldKTsKICAgICAgICAgIGlmIChub2RlKQogICAgICAgICAgJEFycmF5LnB1c2gocmVzdWx0LCBub2RlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfSk7CiAgfQp9KTsKCiRBcnJheS5mb3JFYWNoKGludExpc3RBdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyaWJ1dGVOYW1lKSB7CiAgJEFycmF5LnB1c2gocHVibGljQXR0cmlidXRlcywgYXR0cmlidXRlTmFtZSk7CiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlLCBhdHRyaWJ1dGVOYW1lLCB7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gR2V0SW50TGlzdEF0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgYXR0cmlidXRlTmFtZSk7CiAgICB9CiAgfSk7Cn0pOwoKJEFycmF5LmZvckVhY2gobm9kZVJlZkxpc3RBdHRyaWJ1dGVzLCBmdW5jdGlvbihwYXJhbXMpIHsKICB2YXIgc3JjQXR0cmlidXRlTmFtZSA9IHBhcmFtc1swXTsKICB2YXIgZHN0QXR0cmlidXRlTmFtZSA9IHBhcmFtc1sxXTsKICB2YXIgZHN0UmV2ZXJzZUF0dHJpYnV0ZU5hbWUgPSBwYXJhbXNbMl07CiAgJEFycmF5LnB1c2gocHVibGljQXR0cmlidXRlcywgZHN0QXR0cmlidXRlTmFtZSk7CiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uTm9kZUltcGwucHJvdG90eXBlLCBkc3RBdHRyaWJ1dGVOYW1lLCB7CiAgICBfX3Byb3RvX186IG51bGwsCiAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgaWRzID0gR2V0SW50TGlzdEF0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgc3JjQXR0cmlidXRlTmFtZSk7CiAgICAgIGlmICghaWRzIHx8ICF0aGlzLnJvb3RJbXBsKQogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdEltcGwuZ2V0KGlkc1tpXSk7CiAgICAgICAgaWYgKG5vZGUpCiAgICAgICAgICAkQXJyYXkucHVzaChyZXN1bHQsIG5vZGUpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgfSk7CiAgaWYgKGRzdFJldmVyc2VBdHRyaWJ1dGVOYW1lKSB7CiAgICAkQXJyYXkucHVzaChwdWJsaWNBdHRyaWJ1dGVzLCBkc3RSZXZlcnNlQXR0cmlidXRlTmFtZSk7CiAgICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJldmVyc2VBdHRyaWJ1dGVOYW1lLCB7CiAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaWRzID0gR2V0SW50TGlzdEF0dHJpYnV0ZVJldmVyc2VSZWxhdGlvbnMoCiAgICAgICAgICAgIHRoaXMudHJlZUlELCB0aGlzLmlkLCBzcmNBdHRyaWJ1dGVOYW1lKTsKICAgICAgICBpZiAoIWlkcyB8fCAhdGhpcy5yb290SW1wbCkKICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdEltcGwuZ2V0KGlkc1tpXSk7CiAgICAgICAgICBpZiAobm9kZSkKICAgICAgICAgICRBcnJheS5wdXNoKHJlc3VsdCwgbm9kZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgIH0pOwogIH0KfSk7CgokQXJyYXkuZm9yRWFjaChmbG9hdEF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHJpYnV0ZU5hbWUpIHsKICAkQXJyYXkucHVzaChwdWJsaWNBdHRyaWJ1dGVzLCBhdHRyaWJ1dGVOYW1lKTsKICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUsIGF0dHJpYnV0ZU5hbWUsIHsKICAgIF9fcHJvdG9fXzogbnVsbCwKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBHZXRGbG9hdEF0dHJpYnV0ZSh0aGlzLnRyZWVJRCwgdGhpcy5pZCwgYXR0cmlidXRlTmFtZSk7CiAgICB9CiAgfSk7Cn0pOwoKJEFycmF5LmZvckVhY2goaHRtbEF0dHJpYnV0ZXMsIGZ1bmN0aW9uKHBhcmFtcykgewogIHZhciBzcmNBdHRyaWJ1dGVOYW1lID0gcGFyYW1zWzBdOwogIHZhciBkc3RBdHRyaWJ1dGVOYW1lID0gcGFyYW1zWzFdOwogICRBcnJheS5wdXNoKHB1YmxpY0F0dHJpYnV0ZXMsIGRzdEF0dHJpYnV0ZU5hbWUpOwogICRPYmplY3QuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvbk5vZGVJbXBsLnByb3RvdHlwZSwgZHN0QXR0cmlidXRlTmFtZSwgewogICAgX19wcm90b19fOiBudWxsLAogICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIEdldEh0bWxBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsIHNyY0F0dHJpYnV0ZU5hbWUpOwogICAgfQogIH0pOwp9KTsKCi8qKgogKiBBdXRvbWF0aW9uUm9vdE5vZGUuCiAqCiAqIEFuIEF1dG9tYXRpb25Sb290Tm9kZSBpcyB0aGUgamF2YXNjcmlwdCBlbmQgb2YgYW4gQVhUcmVlIGxpdmluZyBpbiB0aGUKICogYnJvd3Nlci4gQXV0b21hdGlvblJvb3ROb2RlIGhhbmRsZXMgdW5zZXJpYWxpemluZyBpbmNyZW1lbnRhbCB1cGRhdGVzIGZyb20KICogdGhlIHNvdXJjZSBBWFRyZWUuIEVhY2ggdXBkYXRlIGNvbnRhaW5zIG5vZGUgZGF0YSB0aGF0IGZvcm0gYSBjb21wbGV0ZSB0cmVlCiAqIGFmdGVyIGFwcGx5aW5nIHRoZSB1cGRhdGUuCiAqCiAqIEEgYnJpZWYgbm90ZSBhYm91dCBpZHMgdXNlZCB0aHJvdWdoIHRoaXMgY2xhc3MuIFRoZSBzb3VyY2UgQVhUcmVlIGFzc2lnbnMKICogdW5pcXVlIGlkcyBwZXIgbm9kZSBhbmQgd2UgdXNlIHRoZXNlIGlkcyB0byBidWlsZCBhIGhhc2ggdG8gdGhlIGFjdHVhbAogKiBBdXRvbWF0aW9uTm9kZSBvYmplY3QuCiAqIFRodXMsIHRyZWUgdHJhdmVyc2FscyBhbW91bnQgdG8gYSBsb29rdXAgaW4gb3VyIGhhc2guCiAqCiAqIFRoZSB0cmVlIGl0c2VsZiBpcyBpZGVudGlmaWVkIGJ5IHRoZSBhY2Nlc3NpYmlsaXR5IHRyZWUgaWQgb2YgdGhlCiAqIHJlbmRlcmVyIHdpZGdldCBob3N0LgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIEF1dG9tYXRpb25Sb290Tm9kZUltcGwodHJlZUlEKSB7CiAgJEZ1bmN0aW9uLmNhbGwoQXV0b21hdGlvbk5vZGVJbXBsLCB0aGlzLCB0aGlzKTsKICB0aGlzLnRyZWVJRCA9IHRyZWVJRDsKICB0aGlzLmF4Tm9kZURhdGFDYWNoZV8gPSB7X19wcm90b19fOiBudWxsfTsKfQoKdXRpbHMuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvblJvb3ROb2RlSW1wbCwgJ2lkVG9BdXRvbWF0aW9uUm9vdE5vZGVfJywKICAgIHtfX3Byb3RvX186IG51bGx9KTsKCnV0aWxzLmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Sb290Tm9kZUltcGwsICdnZXQnLCBmdW5jdGlvbih0cmVlSUQpIHsKICB2YXIgcmVzdWx0ID0gQXV0b21hdGlvblJvb3ROb2RlSW1wbC5pZFRvQXV0b21hdGlvblJvb3ROb2RlX1t0cmVlSURdOwogIHJldHVybiByZXN1bHQgfHwgdW5kZWZpbmVkOwp9KTsKCnV0aWxzLmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Sb290Tm9kZUltcGwsICdnZXRPckNyZWF0ZScsIGZ1bmN0aW9uKHRyZWVJRCkgewogIGlmIChBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmlkVG9BdXRvbWF0aW9uUm9vdE5vZGVfW3RyZWVJRF0pCiAgICByZXR1cm4gQXV0b21hdGlvblJvb3ROb2RlSW1wbC5pZFRvQXV0b21hdGlvblJvb3ROb2RlX1t0cmVlSURdOwogIHZhciByZXN1bHQgPSBuZXcgQXV0b21hdGlvblJvb3ROb2RlKHRyZWVJRCk7CiAgQXV0b21hdGlvblJvb3ROb2RlSW1wbC5pZFRvQXV0b21hdGlvblJvb3ROb2RlX1t0cmVlSURdID0gcmVzdWx0OwogIHJldHVybiByZXN1bHQ7Cn0pOwoKdXRpbHMuZGVmaW5lUHJvcGVydHkoCiAgICBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLCAnZ2V0Tm9kZUZyb21UcmVlJywgZnVuY3Rpb24odHJlZUlkLCBub2RlSWQpIHsKICB2YXIgaW1wbCA9IHByaXZhdGVzKEF1dG9tYXRpb25Sb290Tm9kZUltcGwuZ2V0KHRyZWVJZCkpLmltcGw7CiAgaWYgKGltcGwpCiAgICByZXR1cm4gaW1wbC5nZXQobm9kZUlkKTsKfSk7Cgp1dGlscy5kZWZpbmVQcm9wZXJ0eShBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLCAnZGVzdHJveScsIGZ1bmN0aW9uKHRyZWVJRCkgewogIGRlbGV0ZSBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmlkVG9BdXRvbWF0aW9uUm9vdE5vZGVfW3RyZWVJRF07Cn0pOwoKLyoqCiAqIEEgY291bnRlciBrZWVwaW5nIHRyYWNrIG9mIElEcyB0byB1c2UgZm9yIG1hcHBpbmcgYWN0aW9uIHJlcXVlc3RzIHRvCiAqIHRoZWlyIGNhbGxiYWNrIGZ1bmN0aW9uLgogKi8KQXV0b21hdGlvblJvb3ROb2RlSW1wbC5hY3Rpb25SZXF1ZXN0Q291bnRlciA9IDA7CgovKioKICogQSBtYXAgZnJvbSBhIHJlcXVlc3QgSUQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbAogKiB3aGVuIHRoZSBhY3Rpb24gcmVzcG9uc2UgZXZlbnQgaXMgcmVjZWl2ZWQuCiAqLwpBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmFjdGlvblJlcXVlc3RJRFRvQ2FsbGJhY2sgPSB7fTsKCkF1dG9tYXRpb25Sb290Tm9kZUltcGwucHJvdG90eXBlID0gewogIF9fcHJvdG9fXzogQXV0b21hdGlvbk5vZGVJbXBsLnByb3RvdHlwZSwKCiAgLyoqCiAgICogQHR5cGUge2Jvb2xlYW59CiAgICovCiAgaXNSb290Tm9kZTogdHJ1ZSwKCiAgLyoqCiAgICogQHR5cGUge251bWJlcn0KICAgKi8KICB0cmVlSUQ6IC0xLAoKICAvKioKICAgKiBBIG1hcCBmcm9tIGlkIHRvIEF1dG9tYXRpb25Ob2RlLgogICAqIEB0eXBlIHtPYmplY3QuPG51bWJlciwgQXV0b21hdGlvbk5vZGU+fQogICAqIEBwcml2YXRlCiAgICovCiAgYXhOb2RlRGF0YUNhY2hlXzogbnVsbCwKCiAgZ2V0IGlkKCkgewogICAgdmFyIHJlc3VsdCA9IEdldFJvb3RJRCh0aGlzLnRyZWVJRCk7CgogICAgLy8gRG9uJ3QgcmV0dXJuIHVuZGVmaW5lZCwgYmVjYXVzZSB0aGUgaWQgaXMgb2Z0ZW4gcGFzc2VkIGRpcmVjdGx5CiAgICAvLyBhcyBhbiBhcmd1bWVudCB0byBhIG5hdGl2ZSBiaW5kaW5nIHRoYXQgZXhwZWN0cyBvbmx5IGEgdmFsaWQgbnVtYmVyLgogICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKQogICAgICByZXR1cm4gLTE7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9LAoKICBnZXQgY2hyb21lQ2hhbm5lbCgpIHsKICAgIHJldHVybiBHZXRTdHJpbmdBdHRyaWJ1dGUodGhpcy50cmVlSUQsIHRoaXMuaWQsICdjaHJvbWVDaGFubmVsJyk7CiAgfSwKCiAgZ2V0IGRvY1VybCgpIHsKICAgIHJldHVybiBHZXREb2NVUkwodGhpcy50cmVlSUQpOwogIH0sCgogIGdldCBkb2NUaXRsZSgpIHsKICAgIHJldHVybiBHZXREb2NUaXRsZSh0aGlzLnRyZWVJRCk7CiAgfSwKCiAgZ2V0IGRvY0xvYWRlZCgpIHsKICAgIHJldHVybiBHZXREb2NMb2FkZWQodGhpcy50cmVlSUQpOwogIH0sCgogIGdldCBkb2NMb2FkaW5nUHJvZ3Jlc3MoKSB7CiAgICByZXR1cm4gR2V0RG9jTG9hZGluZ1Byb2dyZXNzKHRoaXMudHJlZUlEKTsKICB9LAoKICBnZXQgYW5jaG9yT2JqZWN0KCkgewogICAgdmFyIGlkID0gR2V0QW5jaG9yT2JqZWN0SUQodGhpcy50cmVlSUQpOwogICAgaWYgKGlkICYmIGlkICE9IC0xKQogICAgICByZXR1cm4gdGhpcy5nZXQoaWQpOwogICAgZWxzZQogICAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0sCgogIGdldCBhbmNob3JPZmZzZXQoKSB7CiAgICB2YXIgaWQgPSBHZXRBbmNob3JPYmplY3RJRCh0aGlzLnRyZWVJRCk7CiAgICBpZiAoaWQgJiYgaWQgIT0gLTEpCiAgICAgIHJldHVybiBHZXRBbmNob3JPZmZzZXQodGhpcy50cmVlSUQpOwogIH0sCgogIGdldCBhbmNob3JBZmZpbml0eSgpIHsKICAgIHZhciBpZCA9IEdldEFuY2hvck9iamVjdElEKHRoaXMudHJlZUlEKTsKICAgIGlmIChpZCAmJiBpZCAhPSAtMSkKICAgICAgcmV0dXJuIEdldEFuY2hvckFmZmluaXR5KHRoaXMudHJlZUlEKTsKICB9LAoKICBnZXQgZm9jdXNPYmplY3QoKSB7CiAgICB2YXIgaWQgPSBHZXRGb2N1c09iamVjdElEKHRoaXMudHJlZUlEKTsKICAgIGlmIChpZCAmJiBpZCAhPSAtMSkKICAgICAgcmV0dXJuIHRoaXMuZ2V0KGlkKTsKICAgIGVsc2UKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICB9LAoKICBnZXQgZm9jdXNPZmZzZXQoKSB7CiAgICB2YXIgaWQgPSBHZXRGb2N1c09iamVjdElEKHRoaXMudHJlZUlEKTsKICAgIGlmIChpZCAmJiBpZCAhPSAtMSkKICAgICAgcmV0dXJuIEdldEZvY3VzT2Zmc2V0KHRoaXMudHJlZUlEKTsKICB9LAoKICBnZXQgZm9jdXNBZmZpbml0eSgpIHsKICAgIHZhciBpZCA9IEdldEZvY3VzT2JqZWN0SUQodGhpcy50cmVlSUQpOwogICAgaWYgKGlkICYmIGlkICE9IC0xKQogICAgICByZXR1cm4gR2V0Rm9jdXNBZmZpbml0eSh0aGlzLnRyZWVJRCk7CiAgfSwKCiAgZ2V0OiBmdW5jdGlvbihpZCkgewogICAgaWYgKGlkID09IHVuZGVmaW5lZCkKICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKCiAgICBpZiAoaWQgPT0gdGhpcy5pZCkKICAgICAgcmV0dXJuIHRoaXMud3JhcHBlcjsKCiAgIHZhciBvYmogPSB0aGlzLmF4Tm9kZURhdGFDYWNoZV9baWRdOwogICAgaWYgKG9iaikKICAgICAgcmV0dXJuIG9iajsKCiAgICAvLyBWYWxpZGF0ZSB0aGUgYmFja2luZyBBWFRyZWUgaGFzIHRoZSBzcGVjaWZpZWQgbm9kZS4KICAgIGlmICghR2V0Um9sZSh0aGlzLnRyZWVJRCwgaWQpKQogICAgICByZXR1cm47CgogICAgb2JqID0gbmV3IEF1dG9tYXRpb25Ob2RlKHRoaXMpOwogICAgcHJpdmF0ZXMob2JqKS5pbXBsLnRyZWVJRCA9IHRoaXMudHJlZUlEOwogICAgcHJpdmF0ZXMob2JqKS5pbXBsLmlkID0gaWQ7CiAgICB0aGlzLmF4Tm9kZURhdGFDYWNoZV9baWRdID0gb2JqOwoKICAgIHJldHVybiBvYmo7CiAgfSwKCiAgcmVtb3ZlOiBmdW5jdGlvbihpZCkgewogICAgaWYgKHRoaXMuYXhOb2RlRGF0YUNhY2hlX1tpZF0pCiAgICAgIHByaXZhdGVzKHRoaXMuYXhOb2RlRGF0YUNhY2hlX1tpZF0pLmltcGwuZGV0YWNoKCk7CiAgICBkZWxldGUgdGhpcy5heE5vZGVEYXRhQ2FjaGVfW2lkXTsKICB9LAoKICBkZXN0cm95OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnZGVzdHJveWVkJywgJ25vbmUnKTsKICAgIGZvciAodmFyIGlkIGluIHRoaXMuYXhOb2RlRGF0YUNhY2hlXykKICAgICAgdGhpcy5yZW1vdmUoaWQpOwogICAgdGhpcy5kZXRhY2goKTsKICB9LAoKICBvbkFjY2Vzc2liaWxpdHlFdmVudDogZnVuY3Rpb24oZXZlbnRQYXJhbXMpIHsKICAgIHZhciB0YXJnZXROb2RlID0gdGhpcy5nZXQoZXZlbnRQYXJhbXMudGFyZ2V0SUQpOwogICAgaWYgKHRhcmdldE5vZGUpIHsKICAgICAgdmFyIHRhcmdldE5vZGVJbXBsID0gcHJpdmF0ZXModGFyZ2V0Tm9kZSkuaW1wbDsKICAgICAgdGFyZ2V0Tm9kZUltcGwuZGlzcGF0Y2hFdmVudCgKICAgICAgICAgIGV2ZW50UGFyYW1zLmV2ZW50VHlwZSwgZXZlbnRQYXJhbXMuZXZlbnRGcm9tLAogICAgICAgICAgZXZlbnRQYXJhbXMubW91c2VYLCBldmVudFBhcmFtcy5tb3VzZVkpOwoKICAgICAgaWYgKGV2ZW50UGFyYW1zLmFjdGlvblJlcXVlc3RJRCAhPSAtMSkgewogICAgICAgIHRoaXMub25BY3Rpb25SZXN1bHQoZXZlbnRQYXJhbXMuYWN0aW9uUmVxdWVzdElELCB0YXJnZXROb2RlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbG9nZ2luZy5XQVJOSU5HKCdHb3QgJyArIGV2ZW50UGFyYW1zLmV2ZW50VHlwZSArCiAgICAgICAgICAgICAgICAgICAgICAnIGV2ZW50IG9uIHVua25vd24gbm9kZTogJyArIGV2ZW50UGFyYW1zLnRhcmdldElEICsKICAgICAgICAgICAgICAgICAgICAgICc7IHRoaXM6ICcgKyB0aGlzLmlkKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0sCgogIGFkZEFjdGlvblJlc3VsdENhbGxiYWNrOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgQXV0b21hdGlvblJvb3ROb2RlSW1wbC5hY3Rpb25SZXF1ZXN0SURUb0NhbGxiYWNrWwogICAgICAgICsrQXV0b21hdGlvblJvb3ROb2RlSW1wbC5hY3Rpb25SZXF1ZXN0Q291bnRlcl0gPSBjYWxsYmFjazsKICAgIHJldHVybiBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmFjdGlvblJlcXVlc3RDb3VudGVyOwogIH0sCgogIG9uQWN0aW9uUmVzdWx0OiBmdW5jdGlvbihyZXF1ZXN0SUQsIHJlc3VsdCkgewogICAgaWYgKHJlcXVlc3RJRCBpbiBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmFjdGlvblJlcXVlc3RJRFRvQ2FsbGJhY2spIHsKICAgICAgQXV0b21hdGlvblJvb3ROb2RlSW1wbC5hY3Rpb25SZXF1ZXN0SURUb0NhbGxiYWNrW3JlcXVlc3RJRF0ocmVzdWx0KTsKICAgICAgZGVsZXRlIEF1dG9tYXRpb25Sb290Tm9kZUltcGwuYWN0aW9uUmVxdWVzdElEVG9DYWxsYmFja1tyZXF1ZXN0SURdOwogICAgfQogIH0sCgogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIHRvU3RyaW5nSW50ZXJuYWwobm9kZUltcGwsIGluZGVudCkgewogICAgICBpZiAoIW5vZGVJbXBsKQogICAgICAgIHJldHVybiAnJzsKICAgICAgdmFyIG91dHB1dCA9ICcnOwogICAgICBpZiAobm9kZUltcGwuaXNSb290Tm9kZSkKICAgICAgICBvdXRwdXQgKz0gaW5kZW50ICsgJ3RyZWUgaWQ9JyArIG5vZGVJbXBsLnRyZWVJRCArICdcbic7CiAgICAgIG91dHB1dCArPSBpbmRlbnQgKwogICAgICAgICRGdW5jdGlvbi5jYWxsKEF1dG9tYXRpb25Ob2RlSW1wbC5wcm90b3R5cGUudG9TdHJpbmcsIG5vZGVJbXBsKSArICdcbic7CiAgICAgIGluZGVudCArPSAnICAnOwogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlSW1wbC5jaGlsZHJlbjsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkKICAgICAgICBvdXRwdXQgKz0gdG9TdHJpbmdJbnRlcm5hbChwcml2YXRlcyhjaGlsZHJlbltpXSkuaW1wbCwgaW5kZW50KTsKICAgICAgcmV0dXJuIG91dHB1dDsKICAgIH0KICAgIHJldHVybiB0b1N0cmluZ0ludGVybmFsKHRoaXMsICcnKTsKICB9LAp9OwoKZnVuY3Rpb24gQXV0b21hdGlvbk5vZGUoKSB7CiAgcHJpdmF0ZXMoQXV0b21hdGlvbk5vZGUpLmNvbnN0cnVjdFByaXZhdGUodGhpcywgYXJndW1lbnRzKTsKfQp1dGlscy5leHBvc2UoQXV0b21hdGlvbk5vZGUsIEF1dG9tYXRpb25Ob2RlSW1wbCwgewogIGZ1bmN0aW9uczogWwogICAgJ2RvRGVmYXVsdCcsCiAgICAnZmluZCcsCiAgICAnZmluZEFsbCcsCiAgICAnZm9jdXMnLAogICAgJ2dldEltYWdlRGF0YScsCiAgICAnZ2V0TmV4dFRleHRNYXRjaCcsCiAgICAnaGl0VGVzdCcsCiAgICAnaGl0VGVzdFdpdGhSZXBseScsCiAgICAnbWFrZVZpc2libGUnLAogICAgJ21hdGNoZXMnLAogICAgJ3BlcmZvcm1DdXN0b21BY3Rpb24nLAogICAgJ3BlcmZvcm1TdGFuZGFyZEFjdGlvbicsCiAgICAncmVwbGFjZVNlbGVjdGVkVGV4dCcsCiAgICAncmVzdW1lTWVkaWEnLAogICAgJ3Njcm9sbEJhY2t3YXJkJywKICAgICdzY3JvbGxGb3J3YXJkJywKICAgICdzY3JvbGxVcCcsCiAgICAnc2Nyb2xsRG93bicsCiAgICAnc2Nyb2xsTGVmdCcsCiAgICAnc2Nyb2xsUmlnaHQnLAogICAgJ3NldFNlbGVjdGlvbicsCiAgICAnc2V0U2VxdWVudGlhbEZvY3VzTmF2aWdhdGlvblN0YXJ0aW5nUG9pbnQnLAogICAgJ3NldFZhbHVlJywKICAgICdzaG93Q29udGV4dE1lbnUnLAogICAgJ3N0YXJ0RHVja2luZ01lZGlhJywKICAgICdzdG9wRHVja2luZ01lZGlhJywKICAgICdzdXNwZW5kTWVkaWEnLAogICAgJ2FkZEV2ZW50TGlzdGVuZXInLAogICAgJ3JlbW92ZUV2ZW50TGlzdGVuZXInLAogICAgJ2RvbVF1ZXJ5U2VsZWN0b3InLAogICAgJ3RvU3RyaW5nJywKICAgICdib3VuZHNGb3JSYW5nZScsCiAgXSwKICByZWFkb25seTogJEFycmF5LmNvbmNhdChwdWJsaWNBdHRyaWJ1dGVzLCBbCiAgICAgICdwYXJlbnQnLAogICAgICAnZmlyc3RDaGlsZCcsCiAgICAgICdsYXN0Q2hpbGQnLAogICAgICAnY2hpbGRyZW4nLAogICAgICAncHJldmlvdXNTaWJsaW5nJywKICAgICAgJ25leHRTaWJsaW5nJywKICAgICAgJ2lzUm9vdE5vZGUnLAogICAgICAncm9sZScsCiAgICAgICdjaGVja2VkJywKICAgICAgJ2RlZmF1bHRBY3Rpb25WZXJiJywKICAgICAgJ3Jlc3RyaWN0aW9uJywKICAgICAgJ3N0YXRlJywKICAgICAgJ2xvY2F0aW9uJywKICAgICAgJ2luZGV4SW5QYXJlbnQnLAogICAgICAnbGluZVN0YXJ0T2Zmc2V0cycsCiAgICAgICdyb290JywKICAgICAgJ2h0bWxBdHRyaWJ1dGVzJywKICAgICAgJ25hbWVGcm9tJywKICAgICAgJ2JvbGQnLAogICAgICAnaXRhbGljJywKICAgICAgJ3VuZGVybGluZScsCiAgICAgICdsaW5lVGhyb3VnaCcsCiAgICAgICdjdXN0b21BY3Rpb25zJywKICAgICAgJ3N0YW5kYXJkQWN0aW9ucycsCiAgICAgICd1bmNsaXBwZWRMb2NhdGlvbicsCiAgICAgICd0YWJsZUNlbGxDb2x1bW5IZWFkZXJzJywKICAgICAgJ3RhYmxlQ2VsbFJvd0hlYWRlcnMnLAogIF0pLAp9KTsKCmZ1bmN0aW9uIEF1dG9tYXRpb25Sb290Tm9kZSgpIHsKICBwcml2YXRlcyhBdXRvbWF0aW9uUm9vdE5vZGUpLmNvbnN0cnVjdFByaXZhdGUodGhpcywgYXJndW1lbnRzKTsKfQp1dGlscy5leHBvc2UoQXV0b21hdGlvblJvb3ROb2RlLCBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLCB7CiAgc3VwZXJjbGFzczogQXV0b21hdGlvbk5vZGUsCiAgcmVhZG9ubHk6IFsKICAgICdjaHJvbWVDaGFubmVsJywKICAgICdkb2NUaXRsZScsCiAgICAnZG9jVXJsJywKICAgICdkb2NMb2FkZWQnLAogICAgJ2RvY0xvYWRpbmdQcm9ncmVzcycsCiAgICAnYW5jaG9yT2JqZWN0JywKICAgICdhbmNob3JPZmZzZXQnLAogICAgJ2FuY2hvckFmZmluaXR5JywKICAgICdmb2N1c09iamVjdCcsCiAgICAnZm9jdXNPZmZzZXQnLAogICAgJ2ZvY3VzQWZmaW5pdHknLAogIF0sCn0pOwoKdXRpbHMuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvblJvb3ROb2RlLCAnZ2V0JywgZnVuY3Rpb24odHJlZUlEKSB7CiAgcmV0dXJuIEF1dG9tYXRpb25Sb290Tm9kZUltcGwuZ2V0KHRyZWVJRCk7Cn0pOwoKdXRpbHMuZGVmaW5lUHJvcGVydHkoQXV0b21hdGlvblJvb3ROb2RlLCAnZ2V0T3JDcmVhdGUnLCBmdW5jdGlvbih0cmVlSUQpIHsKICByZXR1cm4gQXV0b21hdGlvblJvb3ROb2RlSW1wbC5nZXRPckNyZWF0ZSh0cmVlSUQpOwp9KTsKCnV0aWxzLmRlZmluZVByb3BlcnR5KEF1dG9tYXRpb25Sb290Tm9kZSwgJ2Rlc3Ryb3knLCBmdW5jdGlvbih0cmVlSUQpIHsKICBBdXRvbWF0aW9uUm9vdE5vZGVJbXBsLmRlc3Ryb3kodHJlZUlEKTsKfSk7CgpleHBvcnRzLiRzZXQoJ0F1dG9tYXRpb25Ob2RlJywgQXV0b21hdGlvbk5vZGUpOwpleHBvcnRzLiRzZXQoJ0F1dG9tYXRpb25Sb290Tm9kZScsIEF1dG9tYXRpb25Sb290Tm9kZSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBicm93c2VyQWN0aW9uIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnYnJvd3NlckFjdGlvbicpOwoKdmFyIHNldEljb24gPSByZXF1aXJlKCdzZXRJY29uJykuc2V0SWNvbjsKdmFyIGdldEV4dGVuc2lvblZpZXdzID0gcmVxdWlyZU5hdGl2ZSgncnVudGltZScpLkdldEV4dGVuc2lvblZpZXdzOwp2YXIgc2VuZFJlcXVlc3QgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5zZW5kUmVxdWVzdCwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ3NlbmRSZXF1ZXN0Jykuc2VuZFJlcXVlc3Q7Cgp2YXIganNMYXN0RXJyb3IgPSBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHJlcXVpcmUoJ2xhc3RFcnJvcicpOwpmdW5jdGlvbiBoYXNMYXN0RXJyb3IoKSB7CiAgcmV0dXJuIGJpbmRpbmdVdGlsID8KICAgICAgYmluZGluZ1V0aWwuaGFzTGFzdEVycm9yKCkgOiBqc0xhc3RFcnJvci5oYXNFcnJvcihjaHJvbWUpOwp9CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZXRJY29uJywgZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIHNldEljb24oZGV0YWlscywgZnVuY3Rpb24oYXJncykgewogICAgICBzZW5kUmVxdWVzdCgnYnJvd3NlckFjdGlvbi5zZXRJY29uJywKICAgICAgICAgICAgICAgICAgW2FyZ3MsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgICAgYXBpQnJpZGdlID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7CiAgICB9LmJpbmQodGhpcykpOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ29wZW5Qb3B1cCcsCiAgICAgIGZ1bmN0aW9uKG5hbWUsIHJlcXVlc3QsIGNhbGxiYWNrLCByZXNwb25zZSkgewogICAgaWYgKCFjYWxsYmFjaykKICAgICAgcmV0dXJuOwoKICAgIGlmIChoYXNMYXN0RXJyb3IoKSkgewogICAgICBjYWxsYmFjaygpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHZpZXdzID0gZ2V0RXh0ZW5zaW9uVmlld3MoLTEsIC0xLCAnUE9QVVAnKTsKICAgICAgY2FsbGJhY2sodmlld3MubGVuZ3RoID4gMCA/IHZpZXdzWzBdIDogbnVsbCk7CiAgICB9CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgQ2FzdCBTdHJlYW1pbmcgUnRwU3RyZWFtIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8CiAgICAgICAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdjYXN0LnN0cmVhbWluZy5ydHBTdHJlYW0nKTsKdmFyIG5hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdjYXN0X3N0cmVhbWluZ19uYXRpdmVzJyk7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSwgZXh0ZW5zaW9uSWQpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnZGVzdHJveScsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkKSB7CiAgICAgICAgbmF0aXZlcy5EZXN0cm95Q2FzdFJ0cFN0cmVhbSh0cmFuc3BvcnRJZCk7CiAgfSk7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2dldFN1cHBvcnRlZFBhcmFtcycsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkKSB7CiAgICAgICAgcmV0dXJuIG5hdGl2ZXMuR2V0U3VwcG9ydGVkUGFyYW1zQ2FzdFJ0cFN0cmVhbSh0cmFuc3BvcnRJZCk7CiAgfSk7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3N0YXJ0JywKICAgICAgZnVuY3Rpb24odHJhbnNwb3J0SWQsIHBhcmFtcykgewogICAgICAgIG5hdGl2ZXMuU3RhcnRDYXN0UnRwU3RyZWFtKHRyYW5zcG9ydElkLCBwYXJhbXMpOwogIH0pOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzdG9wJywKICAgICAgZnVuY3Rpb24odHJhbnNwb3J0SWQpIHsKICAgICAgICBuYXRpdmVzLlN0b3BDYXN0UnRwU3RyZWFtKHRyYW5zcG9ydElkKTsKICB9KTsKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgndG9nZ2xlTG9nZ2luZycsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBlbmFibGUpIHsKICAgICAgICBuYXRpdmVzLlRvZ2dsZUxvZ2dpbmcodHJhbnNwb3J0SWQsIGVuYWJsZSk7CiAgfSk7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2dldFJhd0V2ZW50cycsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBleHRyYURhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgbmF0aXZlcy5HZXRSYXdFdmVudHModHJhbnNwb3J0SWQsIGV4dHJhRGF0YSwgY2FsbGJhY2spOwogIH0pOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdnZXRTdGF0cycsCiAgICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBjYWxsYmFjaykgewogICAgICAgIG5hdGl2ZXMuR2V0U3RhdHModHJhbnNwb3J0SWQsIGNhbGxiYWNrKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBDYXN0IFN0cmVhbWluZyBTZXNzaW9uIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8CiAgICAgICAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdjYXN0LnN0cmVhbWluZy5zZXNzaW9uJyk7CnZhciBuYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnY2FzdF9zdHJlYW1pbmdfbmF0aXZlcycpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEksIGV4dGVuc2lvbklkKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnY3JlYXRlJywKICAgICAgZnVuY3Rpb24oYXVkaW9UcmFjaywgdmlkZW9UcmFjaywgY2FsbGJhY2spIHsKICAgICAgICBuYXRpdmVzLkNyZWF0ZVNlc3Npb24oYXVkaW9UcmFjaywgdmlkZW9UcmFjaywgY2FsbGJhY2spOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIENhc3QgU3RyZWFtaW5nIFVkcFRyYW5zcG9ydCBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fAogICAgICAgICAgICAgIHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnY2FzdC5zdHJlYW1pbmcudWRwVHJhbnNwb3J0Jyk7CnZhciBuYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnY2FzdF9zdHJlYW1pbmdfbmF0aXZlcycpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEksIGV4dGVuc2lvbklkKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2Rlc3Ryb3knLCBmdW5jdGlvbih0cmFuc3BvcnRJZCkgewogICAgbmF0aXZlcy5EZXN0cm95Q2FzdFVkcFRyYW5zcG9ydCh0cmFuc3BvcnRJZCk7CiAgfSk7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3NldERlc3RpbmF0aW9uJywKICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBkZXN0aW5hdGlvbikgewogICAgICBuYXRpdmVzLlNldERlc3RpbmF0aW9uQ2FzdFVkcFRyYW5zcG9ydCh0cmFuc3BvcnRJZCwgZGVzdGluYXRpb24pOwogIH0pOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZXRPcHRpb25zJywKICAgIGZ1bmN0aW9uKHRyYW5zcG9ydElkLCBvcHRpb25zKSB7CiAgICAgIG5hdGl2ZXMuU2V0T3B0aW9uc0Nhc3RVZHBUcmFuc3BvcnQodHJhbnNwb3J0SWQsIG9wdGlvbnMpOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIENhc3QgU3RyZWFtaW5nIFNlc3Npb24gQVBJLgoKdmFyIGJpbmRpbmcgPQogICAgYXBpQnJpZGdlIHx8CiAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Nhc3Quc3RyZWFtaW5nLnJlY2VpdmVyU2Vzc2lvbicpOwp2YXIgbmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2Nhc3Rfc3RyZWFtaW5nX25hdGl2ZXMnKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJLCBleHRlbnNpb25JZCkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoCiAgICAgICdjcmVhdGVBbmRCaW5kJywKICAgICAgZnVuY3Rpb24oYXAsIHZwLCBsb2NhbCwgd2VpZGd0aCwgaGVpZ2h0LCBmciwgdXJsLCBjYiwgb3ApIHsKICAgICAgICBuYXRpdmVzLlN0YXJ0Q2FzdFJ0cFJlY2VpdmVyKAogICAgICAgICAgICBhcCwgdnAsIGxvY2FsLCB3ZWlkZ3RoLCBoZWlnaHQsIGZyLCB1cmwsIGNiLCBvcCk7CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgp2YXIgRXZlbnQgPSByZXF1aXJlKCdldmVudF9iaW5kaW5ncycpLkV2ZW50Owp2YXIgc2VuZFJlcXVlc3QgPSByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0Owp2YXIgdmFsaWRhdGUgPSByZXF1aXJlKCdzY2hlbWFVdGlscycpLnZhbGlkYXRlOwoKZnVuY3Rpb24gZXh0ZW5kU2NoZW1hKHNjaGVtYSkgewogIHZhciBleHRlbmRlZFNjaGVtYSA9ICRBcnJheS5zbGljZShzY2hlbWEpOwogICRBcnJheS51bnNoaWZ0KGV4dGVuZGVkU2NoZW1hLCB7J3R5cGUnOiAnc3RyaW5nJ30pOwogIHJldHVybiBleHRlbmRlZFNjaGVtYTsKfQoKLy8gVE9ETyhkZXZsaW4pOiBNYXliZSBmaW5kIGEgd2F5IHRvIGNvbWJpbmUgdGhpcyBhbmQgQ29udGVudFNldHRpbmcuCmZ1bmN0aW9uIENocm9tZVNldHRpbmcocHJlZktleSwgdmFsdWVTY2hlbWEsIHNjaGVtYSkgewogIHZhciBnZXRGdW5jdGlvblBhcmFtZXRlcnMgPSBmdW5jdGlvbihuYW1lKSB7CiAgICB2YXIgZiA9ICRBcnJheS5maWx0ZXIoCiAgICAgICAgICAgICAgICBzY2hlbWEuZnVuY3Rpb25zLCBmdW5jdGlvbihmKSB7IHJldHVybiBmLm5hbWUgPT09IG5hbWU7IH0pWzBdOwogICAgcmV0dXJuIGYucGFyYW1ldGVyczsKICB9OwogIHRoaXMuZ2V0ID0gZnVuY3Rpb24oZGV0YWlscywgY2FsbGJhY2spIHsKICAgIHZhciBnZXRTY2hlbWEgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMoJ2dldCcpOwogICAgdmFsaWRhdGUoW2RldGFpbHMsIGNhbGxiYWNrXSwgZ2V0U2NoZW1hKTsKICAgIHJldHVybiBzZW5kUmVxdWVzdCgndHlwZXMuQ2hyb21lU2V0dGluZy5nZXQnLAogICAgICAgICAgICAgICAgICAgICAgIFtwcmVmS2V5LCBkZXRhaWxzLCBjYWxsYmFja10sCiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kU2NoZW1hKGdldFNjaGVtYSkpOwogIH07CiAgdGhpcy5zZXQgPSBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgLy8gVGhlIHNldCBzY2hlbWEgaW5jbHVkZWQgaW4gdGhlIFNjaGVtYSBvYmplY3QgaXMgZ2VuZXJpYywgc2luY2UgaXQgdmFyaWVzCiAgICAvLyBwZXItc2V0dGluZy4gSG93ZXZlciwgdGhpcyBpcyBvbmx5IGV2ZXIgZm9yIGEgc2luZ2xlIHNldHRpbmcsIHNvIHdlIGNhbgogICAgLy8gZW5mb3JjZSB0aGUgdHlwZXMgbW9yZSB0aG9yb3VnaGx5LgogICAgdmFyIHJhd1NldFNjaGVtYSA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycygnc2V0Jyk7CiAgICB2YXIgcmF3U2V0dGluZ1BhcmFtID0gcmF3U2V0U2NoZW1hWzBdOwogICAgdmFyIHByb3BzID0gJE9iamVjdC5hc3NpZ24oe30sIHJhd1NldHRpbmdQYXJhbS5wcm9wZXJ0aWVzKTsKICAgIHByb3BzLnZhbHVlID0gdmFsdWVTY2hlbWE7CiAgICB2YXIgbW9kU2V0dGluZ1BhcmFtID0gewogICAgICBuYW1lOiByYXdTZXR0aW5nUGFyYW0ubmFtZSwKICAgICAgdHlwZTogcmF3U2V0dGluZ1BhcmFtLnR5cGUsCiAgICAgIHByb3BlcnRpZXM6IHByb3BzLAogICAgfTsKICAgIHZhciBtb2RTZXRTY2hlbWEgPSAkQXJyYXkuc2xpY2UocmF3U2V0U2NoZW1hKTsKICAgIG1vZFNldFNjaGVtYVswXSA9IG1vZFNldHRpbmdQYXJhbTsKICAgIHZhbGlkYXRlKFtkZXRhaWxzLCBjYWxsYmFja10sIG1vZFNldFNjaGVtYSk7CiAgICByZXR1cm4gc2VuZFJlcXVlc3QoJ3R5cGVzLkNocm9tZVNldHRpbmcuc2V0JywKICAgICAgICAgICAgICAgICAgICAgICBbcHJlZktleSwgZGV0YWlscywgY2FsbGJhY2tdLAogICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZFNjaGVtYShtb2RTZXRTY2hlbWEpKTsKICB9OwogIHRoaXMuY2xlYXIgPSBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgdmFyIGNsZWFyU2NoZW1hID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKCdjbGVhcicpOwogICAgdmFsaWRhdGUoW2RldGFpbHMsIGNhbGxiYWNrXSwgY2xlYXJTY2hlbWEpOwogICAgcmV0dXJuIHNlbmRSZXF1ZXN0KCd0eXBlcy5DaHJvbWVTZXR0aW5nLmNsZWFyJywKICAgICAgICAgICAgICAgICAgICAgICBbcHJlZktleSwgZGV0YWlscywgY2FsbGJhY2tdLAogICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZFNjaGVtYShjbGVhclNjaGVtYSkpOwogIH07CiAgdGhpcy5vbkNoYW5nZSA9IG5ldyBFdmVudCgndHlwZXMuQ2hyb21lU2V0dGluZy4nICsgcHJlZktleSArICcub25DaGFuZ2UnKTsKfTsKCmV4cG9ydHMuJHNldCgnQ2hyb21lU2V0dGluZycsIENocm9tZVNldHRpbmcpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwKICAgICAgICAgICAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Nocm9tZVdlYlZpZXdJbnRlcm5hbCcpOwp2YXIgY29udGV4dE1lbnVzSGFuZGxlcnMgPSByZXF1aXJlKCdjb250ZXh0TWVudXNIYW5kbGVycycpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICB2YXIgaGFuZGxlcnMgPSBjb250ZXh0TWVudXNIYW5kbGVycy5jcmVhdGUodHJ1ZSAvKiBpc1dlYnZpZXcgKi8pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgKICAgICAgJ2NvbnRleHRNZW51c0NyZWF0ZScsIGhhbmRsZXJzLnJlcXVlc3RIYW5kbGVycy5jcmVhdGUpOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgKICAgICAgJ2NvbnRleHRNZW51c1VwZGF0ZScsIGhhbmRsZXJzLnJlcXVlc3RIYW5kbGVycy51cGRhdGUpOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgKICAgICAgJ2NvbnRleHRNZW51c1JlbW92ZScsIGhhbmRsZXJzLnJlcXVlc3RIYW5kbGVycy5yZW1vdmUpOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgKICAgICAgJ2NvbnRleHRNZW51c1JlbW92ZUFsbCcsIGhhbmRsZXJzLnJlcXVlc3RIYW5kbGVycy5yZW1vdmVBbGwpOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnQ2hyb21lV2ViVmlldycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGNocm9tZS1zcGVjaWZpYyA8d2Vidmlldz4gQVBJLgovLyBTZWUgd2ViX3ZpZXdfYXBpX21ldGhvZHMuanMgZm9yIGRldGFpbHMuCgp2YXIgQ2hyb21lV2ViVmlldyA9IGdldEludGVybmFsQXBpID8KICAgIGdldEludGVybmFsQXBpKCdjaHJvbWVXZWJWaWV3SW50ZXJuYWwnKSA6CiAgICByZXF1aXJlKCdjaHJvbWVXZWJWaWV3SW50ZXJuYWwnKS5DaHJvbWVXZWJWaWV3Owp2YXIgQ2hyb21lV2ViVmlld1NjaGVtYSA9CiAgICByZXF1aXJlTmF0aXZlKCdzY2hlbWFfcmVnaXN0cnknKS5HZXRTY2hlbWEoJ2Nocm9tZVdlYlZpZXdJbnRlcm5hbCcpOwp2YXIgQ3JlYXRlRXZlbnQgPSByZXF1aXJlKCdndWVzdFZpZXdFdmVudHMnKS5DcmVhdGVFdmVudDsKdmFyIEd1ZXN0Vmlld0ludGVybmFsTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2d1ZXN0X3ZpZXdfaW50ZXJuYWwnKTsKdmFyIGlkR2VuZXJhdG9yTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2lkX2dlbmVyYXRvcicpOwp2YXIgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpOwp2YXIgV2ViVmlld0ltcGwgPSByZXF1aXJlKCd3ZWJWaWV3JykuV2ViVmlld0ltcGw7CgovLyBUaGlzIGlzIHRoZSBvbmx5ICJ3ZWJWaWV3SW50ZXJuYWwub25DbGlja2VkIiBuYW1lZCBldmVudCBmb3IgdGhpcyByZW5kZXJlci4KLy8KLy8gU2luY2Ugd2UgbmVlZCBhbiBldmVudCBwZXIgPHdlYnZpZXc+LCB3ZSBkZWZpbmUgZXZlbnRzIHdpdGggc3VmZml4Ci8vIChzdWJFdmVudE5hbWUpIGluIGVhY2ggb2YgdGhlIDx3ZWJ2aWV3Pi4gQmVoaW5kIHRoZSBzY2VuZXMsIHRoaXMgZXZlbnQgaXMKLy8gcmVnaXN0ZXJlZCBhcyBhIENvbnRleHRNZW51c0V2ZW50LCB3aXRoIGZpbHRlciBzZXQgdG8gdGhlIHdlYnZpZXcncwovLyB8dmlld0luc3RhbmNlSWR8LiBBbnkgdGltZSBhIENvbnRleHRNZW51c0V2ZW50IGlzIGRpc3BhdGNoZWQsIHdlIHJlLWRpc3BhdGNoCi8vIGl0IHRvIHRoZSBzdWJFdmVudCdzIGxpc3RlbmVycy4gVGhpcyB3YXkKLy8gPHdlYnZpZXc+LmNvbnRleHRNZW51cy5vbkNsaWNrZWQgYmVoYXZlIGFzIGEgcmVndWxhciBjaHJvbWUgRXZlbnQgdHlwZS4KdmFyIENvbnRleHRNZW51c0V2ZW50ID0gQ3JlYXRlRXZlbnQoJ2Nocm9tZVdlYlZpZXdJbnRlcm5hbC5vbkNsaWNrZWQnKTsKLy8gU2VlIGNvbW1lbnQgYWJvdmUuCnZhciBDb250ZXh0TWVudXNIYW5kbGVyRXZlbnQgPQogICAgQ3JlYXRlRXZlbnQoJ2Nocm9tZVdlYlZpZXdJbnRlcm5hbC5vbkNvbnRleHRNZW51U2hvdycpOwoKdmFyIGpzRXZlbnQ7CmZ1bmN0aW9uIGNyZWF0ZUN1c3RvbUV2ZW50KG5hbWUsIHNjaGVtYSwgb3B0aW9ucywgd2Vidmlld0lkKSB7CiAgaWYgKGJpbmRpbmdVdGlsKQogICAgcmV0dXJuIGJpbmRpbmdVdGlsLmNyZWF0ZUN1c3RvbUV2ZW50KG5hbWUsIHVuZGVmaW5lZCwgZmFsc2UsIGZhbHNlKTsKICBpZiAoIWpzRXZlbnQpCiAgICBqc0V2ZW50ID0gcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5FdmVudDsKICByZXR1cm4gbmV3IGpzRXZlbnQobmFtZSwgc2NoZW1hLCBvcHRpb25zLCB3ZWJ2aWV3SWQpOwp9CgovLyBUaGlzIGV2ZW50IGlzIGV4cG9zZWQgYXMgPHdlYnZpZXc+LmNvbnRleHRNZW51cy5vbkNsaWNrZWQuCmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHRNZW51c09uQ2xpY2tlZEV2ZW50KHdlYlZpZXdJbnN0YW5jZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZXZlbnROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfYXJnU2NoZW1hcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2V2ZW50T3B0aW9ucykgewogIHZhciBzdWJFdmVudE5hbWUgPSBHZXRVbmlxdWVTdWJFdmVudE5hbWUob3B0X2V2ZW50TmFtZSk7CiAgdmFyIG5ld0V2ZW50ID0gY3JlYXRlQ3VzdG9tRXZlbnQoc3ViRXZlbnROYW1lLCBvcHRfYXJnU2NoZW1hcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZXZlbnRPcHRpb25zLCB3ZWJWaWV3SW5zdGFuY2VJZCk7CgogIHZhciB2aWV3ID0gR3Vlc3RWaWV3SW50ZXJuYWxOYXRpdmVzLkdldFZpZXdGcm9tSUQod2ViVmlld0luc3RhbmNlSWQpOwogIGlmICh2aWV3KSB7CiAgICB2aWV3LmV2ZW50cy5hZGRTY29wZWRMaXN0ZW5lcigKICAgICAgICBDb250ZXh0TWVudXNFdmVudCwKICAgICAgICAkRnVuY3Rpb24uYmluZChmdW5jdGlvbigpIHsKICAgICAgICAgIC8vIFJlLWRpc3BhdGNoIHRvIHN1YkV2ZW50J3MgbGlzdGVuZXJzLgogICAgICAgICAgJEZ1bmN0aW9uLmFwcGx5KG5ld0V2ZW50LmRpc3BhdGNoLCBuZXdFdmVudCwgJEFycmF5LnNsaWNlKGFyZ3VtZW50cykpOwogICAgICAgIH0sIG5ld0V2ZW50KSwKICAgICAgICB7aW5zdGFuY2VJZDogd2ViVmlld0luc3RhbmNlSWR9KTsKICB9CiAgcmV0dXJuIG5ld0V2ZW50Owp9CgovLyBUaGlzIGV2ZW50IGlzIGV4cG9zZWQgYXMgPHdlYnZpZXc+LmNvbnRleHRNZW51cy5vblNob3cuCmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHRNZW51c09uQ29udGV4dE1lbnVFdmVudCh3ZWJWaWV3SW5zdGFuY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9ldmVudE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfYXJnU2NoZW1hcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9ldmVudE9wdGlvbnMpIHsKICB2YXIgc3ViRXZlbnROYW1lID0gR2V0VW5pcXVlU3ViRXZlbnROYW1lKG9wdF9ldmVudE5hbWUpOwogIHZhciBuZXdFdmVudCA9IGNyZWF0ZUN1c3RvbUV2ZW50KHN1YkV2ZW50TmFtZSwgb3B0X2FyZ1NjaGVtYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2V2ZW50T3B0aW9ucywgd2ViVmlld0luc3RhbmNlSWQpOwoKICB2YXIgdmlldyA9IEd1ZXN0Vmlld0ludGVybmFsTmF0aXZlcy5HZXRWaWV3RnJvbUlEKHdlYlZpZXdJbnN0YW5jZUlkKTsKICBpZiAodmlldykgewogICAgdmlldy5ldmVudHMuYWRkU2NvcGVkTGlzdGVuZXIoCiAgICAgICAgQ29udGV4dE1lbnVzSGFuZGxlckV2ZW50LAogICAgICAgICRGdW5jdGlvbi5iaW5kKGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIHZhciBkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7CiAgICAgICAgICB2YXIgZXZlbnQgPSB7CiAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHsgZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7IH0KICAgICAgICAgIH07CgogICAgICAgICAgLy8gUmUtZGlzcGF0Y2ggdG8gc3ViRXZlbnQncyBsaXN0ZW5lcnMuCiAgICAgICAgICAkRnVuY3Rpb24uYXBwbHkobmV3RXZlbnQuZGlzcGF0Y2gsIG5ld0V2ZW50LCBbZXZlbnRdKTsKCiAgICAgICAgICBpZiAoIWRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICAgIC8vIFRPRE8obGF6eWJveSk6IFJlbW92ZSB8aXRlbXN8IHBhcmFtZXRlciBjb21wbGV0ZWx5IGZyb20KICAgICAgICAgIC8vIENocm9tZVdlYlZpZXcuc2hvd0NvbnRleHRNZW51IGFzIHdlIGRvbid0IGRvIGFueXRoaW5nIHVzZWZ1bCB3aXRoCiAgICAgICAgICAvLyBpdCBjdXJyZW50bHkuCiAgICAgICAgICB2YXIgaXRlbXMgPSBbXTsKICAgICAgICAgIHZhciBndWVzdEluc3RhbmNlSWQgPSBHdWVzdFZpZXdJbnRlcm5hbE5hdGl2ZXMuCiAgICAgICAgICAgICAgR2V0Vmlld0Zyb21JRCh3ZWJWaWV3SW5zdGFuY2VJZCkuZ3Vlc3QuZ2V0SWQoKTsKICAgICAgICAgIENocm9tZVdlYlZpZXcuc2hvd0NvbnRleHRNZW51KGd1ZXN0SW5zdGFuY2VJZCwgZS5yZXF1ZXN0SWQsIGl0ZW1zKTsKICAgICAgICB9CiAgICAgIH0sIG5ld0V2ZW50KSwKICAgICAge2luc3RhbmNlSWQ6IHdlYlZpZXdJbnN0YW5jZUlkfSk7CiAgfQoKICByZXR1cm4gbmV3RXZlbnQ7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFdlYlZpZXdDb250ZXh0TWVudXNJbXBsIG9iamVjdC4KCi8vIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgZXhwb3NlZCBhcyA8d2Vidmlldz4uY29udGV4dE1lbnVzLgpmdW5jdGlvbiBXZWJWaWV3Q29udGV4dE1lbnVzSW1wbCh2aWV3SW5zdGFuY2VJZCkgewogIHRoaXMudmlld0luc3RhbmNlSWRfID0gdmlld0luc3RhbmNlSWQ7Cn0KJE9iamVjdC5zZXRQcm90b3R5cGVPZihXZWJWaWV3Q29udGV4dE1lbnVzSW1wbC5wcm90b3R5cGUsIG51bGwpOwoKV2ViVmlld0NvbnRleHRNZW51c0ltcGwucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKCkgewogIHZhciBhcmdzID0gJEFycmF5LmNvbmNhdChbdGhpcy52aWV3SW5zdGFuY2VJZF9dLCAkQXJyYXkuc2xpY2UoYXJndW1lbnRzKSk7CiAgcmV0dXJuICRGdW5jdGlvbi5hcHBseShDaHJvbWVXZWJWaWV3LmNvbnRleHRNZW51c0NyZWF0ZSwgbnVsbCwgYXJncyk7Cn07CgpXZWJWaWV3Q29udGV4dE1lbnVzSW1wbC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7CiAgdmFyIGFyZ3MgPSAkQXJyYXkuY29uY2F0KFt0aGlzLnZpZXdJbnN0YW5jZUlkX10sICRBcnJheS5zbGljZShhcmd1bWVudHMpKTsKICByZXR1cm4gJEZ1bmN0aW9uLmFwcGx5KENocm9tZVdlYlZpZXcuY29udGV4dE1lbnVzUmVtb3ZlLCBudWxsLCBhcmdzKTsKfTsKCldlYlZpZXdDb250ZXh0TWVudXNJbXBsLnByb3RvdHlwZS5yZW1vdmVBbGwgPSBmdW5jdGlvbigpIHsKICB2YXIgYXJncyA9ICRBcnJheS5jb25jYXQoW3RoaXMudmlld0luc3RhbmNlSWRfXSwgJEFycmF5LnNsaWNlKGFyZ3VtZW50cykpOwogIHJldHVybiAkRnVuY3Rpb24uYXBwbHkoQ2hyb21lV2ViVmlldy5jb250ZXh0TWVudXNSZW1vdmVBbGwsIG51bGwsIGFyZ3MpOwp9OwoKV2ViVmlld0NvbnRleHRNZW51c0ltcGwucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogIHZhciBhcmdzID0gJEFycmF5LmNvbmNhdChbdGhpcy52aWV3SW5zdGFuY2VJZF9dLCAkQXJyYXkuc2xpY2UoYXJndW1lbnRzKSk7CiAgcmV0dXJuICRGdW5jdGlvbi5hcHBseShDaHJvbWVXZWJWaWV3LmNvbnRleHRNZW51c1VwZGF0ZSwgbnVsbCwgYXJncyk7Cn07CgpmdW5jdGlvbiBXZWJWaWV3Q29udGV4dE1lbnVzKCkgewogIHByaXZhdGVzKFdlYlZpZXdDb250ZXh0TWVudXMpLmNvbnN0cnVjdFByaXZhdGUodGhpcywgYXJndW1lbnRzKTsKfQp1dGlscy5leHBvc2UoV2ViVmlld0NvbnRleHRNZW51cywgV2ViVmlld0NvbnRleHRNZW51c0ltcGwsIHsKICBmdW5jdGlvbnM6IFsKICAgICdjcmVhdGUnLAogICAgJ3JlbW92ZScsCiAgICAncmVtb3ZlQWxsJywKICAgICd1cGRhdGUnLAogIF0sCn0pOwoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCldlYlZpZXdJbXBsLnByb3RvdHlwZS5tYXliZVNldHVwQ29udGV4dE1lbnVzID0gZnVuY3Rpb24oKSB7CiAgaWYgKCF0aGlzLmNvbnRleHRNZW51c09uQ29udGV4dE1lbnVFdmVudF8pIHsKICAgIHZhciBldmVudE5hbWUgPSAnY2hyb21lV2ViVmlld0ludGVybmFsLm9uQ29udGV4dE1lbnVTaG93JzsKICAgIHZhciBldmVudFNjaGVtYSA9CiAgICAgICAgdXRpbHMubG9va3VwKENocm9tZVdlYlZpZXdTY2hlbWEuZXZlbnRzLCAnbmFtZScsICdvblNob3cnKTsKICAgIHZhciBldmVudE9wdGlvbnMgPSB7c3VwcG9ydHNMaXN0ZW5lcnM6IHRydWUsIHN1cHBvcnRzTGF6eUxpc3RlbmVyczogZmFsc2V9OwogICAgdGhpcy5jb250ZXh0TWVudXNPbkNvbnRleHRNZW51RXZlbnRfID0gY3JlYXRlQ29udGV4dE1lbnVzT25Db250ZXh0TWVudUV2ZW50KAogICAgICAgIHRoaXMudmlld0luc3RhbmNlSWQsIGV2ZW50TmFtZSwgZXZlbnRTY2hlbWEsIGV2ZW50T3B0aW9ucyk7CiAgfQoKICB2YXIgY3JlYXRlQ29udGV4dE1lbnVzID0gJEZ1bmN0aW9uLmJpbmQoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy53ZWFrV3JhcHBlcihmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY29udGV4dE1lbnVzXykgewogICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRNZW51c187CiAgICAgIH0KCiAgICAgIHRoaXMuY29udGV4dE1lbnVzXyA9IG5ldyBXZWJWaWV3Q29udGV4dE1lbnVzKHRoaXMudmlld0luc3RhbmNlSWQpOwoKICAgICAgLy8gRGVmaW5lICdvbkNsaWNrZWQnIGV2ZW50IHByb3BlcnR5IG9uIHx0aGlzLmNvbnRleHRNZW51c198LgogICAgICB2YXIgZ2V0T25DbGlja2VkRXZlbnQgPSAkRnVuY3Rpb24uYmluZChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy53ZWFrV3JhcHBlcihmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICghdGhpcy5jb250ZXh0TWVudXNPbkNsaWNrZWRFdmVudF8pIHsKICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9ICdjaHJvbWVXZWJWaWV3SW50ZXJuYWwub25DbGlja2VkJzsKICAgICAgICAgICAgdmFyIGV2ZW50U2NoZW1hID0KICAgICAgICAgICAgICAgIHV0aWxzLmxvb2t1cChDaHJvbWVXZWJWaWV3U2NoZW1hLmV2ZW50cywgJ25hbWUnLCAnb25DbGlja2VkJyk7CiAgICAgICAgICAgIHZhciBldmVudE9wdGlvbnMgPQogICAgICAgICAgICAgICAge3N1cHBvcnRzTGlzdGVuZXJzOiB0cnVlLCBzdXBwb3J0c0xhenlMaXN0ZW5lcnM6IGZhbHNlfTsKICAgICAgICAgICAgdmFyIG9uQ2xpY2tlZEV2ZW50ID0gY3JlYXRlQ29udGV4dE1lbnVzT25DbGlja2VkRXZlbnQoCiAgICAgICAgICAgICAgICB0aGlzLnZpZXdJbnN0YW5jZUlkLCBldmVudE5hbWUsIGV2ZW50U2NoZW1hLCBldmVudE9wdGlvbnMpOwogICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51c09uQ2xpY2tlZEV2ZW50XyA9IG9uQ2xpY2tlZEV2ZW50OwogICAgICAgICAgICByZXR1cm4gb25DbGlja2VkRXZlbnQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0TWVudXNPbkNsaWNrZWRFdmVudF87CiAgICAgICAgfSk7CiAgICAgIH0sIHRoaXMpOwogICAgICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KAogICAgICAgICAgdGhpcy5jb250ZXh0TWVudXNfLAogICAgICAgICAgJ29uQ2xpY2tlZCcsCiAgICAgICAgICB7Z2V0OiBnZXRPbkNsaWNrZWRFdmVudCgpLCBlbnVtZXJhYmxlOiB0cnVlfSk7CiAgICAgICRPYmplY3QuZGVmaW5lUHJvcGVydHkoCiAgICAgICAgICB0aGlzLmNvbnRleHRNZW51c18sCiAgICAgICAgICAnb25TaG93JywKICAgICAgICAgIHsKICAgICAgICAgICAgZ2V0OiB0aGlzLndlYWtXcmFwcGVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRleHRNZW51c09uQ29udGV4dE1lbnVFdmVudF87CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgcmV0dXJuIHRoaXMuY29udGV4dE1lbnVzXzsKICAgIH0pOwogIH0sIHRoaXMpOwoKICAvLyBFeHBvc2UgPHdlYnZpZXc+LmNvbnRleHRNZW51cyBvYmplY3QuCiAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgKICAgICAgdGhpcy5lbGVtZW50LAogICAgICAnY29udGV4dE1lbnVzJywKICAgICAgewogICAgICAgIGdldDogY3JlYXRlQ29udGV4dE1lbnVzKCksCiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZQogICAgICB9KTsKfTsKCmZ1bmN0aW9uIEdldFVuaXF1ZVN1YkV2ZW50TmFtZShldmVudE5hbWUpIHsKICByZXR1cm4gZXZlbnROYW1lICsgJy8nICsgaWRHZW5lcmF0b3JOYXRpdmVzLkdldE5leHRJZCgpOwp9Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBjb250ZW50U2V0dGluZ3MgQVBJLgoKdmFyIHNlbmRSZXF1ZXN0ID0gcmVxdWlyZSgnc2VuZFJlcXVlc3QnKS5zZW5kUmVxdWVzdDsKdmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnc2NoZW1hVXRpbHMnKS52YWxpZGF0ZTsKCi8vIFNvbWUgY29udGVudCB0eXBlcyBoYXZlIGJlZW4gcmVtb3ZlZCBhbmQgbm8gbG9uZ2VyIGNvcnJlc3BvbmQgdG8gYSByZWFsCi8vIGNvbnRlbnQgc2V0dGluZy4gSW5zdGVhZCwgdGhlc2UgYWx3YXlzIHJldHVybiBhIGZpeGVkIGR1bW15IHZhbHVlLCBhbmQgaXNzdWUKLy8gYSB3YXJuaW5nIHdoZW4gYWNjZXNzZWQuIFRoaXMgbWFwcyB0aGUgY29udGVudCB0eXBlIG5hbWUgdG8gdGhlIGR1bW15IHZhbHVlLgp2YXIgREVQUkVDQVRFRF9DT05URU5UX1RZUEVTID0gewogIF9fcHJvdG9fXzogbnVsbCwKCiAgZnVsbHNjcmVlbjogJ2FsbG93JywKICBtb3VzZWxvY2s6ICdhbGxvdycsCn07CgpmdW5jdGlvbiBleHRlbmRTY2hlbWEoc2NoZW1hKSB7CiAgdmFyIGV4dGVuZGVkU2NoZW1hID0gJEFycmF5LnNsaWNlKHNjaGVtYSk7CiAgJEFycmF5LnVuc2hpZnQoZXh0ZW5kZWRTY2hlbWEsIHsndHlwZSc6ICdzdHJpbmcnfSk7CiAgcmV0dXJuIGV4dGVuZGVkU2NoZW1hOwp9CgpmdW5jdGlvbiBDb250ZW50U2V0dGluZyhjb250ZW50VHlwZSwgc2V0dGluZ1NjaGVtYSwgc2NoZW1hKSB7CiAgdmFyIGdldEZ1bmN0aW9uUGFyYW1ldGVycyA9IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHZhciBmID0gJEFycmF5LmZpbHRlcigKICAgICAgICAgICAgICAgIHNjaGVtYS5mdW5jdGlvbnMsIGZ1bmN0aW9uKGYpIHsgcmV0dXJuIGYubmFtZSA9PT0gbmFtZTsgfSlbMF07CiAgICByZXR1cm4gZi5wYXJhbWV0ZXJzOwogIH07CiAgdGhpcy5nZXQgPSBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgdmFyIGdldFNjaGVtYSA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycygnZ2V0Jyk7CiAgICB2YWxpZGF0ZShbZGV0YWlscywgY2FsbGJhY2tdLCBnZXRTY2hlbWEpOwoKICAgIHZhciBkdW1teVNldHRpbmcgPSBERVBSRUNBVEVEX0NPTlRFTlRfVFlQRVNbY29udGVudFR5cGVdOwogICAgaWYgKGR1bW15U2V0dGluZyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIGNvbnNvbGUud2FybignY29udGVudFNldHRpbmdzLicgKyBjb250ZW50VHlwZSArICcgaXMgZGVwcmVjYXRlZDsgaXQgd2lsbCAnCiAgICAgICAgICAgICAgICAgICArICdhbHdheXMgcmV0dXJuIFwnJyArIGR1bW15U2V0dGluZyArICdcJy4nKTsKICAgICAgJEZ1bmN0aW9uLmFwcGx5KGNhbGxiYWNrLCB1bmRlZmluZWQsIFt7c2V0dGluZzogZHVtbXlTZXR0aW5nfV0pOwogICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIHNlbmRSZXF1ZXN0KCdjb250ZW50U2V0dGluZ3MuZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudFR5cGUsIGRldGFpbHMsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRTY2hlbWEoZ2V0U2NoZW1hKSk7CiAgfTsKCiAgdGhpcy5zZXQgPSBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgLy8gV2UgY2hlY2sgaWYgdGhlIHNldHRpbmcgaXMgZGVwcmVjYXRlZCBmaXJzdCwgc2luY2UgdGhlIHZhbGlkYXRpb24gd2lsbAogICAgLy8gZmFpbCBmb3IgZGVwcmVjYXRlZCB0eXBlcy4KICAgIGlmICgkT2JqZWN0Lmhhc093blByb3BlcnR5KERFUFJFQ0FURURfQ09OVEVOVF9UWVBFUywgY29udGVudFR5cGUpKSB7CiAgICAgIGNvbnNvbGUud2FybignY29udGVudFNldHRpbmdzLicgKyBjb250ZW50VHlwZSArICcgaXMgZGVwcmVjYXRlZDsgc2V0dGluZyAnCiAgICAgICAgICAgICAgICAgICArICdpdCBoYXMgbm8gZWZmZWN0LicpOwogICAgICAkRnVuY3Rpb24uYXBwbHkoY2FsbGJhY2ssIHVuZGVmaW5lZCwgW10pOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gVGhlIHNldCBzY2hlbWEgaW5jbHVkZWQgaW4gdGhlIFNjaGVtYSBvYmplY3QgaXMgZ2VuZXJpYywgc2luY2UgaXQgdmFyaWVzCiAgICAvLyBwZXItc2V0dGluZy4gSG93ZXZlciwgdGhpcyBpcyBvbmx5IGV2ZXIgZm9yIGEgc2luZ2xlIHNldHRpbmcsIHNvIHdlIGNhbgogICAgLy8gZW5mb3JjZSB0aGUgdHlwZXMgbW9yZSB0aG9yb3VnaGx5LgogICAgdmFyIHJhd1NldFNjaGVtYSA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycygnc2V0Jyk7CiAgICB2YXIgcmF3U2V0dGluZ1BhcmFtID0gcmF3U2V0U2NoZW1hWzBdOwogICAgdmFyIHByb3BzID0gJE9iamVjdC5hc3NpZ24oe30sIHJhd1NldHRpbmdQYXJhbS5wcm9wZXJ0aWVzKTsKICAgIHByb3BzLnNldHRpbmcgPSBzZXR0aW5nU2NoZW1hOwogICAgdmFyIG1vZFNldHRpbmdQYXJhbSA9IHsKICAgICAgbmFtZTogcmF3U2V0dGluZ1BhcmFtLm5hbWUsCiAgICAgIHR5cGU6IHJhd1NldHRpbmdQYXJhbS50eXBlLAogICAgICBwcm9wZXJ0aWVzOiBwcm9wcywKICAgIH07CiAgICB2YXIgbW9kU2V0U2NoZW1hID0gJEFycmF5LnNsaWNlKHJhd1NldFNjaGVtYSk7CiAgICBtb2RTZXRTY2hlbWFbMF0gPSBtb2RTZXR0aW5nUGFyYW07CiAgICB2YWxpZGF0ZShbZGV0YWlscywgY2FsbGJhY2tdLCBtb2RTZXRTY2hlbWEpOwoKICAgIHJldHVybiBzZW5kUmVxdWVzdCgnY29udGVudFNldHRpbmdzLnNldCcsCiAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRUeXBlLCBkZXRhaWxzLCBjYWxsYmFja10sCiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kU2NoZW1hKG1vZFNldFNjaGVtYSkpOwogIH07CgogIHRoaXMuY2xlYXIgPSBmdW5jdGlvbihkZXRhaWxzLCBjYWxsYmFjaykgewogICAgdmFyIGNsZWFyU2NoZW1hID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKCdjbGVhcicpOwogICAgdmFsaWRhdGUoW2RldGFpbHMsIGNhbGxiYWNrXSwgY2xlYXJTY2hlbWEpOwoKICAgIGlmICgkT2JqZWN0Lmhhc093blByb3BlcnR5KERFUFJFQ0FURURfQ09OVEVOVF9UWVBFUywgY29udGVudFR5cGUpKSB7CiAgICAgIGNvbnNvbGUud2FybignY29udGVudFNldHRpbmdzLicgKyBjb250ZW50VHlwZSArICcgaXMgZGVwcmVjYXRlZDsgJwogICAgICAgICAgICAgICAgICAgKyAnY2xlYXJpbmcgaXQgaGFzIG5vIGVmZmVjdC4nKTsKICAgICAgJEZ1bmN0aW9uLmFwcGx5KGNhbGxiYWNrLCB1bmRlZmluZWQsIFtdKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiBzZW5kUmVxdWVzdCgnY29udGVudFNldHRpbmdzLmNsZWFyJywKICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudFR5cGUsIGRldGFpbHMsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRTY2hlbWEoY2xlYXJTY2hlbWEpKTsKICB9OwoKICB0aGlzLmdldFJlc291cmNlSWRlbnRpZmllcnMgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgdmFyIHNjaGVtYSA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycygnZ2V0UmVzb3VyY2VJZGVudGlmaWVycycpOwogICAgdmFsaWRhdGUoW2NhbGxiYWNrXSwgc2NoZW1hKTsKCiAgICBpZiAoJE9iamVjdC5oYXNPd25Qcm9wZXJ0eShERVBSRUNBVEVEX0NPTlRFTlRfVFlQRVMsIGNvbnRlbnRUeXBlKSkgewogICAgICAkRnVuY3Rpb24uYXBwbHkoY2FsbGJhY2ssIHVuZGVmaW5lZCwgW10pOwogICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIHNlbmRSZXF1ZXN0KAogICAgICAgICdjb250ZW50U2V0dGluZ3MuZ2V0UmVzb3VyY2VJZGVudGlmaWVycycsCiAgICAgICAgW2NvbnRlbnRUeXBlLCBjYWxsYmFja10sCiAgICAgICAgZXh0ZW5kU2NoZW1hKHNjaGVtYSkpOwogIH07Cn0KCmV4cG9ydHMuJHNldCgnQ29udGVudFNldHRpbmcnLCBDb250ZW50U2V0dGluZyk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBkZWNsYXJhdGl2ZUNvbnRlbnQgQVBJLgoKdmFyIGJpbmRpbmcgPQogICAgYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnZGVjbGFyYXRpdmVDb250ZW50Jyk7CgppZiAoIWFwaUJyaWRnZSkgewogIHZhciB1dGlscyA9IHJlcXVpcmUoJ3V0aWxzJyk7CiAgdmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnc2NoZW1hVXRpbHMnKS52YWxpZGF0ZTsKICB2YXIgY2Fub25pY2FsaXplQ29tcG91bmRTZWxlY3RvciA9CiAgICAgIHJlcXVpcmVOYXRpdmUoJ2Nzc19uYXRpdmVzJykuQ2Fub25pY2FsaXplQ29tcG91bmRTZWxlY3RvcjsKfQoKdmFyIHNldEljb24gPSByZXF1aXJlKCdzZXRJY29uJykuc2V0SWNvbjsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGFwaSkgewogIHZhciBkZWNsYXJhdGl2ZUNvbnRlbnQgPSBhcGkuY29tcGlsZWRBcGk7CgogIGlmIChhcGlCcmlkZ2UpIHsKICAgIC8vIFZhbGlkYXRpb24gZm9yIG1vc3QgdHlwZXMgaXMgZG9uZSBpbiB0aGUgbmF0aXZlIEMrKyB3aXRoIG5hdGl2ZSBiaW5kaW5ncywKICAgIC8vIGJ1dCBzZXRJY29uIGlzIGZ1bm55IChhbmQgc2FkbHkgYnJva2VuKS4gSWRlYWxseSwgd2UgY2FuIG1vdmUgdGhpcwogICAgLy8gdmFsaWRhdGlvbiBlbnRpcmVseSBpbnRvIHRoZSBuYXRpdmUgY29kZSwgYW5kIHRoaXMgd2hvbGUgZmlsZSBjYW4gZ28KICAgIC8vIGF3YXkuCiAgICB2YXIgbmF0aXZlU2V0SWNvbiA9IGRlY2xhcmF0aXZlQ29udGVudC5TZXRJY29uOwogICAgZGVjbGFyYXRpdmVDb250ZW50LlNldEljb24gPSBmdW5jdGlvbihwYXJhbWV0ZXJzKSB7CiAgICAgIC8vIFRPRE8oZGV2bGluKTogVGhpcyBpcyB2ZXJ5LCB2ZXJ5IHdyb25nLiBzZXRJY29uKCkgaXMgcG90ZW50aWFsbHkKICAgICAgLy8gYXN5bmNocm9ub3VzIChpbiB0aGUgY2FzZSBvZiBhIHBhdGggYmVpbmcgc3BlY2lmaWVkKSwgd2hpY2ggbWVhbnMgdGhpcwogICAgICAvLyBiZWNvbWVzIGFuICJhc3luY2hyb25vdXMgY29uc3RydWN0b3IiLiBFcnJvcnMgY2FuIGJlIHRocm93biAqYWZ0ZXIqIHRoZQogICAgICAvLyBgbmV3IGRlY2xhcmF0aXZlQ29udGVudC5TZXRJY29uKC4uLilgIGNhbGwsIGFuZCBpbiB0aGUgYXN5bmMgY2FzZXMsCiAgICAgIC8vIHRoaXMgd291bGRuJ3Qgd29yayB3aGVuIHdlIGltbWVkaWF0ZWx5IGFkZCB0aGUgYWN0aW9uIHZpYSBhbiBBUEkgY2FsbAogICAgICAvLyAoZS5nLiwKICAgICAgLy8gICBjaHJvbWUuZGVjbGFyYXRpdmVDb250ZW50Lm9uUGFnZUNoYW5nZS5hZGRSdWxlcygKICAgICAgLy8gICAgICAgW3tjb25kaXRpb25zOiAuLi4sIGFjdGlvbnM6IFsgbmV3IFNldEljb24oLi4uKSBdfV0pOwogICAgICAvLyApLiBTb21lIG9mIHRoaXMgaXMgdHJhY2tlZCBpbiBodHRwOi8vY3JidWcuY29tLzQxNTMxNS4KICAgICAgc2V0SWNvbihwYXJhbWV0ZXJzLCAkRnVuY3Rpb24uYmluZChmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgLy8gRmFrZSBjYWxsaW5nIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBhcyBhIGNvbnN0cnVjdG9yLgogICAgICAgICRPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmF0aXZlU2V0SWNvbi5wcm90b3R5cGUpOwogICAgICAgICRGdW5jdGlvbi5hcHBseShuYXRpdmVTZXRJY29uLCB0aGlzLCBbZGF0YV0pOwogICAgICB9LCB0aGlzKSk7CiAgICB9OwogICAgcmV0dXJuOwogIH0KCiAgLy8gUmV0dXJucyB0aGUgc2NoZW1hIGRlZmluaXRpb24gb2YgdHlwZSB8dHlwZUlkfCBkZWZpbmVkIGluIHxuYW1lc3BhY2V8LgogIGZ1bmN0aW9uIGdldFNjaGVtYSh0eXBlSWQpIHsKICAgIHJldHVybiB1dGlscy5sb29rdXAoYXBpLnNjaGVtYS50eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlY2xhcmF0aXZlQ29udGVudC4nICsgdHlwZUlkKTsKICB9CgogIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIGNvbnN0cnVjdG9yIG9mIGNvbmNyZXRlIGRhdGF0eXBlcyBvZiB0aGUKICAvLyBkZWNsYXJhdGl2ZSBjb250ZW50IEFQSS4KICAvLyBNYWtlcyBzdXJlIHRoYXQgfHRoaXN8IGNvbnRhaW5zIHRoZSB1bmlvbiBvZiBwYXJhbWV0ZXJzIGFuZAogIC8vIHsnaW5zdGFuY2VUeXBlJzogJ2RlY2xhcmF0aXZlQ29udGVudC4nICsgdHlwZUlkfSBhbmQgdmFsaWRhdGVzIHRoZQogIC8vIGdlbmVyYXRlZCB1bmlvbiBkaWN0aW9uYXJ5IGFnYWluc3QgdGhlIHNjaGVtYSBmb3IgfHR5cGVJZHwuCiAgZnVuY3Rpb24gc2V0dXBJbnN0YW5jZShpbnN0YW5jZSwgcGFyYW1ldGVycywgdHlwZUlkKSB7CiAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1ldGVycykgewogICAgICBpZiAoJE9iamVjdC5oYXNPd25Qcm9wZXJ0eShwYXJhbWV0ZXJzLCBrZXkpKSB7CiAgICAgICAgaW5zdGFuY2Vba2V5XSA9IHBhcmFtZXRlcnNba2V5XTsKICAgICAgfQogICAgfQogICAgaW5zdGFuY2UuaW5zdGFuY2VUeXBlID0gJ2RlY2xhcmF0aXZlQ29udGVudC4nICsgdHlwZUlkOwogICAgdmFyIHNjaGVtYSA9IGdldFNjaGVtYSh0eXBlSWQpOwogICAgdmFsaWRhdGUoW2luc3RhbmNlXSwgW3NjaGVtYV0pOwogIH0KCiAgZnVuY3Rpb24gY2Fub25pY2FsaXplQ3NzU2VsZWN0b3JzKHNlbGVjdG9ycykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNhbm9uaWNhbGl6ZWRTZWxlY3RvciA9IGNhbm9uaWNhbGl6ZUNvbXBvdW5kU2VsZWN0b3Ioc2VsZWN0b3JzW2ldKTsKICAgICAgaWYgKGNhbm9uaWNhbGl6ZWRTZWxlY3RvciA9PSAnJykgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgJ0VsZW1lbnQgb2YgXCdjc3NcJyBhcnJheSBtdXN0IGJlIGEgJyArCiAgICAgICAgICAgICdsaXN0IG9mIHZhbGlkIGNvbXBvdW5kIHNlbGVjdG9yczogJyArCiAgICAgICAgICAgIHNlbGVjdG9yc1tpXSk7CiAgICAgIH0KICAgICAgc2VsZWN0b3JzW2ldID0gY2Fub25pY2FsaXplZFNlbGVjdG9yOwogICAgfQogIH0KCiAgLy8gU2V0dXAgYWxsIGRhdGEgdHlwZXMgZm9yIHRoZSBkZWNsYXJhdGl2ZSBjb250ZW50IEFQSS4KICBkZWNsYXJhdGl2ZUNvbnRlbnQuUGFnZVN0YXRlTWF0Y2hlciA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHsKICAgIHNldHVwSW5zdGFuY2UodGhpcywgcGFyYW1ldGVycywgJ1BhZ2VTdGF0ZU1hdGNoZXInKTsKICAgIGlmICgkT2JqZWN0Lmhhc093blByb3BlcnR5KHRoaXMsICdjc3MnKSkgewogICAgICBjYW5vbmljYWxpemVDc3NTZWxlY3RvcnModGhpcy5jc3MpOwogICAgfQogIH07CiAgZGVjbGFyYXRpdmVDb250ZW50LlNob3dQYWdlQWN0aW9uID0gZnVuY3Rpb24ocGFyYW1ldGVycykgewogICAgc2V0dXBJbnN0YW5jZSh0aGlzLCBwYXJhbWV0ZXJzLCAnU2hvd1BhZ2VBY3Rpb24nKTsKICB9OwogIGRlY2xhcmF0aXZlQ29udGVudC5SZXF1ZXN0Q29udGVudFNjcmlwdCA9IGZ1bmN0aW9uKHBhcmFtZXRlcnMpIHsKICAgIHNldHVwSW5zdGFuY2UodGhpcywgcGFyYW1ldGVycywgJ1JlcXVlc3RDb250ZW50U2NyaXB0Jyk7CiAgfTsKICAvLyBUT0RPKHJvY2tvdCk6IERvIG5vdCBleHBvc2UgdGhpcyBpbiBNMzkgc3RhYmxlLiBNYWtpbmcgdGhpcyByZXN0cmljdGlvbgogIC8vIHBvc3NpYmxlIHdpbGwgdGFrZSBzb21lIGV4dHJhIHdvcmsuIFNlZSBodHRwOi8vY3JidWcuY29tLzQxNTMxNQogIC8vIE5vdGU6IFNlZSBhbHNvIHRoZSBTZXRJY29uIHdyYXBwZXIgYWJvdmUgZm9yIG1vcmUgaXNzdWVzLgogIGRlY2xhcmF0aXZlQ29udGVudC5TZXRJY29uID0gZnVuY3Rpb24ocGFyYW1ldGVycykgewogICAgc2V0SWNvbihwYXJhbWV0ZXJzLCAkRnVuY3Rpb24uYmluZChmdW5jdGlvbihkYXRhKSB7CiAgICAgIHNldHVwSW5zdGFuY2UodGhpcywgZGF0YSwgJ1NldEljb24nKTsKICAgIH0sIHRoaXMpKTsKICB9Owp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIGRlc2t0b3BDYXB0dXJlIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnZGVza3RvcENhcHR1cmUnKTsKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0Owp2YXIgaWRHZW5lcmF0b3IgPSByZXF1aXJlTmF0aXZlKCdpZF9nZW5lcmF0b3InKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgdmFyIHBlbmRpbmdSZXF1ZXN0cyA9IHt9OwoKICBmdW5jdGlvbiBvblJlcXVlc3RSZXN1bHQoaWQsIHJlc3VsdCwgb3B0aW9ucykgewogICAgaWYgKGlkIGluIHBlbmRpbmdSZXF1ZXN0cykgewogICAgICB2YXIgY2FsbGJhY2sgPSBwZW5kaW5nUmVxdWVzdHNbaWRdOwogICAgICBkZWxldGUgcGVuZGluZ1JlcXVlc3RzW2lkXTsKICAgICAgY2FsbGJhY2socmVzdWx0LCBvcHRpb25zKTsKICAgIH0KICB9CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdjaG9vc2VEZXNrdG9wTWVkaWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHNvdXJjZXMsIHRhcmdldF90YWIsIGNhbGxiYWNrKSB7CiAgICAvLyB8dGFyZ2V0X3RhYnwgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLgogICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsKICAgICAgY2FsbGJhY2sgPSB0YXJnZXRfdGFiOwogICAgICB0YXJnZXRfdGFiID0gdW5kZWZpbmVkOwogICAgfQogICAgdmFyIGlkID0gaWRHZW5lcmF0b3IuR2V0TmV4dElkKCk7CiAgICBwZW5kaW5nUmVxdWVzdHNbaWRdID0gY2FsbGJhY2s7CiAgICBzZW5kUmVxdWVzdCgnZGVza3RvcENhcHR1cmUuY2hvb3NlRGVza3RvcE1lZGlhJywKICAgICAgICAgICAgICAgIFtpZCwgc291cmNlcywgdGFyZ2V0X3RhYiwKICAgICAgICAgICAgICAgICAkRnVuY3Rpb24uYmluZChvblJlcXVlc3RSZXN1bHQsIG51bGwsIGlkKV0sCiAgICAgICAgICAgICAgICBhcGlCcmlkZ2UgPyB1bmRlZmluZWQgOiB0aGlzLmRlZmluaXRpb24ucGFyYW1ldGVycywKICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7CiAgICByZXR1cm4gaWQ7CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdjYW5jZWxDaG9vc2VEZXNrdG9wTWVkaWEnLCBmdW5jdGlvbihpZCkgewogICAgaWYgKGlkIGluIHBlbmRpbmdSZXF1ZXN0cykgewogICAgICBkZWxldGUgcGVuZGluZ1JlcXVlc3RzW2lkXTsKICAgICAgc2VuZFJlcXVlc3QoJ2Rlc2t0b3BDYXB0dXJlLmNhbmNlbENob29zZURlc2t0b3BNZWRpYScsCiAgICAgICAgICAgICAgICAgIFtpZF0sIGFwaUJyaWRnZSA/IHVuZGVmaW5lZCA6IHRoaXMuZGVmaW5pdGlvbi5wYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICB1bmRlZmluZWQpOwogICAgfQogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIGRldmVsb3BlclByaXZhdGUgQVBJLgoKdmFyIGJpbmRpbmcgPQogICAgYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnZGV2ZWxvcGVyUHJpdmF0ZScpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICAvLyBDb252ZXJ0cyB0aGUgYXJndW1lbnQgb2YgfGZ1bmN0aW9uTmFtZXwgZnJvbSBEaXJlY3RvcnlFbnRyeSB0byBVUkwuCiAgZnVuY3Rpb24gYmluZEZpbGVTeXN0ZW1GdW5jdGlvbihmdW5jdGlvbk5hbWUpIHsKICAgIGFwaUZ1bmN0aW9ucy5zZXRVcGRhdGVBcmd1bWVudHNQb3N0VmFsaWRhdGUoCiAgICAgICAgZnVuY3Rpb25OYW1lLCBmdW5jdGlvbihkaXJlY3RvcnlFbnRyeSwgY2FsbGJhY2spIHsKICAgICAgICAgIHZhciBmaWxlU3lzdGVtTmFtZSA9IGRpcmVjdG9yeUVudHJ5LmZpbGVzeXN0ZW0ubmFtZTsKICAgICAgICAgIHZhciByZWxhdGl2ZVBhdGggPSAkU3RyaW5nLnNsaWNlKGRpcmVjdG9yeUVudHJ5LmZ1bGxQYXRoLCAxKTsKICAgICAgICAgIHZhciB1cmwgPSBkaXJlY3RvcnlFbnRyeS50b1VSTCgpOwogICAgICAgICAgcmV0dXJuIFtmaWxlU3lzdGVtTmFtZSwgcmVsYXRpdmVQYXRoLCB1cmwsIGNhbGxiYWNrXTsKICAgIH0pOwogIH0KCiAgYmluZEZpbGVTeXN0ZW1GdW5jdGlvbignbG9hZERpcmVjdG9yeScpOwoKICAvLyBkZXZlbG9wZXJQcml2YXRlLmVuYWJsZSBpcyB0aGUgc2FtZSBhcyBjaHJvbWUubWFuYWdlbWVudC5zZXRFbmFibGVkLgogIC8vIFRPRE8oZGV2bGluKTogTWlncmF0ZSBjYWxsZXJzIG9mZiBkZXZlbG9wZXJQcml2YXRlLmVuYWJsZS4KICBiaW5kaW5nc0FQSS5jb21waWxlZEFwaS5lbmFibGUgPSBjaHJvbWUubWFuYWdlbWVudC5zZXRFbmFibGVkOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnYWxsb3dGaWxlQWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihpZCwgYWxsb3csIGNhbGxiYWNrKSB7CiAgICBjaHJvbWUuZGV2ZWxvcGVyUHJpdmF0ZS51cGRhdGVFeHRlbnNpb25Db25maWd1cmF0aW9uKAogICAgICAgIHtleHRlbnNpb25JZDogaWQsIGZpbGVBY2Nlc3M6IGFsbG93fSwgY2FsbGJhY2spOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnYWxsb3dJbmNvZ25pdG8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGlkLCBhbGxvdywgY2FsbGJhY2spIHsKICAgIGNocm9tZS5kZXZlbG9wZXJQcml2YXRlLnVwZGF0ZUV4dGVuc2lvbkNvbmZpZ3VyYXRpb24oCiAgICAgICAge2V4dGVuc2lvbklkOiBpZCwgaW5jb2duaXRvQWNjZXNzOiBhbGxvd30sIGNhbGxiYWNrKTsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2luc3BlY3QnLCBmdW5jdGlvbihvcHRpb25zLCBjYWxsYmFjaykgewogICAgdmFyIHJlbmRlclZpZXdJZCA9IG9wdGlvbnMucmVuZGVyX3ZpZXdfaWQ7CiAgICBpZiAodHlwZW9mIHJlbmRlclZpZXdJZCA9PSAnc3RyaW5nJykgewogICAgICByZW5kZXJWaWV3SWQgPSBwYXJzZUludChyZW5kZXJWaWV3SWQpOwogICAgICBpZiAoaXNOYU4ocmVuZGVyVmlld0lkKSkKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHJlbmRlcl92aWV3X2lkJyk7CiAgICB9CiAgICB2YXIgcmVuZGVyUHJvY2Vzc0lkID0gb3B0aW9ucy5yZW5kZXJfcHJvY2Vzc19pZDsKICAgIGlmICh0eXBlb2YgcmVuZGVyUHJvY2Vzc0lkID09ICdzdHJpbmcnKSB7CiAgICAgIHJlbmRlclByb2Nlc3NJZCA9IHBhcnNlSW50KHJlbmRlclByb2Nlc3NJZCk7CiAgICAgIGlmIChpc05hTihyZW5kZXJQcm9jZXNzSWQpKQogICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBmb3IgcmVuZGVyX3Byb2Nlc3NfaWQnKTsKICAgIH0KICAgIGNocm9tZS5kZXZlbG9wZXJQcml2YXRlLm9wZW5EZXZUb29scyh7CiAgICAgICAgZXh0ZW5zaW9uSWQ6IG9wdGlvbnMuZXh0ZW5zaW9uX2lkLAogICAgICAgIHJlbmRlclByb2Nlc3NJZDogcmVuZGVyUHJvY2Vzc0lkLAogICAgICAgIHJlbmRlclZpZXdJZDogcmVuZGVyVmlld0lkLAogICAgICAgIGluY29nbml0bzogb3B0aW9ucy5pbmNvZ25pdG8KICAgIH0sIGNhbGxiYWNrKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5ncyBmb3IgdGhlIGRvd25sb2FkcyBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Rvd25sb2FkcycpOwp2YXIgZG93bmxvYWRzSW50ZXJuYWwgPQogICAgZ2V0SW50ZXJuYWxBcGkgPwogICAgICAgIGdldEludGVybmFsQXBpKCdkb3dubG9hZHNJbnRlcm5hbCcpIDoKICAgICAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2Rvd25sb2Fkc0ludGVybmFsJykuZ2VuZXJhdGUoKTsKdmFyIHJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlciA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnJlZ2lzdGVyRXZlbnRBcmd1bWVudE1hc3NhZ2VyLCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5yZWdpc3RlckFyZ3VtZW50TWFzc2FnZXI7CgpyZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIoJ2Rvd25sb2Fkcy5vbkRldGVybWluaW5nRmlsZW5hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oYXJncywgZGlzcGF0Y2gpIHsKICB2YXIgZG93bmxvYWRJdGVtID0gYXJnc1swXTsKICAvLyBDb3B5IHRoZSBpZCBzbyB0aGF0IGV4dGVuc2lvbnMgY2FuJ3QgY2hhbmdlIGl0LgogIHZhciBkb3dubG9hZElkID0gZG93bmxvYWRJdGVtLmlkOwogIHZhciBzdWdnZXN0YWJsZSA9IHRydWU7CiAgZnVuY3Rpb24gaXNWYWxpZFJlc3VsdChyZXN1bHQpIHsKICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgaWYgKHR5cGVvZihyZXN1bHQpICE9ICdvYmplY3QnKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBJbnZvY2F0aW9uIG9mIGZvcm0gc3VnZ2VzdCgnICsgdHlwZW9mKHJlc3VsdCkgKwogICAgICAgICAgICAgICAgICAgICcpIGRvZXNuXCd0IG1hdGNoIGRlZmluaXRpb24gc3VnZ2VzdCh7ZmlsZW5hbWU6IHN0cmluZywgJyArCiAgICAgICAgICAgICAgICAgICAgJ2NvbmZsaWN0QWN0aW9uOiBzdHJpbmd9KScpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKCh0eXBlb2YocmVzdWx0LmZpbGVuYW1lKSAhPSAnc3RyaW5nJykgfHwKICAgICAgICAgICAgICAgKHJlc3VsdC5maWxlbmFtZS5sZW5ndGggPT0gMCkpIHsKICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6ICJmaWxlbmFtZSIgcGFyYW1ldGVyIHRvIHN1Z2dlc3QoKSBtdXN0IGJlIGEgJyArCiAgICAgICAgICAgICAgICAgICAgJ25vbi1lbXB0eSBzdHJpbmcnKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChbdW5kZWZpbmVkLCAndW5pcXVpZnknLCAnb3ZlcndyaXRlJywgJ3Byb21wdCddLmluZGV4T2YoCiAgICAgICAgICAgICAgICAgcmVzdWx0LmNvbmZsaWN0QWN0aW9uKSA8IDApIHsKICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6ICJjb25mbGljdEFjdGlvbiIgcGFyYW1ldGVyIHRvIHN1Z2dlc3QoKSBtdXN0IGJlICcgKwogICAgICAgICAgICAgICAgICAgICdvbmUgb2YgdW5kZWZpbmVkLCAidW5pcXVpZnkiLCAib3ZlcndyaXRlIiwgInByb21wdCInKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIHN1Z2dlc3RDYWxsYmFjayhyZXN1bHQpIHsKICAgIGlmICghc3VnZ2VzdGFibGUpIHsKICAgICAgY29uc29sZS5lcnJvcignc3VnZ2VzdENhbGxiYWNrIG1heSBub3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLicpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzdWdnZXN0YWJsZSA9IGZhbHNlOwogICAgaWYgKGlzVmFsaWRSZXN1bHQocmVzdWx0KSkgewogICAgICBkb3dubG9hZHNJbnRlcm5hbC5kZXRlcm1pbmVGaWxlbmFtZSgKICAgICAgICAgIGRvd25sb2FkSWQsIHJlc3VsdC5maWxlbmFtZSwgcmVzdWx0LmNvbmZsaWN0QWN0aW9uIHx8ICIiKTsKICAgIH0gZWxzZSB7CiAgICAgIGRvd25sb2Fkc0ludGVybmFsLmRldGVybWluZUZpbGVuYW1lKGRvd25sb2FkSWQsICIiLCAiIik7CiAgICB9CiAgfQogIHRyeSB7CiAgICB2YXIgcmVzdWx0cyA9IGRpc3BhdGNoKFtkb3dubG9hZEl0ZW0sIHN1Z2dlc3RDYWxsYmFja10pOwogICAgdmFyIGFzeW5jID0gKHJlc3VsdHMgJiYKICAgICAgICAgICAgICAgICByZXN1bHRzLnJlc3VsdHMgJiYKICAgICAgICAgICAgICAgICAocmVzdWx0cy5yZXN1bHRzLmxlbmd0aCAhPSAwKSAmJgogICAgICAgICAgICAgICAgIChyZXN1bHRzLnJlc3VsdHNbMF0gPT09IHRydWUpKTsKICAgIGlmIChzdWdnZXN0YWJsZSAmJiAhYXN5bmMpCiAgICAgIHN1Z2dlc3RDYWxsYmFjaygpOwogIH0gY2F0Y2ggKGUpIHsKICAgIHN1Z2dlc3RDYWxsYmFjaygpOwogICAgdGhyb3cgZTsKICB9Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCnZhciBFdmVudCA9IHJlcXVpcmUoJ2V2ZW50X2JpbmRpbmdzJykuRXZlbnQ7CgovLyBUaGUgRWFzeVVubG9ja1Byb3hpbWl0eVJlcXVpcmVkIG9iamVjdCBpcyBqdXN0IGEgc3R1YiB0aGF0IGhhcyBhbiBvbkNoYW5nZQovLyBldmVudCwgd2hpY2ggaXMgbmV2ZXIgdHJpZ2dlcmVkLgovLyBUT0RPKGRldmxpbik6IFJlbW92ZSB0aGlzIG9uY2UgdGhlIHByZWZlcmVuY2VzUHJpdmF0ZSBBUEkgaXMgZnVsbHkgcmVtb3ZlZC4KLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vNTkzMTY2CmZ1bmN0aW9uIEVhc3lVbmxvY2tQcm94aW1pdHlSZXF1aXJlZChwcmVmS2V5LCB2YWx1ZVNjaGVtYSwgc2NoZW1hKSB7CiAgLy8gTm90ZTogdGVjaG5pY2FsbHksIGV4dGVuc2lvbnMgY291bGQgaW50ZXJjZXB0IHRoaXMgdGhyb3VnaCBhIHNldHRlciBvbgogIC8vIE9iamVjdC5wcm90b3R5cGUoKS4gV2UgZG9uJ3QgcmVhbGx5IGNhcmUsIGJlY2F1c2UgYSkgdGhpcyBpcyBvbmx5IGZvciBhCiAgLy8gcHJpdmF0ZSBBUEksIHNvIHdlIHNob3VsZG4ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHVudHJ1c3RlZCBjb2RlLCBhbmQgYikKICAvLyB0aGlzIGlzIGFuIGFub255bW91cyBldmVudCwgd2hpY2ggZXhwb3NlcyBubyBhdHRhY2sgc3VyZmFjZSBhbmQgd2lsbCBiZQogIC8vIGV4cG9zZWQgdG8gdGhlIGV4dGVuc2lvbiBhbnl3YXkuCiAgdGhpcy5vbkNoYW5nZSA9IG5ldyBFdmVudCgpOwp9OwoKZXhwb3J0cy4kc2V0KCdFYXN5VW5sb2NrUHJveGltaXR5UmVxdWlyZWQnLCBFYXN5VW5sb2NrUHJveGltaXR5UmVxdWlyZWQpOwovLyBDb3B5cmlnaHQgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBHQ00gQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdnY20nKTsKdmFyIGZvckVhY2ggPSByZXF1aXJlKCd1dGlscycpLmZvckVhY2g7CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CiAgdmFyIGdjbSA9IGJpbmRpbmdzQVBJLmNvbXBpbGVkQXBpOwoKICBhcGlGdW5jdGlvbnMuc2V0VXBkYXRlQXJndW1lbnRzUG9zdFZhbGlkYXRlKAogICAgJ3NlbmQnLCBmdW5jdGlvbihtZXNzYWdlLCBjYWxsYmFjaykgewogICAgICAvLyBWYWxpZGF0ZSBtZXNzYWdlLmRhdGEuCiAgICAgIHZhciBwYXlsb2FkU2l6ZSA9IDA7CiAgICAgIGZvckVhY2gobWVzc2FnZS5kYXRhLCBmdW5jdGlvbihwcm9wZXJ0eSwgdmFsdWUpIHsKICAgICAgICBpZiAocHJvcGVydHkubGVuZ3RoID09IDApCiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk9uZSBvZiBkYXRhIGtleXMgaXMgZW1wdHkuIik7CgogICAgICAgIHZhciBsb3dlckNhc2VkUHJvcGVydHkgPSBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpOwogICAgICAgIC8vIElzc3VlIGFuIGVycm9yIGZvciBmb3JiaWRkZW4gcHJlZml4ZXMgb2YgcHJvcGVydHkgbmFtZXMuCiAgICAgICAgaWYgKGxvd2VyQ2FzZWRQcm9wZXJ0eS5zdGFydHNXaXRoKCJnb29nLiIpIHx8CiAgICAgICAgICAgIGxvd2VyQ2FzZWRQcm9wZXJ0eS5zdGFydHNXaXRoKCJnb29nbGUiKSB8fAogICAgICAgICAgICBwcm9wZXJ0eS5zdGFydHNXaXRoKCJjb2xsYXBzZV9rZXkiKSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGRhdGEga2V5OiAiICsgcHJvcGVydHkpOwogICAgICAgIH0KCiAgICAgICAgcGF5bG9hZFNpemUgKz0gcHJvcGVydHkubGVuZ3RoICsgdmFsdWUubGVuZ3RoOwogICAgICB9KTsKCiAgICAgIGlmIChwYXlsb2FkU2l6ZSA+IGdjbS5NQVhfTUVTU0FHRV9TSVpFKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiUGF5bG9hZCBleGNlZWRlZCBhbGxvd2VkIHNpemUgbGltaXQuIFBheWxvYWQgc2l6ZSBpczogIgogICAgICAgICAgICArIHBheWxvYWRTaXplKTsKCiAgICAgIGlmIChwYXlsb2FkU2l6ZSA9PSAwKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gZGF0YSB0byBzZW5kLiIpOwoKICAgICAgcmV0dXJuIGFyZ3VtZW50czsKICAgIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIElkZW50aXR5IEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnaWRlbnRpdHknKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmcsIGlkLCBjb250ZXh0VHlwZSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nLmFwaUZ1bmN0aW9uczsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2dldFJlZGlyZWN0VVJMJywgZnVuY3Rpb24ocGF0aCkgewogICAgaWYgKHBhdGggPT09IG51bGwgfHwgcGF0aCA9PT0gdW5kZWZpbmVkKQogICAgICBwYXRoID0gJy8nOwogICAgZWxzZQogICAgICBwYXRoID0gU3RyaW5nKHBhdGgpOwogICAgaWYgKHBhdGhbMF0gIT0gJy8nKQogICAgICBwYXRoID0gJy8nICsgcGF0aDsKICAgIHJldHVybiAnaHR0cHM6Ly8nICsgaWQgKyAnLmNocm9taXVtYXBwLm9yZycgKyBwYXRoOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIGltYWdlIHdyaXRlciBwcml2YXRlIEFQSS4KCnZhciBiaW5kaW5nID0KICAgIGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ2ltYWdlV3JpdGVyUHJpdmF0ZScpOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICBhcGlGdW5jdGlvbnMuc2V0VXBkYXRlQXJndW1lbnRzUG9zdFZhbGlkYXRlKAogICAgICAnd3JpdGVGcm9tRmlsZScsIGZ1bmN0aW9uKGRldmljZSwgZmlsZUVudHJ5LCBvcHRpb25zLCBjYWxsYmFjaykgewogICAgdmFyIGZpbGVTeXN0ZW1OYW1lID0gZmlsZUVudHJ5LmZpbGVzeXN0ZW0ubmFtZTsKICAgIHZhciByZWxhdGl2ZVBhdGggPSAkU3RyaW5nLnNsaWNlKGZpbGVFbnRyeS5mdWxsUGF0aCwgMSk7CiAgICByZXR1cm4gW2RldmljZSwgZmlsZVN5c3RlbU5hbWUsIHJlbGF0aXZlUGF0aCwgY2FsbGJhY2tdOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBpbnB1dCBpbWUgQVBJLiBPbmx5IGluamVjdGVkIGludG8gdGhlCi8vIHY4IGNvbnRleHRzIGZvciBleHRlbnNpb25zIHdoaWNoIGhhdmUgcGVybWlzc2lvbiBmb3IgdGhlIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnaW5wdXQuaW1lJyk7CnZhciBhcHBXaW5kb3dOYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnYXBwX3dpbmRvd19uYXRpdmVzJyk7CnZhciByZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5yZWdpc3RlckV2ZW50QXJndW1lbnRNYXNzYWdlciwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ2V2ZW50X2JpbmRpbmdzJykucmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyOwoKLy8gVE9ETyhjcmJ1Zy5jb20vNzMzODI1KTogVGhlc2UgYmluZGluZ3MgaGF2ZSBzb21lIGlzc3Vlcy4KCnZhciBpbnB1dEltZTsKcmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyKCdpbnB1dC5pbWUub25LZXlFdmVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihhcmdzLCBkaXNwYXRjaCkgewogIHZhciBrZXlEYXRhID0gYXJnc1sxXTsKICB2YXIgcmVzdWx0ID0gZmFsc2U7CiAgdHJ5IHsKICAgIC8vIGRpc3BhdGNoKCkgaXMgd2VpcmQgLSBpdCByZXR1cm5zIGFuIG9iamVjdCB7cmVzdWx0czogYXJyYXk8cmVzdWx0cz59IGlmZgogICAgLy8gdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJlc3VsdCB2YWx1ZSB0aGF0ICE9PSB1bmRlZmluZWQuIFNpbmNlIG9uS2V5RXZlbnQKICAgIC8vIGhhcyBhIG1heGltdW0gb2Ygb25lIGxpc3RlbmVyLCB3ZSBrbm93IHRoYXQgYW55IHJlc3VsdCB3ZSBmaW5kIGlzIHRoZSBvbmUKICAgIC8vIHdlJ3JlIGludGVyZXN0ZWQgaW4uCiAgICB2YXIgZGlzcGF0Y2hSZXN1bHQgPSBkaXNwYXRjaChhcmdzKTsKICAgIGlmIChkaXNwYXRjaFJlc3VsdCAmJiBkaXNwYXRjaFJlc3VsdC5yZXN1bHRzKQogICAgICByZXN1bHQgPSBkaXNwYXRjaFJlc3VsdC5yZXN1bHRzWzBdOwogIH0gY2F0Y2ggKGUpIHsKICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGV2ZW50IGhhbmRsZXIgZm9yIG9uS2V5RXZlbnQ6ICcgKyBlLnN0YWNrKTsKICB9CiAgaWYgKCFpbnB1dEltZS5vbktleUV2ZW50LmFzeW5jKQogICAgaW5wdXRJbWUua2V5RXZlbnRIYW5kbGVkKGtleURhdGEucmVxdWVzdElkLCByZXN1bHQpOwp9KTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGFwaSkgewogaW5wdXRJbWUgPSBhcGkuY29tcGlsZWRBcGk7CgogIHZhciBvcmlnaW5hbEFkZExpc3RlbmVyID0gaW5wdXRJbWUub25LZXlFdmVudC5hZGRMaXN0ZW5lcjsKICBpbnB1dEltZS5vbktleUV2ZW50LmFkZExpc3RlbmVyID0gZnVuY3Rpb24oY2IsIG9wdF9leHRyYUluZm8pIHsKICAgIGlucHV0SW1lLm9uS2V5RXZlbnQuYXN5bmMgPSBmYWxzZTsKICAgIGlmIChvcHRfZXh0cmFJbmZvIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRfZXh0cmFJbmZvLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKG9wdF9leHRyYUluZm9baV0gPT0gJ2FzeW5jJykgewogICAgICAgICAgaW5wdXRJbWUub25LZXlFdmVudC5hc3luYyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAkRnVuY3Rpb24uY2FsbChvcmlnaW5hbEFkZExpc3RlbmVyLCB0aGlzLCBjYik7CiAgfTsKCiAgYXBpLmFwaUZ1bmN0aW9ucy5zZXRDdXN0b21DYWxsYmFjaygnY3JlYXRlV2luZG93JywKICAgICAgZnVuY3Rpb24obmFtZSwgcmVxdWVzdCwgY2FsbGJhY2ssIHdpbmRvd1BhcmFtcykgewogICAgaWYgKCFjYWxsYmFjaykgewogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgdmlldzsKICAgIGlmICh3aW5kb3dQYXJhbXMgJiYgd2luZG93UGFyYW1zLmZyYW1lSWQpIHsKICAgICAgdmlldyA9IGFwcFdpbmRvd05hdGl2ZXMuR2V0RnJhbWUoCiAgICAgICAgICB3aW5kb3dQYXJhbXMuZnJhbWVJZCwgZmFsc2UgLyogbm90aWZ5QnJvd3NlciAqLyk7CiAgICAgIHZpZXcuaWQgPSB3aW5kb3dQYXJhbXMuZnJhbWVJZDsKICAgIH0KICAgIGNhbGxiYWNrKHZpZXcpOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBNZWRpYSBHYWxsZXJ5IEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgnbWVkaWFHYWxsZXJpZXMnKTsKdmFyIGJsb2JOYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgnYmxvYl9uYXRpdmVzJyk7CnZhciBtZWRpYUdhbGxlcmllc05hdGl2ZXMgPSByZXF1aXJlTmF0aXZlKCdtZWRpYUdhbGxlcmllcycpOwp2YXIgc2VuZFJlcXVlc3QgPSBiaW5kaW5nVXRpbCA/CiAgICAkRnVuY3Rpb24uYmluZChiaW5kaW5nVXRpbC5zZW5kUmVxdWVzdCwgYmluZGluZ1V0aWwpIDoKICAgIHJlcXVpcmUoJ3NlbmRSZXF1ZXN0Jykuc2VuZFJlcXVlc3Q7Cgp2YXIgYmxvYnNBd2FpdGluZ01ldGFkYXRhID0ge307CnZhciBtZWRpYUdhbGxlcmllc01ldGFkYXRhID0ge307CgpmdW5jdGlvbiBjcmVhdGVGaWxlU3lzdGVtT2JqZWN0c0FuZFVwZGF0ZU1ldGFkYXRhKHJlc3BvbnNlKSB7CiAgdmFyIHJlc3VsdCA9IFtdOwogIG1lZGlhR2FsbGVyaWVzTWV0YWRhdGEgPSB7fTsgIC8vIENsZWFyIGFueSBwcmV2aW91cyBtZXRhZGF0YS4KICBpZiAocmVzcG9uc2UpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzcG9uc2UubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGZpbGVzeXN0ZW0gPSBtZWRpYUdhbGxlcmllc05hdGl2ZXMuR2V0TWVkaWFGaWxlU3lzdGVtT2JqZWN0KAogICAgICAgICAgcmVzcG9uc2VbaV0uZnNpZCk7CiAgICAgICRBcnJheS5wdXNoKHJlc3VsdCwgZmlsZXN5c3RlbSk7CiAgICAgIHZhciBtZXRhZGF0YSA9IHJlc3BvbnNlW2ldOwogICAgICBkZWxldGUgbWV0YWRhdGEuZnNpZDsKICAgICAgbWVkaWFHYWxsZXJpZXNNZXRhZGF0YVtmaWxlc3lzdGVtLm5hbWVdID0gbWV0YWRhdGE7CiAgICB9CiAgfQogIHJldHVybiByZXN1bHQ7Cn0KCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJLCBleHRlbnNpb25JZCkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIC8vIGdldE1lZGlhRmlsZVN5c3RlbXMgYW5kIGFkZFVzZXJTZWxlY3RlZEZvbGRlciB1c2UgYSBjdXN0b20gY2FsbGJhY2sgc28gdGhhdAogIC8vIHRoZXkgY2FuIGluc3RhbnRpYXRlIGFuZCByZXR1cm4gYW4gYXJyYXkgb2YgZmlsZSBzeXN0ZW0gb2JqZWN0cy4KICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ2dldE1lZGlhRmlsZVN5c3RlbXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihuYW1lLCByZXF1ZXN0LCBjYWxsYmFjaywgcmVzcG9uc2UpIHsKICAgIHZhciByZXN1bHQgPSBjcmVhdGVGaWxlU3lzdGVtT2JqZWN0c0FuZFVwZGF0ZU1ldGFkYXRhKHJlc3BvbnNlKTsKICAgIGlmIChjYWxsYmFjaykKICAgICAgY2FsbGJhY2socmVzdWx0KTsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEN1c3RvbUNhbGxiYWNrKCdhZGRVc2VyU2VsZWN0ZWRGb2xkZXInLAogICAgICBmdW5jdGlvbihuYW1lLCByZXF1ZXN0LCBjYWxsYmFjaywgcmVzcG9uc2UpIHsKICAgIHZhciBmaWxlU3lzdGVtcyA9IFtdOwogICAgdmFyIHNlbGVjdGVkRmlsZVN5c3RlbU5hbWUgPSAiIjsKICAgIGlmIChyZXNwb25zZSAmJiAnbWVkaWFGaWxlU3lzdGVtcycgaW4gcmVzcG9uc2UgJiYKICAgICAgICAnc2VsZWN0ZWRGaWxlU3lzdGVtSW5kZXgnIGluIHJlc3BvbnNlKSB7CiAgICAgIGZpbGVTeXN0ZW1zID0gY3JlYXRlRmlsZVN5c3RlbU9iamVjdHNBbmRVcGRhdGVNZXRhZGF0YSgKICAgICAgICAgIHJlc3BvbnNlWydtZWRpYUZpbGVTeXN0ZW1zJ10pOwogICAgICB2YXIgc2VsZWN0ZWRGaWxlU3lzdGVtSW5kZXggPSByZXNwb25zZVsnc2VsZWN0ZWRGaWxlU3lzdGVtSW5kZXgnXTsKICAgICAgaWYgKHNlbGVjdGVkRmlsZVN5c3RlbUluZGV4ID49IDApIHsKICAgICAgICBzZWxlY3RlZEZpbGVTeXN0ZW1OYW1lID0gZmlsZVN5c3RlbXNbc2VsZWN0ZWRGaWxlU3lzdGVtSW5kZXhdLm5hbWU7CiAgICAgIH0KICAgIH0KICAgIGlmIChjYWxsYmFjaykKICAgICAgY2FsbGJhY2soZmlsZVN5c3RlbXMsIHNlbGVjdGVkRmlsZVN5c3RlbU5hbWUpOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnZ2V0TWVkaWFGaWxlU3lzdGVtTWV0YWRhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGZpbGVzeXN0ZW0pIHsKICAgIGlmIChmaWxlc3lzdGVtICYmIGZpbGVzeXN0ZW0ubmFtZSAmJgogICAgICAgIGZpbGVzeXN0ZW0ubmFtZSBpbiBtZWRpYUdhbGxlcmllc01ldGFkYXRhKSB7CiAgICAgIHJldHVybiBtZWRpYUdhbGxlcmllc01ldGFkYXRhW2ZpbGVzeXN0ZW0ubmFtZV07CiAgICB9CiAgICByZXR1cm4gewogICAgICAnbmFtZSc6ICcnLAogICAgICAnZ2FsbGVyeUlkJzogJycsCiAgICAgICdpc1JlbW92YWJsZSc6IGZhbHNlLAogICAgICAnaXNNZWRpYURldmljZSc6IGZhbHNlLAogICAgICAnaXNBdmFpbGFibGUnOiBmYWxzZSwKICAgIH07CiAgfSk7CgogIGZ1bmN0aW9uIGdldE1ldGFkYXRhQ2FsbGJhY2sodXVpZCwgbmFtZSwgcmVxdWVzdCwgY2FsbGJhY2ssIHJlc3BvbnNlKSB7CiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuYXR0YWNoZWRJbWFnZXNCbG9iSW5mbykgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3BvbnNlLmF0dGFjaGVkSW1hZ2VzQmxvYkluZm8ubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgYmxvYkluZm8gPSByZXNwb25zZS5hdHRhY2hlZEltYWdlc0Jsb2JJbmZvW2ldOwogICAgICAgIHZhciBibG9iID0gYmxvYk5hdGl2ZXMuVGFrZUJyb3dzZXJQcm9jZXNzQmxvYigKICAgICAgICAgICAgYmxvYkluZm8uYmxvYlVVSUQsIGJsb2JJbmZvLnR5cGUsIGJsb2JJbmZvLnNpemUpOwogICAgICAgIHJlc3BvbnNlLm1ldGFkYXRhLmF0dGFjaGVkSW1hZ2VzLnB1c2goYmxvYik7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoY2FsbGJhY2spCiAgICAgIGNhbGxiYWNrKHJlc3BvbnNlID8gcmVzcG9uc2UubWV0YWRhdGEgOiBudWxsKTsKCiAgICBkZWxldGUgYmxvYnNBd2FpdGluZ01ldGFkYXRhW3V1aWRdOwogIH0KCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2dldE1ldGFkYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihtZWRpYUZpbGUsIG9wdGlvbnMsIGNhbGxiYWNrKSB7CiAgICB2YXIgYmxvYlV1aWQgPSBibG9iTmF0aXZlcy5HZXRCbG9iVXVpZChtZWRpYUZpbGUpCiAgICAvLyBTdG9yZSB0aGUgYmxvYiBpbiBhIGdsb2JhbCBvYmplY3QgdG8ga2VlcCBpdHMgcmVmY291bnQgbm9uemVybyAtLSB0aGlzCiAgICAvLyBwcmV2ZW50cyB0aGUgb2JqZWN0IGZyb20gYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQgYmVmb3JlIGFueSBtZXRhZGF0YQogICAgLy8gcGFyc2luZyBnZXRzIHRvIG9jY3VyIChzZWUgY3JidWcuY29tLzQxNTc5MikuCiAgICBibG9ic0F3YWl0aW5nTWV0YWRhdGFbYmxvYlV1aWRdID0gbWVkaWFGaWxlOwoKICAgIHZhciBvcHRBcmdzID0gewogICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgIGN1c3RvbUNhbGxiYWNrOiAkRnVuY3Rpb24uYmluZChnZXRNZXRhZGF0YUNhbGxiYWNrLCBudWxsLCBibG9iVXVpZCksCiAgICB9OwoKICAgIHNlbmRSZXF1ZXN0KCdtZWRpYUdhbGxlcmllcy5nZXRNZXRhZGF0YScsIFtibG9iVXVpZCwgb3B0aW9ucywgY2FsbGJhY2tdLAogICAgICAgICAgICAgICAgYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiB0aGlzLmRlZmluaXRpb24ucGFyYW1ldGVycywgb3B0QXJncyk7CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5ncyBmb3IgdGhlIG5vdGlmaWNhdGlvbnMgQVBJLgovLwp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ25vdGlmaWNhdGlvbnMnKTsKCnZhciBzZW5kUmVxdWVzdCA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnNlbmRSZXF1ZXN0LCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnc2VuZFJlcXVlc3QnKS5zZW5kUmVxdWVzdDsKdmFyIGV4Y2VwdGlvbkhhbmRsZXIgPSByZXF1aXJlKCd1bmNhdWdodF9leGNlcHRpb25faGFuZGxlcicpOwp2YXIgaW1hZ2VVdGlsID0gcmVxdWlyZSgnaW1hZ2VVdGlsJyk7CnZhciBub3RpZmljYXRpb25zUHJpdmF0ZSA9IHJlcXVpcmVOYXRpdmUoJ25vdGlmaWNhdGlvbnNfcHJpdmF0ZScpOwoKdmFyIGpzTGFzdEVycm9yID0gYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiByZXF1aXJlKCdsYXN0RXJyb3InKTsKZnVuY3Rpb24gcnVuQ2FsbGJhY2tXaXRoTGFzdEVycm9yKG5hbWUsIG1lc3NhZ2UsIHN0YWNrLCBjYWxsYmFjaywgYXJncykgewogIGlmIChiaW5kaW5nVXRpbCkgewogICAgYmluZGluZ1V0aWwucnVuQ2FsbGJhY2tXaXRoTGFzdEVycm9yKG1lc3NhZ2UsIGZ1bmN0aW9uKCkgewogICAgICAkRnVuY3Rpb24uYXBwbHkoY2FsbGJhY2ssIG51bGwsIGFyZ3MpOwogICAgfSk7CiAgfSBlbHNlIHsKICAgIGpzTGFzdEVycm9yLnJ1bihuYW1lLCBtZXNzYWdlLCBzdGFjaywgY2FsbGJhY2ssIGFyZ3MpOwogIH0KfQoKZnVuY3Rpb24gaW1hZ2VEYXRhU2V0dGVyKGNvbnRleHQsIGtleSkgewogIHZhciBmID0gZnVuY3Rpb24odmFsKSB7CiAgICB0aGlzW2tleV0gPSB2YWw7CiAgfTsKICByZXR1cm4gJEZ1bmN0aW9uLmJpbmQoZiwgY29udGV4dCk7Cn0KCi8vIEEgVVJMIFNwZWMgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOgovLyAgcGF0aDogVGhlIHJlc291cmNlIHRvIGJlIGRvd25sb2FkZWQuCi8vICB3aWR0aDogKG9wdGlvbmFsKSBUaGUgbWF4aW11bSB3aWR0aCBvZiB0aGUgaW1hZ2UgdG8gYmUgZG93bmxvYWRlZCBpbiBkZXZpY2UKLy8gICAgICAgICBwaXhlbHMuCi8vICBoZWlnaHQ6IChvcHRpb25hbCkgVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBpbWFnZSB0byBiZSBkb3dubG9hZGVkIGluCi8vICAgICAgICAgIGRldmljZSBwaXhlbHMuCi8vICBjYWxsYmFjazogQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgVVJMIGlzIGNvbXBsZXRlLiBJdAovLyAgICBzaG91bGQgYWNjZXB0IGFuIEltYWdlRGF0YSBvYmplY3QgYW5kIHNldCB0aGUgYXBwcm9wcmlhdGUKLy8gICAgZmllbGQgaW4gfG5vdGlmaWNhdGlvbkRldGFpbHN8LgpmdW5jdGlvbiBnZXRVcmxTcGVjcyhpbWFnZVNpemVzLCBub3RpZmljYXRpb25EZXRhaWxzKSB7CiAgdmFyIHVybFNwZWNzID0gW107CgogIC8vIHxpY29uVXJsfCBtaWdodCBiZSBvcHRpb25hbCBmb3Igbm90aWZpY2F0aW9uIHVwZGF0ZXMuCiAgaWYgKG5vdGlmaWNhdGlvbkRldGFpbHMuaWNvblVybCkgewogICAgJEFycmF5LnB1c2godXJsU3BlY3MsIHsKICAgICAgcGF0aDogbm90aWZpY2F0aW9uRGV0YWlscy5pY29uVXJsLAogICAgICB3aWR0aDogaW1hZ2VTaXplcy5pY29uLndpZHRoICogaW1hZ2VTaXplcy5zY2FsZUZhY3RvciwKICAgICAgaGVpZ2h0OiBpbWFnZVNpemVzLmljb24uaGVpZ2h0ICogaW1hZ2VTaXplcy5zY2FsZUZhY3RvciwKICAgICAgY2FsbGJhY2s6IGltYWdlRGF0YVNldHRlcihub3RpZmljYXRpb25EZXRhaWxzLCAnaWNvbkJpdG1hcCcpCiAgICB9KTsKICB9CgogIC8vIHxhcHBJY29uTWFza1VybHwgaXMgb3B0aW9uYWwuCiAgaWYgKG5vdGlmaWNhdGlvbkRldGFpbHMuYXBwSWNvbk1hc2tVcmwpIHsKICAgICRBcnJheS5wdXNoKHVybFNwZWNzLCB7CiAgICAgIHBhdGg6IG5vdGlmaWNhdGlvbkRldGFpbHMuYXBwSWNvbk1hc2tVcmwsCiAgICAgIHdpZHRoOiBpbWFnZVNpemVzLmFwcEljb25NYXNrLndpZHRoICogaW1hZ2VTaXplcy5zY2FsZUZhY3RvciwKICAgICAgaGVpZ2h0OiBpbWFnZVNpemVzLmFwcEljb25NYXNrLmhlaWdodCAqIGltYWdlU2l6ZXMuc2NhbGVGYWN0b3IsCiAgICAgIGNhbGxiYWNrOiBpbWFnZURhdGFTZXR0ZXIobm90aWZpY2F0aW9uRGV0YWlscywgJ2FwcEljb25NYXNrQml0bWFwJykKICAgIH0pOwogIH0KCiAgLy8gfGltYWdlVXJsfCBpcyBvcHRpb25hbC4KICBpZiAobm90aWZpY2F0aW9uRGV0YWlscy5pbWFnZVVybCkgewogICAgJEFycmF5LnB1c2godXJsU3BlY3MsIHsKICAgICAgcGF0aDogbm90aWZpY2F0aW9uRGV0YWlscy5pbWFnZVVybCwKICAgICAgd2lkdGg6IGltYWdlU2l6ZXMuaW1hZ2Uud2lkdGggKiBpbWFnZVNpemVzLnNjYWxlRmFjdG9yLAogICAgICBoZWlnaHQ6IGltYWdlU2l6ZXMuaW1hZ2UuaGVpZ2h0ICogaW1hZ2VTaXplcy5zY2FsZUZhY3RvciwKICAgICAgY2FsbGJhY2s6IGltYWdlRGF0YVNldHRlcihub3RpZmljYXRpb25EZXRhaWxzLCAnaW1hZ2VCaXRtYXAnKQogICAgfSk7CiAgfQoKICAvLyBFYWNoIGJ1dHRvbiBoYXMgYW4gb3B0aW9uYWwgaWNvbi4KICB2YXIgYnV0dG9uTGlzdCA9IG5vdGlmaWNhdGlvbkRldGFpbHMuYnV0dG9uczsKICBpZiAoYnV0dG9uTGlzdCAmJiB0eXBlb2YgYnV0dG9uTGlzdC5sZW5ndGggPT09ICdudW1iZXInKSB7CiAgICB2YXIgbnVtQnV0dG9ucyA9IGJ1dHRvbkxpc3QubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1CdXR0b25zOyBpKyspIHsKICAgICAgaWYgKGJ1dHRvbkxpc3RbaV0uaWNvblVybCkgewogICAgICAgICRBcnJheS5wdXNoKHVybFNwZWNzLCB7CiAgICAgICAgICBwYXRoOiBidXR0b25MaXN0W2ldLmljb25VcmwsCiAgICAgICAgICB3aWR0aDogaW1hZ2VTaXplcy5idXR0b25JY29uLndpZHRoICogaW1hZ2VTaXplcy5zY2FsZUZhY3RvciwKICAgICAgICAgIGhlaWdodDogaW1hZ2VTaXplcy5idXR0b25JY29uLmhlaWdodCAqIGltYWdlU2l6ZXMuc2NhbGVGYWN0b3IsCiAgICAgICAgICBjYWxsYmFjazogaW1hZ2VEYXRhU2V0dGVyKGJ1dHRvbkxpc3RbaV0sICdpY29uQml0bWFwJykKICAgICAgICB9KTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIHVybFNwZWNzOwp9CgpmdW5jdGlvbiByZXBsYWNlTm90aWZpY2F0aW9uT3B0aW9uVVJMcyhub3RpZmljYXRpb25fZGV0YWlscywgY2FsbGJhY2spIHsKICB2YXIgaW1hZ2VTaXplcyA9IG5vdGlmaWNhdGlvbnNQcml2YXRlLkdldE5vdGlmaWNhdGlvbkltYWdlU2l6ZXMoKTsKICB2YXIgdXJsX3NwZWNzID0gZ2V0VXJsU3BlY3MoaW1hZ2VTaXplcywgbm90aWZpY2F0aW9uX2RldGFpbHMpOwogIGlmICghdXJsX3NwZWNzLmxlbmd0aCkgewogICAgY2FsbGJhY2sodHJ1ZSk7CiAgICByZXR1cm47CiAgfQoKICB2YXIgZXJyb3JzID0gMDsKCiAgaW1hZ2VVdGlsLmxvYWRBbGxJbWFnZXModXJsX3NwZWNzLCB7CiAgICBvbmVycm9yOiBmdW5jdGlvbihpbmRleCkgewogICAgICBlcnJvcnMrKzsKICAgIH0sCiAgICBvbmNvbXBsZXRlOiBmdW5jdGlvbihpbWFnZURhdGEpIHsKICAgICAgaWYgKGVycm9ycyA+IDApIHsKICAgICAgICBjYWxsYmFjayhmYWxzZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB1cmxfc3BlY3MubGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgdmFyIHVybF9zcGVjID0gdXJsX3NwZWNzW2luZGV4XTsKICAgICAgICB1cmxfc3BlYy5jYWxsYmFjayhpbWFnZURhdGFbaW5kZXhdKTsKICAgICAgfQogICAgICBjYWxsYmFjayh0cnVlKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gZ2VuSGFuZGxlKG5hbWUsIGZhaWx1cmVfZnVuY3Rpb24pIHsKICByZXR1cm4gZnVuY3Rpb24oaWQsIGlucHV0X25vdGlmaWNhdGlvbl9kZXRhaWxzLCBjYWxsYmFjaykgewogICAgLy8gVE9ETyhkZXdpdHRqKTogUmVtb3ZlIHRoaXMgaGFjay4gVGhpcyBpcyB1c2VkIGFzIGEgd2F5IHRvIGRlZXAKICAgIC8vIGNvcHkgYSBjb21wbGV4IEpTT04gb2JqZWN0LgogICAgdmFyIG5vdGlmaWNhdGlvbl9kZXRhaWxzID0gJEpTT04ucGFyc2UoCiAgICAgICAgJEpTT04uc3RyaW5naWZ5KGlucHV0X25vdGlmaWNhdGlvbl9kZXRhaWxzKSk7CiAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICB2YXIgc3RhY2sgPSBleGNlcHRpb25IYW5kbGVyLmdldEV4dGVuc2lvblN0YWNrVHJhY2UoKTsKICAgIHJlcGxhY2VOb3RpZmljYXRpb25PcHRpb25VUkxzKG5vdGlmaWNhdGlvbl9kZXRhaWxzLCBmdW5jdGlvbihzdWNjZXNzKSB7CiAgICAgIGlmIChzdWNjZXNzKSB7CiAgICAgICAgc2VuZFJlcXVlc3QoCiAgICAgICAgICAgIG5hbWUsIFtpZCwgbm90aWZpY2F0aW9uX2RldGFpbHMsIGNhbGxiYWNrXSwKICAgICAgICAgICAgYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiB0aGF0LmRlZmluaXRpb24ucGFyYW1ldGVycywKICAgICAgICAgICAgYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiB7X19wcm90b19fOiBudWxsLCBzdGFjazogc3RhY2t9KTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgcnVuQ2FsbGJhY2tXaXRoTGFzdEVycm9yKAogICAgICAgICAgbmFtZSwgJ1VuYWJsZSB0byBkb3dubG9hZCBhbGwgc3BlY2lmaWVkIGltYWdlcy4nLAogICAgICAgICAgc3RhY2ssIGZhaWx1cmVfZnVuY3Rpb24sIFtjYWxsYmFjayB8fCBmdW5jdGlvbigpIHt9LCBpZF0pOwogICAgfSk7CiAgfTsKfQoKdmFyIGhhbmRsZUNyZWF0ZSA9IGdlbkhhbmRsZSgnbm90aWZpY2F0aW9ucy5jcmVhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGNhbGxiYWNrLCBpZCkgeyBjYWxsYmFjayhpZCk7IH0pOwp2YXIgaGFuZGxlVXBkYXRlID0gZ2VuSGFuZGxlKCdub3RpZmljYXRpb25zLnVwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oY2FsbGJhY2ssIGlkKSB7IGNhbGxiYWNrKGZhbHNlKTsgfSk7Cgp2YXIgbm90aWZpY2F0aW9uc0N1c3RvbUhvb2sgPSBmdW5jdGlvbihiaW5kaW5nc0FQSSwgZXh0ZW5zaW9uSWQpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdjcmVhdGUnLCBoYW5kbGVDcmVhdGUpOwogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCd1cGRhdGUnLCBoYW5kbGVVcGRhdGUpOwp9OwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2sobm90aWZpY2F0aW9uc0N1c3RvbUhvb2spOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIG9tbmlib3ggQVBJLiBPbmx5IGluamVjdGVkIGludG8gdGhlIHY4IGNvbnRleHRzCi8vIGZvciBleHRlbnNpb25zIHdoaWNoIGhhdmUgcGVybWlzc2lvbiBmb3IgdGhlIG9tbmlib3ggQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCdvbW5pYm94Jyk7Cgp2YXIgcmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwucmVnaXN0ZXJFdmVudEFyZ3VtZW50TWFzc2FnZXIsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdldmVudF9iaW5kaW5ncycpLnJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlcjsKCnZhciBzZW5kUmVxdWVzdCA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnNlbmRSZXF1ZXN0LCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnc2VuZFJlcXVlc3QnKS5zZW5kUmVxdWVzdDsKCi8vIFJlbW92ZSBpbnZhbGlkIGNoYXJhY3RlcnMgZnJvbSB8dGV4dHwgc28gdGhhdCBpdCBpcyBzdWl0YWJsZSB0byB1c2UKLy8gZm9yIHxBdXRvY29tcGxldGVNYXRjaDo6Y29udGVudHN8LgpmdW5jdGlvbiBzYW5pdGl6ZVN0cmluZyh0ZXh0LCBzaG91bGRUcmltKSB7CiAgLy8gTk9URTogVGhpcyBsb2dpYyBtaXJyb3JzIHxBdXRvY29tcGxldGVNYXRjaDo6U2FuaXRpemVTdHJpbmcoKXwuCiAgLy8gMHgyMDI4ID0gbGluZSBzZXBhcmF0b3I7IDB4MjAyOSA9IHBhcmFncmFwaCBzZXBhcmF0b3IuCiAgdmFyIGtSZW1vdmVDaGFycyA9IC8oXHJ8XG58XHR8XHUyMDI4fFx1MjAyOSkvZ207CiAgaWYgKHNob3VsZFRyaW0pCiAgICB0ZXh0ID0gdGV4dC50cmltTGVmdCgpOwogIHJldHVybiB0ZXh0LnJlcGxhY2Uoa1JlbW92ZUNoYXJzLCAnJyk7Cn0KCi8vIFBhcnNlcyB0aGUgeG1sIHN5bnRheCBzdXBwb3J0ZWQgYnkgb21uaWJveCBzdWdnZXN0aW9uIHJlc3VsdHMuIFJldHVybnMgYW4KLy8gb2JqZWN0IHdpdGggdHdvIHByb3BlcnRpZXM6ICdkZXNjcmlwdGlvbicsIHdoaWNoIGlzIGp1c3QgdGhlIHRleHQgY29udGVudCwKLy8gYW5kICdkZXNjcmlwdGlvblN0eWxlcycsIHdoaWNoIGlzIGFuIGFycmF5IG9mIHN0eWxlIG9iamVjdHMgaW4gYSBmb3JtYXQKLy8gdW5kZXJzdG9vZCBieSB0aGUgQysrIGJhY2tlbmQuCmZ1bmN0aW9uIHBhcnNlT21uaWJveERlc2NyaXB0aW9uKGlucHV0KSB7CiAgdmFyIGRvbVBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKCiAgLy8gVGhlIFhNTCBwYXJzZXIgcmVxdWlyZXMgYSBzaW5nbGUgdG9wLWxldmVsIGVsZW1lbnQsIGJ1dCB3ZSB3YW50IHRvCiAgLy8gc3VwcG9ydCB0aGluZ3MgbGlrZSAnaGVsbG8sIDxtYXRjaD53b3JsZDwvbWF0Y2g+IScuIFNvIHdlIHdyYXAgdGhlCiAgLy8gcHJvdmlkZWQgdGV4dCBpbiBnZW5lcmF0ZWQgcm9vdCBsZXZlbCBlbGVtZW50LgogIHZhciByb290ID0gZG9tUGFyc2VyLnBhcnNlRnJvbVN0cmluZygKICAgICAgJzxmcmFnbWVudD4nICsgaW5wdXQgKyAnPC9mcmFnbWVudD4nLCAndGV4dC94bWwnKTsKCiAgLy8gRE9NUGFyc2VyIGhhcyBhIHRlcnJpYmxlIGVycm9yIHJlcG9ydGluZyBmYWNpbGl0eS4gRXJyb3JzIGNvbWUgb3V0IG5lc3RlZAogIC8vIGluc2lkZSB0aGUgcmV0dXJuZWQgZG9jdW1lbnQuCiAgdmFyIGVycm9yID0gcm9vdC5xdWVyeVNlbGVjdG9yKCdwYXJzZXJlcnJvciBkaXYnKTsKICBpZiAoZXJyb3IpIHsKICAgIHRocm93IG5ldyBFcnJvcihlcnJvci50ZXh0Q29udGVudCk7CiAgfQoKICAvLyBPdGhlcndpc2UsIGl0J3MgdmFsaWQsIHNvIGJ1aWxkIHVwIHRoZSByZXN1bHQuCiAgdmFyIHJlc3VsdCA9IHsKICAgIGRlc2NyaXB0aW9uOiAnJywKICAgIGRlc2NyaXB0aW9uU3R5bGVzOiBbXQogIH07CgogIC8vIFJlY3Vyc2l2ZWx5IHdhbGsgdGhlIHRyZWUuCiAgZnVuY3Rpb24gd2Fsayhub2RlKSB7CiAgICBmb3IgKHZhciBpID0gMCwgY2hpbGQ7IGNoaWxkID0gbm9kZS5jaGlsZE5vZGVzW2ldOyBpKyspIHsKICAgICAgLy8gQXBwZW5kIHRleHQgbm9kZXMgdG8gb3VyIGRlc2NyaXB0aW9uLgogICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICB2YXIgc2hvdWxkVHJpbSA9IHJlc3VsdC5kZXNjcmlwdGlvbi5sZW5ndGggPT0gMDsKICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gKz0gc2FuaXRpemVTdHJpbmcoY2hpbGQubm9kZVZhbHVlLCBzaG91bGRUcmltKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgLy8gUHJvY2VzcyBhbmQgZGVzY2VuZCBpbnRvIGEgc3Vic2V0IG9mIHJlY29nbml6ZWQgdGFncy4KICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFICYmCiAgICAgICAgICAoY2hpbGQubm9kZU5hbWUgPT0gJ2RpbScgfHwgY2hpbGQubm9kZU5hbWUgPT0gJ21hdGNoJyB8fAogICAgICAgICAgIGNoaWxkLm5vZGVOYW1lID09ICd1cmwnKSkgewogICAgICAgIHZhciBzdHlsZSA9IHsKICAgICAgICAgICd0eXBlJzogY2hpbGQubm9kZU5hbWUsCiAgICAgICAgICAnb2Zmc2V0JzogcmVzdWx0LmRlc2NyaXB0aW9uLmxlbmd0aAogICAgICAgIH07CiAgICAgICAgJEFycmF5LnB1c2gocmVzdWx0LmRlc2NyaXB0aW9uU3R5bGVzLCBzdHlsZSk7CiAgICAgICAgd2FsayhjaGlsZCk7CiAgICAgICAgc3R5bGUubGVuZ3RoID0gcmVzdWx0LmRlc2NyaXB0aW9uLmxlbmd0aCAtIHN0eWxlLm9mZnNldDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgLy8gRGVzY2VuZCBpbnRvIGFsbCBvdGhlciBub2RlcywgZXZlbiBpZiB0aGV5IGFyZSB1bnJlY29nbml6ZWQsIGZvcgogICAgICAvLyBmb3J3YXJkIGNvbXBhdC4KICAgICAgd2FsayhjaGlsZCk7CiAgICB9CiAgfTsKICB3YWxrKHJvb3QpOwoKICByZXR1cm4gcmVzdWx0Owp9CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CgogIGFwaUZ1bmN0aW9ucy5zZXRVcGRhdGVBcmd1bWVudHNQcmVWYWxpZGF0ZSgnc2V0RGVmYXVsdFN1Z2dlc3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihzdWdnZXN0UmVzdWx0KSB7CiAgICBpZiAoc3VnZ2VzdFJlc3VsdC5jb250ZW50ICE9IHVuZGVmaW5lZCkgeyAgLy8gbnVsbCwgZXRjLgogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnc2V0RGVmYXVsdFN1Z2dlc3Rpb24gY2Fubm90IGNvbnRhaW4gdGhlICJjb250ZW50IiBmaWVsZCcpOwogICAgfQogICAgcmV0dXJuIFtzdWdnZXN0UmVzdWx0XTsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3NldERlZmF1bHRTdWdnZXN0aW9uJywgZnVuY3Rpb24oZGV0YWlscykgewogICAgdmFyIHBhcnNlUmVzdWx0ID0gcGFyc2VPbW5pYm94RGVzY3JpcHRpb24oZGV0YWlscy5kZXNjcmlwdGlvbik7CiAgICBzZW5kUmVxdWVzdCgnb21uaWJveC5zZXREZWZhdWx0U3VnZ2VzdGlvbicsIFtwYXJzZVJlc3VsdF0sCiAgICAgICAgICAgICAgICBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHRoaXMuZGVmaW5pdGlvbi5wYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgdW5kZWZpbmVkKTsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldFVwZGF0ZUFyZ3VtZW50c1Bvc3RWYWxpZGF0ZSgKICAgICAgJ3NlbmRTdWdnZXN0aW9ucycsIGZ1bmN0aW9uKHJlcXVlc3RJZCwgdXNlclN1Z2dlc3Rpb25zKSB7CiAgICB2YXIgc3VnZ2VzdGlvbnMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXNlclN1Z2dlc3Rpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBwYXJzZVJlc3VsdCA9IHBhcnNlT21uaWJveERlc2NyaXB0aW9uKAogICAgICAgICAgdXNlclN1Z2dlc3Rpb25zW2ldLmRlc2NyaXB0aW9uKTsKICAgICAgcGFyc2VSZXN1bHQuY29udGVudCA9IHVzZXJTdWdnZXN0aW9uc1tpXS5jb250ZW50OwogICAgICBwYXJzZVJlc3VsdC5kZWxldGFibGUgPSB1c2VyU3VnZ2VzdGlvbnNbaV0uZGVsZXRhYmxlOwogICAgICAkQXJyYXkucHVzaChzdWdnZXN0aW9ucywgcGFyc2VSZXN1bHQpOwogICAgfQogICAgcmV0dXJuIFtyZXF1ZXN0SWQsIHN1Z2dlc3Rpb25zXTsKICB9KTsKfSk7CgpyZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIoJ29tbmlib3gub25JbnB1dENoYW5nZWQnLCBmdW5jdGlvbihhcmdzLCBkaXNwYXRjaCkgewogIHZhciB0ZXh0ID0gYXJnc1swXTsKICB2YXIgcmVxdWVzdElkID0gYXJnc1sxXTsKICB2YXIgc3VnZ2VzdENhbGxiYWNrID0gZnVuY3Rpb24oc3VnZ2VzdGlvbnMpIHsKICAgIGNocm9tZS5vbW5pYm94LnNlbmRTdWdnZXN0aW9ucyhyZXF1ZXN0SWQsIHN1Z2dlc3Rpb25zKTsKICB9OwogIGRpc3BhdGNoKFt0ZXh0LCBzdWdnZXN0Q2FsbGJhY2tdKTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgcGFnZUFjdGlvbiBBUEkuCgp2YXIgYmluZGluZyA9IGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ3BhZ2VBY3Rpb24nKTsKdmFyIHNldEljb24gPSByZXF1aXJlKCdzZXRJY29uJykuc2V0SWNvbjsKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0OwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnc2V0SWNvbicsIGZ1bmN0aW9uKGRldGFpbHMsIGNhbGxiYWNrKSB7CiAgICBzZXRJY29uKGRldGFpbHMsICRGdW5jdGlvbi5iaW5kKGZ1bmN0aW9uKGFyZ3MpIHsKICAgICAgc2VuZFJlcXVlc3QoJ3BhZ2VBY3Rpb24uc2V0SWNvbicsIFthcmdzLCBjYWxsYmFja10sCiAgICAgICAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7CiAgICB9LCB0aGlzKSk7CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIHBhZ2VDYXB0dXJlIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgncGFnZUNhcHR1cmUnKTsKCnZhciBoYW5kbGVVbmNhdWdodEV4Y2VwdGlvbiA9IHJlcXVpcmUoJ3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyJykuaGFuZGxlOwp2YXIgcGFnZUNhcHR1cmVOYXRpdmVzID0gcmVxdWlyZU5hdGl2ZSgncGFnZV9jYXB0dXJlJyk7CnZhciBDcmVhdGVCbG9iID0gcGFnZUNhcHR1cmVOYXRpdmVzLkNyZWF0ZUJsb2I7CnZhciBTZW5kUmVzcG9uc2VBY2sgPSBwYWdlQ2FwdHVyZU5hdGl2ZXMuU2VuZFJlc3BvbnNlQWNrOwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ3NhdmVBc01IVE1MJywKICAgICAgZnVuY3Rpb24obmFtZSwgcmVxdWVzdCwgY2FsbGJhY2ssIHJlc3BvbnNlKSB7CiAgICBpZiAocmVzcG9uc2UpCiAgICAgIHJlc3BvbnNlID0gQ3JlYXRlQmxvYihyZXNwb25zZS5taHRtbEZpbGVQYXRoLCByZXNwb25zZS5taHRtbEZpbGVMZW5ndGgpOwoKICAgIHRyeSB7CiAgICAgIGNhbGxiYWNrKHJlc3BvbnNlKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaGFuZGxlVW5jYXVnaHRFeGNlcHRpb24oCiAgICAgICAgICAnRXJyb3IgaW4gY2hyb21lLnBhZ2VDYXB0dXJlLnNhdmVBc01IVE1MIGNhbGxiYWNrJywgZSwgcmVxdWVzdC5zdGFjayk7CiAgICB9IGZpbmFsbHkgewogICAgICAvLyBOb3RpZnkgdGhlIGJyb3dzZXIuIE5vdyB0aGF0IHRoZSBibG9iIGlzIHJlZmVyZW5jZWQgZnJvbSBKYXZhU2NyaXB0LAogICAgICAvLyB0aGUgYnJvd3NlciBjYW4gZHJvcCBpdHMgcmVmZXJlbmNlIHRvIGl0LgogICAgICBTZW5kUmVzcG9uc2VBY2socmVxdWVzdC5pZCk7CiAgICB9CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIHN5bmNGaWxlU3lzdGVtIEFQSS4KCnZhciBiaW5kaW5nID0KICAgIGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ3N5bmNGaWxlU3lzdGVtJyk7Cgp2YXIgcmVnaXN0ZXJBcmd1bWVudE1hc3NhZ2VyID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwucmVnaXN0ZXJFdmVudEFyZ3VtZW50TWFzc2FnZXIsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdldmVudF9iaW5kaW5ncycpLnJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlcjsKCnZhciBmaWxlU3lzdGVtTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ2ZpbGVfc3lzdGVtX25hdGl2ZXMnKTsKdmFyIHN5bmNGaWxlU3lzdGVtTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ3N5bmNfZmlsZV9zeXN0ZW0nKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgLy8gRnVuY3Rpb25zIHdoaWNoIHRha2UgaW4gYW4gW2luc3RhbmNlT2Y9RmlsZUVudHJ5XS4KICBmdW5jdGlvbiBiaW5kRmlsZUVudHJ5RnVuY3Rpb24oZnVuY3Rpb25OYW1lKSB7CiAgICBhcGlGdW5jdGlvbnMuc2V0VXBkYXRlQXJndW1lbnRzUG9zdFZhbGlkYXRlKAogICAgICAgIGZ1bmN0aW9uTmFtZSwgZnVuY3Rpb24oZW50cnksIGNhbGxiYWNrKSB7CiAgICAgIHZhciBmaWxlU3lzdGVtVXJsID0gZW50cnkudG9VUkwoKTsKICAgICAgcmV0dXJuIFtmaWxlU3lzdGVtVXJsLCBjYWxsYmFja107CiAgICB9KTsKICB9CiAgJEFycmF5LmZvckVhY2goWydnZXRGaWxlU3RhdHVzJ10sIGJpbmRGaWxlRW50cnlGdW5jdGlvbik7CgogIC8vIEZ1bmN0aW9ucyB3aGljaCB0YWtlIGluIGEgRmlsZUVudHJ5IGFycmF5LgogIGZ1bmN0aW9uIGJpbmRGaWxlRW50cnlBcnJheUZ1bmN0aW9uKGZ1bmN0aW9uTmFtZSkgewogICAgYXBpRnVuY3Rpb25zLnNldFVwZGF0ZUFyZ3VtZW50c1Bvc3RWYWxpZGF0ZSgKICAgICAgICBmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uKGVudHJpZXMsIGNhbGxiYWNrKSB7CiAgICAgIHZhciBmaWxlU3lzdGVtVXJsQXJyYXkgPSBbXTsKICAgICAgZm9yICh2YXIgaT0wOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICRBcnJheS5wdXNoKGZpbGVTeXN0ZW1VcmxBcnJheSwgZW50cmllc1tpXS50b1VSTCgpKTsKICAgICAgfQogICAgICByZXR1cm4gW2ZpbGVTeXN0ZW1VcmxBcnJheSwgY2FsbGJhY2tdOwogICAgfSk7CiAgfQogICRBcnJheS5mb3JFYWNoKFsnZ2V0RmlsZVN0YXR1c2VzJ10sIGJpbmRGaWxlRW50cnlBcnJheUZ1bmN0aW9uKTsKCiAgLy8gRnVuY3Rpb25zIHdoaWNoIHRha2UgaW4gYW4gW2luc3RhbmNlT2Y9RE9NRmlsZVN5c3RlbV0uCiAgZnVuY3Rpb24gYmluZEZpbGVTeXN0ZW1GdW5jdGlvbihmdW5jdGlvbk5hbWUpIHsKICAgIGFwaUZ1bmN0aW9ucy5zZXRVcGRhdGVBcmd1bWVudHNQb3N0VmFsaWRhdGUoCiAgICAgICAgZnVuY3Rpb25OYW1lLCBmdW5jdGlvbihmaWxlc3lzdGVtLCBjYWxsYmFjaykgewogICAgICB2YXIgZmlsZVN5c3RlbVVybCA9IGZpbGVzeXN0ZW0ucm9vdC50b1VSTCgpOwogICAgICByZXR1cm4gW2ZpbGVTeXN0ZW1VcmwsIGNhbGxiYWNrXTsKICAgIH0pOwogIH0KICAkQXJyYXkuZm9yRWFjaChbJ2dldFVzYWdlQW5kUXVvdGEnXSwgYmluZEZpbGVTeXN0ZW1GdW5jdGlvbik7CgogIC8vIEZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYW4gW2luc3RhbmNlT2Y9RE9NRmlsZVN5c3RlbV0uCiAgYXBpRnVuY3Rpb25zLnNldEN1c3RvbUNhbGxiYWNrKCdyZXF1ZXN0RmlsZVN5c3RlbScsCiAgICAgIGZ1bmN0aW9uKG5hbWUsIHJlcXVlc3QsIGNhbGxiYWNrLCByZXNwb25zZSkgewogICAgdmFyIHJlc3VsdCA9IG51bGw7CiAgICBpZiAocmVzcG9uc2UpIHsKICAgICAgcmVzdWx0ID0gc3luY0ZpbGVTeXN0ZW1OYXRpdmVzLkdldFN5bmNGaWxlU3lzdGVtT2JqZWN0KAogICAgICAgICAgcmVzcG9uc2UubmFtZSwgcmVzcG9uc2Uucm9vdCk7CiAgICB9CiAgICBpZiAoY2FsbGJhY2spCiAgICAgIGNhbGxiYWNrKHJlc3VsdCk7CiAgfSk7CgogIC8vIEZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYW4gYXJyYXkgb2YgRmlsZVN0YXR1c0luZm8gb2JqZWN0CiAgLy8gd2hpY2ggaGFzIFtpbnN0YW5jZU9mPUZpbGVFbnRyeV0uCiAgYXBpRnVuY3Rpb25zLnNldEN1c3RvbUNhbGxiYWNrKCdnZXRGaWxlU3RhdHVzZXMnLAogICAgICBmdW5jdGlvbihuYW1lLCByZXF1ZXN0LCBjYWxsYmFjaywgcmVzcG9uc2UpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICBpZiAocmVzcG9uc2UpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXNwb25zZS5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgICB2YXIgZW50cnkgPSByZXNwb25zZVtpXS5lbnRyeTsKICAgICAgICByZXN1bHQuZmlsZUVudHJ5ID0gZmlsZVN5c3RlbU5hdGl2ZXMuR2V0RmlsZUVudHJ5KAogICAgICAgICAgICBlbnRyeS5maWxlU3lzdGVtVHlwZSwKICAgICAgICAgICAgZW50cnkuZmlsZVN5c3RlbU5hbWUsCiAgICAgICAgICAgIGVudHJ5LnJvb3RVcmwsCiAgICAgICAgICAgIGVudHJ5LmZpbGVQYXRoLAogICAgICAgICAgICBlbnRyeS5pc0RpcmVjdG9yeSk7CiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJlc3BvbnNlW2ldLnN0YXR1czsKICAgICAgICByZXN1bHQuZXJyb3IgPSByZXNwb25zZVtpXS5lcnJvcjsKICAgICAgICAkQXJyYXkucHVzaChyZXN1bHRzLCByZXN1bHQpOwogICAgICB9CiAgICB9CiAgICBpZiAoY2FsbGJhY2spCiAgICAgIGNhbGxiYWNrKHJlc3VsdHMpOwogIH0pOwp9KTsKCnJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlcignc3luY0ZpbGVTeXN0ZW0ub25GaWxlU3RhdHVzQ2hhbmdlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihhcmdzLCBkaXNwYXRjaCkgewogIC8vIE1ha2UgRmlsZUVudHJ5IG9iamVjdCB1c2luZyBhbGwgdGhlIGJhc2Ugc3RyaW5nIGZpZWxkcy4KICB2YXIgZmlsZUVudHJ5ID0gZmlsZVN5c3RlbU5hdGl2ZXMuR2V0RmlsZUVudHJ5KAogICAgICBhcmdzWzBdLmZpbGVTeXN0ZW1UeXBlLAogICAgICBhcmdzWzBdLmZpbGVTeXN0ZW1OYW1lLAogICAgICBhcmdzWzBdLnJvb3RVcmwsCiAgICAgIGFyZ3NbMF0uZmlsZVBhdGgsCiAgICAgIGFyZ3NbMF0uaXNEaXJlY3RvcnkpOwoKICAvLyBDb21iaW5lIGludG8gYSBzaW5nbGUgZGljdGlvbmFyeS4KICB2YXIgZmlsZUluZm8gPSBuZXcgT2JqZWN0KCk7CiAgZmlsZUluZm8uZmlsZUVudHJ5ID0gZmlsZUVudHJ5OwogIGZpbGVJbmZvLnN0YXR1cyA9IGFyZ3NbMV07CiAgaWYgKGZpbGVJbmZvLnN0YXR1cyA9PSAic3luY2VkIikgewogICAgZmlsZUluZm8uYWN0aW9uID0gYXJnc1syXTsKICAgIGZpbGVJbmZvLmRpcmVjdGlvbiA9IGFyZ3NbM107CiAgfQogIGRpc3BhdGNoKFtmaWxlSW5mb10pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBzeXN0ZW1JbmRpY2F0b3IgQVBJLgovLyBUT0RPKGRld2l0dGopIFJlZmFjdG9yIGN1c3RvbSBiaW5kaW5nIHRvIHJlZHVjZSByZWR1bmRhbmN5IGJldHdlZW4gdGhlCi8vIGV4dGVuc2lvbiBhY3Rpb24gQVBJcy4KCnZhciBiaW5kaW5nID0KICAgIGFwaUJyaWRnZSB8fCByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ3N5c3RlbUluZGljYXRvcicpOwoKdmFyIHNldEljb24gPSByZXF1aXJlKCdzZXRJY29uJykuc2V0SWNvbjsKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0OwoKYmluZGluZy5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYmluZGluZ3NBUEkpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnc2V0SWNvbicsIGZ1bmN0aW9uKGRldGFpbHMsIGNhbGxiYWNrKSB7CiAgICBzZXRJY29uKGRldGFpbHMsICRGdW5jdGlvbi5iaW5kKGZ1bmN0aW9uKGFyZ3MpIHsKICAgICAgc2VuZFJlcXVlc3QoJ3N5c3RlbUluZGljYXRvci5zZXRJY29uJywgW2FyZ3MsIGNhbGxiYWNrXSwKICAgICAgICAgICAgICAgICAgYmluZGluZ1V0aWwgPyB1bmRlZmluZWQgOiB0aGlzLmRlZmluaXRpb24ucGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkKTsKICAgIH0sIHRoaXMpKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgVGFiIENhcHR1cmUgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCd0YWJDYXB0dXJlJyk7Cgp2YXIganNMYXN0RXJyb3IgPSBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHJlcXVpcmUoJ2xhc3RFcnJvcicpOwpmdW5jdGlvbiBydW5DYWxsYmFja1dpdGhMYXN0RXJyb3IobmFtZSwgbWVzc2FnZSwgc3RhY2ssIGNhbGxiYWNrLCBhcmdzKSB7CiAgaWYgKGJpbmRpbmdVdGlsKSB7CiAgICBiaW5kaW5nVXRpbC5ydW5DYWxsYmFja1dpdGhMYXN0RXJyb3IobWVzc2FnZSwgZnVuY3Rpb24oKSB7CiAgICAgICRGdW5jdGlvbi5hcHBseShjYWxsYmFjaywgbnVsbCwgYXJncyk7CiAgICB9KTsKICB9IGVsc2UgewogICAganNMYXN0RXJyb3IucnVuKG5hbWUsIG1lc3NhZ2UsIHN0YWNrLCBjYWxsYmFjaywgYXJncyk7CiAgfQp9CgpiaW5kaW5nLnJlZ2lzdGVyQ3VzdG9tSG9vayhmdW5jdGlvbihiaW5kaW5nc0FQSSwgZXh0ZW5zaW9uSWQpIHsKICB2YXIgYXBpRnVuY3Rpb25zID0gYmluZGluZ3NBUEkuYXBpRnVuY3Rpb25zOwoKICBmdW5jdGlvbiBwcm94eVRvR2V0VXNlck1lZGlhKG5hbWUsIHJlcXVlc3QsIGNhbGxiYWNrLCByZXNwb25zZSkgewogICAgaWYgKCFjYWxsYmFjaykKICAgICAgcmV0dXJuOwoKICAgIGlmICghcmVzcG9uc2UpIHsKICAgICAgLy8gV2hlbiB0aGUgcmVzcG9uc2UgaXMgbWlzc2luZywgcnVudGltZS5sYXN0RXJyb3IgaGFzIGFscmVhZHkgYmVlbiBzZXQuCiAgICAgIC8vIFNlZSBjaHJvbWUvYnJvd3Nlci9leHRlbnNpb25zL2FwaS90YWJfY2FwdHVyZS90YWJfY2FwdHVyZV9hcGkuY2MuCiAgICAgIGNhbGxiYWNrKG51bGwpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHByb2Nlc3Npbmcgd2Via2l0R2V0VXNlck1lZGlhKCkgZXJyb3Igb2JqZWN0cyB0bwogICAgLy8gcHJvdmlkZSBydW50aW1lLmxhc3RFcnJvciBtZXNzYWdlcyBmb3IgdGhlIHRhYiBjYXB0dXJlIEFQSS4KICAgIGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShlcnJvciwgZmFsbGJhY2tNZXNzYWdlKSB7CiAgICAgIGlmICghZXJyb3IgfHwgKHR5cGVvZiBlcnJvci5tZXNzYWdlICE9ICdzdHJpbmcnKSkKICAgICAgICByZXR1cm4gZmFsbGJhY2tNZXNzYWdlOwogICAgICByZXR1cm4gZXJyb3IubWVzc2FnZS5yZXBsYWNlKC8obmF2aWdhdG9yXC4pPyh3ZWJraXQpP0dldFVzZXJNZWRpYS9naSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKICAgIH0KCiAgICB2YXIgb3B0aW9ucyA9IHt9OwogICAgaWYgKHJlc3BvbnNlLmF1ZGlvQ29uc3RyYWludHMpCiAgICAgIG9wdGlvbnMuYXVkaW8gPSByZXNwb25zZS5hdWRpb0NvbnN0cmFpbnRzOwogICAgaWYgKHJlc3BvbnNlLnZpZGVvQ29uc3RyYWludHMpCiAgICAgIG9wdGlvbnMudmlkZW8gPSByZXNwb25zZS52aWRlb0NvbnN0cmFpbnRzOwogICAgdHJ5IHsKICAgICAgbmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYSgKICAgICAgICAgIG9wdGlvbnMsCiAgICAgICAgICBmdW5jdGlvbiBvblN1Y2Nlc3MobWVkaWFfc3RyZWFtKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKG1lZGlhX3N0cmVhbSk7CiAgICAgICAgICB9LAogICAgICAgICAgZnVuY3Rpb24gb25FcnJvcihlcnJvcikgewogICAgICAgICAgICBydW5DYWxsYmFja1dpdGhMYXN0RXJyb3IoCiAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgZ2V0RXJyb3JNZXNzYWdlKGVycm9yLCAiRmFpbGVkIHRvIHN0YXJ0IE1lZGlhU3RyZWFtLiIpLAogICAgICAgICAgICAgICAgcmVxdWVzdC5zdGFjaywKICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhudWxsKTsgfSk7CiAgICAgICAgICB9KTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHJ1bkNhbGxiYWNrV2l0aExhc3RFcnJvcigKICAgICAgICAgIG5hbWUsIGdldEVycm9yTWVzc2FnZShlcnJvciwgIkludmFsaWQgYXJndW1lbnQocykuIiksIHJlcXVlc3Quc3RhY2ssCiAgICAgICAgICBmdW5jdGlvbigpIHsgY2FsbGJhY2sobnVsbCk7IH0pOwogICAgfQogIH0KCiAgYXBpRnVuY3Rpb25zLnNldEN1c3RvbUNhbGxiYWNrKCdjYXB0dXJlJywgcHJveHlUb0dldFVzZXJNZWRpYSk7CiAgYXBpRnVuY3Rpb25zLnNldEN1c3RvbUNhbGxiYWNrKCdjYXB0dXJlT2Zmc2NyZWVuVGFiJywgcHJveHlUb0dldFVzZXJNZWRpYSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgovLyBDdXN0b20gYmluZGluZyBmb3IgdGhlIHRhYnMgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCd0YWJzJyk7Cgp2YXIgbWVzc2FnaW5nID0gcmVxdWlyZSgnbWVzc2FnaW5nJyk7CnZhciBPcGVuQ2hhbm5lbFRvVGFiID0gcmVxdWlyZU5hdGl2ZSgnbWVzc2FnaW5nX25hdGl2ZXMnKS5PcGVuQ2hhbm5lbFRvVGFiOwp2YXIgc2VuZFJlcXVlc3RJc0Rpc2FibGVkID0gcmVxdWlyZU5hdGl2ZSgncHJvY2VzcycpLklzU2VuZFJlcXVlc3REaXNhYmxlZCgpOwp2YXIgZm9yRWFjaCA9IHJlcXVpcmUoJ3V0aWxzJykuZm9yRWFjaDsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJLCBleHRlbnNpb25JZCkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nc0FQSS5hcGlGdW5jdGlvbnM7CiAgdmFyIHRhYnMgPSBiaW5kaW5nc0FQSS5jb21waWxlZEFwaTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2Nvbm5lY3QnLCBmdW5jdGlvbih0YWJJZCwgY29ubmVjdEluZm8pIHsKICAgIHZhciBuYW1lID0gJyc7CiAgICB2YXIgZnJhbWVJZCA9IC0xOwogICAgaWYgKGNvbm5lY3RJbmZvKSB7CiAgICAgIG5hbWUgPSBjb25uZWN0SW5mby5uYW1lIHx8IG5hbWU7CiAgICAgIGZyYW1lSWQgPSBjb25uZWN0SW5mby5mcmFtZUlkOwogICAgICBpZiAodHlwZW9mIGZyYW1lSWQgPT0gJ3VuZGVmaW5lZCcgfHwgZnJhbWVJZCA9PT0gbnVsbCB8fCBmcmFtZUlkIDwgMCkKICAgICAgICBmcmFtZUlkID0gLTE7CiAgICB9CiAgICB2YXIgcG9ydElkID0gT3BlbkNoYW5uZWxUb1RhYih0YWJJZCwgZnJhbWVJZCwgZXh0ZW5zaW9uSWQsIG5hbWUpOwogICAgcmV0dXJuIG1lc3NhZ2luZy5jcmVhdGVQb3J0KHBvcnRJZCwgbmFtZSk7CiAgfSk7CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdzZW5kUmVxdWVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24odGFiSWQsIHJlcXVlc3QsIHJlc3BvbnNlQ2FsbGJhY2spIHsKICAgIGlmIChzZW5kUmVxdWVzdElzRGlzYWJsZWQpCiAgICAgIHRocm93IG5ldyBFcnJvcihzZW5kUmVxdWVzdElzRGlzYWJsZWQpOwogICAgdmFyIHBvcnQgPSB0YWJzLmNvbm5lY3QodGFiSWQsIHtuYW1lOiBtZXNzYWdpbmcua1JlcXVlc3RDaGFubmVsfSk7CiAgICBtZXNzYWdpbmcuc2VuZE1lc3NhZ2VJbXBsKHBvcnQsIHJlcXVlc3QsIHJlc3BvbnNlQ2FsbGJhY2spOwogIH0pOwoKICBhcGlGdW5jdGlvbnMuc2V0SGFuZGxlUmVxdWVzdCgnc2VuZE1lc3NhZ2UnLAogICAgICBmdW5jdGlvbih0YWJJZCwgbWVzc2FnZSwgb3B0aW9ucywgcmVzcG9uc2VDYWxsYmFjaykgewogICAgdmFyIGNvbm5lY3RJbmZvID0gewogICAgICBuYW1lOiBtZXNzYWdpbmcua01lc3NhZ2VDaGFubmVsCiAgICB9OwogICAgaWYgKG9wdGlvbnMpIHsKICAgICAgZm9yRWFjaChvcHRpb25zLCBmdW5jdGlvbihrLCB2KSB7CiAgICAgICAgY29ubmVjdEluZm9ba10gPSB2OwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgcG9ydCA9IHRhYnMuY29ubmVjdCh0YWJJZCwgY29ubmVjdEluZm8pOwogICAgbWVzc2FnaW5nLnNlbmRNZXNzYWdlSW1wbChwb3J0LCBtZXNzYWdlLCByZXNwb25zZUNhbGxiYWNrKTsKICB9KTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgdHRzIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8IHJlcXVpcmUoJ2JpbmRpbmcnKS5CaW5kaW5nLmNyZWF0ZSgndHRzJyk7Cgp2YXIgaWRHZW5lcmF0b3IgPSByZXF1aXJlTmF0aXZlKCdpZF9nZW5lcmF0b3InKTsKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0Owp2YXIgbGF6eUJHID0gcmVxdWlyZU5hdGl2ZSgnbGF6eV9iYWNrZ3JvdW5kX3BhZ2UnKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGFwaSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBhcGkuYXBpRnVuY3Rpb25zOwogIHZhciB0dHMgPSBhcGkuY29tcGlsZWRBcGk7CiAgdmFyIGhhbmRsZXJzID0ge307CgogIGZ1bmN0aW9uIHR0c0V2ZW50TGlzdGVuZXIoZXZlbnQpIHsKICAgIHZhciBldmVudEhhbmRsZXIgPSBoYW5kbGVyc1tldmVudC5zcmNJZF07CiAgICBpZiAoZXZlbnRIYW5kbGVyKSB7CiAgICAgIGV2ZW50SGFuZGxlcih7CiAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGV2ZW50LnR5cGUsCiAgICAgICAgICAgICAgICAgICAgIGNoYXJJbmRleDogZXZlbnQuY2hhckluZGV4LAogICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGV2ZW50LmVycm9yTWVzc2FnZQogICAgICAgICAgICAgICAgICAgfSk7CiAgICAgIGlmIChldmVudC5pc0ZpbmFsRXZlbnQpIHsKICAgICAgICBkZWxldGUgaGFuZGxlcnNbZXZlbnQuc3JjSWRdOwogICAgICAgIC8vIEJhbGFuY2VkIGluICdzcGVhaycgaGFuZGxlci4KICAgICAgICBsYXp5QkcuRGVjcmVtZW50S2VlcGFsaXZlQ291bnQoKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gVGhpcyBmaWxlIHdpbGwgZ2V0IHJ1biBpZiBhbiBleHRlbnNpb24gbmVlZHMgdGhlIHR0c0VuZ2luZSBwZXJtaXNzaW9uLCBidXQKICAvLyBpdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgdGhlIHR0cyBwZXJtaXNzaW9uLiBJZiBpdCBkb2Vzbid0LCB0cnlpbmcgdG8KICAvLyBhZGQgYSBsaXN0ZW5lciB0byBjaHJvbWUudHRzLm9uRXZlbnQgd2lsbCBmYWlsLgogIC8vIFNlZSBodHRwOi8vY3JidWcuY29tLzEyMjQ3NC4KICB0cnkgewogICAgdHRzLm9uRXZlbnQuYWRkTGlzdGVuZXIodHRzRXZlbnRMaXN0ZW5lcik7CiAgfSBjYXRjaCAoZSkge30KCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ3NwZWFrJywgZnVuY3Rpb24oKSB7CiAgICB2YXIgYXJncyA9ICRBcnJheS5mcm9tKGFyZ3VtZW50cyk7CiAgICBpZiAoYXJncy5sZW5ndGggPiAxICYmIGFyZ3NbMV0gJiYgYXJnc1sxXS5vbkV2ZW50KSB7CiAgICAgIHZhciBpZCA9IGlkR2VuZXJhdG9yLkdldE5leHRJZCgpOwogICAgICBhcmdzWzFdLnNyY0lkID0gaWQ7CiAgICAgIGhhbmRsZXJzW2lkXSA9IGFyZ3NbMV0ub25FdmVudDsKICAgICAgLy8gS2VlcCB0aGUgcGFnZSBhbGl2ZSB1bnRpbCB0aGUgZXZlbnQgZmluaXNoZXMuCiAgICAgIC8vIEJhbGFuY2VkIGluIGV2ZW50SGFuZGxlci4KICAgICAgbGF6eUJHLkluY3JlbWVudEtlZXBhbGl2ZUNvdW50KCk7CiAgICB9CiAgICBzZW5kUmVxdWVzdCgndHRzLnNwZWFrJywgYXJncywKICAgICAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICB1bmRlZmluZWQpOwogICAgcmV0dXJuIGlkOwogIH0pOwp9KTsKCmlmICghYXBpQnJpZGdlKQogIGV4cG9ydHMuJHNldCgnYmluZGluZycsIGJpbmRpbmcuZ2VuZXJhdGUoKSk7Ci8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKLy8gQ3VzdG9tIGJpbmRpbmcgZm9yIHRoZSB0dHNFbmdpbmUgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCd0dHNFbmdpbmUnKTsKdmFyIHJlZ2lzdGVyQXJndW1lbnRNYXNzYWdlciA9IGJpbmRpbmdVdGlsID8KICAgICRGdW5jdGlvbi5iaW5kKGJpbmRpbmdVdGlsLnJlZ2lzdGVyRXZlbnRBcmd1bWVudE1hc3NhZ2VyLCBiaW5kaW5nVXRpbCkgOgogICAgcmVxdWlyZSgnZXZlbnRfYmluZGluZ3MnKS5yZWdpc3RlckFyZ3VtZW50TWFzc2FnZXI7CgpyZWdpc3RlckFyZ3VtZW50TWFzc2FnZXIoJ3R0c0VuZ2luZS5vblNwZWFrJywgZnVuY3Rpb24oYXJncywgZGlzcGF0Y2gpIHsKICB2YXIgdGV4dCA9IGFyZ3NbMF07CiAgdmFyIG9wdGlvbnMgPSBhcmdzWzFdOwogIHZhciByZXF1ZXN0SWQgPSBhcmdzWzJdOwogIHZhciBzZW5kVHRzRXZlbnQgPSBmdW5jdGlvbihldmVudCkgewogICAgY2hyb21lLnR0c0VuZ2luZS5zZW5kVHRzRXZlbnQocmVxdWVzdElkLCBldmVudCk7CiAgfTsKICBkaXNwYXRjaChbdGV4dCwgb3B0aW9ucywgc2VuZFR0c0V2ZW50XSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTUgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgd2VicnRjRGVza3RvcENhcHR1cmVQcml2YXRlIEFQSS4KCnZhciBiaW5kaW5nID0gYXBpQnJpZGdlIHx8CiAgICAgICAgICAgICAgcmVxdWlyZSgnYmluZGluZycpLkJpbmRpbmcuY3JlYXRlKCd3ZWJydGNEZXNrdG9wQ2FwdHVyZVByaXZhdGUnKTsKdmFyIHNlbmRSZXF1ZXN0ID0gYmluZGluZ1V0aWwgPwogICAgJEZ1bmN0aW9uLmJpbmQoYmluZGluZ1V0aWwuc2VuZFJlcXVlc3QsIGJpbmRpbmdVdGlsKSA6CiAgICByZXF1aXJlKCdzZW5kUmVxdWVzdCcpLnNlbmRSZXF1ZXN0Owp2YXIgaWRHZW5lcmF0b3IgPSByZXF1aXJlTmF0aXZlKCdpZF9nZW5lcmF0b3InKTsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmdzQVBJKSB7CiAgdmFyIGFwaUZ1bmN0aW9ucyA9IGJpbmRpbmdzQVBJLmFwaUZ1bmN0aW9uczsKCiAgdmFyIHBlbmRpbmdSZXF1ZXN0cyA9IHt9OwoKICBmdW5jdGlvbiBvblJlcXVlc3RSZXN1bHQoaWQsIHJlc3VsdCkgewogICAgaWYgKGlkIGluIHBlbmRpbmdSZXF1ZXN0cykgewogICAgICB2YXIgY2FsbGJhY2sgPSBwZW5kaW5nUmVxdWVzdHNbaWRdOwogICAgICBkZWxldGUgcGVuZGluZ1JlcXVlc3RzW2lkXTsKICAgICAgY2FsbGJhY2socmVzdWx0KTsKICAgIH0KICB9CgogIGFwaUZ1bmN0aW9ucy5zZXRIYW5kbGVSZXF1ZXN0KCdjaG9vc2VEZXNrdG9wTWVkaWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHNvdXJjZXMsIHJlcXVlc3QsIGNhbGxiYWNrKSB7CiAgICB2YXIgaWQgPSBpZEdlbmVyYXRvci5HZXROZXh0SWQoKTsKICAgIHBlbmRpbmdSZXF1ZXN0c1tpZF0gPSBjYWxsYmFjazsKICAgIHNlbmRSZXF1ZXN0KCd3ZWJydGNEZXNrdG9wQ2FwdHVyZVByaXZhdGUuY2hvb3NlRGVza3RvcE1lZGlhJywKICAgICAgICAgICAgICAgIFtpZCwgc291cmNlcywgcmVxdWVzdCwKICAgICAgICAgICAgICAgICAkRnVuY3Rpb24uYmluZChvblJlcXVlc3RSZXN1bHQsIG51bGwsIGlkKV0sCiAgICAgICAgICAgICAgICBiaW5kaW5nVXRpbCA/IHVuZGVmaW5lZCA6IHRoaXMuZGVmaW5pdGlvbi5wYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgdW5kZWZpbmVkKTsKICAgIHJldHVybiBpZDsKICB9KTsKCiAgYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2NhbmNlbENob29zZURlc2t0b3BNZWRpYScsIGZ1bmN0aW9uKGlkKSB7CiAgICBpZiAoaWQgaW4gcGVuZGluZ1JlcXVlc3RzKSB7CiAgICAgIGRlbGV0ZSBwZW5kaW5nUmVxdWVzdHNbaWRdOwogICAgICBzZW5kUmVxdWVzdCgnd2VicnRjRGVza3RvcENhcHR1cmVQcml2YXRlLmNhbmNlbENob29zZURlc2t0b3BNZWRpYScsIFtpZF0sCiAgICAgICAgICAgICAgICAgIGJpbmRpbmdVdGlsID8gdW5kZWZpbmVkIDogdGhpcy5kZWZpbml0aW9uLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCk7CiAgICB9CiAgfSk7Cn0pOwoKaWYgKCFhcGlCcmlkZ2UpCiAgZXhwb3J0cy4kc2V0KCdiaW5kaW5nJywgYmluZGluZy5nZW5lcmF0ZSgpKTsKLy8gQ29weXJpZ2h0IDIwMTcgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgd2VicnRjTG9nZ2luZ1ByaXZhdGUgQVBJLgoKdmFyIGJpbmRpbmcgPSBhcGlCcmlkZ2UgfHwKICAgICAgICAgICAgICByZXF1aXJlKCdiaW5kaW5nJykuQmluZGluZy5jcmVhdGUoJ3dlYnJ0Y0xvZ2dpbmdQcml2YXRlJyk7Cgp2YXIgZ2V0QmluZERpcmVjdG9yeUVudHJ5Q2FsbGJhY2sgPQogICAgcmVxdWlyZSgnZmlsZUVudHJ5QmluZGluZ1V0aWwnKS5nZXRCaW5kRGlyZWN0b3J5RW50cnlDYWxsYmFjazsKCmJpbmRpbmcucmVnaXN0ZXJDdXN0b21Ib29rKGZ1bmN0aW9uKGJpbmRpbmcsIGlkLCBjb250ZXh0VHlwZSkgewogIHZhciBhcGlGdW5jdGlvbnMgPSBiaW5kaW5nLmFwaUZ1bmN0aW9uczsKICBhcGlGdW5jdGlvbnMuc2V0Q3VzdG9tQ2FsbGJhY2soJ2dldExvZ3NEaXJlY3RvcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCaW5kRGlyZWN0b3J5RW50cnlDYWxsYmFjaygpKTsKfSk7CgppZiAoIWFwaUJyaWRnZSkKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBiaW5kaW5nLmdlbmVyYXRlKCkpOwovLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIEN1c3RvbSBiaW5kaW5nIGZvciB0aGUgd2Vic3RvcmUgQVBJLgoKdmFyIHdlYnN0b3JlTmF0aXZlcyA9IHJlcXVpcmVOYXRpdmUoJ3dlYnN0b3JlJyk7Cgp2YXIgb25JbnN0YWxsU3RhZ2VDaGFuZ2VkOwp2YXIgb25Eb3dubG9hZFByb2dyZXNzOwoKZnVuY3Rpb24gSW5zdGFsbGVyKCkgewogIHRoaXMuX3BlbmRpbmdJbnN0YWxsID0gbnVsbDsKfQoKSW5zdGFsbGVyLnByb3RvdHlwZS5pbnN0YWxsID0gZnVuY3Rpb24odXJsLCBvblN1Y2Nlc3MsIG9uRmFpbHVyZSkgewogIGNvbnNvbGUud2FybignY2hyb21lLndlYnN0b3JlLmluc3RhbGwgaXMgZGVwcmVjYXRlZC4gU2VlICcgKwogICAgICAnaHR0cHM6Ly9ibG9nLmNocm9taXVtLm9yZy8yMDE4LzA2L2ltcHJvdmluZy1leHRlbnNpb24tdHJhbnNwYXJlbmN5LWZvci5odG1sICcgKwogICAgICAnZm9yIG1vcmUgZGV0YWlscy4nKTsKCiAgaWYgKHRoaXMuX3BlbmRpbmdJbnN0YWxsKQogICAgdGhyb3cgbmV3IEVycm9yKCdBIENocm9tZSBXZWIgU3RvcmUgaW5zdGFsbGF0aW9uIGlzIGFscmVhZHkgcGVuZGluZy4nKTsKCiAgLy8gV2l0aCBuYXRpdmUgYmluZGluZ3MsIHRoZXNlIGNhbGxzIGdvIHRocm91Z2ggYXJndW1lbnQgdmFsaWRhdGlvbiwgd2hpY2gKICAvLyBzZXRzIG9wdGlvbmFsL21pc3NpbmcgYXJndW1lbnRzIHRvIG51bGwuIFRoZSBuYXRpdmUgd2Vic3RvcmUgYmluZGluZ3MKICAvLyBleHBlY3QgZWl0aGVyIHByZXNlbnQgb3IgdW5kZWZpbmVkLCBzbyB0cmFuc2Zvcm0gbnVsbCB0byB1bmRlZmluZWQuCiAgaWYgKHVybCA9PT0gbnVsbCkKICAgIHVybCA9IHVuZGVmaW5lZDsKICBpZiAob25TdWNjZXNzID09PSBudWxsKQogICAgb25TdWNjZXNzID0gdW5kZWZpbmVkOwogIGlmIChvbkZhaWx1cmUgPT09IG51bGwpCiAgICBvbkZhaWx1cmUgPSB1bmRlZmluZWQ7CgogIGlmICh1cmwgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdUaGUgQ2hyb21lIFdlYiBTdG9yZSBpdGVtIGxpbmsgVVJMIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nLicpOwogIH0KICBpZiAob25TdWNjZXNzICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9uU3VjY2VzcyAhPT0gJ2Z1bmN0aW9uJykgewogICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc3VjY2VzcyBjYWxsYmFjayBwYXJhbWV0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uLicpOwogIH0KICBpZiAob25GYWlsdXJlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9uRmFpbHVyZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZmFpbHVyZSBjYWxsYmFjayBwYXJhbWV0ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uLicpOwogIH0KCiAgLy8gU2luY2Ugd2UgY2FsbCBJbnN0YWxsKCkgd2l0aCBhIGJvb2wgZm9yIGlmIHdlIGhhdmUgbGlzdGVuZXJzLCBsaXN0ZW5lcnMKICAvLyBtdXN0IGJlIHNldCBwcmlvciB0byB0aGUgaW5saW5lIGluc3RhbGxhdGlvbiBzdGFydGluZyAodGhpcyBpcyBhbHNvCiAgLy8gbm90ZWQgaW4gdGhlIEV2ZW50IGRvY3VtZW50YXRpb24gaW4KICAvLyBjaHJvbWUvY29tbW9uL2V4dGVuc2lvbnMvYXBpL3dlYnN0b3JlLmpzb24pLgogIHZhciBpbnN0YWxsSWQgPSB3ZWJzdG9yZU5hdGl2ZXMuSW5zdGFsbCgKICAgICAgb25JbnN0YWxsU3RhZ2VDaGFuZ2VkLmhhc0xpc3RlbmVycygpLAogICAgICBvbkRvd25sb2FkUHJvZ3Jlc3MuaGFzTGlzdGVuZXJzKCksCiAgICAgIHVybCwKICAgICAgb25TdWNjZXNzLAogICAgICBvbkZhaWx1cmUpOwogIGlmIChpbnN0YWxsSWQgIT09IHVuZGVmaW5lZCkgewogICAgdGhpcy5fcGVuZGluZ0luc3RhbGwgPSB7CiAgICAgIGluc3RhbGxJZDogaW5zdGFsbElkLAogICAgICBvblN1Y2Nlc3M6IG9uU3VjY2VzcywKICAgICAgb25GYWlsdXJlOiBvbkZhaWx1cmUKICAgIH07CiAgfQp9OwoKSW5zdGFsbGVyLnByb3RvdHlwZS5vbkluc3RhbGxSZXNwb25zZSA9CiAgICBmdW5jdGlvbihpbnN0YWxsSWQsIHN1Y2Nlc3MsIGVycm9yLCByZXN1bHRDb2RlKSB7CiAgdmFyIHBlbmRpbmdJbnN0YWxsID0gdGhpcy5fcGVuZGluZ0luc3RhbGw7CiAgaWYgKCFwZW5kaW5nSW5zdGFsbCB8fCBwZW5kaW5nSW5zdGFsbC5pbnN0YWxsSWQgIT0gaW5zdGFsbElkKSB7CiAgICAvLyBUT0RPKGthbG1hbik6IHNob3VsZCB0aGlzIGJlIGFuIGVycm9yPwogICAgcmV0dXJuOwogIH0KCiAgdHJ5IHsKICAgIGlmIChzdWNjZXNzICYmIHBlbmRpbmdJbnN0YWxsLm9uU3VjY2VzcykKICAgICAgcGVuZGluZ0luc3RhbGwub25TdWNjZXNzKCk7CiAgICBlbHNlIGlmICghc3VjY2VzcyAmJiBwZW5kaW5nSW5zdGFsbC5vbkZhaWx1cmUpCiAgICAgIHBlbmRpbmdJbnN0YWxsLm9uRmFpbHVyZShlcnJvciwgcmVzdWx0Q29kZSk7CiAgfSBjYXRjaCAoZSkgewogICAgY29uc29sZS5lcnJvcignRXhjZXB0aW9uIGluIGNocm9tZS53ZWJzdG9yZS5pbnN0YWxsIHJlc3BvbnNlIGhhbmRsZXI6ICcgKwogICAgICAgICAgICAgICAgICBlLnN0YWNrKTsKICB9IGZpbmFsbHkgewogICAgdGhpcy5fcGVuZGluZ0luc3RhbGwgPSBudWxsOwogIH0KfTsKCkluc3RhbGxlci5wcm90b3R5cGUub25JbnN0YWxsU3RhZ2VDaGFuZ2VkID0gZnVuY3Rpb24oaW5zdGFsbFN0YWdlKSB7CiAgb25JbnN0YWxsU3RhZ2VDaGFuZ2VkLmRpc3BhdGNoKGluc3RhbGxTdGFnZSk7Cn07CgpJbnN0YWxsZXIucHJvdG90eXBlLm9uRG93bmxvYWRQcm9ncmVzcyA9IGZ1bmN0aW9uKHByb2dyZXNzKSB7CiAgb25Eb3dubG9hZFByb2dyZXNzLmRpc3BhdGNoKHByb2dyZXNzKTsKfTsKCnZhciBpbnN0YWxsZXIgPSBuZXcgSW5zdGFsbGVyKCk7CgoKaWYgKGFwaUJyaWRnZSkgewogIGFwaUJyaWRnZS5yZWdpc3RlckN1c3RvbUhvb2soZnVuY3Rpb24oYXBpKSB7CiAgICBhcGkuYXBpRnVuY3Rpb25zLnNldEhhbmRsZVJlcXVlc3QoJ2luc3RhbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHVybCwgb25TdWNjZXNzLCBvbkZhaWx1cmUpIHsKICAgICAgaW5zdGFsbGVyLmluc3RhbGwodXJsLCBvblN1Y2Nlc3MsIG9uRmFpbHVyZSk7CiAgICB9KTsKCiAgICBvbkluc3RhbGxTdGFnZUNoYW5nZWQgPSBhcGkuY29tcGlsZWRBcGkub25JbnN0YWxsU3RhZ2VDaGFuZ2VkOwogICAgb25Eb3dubG9hZFByb2dyZXNzID0gYXBpLmNvbXBpbGVkQXBpLm9uRG93bmxvYWRQcm9ncmVzczsKICB9KTsKfSBlbHNlIHsKICB2YXIgRXZlbnQgPSByZXF1aXJlKCdldmVudF9iaW5kaW5ncycpLkV2ZW50OwogIG9uSW5zdGFsbFN0YWdlQ2hhbmdlZCA9CiAgICAgIG5ldyBFdmVudChudWxsLCBbe25hbWU6ICdzdGFnZScsIHR5cGU6ICdzdHJpbmcnfV0sIHt1bm1hbmFnZWQ6IHRydWV9KTsKICBvbkRvd25sb2FkUHJvZ3Jlc3MgPQogICAgICBuZXcgRXZlbnQobnVsbCwgW3tuYW1lOiAncHJvZ3Jlc3MnLCB0eXBlOiAnbnVtYmVyJ31dLCB7dW5tYW5hZ2VkOiB0cnVlfSk7CgogIHZhciBjaHJvbWVXZWJzdG9yZSA9IHsKICAgIGluc3RhbGw6IGZ1bmN0aW9uICh1cmwsIG9uU3VjY2Vzcywgb25GYWlsdXJlKSB7CiAgICAgIGluc3RhbGxlci5pbnN0YWxsKHVybCwgb25TdWNjZXNzLCBvbkZhaWx1cmUpOwogICAgfSwKICAgIG9uSW5zdGFsbFN0YWdlQ2hhbmdlZDogb25JbnN0YWxsU3RhZ2VDaGFuZ2VkLAogICAgb25Eb3dubG9hZFByb2dyZXNzOiBvbkRvd25sb2FkUHJvZ3Jlc3MsCiAgfTsKICBleHBvcnRzLiRzZXQoJ2JpbmRpbmcnLCBjaHJvbWVXZWJzdG9yZSk7Cn0KCi8vIENhbGxlZCBieSB3ZWJzdG9yZV9iaW5kaW5ncy5jYy4KZXhwb3J0cy4kc2V0KCdvbkluc3RhbGxSZXNwb25zZScsCiAgICAgICAgICAgICAkRnVuY3Rpb24uYmluZChJbnN0YWxsZXIucHJvdG90eXBlLm9uSW5zdGFsbFJlc3BvbnNlLCBpbnN0YWxsZXIpKTsKZXhwb3J0cy4kc2V0KCdvbkluc3RhbGxTdGFnZUNoYW5nZWQnLAogICAgICAgICAgICAgJEZ1bmN0aW9uLmJpbmQoSW5zdGFsbGVyLnByb3RvdHlwZS5vbkluc3RhbGxTdGFnZUNoYW5nZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZXIpKTsKZXhwb3J0cy4kc2V0KCdvbkRvd25sb2FkUHJvZ3Jlc3MnLAogICAgICAgICAgICAgJEZ1bmN0aW9uLmJpbmQoSW5zdGFsbGVyLnByb3RvdHlwZS5vbkRvd25sb2FkUHJvZ3Jlc3MsIGluc3RhbGxlcikpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2pvbUlkID0gJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfY29udHJvbGxlci5tb2pvbSc7CiAgaWYgKG1vam8uaW50ZXJuYWwuaXNNb2pvbUxvYWRlZChtb2pvbUlkKSkgewogICAgY29uc29sZS53YXJuKCdUaGUgZm9sbG93aW5nIG1vam9tIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lczogJyArIG1vam9tSWQpOwogICAgcmV0dXJuOwogIH0KICBtb2pvLmludGVybmFsLm1hcmtNb2pvbUxvYWRlZChtb2pvbUlkKTsKICB2YXIgYmluZGluZ3MgPSBtb2pvOwogIHZhciBhc3NvY2lhdGVkQmluZGluZ3MgPSBtb2pvOwogIHZhciBjb2RlYyA9IG1vam8uaW50ZXJuYWw7CiAgdmFyIHZhbGlkYXRvciA9IG1vam8uaW50ZXJuYWw7CgogIHZhciBleHBvcnRzID0gbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21lZGlhUm91dGVyLm1vam9tJyk7CiAgdmFyIG1lZGlhX3N0YXR1cyQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWFSb3V0ZXIubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfc3RhdHVzLm1vam9tJywgJ21lZGlhX3N0YXR1cy5tb2pvbS5qcycpOwogIH0KICB2YXIgdGltZSQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbW9qb0Jhc2UubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ21vam8vcHVibGljL21vam9tL2Jhc2UvdGltZS5tb2pvbScsICcuLi8uLi8uLi8uLi9tb2pvL3B1YmxpYy9tb2pvbS9iYXNlL3RpbWUubW9qb20uanMnKTsKICB9CgoKCiAgZnVuY3Rpb24gTWVkaWFDb250cm9sbGVyX1BsYXlfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFDb250cm9sbGVyX1BsYXlfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogOH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDA7CgogIE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA4fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDA7CgogIE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9QYXVzZV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubXV0ZSA9IGZhbHNlOwogIH07CiAgTWVkaWFDb250cm9sbGVyX1NldE11dGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1NldE11dGVfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5tdXRlID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLm11dGUgJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudm9sdW1lID0gMDsKICB9OwogIE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwudm9sdW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuRmxvYXQpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5GbG9hdCwgdmFsLnZvbHVtZSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMudGltZSA9IG51bGw7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMudGltZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCB0aW1lJC5UaW1lRGVsdGEsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC50aW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSwgdmFsLnRpbWUpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY29udHJvbGxlclJlcXVlc3QgPSBuZXcgYmluZGluZ3MuSW50ZXJmYWNlUmVxdWVzdCgpOwogIH07CiAgTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmNvbnRyb2xsZXJSZXF1ZXN0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlSW50ZXJmYWNlUmVxdWVzdChvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmNvbnRyb2xsZXJSZXF1ZXN0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50ZXJmYWNlUmVxdWVzdCk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYUNvbnRyb2xsZXJfQ29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnRlcmZhY2VSZXF1ZXN0LCB2YWwuY29udHJvbGxlclJlcXVlc3QpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmxvY2FsUHJlc2VudCA9IGZhbHNlOwogIH07CiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5sb2NhbFByZXNlbnQgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwubG9jYWxQcmVzZW50ICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICB2YXIga01lZGlhQ29udHJvbGxlcl9QbGF5X05hbWUgPSA0NTgwMDkwMDI7CiAgdmFyIGtNZWRpYUNvbnRyb2xsZXJfUGF1c2VfTmFtZSA9IDYxOTgzNzg2MjsKICB2YXIga01lZGlhQ29udHJvbGxlcl9TZXRNdXRlX05hbWUgPSAxOTI4NjUzNDE0OwogIHZhciBrTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9OYW1lID0gMTkzODk0NDUwMjsKICB2YXIga01lZGlhQ29udHJvbGxlcl9TZWVrX05hbWUgPSAxNjcxMDI0MTc0OwogIHZhciBrTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX05hbWUgPSAxNjQ5NzM1MTM5OwoKICBmdW5jdGlvbiBNZWRpYUNvbnRyb2xsZXJQdHIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VQdHJDb250cm9sbGVyKE1lZGlhQ29udHJvbGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3JQdHJJbmZvKTsKICB9CgogIGZ1bmN0aW9uIE1lZGlhQ29udHJvbGxlckFzc29jaWF0ZWRQdHIoYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGFzc29jaWF0ZWRCaW5kaW5ncy5Bc3NvY2lhdGVkSW50ZXJmYWNlUHRyQ29udHJvbGxlcigKICAgICAgICBNZWRpYUNvbnRyb2xsZXIsIGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKTsKICB9CgogIE1lZGlhQ29udHJvbGxlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlID0KICAgICAgT2JqZWN0LmNyZWF0ZShNZWRpYUNvbnRyb2xsZXJQdHIucHJvdG90eXBlKTsKICBNZWRpYUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICAgIE1lZGlhQ29udHJvbGxlckFzc29jaWF0ZWRQdHI7CgogIGZ1bmN0aW9uIE1lZGlhQ29udHJvbGxlclByb3h5KHJlY2VpdmVyKSB7CiAgICB0aGlzLnJlY2VpdmVyXyA9IHJlY2VpdmVyOwogIH0KICBNZWRpYUNvbnRyb2xsZXJQdHIucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUucGxheQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMoKTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhQ29udHJvbGxlcl9QbGF5X05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFDb250cm9sbGVyX1BsYXlfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXMsIHBhcmFtc18pOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFDb250cm9sbGVyUHRyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5wYXVzZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcygpOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFDb250cm9sbGVyX1BhdXNlX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFDb250cm9sbGVyX1BhdXNlX1BhcmFtcywgcGFyYW1zXyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJQdHIucHJvdG90eXBlLnNldE11dGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuc2V0TXV0ZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZXRNdXRlID0gZnVuY3Rpb24obXV0ZSkgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWVkaWFDb250cm9sbGVyX1NldE11dGVfUGFyYW1zKCk7CiAgICBwYXJhbXNfLm11dGUgPSBtdXRlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFDb250cm9sbGVyX1NldE11dGVfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcywgcGFyYW1zXyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYUNvbnRyb2xsZXJQdHIucHJvdG90eXBlLnNldFZvbHVtZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZXRWb2x1bWUKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuc2V0Vm9sdW1lID0gZnVuY3Rpb24odm9sdW1lKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcygpOwogICAgcGFyYW1zXy52b2x1bWUgPSB2b2x1bWU7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9TZXRWb2x1bWVfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhQ29udHJvbGxlclB0ci5wcm90b3R5cGUuc2VlayA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZWVrCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFDb250cm9sbGVyUHJveHkucHJvdG90eXBlLnNlZWsgPSBmdW5jdGlvbih0aW1lKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYUNvbnRyb2xsZXJfU2Vla19QYXJhbXMoKTsKICAgIHBhcmFtc18udGltZSA9IHRpbWU7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYUNvbnRyb2xsZXJfU2Vla19OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFDb250cm9sbGVyX1NlZWtfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhQ29udHJvbGxlclB0ci5wcm90b3R5cGUuY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSBmdW5jdGlvbihjb250cm9sbGVyUmVxdWVzdCkgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcygpOwogICAgcGFyYW1zXy5jb250cm9sbGVyUmVxdWVzdCA9IGNvbnRyb2xsZXJSZXF1ZXN0OwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcywgcGFyYW1zXyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKCiAgZnVuY3Rpb24gTWVkaWFDb250cm9sbGVyU3R1YihkZWxlZ2F0ZSkgewogICAgdGhpcy5kZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKICB9CiAgTWVkaWFDb250cm9sbGVyU3R1Yi5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnBsYXkgJiYgdGhpcy5kZWxlZ2F0ZV8ucGxheSgpOwogIH0KICBNZWRpYUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnBhdXNlICYmIHRoaXMuZGVsZWdhdGVfLnBhdXNlKCk7CiAgfQogIE1lZGlhQ29udHJvbGxlclN0dWIucHJvdG90eXBlLnNldE11dGUgPSBmdW5jdGlvbihtdXRlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc2V0TXV0ZSAmJiB0aGlzLmRlbGVnYXRlXy5zZXRNdXRlKG11dGUpOwogIH0KICBNZWRpYUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5zZXRWb2x1bWUgPSBmdW5jdGlvbih2b2x1bWUpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zZXRWb2x1bWUgJiYgdGhpcy5kZWxlZ2F0ZV8uc2V0Vm9sdW1lKHZvbHVtZSk7CiAgfQogIE1lZGlhQ29udHJvbGxlclN0dWIucHJvdG90eXBlLnNlZWsgPSBmdW5jdGlvbih0aW1lKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc2VlayAmJiB0aGlzLmRlbGVnYXRlXy5zZWVrKHRpbWUpOwogIH0KICBNZWRpYUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5jb25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKGNvbnRyb2xsZXJSZXF1ZXN0KSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIgJiYgdGhpcy5kZWxlZ2F0ZV8uY29ubmVjdEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlclJlcXVlc3QpOwogIH0KCiAgTWVkaWFDb250cm9sbGVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9QbGF5X05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9QbGF5X1BhcmFtcyk7CiAgICAgIHRoaXMucGxheSgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9QYXVzZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zKTsKICAgICAgdGhpcy5wYXVzZSgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9TZXRNdXRlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9TZXRNdXRlX1BhcmFtcyk7CiAgICAgIHRoaXMuc2V0TXV0ZShwYXJhbXMubXV0ZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX1BhcmFtcyk7CiAgICAgIHRoaXMuc2V0Vm9sdW1lKHBhcmFtcy52b2x1bWUpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9TZWVrX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtcyk7CiAgICAgIHRoaXMuc2VlayhwYXJhbXMudGltZSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX0Nvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMpOwogICAgICB0aGlzLmNvbm5lY3RIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyKHBhcmFtcy5jb250cm9sbGVyUmVxdWVzdCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIE1lZGlhQ29udHJvbGxlclN0dWIucHJvdG90eXBlLmFjY2VwdFdpdGhSZXNwb25kZXIgPQogICAgICBmdW5jdGlvbihtZXNzYWdlLCByZXNwb25kZXIpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gdmFsaWRhdGVNZWRpYUNvbnRyb2xsZXJSZXF1ZXN0KG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlOwogICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX1BsYXlfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYUNvbnRyb2xsZXJfUGxheV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYUNvbnRyb2xsZXJfUGF1c2VfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYUNvbnRyb2xsZXJfUGF1c2VfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFDb250cm9sbGVyX1NldE11dGVfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYUNvbnRyb2xsZXJfU2V0TXV0ZV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYUNvbnRyb2xsZXJfU2V0Vm9sdW1lX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFDb250cm9sbGVyX1NldFZvbHVtZV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYUNvbnRyb2xsZXJfU2Vla19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhQ29udHJvbGxlcl9TZWVrX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhQ29udHJvbGxlcl9Db25uZWN0SGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHBhcmFtc0NsYXNzID09PSBudWxsKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogICAgcmV0dXJuIHBhcmFtc0NsYXNzLnZhbGlkYXRlKG1lc3NhZ2VWYWxpZGF0b3IsIG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZS5nZXRIZWFkZXJOdW1CeXRlcygpKTsKICB9CgogIGZ1bmN0aW9uIHZhbGlkYXRlTWVkaWFDb250cm9sbGVyUmVzcG9uc2UobWVzc2FnZVZhbGlkYXRvcikgewogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9CgogIHZhciBNZWRpYUNvbnRyb2xsZXIgPSB7CiAgICBuYW1lOiAnbWVkaWFfcm91dGVyLm1vam9tLk1lZGlhQ29udHJvbGxlcicsCiAgICBrVmVyc2lvbjogMCwKICAgIHB0ckNsYXNzOiBNZWRpYUNvbnRyb2xsZXJQdHIsCiAgICBwcm94eUNsYXNzOiBNZWRpYUNvbnRyb2xsZXJQcm94eSwKICAgIHN0dWJDbGFzczogTWVkaWFDb250cm9sbGVyU3R1YiwKICAgIHZhbGlkYXRlUmVxdWVzdDogdmFsaWRhdGVNZWRpYUNvbnRyb2xsZXJSZXF1ZXN0LAogICAgdmFsaWRhdGVSZXNwb25zZTogbnVsbCwKICB9OwogIE1lZGlhQ29udHJvbGxlclN0dWIucHJvdG90eXBlLnZhbGlkYXRvciA9IHZhbGlkYXRlTWVkaWFDb250cm9sbGVyUmVxdWVzdDsKICBNZWRpYUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUudmFsaWRhdG9yID0gbnVsbDsKICB2YXIga0hhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X05hbWUgPSAxODE2MDA0Mjc7CgogIGZ1bmN0aW9uIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQdHIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VQdHJDb250cm9sbGVyKEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7CiAgfQoKICBmdW5jdGlvbiBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyQXNzb2NpYXRlZFB0cihhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYXNzb2NpYXRlZEJpbmRpbmdzLkFzc29jaWF0ZWRJbnRlcmZhY2VQdHJDb250cm9sbGVyKAogICAgICAgIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXIsIGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKTsKICB9CgogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZSA9CiAgICAgIE9iamVjdC5jcmVhdGUoSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclB0ci5wcm90b3R5cGUpOwogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICAgIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyOwoKICBmdW5jdGlvbiBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUHJveHkocmVjZWl2ZXIpIHsKICAgIHRoaXMucmVjZWl2ZXJfID0gcmVjZWl2ZXI7CiAgfQogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQdHIucHJvdG90eXBlLnNldExvY2FsUHJlc2VudCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUuc2V0TG9jYWxQcmVzZW50CiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclByb3h5LnByb3RvdHlwZS5zZXRMb2NhbFByZXNlbnQgPSBmdW5jdGlvbihsb2NhbFByZXNlbnQpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X1BhcmFtcygpOwogICAgcGFyYW1zXy5sb2NhbFByZXNlbnQgPSBsb2NhbFByZXNlbnQ7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwoKICBmdW5jdGlvbiBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyU3R1YihkZWxlZ2F0ZSkgewogICAgdGhpcy5kZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsKICB9CiAgSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclN0dWIucHJvdG90eXBlLnNldExvY2FsUHJlc2VudCA9IGZ1bmN0aW9uKGxvY2FsUHJlc2VudCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnNldExvY2FsUHJlc2VudCAmJiB0aGlzLmRlbGVnYXRlXy5zZXRMb2NhbFByZXNlbnQobG9jYWxQcmVzZW50KTsKICB9CgogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgY2FzZSBrSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlcl9TZXRMb2NhbFByZXNlbnRfUGFyYW1zKTsKICAgICAgdGhpcy5zZXRMb2NhbFByZXNlbnQocGFyYW1zLmxvY2FsUHJlc2VudCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS5hY2NlcHRXaXRoUmVzcG9uZGVyID0KICAgICAgZnVuY3Rpb24obWVzc2FnZSwgcmVzcG9uZGVyKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIGZ1bmN0aW9uIHZhbGlkYXRlSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclJlcXVlc3QobWVzc2FnZVZhbGlkYXRvcikgewogICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2U7CiAgICB2YXIgcGFyYW1zQ2xhc3MgPSBudWxsOwogICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyX1NldExvY2FsUHJlc2VudF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJfU2V0TG9jYWxQcmVzZW50X1BhcmFtczsKICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgZnVuY3Rpb24gdmFsaWRhdGVIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUmVzcG9uc2UobWVzc2FnZVZhbGlkYXRvcikgewogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9CgogIHZhciBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyID0gewogICAgbmFtZTogJ21lZGlhX3JvdXRlci5tb2pvbS5IYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQdHIsCiAgICBwcm94eUNsYXNzOiBIYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUHJveHksCiAgICBzdHViQ2xhc3M6IEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJTdHViLAogICAgdmFsaWRhdGVSZXF1ZXN0OiB2YWxpZGF0ZUhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJSZXF1ZXN0LAogICAgdmFsaWRhdGVSZXNwb25zZTogbnVsbCwKICB9OwogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJTdHViLnByb3RvdHlwZS52YWxpZGF0b3IgPSB2YWxpZGF0ZUhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJSZXF1ZXN0OwogIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJQcm94eS5wcm90b3R5cGUudmFsaWRhdG9yID0gbnVsbDsKICBleHBvcnRzLk1lZGlhQ29udHJvbGxlciA9IE1lZGlhQ29udHJvbGxlcjsKICBleHBvcnRzLk1lZGlhQ29udHJvbGxlclB0ciA9IE1lZGlhQ29udHJvbGxlclB0cjsKICBleHBvcnRzLk1lZGlhQ29udHJvbGxlckFzc29jaWF0ZWRQdHIgPSBNZWRpYUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyOwogIGV4cG9ydHMuSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlciA9IEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXI7CiAgZXhwb3J0cy5IYW5nb3V0c01lZGlhUm91dGVDb250cm9sbGVyUHRyID0gSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlclB0cjsKICBleHBvcnRzLkhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXJBc3NvY2lhdGVkUHRyID0gSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlckFzc29jaWF0ZWRQdHI7Cn0pKCk7Ly8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICdjaHJvbWUvY29tbW9uL21lZGlhX3JvdXRlci9tb2pvL21lZGlhX3JvdXRlci5tb2pvbSc7CiAgaWYgKG1vam8uaW50ZXJuYWwuaXNNb2pvbUxvYWRlZChtb2pvbUlkKSkgewogICAgY29uc29sZS53YXJuKCdUaGUgZm9sbG93aW5nIG1vam9tIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lczogJyArIG1vam9tSWQpOwogICAgcmV0dXJuOwogIH0KICBtb2pvLmludGVybmFsLm1hcmtNb2pvbUxvYWRlZChtb2pvbUlkKTsKICB2YXIgYmluZGluZ3MgPSBtb2pvOwogIHZhciBhc3NvY2lhdGVkQmluZGluZ3MgPSBtb2pvOwogIHZhciBjb2RlYyA9IG1vam8uaW50ZXJuYWw7CiAgdmFyIHZhbGlkYXRvciA9IG1vam8uaW50ZXJuYWw7CgogIHZhciBleHBvcnRzID0gbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21lZGlhUm91dGVyLm1vam9tJyk7CiAgdmFyIG1lZGlhX2NvbnRyb2xsZXIkID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21lZGlhUm91dGVyLm1vam9tJyk7CiAgaWYgKG1vam8uY29uZmlnLmF1dG9Mb2FkTW9qb21EZXBzKSB7CiAgICBtb2pvLmludGVybmFsLmxvYWRNb2pvbUlmTmVjZXNzYXJ5KAogICAgICAgICdjaHJvbWUvY29tbW9uL21lZGlhX3JvdXRlci9tb2pvL21lZGlhX2NvbnRyb2xsZXIubW9qb20nLCAnbWVkaWFfY29udHJvbGxlci5tb2pvbS5qcycpOwogIH0KICB2YXIgbWVkaWFfc3RhdHVzJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtZWRpYVJvdXRlci5tb2pvbScpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAnY2hyb21lL2NvbW1vbi9tZWRpYV9yb3V0ZXIvbW9qby9tZWRpYV9zdGF0dXMubW9qb20nLCAnbWVkaWFfc3RhdHVzLm1vam9tLmpzJyk7CiAgfQogIHZhciBtaXJyb3Jfc2VydmljZV9yZW1vdGluZyQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWEubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ21lZGlhL21vam8vaW50ZXJmYWNlcy9taXJyb3Jfc2VydmljZV9yZW1vdGluZy5tb2pvbScsICcuLi8uLi8uLi8uLi9tZWRpYS9tb2pvL2ludGVyZmFjZXMvbWlycm9yX3NlcnZpY2VfcmVtb3RpbmcubW9qb20uanMnKTsKICB9CiAgdmFyIHRpbWUkID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21vam9CYXNlLm1vam9tJyk7CiAgaWYgKG1vam8uY29uZmlnLmF1dG9Mb2FkTW9qb21EZXBzKSB7CiAgICBtb2pvLmludGVybmFsLmxvYWRNb2pvbUlmTmVjZXNzYXJ5KAogICAgICAgICdtb2pvL3B1YmxpYy9tb2pvbS9iYXNlL3RpbWUubW9qb20nLCAnLi4vLi4vLi4vLi4vbW9qby9wdWJsaWMvbW9qb20vYmFzZS90aW1lLm1vam9tLmpzJyk7CiAgfQogIHZhciBpcF9hZGRyZXNzJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCduZXQuaW50ZXJmYWNlcycpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAnbmV0L2ludGVyZmFjZXMvaXBfYWRkcmVzcy5tb2pvbScsICcuLi8uLi8uLi8uLi9uZXQvaW50ZXJmYWNlcy9pcF9hZGRyZXNzLm1vam9tLmpzJyk7CiAgfQogIHZhciBpcF9lbmRwb2ludCQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbmV0LmludGVyZmFjZXMnKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ25ldC9pbnRlcmZhY2VzL2lwX2VuZHBvaW50Lm1vam9tJywgJy4uLy4uLy4uLy4uL25ldC9pbnRlcmZhY2VzL2lwX2VuZHBvaW50Lm1vam9tLmpzJyk7CiAgfQogIHZhciBvcmlnaW4kID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ3VybC5tb2pvbScpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAndXJsL21vam9tL29yaWdpbi5tb2pvbScsICcuLi8uLi8uLi8uLi91cmwvbW9qb20vb3JpZ2luLm1vam9tLmpzJyk7CiAgfQogIHZhciB1cmwkID0KICAgICAgbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ3VybC5tb2pvbScpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAndXJsL21vam9tL3VybC5tb2pvbScsICcuLi8uLi8uLi8uLi91cmwvbW9qb20vdXJsLm1vam9tLmpzJyk7CiAgfQoKCiAgdmFyIFNpbmtJY29uVHlwZSA9IHt9OwogIFNpbmtJY29uVHlwZS5DQVNUID0gMDsKICBTaW5rSWNvblR5cGUuQ0FTVF9BVURJT19HUk9VUCA9IFNpbmtJY29uVHlwZS5DQVNUICsgMTsKICBTaW5rSWNvblR5cGUuQ0FTVF9BVURJTyA9IFNpbmtJY29uVHlwZS5DQVNUX0FVRElPX0dST1VQICsgMTsKICBTaW5rSWNvblR5cGUuTUVFVElORyA9IFNpbmtJY29uVHlwZS5DQVNUX0FVRElPICsgMTsKICBTaW5rSWNvblR5cGUuSEFOR09VVCA9IFNpbmtJY29uVHlwZS5NRUVUSU5HICsgMTsKICBTaW5rSWNvblR5cGUuRURVQ0FUSU9OID0gU2lua0ljb25UeXBlLkhBTkdPVVQgKyAxOwogIFNpbmtJY29uVHlwZS5XSVJFRF9ESVNQTEFZID0gU2lua0ljb25UeXBlLkVEVUNBVElPTiArIDE7CiAgU2lua0ljb25UeXBlLkdFTkVSSUMgPSBTaW5rSWNvblR5cGUuV0lSRURfRElTUExBWSArIDE7CgogIFNpbmtJY29uVHlwZS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgIGNhc2UgNDoKICAgIGNhc2UgNToKICAgIGNhc2UgNjoKICAgIGNhc2UgNzoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgU2lua0ljb25UeXBlLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIHZhciBSb3V0ZUNvbnRyb2xsZXJUeXBlID0ge307CiAgUm91dGVDb250cm9sbGVyVHlwZS5rTm9uZSA9IDA7CiAgUm91dGVDb250cm9sbGVyVHlwZS5rR2VuZXJpYyA9IFJvdXRlQ29udHJvbGxlclR5cGUua05vbmUgKyAxOwogIFJvdXRlQ29udHJvbGxlclR5cGUua0hhbmdvdXRzID0gUm91dGVDb250cm9sbGVyVHlwZS5rR2VuZXJpYyArIDE7CiAgUm91dGVDb250cm9sbGVyVHlwZS5rTWlycm9yaW5nID0gUm91dGVDb250cm9sbGVyVHlwZS5rSGFuZ291dHMgKyAxOwoKICBSb3V0ZUNvbnRyb2xsZXJUeXBlLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgY2FzZSAzOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBSb3V0ZUNvbnRyb2xsZXJUeXBlLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIHZhciBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlID0ge307CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5VTktOT1dOX0VSUk9SID0gMDsKICBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLk9LID0gUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5VTktOT1dOX0VSUk9SICsgMTsKICBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLlRJTUVEX09VVCA9IFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuT0sgKyAxOwogIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuUk9VVEVfTk9UX0ZPVU5EID0gUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5USU1FRF9PVVQgKyAxOwogIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuU0lOS19OT1RfRk9VTkQgPSBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLlJPVVRFX05PVF9GT1VORCArIDE7CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5JTlZBTElEX09SSUdJTiA9IFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuU0lOS19OT1RfRk9VTkQgKyAxOwogIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuSU5DT0dOSVRPX01JU01BVENIID0gUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5JTlZBTElEX09SSUdJTiArIDE7CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5OT19TVVBQT1JURURfUFJPVklERVIgPSBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLklOQ09HTklUT19NSVNNQVRDSCArIDE7CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5DQU5DRUxMRUQgPSBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLk5PX1NVUFBPUlRFRF9QUk9WSURFUiArIDE7CiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5ST1VURV9BTFJFQURZX0VYSVNUUyA9IFJvdXRlUmVxdWVzdFJlc3VsdENvZGUuQ0FOQ0VMTEVEICsgMTsKCiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgIGNhc2UgNDoKICAgIGNhc2UgNToKICAgIGNhc2UgNjoKICAgIGNhc2UgNzoKICAgIGNhc2UgODoKICAgIGNhc2UgOToKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKCiAgZnVuY3Rpb24gTWVkaWFTaW5rKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFTaW5rLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNpbmtJZCA9IG51bGw7CiAgICB0aGlzLm5hbWUgPSBudWxsOwogICAgdGhpcy5kZXNjcmlwdGlvbiA9IG51bGw7CiAgICB0aGlzLmRvbWFpbiA9IG51bGw7CiAgICB0aGlzLmljb25UeXBlID0gMDsKICAgIHRoaXMucHJvdmlkZXJJZCA9IDA7CiAgICB0aGlzLmV4dHJhRGF0YSA9IG51bGw7CiAgfTsKICBNZWRpYVNpbmsucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVNpbmsudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsuc2lua0lkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU2luay5uYW1lCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU2luay5kZXNjcmlwdGlvbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgdHJ1ZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsuZG9tYWluCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0LCB0cnVlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU2luay5pY29uVHlwZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAzMiwgU2lua0ljb25UeXBlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsucHJvdmlkZXJJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAzNiwgTWVkaWFSb3V0ZVByb3ZpZGVyLklkKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmsuZXh0cmFEYXRhCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlVW5pb24ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0MCwgTWVkaWFTaW5rRXh0cmFEYXRhLCB0cnVlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFTaW5rLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA1NjsKCiAgTWVkaWFTaW5rLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhU2luaygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuc2lua0lkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5uYW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5kZXNjcmlwdGlvbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5kb21haW4gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZyk7CiAgICB2YWwuaWNvblR5cGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwucHJvdmlkZXJJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHZhbC5leHRyYURhdGEgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChNZWRpYVNpbmtFeHRyYURhdGEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVNpbmsuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVNpbmsuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnNpbmtJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5uYW1lKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwuZGVzY3JpcHRpb24pOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcsIHZhbC5kb21haW4pOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5pY29uVHlwZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnByb3ZpZGVySWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoTWVkaWFTaW5rRXh0cmFEYXRhLCB2YWwuZXh0cmFEYXRhKTsKICB9OwogIGZ1bmN0aW9uIERpYWxNZWRpYVNpbmsodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBEaWFsTWVkaWFTaW5rLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmlwQWRkcmVzcyA9IG51bGw7CiAgICB0aGlzLm1vZGVsTmFtZSA9IG51bGw7CiAgICB0aGlzLmFwcFVybCA9IG51bGw7CiAgfTsKICBEaWFsTWVkaWFTaW5rLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgRGlhbE1lZGlhU2luay52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAzMn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIERpYWxNZWRpYVNpbmsuaXBBZGRyZXNzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGlwX2FkZHJlc3MkLklQQWRkcmVzcywgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIERpYWxNZWRpYVNpbmsubW9kZWxOYW1lCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIERpYWxNZWRpYVNpbmsuYXBwVXJsCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCB1cmwkLlVybCwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBEaWFsTWVkaWFTaW5rLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgRGlhbE1lZGlhU2luay5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBEaWFsTWVkaWFTaW5rKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5pcEFkZHJlc3MgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIoaXBfYWRkcmVzcyQuSVBBZGRyZXNzKTsKICAgIHZhbC5tb2RlbE5hbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmFwcFVybCA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcih1cmwkLlVybCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIERpYWxNZWRpYVNpbmsuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihEaWFsTWVkaWFTaW5rLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoaXBfYWRkcmVzcyQuSVBBZGRyZXNzLCB2YWwuaXBBZGRyZXNzKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1vZGVsTmFtZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIodXJsJC5VcmwsIHZhbC5hcHBVcmwpOwogIH07CiAgZnVuY3Rpb24gQ2FzdE1lZGlhU2luayh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIENhc3RNZWRpYVNpbmsucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuaXBFbmRwb2ludCA9IG51bGw7CiAgICB0aGlzLm1vZGVsTmFtZSA9IG51bGw7CiAgICB0aGlzLmNhcGFiaWxpdGllcyA9IDA7CiAgICB0aGlzLmNhc3RDaGFubmVsSWQgPSAwOwogIH07CiAgQ2FzdE1lZGlhU2luay5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIENhc3RNZWRpYVNpbmsudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMzJ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBDYXN0TWVkaWFTaW5rLmlwRW5kcG9pbnQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgaXBfZW5kcG9pbnQkLklQRW5kUG9pbnQsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBDYXN0TWVkaWFTaW5rLm1vZGVsTmFtZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBDYXN0TWVkaWFTaW5rLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgQ2FzdE1lZGlhU2luay5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBDYXN0TWVkaWFTaW5rKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5pcEVuZHBvaW50ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKGlwX2VuZHBvaW50JC5JUEVuZFBvaW50KTsKICAgIHZhbC5tb2RlbE5hbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmNhcGFiaWxpdGllcyA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlVpbnQ4KTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC5jYXN0Q2hhbm5lbElkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBDYXN0TWVkaWFTaW5rLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoQ2FzdE1lZGlhU2luay5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKGlwX2VuZHBvaW50JC5JUEVuZFBvaW50LCB2YWwuaXBFbmRwb2ludCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tb2RlbE5hbWUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuVWludDgsIHZhbC5jYXBhYmlsaXRpZXMpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5jYXN0Q2hhbm5lbElkKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGUodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhUm91dGVJZCA9IG51bGw7CiAgICB0aGlzLnByZXNlbnRhdGlvbklkID0gbnVsbDsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogICAgdGhpcy5tZWRpYVNpbmtJZCA9IG51bGw7CiAgICB0aGlzLmRlc2NyaXB0aW9uID0gbnVsbDsKICAgIHRoaXMuaXNMb2NhbCA9IGZhbHNlOwogICAgdGhpcy5mb3JEaXNwbGF5ID0gZmFsc2U7CiAgICB0aGlzLmlzSW5jb2duaXRvID0gZmFsc2U7CiAgICB0aGlzLmlzTG9jYWxQcmVzZW50YXRpb24gPSBmYWxzZTsKICAgIHRoaXMuY29udHJvbGxlclR5cGUgPSAwOwogIH07CiAgTWVkaWFSb3V0ZS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGUudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlLm1lZGlhUm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlLnByZXNlbnRhdGlvbklkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGUubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIHRydWUpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZS5tZWRpYVNpbmtJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZS5kZXNjcmlwdGlvbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAzMiwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGUuY29udHJvbGxlclR5cGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDQsIFJvdXRlQ29udHJvbGxlclR5cGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0ODsKCiAgTWVkaWFSb3V0ZS5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnByZXNlbnRhdGlvbklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5tZWRpYVNpbmtJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuZGVzY3JpcHRpb24gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5pc0xvY2FsID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuZm9yRGlzcGxheSA9IChwYWNrZWQgPj4gMSkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgdmFsLmlzSW5jb2duaXRvID0gKHBhY2tlZCA+PiAyKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuaXNMb2NhbFByZXNlbnRhdGlvbiA9IChwYWNrZWQgPj4gMykgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLmNvbnRyb2xsZXJUeXBlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFSb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnByZXNlbnRhdGlvbklkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTaW5rSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuZGVzY3JpcHRpb24pOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmlzTG9jYWwgJiAxKSA8PCAwCiAgICBwYWNrZWQgfD0gKHZhbC5mb3JEaXNwbGF5ICYgMSkgPDwgMQogICAgcGFja2VkIHw9ICh2YWwuaXNJbmNvZ25pdG8gJiAxKSA8PCAyCiAgICBwYWNrZWQgfD0gKHZhbC5pc0xvY2FsUHJlc2VudGF0aW9uICYgMSkgPDwgMwogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLmNvbnRyb2xsZXJUeXBlKTsKICB9OwogIGZ1bmN0aW9uIElzc3VlKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKICBJc3N1ZS5TZXZlcml0eSA9IHt9OwogIElzc3VlLlNldmVyaXR5LkZBVEFMID0gMDsKICBJc3N1ZS5TZXZlcml0eS5XQVJOSU5HID0gSXNzdWUuU2V2ZXJpdHkuRkFUQUwgKyAxOwogIElzc3VlLlNldmVyaXR5Lk5PVElGSUNBVElPTiA9IElzc3VlLlNldmVyaXR5LldBUk5JTkcgKyAxOwoKICBJc3N1ZS5TZXZlcml0eS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgSXNzdWUuU2V2ZXJpdHkudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CiAgSXNzdWUuQWN0aW9uVHlwZSA9IHt9OwogIElzc3VlLkFjdGlvblR5cGUuRElTTUlTUyA9IDA7CiAgSXNzdWUuQWN0aW9uVHlwZS5MRUFSTl9NT1JFID0gSXNzdWUuQWN0aW9uVHlwZS5ESVNNSVNTICsgMTsKCiAgSXNzdWUuQWN0aW9uVHlwZS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgSXNzdWUuQWN0aW9uVHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKCiAgSXNzdWUucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgICB0aGlzLnNpbmtJZCA9IG51bGw7CiAgICB0aGlzLnNldmVyaXR5ID0gMDsKICAgIHRoaXMuaXNCbG9ja2luZyA9IGZhbHNlOwogICAgdGhpcy50aXRsZSA9IG51bGw7CiAgICB0aGlzLm1lc3NhZ2UgPSBudWxsOwogICAgdGhpcy5kZWZhdWx0QWN0aW9uID0gMDsKICAgIHRoaXMuaGVscFBhZ2VJZCA9IDA7CiAgICB0aGlzLnNlY29uZGFyeUFjdGlvbnMgPSBudWxsOwogIH07CiAgSXNzdWUucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBJc3N1ZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA2NH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIElzc3VlLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgSXNzdWUuc2lua0lkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIElzc3VlLnNldmVyaXR5CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBJc3N1ZS5TZXZlcml0eSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIC8vIHZhbGlkYXRlIElzc3VlLnRpdGxlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBJc3N1ZS5tZXNzYWdlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDMyLCB0cnVlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIElzc3VlLmRlZmF1bHRBY3Rpb24KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDAsIElzc3VlLkFjdGlvblR5cGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIElzc3VlLnNlY29uZGFyeUFjdGlvbnMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0OCwgNCwgbmV3IGNvZGVjLkVudW0oSXNzdWUuQWN0aW9uVHlwZSksIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgSXNzdWUuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDU2OwoKICBJc3N1ZS5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBJc3N1ZSgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuc2lua0lkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5zZXZlcml0eSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuaXNCbG9ja2luZyA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLnRpdGxlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5tZXNzYWdlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcpOwogICAgdmFsLmRlZmF1bHRBY3Rpb24gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwuaGVscFBhZ2VJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHZhbC5zZWNvbmRhcnlBY3Rpb25zID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oSXNzdWUuQWN0aW9uVHlwZSkpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBJc3N1ZS5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKElzc3VlLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnNpbmtJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnNldmVyaXR5KTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5pc0Jsb2NraW5nICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC50aXRsZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZywgdmFsLm1lc3NhZ2UpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5kZWZhdWx0QWN0aW9uKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwuaGVscFBhZ2VJZCk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuRW51bShJc3N1ZS5BY3Rpb25UeXBlKSwgdmFsLnNlY29uZGFyeUFjdGlvbnMpOwogIH07CiAgZnVuY3Rpb24gUm91dGVNZXNzYWdlKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKICBSb3V0ZU1lc3NhZ2UuVHlwZSA9IHt9OwogIFJvdXRlTWVzc2FnZS5UeXBlLlRFWFQgPSAwOwogIFJvdXRlTWVzc2FnZS5UeXBlLkJJTkFSWSA9IFJvdXRlTWVzc2FnZS5UeXBlLlRFWFQgKyAxOwoKICBSb3V0ZU1lc3NhZ2UuVHlwZS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUm91dGVNZXNzYWdlLlR5cGUudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CgogIFJvdXRlTWVzc2FnZS5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy50eXBlID0gMDsKICAgIHRoaXMubWVzc2FnZSA9IG51bGw7CiAgICB0aGlzLmRhdGEgPSBudWxsOwogIH07CiAgUm91dGVNZXNzYWdlLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgUm91dGVNZXNzYWdlLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDMyfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgUm91dGVNZXNzYWdlLnR5cGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgUm91dGVNZXNzYWdlLlR5cGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIFJvdXRlTWVzc2FnZS5tZXNzYWdlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIHRydWUpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgUm91dGVNZXNzYWdlLmRhdGEKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgMSwgY29kZWMuVWludDgsIHRydWUsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIFJvdXRlTWVzc2FnZS5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQ7CgogIFJvdXRlTWVzc2FnZS5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBSb3V0ZU1lc3NhZ2UoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnR5cGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICB2YWwubWVzc2FnZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nKTsKICAgIHZhbC5kYXRhID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIoY29kZWMuVWludDgpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBSb3V0ZU1lc3NhZ2UuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihSb3V0ZU1lc3NhZ2UuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwudHlwZSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZywgdmFsLm1lc3NhZ2UpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIoY29kZWMuVWludDgsIHZhbC5kYXRhKTsKICB9OwogIGZ1bmN0aW9uIFNpbmtTZWFyY2hDcml0ZXJpYSh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIFNpbmtTZWFyY2hDcml0ZXJpYS5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pbnB1dCA9IG51bGw7CiAgICB0aGlzLmRvbWFpbiA9IG51bGw7CiAgfTsKICBTaW5rU2VhcmNoQ3JpdGVyaWEucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBTaW5rU2VhcmNoQ3JpdGVyaWEudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBTaW5rU2VhcmNoQ3JpdGVyaWEuaW5wdXQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgU2lua1NlYXJjaENyaXRlcmlhLmRvbWFpbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgU2lua1NlYXJjaENyaXRlcmlhLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNjsKCiAgU2lua1NlYXJjaENyaXRlcmlhLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IFNpbmtTZWFyY2hDcml0ZXJpYSgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuaW5wdXQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmRvbWFpbiA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIFNpbmtTZWFyY2hDcml0ZXJpYS5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKFNpbmtTZWFyY2hDcml0ZXJpYS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuaW5wdXQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuZG9tYWluKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlckNvbmZpZyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlckNvbmZpZy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lbmFibGVEaWFsRGlzY292ZXJ5ID0gZmFsc2U7CiAgICB0aGlzLmVuYWJsZUNhc3REaXNjb3ZlcnkgPSBmYWxzZTsKICAgIHRoaXMuZW5hYmxlRGlhbFNpbmtRdWVyeSA9IGZhbHNlOwogICAgdGhpcy5lbmFibGVDYXN0U2lua1F1ZXJ5ID0gZmFsc2U7CiAgICB0aGlzLnVzZVZpZXdzRGlhbG9nID0gZmFsc2U7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgoKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlckNvbmZpZy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5lbmFibGVEaWFsRGlzY292ZXJ5ID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuZW5hYmxlQ2FzdERpc2NvdmVyeSA9IChwYWNrZWQgPj4gMSkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgdmFsLmVuYWJsZURpYWxTaW5rUXVlcnkgPSAocGFja2VkID4+IDIpICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIHZhbC5lbmFibGVDYXN0U2lua1F1ZXJ5ID0gKHBhY2tlZCA+PiAzKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwudXNlVmlld3NEaWFsb2cgPSAocGFja2VkID4+IDQpICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyQ29uZmlnLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuZW5hYmxlRGlhbERpc2NvdmVyeSAmIDEpIDw8IDAKICAgIHBhY2tlZCB8PSAodmFsLmVuYWJsZUNhc3REaXNjb3ZlcnkgJiAxKSA8PCAxCiAgICBwYWNrZWQgfD0gKHZhbC5lbmFibGVEaWFsU2lua1F1ZXJ5ICYgMSkgPDwgMgogICAgcGFja2VkIHw9ICh2YWwuZW5hYmxlQ2FzdFNpbmtRdWVyeSAmIDEpIDw8IDMKICAgIHBhY2tlZCB8PSAodmFsLnVzZVZpZXdzRGlhbG9nICYgMSkgPDwgNAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgICB0aGlzLnNpbmtJZCA9IG51bGw7CiAgICB0aGlzLm9yaWdpbmFsUHJlc2VudGF0aW9uSWQgPSBudWxsOwogICAgdGhpcy5vcmlnaW4gPSBudWxsOwogICAgdGhpcy50YWJJZCA9IDA7CiAgICB0aGlzLmluY29nbml0byA9IGZhbHNlOwogICAgdGhpcy50aW1lb3V0ID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDU2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLnNpbmtJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLm9yaWdpbmFsUHJlc2VudGF0aW9uSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMub3JpZ2luCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0LCBvcmlnaW4kLk9yaWdpbiwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLnRpbWVvdXQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDAsIHRpbWUkLlRpbWVEZWx0YSwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgNDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnNpbmtJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwub3JpZ2luYWxQcmVzZW50YXRpb25JZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwub3JpZ2luID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKG9yaWdpbiQuT3JpZ2luKTsKICAgIHZhbC50YWJJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuaW5jb2duaXRvID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICB2YWwudGltZW91dCA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcih0aW1lJC5UaW1lRGVsdGEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuc2lua0lkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm9yaWdpbmFsUHJlc2VudGF0aW9uSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKG9yaWdpbiQuT3JpZ2luLCB2YWwub3JpZ2luKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwudGFiSWQpOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmluY29nbml0byAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSwgdmFsLnRpbWVvdXQpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlID0gbnVsbDsKICAgIHRoaXMuZXJyb3JUZXh0ID0gbnVsbDsKICAgIHRoaXMucmVzdWx0Q29kZSA9IDA7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMzJ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMucm91dGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgTWVkaWFSb3V0ZSwgdHJ1ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVycm9yVGV4dAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCB0cnVlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5yZXN1bHRDb2RlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIoTWVkaWFSb3V0ZSk7CiAgICB2YWwuZXJyb3JUZXh0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcpOwogICAgdmFsLnJlc3VsdENvZGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKE1lZGlhUm91dGUsIHZhbC5yb3V0ZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZywgdmFsLmVycm9yVGV4dCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnJlc3VsdENvZGUpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgICB0aGlzLnByZXNlbnRhdGlvbklkID0gbnVsbDsKICAgIHRoaXMub3JpZ2luID0gbnVsbDsKICAgIHRoaXMudGFiSWQgPSAwOwogICAgdGhpcy5pbmNvZ25pdG8gPSBmYWxzZTsKICAgIHRoaXMudGltZW91dCA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDQ4fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMucHJlc2VudGF0aW9uSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMub3JpZ2luCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBvcmlnaW4kLk9yaWdpbiwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy50aW1lb3V0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDMyLCB0aW1lJC5UaW1lRGVsdGEsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0MDsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5wcmVzZW50YXRpb25JZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwub3JpZ2luID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKG9yaWdpbiQuT3JpZ2luKTsKICAgIHZhbC50YWJJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuaW5jb2duaXRvID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICB2YWwudGltZW91dCA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcih0aW1lJC5UaW1lRGVsdGEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5wcmVzZW50YXRpb25JZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIob3JpZ2luJC5PcmlnaW4sIHZhbC5vcmlnaW4pOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC50YWJJZCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuaW5jb2duaXRvICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhLCB2YWwudGltZW91dCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZSA9IG51bGw7CiAgICB0aGlzLmVycm9yVGV4dCA9IG51bGw7CiAgICB0aGlzLnJlc3VsdENvZGUgPSAwOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMzJ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLnJvdXRlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIE1lZGlhUm91dGUsIHRydWUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMuZXJyb3JUZXh0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIHRydWUpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcy5yZXN1bHRDb2RlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQ7CgogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIoTWVkaWFSb3V0ZSk7CiAgICB2YWwuZXJyb3JUZXh0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcpOwogICAgdmFsLnJlc3VsdENvZGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoTWVkaWFSb3V0ZSwgdmFsLnJvdXRlKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLk51bGxhYmxlU3RyaW5nLCB2YWwuZXJyb3JUZXh0KTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucmVzdWx0Q29kZSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lZGlhU291cmNlID0gbnVsbDsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgICB0aGlzLnByZXNlbnRhdGlvbklkID0gbnVsbDsKICAgIHRoaXMub3JpZ2luID0gbnVsbDsKICAgIHRoaXMudGFiSWQgPSAwOwogICAgdGhpcy5pbmNvZ25pdG8gPSBmYWxzZTsKICAgIHRoaXMudGltZW91dCA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDU2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMucm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5wcmVzZW50YXRpb25JZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMub3JpZ2luCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0LCBvcmlnaW4kLk9yaWdpbiwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy50aW1lb3V0CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQwLCB0aW1lJC5UaW1lRGVsdGEsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0ODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5yb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5wcmVzZW50YXRpb25JZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwub3JpZ2luID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKG9yaWdpbiQuT3JpZ2luKTsKICAgIHZhbC50YWJJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuaW5jb2duaXRvID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICB2YWwudGltZW91dCA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcih0aW1lJC5UaW1lRGVsdGEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnByZXNlbnRhdGlvbklkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihvcmlnaW4kLk9yaWdpbiwgdmFsLm9yaWdpbik7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnRhYklkKTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5pbmNvZ25pdG8gJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcih0aW1lJC5UaW1lRGVsdGEsIHZhbC50aW1lb3V0KTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlID0gbnVsbDsKICAgIHRoaXMuZXJyb3JUZXh0ID0gbnVsbDsKICAgIHRoaXMucmVzdWx0Q29kZSA9IDA7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAzMn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMucm91dGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgTWVkaWFSb3V0ZSwgdHJ1ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy5lcnJvclRleHQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgdHJ1ZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLnJlc3VsdENvZGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIFJvdXRlUmVxdWVzdFJlc3VsdENvZGUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihNZWRpYVJvdXRlKTsKICAgIHZhbC5lcnJvclRleHQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5OdWxsYWJsZVN0cmluZyk7CiAgICB2YWwucmVzdWx0Q29kZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihNZWRpYVJvdXRlLCB2YWwucm91dGUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcsIHZhbC5lcnJvclRleHQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5yZXN1bHRDb2RlKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlSWQgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5lcnJvclRleHQgPSBudWxsOwogICAgdGhpcy5yZXN1bHRDb2RlID0gMDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lcnJvclRleHQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgdHJ1ZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMucmVzdWx0Q29kZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNjsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuZXJyb3JUZXh0ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcpOwogICAgdmFsLnJlc3VsdENvZGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuTnVsbGFibGVTdHJpbmcsIHZhbC5lcnJvclRleHQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5yZXN1bHRDb2RlKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVJvdXRlSWQgPSBudWxsOwogICAgdGhpcy5tZXNzYWdlID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcy5tZWRpYVJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLm1lc3NhZ2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lZGlhUm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwubWVzc2FnZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFSb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lc3NhZ2UpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zZW50ID0gZmFsc2U7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5zZW50ID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC5zZW50ICYgMSkgPDwgMAogICAgZW5jb2Rlci53cml0ZVVpbnQ4KHBhY2tlZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVkaWFSb3V0ZUlkID0gbnVsbDsKICAgIHRoaXMuZGF0YSA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMubWVkaWFSb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcy5kYXRhCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlQXJyYXlQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgMSwgY29kZWMuVWludDgsIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZWRpYVJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmRhdGEgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihjb2RlYy5VaW50OCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFSb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4LCB2YWwuZGF0YSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNlbnQgPSBmYWxzZTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLnNlbnQgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLnNlbnQgJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVkaWFTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwubWVkaWFTb3VyY2UpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yb3V0ZUlkID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5yb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlSWQgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlSWQgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDh9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwOwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zaW5rSWQgPSBudWxsOwogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgICB0aGlzLnNlYXJjaENyaXRlcmlhID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDMyfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy5zaW5rSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy5tZWRpYVNvdXJjZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLnNlYXJjaENyaXRlcmlhCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCBTaW5rU2VhcmNoQ3JpdGVyaWEsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQ7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuc2lua0lkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5tZWRpYVNvdXJjZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuc2VhcmNoQ3JpdGVyaWEgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIoU2lua1NlYXJjaENyaXRlcmlhKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnNpbmtJZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoU2lua1NlYXJjaENyaXRlcmlhLCB2YWwuc2VhcmNoQ3JpdGVyaWEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNpbmtJZCA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMuc2lua0lkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnNpbmtJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuc2lua0lkKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucHJvdmlkZXJOYW1lID0gbnVsbDsKICAgIHRoaXMuc2lua3MgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zLnByb3ZpZGVyTmFtZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy5zaW5rcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIDgsIG5ldyBjb2RlYy5Qb2ludGVyVG8oTWVkaWFTaW5rKSwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNjsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnByb3ZpZGVyTmFtZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuc2lua3MgPSBkZWNvZGVyLmRlY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuUG9pbnRlclRvKE1lZGlhU2luaykpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5wcm92aWRlck5hbWUpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLlBvaW50ZXJUbyhNZWRpYVNpbmspLCB2YWwuc2lua3MpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgICB0aGlzLm1lZGlhQ29udHJvbGxlciA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VSZXF1ZXN0KCk7CiAgICB0aGlzLm9ic2VydmVyID0gbmV3IG1lZGlhX3N0YXR1cyQuTWVkaWFTdGF0dXNPYnNlcnZlclB0cigpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMzJ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5tZWRpYUNvbnRyb2xsZXIKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVJbnRlcmZhY2VSZXF1ZXN0KG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5vYnNlcnZlcgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUludGVyZmFjZShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDEyLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnJvdXRlSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLm1lZGlhQ29udHJvbGxlciA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludGVyZmFjZVJlcXVlc3QpOwogICAgdmFsLm9ic2VydmVyID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QobmV3IGNvZGVjLkludGVyZmFjZShtZWRpYV9zdGF0dXMkLk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHIpKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnJvdXRlSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50ZXJmYWNlUmVxdWVzdCwgdmFsLm1lZGlhQ29udHJvbGxlcik7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChuZXcgY29kZWMuSW50ZXJmYWNlKG1lZGlhX3N0YXR1cyQuTWVkaWFTdGF0dXNPYnNlcnZlclB0ciksIHZhbC5vYnNlcnZlcik7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuc3VjY2VzcyA9IGZhbHNlOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5zdWNjZXNzID0gKHBhY2tlZCA+PiAwKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLnN1Y2Nlc3MgJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wcm92aWRlcklkID0gMDsKICAgIHRoaXMubWVkaWFSb3V0ZXJQcm92aWRlciA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJQdHIoKTsKICB9OwogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAyNH0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy5wcm92aWRlcklkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIE1lZGlhUm91dGVQcm92aWRlci5JZCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zLm1lZGlhUm91dGVyUHJvdmlkZXIKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVJbnRlcmZhY2Uob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA0LCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnByb3ZpZGVySWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwubWVkaWFSb3V0ZXJQcm92aWRlciA9IGRlY29kZXIuZGVjb2RlU3RydWN0KG5ldyBjb2RlYy5JbnRlcmZhY2UoTWVkaWFSb3V0ZVByb3ZpZGVyUHRyKSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5wcm92aWRlcklkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KG5ldyBjb2RlYy5JbnRlcmZhY2UoTWVkaWFSb3V0ZVByb3ZpZGVyUHRyKSwgdmFsLm1lZGlhUm91dGVyUHJvdmlkZXIpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pbnN0YW5jZUlkID0gbnVsbDsKICAgIHRoaXMuY29uZmlnID0gbnVsbDsKICB9OwogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcy5pbnN0YW5jZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLmNvbmZpZwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWcsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuaW5zdGFuY2VJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuY29uZmlnID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKE1lZGlhUm91dGVQcm92aWRlckNvbmZpZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLmluc3RhbmNlSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKE1lZGlhUm91dGVQcm92aWRlckNvbmZpZywgdmFsLmNvbmZpZyk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wcm92aWRlcklkID0gMDsKICAgIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsOwogICAgdGhpcy5zaW5rcyA9IG51bGw7CiAgICB0aGlzLm9yaWdpbnMgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNDB9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLnByb3ZpZGVySWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgTWVkaWFSb3V0ZVByb3ZpZGVyLklkKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLm1lZGlhU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMuc2lua3MKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAxNiwgOCwgbmV3IGNvZGVjLlBvaW50ZXJUbyhNZWRpYVNpbmspLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLm9yaWdpbnMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgOCwgbmV3IGNvZGVjLlBvaW50ZXJUbyhvcmlnaW4kLk9yaWdpbiksIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAzMjsKCiAgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5wcm92aWRlcklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5zaW5rcyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5Qb2ludGVyVG8oTWVkaWFTaW5rKSk7CiAgICB2YWwub3JpZ2lucyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5Qb2ludGVyVG8ob3JpZ2luJC5PcmlnaW4pKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucHJvdmlkZXJJZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5tZWRpYVNvdXJjZSk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuUG9pbnRlclRvKE1lZGlhU2luayksIHZhbC5zaW5rcyk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuUG9pbnRlclRvKG9yaWdpbiQuT3JpZ2luKSwgdmFsLm9yaWdpbnMpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5pc3N1ZSA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMuaXNzdWUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgSXNzdWUsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5pc3N1ZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihJc3N1ZSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX09uSXNzdWVfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihJc3N1ZSwgdmFsLmlzc3VlKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnByb3ZpZGVySWQgPSAwOwogICAgdGhpcy5yb3V0ZXMgPSBudWxsOwogICAgdGhpcy5tZWRpYVNvdXJjZSA9IG51bGw7CiAgICB0aGlzLmpvaW5hYmxlUm91dGVJZHMgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogNDB9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLnByb3ZpZGVySWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgTWVkaWFSb3V0ZVByb3ZpZGVyLklkKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLnJvdXRlcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDgsIDgsIG5ldyBjb2RlYy5Qb2ludGVyVG8oTWVkaWFSb3V0ZSksIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMubWVkaWFTb3VyY2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMuam9pbmFibGVSb3V0ZUlkcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0LCA4LCBjb2RlYy5TdHJpbmcsIGZhbHNlLCBbMCwgMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAzMjsKCiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5wcm92aWRlcklkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLnJvdXRlcyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5Qb2ludGVyVG8oTWVkaWFSb3V0ZSkpOwogICAgdmFsLm1lZGlhU291cmNlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5qb2luYWJsZVJvdXRlSWRzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucHJvdmlkZXJJZCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuUG9pbnRlclRvKE1lZGlhUm91dGUpLCB2YWwucm91dGVzKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lZGlhU291cmNlKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKGNvZGVjLlN0cmluZywgdmFsLmpvaW5hYmxlUm91dGVJZHMpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wcm92aWRlcklkID0gMDsKICAgIHRoaXMuYXZhaWxhYmlsaXR5ID0gMDsKICB9OwogIE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcy5wcm92aWRlcklkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIE1lZGlhUm91dGVQcm92aWRlci5JZCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMuYXZhaWxhYmlsaXR5CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQsIE1lZGlhUm91dGVyLlNpbmtBdmFpbGFiaWxpdHkpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnByb3ZpZGVySWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwuYXZhaWxhYmlsaXR5ID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnByb3ZpZGVySWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5hdmFpbGFiaWxpdHkpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgICB0aGlzLnN0YXRlID0gMDsKICB9OwogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcy5yb3V0ZUlkCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMuc3RhdGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucm91dGVJZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICB2YWwuc3RhdGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwuc3RhdGUpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucm91dGVJZCA9IG51bGw7CiAgICB0aGlzLnJlYXNvbiA9IDA7CiAgICB0aGlzLm1lc3NhZ2UgPSBudWxsOwogIH07CiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMzJ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLnJvdXRlSWQKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgZmFsc2UpCiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy5yZWFzb24KICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgOCwgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLm1lc3NhZ2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTYsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNDsKCiAgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5yZWFzb24gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICB2YWwubWVzc2FnZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5yb3V0ZUlkKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucmVhc29uKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLm1lc3NhZ2UpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJvdXRlSWQgPSBudWxsOwogICAgdGhpcy5tZXNzYWdlcyA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMjR9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMucm91dGVJZAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMubWVzc2FnZXMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCA4LCBuZXcgY29kZWMuUG9pbnRlclRvKFJvdXRlTWVzc2FnZSksIGZhbHNlLCBbMF0sIDApOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2OwoKICBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yb3V0ZUlkID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHZhbC5tZXNzYWdlcyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5Qb2ludGVyVG8oUm91dGVNZXNzYWdlKSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwucm91dGVJZCk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuUG9pbnRlclRvKFJvdXRlTWVzc2FnZSksIHZhbC5tZXNzYWdlcyk7CiAgfTsKICBmdW5jdGlvbiBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy50YWJJZCA9IDA7CiAgICB0aGlzLnJlbW90ZXIgPSBuZXcgbWlycm9yX3NlcnZpY2VfcmVtb3RpbmckLk1pcnJvclNlcnZpY2VSZW1vdGVyUHRyKCk7CiAgICB0aGlzLnJlbW90aW5nU291cmNlID0gbmV3IGJpbmRpbmdzLkludGVyZmFjZVJlcXVlc3QoKTsKICB9OwogIE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMucmVtb3RlcgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUludGVyZmFjZShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQsIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLnJlbW90aW5nU291cmNlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlSW50ZXJmYWNlUmVxdWVzdChvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDEyLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwudGFiSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwucmVtb3RlciA9IGRlY29kZXIuZGVjb2RlU3RydWN0KG5ldyBjb2RlYy5JbnRlcmZhY2UobWlycm9yX3NlcnZpY2VfcmVtb3RpbmckLk1pcnJvclNlcnZpY2VSZW1vdGVyUHRyKSk7CiAgICB2YWwucmVtb3RpbmdTb3VyY2UgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnRlcmZhY2VSZXF1ZXN0KTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwudGFiSWQpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QobmV3IGNvZGVjLkludGVyZmFjZShtaXJyb3Jfc2VydmljZV9yZW1vdGluZyQuTWlycm9yU2VydmljZVJlbW90ZXJQdHIpLCB2YWwucmVtb3Rlcik7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnRlcmZhY2VSZXF1ZXN0LCB2YWwucmVtb3RpbmdTb3VyY2UpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogIH07CiAgTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA4fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwOwoKICBNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICB9OwogIGZ1bmN0aW9uIE1lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfUmVzcG9uc2VQYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnN0YXR1cyA9IG51bGw7CiAgfTsKICBNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfUmVzcG9uc2VQYXJhbXMuc3RhdHVzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnN0YXR1cyA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLlN0cmluZyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfUmVzcG9uc2VQYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5zdGF0dXMpOwogIH07CgogIGZ1bmN0aW9uIE1lZGlhU2lua0V4dHJhRGF0YSh2YWx1ZSkgewogICAgdGhpcy5pbml0RGVmYXVsdF8oKTsKICAgIHRoaXMuaW5pdFZhbHVlXyh2YWx1ZSk7CiAgfQoKCiAgTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MgPSB7CiAgICBkaWFsTWVkaWFTaW5rOiAwLAogICAgY2FzdE1lZGlhU2luazogMSwKICB9OwoKICBNZWRpYVNpbmtFeHRyYURhdGEucHJvdG90eXBlLmluaXREZWZhdWx0XyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy4kZGF0YSA9IG51bGw7CiAgICB0aGlzLiR0YWcgPSB1bmRlZmluZWQ7CiAgfQoKICBNZWRpYVNpbmtFeHRyYURhdGEucHJvdG90eXBlLmluaXRWYWx1ZV8gPSBmdW5jdGlvbih2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7CiAgICBpZiAoa2V5cy5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGtleXMubGVuZ3RoID4gMSkgewogICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJZb3UgbWF5IHNldCBvbmx5IG9uZSBtZW1iZXIgb24gYSB1bmlvbi4iKTsKICAgIH0KCiAgICB2YXIgZmllbGRzID0gWwogICAgICAgICJkaWFsTWVkaWFTaW5rIiwKICAgICAgICAiY2FzdE1lZGlhU2luayIsCiAgICBdOwoKICAgIGlmIChmaWVsZHMuaW5kZXhPZihrZXlzWzBdKSA8IDApIHsKICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGtleXNbMF0gKyAiIGlzIG5vdCBhIE1lZGlhU2lua0V4dHJhRGF0YSBtZW1iZXIuIik7CgogICAgfQoKICAgIHRoaXNba2V5c1swXV0gPSB2YWx1ZVtrZXlzWzBdXTsKICB9CiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1lZGlhU2lua0V4dHJhRGF0YS5wcm90b3R5cGUsICJkaWFsTWVkaWFTaW5rIiwgewogICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuJHRhZyAhPSBNZWRpYVNpbmtFeHRyYURhdGEuVGFncy5kaWFsTWVkaWFTaW5rKSB7CiAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKAogICAgICAgICAgICAiTWVkaWFTaW5rRXh0cmFEYXRhLmRpYWxNZWRpYVNpbmsgaXMgbm90IGN1cnJlbnRseSBzZXQuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXMuJGRhdGE7CiAgICB9LAoKICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgdGhpcy4kdGFnID0gTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuZGlhbE1lZGlhU2luazsKICAgICAgdGhpcy4kZGF0YSA9IHZhbHVlOwogICAgfQogIH0pOwogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZWRpYVNpbmtFeHRyYURhdGEucHJvdG90eXBlLCAiY2FzdE1lZGlhU2luayIsIHsKICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLiR0YWcgIT0gTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuY2FzdE1lZGlhU2luaykgewogICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigKICAgICAgICAgICAgIk1lZGlhU2lua0V4dHJhRGF0YS5jYXN0TWVkaWFTaW5rIGlzIG5vdCBjdXJyZW50bHkgc2V0LiIpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLiRkYXRhOwogICAgfSwKCiAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHRoaXMuJHRhZyA9IE1lZGlhU2lua0V4dHJhRGF0YS5UYWdzLmNhc3RNZWRpYVNpbms7CiAgICAgIHRoaXMuJGRhdGEgPSB2YWx1ZTsKICAgIH0KICB9KTsKCgogICAgTWVkaWFTaW5rRXh0cmFEYXRhLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgICBpZiAodmFsID09IG51bGwpIHsKICAgICAgICBlbmNvZGVyLndyaXRlVWludDY0KDApOwogICAgICAgIGVuY29kZXIud3JpdGVVaW50NjQoMCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh2YWwuJHRhZyA9PSB1bmRlZmluZWQpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgZW5jb2RlIHVuaW9ucyB3aXRoIGFuIHVua25vd24gbWVtYmVyIHNldC4iKTsKICAgICAgfQoKICAgICAgZW5jb2Rlci53cml0ZVVpbnQzMigxNik7CiAgICAgIGVuY29kZXIud3JpdGVVaW50MzIodmFsLiR0YWcpOwogICAgICBzd2l0Y2ggKHZhbC4kdGFnKSB7CiAgICAgICAgY2FzZSBNZWRpYVNpbmtFeHRyYURhdGEuVGFncy5kaWFsTWVkaWFTaW5rOgogICAgICAgICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKERpYWxNZWRpYVNpbmssIHZhbC5kaWFsTWVkaWFTaW5rKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuY2FzdE1lZGlhU2luazoKICAgICAgICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihDYXN0TWVkaWFTaW5rLCB2YWwuY2FzdE1lZGlhU2luayk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBlbmNvZGVyLmFsaWduKCk7CiAgICB9OwoKCiAgICBNZWRpYVNpbmtFeHRyYURhdGEuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgICB2YXIgc2l6ZSA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgICBpZiAoc2l6ZSA9PSAwKSB7CiAgICAgICAgZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICAgICAgZGVjb2Rlci5yZWFkVWludDY0KCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHZhciByZXN1bHQgPSBuZXcgTWVkaWFTaW5rRXh0cmFEYXRhKCk7CiAgICAgIHZhciB0YWcgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgICAgc3dpdGNoICh0YWcpIHsKICAgICAgICBjYXNlIE1lZGlhU2lua0V4dHJhRGF0YS5UYWdzLmRpYWxNZWRpYVNpbms6CiAgICAgICAgICByZXN1bHQuZGlhbE1lZGlhU2luayA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihEaWFsTWVkaWFTaW5rKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuY2FzdE1lZGlhU2luazoKICAgICAgICAgIHJlc3VsdC5jYXN0TWVkaWFTaW5rID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKENhc3RNZWRpYVNpbmspOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGVjb2Rlci5hbGlnbigpOwoKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgoKICAgIE1lZGlhU2lua0V4dHJhRGF0YS52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgICB2YXIgc2l6ZSA9IG1lc3NhZ2VWYWxpZGF0b3IuZGVjb2RlVW5pb25TaXplKG9mZnNldCk7CiAgICAgIGlmIChzaXplICE9IDE2KSB7CiAgICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuSU5WQUxJRF9VTklPTl9TSVpFOwogICAgICB9CgogICAgICB2YXIgdGFnID0gbWVzc2FnZVZhbGlkYXRvci5kZWNvZGVVbmlvblRhZyhvZmZzZXQpOwogICAgICB2YXIgZGF0YV9vZmZzZXQgPSBvZmZzZXQgKyA4OwogICAgICB2YXIgZXJyOwogICAgICBzd2l0Y2ggKHRhZykgewogICAgICAgIGNhc2UgTWVkaWFTaW5rRXh0cmFEYXRhLlRhZ3MuZGlhbE1lZGlhU2luazoKICAgICAgICAgIAoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU2lua0V4dHJhRGF0YS5kaWFsTWVkaWFTaW5rCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihkYXRhX29mZnNldCwgRGlhbE1lZGlhU2luaywgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1lZGlhU2lua0V4dHJhRGF0YS5UYWdzLmNhc3RNZWRpYVNpbms6CiAgICAgICAgICAKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVNpbmtFeHRyYURhdGEuY2FzdE1lZGlhU2luawogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIoZGF0YV9vZmZzZXQsIENhc3RNZWRpYVNpbmssIGZhbHNlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICB9OwoKICBNZWRpYVNpbmtFeHRyYURhdGEuZW5jb2RlZFNpemUgPSAxNjsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9OYW1lID0gMTQ1NDA4Njc3OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9OYW1lID0gNTgzNjA4NDQ3OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9OYW1lID0gNDA2NzE4NzkyOwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX05hbWUgPSAyMDI5MTcwMjIyOwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfTmFtZSA9IDEwNTQxODI1OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfTmFtZSA9IDc0NzcxNjExNjsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfTmFtZSA9IDIwNDEzMDM5MjU7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfTmFtZSA9IDMzNDE2MzI3NTsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX05hbWUgPSAxMTcwMDI4OTE3OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19OYW1lID0gNDE1MjY5NzM4OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19OYW1lID0gMTQzODE2NTU2NjsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19OYW1lID0gMTk5NjgxMzExMTsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9OYW1lID0gNzQzMDIzMTY5OwogIHZhciBrTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfTmFtZSA9IDE3ODk2NDY4MTQ7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19OYW1lID0gMTU4Mjc3ODI1MDsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19OYW1lID0gMTE0OTUwMTI4MTsKICB2YXIga01lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfTmFtZSA9IDIxMTg1NDczMzc7CiAgdmFyIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfTmFtZSA9IDExNTA2MDY1MTI7CgogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlclB0cihoYW5kbGVPclB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGJpbmRpbmdzLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoTWVkaWFSb3V0ZVByb3ZpZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPclB0ckluZm8pOwogIH0KCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyQXNzb2NpYXRlZFB0cihhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYXNzb2NpYXRlZEJpbmRpbmdzLkFzc29jaWF0ZWRJbnRlcmZhY2VQdHJDb250cm9sbGVyKAogICAgICAgIE1lZGlhUm91dGVQcm92aWRlciwgYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pOwogIH0KCiAgTWVkaWFSb3V0ZVByb3ZpZGVyQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUgPQogICAgICBPYmplY3QuY3JlYXRlKE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUpOwogIE1lZGlhUm91dGVQcm92aWRlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyQXNzb2NpYXRlZFB0cjsKCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkocmVjZWl2ZXIpIHsKICAgIHRoaXMucmVjZWl2ZXJfID0gcmVjZWl2ZXI7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuY3JlYXRlUm91dGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuY3JlYXRlUm91dGUKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuY3JlYXRlUm91dGUgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSwgc2lua0lkLCBvcmlnaW5hbFByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLCB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMoKTsKICAgIHBhcmFtc18ubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHBhcmFtc18uc2lua0lkID0gc2lua0lkOwogICAgcGFyYW1zXy5vcmlnaW5hbFByZXNlbnRhdGlvbklkID0gb3JpZ2luYWxQcmVzZW50YXRpb25JZDsKICAgIHBhcmFtc18ub3JpZ2luID0gb3JpZ2luOwogICAgcGFyYW1zXy50YWJJZCA9IHRhYklkOwogICAgcGFyYW1zXy50aW1lb3V0ID0gdGltZW91dDsKICAgIHBhcmFtc18uaW5jb2duaXRvID0gaW5jb2duaXRvOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9QYXJhbXMsIHBhcmFtc18pOwogICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdEFuZEV4cGVjdFJlc3BvbnNlKG1lc3NhZ2UpLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLmpvaW5Sb3V0ZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5qb2luUm91dGUKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuam9pblJvdXRlID0gZnVuY3Rpb24obWVkaWFTb3VyY2UsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLCB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zKCk7CiAgICBwYXJhbXNfLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICBwYXJhbXNfLnByZXNlbnRhdGlvbklkID0gcHJlc2VudGF0aW9uSWQ7CiAgICBwYXJhbXNfLm9yaWdpbiA9IG9yaWdpbjsKICAgIHBhcmFtc18udGFiSWQgPSB0YWJJZDsKICAgIHBhcmFtc18udGltZW91dCA9IHRpbWVvdXQ7CiAgICBwYXJhbXNfLmluY29nbml0byA9IGluY29nbml0bzsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX05hbWUsCiAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zLCBwYXJhbXNfKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuY29ubmVjdFJvdXRlQnlSb3V0ZUlkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLmNvbm5lY3RSb3V0ZUJ5Um91dGVJZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5jb25uZWN0Um91dGVCeVJvdXRlSWQgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSwgcm91dGVJZCwgcHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsIHRpbWVvdXQsIGluY29nbml0bykgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXMoKTsKICAgIHBhcmFtc18ubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHBhcmFtc18ucm91dGVJZCA9IHJvdXRlSWQ7CiAgICBwYXJhbXNfLnByZXNlbnRhdGlvbklkID0gcHJlc2VudGF0aW9uSWQ7CiAgICBwYXJhbXNfLm9yaWdpbiA9IG9yaWdpbjsKICAgIHBhcmFtc18udGFiSWQgPSB0YWJJZDsKICAgIHBhcmFtc18udGltZW91dCA9IHRpbWVvdXQ7CiAgICBwYXJhbXNfLmluY29nbml0byA9IGluY29nbml0bzsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX05hbWUsCiAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zLCBwYXJhbXNfKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zKTsKICAgICAgICByZXNvbHZlKHJlc3BvbnNlUGFyYW1zKTsKICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcmVqZWN0KEVycm9yKCJDb25uZWN0aW9uIGVycm9yOiAiICsgcmVzdWx0KSk7CiAgICAgIH0pOwogICAgfS5iaW5kKHRoaXMpKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUudGVybWluYXRlUm91dGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUudGVybWluYXRlUm91dGUKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUudGVybWluYXRlUm91dGUgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUGFyYW1zKCk7CiAgICBwYXJhbXNfLnJvdXRlSWQgPSByb3V0ZUlkOwogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMsIHBhcmFtc18pOwogICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdEFuZEV4cGVjdFJlc3BvbnNlKG1lc3NhZ2UpLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgewogICAgICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnNlbmRSb3V0ZU1lc3NhZ2UgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc2VuZFJvdXRlTWVzc2FnZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zZW5kUm91dGVNZXNzYWdlID0gZnVuY3Rpb24obWVkaWFSb3V0ZUlkLCBtZXNzYWdlKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9QYXJhbXMoKTsKICAgIHBhcmFtc18ubWVkaWFSb3V0ZUlkID0gbWVkaWFSb3V0ZUlkOwogICAgcGFyYW1zXy5tZXNzYWdlID0gbWVzc2FnZTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zLCBwYXJhbXNfKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnNlbmRSb3V0ZUJpbmFyeU1lc3NhZ2UgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc2VuZFJvdXRlQmluYXJ5TWVzc2FnZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zZW5kUm91dGVCaW5hcnlNZXNzYWdlID0gZnVuY3Rpb24obWVkaWFSb3V0ZUlkLCBkYXRhKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9QYXJhbXMoKTsKICAgIHBhcmFtc18ubWVkaWFSb3V0ZUlkID0gbWVkaWFSb3V0ZUlkOwogICAgcGFyYW1zXy5kYXRhID0gZGF0YTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgIGNvZGVjLmtNZXNzYWdlRXhwZWN0c1Jlc3BvbnNlLCAwKTsKICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUGFyYW1zLCBwYXJhbXNfKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnN0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhU2lua3MKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzID0gZnVuY3Rpb24obWVkaWFTb3VyY2UpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zKCk7CiAgICBwYXJhbXNfLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhU2lua3MgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhU2lua3MKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhU2lua3MgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcygpOwogICAgcGFyYW1zXy5tZWRpYVNvdXJjZSA9IG1lZGlhU291cmNlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcywgcGFyYW1zXyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzID0gZnVuY3Rpb24obWVkaWFTb3VyY2UpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcygpOwogICAgcGFyYW1zXy5tZWRpYVNvdXJjZSA9IG1lZGlhU291cmNlOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXNfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtcywgcGFyYW1zXyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLnN0b3BPYnNlcnZpbmdNZWRpYVJvdXRlcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhUm91dGVzID0gZnVuY3Rpb24obWVkaWFTb3VyY2UpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zKCk7CiAgICBwYXJhbXNfLm1lZGlhU291cmNlID0gbWVkaWFTb3VyY2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnN0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcygpOwogICAgcGFyYW1zXy5yb3V0ZUlkID0gcm91dGVJZDsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMsIHBhcmFtc18pOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5zdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyA9IGZ1bmN0aW9uKHJvdXRlSWQpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXMoKTsKICAgIHBhcmFtc18ucm91dGVJZCA9IHJvdXRlSWQ7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVQcm92aWRlclB0ci5wcm90b3R5cGUuZGV0YWNoUm91dGUgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuZGV0YWNoUm91dGUKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuZGV0YWNoUm91dGUgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zKCk7CiAgICBwYXJhbXNfLnJvdXRlSWQgPSByb3V0ZUlkOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX1BhcmFtcywgcGFyYW1zXyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKICBNZWRpYVJvdXRlUHJvdmlkZXJQdHIucHJvdG90eXBlLmVuYWJsZU1kbnNEaXNjb3ZlcnkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUuZW5hYmxlTWRuc0Rpc2NvdmVyeQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5lbmFibGVNZG5zRGlzY292ZXJ5ID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMoKTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9FbmFibGVNZG5zRGlzY292ZXJ5X05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMsIHBhcmFtc18pOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS51cGRhdGVNZWRpYVNpbmtzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnVwZGF0ZU1lZGlhU2lua3MKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUudXBkYXRlTWVkaWFTaW5rcyA9IGZ1bmN0aW9uKG1lZGlhU291cmNlKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMoKTsKICAgIHBhcmFtc18ubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1VwZGF0ZU1lZGlhU2lua3NfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMsIHBhcmFtc18pOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5zZWFyY2hTaW5rcyA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zZWFyY2hTaW5rcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5zZWFyY2hTaW5rcyA9IGZ1bmN0aW9uKHNpbmtJZCwgbWVkaWFTb3VyY2UsIHNlYXJjaENyaXRlcmlhKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zKCk7CiAgICBwYXJhbXNfLnNpbmtJZCA9IHNpbmtJZDsKICAgIHBhcmFtc18ubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHBhcmFtc18uc2VhcmNoQ3JpdGVyaWEgPSBzZWFyY2hDcml0ZXJpYTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfTmFtZSwKICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zLCBwYXJhbXNfKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2VQYXJhbXMpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZWplY3QoRXJyb3IoIkNvbm5lY3Rpb24gZXJyb3I6ICIgKyByZXN1bHQpKTsKICAgICAgfSk7CiAgICB9LmJpbmQodGhpcykpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5wcm92aWRlU2lua3MgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlUHJvdmlkZXJQcm94eS5wcm90b3R5cGUucHJvdmlkZVNpbmtzCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkucHJvdG90eXBlLnByb3ZpZGVTaW5rcyA9IGZ1bmN0aW9uKHByb3ZpZGVyTmFtZSwgc2lua3MpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zKCk7CiAgICBwYXJhbXNfLnByb3ZpZGVyTmFtZSA9IHByb3ZpZGVyTmFtZTsKICAgIHBhcmFtc18uc2lua3MgPSBzaW5rczsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19QYXJhbXMsIHBhcmFtc18pOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyUHRyLnByb3RvdHlwZS5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcgogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKHJvdXRlSWQsIG1lZGlhQ29udHJvbGxlciwgb2JzZXJ2ZXIpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMoKTsKICAgIHBhcmFtc18ucm91dGVJZCA9IHJvdXRlSWQ7CiAgICBwYXJhbXNfLm1lZGlhQ29udHJvbGxlciA9IG1lZGlhQ29udHJvbGxlcjsKICAgIHBhcmFtc18ub2JzZXJ2ZXIgPSBvYnNlcnZlcjsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfTmFtZSwKICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUGFyYW1zLCBwYXJhbXNfKTsKICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHRBbmRFeHBlY3RSZXNwb25zZShtZXNzYWdlKS50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2VQYXJhbXMpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZWplY3QoRXJyb3IoIkNvbm5lY3Rpb24gZXJyb3I6ICIgKyByZXN1bHQpKTsKICAgICAgfSk7CiAgICB9LmJpbmQodGhpcykpOwogIH07CgogIGZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlclN0dWIoZGVsZWdhdGUpIHsKICAgIHRoaXMuZGVsZWdhdGVfID0gZGVsZWdhdGU7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLmNyZWF0ZVJvdXRlID0gZnVuY3Rpb24obWVkaWFTb3VyY2UsIHNpbmtJZCwgb3JpZ2luYWxQcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwgaW5jb2duaXRvKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uY3JlYXRlUm91dGUgJiYgdGhpcy5kZWxlZ2F0ZV8uY3JlYXRlUm91dGUobWVkaWFTb3VyY2UsIHNpbmtJZCwgb3JpZ2luYWxQcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwgaW5jb2duaXRvKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuam9pblJvdXRlID0gZnVuY3Rpb24obWVkaWFTb3VyY2UsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLCB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5qb2luUm91dGUgJiYgdGhpcy5kZWxlZ2F0ZV8uam9pblJvdXRlKG1lZGlhU291cmNlLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwgaW5jb2duaXRvKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuY29ubmVjdFJvdXRlQnlSb3V0ZUlkID0gZnVuY3Rpb24obWVkaWFTb3VyY2UsIHJvdXRlSWQsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLCB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5jb25uZWN0Um91dGVCeVJvdXRlSWQgJiYgdGhpcy5kZWxlZ2F0ZV8uY29ubmVjdFJvdXRlQnlSb3V0ZUlkKG1lZGlhU291cmNlLCByb3V0ZUlkLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwgdGltZW91dCwgaW5jb2duaXRvKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUudGVybWluYXRlUm91dGUgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8udGVybWluYXRlUm91dGUgJiYgdGhpcy5kZWxlZ2F0ZV8udGVybWluYXRlUm91dGUocm91dGVJZCk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnNlbmRSb3V0ZU1lc3NhZ2UgPSBmdW5jdGlvbihtZWRpYVJvdXRlSWQsIG1lc3NhZ2UpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zZW5kUm91dGVNZXNzYWdlICYmIHRoaXMuZGVsZWdhdGVfLnNlbmRSb3V0ZU1lc3NhZ2UobWVkaWFSb3V0ZUlkLCBtZXNzYWdlKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuc2VuZFJvdXRlQmluYXJ5TWVzc2FnZSA9IGZ1bmN0aW9uKG1lZGlhUm91dGVJZCwgZGF0YSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnNlbmRSb3V0ZUJpbmFyeU1lc3NhZ2UgJiYgdGhpcy5kZWxlZ2F0ZV8uc2VuZFJvdXRlQmluYXJ5TWVzc2FnZShtZWRpYVJvdXRlSWQsIGRhdGEpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhU2lua3MgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rcyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydE9ic2VydmluZ01lZGlhU2lua3MobWVkaWFTb3VyY2UpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFTaW5rcyA9IGZ1bmN0aW9uKG1lZGlhU291cmNlKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcE9ic2VydmluZ01lZGlhU2lua3MgJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcE9ic2VydmluZ01lZGlhU2lua3MobWVkaWFTb3VyY2UpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzID0gZnVuY3Rpb24obWVkaWFTb3VyY2UpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMobWVkaWFTb3VyY2UpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnN0b3BPYnNlcnZpbmdNZWRpYVJvdXRlcyAmJiB0aGlzLmRlbGVnYXRlXy5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMobWVkaWFTb3VyY2UpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5zdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzICYmIHRoaXMuZGVsZWdhdGVfLnN0YXJ0TGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyhyb3V0ZUlkKTsKICB9CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgPSBmdW5jdGlvbihyb3V0ZUlkKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMgJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMocm91dGVJZCk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLmRldGFjaFJvdXRlID0gZnVuY3Rpb24ocm91dGVJZCkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLmRldGFjaFJvdXRlICYmIHRoaXMuZGVsZWdhdGVfLmRldGFjaFJvdXRlKHJvdXRlSWQpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5lbmFibGVNZG5zRGlzY292ZXJ5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uZW5hYmxlTWRuc0Rpc2NvdmVyeSAmJiB0aGlzLmRlbGVnYXRlXy5lbmFibGVNZG5zRGlzY292ZXJ5KCk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnVwZGF0ZU1lZGlhU2lua3MgPSBmdW5jdGlvbihtZWRpYVNvdXJjZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnVwZGF0ZU1lZGlhU2lua3MgJiYgdGhpcy5kZWxlZ2F0ZV8udXBkYXRlTWVkaWFTaW5rcyhtZWRpYVNvdXJjZSk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnNlYXJjaFNpbmtzID0gZnVuY3Rpb24oc2lua0lkLCBtZWRpYVNvdXJjZSwgc2VhcmNoQ3JpdGVyaWEpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5zZWFyY2hTaW5rcyAmJiB0aGlzLmRlbGVnYXRlXy5zZWFyY2hTaW5rcyhzaW5rSWQsIG1lZGlhU291cmNlLCBzZWFyY2hDcml0ZXJpYSk7CiAgfQogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLnByb3ZpZGVTaW5rcyA9IGZ1bmN0aW9uKHByb3ZpZGVyTmFtZSwgc2lua3MpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5wcm92aWRlU2lua3MgJiYgdGhpcy5kZWxlZ2F0ZV8ucHJvdmlkZVNpbmtzKHByb3ZpZGVyTmFtZSwgc2lua3MpOwogIH0KICBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLnByb3RvdHlwZS5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlciA9IGZ1bmN0aW9uKHJvdXRlSWQsIG1lZGlhQ29udHJvbGxlciwgb2JzZXJ2ZXIpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlciAmJiB0aGlzLmRlbGVnYXRlXy5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCBtZWRpYUNvbnRyb2xsZXIsIG9ic2VydmVyKTsKICB9CgogIE1lZGlhUm91dGVQcm92aWRlclN0dWIucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfUGFyYW1zKTsKICAgICAgdGhpcy5zdGFydE9ic2VydmluZ01lZGlhU2lua3MocGFyYW1zLm1lZGlhU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhU2lua3NfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1N0b3BPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtcyk7CiAgICAgIHRoaXMuc3RvcE9ic2VydmluZ01lZGlhU2lua3MocGFyYW1zLm1lZGlhU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19QYXJhbXMpOwogICAgICB0aGlzLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMocGFyYW1zLm1lZGlhU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfUGFyYW1zKTsKICAgICAgdGhpcy5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMocGFyYW1zLm1lZGlhU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zKTsKICAgICAgdGhpcy5zdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXMocGFyYW1zLnJvdXRlSWQpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfUGFyYW1zKTsKICAgICAgdGhpcy5zdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyhwYXJhbXMucm91dGVJZCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0RldGFjaFJvdXRlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9EZXRhY2hSb3V0ZV9QYXJhbXMpOwogICAgICB0aGlzLmRldGFjaFJvdXRlKHBhcmFtcy5yb3V0ZUlkKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXMpOwogICAgICB0aGlzLmVuYWJsZU1kbnNEaXNjb3ZlcnkoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19QYXJhbXMpOwogICAgICB0aGlzLnVwZGF0ZU1lZGlhU2lua3MocGFyYW1zLm1lZGlhU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfUHJvdmlkZVNpbmtzX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zKTsKICAgICAgdGhpcy5wcm92aWRlU2lua3MocGFyYW1zLnByb3ZpZGVyTmFtZSwgcGFyYW1zLnNpbmtzKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0V2l0aFJlc3BvbmRlciA9CiAgICAgIGZ1bmN0aW9uKG1lc3NhZ2UsIHJlc3BvbmRlcikgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zKTsKICAgICAgdGhpcy5jcmVhdGVSb3V0ZShwYXJhbXMubWVkaWFTb3VyY2UsIHBhcmFtcy5zaW5rSWQsIHBhcmFtcy5vcmlnaW5hbFByZXNlbnRhdGlvbklkLCBwYXJhbXMub3JpZ2luLCBwYXJhbXMudGFiSWQsIHBhcmFtcy50aW1lb3V0LCBwYXJhbXMuaW5jb2duaXRvKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnJvdXRlID0gcmVzcG9uc2Uucm91dGU7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuZXJyb3JUZXh0ID0gcmVzcG9uc2UuZXJyb3JUZXh0OwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnJlc3VsdENvZGUgPSByZXNwb25zZS5yZXN1bHRDb2RlOwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfTmFtZSwKICAgICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUGFyYW1zKTsKICAgICAgdGhpcy5qb2luUm91dGUocGFyYW1zLm1lZGlhU291cmNlLCBwYXJhbXMucHJlc2VudGF0aW9uSWQsIHBhcmFtcy5vcmlnaW4sIHBhcmFtcy50YWJJZCwgcGFyYW1zLnRpbWVvdXQsIHBhcmFtcy5pbmNvZ25pdG8pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnJvdXRlID0gcmVzcG9uc2Uucm91dGU7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuZXJyb3JUZXh0ID0gcmVzcG9uc2UuZXJyb3JUZXh0OwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnJlc3VsdENvZGUgPSByZXNwb25zZS5yZXN1bHRDb2RlOwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgICBjb2RlYy5rTWVzc2FnZUlzUmVzcG9uc2UsIHJlYWRlci5yZXF1ZXN0SUQpOwogICAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Kb2luUm91dGVfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUGFyYW1zKTsKICAgICAgdGhpcy5jb25uZWN0Um91dGVCeVJvdXRlSWQocGFyYW1zLm1lZGlhU291cmNlLCBwYXJhbXMucm91dGVJZCwgcGFyYW1zLnByZXNlbnRhdGlvbklkLCBwYXJhbXMub3JpZ2luLCBwYXJhbXMudGFiSWQsIHBhcmFtcy50aW1lb3V0LCBwYXJhbXMuaW5jb2duaXRvKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5yb3V0ZSA9IHJlc3BvbnNlLnJvdXRlOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLmVycm9yVGV4dCA9IHJlc3BvbnNlLmVycm9yVGV4dDsKICAgICAgICByZXNwb25zZVBhcmFtcy5yZXN1bHRDb2RlID0gcmVzcG9uc2UucmVzdWx0Q29kZTsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfQ29ubmVjdFJvdXRlQnlSb3V0ZUlkX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9QYXJhbXMpOwogICAgICB0aGlzLnRlcm1pbmF0ZVJvdXRlKHBhcmFtcy5yb3V0ZUlkKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLmVycm9yVGV4dCA9IHJlc3BvbnNlLmVycm9yVGV4dDsKICAgICAgICByZXNwb25zZVBhcmFtcy5yZXN1bHRDb2RlID0gcmVzcG9uc2UucmVzdWx0Q29kZTsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9UZXJtaW5hdGVSb3V0ZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZU1lc3NhZ2VfUGFyYW1zKTsKICAgICAgdGhpcy5zZW5kUm91dGVNZXNzYWdlKHBhcmFtcy5tZWRpYVJvdXRlSWQsIHBhcmFtcy5tZXNzYWdlKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuc2VudCA9IHJlc3BvbnNlLnNlbnQ7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgICAga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtcyk7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICAgIHJlc3BvbmRlci5hY2NlcHQobWVzc2FnZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtcyk7CiAgICAgIHRoaXMuc2VuZFJvdXRlQmluYXJ5TWVzc2FnZShwYXJhbXMubWVkaWFSb3V0ZUlkLCBwYXJhbXMuZGF0YSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnNlbnQgPSByZXNwb25zZS5zZW50OwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlQmluYXJ5TWVzc2FnZV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1BhcmFtcyk7CiAgICAgIHRoaXMuc2VhcmNoU2lua3MocGFyYW1zLnNpbmtJZCwgcGFyYW1zLm1lZGlhU291cmNlLCBwYXJhbXMuc2VhcmNoQ3JpdGVyaWEpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zKCk7CiAgICAgICAgcmVzcG9uc2VQYXJhbXMuc2lua0lkID0gcmVzcG9uc2Uuc2lua0lkOwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfTmFtZSwKICAgICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZVByb3ZpZGVyX1NlYXJjaFNpbmtzX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1BhcmFtcyk7CiAgICAgIHRoaXMuY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXIocGFyYW1zLnJvdXRlSWQsIHBhcmFtcy5tZWRpYUNvbnRyb2xsZXIsIHBhcmFtcy5vYnNlcnZlcikudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5zdWNjZXNzID0gcmVzcG9uc2Uuc3VjY2VzczsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIGZ1bmN0aW9uIHZhbGlkYXRlTWVkaWFSb3V0ZVByb3ZpZGVyUmVxdWVzdChtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgIHZhciBwYXJhbXNDbGFzcyA9IG51bGw7CiAgICBzd2l0Y2ggKG1lc3NhZ2UuZ2V0TmFtZSgpKSB7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfSm9pblJvdXRlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9Db25uZWN0Um91dGVCeVJvdXRlSWRfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhU2lua3NfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFTaW5rc19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlc19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TdGFydE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXNfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RvcE9ic2VydmluZ01lZGlhUm91dGVzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdGFydExpc3RlbmluZ0ZvclJvdXRlTWVzc2FnZXNfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlc19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfRGV0YWNoUm91dGVfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0VuYWJsZU1kbnNEaXNjb3ZlcnlfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfRW5hYmxlTWRuc0Rpc2NvdmVyeV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfVXBkYXRlTWVkaWFTaW5rc19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9VcGRhdGVNZWRpYVNpbmtzX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Byb3ZpZGVTaW5rc19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9Qcm92aWRlU2lua3NfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcl9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHBhcmFtc0NsYXNzID09PSBudWxsKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogICAgcmV0dXJuIHBhcmFtc0NsYXNzLnZhbGlkYXRlKG1lc3NhZ2VWYWxpZGF0b3IsIG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZS5nZXRIZWFkZXJOdW1CeXRlcygpKTsKICB9CgogIGZ1bmN0aW9uIHZhbGlkYXRlTWVkaWFSb3V0ZVByb3ZpZGVyUmVzcG9uc2UobWVzc2FnZVZhbGlkYXRvcikgewogICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlUm91dGVfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9DcmVhdGVSb3V0ZV9SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0pvaW5Sb3V0ZV9SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZVByb3ZpZGVyX0Nvbm5lY3RSb3V0ZUJ5Um91dGVJZF9SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1Rlcm1pbmF0ZVJvdXRlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfVGVybWluYXRlUm91dGVfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVNZXNzYWdlX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfU2VuZFJvdXRlTWVzc2FnZV9SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX1NlbmRSb3V0ZUJpbmFyeU1lc3NhZ2VfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TZW5kUm91dGVCaW5hcnlNZXNzYWdlX1Jlc3BvbnNlUGFyYW1zOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlUHJvdmlkZXJfU2VhcmNoU2lua3NfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVQcm92aWRlcl9TZWFyY2hTaW5rc19SZXNwb25zZVBhcmFtczsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZVByb3ZpZGVyX0NyZWF0ZU1lZGlhUm91dGVDb250cm9sbGVyX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlUHJvdmlkZXJfQ3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXJfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgdmFyIE1lZGlhUm91dGVQcm92aWRlciA9IHsKICAgIG5hbWU6ICdtZWRpYV9yb3V0ZXIubW9qb20uTWVkaWFSb3V0ZVByb3ZpZGVyJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IE1lZGlhUm91dGVQcm92aWRlclB0ciwKICAgIHByb3h5Q2xhc3M6IE1lZGlhUm91dGVQcm92aWRlclByb3h5LAogICAgc3R1YkNsYXNzOiBNZWRpYVJvdXRlUHJvdmlkZXJTdHViLAogICAgdmFsaWRhdGVSZXF1ZXN0OiB2YWxpZGF0ZU1lZGlhUm91dGVQcm92aWRlclJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiB2YWxpZGF0ZU1lZGlhUm91dGVQcm92aWRlclJlc3BvbnNlLAogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyLklkID0ge307CiAgTWVkaWFSb3V0ZVByb3ZpZGVyLklkLkVYVEVOU0lPTiA9IDA7CiAgTWVkaWFSb3V0ZVByb3ZpZGVyLklkLldJUkVEX0RJU1BMQVkgPSBNZWRpYVJvdXRlUHJvdmlkZXIuSWQuRVhURU5TSU9OICsgMTsKICBNZWRpYVJvdXRlUHJvdmlkZXIuSWQuQ0FTVCA9IE1lZGlhUm91dGVQcm92aWRlci5JZC5XSVJFRF9ESVNQTEFZICsgMTsKICBNZWRpYVJvdXRlUHJvdmlkZXIuSWQuRElBTCA9IE1lZGlhUm91dGVQcm92aWRlci5JZC5DQVNUICsgMTsKCiAgTWVkaWFSb3V0ZVByb3ZpZGVyLklkLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgY2FzZSAzOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBNZWRpYVJvdXRlUHJvdmlkZXIuSWQudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CiAgTWVkaWFSb3V0ZVByb3ZpZGVyU3R1Yi5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNZWRpYVJvdXRlUHJvdmlkZXJSZXF1ZXN0OwogIE1lZGlhUm91dGVQcm92aWRlclByb3h5LnByb3RvdHlwZS52YWxpZGF0b3IgPSB2YWxpZGF0ZU1lZGlhUm91dGVQcm92aWRlclJlc3BvbnNlOwogIHZhciBrTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfTmFtZSA9IDE1OTMwOTU5NTA7CiAgdmFyIGtNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfTmFtZSA9IDI4OTU1NDgyNjsKICB2YXIga01lZGlhUm91dGVyX09uSXNzdWVfTmFtZSA9IDg3MjI2NDUyNjsKICB2YXIga01lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9OYW1lID0gMTgwNjYyODk5MTsKICB2YXIga01lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfTmFtZSA9IDY0MjkwMjM4ODsKICB2YXIga01lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9OYW1lID0gMTkwMzE1NjE3ODsKICB2YXIga01lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9OYW1lID0gMjA1MTEyMDU1NTsKICB2YXIga01lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX05hbWUgPSAxNzM4MDI2NjY5OwogIHZhciBrTWVkaWFSb3V0ZXJfT25NZWRpYVJlbW90ZXJDcmVhdGVkX05hbWUgPSAxMTk1MDYwNjY0OwogIHZhciBrTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19OYW1lID0gMTE1Njk5MjQ3NDsKCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJQdHIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VQdHJDb250cm9sbGVyKE1lZGlhUm91dGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPclB0ckluZm8pOwogIH0KCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJBc3NvY2lhdGVkUHRyKGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBhc3NvY2lhdGVkQmluZGluZ3MuQXNzb2NpYXRlZEludGVyZmFjZVB0ckNvbnRyb2xsZXIoCiAgICAgICAgTWVkaWFSb3V0ZXIsIGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKTsKICB9CgogIE1lZGlhUm91dGVyQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUgPQogICAgICBPYmplY3QuY3JlYXRlKE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZSk7CiAgTWVkaWFSb3V0ZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICAgIE1lZGlhUm91dGVyQXNzb2NpYXRlZFB0cjsKCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJQcm94eShyZWNlaXZlcikgewogICAgdGhpcy5yZWNlaXZlcl8gPSByZWNlaXZlcjsKICB9CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUucmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXIKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5yZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlciA9IGZ1bmN0aW9uKHByb3ZpZGVySWQsIG1lZGlhUm91dGVyUHJvdmlkZXIpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcygpOwogICAgcGFyYW1zXy5wcm92aWRlcklkID0gcHJvdmlkZXJJZDsKICAgIHBhcmFtc18ubWVkaWFSb3V0ZXJQcm92aWRlciA9IG1lZGlhUm91dGVyUHJvdmlkZXI7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfTmFtZSwKICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICBjb2RlYy5rTWVzc2FnZUV4cGVjdHNSZXNwb25zZSwgMCk7CiAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtcywgcGFyYW1zXyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHJlc29sdmUocmVzcG9uc2VQYXJhbXMpOwogICAgICB9KS5jYXRjaChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICByZWplY3QoRXJyb3IoIkNvbm5lY3Rpb24gZXJyb3I6ICIgKyByZXN1bHQpKTsKICAgICAgfSk7CiAgICB9LmJpbmQodGhpcykpOwogIH07CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLm9uU2lua3NSZWNlaXZlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uU2lua3NSZWNlaXZlZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uU2lua3NSZWNlaXZlZCA9IGZ1bmN0aW9uKHByb3ZpZGVySWQsIG1lZGlhU291cmNlLCBzaW5rcywgb3JpZ2lucykgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcygpOwogICAgcGFyYW1zXy5wcm92aWRlcklkID0gcHJvdmlkZXJJZDsKICAgIHBhcmFtc18ubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHBhcmFtc18uc2lua3MgPSBzaW5rczsKICAgIHBhcmFtc18ub3JpZ2lucyA9IG9yaWdpbnM7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZS5vbklzc3VlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25Jc3N1ZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uSXNzdWUgPSBmdW5jdGlvbihpc3N1ZSkgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMoKTsKICAgIHBhcmFtc18uaXNzdWUgPSBpc3N1ZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVyX09uSXNzdWVfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9Pbklzc3VlX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMsIHBhcmFtc18pOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLm9uUm91dGVzVXBkYXRlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uUm91dGVzVXBkYXRlZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uUm91dGVzVXBkYXRlZCA9IGZ1bmN0aW9uKHByb3ZpZGVySWQsIHJvdXRlcywgbWVkaWFTb3VyY2UsIGpvaW5hYmxlUm91dGVJZHMpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVyX09uUm91dGVzVXBkYXRlZF9QYXJhbXMoKTsKICAgIHBhcmFtc18ucHJvdmlkZXJJZCA9IHByb3ZpZGVySWQ7CiAgICBwYXJhbXNfLnJvdXRlcyA9IHJvdXRlczsKICAgIHBhcmFtc18ubWVkaWFTb3VyY2UgPSBtZWRpYVNvdXJjZTsKICAgIHBhcmFtc18uam9pbmFibGVSb3V0ZUlkcyA9IGpvaW5hYmxlUm91dGVJZHM7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZS5vblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWQgPSBmdW5jdGlvbihwcm92aWRlcklkLCBhdmFpbGFiaWxpdHkpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zKCk7CiAgICBwYXJhbXNfLnByb3ZpZGVySWQgPSBwcm92aWRlcklkOwogICAgcGFyYW1zXy5hdmFpbGFiaWxpdHkgPSBhdmFpbGFiaWxpdHk7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZS5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPSBmdW5jdGlvbihyb3V0ZUlkLCBzdGF0ZSkgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcygpOwogICAgcGFyYW1zXy5yb3V0ZUlkID0gcm91dGVJZDsKICAgIHBhcmFtc18uc3RhdGUgPSBzdGF0ZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZF9QYXJhbXMsIHBhcmFtc18pOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCA9IGZ1bmN0aW9uKHJvdXRlSWQsIHJlYXNvbiwgbWVzc2FnZSkgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VkX1BhcmFtcygpOwogICAgcGFyYW1zXy5yb3V0ZUlkID0gcm91dGVJZDsKICAgIHBhcmFtc18ucmVhc29uID0gcmVhc29uOwogICAgcGFyYW1zXy5tZXNzYWdlID0gbWVzc2FnZTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXMsIHBhcmFtc18pOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWVkaWFSb3V0ZXJQdHIucHJvdG90eXBlLm9uUm91dGVNZXNzYWdlc1JlY2VpdmVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUub25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vblJvdXRlTWVzc2FnZXNSZWNlaXZlZCA9IGZ1bmN0aW9uKHJvdXRlSWQsIG1lc3NhZ2VzKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMoKTsKICAgIHBhcmFtc18ucm91dGVJZCA9IHJvdXRlSWQ7CiAgICBwYXJhbXNfLm1lc3NhZ2VzID0gbWVzc2FnZXM7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWRfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZS5vbk1lZGlhUmVtb3RlckNyZWF0ZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vbk1lZGlhUmVtb3RlckNyZWF0ZWQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNZWRpYVJvdXRlclByb3h5LnByb3RvdHlwZS5vbk1lZGlhUmVtb3RlckNyZWF0ZWQgPSBmdW5jdGlvbih0YWJJZCwgcmVtb3RlciwgcmVtb3RpbmdTb3VyY2UpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXMoKTsKICAgIHBhcmFtc18udGFiSWQgPSB0YWJJZDsKICAgIHBhcmFtc18ucmVtb3RlciA9IHJlbW90ZXI7CiAgICBwYXJhbXNfLnJlbW90aW5nU291cmNlID0gcmVtb3RpbmdTb3VyY2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1lZGlhUm91dGVyUHRyLnByb3RvdHlwZS5nZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUuZ2V0TWVkaWFTaW5rU2VydmljZVN0YXR1cwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1lZGlhUm91dGVyUHJveHkucHJvdG90eXBlLmdldE1lZGlhU2lua1NlcnZpY2VTdGF0dXMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfUGFyYW1zKCk7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX1BhcmFtcywgcGFyYW1zXyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKCiAgZnVuY3Rpb24gTWVkaWFSb3V0ZXJTdHViKGRlbGVnYXRlKSB7CiAgICB0aGlzLmRlbGVnYXRlXyA9IGRlbGVnYXRlOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyID0gZnVuY3Rpb24ocHJvdmlkZXJJZCwgbWVkaWFSb3V0ZXJQcm92aWRlcikgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyICYmIHRoaXMuZGVsZWdhdGVfLnJlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyKHByb3ZpZGVySWQsIG1lZGlhUm91dGVyUHJvdmlkZXIpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uU2lua3NSZWNlaXZlZCA9IGZ1bmN0aW9uKHByb3ZpZGVySWQsIG1lZGlhU291cmNlLCBzaW5rcywgb3JpZ2lucykgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uU2lua3NSZWNlaXZlZCAmJiB0aGlzLmRlbGVnYXRlXy5vblNpbmtzUmVjZWl2ZWQocHJvdmlkZXJJZCwgbWVkaWFTb3VyY2UsIHNpbmtzLCBvcmlnaW5zKTsKICB9CiAgTWVkaWFSb3V0ZXJTdHViLnByb3RvdHlwZS5vbklzc3VlID0gZnVuY3Rpb24oaXNzdWUpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vbklzc3VlICYmIHRoaXMuZGVsZWdhdGVfLm9uSXNzdWUoaXNzdWUpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uUm91dGVzVXBkYXRlZCA9IGZ1bmN0aW9uKHByb3ZpZGVySWQsIHJvdXRlcywgbWVkaWFTb3VyY2UsIGpvaW5hYmxlUm91dGVJZHMpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vblJvdXRlc1VwZGF0ZWQgJiYgdGhpcy5kZWxlZ2F0ZV8ub25Sb3V0ZXNVcGRhdGVkKHByb3ZpZGVySWQsIHJvdXRlcywgbWVkaWFTb3VyY2UsIGpvaW5hYmxlUm91dGVJZHMpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWQgPSBmdW5jdGlvbihwcm92aWRlcklkLCBhdmFpbGFiaWxpdHkpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkICYmIHRoaXMuZGVsZWdhdGVfLm9uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWQocHJvdmlkZXJJZCwgYXZhaWxhYmlsaXR5KTsKICB9CiAgTWVkaWFSb3V0ZXJTdHViLnByb3RvdHlwZS5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQgPSBmdW5jdGlvbihyb3V0ZUlkLCBzdGF0ZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlQ2hhbmdlZCAmJiB0aGlzLmRlbGVnYXRlXy5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQocm91dGVJZCwgc3RhdGUpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCA9IGZ1bmN0aW9uKHJvdXRlSWQsIHJlYXNvbiwgbWVzc2FnZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCAmJiB0aGlzLmRlbGVnYXRlXy5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWQocm91dGVJZCwgcmVhc29uLCBtZXNzYWdlKTsKICB9CiAgTWVkaWFSb3V0ZXJTdHViLnByb3RvdHlwZS5vblJvdXRlTWVzc2FnZXNSZWNlaXZlZCA9IGZ1bmN0aW9uKHJvdXRlSWQsIG1lc3NhZ2VzKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWQgJiYgdGhpcy5kZWxlZ2F0ZV8ub25Sb3V0ZU1lc3NhZ2VzUmVjZWl2ZWQocm91dGVJZCwgbWVzc2FnZXMpOwogIH0KICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCA9IGZ1bmN0aW9uKHRhYklkLCByZW1vdGVyLCByZW1vdGluZ1NvdXJjZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCAmJiB0aGlzLmRlbGVnYXRlXy5vbk1lZGlhUmVtb3RlckNyZWF0ZWQodGFiSWQsIHJlbW90ZXIsIHJlbW90aW5nU291cmNlKTsKICB9CiAgTWVkaWFSb3V0ZXJTdHViLnByb3RvdHlwZS5nZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uZ2V0TWVkaWFTaW5rU2VydmljZVN0YXR1cyAmJiB0aGlzLmRlbGVnYXRlXy5nZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzKCk7CiAgfQoKICBNZWRpYVJvdXRlclN0dWIucHJvdG90eXBlLmFjY2VwdCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblNpbmtzUmVjZWl2ZWRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25TaW5rc1JlY2VpdmVkX1BhcmFtcyk7CiAgICAgIHRoaXMub25TaW5rc1JlY2VpdmVkKHBhcmFtcy5wcm92aWRlcklkLCBwYXJhbXMubWVkaWFTb3VyY2UsIHBhcmFtcy5zaW5rcywgcGFyYW1zLm9yaWdpbnMpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVyX09uSXNzdWVfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXMpOwogICAgICB0aGlzLm9uSXNzdWUocGFyYW1zLmlzc3VlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25Sb3V0ZXNVcGRhdGVkX1BhcmFtcyk7CiAgICAgIHRoaXMub25Sb3V0ZXNVcGRhdGVkKHBhcmFtcy5wcm92aWRlcklkLCBwYXJhbXMucm91dGVzLCBwYXJhbXMubWVkaWFTb3VyY2UsIHBhcmFtcy5qb2luYWJsZVJvdXRlSWRzKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zKTsKICAgICAgdGhpcy5vblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkKHBhcmFtcy5wcm92aWRlcklkLCBwYXJhbXMuYXZhaWxhYmlsaXR5KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtcyk7CiAgICAgIHRoaXMub25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkKHBhcmFtcy5yb3V0ZUlkLCBwYXJhbXMuc3RhdGUpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWRfUGFyYW1zKTsKICAgICAgdGhpcy5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZWQocGFyYW1zLnJvdXRlSWQsIHBhcmFtcy5yZWFzb24sIHBhcmFtcy5tZXNzYWdlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9QYXJhbXMpOwogICAgICB0aGlzLm9uUm91dGVNZXNzYWdlc1JlY2VpdmVkKHBhcmFtcy5yb3V0ZUlkLCBwYXJhbXMubWVzc2FnZXMpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNZWRpYVJvdXRlcl9Pbk1lZGlhUmVtb3RlckNyZWF0ZWRfUGFyYW1zKTsKICAgICAgdGhpcy5vbk1lZGlhUmVtb3RlckNyZWF0ZWQocGFyYW1zLnRhYklkLCBwYXJhbXMucmVtb3RlciwgcGFyYW1zLnJlbW90aW5nU291cmNlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgTWVkaWFSb3V0ZXJTdHViLnByb3RvdHlwZS5hY2NlcHRXaXRoUmVzcG9uZGVyID0KICAgICAgZnVuY3Rpb24obWVzc2FnZSwgcmVzcG9uZGVyKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgY2FzZSBrTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUGFyYW1zKTsKICAgICAgdGhpcy5yZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcihwYXJhbXMucHJvdmlkZXJJZCwgcGFyYW1zLm1lZGlhUm91dGVyUHJvdmlkZXIpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5pbnN0YW5jZUlkID0gcmVzcG9uc2UuaW5zdGFuY2VJZDsKICAgICAgICByZXNwb25zZVBhcmFtcy5jb25maWcgPSByZXNwb25zZS5jb25maWc7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgICAga01lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9SZXNwb25zZVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtcyk7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICAgIHJlc3BvbmRlci5hY2NlcHQobWVzc2FnZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19QYXJhbXMpOwogICAgICB0aGlzLmdldE1lZGlhU2lua1NlcnZpY2VTdGF0dXMoKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7CiAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYxQnVpbGRlcigKICAgICAgICAgICAga01lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfTmFtZSwKICAgICAgICAgICAgY29kZWMuYWxpZ24oTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSksCiAgICAgICAgICAgIGNvZGVjLmtNZXNzYWdlSXNSZXNwb25zZSwgcmVhZGVyLnJlcXVlc3RJRCk7CiAgICAgICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWVkaWFSb3V0ZXJfR2V0TWVkaWFTaW5rU2VydmljZVN0YXR1c19SZXNwb25zZVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtcyk7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgICAgIHJlc3BvbmRlci5hY2NlcHQobWVzc2FnZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiB2YWxpZGF0ZU1lZGlhUm91dGVyUmVxdWVzdChtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgIHZhciBwYXJhbXNDbGFzcyA9IG51bGw7CiAgICBzd2l0Y2ggKG1lc3NhZ2UuZ2V0TmFtZSgpKSB7CiAgICAgIGNhc2Uga01lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX1JlZ2lzdGVyTWVkaWFSb3V0ZVByb3ZpZGVyX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX09uU2lua3NSZWNlaXZlZF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9Pbklzc3VlX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfT25Jc3N1ZV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNZWRpYVJvdXRlcl9PblJvdXRlc1VwZGF0ZWRfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25TaW5rQXZhaWxhYmlsaXR5VXBkYXRlZF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX09uU2lua0F2YWlsYWJpbGl0eVVwZGF0ZWRfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfT25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX09uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9PblJvdXRlTWVzc2FnZXNSZWNlaXZlZF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX09uUm91dGVNZXNzYWdlc1JlY2VpdmVkX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX09uTWVkaWFSZW1vdGVyQ3JlYXRlZF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9HZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzX05hbWU6CiAgICAgICAgaWYgKG1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfUGFyYW1zOwogICAgICBicmVhazsKICAgIH0KICAgIGlmIChwYXJhbXNDbGFzcyA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIHJldHVybiBwYXJhbXNDbGFzcy52YWxpZGF0ZShtZXNzYWdlVmFsaWRhdG9yLCBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2UuZ2V0SGVhZGVyTnVtQnl0ZXMoKSk7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZU1lZGlhUm91dGVyUmVzcG9uc2UobWVzc2FnZVZhbGlkYXRvcikgewogICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZTsKICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtNZWRpYVJvdXRlcl9SZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcl9OYW1lOgogICAgICAgIGlmIChtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWVkaWFSb3V0ZXJfUmVnaXN0ZXJNZWRpYVJvdXRlUHJvdmlkZXJfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhUm91dGVyX0dldE1lZGlhU2lua1NlcnZpY2VTdGF0dXNfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgdmFyIE1lZGlhUm91dGVyID0gewogICAgbmFtZTogJ21lZGlhX3JvdXRlci5tb2pvbS5NZWRpYVJvdXRlcicsCiAgICBrVmVyc2lvbjogMCwKICAgIHB0ckNsYXNzOiBNZWRpYVJvdXRlclB0ciwKICAgIHByb3h5Q2xhc3M6IE1lZGlhUm91dGVyUHJveHksCiAgICBzdHViQ2xhc3M6IE1lZGlhUm91dGVyU3R1YiwKICAgIHZhbGlkYXRlUmVxdWVzdDogdmFsaWRhdGVNZWRpYVJvdXRlclJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiB2YWxpZGF0ZU1lZGlhUm91dGVyUmVzcG9uc2UsCiAgfTsKICBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5ID0ge307CiAgTWVkaWFSb3V0ZXIuU2lua0F2YWlsYWJpbGl0eS5VTkFWQUlMQUJMRSA9IDA7CiAgTWVkaWFSb3V0ZXIuU2lua0F2YWlsYWJpbGl0eS5QRVJfU09VUkNFID0gTWVkaWFSb3V0ZXIuU2lua0F2YWlsYWJpbGl0eS5VTkFWQUlMQUJMRSArIDE7CiAgTWVkaWFSb3V0ZXIuU2lua0F2YWlsYWJpbGl0eS5BVkFJTEFCTEUgPSBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5LlBFUl9TT1VSQ0UgKyAxOwoKICBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5LmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBNZWRpYVJvdXRlci5TaW5rQXZhaWxhYmlsaXR5LnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZSA9IHt9OwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DT05ORUNUSU5HID0gMDsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuQ09OTkVDVEVEID0gTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlLkNPTk5FQ1RJTkcgKyAxOwogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DTE9TRUQgPSBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuQ09OTkVDVEVEICsgMTsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuVEVSTUlOQVRFRCA9IE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DTE9TRUQgKyAxOwoKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuaXNLbm93bkVudW1WYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICBjYXNlIDI6CiAgICBjYXNlIDM6CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH07CgogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24gPSB7fTsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24uQ09OTkVDVElPTl9FUlJPUiA9IDA7CiAgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLkNMT1NFRCA9IE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbi5DT05ORUNUSU9OX0VSUk9SICsgMTsKICBNZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24uV0VOVF9BV0FZID0gTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLkNMT1NFRCArIDE7CgogIE1lZGlhUm91dGVyLlByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbi5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIE1lZGlhUm91dGVyU3R1Yi5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNZWRpYVJvdXRlclJlcXVlc3Q7CiAgTWVkaWFSb3V0ZXJQcm94eS5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNZWRpYVJvdXRlclJlc3BvbnNlOwogIGV4cG9ydHMuU2lua0ljb25UeXBlID0gU2lua0ljb25UeXBlOwogIGV4cG9ydHMuUm91dGVDb250cm9sbGVyVHlwZSA9IFJvdXRlQ29udHJvbGxlclR5cGU7CiAgZXhwb3J0cy5Sb3V0ZVJlcXVlc3RSZXN1bHRDb2RlID0gUm91dGVSZXF1ZXN0UmVzdWx0Q29kZTsKICBleHBvcnRzLk1lZGlhU2luayA9IE1lZGlhU2luazsKICBleHBvcnRzLkRpYWxNZWRpYVNpbmsgPSBEaWFsTWVkaWFTaW5rOwogIGV4cG9ydHMuQ2FzdE1lZGlhU2luayA9IENhc3RNZWRpYVNpbms7CiAgZXhwb3J0cy5NZWRpYVJvdXRlID0gTWVkaWFSb3V0ZTsKICBleHBvcnRzLklzc3VlID0gSXNzdWU7CiAgZXhwb3J0cy5Sb3V0ZU1lc3NhZ2UgPSBSb3V0ZU1lc3NhZ2U7CiAgZXhwb3J0cy5TaW5rU2VhcmNoQ3JpdGVyaWEgPSBTaW5rU2VhcmNoQ3JpdGVyaWE7CiAgZXhwb3J0cy5NZWRpYVJvdXRlUHJvdmlkZXJDb25maWcgPSBNZWRpYVJvdXRlUHJvdmlkZXJDb25maWc7CiAgZXhwb3J0cy5NZWRpYVNpbmtFeHRyYURhdGEgPSBNZWRpYVNpbmtFeHRyYURhdGE7CiAgZXhwb3J0cy5NZWRpYVJvdXRlUHJvdmlkZXIgPSBNZWRpYVJvdXRlUHJvdmlkZXI7CiAgZXhwb3J0cy5NZWRpYVJvdXRlUHJvdmlkZXJQdHIgPSBNZWRpYVJvdXRlUHJvdmlkZXJQdHI7CiAgZXhwb3J0cy5NZWRpYVJvdXRlUHJvdmlkZXJBc3NvY2lhdGVkUHRyID0gTWVkaWFSb3V0ZVByb3ZpZGVyQXNzb2NpYXRlZFB0cjsKICBleHBvcnRzLk1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXI7CiAgZXhwb3J0cy5NZWRpYVJvdXRlclB0ciA9IE1lZGlhUm91dGVyUHRyOwogIGV4cG9ydHMuTWVkaWFSb3V0ZXJBc3NvY2lhdGVkUHRyID0gTWVkaWFSb3V0ZXJBc3NvY2lhdGVkUHRyOwp9KSgpOy8vIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgppZiAoKHR5cGVvZiBtb2pvID09PSAndW5kZWZpbmVkJykgfHwgIW1vam8uYmluZGluZ3NMaWJyYXJ5SW5pdGlhbGl6ZWQpIHsKICBsb2FkU2NyaXB0KCdtb2pvX2JpbmRpbmdzJyk7Cn0KbW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMgPSBmYWxzZTsKCmxvYWRTY3JpcHQoJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfY29udHJvbGxlci5tb2pvbScpOwpsb2FkU2NyaXB0KCdjaHJvbWUvY29tbW9uL21lZGlhX3JvdXRlci9tb2pvL21lZGlhX3JvdXRlci5tb2pvbScpOwpsb2FkU2NyaXB0KCdjaHJvbWUvY29tbW9uL21lZGlhX3JvdXRlci9tb2pvL21lZGlhX3N0YXR1cy5tb2pvbScpOwpsb2FkU2NyaXB0KCdleHRlbnNpb25zL2NvbW1vbi9tb2pvL2tlZXBfYWxpdmUubW9qb20nKTsKbG9hZFNjcmlwdCgnbWVkaWEvbW9qby9pbnRlcmZhY2VzL21pcnJvcl9zZXJ2aWNlX3JlbW90aW5nLm1vam9tJyk7CmxvYWRTY3JpcHQoJ21lZGlhL21vam8vaW50ZXJmYWNlcy9yZW1vdGluZ19jb21tb24ubW9qb20nKTsKbG9hZFNjcmlwdCgnbW9qby9wdWJsaWMvbW9qb20vYmFzZS90aW1lLm1vam9tJyk7CmxvYWRTY3JpcHQoJ25ldC9pbnRlcmZhY2VzL2lwX2FkZHJlc3MubW9qb20nKTsKbG9hZFNjcmlwdCgnbmV0L2ludGVyZmFjZXMvaXBfZW5kcG9pbnQubW9qb20nKTsKbG9hZFNjcmlwdCgndXJsL21vam9tL29yaWdpbi5tb2pvbScpOwpsb2FkU2NyaXB0KCd1cmwvbW9qb20vdXJsLm1vam9tJyk7CgovLyBUaGUgZm9sbG93aW5nIGFkYXB0ZXIgY2xhc3NlcyBwcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciB0aGUgbWVkaWEKLy8gcm91dGVyIGNvbXBvbmVudCBleHRlbnNpb24uCi8vIFRPRE8oY3JidWcuY29tLzc4NzEyOCk6IFJlbW92ZSB0aGVzZSBhZGFwdGVycy4KCmZ1bmN0aW9uIGFzc2lnbkZpZWxkcyhvYmplY3QsIGZpZWxkcykgewogIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgb2JqZWN0W2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgfQp9CgovKioKICogQWRhcHRlciBmb3IgbWVkaWFSb3V0ZXIubW9qb20uRGlhbE1lZGlhU2luay4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBEaWFsTWVkaWFTaW5rQWRhcHRlcihmaWVsZHMpIHsKICB0aGlzLmlwX2FkZHJlc3MgPSBudWxsOwogIHRoaXMubW9kZWxfbmFtZSA9IG51bGw7CiAgdGhpcy5hcHBfdXJsID0gbnVsbDsKCiAgYXNzaWduRmllbGRzKHRoaXMsIGZpZWxkcyk7Cn0KCkRpYWxNZWRpYVNpbmtBZGFwdGVyLmZyb21OZXdWZXJzaW9uID0gZnVuY3Rpb24ob3RoZXIpIHsKICByZXR1cm4gbmV3IERpYWxNZWRpYVNpbmtBZGFwdGVyKHsKICAgICdpcF9hZGRyZXNzJzogSVBBZGRyZXNzQWRhcHRlci5mcm9tTmV3VmVyc2lvbihvdGhlci5pcEFkZHJlc3MpLAogICAgJ21vZGVsX25hbWUnOiBvdGhlci5tb2RlbE5hbWUsCiAgICAnYXBwX3VybCc6IG90aGVyLmFwcFVybCwKICB9KTsKfTsKCkRpYWxNZWRpYVNpbmtBZGFwdGVyLnByb3RvdHlwZS50b05ld1ZlcnNpb24gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gbmV3IG1lZGlhUm91dGVyLm1vam9tLkRpYWxNZWRpYVNpbmsoewogICAgJ2lwQWRkcmVzcycgOiB0aGlzLmlwX2FkZHJlc3MudG9OZXdWZXJzaW9uKCksCiAgICAnbW9kZWxOYW1lJyA6IHRoaXMubW9kZWxfbmFtZSwKICAgICdhcHBVcmwnIDogdGhpcy5hcHBfdXJsLAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhUm91dGVyLm1vam9tLkNhc3RNZWRpYVNpbmsuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gQ2FzdE1lZGlhU2lua0FkYXB0ZXIoZmllbGRzKSB7CiAgdGhpcy5pcF9lbmRwb2ludCA9IG51bGw7CiAgdGhpcy5tb2RlbF9uYW1lID0gbnVsbDsKICB0aGlzLmNhcGFiaWxpdGllcyA9IDA7CiAgdGhpcy5jYXN0X2NoYW5uZWxfaWQgPSAwOwoKICBhc3NpZ25GaWVsZHModGhpcywgZmllbGRzKTsKfQoKQ2FzdE1lZGlhU2lua0FkYXB0ZXIuZnJvbU5ld1ZlcnNpb24gPSBmdW5jdGlvbihvdGhlcikgewogIHJldHVybiBuZXcgQ2FzdE1lZGlhU2lua0FkYXB0ZXIoewogICAgJ2lwX2VuZHBvaW50JzogSVBFbmRwb2ludEFkYXB0ZXIuZnJvbU5ld1ZlcnNpb24ob3RoZXIuaXBFbmRwb2ludCksCiAgICAnbW9kZWxfbmFtZSc6IG90aGVyLm1vZGVsTmFtZSwKICAgICdjYXBhYmlsaXRpZXMnOiBvdGhlci5jYXBhYmlsaXRpZXMsCiAgICAnY2FzdF9jaGFubmVsX2lkJzogb3RoZXIuY2FzdENoYW5uZWxJZCwKICB9KTsKfTsKCkNhc3RNZWRpYVNpbmtBZGFwdGVyLnByb3RvdHlwZS50b05ld1ZlcnNpb24gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gbmV3IG1lZGlhUm91dGVyLm1vam9tLkNhc3RNZWRpYVNpbmsoewogICAgJ2lwRW5kcG9pbnQnOiB0aGlzLmlwX2VuZHBvaW50LnRvTmV3VmVyc2lvbigpLAogICAgJ21vZGVsTmFtZSc6IHRoaXMubW9kZWxfbmFtZSwKICAgICdjYXBhYmlsaXRpZXMnOiB0aGlzLmNhcGFiaWxpdGllcywKICAgICdjYXN0Q2hhbm5lbElkJzogdGhpcy5jYXN0X2NoYW5uZWxfaWQsCiAgfSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWFSb3V0ZXIubW9qb20uSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YS4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhQWRhcHRlcihmaWVsZHMpIHsKICB0aGlzLmxvY2FsX3ByZXNlbnQgPSBmYWxzZTsKCiAgYXNzaWduRmllbGRzKHRoaXMsIGZpZWxkcyk7Cn0KCkhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGFBZGFwdGVyLnByb3RvdHlwZS50b05ld1ZlcnNpb24gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gbmV3IG1lZGlhUm91dGVyLm1vam9tLkhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEoewogICAgJ2xvY2FsUHJlc2VudCc6IHRoaXMubG9jYWxfcHJlc2VudCwKICB9KTsKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBuZXQuaW50ZXJmYWNlcy5JUEFkZHJlc3MuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gSVBBZGRyZXNzQWRhcHRlcihmaWVsZHMpIHsKICB0aGlzLmFkZHJlc3NfYnl0ZXMgPSBudWxsOwoKICBhc3NpZ25GaWVsZHModGhpcywgZmllbGRzKTsKfQoKSVBBZGRyZXNzQWRhcHRlci5mcm9tTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKG90aGVyKSB7CiAgcmV0dXJuIG5ldyBJUEFkZHJlc3NBZGFwdGVyKHsKICAgICdhZGRyZXNzX2J5dGVzJzogb3RoZXIuYWRkcmVzc0J5dGVzLAogIH0pOwp9OwoKSVBBZGRyZXNzQWRhcHRlci5wcm90b3R5cGUudG9OZXdWZXJzaW9uID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBuZXQuaW50ZXJmYWNlcy5JUEFkZHJlc3MoewogICAgJ2FkZHJlc3NCeXRlcyc6IHRoaXMuYWRkcmVzc19ieXRlcywKICB9KTsKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBuZXQuaW50ZXJmYWNlcy5JUEVuZHBvaW50LgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIElQRW5kcG9pbnRBZGFwdGVyKGZpZWxkcykgewogIHRoaXMuYWRkcmVzcyA9IG51bGw7CiAgdGhpcy5wb3J0ID0gMDsKCiAgYXNzaWduRmllbGRzKHRoaXMsIGZpZWxkcyk7Cn0KCklQRW5kcG9pbnRBZGFwdGVyLmZyb21OZXdWZXJzaW9uID0gZnVuY3Rpb24ob3RoZXIpIHsKICByZXR1cm4gbmV3IElQRW5kcG9pbnRBZGFwdGVyKHsKICAgICdhZGRyZXNzJzogSVBBZGRyZXNzQWRhcHRlci5mcm9tTmV3VmVyc2lvbihvdGhlci5hZGRyZXNzKSwKICAgICdwb3J0Jzogb3RoZXIucG9ydCwKICB9KTsKfTsKCklQRW5kcG9pbnRBZGFwdGVyLnByb3RvdHlwZS50b05ld1ZlcnNpb24gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gbmV3IG5ldC5pbnRlcmZhY2VzLklQRW5kcG9pbnQoewogICAgJ2FkZHJlc3MnOiB0aGlzLmFkZHJlc3MudG9OZXdWZXJzaW9uKCksCiAgICAncG9ydCc6IHRoaXMucG9ydCwKICB9KTsKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVN0YXR1cy4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNZWRpYVN0YXR1c0FkYXB0ZXIoZmllbGRzKSB7CiAgdGhpcy50aXRsZSA9IG51bGw7CiAgdGhpcy5jYW5fcGxheV9wYXVzZSA9IGZhbHNlOwogIHRoaXMuY2FuX211dGUgPSBmYWxzZTsKICB0aGlzLmNhbl9zZXRfdm9sdW1lID0gZmFsc2U7CiAgdGhpcy5jYW5fc2VlayA9IGZhbHNlOwogIHRoaXMuaXNfbXV0ZWQgPSBmYWxzZTsKICB0aGlzLnBsYXlfc3RhdGUgPSAwOwogIHRoaXMudm9sdW1lID0gMDsKICB0aGlzLmR1cmF0aW9uID0gbnVsbDsKICB0aGlzLmN1cnJlbnRfdGltZSA9IG51bGw7CiAgdGhpcy5oYW5nb3V0c19leHRyYV9kYXRhID0gbnVsbDsKCiAgYXNzaWduRmllbGRzKHRoaXMsIGZpZWxkcyk7Cn0KCk1lZGlhU3RhdHVzQWRhcHRlci5QbGF5U3RhdGUgPSBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVN0YXR1cy5QbGF5U3RhdGU7CgpNZWRpYVN0YXR1c0FkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXMoewogICAgJ3RpdGxlJzogdGhpcy50aXRsZSwKICAgICdjYW5QbGF5UGF1c2UnOiB0aGlzLmNhbl9wbGF5X3BhdXNlLAogICAgJ2Nhbk11dGUnOiB0aGlzLmNhbl9tdXRlLAogICAgJ2NhblNldFZvbHVtZSc6IHRoaXMuY2FuX3NldF92b2x1bWUsCiAgICAnY2FuU2Vlayc6IHRoaXMuY2FuX3NlZWssCiAgICAnaXNNdXRlZCc6IHRoaXMuaXNfbXV0ZWQsCiAgICAncGxheVN0YXRlJzogdGhpcy5wbGF5X3N0YXRlLAogICAgJ3ZvbHVtZSc6IHRoaXMudm9sdW1lLAogICAgJ2R1cmF0aW9uJzogdGhpcy5kdXJhdGlvbiwKICAgICdjdXJyZW50VGltZSc6IHRoaXMuY3VycmVudF90aW1lLAogICAgJ2hhbmdvdXRzRXh0cmFEYXRhJzoKICAgICAgICB0aGlzLmhhbmdvdXRzX2V4dHJhX2RhdGEgJiYgdGhpcy5oYW5nb3V0c19leHRyYV9kYXRhLnRvTmV3VmVyc2lvbigpLAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhLm1vam9tLlJlbW90aW5nU2lua01ldGFkYXRhLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIFJlbW90aW5nU2lua01ldGFkYXRhQWRhcHRlcihmaWVsZHMpIHsKICB0aGlzLmZlYXR1cmVzID0gbnVsbDsKICB0aGlzLmF1ZGlvX2NhcGFiaWxpdGllcyA9IG51bGw7CiAgdGhpcy52aWRlb19jYXBhYmlsaXRpZXMgPSBudWxsOwogIHRoaXMuZnJpZW5kbHlfbmFtZSA9IG51bGw7CgogIGFzc2lnbkZpZWxkcyh0aGlzLCBmaWVsZHMpOwp9CgpSZW1vdGluZ1NpbmtNZXRhZGF0YUFkYXB0ZXIuZnJvbU5ld1ZlcnNpb24gPSBmdW5jdGlvbihvdGhlcikgewogIHJldHVybiBuZXcgUmVtb3RpbmdTaW5rTWV0YWRhdGFBZGFwdGVyKHsKICAgICdmZWF0dXJlcyc6IG90aGVyLmZlYXR1cmVzLAogICAgJ2F1ZGlvX2NhcGFiaWxpdGllcyc6IG90aGVyLmF1ZGlvQ2FwYWJpbGl0aWVzLAogICAgJ3ZpZGVvX2NhcGFiaWxpdGllcyc6IG90aGVyLnZpZGVvQ2FwYWJpbGl0aWVzLAogICAgJ2ZyaWVuZGx5X25hbWUnOiBvdGhlci5mcmllbmRseU5hbWUsCiAgfSk7Cn07CgpSZW1vdGluZ1NpbmtNZXRhZGF0YUFkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgbWVkaWEubW9qb20uUmVtb3RpbmdTaW5rTWV0YWRhdGEoewogICAgJ2ZlYXR1cmVzJzogdGhpcy5mZWF0dXJlcywKICAgICdhdWRpb0NhcGFiaWxpdGllcyc6IHRoaXMuYXVkaW9fY2FwYWJpbGl0aWVzLAogICAgJ3ZpZGVvQ2FwYWJpbGl0aWVzJzogdGhpcy52aWRlb19jYXBhYmlsaXRpZXMsCiAgICAnZnJpZW5kbHlOYW1lJzogdGhpcy5mcmllbmRseV9uYW1lLAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2luay4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNZWRpYVNpbmtBZGFwdGVyKGZpZWxkcykgewogIHRoaXMuc2lua19pZCA9IG51bGw7CiAgdGhpcy5uYW1lID0gbnVsbDsKICB0aGlzLmRlc2NyaXB0aW9uID0gbnVsbDsKICB0aGlzLmRvbWFpbiA9IG51bGw7CiAgdGhpcy5pY29uX3R5cGUgPSAwOwogIHRoaXMuZXh0cmFfZGF0YSA9IG51bGw7CgogIGFzc2lnbkZpZWxkcyh0aGlzLCBmaWVsZHMpOwp9CgpNZWRpYVNpbmtBZGFwdGVyLmZyb21OZXdWZXJzaW9uID0gZnVuY3Rpb24ob3RoZXIpIHsKICByZXR1cm4gbmV3IE1lZGlhU2lua0FkYXB0ZXIoewogICAgJ3NpbmtfaWQnOiBvdGhlci5zaW5rSWQsCiAgICAnbmFtZSc6IG90aGVyLm5hbWUsCiAgICAnZGVzY3JpcHRpb24nOiBvdGhlci5kZXNjcmlwdGlvbiwKICAgICdkb21haW4nOiBvdGhlci5kb21haW4sCiAgICAnaWNvbl90eXBlJzogb3RoZXIuaWNvblR5cGUsCiAgICAnZXh0cmFfZGF0YSc6IG90aGVyLmV4dHJhRGF0YSAmJgogICAgICAgIE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIuZnJvbU5ld1ZlcnNpb24ob3RoZXIuZXh0cmFEYXRhKSwKICB9KTsKfTsKCk1lZGlhU2lua0FkYXB0ZXIucHJvdG90eXBlLnRvTmV3VmVyc2lvbiA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTaW5rKHsKICAgICdzaW5rSWQnOiB0aGlzLnNpbmtfaWQsCiAgICAnbmFtZSc6IHRoaXMubmFtZSwKICAgICdkZXNjcmlwdGlvbic6IHRoaXMuZGVzY3JpcHRpb24sCiAgICAnZG9tYWluJzogdGhpcy5kb21haW4sCiAgICAnaWNvblR5cGUnOiB0aGlzLmljb25fdHlwZSwKICAgICdleHRyYURhdGEnOiB0aGlzLmV4dHJhX2RhdGEgJiYgdGhpcy5leHRyYV9kYXRhLnRvTmV3VmVyc2lvbigpLAogIH0pOwp9OwoKLyoqCiAqIEFkYXB0ZXIgZm9yIG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2lua0V4dHJhRGF0YS4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyKHZhbHVlKSB7CiAgdGhpcy4kZGF0YSA9IG51bGw7CiAgdGhpcy4kdGFnID0gdW5kZWZpbmVkOwoKICBpZiAodmFsdWUgPT0gdW5kZWZpbmVkKSB7CiAgICByZXR1cm47CiAgfQoKICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTsKICBpZiAoa2V5cy5sZW5ndGggPT0gMCkgewogICAgcmV0dXJuOwogIH0KCiAgaWYgKGtleXMubGVuZ3RoID4gMSkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG1heSBzZXQgb25seSBvbmUgbWVtYmVyIG9uIGEgdW5pb24uJyk7CiAgfQoKICB2YXIgZmllbGRzID0gWwogICAgJ2RpYWxfbWVkaWFfc2luaycsCiAgICAnY2FzdF9tZWRpYV9zaW5rJywKICBdOwoKICBpZiAoZmllbGRzLmluZGV4T2Yoa2V5c1swXSkgPCAwKSB7CiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3Ioa2V5c1swXSArCiAgICAgICAgJyBpcyBub3QgYSBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyIG1lbWJlci4nKTsKICB9CgogIHRoaXNba2V5c1swXV0gPSB2YWx1ZVtrZXlzWzBdXTsKfQoKTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5UYWdzID0gewogIGRpYWxfbWVkaWFfc2luazogMCwKICBjYXN0X21lZGlhX3Npbms6IDEsCn07CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5wcm90b3R5cGUsICdkaWFsX21lZGlhX3NpbmsnLCB7CiAgZ2V0OiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLiR0YWcgIT0gTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5UYWdzLmRpYWxfbWVkaWFfc2luaykgewogICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoCiAgICAgICAgICAnTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5kaWFsX21lZGlhX3NpbmsgaXMgbm90IGN1cnJlbnRseSBzZXQuJyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy4kZGF0YTsKICB9LAoKICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICB0aGlzLiR0YWcgPSBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLlRhZ3MuZGlhbF9tZWRpYV9zaW5rOwogICAgdGhpcy4kZGF0YSA9IHZhbHVlOwogIH0KfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5wcm90b3R5cGUsICdjYXN0X21lZGlhX3NpbmsnLCB7CiAgZ2V0OiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLiR0YWcgIT0gTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5UYWdzLmNhc3RfbWVkaWFfc2luaykgewogICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoCiAgICAgICAgICAnTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlci5jYXN0X21lZGlhX3NpbmsgaXMgbm90IGN1cnJlbnRseSBzZXQuJyk7CiAgICB9CiAgICByZXR1cm4gdGhpcy4kZGF0YTsKICB9LAoKICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICB0aGlzLiR0YWcgPSBNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLlRhZ3MuY2FzdF9tZWRpYV9zaW5rOwogICAgdGhpcy4kZGF0YSA9IHZhbHVlOwogIH0KfSk7CgpNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLmZyb21OZXdWZXJzaW9uID0gZnVuY3Rpb24ob3RoZXIpIHsKICBpZiAob3RoZXIuJHRhZyA9PSBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVNpbmtFeHRyYURhdGEuVGFncy5kaWFsTWVkaWFTaW5rKSB7CiAgICByZXR1cm4gbmV3IE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIoewogICAgICAnZGlhbF9tZWRpYV9zaW5rJzoKICAgICAgICAgIERpYWxNZWRpYVNpbmtBZGFwdGVyLmZyb21OZXdWZXJzaW9uKG90aGVyLmRpYWxNZWRpYVNpbmspLAogICAgfSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBuZXcgTWVkaWFTaW5rRXh0cmFEYXRhQWRhcHRlcih7CiAgICAgICdjYXN0X21lZGlhX3NpbmsnOgogICAgICAgICAgQ2FzdE1lZGlhU2lua0FkYXB0ZXIuZnJvbU5ld1ZlcnNpb24ob3RoZXIuY2FzdE1lZGlhU2luayksCiAgICB9KTsKICB9Cn07CgpNZWRpYVNpbmtFeHRyYURhdGFBZGFwdGVyLnByb3RvdHlwZS50b05ld1ZlcnNpb24gPSBmdW5jdGlvbigpIHsKICBpZiAodGhpcy4kdGFnID09IE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIuVGFncy5kaWFsX21lZGlhX3NpbmspIHsKICAgIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTaW5rRXh0cmFEYXRhKHsKICAgICAgJ2RpYWxNZWRpYVNpbmsnOiB0aGlzLmRpYWxfbWVkaWFfc2luay50b05ld1ZlcnNpb24oKSwKICAgIH0pOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbmV3IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2lua0V4dHJhRGF0YSh7CiAgICAgICdjYXN0TWVkaWFTaW5rJzogdGhpcy5jYXN0X21lZGlhX3NpbmsudG9OZXdWZXJzaW9uKCksCiAgICB9KTsKICB9Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90ZXJQdHIuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJQdHJBZGFwdGVyKGhhbmRsZU9yUHRySW5mbykgewogIHRoaXMucHRyID0gbmV3IG1vam8uSW50ZXJmYWNlUHRyQ29udHJvbGxlcihNaXJyb3JTZXJ2aWNlUmVtb3RlckFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7Cn0KCk1pcnJvclNlcnZpY2VSZW1vdGVyUHRyQWRhcHRlci5wcm90b3R5cGUgPQogICAgT2JqZWN0LmNyZWF0ZShtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3RlclB0ci5wcm90b3R5cGUpOwpNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ckFkYXB0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyQWRhcHRlcjsKCk1pcnJvclNlcnZpY2VSZW1vdGVyUHRyQWRhcHRlci5wcm90b3R5cGUuc3RhcnREYXRhU3RyZWFtcyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5zdGFydERhdGFTdHJlYW1zCiAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoewogICAgICAnYXVkaW9fc3RyZWFtX2lkJzogcmVzcG9uc2UuYXVkaW9TdHJlYW1JZCwKICAgICAgJ3ZpZGVvX3N0cmVhbV9pZCc6IHJlc3BvbnNlLnZpZGVvU3RyZWFtSWQsCiAgICB9KTsKICB9KTsKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3Rlci5zdHViY2xhc3MuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJTdHViQWRhcHRlcihkZWxlZ2F0ZSkgewogIHRoaXMuZGVsZWdhdGVfID0gZGVsZWdhdGU7Cn0KCk1pcnJvclNlcnZpY2VSZW1vdGVyU3R1YkFkYXB0ZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSgKICAgIG1lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGVyLnN0dWJDbGFzcy5wcm90b3R5cGUpOwpNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWJBZGFwdGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWJBZGFwdGVyOwoKTWlycm9yU2VydmljZVJlbW90ZXJTdHViQWRhcHRlci5wcm90b3R5cGUuc3RhcnREYXRhU3RyZWFtcyA9CiAgICBmdW5jdGlvbihoYXNBdWRpbywgaGFzVmlkZW8pIHsKICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RhcnREYXRhU3RyZWFtcyAmJgogICAgICB0aGlzLmRlbGVnYXRlXy5zdGFydERhdGFTdHJlYW1zKGhhc0F1ZGlvLCBoYXNWaWRlbykudGhlbigKICAgICAgICAgIGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgJ2F1ZGlvU3RyZWFtSWQnOiByZXNwb25zZS5hdWRpb19zdHJlYW1faWQsCiAgICAgICAgICAgICAgJ3ZpZGVvU3RyZWFtSWQnOiByZXNwb25zZS52aWRlb19zdHJlYW1faWQsCiAgICAgICAgICAgIH07CiAgICAgICAgICB9KTsKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3Rlci4KICovCnZhciBNaXJyb3JTZXJ2aWNlUmVtb3RlckFkYXB0ZXIgPSB7CiAgICBuYW1lOiAnbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90ZXInLAogICAga1ZlcnNpb246IDAsCiAgICBwdHJDbGFzczogTWlycm9yU2VydmljZVJlbW90ZXJQdHJBZGFwdGVyLAogICAgcHJveHlDbGFzczogbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90ZXIucHJveHlDbGFzcywKICAgIHN0dWJDbGFzczogTWlycm9yU2VydmljZVJlbW90ZXJTdHViQWRhcHRlciwKICAgIHZhbGlkYXRlUmVxdWVzdDogbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90ZXIudmFsaWRhdGVSZXF1ZXN0LAogICAgdmFsaWRhdGVSZXNwb25zZTogbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90ZXIudmFsaWRhdGVSZXNwb25zZSwKfTsKCi8qKgogKiBBZGFwdGVyIGZvciBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHIuCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyQWRhcHRlcihoYW5kbGVPclB0ckluZm8pIHsKICB0aGlzLnB0ciA9IG5ldyBtb2pvLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQWRhcHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3JQdHJJbmZvKTsKfQoKTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyQWRhcHRlci5wcm90b3R5cGUgPQogICAgT2JqZWN0LmNyZWF0ZShtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHIucHJvdG90eXBlKTsKTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyQWRhcHRlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPQogICAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyQWRhcHRlcjsKCk1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ckFkYXB0ZXIucHJvdG90eXBlLm9uU2lua0F2YWlsYWJsZSA9CiAgICBmdW5jdGlvbihtZXRhZGF0YSkgewogIHJldHVybiB0aGlzLnB0ci5nZXRQcm94eSgpLm9uU2lua0F2YWlsYWJsZShtZXRhZGF0YS50b05ld1ZlcnNpb24oKSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlLgogKi8KdmFyIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZUFkYXB0ZXIgPSB7CiAgICBuYW1lOiAnbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ckFkYXB0ZXIsCiAgICBwcm94eUNsYXNzOiBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2UucHJveHlDbGFzcywKICAgIHN0dWJDbGFzczogbnVsbCwKICAgIHZhbGlkYXRlUmVxdWVzdDogbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlLnZhbGlkYXRlUmVxdWVzdCwKICAgIHZhbGlkYXRlUmVzcG9uc2U6IG51bGwsCn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXNPYnNlcnZlci4KICogQGNvbnN0cnVjdG9yCiAqLwpmdW5jdGlvbiBNZWRpYVN0YXR1c09ic2VydmVyUHRyQWRhcHRlcihoYW5kbGVPclB0ckluZm8pIHsKICB0aGlzLnB0ciA9IG5ldyBtb2pvLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoTWVkaWFTdGF0dXNPYnNlcnZlckFkYXB0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9yUHRySW5mbyk7Cn0KCk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHJBZGFwdGVyLnByb3RvdHlwZSA9CiAgICBPYmplY3QuY3JlYXRlKG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHIucHJvdG90eXBlKTsKTWVkaWFTdGF0dXNPYnNlcnZlclB0ckFkYXB0ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgIE1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHJBZGFwdGVyOwoKTWVkaWFTdGF0dXNPYnNlcnZlclB0ckFkYXB0ZXIucHJvdG90eXBlLm9uTWVkaWFTdGF0dXNVcGRhdGVkID0KICAgIGZ1bmN0aW9uKHN0YXR1cykgewogIHJldHVybiB0aGlzLnB0ci5nZXRQcm94eSgpLm9uTWVkaWFTdGF0dXNVcGRhdGVkKHN0YXR1cy50b05ld1ZlcnNpb24oKSk7Cn07CgovKioKICogQWRhcHRlciBmb3IgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXNPYnNlcnZlci4KICovCnZhciBNZWRpYVN0YXR1c09ic2VydmVyQWRhcHRlciA9IHsKICBuYW1lOiAnbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXNPYnNlcnZlcicsCiAga1ZlcnNpb246IDAsCiAgcHRyQ2xhc3M6IE1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHJBZGFwdGVyLAogIHByb3h5Q2xhc3M6IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXIucHJveHlDbGFzcywKICBzdHViQ2xhc3M6IG51bGwsCiAgdmFsaWRhdGVSZXF1ZXN0OiBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVN0YXR1c09ic2VydmVyLnZhbGlkYXRlUmVxdWVzdCwKICB2YWxpZGF0ZVJlc3BvbnNlOiBudWxsLAp9OwoKLyoqCiAqIENvbnZlcnRzIGEgbWVkaWEgc2luayB0byBhIE1lZGlhU2luayBNb2pvIG9iamVjdC4KICogQHBhcmFtIHshTWVkaWFTaW5rfSBzaW5rIEEgbWVkaWEgc2luay4KICogQHJldHVybiB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2lua30gQSBNb2pvIE1lZGlhU2luayBvYmplY3QuCiAqLwpmdW5jdGlvbiBzaW5rVG9Nb2pvXyhzaW5rKSB7CiAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVNpbmsoewogICAgJ25hbWUnOiBzaW5rLmZyaWVuZGx5TmFtZSwKICAgICdkZXNjcmlwdGlvbic6IHNpbmsuZGVzY3JpcHRpb24sCiAgICAnZG9tYWluJzogc2luay5kb21haW4sCiAgICAnc2lua0lkJzogc2luay5pZCwKICAgICdpY29uVHlwZSc6IHNpbmtJY29uVHlwZVRvTW9qbyhzaW5rLmljb25UeXBlKSwKICAgICdwcm92aWRlcklkJzogbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZVByb3ZpZGVyLklkLkVYVEVOU0lPTiwKICB9KTsKfQoKLyoqCiAqIENvbnZlcnRzIGEgbWVkaWEgc2luaydzIGljb24gdHlwZSB0byBhIE1lZGlhU2luay5JY29uVHlwZSBNb2pvIG9iamVjdC4KICogQHBhcmFtIHshTWVkaWFTaW5rLkljb25UeXBlfSB0eXBlIEEgbWVkaWEgc2luaydzIGljb24gdHlwZS4KICogQHJldHVybiB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2luay5JY29uVHlwZX0gQSBNb2pvIE1lZGlhU2luay5JY29uVHlwZQogKiAgICAgb2JqZWN0LgogKi8KZnVuY3Rpb24gc2lua0ljb25UeXBlVG9Nb2pvKHR5cGUpIHsKICBzd2l0Y2ggKHR5cGUpIHsKICAgIGNhc2UgJ2Nhc3QnOgogICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uU2lua0ljb25UeXBlLkNBU1Q7CiAgICBjYXNlICdjYXN0X2F1ZGlvX2dyb3VwJzoKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5DQVNUX0FVRElPX0dST1VQOwogICAgY2FzZSAnY2FzdF9hdWRpbyc6CiAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5TaW5rSWNvblR5cGUuQ0FTVF9BVURJTzsKICAgIGNhc2UgJ21lZXRpbmcnOgogICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uU2lua0ljb25UeXBlLk1FRVRJTkc7CiAgICBjYXNlICdoYW5nb3V0JzoKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5IQU5HT1VUOwogICAgY2FzZSAnZWR1Y2F0aW9uJzoKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5FRFVDQVRJT047CiAgICBjYXNlICdnZW5lcmljJzoKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5HRU5FUklDOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBzaW5rIGljb24gdHlwZSA6ICcgKyB0eXBlKTsKICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLlNpbmtJY29uVHlwZS5HRU5FUklDOwogIH0KfQoKLyoqCiAqIFJldHVybnMgYSBNb2pvIE1lZGlhUm91dGUgb2JqZWN0IGdpdmVuIGEgTWVkaWFSb3V0ZSBhbmQgYQogKiBtZWRpYSBzaW5rIG5hbWUuCiAqIEBwYXJhbSB7IU1lZGlhUm91dGV9IHJvdXRlCiAqIEByZXR1cm4geyFtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlfQogKi8KZnVuY3Rpb24gcm91dGVUb01vam9fKHJvdXRlKSB7CiAgcmV0dXJuIG5ldyBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlKHsKICAgICdtZWRpYVJvdXRlSWQnOiByb3V0ZS5pZCwKICAgICdtZWRpYVNvdXJjZSc6IHJvdXRlLm1lZGlhU291cmNlLAogICAgJ21lZGlhU2lua0lkJzogcm91dGUuc2lua0lkLAogICAgJ2Rlc2NyaXB0aW9uJzogcm91dGUuZGVzY3JpcHRpb24sCiAgICAnaWNvblVybCc6IHJvdXRlLmljb25VcmwsCiAgICAnaXNMb2NhbCc6IHJvdXRlLmlzTG9jYWwsCiAgICAnZm9yRGlzcGxheSc6IHJvdXRlLmZvckRpc3BsYXksCiAgICAnaXNJbmNvZ25pdG8nOiByb3V0ZS5vZmZUaGVSZWNvcmQsCiAgICAnaXNMb2NhbFByZXNlbnRhdGlvbic6IHJvdXRlLmlzT2Zmc2NyZWVuUHJlc2VudGF0aW9uLAogICAgJ2NvbnRyb2xsZXJUeXBlJzogcm91dGUuY29udHJvbGxlclR5cGUsCiAgICAvLyBCZWdpbiBuZXdseSBhZGRlZCBwcm9wZXJ0aWVzLCBmb2xsb3dlZCBieSB0aGUgbWlsZXN0b25lIHRoZXkgd2VyZQogICAgLy8gYWRkZWQuICBUaGUgZ3VhcmQgc2hvdWxkIGJlIHNhZmUgdG8gcmVtb3ZlIE4rMiBtaWxlc3RvbmVzIGxhdGVyLgogICAgJ3ByZXNlbnRhdGlvbklkJzogcm91dGUucHJlc2VudGF0aW9uSWQgfHwgJycgIC8vIE02NAogIH0pOwp9CgovKioKICogQ29udmVydHMgYSByb3V0ZSBtZXNzYWdlIHRvIGEgUm91dGVNZXNzYWdlIE1vam8gb2JqZWN0LgogKiBAcGFyYW0geyFSb3V0ZU1lc3NhZ2V9IG1lc3NhZ2UKICogQHJldHVybiB7IW1lZGlhUm91dGVyLm1vam9tLlJvdXRlTWVzc2FnZX0gQSBNb2pvIFJvdXRlTWVzc2FnZSBvYmplY3QuCiAqLwpmdW5jdGlvbiBtZXNzYWdlVG9Nb2pvXyhtZXNzYWdlKSB7CiAgaWYgKCJzdHJpbmciID09IHR5cGVvZiBtZXNzYWdlLm1lc3NhZ2UpIHsKICAgIHJldHVybiBuZXcgbWVkaWFSb3V0ZXIubW9qb20uUm91dGVNZXNzYWdlKHsKICAgICAgJ3R5cGUnOiBtZWRpYVJvdXRlci5tb2pvbS5Sb3V0ZU1lc3NhZ2UuVHlwZS5URVhULAogICAgICAnbWVzc2FnZSc6IG1lc3NhZ2UubWVzc2FnZSwKICAgIH0pOwogIH0gZWxzZSB7CiAgICByZXR1cm4gbmV3IG1lZGlhUm91dGVyLm1vam9tLlJvdXRlTWVzc2FnZSh7CiAgICAgICd0eXBlJzogbWVkaWFSb3V0ZXIubW9qb20uUm91dGVNZXNzYWdlLlR5cGUuQklOQVJZLAogICAgICAnZGF0YSc6IG1lc3NhZ2UubWVzc2FnZSwKICAgIH0pOwogIH0KfQoKLyoqCiAqIENvbnZlcnRzIHByZXNlbnRhdGlvbiBjb25uZWN0aW9uIHN0YXRlIHRvIE1vam8gZW51bSB2YWx1ZS4KICogQHBhcmFtIHshc3RyaW5nfSBzdGF0ZQogKiBAcmV0dXJuIHshbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZXIuUHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlfQogKi8KZnVuY3Rpb24gcHJlc2VudGF0aW9uQ29ubmVjdGlvblN0YXRlVG9Nb2pvXyhzdGF0ZSkgewogIHZhciBQcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUgPQogICAgICBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGU7CiAgc3dpdGNoIChzdGF0ZSkgewogICAgY2FzZSAnY29ubmVjdGluZyc6CiAgICAgIHJldHVybiBQcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuQ09OTkVDVElORzsKICAgIGNhc2UgJ2Nvbm5lY3RlZCc6CiAgICAgIHJldHVybiBQcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGUuQ09OTkVDVEVEOwogICAgY2FzZSAnY2xvc2VkJzoKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5DTE9TRUQ7CiAgICBjYXNlICd0ZXJtaW5hdGVkJzoKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5URVJNSU5BVEVEOwogICAgZGVmYXVsdDoKICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBwcmVzZW50YXRpb24gY29ubmVjdGlvbiBzdGF0ZTogJyArIHN0YXRlKTsKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZS5URVJNSU5BVEVEOwogIH0KfQoKLyoqCiAqIENvbnZlcnRzIHByZXNlbnRhdGlvbiBjb25uZWN0aW9uIGNsb3NlIHJlYXNvbiB0byBNb2pvIGVudW0gdmFsdWUuCiAqIEBwYXJhbSB7IXN0cmluZ30gcmVhc29uCiAqIEByZXR1cm4geyFtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb259CiAqLwpmdW5jdGlvbiBwcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb25Ub01vam9fKHJlYXNvbikgewogIHZhciBQcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb24gPQogICAgICBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlci5QcmVzZW50YXRpb25Db25uZWN0aW9uQ2xvc2VSZWFzb247CiAgc3dpdGNoIChyZWFzb24pIHsKICAgIGNhc2UgJ2Vycm9yJzoKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbi5DT05ORUNUSU9OX0VSUk9SOwogICAgY2FzZSAnY2xvc2VkJzoKICAgICAgcmV0dXJuIFByZXNlbnRhdGlvbkNvbm5lY3Rpb25DbG9zZVJlYXNvbi5DTE9TRUQ7CiAgICBjYXNlICd3ZW50X2F3YXknOgogICAgICByZXR1cm4gUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLldFTlRfQVdBWTsKICAgIGRlZmF1bHQ6CiAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gcHJlc2VudGF0aW9uIGNvbm5lY3Rpb24gY2xvc2UgcmVhc29uIDogJyArCiAgICAgICAgICByZWFzb24pOwogICAgICByZXR1cm4gUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uLkNPTk5FQ1RJT05fRVJST1I7CiAgfQp9CgovKioKICogQ29udmVydHMgc3RyaW5nIHRvIE1vam8gb3JpZ2luLgogKiBAcGFyYW0ge3N0cmluZ3whdXJsLm1vam9tLk9yaWdpbn0gb3JpZ2luCiAqIEByZXR1cm4geyF1cmwubW9qb20uT3JpZ2lufQogKi8KZnVuY3Rpb24gc3RyaW5nVG9Nb2pvT3JpZ2luXyhvcmlnaW4pIHsKICBpZiAob3JpZ2luIGluc3RhbmNlb2YgdXJsLm1vam9tLk9yaWdpbikgewogICAgcmV0dXJuIG9yaWdpbjsKICB9CiAgdmFyIG9yaWdpblVybCA9IG5ldyBVUkwob3JpZ2luKTsKICB2YXIgbW9qb09yaWdpbiA9IHt9OwogIG1vam9PcmlnaW4uc2NoZW1lID0gb3JpZ2luVXJsLnByb3RvY29sLnJlcGxhY2UoJzonLCAnJyk7CiAgbW9qb09yaWdpbi5ob3N0ID0gb3JpZ2luVXJsLmhvc3RuYW1lOwogIHZhciBwb3J0ID0gb3JpZ2luVXJsLnBvcnQgPyBOdW1iZXIucGFyc2VJbnQob3JpZ2luVXJsLnBvcnQpIDogMDsKICBzd2l0Y2ggKG1vam9PcmlnaW4uc2NoZW1lKSB7CiAgICBjYXNlICdodHRwJzoKICAgICAgbW9qb09yaWdpbi5wb3J0ID0gcG9ydCB8fCA4MDsKICAgICAgYnJlYWs7CiAgICBjYXNlICdodHRwcyc6CiAgICAgIG1vam9PcmlnaW4ucG9ydCA9IHBvcnQgfHwgNDQzOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRocm93IG5ldyBFcnJvcignU2NoZW1lIG11c3QgYmUgaHR0cCBvciBodHRwcycpOwogIH0KICBtb2pvT3JpZ2luLnN1Ym9yaWdpbiA9ICcnOwogIHJldHVybiBuZXcgdXJsLm1vam9tLk9yaWdpbihtb2pvT3JpZ2luKTsKfQoKLyoqCiAqIFBhcnNlcyB0aGUgZ2l2ZW4gcm91dGUgcmVxdWVzdCBFcnJvciBvYmplY3QgYW5kIGNvbnZlcnRzIGl0IHRvIHRoZQogKiBjb3JyZXNwb25kaW5nIHJlc3VsdCBjb2RlLgogKiBAcGFyYW0geyFFcnJvcn0gZXJyb3IKICogQHJldHVybiB7IW1lZGlhUm91dGVyLm1vam9tLlJvdXRlUmVxdWVzdFJlc3VsdENvZGV9CiAqLwpmdW5jdGlvbiBnZXRSb3V0ZVJlcXVlc3RSZXN1bHRDb2RlXyhlcnJvcikgewogIHJldHVybiBlcnJvci5lcnJvckNvZGUgPyBlcnJvci5lcnJvckNvZGUgOgogICAgbWVkaWFSb3V0ZXIubW9qb20uUm91dGVSZXF1ZXN0UmVzdWx0Q29kZS5VTktOT1dOX0VSUk9SOwp9CgovKioKICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHN1Y2Nlc3NmdWwgcm91dGUgcmVzcG9uc2UgZnJvbSBnaXZlbiByb3V0ZS4KICogQHBhcmFtIHshTWVkaWFSb3V0ZX0gcm91dGUKICogQHJldHVybiB7IU9iamVjdH0KICovCmZ1bmN0aW9uIHRvU3VjY2Vzc1JvdXRlUmVzcG9uc2VfKHJvdXRlKSB7CiAgcmV0dXJuIHsKICAgICAgcm91dGU6IHJvdXRlVG9Nb2pvXyhyb3V0ZSksCiAgICAgIHJlc3VsdENvZGU6IG1lZGlhUm91dGVyLm1vam9tLlJvdXRlUmVxdWVzdFJlc3VsdENvZGUuT0sKICB9Owp9CgovKioKICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGVycm9yIHJvdXRlIHJlc3BvbnNlIGZyb20gZ2l2ZW4gRXJyb3Igb2JqZWN0LgogKiBAcGFyYW0geyFFcnJvcn0gZXJyb3IKICogQHJldHVybiB7IU9iamVjdH0KICovCmZ1bmN0aW9uIHRvRXJyb3JSb3V0ZVJlc3BvbnNlXyhlcnJvcikgewogIHJldHVybiB7CiAgICAgIGVycm9yVGV4dDogZXJyb3IubWVzc2FnZSwKICAgICAgcmVzdWx0Q29kZTogZ2V0Um91dGVSZXF1ZXN0UmVzdWx0Q29kZV8oZXJyb3IpCiAgfTsKfQoKLyoqCiAqIENyZWF0ZXMgYSBuZXcgTWVkaWFSb3V0ZXIuCiAqIENvbnZlcnRzIGEgcm91dGUgc3RydWN0IHRvIGl0cyBNb2pvIGZvcm0uCiAqIEBwYXJhbSB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyUHRyfSBzZXJ2aWNlCiAqIEBjb25zdHJ1Y3RvcgogKi8KZnVuY3Rpb24gTWVkaWFSb3V0ZXIoc2VydmljZSkgewogIC8qKgogICAqIFRoZSBNb2pvIHNlcnZpY2UgcHJveHkuIEFsbG93cyBleHRlbnNpb24gY29kZSB0byBjYWxsIG1ldGhvZHMgdGhhdCByZXNpZGUKICAgKiBpbiB0aGUgYnJvd3Nlci4KICAgKiBAdHlwZSB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyUHRyfQogICAqLwogIHRoaXMuc2VydmljZV8gPSBzZXJ2aWNlOwoKICAvKioKICAgKiBUaGUgcHJvdmlkZXIgbWFuYWdlciBzZXJ2aWNlIGRlbGVnYXRlLiBJdHMgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHRoZQogICAqIGJyb3dzZXItcmVzaWRlbnQgTW9qbyBzZXJ2aWNlLgogICAqIEB0eXBlIHshTWVkaWFSb3V0ZXJ9CiAgICovCiAgdGhpcy5tcnBtXyA9IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXIodGhpcyk7CgogIC8qKgogICAqIEhhbmRsZSB0byBhIEtlZXBBbGl2ZSBzZXJ2aWNlIG9iamVjdCwgd2hpY2ggcHJldmVudHMgdGhlIGV4dGVuc2lvbiBmcm9tCiAgICogYmVpbmcgc3VzcGVuZGVkIGFzIGxvbmcgYXMgaXQgcmVtYWlucyBpbiBzY29wZS4KICAgKiBAdHlwZSB7Ym9vbGVhbn0KICAgKi8KICB0aGlzLmtlZXBBbGl2ZV8gPSBudWxsOwoKICAvKioKICAgKiBUaGUgYmluZGluZ3MgdG8gYmluZCB0aGUgc2VydmljZSBkZWxlZ2F0ZSB0byB0aGUgTW9qbyBpbnRlcmZhY2UuCiAgICogT2JqZWN0IG11c3QgcmVtYWluIGluIHNjb3BlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbm5lY3Rpb24gdG8KICAgKiBwcmV2ZW50IHRoZSBjb25uZWN0aW9uIGZyb20gY2xvc2luZyBhdXRvbWF0aWNhbGx5LgogICAqIEB0eXBlIHshbW9qby5CaW5kaW5nfQogICAqLwogIHRoaXMubWVkaWFSb3V0ZVByb3ZpZGVyQmluZGluZ18gPSBuZXcgbW9qby5CaW5kaW5nKAogICAgICBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlUHJvdmlkZXIsIHRoaXMubXJwbV8pOwp9CgovKioKICogUmV0dXJucyBkZWZpbml0aW9ucyBvZiBNb2pvIGNvcmUgYW5kIGdlbmVyYXRlZCBNb2pvbSBjbGFzc2VzIHRoYXQgY2FuIGJlCiAqIHVzZWQgZGlyZWN0bHkgYnkgdGhlIGNvbXBvbmVudC4KICogQHJldHVybiB7IU9iamVjdH0KICogVE9ETyhpbWNoZW5nKTogV2Ugc2hvdWxkIGV4cG9ydCB0aGVzZSBhbG9uZyB3aXRoIE1lZGlhUm91dGVyLiBUaGlzIHJlcXVpcmVzCiAqIHVzIHRvIG1vZGlmeSB0aGUgY29tcG9uZW50IHRvIGhhbmRsZSBtdWx0aXBsZSBleHBvcnRzLiBXaGVuIHRoYXQgbG9naWMgaXMKICogYmFrZWQgaW4gZm9yIGEgY291cGxlIG9mIG1pbGVzdG9uZXMsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzCiAqIG1ldGhvZC4KICogVE9ETyhpbWNoZW5nKTogV2Ugc2hvdWxkIHN0b3AgZXhwb3J0aW5nIG1vam8gYmluZGluZ3MgY2xhc3NlcyB0aGF0IHRoZQogKiBNZWRpYSBSb3V0ZXIgZXh0ZW5zaW9uIGRvZXNuJ3QgZGlyZWN0bHkgdXNlLCBzdWNoIGFzCiAqIG1vam8uQXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8sIG1vam8uSW50ZXJmYWNlUHRyQ29udHJvbGxlciBhbmQKICogbW9qby5pbnRlcmZhY2VDb250cm9sLgogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLmdldE1vam9FeHBvcnRzID0gZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHsKICAgIEFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvOiBtb2pvLkFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvLAogICAgQmluZGluZzogbW9qby5CaW5kaW5nLAogICAgRGlhbE1lZGlhU2luazogRGlhbE1lZGlhU2lua0FkYXB0ZXIsCiAgICBDYXN0TWVkaWFTaW5rOiBDYXN0TWVkaWFTaW5rQWRhcHRlciwKICAgIEhhbmdvdXRzTWVkaWFSb3V0ZUNvbnRyb2xsZXI6CiAgICAgICAgbWVkaWFSb3V0ZXIubW9qb20uSGFuZ291dHNNZWRpYVJvdXRlQ29udHJvbGxlciwKICAgIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGE6IEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGFBZGFwdGVyLAogICAgSVBBZGRyZXNzOiBJUEFkZHJlc3NBZGFwdGVyLAogICAgSVBFbmRwb2ludDogSVBFbmRwb2ludEFkYXB0ZXIsCiAgICBJbnRlcmZhY2VQdHJDb250cm9sbGVyOiBtb2pvLkludGVyZmFjZVB0ckNvbnRyb2xsZXIsCiAgICBJbnRlcmZhY2VQdHJJbmZvOiBtb2pvLkludGVyZmFjZVB0ckluZm8sCiAgICBJbnRlcmZhY2VSZXF1ZXN0OiBtb2pvLkludGVyZmFjZVJlcXVlc3QsCiAgICBNZWRpYUNvbnRyb2xsZXI6IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhQ29udHJvbGxlciwKICAgIE1lZGlhU3RhdHVzOiBNZWRpYVN0YXR1c0FkYXB0ZXIsCiAgICBNZWRpYVN0YXR1c09ic2VydmVyUHRyOiBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVN0YXR1c09ic2VydmVyUHRyLAogICAgTWlycm9yU2VydmljZVJlbW90ZXI6IE1pcnJvclNlcnZpY2VSZW1vdGVyQWRhcHRlciwKICAgIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyOiBNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ckFkYXB0ZXIsCiAgICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHI6IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ckFkYXB0ZXIsCiAgICBSZW1vdGluZ1N0b3BSZWFzb246IG1lZGlhLm1vam9tLlJlbW90aW5nU3RvcFJlYXNvbiwKICAgIFJlbW90aW5nU3RhcnRGYWlsUmVhc29uOiBtZWRpYS5tb2pvbS5SZW1vdGluZ1N0YXJ0RmFpbFJlYXNvbiwKICAgIFJlbW90aW5nU2lua0ZlYXR1cmU6IG1lZGlhLm1vam9tLlJlbW90aW5nU2lua0ZlYXR1cmUsCiAgICBSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHk6CiAgICAgICAgbWVkaWEubW9qb20uUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LAogICAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5OgogICAgICAgIG1lZGlhLm1vam9tLlJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eSwKICAgIFJlbW90aW5nU2lua01ldGFkYXRhOiBSZW1vdGluZ1NpbmtNZXRhZGF0YUFkYXB0ZXIsCiAgICBSb3V0ZUNvbnRyb2xsZXJUeXBlOiBtZWRpYVJvdXRlci5tb2pvbS5Sb3V0ZUNvbnRyb2xsZXJUeXBlLAogICAgT3JpZ2luOiB1cmwubW9qb20uT3JpZ2luLAogICAgU2luazogTWVkaWFTaW5rQWRhcHRlciwKICAgIFNpbmtFeHRyYURhdGE6IE1lZGlhU2lua0V4dHJhRGF0YUFkYXB0ZXIsCiAgICBUaW1lRGVsdGE6IG1vam9CYXNlLm1vam9tLlRpbWVEZWx0YSwKICAgIFVybDogdXJsLm1vam9tLlVybCwKICAgIGludGVyZmFjZUNvbnRyb2w6IG1vam8uaW50ZXJmYWNlQ29udHJvbCwKICAgIG1ha2VSZXF1ZXN0OiBtb2pvLm1ha2VSZXF1ZXN0LAogIH07Cn07CgovKioKICogUmVnaXN0ZXJzIHRoZSBNZWRpYSBSb3V0ZXIgUHJvdmlkZXIgTWFuYWdlciB3aXRoIHRoZSBNZWRpYSBSb3V0ZXIuCiAqIEByZXR1cm4geyFQcm9taXNlPE9iamVjdD59IEluc3RhbmNlIElEIGFuZCBjb25maWcgZm9yIHRoZSBNZWRpYSBSb3V0ZXIuCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5zZXJ2aWNlXy5yZWdpc3Rlck1lZGlhUm91dGVQcm92aWRlcigKICAgICAgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZVByb3ZpZGVyLklkLkVYVEVOU0lPTiwKICAgICAgdGhpcy5tZWRpYVJvdXRlUHJvdmlkZXJCaW5kaW5nXy5jcmVhdGVJbnRlcmZhY2VQdHJBbmRCaW5kKCkpLnRoZW4oCiAgICAgICAgICBmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICdpbnN0YW5jZV9pZCc6IHJlc3BvbnNlLmluc3RhbmNlSWQsCiAgICAgICAgICAgICAgJ2NvbmZpZyc6IHsKICAgICAgICAgICAgICAgICdlbmFibGVfZGlhbF9kaXNjb3ZlcnknOiByZXNwb25zZS5jb25maWcuZW5hYmxlRGlhbERpc2NvdmVyeSwKICAgICAgICAgICAgICAgICdlbmFibGVfY2FzdF9kaXNjb3ZlcnknOiByZXNwb25zZS5jb25maWcuZW5hYmxlQ2FzdERpc2NvdmVyeSwKICAgICAgICAgICAgICAgICdlbmFibGVfZGlhbF9zaW5rX3F1ZXJ5JzogcmVzcG9uc2UuY29uZmlnLmVuYWJsZURpYWxTaW5rUXVlcnksCiAgICAgICAgICAgICAgICAnZW5hYmxlX2Nhc3Rfc2lua19xdWVyeSc6IHJlc3BvbnNlLmNvbmZpZy5lbmFibGVDYXN0U2lua1F1ZXJ5LAogICAgICAgICAgICAgICAgJ3VzZV92aWV3c19kaWFsb2cnOiByZXNwb25zZS5jb25maWcudXNlVmlld3NEaWFsb2csCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgfSk7Cn0KCi8qKgogKiBTZXRzIHRoZSBzZXJ2aWNlIGRlbGVnYXRlIG1ldGhvZHMuCiAqIEBwYXJhbSB7T2JqZWN0fSBoYW5kbGVycwogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLnNldEhhbmRsZXJzID0gZnVuY3Rpb24oaGFuZGxlcnMpIHsKICB0aGlzLm1ycG1fLnNldEhhbmRsZXJzKGhhbmRsZXJzKTsKfQoKLyoqCiAqIFRoZSBrZWVwIGFsaXZlIHN0YXR1cy4KICogQHJldHVybiB7Ym9vbGVhbn0KICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5nZXRLZWVwQWxpdmUgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5rZWVwQWxpdmVfICE9IG51bGw7Cn07CgovKioKICogQ2FsbGVkIGJ5IHRoZSBwcm92aWRlciBtYW5hZ2VyIHdoZW4gYSBzaW5rIGxpc3QgZm9yIGEgZ2l2ZW4gc291cmNlIGlzCiAqIHVwZGF0ZWQuCiAqIEBwYXJhbSB7IXN0cmluZ30gc291cmNlVXJuCiAqIEBwYXJhbSB7IUFycmF5PCFNZWRpYVNpbms+fSBzaW5rcwogKiBAcGFyYW0geyFBcnJheTxzdHJpbmd8IXVybC5tb2pvbS5PcmlnaW4+fSBvcmlnaW5zCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUub25TaW5rc1JlY2VpdmVkID0gZnVuY3Rpb24oc291cmNlVXJuLCBzaW5rcywgb3JpZ2lucykgewogIC8vIHxvcmlnaW5zfCBpcyBhIHN0cmluZyBhcnJheSBpZiB0aGUgTWVkaWEgUm91dGVyIGNvbXBvbmVudCBleHRlbnNpb24gdmVyc2lvbgogIC8vIGlzIDU5IG9yIG9sZGVyLiBXaXRob3V0IHRoZSBzdHJpbmdUb01vam9PcmlnaW5fKCkgY29udmVyc2lvbiwgY2xpZW50cyB1c2luZwogIC8vIHRob3NlIGV4dGVuc2lvbiB2ZXJzaW9ucyB3b3VsZCBzZWUgYSBjcmFzaCBzaG93biBpbgogIC8vIGh0dHBzOi8vY3JidWcuY29tLzc4NzQyNy4KICB0aGlzLnNlcnZpY2VfLm9uU2lua3NSZWNlaXZlZCgKICAgICAgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZVByb3ZpZGVyLklkLkVYVEVOU0lPTiwgc291cmNlVXJuLAogICAgICBzaW5rcy5tYXAoc2lua1RvTW9qb18pLCBvcmlnaW5zLm1hcChzdHJpbmdUb01vam9PcmlnaW5fKSk7Cn07CgovKioKICogQ2FsbGVkIGJ5IHRoZSBwcm92aWRlciBtYW5hZ2VyIHdoZW4gYSBzaW5rIGlzIGZvdW5kIHRvIG5vdGlmeSB0aGUgTVIgb2YgdGhlCiAqIHNpbmsncyBJRC4gVGhlIGFjdHVhbCBzaW5rIHdpbGwgYmUgcmV0dXJuZWQgdGhyb3VnaCB0aGUgbm9ybWFsIHNpbmsgbGlzdAogKiB1cGRhdGUgcHJvY2Vzcywgc28gdGhpcyBoZWxwcyB0aGUgTVIgaWRlbnRpZnkgdGhlIHNlYXJjaCByZXN1bHQgaW4gdGhlCiAqIGxpc3QuCiAqIEBwYXJhbSB7c3RyaW5nfSBwc2V1ZG9TaW5rSWQgIElEIG9mIHRoZSBwc2V1ZG8gc2luayB0aGF0IHN0YXJ0ZWQgdGhlCiAqICAgICBzZWFyY2guCiAqIEBwYXJhbSB7c3RyaW5nfSBzaW5rSWQgSUQgb2YgdGhlIG5ld2x5LWZvdW5kIHNpbmsuCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUub25TZWFyY2hTaW5rSWRSZWNlaXZlZCA9IGZ1bmN0aW9uKAogICAgcHNldWRvU2lua0lkLCBzaW5rSWQpIHsKICB0aGlzLnNlcnZpY2VfLm9uU2VhcmNoU2lua0lkUmVjZWl2ZWQocHNldWRvU2lua0lkLCBzaW5rSWQpOwp9OwoKLyoqCiAqIENhbGxlZCBieSB0aGUgcHJvdmlkZXIgbWFuYWdlciB0byBrZWVwIHRoZSBleHRlbnNpb24gZnJvbSBzdXNwZW5kaW5nCiAqIGlmIGl0IGVudGVycyBhIHN0YXRlIHdoZXJlIHN1c3BlbnNpb24gaXMgdW5kZXNpcmFibGUgKGUuZy4gdGhlcmUgaXMgYW4KICogYWN0aXZlIE1lZGlhUm91dGUuKQogKiBJZiBrZWVwQWxpdmUgaXMgdHJ1ZSwgdGhlIGV4dGVuc2lvbiBpcyBrZXB0IGFsaXZlLgogKiBJZiBrZWVwQWxpdmUgaXMgZmFsc2UsIHRoZSBleHRlbnNpb24gaXMgYWxsb3dlZCB0byBzdXNwZW5kLgogKiBAcGFyYW0ge2Jvb2xlYW59IGtlZXBBbGl2ZQogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLnNldEtlZXBBbGl2ZSA9IGZ1bmN0aW9uKGtlZXBBbGl2ZSkgewogIGlmIChrZWVwQWxpdmUgPT09IGZhbHNlICYmIHRoaXMua2VlcEFsaXZlXykgewogICAgdGhpcy5rZWVwQWxpdmVfLnB0ci5yZXNldCgpOwogICAgdGhpcy5rZWVwQWxpdmVfID0gbnVsbDsKICB9IGVsc2UgaWYgKGtlZXBBbGl2ZSA9PT0gdHJ1ZSAmJiAhdGhpcy5rZWVwQWxpdmVfKSB7CiAgICB0aGlzLmtlZXBBbGl2ZV8gPSBuZXcgZXh0ZW5zaW9ucy5LZWVwQWxpdmVQdHI7CiAgICBNb2pvLmJpbmRJbnRlcmZhY2UoZXh0ZW5zaW9ucy5LZWVwQWxpdmUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBtb2pvLm1ha2VSZXF1ZXN0KHRoaXMua2VlcEFsaXZlXykuaGFuZGxlKTsKICB9Cn07CgovKioKICogQ2FsbGVkIGJ5IHRoZSBwcm92aWRlciBtYW5hZ2VyIHRvIHNlbmQgYW4gaXNzdWUgZnJvbSBhIG1lZGlhIHJvdXRlCiAqIHByb3ZpZGVyIHRvIHRoZSBNZWRpYSBSb3V0ZXIsIHRvIHNob3cgdGhlIHVzZXIuCiAqIEBwYXJhbSB7IU9iamVjdH0gaXNzdWUgVGhlIGlzc3VlIG9iamVjdC4KICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5vbklzc3VlID0gZnVuY3Rpb24oaXNzdWUpIHsKICBmdW5jdGlvbiBpc3N1ZVNldmVyaXR5VG9Nb2pvXyhzZXZlcml0eSkgewogICAgc3dpdGNoIChzZXZlcml0eSkgewogICAgICBjYXNlICdmYXRhbCc6CiAgICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLklzc3VlLlNldmVyaXR5LkZBVEFMOwogICAgICBjYXNlICd3YXJuaW5nJzoKICAgICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uSXNzdWUuU2V2ZXJpdHkuV0FSTklORzsKICAgICAgY2FzZSAnbm90aWZpY2F0aW9uJzoKICAgICAgICByZXR1cm4gbWVkaWFSb3V0ZXIubW9qb20uSXNzdWUuU2V2ZXJpdHkuTk9USUZJQ0FUSU9OOwogICAgICBkZWZhdWx0OgogICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gaXNzdWUgc2V2ZXJpdHk6ICcgKyBzZXZlcml0eSk7CiAgICAgICAgcmV0dXJuIG1lZGlhUm91dGVyLm1vam9tLklzc3VlLlNldmVyaXR5Lk5PVElGSUNBVElPTjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzc3VlQWN0aW9uVG9Nb2pvXyhhY3Rpb24pIHsKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICAgIGNhc2UgJ2Rpc21pc3MnOgogICAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5Jc3N1ZS5BY3Rpb25UeXBlLkRJU01JU1M7CiAgICAgIGNhc2UgJ2xlYXJuX21vcmUnOgogICAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5Jc3N1ZS5BY3Rpb25UeXBlLkxFQVJOX01PUkU7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBpc3N1ZSBhY3Rpb24gdHlwZSA6ICcgKyBhY3Rpb24pOwogICAgICAgIHJldHVybiBtZWRpYVJvdXRlci5tb2pvbS5Jc3N1ZS5BY3Rpb25UeXBlLk9LOwogICAgfQogIH0KCiAgdmFyIHNlY29uZGFyeUFjdGlvbnMgPSAoaXNzdWUuc2Vjb25kYXJ5QWN0aW9ucyB8fCBbXSkubWFwKGlzc3VlQWN0aW9uVG9Nb2pvXyk7CiAgdGhpcy5zZXJ2aWNlXy5vbklzc3VlKG5ldyBtZWRpYVJvdXRlci5tb2pvbS5Jc3N1ZSh7CiAgICAncm91dGVJZCc6IGlzc3VlLnJvdXRlSWQgfHwgJycsCiAgICAnc2V2ZXJpdHknOiBpc3N1ZVNldmVyaXR5VG9Nb2pvXyhpc3N1ZS5zZXZlcml0eSksCiAgICAndGl0bGUnOiBpc3N1ZS50aXRsZSwKICAgICdtZXNzYWdlJzogaXNzdWUubWVzc2FnZSB8fCAnJywKICAgICdkZWZhdWx0QWN0aW9uJzogaXNzdWVBY3Rpb25Ub01vam9fKGlzc3VlLmRlZmF1bHRBY3Rpb24pLAogICAgJ3NlY29uZGFyeUFjdGlvbnMnOiBzZWNvbmRhcnlBY3Rpb25zLAogICAgJ2hlbHBQYWdlSWQnOiBpc3N1ZS5oZWxwUGFnZUlkLAogICAgJ2lzQmxvY2tpbmcnOiBpc3N1ZS5pc0Jsb2NraW5nLAogICAgJ3NpbmtJZCc6IGlzc3VlLnNpbmtJZCB8fCAnJwogIH0pKTsKfTsKCi8qKgogKiBDYWxsZWQgYnkgdGhlIHByb3ZpZGVyIG1hbmFnZXIgd2hlbiB0aGUgc2V0IG9mIGFjdGl2ZSByb3V0ZXMKICogaGFzIGJlZW4gdXBkYXRlZC4KICogQHBhcmFtIHshQXJyYXk8TWVkaWFSb3V0ZT59IHJvdXRlcyBUaGUgYWN0aXZlIHNldCBvZiBtZWRpYSByb3V0ZXMuCiAqIEBwYXJhbSB7c3RyaW5nPX0gc291cmNlVXJuIFRoZSBzb3VyY2VVcm4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUKICogICAgIHF1ZXJ5LgogKiBAcGFyYW0ge0FycmF5PHN0cmluZz49fSBqb2luYWJsZVJvdXRlSWRzIFRoZSBhY3RpdmUgc2V0IG9mIGpvaW5hYmxlCiAqICAgICBtZWRpYSByb3V0ZXMuCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUub25Sb3V0ZXNVcGRhdGVkID0gZnVuY3Rpb24oCiAgICByb3V0ZXMsIHNvdXJjZVVybiA9ICcnLCBqb2luYWJsZVJvdXRlSWRzID0gW10pIHsKICB0aGlzLnNlcnZpY2VfLm9uUm91dGVzVXBkYXRlZCgKICAgICAgbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZVByb3ZpZGVyLklkLkVYVEVOU0lPTiwKICAgICAgcm91dGVzLm1hcChyb3V0ZVRvTW9qb18pLCBzb3VyY2VVcm4sIGpvaW5hYmxlUm91dGVJZHMpOwp9OwoKLyoqCiAqIENhbGxlZCBieSB0aGUgcHJvdmlkZXIgbWFuYWdlciB3aGVuIHNpbmsgYXZhaWxhYmlsaXR5IGhhcyBiZWVuIHVwZGF0ZWQuCiAqIEBwYXJhbSB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyLlNpbmtBdmFpbGFiaWxpdHl9IGF2YWlsYWJpbGl0eQogKiAgICAgVGhlIG5ldyBzaW5rIGF2YWlsYWJpbGl0eS4KICovCk1lZGlhUm91dGVyLnByb3RvdHlwZS5vblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkID0gZnVuY3Rpb24oYXZhaWxhYmlsaXR5KSB7CiAgdGhpcy5zZXJ2aWNlXy5vblNpbmtBdmFpbGFiaWxpdHlVcGRhdGVkKAogICAgICBtZWRpYVJvdXRlci5tb2pvbS5NZWRpYVJvdXRlUHJvdmlkZXIuSWQuRVhURU5TSU9OLCBhdmFpbGFiaWxpdHkpOwp9OwoKLyoqCiAqIENhbGxlZCBieSB0aGUgcHJvdmlkZXIgbWFuYWdlciB3aGVuIHRoZSBzdGF0ZSBvZiBhIHByZXNlbnRhdGlvbiBjb25uZWN0ZWQKICogdG8gYSByb3V0ZSBoYXMgY2hhbmdlZC4KICogQHBhcmFtIHtzdHJpbmd9IHJvdXRlSWQKICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlCiAqLwpNZWRpYVJvdXRlci5wcm90b3R5cGUub25QcmVzZW50YXRpb25Db25uZWN0aW9uU3RhdGVDaGFuZ2VkID0KICAgIGZ1bmN0aW9uKHJvdXRlSWQsIHN0YXRlKSB7CiAgdGhpcy5zZXJ2aWNlXy5vblByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQoCiAgICAgIHJvdXRlSWQsIHByZXNlbnRhdGlvbkNvbm5lY3Rpb25TdGF0ZVRvTW9qb18oc3RhdGUpKTsKfTsKCi8qKgogKiBDYWxsZWQgYnkgdGhlIHByb3ZpZGVyIG1hbmFnZXIgd2hlbiB0aGUgc3RhdGUgb2YgYSBwcmVzZW50YXRpb24gY29ubmVjdGVkCiAqIHRvIGEgcm91dGUgaGFzIGNsb3NlZC4KICogQHBhcmFtIHtzdHJpbmd9IHJvdXRlSWQKICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbgogKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZQogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCA9CiAgICBmdW5jdGlvbihyb3V0ZUlkLCByZWFzb24sIG1lc3NhZ2UpIHsKICB0aGlzLnNlcnZpY2VfLm9uUHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlZCgKICAgICAgcm91dGVJZCwgcHJlc2VudGF0aW9uQ29ubmVjdGlvbkNsb3NlUmVhc29uVG9Nb2pvXyhyZWFzb24pLCBtZXNzYWdlKTsKfTsKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gcm91dGVJZAogKiBAcGFyYW0geyFBcnJheTwhUm91dGVNZXNzYWdlPn0gbWVzYWdlcwogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uUm91dGVNZXNzYWdlc1JlY2VpdmVkID0gZnVuY3Rpb24ocm91dGVJZCwgbWVzc2FnZXMpIHsKICB0aGlzLnNlcnZpY2VfLm9uUm91dGVNZXNzYWdlc1JlY2VpdmVkKAogICAgICByb3V0ZUlkLCBtZXNzYWdlcy5tYXAobWVzc2FnZVRvTW9qb18pKTsKfTsKCi8qKgogKiBAcGFyYW0ge251bWJlcn0gdGFiSWQKICogQHBhcmFtIHshbWVkaWEubW9qb20uTWlycm9yU2VydmljZVJlbW90ZXJQdHJ9IHJlbW90ZXIKICogQHBhcmFtIHshbW9qby5JbnRlcmZhY2VSZXF1ZXN0fSByZW1vdGluZ1NvdXJjZQogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCA9IGZ1bmN0aW9uKHRhYklkLCByZW1vdGVyLAogICAgcmVtb3RpbmdTb3VyY2UpIHsKICB0aGlzLnNlcnZpY2VfLm9uTWVkaWFSZW1vdGVyQ3JlYXRlZCgKICAgICAgdGFiSWQsCiAgICAgIG5ldyBtZWRpYS5tb2pvbS5NaXJyb3JTZXJ2aWNlUmVtb3RlclB0cihyZW1vdGVyLnB0ci5wYXNzSW50ZXJmYWNlKCkpLAogICAgICByZW1vdGluZ1NvdXJjZSk7Cn0KCi8qKgogKiBSZXR1cm5zIGN1cnJlbnQgc3RhdHVzIG9mIG1lZGlhIHNpbmsgc2VydmljZSBpbiBKU09OIGZvcm1hdC4KICogQHJldHVybiB7IVByb21pc2U8IXtzdGF0dXM6IHN0cmluZ30+fQogKi8KTWVkaWFSb3V0ZXIucHJvdG90eXBlLmdldE1lZGlhU2lua1NlcnZpY2VTdGF0dXMgPSBmdW5jdGlvbigpIHsKICByZXR1cm4gdGhpcy5zZXJ2aWNlXy5nZXRNZWRpYVNpbmtTZXJ2aWNlU3RhdHVzKCk7Cn0KCi8qKgogKiBPYmplY3QgY29udGFpbmluZyBjYWxsYmFja3Mgc2V0IGJ5IHRoZSBwcm92aWRlciBtYW5hZ2VyLgogKgogKiBAY29uc3RydWN0b3IKICogQHN0cnVjdAogKi8KZnVuY3Rpb24gTWVkaWFSb3V0ZXJIYW5kbGVycygpIHsKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oIXN0cmluZywgIXN0cmluZywgIXN0cmluZywgIXN0cmluZywgIW51bWJlcil9CiAgICovCiAgdGhpcy5jcmVhdGVSb3V0ZSA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbighc3RyaW5nLCAhc3RyaW5nLCAhc3RyaW5nLCAhbnVtYmVyKX0KICAgKi8KICB0aGlzLmpvaW5Sb3V0ZSA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpOiBQcm9taXNlfQogICAqLwogIHRoaXMudGVybWluYXRlUm91dGUgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nKX0KICAgKi8KICB0aGlzLnN0YXJ0T2JzZXJ2aW5nTWVkaWFTaW5rcyA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpfQogICAqLwogIHRoaXMuc3RvcE9ic2VydmluZ01lZGlhU2lua3MgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oc3RyaW5nLCBzdHJpbmcpOiBQcm9taXNlfQogICAqLwogIHRoaXMuc2VuZFJvdXRlTWVzc2FnZSA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcsIFVpbnQ4QXJyYXkpOiBQcm9taXNlfQogICAqLwogIHRoaXMuc2VuZFJvdXRlQmluYXJ5TWVzc2FnZSA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpfQogICAqLwogIHRoaXMuc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyl9CiAgICovCiAgdGhpcy5zdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcpfQogICAqLwogIHRoaXMuZGV0YWNoUm91dGUgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgKi8KICB0aGlzLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgKi8KICB0aGlzLnN0b3BPYnNlcnZpbmdNZWRpYVJvdXRlcyA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbigpfQogICAqLwogIHRoaXMuY29ubmVjdFJvdXRlQnlSb3V0ZUlkID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKCl9CiAgICovCiAgdGhpcy5lbmFibGVNZG5zRGlzY292ZXJ5ID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKCl9CiAgICovCiAgdGhpcy51cGRhdGVNZWRpYVNpbmtzID0gbnVsbDsKCiAgLyoqCiAgICogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgc3RyaW5nLCAhU2lua1NlYXJjaENyaXRlcmlhKTogc3RyaW5nfQogICAqLwogIHRoaXMuc2VhcmNoU2lua3MgPSBudWxsOwoKICAvKioKICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgKi8KICB0aGlzLnByb3ZpZGVTaW5rcyA9IG51bGw7CgogIC8qKgogICAqIEB0eXBlIHtmdW5jdGlvbihzdHJpbmcsICFtb2pvLkludGVyZmFjZVJlcXVlc3QsCiAgICogICAgICAgICAgICAhbWVkaWFSb3V0ZXIubW9qb20uTWVkaWFTdGF0dXNPYnNlcnZlclB0cik6ICFQcm9taXNlPHZvaWQ+fQogICAqLwogIHRoaXMuY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSBudWxsOwp9OwoKLyoqCiAqIFJvdXRlcyBjYWxscyBmcm9tIE1lZGlhIFJvdXRlciB0byB0aGUgcHJvdmlkZXIgbWFuYWdlciBleHRlbnNpb24uCiAqIFJlZ2lzdGVyZWQgd2l0aCB0aGUgTWVkaWFSb3V0ZXIgc3R1Yi4KICogQHBhcmFtIHshTWVkaWFSb3V0ZXJ9IE1lZGlhUm91dGVyIHByb3h5IHRvIGNhbGwgaW50byB0aGUKICogTWVkaWEgUm91dGVyIG1vam8gaW50ZXJmYWNlLgogKiBAY29uc3RydWN0b3IKICovCmZ1bmN0aW9uIE1lZGlhUm91dGVQcm92aWRlcihtZWRpYVJvdXRlcikgewogIC8qKgogICAqIE9iamVjdCBjb250YWluaW5nIEpTIGNhbGxiYWNrcyBpbnRvIFByb3ZpZGVyIE1hbmFnZXIgY29kZS4KICAgKiBAdHlwZSB7IU1lZGlhUm91dGVySGFuZGxlcnN9CiAgICovCiAgdGhpcy5oYW5kbGVyc18gPSBuZXcgTWVkaWFSb3V0ZXJIYW5kbGVycygpOwoKICAvKioKICAgKiBQcm94eSBjbGFzcyB0byB0aGUgYnJvd3NlcidzIE1lZGlhIFJvdXRlciBNb2pvIHNlcnZpY2UuCiAgICogQHR5cGUgeyFNZWRpYVJvdXRlcn0KICAgKi8KICB0aGlzLm1lZGlhUm91dGVyXyA9IG1lZGlhUm91dGVyOwp9CgovKgogKiBTZXRzIHRoZSBjYWxsYmFjayBoYW5kbGVyIHVzZWQgdG8gaW52b2tlIG1ldGhvZHMgaW4gdGhlIHByb3ZpZGVyIG1hbmFnZXIuCiAqCiAqIEBwYXJhbSB7IU1lZGlhUm91dGVySGFuZGxlcnN9IGhhbmRsZXJzCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLnNldEhhbmRsZXJzID0gZnVuY3Rpb24oaGFuZGxlcnMpIHsKICB0aGlzLmhhbmRsZXJzXyA9IGhhbmRsZXJzOwogIHZhciByZXF1aXJlZEhhbmRsZXJzID0gWwogICAgJ3N0b3BPYnNlcnZpbmdNZWRpYVJvdXRlcycsCiAgICAnc3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlcycsCiAgICAnc2VuZFJvdXRlTWVzc2FnZScsCiAgICAnc2VuZFJvdXRlQmluYXJ5TWVzc2FnZScsCiAgICAnc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzJywKICAgICdzdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcycsCiAgICAnZGV0YWNoUm91dGUnLAogICAgJ3Rlcm1pbmF0ZVJvdXRlJywKICAgICdqb2luUm91dGUnLAogICAgJ2NyZWF0ZVJvdXRlJywKICAgICdzdG9wT2JzZXJ2aW5nTWVkaWFTaW5rcycsCiAgICAnc3RhcnRPYnNlcnZpbmdNZWRpYVJvdXRlcycsCiAgICAnY29ubmVjdFJvdXRlQnlSb3V0ZUlkJywKICAgICdlbmFibGVNZG5zRGlzY292ZXJ5JywKICAgICd1cGRhdGVNZWRpYVNpbmtzJywKICAgICdzZWFyY2hTaW5rcycsCiAgICAncHJvdmlkZVNpbmtzJywKICAgICdjcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcicsCiAgICAnb25CZWZvcmVJbnZva2VIYW5kbGVyJwogIF07CiAgcmVxdWlyZWRIYW5kbGVycy5mb3JFYWNoKGZ1bmN0aW9uKG5leHRIYW5kbGVyKSB7CiAgICBpZiAoaGFuZGxlcnNbbmV4dEhhbmRsZXJdID09PSB1bmRlZmluZWQpIHsKICAgICAgY29uc29sZS5lcnJvcihuZXh0SGFuZGxlciArICcgaGFuZGxlciBub3QgcmVnaXN0ZXJlZC4nKTsKICAgIH0KICB9KTsKfQoKLyoqCiAqIFN0YXJ0cyBxdWVyeWluZyBmb3Igc2lua3MgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIHRoZSBtZWRpYSBzb3VyY2UKICogZGVzaWduYXRlZCBieSB8c291cmNlVXJufC4gIFJlc3VsdHMgYXJlIHJldHVybmVkIGJ5IGNhbGxpbmcKICogT25TaW5rc1JlY2VpdmVkLgogKiBAcGFyYW0geyFzdHJpbmd9IHNvdXJjZVVybgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zdGFydE9ic2VydmluZ01lZGlhU2lua3MgPQogICAgZnVuY3Rpb24oc291cmNlVXJuKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgdGhpcy5oYW5kbGVyc18uc3RhcnRPYnNlcnZpbmdNZWRpYVNpbmtzKHNvdXJjZVVybik7Cn07CgovKioKICogU3RvcHMgcXVlcnlpbmcgZm9yIHNpbmtzIGNhcGFibGUgb2YgZGlzcGxheWluZyB8c291cmNlVXJufC4KICogQHBhcmFtIHshc3RyaW5nfSBzb3VyY2VVcm4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc3RvcE9ic2VydmluZ01lZGlhU2lua3MgPQogICAgZnVuY3Rpb24oc291cmNlVXJuKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgdGhpcy5oYW5kbGVyc18uc3RvcE9ic2VydmluZ01lZGlhU2lua3Moc291cmNlVXJuKTsKfTsKCi8qKgogKiBSZXF1ZXN0cyB0aGF0IHxzaW5rSWR8IHJlbmRlciB0aGUgbWVkaWEgcmVmZXJlbmNlZCBieSB8c291cmNlVXJufC4gSWYgdGhlCiAqIHJlcXVlc3QgaXMgZnJvbSB0aGUgUHJlc2VudGF0aW9uIEFQSSwgdGhlbiBvcmlnaW4gYW5kIHRhYklkIHdpbGwKICogYmUgcG9wdWxhdGVkLgogKiBAcGFyYW0geyFzdHJpbmd9IHNvdXJjZVVybiBNZWRpYSBzb3VyY2UgdG8gcmVuZGVyLgogKiBAcGFyYW0geyFzdHJpbmd9IHNpbmtJZCBNZWRpYSBzaW5rIElELgogKiBAcGFyYW0geyFzdHJpbmd9IHByZXNlbnRhdGlvbklkIFByZXNlbnRhdGlvbiBJRCBmcm9tIHRoZSBzaXRlCiAqICAgICByZXF1ZXN0aW5nIHByZXNlbnRhdGlvbi4gVE9ETyhtZm9sdHopOiBSZW1vdmUuCiAqIEBwYXJhbSB7IXVybC5tb2pvbS5PcmlnaW59IG9yaWdpbiBPcmlnaW4gb2Ygc2l0ZSByZXF1ZXN0aW5nIHByZXNlbnRhdGlvbi4KICogQHBhcmFtIHshbnVtYmVyfSB0YWJJZCBJRCBvZiB0YWIgcmVxdWVzdGluZyBwcmVzZW50YXRpb24uCiAqIEBwYXJhbSB7IW1vam9fYmFzZS5tb2pvbS5UaW1lRGVsdGF9IHRpbWVvdXQgSWYgcG9zaXRpdmUsIHRoZSB0aW1lb3V0CiAqICAgICBkdXJhdGlvbiBmb3IgdGhlIHJlcXVlc3QuIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgZHVyYXRpb24gd2lsbCBiZSB1c2VkLgogKiBAcGFyYW0geyFib29sZWFufSBpbmNvZ25pdG8gSWYgdHJ1ZSwgdGhlIHJvdXRlIGlzIGJlaW5nIHJlcXVlc3RlZCBieQogKiAgICAgYW4gaW5jb2duaXRvIHByb2ZpbGUuCiAqIEByZXR1cm4geyFQcm9taXNlLjwhT2JqZWN0Pn0gQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBvYmplY3QgZGVzY3JpYmluZwogKiAgICAgdGhlIG5ld2x5IGNyZWF0ZWQgbWVkaWEgcm91dGUsIG9yIHJlamVjdGluZyB3aXRoIGFuIGVycm9yIG1lc3NhZ2Ugb24KICogICAgIGZhaWx1cmUuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLmNyZWF0ZVJvdXRlID0KICAgIGZ1bmN0aW9uKHNvdXJjZVVybiwgc2lua0lkLCBwcmVzZW50YXRpb25JZCwgb3JpZ2luLCB0YWJJZCwKICAgICAgICAgICAgIHRpbWVvdXQsIGluY29nbml0bykgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHJldHVybiB0aGlzLmhhbmRsZXJzXy5jcmVhdGVSb3V0ZSgKICAgICAgc291cmNlVXJuLCBzaW5rSWQsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLAogICAgICBNYXRoLmZsb29yKHRpbWVvdXQubWljcm9zZWNvbmRzIC8gMTAwMCksIGluY29nbml0bykKICAgICAgLnRoZW4oZnVuY3Rpb24ocm91dGUpIHsKICAgICAgICByZXR1cm4gdG9TdWNjZXNzUm91dGVSZXNwb25zZV8ocm91dGUpOwogICAgICB9LAogICAgICBmdW5jdGlvbihlcnIpIHsKICAgICAgICByZXR1cm4gdG9FcnJvclJvdXRlUmVzcG9uc2VfKGVycik7CiAgICAgIH0pOwp9OwoKLyoqCiAqIEhhbmRsZXMgYSByZXF1ZXN0IHZpYSB0aGUgUHJlc2VudGF0aW9uIEFQSSB0byBqb2luIGFuIGV4aXN0aW5nIHJvdXRlIGdpdmVuCiAqIGJ5IHxzb3VyY2VVcm58IGFuZCB8cHJlc2VudGF0aW9uSWR8LiB8b3JpZ2lufCBhbmQgfHRhYklkfCBhcmUgdXNlZCBmb3IKICogdmFsaWRhdGluZyBzYW1lLW9yaWdpbi90YWIgc2NvcGUuCiAqIEBwYXJhbSB7IXN0cmluZ30gc291cmNlVXJuIE1lZGlhIHNvdXJjZSB0byByZW5kZXIuCiAqIEBwYXJhbSB7IXN0cmluZ30gcHJlc2VudGF0aW9uSWQgUHJlc2VudGF0aW9uIElEIHRvIGpvaW4uCiAqIEBwYXJhbSB7IXVybC5tb2pvbS5PcmlnaW59IG9yaWdpbiBPcmlnaW4gb2Ygc2l0ZSByZXF1ZXN0aW5nIGpvaW4uCiAqIEBwYXJhbSB7IW51bWJlcn0gdGFiSWQgSUQgb2YgdGFiIHJlcXVlc3Rpbmcgam9pbi4KICogQHBhcmFtIHshbW9qb19iYXNlLm1vam9tLlRpbWVEZWx0YX0gdGltZW91dCBJZiBwb3NpdGl2ZSwgdGhlIHRpbWVvdXQKICogICAgIGR1cmF0aW9uIGZvciB0aGUgcmVxdWVzdC4gT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBkdXJhdGlvbiB3aWxsIGJlIHVzZWQuCiAqIEBwYXJhbSB7IWJvb2xlYW59IGluY29nbml0byBJZiB0cnVlLCB0aGUgcm91dGUgaXMgYmVpbmcgcmVxdWVzdGVkIGJ5CiAqICAgICBhbiBpbmNvZ25pdG8gcHJvZmlsZS4KICogQHJldHVybiB7IVByb21pc2UuPCFPYmplY3Q+fSBBIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIG9iamVjdCBkZXNjcmliaW5nCiAqICAgICB0aGUgbmV3bHkgY3JlYXRlZCBtZWRpYSByb3V0ZSwgb3IgcmVqZWN0aW5nIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBvbgogKiAgICAgZmFpbHVyZS4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuam9pblJvdXRlID0KICAgIGZ1bmN0aW9uKHNvdXJjZVVybiwgcHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsIHRpbWVvdXQsCiAgICAgICAgICAgICBpbmNvZ25pdG8pIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICByZXR1cm4gdGhpcy5oYW5kbGVyc18uam9pblJvdXRlKAogICAgICBzb3VyY2VVcm4sIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLAogICAgICBNYXRoLmZsb29yKHRpbWVvdXQubWljcm9zZWNvbmRzIC8gMTAwMCksIGluY29nbml0bykKICAgICAgLnRoZW4oZnVuY3Rpb24ocm91dGUpIHsKICAgICAgICByZXR1cm4gdG9TdWNjZXNzUm91dGVSZXNwb25zZV8ocm91dGUpOwogICAgICB9LAogICAgICBmdW5jdGlvbihlcnIpIHsKICAgICAgICByZXR1cm4gdG9FcnJvclJvdXRlUmVzcG9uc2VfKGVycik7CiAgICAgIH0pOwp9OwoKLyoqCiAqIEhhbmRsZXMgYSByZXF1ZXN0IHZpYSB0aGUgUHJlc2VudGF0aW9uIEFQSSB0byBqb2luIGFuIGV4aXN0aW5nIHJvdXRlIGdpdmVuCiAqIGJ5IHxzb3VyY2VVcm58IGFuZCB8cm91dGVJZHwuIHxvcmlnaW58IGFuZCB8dGFiSWR8IGFyZSB1c2VkIGZvcgogKiB2YWxpZGF0aW5nIHNhbWUtb3JpZ2luL3RhYiBzY29wZS4KICogQHBhcmFtIHshc3RyaW5nfSBzb3VyY2VVcm4gTWVkaWEgc291cmNlIHRvIHJlbmRlci4KICogQHBhcmFtIHshc3RyaW5nfSByb3V0ZUlkIFJvdXRlIElEIHRvIGpvaW4uCiAqIEBwYXJhbSB7IXN0cmluZ30gcHJlc2VudGF0aW9uSWQgUHJlc2VudGF0aW9uIElEIHRvIGpvaW4uCiAqIEBwYXJhbSB7IXVybC5tb2pvbS5PcmlnaW59IG9yaWdpbiBPcmlnaW4gb2Ygc2l0ZSByZXF1ZXN0aW5nIGpvaW4uCiAqIEBwYXJhbSB7IW51bWJlcn0gdGFiSWQgSUQgb2YgdGFiIHJlcXVlc3Rpbmcgam9pbi4KICogQHBhcmFtIHshbW9qb19iYXNlLm1vam9tLlRpbWVEZWx0YX0gdGltZW91dCBJZiBwb3NpdGl2ZSwgdGhlIHRpbWVvdXQKICogICAgIGR1cmF0aW9uIGZvciB0aGUgcmVxdWVzdC4gT3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBkdXJhdGlvbiB3aWxsIGJlIHVzZWQuCiAqIEBwYXJhbSB7IWJvb2xlYW59IGluY29nbml0byBJZiB0cnVlLCB0aGUgcm91dGUgaXMgYmVpbmcgcmVxdWVzdGVkIGJ5CiAqICAgICBhbiBpbmNvZ25pdG8gcHJvZmlsZS4KICogQHJldHVybiB7IVByb21pc2UuPCFPYmplY3Q+fSBBIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIG9iamVjdCBkZXNjcmliaW5nCiAqICAgICB0aGUgbmV3bHkgY3JlYXRlZCBtZWRpYSByb3V0ZSwgb3IgcmVqZWN0aW5nIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBvbgogKiAgICAgZmFpbHVyZS4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuY29ubmVjdFJvdXRlQnlSb3V0ZUlkID0KICAgIGZ1bmN0aW9uKHNvdXJjZVVybiwgcm91dGVJZCwgcHJlc2VudGF0aW9uSWQsIG9yaWdpbiwgdGFiSWQsCiAgICAgICAgICAgICB0aW1lb3V0LCBpbmNvZ25pdG8pIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICByZXR1cm4gdGhpcy5oYW5kbGVyc18uY29ubmVjdFJvdXRlQnlSb3V0ZUlkKAogICAgICBzb3VyY2VVcm4sIHJvdXRlSWQsIHByZXNlbnRhdGlvbklkLCBvcmlnaW4sIHRhYklkLAogICAgICBNYXRoLmZsb29yKHRpbWVvdXQubWljcm9zZWNvbmRzIC8gMTAwMCksIGluY29nbml0bykKICAgICAgLnRoZW4oZnVuY3Rpb24ocm91dGUpIHsKICAgICAgICByZXR1cm4gdG9TdWNjZXNzUm91dGVSZXNwb25zZV8ocm91dGUpOwogICAgICB9LAogICAgICBmdW5jdGlvbihlcnIpIHsKICAgICAgICByZXR1cm4gdG9FcnJvclJvdXRlUmVzcG9uc2VfKGVycik7CiAgICAgIH0pOwp9OwoKLyoqCiAqIFRlcm1pbmF0ZXMgdGhlIHJvdXRlIHNwZWNpZmllZCBieSB8cm91dGVJZHwuCiAqIEBwYXJhbSB7IXN0cmluZ30gcm91dGVJZAogKiBAcmV0dXJuIHshUHJvbWlzZTwhT2JqZWN0Pn0gQSBQcm9taXNlIHJlc29sdmluZyB0byBhbiBvYmplY3QgZGVzY3JpYmluZwogKiAgICB0aGUgcmVzdWx0IG9mIHRoZSB0ZXJtaW5hdGUgb3BlcmF0aW9uLCBvciByZWplY3Rpbmcgd2l0aCBhbiBlcnJvcgogKiAgICBtZXNzYWdlIGFuZCBjb2RlIGlmIHRoZSBvcGVyYXRpb24gZmFpbGVkLgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS50ZXJtaW5hdGVSb3V0ZSA9IGZ1bmN0aW9uKHJvdXRlSWQpIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICByZXR1cm4gdGhpcy5oYW5kbGVyc18udGVybWluYXRlUm91dGUocm91dGVJZCkudGhlbigKICAgICAgKCkgPT4gKHtyZXN1bHRDb2RlOiBtZWRpYVJvdXRlci5tb2pvbS5Sb3V0ZVJlcXVlc3RSZXN1bHRDb2RlLk9LfSksCiAgICAgIChlcnIpID0+IHRvRXJyb3JSb3V0ZVJlc3BvbnNlXyhlcnIpKTsKfTsKCi8qKgogKiBQb3N0cyBhIG1lc3NhZ2UgdG8gdGhlIHJvdXRlIGRlc2lnbmF0ZWQgYnkgfHJvdXRlSWR8LgogKiBAcGFyYW0geyFzdHJpbmd9IHJvdXRlSWQKICogQHBhcmFtIHshc3RyaW5nfSBtZXNzYWdlCiAqIEByZXR1cm4geyFQcm9taXNlLjxib29sZWFuPn0gUmVzb2x2ZWQgd2l0aCB0cnVlIGlmIHRoZSBtZXNzYWdlIHdhcyBzZW50LAogKiAgICBvciBmYWxzZSBvbiBmYWlsdXJlLgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zZW5kUm91dGVNZXNzYWdlID0gZnVuY3Rpb24oCiAgcm91dGVJZCwgbWVzc2FnZSkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHJldHVybiB0aGlzLmhhbmRsZXJzXy5zZW5kUm91dGVNZXNzYWdlKHJvdXRlSWQsIG1lc3NhZ2UpCiAgICAgIC50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7J3NlbnQnOiB0cnVlfTsKICAgICAgfSwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHsnc2VudCc6IGZhbHNlfTsKICAgICAgfSk7Cn07CgovKioKICogU2VuZHMgYSBiaW5hcnkgbWVzc2FnZSB0byB0aGUgcm91dGUgZGVzaWduYXRlZCBieSB8cm91dGVJZHwuCiAqIEBwYXJhbSB7IXN0cmluZ30gcm91dGVJZAogKiBAcGFyYW0geyFBcnJheTxudW1iZXI+fSBkYXRhCiAqIEByZXR1cm4geyFQcm9taXNlLjxib29sZWFuPn0gUmVzb2x2ZWQgd2l0aCB0cnVlIGlmIHRoZSBkYXRhIHdhcyBzZW50LAogKiAgICBvciBmYWxzZSBvbiBmYWlsdXJlLgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zZW5kUm91dGVCaW5hcnlNZXNzYWdlID0gZnVuY3Rpb24oCiAgcm91dGVJZCwgZGF0YSkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHJldHVybiB0aGlzLmhhbmRsZXJzXy5zZW5kUm91dGVCaW5hcnlNZXNzYWdlKHJvdXRlSWQsIG5ldyBVaW50OEFycmF5KGRhdGEpKQogICAgICAudGhlbihmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geydzZW50JzogdHJ1ZX07CiAgICAgIH0sIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7J3NlbnQnOiBmYWxzZX07CiAgICAgIH0pOwp9OwoKLyoqCiAqIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSBhIHJvdXRlLgogKiBAcGFyYW0geyFzdHJpbmd9IHJvdXRlSWQKICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzID0gZnVuY3Rpb24oCiAgICByb3V0ZUlkKSB7CiAgdGhpcy5oYW5kbGVyc18ub25CZWZvcmVJbnZva2VIYW5kbGVyKCk7CiAgdGhpcy5oYW5kbGVyc18uc3RhcnRMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzKHJvdXRlSWQpOwp9OwoKLyoqCiAqIEBwYXJhbSB7IXN0cmluZ30gcm91dGVJZAogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zdG9wTGlzdGVuaW5nRm9yUm91dGVNZXNzYWdlcyA9IGZ1bmN0aW9uKAogICAgcm91dGVJZCkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHRoaXMuaGFuZGxlcnNfLnN0b3BMaXN0ZW5pbmdGb3JSb3V0ZU1lc3NhZ2VzKHJvdXRlSWQpOwp9OwoKLyoqCiAqIEluZGljYXRlcyB0aGF0IHRoZSBwcmVzZW50YXRpb24gY29ubmVjdGlvbiB0aGF0IHdhcyBjb25uZWN0ZWQgdG8gfHJvdXRlSWR8CiAqIGlzIG5vIGxvbmdlciBjb25uZWN0ZWQgdG8gaXQuCiAqIEBwYXJhbSB7IXN0cmluZ30gcm91dGVJZAogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5kZXRhY2hSb3V0ZSA9IGZ1bmN0aW9uKAogICAgcm91dGVJZCkgewogIHRoaXMuaGFuZGxlcnNfLmRldGFjaFJvdXRlKHJvdXRlSWQpOwp9OwoKLyoqCiAqIFJlcXVlc3RzIHRoYXQgdGhlIHByb3ZpZGVyIG1hbmFnZXIgc3RhcnQgc2VuZGluZyBpbmZvcm1hdGlvbiBhYm91dCBhY3RpdmUKICogbWVkaWEgcm91dGVzIHRvIHRoZSBNZWRpYSBSb3V0ZXIuCiAqIEBwYXJhbSB7IXN0cmluZ30gc291cmNlVXJuCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLnN0YXJ0T2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBmdW5jdGlvbihzb3VyY2VVcm4pIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICB0aGlzLmhhbmRsZXJzXy5zdGFydE9ic2VydmluZ01lZGlhUm91dGVzKHNvdXJjZVVybik7Cn07CgovKioKICogUmVxdWVzdHMgdGhhdCB0aGUgcHJvdmlkZXIgbWFuYWdlciBzdG9wIHNlbmRpbmcgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlCiAqIG1lZGlhIHJvdXRlcyB0byB0aGUgTWVkaWEgUm91dGVyLgogKiBAcGFyYW0geyFzdHJpbmd9IHNvdXJjZVVybgogKi8KTWVkaWFSb3V0ZVByb3ZpZGVyLnByb3RvdHlwZS5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMgPSBmdW5jdGlvbihzb3VyY2VVcm4pIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICB0aGlzLmhhbmRsZXJzXy5zdG9wT2JzZXJ2aW5nTWVkaWFSb3V0ZXMoc291cmNlVXJuKTsKfTsKCi8qKgogKiBFbmFibGVzIG1ETlMgZGV2aWNlIGRpc2NvdmVyeS4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuZW5hYmxlTWRuc0Rpc2NvdmVyeSA9IGZ1bmN0aW9uKCkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHRoaXMuaGFuZGxlcnNfLmVuYWJsZU1kbnNEaXNjb3ZlcnkoKTsKfTsKCi8qKgogKiBSZXF1ZXN0cyB0aGF0IHRoZSBwcm92aWRlciBtYW5hZ2VyIHVwZGF0ZSBtZWRpYSBzaW5rcy4KICogQHBhcmFtIHshc3RyaW5nfSBzb3VyY2VVcm4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUudXBkYXRlTWVkaWFTaW5rcyA9IGZ1bmN0aW9uKHNvdXJjZVVybikgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHRoaXMuaGFuZGxlcnNfLnVwZGF0ZU1lZGlhU2lua3Moc291cmNlVXJuKTsKfTsKCi8qKgogKiBSZXF1ZXN0cyB0aGF0IHRoZSBwcm92aWRlciBtYW5hZ2VyIHNlYXJjaCBpdHMgcHJvdmlkZXJzIGZvciBhIHNpbmsgbWF0Y2hpbmcKICogfHNlYXJjaENyaXRlcmlhfCB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB8c291cmNlVXJufC4gSWYgYSBzaW5rIGlzIGZvdW5kCiAqIHRoYXQgY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgZm9yIHJvdXRlIGNyZWF0aW9uLCBpdHMgSUQgaXMgcmV0dXJuZWQuCiAqIE90aGVyd2lzZSB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgogKgogKiBAcGFyYW0ge3N0cmluZ30gc2lua0lkIFNpbmsgSUQgb2YgdGhlIHBzZXVkbyBzaW5rIGdlbmVyYXRpbmcgdGhlIHJlcXVlc3QuCiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VVcm4gTWVkaWEgc291cmNlIHRvIGJlIHVzZWQgd2l0aCB0aGUgc2luay4KICogQHBhcmFtIHshU2lua1NlYXJjaENyaXRlcmlhfSBzZWFyY2hDcml0ZXJpYSBTZWFyY2ggY3JpdGVyaWEgZm9yIHRoZSByb3V0ZQogKiAgICAgcHJvdmlkZXJzLgogKiBAcmV0dXJuIHshUHJvbWlzZS48IXtzaW5rX2lkOiAhc3RyaW5nfT59IEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gZWl0aGVyIHRoZQogKiAgICAgc2luayBJRCBvZiB0aGUgc2luayBmb3VuZCBieSB0aGUgc2VhcmNoIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHJvdXRlCiAqICAgICBjcmVhdGlvbiwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBubyByb3V0ZSBjYW4gYmUgaW1tZWRpYXRlbHkgY3JlYXRlZC4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuc2VhcmNoU2lua3MgPSBmdW5jdGlvbigKICAgIHNpbmtJZCwgc291cmNlVXJuLCBzZWFyY2hDcml0ZXJpYSkgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogcmV0dXJuIHRoaXMuaGFuZGxlcnNfLnNlYXJjaFNpbmtzKHNpbmtJZCwgc291cmNlVXJuLCBzZWFyY2hDcml0ZXJpYSkudGhlbigKICAgICAgc2lua0lkID0+IHsKICAgICAgICByZXR1cm4geyAnc2lua0lkJzogc2lua0lkIH07CiAgICAgIH0sCiAgICAgICgpID0+IHsKICAgICAgICByZXR1cm4geyAnc2lua0lkJzogJycgfTsKICAgICAgfSk7Cn07CgovKioKICogTm90aWZpZXMgdGhlIHByb3ZpZGVyIG1hbmFnZXIgdGhhdCBNZWRpYVJvdXRlciBoYXMgZGlzY292ZXJlZCBhIGxpc3Qgb2YKICogc2lua3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBwcm92aWRlck5hbWUKICogQHBhcmFtIHshQXJyYXk8IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhU2luaz59IHNpbmtzCiAqLwpNZWRpYVJvdXRlUHJvdmlkZXIucHJvdG90eXBlLnByb3ZpZGVTaW5rcyA9IGZ1bmN0aW9uKHByb3ZpZGVyTmFtZSwgc2lua3MpIHsKICB0aGlzLmhhbmRsZXJzXy5vbkJlZm9yZUludm9rZUhhbmRsZXIoKTsKICB0aGlzLmhhbmRsZXJzXy5wcm92aWRlU2lua3MocHJvdmlkZXJOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5rcy5tYXAoTWVkaWFTaW5rQWRhcHRlci5mcm9tTmV3VmVyc2lvbikpOwp9OwoKLyoqCiAqIENyZWF0ZXMgYSBjb250cm9sbGVyIGZvciB0aGUgZ2l2ZW4gcm91dGUgYW5kIGJpbmRzIHRoZSBnaXZlbgogKiBJbnRlcmZhY2VSZXF1ZXN0IHRvIGl0LCBhbmQgcmVnaXN0ZXJzIGFuIG9ic2VydmVyIGZvciBtZWRpYSBzdGF0dXMgdXBkYXRlcwogKiBmb3IgdGhlIHJvdXRlLgogKiBAcGFyYW0ge3N0cmluZ30gcm91dGVJZAogKiBAcGFyYW0geyFtb2pvLkludGVyZmFjZVJlcXVlc3R9IGNvbnRyb2xsZXJSZXF1ZXN0CiAqIEBwYXJhbSB7IW1lZGlhUm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXJQdHJ9IG9ic2VydmVyCiAqIEByZXR1cm4geyFQcm9taXNlPCF7c3VjY2VzczogYm9vbGVhbn0+fSBSZXNvbHZlcyB0byB0cnVlIGlmIGEgY29udHJvbGxlcgogKiAgICAgaXMgY3JlYXRlZC4gUmVzb2x2ZXMgdG8gZmFsc2UgaWYgYSBjb250cm9sbGVyIGNhbm5vdCBiZSBjcmVhdGVkLCBvciBpZgogKiAgICAgdGhlIGNvbnRyb2xsZXIgaXMgYWxyZWFkeSBib3VuZC4KICovCk1lZGlhUm91dGVQcm92aWRlci5wcm90b3R5cGUuY3JlYXRlTWVkaWFSb3V0ZUNvbnRyb2xsZXIgPSBmdW5jdGlvbigKICAgIHJvdXRlSWQsIGNvbnRyb2xsZXJSZXF1ZXN0LCBvYnNlcnZlcikgewogIHRoaXMuaGFuZGxlcnNfLm9uQmVmb3JlSW52b2tlSGFuZGxlcigpOwogIHJldHVybiB0aGlzLmhhbmRsZXJzXy5jcmVhdGVNZWRpYVJvdXRlQ29udHJvbGxlcigKICAgICAgcm91dGVJZCwgY29udHJvbGxlclJlcXVlc3QsCiAgICAgIG5ldyBNZWRpYVN0YXR1c09ic2VydmVyUHRyQWRhcHRlcihvYnNlcnZlci5wdHIucGFzc0ludGVyZmFjZSgpKSkudGhlbigKICAgICAgICAgICgpID0+ICh7c3VjY2VzczogdHJ1ZX0pLCBlID0+ICh7c3VjY2VzczogZmFsc2V9KSk7Cn07Cgp2YXIgcHRyID0gbmV3IG1lZGlhUm91dGVyLm1vam9tLk1lZGlhUm91dGVyUHRyOwpNb2pvLmJpbmRJbnRlcmZhY2UobWVkaWFSb3V0ZXIubW9qb20uTWVkaWFSb3V0ZXIubmFtZSwKICAgICAgICAgICAgICAgICAgIG1vam8ubWFrZVJlcXVlc3QocHRyKS5oYW5kbGUpOwpleHBvcnRzLiRzZXQoJ3JldHVyblZhbHVlJywgbmV3IE1lZGlhUm91dGVyKHB0cikpOwovLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2pvbUlkID0gJ2Nocm9tZS9jb21tb24vbWVkaWFfcm91dGVyL21vam8vbWVkaWFfc3RhdHVzLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWFSb3V0ZXIubW9qb20nKTsKICB2YXIgdGltZSQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbW9qb0Jhc2UubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ21vam8vcHVibGljL21vam9tL2Jhc2UvdGltZS5tb2pvbScsICcuLi8uLi8uLi8uLi9tb2pvL3B1YmxpYy9tb2pvbS9iYXNlL3RpbWUubW9qb20uanMnKTsKICB9CgoKCiAgZnVuY3Rpb24gTWVkaWFTdGF0dXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgogIE1lZGlhU3RhdHVzLlBsYXlTdGF0ZSA9IHt9OwogIE1lZGlhU3RhdHVzLlBsYXlTdGF0ZS5QTEFZSU5HID0gMDsKICBNZWRpYVN0YXR1cy5QbGF5U3RhdGUuUEFVU0VEID0gTWVkaWFTdGF0dXMuUGxheVN0YXRlLlBMQVlJTkcgKyAxOwogIE1lZGlhU3RhdHVzLlBsYXlTdGF0ZS5CVUZGRVJJTkcgPSBNZWRpYVN0YXR1cy5QbGF5U3RhdGUuUEFVU0VEICsgMTsKCiAgTWVkaWFTdGF0dXMuUGxheVN0YXRlLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBNZWRpYVN0YXR1cy5QbGF5U3RhdGUudmFsaWRhdGUgPSBmdW5jdGlvbihlbnVtVmFsdWUpIHsKICAgIHZhciBpc0V4dGVuc2libGUgPSBmYWxzZTsKICAgIGlmIChpc0V4dGVuc2libGUgfHwgdGhpcy5pc0tub3duRW51bVZhbHVlKGVudW1WYWx1ZSkpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuVU5LTk9XTl9FTlVNX1ZBTFVFOwogIH07CgogIE1lZGlhU3RhdHVzLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRpdGxlID0gbnVsbDsKICAgIHRoaXMuY2FuUGxheVBhdXNlID0gZmFsc2U7CiAgICB0aGlzLmNhbk11dGUgPSBmYWxzZTsKICAgIHRoaXMuY2FuU2V0Vm9sdW1lID0gZmFsc2U7CiAgICB0aGlzLmNhblNlZWsgPSBmYWxzZTsKICAgIHRoaXMuaXNNdXRlZCA9IGZhbHNlOwogICAgdGhpcy5wbGF5U3RhdGUgPSAwOwogICAgdGhpcy52b2x1bWUgPSAwOwogICAgdGhpcy5kdXJhdGlvbiA9IG51bGw7CiAgICB0aGlzLmN1cnJlbnRUaW1lID0gbnVsbDsKICAgIHRoaXMuaGFuZ291dHNFeHRyYURhdGEgPSBudWxsOwogIH07CiAgTWVkaWFTdGF0dXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVN0YXR1cy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiA1Nn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU3RhdHVzLnRpdGxlCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RyaW5nUG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKCgoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVN0YXR1cy5wbGF5U3RhdGUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVFbnVtKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTIsIE1lZGlhU3RhdHVzLlBsYXlTdGF0ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKCiAgICAvLyB2YWxpZGF0ZSBNZWRpYVN0YXR1cy5kdXJhdGlvbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAyNCwgdGltZSQuVGltZURlbHRhLCBmYWxzZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWVkaWFTdGF0dXMuY3VycmVudFRpbWUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzIsIHRpbWUkLlRpbWVEZWx0YSwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU3RhdHVzLmhhbmdvdXRzRXh0cmFEYXRhCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQwLCBIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhLCB0cnVlKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWVkaWFTdGF0dXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDQ4OwoKICBNZWRpYVN0YXR1cy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNZWRpYVN0YXR1cygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwudGl0bGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC5jYW5QbGF5UGF1c2UgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIHZhbC5jYW5NdXRlID0gKHBhY2tlZCA+PiAxKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuY2FuU2V0Vm9sdW1lID0gKHBhY2tlZCA+PiAyKSAmIDEgPyB0cnVlIDogZmFsc2U7CiAgICB2YWwuY2FuU2VlayA9IChwYWNrZWQgPj4gMykgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgdmFsLmlzTXV0ZWQgPSAocGFja2VkID4+IDQpICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHZhbC5wbGF5U3RhdGUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwudm9sdW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuRmxvYXQpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgdmFsLmR1cmF0aW9uID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSk7CiAgICB2YWwuY3VycmVudFRpbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdFBvaW50ZXIodGltZSQuVGltZURlbHRhKTsKICAgIHZhbC5oYW5nb3V0c0V4dHJhRGF0YSA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWVkaWFTdGF0dXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNZWRpYVN0YXR1cy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwudGl0bGUpOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmNhblBsYXlQYXVzZSAmIDEpIDw8IDAKICAgIHBhY2tlZCB8PSAodmFsLmNhbk11dGUgJiAxKSA8PCAxCiAgICBwYWNrZWQgfD0gKHZhbC5jYW5TZXRWb2x1bWUgJiAxKSA8PCAyCiAgICBwYWNrZWQgfD0gKHZhbC5jYW5TZWVrICYgMSkgPDwgMwogICAgcGFja2VkIHw9ICh2YWwuaXNNdXRlZCAmIDEpIDw8IDQKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50MzIsIHZhbC5wbGF5U3RhdGUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuRmxvYXQsIHZhbC52b2x1bWUpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKHRpbWUkLlRpbWVEZWx0YSwgdmFsLmR1cmF0aW9uKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcih0aW1lJC5UaW1lRGVsdGEsIHZhbC5jdXJyZW50VGltZSk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIoSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YSwgdmFsLmhhbmdvdXRzRXh0cmFEYXRhKTsKICB9OwogIGZ1bmN0aW9uIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmxvY2FsUHJlc2VudCA9IGZhbHNlOwogIH07CiAgSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIEhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YSgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICBwYWNrZWQgPSBkZWNvZGVyLnJlYWRVaW50OCgpOwogICAgdmFsLmxvY2FsUHJlc2VudCA9IChwYWNrZWQgPj4gMCkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoSGFuZ291dHNNZWRpYVN0YXR1c0V4dHJhRGF0YS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgcGFja2VkID0gMDsKICAgIHBhY2tlZCB8PSAodmFsLmxvY2FsUHJlc2VudCAmIDEpIDw8IDAKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zdGF0dXMgPSBudWxsOwogIH07CiAgTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zLnN0YXR1cwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBNZWRpYVN0YXR1cywgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLnN0YXR1cyA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihNZWRpYVN0YXR1cyk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0UG9pbnRlcihNZWRpYVN0YXR1cywgdmFsLnN0YXR1cyk7CiAgfTsKICB2YXIga01lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfTmFtZSA9IDQ3OTM1MTQ0MjsKCiAgZnVuY3Rpb24gTWVkaWFTdGF0dXNPYnNlcnZlclB0cihoYW5kbGVPclB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGJpbmRpbmdzLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoTWVkaWFTdGF0dXNPYnNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3JQdHJJbmZvKTsKICB9CgogIGZ1bmN0aW9uIE1lZGlhU3RhdHVzT2JzZXJ2ZXJBc3NvY2lhdGVkUHRyKGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBhc3NvY2lhdGVkQmluZGluZ3MuQXNzb2NpYXRlZEludGVyZmFjZVB0ckNvbnRyb2xsZXIoCiAgICAgICAgTWVkaWFTdGF0dXNPYnNlcnZlciwgYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pOwogIH0KCiAgTWVkaWFTdGF0dXNPYnNlcnZlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlID0KICAgICAgT2JqZWN0LmNyZWF0ZShNZWRpYVN0YXR1c09ic2VydmVyUHRyLnByb3RvdHlwZSk7CiAgTWVkaWFTdGF0dXNPYnNlcnZlckFzc29jaWF0ZWRQdHIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgICAgTWVkaWFTdGF0dXNPYnNlcnZlckFzc29jaWF0ZWRQdHI7CgogIGZ1bmN0aW9uIE1lZGlhU3RhdHVzT2JzZXJ2ZXJQcm94eShyZWNlaXZlcikgewogICAgdGhpcy5yZWNlaXZlcl8gPSByZWNlaXZlcjsKICB9CiAgTWVkaWFTdGF0dXNPYnNlcnZlclB0ci5wcm90b3R5cGUub25NZWRpYVN0YXR1c1VwZGF0ZWQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBNZWRpYVN0YXR1c09ic2VydmVyUHJveHkucHJvdG90eXBlLm9uTWVkaWFTdGF0dXNVcGRhdGVkCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWVkaWFTdGF0dXNPYnNlcnZlclByb3h5LnByb3RvdHlwZS5vbk1lZGlhU3RhdHVzVXBkYXRlZCA9IGZ1bmN0aW9uKHN0YXR1cykgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMoKTsKICAgIHBhcmFtc18uc3RhdHVzID0gc3RhdHVzOwogICAgdmFyIGJ1aWxkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVYwQnVpbGRlcigKICAgICAgICBrTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNZWRpYVN0YXR1c09ic2VydmVyX09uTWVkaWFTdGF0dXNVcGRhdGVkX1BhcmFtcywgcGFyYW1zXyk7CiAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICB0aGlzLnJlY2VpdmVyXy5hY2NlcHQobWVzc2FnZSk7CiAgfTsKCiAgZnVuY3Rpb24gTWVkaWFTdGF0dXNPYnNlcnZlclN0dWIoZGVsZWdhdGUpIHsKICAgIHRoaXMuZGVsZWdhdGVfID0gZGVsZWdhdGU7CiAgfQogIE1lZGlhU3RhdHVzT2JzZXJ2ZXJTdHViLnByb3RvdHlwZS5vbk1lZGlhU3RhdHVzVXBkYXRlZCA9IGZ1bmN0aW9uKHN0YXR1cykgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uTWVkaWFTdGF0dXNVcGRhdGVkICYmIHRoaXMuZGVsZWdhdGVfLm9uTWVkaWFTdGF0dXNVcGRhdGVkKHN0YXR1cyk7CiAgfQoKICBNZWRpYVN0YXR1c09ic2VydmVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9QYXJhbXMpOwogICAgICB0aGlzLm9uTWVkaWFTdGF0dXNVcGRhdGVkKHBhcmFtcy5zdGF0dXMpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBNZWRpYVN0YXR1c09ic2VydmVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0V2l0aFJlc3BvbmRlciA9CiAgICAgIGZ1bmN0aW9uKG1lc3NhZ2UsIHJlc3BvbmRlcikgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiB2YWxpZGF0ZU1lZGlhU3RhdHVzT2JzZXJ2ZXJSZXF1ZXN0KG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlOwogICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWVkaWFTdGF0dXNPYnNlcnZlcl9Pbk1lZGlhU3RhdHVzVXBkYXRlZF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1lZGlhU3RhdHVzT2JzZXJ2ZXJfT25NZWRpYVN0YXR1c1VwZGF0ZWRfUGFyYW1zOwogICAgICBicmVhazsKICAgIH0KICAgIGlmIChwYXJhbXNDbGFzcyA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIHJldHVybiBwYXJhbXNDbGFzcy52YWxpZGF0ZShtZXNzYWdlVmFsaWRhdG9yLCBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2UuZ2V0SGVhZGVyTnVtQnl0ZXMoKSk7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZU1lZGlhU3RhdHVzT2JzZXJ2ZXJSZXNwb25zZShtZXNzYWdlVmFsaWRhdG9yKSB7CiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH0KCiAgdmFyIE1lZGlhU3RhdHVzT2JzZXJ2ZXIgPSB7CiAgICBuYW1lOiAnbWVkaWFfcm91dGVyLm1vam9tLk1lZGlhU3RhdHVzT2JzZXJ2ZXInLAogICAga1ZlcnNpb246IDAsCiAgICBwdHJDbGFzczogTWVkaWFTdGF0dXNPYnNlcnZlclB0ciwKICAgIHByb3h5Q2xhc3M6IE1lZGlhU3RhdHVzT2JzZXJ2ZXJQcm94eSwKICAgIHN0dWJDbGFzczogTWVkaWFTdGF0dXNPYnNlcnZlclN0dWIsCiAgICB2YWxpZGF0ZVJlcXVlc3Q6IHZhbGlkYXRlTWVkaWFTdGF0dXNPYnNlcnZlclJlcXVlc3QsCiAgICB2YWxpZGF0ZVJlc3BvbnNlOiBudWxsLAogIH07CiAgTWVkaWFTdGF0dXNPYnNlcnZlclN0dWIucHJvdG90eXBlLnZhbGlkYXRvciA9IHZhbGlkYXRlTWVkaWFTdGF0dXNPYnNlcnZlclJlcXVlc3Q7CiAgTWVkaWFTdGF0dXNPYnNlcnZlclByb3h5LnByb3RvdHlwZS52YWxpZGF0b3IgPSBudWxsOwogIGV4cG9ydHMuTWVkaWFTdGF0dXMgPSBNZWRpYVN0YXR1czsKICBleHBvcnRzLkhhbmdvdXRzTWVkaWFTdGF0dXNFeHRyYURhdGEgPSBIYW5nb3V0c01lZGlhU3RhdHVzRXh0cmFEYXRhOwogIGV4cG9ydHMuTWVkaWFTdGF0dXNPYnNlcnZlciA9IE1lZGlhU3RhdHVzT2JzZXJ2ZXI7CiAgZXhwb3J0cy5NZWRpYVN0YXR1c09ic2VydmVyUHRyID0gTWVkaWFTdGF0dXNPYnNlcnZlclB0cjsKICBleHBvcnRzLk1lZGlhU3RhdHVzT2JzZXJ2ZXJBc3NvY2lhdGVkUHRyID0gTWVkaWFTdGF0dXNPYnNlcnZlckFzc29jaWF0ZWRQdHI7Cn0pKCk7Ly8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICdtb2pvL3B1YmxpYy9tb2pvbS9iYXNlL3RpbWUubW9qb20nOwogIGlmIChtb2pvLmludGVybmFsLmlzTW9qb21Mb2FkZWQobW9qb21JZCkpIHsKICAgIGNvbnNvbGUud2FybignVGhlIGZvbGxvd2luZyBtb2pvbSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXM6ICcgKyBtb2pvbUlkKTsKICAgIHJldHVybjsKICB9CiAgbW9qby5pbnRlcm5hbC5tYXJrTW9qb21Mb2FkZWQobW9qb21JZCk7CiAgdmFyIGJpbmRpbmdzID0gbW9qbzsKICB2YXIgYXNzb2NpYXRlZEJpbmRpbmdzID0gbW9qbzsKICB2YXIgY29kZWMgPSBtb2pvLmludGVybmFsOwogIHZhciB2YWxpZGF0b3IgPSBtb2pvLmludGVybmFsOwoKICB2YXIgZXhwb3J0cyA9IG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCdtb2pvQmFzZS5tb2pvbScpOwoKCgogIGZ1bmN0aW9uIFRpbWUodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBUaW1lLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmludGVybmFsVmFsdWUgPSAwOwogIH07CiAgVGltZS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIFRpbWUudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIFRpbWUuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIFRpbWUuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgVGltZSgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuaW50ZXJuYWxWYWx1ZSA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDY0KTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgVGltZS5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKFRpbWUuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDY0LCB2YWwuaW50ZXJuYWxWYWx1ZSk7CiAgfTsKICBmdW5jdGlvbiBUaW1lRGVsdGEodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBUaW1lRGVsdGEucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWljcm9zZWNvbmRzID0gMDsKICB9OwogIFRpbWVEZWx0YS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIFRpbWVEZWx0YS52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgVGltZURlbHRhLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBUaW1lRGVsdGEuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgVGltZURlbHRhKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5taWNyb3NlY29uZHMgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQ2NCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIFRpbWVEZWx0YS5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKFRpbWVEZWx0YS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50NjQsIHZhbC5taWNyb3NlY29uZHMpOwogIH07CiAgZnVuY3Rpb24gVGltZVRpY2tzKHZhbHVlcykgewogICAgdGhpcy5pbml0RGVmYXVsdHNfKCk7CiAgICB0aGlzLmluaXRGaWVsZHNfKHZhbHVlcyk7CiAgfQoKCiAgVGltZVRpY2tzLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmludGVybmFsVmFsdWUgPSAwOwogIH07CiAgVGltZVRpY2tzLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgVGltZVRpY2tzLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBUaW1lVGlja3MuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIFRpbWVUaWNrcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBUaW1lVGlja3MoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmludGVybmFsVmFsdWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQ2NCk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIFRpbWVUaWNrcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKFRpbWVUaWNrcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuSW50NjQsIHZhbC5pbnRlcm5hbFZhbHVlKTsKICB9OwogIGV4cG9ydHMuVGltZSA9IFRpbWU7CiAgZXhwb3J0cy5UaW1lRGVsdGEgPSBUaW1lRGVsdGE7CiAgZXhwb3J0cy5UaW1lVGlja3MgPSBUaW1lVGlja3M7Cn0pKCk7Ly8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICduZXQvaW50ZXJmYWNlcy9pcF9hZGRyZXNzLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbmV0LmludGVyZmFjZXMnKTsKCgoKICBmdW5jdGlvbiBJUEFkZHJlc3ModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBJUEFkZHJlc3MucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuYWRkcmVzc0J5dGVzID0gbnVsbDsKICB9OwogIElQQWRkcmVzcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIElQQWRkcmVzcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIElQQWRkcmVzcy5hZGRyZXNzQnl0ZXMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCAxLCBjb2RlYy5VaW50OCwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIElQQWRkcmVzcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgSVBBZGRyZXNzLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IElQQWRkcmVzcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuYWRkcmVzc0J5dGVzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIoY29kZWMuVWludDgpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBJUEFkZHJlc3MuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihJUEFkZHJlc3MuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4LCB2YWwuYWRkcmVzc0J5dGVzKTsKICB9OwogIGV4cG9ydHMuSVBBZGRyZXNzID0gSVBBZGRyZXNzOwp9KSgpOy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vam9tSWQgPSAnbmV0L2ludGVyZmFjZXMvaXBfZW5kcG9pbnQubW9qb20nOwogIGlmIChtb2pvLmludGVybmFsLmlzTW9qb21Mb2FkZWQobW9qb21JZCkpIHsKICAgIGNvbnNvbGUud2FybignVGhlIGZvbGxvd2luZyBtb2pvbSBpcyBsb2FkZWQgbXVsdGlwbGUgdGltZXM6ICcgKyBtb2pvbUlkKTsKICAgIHJldHVybjsKICB9CiAgbW9qby5pbnRlcm5hbC5tYXJrTW9qb21Mb2FkZWQobW9qb21JZCk7CiAgdmFyIGJpbmRpbmdzID0gbW9qbzsKICB2YXIgYXNzb2NpYXRlZEJpbmRpbmdzID0gbW9qbzsKICB2YXIgY29kZWMgPSBtb2pvLmludGVybmFsOwogIHZhciB2YWxpZGF0b3IgPSBtb2pvLmludGVybmFsOwoKICB2YXIgZXhwb3J0cyA9IG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCduZXQuaW50ZXJmYWNlcycpOwogIHZhciBpcF9hZGRyZXNzJCA9CiAgICAgIG1vam8uaW50ZXJuYWwuZXhwb3NlTmFtZXNwYWNlKCduZXQuaW50ZXJmYWNlcycpOwogIGlmIChtb2pvLmNvbmZpZy5hdXRvTG9hZE1vam9tRGVwcykgewogICAgbW9qby5pbnRlcm5hbC5sb2FkTW9qb21JZk5lY2Vzc2FyeSgKICAgICAgICAnbmV0L2ludGVyZmFjZXMvaXBfYWRkcmVzcy5tb2pvbScsICdpcF9hZGRyZXNzLm1vam9tLmpzJyk7CiAgfQoKCgogIGZ1bmN0aW9uIElQRW5kUG9pbnQodmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBJUEVuZFBvaW50LnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmFkZHJlc3MgPSBudWxsOwogICAgdGhpcy5wb3J0ID0gMDsKICB9OwogIElQRW5kUG9pbnQucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBJUEVuZFBvaW50LnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDI0fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgSVBFbmRQb2ludC5hZGRyZXNzCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIGlwX2FkZHJlc3MkLklQQWRkcmVzcywgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgSVBFbmRQb2ludC5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMTY7CgogIElQRW5kUG9pbnQuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgSVBFbmRQb2ludCgpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwuYWRkcmVzcyA9IGRlY29kZXIuZGVjb2RlU3RydWN0UG9pbnRlcihpcF9hZGRyZXNzJC5JUEFkZHJlc3MpOwogICAgdmFsLnBvcnQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5VaW50MTYpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBJUEVuZFBvaW50LmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoSVBFbmRQb2ludC5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3RQb2ludGVyKGlwX2FkZHJlc3MkLklQQWRkcmVzcywgdmFsLmFkZHJlc3MpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuVWludDE2LCB2YWwucG9ydCk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBleHBvcnRzLklQRW5kUG9pbnQgPSBJUEVuZFBvaW50Owp9KSgpOy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vam9tSWQgPSAndXJsL21vam9tL29yaWdpbi5tb2pvbSc7CiAgaWYgKG1vam8uaW50ZXJuYWwuaXNNb2pvbUxvYWRlZChtb2pvbUlkKSkgewogICAgY29uc29sZS53YXJuKCdUaGUgZm9sbG93aW5nIG1vam9tIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lczogJyArIG1vam9tSWQpOwogICAgcmV0dXJuOwogIH0KICBtb2pvLmludGVybmFsLm1hcmtNb2pvbUxvYWRlZChtb2pvbUlkKTsKICB2YXIgYmluZGluZ3MgPSBtb2pvOwogIHZhciBhc3NvY2lhdGVkQmluZGluZ3MgPSBtb2pvOwogIHZhciBjb2RlYyA9IG1vam8uaW50ZXJuYWw7CiAgdmFyIHZhbGlkYXRvciA9IG1vam8uaW50ZXJuYWw7CgogIHZhciBleHBvcnRzID0gbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ3VybC5tb2pvbScpOwoKCgogIGZ1bmN0aW9uIE9yaWdpbih2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE9yaWdpbi5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5zY2hlbWUgPSBudWxsOwogICAgdGhpcy5ob3N0ID0gbnVsbDsKICAgIHRoaXMucG9ydCA9IDA7CiAgICB0aGlzLnVuaXF1ZSA9IGZhbHNlOwogIH07CiAgT3JpZ2luLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgT3JpZ2luLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDMyfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgT3JpZ2luLnNjaGVtZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBPcmlnaW4uaG9zdAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBPcmlnaW4uZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDI0OwoKICBPcmlnaW4uZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgT3JpZ2luKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5zY2hlbWUgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLmhvc3QgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgdmFsLnBvcnQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5VaW50MTYpOwogICAgcGFja2VkID0gZGVjb2Rlci5yZWFkVWludDgoKTsKICAgIHZhbC51bmlxdWUgPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIGRlY29kZXIuc2tpcCgxKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgT3JpZ2luLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoT3JpZ2luLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5TdHJpbmcsIHZhbC5zY2hlbWUpOwogICAgZW5jb2Rlci5lbmNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nLCB2YWwuaG9zdCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5VaW50MTYsIHZhbC5wb3J0KTsKICAgIHBhY2tlZCA9IDA7CiAgICBwYWNrZWQgfD0gKHZhbC51bmlxdWUgJiAxKSA8PCAwCiAgICBlbmNvZGVyLndyaXRlVWludDgocGFja2VkKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGV4cG9ydHMuT3JpZ2luID0gT3JpZ2luOwp9KSgpOy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCgondXNlIHN0cmljdCc7CgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vam9tSWQgPSAndXJsL21vam9tL3VybC5tb2pvbSc7CiAgaWYgKG1vam8uaW50ZXJuYWwuaXNNb2pvbUxvYWRlZChtb2pvbUlkKSkgewogICAgY29uc29sZS53YXJuKCdUaGUgZm9sbG93aW5nIG1vam9tIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lczogJyArIG1vam9tSWQpOwogICAgcmV0dXJuOwogIH0KICBtb2pvLmludGVybmFsLm1hcmtNb2pvbUxvYWRlZChtb2pvbUlkKTsKICB2YXIgYmluZGluZ3MgPSBtb2pvOwogIHZhciBhc3NvY2lhdGVkQmluZGluZ3MgPSBtb2pvOwogIHZhciBjb2RlYyA9IG1vam8uaW50ZXJuYWw7CiAgdmFyIHZhbGlkYXRvciA9IG1vam8uaW50ZXJuYWw7CgogIHZhciBleHBvcnRzID0gbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ3VybC5tb2pvbScpOwoKCgogIGZ1bmN0aW9uIFVybCh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIFVybC5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy51cmwgPSBudWxsOwogIH07CiAgVXJsLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgVXJsLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgVXJsLnVybAogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cmluZ1BvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCBmYWxzZSkKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgVXJsLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBVcmwuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgVXJsKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC51cmwgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5TdHJpbmcpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBVcmwuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihVcmwuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLnVybCk7CiAgfTsKICBleHBvcnRzLlVybCA9IFVybDsKfSkoKTsvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQovLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgoKJ3VzZSBzdHJpY3QnOwoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2pvbUlkID0gJ21lZGlhL21vam8vaW50ZXJmYWNlcy9taXJyb3Jfc2VydmljZV9yZW1vdGluZy5tb2pvbSc7CiAgaWYgKG1vam8uaW50ZXJuYWwuaXNNb2pvbUxvYWRlZChtb2pvbUlkKSkgewogICAgY29uc29sZS53YXJuKCdUaGUgZm9sbG93aW5nIG1vam9tIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lczogJyArIG1vam9tSWQpOwogICAgcmV0dXJuOwogIH0KICBtb2pvLmludGVybmFsLm1hcmtNb2pvbUxvYWRlZChtb2pvbUlkKTsKICB2YXIgYmluZGluZ3MgPSBtb2pvOwogIHZhciBhc3NvY2lhdGVkQmluZGluZ3MgPSBtb2pvOwogIHZhciBjb2RlYyA9IG1vam8uaW50ZXJuYWw7CiAgdmFyIHZhbGlkYXRvciA9IG1vam8uaW50ZXJuYWw7CgogIHZhciBleHBvcnRzID0gbW9qby5pbnRlcm5hbC5leHBvc2VOYW1lc3BhY2UoJ21lZGlhLm1vam9tJyk7CiAgdmFyIHJlbW90aW5nX2NvbW1vbiQgPQogICAgICBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWEubW9qb20nKTsKICBpZiAobW9qby5jb25maWcuYXV0b0xvYWRNb2pvbURlcHMpIHsKICAgIG1vam8uaW50ZXJuYWwubG9hZE1vam9tSWZOZWNlc3NhcnkoCiAgICAgICAgJ21lZGlhL21vam8vaW50ZXJmYWNlcy9yZW1vdGluZ19jb21tb24ubW9qb20nLCAncmVtb3RpbmdfY29tbW9uLm1vam9tLmpzJyk7CiAgfQoKCgogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogIH07CiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDh9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwOwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgfTsKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmhhc0F1ZGlvID0gZmFsc2U7CiAgICB0aGlzLmhhc1ZpZGVvID0gZmFsc2U7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHBhY2tlZCA9IGRlY29kZXIucmVhZFVpbnQ4KCk7CiAgICB2YWwuaGFzQXVkaW8gPSAocGFja2VkID4+IDApICYgMSA/IHRydWUgOiBmYWxzZTsKICAgIHZhbC5oYXNWaWRlbyA9IChwYWNrZWQgPj4gMSkgJiAxID8gdHJ1ZSA6IGZhbHNlOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBwYWNrZWQgPSAwOwogICAgcGFja2VkIHw9ICh2YWwuaGFzQXVkaW8gJiAxKSA8PCAwCiAgICBwYWNrZWQgfD0gKHZhbC5oYXNWaWRlbyAmIDEpIDw8IDEKICAgIGVuY29kZXIud3JpdGVVaW50OChwYWNrZWQpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogICAgZW5jb2Rlci5za2lwKDEpOwogIH07CiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuYXVkaW9TdHJlYW1JZCA9IDA7CiAgICB0aGlzLnZpZGVvU3RyZWFtSWQgPSAwOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLmF1ZGlvU3RyZWFtSWQgPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICB2YWwudmlkZW9TdHJlYW1JZCA9IGRlY29kZXIuZGVjb2RlU3RydWN0KGNvZGVjLkludDMyKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwuYXVkaW9TdHJlYW1JZCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnZpZGVvU3RyZWFtSWQpOwogIH07CiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5yZWFzb24gPSAwOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIC8vIHZhbGlkYXRlIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zLnJlYXNvbgogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUVudW0ob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCByZW1vdGluZ19jb21tb24kLlJlbW90aW5nU3RvcFJlYXNvbik7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwucmVhc29uID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuSW50MzIpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgZGVjb2Rlci5za2lwKDEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdChjb2RlYy5JbnQzMiwgdmFsLnJlYXNvbik7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgICBlbmNvZGVyLnNraXAoMSk7CiAgfTsKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubWVzc2FnZSA9IG51bGw7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMucHJvdG90eXBlLmluaXRGaWVsZHNfID0gZnVuY3Rpb24oZmllbGRzKSB7CiAgICBmb3IodmFyIGZpZWxkIGluIGZpZWxkcykgewogICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGZpZWxkKSkKICAgICAgICAgIHRoaXNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMubWVzc2FnZQogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIDEsIGNvZGVjLlVpbnQ4LCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5tZXNzYWdlID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIoY29kZWMuVWludDgpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4LCB2YWwubWVzc2FnZSk7CiAgfTsKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDh9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDA7CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcy5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogIH07CiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMucHJvdG90eXBlLmluaXREZWZhdWx0c18gPSBmdW5jdGlvbigpIHsKICAgIHRoaXMucmF0ZSA9IDA7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcy52YWxpZGF0ZSA9IGZ1bmN0aW9uKG1lc3NhZ2VWYWxpZGF0b3IsIG9mZnNldCkgewogICAgdmFyIGVycjsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RIZWFkZXIob2Zmc2V0LCBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICB2YXIga1ZlcnNpb25TaXplcyA9IFsKICAgICAge3ZlcnNpb246IDAsIG51bUJ5dGVzOiAxNn0KICAgIF07CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0VmVyc2lvbihvZmZzZXQsIGtWZXJzaW9uU2l6ZXMpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcy5kZWNvZGUgPSBmdW5jdGlvbihkZWNvZGVyKSB7CiAgICB2YXIgcGFja2VkOwogICAgdmFyIHZhbCA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1Jlc3BvbnNlUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yYXRlID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuRG91YmxlKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkRvdWJsZSwgdmFsLnJhdGUpOwogIH07CiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5tZXRhZGF0YSA9IG51bGw7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMubWV0YWRhdGEKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMCwgcmVtb3RpbmdfY29tbW9uJC5SZW1vdGluZ1NpbmtNZXRhZGF0YSwgZmFsc2UpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcy5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgODsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMoKTsKICAgIHZhciBudW1iZXJPZkJ5dGVzID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YXIgdmVyc2lvbiA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFsLm1ldGFkYXRhID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3RQb2ludGVyKHJlbW90aW5nX2NvbW1vbiQuUmVtb3RpbmdTaW5rTWV0YWRhdGEpOwogICAgcmV0dXJuIHZhbDsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgICBlbmNvZGVyLmVuY29kZVN0cnVjdFBvaW50ZXIocmVtb3RpbmdfY29tbW9uJC5SZW1vdGluZ1NpbmtNZXRhZGF0YSwgdmFsLm1ldGFkYXRhKTsKICB9OwogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXModmFsdWVzKSB7CiAgICB0aGlzLmluaXREZWZhdWx0c18oKTsKICAgIHRoaXMuaW5pdEZpZWxkc18odmFsdWVzKTsKICB9CgoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLm1lc3NhZ2UgPSBudWxsOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMudmFsaWRhdGUgPSBmdW5jdGlvbihtZXNzYWdlVmFsaWRhdG9yLCBvZmZzZXQpIHsKICAgIHZhciBlcnI7CiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlU3RydWN0SGVhZGVyKG9mZnNldCwgY29kZWMua1N0cnVjdEhlYWRlclNpemUpOwogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgdmFyIGtWZXJzaW9uU2l6ZXMgPSBbCiAgICAgIHt2ZXJzaW9uOiAwLCBudW1CeXRlczogMTZ9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLm1lc3NhZ2UKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCAxLCBjb2RlYy5VaW50OCwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcygpOwogICAgdmFyIG51bWJlck9mQnl0ZXMgPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhciB2ZXJzaW9uID0gZGVjb2Rlci5yZWFkVWludDMyKCk7CiAgICB2YWwubWVzc2FnZSA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4KTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtcy5lbmNvZGUgPSBmdW5jdGlvbihlbmNvZGVyLCB2YWwpIHsKICAgIHZhciBwYWNrZWQ7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlQXJyYXlQb2ludGVyKGNvZGVjLlVpbnQ4LCB2YWwubWVzc2FnZSk7CiAgfTsKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnJlYXNvbiA9IDA7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcy5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDE2fQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMucmVhc29uCiAgICBlcnIgPSBtZXNzYWdlVmFsaWRhdG9yLnZhbGlkYXRlRW51bShvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDAsIHJlbW90aW5nX2NvbW1vbiQuUmVtb3RpbmdTdG9wUmVhc29uKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMuZW5jb2RlZFNpemUgPSBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDg7CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5yZWFzb24gPSBkZWNvZGVyLmRlY29kZVN0cnVjdChjb2RlYy5JbnQzMik7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICBkZWNvZGVyLnNraXAoMSk7CiAgICByZXR1cm4gdmFsOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMuZW5jb2RlZFNpemUpOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMigwKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLkludDMyLCB2YWwucmVhc29uKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICAgIGVuY29kZXIuc2tpcCgxKTsKICB9OwogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcyh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcy5wcm90b3R5cGUuaW5pdERlZmF1bHRzXyA9IGZ1bmN0aW9uKCkgewogIH07CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zLnByb3RvdHlwZS5pbml0RmllbGRzXyA9IGZ1bmN0aW9uKGZpZWxkcykgewogICAgZm9yKHZhciBmaWVsZCBpbiBmaWVsZHMpIHsKICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpCiAgICAgICAgICB0aGlzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07CiAgICB9CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDh9CiAgICBdOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdFZlcnNpb24ob2Zmc2V0LCBrVmVyc2lvblNpemVzKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zLmVuY29kZWRTaXplID0gY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwOwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9QYXJhbXMuZGVjb2RlID0gZnVuY3Rpb24oZGVjb2RlcikgewogICAgdmFyIHBhY2tlZDsKICAgIHZhciB2YWwgPSBuZXcgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zLmVuY29kZSA9IGZ1bmN0aW9uKGVuY29kZXIsIHZhbCkgewogICAgdmFyIHBhY2tlZDsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zLmVuY29kZWRTaXplKTsKICAgIGVuY29kZXIud3JpdGVVaW50MzIoMCk7CiAgfTsKICB2YXIga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X05hbWUgPSAxNTA3Nzg2MDI5OwogIHZhciBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19OYW1lID0gNTIzODM0NDYwOwogIHZhciBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9OYW1lID0gNzA2NDI5ODU3OwogIHZhciBrTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfTmFtZSA9IDMzMDgyOTkxMDsKICB2YXIga01pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfTmFtZSA9IDQ5MjEyNDYxODsKCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJQdHIoaGFuZGxlT3JQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBiaW5kaW5ncy5JbnRlcmZhY2VQdHJDb250cm9sbGVyKE1pcnJvclNlcnZpY2VSZW1vdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPclB0ckluZm8pOwogIH0KCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJBc3NvY2lhdGVkUHRyKGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKSB7CiAgICB0aGlzLnB0ciA9IG5ldyBhc3NvY2lhdGVkQmluZGluZ3MuQXNzb2NpYXRlZEludGVyZmFjZVB0ckNvbnRyb2xsZXIoCiAgICAgICAgTWlycm9yU2VydmljZVJlbW90ZXIsIGFzc29jaWF0ZWRJbnRlcmZhY2VQdHJJbmZvKTsKICB9CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUgPQogICAgICBPYmplY3QuY3JlYXRlKE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLnByb3RvdHlwZSk7CiAgTWlycm9yU2VydmljZVJlbW90ZXJBc3NvY2lhdGVkUHRyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9CiAgICAgIE1pcnJvclNlcnZpY2VSZW1vdGVyQXNzb2NpYXRlZFB0cjsKCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJQcm94eShyZWNlaXZlcikgewogICAgdGhpcy5yZWNlaXZlcl8gPSByZWNlaXZlcjsKICB9CiAgTWlycm9yU2VydmljZVJlbW90ZXJQdHIucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUuc3RhcnQKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zKCk7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnRfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLnByb3RvdHlwZS5zdGFydERhdGFTdHJlYW1zID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUuc3RhcnREYXRhU3RyZWFtcwogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLnN0YXJ0RGF0YVN0cmVhbXMgPSBmdW5jdGlvbihoYXNBdWRpbywgaGFzVmlkZW8pIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zKCk7CiAgICBwYXJhbXNfLmhhc0F1ZGlvID0gaGFzQXVkaW87CiAgICBwYXJhbXNfLmhhc1ZpZGVvID0gaGFzVmlkZW87CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1BhcmFtcywgcGFyYW1zXyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclB0ci5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLnN0b3AKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclByb3h5LnByb3RvdHlwZS5zdG9wID0gZnVuY3Rpb24ocmVhc29uKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX1BhcmFtcygpOwogICAgcGFyYW1zXy5yZWFzb24gPSByZWFzb247CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX05hbWUsCiAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXMuZW5jb2RlZFNpemUpKTsKICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLnByb3RvdHlwZS5zZW5kTWVzc2FnZVRvU2luayA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLnNlbmRNZXNzYWdlVG9TaW5rCiAgICAgICAgLmFwcGx5KHRoaXMucHRyLmdldFByb3h5KCksIGFyZ3VtZW50cyk7CiAgfTsKCiAgTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUuc2VuZE1lc3NhZ2VUb1NpbmsgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICB2YXIgcGFyYW1zXyA9IG5ldyBNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19QYXJhbXMoKTsKICAgIHBhcmFtc18ubWVzc2FnZSA9IG1lc3NhZ2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfU2VuZE1lc3NhZ2VUb1NpbmtfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLnByb3RvdHlwZS5lc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUuZXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyUHJveHkucHJvdG90eXBlLmVzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHkgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUGFyYW1zKCk7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICBrTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9OYW1lLAogICAgICAgICAgY29kZWMuYWxpZ24oTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgY29kZWMua01lc3NhZ2VFeHBlY3RzUmVzcG9uc2UsIDApOwogICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcywgcGFyYW1zXyk7CiAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0QW5kRXhwZWN0UmVzcG9uc2UobWVzc2FnZSkudGhlbihmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgICAgIHZhciByZXNwb25zZVBhcmFtcyA9CiAgICAgICAgICAgIHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcyk7CiAgICAgICAgcmVzb2x2ZShyZXNwb25zZVBhcmFtcyk7CiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIHJlamVjdChFcnJvcigiQ29ubmVjdGlvbiBlcnJvcjogIiArIHJlc3VsdCkpOwogICAgICB9KTsKICAgIH0uYmluZCh0aGlzKSk7CiAgfTsKCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90ZXJTdHViKGRlbGVnYXRlKSB7CiAgICB0aGlzLmRlbGVnYXRlXyA9IGRlbGVnYXRlOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWIucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RhcnQgJiYgdGhpcy5kZWxlZ2F0ZV8uc3RhcnQoKTsKICB9CiAgTWlycm9yU2VydmljZVJlbW90ZXJTdHViLnByb3RvdHlwZS5zdGFydERhdGFTdHJlYW1zID0gZnVuY3Rpb24oaGFzQXVkaW8sIGhhc1ZpZGVvKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8uc3RhcnREYXRhU3RyZWFtcyAmJiB0aGlzLmRlbGVnYXRlXy5zdGFydERhdGFTdHJlYW1zKGhhc0F1ZGlvLCBoYXNWaWRlbyk7CiAgfQogIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1Yi5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKHJlYXNvbikgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnN0b3AgJiYgdGhpcy5kZWxlZ2F0ZV8uc3RvcChyZWFzb24pOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWIucHJvdG90eXBlLnNlbmRNZXNzYWdlVG9TaW5rID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLnNlbmRNZXNzYWdlVG9TaW5rICYmIHRoaXMuZGVsZWdhdGVfLnNlbmRNZXNzYWdlVG9TaW5rKG1lc3NhZ2UpOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWIucHJvdG90eXBlLmVzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5lc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5ICYmIHRoaXMuZGVsZWdhdGVfLmVzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHkoKTsKICB9CgogIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1Yi5wcm90b3R5cGUuYWNjZXB0ID0gZnVuY3Rpb24obWVzc2FnZSkgewogICAgdmFyIHJlYWRlciA9IG5ldyBjb2RlYy5NZXNzYWdlUmVhZGVyKG1lc3NhZ2UpOwogICAgc3dpdGNoIChyZWFkZXIubWVzc2FnZU5hbWUpIHsKICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtcyk7CiAgICAgIHRoaXMuc3RhcnQoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0b3BfUGFyYW1zKTsKICAgICAgdGhpcy5zdG9wKHBhcmFtcy5yZWFzb24pOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtcyk7CiAgICAgIHRoaXMuc2VuZE1lc3NhZ2VUb1NpbmsocGFyYW1zLm1lc3NhZ2UpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RlclN0dWIucHJvdG90eXBlLmFjY2VwdFdpdGhSZXNwb25kZXIgPQogICAgICBmdW5jdGlvbihtZXNzYWdlLCByZXNwb25kZXIpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUGFyYW1zKTsKICAgICAgdGhpcy5zdGFydERhdGFTdHJlYW1zKHBhcmFtcy5oYXNBdWRpbywgcGFyYW1zLmhhc1ZpZGVvKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgdmFyIHJlc3BvbnNlUGFyYW1zID0KICAgICAgICAgICAgbmV3IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXMoKTsKICAgICAgICByZXNwb25zZVBhcmFtcy5hdWRpb1N0cmVhbUlkID0gcmVzcG9uc2UuYXVkaW9TdHJlYW1JZDsKICAgICAgICByZXNwb25zZVBhcmFtcy52aWRlb1N0cmVhbUlkID0gcmVzcG9uc2UudmlkZW9TdHJlYW1JZDsKICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjFCdWlsZGVyKAogICAgICAgICAgICBrTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19OYW1lLAogICAgICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zLmVuY29kZWRTaXplKSwKICAgICAgICAgICAgY29kZWMua01lc3NhZ2VJc1Jlc3BvbnNlLCByZWFkZXIucmVxdWVzdElEKTsKICAgICAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydERhdGFTdHJlYW1zX1Jlc3BvbnNlUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1zKTsKICAgICAgICB2YXIgbWVzc2FnZSA9IGJ1aWxkZXIuZmluaXNoKCk7CiAgICAgICAgcmVzcG9uZGVyLmFjY2VwdChtZXNzYWdlKTsKICAgICAgfSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X1BhcmFtcyk7CiAgICAgIHRoaXMuZXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eSgpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICB2YXIgcmVzcG9uc2VQYXJhbXMgPQogICAgICAgICAgICBuZXcgTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9SZXNwb25zZVBhcmFtcygpOwogICAgICAgIHJlc3BvbnNlUGFyYW1zLnJhdGUgPSByZXNwb25zZS5yYXRlOwogICAgICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMUJ1aWxkZXIoCiAgICAgICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9Fc3RpbWF0ZVRyYW5zbWlzc2lvbkNhcGFjaXR5X05hbWUsCiAgICAgICAgICAgIGNvZGVjLmFsaWduKE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMuZW5jb2RlZFNpemUpLAogICAgICAgICAgICBjb2RlYy5rTWVzc2FnZUlzUmVzcG9uc2UsIHJlYWRlci5yZXF1ZXN0SUQpOwogICAgICAgIGJ1aWxkZXIuZW5jb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbXMpOwogICAgICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgICAgICByZXNwb25kZXIuYWNjZXB0KG1lc3NhZ2UpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RlclJlcXVlc3QobWVzc2FnZVZhbGlkYXRvcikgewogICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2U7CiAgICB2YXIgcGFyYW1zQ2xhc3MgPSBudWxsOwogICAgc3dpdGNoIChtZXNzYWdlLmdldE5hbWUoKSkgewogICAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdGFydF9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0X1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90ZXJfU3RhcnREYXRhU3RyZWFtc19QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TdG9wX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90ZXJfU3RvcF9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3Rlcl9TZW5kTWVzc2FnZVRvU2lua19OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGVyX1NlbmRNZXNzYWdlVG9TaW5rX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90ZXJfRXN0aW1hdGVUcmFuc21pc3Npb25DYXBhY2l0eV9QYXJhbXM7CiAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKHBhcmFtc0NsYXNzID09PSBudWxsKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwogICAgcmV0dXJuIHBhcmFtc0NsYXNzLnZhbGlkYXRlKG1lc3NhZ2VWYWxpZGF0b3IsIG1lc3NhZ2VWYWxpZGF0b3IubWVzc2FnZS5nZXRIZWFkZXJOdW1CeXRlcygpKTsKICB9CgogIGZ1bmN0aW9uIHZhbGlkYXRlTWlycm9yU2VydmljZVJlbW90ZXJSZXNwb25zZShtZXNzYWdlVmFsaWRhdG9yKSB7CiAgIHZhciBtZXNzYWdlID0gbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlOwogICB2YXIgcGFyYW1zQ2xhc3MgPSBudWxsOwogICBzd2l0Y2ggKG1lc3NhZ2UuZ2V0TmFtZSgpKSB7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGVyX1N0YXJ0RGF0YVN0cmVhbXNfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfTmFtZToKICAgICAgICBpZiAobWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGVyX0VzdGltYXRlVHJhbnNtaXNzaW9uQ2FwYWNpdHlfUmVzcG9uc2VQYXJhbXM7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAocGFyYW1zQ2xhc3MgPT09IG51bGwpCiAgICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgICByZXR1cm4gcGFyYW1zQ2xhc3MudmFsaWRhdGUobWVzc2FnZVZhbGlkYXRvciwgbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlLmdldEhlYWRlck51bUJ5dGVzKCkpOwogIH0KCiAgdmFyIE1pcnJvclNlcnZpY2VSZW1vdGVyID0gewogICAgbmFtZTogJ21lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGVyJywKICAgIGtWZXJzaW9uOiAwLAogICAgcHRyQ2xhc3M6IE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyLAogICAgcHJveHlDbGFzczogTWlycm9yU2VydmljZVJlbW90ZXJQcm94eSwKICAgIHN0dWJDbGFzczogTWlycm9yU2VydmljZVJlbW90ZXJTdHViLAogICAgdmFsaWRhdGVSZXF1ZXN0OiB2YWxpZGF0ZU1pcnJvclNlcnZpY2VSZW1vdGVyUmVxdWVzdCwKICAgIHZhbGlkYXRlUmVzcG9uc2U6IHZhbGlkYXRlTWlycm9yU2VydmljZVJlbW90ZXJSZXNwb25zZSwKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGVyU3R1Yi5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RlclJlcXVlc3Q7CiAgTWlycm9yU2VydmljZVJlbW90ZXJQcm94eS5wcm90b3R5cGUudmFsaWRhdG9yID0gdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RlclJlc3BvbnNlOwogIHZhciBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9OYW1lID0gMTkyNTQ3Njk5NzsKICB2YXIga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19OYW1lID0gODQ2ODIyMDI1OwogIHZhciBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9OYW1lID0gOTkxMTQ2Mzg2OwogIHZhciBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfTmFtZSA9IDE1MTc4NDIzMDA7CgogIGZ1bmN0aW9uIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0cihoYW5kbGVPclB0ckluZm8pIHsKICAgIHRoaXMucHRyID0gbmV3IGJpbmRpbmdzLkludGVyZmFjZVB0ckNvbnRyb2xsZXIoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPclB0ckluZm8pOwogIH0KCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQXNzb2NpYXRlZFB0cihhc3NvY2lhdGVkSW50ZXJmYWNlUHRySW5mbykgewogICAgdGhpcy5wdHIgPSBuZXcgYXNzb2NpYXRlZEJpbmRpbmdzLkFzc29jaWF0ZWRJbnRlcmZhY2VQdHJDb250cm9sbGVyKAogICAgICAgIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZSwgYXNzb2NpYXRlZEludGVyZmFjZVB0ckluZm8pOwogIH0KCiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQXNzb2NpYXRlZFB0ci5wcm90b3R5cGUgPQogICAgICBPYmplY3QuY3JlYXRlKE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ci5wcm90b3R5cGUpOwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZUFzc29jaWF0ZWRQdHIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0KICAgICAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQXNzb2NpYXRlZFB0cjsKCiAgZnVuY3Rpb24gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkocmVjZWl2ZXIpIHsKICAgIHRoaXMucmVjZWl2ZXJfID0gcmVjZWl2ZXI7CiAgfQogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ci5wcm90b3R5cGUub25TaW5rQXZhaWxhYmxlID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkucHJvdG90eXBlLm9uU2lua0F2YWlsYWJsZQogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LnByb3RvdHlwZS5vblNpbmtBdmFpbGFibGUgPSBmdW5jdGlvbihtZXRhZGF0YSkgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMoKTsKICAgIHBhcmFtc18ubWV0YWRhdGEgPSBtZXRhZGF0YTsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9QYXJhbXMsIHBhcmFtc18pOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyLnByb3RvdHlwZS5vbk1lc3NhZ2VGcm9tU2luayA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LnByb3RvdHlwZS5vbk1lc3NhZ2VGcm9tU2luawogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LnByb3RvdHlwZS5vbk1lc3NhZ2VGcm9tU2luayA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMoKTsKICAgIHBhcmFtc18ubWVzc2FnZSA9IG1lc3NhZ2U7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLmVuY29kZWRTaXplKSk7CiAgICBidWlsZGVyLmVuY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25NZXNzYWdlRnJvbVNpbmtfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVB0ci5wcm90b3R5cGUub25TdG9wcGVkID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkucHJvdG90eXBlLm9uU3RvcHBlZAogICAgICAgIC5hcHBseSh0aGlzLnB0ci5nZXRQcm94eSgpLCBhcmd1bWVudHMpOwogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVByb3h5LnByb3RvdHlwZS5vblN0b3BwZWQgPSBmdW5jdGlvbihyZWFzb24pIHsKICAgIHZhciBwYXJhbXNfID0gbmV3IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zKCk7CiAgICBwYXJhbXNfLnJlYXNvbiA9IHJlYXNvbjsKICAgIHZhciBidWlsZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VWMEJ1aWxkZXIoCiAgICAgICAga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfTmFtZSwKICAgICAgICBjb2RlYy5hbGlnbihNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU3RvcHBlZF9QYXJhbXMsIHBhcmFtc18pOwogICAgdmFyIG1lc3NhZ2UgPSBidWlsZGVyLmZpbmlzaCgpOwogICAgdGhpcy5yZWNlaXZlcl8uYWNjZXB0KG1lc3NhZ2UpOwogIH07CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHJveHkucHJvdG90eXBlLm9uRXJyb3IKICAgICAgICAuYXBwbHkodGhpcy5wdHIuZ2V0UHJveHkoKSwgYXJndW1lbnRzKTsKICB9OwoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQcm94eS5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmFtc18gPSBuZXcgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zKCk7CiAgICB2YXIgYnVpbGRlciA9IG5ldyBjb2RlYy5NZXNzYWdlVjBCdWlsZGVyKAogICAgICAgIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25FcnJvcl9OYW1lLAogICAgICAgIGNvZGVjLmFsaWduKE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX1BhcmFtcy5lbmNvZGVkU2l6ZSkpOwogICAgYnVpbGRlci5lbmNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zLCBwYXJhbXNfKTsKICAgIHZhciBtZXNzYWdlID0gYnVpbGRlci5maW5pc2goKTsKICAgIHRoaXMucmVjZWl2ZXJfLmFjY2VwdChtZXNzYWdlKTsKICB9OwoKICBmdW5jdGlvbiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViKGRlbGVnYXRlKSB7CiAgICB0aGlzLmRlbGVnYXRlXyA9IGRlbGVnYXRlOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViLnByb3RvdHlwZS5vblNpbmtBdmFpbGFibGUgPSBmdW5jdGlvbihtZXRhZGF0YSkgewogICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVfICYmIHRoaXMuZGVsZWdhdGVfLm9uU2lua0F2YWlsYWJsZSAmJiB0aGlzLmRlbGVnYXRlXy5vblNpbmtBdmFpbGFibGUobWV0YWRhdGEpOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViLnByb3RvdHlwZS5vbk1lc3NhZ2VGcm9tU2luayA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgIHJldHVybiB0aGlzLmRlbGVnYXRlXyAmJiB0aGlzLmRlbGVnYXRlXy5vbk1lc3NhZ2VGcm9tU2luayAmJiB0aGlzLmRlbGVnYXRlXy5vbk1lc3NhZ2VGcm9tU2luayhtZXNzYWdlKTsKICB9CiAgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlU3R1Yi5wcm90b3R5cGUub25TdG9wcGVkID0gZnVuY3Rpb24ocmVhc29uKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25TdG9wcGVkICYmIHRoaXMuZGVsZWdhdGVfLm9uU3RvcHBlZChyZWFzb24pOwogIH0KICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViLnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZV8gJiYgdGhpcy5kZWxlZ2F0ZV8ub25FcnJvciAmJiB0aGlzLmRlbGVnYXRlXy5vbkVycm9yKCk7CiAgfQoKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VTdHViLnByb3RvdHlwZS5hY2NlcHQgPSBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICB2YXIgcmVhZGVyID0gbmV3IGNvZGVjLk1lc3NhZ2VSZWFkZXIobWVzc2FnZSk7CiAgICBzd2l0Y2ggKHJlYWRlci5tZXNzYWdlTmFtZSkgewogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9OYW1lOgogICAgICB2YXIgcGFyYW1zID0gcmVhZGVyLmRlY29kZVN0cnVjdChNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TaW5rQXZhaWxhYmxlX1BhcmFtcyk7CiAgICAgIHRoaXMub25TaW5rQXZhaWxhYmxlKHBhcmFtcy5tZXRhZGF0YSk7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9Pbk1lc3NhZ2VGcm9tU2lua19QYXJhbXMpOwogICAgICB0aGlzLm9uTWVzc2FnZUZyb21TaW5rKHBhcmFtcy5tZXNzYWdlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICBjYXNlIGtNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX05hbWU6CiAgICAgIHZhciBwYXJhbXMgPSByZWFkZXIuZGVjb2RlU3RydWN0KE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfUGFyYW1zKTsKICAgICAgdGhpcy5vblN0b3BwZWQocGFyYW1zLnJlYXNvbik7CiAgICAgIHJldHVybiB0cnVlOwogICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfTmFtZToKICAgICAgdmFyIHBhcmFtcyA9IHJlYWRlci5kZWNvZGVTdHJ1Y3QoTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zKTsKICAgICAgdGhpcy5vbkVycm9yKCk7CiAgICAgIHJldHVybiB0cnVlOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH07CgogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVN0dWIucHJvdG90eXBlLmFjY2VwdFdpdGhSZXNwb25kZXIgPQogICAgICBmdW5jdGlvbihtZXNzYWdlLCByZXNwb25kZXIpIHsKICAgIHZhciByZWFkZXIgPSBuZXcgY29kZWMuTWVzc2FnZVJlYWRlcihtZXNzYWdlKTsKICAgIHN3aXRjaCAocmVhZGVyLm1lc3NhZ2VOYW1lKSB7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VSZXF1ZXN0KG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgIHZhciBtZXNzYWdlID0gbWVzc2FnZVZhbGlkYXRvci5tZXNzYWdlOwogICAgdmFyIHBhcmFtc0NsYXNzID0gbnVsbDsKICAgIHN3aXRjaCAobWVzc2FnZS5nZXROYW1lKCkpIHsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uU2lua0F2YWlsYWJsZV9OYW1lOgogICAgICAgIGlmICghbWVzc2FnZS5leHBlY3RzUmVzcG9uc2UoKSAmJiAhbWVzc2FnZS5pc1Jlc3BvbnNlKCkpCiAgICAgICAgICBwYXJhbXNDbGFzcyA9IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblNpbmtBdmFpbGFibGVfUGFyYW1zOwogICAgICBicmVhazsKICAgICAgY2FzZSBrTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uTWVzc2FnZUZyb21TaW5rX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PblN0b3BwZWRfTmFtZToKICAgICAgICBpZiAoIW1lc3NhZ2UuZXhwZWN0c1Jlc3BvbnNlKCkgJiYgIW1lc3NhZ2UuaXNSZXNwb25zZSgpKQogICAgICAgICAgcGFyYW1zQ2xhc3MgPSBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VfT25TdG9wcGVkX1BhcmFtczsKICAgICAgYnJlYWs7CiAgICAgIGNhc2Uga01pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZV9PbkVycm9yX05hbWU6CiAgICAgICAgaWYgKCFtZXNzYWdlLmV4cGVjdHNSZXNwb25zZSgpICYmICFtZXNzYWdlLmlzUmVzcG9uc2UoKSkKICAgICAgICAgIHBhcmFtc0NsYXNzID0gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlX09uRXJyb3JfUGFyYW1zOwogICAgICBicmVhazsKICAgIH0KICAgIGlmIChwYXJhbXNDbGFzcyA9PT0gbnVsbCkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICAgIHJldHVybiBwYXJhbXNDbGFzcy52YWxpZGF0ZShtZXNzYWdlVmFsaWRhdG9yLCBtZXNzYWdlVmFsaWRhdG9yLm1lc3NhZ2UuZ2V0SGVhZGVyTnVtQnl0ZXMoKSk7CiAgfQoKICBmdW5jdGlvbiB2YWxpZGF0ZU1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVJlc3BvbnNlKG1lc3NhZ2VWYWxpZGF0b3IpIHsKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkU7CiAgfQoKICB2YXIgTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlID0gewogICAgbmFtZTogJ21lZGlhLm1vam9tLk1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZScsCiAgICBrVmVyc2lvbjogMCwKICAgIHB0ckNsYXNzOiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQdHIsCiAgICBwcm94eUNsYXNzOiBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQcm94eSwKICAgIHN0dWJDbGFzczogTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlU3R1YiwKICAgIHZhbGlkYXRlUmVxdWVzdDogdmFsaWRhdGVNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VSZXF1ZXN0LAogICAgdmFsaWRhdGVSZXNwb25zZTogbnVsbCwKICB9OwogIE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZVN0dWIucHJvdG90eXBlLnZhbGlkYXRvciA9IHZhbGlkYXRlTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUmVxdWVzdDsKICBNaXJyb3JTZXJ2aWNlUmVtb3RpbmdTb3VyY2VQcm94eS5wcm90b3R5cGUudmFsaWRhdG9yID0gbnVsbDsKICBleHBvcnRzLk1pcnJvclNlcnZpY2VSZW1vdGVyID0gTWlycm9yU2VydmljZVJlbW90ZXI7CiAgZXhwb3J0cy5NaXJyb3JTZXJ2aWNlUmVtb3RlclB0ciA9IE1pcnJvclNlcnZpY2VSZW1vdGVyUHRyOwogIGV4cG9ydHMuTWlycm9yU2VydmljZVJlbW90ZXJBc3NvY2lhdGVkUHRyID0gTWlycm9yU2VydmljZVJlbW90ZXJBc3NvY2lhdGVkUHRyOwogIGV4cG9ydHMuTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlID0gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlOwogIGV4cG9ydHMuTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyID0gTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlUHRyOwogIGV4cG9ydHMuTWlycm9yU2VydmljZVJlbW90aW5nU291cmNlQXNzb2NpYXRlZFB0ciA9IE1pcnJvclNlcnZpY2VSZW1vdGluZ1NvdXJjZUFzc29jaWF0ZWRQdHI7Cn0pKCk7Ly8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCid1c2Ugc3RyaWN0JzsKCihmdW5jdGlvbigpIHsKICB2YXIgbW9qb21JZCA9ICdtZWRpYS9tb2pvL2ludGVyZmFjZXMvcmVtb3RpbmdfY29tbW9uLm1vam9tJzsKICBpZiAobW9qby5pbnRlcm5hbC5pc01vam9tTG9hZGVkKG1vam9tSWQpKSB7CiAgICBjb25zb2xlLndhcm4oJ1RoZSBmb2xsb3dpbmcgbW9qb20gaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzOiAnICsgbW9qb21JZCk7CiAgICByZXR1cm47CiAgfQogIG1vam8uaW50ZXJuYWwubWFya01vam9tTG9hZGVkKG1vam9tSWQpOwogIHZhciBiaW5kaW5ncyA9IG1vam87CiAgdmFyIGFzc29jaWF0ZWRCaW5kaW5ncyA9IG1vam87CiAgdmFyIGNvZGVjID0gbW9qby5pbnRlcm5hbDsKICB2YXIgdmFsaWRhdG9yID0gbW9qby5pbnRlcm5hbDsKCiAgdmFyIGV4cG9ydHMgPSBtb2pvLmludGVybmFsLmV4cG9zZU5hbWVzcGFjZSgnbWVkaWEubW9qb20nKTsKCgogIHZhciBSZW1vdGluZ1N0b3BSZWFzb24gPSB7fTsKICBSZW1vdGluZ1N0b3BSZWFzb24uUk9VVEVfVEVSTUlOQVRFRCA9IDA7CiAgUmVtb3RpbmdTdG9wUmVhc29uLkxPQ0FMX1BMQVlCQUNLID0gUmVtb3RpbmdTdG9wUmVhc29uLlJPVVRFX1RFUk1JTkFURUQgKyAxOwogIFJlbW90aW5nU3RvcFJlYXNvbi5TT1VSQ0VfR09ORSA9IFJlbW90aW5nU3RvcFJlYXNvbi5MT0NBTF9QTEFZQkFDSyArIDE7CiAgUmVtb3RpbmdTdG9wUmVhc29uLk1FU1NBR0VfU0VORF9GQUlMRUQgPSBSZW1vdGluZ1N0b3BSZWFzb24uU09VUkNFX0dPTkUgKyAxOwogIFJlbW90aW5nU3RvcFJlYXNvbi5EQVRBX1NFTkRfRkFJTEVEID0gUmVtb3RpbmdTdG9wUmVhc29uLk1FU1NBR0VfU0VORF9GQUlMRUQgKyAxOwogIFJlbW90aW5nU3RvcFJlYXNvbi5VTkVYUEVDVEVEX0ZBSUxVUkUgPSBSZW1vdGluZ1N0b3BSZWFzb24uREFUQV9TRU5EX0ZBSUxFRCArIDE7CiAgUmVtb3RpbmdTdG9wUmVhc29uLlNFUlZJQ0VfR09ORSA9IFJlbW90aW5nU3RvcFJlYXNvbi5VTkVYUEVDVEVEX0ZBSUxVUkUgKyAxOwogIFJlbW90aW5nU3RvcFJlYXNvbi5VU0VSX0RJU0FCTEVEID0gUmVtb3RpbmdTdG9wUmVhc29uLlNFUlZJQ0VfR09ORSArIDE7CgogIFJlbW90aW5nU3RvcFJlYXNvbi5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgIGNhc2UgNDoKICAgIGNhc2UgNToKICAgIGNhc2UgNjoKICAgIGNhc2UgNzoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUmVtb3RpbmdTdG9wUmVhc29uLnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIHZhciBSZW1vdGluZ1N0YXJ0RmFpbFJlYXNvbiA9IHt9OwogIFJlbW90aW5nU3RhcnRGYWlsUmVhc29uLkNBTk5PVF9TVEFSVF9NVUxUSVBMRSA9IDA7CiAgUmVtb3RpbmdTdGFydEZhaWxSZWFzb24uUk9VVEVfVEVSTUlOQVRFRCA9IFJlbW90aW5nU3RhcnRGYWlsUmVhc29uLkNBTk5PVF9TVEFSVF9NVUxUSVBMRSArIDE7CiAgUmVtb3RpbmdTdGFydEZhaWxSZWFzb24uU0VSVklDRV9OT1RfQ09OTkVDVEVEID0gUmVtb3RpbmdTdGFydEZhaWxSZWFzb24uUk9VVEVfVEVSTUlOQVRFRCArIDE7CgogIFJlbW90aW5nU3RhcnRGYWlsUmVhc29uLmlzS25vd25FbnVtVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgc3dpdGNoICh2YWx1ZSkgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgY2FzZSAyOgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9OwoKICBSZW1vdGluZ1N0YXJ0RmFpbFJlYXNvbi52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKICB2YXIgUmVtb3RpbmdTaW5rRmVhdHVyZSA9IHt9OwogIFJlbW90aW5nU2lua0ZlYXR1cmUuUkVOREVSSU5HID0gMDsKICBSZW1vdGluZ1NpbmtGZWF0dXJlLkNPTlRFTlRfREVDUllQVElPTiA9IFJlbW90aW5nU2lua0ZlYXR1cmUuUkVOREVSSU5HICsgMTsKCiAgUmVtb3RpbmdTaW5rRmVhdHVyZS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUmVtb3RpbmdTaW5rRmVhdHVyZS52YWxpZGF0ZSA9IGZ1bmN0aW9uKGVudW1WYWx1ZSkgewogICAgdmFyIGlzRXh0ZW5zaWJsZSA9IGZhbHNlOwogICAgaWYgKGlzRXh0ZW5zaWJsZSB8fCB0aGlzLmlzS25vd25FbnVtVmFsdWUoZW51bVZhbHVlKSkKICAgICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKCiAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5VTktOT1dOX0VOVU1fVkFMVUU7CiAgfTsKICB2YXIgUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5ID0ge307CiAgUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LkNPREVDX0JBU0VMSU5FX1NFVCA9IDA7CiAgUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LkNPREVDX0FBQyA9IFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eS5DT0RFQ19CQVNFTElORV9TRVQgKyAxOwogIFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eS5DT0RFQ19PUFVTID0gUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LkNPREVDX0FBQyArIDE7CgogIFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUmVtb3RpbmdTaW5rQXVkaW9DYXBhYmlsaXR5LnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwogIHZhciBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkgPSB7fTsKICBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkuU1VQUE9SVF80SyA9IDA7CiAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LkNPREVDX0JBU0VMSU5FX1NFVCA9IFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5TVVBQT1JUXzRLICsgMTsKICBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkuQ09ERUNfSDI2NCA9IFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5DT0RFQ19CQVNFTElORV9TRVQgKyAxOwogIFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5DT0RFQ19WUDggPSBSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkuQ09ERUNfSDI2NCArIDE7CiAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LkNPREVDX1ZQOSA9IFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5DT0RFQ19WUDggKyAxOwogIFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5DT0RFQ19IRVZDID0gUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LkNPREVDX1ZQOSArIDE7CgogIFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eS5pc0tub3duRW51bVZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgIHN3aXRjaCAodmFsdWUpIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgMToKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgIGNhc2UgNDoKICAgIGNhc2UgNToKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfTsKCiAgUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5LnZhbGlkYXRlID0gZnVuY3Rpb24oZW51bVZhbHVlKSB7CiAgICB2YXIgaXNFeHRlbnNpYmxlID0gZmFsc2U7CiAgICBpZiAoaXNFeHRlbnNpYmxlIHx8IHRoaXMuaXNLbm93bkVudW1WYWx1ZShlbnVtVmFsdWUpKQogICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FOwoKICAgIHJldHVybiB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLlVOS05PV05fRU5VTV9WQUxVRTsKICB9OwoKICBmdW5jdGlvbiBSZW1vdGluZ1NpbmtNZXRhZGF0YSh2YWx1ZXMpIHsKICAgIHRoaXMuaW5pdERlZmF1bHRzXygpOwogICAgdGhpcy5pbml0RmllbGRzXyh2YWx1ZXMpOwogIH0KCgogIFJlbW90aW5nU2lua01ldGFkYXRhLnByb3RvdHlwZS5pbml0RGVmYXVsdHNfID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmZlYXR1cmVzID0gbnVsbDsKICAgIHRoaXMuYXVkaW9DYXBhYmlsaXRpZXMgPSBudWxsOwogICAgdGhpcy52aWRlb0NhcGFiaWxpdGllcyA9IG51bGw7CiAgICB0aGlzLmZyaWVuZGx5TmFtZSA9IG51bGw7CiAgfTsKICBSZW1vdGluZ1NpbmtNZXRhZGF0YS5wcm90b3R5cGUuaW5pdEZpZWxkc18gPSBmdW5jdGlvbihmaWVsZHMpIHsKICAgIGZvcih2YXIgZmllbGQgaW4gZmllbGRzKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoZmllbGQpKQogICAgICAgICAgdGhpc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdOwogICAgfQogIH07CgogIFJlbW90aW5nU2lua01ldGFkYXRhLnZhbGlkYXRlID0gZnVuY3Rpb24obWVzc2FnZVZhbGlkYXRvciwgb2Zmc2V0KSB7CiAgICB2YXIgZXJyOwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZVN0cnVjdEhlYWRlcihvZmZzZXQsIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKICAgIHZhciBrVmVyc2lvblNpemVzID0gWwogICAgICB7dmVyc2lvbjogMCwgbnVtQnl0ZXM6IDQwfQogICAgXTsKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJ1Y3RWZXJzaW9uKG9mZnNldCwga1ZlcnNpb25TaXplcyk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgUmVtb3RpbmdTaW5rTWV0YWRhdGEuZmVhdHVyZXMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyAwLCA0LCBuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtGZWF0dXJlKSwgZmFsc2UsIFswXSwgMCk7CiAgICBpZiAoZXJyICE9PSB2YWxpZGF0b3IudmFsaWRhdGlvbkVycm9yLk5PTkUpCiAgICAgICAgcmV0dXJuIGVycjsKCgogICAgLy8gdmFsaWRhdGUgUmVtb3RpbmdTaW5rTWV0YWRhdGEuYXVkaW9DYXBhYmlsaXRpZXMKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVBcnJheVBvaW50ZXIob2Zmc2V0ICsgY29kZWMua1N0cnVjdEhlYWRlclNpemUgKyA4LCA0LCBuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHkpLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBSZW1vdGluZ1NpbmtNZXRhZGF0YS52aWRlb0NhcGFiaWxpdGllcwogICAgZXJyID0gbWVzc2FnZVZhbGlkYXRvci52YWxpZGF0ZUFycmF5UG9pbnRlcihvZmZzZXQgKyBjb2RlYy5rU3RydWN0SGVhZGVyU2l6ZSArIDE2LCA0LCBuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtWaWRlb0NhcGFiaWxpdHkpLCBmYWxzZSwgWzBdLCAwKTsKICAgIGlmIChlcnIgIT09IHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORSkKICAgICAgICByZXR1cm4gZXJyOwoKCiAgICAvLyB2YWxpZGF0ZSBSZW1vdGluZ1NpbmtNZXRhZGF0YS5mcmllbmRseU5hbWUKICAgIGVyciA9IG1lc3NhZ2VWYWxpZGF0b3IudmFsaWRhdGVTdHJpbmdQb2ludGVyKG9mZnNldCArIGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMjQsIGZhbHNlKQogICAgaWYgKGVyciAhPT0gdmFsaWRhdG9yLnZhbGlkYXRpb25FcnJvci5OT05FKQogICAgICAgIHJldHVybiBlcnI7CgogICAgcmV0dXJuIHZhbGlkYXRvci52YWxpZGF0aW9uRXJyb3IuTk9ORTsKICB9OwoKICBSZW1vdGluZ1NpbmtNZXRhZGF0YS5lbmNvZGVkU2l6ZSA9IGNvZGVjLmtTdHJ1Y3RIZWFkZXJTaXplICsgMzI7CgogIFJlbW90aW5nU2lua01ldGFkYXRhLmRlY29kZSA9IGZ1bmN0aW9uKGRlY29kZXIpIHsKICAgIHZhciBwYWNrZWQ7CiAgICB2YXIgdmFsID0gbmV3IFJlbW90aW5nU2lua01ldGFkYXRhKCk7CiAgICB2YXIgbnVtYmVyT2ZCeXRlcyA9IGRlY29kZXIucmVhZFVpbnQzMigpOwogICAgdmFyIHZlcnNpb24gPSBkZWNvZGVyLnJlYWRVaW50MzIoKTsKICAgIHZhbC5mZWF0dXJlcyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5FbnVtKFJlbW90aW5nU2lua0ZlYXR1cmUpKTsKICAgIHZhbC5hdWRpb0NhcGFiaWxpdGllcyA9IGRlY29kZXIuZGVjb2RlQXJyYXlQb2ludGVyKG5ldyBjb2RlYy5FbnVtKFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eSkpOwogICAgdmFsLnZpZGVvQ2FwYWJpbGl0aWVzID0gZGVjb2Rlci5kZWNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5KSk7CiAgICB2YWwuZnJpZW5kbHlOYW1lID0gZGVjb2Rlci5kZWNvZGVTdHJ1Y3QoY29kZWMuU3RyaW5nKTsKICAgIHJldHVybiB2YWw7CiAgfTsKCiAgUmVtb3RpbmdTaW5rTWV0YWRhdGEuZW5jb2RlID0gZnVuY3Rpb24oZW5jb2RlciwgdmFsKSB7CiAgICB2YXIgcGFja2VkOwogICAgZW5jb2Rlci53cml0ZVVpbnQzMihSZW1vdGluZ1NpbmtNZXRhZGF0YS5lbmNvZGVkU2l6ZSk7CiAgICBlbmNvZGVyLndyaXRlVWludDMyKDApOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oUmVtb3RpbmdTaW5rRmVhdHVyZSksIHZhbC5mZWF0dXJlcyk7CiAgICBlbmNvZGVyLmVuY29kZUFycmF5UG9pbnRlcihuZXcgY29kZWMuRW51bShSZW1vdGluZ1NpbmtBdWRpb0NhcGFiaWxpdHkpLCB2YWwuYXVkaW9DYXBhYmlsaXRpZXMpOwogICAgZW5jb2Rlci5lbmNvZGVBcnJheVBvaW50ZXIobmV3IGNvZGVjLkVudW0oUmVtb3RpbmdTaW5rVmlkZW9DYXBhYmlsaXR5KSwgdmFsLnZpZGVvQ2FwYWJpbGl0aWVzKTsKICAgIGVuY29kZXIuZW5jb2RlU3RydWN0KGNvZGVjLlN0cmluZywgdmFsLmZyaWVuZGx5TmFtZSk7CiAgfTsKICBleHBvcnRzLlJlbW90aW5nU3RvcFJlYXNvbiA9IFJlbW90aW5nU3RvcFJlYXNvbjsKICBleHBvcnRzLlJlbW90aW5nU3RhcnRGYWlsUmVhc29uID0gUmVtb3RpbmdTdGFydEZhaWxSZWFzb247CiAgZXhwb3J0cy5SZW1vdGluZ1NpbmtGZWF0dXJlID0gUmVtb3RpbmdTaW5rRmVhdHVyZTsKICBleHBvcnRzLlJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eSA9IFJlbW90aW5nU2lua0F1ZGlvQ2FwYWJpbGl0eTsKICBleHBvcnRzLlJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eSA9IFJlbW90aW5nU2lua1ZpZGVvQ2FwYWJpbGl0eTsKICBleHBvcnRzLlJlbW90aW5nU2lua01ldGFkYXRhID0gUmVtb3RpbmdTaW5rTWV0YWRhdGE7Cn0pKCk7iVBORw0KGgoAAAANSUhEUgAAAFQAAABUAgMAAABhBfhSAAAACVBMVEUAAAAAAAD///+D3c/SAAAAAXRSTlMAQObYZgAAAGBJREFUeF7t1TEKgDAUg2EX7+eSJffLklO6ZJFaRMggxX8oj2960OFtO8aOieKumXrsWX8VRTtDUR3M0NH+vp/7IdFiV8Og25pWVQFgXQXmLWrM8ZZeE+uaFtKbJvrmFp5qrwQ1yoQ8bwAAAABJRU5ErkJggolQTkcNChoKAAAADUlIRFIAAACUAAAAggQDAAAAUp38YQAAABVQTFRF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