Немного доработанный из халедеры, исходники выше.