The Slider / Guide Rail Contact Pressure Calculator is a practical engineering tool designed to calculate contact pressure between sliders, guide rails, wear plates, and machine slideways under applied loads. By entering contact dimensions, load, material properties, and safety factors, users can quickly evaluate effective contact area, allowable pressure, load utilization, and design safety. The Slider / Guide Rail Contact Pressure Calculator helps engineers optimize guide systems, reduce excessive wear and surface damage, and improve the reliability of machine tools, automation equipment, and industrial machinery.
LyoqDQogKiBTbGlkZXIgLyBHdWlkZSBSYWlsIENvbnRhY3QgUHJlc3N1cmUgQ2FsY3VsYXRvcg0KICogU2NvcGVkIGZvciBXb3JkUHJlc3MgZW1iZWQg4oCUICNzbGlkZXItZ3VpZGUtcHJlc3N1cmUtY2FsY3VsYXRvcg0KICovDQooZnVuY3Rpb24gKCkgew0KICAgICd1c2Ugc3RyaWN0JzsNCg0KICAgIHZhciBST09UX0lEID0gJ3NsaWRlci1ndWlkZS1wcmVzc3VyZS1jYWxjdWxhdG9yJzsNCiAgICB2YXIgTU1fVE9fSU4gPSAxIC8gMjUuNDsNCiAgICB2YXIgSU5fVE9fTU0gPSAyNS40Ow0KICAgIHZhciBNTTJfVE9fSU4yID0gMSAvIDY0NS4xNjsNCiAgICB2YXIgSU4yX1RPX01NMiA9IDY0NS4xNjsNCiAgICB2YXIgTVBBX1RPX1BTSSA9IDE0NS4wMzc3Mzc3MzsNCiAgICB2YXIgUFNJX1RPX01QQSA9IDEgLyBNUEFfVE9fUFNJOw0KICAgIHZhciBOX1RPX0tOID0gMC4wMDE7DQogICAgdmFyIEtOX1RPX04gPSAxMDAwOw0KICAgIHZhciBOX1RPX0xCRiA9IDAuMjI0ODA4OTQzOw0KICAgIHZhciBMQkZfVE9fTiA9IDEgLyBOX1RPX0xCRjsNCiAgICB2YXIgTVBTX1RPX0ZUUE0gPSAxOTYuODUwMzkzNzAxOw0KICAgIHZhciBGVFBNX1RPX01QUyA9IDEgLyBNUFNfVE9fRlRQTTsNCiAgICB2YXIgR0FVR0VfQVJDID0gMjgyLjc0MzsNCiAgICB2YXIgTkEgPSAnLSc7DQogICAgdmFyIFNFUCA9ICcgfCAnOw0KDQogICAgdmFyIE1BVEVSSUFMX1BSRVNTVVJFID0gew0KICAgICAgICAnaGFyZGVuZWQtc3RlZWwnOiB7IG1wYTogMTUwLCBsYWJlbDogJ0hhcmRlbmVkIFN0ZWVsJywgd2VhcjogMC42IH0sDQogICAgICAgICdjYXJib24tc3RlZWwnOiB7IG1wYTogODAsIGxhYmVsOiAnQ2FyYm9uIFN0ZWVsJywgd2VhcjogMC44IH0sDQogICAgICAgICdjYXN0LWlyb24nOiB7IG1wYTogNjAsIGxhYmVsOiAnQ2FzdCBJcm9uJywgd2VhcjogMC45IH0sDQogICAgICAgICdicm9uemUnOiB7IG1wYTogMjUsIGxhYmVsOiAnQnJvbnplJywgd2VhcjogMS4wIH0sDQogICAgICAgICdhbHVtaW51bS1icm9uemUnOiB7IG1wYTogMzUsIGxhYmVsOiAnQWx1bWludW0gQnJvbnplJywgd2VhcjogMC45NSB9LA0KICAgICAgICAnZW5naW5lZXJpbmctcGxhc3RpYyc6IHsgbXBhOiAxNSwgbGFiZWw6ICdFbmdpbmVlcmluZyBQbGFzdGljJywgd2VhcjogMS4yIH0sDQogICAgICAgICdwdGZlLWNvbXBvc2l0ZSc6IHsgbXBhOiA4LCBsYWJlbDogJ1BURkUgQ29tcG9zaXRlJywgd2VhcjogMC43IH0sDQogICAgICAgICdjdXN0b20nOiB7IG1wYTogbnVsbCwgbGFiZWw6ICdDdXN0b20nLCB3ZWFyOiAxLjAgfQ0KICAgIH07DQoNCiAgICB2YXIgTFVCRV9GQUNUT1JTID0gew0KICAgICAgICBleGNlbGxlbnQ6IDAuNywNCiAgICAgICAgZ29vZDogMC44NSwNCiAgICAgICAgbGltaXRlZDogMS4wLA0KICAgICAgICBwb29yOiAxLjMsDQogICAgICAgIGRyeTogMS42DQogICAgfTsNCg0KICAgIHZhciBERUZBVUxUUyA9IHsNCiAgICAgICAgdW5pdDogJ21ldHJpYycsDQogICAgICAgIG1vZGU6ICdwcmVzc3VyZScsDQogICAgICAgIGNvbnRhY3RUeXBlOiAnd2Vhci1wbGF0ZScsDQogICAgICAgIGxlbmd0aDogMjAwLA0KICAgICAgICB3aWR0aDogNDAsDQogICAgICAgIHBhZHM6IDIsDQogICAgICAgIGV0YTogMC45LA0KICAgICAgICBsb2FkOiA4MCwNCiAgICAgICAgbG9hZFVuaXQ6ICdrTicsDQogICAgICAgIGtkOiAxLjIsDQogICAgICAgIHNsaWRlck1hdDogJ2Jyb256ZScsDQogICAgICAgIGd1aWRlTWF0OiAnaGFyZGVuZWQtc3RlZWwnLA0KICAgICAgICBwUmVmOiAyNSwNCiAgICAgICAgcFJlZlVuaXQ6ICdNUGEnLA0KICAgICAgICBzZjogMiwNCiAgICAgICAgbHViZTogJ2dvb2QnLA0KICAgICAgICBzcGVlZDogJycsDQogICAgICAgIHRlbXA6ICcnDQogICAgfTsNCg0KICAgIHZhciByb290LCBlbHMsIHN0YXRlOw0KDQogICAgZnVuY3Rpb24gJChpZCkgew0KICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBwYXJzZU51bSh2KSB7DQogICAgICAgIGlmICh2ID09PSAnJyB8fCB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7DQogICAgICAgIHZhciBuID0gcGFyc2VGbG9hdChTdHJpbmcodikucmVwbGFjZSgnLCcsICcuJykpOw0KICAgICAgICByZXR1cm4gaXNOYU4obikgPyBudWxsIDogbjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjbGFtcCh2LCBsbywgaGkpIHsNCiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGxvLCBNYXRoLm1pbihoaSwgdikpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZtdCh2LCBkKSB7DQogICAgICAgIGlmICghaXNGaW5pdGUodikpIHJldHVybiBOQTsNCiAgICAgICAgcmV0dXJuIHYudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgew0KICAgICAgICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBkLA0KICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAwDQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNldFZpc2libGUobm9kZXMsIHNob3cpIHsNCiAgICAgICAgW10uZm9yRWFjaC5jYWxsKG5vZGVzLCBmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ3NnY3BjLWhpZGRlbicsICFzaG93KTsNCiAgICAgICAgICAgIGlmIChzaG93KSB7DQogICAgICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNnY3BjLWhpZGRlbicpOw0KICAgICAgICAgICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnJzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXNnY3BjLWhpZGRlbicsICd0cnVlJyk7DQogICAgICAgICAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2hvd1NlY3Rpb24oZWwpIHsNCiAgICAgICAgaWYgKCFlbCkgcmV0dXJuOw0KICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCdzZ2NwYy1oaWRkZW4nKTsNCiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNnY3BjLWhpZGRlbicpOw0KICAgICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJyc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaGlkZVNlY3Rpb24oZWwpIHsNCiAgICAgICAgaWYgKCFlbCkgcmV0dXJuOw0KICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCdzZ2NwYy1oaWRkZW4nKTsNCiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdkYXRhLXNnY3BjLWhpZGRlbicsICd0cnVlJyk7DQogICAgICAgIGVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0TGVuZ3RoVW5pdCgpIHsNCiAgICAgICAgcmV0dXJuIHN0YXRlLnVuaXQgPT09ICdtZXRyaWMnID8gJ21tJyA6ICdpbic7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0QXJlYVVuaXQoKSB7DQogICAgICAgIHJldHVybiBzdGF0ZS51bml0ID09PSAnbWV0cmljJyA/ICdtbTInIDogJ2luMic7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0UHJlc3N1cmVVbml0KCkgew0KICAgICAgICByZXR1cm4gc3RhdGUudW5pdCA9PT0gJ21ldHJpYycgPyAnTVBhJyA6ICdwc2knOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldEZvcmNlVW5pdCgpIHsNCiAgICAgICAgcmV0dXJuIHN0YXRlLnVuaXQgPT09ICdtZXRyaWMnID8gJ04nIDogJ2xiZic7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0U3BlZWRVbml0KCkgew0KICAgICAgICByZXR1cm4gc3RhdGUudW5pdCA9PT0gJ21ldHJpYycgPyAnbS9zJyA6ICdmdC9taW4nOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFRlbXBVbml0KCkgew0KICAgICAgICByZXR1cm4gc3RhdGUudW5pdCA9PT0gJ21ldHJpYycgPyAnZGVnIEMnIDogJ2RlZyBGJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB0b01ldHJpY0xlbmd0aCh2KSB7DQogICAgICAgIHJldHVybiBzdGF0ZS51bml0ID09PSAnbWV0cmljJyA/IHYgOiB2ICogSU5fVE9fTU07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZnJvbU1ldHJpY0xlbmd0aCh2KSB7DQogICAgICAgIHJldHVybiBzdGF0ZS51bml0ID09PSAnbWV0cmljJyA/IHYgOiB2ICogTU1fVE9fSU47DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdG9NZXRyaWNBcmVhKHYpIHsNCiAgICAgICAgcmV0dXJuIHN0YXRlLnVuaXQgPT09ICdtZXRyaWMnID8gdiA6IHYgKiBJTjJfVE9fTU0yOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZyb21NZXRyaWNBcmVhKHYpIHsNCiAgICAgICAgcmV0dXJuIHN0YXRlLnVuaXQgPT09ICdtZXRyaWMnID8gdiA6IHYgKiBNTTJfVE9fSU4yOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljUHJlc3N1cmUodiwgdW5pdCkgew0KICAgICAgICBpZiAodW5pdCA9PT0gJ01QYScpIHJldHVybiB2Ow0KICAgICAgICByZXR1cm4gdiAqIFBTSV9UT19NUEE7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZnJvbU1ldHJpY1ByZXNzdXJlKHYsIHVuaXQpIHsNCiAg ICAgICAgaWYgKHVuaXQgPT09ICdNUGEnKSByZXR1cm4gdjsNCiAgICAgICAgcmV0dXJuIHYgKiBNUEFfVE9fUFNJOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljRm9yY2UodiwgdW5pdCkgew0KICAgICAgICBpZiAodW5pdCA9PT0gJ04nKSByZXR1cm4gdjsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdrTicpIHJldHVybiB2ICogS05fVE9fTjsNCiAgICAgICAgcmV0dXJuIHYgKiBMQkZfVE9fTjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmcm9tTWV0cmljRm9yY2UodiwgdW5pdCkgew0KICAgICAgICBpZiAodW5pdCA9PT0gJ04nKSByZXR1cm4gdjsNCiAgICAgICAgaWYgKHVuaXQgPT09ICdrTicpIHJldHVybiB2ICogTl9UT19LTjsNCiAgICAgICAgcmV0dXJuIHYgKiBOX1RPX0xCRjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB0b01ldHJpY1NwZWVkKHYpIHsNCiAgICAgICAgcmV0dXJuIHN0YXRlLnVuaXQgPT09ICdtZXRyaWMnID8gdiA6IHYgKiBGVFBNX1RPX01QUzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmcm9tTWV0cmljU3BlZWQodikgew0KICAgICAgICByZXR1cm4gc3RhdGUudW5pdCA9PT0gJ21ldHJpYycgPyB2IDogdiAqIE1QU19UT19GVFBNOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHRvTWV0cmljVGVtcCh2KSB7DQogICAgICAgIGlmICh2ID09PSBudWxsKSByZXR1cm4gbnVsbDsNCiAgICAgICAgcmV0dXJuIHN0YXRlLnVuaXQgPT09ICdtZXRyaWMnID8gdiA6ICh2IC0gMzIpICogNSAvIDk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm9ybWF0Rm9yY2Uodk4sIHNob3dBbHQpIHsNCiAgICAgICAgdmFyIHUgPSBlbHMubG9hZFVuaXQgPyBlbHMubG9hZFVuaXQudmFsdWUgOiAna04nOw0KICAgICAgICB2YXIgbWFpbiA9IGZyb21NZXRyaWNGb3JjZSh2TiwgdSk7DQogICAgICAgIHZhciB1bml0TGFiZWwgPSB1Ow0KICAgICAgICB2YXIgc3RyID0gZm10KG1haW4sIHUgPT09ICdrTicgPyAzIDogMSkgKyAnICcgKyB1bml0TGFiZWw7DQogICAgICAgIGlmIChzaG93QWx0ICYmIHN0YXRlLnVuaXQgPT09ICdtZXRyaWMnKSB7DQogICAgICAgICAgICBzdHIgKz0gJyAoJyArIGZtdCh2TiwgMCkgKyAnIE4pJzsNCiAgICAgICAgfSBlbHNlIGlmIChzaG93QWx0ICYmIHN0YXRlLnVuaXQgPT09ICdpbXBlcmlhbCcpIHsNCiAgICAgICAgICAgIHN0ciArPSAnICgnICsgZm10KHZOICogTl9UT19MQkYsIDEpICsgJyBsYmYpJzsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gc3RyOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZvcm1hdEFyZWEodk1tMikgew0KICAgICAgICB2YXIgdiA9IGZyb21NZXRyaWNBcmVhKHZNbTIpOw0KICAgICAgICB2YXIgdSA9IGdldEFyZWFVbml0KCk7DQogICAgICAgIGlmIChzdGF0ZS51bml0ID09PSAnbWV0cmljJykgew0KICAgICAgICAgICAgaWYgKHYgPj0gMTAwMDApIHJldHVybiBmbXQodiAvIDEwMCwgMikgKyAnIGNtMiAoJyArIGZtdCh2LCAxKSArICcgbW0yKSc7DQogICAgICAgICAgICByZXR1cm4gZm10KHYsIDEpICsgJyBtbTInOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiBmbXQodiwgNCkgKyAnIGluMic7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm9ybWF0UHJlc3N1cmUodk1wYSkgew0KICAgICAgICB2YXIgdSA9IGVscy5wUmVmVW5pdCA/IGVscy5wUmVmVW5pdC52YWx1ZSA6ICdNUGEnOw0KICAgICAgICB2YXIgdiA9IGZyb21NZXRyaWNQcmVzc3VyZSh2TXBhLCB1KTsNCiAgICAgICAgdmFyIHN0ciA9IGZtdCh2LCB1ID09PSAnTVBhJyA/IDIgOiAwKSArICcgJyArIHU7DQogICAgICAgIGlmIChzdGF0ZS51bml0ID09PSAnbWV0cmljJykgew0KICAgICAgICAgICAgc3RyICs9ICcgKCcgKyBmbXQodk1wYSAqIE1QQV9UT19QU0ksIDApICsgJyBwc2kpJzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHN0ciArPSAnICgnICsgZm10KHZNcGEsIDIpICsgJyBNUGEpJzsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gc3RyOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFdlYWtlck1hdGVyaWFsTXBhKCkgew0KICAgICAgICB2YXIgcyA9IE1BVEVSSUFMX1BSRVNTVVJFW2Vscy5zbGlkZXJNYXQudmFsdWVdIHx8IE1BVEVSSUFMX1BSRVNTVVJFLmN1c3RvbTsNCiAgICAgICAgdmFyIGcgPSBNQVRFUklBTF9QUkVTU1VSRVtlbHMuZ3VpZGVNYXQudmFsdWVdIHx8IE1BVEVSSUFMX1BSRVNTVVJFLmN1c3RvbTsNCiAgICAgICAgaWYgKHMubXBhID09PSBudWxsICYmIGcubXBhID09PSBudWxsKSByZXR1cm4gbnVsbDsNCiAgICAgICAgaWYgKHMubXBhID09PSBudWxsKSByZXR1cm4gZy5tcGE7DQogICAgICAgIGlmIChnLm1wYSA9PT0gbnVsbCkgcmV0dXJuIHMubXBhOw0KICAgICAgICByZXR1cm4gTWF0aC5taW4ocy5tcGEsIGcubXBhKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVNYXRlcmlhbEhpbnQoKSB7DQogICAgICAgIGlmICghZWxzLm1hdGVyaWFsSGludCkgcmV0dXJuOw0KICAgICAgICB2YXIgd2VhayA9IGdldFdlYWtlck1hdGVyaWFsTXBhKCk7DQogICAgICAgIGlmICh3ZWFrID09PSBudWxsKSB7DQogICAgICAgICAgICBlbHMubWF0ZXJpYWxIaW50LnRleHRDb250ZW50ID0gJ0VudGVyIHJlZmVyZW5jZSBhbGxvd2FibGUgY29udGFjdCBwcmVzc3VyZSBmb3IgY3VzdG9tIG1hdGVyaWFscy4nOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQogICAgICAgIHZhciBzTGFiZWwgPSAoTUFURVJJQUxfUFJFU1NVUkVbZWxzLnNsaWRlck1hdC52YWx1ZV0gfHwge30pLmxhYmVsIHx8ICdTbGlkZXInOw0KICAgICAgICB2YXIgZ0xhYmVsID0gKE1BVEVSSUFMX1BSRVNTVVJFW2Vscy5ndWlkZU1hdC52YWx1ZV0gfHwge30pLmxhYmVsIHx8ICdHdWlkZSc7DQogICAgICAgIGVscy5tYXRlcmlhbEhpbnQudGV4dENvbnRlbnQgPQ0KICAgICAgICAgICAgJ1JlZmVyZW5jZSBwcmVzc3VyZSBmb3IgJyArIHNMYWJlbCArICcgLyAnICsgZ0xhYmVsICsgJyBwYWlyICh3ZWFrZXIgZ292ZXJucyk6IH4nICsNCiAgICAgICAgICAgIGZtdChmcm9tTWV0cmljUHJlc3N1cmUod2VhaywgZWxzLnBSZWZVbml0LnZhbHVlKSwgMSkgKyAnICcgKyBlbHMucFJlZlVuaXQudmFsdWUgKw0KICAgICAgICAgICAgJyAtIHZlcmlmeSB3aXRoIG1hbnVmYWN0dXJlciBkYXRhLic7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlTWF0ZXJpYWxEZWZhdWx0cygpIHsNCiAgICAgICAgaWYgKHN0YXRlLnBSZWZNYW51YWwpIHJldHVybjsNCiAgICAgICAgdmFyIHdlYWsgPSBnZXRXZWFrZXJNYXRlcmlhbE1wYSgpOw0KICAgICAgICBpZiAod2VhayAhPT0gbnVsbCkgew0KICAgICAgICAgICAgZWxzLnBSZWYudmFsdWUgPSBmcm9tTWV0cmljUHJlc3N1cmUod2VhaywgZWxzLnBSZWZVbml0LnZhbHVlKS50b0ZpeGVkKA0KICAgICAgICAgICAgICAgIGVscy5wUmVmVW5pdC52YWx1ZSA9PT0gJ01QYScgPyAxIDogMA0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICB1cGRhdGVNYXRlcmlhbEhpbnQoKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVVbml0TGFiZWxzKCkgew0KICAgICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXVuaXQ9Imxlbmd0aCJdJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gZ2V0TGVuZ3RoVW5pdCgpOw0KICAgICAgICB9KTsNCiAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS11bml0PSJhcmVhIl0nKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgew0KICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSBnZXRBcmVhVW5pdCgpOw0KICAgICAgICB9KTsNCiAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS11bml0PSJwcmVzc3VyZSJdJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gZ2V0UHJlc3N1cmVVbml0KCk7DQogICAgICAgIH0pOw0KICAgICAgICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXVuaXQ9InNwZWVkIl0nKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgew0KICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSBnZXRTcGVlZFVuaXQoKTsNCiAgICAgICAgfSk7DQogICAgICAgIHJvb3QucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdW5pdD0idGVtcCJdJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gZ2V0VGVtcFVuaXQoKTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29udmVydE9uVW5pdENoYW5nZShmcm9tLCB0bykgew0KICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHJldHVybjsNCg0KICAgICAgICBmdW5jdGlvbiBjb252TGVuKGlucHV0KSB7DQogICAgICAgICAgICB2YXIgdiA9IHBhcnNlTnVtKGlucHV0LnZhbHVlKTsNCiAgICAgICAgICAgIGlmICh2ID09PSBudWxsKSByZXR1cm47DQogICAgICAgICAgICBpbnB1dC52YWx1ZSA9ICh0byA9PT0gJ21ldHJpYycgPyB2 ICogSU5fVE9fTU0gOiB2ICogTU1fVE9fSU4pLnRvRml4ZWQodG8gPT09ICdtZXRyaWMnID8gMSA6IDMpOw0KICAgICAgICB9DQogICAgICAgIGNvbnZMZW4oZWxzLmxlbmd0aCk7DQogICAgICAgIGNvbnZMZW4oZWxzLndpZHRoKTsNCg0KICAgICAgICB2YXIgdGVtcCA9IHBhcnNlTnVtKGVscy50ZW1wLnZhbHVlKTsNCiAgICAgICAgaWYgKHRlbXAgIT09IG51bGwpIHsNCiAgICAgICAgICAgIGlmIChmcm9tID09PSAnbWV0cmljJyAmJiB0byA9PT0gJ2ltcGVyaWFsJykgew0KICAgICAgICAgICAgICAgIGVscy50ZW1wLnZhbHVlID0gKHRlbXAgKiA5IC8gNSArIDMyKS50b0ZpeGVkKDEpOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChmcm9tID09PSAnaW1wZXJpYWwnICYmIHRvID09PSAnbWV0cmljJykgew0KICAgICAgICAgICAgICAgIGVscy50ZW1wLnZhbHVlID0gKCh0ZW1wIC0gMzIpICogNSAvIDkpLnRvRml4ZWQoMSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgc3BlZWQgPSBwYXJzZU51bShlbHMuc3BlZWQudmFsdWUpOw0KICAgICAgICBpZiAoc3BlZWQgIT09IG51bGwpIHsNCiAgICAgICAgICAgIGVscy5zcGVlZC52YWx1ZSA9ICh0byA9PT0gJ21ldHJpYycNCiAgICAgICAgICAgICAgICA/IHNwZWVkICogRlRQTV9UT19NUFMNCiAgICAgICAgICAgICAgICA6IHNwZWVkICogTVBTX1RPX0ZUUE0pLnRvRml4ZWQodG8gPT09ICdtZXRyaWMnID8gMyA6IDEpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHN0YXRlLnBSZWZNYW51YWwpIHsNCiAgICAgICAgICAgIHZhciBwID0gcGFyc2VOdW0oZWxzLnBSZWYudmFsdWUpOw0KICAgICAgICAgICAgaWYgKHAgIT09IG51bGwgJiYgZWxzLnBSZWZVbml0LnZhbHVlID09PSAnTVBhJykgew0KICAgICAgICAgICAgICAgIC8qIE1QYSBpcyB1bml2ZXJzYWwgKi8NCiAgICAgICAgICAgIH0gZWxzZSBpZiAocCAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIC8qIHBzaSBzdGF5cyBwc2kgKi8NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHVwZGF0ZU1hdGVyaWFsRGVmYXVsdHMoKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZU1vZGVVSSgpIHsNCiAgICAgICAgdmFyIG1vZGUgPSBlbHMubW9kZS52YWx1ZTsNCiAgICAgICAgc2V0VmlzaWJsZShyb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZ2NwYy1tb2RlLWxvYWQnKSwgbW9kZSAhPT0gJ2FsbG93YWJsZScpOw0KICAgICAgICBzZXRWaXNpYmxlKHJvb3QucXVlcnlTZWxlY3RvckFsbCgnLnNnY3BjLW1vZGUtZ2VvbWV0cnknKSwgbW9kZSAhPT0gJ3JlcXVpcmVkJyB8fCB0cnVlKTsNCiAgICAgICAgc2V0VmlzaWJsZShyb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZ2NwYy1tb2RlLWdlb20tb3B0aW9uYWwnKSwgbW9kZSA9PT0gJ3JlcXVpcmVkJyk7DQoNCiAgICAgICAgdmFyIG5vdGVzID0gew0KICAgICAgICAgICAgcHJlc3N1cmU6ICdDb250YWN0IFByZXNzdXJlIENoZWNrOiBldmFsdWF0ZSBhdmVyYWdlIGNvbnRhY3QgcHJlc3N1cmUgZm9yIHRoZSBnaXZlbiBsb2FkLCBnZW9tZXRyeSwgYW5kIG1hdGVyaWFsIGxpbWl0cy4nLA0KICAgICAgICAgICAgYWxsb3dhYmxlOiAnQWxsb3dhYmxlIExvYWQ6IGNhbGN1bGF0ZSBtYXhpbXVtIHRvdGFsIGxvYWQgZnJvbSBjb250YWN0IGdlb21ldHJ5IGFuZCBhbGxvd2FibGUgcHJlc3N1cmUuJywNCiAgICAgICAgICAgIHJlcXVpcmVkOiAnUmVxdWlyZWQgQ29udGFjdCBBcmVhOiBkZXRlcm1pbmUgZWZmZWN0aXZlIGNvbnRhY3QgYXJlYSBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpZWQgbG9hZCBhbmQgYWxsb3dhYmxlIHByZXNzdXJlLicNCiAgICAgICAgfTsNCiAgICAgICAgaWYgKGVscy5tb2RlTm90ZSkgZWxzLm1vZGVOb3RlLnRleHRDb250ZW50ID0gbm90ZXNbbW9kZV0gfHwgJyc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY2xlYXJFcnJvcnMoKSB7DQogICAgICAgIFsnbGVuZ3RoJywgJ3dpZHRoJywgJ3BhZHMnLCAnZXRhJywgJ2xvYWQnLCAncFJlZicsICdzZiddLmZvckVhY2goZnVuY3Rpb24gKGtleSkgew0KICAgICAgICAgICAgdmFyIGVyciA9ICQoJ3NnY3BjRXJyJyArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKSk7DQogICAgICAgICAgICB2YXIgaW5wID0gZWxzW2tleV07DQogICAgICAgICAgICBpZiAoZXJyKSBlcnIudGV4dENvbnRlbnQgPSAnJzsNCiAgICAgICAgICAgIGlmIChpbnApIGlucC5jbGFzc0xpc3QucmVtb3ZlKCdzZ2NwYy1lcnJvcicpOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2YWxpZGF0ZUFuZENhbGN1bGF0ZSgpIHsNCiAgICAgICAgY2xlYXJFcnJvcnMoKTsNCiAgICAgICAgdmFyIHdhcm5pbmdzID0gW107DQogICAgICAgIHZhciB2YWxpZCA9IHRydWU7DQogICAgICAgIHZhciBtb2RlID0gZWxzLm1vZGUudmFsdWU7DQoNCiAgICAgICAgdmFyIEwgPSBwYXJzZU51bShlbHMubGVuZ3RoLnZhbHVlKTsNCiAgICAgICAgdmFyIFcgPSBwYXJzZU51bShlbHMud2lkdGgudmFsdWUpOw0KICAgICAgICB2YXIgbiA9IHBhcnNlTnVtKGVscy5wYWRzLnZhbHVlKTsNCiAgICAgICAgdmFyIGV0YSA9IHBhcnNlTnVtKGVscy5ldGEudmFsdWUpOw0KICAgICAgICB2YXIga2QgPSBwYXJzZU51bShlbHMua2QudmFsdWUpIHx8IDE7DQogICAgICAgIHZhciBzZiA9IHBhcnNlTnVtKGVscy5zZi52YWx1ZSk7DQogICAgICAgIHZhciBwUmVmID0gcGFyc2VOdW0oZWxzLnBSZWYudmFsdWUpOw0KICAgICAgICB2YXIgRnRvdGFsID0gbW9kZSA9PT0gJ2FsbG93YWJsZScgPyBudWxsIDogdG9NZXRyaWNGb3JjZShwYXJzZU51bShlbHMubG9hZC52YWx1ZSksIGVscy5sb2FkVW5pdC52YWx1ZSk7DQoNCiAgICAgICAgaWYgKG1vZGUgIT09ICdyZXF1aXJlZCcpIHsNCiAgICAgICAgICAgIGlmIChMID09PSBudWxsIHx8IEwgPD0gMCkgew0KICAgICAgICAgICAgICAgICQoJ3NnY3BjRXJyTGVuZ3RoJykudGV4dENvbnRlbnQgPSAnQ29udGFjdCBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nOw0KICAgICAgICAgICAgICAgIGVscy5sZW5ndGguY2xhc3NMaXN0LmFkZCgnc2djcGMtZXJyb3InKTsNCiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKFcgPT09IG51bGwgfHwgVyA8PSAwKSB7DQogICAgICAgICAgICAgICAgJCgnc2djcGNFcnJXaWR0aCcpLnRleHRDb250ZW50ID0gJ0NvbnRhY3Qgd2lkdGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nOw0KICAgICAgICAgICAgICAgIGVscy53aWR0aC5jbGFzc0xpc3QuYWRkKCdzZ2NwYy1lcnJvcicpOw0KICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoTCAhPT0gbnVsbCAmJiBMIDw9IDApIHsNCiAgICAgICAgICAgICAgICAkKCdzZ2NwY0Vyckxlbmd0aCcpLnRleHRDb250ZW50ID0gJ0NvbnRhY3QgbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJzsNCiAgICAgICAgICAgICAgICBlbHMubGVuZ3RoLmNsYXNzTGlzdC5hZGQoJ3NnY3BjLWVycm9yJyk7DQogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChXICE9PSBudWxsICYmIFcgPD0gMCkgew0KICAgICAgICAgICAgICAgICQoJ3NnY3BjRXJyV2lkdGgnKS50ZXh0Q29udGVudCA9ICdDb250YWN0IHdpZHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJzsNCiAgICAgICAgICAgICAgICBlbHMud2lkdGguY2xhc3NMaXN0LmFkZCgnc2djcGMtZXJyb3InKTsNCiAgICAgICAgICAgICAgICB2YWxpZCA9IGZhbHNlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKG4gPT09IG51bGwgfHwgbiA8PSAwIHx8IE1hdGguZmxvb3IobikgIT09IG4pIHsNCiAgICAgICAgICAgICQoJ3NnY3BjRXJyUGFkcycpLnRleHRDb250ZW50ID0gJ051bWJlciBvZiBwYWRzIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLic7DQogICAgICAgICAgICBlbHMucGFkcy5jbGFzc0xpc3QuYWRkKCdzZ2NwYy1lcnJvcicpOw0KICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChldGEgPT09IG51bGwgfHwgZXRhIDw9IDAgfHwgZXRhID4gMSkgew0KICAgICAgICAgICAgJCgnc2djcGNFcnJFdGEnKS50ZXh0Q29udGVudCA9ICdVdGlsaXphdGlvbiBmYWN0b3IgbXVzdCBiZSA+IDAgYW5kIDw9IDEuJzsNCiAgICAgICAgICAgIGVscy5ldGEuY2xhc3NMaXN0LmFkZCgnc2djcGMtZXJyb3InKTsNCiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoc2YgPT09IG51bGwgfHwgc2YgPD0gMCkgew0KICAgICAgICAgICAgJCgnc2djcGNFcnJTZicpLnRleHRDb250ZW50ID0gJ1NhZmV0eSBmYWN0b3IgbXVz dCBiZSBncmVhdGVyIHRoYW4gemVyby4nOw0KICAgICAgICAgICAgZWxzLnNmLmNsYXNzTGlzdC5hZGQoJ3NnY3BjLWVycm9yJyk7DQogICAgICAgICAgICB2YWxpZCA9IGZhbHNlOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHBSZWYgPT09IG51bGwgfHwgcFJlZiA8PSAwKSB7DQogICAgICAgICAgICAkKCdzZ2NwY0VyclBSZWYnKS50ZXh0Q29udGVudCA9ICdBbGxvd2FibGUgcHJlc3N1cmUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nOw0KICAgICAgICAgICAgZWxzLnBSZWYuY2xhc3NMaXN0LmFkZCgnc2djcGMtZXJyb3InKTsNCiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobW9kZSAhPT0gJ2FsbG93YWJsZScpIHsNCiAgICAgICAgICAgIGlmIChGdG90YWwgPT09IG51bGwgfHwgRnRvdGFsIDw9IDApIHsNCiAgICAgICAgICAgICAgICAkKCdzZ2NwY0VyckxvYWQnKS50ZXh0Q29udGVudCA9ICdBcHBsaWVkIGxvYWQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nOw0KICAgICAgICAgICAgICAgIGVscy5sb2FkLmNsYXNzTGlzdC5hZGQoJ3NnY3BjLWVycm9yJyk7DQogICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghdmFsaWQpIHsNCiAgICAgICAgICAgIGhpZGVTZWN0aW9uKGVscy5yZXN1bHRzKTsNCiAgICAgICAgICAgIGRpc3BsYXlXYXJuaW5ncyh3YXJuaW5ncyk7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBMbW0gPSB0b01ldHJpY0xlbmd0aChMIHx8IDApOw0KICAgICAgICB2YXIgV21tID0gdG9NZXRyaWNMZW5ndGgoVyB8fCAwKTsNCiAgICAgICAgdmFyIEEgPSBMbW0gKiBXbW07DQogICAgICAgIHZhciBBZWZmID0gQSAqIGV0YTsNCiAgICAgICAgdmFyIHBtYXRlcmlhbCA9IHRvTWV0cmljUHJlc3N1cmUocFJlZiwgZWxzLnBSZWZVbml0LnZhbHVlKTsNCiAgICAgICAgdmFyIHBhbGxvdyA9IHBtYXRlcmlhbCAvIHNmOw0KICAgICAgICB2YXIgRnBhZCA9IG1vZGUgPT09ICdhbGxvd2FibGUnID8gMCA6IEZ0b3RhbCAvIG47DQogICAgICAgIHZhciBGZGVzaWduID0gRnBhZCAqIGtkOw0KDQogICAgICAgIHZhciBwID0gMDsNCiAgICAgICAgdmFyIEZhbGxvd1BhZCA9IHBhbGxvdyAqIEFlZmY7DQogICAgICAgIHZhciBGYWxsb3dUb3RhbCA9IEZhbGxvd1BhZCAqIG4gLyBrZDsNCiAgICAgICAgdmFyIEFyZXF1aXJlZCA9IDA7DQoNCiAgICAgICAgaWYgKG1vZGUgPT09ICdwcmVzc3VyZScpIHsNCiAgICAgICAgICAgIHAgPSBBZWZmID4gMCA/IEZkZXNpZ24gLyBBZWZmIDogMDsNCiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnYWxsb3dhYmxlJykgew0KICAgICAgICAgICAgcCA9IDA7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBBcmVxdWlyZWQgPSBwYWxsb3cgPiAwID8gRmRlc2lnbiAvIHBhbGxvdyA6IDA7DQogICAgICAgICAgICBwID0gQWVmZiA+IDAgPyBGZGVzaWduIC8gQWVmZiA6IDA7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgdXRpbGl6YXRpb24gPSBwYWxsb3cgPiAwICYmIG1vZGUgIT09ICdhbGxvd2FibGUnID8gKHAgLyBwYWxsb3cpICogMTAwIDogMDsNCiAgICAgICAgdmFyIGFjdHVhbFNGID0gcCA+IDAgPyBwbWF0ZXJpYWwgLyBwIDogSW5maW5pdHk7DQoNCiAgICAgICAgdmFyIHNwZWVkTXBzID0gcGFyc2VOdW0oZWxzLnNwZWVkLnZhbHVlKTsNCiAgICAgICAgc3BlZWRNcHMgPSBzcGVlZE1wcyAhPT0gbnVsbCA/IHRvTWV0cmljU3BlZWQoc3BlZWRNcHMpIDogbnVsbDsNCiAgICAgICAgdmFyIHB2ID0gc3BlZWRNcHMgIT09IG51bGwgJiYgcCA+IDAgPyBwICogc3BlZWRNcHMgOiBudWxsOw0KDQogICAgICAgIHZhciB0ZW1wQyA9IHRvTWV0cmljVGVtcChwYXJzZU51bShlbHMudGVtcC52YWx1ZSkpOw0KDQogICAgICAgIC8qIENvbnRhY3Qgc3RhdHVzICovDQogICAgICAgIHZhciBjb250YWN0U3RhdHVzID0gJ1NhZmUnOw0KICAgICAgICBpZiAobW9kZSA9PT0gJ2FsbG93YWJsZScpIHsNCiAgICAgICAgICAgIGNvbnRhY3RTdGF0dXMgPSAnU2FmZSc7DQogICAgICAgIH0gZWxzZSBpZiAodXRpbGl6YXRpb24gPiAxMDApIHsNCiAgICAgICAgICAgIGNvbnRhY3RTdGF0dXMgPSAnT3ZlcmxvYWRlZCc7DQogICAgICAgIH0gZWxzZSBpZiAodXRpbGl6YXRpb24gPj0gODUpIHsNCiAgICAgICAgICAgIGNvbnRhY3RTdGF0dXMgPSAnQ2F1dGlvbic7DQogICAgICAgIH0NCg0KICAgICAgICAvKiBXZWFyIHJpc2sgKi8NCiAgICAgICAgdmFyIGx1YmVGID0gTFVCRV9GQUNUT1JTW2Vscy5sdWJlLnZhbHVlXSB8fCAxOw0KICAgICAgICB2YXIgc1dlYXIgPSAoTUFURVJJQUxfUFJFU1NVUkVbZWxzLnNsaWRlck1hdC52YWx1ZV0gfHwgTUFURVJJQUxfUFJFU1NVUkUuY3VzdG9tKS53ZWFyOw0KICAgICAgICB2YXIgZ1dlYXIgPSAoTUFURVJJQUxfUFJFU1NVUkVbZWxzLmd1aWRlTWF0LnZhbHVlXSB8fCBNQVRFUklBTF9QUkVTU1VSRS5jdXN0b20pLndlYXI7DQogICAgICAgIHZhciBtYXRXZWFyID0gTWF0aC5tYXgoc1dlYXIsIGdXZWFyKTsNCiAgICAgICAgdmFyIHV0aWxGID0gdXRpbGl6YXRpb24gLyAxMDA7DQogICAgICAgIHZhciBzcGVlZEYgPSAxOw0KICAgICAgICBpZiAoc3BlZWRNcHMgIT09IG51bGwpIHsNCiAgICAgICAgICAgIGlmIChzcGVlZE1wcyA+IDIpIHNwZWVkRiA9IDEuNTsNCiAgICAgICAgICAgIGVsc2UgaWYgKHNwZWVkTXBzID4gMC41KSBzcGVlZEYgPSAxLjI7DQogICAgICAgICAgICBlbHNlIGlmIChzcGVlZE1wcyA+IDAuMSkgc3BlZWRGID0gMS4wNTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgdGVtcEYgPSAxOw0KICAgICAgICBpZiAodGVtcEMgIT09IG51bGwpIHsNCiAgICAgICAgICAgIGlmICh0ZW1wQyA+IDEyMCkgdGVtcEYgPSAxLjQ7DQogICAgICAgICAgICBlbHNlIGlmICh0ZW1wQyA+IDgwKSB0ZW1wRiA9IDEuMTU7DQogICAgICAgIH0NCiAgICAgICAgdmFyIHdlYXJTY29yZSA9IHV0aWxGICogc3BlZWRGICogbHViZUYgKiBtYXRXZWFyICogdGVtcEY7DQogICAgICAgIHZhciB3ZWFyUmlzayA9ICdMb3cnOw0KICAgICAgICBpZiAod2VhclNjb3JlID49IDEuNSB8fCBjb250YWN0U3RhdHVzID09PSAnT3ZlcmxvYWRlZCcpIHdlYXJSaXNrID0gJ0hpZ2gnOw0KICAgICAgICBlbHNlIGlmICh3ZWFyU2NvcmUgPj0gMC44NSB8fCBjb250YWN0U3RhdHVzID09PSAnQ2F1dGlvbicpIHdlYXJSaXNrID0gJ01vZGVyYXRlJzsNCg0KICAgICAgICAvKiBXYXJuaW5ncyAqLw0KICAgICAgICBpZiAobW9kZSA9PT0gJ3ByZXNzdXJlJyAmJiB1dGlsaXphdGlvbiA+IDEwMCkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgICAgICAgdHlwZTogJ2RhbmdlcicsDQogICAgICAgICAgICAgICAgdGV4dDogJ0F2ZXJhZ2UgY29udGFjdCBwcmVzc3VyZSBleGNlZWRzIGFsbG93YWJsZSBkZXNpZ24gcHJlc3N1cmUuIEluY3JlYXNlIGNvbnRhY3QgYXJlYSwgYWRkIHBhZHMsIG9yIHVzZSBoaWdoZXItY2FwYWNpdHkgbWF0ZXJpYWxzLicNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIGlmIChldGEgPCAwLjcpIHsNCiAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goew0KICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuJywNCiAgICAgICAgICAgICAgICB0ZXh0OiAnRWZmZWN0aXZlIGNvbnRhY3QgYXJlYSBpcyBzaWduaWZpY2FudGx5IHJlZHVjZWQgKGV0YSA8IDAuNykuIFZlcmlmeSBzdXJmYWNlIGZsYXRuZXNzLCBncm9vdmVzLCBhbmQgbW91bnRpbmcgYWNjdXJhY3kuJw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGtkID4gMS4zKSB7DQogICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicsDQogICAgICAgICAgICAgICAgdGV4dDogJ0hpZ2ggbG9hZCBkaXN0cmlidXRpb24gZmFjdG9yIChLZCA+IDEuMykgaW5kaWNhdGVzIHVuZXZlbiBsb2FkaW5nLiBMb2NhbCBlZGdlIHByZXNzdXJlIG1heSBleGNlZWQgY2FsY3VsYXRlZCBhdmVyYWdlIHByZXNzdXJlLicNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIGlmIChrZCA+IDEuMSAmJiBldGEgPCAwLjg1KSB7DQogICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicsDQogICAgICAgICAgICAgICAgdGV4dDogJ0NvbWJpbmVkIHVuZXZlbiBsb2FkaW5nIGFuZCByZWR1Y2VkIGNvbnRhY3QgYXJlYSBtYXkgY2F1c2Ugc2lnbmlmaWNhbnQgZWRnZSBsb2FkaW5nLiBDb25zaWRlciBpbXByb3ZlZCBhbGlnbm1lbnQgYW5kIHN0aWZmbmVzcy4nDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZWxzLmx1YmUudmFsdWUgPT09ICdkcnknIHx8IGVscy5sdWJlLnZhbHVlID09PSAncG9vcicpIHsNCiAgICAgICAgICAgIGlmIChz cGVlZE1wcyAhPT0gbnVsbCAmJiBzcGVlZE1wcyA+IDAuMykgew0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGFuZ2VyJywNCiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1Bvb3Igb3IgZHJ5IGx1YnJpY2F0aW9uIHdpdGggZWxldmF0ZWQgc2xpZGluZyBzcGVlZCBjcmVhdGVzIGhpZ2ggd2VhciBhbmQgdGhlcm1hbCByaXNrLicNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodXRpbGl6YXRpb24gPiA3MCkgew0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicsDQogICAgICAgICAgICAgICAgICAgIHRleHQ6ICdIaWdoIGNvbnRhY3QgcHJlc3N1cmUgd2l0aCBsaW1pdGVkIGx1YnJpY2F0aW9uIGluY3JlYXNlcyB3ZWFyIHJpc2suJw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChwdiAhPT0gbnVsbCAmJiBwdiA+IDEuNSkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLA0KICAgICAgICAgICAgICAgIHRleHQ6ICdDYWxjdWxhdGVkIFBWID0gJyArIGZtdChwdiwgMikgKyAnIE1QYSBtL3MuIEFsbG93YWJsZSBQViBsaW1pdHMgZGVwZW5kIG9uIG1hdGVyaWFsIHBhaXIsIGx1YnJpY2F0aW9uLCBhbmQgdGVtcGVyYXR1cmUgLSB2ZXJpZnkgd2l0aCBtYW51ZmFjdHVyZXIgZGF0YS4nDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciByZWNvbW1lbmRhdGlvbnMgPSBidWlsZFJlY29tbWVuZGF0aW9ucyh7DQogICAgICAgICAgICBtb2RlOiBtb2RlLA0KICAgICAgICAgICAgY29udGFjdFN0YXR1czogY29udGFjdFN0YXR1cywNCiAgICAgICAgICAgIHV0aWxpemF0aW9uOiB1dGlsaXphdGlvbiwNCiAgICAgICAgICAgIHdlYXJSaXNrOiB3ZWFyUmlzaywNCiAgICAgICAgICAgIGtkOiBrZCwNCiAgICAgICAgICAgIGV0YTogZXRhLA0KICAgICAgICAgICAgbHViZTogZWxzLmx1YmUudmFsdWUsDQogICAgICAgICAgICBzcGVlZE1wczogc3BlZWRNcHMsDQogICAgICAgICAgICBwdjogcHYNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIG1vZGU6IG1vZGUsDQogICAgICAgICAgICBMbW06IExtbSwNCiAgICAgICAgICAgIFdtbTogV21tLA0KICAgICAgICAgICAgQTogQSwNCiAgICAgICAgICAgIEFlZmY6IEFlZmYsDQogICAgICAgICAgICBuOiBuLA0KICAgICAgICAgICAgZXRhOiBldGEsDQogICAgICAgICAgICBrZDoga2QsDQogICAgICAgICAgICBzZjogc2YsDQogICAgICAgICAgICBwbWF0ZXJpYWw6IHBtYXRlcmlhbCwNCiAgICAgICAgICAgIHBhbGxvdzogcGFsbG93LA0KICAgICAgICAgICAgRnRvdGFsOiBGdG90YWwsDQogICAgICAgICAgICBGcGFkOiBGcGFkLA0KICAgICAgICAgICAgRmRlc2lnbjogRmRlc2lnbiwNCiAgICAgICAgICAgIHA6IHAsDQogICAgICAgICAgICBGYWxsb3dQYWQ6IEZhbGxvd1BhZCwNCiAgICAgICAgICAgIEZhbGxvd1RvdGFsOiBGYWxsb3dUb3RhbCwNCiAgICAgICAgICAgIEFyZXF1aXJlZDogQXJlcXVpcmVkLA0KICAgICAgICAgICAgdXRpbGl6YXRpb246IHV0aWxpemF0aW9uLA0KICAgICAgICAgICAgYWN0dWFsU0Y6IGFjdHVhbFNGLA0KICAgICAgICAgICAgcHY6IHB2LA0KICAgICAgICAgICAgc3BlZWRNcHM6IHNwZWVkTXBzLA0KICAgICAgICAgICAgd2VhclJpc2s6IHdlYXJSaXNrLA0KICAgICAgICAgICAgY29udGFjdFN0YXR1czogY29udGFjdFN0YXR1cywNCiAgICAgICAgICAgIHdhcm5pbmdzOiB3YXJuaW5ncywNCiAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uczogcmVjb21tZW5kYXRpb25zDQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYnVpbGRSZWNvbW1lbmRhdGlvbnMocikgew0KICAgICAgICB2YXIgcmVjID0gW107DQogICAgICAgIGlmIChyLmNvbnRhY3RTdGF0dXMgPT09ICdPdmVybG9hZGVkJyB8fCByLnV0aWxpemF0aW9uID4gMTAwKSB7DQogICAgICAgICAgICByZWMucHVzaCgnSW5jcmVhc2UgY29udGFjdCBsZW5ndGggb3Igd2lkdGggdG8gcmVkdWNlIGF2ZXJhZ2UgcHJlc3N1cmUuJyk7DQogICAgICAgICAgICByZWMucHVzaCgnQWRkIG1vcmUgZ3VpZGUgcGFkcyBvciBzbGlkZXJzIHRvIHNoYXJlIHRoZSBsb2FkLicpOw0KICAgICAgICB9DQogICAgICAgIGlmIChyLmtkID4gMS4xNSkgew0KICAgICAgICAgICAgcmVjLnB1c2goJ0ltcHJvdmUgbG9hZCBkaXN0cmlidXRpb24gYW5kIGFsaWdubWVudCB0byByZWR1Y2UgdW5ldmVuIHBhZCBsb2FkaW5nLicpOw0KICAgICAgICB9DQogICAgICAgIGlmIChyLmV0YSA8IDAuODUpIHsNCiAgICAgICAgICAgIHJlYy5wdXNoKCdJbXByb3ZlIHN1cmZhY2UgZmxhdG5lc3MgYW5kIHJlZHVjZSBncm9vdmVzIG9yIHBvY2tldCBhcmVhIGxvc3MuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHIud2VhclJpc2sgPT09ICdIaWdoJyB8fCByLndlYXJSaXNrID09PSAnTW9kZXJhdGUnKSB7DQogICAgICAgICAgICByZWMucHVzaCgnQ29uc2lkZXIgYSBoaWdoZXItY2FwYWNpdHkgd2VhciBtYXRlcmlhbCBmb3IgdGhlIHdlYWtlciBjb250YWN0IHN1cmZhY2UuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHIubHViZSA9PT0gJ2xpbWl0ZWQnIHx8IHIubHViZSA9PT0gJ3Bvb3InIHx8IHIubHViZSA9PT0gJ2RyeScpIHsNCiAgICAgICAgICAgIHJlYy5wdXNoKCdJbXByb3ZlIGx1YnJpY2F0aW9uIHVuZGVyIGhpZ2gtcHJlc3N1cmUgc2xpZGluZyBjb25kaXRpb25zLicpOw0KICAgICAgICB9DQogICAgICAgIGlmIChyLnNwZWVkTXBzICE9PSBudWxsICYmIHIuc3BlZWRNcHMgPiAxICYmIHIud2VhclJpc2sgIT09ICdMb3cnKSB7DQogICAgICAgICAgICByZWMucHVzaCgnUmVkdWNlIHNsaWRpbmcgc3BlZWQgaWYgUFYgb3IgdGhlcm1hbCBjb25kaXRpb25zIGFyZSBleGNlc3NpdmUuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHIua2QgPiAxLjIgfHwgci5ldGEgPCAwLjgpIHsNCiAgICAgICAgICAgIHJlYy5wdXNoKCdSZWR1Y2UgZWRnZSBsb2FkaW5nIHRocm91Z2ggaW1wcm92ZWQgc3RpZmZuZXNzIG9yIG1vdW50aW5nIGFjY3VyYWN5LicpOw0KICAgICAgICB9DQogICAgICAgIGlmIChyLnV0aWxpemF0aW9uID4gODAgJiYgci51dGlsaXphdGlvbiA8PSAxMDApIHsNCiAgICAgICAgICAgIHJlYy5wdXNoKCdJbmNyZWFzZSBzYWZldHkgZmFjdG9yIGZvciBpbXBhY3QsIHZpYnJhdGlvbiwgb3IgdW5jZXJ0YWluIGxvYWRpbmcuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHIua2QgPiAxLjI1KSB7DQogICAgICAgICAgICByZWMucHVzaCgnVmVyaWZ5IGxvY2FsIGNvbnRhY3Qgc3RyZXNzZXMgd2hlbiBsb2FkIGlzIGhpZ2hseSBjb25jZW50cmF0ZWQuJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHJlYy5sZW5ndGggPT09IDApIHsNCiAgICAgICAgICAgIHJlYy5wdXNoKCdDdXJyZW50IGNvbnRhY3QgcHJlc3N1cmUgaXMgd2l0aGluIHR5cGljYWwgcHJlbGltaW5hcnkgbGltaXRzLiBDb25maXJtIHdpdGggbWFudWZhY3R1cmVyIGRhdGEgZm9yIGZpbmFsIGRlc2lnbi4nKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmVjOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJpc2tDbGFzcyhsZXZlbCkgew0KICAgICAgICBpZiAobGV2ZWwgPT09ICdMb3cnIHx8IGxldmVsID09PSAnU2FmZScpIHJldHVybiAnc2djcGMtcmlzay1sb3cnOw0KICAgICAgICBpZiAobGV2ZWwgPT09ICdNb2RlcmF0ZScgfHwgbGV2ZWwgPT09ICdDYXV0aW9uJykgcmV0dXJuICdzZ2NwYy1yaXNrLW1vZGVyYXRlJzsNCiAgICAgICAgcmV0dXJuICdzZ2NwYy1yaXNrLWhpZ2gnOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHN0YXR1c0Jhbm5lckNsYXNzKHN0YXR1cykgew0KICAgICAgICBpZiAoc3RhdHVzID09PSAnU2FmZScpIHJldHVybiAnc2djcGMtc3RhdHVzLXNhZmUnOw0KICAgICAgICBpZiAoc3RhdHVzID09PSAnQ2F1dGlvbicpIHJldHVybiAnc2djcGMtc3RhdHVzLWNhdXRpb24nOw0KICAgICAgICByZXR1cm4gJ3NnY3BjLXN0YXR1cy1vdmVybG9hZCc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3RhdHVzSWNvbihzdGF0dXMpIHsNCiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ1NhZmUnKSByZXR1cm4gJysnOw0KICAgICAgICBpZiAoc3RhdHVzID09PSAnQ2F1dGlvbicpIHJldHVybiAnISc7DQogICAgICAgIHJldHVybiAnWCc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGlzcGxheVdhcm5pbmdzKHdhcm5pbmdzKSB7DQogICAgICAgIGlmICghZWxzLndhcm5pbmdzKSByZXR1cm47DQogICAgICAgIGVscy53YXJuaW5ncy5pbm5lckhUTUwgPSAnJzsNCiAgICAgICAgd2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAodykgew0KICAgICAgICAgICAgdmFyIGRpdiA9IGRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICdzZ2NwYy13YXJuaW5nLWl0ZW0nICsgKHcudHlwZSA9PT0gJ2RhbmdlcicgPyAnIHNnY3BjLXdhcm5pbmctZGFuZ2VyJyA6ICcnKTsNCiAgICAgICAgICAgIGRpdi50ZXh0Q29udGVudCA9IHcudGV4dDsNCiAgICAgICAgICAgIGVscy53YXJuaW5ncy5hcHBlbmRDaGlsZChkaXYpOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVHYXVnZSh1dGlsaXphdGlvbikgew0KICAgICAgICBpZiAoIWVscy5nYXVnZUFyYyB8fCAhZWxzLmdhdWdlTmVlZGxlKSByZXR1cm47DQogICAgICAgIHZhciBwY3QgPSBjbGFtcCh1dGlsaXphdGlvbiwgMCwgMTUwKSAvIDE1MDsNCiAgICAgICAgZWxzLmdhdWdlQXJjLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWRhc2hvZmZzZXQnLCBTdHJpbmcoR0FVR0VfQVJDICogKDEgLSBwY3QpKSk7DQogICAgICAgIHZhciBhbmdsZSA9IC05MCArIHBjdCAqIDE4MDsNCiAgICAgICAgZWxzLmdhdWdlTmVlZGxlLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgJ3JvdGF0ZSgnICsgYW5nbGUgKyAnIDEyMCAxMTgpJyk7DQogICAgICAgIGlmIChlbHMuZ2F1Z2VSZWFkKSB7DQogICAgICAgICAgICBlbHMuZ2F1Z2VSZWFkLnRleHRDb250ZW50ID0gaXNGaW5pdGUodXRpbGl6YXRpb24pID8gZm10KHV0aWxpemF0aW9uLCAxKSArICclJyA6IE5BOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlVXRpbEJhcih1dGlsaXphdGlvbikgew0KICAgICAgICBpZiAoIWVscy51dGlsRmlsbCkgcmV0dXJuOw0KICAgICAgICB2YXIgdyA9IGNsYW1wKHV0aWxpemF0aW9uLCAwLCAxMjApOw0KICAgICAgICBlbHMudXRpbEZpbGwuc3R5bGUud2lkdGggPSB3ICsgJyUnOw0KICAgICAgICBlbHMudXRpbEZpbGwuY2xhc3NOYW1lID0gJ3NnY3BjLXV0aWwtZmlsbCcgKw0KICAgICAgICAgICAgKHV0aWxpemF0aW9uID4gMTAwID8gJyBzZ2NwYy11dGlsLW92ZXInIDogdXRpbGl6YXRpb24gPj0gODUgPyAnIHNnY3BjLXV0aWwtY2F1dGlvbicgOiAnJyk7DQogICAgICAgIGlmIChlbHMub3V0VXRpbCkgZWxzLm91dFV0aWwudGV4dENvbnRlbnQgPSBmbXQodXRpbGl6YXRpb24sIDEpICsgJyUnOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZUhlYXRtYXAodXRpbGl6YXRpb24sIGtkLCBldGEpIHsNCiAgICAgICAgaWYgKCFlbHMuaGVhdG1hcENlbGxzKSByZXR1cm47DQogICAgICAgIHZhciBjZWxscyA9IGVscy5oZWF0bWFwQ2VsbHMucXVlcnlTZWxlY3RvckFsbCgnLnNnY3BjLWhtLWNlbGwnKTsNCiAgICAgICAgdmFyIGVkZ2VCb29zdCA9IGtkID4gMS4yID8gMS4zNSA6IGtkID4gMS4wNSA/IDEuMTUgOiAxOw0KICAgICAgICB2YXIgY2VudGVyRmFjdG9yID0gZXRhIDwgMC44ID8gMC44NSA6IDE7DQogICAgICAgIHZhciBiYXNlID0gdXRpbGl6YXRpb24gLyAxMDA7DQogICAgICAgIHZhciBwb3NpdGlvbnMgPSBbDQogICAgICAgICAgICBbMCwgMF0sIFsxLCAwXSwgWzIsIDBdLA0KICAgICAgICAgICAgWzAsIDFdLCBbMSwgMV0sIFsyLCAxXSwNCiAgICAgICAgICAgIFswLCAyXSwgWzEsIDJdLCBbMiwgMl0NCiAgICAgICAgXTsNCiAgICAgICAgY2VsbHMuZm9yRWFjaChmdW5jdGlvbiAoY2VsbCwgaSkgew0KICAgICAgICAgICAgdmFyIHJvdyA9IHBvc2l0aW9uc1tpXVsxXTsNCiAgICAgICAgICAgIHZhciBjb2wgPSBwb3NpdGlvbnNbaV1bMF07DQogICAgICAgICAgICB2YXIgaXNFZGdlID0gcm93ID09PSAwIHx8IHJvdyA9PT0gMiB8fCBjb2wgPT09IDAgfHwgY29sID09PSAyOw0KICAgICAgICAgICAgdmFyIGlzQ29ybmVyID0gKHJvdyA9PT0gMCB8fCByb3cgPT09IDIpICYmIChjb2wgPT09IDAgfHwgY29sID09PSAyKTsNCiAgICAgICAgICAgIHZhciBsb2NhbCA9IGJhc2UgKiBjZW50ZXJGYWN0b3I7DQogICAgICAgICAgICBpZiAoaXNFZGdlKSBsb2NhbCAqPSBlZGdlQm9vc3Q7DQogICAgICAgICAgICBpZiAoaXNDb3JuZXIpIGxvY2FsICo9IDEuMTsNCiAgICAgICAgICAgIGxvY2FsID0gY2xhbXAobG9jYWwsIDAsIDEuNSk7DQogICAgICAgICAgICB2YXIgaHVlID0gbG9jYWwgPD0gMC44NSA/IDE0NSA6IGxvY2FsIDw9IDEgPyA0NSA6IDA7DQogICAgICAgICAgICB2YXIgc2F0ID0gNzA7DQogICAgICAgICAgICB2YXIgbGlnaHQgPSBsb2NhbCA8PSAwLjg1ID8gNDUgKyAoMSAtIGxvY2FsKSAqIDE1IDogNTAgLSAobG9jYWwgLSAwLjg1KSAqIDMwOw0KICAgICAgICAgICAgY2VsbC5zdHlsZS5iYWNrZ3JvdW5kID0gJ2hzbCgnICsgaHVlICsgJywnICsgc2F0ICsgJyUsJyArIGNsYW1wKGxpZ2h0LCAyNSwgNTUpICsgJyUpJzsNCiAgICAgICAgICAgIGNlbGwuc3R5bGUub3BhY2l0eSA9ICcwLjg1JzsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlU2NoZW1hdGljKHIpIHsNCiAgICAgICAgaWYgKCFlbHMuc2NoZW1hdGljKSByZXR1cm47DQogICAgICAgIGVscy5zY2hlbWF0aWMuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXR1cycsIHIuY29udGFjdFN0YXR1cy50b0xvd2VyQ2FzZSgpKTsNCiAgICAgICAgZWxzLnNjaGVtYXRpYy5zZXRBdHRyaWJ1dGUoJ2RhdGEtcGFkcycsIFN0cmluZyhNYXRoLm1pbihyLm4sIDQpKSk7DQoNCiAgICAgICAgaWYgKGVscy5zY2hMZW5ndGgpIHsNCiAgICAgICAgICAgIGVscy5zY2hMZW5ndGgudGV4dENvbnRlbnQgPSBmbXQoZnJvbU1ldHJpY0xlbmd0aChyLkxtbSksIHN0YXRlLnVuaXQgPT09ICdtZXRyaWMnID8gMCA6IDIpICsgJyAnICsgZ2V0TGVuZ3RoVW5pdCgpOw0KICAgICAgICB9DQogICAgICAgIGlmIChlbHMuc2NoV2lkdGgpIHsNCiAgICAgICAgICAgIGVscy5zY2hXaWR0aC50ZXh0Q29udGVudCA9IGZtdChmcm9tTWV0cmljTGVuZ3RoKHIuV21tKSwgc3RhdGUudW5pdCA9PT0gJ21ldHJpYycgPyAwIDogMikgKyAnICcgKyBnZXRMZW5ndGhVbml0KCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVscy5zY2hGb3JjZSkgew0KICAgICAgICAgICAgaWYgKHIubW9kZSA9PT0gJ2FsbG93YWJsZScpIHsNCiAgICAgICAgICAgICAgICBlbHMuc2NoRm9yY2UudGV4dENvbnRlbnQgPSAnRmFsbG93ID0gJyArIGZtdChmcm9tTWV0cmljRm9yY2Uoci5GYWxsb3dUb3RhbCwgZWxzLmxvYWRVbml0LnZhbHVlKSwgMSkgKyAnICcgKyBlbHMubG9hZFVuaXQudmFsdWU7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGVscy5zY2hGb3JjZS50ZXh0Q29udGVudCA9ICdGID0gJyArIGZtdChmcm9tTWV0cmljRm9yY2Uoci5GdG90YWwsIGVscy5sb2FkVW5pdC52YWx1ZSksIDEpICsgJyAnICsgZWxzLmxvYWRVbml0LnZhbHVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChlbHMuc2NoUGFkcykgew0KICAgICAgICAgICAgZWxzLnNjaFBhZHMudGV4dENvbnRlbnQgPSByLm4gKyAnIHBhZCcgKyAoci5uID4gMSA/ICdzJyA6ICcnKSArIFNFUCArICdLZCA9ICcgKyBmbXQoci5rZCwgMik7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgcGFkR3JvdXAgPSAkKCdzZ2NwY1BhZEdyb3VwJyk7DQogICAgICAgIGlmIChwYWRHcm91cCkgew0KICAgICAgICAgICAgcGFkR3JvdXAuaW5uZXJIVE1MID0gJyc7DQogICAgICAgICAgICB2YXIgY291bnQgPSBNYXRoLm1pbihNYXRoLm1heChyLm4sIDEpLCA0KTsNCiAgICAgICAgICAgIHZhciBzdGFydFggPSAxMDAgLSAoY291bnQgLSAxKSAqIDIyOw0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2cnKTsNCiAgICAgICAgICAgICAgICB2YXIgcnggPSBzdGFydFggKyBpICogNDQ7DQogICAgICAgICAgICAgICAgdmFyIHJlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3JlY3QnKTsNCiAgICAgICAgICAgICAgICByZWN0LnNldEF0dHJpYnV0ZSgneCcsIFN0cmluZyhyeCAtIDE2KSk7DQogICAgICAgICAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoJ3knLCAnMTQ4Jyk7DQogICAgICAgICAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzMyJyk7DQogICAgICAgICAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxMCcpOw0KICAgICAgICAgICAgICAgIHJlY3Quc2V0QXR0cmlidXRlKCdyeCcsICcxJyk7DQogICAgICAgICAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3NnY3BjLXNjaC1wYWQnKTsNCiAgICAgICAgICAgICAgICB2YXIgYXJyb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2xpbmUnKTsNCiAgICAgICAgICAgICAgICBhcnJvdy5zZXRBdHRyaWJ1dGUoJ3gxJywgU3RyaW5nKHJ4KSk7 DQogICAgICAgICAgICAgICAgYXJyb3cuc2V0QXR0cmlidXRlKCd5MScsICcxMzInKTsNCiAgICAgICAgICAgICAgICBhcnJvdy5zZXRBdHRyaWJ1dGUoJ3gyJywgU3RyaW5nKHJ4KSk7DQogICAgICAgICAgICAgICAgYXJyb3cuc2V0QXR0cmlidXRlKCd5MicsICcxNDUnKTsNCiAgICAgICAgICAgICAgICBhcnJvdy5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3NnY3BjLXNjaC1mb3JjZS1kb3duJyk7DQogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BvbHlnb24nKTsNCiAgICAgICAgICAgICAgICBoZWFkLnNldEF0dHJpYnV0ZSgncG9pbnRzJywgKHJ4IC0gNCkgKyAnLDE0MiAnICsgcnggKyAnLDE0OCAnICsgKHJ4ICsgNCkgKyAnLDE0MicpOw0KICAgICAgICAgICAgICAgIGhlYWQuc2V0QXR0cmlidXRlKCdjbGFzcycsICdzZ2NwYy1zY2gtYXJyb3cnKTsNCiAgICAgICAgICAgICAgICBnLmFwcGVuZENoaWxkKHJlY3QpOw0KICAgICAgICAgICAgICAgIGcuYXBwZW5kQ2hpbGQoYXJyb3cpOw0KICAgICAgICAgICAgICAgIGcuYXBwZW5kQ2hpbGQoaGVhZCk7DQogICAgICAgICAgICAgICAgcGFkR3JvdXAuYXBwZW5kQ2hpbGQoZyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkaXNwbGF5UmVzdWx0cyhyKSB7DQogICAgICAgIGlmICghcikgew0KICAgICAgICAgICAgaGlkZVNlY3Rpb24oZWxzLnJlc3VsdHMpOw0KICAgICAgICAgICAgc3RhdGUucmVzdWx0c1Nob3duID0gZmFsc2U7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICBzaG93U2VjdGlvbihlbHMucmVzdWx0cyk7DQogICAgICAgIHN0YXRlLnJlc3VsdHNTaG93biA9IHRydWU7DQogICAgICAgIGRpc3BsYXlXYXJuaW5ncyhyLndhcm5pbmdzKTsNCg0KICAgICAgICB2YXIgc3RhdHVzID0gci5tb2RlID09PSAnYWxsb3dhYmxlJyA/ICdTYWZlJyA6IHIuY29udGFjdFN0YXR1czsNCiAgICAgICAgaWYgKGVscy5zdGF0dXNCYW5uZXIpIHsNCiAgICAgICAgICAgIGVscy5zdGF0dXNCYW5uZXIuY2xhc3NOYW1lID0gJ3NnY3BjLXN0YXR1cy1iYW5uZXIgJyArIHN0YXR1c0Jhbm5lckNsYXNzKHN0YXR1cyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVscy5zdGF0dXNJY29uKSBlbHMuc3RhdHVzSWNvbi50ZXh0Q29udGVudCA9IHN0YXR1c0ljb24oc3RhdHVzKTsNCiAgICAgICAgaWYgKGVscy5zdGF0dXNUaXRsZSkgew0KICAgICAgICAgICAgZWxzLnN0YXR1c1RpdGxlLnRleHRDb250ZW50ID0gJ0NvbnRhY3QgU3RhdHVzOiAnICsgKHIubW9kZSA9PT0gJ2FsbG93YWJsZScgPyAnQWxsb3dhYmxlIExvYWQgQ2FsY3VsYXRlZCcgOiByLmNvbnRhY3RTdGF0dXMpOw0KICAgICAgICB9DQogICAgICAgIGlmIChlbHMuc3RhdHVzU3ViKSB7DQogICAgICAgICAgICBlbHMuc3RhdHVzU3ViLnRleHRDb250ZW50ID0gci53ZWFyUmlzayArICcgd2VhciByaXNrJyArIFNFUCArICdVdGlsaXphdGlvbiAnICsgZm10KHIudXRpbGl6YXRpb24sIDEpICsgJyUnICsgU0VQICsgJ1NGICcgKw0KICAgICAgICAgICAgICAgIChpc0Zpbml0ZShyLmFjdHVhbFNGKSA/IGZtdChyLmFjdHVhbFNGLCAyKSA6IE5BKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChlbHMub3V0Tm9taW5hbEFyZWEpIGVscy5vdXROb21pbmFsQXJlYS50ZXh0Q29udGVudCA9IHIuQSA+IDAgPyBmb3JtYXRBcmVhKHIuQSkgOiBOQTsNCiAgICAgICAgaWYgKGVscy5vdXRFZmZBcmVhKSBlbHMub3V0RWZmQXJlYS50ZXh0Q29udGVudCA9IHIuQWVmZiA+IDAgPyBmb3JtYXRBcmVhKHIuQWVmZikgOiBOQTsNCiAgICAgICAgaWYgKGVscy5vdXRGcGFkKSBlbHMub3V0RnBhZC50ZXh0Q29udGVudCA9IHIubW9kZSAhPT0gJ2FsbG93YWJsZScgPyBmb3JtYXRGb3JjZShyLkZwYWQsIHRydWUpIDogTkE7DQogICAgICAgIGlmIChlbHMub3V0RmRlc2lnbikgZWxzLm91dEZkZXNpZ24udGV4dENvbnRlbnQgPSByLm1vZGUgIT09ICdhbGxvd2FibGUnID8gZm9ybWF0Rm9yY2Uoci5GZGVzaWduLCB0cnVlKSA6IE5BOw0KICAgICAgICBpZiAoZWxzLm91dFByZXNzdXJlKSB7DQogICAgICAgICAgICBlbHMub3V0UHJlc3N1cmUudGV4dENvbnRlbnQgPSByLm1vZGUgIT09ICdhbGxvd2FibGUnICYmIHIucCA+IDAgPyBmb3JtYXRQcmVzc3VyZShyLnApIDogKHIubW9kZSA9PT0gJ2FsbG93YWJsZScgPyBOQSA6ICcwJyk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVscy5vdXRQYWxsb3cpIGVscy5vdXRQYWxsb3cudGV4dENvbnRlbnQgPSBmb3JtYXRQcmVzc3VyZShyLnBhbGxvdyk7DQogICAgICAgIGlmIChlbHMub3V0RmFsbG93KSBlbHMub3V0RmFsbG93LnRleHRDb250ZW50ID0gZm9ybWF0Rm9yY2Uoci5GYWxsb3dUb3RhbCwgdHJ1ZSk7DQogICAgICAgIGlmIChlbHMub3V0QXJlYVJlcSkgew0KICAgICAgICAgICAgZWxzLm91dEFyZWFSZXEudGV4dENvbnRlbnQgPSByLm1vZGUgPT09ICdyZXF1aXJlZCcgPyBmb3JtYXRBcmVhKHIuQXJlcXVpcmVkKSA6DQogICAgICAgICAgICAgICAgKHIuQWVmZiA+IDAgJiYgci51dGlsaXphdGlvbiA+IDEwMCA/IGZvcm1hdEFyZWEoci5GZGVzaWduIC8gci5wYWxsb3cpICsgJyAoc3VnZ2VzdGVkKScgOiBOQSk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGVscy5vdXRVdGlsKSB7DQogICAgICAgICAgICB2YXIgdXRpbFRleHQgPSByLm1vZGUgPT09ICdhbGxvd2FibGUnID8gTkEgOiBmbXQoci51dGlsaXphdGlvbiwgMSkgKyAnJSc7DQogICAgICAgICAgICBlbHMub3V0VXRpbC50ZXh0Q29udGVudCA9IHV0aWxUZXh0Ow0KICAgICAgICAgICAgZWxzLm91dFV0aWwuY2xhc3NOYW1lID0gJ3NnY3BjLXJlc3VsdC12YWx1ZSBzZ2NwYy1vdXQtdXRpbCAnICsgcmlza0NsYXNzKA0KICAgICAgICAgICAgICAgIHIudXRpbGl6YXRpb24gPiAxMDAgPyAnT3ZlcmxvYWRlZCcgOiByLnV0aWxpemF0aW9uID49IDg1ID8gJ0NhdXRpb24nIDogJ1NhZmUnDQogICAgICAgICAgICApOw0KICAgICAgICB9DQogICAgICAgIGlmIChlbHMub3V0U0YpIHsNCiAgICAgICAgICAgIGVscy5vdXRTRi50ZXh0Q29udGVudCA9IGlzRmluaXRlKHIuYWN0dWFsU0YpICYmIHIubW9kZSAhPT0gJ2FsbG93YWJsZScgPyBmbXQoci5hY3R1YWxTRiwgMikgOiBOQTsNCiAgICAgICAgICAgIGVscy5vdXRTRi5jbGFzc05hbWUgPSAnc2djcGMtcmVzdWx0LXZhbHVlIHNnY3BjLW91dC1zZiAnICsgcmlza0NsYXNzKA0KICAgICAgICAgICAgICAgIHIuYWN0dWFsU0YgPj0gci5zZiA/ICdTYWZlJyA6IHIuYWN0dWFsU0YgPj0gMSA/ICdDYXV0aW9uJyA6ICdPdmVybG9hZGVkJw0KICAgICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoZWxzLm91dFBWKSB7DQogICAgICAgICAgICBpZiAoci5wdiAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgIGlmIChzdGF0ZS51bml0ID09PSAnbWV0cmljJykgew0KICAgICAgICAgICAgICAgICAgICBlbHMub3V0UFYudGV4dENvbnRlbnQgPSBmbXQoci5wdiwgMykgKyAnIE1QYSBtL3MnOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVscy5vdXRQVi50ZXh0Q29udGVudCA9IGZtdChyLnAgKiBNUEFfVE9fUFNJLCAxKSArICcgcHNpIHggJyArDQogICAgICAgICAgICAgICAgICAgICAgICBmbXQoZnJvbU1ldHJpY1NwZWVkKHIuc3BlZWRNcHMpLCAxKSArICcgZnQvbWluJzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGVscy5vdXRQVi50ZXh0Q29udGVudCA9IE5BICsgJyAoZW50ZXIgc2xpZGluZyBzcGVlZCknOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmIChlbHMub3V0V2Vhcikgew0KICAgICAgICAgICAgZWxzLm91dFdlYXIudGV4dENvbnRlbnQgPSByLndlYXJSaXNrOw0KICAgICAgICAgICAgZWxzLm91dFdlYXIuY2xhc3NOYW1lID0gJ3NnY3BjLXJlc3VsdC12YWx1ZSBzZ2NwYy1vdXQtd2VhciAnICsgcmlza0NsYXNzKHIud2VhclJpc2spOw0KICAgICAgICB9DQogICAgICAgIGlmIChlbHMub3V0U3RhdHVzKSB7DQogICAgICAgICAgICBlbHMub3V0U3RhdHVzLnRleHRDb250ZW50ID0gci5tb2RlID09PSAnYWxsb3dhYmxlJyA/ICdOL0EnIDogci5jb250YWN0U3RhdHVzOw0KICAgICAgICAgICAgZWxzLm91dFN0YXR1cy5jbGFzc05hbWUgPSAnc2djcGMtcmVzdWx0LXZhbHVlIHNnY3BjLW91dC1zdGF0dXMgJyArIHJpc2tDbGFzcyhyLmNvbnRhY3RTdGF0dXMpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKGVscy5oZXJvUHJlc3N1cmUpIHsNCiAgICAgICAgICAgIGlmIChyLm1vZGUgPT09ICdhbGxvd2FibGUnKSB7DQogICAgICAgICAgICAgICAgZWxzLmhlcm9QcmVzc3VyZS50ZXh0Q29udGVudCA9IGZvcm1hdEZvcmNlKHIuRmFsbG93VG90YWwsIGZhbHNlKTsNCiAgICAg ICAgICAgICAgICBpZiAoZWxzLmhlcm9QcmVzc3VyZUxhYmVsKSBlbHMuaGVyb1ByZXNzdXJlTGFiZWwudGV4dENvbnRlbnQgPSAnTWF4aW11bSBBbGxvd2FibGUgTG9hZCc7DQogICAgICAgICAgICAgICAgaWYgKGVscy5oZXJvUHJlc3N1cmVTdWIpIGVscy5oZXJvUHJlc3N1cmVTdWIudGV4dENvbnRlbnQgPSAnRmFsbG93LHRvdGFsID0gcGFsbG93IHggQWVmZiB4IG4gLyBLZCc7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGVscy5oZXJvUHJlc3N1cmUudGV4dENvbnRlbnQgPSBmb3JtYXRQcmVzc3VyZShyLnApOw0KICAgICAgICAgICAgICAgIGlmIChlbHMuaGVyb1ByZXNzdXJlTGFiZWwpIGVscy5oZXJvUHJlc3N1cmVMYWJlbC50ZXh0Q29udGVudCA9ICdBdmVyYWdlIENvbnRhY3QgUHJlc3N1cmUnOw0KICAgICAgICAgICAgICAgIGlmIChlbHMuaGVyb1ByZXNzdXJlU3ViKSBlbHMuaGVyb1ByZXNzdXJlU3ViLnRleHRDb250ZW50ID0gJ3AgPSBGZGVzaWduIC8gQWVmZic7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICB1cGRhdGVHYXVnZShyLm1vZGUgPT09ICdhbGxvd2FibGUnID8gMCA6IHIudXRpbGl6YXRpb24pOw0KICAgICAgICB1cGRhdGVVdGlsQmFyKHIubW9kZSA9PT0gJ2FsbG93YWJsZScgPyAwIDogci51dGlsaXphdGlvbik7DQogICAgICAgIHVwZGF0ZUhlYXRtYXAoci51dGlsaXphdGlvbiwgci5rZCwgci5ldGEpOw0KICAgICAgICB1cGRhdGVTY2hlbWF0aWMocik7DQoNCiAgICAgICAgaWYgKGVscy5yZWNvbW1lbmRhdGlvbnMpIHsNCiAgICAgICAgICAgIGVscy5yZWNvbW1lbmRhdGlvbnMuaW5uZXJIVE1MID0gJyc7DQogICAgICAgICAgICByLnJlY29tbWVuZGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh0ZXh0KSB7DQogICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsNCiAgICAgICAgICAgICAgICBsaS50ZXh0Q29udGVudCA9IHRleHQ7DQogICAgICAgICAgICAgICAgZWxzLnJlY29tbWVuZGF0aW9ucy5hcHBlbmRDaGlsZChsaSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsNCiAgICAgICAgZGlzcGxheVJlc3VsdHModmFsaWRhdGVBbmRDYWxjdWxhdGUoKSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYmluZEVsZW1lbnRzKCkgew0KICAgICAgICBlbHMgPSB7DQogICAgICAgICAgICBtb2RlOiAkKCdzZ2NwY01vZGUnKSwNCiAgICAgICAgICAgIGNvbnRhY3RUeXBlOiAkKCdzZ2NwY0NvbnRhY3RUeXBlJyksDQogICAgICAgICAgICBsZW5ndGg6ICQoJ3NnY3BjTGVuZ3RoJyksDQogICAgICAgICAgICB3aWR0aDogJCgnc2djcGNXaWR0aCcpLA0KICAgICAgICAgICAgcGFkczogJCgnc2djcGNQYWRzJyksDQogICAgICAgICAgICBldGE6ICQoJ3NnY3BjRXRhJyksDQogICAgICAgICAgICBsb2FkOiAkKCdzZ2NwY0xvYWQnKSwNCiAgICAgICAgICAgIGxvYWRVbml0OiAkKCdzZ2NwY0xvYWRVbml0JyksDQogICAgICAgICAgICBrZDogJCgnc2djcGNLZCcpLA0KICAgICAgICAgICAgc2xpZGVyTWF0OiAkKCdzZ2NwY1NsaWRlck1hdCcpLA0KICAgICAgICAgICAgZ3VpZGVNYXQ6ICQoJ3NnY3BjR3VpZGVNYXQnKSwNCiAgICAgICAgICAgIHBSZWY6ICQoJ3NnY3BjUFJlZicpLA0KICAgICAgICAgICAgcFJlZlVuaXQ6ICQoJ3NnY3BjUFJlZlVuaXQnKSwNCiAgICAgICAgICAgIHNmOiAkKCdzZ2NwY1NmJyksDQogICAgICAgICAgICBsdWJlOiAkKCdzZ2NwY0x1YmUnKSwNCiAgICAgICAgICAgIHNwZWVkOiAkKCdzZ2NwY1NwZWVkJyksDQogICAgICAgICAgICB0ZW1wOiAkKCdzZ2NwY1RlbXAnKSwNCiAgICAgICAgICAgIG1vZGVOb3RlOiAkKCdzZ2NwY01vZGVOb3RlJyksDQogICAgICAgICAgICBtYXRlcmlhbEhpbnQ6ICQoJ3NnY3BjTWF0ZXJpYWxIaW50JyksDQogICAgICAgICAgICB3YXJuaW5nczogJCgnc2djcGNXYXJuaW5ncycpLA0KICAgICAgICAgICAgcmVzdWx0czogJCgnc2djcGNSZXN1bHRzJyksDQogICAgICAgICAgICBzdGF0dXNCYW5uZXI6ICQoJ3NnY3BjU3RhdHVzQmFubmVyJyksDQogICAgICAgICAgICBzdGF0dXNJY29uOiAkKCdzZ2NwY1N0YXR1c0ljb24nKSwNCiAgICAgICAgICAgIHN0YXR1c1RpdGxlOiAkKCdzZ2NwY1N0YXR1c1RpdGxlJyksDQogICAgICAgICAgICBzdGF0dXNTdWI6ICQoJ3NnY3BjU3RhdHVzU3ViJyksDQogICAgICAgICAgICBoZXJvUHJlc3N1cmU6ICQoJ3NnY3BjSGVyb1ByZXNzdXJlJyksDQogICAgICAgICAgICBoZXJvUHJlc3N1cmVMYWJlbDogJCgnc2djcGNIZXJvUHJlc3N1cmVMYWJlbCcpLA0KICAgICAgICAgICAgaGVyb1ByZXNzdXJlU3ViOiAkKCdzZ2NwY0hlcm9QcmVzc3VyZVN1YicpLA0KICAgICAgICAgICAgb3V0Tm9taW5hbEFyZWE6ICQoJ3NnY3BjT3V0Tm9taW5hbEFyZWEnKSwNCiAgICAgICAgICAgIG91dEVmZkFyZWE6ICQoJ3NnY3BjT3V0RWZmQXJlYScpLA0KICAgICAgICAgICAgb3V0RnBhZDogJCgnc2djcGNPdXRGcGFkJyksDQogICAgICAgICAgICBvdXRGZGVzaWduOiAkKCdzZ2NwY091dEZkZXNpZ24nKSwNCiAgICAgICAgICAgIG91dFByZXNzdXJlOiAkKCdzZ2NwY091dFByZXNzdXJlJyksDQogICAgICAgICAgICBvdXRQYWxsb3c6ICQoJ3NnY3BjT3V0UGFsbG93JyksDQogICAgICAgICAgICBvdXRGYWxsb3c6ICQoJ3NnY3BjT3V0RmFsbG93JyksDQogICAgICAgICAgICBvdXRBcmVhUmVxOiAkKCdzZ2NwY091dEFyZWFSZXEnKSwNCiAgICAgICAgICAgIG91dFV0aWw6ICQoJ3NnY3BjT3V0VXRpbCcpLA0KICAgICAgICAgICAgb3V0U0Y6ICQoJ3NnY3BjT3V0U0YnKSwNCiAgICAgICAgICAgIG91dFBWOiAkKCdzZ2NwY091dFBWJyksDQogICAgICAgICAgICBvdXRXZWFyOiAkKCdzZ2NwY091dFdlYXInKSwNCiAgICAgICAgICAgIG91dFN0YXR1czogJCgnc2djcGNPdXRTdGF0dXMnKSwNCiAgICAgICAgICAgIGdhdWdlQXJjOiAkKCdzZ2NwY0dhdWdlQXJjJyksDQogICAgICAgICAgICBnYXVnZU5lZWRsZTogJCgnc2djcGNHYXVnZU5lZWRsZScpLA0KICAgICAgICAgICAgZ2F1Z2VSZWFkOiAkKCdzZ2NwY0dhdWdlUmVhZCcpLA0KICAgICAgICAgICAgdXRpbEZpbGw6ICQoJ3NnY3BjVXRpbEZpbGwnKSwNCiAgICAgICAgICAgIGhlYXRtYXBDZWxsczogJCgnc2djcGNIZWF0bWFwJyksDQogICAgICAgICAgICBzY2hlbWF0aWM6ICQoJ3NnY3BjU2NoZW1hdGljJyksDQogICAgICAgICAgICBzY2hMZW5ndGg6ICQoJ3NnY3BjU2NoTGVuZ3RoJyksDQogICAgICAgICAgICBzY2hXaWR0aDogJCgnc2djcGNTY2hXaWR0aCcpLA0KICAgICAgICAgICAgc2NoRm9yY2U6ICQoJ3NnY3BjU2NoRm9yY2UnKSwNCiAgICAgICAgICAgIHNjaFBhZHM6ICQoJ3NnY3BjU2NoUGFkcycpLA0KICAgICAgICAgICAgcmVjb21tZW5kYXRpb25zOiAkKCdzZ2NwY1JlY29tbWVuZGF0aW9ucycpLA0KICAgICAgICAgICAgY2FsY3VsYXRlQnRuOiAkKCdzZ2NwY0NhbGN1bGF0ZUJ0bicpLA0KICAgICAgICAgICAgcmVzZXRCdG46ICQoJ3NnY3BjUmVzZXRCdG4nKSwNCiAgICAgICAgICAgIHVuaXRSYWRpb3M6IHJvb3QucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0ic2djcGMtdW5pdFN5c3RlbSJdJykNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhcHBseURlZmF1bHRzKCkgew0KICAgICAgICBzdGF0ZSA9IHsgdW5pdDogREVGQVVMVFMudW5pdCwgcFJlZk1hbnVhbDogZmFsc2UsIHJlc3VsdHNTaG93bjogZmFsc2UgfTsNCiAgICAgICAgZWxzLm1vZGUudmFsdWUgPSBERUZBVUxUUy5tb2RlOw0KICAgICAgICBlbHMuY29udGFjdFR5cGUudmFsdWUgPSBERUZBVUxUUy5jb250YWN0VHlwZTsNCiAgICAgICAgZWxzLmxlbmd0aC52YWx1ZSA9IERFRkFVTFRTLmxlbmd0aDsNCiAgICAgICAgZWxzLndpZHRoLnZhbHVlID0gREVGQVVMVFMud2lkdGg7DQogICAgICAgIGVscy5wYWRzLnZhbHVlID0gREVGQVVMVFMucGFkczsNCiAgICAgICAgZWxzLmV0YS52YWx1ZSA9IERFRkFVTFRTLmV0YTsNCiAgICAgICAgZWxzLmxvYWQudmFsdWUgPSBERUZBVUxUUy5sb2FkOw0KICAgICAgICBlbHMubG9hZFVuaXQudmFsdWUgPSBERUZBVUxUUy5sb2FkVW5pdDsNCiAgICAgICAgZWxzLmtkLnZhbHVlID0gREVGQVVMVFMua2Q7DQogICAgICAgIGVscy5zbGlkZXJNYXQudmFsdWUgPSBERUZBVUxUUy5zbGlkZXJNYXQ7DQogICAgICAgIGVscy5ndWlkZU1hdC52YWx1ZSA9IERFRkFVTFRTLmd1aWRlTWF0Ow0KICAgICAgICBlbHMucFJlZi52YWx1ZSA9IERFRkFVTFRTLnBSZWY7DQogICAgICAgIGVscy5wUmVmVW5pdC52YWx1ZSA9IERFRkFVTFRTLnBSZWZVbml0Ow0KICAgICAgICBlbHMuc2YudmFsdWUgPSBERUZBVUxUUy5zZjsNCiAgICAgICAgZWxzLmx1YmUudmFsdWUgPSBERUZBVUxUUy5sdWJlOw0KICAgICAgICBlbHMuc3BlZWQudmFsdWUgPSBERUZBVUxUUy5zcGVlZDsNCiAgICAgICAg ZWxzLnRlbXAudmFsdWUgPSBERUZBVUxUUy50ZW1wOw0KICAgICAgICBbXS5mb3JFYWNoLmNhbGwoZWxzLnVuaXRSYWRpb3MsIGZ1bmN0aW9uIChyKSB7DQogICAgICAgICAgICByLmNoZWNrZWQgPSByLnZhbHVlID09PSBERUZBVUxUUy51bml0Ow0KICAgICAgICB9KTsNCiAgICAgICAgdXBkYXRlTW9kZVVJKCk7DQogICAgICAgIHVwZGF0ZVVuaXRMYWJlbHMoKTsNCiAgICAgICAgdXBkYXRlTWF0ZXJpYWxEZWZhdWx0cygpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlc2V0Q2FsY3VsYXRvcigpIHsNCiAgICAgICAgYXBwbHlEZWZhdWx0cygpOw0KICAgICAgICBjbGVhckVycm9ycygpOw0KICAgICAgICBpZiAoZWxzLndhcm5pbmdzKSBlbHMud2FybmluZ3MuaW5uZXJIVE1MID0gJyc7DQogICAgICAgIGhpZGVTZWN0aW9uKGVscy5yZXN1bHRzKTsNCiAgICAgICAgc3RhdGUucmVzdWx0c1Nob3duID0gZmFsc2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gaGlkZVJlc3VsdHNPbklucHV0Q2hhbmdlKCkgew0KICAgICAgICBpZiAoIXN0YXRlLnJlc3VsdHNTaG93bikgcmV0dXJuOw0KICAgICAgICBoaWRlU2VjdGlvbihlbHMucmVzdWx0cyk7DQogICAgICAgIHN0YXRlLnJlc3VsdHNTaG93biA9IGZhbHNlOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJpbmRFdmVudHMoKSB7DQogICAgICAgIGVscy5tb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHVwZGF0ZU1vZGVVSSgpOw0KICAgICAgICAgICAgaGlkZVJlc3VsdHNPbklucHV0Q2hhbmdlKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy5jb250YWN0VHlwZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoaWRlUmVzdWx0c09uSW5wdXRDaGFuZ2UpOw0KDQogICAgICAgIFtlbHMuc2xpZGVyTWF0LCBlbHMuZ3VpZGVNYXRdLmZvckVhY2goZnVuY3Rpb24gKHNlbCkgew0KICAgICAgICAgICAgc2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICBzdGF0ZS5wUmVmTWFudWFsID0gZmFsc2U7DQogICAgICAgICAgICAgICAgdXBkYXRlTWF0ZXJpYWxEZWZhdWx0cygpOw0KICAgICAgICAgICAgICAgIGhpZGVSZXN1bHRzT25JbnB1dENoYW5nZSgpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy5wUmVmLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgc3RhdGUucFJlZk1hbnVhbCA9IHRydWU7DQogICAgICAgICAgICBoaWRlUmVzdWx0c09uSW5wdXRDaGFuZ2UoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgdmFyIGxhc3RQUmVmVW5pdCA9IGVscy5wUmVmVW5pdC52YWx1ZTsNCiAgICAgICAgZWxzLnBSZWZVbml0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgbGFzdFBSZWZVbml0ID0gdGhpcy52YWx1ZTsNCiAgICAgICAgfSk7DQogICAgICAgIGVscy5wUmVmVW5pdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIgdiA9IHBhcnNlTnVtKGVscy5wUmVmLnZhbHVlKTsNCiAgICAgICAgICAgIGlmICh2ICE9PSBudWxsKSB7DQogICAgICAgICAgICAgICAgdmFyIG1wYSA9IHRvTWV0cmljUHJlc3N1cmUodiwgbGFzdFBSZWZVbml0KTsNCiAgICAgICAgICAgICAgICBlbHMucFJlZi52YWx1ZSA9IGZyb21NZXRyaWNQcmVzc3VyZShtcGEsIHRoaXMudmFsdWUpLnRvRml4ZWQoDQogICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPT09ICdNUGEnID8gMSA6IDANCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIGxhc3RQUmVmVW5pdCA9IHRoaXMudmFsdWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBoaWRlUmVzdWx0c09uSW5wdXRDaGFuZ2UoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZWxzLnVuaXRSYWRpb3MuZm9yRWFjaChmdW5jdGlvbiAocmFkaW8pIHsNCiAgICAgICAgICAgIHJhZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tlZCkgcmV0dXJuOw0KICAgICAgICAgICAgICAgIGNvbnZlcnRPblVuaXRDaGFuZ2Uoc3RhdGUudW5pdCwgdGhpcy52YWx1ZSk7DQogICAgICAgICAgICAgICAgc3RhdGUudW5pdCA9IHRoaXMudmFsdWU7DQogICAgICAgICAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICAgICAgICAgIHVwZGF0ZU1hdGVyaWFsRGVmYXVsdHMoKTsNCiAgICAgICAgICAgICAgICBoaWRlUmVzdWx0c09uSW5wdXRDaGFuZ2UoKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCg0KICAgICAgICB2YXIgbGl2ZUlucHV0cyA9IFsNCiAgICAgICAgICAgIGVscy5sZW5ndGgsIGVscy53aWR0aCwgZWxzLnBhZHMsIGVscy5ldGEsIGVscy5sb2FkLCBlbHMubG9hZFVuaXQsDQogICAgICAgICAgICBlbHMua2QsIGVscy5zZiwgZWxzLmx1YmUsIGVscy5zcGVlZCwgZWxzLnRlbXANCiAgICAgICAgXTsNCiAgICAgICAgbGl2ZUlucHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChpbnApIHsNCiAgICAgICAgICAgIGlmICghaW5wKSByZXR1cm47DQogICAgICAgICAgICBpbnAuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBoaWRlUmVzdWx0c09uSW5wdXRDaGFuZ2UpOw0KICAgICAgICAgICAgaW5wLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhpZGVSZXN1bHRzT25JbnB1dENoYW5nZSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy5jYWxjdWxhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjYWxjdWxhdGUpOw0KICAgICAgICBpZiAoZWxzLnJlc2V0QnRuKSBlbHMucmVzZXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldENhbGN1bGF0b3IpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGluaXQoKSB7DQogICAgICAgIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChST09UX0lEKTsNCiAgICAgICAgaWYgKCFyb290IHx8IHJvb3QuZ2V0QXR0cmlidXRlKCdkYXRhLXNnY3BjLXJlYWR5JykgPT09ICcxJykgcmV0dXJuOw0KICAgICAgICByb290LnNldEF0dHJpYnV0ZSgnZGF0YS1zZ2NwYy1yZWFkeScsICcxJyk7DQogICAgICAgIGJpbmRFbGVtZW50cygpOw0KICAgICAgICBhcHBseURlZmF1bHRzKCk7DQogICAgICAgIGJpbmRFdmVudHMoKTsNCiAgICB9DQoNCiAgICB3aW5kb3cuc2djcGNSZXNldCA9IHJlc2V0Q2FsY3VsYXRvcjsNCg0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGluaXQpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGluaXQoKTsNCiAgICB9DQp9KSgpOw0K
Calculation Results
—
Contact Status
Enter values and calculate
Average Contact Pressure
—
p = Fdesign / Aeff
Slider & Guide Rail Contact Diagram
L = 200 mm
W
40 mm
F = 80 kN
2 pads | Kd = 1.20
Normal load ↓ on contact surface
Contact Pressure Heatmap (Relative)
Edge loading may raise local pressure above average
Pressure Utilization Gauge
Utilization (%)
—
Scale: 0–150% of allowable
Wear Risk Indicator
Qualitative Wear Risk
—
Based on pressure utilization, speed, lubrication, material pair, and temperature
Nominal Contact Area
—
Effective Contact Area
—
Load Per Slider / Pad
—
Design Load Per Pad
—
Average Contact Pressure
—
Allowable Contact Pressure
—
Maximum Allowable Load
—
Required Contact Area
—
Actual Safety Factor
—
PV Value
—
Contact Status
—
Engineering Recommendations