solver impl