{"id":286234,"date":"2017-05-12T14:50:03","date_gmt":"2017-05-12T10:50:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=286234"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=286234","title":{"rendered":"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Spring Groovy-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e, \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e UI"},"content":{"rendered":"<p>\u0412 \u043a\u043e\u043d\u0446\u0435 90-\u0445 \u0433\u043e\u0434\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u043e\u0434\u043d\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0435\u0439 \u043f\u0438\u0442\u0430\u044e\u0449\u0438\u0445 \u044d\u043d\u0435\u0440\u0433\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a (\u0442\u044f\u0433\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u0446\u0438\u0439), \u043f\u043b\u044e\u0441 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u043b\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e-\u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u0430 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0441\u043a\u0438\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432. \u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0410\u0421\u0423 \u0422\u041f \u043d\u0430 \u0434\u0440\u0435\u0432\u043d\u0435\u043c \u0441\u043e\u0432\u0435\u0442\u0441\u043a\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435. \u0422\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u044f\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u043f\u043e\u0434 windows, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u0440\u0442\u044b \u0432\u0441\u044e \u0441\u0435\u0442\u044c \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043d\u0430 \u043d\u0435\u0439 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u0446\u0438\u044f\u0445. \u041d\u0443 \u0438 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0431\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438.<a name=\"habracut\"><\/a><\/p>\n<h3><b>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/b><\/h3>\n<p>  \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u0441\u0435\u0442\u0438 (IP) \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u0430\u043a\u0435\u0442-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435), \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0435\u0433\u043e (\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u043d\u0430 \u043d\u0435\u0439) \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c UI \u043a\u043b\u0438\u0435\u043d\u0442\u0435 (\u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u0440\u0442\u0435\/\u0441\u0445\u0435\u043c\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0446\u0432\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043c\u0438\u0433\u0430\u0442\u044c). \u041a\u0430\u0436\u0434\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u043e\u0431\u043b\u0430\u0434\u0430\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432, \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c \u0432 \u043f\u0430\u043a\u0435\u0442\u0430\u0445-\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0442. \u0436. \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0435 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0435\u0435 \u0432 \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0441 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0433 \u0431\u044b \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<h3><b>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f.<\/b><\/h3>\n<p>  \u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u044b\u043b\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e. \u0418 \u0442\u043e\u0433\u0434\u0430 \u0431\u044b\u043b\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c double buffering, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 \u043f\u0440\u043e\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u043b\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u0430\u0434\u0440 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u0430 \u0438\u0445 \u0441\u043c\u0435\u043d\u0430 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439. \u041f\u0435\u0440\u0432\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043d\u0430 Delphi. \u041d\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0435\u0442\u0438. \u0427\u0442\u043e \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0432\u043c\u0435\u0448\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 (\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0439 \u043b\u0438\u0431\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0442\u043e\u0440 \u043d\u0430 Delphi \u0431\u044b\u043b\u043e \u043b\u0435\u043d\u0438\u0432\u043e) \u0434\u0430 \u0438 \u043a\u0430\u043a \u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u043e). \u0418 \u0432 1999 \u0433\u043e\u0434\u0443 \u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0441\u044f \u0441 Java. \u041c\u0435\u043d\u044f \u0437\u0430\u0446\u0435\u043f\u0438\u043b\u0430 \u0442\u043e\u0433\u0434\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f reflection \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u044b\u0439 \u044f\u0437\u044b\u043a (\u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 Groovy, \u044f \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e \u043d\u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0434\u0430 \u0438 \u043d\u0435 \u0441\u043b\u044b\u0448\u0430\u043b, \u0434\u0430 \u0438 \u043d\u0435 \u043c\u043e\u0433, \u0442.\u043a. Groovy \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 2003)) \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b. \u041e\u043d \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 Groovy \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u044b Java.<br \/>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0433\u0434\u0435 Tp, Bus, Lab, Led, Box \u043d\u0435 \u0447\u0442\u043e \u0438\u043d\u043e\u0435 \u043a\u0430\u043a Java-\u043a\u043b\u0430\u0441\u0441\u044b \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0430\u043c\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b.<br \/>  Root.txt  <\/p>\n<pre><code class=\"java\">setFormFactor:4 4 setResolution:700 800 setScale:0.45 setScaleStep:0.1  define:&quot;\u0422\u0423&quot; &quot;contr.txt&quot; define:&quot;\u0412\u0432\u043e\u04341&quot; &quot;src\/1.txt&quot; define:&quot;\u0412\u0432\u043e\u04342&quot; &quot;src\/2.txt&quot; define:&quot;\u0412\u0432\u043e\u04343&quot; &quot;src\/3.txt&quot; define:&quot;\u0410\u0413\u04201&quot; &quot;dev\/1.txt&quot; define:&quot;\u0410\u0413\u04202&quot; &quot;dev\/2.txt&quot; define:&quot;\u0410\u0413\u04203&quot; &quot;dev\/3.txt&quot; define:&quot;\u0410\u0413\u04204&quot; &quot;dev\/4.txt&quot; define:&quot;\u0417\u0412&quot; &quot;sw\/0.txt&quot; define:&quot;\u041b\u04121&quot; &quot;sw\/1.txt&quot; define:&quot;\u041b\u04122&quot; &quot;sw\/2.txt&quot; define:&quot;\u041b\u04123&quot; &quot;sw\/3.txt&quot; define:&quot;\u041b\u04124&quot; &quot;sw\/4.txt&quot; define:&quot;\u041b\u04125&quot; &quot;sw\/5.txt&quot; define:&quot;\u041b\u04126&quot; &quot;sw\/6.txt&quot;  add:new Tp 31 {   busWidth:7   setColor:col.red col.green   add:new Bus 4 0 0 2 523 106 627 160   add:new Bus 5 0 0 2 636 164 683 190   add:new Bus 6 0 0 2 689 195 741 243   add:new Bus 29 0 0 2 730 268 650 268   setColor:col.black col   add:new Led &quot;&quot; 627 157 8   add:new Led &quot;&quot; 682 187 8   add:new Led &quot;&quot; 739 239 8   add:new Led &quot;&quot; 734 268 8   setFontSize:21   add:new Lab &quot;5311&quot; 590 113   add:new Lab &quot;5312&quot; 670 159   add:new Lab &quot;5313&quot; 714 187   add:new Lab &quot;5314&quot; 660 280   ico:655 123   box {     setFontSize:24           add:new Lab &quot;(1802)&quot; 70 5                 recall:&quot;\u0422\u0423&quot;     setFontSize:17     setColor:col.red col.black     add:new Lab 18 400 200     recall:&quot;\u0412\u0432\u043e\u04341&quot;     setColor:col.white col     add:new Box &quot;&quot; 10 50 10 10 {       setColor:col.black col       setFontSize:12       ins:new Lab &quot;\u044f\u0447.5 \u041f\u041f-1808 116&quot; 5 0     }     recall:&quot;\u0412\u0432\u043e\u04342&quot;     setColor:col.white col     add:new Box &quot;&quot; 130 50 10 10 {       setColor:col.black col       ins:new Lab &quot;\u044f\u0447.6 \u041f\u041f-1808 206&quot; 5 0     }     busWidth:10     setColor:col.blue col     add:new Bus &quot;&quot; 0 0 2 30 180 270 180     recall:&quot;\u0410\u0413\u04201&quot;     recall:&quot;\u0410\u0413\u04202&quot;     recall:&quot;\u0417\u0412&quot;     recall:&quot;\u041b\u04121&quot;     recall:&quot;\u041b\u04122&quot;     recall:&quot;\u041b\u04123&quot;     recall:&quot;\u041b\u04124&quot;     moveX:74     busWidth:10     setColor:col.blue col     add:new Bus &quot;&quot; 0 0 2 40 300 PX 300   } } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0435\u0442\u043e\u0434 <b>recall<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <b>define<\/b> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433 <b>evaluate<\/b> \u0432 Groovy). \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442:<br \/>  src\/1.txt  <\/p>\n<pre><code class=\"java\">setColor:col.blue col busWidth:5 add:new Bus &quot;&quot; 65 60 2 0 0 0 120 { \tsetColor:col.pink col \tadd:new Box 88 -45 40 95 40 { \t\tsetColor:col.red col.green \t\tadd:new Led 90 5 5 19 \t\tadd:new Led 87 33 5 19 \t\tadd:new Box 86 66 8 23 23 { \t\t\tadd:new Popup { \t\t\t\tsetFontSize:17\t\t\t\t \t\t\t\tadd:new Btn 86 23 0 { \t\t\t\t\tadd:new Act ON 131  \t\t\t\t\tsetColor:col.black col  \t\t\t\t\tins:new Lab &quot;\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c&quot; 5 5 \t\t\t\t} \t\t\t\tadd:new Btn 86 23 34 { \t\t\t\t\tadd:new Act OFF 131  \t\t\t\t\tsetColor:col col.red \t\t\t\t\tadd:new Box 131 8 8 15 15 { add:new Act TOG &quot;&quot; } \t\t\t\t\tsetColor:col.black col \t\t\t\t\tins:new Lab &quot;\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c&quot; 25 5 \t\t\t\t} \t\t\t} \t\t} \t\tsetFontSize:12 \t\tadd:new Lab &quot;\u041c\u0422\u0417&quot; 5 24 \t\tadd:new Lab &quot;\u0410\u0412\u0420&quot; 30 24 \t} }<\/code><\/pre>\n<p>  src\/2.txt<\/p>\n<pre><code class=\"java\">setColor:col.blue col busWidth:5 add:new Bus &quot;&quot; 180 60 2 0 0 0 120 { \tsetColor:col.pink col \tadd:new Box 94 -45 40 95 40 { \t\tsetColor:col.red col.green \t\tadd:new Led 96 5 5 19 \t\tadd:new Box 92 66 8 23 23 { \t\t\tadd:new Popup { \t\t\t\tsetFontSize:17\t\t\t\t \t\t\t\tadd:new Btn 92 23 0 { \t\t\t\t\tadd:new Act ON 132\t\t\t\t\t \t\t\t\t\tsetColor:col.black col  \t\t\t\t\tins:new Lab &quot;\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c&quot; 5 5 \t\t\t\t} \t\t\t\tadd:new Btn 92 23 34 { \t\t\t\t\tadd:new Act OFF 132 \t\t\t\t\tsetColor:col col.red \t\t\t\t\tadd:new Box 132 8 8 15 15 { add:new Act TOG &quot;&quot; } \t\t\t\t\tsetColor:col.black col\t\t\t\t\t  \t\t\t\t\tins:new Lab &quot;\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c&quot; 25 5 \t\t\t\t} \t\t\t} \t\t} \t\tsetFontSize:12 \t\tadd:new Lab &quot;\u041c\u0422\u0417&quot; 5 24 \t} } <\/code><\/pre>\n<p>  \u0412 \u044d\u0442\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0434\u0432\u0430 \u0441\u0430\u043c\u044b\u0445 \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (\u0420\u0438\u0441.1) \u0438 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u043a\u0430\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432\/\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435-\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/f87\/28d\/a7f\/f8728da7f58e4bafbe518ed20931ebb3.jpg\" alt=\"image\"\/><br \/>  \u0420\u0438\u0441. 1. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/web\/b13\/982\/c0e\/b13982c0e941437b81983ab1f5e1b418.jpg\" alt=\"image\"\/><br \/>  \u0420\u0438\u0441. 2. \u041f\u043e\u043b\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u0446\u0438\u0439.<\/p>\n<p>  \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 (\u0445\u043e\u0442\u044f \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 \u0431\u044d\u043a\u0435\u043d\u0434\u0430!) \u0438 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442, \u043d\u043e \u043c\u0435\u043d\u044f \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u043e\u043a\u0438\u0434\u0430\u043b\u0430 \u043c\u044b\u0441\u043b\u044c \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u201c\u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u0430\u201d, \u0445\u043e\u0442\u044f \u0445\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e \u0432 99-\u043c \u0433\u043e\u0434\u0443 \u043e\u043d \u0442\u0430\u043a\u043e\u0432\u044b\u043c \u0435\u0449\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u043b\u0441\u044f. \u0418 \u0432\u043e\u0442, \u0441 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c Spring 4 \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 Groovy, \u043f\u043e\u043a\u0443\u0440\u0438\u0432 \u043c\u0430\u043d\u0443\u0430\u043b \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u044f \u0433\u0434\u0435-\u0442\u043e \u0443\u0436\u0435 \u044d\u0442\u043e \u0432\u0438\u0434\u0435\u043b)) (\u0441\u043c. \u0432\u044b\u0448\u0435). \u0411\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e, Spring Boot, Groovy-\u043a\u043e\u043d\u0444\u0438\u0433 \u0438 JavaFx \u2014 \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e GUI \u2014 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u2026<br \/>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u0418 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0443\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 javafx \u0438 \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044f\u0434\u0440\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0440\u044f\u0434 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432. \u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 Unit \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u0440\u0442\u0430 \u0438 \u0441\u0445\u0435\u043c\u044b.<\/p>\n<pre><code class=\"java\">public abstract class Unit&lt;T&gt; implements Render {    private static Logger log = LoggerFactory.getLogger(Unit.class);    private Integer code;    private State&lt;T&gt; state;    Node node;    private List&lt;Unit&gt; lays = new LinkedList&lt;&gt;();     public void init(Map&lt;Integer, State&gt; states) {        lays.forEach(e -&gt; e.init(states));        initState(states);    }     private void initState(Map&lt;Integer, State&gt; states) {        if (code != null) {            State&lt;T&gt; state = states.get(code);            if (state == null) {                state = new State&lt;&gt;(code);                states.put(code, state);            }            state.addSlave(this);            this.state = state;        }    }     public void setCode(Integer code) {        this.code = code;    }     public Integer getCode() {        return code;    }     public State&lt;T&gt; getState() {        return state;    }     public void setGeom(double[] geom) {        node = createShape(geom);        initNodeEvents();    }     private void initNodeEvents() {        if (node != null) {            node.setOnMousePressed(this::mousePressed);            node.setOnMouseReleased(this::mouseReleased);        }    }     public void setLays(List&lt;Unit&gt; lays) {        this.lays = lays;    }     public void render(Group group) {        if (node != null) {            group.getChildren().add(node);        }        render();        lays.forEach(e -&gt; e.render(group));    }     protected void mousePressed(MouseEvent e) {        log.debug(e.toString());    }     protected void mouseReleased(MouseEvent e) {        log.debug(e.toString());    }     protected abstract Node createShape(double[] geom); } <\/code><\/pre>\n<p>  \u041e\u043d \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <b>Render<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f  <\/p>\n<pre><code class=\"java\">public interface Render {    void render();     void next(); } <\/code><\/pre>\n<p>  , \u0433\u0434\u0435 render() \u2014 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f;<br \/>  next() \u2014 \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u0430\u0434\u0440.<br \/>  \u041a\u0430\u0436\u0434\u044b\u0439 <b>Unit<\/b> \u0438\u043c\u0435\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a <code><\/p>\n<pre><code class=\"java\">List lays \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 <b>Unit<\/b>, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0446\u0435\u043d\u043e\u0439 \u043f\u043e \u0441\u043b\u043e\u044f\u043c. \u041e\u043d \u0442\u0430\u043a \u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043c\u044b\u0448\u0438.<br\/>  \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <b>Unit<\/b> \u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 <b>FlashingUnit<\/b>:<br\/>  public abstract class FlashingUnit&lt;T&gt; extends Unit&lt;T&gt; {    private static Logger log = LoggerFactory.getLogger(FlashingUnit.class);     @Override    public void next() {        log.debug(&quot;{} next()&quot;, this);        if (getState() != null && node != null) {            node.setVisible(!getState().isChanged() || !node.isVisible());        }    } } <\/code><\/pre>\n<p>  \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u043a \u0440\u0430\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043c\u0435\u043d\u0443 \u043a\u0430\u0434\u0440\u043e\u0432 (\u043c\u0438\u0433\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432) \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043d\u0430\u0448\u0438\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c.<br \/>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430:  <\/p>\n<pre><code class=\"java\">public class Lab extends FlashingUnit&lt;Integer&gt; {    private Color[] color;    private String text;    private Double size;    private Text shape;     @Override    protected Node createShape(double[] geom) {        \/\/Can't set text without graphic context        shape = new Text(geom[0], geom[1], &quot;&quot;);        if (size != null) {            shape.setFont(Font.font(size));        }        return shape;    }     public void setText(String text) {        this.text = text;    }     public void setSize(Double size) {        this.size = size;    }     public void setColor(Color[] color) {        this.color = color;    }     @Override    public void render(Group group) {        super.render(group);        shape.setText(text);    }     @Override    public void render() {        final Color[] c = new Color[]{color[0]};        if (getState() != null) {            getState().initValue(0);            c[0] = color[getState().getValue()];        }        shape.setFill(c[0]);    } } <\/code><\/pre>\n<p>  \u0417\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 State:  <\/p>\n<pre><code class=\"java\">public class State&lt;T&gt; implements Render {    private final int id;    private T value;    private boolean changed;    private List&lt;Render&gt; slaves = new LinkedList&lt;&gt;();     public synchronized void initValue(T value) {        if (this.value == null) {            this.value = value;        }    }     public State(int id) {        this.id = id;    }     public int getId() {        return id;    }     public synchronized T getValue() {        return value;    }     public synchronized void setValue(T value) { if (!value.equals(this.value)) {    this.value = value;    changed = true;    render(); }    }     public synchronized boolean isChanged() {        return changed;    }     public synchronized void setChanged(boolean changed) {        this.changed = changed;    }     public void addSlave(Render unit) {        slaves.add(unit);    }     @Override    public void render() {        Platform.runLater(() -&gt; slaves.forEach(Render::render));    }     @Override    public void next() {        Platform.runLater(() -&gt; slaves.forEach(Render::next));    } } <\/code><\/pre>\n<p>  , \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0438 \u0435\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043e\u0431\u0449\u0438\u043c <code>code <\/code>\u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u0432 <code><code>List slaves \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <b>Render<\/b>. <br \/>  \u041a\u043b\u0430\u0441\u0441 <b>Controller<\/b> \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 <b>Unit<\/b> \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u0446\u0438\u0438 \u0441 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c id<\/code>.  <\/p>\n<pre><code class=\"java\">public class Controller extends Unit {    private int id;    private final Root root;    private final Map&lt;Integer, State&gt; states = new HashMap&lt;&gt;();     private Unit scheme;     @Autowired    public Controller(Root root) {        this.root = root;    }     @PostConstruct    void init() {        super.init(states);        if (scheme != null) {            scheme.init(states);        }        root.addController(this);    }     public void setId(int id) {        this.id = id;    }     public State getState(int code) {        return states.get(code);    }     public int getId() {        return id;    }     public void setScheme(Unit scheme) {        this.scheme = scheme;    }     public Unit getScheme() {        return scheme;    }     @Override    protected Node createShape(double[] geom) {        return null;    }     @Override    public void render() {        states.values().forEach(Render::render);    }     @Override    public void next() {        states.values().forEach(Render::next);    } } <\/code><\/pre>\n<p>  \u041d\u0443 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043a\u043b\u0430\u0441\u0441 <b>Root<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 (\u043f\u043e\u0434\u0441\u0442\u0430\u043d\u0446\u0438\u0439):<\/p>\n<pre><code class=\"java\">public class Root implements Render {    private final Map&lt;Integer, Controller&gt; controllers = new HashMap&lt;&gt;();     void addController(Controller controller) {        if (controllers.containsKey(controller.getId())) {            throw new DuplicateKeyException(String.format(&quot;Controller id %d already exists&quot;,controller.getId()));        }        controllers.put(controller.getId(), controller);    }     public Controller getController(int id) {        return controllers.get(id);    }     public State getState(int controllerId, int code) {        Controller controller = controllers.get(controllerId);        if (controller != null) {            return controller.getState(code);        }        return null;    }     public void render(Group group) {        controllers.values().stream().map(Controller::getScheme)                .filter(Objects::nonNull).forEach(r -&gt; r.render(group));    }     \t@Override public void render() {    controllers.values().forEach(Render::render); }  @Override public void next() {    controllers.values().forEach(Render::next); } } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 @PostConctruct init() \u0438 DI \u0432 <b>Controller<\/b> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442 \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<br \/>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 Groovy - \u043a\u043e\u043d\u0444\u0438\u0433\u0435, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0432\u0441\u0435 \u044d\u0442\u043e \u043c\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438:<br \/>  <i>root.groovy<\/i>  <\/p>\n<pre><code class=\"java\">package scheme  import com.ldim.granit.ui.model.Controller import com.ldim.granit.ui.model.shape.Box import com.ldim.granit.ui.model.shape.Bus import com.ldim.granit.ui.model.shape.Lab import com.ldim.granit.ui.model.shape.Led import javafx.scene.paint.Color  suplyColor = [Color.GREEN, Color.RED] alarmColor = [Color.RED, Color.GREEN]  beans {     importBeans('classpath:\/scheme\/srcs.groovy')    importBeans('classpath:\/scheme\/devs.groovy')    importBeans('classpath:\/scheme\/sws.groovy')    importBeans('classpath:\/scheme\/tsns.groovy')    importBeans('classpath:\/scheme\/ctrls.groovy')     controller2(Controller) {        id = 2        lays = [dev1]    }     tp9scheme(Bus) {        code = 5        color = suplyColor        width = 6        geom = [653, 764, 698, 687, 701, 631]        lays = [new Bus(code: 29, color: suplyColor, width: 6, geom: [701, 631, 701, 602]),                new Bus(code: 6, color: suplyColor, width: 6, geom: [701, 602, 705, 560, 840, 591]),                new Led(geom:[4.5, 701, 631, 701, 602]),                new Lab(text: '5092', geom: [705, 684]), new Lab(text: '5094', geom: [715, 612]), new Lab(text: '5093', geom: [764, 544]),                new Lab(text: '19 \u043c\u0438\u043a\u0440\u043e\u0440\u0430\u0439\u043e\u043d', geom: [595, 630]),                new Box(code: 129, color: alarmColor, geom: [598, 593, 10, 10]),                new Box(code: 130, color: alarmColor, geom: [598, 603, 10, 10]),                new Box(color: [Color.GRAY], geom: [608, 593, 30, 20], lays: [new Lab(size: 11, text: '\u0422\u041f9', geom: [613, 607])])]    }     tp9(Controller) {        id = 3        lays = [src1, src2, src3,                new Bus (color: [Color.BLUE], width: 8, geom: [40, 176, 380, 176]),                dev1, dev2, dev3, dev4,                new Bus (color: [Color.BLUE], width: 8, geom: [40, 276, 585, 276]),                sw0, sw1, sw2, sw3, sw4, sw5, sw6,                new Bus (code: 12, color: suplyColor, width: 8, geom: [30, 350, 615, 350]),                lbl0, lbl1, lbl2, lbl3, lbl4,                tsn1, tsn2,                reqBtn, tstBtn, secBtn, okBtn]        scheme = tp9scheme    } } <\/code><\/pre>\n<p>  <i>srcs.groovy<\/i>  <\/p>\n<pre><code class=\"java\">package scheme  beanName = 'src1' offsetX = 0 reserved = true devCode = 1 swCode = 11 led1Code = 11 led2Code = 11  evaluate(new File(&quot;.\/src\/main\/resources\/scheme\/templates\/src.groovy&quot;))  beanName = 'src2' offsetX = 120 reserved = false devCode = 1 swCode = 11 led1Code = 11 led2Code = 11  evaluate(new File(&quot;.\/src\/main\/resources\/scheme\/templates\/src.groovy&quot;))  beanName = 'src3' offsetX = 240 reserved = false devCode = 1 swCode = 11 led1Code = 11 led2Code = 11  evaluate(new File(&quot;.\/src\/main\/resources\/scheme\/templates\/src.groovy&quot;)) <\/code><\/pre>\n<p>  <i>src.groovy<\/i>  <\/p>\n<pre><code class=\"java\">package scheme.templates  import com.ldim.granit.ui.model.shape.Box import com.ldim.granit.ui.model.shape.Bus import com.ldim.granit.ui.model.shape.Lab import com.ldim.granit.ui.model.shape.Led import javafx.scene.paint.Color  devX = 40 devY = 100  beans {     &quot;${beanName}led1&quot;(Led) {        bean -&gt; bean.scope = 'prototype'            code = led1Code            color = [Color.GREEN, Color.RED]            geom = [9, devX + 14 + offsetX, devY + 16]    }     &quot;${beanName}lbl1&quot;(Lab) {        bean -&gt; bean.scope = 'prototype'            code = devCode            text = '\u041c\u0422\u0417'            size = 9            color = [Color.BLACK, Color.BLACK]            geom = [devX + 5 + offsetX, devY + 35]    }     if (reserved) {        &quot;${beanName}led2&quot;(Led) {            bean -&gt;                bean.scope = 'prototype'                code = led2Code                color = [Color.GREEN, Color.RED]                geom = [9, devX + 38 + offsetX, devY + 16]        }         &quot;${beanName}lbl2&quot;(Lab) {            bean -&gt;                bean.scope = 'prototype'                code = devCode                text = '\u0410\u0412\u0420'                size = 9                color = [Color.BLACK, Color.BLACK]                geom = [devX + 30 + offsetX, devY + 35]        }    }     &quot;${beanName}btn&quot;(Box) {        bean -&gt; bean.scope = 'prototype'            code = swCode            color = [Color.GREEN, Color.RED]            press = true            geom = [devX + 66 + offsetX, devY + 8, 23, 23]    }     &quot;${beanName}box&quot;(Box) {        bean -&gt; bean.scope = 'prototype'            code = devCode            color = [Color.GRAY, Color.PINK]            geom = [devX + offsetX, devY, 95, 40]            lays = reserved ? [ref(&quot;${beanName}btn&quot;),                    ref(&quot;${beanName}led1&quot;), ref(&quot;${beanName}lbl1&quot;),                    ref(&quot;${beanName}led2&quot;), ref(&quot;${beanName}lbl2&quot;)]                    : [ref(&quot;${beanName}btn&quot;),                       ref(&quot;${beanName}led1&quot;), ref(&quot;${beanName}lbl1&quot;)]     }     &quot;${beanName}&quot;(Bus) {        bean -&gt; bean.scope = 'prototype'            color = [Color.BLUE]            width = 4            geom = [devX + 77 + offsetX, devY - 30, devX + 77 + offsetX, devY + 70]            lays = [ref(&quot;${beanName}box&quot;)]    } } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Groovy, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0418 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0439\u0441\u044f \u043a\u043e\u0434(\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0437\u0434\u0435\u0441\u044c \u0444\u0430\u0439\u043b\u044b srcs.groovy \u0438 src.groovy). \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043b\u0435\u0436\u0430\u0442 <a href=\"https:\/\/bitbucket.org\/Ldim\/granit-ui\">\u0437\u0434\u0435\u0441\u044c<\/a>.  <\/p>\n<h3><b>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/b><\/h3>\n<p>  \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 Java \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0438 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u201c\u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u043e\u0432\u201d, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0438 \u0432 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0435 \u0441\u0440\u043e\u043a\u0438. \u041d\u0435 \u0437\u043d\u0430\u044f Groovy \u0434\u0430 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e JavaFx, \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430 \u201c\u043a\u043e\u043b\u0435\u043d\u043a\u0430\u0445\u201d \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439. \u0418, \u0447\u0442\u043e \u0435\u0449\u0435 \u043d\u0435\u043c\u0430\u043b\u043e\u0432\u0430\u0436\u043d\u043e - \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0449\u043d\u044b\u0445 \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Java.<\/code><\/code><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/328402\/\"> https:\/\/habrahabr.ru\/post\/328402\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412 \u043a\u043e\u043d\u0446\u0435 90-\u0445 \u0433\u043e\u0434\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u043e\u0434\u043d\u043e\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430\u0441\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0439 \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0435\u0439 \u043f\u0438\u0442\u0430\u044e\u0449\u0438\u0445 \u044d\u043d\u0435\u0440\u0433\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a (\u0442\u044f\u0433\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u0446\u0438\u0439), \u043f\u043b\u044e\u0441 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u043b\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e-\u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u0430 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0441\u043a\u0438\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432. \u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0410\u0421\u0423 \u0422\u041f \u043d\u0430 \u0434\u0440\u0435\u0432\u043d\u0435\u043c \u0441\u043e\u0432\u0435\u0442\u0441\u043a\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435. \u0422\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u044f\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u043f\u043e\u0434 windows, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u0440\u0442\u044b \u0432\u0441\u044e \u0441\u0435\u0442\u044c \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043d\u0430 \u043d\u0435\u0439 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u0446\u0438\u044f\u0445. \u041d\u0443 \u0438 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0431\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043c\u0438.<\/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-286234","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286234","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=286234"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286234\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=286234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=286234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=286234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}