{"id":257815,"date":"2015-05-24T05:15:02","date_gmt":"2015-05-24T01:15:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=257815"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=257815","title":{"rendered":"\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0449\u0438\u0442\u044b Wing IDE"},"content":{"rendered":"\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/619\/553\/135\/6195531358aa46a7b1caeebfb96de3af.png\" \/><\/div>\n<p>  \u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0437\u0434\u0440\u0430\u0432\u0438\u044f! \u041d\u0435 \u0443\u0434\u0438\u0432\u043b\u044e\u0441\u044c, \u0447\u0442\u043e \u0412\u044b \u0440\u0430\u043d\u044c\u0448\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0441\u043b\u044b\u0448\u0430\u043b\u0438 \u043e\u0431 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041a\u0430\u043a \u0438 \u044f, \u0434\u043e \u0442\u043e\u0433\u043e \u0434\u043d\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f <b>Python Debugger<\/b>. \u0414\u0430, \u0437\u043d\u0430\u044e, \u0435\u0441\u0442\u044c <b>pdb<\/b>, \u043d\u043e \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438 \u0442\u043e, \u043a\u0430\u043a \u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d, \u043c\u043d\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u0440\u0438\u0433\u043b\u044f\u043d\u0443\u043b\u043e\u0441\u044c. \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u0442 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u0432\u0430\u0448\u0438\u0445 <b>Python<\/b> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 (\u0441\u043a\u0430\u0436\u0443 \u0441\u0440\u0430\u0437\u0443: \u0434\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u044f \u043d\u0435 \u0438\u0437\u0443\u0447\u0430\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0443\u0442, \u043f\u0440\u043e\u0441\u044c\u0431\u0430 \u043d\u0435 \u0440\u0443\u0433\u0430\u0442\u044c\u0441\u044f).<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h5><b><u>\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0435\u0440\u0435\u0436\u0435\u043d\u0438\u0435: \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442\u0435 \u043d\u0430 \u0441\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0445 \u0438 \u0440\u0438\u0441\u043a!<\/u><\/b><\/h5>\n<h4><b>\u0418\u0442\u0430\u043a, \u043c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c&#8230;<\/b><\/h4>\n<p>  \u041f\u0430\u0446\u0438\u0435\u043d\u0442, \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0439. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445: \u043e\u043d \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 (!!!), \u043f\u0443\u0441\u043a\u0430\u0439 \u0438 \u0432 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0435; \u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043a\u0430\u043a \u044d\u0442\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0431\u044b\u0432\u0430\u0435\u0442\u2026 \u0432 \u043e\u0431\u0449\u0435\u043c, \u0443\u0432\u0438\u0434\u0438\u0442\u0435.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c, \u043a\u0430\u0447\u0430\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 (<a href=\"http:\/\/wingware.com\/pub\/wingide\/5.1.4\/wingide-5.1.4-1.exe\"><b>Wing IDE Professional v 5.1.4<\/b><\/a>). \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c, \u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443. \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <b>.\/bin\/wing.exe<\/b>. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0435\u0433\u043e. \u0420\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 <b>Python<\/b>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0438 \u0435\u0433\u043e. \u041d\u0443\u0436\u0435\u043d \u0432\u0435\u0440\u0441\u0438\u0438 <b>2<\/b> (\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u044f <b>2.7.9<\/b>). \u0421\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u0442\u0447\u0438, \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f. \u0422\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u043b\u0435\u0437\u0430\u0435\u0442 \u043e\u043a\u043e\u0448\u043a\u043e \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 (\u0442.\u043a. \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e-\u0432\u0435\u0440\u0441\u0438\u044f). \u0412\u0432\u0435\u0434\u0435\u043c \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0440\u0443\u043d\u0434\u0443:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/da3\/303\/d88\/da3303d88e1a43658c86622e2ea4f5e0.png\" \/><\/div>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0442\u0432\u0435\u0442:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/5f5\/fa1\/ac1\/5f5fa1ac1c7e407d9fac017de7ae3954.png\" \/><\/div>\n<p>  \u0427\u0442\u043e \u0437\u0430\u0431\u0430\u0432\u043d\u043e: \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u043c \u0441\u0430\u043c\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0434\u043b\u0438\u043d\u0443 \u043a\u043b\u044e\u0447\u0430 (20, \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0434\u0435\u0444\u0438\u0441\u043e\u0432), \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0441 \u044d\u0442\u043e\u0433\u043e \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0449\u0438\u0442\u0443 \u2014 \u043d\u0430\u0439\u0434\u0435\u043c \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<br \/>  \u0414\u0430\u043b\u044c\u0448\u0435 \u2014 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430\u0448\u0435\u043b\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <b>.\/bin\/2.7\/src.zip<\/b>!<\/p>\n<p>  \u0414\u0430-\u0434\u0430. \u0412\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0430\u043a: \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0438\u0434\u0435\u0442 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438. \u0412 \u043d\u0438\u0445-\u0442\u043e \u043d\u0430\u043c \u0438 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h4><b>\u042d\u0442\u0430\u043f \u0434\u0432\u0430: \u0440\u043e\u0435\u043c\u0441\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445<\/b><\/h4>\n<p>  \u0412\u043a\u043b\u044e\u0447\u0438\u043c \u0432 <b>Total Commander<\/b> \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0430\u0440\u0445\u0438\u0432\u0430\u043c, \u0438 \u043d\u0430\u0439\u0434\u0435\u043c \u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u043e\u0432\u0430. \u0421\u0442\u0440\u043e\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0444\u0430\u0439\u043b\u0435: <b>.\/bin\/2.7\/src.zip\/process\/wingctl.pyo<\/b>. <i>PYO<\/i>-\u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0441 &quot;<i>\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c<\/i>&quot; \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c <b>Python<\/b>.<\/p>\n<p>  \u041a \u043d\u0430\u0448\u0435\u043c\u0443 \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0434\u043b\u044f \u041f\u0438\u0442\u043e\u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0430\u0440\u043e\u0447\u043a\u0430 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0443\u0442\u0440\u0443\u0436\u0434\u0430\u0442\u044c \u0412\u0430\u0441 \u043f\u043e\u0438\u0441\u043a\u0430\u043c\u0438, \u0434\u0430\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0438\u0441\u044c:<\/p>\n<ol>\n<li><a href=\"http:\/\/sourceforge.net\/projects\/easypythondecompiler\/\"><b>Easy Python Decompiler<\/b> (<i>EPD<\/i>)<\/a> \u2014 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0448\u0438\u0442\u044b \u0434\u0432\u0430 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (<b>Uncompyle2<\/b> \u0438 <b>Decompyle++<\/b>);<\/li>\n<li><a href=\"https:\/\/github.com\/wibiti\/uncompyle2\"><b>\u0424\u043e\u0440\u043a Uncompyle2<\/b><\/a> \u2014 \u0438\u043d\u043e\u0433\u0434\u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435.<\/li>\n<\/ol>\n<p>  \u0418\u0442\u0430\u043a, \u0440\u0430\u0441\u043f\u0430\u043a\u0443\u0435\u043c \u0432\u0435\u0441\u044c \u0430\u0440\u0445\u0438\u0432 <b>src.zip<\/b> \u0432 \u043f\u0430\u043f\u043a\u0443 <b>src<\/b> (\u0440\u044f\u0434\u043e\u043c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0430\u043f\u043a\u0430 <b>src<\/b>, \u043f\u0443\u0441\u043a\u0430\u0439 \u0442\u0443\u0434\u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435) \u0438 \u043d\u0430\u0442\u0440\u0430\u0432\u0438\u043c \u043d\u0430 \u043d\u0435\u0435 <b>EPD<\/b>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/76e\/30d\/cde\/76e30dcded374775b3e5163315eda182.png\" \/><\/div>\n<p>  \u0414\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0441\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0438 \u0438\u0434\u0435\u043c \u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c. \u0410 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435\u043c <b>_dis<\/b>. \u0418\u0445 \u043c\u044b \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c \u0432 <b>.py<\/b>. \u0412\u0441\u0435 \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e, \u0432\u044b\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435\u043c <b>_dis_failed<\/b>, \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043e\u0441\u0438\u043b\u0438\u043b. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0444\u0430\u0439\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d: <b>edit\/editor.pyo_dis_failed<\/b><\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u043d\u0430\u0442\u0440\u0430\u0432\u0438\u0442\u044c <b>Decompyle++<\/b>\u2026 \u0422\u0430 \u0436\u0435 \u0431\u0435\u0434\u0430. \u041d\u0435 \u0437\u0440\u044f \u044f \u0434\u0430\u043b \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0437\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0442.\u043a. \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u0438 \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u0440\u0443\u0433\u0438\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u0434\u0430\u043b\u0438\u043c \u0432\u0441\u0435 <b>pyo<\/b>\/<b>pyc<\/b> \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 src, \u0430 <b>.py*_dis<\/b> \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c \u0432 <b>.py<\/b>.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u0432\u0441\u0435 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0434\u043b\u044f \u0430\u0440\u0445\u0438\u0432\u0430 <b>opensource.zip<\/b>, \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0432 \u0435\u0433\u043e \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u044e\u044e \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443. \u0410\u0440\u0445\u0438\u0432 <b>external.zip<\/b> \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c, \u0442.\u043a., \u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u0435\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043c \u043b\u0435\u0436\u0430\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u041f\u0438\u0442\u043e\u043d\u0430. \u0422\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c:<\/p>\n<ol>\n<li>\n<pre><code class=\"dos\">pip install docutils<\/code><\/pre>\n<\/li>\n<li><a href=\"http:\/\/python.net\/crew\/gherman\/programs\/py2pdf\/py2pdf-0.5.zip\"><b>py2pdf<\/b><\/a> \u2014 \u0435\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 <b>external<\/b>;<\/li>\n<li><a href=\"http:\/\/effbot.org\/downloads\/PIL-1.1.7.win32-py2.7.exe\"><b>Imaging-1.1.7<\/b><\/a> \u2014 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c. \u0418\u0437 \u043f\u0430\u043f\u043a\u0438 <b>external<\/b> \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c;<\/li>\n<li><a href=\"http:\/\/ftp.gnome.org\/pub\/GNOME\/binaries\/win32\/pygtk\/2.24\/pygtk-2.24.0.win32-py2.7.exe\"><b>pygtk<\/b><\/a> \u2014 \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u0432.<\/li>\n<\/ol>\n<p>  \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (<b>pyscintilla2<\/b> \u0438 <b>pysqlite<\/b>) \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430 <b>external.zip<\/b>, \u0438 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c, \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435.<\/p>\n<h4><b>\u042d\u0442\u0430\u043f\u044b \u0442\u0440\u0438 \u0438 \u0447\u0435\u0442\u044b\u0440\u0435: \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434. \u041e\u0442\u043b\u0430\u0434\u043a\u0430.<\/b><\/h4>\n<p>  \u041f\u043e\u0440\u044b\u0441\u043a\u0430\u0432 \u043f\u043e \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c, \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u0444\u0430\u0439\u043b\u0438\u043a <b>wing.py<\/b> \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0430\u043f\u043a\u0438 \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439. \u0418, \u043f\u0435\u0440\u0432\u044b\u0439 \u0436\u0435 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043d\u0430\u043c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442:  <\/p>\n<pre><code class=\"python\"># Top level script for invoking Wing IDE.  If --use-src is specified #  as an arg, then the files in WINGHOME\/src, WINGHOME\/external, #  WINGHOME\/opensource will be used; otherwise, the files in the version #  specific bin directory will be used if it exists. <\/code><\/pre>\n<p>  \u0412 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445: \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0443 \u0434\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <b>&#8212;use-src<\/b>, \u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0438\u0437 \u043f\u0430\u043f\u043e\u043a <b>src<\/b>, <b>external<\/b>, <b>opensource<\/b> \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 \u0441 <b>Wing IDE<\/b> (\u0430 \u043d\u0435 \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c).<\/p>\n<p>  \u0417\u0430\u0433\u043b\u044f\u043d\u0443\u0432 \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443, \u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u043f\u0430\u043f\u043a\u0443 <b>src<\/b>, \u0438 <b>.py<\/b>-\u0444\u0430\u0439\u043b\u044b \u0432 \u043d\u0435\u0439. \u041f\u043e\u0434\u043a\u0438\u043d\u0435\u043c \u0438\u0445 \u0432 \u043d\u0430\u0448\u0443 \u043f\u0430\u043f\u043a\u0443 <b>src<\/b>, \u0441 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044c\u044e (\u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0442\u0430\u043a\u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044b, \u0430 \u043d\u0435 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b).<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0442\u0440\u0438 \u043f\u0430\u043f\u043a\u0438 (\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0447\u0443\u0442\u044c \u0432\u044b\u0448\u0435), \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c\u2026<\/p>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <b>Wing IDE<\/b>, \u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432 \u043d\u0435\u0439 \u0444\u0430\u0439\u043b <b>wing.py<\/b> \u0438\u0437 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 <b>bin<\/b>. \u0414\u0430\u043b\u0435\u0435 \u0432 \u043c\u0435\u043d\u044e <b>Debug -&gt; Debug Environment&#8230;<\/b> \u0432 \u043f\u043e\u043b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c <b>&#8212;use-src<\/b>. \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u0440\u0442\u0430\u043d\u0435\u043c \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440 (\u043a\u043b\u0430\u0432\u0438\u0448\u0430 <b>F5<\/b>). \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u043c\u0430\u0445\u0438\u043d\u0430\u0446\u0438\u0438 \u0441 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043f\u0430\u043f\u043e\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 <b>Wing IDE<\/b>. \u041f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e!<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435: \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c <b>Wing IDE<\/b> \u0442\u043e\u0442 \u0444\u0430\u0439\u043b\u0438\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u0440\u0430\u043d\u0435\u0435 \u0441\u0442\u0440\u043e\u043a\u0443 \u043e \u043f\u043b\u043e\u0445\u043e\u043c <b>license id<\/b> (<b>wingctl.py<\/b>), \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0431\u0440\u044f\u043a\u0443 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/bf4\/80b\/ccf\/bf480bccf5c84ed4ade694958c24f0bb.png\" \/><\/div>\n<p>  \u0412 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u043c <b>Wing IDE<\/b> \u0437\u0430\u0439\u0434\u0435\u043c \u0432 \u043c\u0435\u043d\u044e <b>Help -&gt; Enter License&#8230;<\/b>, \u0438 \u0432\u0432\u0435\u0434\u0435\u043c \u043a\u043b\u044e\u0447\u0438\u043a \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c (\u043f\u043e\u043c\u043d\u0438\u0442\u0435?: <b>20<\/b> \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043f\u0440\u0438 \u0442\u043e\u043c, \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 <b>[&#8216;T&#8217;, &#8216;N&#8217;, &#8216;E&#8217;, &#8216;C&#8217;, &#8216;1&#8217;, &#8216;3&#8217;, &#8216;6&#8217;]<\/b>):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/b04\/f6f\/e38\/b04f6fe38550468db48d2a1cb33eee24.png\" \/><\/div>\n<p>  \u0416\u043c\u0435\u043c <b>Continue<\/b> \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u043d\u0430 <s>\u0431\u0430\u0431\u043a\u0438<\/s> \u0431\u0440\u044f\u043a\u0443. \u041f\u0435\u0440\u0432\u0430\u044f \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f: <b>abstract.ValidateAndNormalizeLicenseID(id)<\/b>. \u0417\u0430\u0439\u0434\u0435\u043c \u0432 \u043d\u0435\u0435 \u043f\u043e <b>F7<\/b>. \u0422\u0430\u043c \u0435\u0449\u0435 \u043e\u0434\u043d\u0430: <b>__ValidateAndNormalize(id)<\/b>. \u0417\u0430\u0439\u0434\u0435\u043c \u0438 \u0432 \u043d\u0435\u0435.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c:  <\/p>\n<pre><code class=\"python\">for c in code:         if c in ('-', ' ', '\\t'):             pass         elif c not in textutils.BASE30:             code2 += c             badchars.add(c)         else:             code2 += c <\/code><\/pre>\n<p>  \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043e\u0442 \u043d\u0430\u0441 \u0442\u0440\u0435\u0431\u0443\u044e\u0442, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u044b <b>License ID<\/b> \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u043b\u0438 \u043d\u0430\u0431\u043e\u0440\u0443 <b>textutils.BASE30<\/b>:  <\/p>\n<pre><code class=\"python\">BASE30 = '123456789ABCDEFGHJKLMNPQRTVWXY' <\/code><\/pre>\n<p>  \u0412\u0440\u043e\u0434\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 <b>__ValidateAndNormalize(id)<\/b> \u043d\u0435\u0442. \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0441\u043d\u043e\u0432\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043c\u044b \u0443\u0436\u0435 \u043f\u0440\u043e\u0448\u043b\u0438:  <\/p>\n<pre><code class=\"python\">if len(id2) &gt; 0 and id2[0] not in kLicenseUseCodes:         errs.append(_('Invalid first character: Should be one of %s') % str(kLicenseUseCodes)) <\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b:  <\/p>\n<pre><code class=\"python\">if len(id2) &gt; 1 and id2[1] != kLicenseProdCode: <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"python\">kLicenseProdCodes = {config.kProd101: '1',  config.kProdPersonal: 'L',  config.kProdProfessional: 'N',  config.kProdEnterprise: 'E'} kLicenseProdCode = kLicenseProdCodes[config.kProductCode] <\/code><\/pre>\n<p>  \u0422.\u043a. \u0443 \u043d\u0430\u0441 <b>Professional<\/b> \u0432\u0435\u0440\u0441\u0438\u044f, \u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c <b>N<\/b> \u2014 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c, \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f. <b>abstract.ValidateAndNormalizeLicenseID(id)<\/b> \u043f\u0440\u043e\u0448\u0435\u043b\u0441\u044f \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a. \u041f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e. \u0423\u043f\u0441:  <\/p>\n<pre><code class=\"python\">if len(errs) == 0 and id[0] == 'T':         errs.append(_('You cannot enter a trial license id here')) <\/code><\/pre>\n<p>  \u0424\u0438\u043a\u0441\u0438\u043c (\u044f \u0432\u044b\u0431\u0440\u0430\u043b <b>E<\/b>), \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c. \u041f\u0440\u043e\u0431\u0435\u0436\u0430\u0432\u0448\u0438\u0441\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u043d\u0438\u0436\u0435 \u043f\u043e \u043a\u043e\u0434\u0443, \u043d\u0438\u0447\u0435\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c \u044f \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043c\u0435\u043b\u043e \u043e\u0442\u043f\u0443\u0441\u0442\u0438\u043b \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0434\u0430\u043b\u0435\u0435 \u043f\u043e <b>F5<\/b>. \u041d\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/80b\/18a\/c8b\/80b18ac8bf6e4624bdee30433cb13f9c.png\" \/><\/div>\n<p>  \u0412\u0432\u043e\u0434\u0438\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 (\u043e\u043f\u044f\u0442\u044c <b>20<\/b> \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u0434 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0441 <b>AXX<\/b>), \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0435\u0433\u043e \u0432 \u0444\u0430\u0439\u043b\u0430\u0445, \u0441\u0442\u0430\u0432\u0438\u043c \u0431\u0440\u044f\u043a\u0443:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/9c8\/2ce\/c3b\/9c82cec3b3184bd5b56320c4414cc576.png\" \/><\/div>\n<p>  \u041f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438: <b>abstract.ValidateAndNormalizeActivation(act)<\/b>. \u0412 \u043d\u0435\u0439 \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c <b>BASE30<\/b>. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0444\u0438\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0443\u0436\u0435 \u043f\u0440\u043e\u0448\u043b\u0438:  <\/p>\n<pre><code class=\"python\">if id2[:3] != kActivationPrefix:         errs.append(_(&quot;Invalid prefix:  Should be '%s'&quot;) % kActivationPrefix) <\/code><\/pre>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e:  <\/p>\n<pre><code class=\"python\">err, info = self.fLicMgr._ValidateLicenseDict(lic2, None) if err == abstract.kLicenseOK: <\/code><\/pre>\n<p>  \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 <b>self.fLicMgr._ValidateLicenseDict<\/b>. \u0422\u0443\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0445\u044d\u0448 \u043e\u0442 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438:  <\/p>\n<pre><code class=\"python\">lichash = CreateActivationRequest(lic) act30 = lic['activation'] if lichash[2] not in 'X34':         hasher = sha.new()         hasher.update(lichash)         hasher.update(lic['license'])         digest = hasher.hexdigest().upper()         lichash = lichash[:3] + textutils.SHAToBase30(digest)         errs, lichash = ValidateAndNormalizeRequest(lichash) <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <b>lichash<\/b> \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u0435\u0435 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 <b>request code<\/b>, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0432 \u043e\u043a\u043e\u0448\u043a\u0435 \u0432\u0432\u043e\u0434\u0430 \u043a\u043e\u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438, \u0445\u043e\u0442\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440 \u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u041b\u0430\u0434\u043d\u043e, \u0431\u0443\u0434\u0435\u043c \u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0438\u043c\u0435\u044e\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438, \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0449\u0438\u0435 \u043d\u0430 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044e (\u0447\u0442\u043e, \u043a\u0441\u0442\u0430\u0442\u0438, \u0434\u0430\u043b\u0435\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0441\u044f!).<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0438\u0437 \u043a\u043e\u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043e\u0442\u0440\u0435\u0437\u0430\u044e\u0442 \u0442\u0440\u0438 \u043f\u0435\u0440\u0432\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0443\u0431\u0438\u0440\u0430\u044e\u0442 \u0434\u0435\u0444\u0438\u0441\u044b, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u044e\u0442 \u0432 <b>BASE16<\/b>, \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043d\u0443\u043b\u044f\u043c\u0438, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e:  <\/p>\n<pre><code class=\"python\">act = act30.replace('-', '')[3:] hexact = textutils.BaseConvert(act, textutils.BASE30, textutils.BASE16)     while len(hexact) &lt; 20:         hexact = '0' + hexact <\/code><\/pre>\n<p>  \u0418 \u0432\u043e\u0442 \u043e\u043d\u043e, \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435:  <\/p>\n<pre><code class=\"python\">valid = control.validate(lichash, lic['os'], lic['version'][:lic['version'].find('.')], hexact) <\/code><\/pre>\n<p>  \u041a\u0430\u043a\u043e\u0439-\u0442\u043e <b>control<\/b> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <b>validate<\/b>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0435\u043c\u0443 <b>lichash<\/b> (<b>request code<\/b>), \u0438\u043c\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447, \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438. \u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 <b>control<\/b> \u2014 \u044d\u0442\u043e <b>pyd<\/b>-\u0444\u0430\u0439\u043b (\u0432 \u0447\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0438\u043c\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 <b>watch<\/b>, \u0438 \u0433\u043b\u044f\u043d\u0443\u0432 \u043f\u043e\u043b\u0435 <b>__file__<\/b>), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0435 <b>DLL<\/b> \u0441 \u043e\u0434\u043d\u043e\u0439 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 (\u043d\u0435 <b>validate<\/b>), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0430\u0435\u0442 \u041f\u0438\u0442\u043e\u043d\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c. \u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0435\u0435 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 <b>Hex Rays<\/b>\u2026<\/p>\n<h4><b>\u042d\u0442\u0430\u043f \u043f\u044f\u0442\u044c: \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 Python<\/b><\/h4>\n<p>  \u0417\u0430\u0442\u0430\u0449\u0438\u043c \u0432 <b>IDA Pro<\/b> \u043d\u0430\u0448 <b><i>control<\/i><\/b> (<b>ctlutil.pyd<\/b>) \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <b>initctlutil<\/b>:  <\/p>\n<pre><code class=\"cpp\">int initctlutil() {   return Py_InitModule4(aCtlutil, &off_10003094, 0, 0, 1013); } <\/code><\/pre>\n<p>  <b>off_10003094<\/b> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0438\u043c\u0435\u043d\u0430 \u0438 \u0430\u0434\u0440\u0435\u0441 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0412\u043e\u0442 \u0438 \u043d\u0430\u0448 <b>validate<\/b>:  <\/p>\n<pre><code class=\"cpp\">.data:100030A4                 dd offset aValidate     ; &quot;validate&quot; .data:100030A8                 dd offset sub_10001410 <\/code><\/pre>\n<p>  \u0418\u0437 \u0432\u0441\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <b>sub_10001410<\/b> \u0441\u0430\u043c\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e\u0442:  <\/p>\n<pre><code class=\"cpp\">if ( sub_10001020(v6, &v9) || strcmp(&v9, v7) ) {   result = PyInt_FromLong(0); } <\/code><\/pre>\n<p>  \u0417\u0430\u0439\u0434\u0435\u043c \u0438 \u0432 <b>sub_10001020<\/b> \u0442\u043e\u0436\u0435. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435 \u043d\u0430 \u0433\u043b\u0430\u0437 \u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c, \u0430 \u043f\u043e\u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u0438 \u043e\u0431\u043e\u0437\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442. \u0422\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c. \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a <b>IDA Pro<\/b>:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/f03\/a07\/5d7\/f03a075d7bbf4bfeb873e3227cb1b757.png\" \/><\/div>\n<p>  \u0414\u0443\u043c\u0430\u044e, \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438\u0437 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430: \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u0430\u0448 <b>pyd<\/b>-\u0444\u0430\u0439\u043b.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u0432\u0438\u043c \u0431\u0440\u044f\u043a \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e <b>sub_10001020<\/b>, \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043c \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0432\u043e\u0442 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 convert_reqest_key<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">int __usercall convert_reqest_key@&lt;eax&gt;(char *version@&lt;eax&gt;, const char *platform@&lt;ecx&gt;, const char *activation_key, char *out_key) {   unsigned int len_1; \/\/ edi@1   const char *platform_; \/\/ esi@1   char *version_; \/\/ ebx@1   int ver_; \/\/ eax@2   signed int mul1; \/\/ ecx@3   signed int mul2; \/\/ esi@3   signed int mul3; \/\/ ebp@3   bool v11; \/\/ zf@15   const char *act_key_ptr; \/\/ eax@31   char v13; \/\/ dl@32   const char *act_key_ptr_1; \/\/ eax@35   unsigned int len_2; \/\/ ecx@35   char v16; \/\/ dl@36   const char *act_key_ptr_2; \/\/ eax@39   unsigned int len_3; \/\/ ecx@39   char v19; \/\/ dl@40   int P3_; \/\/ ebx@42   const char *act_key_ptr_3; \/\/ eax@45   unsigned int len_4; \/\/ ecx@45   char v23; \/\/ dl@46   unsigned int P4; \/\/ ebp@47   signed int mul4; \/\/ [sp+10h] [bp-18h]@0   unsigned int P3; \/\/ [sp+14h] [bp-14h]@1   unsigned int P2; \/\/ [sp+18h] [bp-10h]@1   unsigned int P1; \/\/ [sp+1Ch] [bp-Ch]@1    len_1 = 0;   platform_ = platform;   version_ = version;   P1 = 0;   P2 = 0;   P3 = 0;   if ( !strcmp(platform, aWindows) )   {     ver_ = (unsigned __int8)*version_;     if ( *version_ == '2' )     {       mul1 = 142;       mul2 = 43;       mul3 = 201;       mul4 = 38;       goto LABEL_31;     }     if ( (_BYTE)ver_ == '3' )     {       mul1 = 23;       mul2 = 163;       mul3 = 2;       mul4 = 115;       goto LABEL_31;     }     if ( (_BYTE)ver_ == '4' )     {       mul1 = 17;       mul2 = 87;       mul3 = 120;       mul4 = 34;       goto LABEL_31;     }   }   else if ( !strcmp(platform_, aMacosx) )   {     ver_ = (unsigned __int8)*version_;     if ( *version_ == '2' )     {       mul1 = 41;       mul2 = 207;       mul3 = 104;       mul4 = 77;       goto LABEL_31;     }     if ( (_BYTE)ver_ == '3' )     {       mul1 = 128;       mul2 = 178;       mul3 = 104;       mul4 = 95;       goto LABEL_31;     }     if ( (_BYTE)ver_ == '4' )     {       mul1 = 67;       mul2 = 167;       mul3 = 74;       mul4 = 13;       goto LABEL_31;     }   }   else   {     v11 = strcmp(platform_, aLinux) == 0;     LOBYTE(ver_) = *version_;     if ( v11 )     {       if ( (_BYTE)ver_ == '2' )       {         mul1 = 48;         mul2 = 104;         mul3 = 234;         mul4 = 247;         goto LABEL_31;       }       if ( (_BYTE)ver_ == '3' )       {         mul2 = 52;         mul1 = 254;         mul3 = 98;         mul4 = 235;         goto LABEL_31;       }       if ( (_BYTE)ver_ == '4' )       {         mul1 = 207;         mul2 = 45;         mul3 = 198;         mul4 = 189;         goto LABEL_31;       }     }     else     {       if ( (_BYTE)ver_ == '2' )       {         mul1 = 123;         mul2 = 202;         mul3 = 97;         mul4 = 211;         goto LABEL_31;       }       if ( (_BYTE)ver_ == '3' )       {         mul1 = 127;         mul2 = 45;         mul3 = 209;         mul4 = 198;         goto LABEL_31;       }       if ( (_BYTE)ver_ == '4' )       {         mul2 = 4;         mul1 = 240;         mul3 = 47;         mul4 = 98;         goto LABEL_31;       }     }   }   if ( (_BYTE)ver_ == '5' )   {     mul1 = 7;     mul2 = 123;     mul3 = 23;     mul4 = 87;   }   else   {     mul1 = 0;     mul2 = 0;     mul3 = 0;   } LABEL_31:   act_key_ptr = activation_key;   do     v13 = *act_key_ptr++;   while ( v13 );   if ( act_key_ptr != activation_key + 1 )   {     do       P1 = (P1 * mul1 + activation_key[len_1++]) & 0xFFFFF;     while ( len_1 &lt; strlen(activation_key) );   }   act_key_ptr_1 = activation_key;   len_2 = 0;   do     v16 = *act_key_ptr_1++;   while ( v16 );   if ( act_key_ptr_1 != activation_key + 1 )   {     do       P2 = (P2 * mul2 + activation_key[len_2++]) & 0xFFFFF;     while ( len_2 &lt; strlen(activation_key) );   }   act_key_ptr_2 = activation_key;   len_3 = 0;   do     v19 = *act_key_ptr_2++;   while ( v19 );   if ( act_key_ptr_2 != activation_key + 1 )   {     P3_ = 0;     do       P3_ = (P3_ * mul3 + activation_key[len_3++]) & 0xFFFFF;     while ( len_3 &lt; strlen(activation_key) );     P3 = P3_;   }   act_key_ptr_3 = activation_key;   len_4 = 0;   do     v23 = *act_key_ptr_3++;   while ( v23 );   P4 = 0;   if ( act_key_ptr_3 != activation_key + 1 )   {     do       P4 = (P4 * mul4 + activation_key[len_4++]) & 0xFFFFF;     while ( len_4 &lt; strlen(activation_key) );   }   sprintf(out_key, a_5x_5x_5x_5x, P1, P2, P3, P4);   return 0; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0410 \u043c\u0435\u0441\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:  <\/p>\n<pre><code class=\"cpp\">if ( convert_reqest_key(version, platform, request_key, out_key) || strcmp(out_key, act_key_hash) ) {   result = PyInt_FromLong(0); } <\/code><\/pre>\n<p>  \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434, \u0447\u0442\u043e <b>request code<\/b> \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <b>convert_reqest_key<\/b> \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0442\u0435\u043c \u0441 \u0442\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438. \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435?  <\/p>\n<blockquote><p>\u0414\u0430\u043b\u0435\u0435 \u0438\u0437 \u043a\u043e\u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043e\u0442\u0440\u0435\u0437\u0430\u044e\u0442 \u0442\u0440\u0438 \u043f\u0435\u0440\u0432\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0443\u0431\u0438\u0440\u0430\u044e\u0442 \u0434\u0435\u0444\u0438\u0441\u044b, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u044e\u0442 \u0432 <b>BASE16<\/b>, \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043d\u0443\u043b\u044f\u043c\u0438, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e<\/p><\/blockquote>\n<p>  \u0417\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043d\u0430\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<ol>\n<li>\u0414\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f <b>convert_reqest_key<\/b>;<\/li>\n<li>\u041d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <b>strcmp<\/b> \u0432\u044b\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 <b>out_key<\/b>;<\/li>\n<li>\u0423\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u043d\u0443\u043b\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 <b>out_key<\/b>;<\/li>\n<li>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c <b>out_key<\/b> \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 <b>BASE30<\/b>;<\/li>\n<li>\u0414\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0442\u0440\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 (<b>AXX<\/b>);<\/li>\n<li>\u041f\u043e-\u0436\u0435\u043b\u0430\u043d\u0438\u044e \u043d\u0430\u0432\u0442\u044b\u043a\u0430\u0442\u044c \u0434\u0435\u0444\u0438\u0441\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u044b\u0435 \u043f\u044f\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/li>\n<\/ol>\n<p>  \u041d\u0435 \u0431\u0443\u0434\u0443 \u043c\u0443\u0434\u0440\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043b\u0443\u043a\u0430\u0432\u043e, \u0430 \u0432\u0442\u0438\u0441\u043d\u0443 <b>print<\/b> \u043f\u0440\u044f\u043c\u043e \u0432 <b>python<\/b>-\u043a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:  <\/p>\n<pre><code class=\"python\">print(&quot;AXX&quot; + textutils.BaseConvert(&quot;FCBCFEFD2FF684FA6A4F&quot;, textutils.BASE16, textutils.BASE30)) <\/code><\/pre>\n<p>  \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043a\u043b\u044e\u0447\u0438\u043a:  <\/p>\n<blockquote><p>wingide \u2014 2015\/05\/24 04:03:47 \u2014 <b>AXX3Q6BQHKQ773D24P58<\/b><\/p><\/blockquote>\n<p>  \u0412\u0432\u0435\u0434\u044f \u0435\u0433\u043e \u0432 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043a\u043b\u044e\u0447\u0430 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438, \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0437\u0430\u0432\u0435\u0442\u043d\u043e\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/c9e\/a43\/d14\/c9ea43d143a64214bff817049c29a6aa.png\" \/><\/div>\n<h4>\u0418\u0422\u041e\u0413\u0418<\/h4>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0437\u043b\u043e\u043c\u0430 \u043d\u0435 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0439, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f! \u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0436\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0432 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435\u2026 \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0437\u0430\u0431\u0430\u0432\u043d\u043e.<\/p>\n<p>  \u041d\u0435 \u0437\u043d\u0430\u044e, \u0437\u0430\u0447\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u043b\u0438 \u043a \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0435\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 (\u0445\u043e\u0442\u044c \u0438 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u0432\u043e\u0435\u043c, \u0432 \u0432\u0438\u0434\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430). \u041d\u043e, \u0434\u0443\u043c\u0430\u044e, \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u043e\u0438\u0442!<\/p>\n<p>  \u0412\u0441\u0435\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e.     \t<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/258613\/\"> http:\/\/habrahabr.ru\/post\/258613\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/619\/553\/135\/6195531358aa46a7b1caeebfb96de3af.png\" \/><\/div>\n<p>  \u0414\u043e\u0431\u0440\u043e\u0433\u043e \u0437\u0434\u0440\u0430\u0432\u0438\u044f! \u041d\u0435 \u0443\u0434\u0438\u0432\u043b\u044e\u0441\u044c, \u0447\u0442\u043e \u0412\u044b \u0440\u0430\u043d\u044c\u0448\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0441\u043b\u044b\u0448\u0430\u043b\u0438 \u043e\u0431 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041a\u0430\u043a \u0438 \u044f, \u0434\u043e \u0442\u043e\u0433\u043e \u0434\u043d\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f <b>Python Debugger<\/b>. \u0414\u0430, \u0437\u043d\u0430\u044e, \u0435\u0441\u0442\u044c <b>pdb<\/b>, \u043d\u043e \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438 \u0442\u043e, \u043a\u0430\u043a \u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d, \u043c\u043d\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u0440\u0438\u0433\u043b\u044f\u043d\u0443\u043b\u043e\u0441\u044c. \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u0442 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442. \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 \u0432\u0430\u0448\u0438\u0445 <b>Python<\/b> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 (\u0441\u043a\u0430\u0436\u0443 \u0441\u0440\u0430\u0437\u0443: \u0434\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u044f \u043d\u0435 \u0438\u0437\u0443\u0447\u0430\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043d\u0435\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0443\u0442, \u043f\u0440\u043e\u0441\u044c\u0431\u0430 \u043d\u0435 \u0440\u0443\u0433\u0430\u0442\u044c\u0441\u044f).  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-257815","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/257815","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=257815"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/257815\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=257815"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=257815"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=257815"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}