إن Pin Shear Strength Calculator is a practical engineering tool designed to calculate the shear stress, allowable load, required diameter, and safety factor of pins under transverse loading. Supporting both single-shear and double-shear configurations, it helps engineers quickly evaluate pin strength for clevis joints, hinges, mechanical linkages, and industrial equipment. The Pin Shear Strength Calculator simplifies preliminary pin sizing and load capacity verification while helping reduce the risk of shear failure and improve connection reliability.
KGZ1bmN0aW9uICgpIHsNCiAgInVzZSBzdHJpY3QiOw0KDQogIHZhciByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInBpbi1zaGVhci1jYWxjdWxhdG9yIik7DQogIGlmICghcm9vdCB8fCByb290LmdldEF0dHJpYnV0ZSgiZGF0YS1wc3NjLXJlYWR5IikgPT09ICIxIikgcmV0dXJuOw0KICByb290LnNldEF0dHJpYnV0ZSgiZGF0YS1wc3NjLXJlYWR5IiwgIjEiKTsNCg0KICB2YXIgQVJDX0xFTiA9IDI4Mi43NDM7DQogIHZhciBNTV9QRVJfSU4gPSAyNS40Ow0KICB2YXIgTU0yX1BFUl9JTjIgPSA2NDUuMTY7DQogIHZhciBQU0lfUEVSX01QQSA9IDE0NS4wMzc3Mzc3MzsNCiAgdmFyIExCRl9QRVJfTiA9IDAuMjI0ODA4OTQzOw0KDQogIHZhciBQSU5fU0laRVMgPSBbNiwgOCwgMTAsIDEyLCAxNiwgMjAsIDI1LCAzMCwgNDAsIDUwXTsNCg0KICB2YXIgTUFURVJJQUxTID0gew0KICAgIGNhcmJvbjogeyBzeTogMjUwLCBzdXQ6IDQwMCwgdGF1OiAyNDAsIGxhYmVsOiAiQ2FyYm9uIFN0ZWVsIiB9LA0KICAgIGFsbG95OiB7IHN5OiAzNjAsIHN1dDogNjAwLCB0YXU6IDM2MCwgbGFiZWw6ICJBbGxveSBTdGVlbCIgfSwNCiAgICBzdGFpbmxlc3M6IHsgc3k6IDIwNSwgc3V0OiA1MTUsIHRhdTogMzEwLCBsYWJlbDogIlN0YWlubGVzcyBTdGVlbCIgfSwNCiAgICBoYXJkZW5lZDogeyBzeTogODAwLCBzdXQ6IDEwMDAsIHRhdTogNjAwLCBsYWJlbDogIkhhcmRlbmVkIFN0ZWVsIiB9LA0KICAgIGFsdW1pbnVtOiB7IHN5OiAyNzUsIHN1dDogMzEwLCB0YXU6IDE2NSwgbGFiZWw6ICJBbHVtaW51bSBBbGxveSIgfSwNCiAgICBicm9uemU6IHsgc3k6IDE1MCwgc3V0OiAzMDAsIHRhdTogMTgwLCBsYWJlbDogIkJyb256ZSIgfSwNCiAgICBjdXN0b206IG51bGwNCiAgfTsNCg0KICB2YXIgREVGQVVMVFMgPSB7DQogICAgdW5pdDogIm1ldHJpYyIsDQogICAgbW9kZTogInN0cmVzcyIsDQogICAgcGluVHlwZTogImNsZXZpcyIsDQogICAgc2hlYXI6ICJkb3VibGUiLA0KICAgIGQ6IDIwLA0KICAgIEY6IDUwLA0KICAgIGZVbml0OiAia04iLA0KICAgIG1hdGVyaWFsOiAiYWxsb3kiLA0KICAgIHN5OiAzNjAsDQogICAgc3V0OiA2MDAsDQogICAgdGF1OiAzNjAsDQogICAgdGF1U291cmNlOiAibWFudWFsIiwNCiAgICBrOiAwLjYsDQogICAgbnNmOiAyLA0KICAgIG5waW5zOiAxLA0KICAgIHNoYXJlOiAxLA0KICAgIGJlYXJpbmc6IGZhbHNlLA0KICAgIHRoaWNrbmVzczogMTIsDQogICAgZ2FwOiAwDQogIH07DQoNCiAgdmFyIGVsID0gew0KICAgIG1vZGU6IGJ5SWQoInBzc2NNb2RlIiksDQogICAgcGluVHlwZTogYnlJZCgicHNzY1BpblR5cGUiKSwNCiAgICBzaGVhcjogYnlJZCgicHNzY1NoZWFyIiksDQogICAgZDogYnlJZCgicHNzY0QiKSwNCiAgICBkV3JhcDogYnlJZCgicHNzY0RXcmFwIiksDQogICAgRjogYnlJZCgicHNzY0YiKSwNCiAgICBmV3JhcDogYnlJZCgicHNzY0ZXcmFwIiksDQogICAgZlVuaXQ6IGJ5SWQoInBzc2NGVW5pdCIpLA0KICAgIG1hdGVyaWFsOiBieUlkKCJwc3NjTWF0ZXJpYWwiKSwNCiAgICBzeTogYnlJZCgicHNzY1N5IiksDQogICAgc3V0OiBieUlkKCJwc3NjU3V0IiksDQogICAgc3V0V3JhcDogYnlJZCgicHNzY1N1dFdyYXAiKSwNCiAgICB0YXU6IGJ5SWQoInBzc2NUYXUiKSwNCiAgICB0YXVTb3VyY2U6IGJ5SWQoInBzc2NUYXVTb3VyY2UiKSwNCiAgICBrOiBieUlkKCJwc3NjSyIpLA0KICAgIGtXcmFwOiBieUlkKCJwc3NjS1dyYXAiKSwNCiAgICBuc2Y6IGJ5SWQoInBzc2NOc2YiKSwNCiAgICBucGluczogYnlJZCgicHNzY05waW5zIiksDQogICAgc2hhcmU6IGJ5SWQoInBzc2NTaGFyZSIpLA0KICAgIGJlYXJpbmc6IGJ5SWQoInBzc2NCZWFyaW5nIiksDQogICAgYmVhcmluZ0ZpZWxkczogYnlJZCgicHNzY0JlYXJpbmdGaWVsZHMiKSwNCiAgICB0aGlja25lc3M6IGJ5SWQoInBzc2NUaGlja25lc3MiKSwNCiAgICBnYXA6IGJ5SWQoInBzc2NHYXAiKSwNCiAgICBnYXBXcmFwOiBieUlkKCJwc3NjR2FwV3JhcCIpLA0KICAgIGJ0bk1ldHJpYzogYnlJZCgicHNzY0J0bk1ldHJpYyIpLA0KICAgIGJ0bkltcGVyaWFsOiBieUlkKCJwc3NjQnRuSW1wZXJpYWwiKSwNCiAgICBidG5DYWxjOiBieUlkKCJwc3NjQnRuQ2FsY3VsYXRlIiksDQogICAgcmVzdWx0czogYnlJZCgicHNzY1Jlc3VsdHMiKSwNCiAgICBzaXplQ2hpcHM6IGJ5SWQoInBzc2NTaXplQ2hpcHMiKSwNCiAgICBtb2RlTm90ZTogYnlJZCgicHNzY01vZGVOb3RlIiksDQogICAgYmFubmVyOiBieUlkKCJwc3NjQmFubmVyIiksDQogICAgc3RhdHVzVGl0bGU6IGJ5SWQoInBzc2NTdGF0dXNUaXRsZSIpLA0KICAgIHN0YXR1c05vdGU6IGJ5SWQoInBzc2NTdGF0dXNOb3RlIiksDQogICAgaGVyb1N0cmVzczogYnlJZCgicHNzY0hlcm9TdHJlc3MiKSwNCiAgICBoZXJvRmFsbG93OiBieUlkKCJwc3NjSGVyb0ZhbGxvdyIpLA0KICAgIGhlcm9EcmVxOiBieUlkKCJwc3NjSGVyb0RyZXEiKSwNCiAgICBoZXJvU2Y6IGJ5SWQoInBzc2NIZXJvU2YiKSwNCiAgICBvdXRTdHJlc3M6IGJ5SWQoInBzc2NPdXRTdHJlc3MiKSwNCiAgICBvdXRTdHJlc3NTdWI6IGJ5SWQoInBzc2NPdXRTdHJlc3NTdWIiKSwNCiAgICBvdXRGYWxsb3c6IGJ5SWQoInBzc2NPdXRGYWxsb3ciKSwNCiAgICBvdXRGYWxsb3dTdWI6IGJ5SWQoInBzc2NPdXRGYWxsb3dTdWIiKSwNCiAgICBvdXREcmVxOiBieUlkKCJwc3NjT3V0RHJlcSIpLA0KICAgIG91dERyZXFTdWI6IGJ5SWQoInBzc2NPdXREcmVxU3ViIiksDQogICAgb3V0U2Y6IGJ5SWQoInBzc2NPdXRTZiIpLA0KICAgIG91dFNmU3ViOiBieUlkKCJwc3NjT3V0U2ZTdWIiKSwNCiAgICBvdXRVdGlsOiBieUlkKCJwc3NjT3V0VXRpbCIpLA0KICAgIHV0aWxGaWxsOiBieUlkKCJwc3NjVXRpbEZpbGwiKSwNCiAgICBvdXRBcmVhOiBieUlkKCJwc3NjT3V0QXJlYSIpLA0KICAgIG91dEFlZmY6IGJ5SWQoInBzc2NPdXRBZWZmIiksDQogICAgb3V0VGF1QWxsb3c6IGJ5SWQoInBzc2NPdXRUYXVBbGxvdyIpLA0KICAgIG91dEZwaW46IGJ5SWQoInBzc2NPdXRGcGluIiksDQogICAgb3V0RnBpbk5vdGU6IGJ5SWQoInBzc2NPdXRGcGluTm90ZSIpLA0KICAgIG91dEJlYXJpbmc6IGJ5SWQoInBzc2NPdXRCZWFyaW5nIiksDQogICAgb3V0QmVhcmluZ05vdGU6IGJ5SWQoInBzc2NPdXRCZWFyaW5nTm90ZSIpLA0KICAgIG91dEdvdmVybmluZzogYnlJZCgicHNzY091dEdvdmVybmluZyIpLA0KICAgIGdhdWdlQXJjOiBieUlkKCJwc3NjR2F1Z2VBcmMiKSwNCiAgICBuZWVkbGU6IGJ5SWQoInBzc2NOZWVkbGUiKSwNCiAgICBnYXVnZVJlYWQ6IGJ5SWQoInBzc2NHYXVnZVJlYWQiKSwNCiAgICBnYXVnZU5vdGU6IGJ5SWQoInBzc2NHYXVnZU5vdGUiKSwNCiAgICBzY2hlbWF0aWM6IGJ5SWQoInBzc2NTY2hlbWF0aWMiKSwNCiAgICBzY2hGb3JjZTogYnlJZCgicHNzY1NjaEZvcmNlIiksDQogICAgc2NoQ2FwdGlvbjogYnlJZCgicHNzY1NjaENhcHRpb24iKSwNCiAgICBiYXJUYXU6IGJ5SWQoInBzc2NCYXJUYXUiKSwNCiAgICBiYXJUYTogYnlJZCgicHNzY0JhclRhIiksDQogICAgYmFyVGF1VmFsOiBieUlkKCJwc3NjQmFyVGF1VmFsIiksDQogICAgYmFyVGFWYWw6IGJ5SWQoInBzc2NCYXJUYVZhbCIpLA0KICAgIGFsZXJ0czogYnlJZCgicHNzY0FsZXJ0cyIpDQogIH07DQoNCiAgdmFyIHN0YXRlID0gew0KICAgIHVuaXQ6ICJtZXRyaWMiLA0KICAgIGxpdmU6IGZhbHNlLA0KICAgIGFwcGx5aW5nOiBmYWxzZQ0KICB9Ow0KICB2YXIgbGFzdEZVbml0ID0gZWwuZlVuaXQgPyBlbC5mVW5pdC52YWx1ZSA6ICJrTiI7DQoNCiAgZnVuY3Rpb24gYnlJZChpZCkgeyByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKCIjIiArIGlkKTsgfQ0KDQogIGZ1bmN0aW9uIG51bShub2RlKSB7DQogICAgaWYgKCFub2RlKSByZXR1cm4gTmFOOw0KICAgIHZhciB2ID0gcGFyc2VGbG9hdChTdHJpbmcobm9kZS52YWx1ZSkucmVwbGFjZSgiLCIsICIuIikpOw0KICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiBOYU47DQogIH0NCg0KICBmdW5jdGlvbiBjbGFtcCh2LCBhLCBiKSB7IHJldHVybiBNYXRoLm1heChhLCBNYXRoLm1pbihiLCB2KSk7IH0NCg0KICBmdW5jdGlvbiByb3VuZFNtYXJ0KHYpIHsNCiAgICBpZiAoIWlzRmluaXRlKHYpKSByZXR1cm4gIiI7DQogICAgdmFyIGEgPSBNYXRoLmFicyh2KTsNCiAgICB2YXIgZCA9IGEgPj0gMTAwID8gMiA6IGEgPj0gMTAgPyAzIDogYSA+PSAxID8gNCA6IDU7DQogICAgcmV0dXJuIFN0cmluZyhOdW1iZXIodi50b0ZpeGVkKGQpKSk7DQogIH0NCg0KICBmdW5jdGlvbiBmbXQodiwgZCkgew0KICAgIGlmICghaXNGaW5pdGUodikpIHJldHVybiAiLSI7DQogICAgcmV0dXJuIHYudG9Mb2NhbGVTdHJpbmcoImVuLVVTIiwgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IGQsIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMCB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGVtcHR5KG5vZGUpIHsNCiAgICByZXR1cm4gIW5vZGUgfHwgU3RyaW5nKG5vZGUudmFsdWUpLnRyaW0oKSA9PT0gIiI7DQogIH0NCg0KICBmdW5jdGlvbiBzZXRFcnIoa2V5LCBtc2cpIHsNCiAgICB2YXIgbm9kZSA9IGJ5SWQoInBzc2NFcnIiICsga2V5KTsNCiAgICB2YXIgbWFwID0gew0KICAgICAgRDogZWwuZCwgRjogZWwuRiwgU3k6IGVsLnN5LCBTdXQ6IGVsLnN1dCwgVGF1OiBlbC50YXUsIEs6IGVsLmssDQogICAgICBOc2Y6IGVsLm5zZiwgTnBpbnM6IGVsLm5waW5zLCBTaGFyZTogZWwuc2hhcmUsIFQ6IGVsLnRoaWNrbmVzcywgR2FwOiBlbC5nYXANCiAgICB9Ow0KICAgIHZhciBpbnB1dCA9IG1hcFtrZXldOw0KICAgIGlmIChub2RlKSBub2RlLnRleHRDb250ZW50ID0gbXNnIHx8ICIiOw0KICAgIGlmIChpbnB1dCkgew0KICAgICAgaWYgKG1zZykgaW5wdXQuY2xhc3NMaXN0LmFkZCgicHNzYy1pbnZhbGlkIik7DQogICAgICBlbHNlIGlucHV0LmNsYXNzTGlzdC5yZW1vdmUoInBzc2MtaW52YWxpZCIpOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGNsZWFyRXJycygpIHsNCiAgICBbIkQiLCAiRiIsICJTeSIsICJTdXQiLCAiVGF1IiwgIksiLCAiTnNmIiwgIk5waW5zIiwgIlNoYXJlIiwgIlQiLCAiR2FwIl0uZm9yRWFjaChmdW5jdGlvbiAoaykgew0KICAgICAgc2V0RXJyKGssICIiKTsNCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHVwZGF0ZVVuaXRMYWJlbHMoKSB7DQogICAgdmFyIG1ldHJpYyA9IHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiOw0KICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdW5pdD0nZCddIikuZm9yRWFjaChmdW5jdGlvbiAobikgew0KICAgICAgbi50ZXh0Q29udGVudCA9IG1ldHJpYyA/ICJtbSIgOiAiaW4iOw0KICAgIH0pOw0KICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdW5pdD0ndCddIikuZm9yRWFjaChmdW5jdGlvbiAobikgew0KICAgICAgbi50ZXh0Q29udGVudCA9IG1ldHJpYyA/ICJtbSIgOiAiaW4iOw0KICAgIH0pOw0KICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdW5pdD0nYSddIikuZm9yRWFjaChmdW5jdGlvbiAobikgew0KICAgICAgbi50ZXh0Q29udGVudCA9IG1ldHJpYyA/ICJtbVx1MDBiMiIgOiAiaW5cdTAwYjIiOw0KICAgIH0pOw0KICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtdW5pdD0ncyddIikuZm9yRWFjaChmdW5jdGlvbiAobikgew0KICAgICAgbi50ZXh0Q29udGVudCA9IG1ldHJpYyA/ICJNUGEiIDogInBzaSI7DQogICAgfSk7DQogICAgaWYgKGVsLmJ0bk1ldHJpYykgZWwuYnRuTWV0cmljLmNsYXNzTGlzdC50b2dnbGUoInBzc2MtaXMtYWN0aXZlIiwgbWV0cmljKTsNCiAgICBpZiAoZWwuYnRuSW1wZXJpYWwpIGVsLmJ0bkltcGVyaWFsLmNsYXNzTGlzdC50b2dnbGUoInBzc2MtaXMtYWN0aXZlIiwgIW1ldHJpYyk7DQogIH0NCg0KICBmdW5jdGlvbiBwaW5BcmVhTW0yKGREaXNwKSB7DQogICAgaWYgKCEoZERpc3AgPiAwKSkgcmV0dXJuIE5hTjsNCiAgICB2YXIgZG1tID0gc3RhdGUudW5pdCA9PT0gIm1ldHJpYyIgPyBkRGlzcCA6IGREaXNwICogTU1fUEVSX0lOOw0KICAgIHJldHVybiBNYXRoLlBJIC8gNCAqIGRtbSAqIGRtbTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHJlZnJlc2hBcmVhUHJldmlldygpIHsNCiAgICB2YXIgZCA9IG51bShlbC5kKTsNCiAgICBpZiAoIWVsLmQgfHwgZWwubW9kZS52YWx1ZSA9PT0gImRpYW1ldGVyIikgcmV0dXJuOw0KICAgIHZhciBBID0gcGluQXJlYU1tMihkKTsNCiAgICBpZiAoIWlzRmluaXRlKEEpIHx8ICEoQSA+IDApKSByZXR1cm47DQogIH0NCg0KICBmdW5jdGlvbiByZW5kZXJTaXplQ2hpcHMoKSB7DQogICAgaWYgKCFlbC5zaXplQ2hpcHMpIHJldHVybjsNCiAgICBlbC5zaXplQ2hpcHMuaW5uZXJIVE1MID0gIiI7DQogICAgUElOX1NJWkVTLmZvckVhY2goZnVuY3Rpb24gKHN6KSB7DQogICAgICB2YXIgZGlzcCA9IHN0YXRlLnVuaXQgPT09ICJtZXRyaWMiID8gc3ogOiBzeiAvIE1NX1BFUl9JTjsNCiAgICAgIHZhciBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsNCiAgICAgIGJ0bi50eXBlID0gImJ1dHRvbiI7DQogICAgICBidG4uY2xhc3NOYW1lID0gInBzc2MtY2hpcCI7DQogICAgICBidG4udGV4dENvbnRlbnQgPSBzdGF0ZS51bml0ID09PSAibWV0cmljIiA/IHN6ICsgIiBtbSIgOiByb3VuZFNtYXJ0KGRpc3ApICsgIiBpbiI7DQogICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7DQogICAgICAgIHN0YXRlLmFwcGx5aW5nID0gdHJ1ZTsNCiAgICAgICAgZWwuZC52YWx1ZSA9IHJvdW5kU21hcnQoZGlzcCk7DQogICAgICAgIHN0YXRlLmFwcGx5aW5nID0gZmFsc2U7DQogICAgICAgIHBhaW50Q2hpcHMoYnRuKTsNCiAgICAgICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7DQogICAgICB9KTsNCiAgICAgIGVsLnNpemVDaGlwcy5hcHBlbmRDaGlsZChidG4pOw0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gcGFpbnRDaGlwcyhhY3RpdmVCdG4pIHsNCiAgICBpZiAoIWVsLnNpemVDaGlwcykgcmV0dXJuOw0KICAgIGVsLnNpemVDaGlwcy5xdWVyeVNlbGVjdG9yQWxsKCIucHNzYy1jaGlwIikuZm9yRWFjaChmdW5jdGlvbiAoYnRuKSB7DQogICAgICBidG4uY2xhc3NMaXN0LnRvZ2dsZSgicHNzYy1pcy1hY3RpdmUiLCBidG4gPT09IGFjdGl2ZUJ0bik7DQogICAgfSk7DQogIH0NCg0KICBmdW5jdGlvbiBhcHBseU1hdGVyaWFsKCkgew0KICAgIHZhciBtID0gTUFURVJJQUxTW2VsLm1hdGVyaWFsLnZhbHVlXTsNCiAgICBpZiAoIW0pIHsNCiAgICAgIGVsLnN5LnJlYWRPbmx5ID0gZmFsc2U7DQogICAgICBpZiAoZWwuc3V0KSBlbC5zdXQucmVhZE9ubHkgPSBmYWxzZTsNCiAgICAgIHJldHVybjsNCiAgICB9DQogICAgc3RhdGUuYXBwbHlpbmcgPSB0cnVlOw0KICAgIHZhciBtZXRyaWMgPSBzdGF0ZS51bml0ID09PSAibWV0cmljIjsNCiAgICBlbC5zeS52YWx1ZSA9IG1ldHJpYyA/IFN0cmluZyhtLnN5KSA6IHJvdW5kU21hcnQobS5zeSAqIFBTSV9QRVJfTVBBKTsNCiAgICBpZiAoZWwuc3V0KSB7DQogICAgICBlbC5zdXQudmFsdWUgPSBtZXRyaWMgPyBTdHJpbmcobS5zdXQpIDogcm91bmRTbWFydChtLnN1dCAqIFBTSV9QRVJfTVBBKTsNCiAgICAgIGVsLnN1dC5yZWFkT25seSA9IHRydWU7DQogICAgfQ0KICAgIGVsLnN5LnJlYWRPbmx5ID0gdHJ1ZTsNCiAgICBpZiAoZWwudGF1U291cmNlLnZhbHVlID09PSAiZXN0aW1hdGUiKSB1cGRhdGVUYXVGcm9tRXN0aW1hdGUoKTsNCiAgICBlbHNlIGlmIChlbC50YXVTb3VyY2UudmFsdWUgPT09ICJtYW51YWwiKSB7DQogICAgICBlbC50YXUudmFsdWUgPSBtZXRyaWMgPyBTdHJpbmcobS50YXUpIDogcm91bmRTbWFydChtLnRhdSAqIFBTSV9QRVJfTVBBKTsNCiAgICB9DQogICAgc3RhdGUuYXBwbHlpbmcgPSBmYWxzZTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG1hcmtDdXN0b21NYXRlcmlhbCgpIHsNCiAgICBpZiAoc3RhdGUuYXBwbHlpbmcpIHJldHVybjsNCiAgICBpZiAoZWwubWF0ZXJpYWwudmFsdWUgIT09ICJjdXN0b20iKSBlbC5tYXRlcmlhbC52YWx1ZSA9ICJjdXN0b20iOw0KICAgIGVsLnN5LnJlYWRPbmx5ID0gZmFsc2U7DQogICAgaWYgKGVsLnN1dCkgZWwuc3V0LnJlYWRPbmx5ID0gZmFsc2U7DQogIH0NCg0KICBmdW5jdGlvbiB1cGRhdGVUYXVGcm9tRXN0aW1hdGUoKSB7DQogICAgaWYgKGVsLnRhdVNvdXJjZS52YWx1ZSAhPT0gImVzdGltYXRlIikgcmV0dXJuOw0KICAgIHZhciBzdXQgPSBudW0oZWwuc3V0KTsNCiAgICB2YXIgayA9IG51bShlbC5rKTsNCiAgICBpZiAoIShzdXQgPiAwKSB8fCAhKGsgPiAwKSkgcmV0dXJuOw0KICAgIHZhciBtZXRyaWMgPSBzdGF0ZS51bml0ID09PSAibWV0cmljIjsNCiAgICB2YXIgdGF1TVBhID0gbWV0cmljID8gc3V0ICogayA6IChzdXQgLyBQU0lfUEVSX01QQSkgKiBrOw0KICAgIGVsLnRhdS52YWx1ZSA9IG1ldHJpYyA/IHJvdW5kU21hcnQodGF1TVBhKSA6IHJvdW5kU21hcnQodGF1TVBhICogUFNJX1BFUl9NUEEpOw0KICAgIGVsLnRhdS5yZWFkT25seSA9IHRydWU7DQogIH0NCg0KICBmdW5jdGlvbiBvblRhdVNvdXJjZUNoYW5nZSgpIHsNCiAgICB2YXIgc3JjID0gZWwudGF1U291cmNlLnZhbHVlOw0KICAgIGlmIChzcmMgPT09ICJtYW51YWwiKSB7DQogICAgICBlbC50YXUucmVhZE9ubHkgPSBmYWxzZTsNCiAgICAgIGlmIChlbC5rV3JhcCkgZWwua1dyYXAuY2xhc3NMaXN0LmFkZCgicHNzYy1oaWRkZW4iKTsNCiAgICAgIGlmIChlbC5zdXRXcmFwKSBlbC5zdXRXcmFwLmNsYXNzTGlzdC5hZGQoInBzc2MtaGlkZGVuIik7DQogICAgfSBlbHNlIHsNCiAgICAgIGVsLnRhdS5yZWFkT25seSA9IHRydWU7DQogICAgICBpZiAoZWwua1dyYXApIGVsLmtXcmFwLmNsYXNzTGlzdC5yZW1vdmUoInBzc2MtaGlkZGVuIik7DQogICAgICBpZiAoZWwuc3V0V3JhcCkgZWwuc3V0V3JhcC5jbGFzc0xpc3QucmVtb3ZlKCJwc3NjLWhpZGRlbiIpOw0KICAgICAgdXBkYXRlVGF1RnJvbUVzdGltYXRlKCk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gZm9yY2VUb04oKSB7DQogICAgdmFyIHYgPSBudW0oZWwuRik7DQogICAgaWYgKCFpc0Zpbml0ZSh2KSkgcmV0dXJuIE5hTjsNCiAgICB2YXIgdSA9IGVsLmZVbml0LnZhbHVlOw0KICAgIGlmICh1ID09PSAia04iKSByZXR1cm4gdiAqIDEwMDA7DQogICAgaWYgKHUgPT09ICJsYmYiKSByZXR1cm4gdiAvIExCRl9QRVJfTjsNCiAgICByZXR1cm4gdjsNCiAgfQ0KDQogIGZ1bmN0aW9uIGNvbnZlcnRGb3JjZVVuaXRWYWx1ZSh2YWx1ZSwgZnJvbVUsIHRvVSkgew0KICAgIGlmICghaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gdmFsdWU7DQogICAgdmFyIG4gPSB2YWx1ZTsNCiAgICBpZiAoZnJvbVUgPT09ICJrTiIpIG4gKj0gMTAwMDsNCiAgICBpZiAoZnJvbVUgPT09ICJsYmYiKSBuIC89IExCRl9QRVJfTjsNCiAgICBpZiAodG9VID09PSAia04iKSByZXR1cm4gbiAvIDEwMDA7DQogICAgaWYgKHRvVSA9PT0gImxiZiIpIHJldHVybiBuICogTEJGX1BFUl9OOw0KICAgIHJldHVybiBuOw0KICB9DQoNCiAgZnVuY3Rpb24gZm9ybWF0Rm9yY2UoTikgew0KICAgIGlmICghaXNGaW5pdGUoTikpIHJldHVybiB7IHByaW1hcnk6ICItIiwgc2Vjb25kYXJ5OiAiIiB9Ow0KICAgIGlmIChzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiKSB7DQogICAgICByZXR1cm4gew0KICAgICAgICBwcmltYXJ5OiBmbXQoTiAqIExCRl9QRVJfTiwgMSkgKyAiIGxiZiIsDQogICAgICAgIHNlY29uZGFyeTogZm10KE4gLyAxMDAwLCAyKSArICIga04gIC8gICIgKyBmbXQoTiwgMCkgKyAiIE4iDQogICAgICB9Ow0KICAgIH0NCiAgICBpZiAoTWF0aC5hYnMoTikgPj0gMTAwMCkgew0KICAgICAgcmV0dXJuIHsNCiAgICAgICAgcHJpbWFyeTogZm10KE4gLyAxMDAwLCAyKSArICIga04iLA0KICAgICAgICBzZWNvbmRhcnk6IGZtdChOLCAwKSArICIgTiAgLyAgIiArIGZtdChOICogTEJGX1BFUl9OLCAxKSArICIgbGJmIg0KICAgICAgfTsNCiAgICB9DQogICAgcmV0dXJuIHsNCiAgICAgIHByaW1hcnk6IGZtdChOLCAxKSArICIgTiIsDQogICAgICBzZWNvbmRhcnk6IGZtdChOICogTEJGX1BFUl9OLCAxKSArICIgbGJmIg0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRTdHJlc3MoTVBhKSB7DQogICAgaWYgKCFpc0Zpbml0ZShNUGEpKSByZXR1cm4geyBwcmltYXJ5OiAiLSIsIHNlY29uZGFyeTogIiIgfTsNCiAgICBpZiAoc3RhdGUudW5pdCA9PT0gImltcGVyaWFsIikgew0KICAgICAgcmV0dXJuIHsgcHJpbWFyeTogZm10KE1QYSAqIFBTSV9QRVJfTVBBLCAwKSArICIgcHNpIiwgc2Vjb25kYXJ5OiBmbXQoTVBhLCAxKSArICIgTVBhIiB9Ow0KICAgIH0NCiAgICByZXR1cm4geyBwcmltYXJ5OiBmbXQoTVBhLCAxKSArICIgTVBhIiwgc2Vjb25kYXJ5OiBmbXQoTVBhICogUFNJX1BFUl9NUEEsIDApICsgIiBwc2kiIH07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRBcmVhKG1tMikgew0KICAgIGlmICghaXNGaW5pdGUobW0yKSkgcmV0dXJuICItIjsNCiAgICBpZiAoc3RhdGUudW5pdCA9PT0gImltcGVyaWFsIikgcmV0dXJuIGZtdChtbTIgLyBNTTJfUEVSX0lOMiwgNCkgKyAiIGluXHUwMGIyIjsNCiAgICByZXR1cm4gZm10KG1tMiwgMSkgKyAiIG1tXHUwMGIyIjsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZvcm1hdExlbmd0aChtbSkgew0KICAgIGlmICghaXNGaW5pdGUobW0pKSByZXR1cm4gIi0iOw0KICAgIGlmIChzdGF0ZS51bml0ID09PSAiaW1wZXJpYWwiKSByZXR1cm4gZm10KG1tIC8gTU1fUEVSX0lOLCAzKSArICIgaW4iOw0KICAgIHJldHVybiBmbXQobW0sIDIpICsgIiBtbSI7DQogIH0NCg0KICBmdW5jdGlvbiBzd2l0Y2hVbml0KG5leHQpIHsNCiAgICBpZiAobmV4dCA9PT0gc3RhdGUudW5pdCkgcmV0dXJuOw0KICAgIHZhciBkID0gbnVtKGVsLmQpOw0KICAgIHZhciBzeSA9IG51bShlbC5zeSk7DQogICAgdmFyIHN1dCA9IG51bShlbC5zdXQpOw0KICAgIHZhciB0YXUgPSBudW0oZWwudGF1KTsNCiAgICB2YXIgdCA9IG51bShlbC50aGlja25lc3MpOw0KICAgIHZhciBnYXAgPSBudW0oZWwuZ2FwKTsNCiAgICB2YXIgRiA9IG51bShlbC5GKTsNCiAgICB2YXIgZnJvbUZVID0gZWwuZlVuaXQudmFsdWU7DQogICAgdmFyIHRvRlUgPSBuZXh0ID09PSAiaW1wZXJpYWwiID8gImxiZiIgOiAiTiI7DQoNCiAgICBpZiAobmV4dCA9PT0gImltcGVyaWFsIikgew0KICAgICAgaWYgKGlzRmluaXRlKGQpKSBlbC5kLnZhbHVlID0gcm91bmRTbWFydChkIC8gTU1fUEVSX0lOKTsNCiAgICAgIGlmIChpc0Zpbml0ZShzeSkpIGVsLnN5LnZhbHVlID0gcm91bmRTbWFydChzeSAqIFBTSV9QRVJfTVBBKTsNCiAgICAgIGlmIChpc0Zpbml0ZShzdXQpKSBlbC5zdXQudmFsdWUgPSByb3VuZFNtYXJ0KHN1dCAqIFBTSV9QRVJfTVBBKTsNCiAgICAgIGlmIChpc0Zpbml0ZSh0YXUpKSBlbC50YXUudmFsdWUgPSByb3VuZFNtYXJ0KHRhdSAqIFBTSV9QRVJfTVBBKTsNCiAgICAgIGlmIChpc0Zpbml0ZSh0KSkgZWwudGhpY2tuZXNzLnZhbHVlID0gcm91bmRTbWFydCh0IC8gTU1fUEVSX0lOKTsNCiAgICAgIGlmIChpc0Zpbml0ZShnYXApKSBlbC5nYXAudmFsdWUgPSByb3VuZFNtYXJ0KGdhcCAvIE1NX1BFUl9JTik7DQogICAgfSBlbHNlIHsNCiAgICAgIGlmIChpc0Zpbml0ZShkKSkgZWwuZC52YWx1ZSA9IHJvdW5kU21hcnQoZCAqIE1NX1BFUl9JTik7DQogICAgICBpZiAoaXNGaW5pdGUoc3kpKSBlbC5zeS52YWx1ZSA9IHJvdW5kU21hcnQoc3kgLyBQU0lfUEVSX01QQSk7DQogICAgICBpZiAoaXNGaW5pdGUoc3V0KSkgZWwuc3V0LnZhbHVlID0gcm91bmRTbWFydChzdXQgLyBQU0lfUEVSX01QQSk7DQogICAgICBpZiAoaXNGaW5pdGUodGF1KSkgZWwudGF1LnZhbHVlID0gcm91bmRTbWFydCh0YXUgLyBQU0lfUEVSX01QQSk7DQogICAgICBpZiAoaXNGaW5pdGUodCkpIGVsLnRoaWNrbmVzcy52YWx1ZSA9IHJvdW5kU21hcnQodCAqIE1NX1BFUl9JTik7DQogICAgICBpZiAoaXNGaW5pdGUoZ2FwKSkgZWwuZ2FwLnZhbHVlID0gcm91bmRTbWFydChnYXAgKiBNTV9QRVJfSU4pOw0KICAgIH0NCg0KICAgIGVsLmZVbml0LnZhbHVlID0gdG9GVTsNCiAgICBsYXN0RlVuaXQgPSB0b0ZVOw0KICAgIGlmIChpc0Zpbml0ZShGKSkgZWwuRi52YWx1ZSA9IHJvdW5kU21hcnQoY29udmVydEZvcmNlVW5pdFZhbHVlKEYsIGZyb21GVSwgdG9GVSkpOw0KICAgIHN0YXRlLnVuaXQgPSBuZXh0Ow0KICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICByZW5kZXJTaXplQ2hpcHMoKTsNCiAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHVwZGF0ZU1vZGVVSSgpIHsNCiAgICB2YXIgbW9kZSA9IGVsLm1vZGUudmFsdWU7DQogICAgaWYgKGVsLmRXcmFwKSBlbC5kV3JhcC5jbGFzc0xpc3QudG9nZ2xlKCJwc3NjLWhpZGRlbiIsIG1vZGUgPT09ICJkaWFtZXRlciIpOw0KICAgIGlmIChlbC5mV3JhcCkgZWwuZldyYXAuY2xhc3NMaXN0LnRvZ2dsZSgicHNzYy1oaWRkZW4iLCBtb2RlID09PSAiY2FwYWNpdHkiKTsNCiAgICBpZiAoZWwuc2l6ZUNoaXBzICYmIGVsLnNpemVDaGlwcy5wYXJlbnRFbGVtZW50KSB7DQogICAgICBlbC5zaXplQ2hpcHMucGFyZW50RWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCJwc3NjLWhpZGRlbiIsIG1vZGUgPT09ICJkaWFtZXRlciIpOw0KICAgIH0NCg0KICAgIGlmIChlbC5tb2RlTm90ZSkgew0KICAgICAgaWYgKG1vZGUgPT09ICJzdHJlc3MiKSB7DQogICAgICAgIGVsLm1vZGVOb3RlLnRleHRDb250ZW50ID0gIlNoZWFyIFN0cmVzcyBDaGVjazogZXZhbHVhdGUgd2hldGhlciB0aGUgc2VsZWN0ZWQgcGluIGRpYW1ldGVyIGNhbiBjYXJyeSB0aGUgYXBwbGllZCB0cmFuc3ZlcnNlIGxvYWQgd2l0aG91dCBleGNlZWRpbmcgYWxsb3dhYmxlIHNoZWFyIHN0cmVzcy4iOw0KICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAiY2FwYWNpdHkiKSB7DQogICAgICAgIGVsLm1vZGVOb3RlLnRleHRDb250ZW50ID0gIkFsbG93YWJsZSBMb2FkOiBjb21wdXRlIG1heGltdW0gYWxsb3dhYmxlIHNoZWFyIGxvYWQgZm9yIHRoZSBnaXZlbiBwaW4gZGlhbWV0ZXIsIG1hdGVyaWFsLCBhbmQgc2FmZXR5IGZhY3Rvci4iOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgZWwubW9kZU5vdGUudGV4dENvbnRlbnQgPSAiUmVxdWlyZWQgUGluIERpYW1ldGVyOiBjYWxjdWxhdGUgdGhlIG1pbmltdW0gcGluIGRpYW1ldGVyIG5lZWRlZCBmb3IgdGhlIGFwcGxpZWQgbG9hZCBhbmQgbWF0ZXJpYWwgc3RyZW5ndGguIjsNCiAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAoZWwuaGVyb1N0cmVzcykgZWwuaGVyb1N0cmVzcy5jbGFzc0xpc3QudG9nZ2xlKCJwc3NjLWlzLWZvY3VzIiwgbW9kZSA9PT0gInN0cmVzcyIpOw0KICAgIGlmIChlbC5oZXJvRmFsbG93KSBlbC5oZXJvRmFsbG93LmNsYXNzTGlzdC50b2dnbGUoInBzc2MtaXMtZm9jdXMiLCBtb2RlID09PSAiY2FwYWNpdHkiKTsNCiAgICBpZiAoZWwuaGVyb0RyZXEpIGVsLmhlcm9EcmVxLmNsYXNzTGlzdC50b2dnbGUoInBzc2MtaXMtZm9jdXMiLCBtb2RlID09PSAiZGlhbWV0ZXIiKTsNCiAgICBpZiAoZWwuaGVyb1NmKSBlbC5oZXJvU2YuY2xhc3NMaXN0LnRvZ2dsZSgicHNzYy1pcy1mb2N1cyIsIG1vZGUgPT09ICJzdHJlc3MiIHx8IG1vZGUgPT09ICJjYXBhY2l0eSIpOw0KICB9DQoNCiAgZnVuY3Rpb24gdG9TSSgpIHsNCiAgICB2YXIgbWV0cmljID0gc3RhdGUudW5pdCA9PT0gIm1ldHJpYyI7DQogICAgdmFyIGQgPSBudW0oZWwuZCk7DQogICAgdmFyIG1vZGUgPSBlbC5tb2RlLnZhbHVlOw0KICAgIHZhciBuUGxhbmVzID0gZWwuc2hlYXIudmFsdWUgPT09ICJkb3VibGUiID8gMiA6IDE7DQogICAgdmFyIHRhdVN0ciA9IG51bShlbC50YXUpOw0KICAgIHJldHVybiB7DQogICAgICBtb2RlOiBtb2RlLA0KICAgICAgZDogZCwNCiAgICAgIGRfbW06IG1ldHJpYyA/IGQgOiBkICogTU1fUEVSX0lOLA0KICAgICAgc3lfTVBhOiBtZXRyaWMgPyBudW0oZWwuc3kpIDogbnVtKGVsLnN5KSAvIFBTSV9QRVJfTVBBLA0KICAgICAgc3V0X01QYTogbWV0cmljID8gbnVtKGVsLnN1dCkgOiBudW0oZWwuc3V0KSAvIFBTSV9QRVJfTVBBLA0KICAgICAgdGF1X01QYTogbWV0cmljID8gdGF1U3RyIDogdGF1U3RyIC8gUFNJX1BFUl9NUEEsDQogICAgICBrOiBudW0oZWwuayksDQogICAgICBuc2Y6IG51bShlbC5uc2YpLA0KICAgICAgbnBpbnM6IG51bShlbC5ucGlucyksDQogICAgICBzaGFyZTogbnVtKGVsLnNoYXJlKSwNCiAgICAgIEZfTjogZm9yY2VUb04oKSwNCiAgICAgIG5QbGFuZXM6IG5QbGFuZXMsDQogICAgICBzaGVhcjogZWwuc2hlYXIudmFsdWUsDQogICAgICBiZWFyaW5nOiBlbC5iZWFyaW5nICYmIGVsLmJlYXJpbmcuY2hlY2tlZCwNCiAgICAgIHRfbW06IG1ldHJpYyA/IG51bShlbC50aGlja25lc3MpIDogbnVtKGVsLnRoaWNrbmVzcykgKiBNTV9QRVJfSU4sDQogICAgICBnYXBfbW06IG1ldHJpYyA/IG51bShlbC5nYXApIDogbnVtKGVsLmdhcCkgKiBNTV9QRVJfSU4sDQogICAgICBwaW5UeXBlOiBlbC5waW5UeXBlLnZhbHVlDQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHZhbGlkYXRlKHNpKSB7DQogICAgdmFyIG9rID0gdHJ1ZTsNCiAgICBjbGVhckVycnMoKTsNCg0KICAgIGlmIChzaS5tb2RlICE9PSAiZGlhbWV0ZXIiKSB7DQogICAgICBpZiAoZW1wdHkoZWwuZCkgfHwgIWlzRmluaXRlKG51bShlbC5kKSkpIHsgc2V0RXJyKCJEIiwgIkVudGVyIHBpbiBkaWFtZXRlci4iKTsgb2sgPSBmYWxzZTsgfQ0KICAgICAgZWxzZSBpZiAoIShzaS5kID4gMCkpIHsgc2V0RXJyKCJEIiwgIkRpYW1ldGVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uIik7IG9rID0gZmFsc2U7IH0NCiAgICAgIGVsc2UgaWYgKHNpLmRfbW0gPCAxIHx8IHNpLmRfbW0gPiAyMDApIHsgc2V0RXJyKCJEIiwgIkRpYW1ldGVyIGxvb2tzIHVucmVhbGlzdGljICh0eXBpY2FsIDJcdTIwMTMyMDAgbW0pLiIpOyBvayA9IGZhbHNlOyB9DQogICAgfQ0KDQogICAgaWYgKHNpLm1vZGUgIT09ICJjYXBhY2l0eSIpIHsNCiAgICAgIGlmIChlbXB0eShlbC5GKSB8fCAhaXNGaW5pdGUobnVtKGVsLkYpKSkgeyBzZXRFcnIoIkYiLCAiRW50ZXIgYXBwbGllZCBzaGVhciBsb2FkLiIpOyBvayA9IGZhbHNlOyB9DQogICAgICBlbHNlIGlmICghKHNpLkZfTiA+IDApKSB7IHNldEVycigiRiIsICJBcHBsaWVkIGxvYWQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4iKTsgb2sgPSBmYWxzZTsgfQ0KICAgIH0NCg0KICAgIGlmIChlbXB0eShlbC5zeSkgfHwgIWlzRmluaXRlKG51bShlbC5zeSkpIHx8ICEoc2kuc3lfTVBhID4gMCkpIHsNCiAgICAgIHNldEVycigiU3kiLCAiRW50ZXIgeWllbGQgc3RyZW5ndGggZ3JlYXRlciB0aGFuIHplcm8uIik7DQogICAgICBvayA9IGZhbHNlOw0KICAgIH0NCg0KICAgIGlmIChlbC50YXVTb3VyY2UudmFsdWUgPT09ICJlc3RpbWF0ZSIpIHsNCiAgICAgIGlmIChlbXB0eShlbC5zdXQpIHx8ICFpc0Zpbml0ZShudW0oZWwuc3V0KSkgfHwgIShzaS5zdXRfTVBhID4gMCkpIHsNCiAgICAgICAgc2V0RXJyKCJTdXQiLCAiRW50ZXIgdWx0aW1hdGUgdGVuc2lsZSBzdHJlbmd0aCBmb3Igc2hlYXIgZXN0aW1hdGlvbi4iKTsNCiAgICAgICAgb2sgPSBmYWxzZTsNCiAgICAgIH0NCiAgICAgIGlmIChlbXB0eShlbC5rKSB8fCAhaXNGaW5pdGUobnVtKGVsLmspKSB8fCAhKHNpLmsgPiAwKSB8fCBzaS5rID4gMSkgew0KICAgICAgICBzZXRFcnIoIksiLCAiU2hlYXIgcmF0aW8gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEgKGRlZmF1bHQgMC42MCkuIik7DQogICAgICAgIG9rID0gZmFsc2U7DQogICAgICB9DQogICAgfSBlbHNlIHsNCiAgICAgIGlmIChlbXB0eShlbC50YXUpIHx8ICFpc0Zpbml0ZShudW0oZWwudGF1KSkgfHwgIShzaS50YXVfTVBhID4gMCkpIHsNCiAgICAgICAgc2V0RXJyKCJUYXUiLCAiRW50ZXIgc2hlYXIgc3RyZW5ndGggZ3JlYXRlciB0aGFuIHplcm8uIik7DQogICAgICAgIG9rID0gZmFsc2U7DQogICAgICB9DQogICAgfQ0KDQogICAgaWYgKGVtcHR5KGVsLm5zZikgfHwgIWlzRmluaXRlKG51bShlbC5uc2YpKSB8fCAhKHNpLm5zZiA+IDApKSB7DQogICAgICBzZXRFcnIoIk5zZiIsICJEZXNpZ24gc2FmZXR5IGZhY3RvciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLiIpOw0KICAgICAgb2sgPSBmYWxzZTsNCiAgICB9IGVsc2UgaWYgKHNpLm5zZiA8IDEgfHwgc2kubnNmID4gMTIpIHsNCiAgICAgIHNldEVycigiTnNmIiwgIkVudGVyIGEgc2FmZXR5IGZhY3RvciBiZXR3ZWVuIDEgYW5kIDEyLiIpOw0KICAgICAgb2sgPSBmYWxzZTsNCiAgICB9DQoNCiAgICBpZiAoZW1wdHkoZWwubnBpbnMpIHx8ICFpc0Zpbml0ZShudW0oZWwubnBpbnMpKSB8fCAhKHNpLm5waW5zID49IDEpIHx8IE1hdGguZmxvb3Ioc2kubnBpbnMpICE9PSBzaS5ucGlucykgew0KICAgICAgc2V0RXJyKCJOcGlucyIsICJOdW1iZXIgb2YgcGlucyBtdXN0IGJlIGFuIGludGVnZXIgXHUyMjY1IDEuIik7DQogICAgICBvayA9IGZhbHNlOw0KICAgIH0NCg0KICAgIGlmIChlbXB0eShlbC5zaGFyZSkgfHwgIWlzRmluaXRlKG51bShlbC5zaGFyZSkpIHx8ICEoc2kuc2hhcmUgPiAwKSB8fCBzaS5zaGFyZSA+IDEpIHsNCiAgICAgIHNldEVycigiU2hhcmUiLCAiTG9hZCBzaGFyaW5nIGZhY3RvciBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMS4iKTsNCiAgICAgIG9rID0gZmFsc2U7DQogICAgfQ0KDQogICAgaWYgKHNpLmJlYXJpbmcpIHsNCiAgICAgIGlmIChlbXB0eShlbC50aGlja25lc3MpIHx8ICFpc0Zpbml0ZShudW0oZWwudGhpY2tuZXNzKSkgfHwgIShzaS50X21tID4gMCkpIHsNCiAgICAgICAgc2V0RXJyKCJUIiwgIkVudGVyIHBsYXRlIG9yIGx1ZyB0aGlja25lc3MgZ3JlYXRlciB0aGFuIHplcm8uIik7DQogICAgICAgIG9rID0gZmFsc2U7DQogICAgICB9DQogICAgfQ0KDQogICAgaWYgKCFlbXB0eShlbC5nYXApICYmIGlzRmluaXRlKG51bShlbC5nYXApKSAmJiBzaS5nYXBfbW0gPCAwKSB7DQogICAgICBzZXRFcnIoIkdhcCIsICJQbGF0ZSBnYXAgY2Fubm90IGJlIG5lZ2F0aXZlLiIpOw0KICAgICAgb2sgPSBmYWxzZTsNCiAgICB9DQoNCiAgICByZXR1cm4gb2s7DQogIH0NCg0KICBmdW5jdGlvbiBzZXRHYXVnZShzZikgew0KICAgIHZhciBmcmFjID0gY2xhbXAoKGlzRmluaXRlKHNmKSA/IHNmIDogMCkgLyA0LCAwLCAxKTsNCiAgICBpZiAoZWwuZ2F1Z2VBcmMpIGVsLmdhdWdlQXJjLnNldEF0dHJpYnV0ZSgic3Ryb2tlLWRhc2hvZmZzZXQiLCBTdHJpbmcoQVJDX0xFTiAqICgxIC0gZnJhYykpKTsNCiAgICB2YXIgYW5nID0gLTkwICsgZnJhYyAqIDE4MDsNCiAgICBpZiAoZWwubmVlZGxlKSBlbC5uZWVkbGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCAicm90YXRlKCIgKyBhbmcgKyAiIDEyMCAxMTgpIik7DQogIH0NCg0KICBmdW5jdGlvbiBzZXRTY2hlbWF0aWMoc3RhdHVzLCBzaGVhcikgew0KICAgIGlmICghZWwuc2NoZW1hdGljKSByZXR1cm47DQogICAgZWwuc2NoZW1hdGljLnNldEF0dHJpYnV0ZSgiZGF0YS1zdGF0dXMiLCBzdGF0dXMgfHwgImlkbGUiKTsNCiAgICBlbC5zY2hlbWF0aWMuc2V0QXR0cmlidXRlKCJkYXRhLXNoZWFyIiwgc2hlYXIgPT09ICJkb3VibGUiID8gImRvdWJsZSIgOiAic2luZ2xlIik7DQogIH0NCg0KICBmdW5jdGlvbiBzZXRCYXIobm9kZSwgcGN0KSB7DQogICAgaWYgKCFub2RlKSByZXR1cm47DQogICAgbm9kZS5zdHlsZS53aWR0aCA9IGNsYW1wKHBjdCwgMCwgMTAwKSArICIlIjsNCiAgfQ0KDQogIGZ1bmN0aW9uIGNhbGN1bGF0ZShzY3JvbGwpIHsNCiAgICB1cGRhdGVNb2RlVUkoKTsNCiAgICB2YXIgc2kgPSB0b1NJKCk7DQogICAgdmFyIG9rID0gdmFsaWRhdGUoc2kpOw0KICAgIGlmIChlbC5yZXN1bHRzKSBlbC5yZXN1bHRzLmNsYXNzTGlzdC5yZW1vdmUoInBzc2MtaGlkZGVuIik7DQoNCiAgICBpZiAoIW9rKSB7DQogICAgICBzdGF0ZS5saXZlID0gZmFsc2U7DQogICAgICBlbC5zdGF0dXNUaXRsZS50ZXh0Q29udGVudCA9ICJDaGVjayBpbnB1dHMiOw0KICAgICAgZWwuc3RhdHVzTm90ZS50ZXh0Q29udGVudCA9ICJDb3JyZWN0IHRoZSBoaWdobGlnaHRlZCBmaWVsZHMsIHRoZW4gY2FsY3VsYXRlIGFnYWluLiI7DQogICAgICBlbC5iYW5uZXIuY2xhc3NOYW1lID0gInBzc2MtYmFubmVyIHBzc2MtYmFubmVyLWNhdXRpb24iOw0KICAgICAgc2V0R2F1Z2UoMCk7DQogICAgICBzZXRTY2hlbWF0aWMoImlkbGUiLCBzaS5zaGVhcik7DQogICAgICBpZiAoc2Nyb2xsKSBzY3JvbGxUb1Jlc3VsdHMoKTsNCiAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICB2YXIgdGF1U3RyZW5ndGggPSBzaS50YXVfTVBhOw0KICAgIGlmIChlbC50YXVTb3VyY2UudmFsdWUgPT09ICJlc3RpbWF0ZSIpIHsNCiAgICAgIHRhdVN0cmVuZ3RoID0gc2kuayAqIHNpLnN1dF9NUGE7DQogICAgfQ0KICAgIHZhciB0YXVBbGxvdyA9IHRhdVN0cmVuZ3RoIC8gc2kubnNmOw0KICAgIHZhciBuUGxhbmVzID0gc2kublBsYW5lczsNCiAgICB2YXIgRnRvdGFsID0gc2kubW9kZSA9PT0gImNhcGFjaXR5IiA/IDAgOiBzaS5GX047DQogICAgdmFyIEZwaW4gPSBzaS5tb2RlID09PSAiY2FwYWNpdHkiID8gMCA6IEZ0b3RhbCAqIHNpLnNoYXJlIC8gc2kubnBpbnM7DQoNCiAgICB2YXIgZF9tbSA9IHNpLmRfbW07DQogICAgdmFyIEEgPSBzaS5tb2RlID09PSAiZGlhbWV0ZXIiID8gTmFOIDogTWF0aC5QSSAvIDQgKiBkX21tICogZF9tbTsNCiAgICB2YXIgQWVmZiA9IGlzRmluaXRlKEEpID8gQSAqIG5QbGFuZXMgOiBOYU47DQoNCiAgICB2YXIgZFJlcXVpcmVkID0gTWF0aC5zcXJ0KDQgKiBGcGluIC8gKE1hdGguUEkgKiBuUGxhbmVzICogdGF1QWxsb3cpKTsNCiAgICBpZiAoc2kubW9kZSA9PT0gImRpYW1ldGVyIikgZF9tbSA9IGRSZXF1aXJlZDsNCg0KICAgIGlmIChzaS5tb2RlID09PSAiZGlhbWV0ZXIiKSB7DQogICAgICBBID0gTWF0aC5QSSAvIDQgKiBkX21tICogZF9tbTsNCiAgICAgIEFlZmYgPSBBICogblBsYW5lczsNCiAgICB9DQoNCiAgICB2YXIgRmFsbG93ID0gQWVmZiAqIHRhdUFsbG93Ow0KICAgIHZhciB0YXUgPSBzaS5tb2RlID09PSAiY2FwYWNpdHkiID8gMCA6IEZwaW4gLyBBZWZmOw0KICAgIHZhciBzZkFjdHVhbCA9IHRhdVN0cmVuZ3RoIC8gKHRhdSA+IDAgPyB0YXUgOiAxZS0xMik7DQogICAgdmFyIHNmQWxsb3cgPSBGYWxsb3cgLyAoRnBpbiA+IDAgPyBGcGluIDogMWUtMTIpOw0KICAgIHZhciB1dGlsID0gc2kubW9kZSA9PT0gImNhcGFjaXR5IiA/IDAgOiAoRnBpbiAvIEZhbGxvdykgKiAxMDA7DQoNCiAgICB2YXIgYmVhcmluZ1N0cmVzcyA9IE5hTjsNCiAgICB2YXIgYmVhcmluZ0FsbG93ID0gTmFOOw0KICAgIGlmIChzaS5iZWFyaW5nICYmIHNpLnRfbW0gPiAwICYmIGRfbW0gPiAwKSB7DQogICAgICBiZWFyaW5nU3RyZXNzID0gRnBpbiAvIChkX21tICogc2kudF9tbSk7DQogICAgICBiZWFyaW5nQWxsb3cgPSBzaS5zeV9NUGE7DQogICAgfQ0KDQogICAgdmFyIGdvdmVybmluZyA9ICJQaW4gU2hlYXIiOw0KICAgIGlmIChzaS5iZWFyaW5nICYmIGlzRmluaXRlKGJlYXJpbmdTdHJlc3MpICYmIGJlYXJpbmdTdHJlc3MgPiB0YXUpIHsNCiAgICAgIGlmIChiZWFyaW5nU3RyZXNzID49IGJlYXJpbmdBbGxvdykgZ292ZXJuaW5nID0gIkJlYXJpbmciOw0KICAgICAgZWxzZSBpZiAoYmVhcmluZ1N0cmVzcyAvIGJlYXJpbmdBbGxvdyA+IHRhdSAvIHRhdUFsbG93KSBnb3Zlcm5pbmcgPSAiQmVhcmluZyI7DQogICAgfQ0KICAgIGlmIChzaS5nYXBfbW0gPiAwLjUgKiBkX21tKSBnb3Zlcm5pbmcgPSAiUmV2aWV3IEJlbmRpbmciOw0KDQogICAgdmFyIGFsZXJ0cyA9IFtdOw0KICAgIHZhciBzdGF0dXMgPSAic2FmZSI7DQogICAgdmFyIHRpdGxlID0gIlNhZmUiOw0KICAgIHZhciBub3RlID0gIkFjdHVhbCBzaGVhciBzdHJlc3MgaXMgYmVsb3cgYWxsb3dhYmxlIHNoZWFyIHN0cmVzcyBmb3IgdGhlIHNlbGVjdGVkIGRlc2lnbiBzYWZldHkgZmFjdG9yLiI7DQoNCiAgICBpZiAoc2kuc2hlYXIgPT09ICJkb3VibGUiKSB7DQogICAgICBhbGVydHMucHVzaCh7IHR5cGU6ICJvayIsIHRleHQ6ICJEb3VibGUgc2hlYXI6IGVmZmVjdGl2ZSBzaGVhciBhcmVhID0gMiBcdTAwZDcgQS4gQm90aCBwbGFuZXMgYXNzdW1lZCBlcXVhbGx5IGxvYWRlZC4iIH0pOw0KICAgIH0gZWxzZSB7DQogICAgICBhbGVydHMucHVzaCh7IHR5cGU6ICJvayIsIHRleHQ6ICJTaW5nbGUgc2hlYXI6IGVmZmVjdGl2ZSBzaGVhciBhcmVhID0gQS4gQ29uc2lkZXIgZG91YmxlIHNoZWFyIHdoZXJlIHByYWN0aWNhbCB0byBpbmNyZWFzZSBjYXBhY2l0eS4iIH0pOw0KICAgIH0NCg0KICAgIGlmIChzaS5ucGlucyA+IDEpIHsNCiAgICAgIGFsZXJ0cy5wdXNoKHsNCiAgICAgICAgdHlwZTogIm9rIiwNCiAgICAgICAgdGV4dDogIkxvYWQgcGVyIHBpbiA9IHRvdGFsIGxvYWQgXHUwMGQ3ICIgKyBmbXQoc2kuc2hhcmUsIDIpICsgIiAvICIgKyBzaS5ucGlucyArICIgPSAiICsgZm9ybWF0Rm9yY2UoRnBpbikucHJpbWFyeSArICIuIg0KICAgICAgfSk7DQogICAgfQ0KDQogICAgaWYgKHNpLm1vZGUgIT09ICJkaWFtZXRlciIgJiYgZF9tbSA8IGRSZXF1aXJlZCkgew0KICAgICAgYWxlcnRzLnB1c2goew0KICAgICAgICB0eXBlOiAicmlzayIsDQogICAgICAgIHRleHQ6ICJTZWxlY3RlZCBkaWFtZXRlciAiICsgZm9ybWF0TGVuZ3RoKGRfbW0pICsgIiBpcyBiZWxvdyByZXF1aXJlZCAiICsgZm9ybWF0TGVuZ3RoKGRSZXF1aXJlZCkgKyAiLiBJbmNyZWFzZSBwaW4gZGlhbWV0ZXIuIg0KICAgICAgfSk7DQogICAgfQ0KDQogICAgaWYgKHNpLm1vZGUgPT09ICJkaWFtZXRlciIpIHsNCiAgICAgIGFsZXJ0cy5wdXNoKHsgdHlwZTogIm9rIiwgdGV4dDogIlJlcXVpcmVkIGRpYW1ldGVyIGQgPSBcdTIyMWEoNEYgLyAoXHUwM2MwIFx1MDBkNyBuIFx1MDBkNyBcdTAzYzRhbGxvdykpID0gIiArIGZvcm1hdExlbmd0aChkUmVxdWlyZWQpICsgIi4iIH0pOw0KICAgIH0NCg0KICAgIGlmICh1dGlsID4gMTAwIHx8IHRhdSA+PSB0YXVBbGxvdykgew0KICAgICAgc3RhdHVzID0gInJpc2siOw0KICAgICAgdGl0bGUgPSAiSGlnaCBSaXNrIjsNCiAgICAgIG5vdGUgPSAiQXBwbGllZCBsb2FkIGV4Y2VlZHMgYWxsb3dhYmxlIHNoZWFyIGNhcGFjaXR5LiBJbmNyZWFzZSBwaW4gZGlhbWV0ZXIsIHVzZSBkb3VibGUgc2hlYXIsIGFkZCBwaW5zLCBvciBzZWxlY3QgaGlnaGVyLXN0cmVuZ3RoIG1hdGVyaWFsLiI7DQogICAgICBhbGVydHMudW5zaGlmdCh7IHR5cGU6ICJyaXNrIiwgdGV4dDogIkFwcGxpZWQgbG9hZCBwZXIgcGluIGV4Y2VlZHMgYWxsb3dhYmxlIHNoZWFyIGxvYWQuIExvYWQgdXRpbGl6YXRpb24gIiArIGZtdCh1dGlsLCAxKSArICIlLiIgfSk7DQogICAgfSBlbHNlIGlmICh1dGlsID49IDg1IHx8IHNmQWxsb3cgPCAxLjE1KSB7DQogICAgICBzdGF0dXMgPSAiY2F1dGlvbiI7DQogICAgICB0aXRsZSA9ICJDYXV0aW9uIjsNCiAgICAgIG5vdGUgPSAiTG9hZCB1dGlsaXphdGlvbiBhcHByb2FjaGVzIHRoZSBhbGxvd2FibGUgbGltaXQuIENvbmZpcm0gam9pbnQgZ2VvbWV0cnkgYW5kIGFwcGxpY2FibGUgc3RhbmRhcmRzLiI7DQogICAgICBhbGVydHMudW5zaGlmdCh7IHR5cGU6ICJ3YXJuIiwgdGV4dDogIkxvYWQgdXRpbGl6YXRpb24gaXMgIiArIGZtdCh1dGlsLCAxKSArICIlIG9mIGFsbG93YWJsZSBjYXBhY2l0eS4iIH0pOw0KICAgIH0gZWxzZSBpZiAoc2kubW9kZSAhPT0gImNhcGFjaXR5Iikgew0KICAgICAgYWxlcnRzLnVuc2hpZnQoeyB0eXBlOiAib2siLCB0ZXh0OiAiUGluIHNoZWFyIHNhZmV0eSBzdGF0dXMgaXMgU2FmZS4gU2FmZXR5IGZhY3RvciA9ICIgKyBmbXQoc2ZBY3R1YWwsIDIpICsgIiAoXHUwM2M0c3RyZW5ndGggLyBcdTAzYzQpLiIgfSk7DQogICAgfQ0KDQogICAgaWYgKHNpLmJlYXJpbmcgJiYgaXNGaW5pdGUoYmVhcmluZ1N0cmVzcykpIHsNCiAgICAgIGlmIChiZWFyaW5nU3RyZXNzID49IGJlYXJpbmdBbGxvdykgew0KICAgICAgICBzdGF0dXMgPSAicmlzayI7DQogICAgICAgIHRpdGxlID0gIkhpZ2ggUmlzayI7DQogICAgICAgIGdvdmVybmluZyA9ICJCZWFyaW5nIjsNCiAgICAgICAgYWxlcnRzLnB1c2goeyB0eXBlOiAicmlzayIsIHRleHQ6ICJCZWFyaW5nIHN0cmVzcyAiICsgZm9ybWF0U3RyZXNzKGJlYXJpbmdTdHJlc3MpLnByaW1hcnkgKyAiIGV4Y2VlZHMgeWllbGQtYmFzZWQgbGltaXQuIEluY3JlYXNlIHBsYXRlIHRoaWNrbmVzcy4iIH0pOw0KICAgICAgfSBlbHNlIGlmIChiZWFyaW5nU3RyZXNzID49IDAuODUgKiBiZWFyaW5nQWxsb3cpIHsNCiAgICAgICAgYWxlcnRzLnB1c2goeyB0eXBlOiAid2FybiIsIHRleHQ6ICJCZWFyaW5nIHN0cmVzcyBhcHByb2FjaGVzIHRoZSBhbGxvd2FibGUgbGltaXQgKCIgKyBmbXQoYmVhcmluZ1N0cmVzcyAvIGJlYXJpbmdBbGxvdyAqIDEwMCwgMSkgKyAiJSBvZiBTeSkuIiB9KTsNCiAgICAgICAgaWYgKHN0YXR1cyA9PT0gInNhZmUiKSB7IHN0YXR1cyA9ICJjYXV0aW9uIjsgdGl0bGUgPSAiQ2F1dGlvbiI7IH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAoc2kuZ2FwX21tID4gMC41ICogZF9tbSkgew0KICAgICAgYWxlcnRzLnB1c2goeyB0eXBlOiAid2FybiIsIHRleHQ6ICJMYXJnZSB1bnN1cHBvcnRlZCBzcGFuIG9yIHBsYXRlIGdhcCAoIiArIGZvcm1hdExlbmd0aChzaS5nYXBfbW0pICsgIikgbWF5IGNhdXNlIHBpbiBiZW5kaW5nIHRvIGdvdmVybi4gUmV2aWV3IGpvaW50IGdlb21ldHJ5LiIgfSk7DQogICAgICBpZiAoZ292ZXJuaW5nID09PSAiUGluIFNoZWFyIikgZ292ZXJuaW5nID0gIlJldmlldyBCZW5kaW5nIjsNCiAgICB9DQoNCiAgICB2YXIgdEZtdCA9IGZvcm1hdFN0cmVzcyh0YXUpOw0KICAgIHZhciBmYWxsb3dGbXQgPSBmb3JtYXRGb3JjZShGYWxsb3cpOw0KICAgIHZhciBmcGluRm10ID0gZm9ybWF0Rm9yY2UoRnBpbik7DQoNCiAgICBpZiAoZWwub3V0U3RyZXNzKSB7DQogICAgICBlbC5vdXRTdHJlc3MudGV4dENvbnRlbnQgPSBzaS5tb2RlID09PSAiY2FwYWNpdHkiID8gIlx1MjAxNCIgOiB0Rm10LnByaW1hcnk7DQogICAgICBlbC5vdXRTdHJlc3NTdWIudGV4dENvbnRlbnQgPSBzaS5tb2RlID09PSAiY2FwYWNpdHkiID8gIkVudGVyIGxvYWQgaW4gY2FwYWNpdHkgbW9kZSIgOiAiXHUwM2M0ID0gRiAvIEFlZmYiOw0KICAgIH0NCiAgICBpZiAoZWwub3V0RmFsbG93KSB7DQogICAgICBlbC5vdXRGYWxsb3cudGV4dENvbnRlbnQgPSBmYWxsb3dGbXQucHJpbWFyeTsNCiAgICAgIGVsLm91dEZhbGxvd1N1Yi50ZXh0Q29udGVudCA9ICJGYWxsb3cgPSBcdTAzYzRhbGxvdyBcdTAwZDcgQWVmZiI7DQogICAgfQ0KICAgIGlmIChlbC5vdXREcmVxKSB7DQogICAgICBlbC5vdXREcmVxLnRleHRDb250ZW50ID0gZm9ybWF0TGVuZ3RoKGRSZXF1aXJlZCk7DQogICAgICBlbC5vdXREcmVxU3ViLnRleHRDb250ZW50ID0gImQgPSBcdTIyMWEoNEYgLyAoXHUwM2MwIG4gXHUwM2M0YWxsb3cpKSI7DQogICAgfQ0KICAgIGlmIChlbC5vdXRTZikgew0KICAgICAgZWwub3V0U2YudGV4dENvbnRlbnQgPSBzaS5tb2RlID09PSAiY2FwYWNpdHkiID8gIlx1MjAxNCIgOiBmbXQoc2ZBY3R1YWwsIDIpOw0KICAgICAgZWwub3V0U2ZTdWIudGV4dENvbnRlbnQgPSAiXHUwM2M0c3RyZW5ndGggLyBcdTAzYzRhY3R1YWwiOw0KICAgIH0NCg0KICAgIGlmIChlbC5vdXRVdGlsKSBlbC5vdXRVdGlsLnRleHRDb250ZW50ID0gc2kubW9kZSA9PT0gImNhcGFjaXR5IiA/ICJcdTIwMTQiIDogZm10KHV0aWwsIDEpICsgIiUgb2YgYWxsb3dhYmxlIjsNCiAgICBpZiAoZWwudXRpbEZpbGwpIHsNCiAgICAgIGVsLnV0aWxGaWxsLnN0eWxlLndpZHRoID0gY2xhbXAodXRpbCwgMCwgMTAwKSArICIlIjsNCiAgICAgIGVsLnV0aWxGaWxsLmNsYXNzTmFtZSA9ICJwc3NjLXV0aWwtZmlsbCIgKyAoc3RhdHVzID09PSAicmlzayIgPyAiIHBzc2MtaXMtcmlzayIgOiBzdGF0dXMgPT09ICJjYXV0aW9uIiA/ICIgcHNzYy1pcy1jYXV0aW9uIiA6ICIgcHNzYy1pcy1vayIpOw0KICAgIH0NCg0KICAgIGlmIChlbC5vdXRBcmVhKSBlbC5vdXRBcmVhLnRleHRDb250ZW50ID0gZm9ybWF0QXJlYShBKTsNCiAgICBpZiAoZWwub3V0QWVmZikgZWwub3V0QWVmZi50ZXh0Q29udGVudCA9IGZvcm1hdEFyZWEoQWVmZik7DQogICAgaWYgKGVsLm91dFRhdUFsbG93KSBlbC5vdXRUYXVBbGxvdy50ZXh0Q29udGVudCA9IGZvcm1hdFN0cmVzcyh0YXVBbGxvdykucHJpbWFyeTsNCiAgICBpZiAoZWwub3V0RnBpbikgZWwub3V0RnBpbi50ZXh0Q29udGVudCA9IHNpLm1vZGUgPT09ICJjYXBhY2l0eSIgPyAiXHUyMDE0IiA6IGZwaW5GbXQucHJpbWFyeTsNCiAgICBpZiAoZWwub3V0RnBpbk5vdGUpIHsNCiAgICAgIGVsLm91dEZwaW5Ob3RlLnRleHRDb250ZW50ID0gc2kubnBpbnMgPiAxDQogICAgICAgID8gInRvdGFsICIgKyBmb3JtYXRGb3JjZShGdG90YWwpLnByaW1hcnkgKyAiIFx1MDBkNyAiICsgZm10KHNpLnNoYXJlLCAyKSArICIgLyAiICsgc2kubnBpbnMNCiAgICAgICAgOiAic2luZ2xlIHBpbiI7DQogICAgfQ0KICAgIGlmIChlbC5vdXRCZWFyaW5nKSB7DQogICAgICBlbC5vdXRCZWFyaW5nLnRleHRDb250ZW50ID0gc2kuYmVhcmluZyAmJiBpc0Zpbml0ZShiZWFyaW5nU3RyZXNzKSA/IGZvcm1hdFN0cmVzcyhiZWFyaW5nU3RyZXNzKS5wcmltYXJ5IDogIlx1MjAxNCI7DQogICAgfQ0KICAgIGlmIChlbC5vdXRCZWFyaW5nTm90ZSkgew0KICAgICAgZWwub3V0QmVhcmluZ05vdGUudGV4dENvbnRlbnQgPSBzaS5iZWFyaW5nID8gIlx1MDNjMyA9IEYgLyAoZCBcdTAwZDcgdCkiIDogIkVuYWJsZSBiZWFyaW5nIGNoZWNrIjsNCiAgICB9DQogICAgaWYgKGVsLm91dEdvdmVybmluZykgZWwub3V0R292ZXJuaW5nLnRleHRDb250ZW50ID0gZ292ZXJuaW5nOw0KDQogICAgaWYgKGVsLmdhdWdlUmVhZCkgZWwuZ2F1Z2VSZWFkLnRleHRDb250ZW50ID0gc2kubW9kZSA9PT0gImNhcGFjaXR5IiA/ICJcdTIwMTQiIDogZm10KHNmQWN0dWFsLCAyKTsNCiAgICBpZiAoZWwuZ2F1Z2VOb3RlKSBlbC5nYXVnZU5vdGUudGV4dENvbnRlbnQgPSAiU2FmZXR5IGZhY3RvciAoc2NhbGUgMFx1MjAxMzQpIjsNCiAgICBzZXRHYXVnZShzaS5tb2RlID09PSAiY2FwYWNpdHkiID8gMCA6IHNmQWN0dWFsKTsNCg0KICAgIGlmIChlbC5zY2hGb3JjZSkgZWwuc2NoRm9yY2UudGV4dENvbnRlbnQgPSBzaS5tb2RlID09PSAiY2FwYWNpdHkiID8gIlx1MjAxNCIgOiBmcGluRm10LnByaW1hcnk7DQogICAgaWYgKGVsLnNjaENhcHRpb24pIHsNCiAgICAgIGVsLnNjaENhcHRpb24udGV4dENvbnRlbnQgPSBzaS5zaGVhciA9PT0gImRvdWJsZSIgPyAiRG91YmxlIHNoZWFyICBcdTAwYjcgIDIgcGxhbmVzIiA6ICJTaW5nbGUgc2hlYXIgIFx1MDBiNyAgMSBwbGFuZSI7DQogICAgfQ0KICAgIHNldFNjaGVtYXRpYyhzdGF0dXMgPT09ICJyaXNrIiA/ICJyaXNrIiA6IHN0YXR1cyA9PT0gImNhdXRpb24iID8gImNhdXRpb24iIDogIm9rIiwgc2kuc2hlYXIpOw0KDQogICAgdmFyIHNjYWxlID0gTWF0aC5tYXgodGF1QWxsb3csIHRhdSwgMSk7DQogICAgc2V0QmFyKGVsLmJhclRhdSwgc2kubW9kZSA9PT0gImNhcGFjaXR5IiA/IDAgOiB0YXUgLyBzY2FsZSAqIDEwMCk7DQogICAgc2V0QmFyKGVsLmJhclRhLCB0YXVBbGxvdyAvIHNjYWxlICogMTAwKTsNCiAgICBpZiAoZWwuYmFyVGF1VmFsKSBlbC5iYXJUYXVWYWwudGV4dENvbnRlbnQgPSBzaS5tb2RlID09PSAiY2FwYWNpdHkiID8gIlx1MjAxNCIgOiB0Rm10LnByaW1hcnk7DQogICAgaWYgKGVsLmJhclRhVmFsKSBlbC5iYXJUYVZhbC50ZXh0Q29udGVudCA9IGZvcm1hdFN0cmVzcyh0YXVBbGxvdykucHJpbWFyeTsNCiAgICBpZiAoZWwuYmFyVGF1KSB7DQogICAgICBlbC5iYXJUYXUuY2xhc3NOYW1lID0gInBzc2MtYmFyLWZpbGwiICsgKHN0YXR1cyA9PT0gInJpc2siID8gIiBwc3NjLWlzLXJpc2siIDogc3RhdHVzID09PSAiY2F1dGlvbiIgPyAiIHBzc2MtaXMtY2F1dGlvbiIgOiAiIHBzc2MtaXMtb2siKTsNCiAgICB9DQoNCiAgICBlbC5zdGF0dXNUaXRsZS50ZXh0Q29udGVudCA9IHRpdGxlOw0KICAgIGVsLnN0YXR1c05vdGUudGV4dENvbnRlbnQgPSBub3RlOw0KICAgIGVsLmJhbm5lci5jbGFzc05hbWUgPSAicHNzYy1iYW5uZXIgcHNzYy1iYW5uZXItIiArIChzdGF0dXMgPT09ICJzYWZlIiA/ICJvayIgOiBzdGF0dXMgPT09ICJyaXNrIiA/ICJyaXNrIiA6ICJjYXV0aW9uIik7DQoNCiAgICBpZiAoZWwuYWxlcnRzKSB7DQogICAgICBlbC5hbGVydHMuaW5uZXJIVE1MID0gIiI7DQogICAgICBhbGVydHMuZm9yRWFjaChmdW5jdGlvbiAoYSkgew0KICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7DQogICAgICAgIGRpdi5jbGFzc05hbWUgPSAicHNzYy1hbGVydCBwc3NjLWFsZXJ0LSIgKyAoYS50eXBlID09PSAicmlzayIgPyAicmlzayIgOiBhLnR5cGUgPT09ICJvayIgPyAib2siIDogIndhcm4iKTsNCiAgICAgICAgZGl2LnRleHRDb250ZW50ID0gYS50ZXh0Ow0KICAgICAgICBlbC5hbGVydHMuYXBwZW5kQ2hpbGQoZGl2KTsNCiAgICAgIH0pOw0KICAgIH0NCg0KICAgIHN0YXRlLmxpdmUgPSB0cnVlOw0KICAgIGlmIChzY3JvbGwpIHNjcm9sbFRvUmVzdWx0cygpOw0KICB9DQoNCiAgZnVuY3Rpb24gc2Nyb2xsVG9SZXN1bHRzKCkgew0KICAgIHRyeSB7DQogICAgICBpZiAoZWwuYmFubmVyKSBlbC5iYW5uZXIuY2xvc2VzdCgiLnBzc2MtY2FyZCIpLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICJzbW9vdGgiLCBibG9jazogIm5lYXJlc3QiIH0pOw0KICAgIH0gY2F0Y2ggKGUpIHt9DQogIH0NCg0KICBmdW5jdGlvbiBvblJvb3RDbGljayhlKSB7DQogICAgdmFyIGJ0biA9IGUudGFyZ2V0ICYmIGUudGFyZ2V0LmNsb3Nlc3QgPyBlLnRhcmdldC5jbG9zZXN0KCJidXR0b24iKSA6IG51bGw7DQogICAgaWYgKCFidG4gfHwgIXJvb3QuY29udGFpbnMoYnRuKSkgcmV0dXJuOw0KICAgIGlmIChidG4uaWQgPT09ICJwc3NjQnRuTWV0cmljIikgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN3aXRjaFVuaXQoIm1ldHJpYyIpOyB9DQogICAgZWxzZSBpZiAoYnRuLmlkID09PSAicHNzY0J0bkltcGVyaWFsIikgeyBlLnByZXZlbnREZWZhdWx0KCk7IHN3aXRjaFVuaXQoImltcGVyaWFsIik7IH0NCiAgICBlbHNlIGlmIChidG4uaWQgPT09ICJwc3NjQnRuQ2FsY3VsYXRlIikgeyBlLnByZXZlbnREZWZhdWx0KCk7IGNhbGN1bGF0ZSh0cnVlKTsgfQ0KICB9DQoNCiAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIG9uUm9vdENsaWNrKTsNCiAgaWYgKGVsLmJ0bkNhbGMpIGVsLmJ0bkNhbGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoKSB7IGNhbGN1bGF0ZSh0cnVlKTsgfSk7DQoNCiAgaWYgKGVsLm1hdGVyaWFsKSBlbC5tYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7DQogICAgaWYgKGVsLm1hdGVyaWFsLnZhbHVlID09PSAiY3VzdG9tIikgew0KICAgICAgZWwuc3kucmVhZE9ubHkgPSBmYWxzZTsNCiAgICAgIGlmIChlbC5zdXQpIGVsLnN1dC5yZWFkT25seSA9IGZhbHNlOw0KICAgIH0gZWxzZSBhcHBseU1hdGVyaWFsKCk7DQogICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7DQogIH0pOw0KDQogIFsic3kiLCAic3V0IiwgInRhdSIsICJrIl0uZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsNCiAgICB2YXIgbm9kZSA9IGVsW2lkID09PSAic3kiID8gInN5IiA6IGlkID09PSAic3V0IiA/ICJzdXQiIDogaWQgPT09ICJ0YXUiID8gInRhdSIgOiAiayJdOw0KICAgIGlmICghbm9kZSkgcmV0dXJuOw0KICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiAoKSB7DQogICAgICBtYXJrQ3VzdG9tTWF0ZXJpYWwoKTsNCiAgICAgIGlmIChlbC50YXVTb3VyY2UudmFsdWUgPT09ICJlc3RpbWF0ZSIpIHVwZGF0ZVRhdUZyb21Fc3RpbWF0ZSgpOw0KICAgICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7DQogICAgfSk7DQogIH0pOw0KDQogIGlmIChlbC50YXVTb3VyY2UpIGVsLnRhdVNvdXJjZS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7DQogICAgb25UYXVTb3VyY2VDaGFuZ2UoKTsNCiAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsNCiAgfSk7DQoNCiAgWyJkIiwgIkYiLCAibnNmIiwgIm5waW5zIiwgInNoYXJlIiwgInRoaWNrbmVzcyIsICJnYXAiXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsNCiAgICB2YXIgbWFwID0geyBkOiBlbC5kLCBGOiBlbC5GLCBuc2Y6IGVsLm5zZiwgbnBpbnM6IGVsLm5waW5zLCBzaGFyZTogZWwuc2hhcmUsIHRoaWNrbmVzczogZWwudGhpY2tuZXNzLCBnYXA6IGVsLmdhcCB9Ow0KICAgIGlmICghbWFwW2tleV0pIHJldHVybjsNCiAgICBtYXBba2V5XS5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uICgpIHsNCiAgICAgIGlmIChrZXkgPT09ICJkIiAmJiBlbC5zaXplQ2hpcHMpIGVsLnNpemVDaGlwcy5xdWVyeVNlbGVjdG9yQWxsKCIucHNzYy1jaGlwIikuZm9yRWFjaChmdW5jdGlvbiAoYikgeyBiLmNsYXNzTGlzdC5yZW1vdmUoInBzc2MtaXMtYWN0aXZlIik7IH0pOw0KICAgICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7DQogICAgfSk7DQogIH0pOw0KDQogIGlmIChlbC5tb2RlKSBlbC5tb2RlLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICB1cGRhdGVNb2RlVUkoKTsNCiAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsNCiAgfSk7DQoNCiAgaWYgKGVsLnNoZWFyKSBlbC5zaGVhci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiAoKSB7DQogICAgaWYgKHN0YXRlLmxpdmUpIGNhbGN1bGF0ZShmYWxzZSk7DQogIH0pOw0KDQogIGlmIChlbC5iZWFyaW5nKSBlbC5iZWFyaW5nLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICBpZiAoZWwuYmVhcmluZ0ZpZWxkcykgZWwuYmVhcmluZ0ZpZWxkcy5jbGFzc0xpc3QudG9nZ2xlKCJwc3NjLWhpZGRlbiIsICFlbC5iZWFyaW5nLmNoZWNrZWQpOw0KICAgIGlmIChzdGF0ZS5saXZlKSBjYWxjdWxhdGUoZmFsc2UpOw0KICB9KTsNCg0KICBpZiAoZWwuZlVuaXQpIGVsLmZVbml0LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uICgpIHsNCiAgICB2YXIgbmV4dCA9IGVsLmZVbml0LnZhbHVlOw0KICAgIGlmIChuZXh0ID09PSBsYXN0RlVuaXQpIHJldHVybjsNCiAgICB2YXIgRiA9IG51bShlbC5GKTsNCiAgICBlbC5mVW5pdC52YWx1ZSA9IGxhc3RGVW5pdDsNCiAgICBpZiAoaXNGaW5pdGUoRikpIGVsLkYudmFsdWUgPSByb3VuZFNtYXJ0KGNvbnZlcnRGb3JjZVVuaXRWYWx1ZShGLCBsYXN0RlVuaXQsIG5leHQpKTsNCiAgICBlbC5mVW5pdC52YWx1ZSA9IG5leHQ7DQogICAgbGFzdEZVbml0ID0gbmV4dDsNCiAgICBpZiAoc3RhdGUubGl2ZSkgY2FsY3VsYXRlKGZhbHNlKTsNCiAgfSk7DQoNCiAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gKGUpIHsNCiAgICBpZiAoZS5rZXkgPT09ICJFbnRlciIgJiYgZS50YXJnZXQgJiYgZS50YXJnZXQudGFnTmFtZSA9PT0gIklOUFVUIikgew0KICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgY2FsY3VsYXRlKHRydWUpOw0KICAgIH0NCiAgfSk7DQoNCiAgYXBwbHlNYXRlcmlhbCgpOw0KICBvblRhdVNvdXJjZUNoYW5nZSgpOw0KICB1cGRhdGVNb2RlVUkoKTsNCiAgdXBkYXRlVW5pdExhYmVscygpOw0KICByZW5kZXJTaXplQ2hpcHMoKTsNCn0pKCk7DQo=
معلمات الإدخال
1 Calculation Setup
Shear Stress Check: evaluate whether the selected pin diameter can carry the applied transverse load without exceeding allowable shear stress.
2 Pin Geometry & Loading
3 Material Strength
4 Advanced Checks