• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Delphi Генератор уникальных значение ( Имя - Фамилия -Почта - Дата рождения )

kazann116

Принятый Кодер
Регистрация
13 Авг 2018
Сообщения
5
Баллы
30
unit DAA_AccGen;
{$A+}
//{$H+,O+,X+,J+,B+,P+,V+,T-}
{$H+,O-,J+,B+,T-}

{$ALIGN OFF}
{$MINENUMSIZE 4}
//{$ASMMODE INTEL}
{$WARN SYMBOL_DEPRECATED OFF}
{$WARN SYMBOL_PLATFORM OFF}
{$WARN WIDECHAR_REDUCED OFF}
{$WARN UNSAFE_TYPE OFF}

interface
uses Windows, Messages;

const
LineBreak:PWideChar=#13#10;
{ Флаги для генератора адресов.
Из них обязательными являются DGenMales или DGenFemales
в сочетании с DGenEng или DGenRus.
С флагом DDefaultFlags генератор учитывает всё.
Готовые решения:
$00037753 = Генерируются только английские мужские имена.
$00037763 = Генерируются только английские женские имена.
$00037773 = Генерируются только английские имена.
$00037793 = Генерируются только русские мужские имена.
$000377A3 = Генерируются только русские женские имена.
$000377B3 = Генерируются только русские имена.}
// Маска
DGenMail = $00000001; // Генерирует e-mail.
DRndMail = $00000002; // Предпочтительно e-mail из случайных допустимых символов.
DGenMales = $00000010; // Генерирует мужские имена.
DGenFemales = $00000020; // Генерирует женские имена.
DGenEng = $00000040; // Генерирует английские имена.
DGenRus = $00000080; // Генерирует русские имена.
DUseMFAsp = $00000100; // Учитывает соотношение М/Ж имён.
DRusNick = $00000200; // Позволяет ники с русскими именами.
DGenSex = $00000400; // Добавляет пол. M/F для английских и М/Ж для русских.
DGenNick = $00001000; // Генерирует ник. (на основе имени, префикса и цифр)
DRndNick = $00002000; // Ник генерируется абсолютно случайно из допустимых символов.
DLongNick = $00004000; // Добавляет фамилию к нику.
DGenDate = $00010000; // Генерирует дату рождения.
DRangeDate = $00020000; // Учитывает реалистичные диапазоны дат.
// Биты.
bGenMail = 0; // Генерирует e-mail.
bRndMail = 1; // Предпочтительно e-mail из случайных допустимых символов.
bGenMales = 4; // Генерирует мужские имена.
bGenFemales = 5; // Генерирует женские имена.
bGenEng = 6; // Генерирует английские имена.
bGenRus = 7; // Генерирует русские имена.
bUseMFAsp = 8; // Учитывает соотношение М/Ж имён.
bRusNick = 9; // Позволяет ники с русскими именами.
bGenSex = 10; // Добавляет пол. M/F для английских и М/Ж для русских.
bGenNick = 12; // Генерирует ник. (на основе имени, префикса и цифр)
bRndNick = 13; // Ник генерируется абсолютно случайно из допустимых символов.
bLongNick = 14; // Добавляет фамилию к нику.
bGenDate = 16; // Генерирует дату рождения.
bRangeDate = 17; // Учитывает реалистичные диапазоны дат.
//////////////////////////////
DDefaultFlags= $000377F3;
const
MinYear=1900; // Минимальный год.
MaxPassCb=30; // Максимальная длина пароля.
//Флаги для ggMail:
WMaleFemale = $40000000; // 0 - М, 1 - Ж.
WEngRus = $80000000; // 0 - Eng, 1 - Rus.
// 0..9 - Имя
// 10..19 - Фамилия
// 20..29 - Модификаторы (все).

MaxNameValue=1024; // 10 бит.
type
// Это возвращаемые значения по запросу.
TDRetParams=packed record
Name:array[0..31]of WideChar; // Имя.
Fam:array[0..31]of WideChar; // Фамилия
eMail:array[0..31]of WideChar; // еМайл
Nick:array[0..31]of WideChar; // Ник
Password:array[0..31]of WideChar;// Пароль
isFemale:bool; // Если True, то имя женское.
isRus:bool; // Если True, то имя русское.
DateDay:dword; // День рождения.
DateMonth:dword;// Месяц рождения.
DateYear:dword; // Год рождения.
end;
// Это заголовочные данные. Для внутреннего использования.
TDGenParams=packed record
Header:array[0..3]of WideChar;
cbSize:dword;
ResVal1:dword;
ResVal2:dword;
ResVal3:dword;
Flags:dword;
SizeElement:dword;
NumElements:dword;
end;
PDElement=^TDElement; // Для внутренних целей.
TDElement=packed record
Code:UInt64;
Password:array[0..31]of WideChar;
end;
PDElements=^TDElements; // Для внутренних целей.
TDElements=packed array[0..0]of TDElement;
type
DEofCallBack=procedure(Flags:dword);stdcall; // Не используется.

{ InitVars для внутреннего использования.}
procedure InitVars;

{ InitGenerator(FName:PWideChar):bool;
В параметре указывается путь и имя файла.
Файл будет создан, а если такой существует, то перезаписан.
Если всё прошло удачно, то возвращает True.}
function InitGenerator(FName:PWideChar):bool;

{ OpenGenerator(FName:PWideChar):bool;
В параметре указывается путь и имя существующего файла.
Файл открывается на чтение и запись.
Если не удалось открыть файл или файл не существует, функция вернёт False.
После открытия, можно использовать
ExtractField(Num:dword;var Field:TDRetParams):bool;
GetFieldsCount:dword;
А по воскресеньям и
Generate(var Num:dword;Flags:dword;MinY,MaxY,MinPl,MaxPl:dword):bool;}
function OpenGenerator(FName:PWideChar):bool;

{ CloseGenerator:bool;
Закрывает текущий файл.
После вызова можно открывать или создавать другие файлы.}
function CloseGenerator:bool;

{ GetFieldsCount:dword;
Возвращает количество сгенерированных записей.
Если файл данных не открыт, то вернёт 0.}
function GetFieldsCount:dword;

{ Generate(var Num:dword;Flags:dword;MinY,MaxY,MinPl,MaxPl:dword):bool;
Сам генератор. Генерирует учётные данные в закодированном виде.
Записывает их в файл, ранее созданный или открытый.
Если файл существовал и содержал данные, он будет обновлён.
По параметрам:
Num - только переменная типа DWord. В ней передаётся количество
записей, которые надо сгенерировать.
Так же в ней возвращается количество сгенерированных
записей после фильтрации на повторяющиеся.
Flags - параметры генерации. (Флаги для генератора адресов.)
MinY - Минимальный год для генерации дат рождения. (от 1990 до 2027)
MaxY - Максимальный год для генерации дат рождения. (от 1990 до 2027)
Максимальный год не должен быть меньше минимального.
MinPl - Минимальная длина пароля в символах.
Минимальная длина пароля не должна быть меньше 2.
MaxPl - Максимальная длина пароля в символах.
Максимальная длина пароля не должна превышать 31.
Пример вызова:
Generate(Num,DDefaultFlags,1960,2010,8,16);
или
if not Generate(Num,$00037753,1910,1970,8,12)then .......
***
Функция возвращает True, если всё прошло успешно.
Если все условия и параметры верны, генерирует своеобразную базу данных,
которую можно использовать в дальнейшем.
Файл указывается функциями InitGenerator или OpenGenerator.}
function Generate(var Num:dword;Flags:dword;MinY,MaxY,MinPl,MaxPl:dword):bool;

{ ExtractField(Num:dword;var Field:TDRetParams):bool;
Основная функция для получения данных из базы. (Пока единственная)
Num - номер записи. Количество записей можно узнать
с помощью GetFieldsCount.
Num должен быть меньше количества записей.
(Отсчёт ведётся с нуля).
Field - переменная типа TDRetParams.
В ней возврящаются все данные для указанной записи.}
function ExtractField(Num:dword;var Field:TDRetParams):bool;

//function GetEnabledMailSym:PWideChar;
//function GetEnabledNickSym:PWideChar;
function GetEnabledPasswordSym:PWideChar;
//function SetEnabledMailSym(const Syms:PWideChar):bool;
//function SetEnabledNickSym(const Syms:PWideChar):bool;
function SetEnabledPasswordSym(const Syms:PWideChar):bool;



function DAssigned(const P:pointer):bool;stdcall;overload;
function DAssigned(const P):bool;stdcall;overload;
procedure DRndSet;stdcall;
function DRnd(const ARange:UInt64):UInt64;stdcall;
function DRnd1(const Value:UInt64):UInt64;stdcall;
function SLen(const Str:PWideChar):Cardinal;stdcall;
function SBLen(const Str:PWideChar):Cardinal;stdcall;
function SCpy(const Dest:PWideChar;const Source:PWideChar):Cardinal;stdcall;
function BitTst(const rData:UInt64;sFlag:UInt64):bool;stdcall;overload;
function BitSet(var rDats;sFlsg:UInt64):bool;stdcall;overload;
function BitClr(var rDats;sFlsg:UInt64):bool;stdcall;overload;
function BitTst(const rData:dword;sFlag:dword):bool;stdcall;overload;
function BitSet(var rDats;sFlsg:dword):bool;stdcall;overload;
function BitClr(var rDats;sFlsg:dword):bool;stdcall;overload;


//function GeneratePassword(MinLength,MaxLength:dword;var PassStr:array of WideChar):dword;
//function TranslateToFile(FileName:PWideChar;Flags:dword;EofCallBack:DEofCallBack):bool;
//function DPackDate(Day,Month,Year:dword;var DDate:word):bool;stdcall;
//procedure DUnpackDate(DDate:word;var Day,Month,Year:dword);stdcall;
//function DCryptName(var Name:array of WideChar):PWideChar;
//procedure CaseModAddr(Flags:dword;var NameAddr:array of WideChar);

implementation
//func(a,b,c,d);
// a in RCX, b in RDX, c in R8, d in R9
function BitTst(const rData:UInt64;sFlag:UInt64):bool;stdcall;
asm
xor RAX,RAX
bt RCX,RDX
jnc @BSet
inc RAX
@BSet:
end;
function BitSet(var rDats;sFlsg:UInt64):bool;stdcall;
asm
xor RAX,RAX
bts [RCX],RDX
jnc @BSet
inc RAX
@BSet:
end;
function BitClr(var rDats;sFlsg:UInt64):bool;stdcall;
asm
xor RAX,RAX
btr [RCX],RDX
jnc @BSet
inc RAX
@BSet:
end;
function BitTst(const rData:dword;sFlag:dword):bool;stdcall;
asm
xor EAX,EAX
bt ECX,EDX
jnc @BSet
inc EAX
@BSet:
end;
function BitSet(var rDats;sFlsg:dword):bool;stdcall;
asm
xor EAX,EAX
bts [RCX],EDX
jnc @BSet
inc EAX
@BSet:
end;
function BitClr(var rDats;sFlsg:dword):bool;stdcall;
asm
xor EAX,EAX
btr [RCX],EDX
jnc @BSet
inc EAX
@BSet:
end;

// Быстрый аналог Assigned();
function DAssigned(const P):bool;stdcall;asm xor RAX,RAX;jrcxz @YeZ;inc EAX;@YeZ:end;
function DAssigned(const P:pointer):bool;stdcall;asm xor RAX,RAX;jrcxz @YeZ;inc EAX;@YeZ:end;

// Модифицированная Randomize.
var DRandSeed,PerfCntr:UInt64;
procedure DRndSet;stdcall;
asm
push RBP
push RDX
lea RCX,PerfCntr
call QueryPerformanceCounter
xor RAX,RAX
dec RAX
mov RCX,RAX
call DRnd
mov RCX,PerfCntr
xor RCX,RAX
mov DRandSeed,RCX
pop RDX
pop RBP
end;
// Модифицированная Random.
function DRnd(const ARange:UInt64):UInt64;stdcall;
asm
push RBP
mov RAX,RCX
imul RDX,DRandSeed,$08088405
inc RDX
mov DRandSeed,RDX
mul RDX
mov RAX,RDX
pop RBP
end;
// Улучшенный Random. (Повышена вариативность.)
const RV01:UInt64=$62556255;RV02:UInt64=$36193619;RV03:UInt64=$100000000;
function DRnd1(const Value:UInt64):UInt64;stdcall;
asm
push RBP
push RDX
push RCX
mov RAX,DRandSeed
mov RCX,RV01
mul RCX
mov RCX,RV02
add RAX,RCX
mov RCX,RV03
div RCX
mov DRandSeed,RDX
mov RAX,RDX
xor RDX,RDX
pop RCX
div RCX
mov RAX,RDX
pop RDX
pop RBP
end;


var
DMinYear:dword=MinYear;
DMaxYear:dword=MinYear+127;
DMinPassLn:dword=6;
DMaxPassLn:dword=MaxPassCb;

// Функция упаковывает дату типа ДЕНЬ,МЕСЯЦ,ГОД в переменную типа Word (16 бит).
// Производится проверка на максимальное число, день и год. (31,12,2028)
// Нет проверки на правильность даты типа 31 февраля.
function DPackDate(Day,Month,Year:dword;var DDate:word):bool;stdcall;
asm
push RBP
jmp @Strt;@Err:
xor RAX,RAX;mov [R9],word ptr AX;jmp @EEnd
@Strt: test RCX,RCX;jz @Err;test RDX,RDX;jz @Err;test R8,R8;jz @Err
mov EAX,MinYear;cmp RAX,R8;jl @YearY;jmp @Err
@YearY: sub R8,RAX;mov EAX,127;cmp R8,RAX;jle @YearYY;jmp @Err
@YearYY: shr EAX,2;cmp RCX,RAX;jle @DayY;jmp @Err
@DayY: shr EAX,1;sub EAX,3;cmp RDX,RAX;jle @MonthY;jmp @Err
@MonthY: shl R8,4;or R8,RDX;shl R8,5;or R8,RCX
mov RDX,R8;mov [R9],word ptr DX;sub EAX,11
@EEnd:pop RBP
end;
// Функция распаковывает значение даты и приводит в надлежащий вид.
// Проверок на правильность не производится.
procedure DUnpackDate(DDate:word;var Day,Month,Year:dword);stdcall;
asm
push RBP
mov RAX,RCX;and EAX,$1F;mov [RDX],dword ptr EAX
mov RAX,RCX;shr EAX,5;and EAX,$0F;mov [R8],dword ptr EAX
mov RAX,RCX;shr EAX,9;add EAX,MinYear;mov [R9],dword ptr EAX
xor RAX,RAX;pop RBP
end;






const
// Символы под замену.
TCryRE:packed array[0..131]of WideChar=(
'а','a','б','b','в','v','г','g','д','d','е','e','ё','e','ж','z','з','z','и','i',
'й','j','к','k','л','l','м','m','н','n','о','o','п','p','р','r','с','s','т','t',
'у','u','ф','f','х','h','ц','c','ч','h','ш','w','щ','w','ъ','3','ы','y','ь','4',
'э','e','ю','u','я','a','А','A','Б','B','В','V','Г','G','Д','D','Е','E','Ё','E',
'Ж','Z','З','Z','И','I','Й','J','К','K','Л','L','М','M','Н','N','О','O','П','P',
'Р','R','С','S','Т','T','У','U','Ф','F','Х','H','Ц','C','Ч','H','Ш','W','Щ','W',
'Ъ','1','Ы','Y','Ь','2','Э','E','Ю','U','Я','A');
// Функция транслирует строку с русскими буквами в латинские.
function DCryptName(var Name:array of WideChar):PWideChar;stdcall;
asm
push RBP;push RDI;push RCX;xor RDX,RDX
lea RAX,[RCX];test RAX,RAX;jz @EndProc
mov DX,[RAX];test DX,DX;jz @EndProc
@Loop0:mov DX,[RAX];test DX,DX;jne @NextL;jmp @EndProc
@NextL:xor RCX,RCX;lea RDI,TCryRE
@Loop:mov DX,[RAX];cmp DX,[RDI];jne @NextLL;inc RDI;inc RDI
mov DX,[RDI];mov [RAX],DX;inc RAX;inc RAX;jmp @Loop0
@NextLL:mov DX,4;add RDI,RDX;inc CL;cmp CL,132;jna @Loop
inc RAX;inc RAX;jmp @Loop0
@EndProc:lea RAX,[RCX];pop RCX;pop RDI;pop RBP
end;

// Функция модифицирует строку в соответствии с параметрами.
procedure BMA(PrevMethod:dword;Method:dword;PostMethod:dword;var NameAddr:array of WideChar);stdcall;
var TempAddr:packed array[0..127]of WideChar;
// Инвертирует слово по буквам.
procedure Invert(var NAddr:array of WideChar);var x,y:integer;
begin
y:=lstrLen(NAddr);for x:=0 to y-1 do TempAddr[x]:=NAddr[y-x-1];TempAddr[y]:=#0
end;
// Отзеркаливает по центру алфавита.
procedure Mirror(var NAddr:array of WideChar);var x,y:integer;x1,x2:WideChar;
begin
y:=lstrLen(NAddr);for x:=0 to y-1 do begin
if NAddr[x]<='Z'then begin x1:=#$05A;x2:=#$041 end else begin x1:=#$07A;x2:=#$061 end;
TempAddr[x]:=WideChar(word(x1)-word(NAddr[x])+word(x2));
end;
TempAddr[y]:=#0
end;
// Меняет чётные буквы с нечётными.
procedure Replace12(var NAddr:array of WideChar);var x,y,y1:integer;
begin
y1:=lstrLen(NAddr);y:=(y1)div 2;y1:=(y1)mod 2;
for x:=0 to y do begin TempAddr[x*2]:=NAddr[x*2+1];TempAddr[x*2+1]:=NAddr[x*2]end;
if y1>0 then TempAddr[y*2]:=NAddr[y*2];
TempAddr[lstrLenW(NAddr)]:=#0;
end;
// Циклический сдвиг вправо.
procedure RorRight(var NAddr:array of WideChar;RorVal:dword);var x,y,y1:integer;
begin
y:=lstrLen(NAddr);
for x:=0 to y-1 do begin
y1:=x+integer(RorVal);if y1>y-1 then dec(y1,y);TempAddr[y1]:=NAddr[x]
end;TempAddr[y]:=#0
end;
// Увеличивает все символы на SymAdd;
procedure ReplaceSymAdd(var NAddr:array of WideChar;SymAdd:dword);var x,y:integer;
begin
y:=lstrLen(NAddr);
for x:=0 to y-1 do begin
TempAddr[x]:=WideChar(word(NAddr[x])+Word(SymAdd));
if TempAddr[x]<'a'then begin if TempAddr[x]>'Z'then TempAddr[x]:=WideChar(word(TempAddr[x])-26)end
else begin if TempAddr[x]>'z'then TempAddr[x]:=WideChar(word(TempAddr[x])-26)end;
end;TempAddr[y]:=#0
end;
// Увеличивает все символы на SymSub;
procedure ReplaceSymSub(var NAddr:array of WideChar;SymSub:dword);var x,y:integer;
begin
y:=lstrLen(NAddr);
for x:=0 to y-1 do begin
TempAddr[x]:=WideChar(word(NAddr[x])-Word(SymSub));
if TempAddr[x]<'a'then begin if TempAddr[x]<'A'then TempAddr[x]:=WideChar(word(TempAddr[x])+26)end
else begin if TempAddr[x]<'a'then TempAddr[x]:=WideChar(word(TempAddr[x])+26)end;
end;TempAddr[y]:=#0
end;
begin
if lstrLenW(NameAddr)=0 then exit;
if Method<>0 then case Method of
1:Replace12(NameAddr);
2:Invert(NameAddr);
3:ReplaceSymAdd(NameAddr,PrevMethod);
4:ReplaceSymSub(NameAddr,PrevMethod);
5:Mirror(NameAddr);
end;
lstrCpyW(NameAddr,TempAddr);
end;

var TempVS:packed array[0..255]of WideChar;
// Вычисляет длину строки. Модифицирует регистры RAX,RCX.
function SLen(const Str:PWideChar):Cardinal;stdcall;
asm
push RBP;push RDI;mov RDI,RCX;xor RCX,RCX;not RCX;xor AX,AX
repne scasw;not RCX;dec RCX;mov RAX,RCX;pop RDI;pop RBP
end;
// Вычисляет размер строки в байтах. Модифицирует регистры RAX,RCX.
function SBLen(const Str:PWideChar):Cardinal;stdcall;
asm
push RBP;push RDI;mov RDI,RCX;xor RCX,RCX;not RCX;xor AX,AX
repne scasw;not RCX;dec RCX;shl RCX,1;mov RAX,RCX;pop RDI;pop RBP
end;
// Копирует строку Source в Dest. Проверяет параметры м возвращает длину строки.
function SCpy(const Dest:PWideChar;const Source:PWideChar):Cardinal;stdcall;
asm push RBP;xor AX,AX;test ECX,EDX;jne @Nxt;jmp @EEnd
@Nxt:push RDI;push RSI;mov RDI,RDX;mov RSI,RCX;xor RCX,RCX;not ECX;repne scasw
not ECX;mov EAX,ECX;dec EAX;mov RDI,RSI;mov RSI,RDX;rep movsw;pop RSI;pop RDI;@EEnd:pop RBP
end;

// Функция выполняет предварительные модификации.
procedure CMA(Flags:dword;Arg1:UInt64;Arg2:UInt64;var NameAddr:array of WideChar);stdcall;
procedure RLSym; // Заменяет последний символ в строке [R9] на содержимое регистра AX.
asm push AX;mov RCX,R9;call SBLen;dec RAX;dec RAX;add R9,RAX;pop AX;movzx RAX,AX;mov [R9],EAX end;
procedure RL2Sym; // Заменяет 2 последних символа в строке [R9] на содержимое регистра EAX.
asm push RAX;mov RCX,R9;call SBLen;sub EAX,4;add R9,RAX;pop RAX;mov [R9],EAX end;
procedure PsSym; // Добавляет символ в конец строки [R9] из регистра AX.
asm push AX;mov RCX,R9;call SBLen;add r9,RAX;pop AX;movzx RAX,AX;mov [R9],EAX end;
procedure RemLS; // Удаляет последний символ в строке [R9]
asm mov RCX,R9;call SBLen;sub EAX,2;add R9,RAX;xor RAX,RAX;mov [R9],EAX end;
procedure Rem2LS; // Удаляет 2 последних символа в строке [R9]
asm mov RCX,R9;call SBLen;sub EAX,4;add R9,RAX;xor RAX,RAX;mov [R9],EAX end;
procedure AddAXRem3;
asm mov word ptr [R9],AX;mov AL,4;movzx RAX,AL
add R9,RAX;shr RAX,1;@Loop:mov DX,[R9+RAX]
mov [R9],DX;add R9,RAX;test DX,DX;jnz @Loop
end;
procedure InsAX;
asm
push AX;mov RCX,R9;call SBLen
mov CL,2;movzx RCX,CL
xor DX,DX;mov word ptr [R9+RAX+2],DX
@Loop:mov DX,word ptr [R9+RAX-2]
mov word ptr [R9+RAX],DX;sub RAX,RCX
jnz @Loop;pop AX;mov word ptr [R9],AX
end;
procedure Rep1Z; // Меняет местами первый и последний символ в строке [R9]
asm
mov RCX,R9;call SBLen;mov DX,word ptr [R9+RAX-2]
mov CX,word ptr [R9];mov word ptr [R9],DX
mov word ptr [R9+RAX-2],CX
end;
procedure SomeProc;
asm
xor RAX,RAX;@Loop:mov DX,word ptr [R9+RAX];test DX,DX;jz @Endl
cmp DX,'a';je @isA;cmp DX,'u';je @isU
cmp DX,'o';je @isO;cmp DX,'e';je @isE
cmp DX,'i';je @isI;cmp DX,'j';je @isJ;jmp @NoSym
@isA:mov DX,'u';jmp @NoIs;@isU:mov DX,'a';jmp @NoIs
@isO:mov DX,'e';jmp @NoIs;@isE:mov DX,'o';jmp @NoIs
@isI:mov DX,'j';jmp @NoIs;@isJ:mov DX,'i';
@NoIs:mov word ptr [R9+RAX],DX;@NoSym:inc RAX;inc RAX;jmp @Loop
@Endl:mov AX,'6';jmp PsSym
end;
procedure RShiftAX;
asm
mov RCX,R9;call SBLen;mov CX,word ptr [R9+RAX-2];dec RAX;dec RAX
@Loop:mov DX,word ptr [R9+RAX-2];mov word ptr [R9+RAX],DX
dec RAX;dec RAX;test AX,AX;jnz @Loop;mov word ptr [R9],CX
end;

procedure DelAXSym;
asm shl AX,1;movzx RAX,AX
@Loop:mov DX,word ptr [R9+RAX]
mov word ptr [R9+RAX-2],DX;inc RAX;inc RAX
test DX,DX;jnz @Loop
end;
procedure DelAXNext;
asm
push AX;shl AX,1;movzx RAX,AX;mov DX,word ptr [R9+RAX]
test DX,DX;jz @NoCall;mov DX,word ptr [R9+RAX+2]
test DX,DX;jz @NoCall;jmp @Loop;@NoCall:pop AX;jmp @EEnd
@Loop:mov DX,word ptr [R9+RAX];mov word ptr [R9+RAX-2],DX
inc RAX;inc RAX;test DX,DX;jnz @Loop
pop AX;inc AX;call DelAXNext;@EEnd:
end;
procedure RepAXLoop;
asm shl AX,1;movzx RAX,AX
@Loop:mov DX,word ptr [R9+RAX-2];test DX,DX;je @EndL
mov DX,'_';mov word ptr [R9+RAX-2],DX;add AX,4
movzx RAX,AX;jmp @Loop;@EndL:
end;
procedure RepAXMirr;
asm
shl AX,1;movzx RAX,AX;xor RCX,RCX
mov DX,word ptr [R9+RAX-2];cmp DX,'a'
jl @NoSmall;mov CX,'z'-'Z'
@NoSmall:add CX,'Z'
mov R8w,CX;sub R8w,25;sub CX,DX;add R8w,CX
mov word ptr [R9+RAX-2],R8w
end;
procedure IncSym;
asm cmp DX,'a';jl @NoSmall;inc DX
cmp DX,'z';jle @NoModS;mov DX,'a'
@NoModS:mov word ptr[R9+RAX],DX;jmp @EEnd
@NoSmall:inc DX;cmp DX,'Z';jle @NoModS
mov DX,'A';mov word ptr[R9+RAX],DX
@EEnd:
end;
procedure DecSym;
asm cmp DX,'a';jl @NoSmall;dec DX
cmp DX,'a';jge @NoModS;mov DX,'z'
@NoModS:mov word ptr[R9+RAX],DX;jmp @EEnd
@NoSmall:dec DX;cmp DX,'A';jge @NoModS
mov DX,'Z';mov word ptr[R9+RAX],DX
@EEnd:
end;
procedure IncDecSyms;
asm xor RAX,RAX
@Loop:mov DX,word ptr[R9+RAX];test DX,DX;jnz @NextCyc;jmp @EEnd
@NextCyc:call IncSym;inc RAX;inc RAX;mov DX,word ptr[R9+RAX]
test DX,DX;jnz @NextCyc2;jmp @EEnd
@NextCyc2:call DecSym;inc RAX;inc RAX;jmp @Loop
@EEnd:
end;
procedure DecIncSyms;
asm xor RAX,RAX
@Loop:mov DX,word ptr[R9+RAX];test DX,DX;jnz @NextCyc;jmp @EEnd
@NextCyc:call DecSym;inc RAX;inc RAX;mov DX,word ptr[R9+RAX]
test DX,DX;jnz @NextCyc2;jmp @EEnd
@NextCyc2:call IncSym;inc RAX;inc RAX;jmp @Loop
@EEnd:
end;
procedure a__z;
asm mov AX,2;movzx RAX,AX;xor CX,CX;mov DX,'_'
@Loop:mov word ptr [R9+RAX],DX;inc RAX;inc RAX
cmp CX,word ptr [R9+RAX+2];jne @Loop
end;
procedure na__z;
asm mov AX,2;movzx RAX,AX;xor CX,CX;mov DX,'_'
mov word ptr [R9],DX;@Loop:inc RAX;inc RAX
cmp CX,word ptr [R9+RAX+2];jne @Loop
mov word ptr [R9+RAX],DX
end;
procedure RepDigits;
asm xor RCX,RCX;mov R8w,10
@Loop:xor DX,DX;mov AX,word ptr[R9+RCX]
test AX,AX;jz @EndL;sub AX,17;div R8w;add DX,'0'
mov word ptr[R9+RCX],DX;inc RCX;inc RCX;jmp @Loop
@EndL:
end;
procedure RepHex;
asm xor RCX,RCX;mov R8w,16
@Loop:xor DX,DX;mov AX,word ptr[R9+RCX];test AX,AX;jz @EndL
sub AX,17;div R8w;add DX,'0';cmp DX,'9';jle @NoMods;add DX,7
@NoMods:mov word ptr[R9+RCX],DX;inc RCX;inc RCX;jmp @Loop
@EndL:
end;
procedure Mult2;
asm mov RCX,R9;call SBLen
mov RDX,RAX;shr RAX,1;xor RCX,RCX
@Loop:mov R8w,[R9+RCX];mov [R9+RDX],R8w
inc RCX;inc RCX;inc RDX;inc RDX;dec RAX;jnz @Loop
end;
procedure AddTempStr; // Используется Mult2Inv и Mul2Mirr
asm xor EAX,EAX;push RSI;push RDI;lea RSI,TempVS;mov RDI,R9
sub ECX,2;add RDI,RCX;shr ECX,1;rep movsd;stosd;pop RDI;pop RSI
end;
procedure Mult2Inv;
asm
xor RCX,RCX;lea R8,TempVS
@Loop:mov DX,word ptr [R9+RCX];mov word ptr [R8+RCX],DX
inc RCX;inc RCX;test DX,DX;jnz @Loop;push RCX;push R9
mov R9,R8;xor R8,R8;xor RCX,RCX;mov EDX,2;call BMA
pop R9;pop RCX;jmp AddTempStr
end;
procedure Mul2Mirr;
asm
xor RCX,RCX;lea R8,TempVS
@Loop:mov DX,word ptr [R9+RCX];mov word ptr [R8+RCX],DX
inc RCX;inc RCX;test DX,DX;jnz @Loop;push RCX;push R9
mov R9,R8;xor R8,R8;xor RCX,RCX;mov EDX,5;call BMA
pop R9;pop RCX;jmp AddTempStr
end;
procedure MirrAddInv;
asm
push RSI;push RDI;mov RSI,R9;lea RDI,TempVS;repnz movsw;pop RSI;pop RSI;
push R9;xor R8,R8;xor RCX,RCX;mov EDX,5;call BMA;pop R9
push R9;lea R9,TempVS;xor R8,R8;xor RCX,RCX;mov EDX,2;call BMA;pop R9
push RSI;push RDI;mov RDI,R9;xor AX,AX;mov RCX,RDI;repnz scasw
dec RDI;dec RDI;lea RSI,TempVS;sub RCX,RDI;neg RCX;rep movsw;pop RSI;pop RSI
end;
procedure InvAddMirr;
asm
push RSI;push RDI;mov RSI,R9;lea RDI,TempVS;repnz movsw;pop RSI;pop RSI
push R9;xor R8,R8;xor RCX,RCX;mov EDX,2;call BMA;pop R9
push R9;lea R9,TempVS;xor R8,R8;xor RCX,RCX;mov EDX,5;call BMA;pop R9
push RSI;push RDI;mov RDI,R9;xor AX,AX;mov RCX,RDI;repnz scasw
dec RDI;dec RDI;lea RSI,TempVS;sub RCX,RDI;neg RCX;rep movsw;pop RSI;pop RSI
end;
procedure InsTempVS;
asm
push RDI;push RSI;lea RCX,TempVS
mov RDI,RCX;call SBLen;add RDI,RAX;mov RSI,R9
mov RCX,R9;call SLen;mov RCX,RAX;rep movsw;pop RSI;pop RDI
mov RCX,R9;lea RDX,TempVS;jmp SCpy
end;
// После преобразования:
// RCX - значение PrevMethod
// RDX - значение Method
// R8 - значение PostMethod
// R9 - адрес строки. (строка должна быть с запасом по символам)
asm
push RBP;push RDI;push RSI;push R9
mov RAX,RCX
mov ECX,63;cmp EAX,ECX;jle @x0000;jmp @x0064
@x0000:
xor ECX,ECX;cmp EAX,ECX;jne @x0001
// Оставить всё как есть.
jmp @xEnd
@x0001:
inc ECX;cmp EAX,ECX;jne @x0002
// Заменить первую на вторую, третью на четвёртую и т.д.
push R9;xor RCX,RCX;mov EDX,1;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0002:
inc ECX;cmp EAX,ECX;jne @x0003
// Убрать последнюю букву, заменить на 1.
mov AX,'1';call RLSym
jmp @xEnd
@x0003:
inc ECX;cmp EAX,ECX;jne @x0004
// Убрать последнюю букву, заменить на 2.
mov AX,'2';call RLSym
jmp @xEnd
@x0004:
inc ECX;cmp EAX,ECX;jne @x0005
// Убрать последнюю букву, заменить на 3.
mov AX,'3';call RLSym
jmp @xEnd
@x0005:
inc ECX;cmp EAX,ECX;jne @x0006
// Убрать последнюю букву, заменить на 4.
mov AX,'4';call RLSym
jmp @xEnd
@x0006:
inc ECX;cmp EAX,ECX;jne @x0007
// Убрать последнюю букву, заменить на 5.
mov AX,'5';call RLSym
jmp @xEnd
@x0007:
inc ECX;cmp EAX,ECX;jne @x0008
// Убрать две последних буквы, заменить на 'US'
mov EAX,'S'shl 16+'U';call RL2Sym;
jmp @xEnd
@x0008:
inc ECX;cmp EAX,ECX;jne @x0009
// Убрать две последних буквы, заменить на '1S'
mov EAX,'S'shl 16+'1';call RL2Sym;
jmp @xEnd
@x0009:
inc ECX;cmp EAX,ECX;jne @x0010
// Убрать две последних буквы, заменить на 'BG'
mov EAX,'B'shl 16+'G';call RL2Sym;
jmp @xEnd
@x0010:
inc ECX;cmp EAX,ECX;jne @x0011
// Убрать две последних буквы, заменить на 'Joy'
mov EAX,'o'shl 16+'J';call RL2Sym;
mov AX,'y';call PsSym
jmp @xEnd
@x0011:
inc ECX;cmp EAX,ECX;jne @x0012
// Убрать последнюю букву.
call RemLS
jmp @xEnd
@x0012:
inc ECX;cmp EAX,ECX;jne @x0013
// Убрать две последних буквы.
call Rem2LS
jmp @xEnd
@x0013:
inc ECX;cmp EAX,ECX;jne @x0014
// Добавить 1.
mov AX,'1';call PsSym
jmp @xEnd
@x0014:
inc ECX;cmp EAX,ECX;jne @x0015
// Добавить 2
mov AX,'2';call PsSym
jmp @xEnd
@x0015:
inc ECX;cmp EAX,ECX;jne @x0016
// Добавить 3.
mov AX,'3';call PsSym
jmp @xEnd
@x0016:
inc ECX;cmp EAX,ECX;jne @x0017
// Добавить 4.
mov AX,'4';call PsSym
jmp @xEnd
@x0017:
inc ECX;cmp EAX,ECX;jne @x0018
// Добавить 5.
mov AX,'5';call PsSym
jmp @xEnd
@x0018:
inc ECX;cmp EAX,ECX;jne @x0019
// Добавить в начало W и убрать третью букву.
mov AX,'W';call AddAXRem3
jmp @xEnd
@x0019:
inc ECX;cmp EAX,ECX;jne @x0020
// Добавить в начало R и убрать третью букву.
mov AX,'R';call AddAXRem3
jmp @xEnd
@x0020:
inc ECX;cmp EAX,ECX;jne @x0021
// Добавить в начало S и убрать третью букву.
mov AX,'S';call AddAXRem3
jmp @xEnd
@x0021:
inc ECX;cmp EAX,ECX;jne @x0022
// Добавить в начало 1.
mov AX,'1';call InsAX
jmp @xEnd
@x0022:
inc ECX;cmp EAX,ECX;jne @x0023
// Добавить в начало 2.
mov AX,'2';call InsAX
jmp @xEnd
@x0023:
inc ECX;cmp EAX,ECX;jne @x0024
// Добавить в начало 3.
mov AX,'3';call InsAX
jmp @xEnd
@x0024:
inc ECX;cmp EAX,ECX;jne @x0025
// Добавить в начало 4.
mov AX,'4';call InsAX
jmp @xEnd
@x0025:
inc ECX;cmp EAX,ECX;jne @x0026
// Добавить в начало 5.
mov AX,'5';call InsAX
jmp @xEnd
@x0026:
inc ECX;cmp EAX,ECX;jne @x0027
// Инвертировать слева направо.
push R9;xor RCX,RCX;mov EDX,2;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0027:
inc ECX;cmp EAX,ECX;jne @x0028
// Поменять первую и последнюю буквы.
call Rep1Z;
jmp @xEnd
@x0028:
inc ECX;cmp EAX,ECX;jne @x0029
// Поменять вторую и третью буквы.
mov DX,word ptr [R9+2];mov CX,word ptr [R9+4]
mov word ptr [R9+2],CX;mov word ptr [R9+4],DX
jmp @xEnd
@x0029:
inc ECX;cmp EAX,ECX;jne @x0030
// Заменить 'a' на 'u', 'o' на 'e', 'i' на 'j' и наоборот, добавить в конец 6.
call SomeProc
jmp @xEnd
@x0030:
inc ECX;cmp EAX,ECX;jne @x0031
// Сдвинуть на 1 вправо.
call RShiftAX
jmp @xEnd
@x0031:
inc ECX;cmp EAX,ECX;jne @x0032
// Сдвинуть на 2 вправо.
call RShiftAX;call RShiftAX
jmp @xEnd
@x0032:
inc ECX;cmp EAX,ECX;jne @x0033
// Сдвинуть на 3 вправо.
call RShiftAX;call RShiftAX;call RShiftAX
jmp @xEnd
@x0033:
inc ECX;cmp EAX,ECX;jne @x0034
// Удалить вторую букву.
mov AX,2;call DelAXSym
jmp @xEnd
@x0034:
inc ECX;cmp EAX,ECX;jne @x0035
// Удалить предпоследнюю букву.
mov RCX,R9;call SLen
dec AX;call DelAXSym
jmp @xEnd
@x0035:
inc ECX;cmp EAX,ECX;jne @x0036
// Заменить все буквы на следующие.
push R9;mov ECX,1;mov EDX,3;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0036:
inc ECX;cmp EAX,ECX;jne @x0037
// Заменить все буквы на следующие+1.
push R9;mov ECX,2;mov EDX,3;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0037:
inc ECX;cmp EAX,ECX;jne @x0038
// Заменить все буквы на следующие+2.
push R9;mov ECX,3;mov EDX,3;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0038:
inc ECX;cmp EAX,ECX;jne @x0039
// Заменить все буквы на следующие+3.
push R9;mov ECX,4;mov EDX,3;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0039:
inc ECX;cmp EAX,ECX;jne @x0040
// Заменить все буквы на следующие+4.
push R9;mov ECX,5;mov EDX,3;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0040:
inc ECX;cmp EAX,ECX;jne @x0041
// Заменить все буквы на предыдущие.
push R9;mov ECX,1;mov EDX,4;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0041:
inc ECX;cmp EAX,ECX;jne @x0042
// Удалить все чётные буквы.
mov AX,2;call DelAXNext
jmp @xEnd
@x0042:
inc ECX;cmp EAX,ECX;jne @x0043
// Удалить все нечётные буквы.
mov AX,1;call DelAXNext
jmp @xEnd
@x0043:
inc ECX;cmp EAX,ECX;jne @x0044
// Заменить все чётные на подчёркивание.
mov AX,2;call RepAXLoop
jmp @xEnd
@x0044:
inc ECX;cmp EAX,ECX;jne @x0045
// Заменить все нечётные на подчёркивание.
mov AX,1;call RepAXLoop
jmp @xEnd
@x0045:
inc ECX;cmp EAX,ECX;jne @x0046
// Добавить подчёркивание.
mov AX,'_';call PsSym
jmp @xEnd
@x0046:
inc ECX;cmp EAX,ECX;jne @x0047
// Заменить вторую букву на зеркало.
mov AX,2;call RepAXMirr
jmp @xEnd
@x0047:
inc ECX;cmp EAX,ECX;jne @x0048
// Заменить третью букву на зеркало.
mov AX,3;call RepAXMirr
jmp @xEnd
@x0048:
inc ECX;cmp EAX,ECX;jne @x0049
// Отзеркалить полностью.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0049:
inc ECX;cmp EAX,ECX;jne @x0050
// Отзеркалить и удалить последнюю букву.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9;call RemLS
jmp @xEnd
@x0050:
inc ECX;cmp EAX,ECX;jne @x0051
// Отзеркалить и удалить предпоследнюю букву.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
mov RCX,R9;call SLen;dec AX;call DelAXSym
jmp @xEnd
@x0051:
inc ECX;cmp EAX,ECX;jne @x0052
// Отзеркалить и добавить 1.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
mov AX,'1';call PsSym
jmp @xEnd
@x0052:
inc ECX;cmp EAX,ECX;jne @x0053
// Отзеркалить и добавить 2.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
mov AX,'2';call PsSym
jmp @xEnd
@x0053:
inc ECX;cmp EAX,ECX;jne @x0054
// Отзеркалить и добавить 3.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
mov AX,'3';call PsSym
jmp @xEnd
@x0054:
inc ECX;cmp EAX,ECX;jne @x0055
// Отзеркалить и добавить 4.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
mov AX,'4';call PsSym
jmp @xEnd
@x0055:
inc ECX;cmp EAX,ECX;jne @x0056
// Отзеркалить и добавить 5.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
mov AX,'5';call PsSym
jmp @xEnd
@x0056:
inc ECX;cmp EAX,ECX;jne @x0057
// Отзеркалить и сдвинуть вправо на 1.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
call RShiftAX
jmp @xEnd
@x0057:
inc ECX;cmp EAX,ECX;jne @x0058
// Отзеркалить и сдвинуть вправо на 2.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
call RShiftAX;call RShiftAX
jmp @xEnd
@x0058:
inc ECX;cmp EAX,ECX;jne @x0059
// Отзеркалить и сдвинуть вправо на 3.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
call RShiftAX;call RShiftAX;call RShiftAX
jmp @xEnd
@x0059:
inc ECX;cmp EAX,ECX;jne @x0060
// -,+,-,+ посимвольно.
call DecIncSyms
jmp @xEnd
@x0060:
inc ECX;cmp EAX,ECX;jne @x0061
// +,-,+,- посимвольно.
call IncDecSyms
jmp @xEnd
@x0061:
inc ECX;cmp EAX,ECX;jne @x0062
// Заменить от второй до предпоследней на подчёркивания.
call a__z
jmp @xEnd
@x0062:
inc ECX;cmp EAX,ECX;jne @x0063
// Заменить первую и последнюю на подчёркивания.
call na__z
jmp @xEnd
@x0063:
inc ECX;cmp EAX,ECX;jne @x0064
// Заменить цифрами. (циклично)
call RepDigits
jmp @xEnd
@x0064:
inc ECX;cmp EAX,ECX;jne @x0065
// Заменить числами.
call RepHex
jmp @xEnd
@x0065:
inc ECX;cmp EAX,ECX;jne @x0066
// Удвоить.
call Mult2
jmp @xEnd
@x0066:
inc ECX;cmp EAX,ECX;jne @x0067
// Удвоить инверсией.
call Mult2Inv
jmp @xEnd
@x0067:
inc ECX;cmp EAX,ECX;jne @x0068
// Удвоить зеркалом.
call Mul2Mirr
jmp @xEnd
@x0068:
inc ECX;cmp EAX,ECX;jne @x0069
// Удвоить и удалить последнюю.
call Mult2;call RemLS
jmp @xEnd
@x0069:
inc ECX;cmp EAX,ECX;jne @x0070
// Удвоить и удалить 2 последних.
call Mult2;call Rem2LS
jmp @xEnd
@x0070:
inc ECX;cmp EAX,ECX;jne @x0071
// Удвоить инверсией и удалить последнюю.
call Mult2Inv;call RemLS
jmp @xEnd
@x0071:
inc ECX;cmp EAX,ECX;jne @x0072
// Удвоить инверсией и удалить две последних.
call Mult2Inv;call Rem2LS
jmp @xEnd
@x0072:
inc ECX;cmp EAX,ECX;jne @x0073
// Удвоить зеркалом и удалить последнюю.
call Mul2Mirr;call RemLS
jmp @xEnd
@x0073:
inc ECX;cmp EAX,ECX;jne @x0074
// Удвоить зеркалом и удалить две последних.
call Mul2Mirr;call Rem2LS
jmp @xEnd
@x0074:
inc ECX;cmp EAX,ECX;jne @x0075
// Инверсия + удвоить.
call Mult2;push R9;xor ECX,ECX;mov EDX,2;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0075:
inc ECX;cmp EAX,ECX;jne @x0076
// Зеркало + удвоить.
call Mult2;push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0076:
inc ECX;cmp EAX,ECX;jne @x0077
// Инверсия + удвоить и удалить последнюю.
call Mult2;push R9;xor ECX,ECX;mov EDX,2;xor R8,R8;call BMA;pop R9;call RemLS
jmp @xEnd
@x0077:
inc ECX;cmp EAX,ECX;jne @x0078
// Инверсия + удвоить и удалить 2 последних.
call Mult2;push R9;xor ECX,ECX;mov EDX,2;xor R8,R8;call BMA;pop R9;call Rem2LS
jmp @xEnd
@x0078:
inc ECX;cmp EAX,ECX;jne @x0079
// Зеркало + удвоить и удалить последнюю.
call Mult2;push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9;call RemLS
jmp @xEnd
@x0079:
inc ECX;cmp EAX,ECX;jne @x0080
// Зеркало + удвоить и удалить 2 последних.
call Mult2;push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9;call Rem2LS
jmp @xEnd
@x0080:
inc ECX;cmp EAX,ECX;jne @x0081
// Удвоить и удалить первую.
call Mult2;mov AX,1;call DelAXSym
jmp @xEnd
@x0081:
inc ECX;cmp EAX,ECX;jne @x0082
// Удвоить и удалить две первых.
call Mult2;mov AX,1;call DelAXSym;mov AX,1;call DelAXSym
jmp @xEnd
@x0082:
inc ECX;cmp EAX,ECX;jne @x0083
// Удвоить инверсией и удалить первую.
call Mult2Inv;mov AX,1;call DelAXSym
jmp @xEnd
@x0083:
inc ECX;cmp EAX,ECX;jne @x0084
// Удвоить инверсией и удалить две первых.
call Mult2Inv;mov AX,1;call DelAXSym;mov AX,1;call DelAXSym
jmp @xEnd
@x0084:
inc ECX;cmp EAX,ECX;jne @x0085
// Удвоить зеркалом и удалить первую.
call Mul2Mirr;mov AX,1;call DelAXSym
jmp @xEnd
@x0085:
inc ECX;cmp EAX,ECX;jne @x0086
// Удвоить зеркалом и удалить две первых.
call Mul2Mirr;mov AX,1;call DelAXSym;mov AX,1;call DelAXSym
jmp @xEnd
@x0086:
inc ECX;cmp EAX,ECX;jne @x0087
// Зеркало + инверсия.
call MirrAddInv
jmp @xEnd
@x0087:
inc ECX;cmp EAX,ECX;jne @x0088
// Инверсия + зеркало.
call InvAddMirr
jmp @xEnd
@x0088:
inc ECX;cmp EAX,ECX;jne @x0089
// Зеркало и добавить Nb
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
call SBLen
xor CX,CX;mov DX,'N'
mov [R9+RAX],DX;mov DX,'b'
mov [R9+RAX+2],DX
mov [R9+RAX+4],CX
jmp @xEnd
@x0089:
inc ECX;cmp EAX,ECX;jne @x0090
// Зеркало и добавить Bro
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
call SBLen
xor CX,CX;mov DX,'B'
mov [R9+RAX],DX;mov DX,'r'
mov [R9+RAX+2],DX;mov DX,'o'
mov [R9+RAX+4],DX
mov [R9+RAX+6],CX
jmp @xEnd
@x0090:
inc ECX;cmp EAX,ECX;jne @x0091
// Зеркало и добавить UK
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
call SBLen
xor CX,CX;mov DX,'U'
mov [R9+RAX],DX;mov DX,'K'
mov [R9+RAX+2],DX
mov [R9+RAX+4],CX
jmp @xEnd
@x0091:
inc ECX;cmp EAX,ECX;jne @x0092
// Зеркало и добавить Boss
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
call SBLen
xor CX,CX;mov DX,'B'
mov [R9+RAX],DX;mov DX,'o'
mov [R9+RAX+2],DX;mov DX,'s'
mov [R9+RAX+4],DX
mov [R9+RAX+6],DX
mov [R9+RAX+8],CX
jmp @xEnd
@x0092:
inc ECX;cmp EAX,ECX;jne @x0093
// Зеркало и добавить Bug
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
call SBLen
xor CX,CX;mov DX,'B'
mov [R9+RAX],DX;mov DX,'u'
mov [R9+RAX+2],DX;mov DX,'g'
mov [R9+RAX+4],DX
mov [R9+RAX+6],CX
jmp @xEnd
@x0093:
inc ECX;cmp EAX,ECX;jne @x0094
// Зеркало и добавить 911
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
call SBLen
xor CX,CX;mov DX,'9'
mov [R9+RAX],DX;mov DX,'1'
mov [R9+RAX+2],DX;mov DX,'1'
mov [R9+RAX+4],DX
mov [R9+RAX+6],CX
jmp @xEnd
@x0094:
inc ECX;cmp EAX,ECX;jne @x0095
// Зеркало + инверсия и удалить последнюю.
call MirrAddInv;call RemLS
jmp @xEnd
@x0095:
inc ECX;cmp EAX,ECX;jne @x0096
// Зеркало + инверсия и удалить две последних.
call MirrAddInv;call Rem2LS
jmp @xEnd
@x0096:
inc ECX;cmp EAX,ECX;jne @x0097
// Зеркало + инверсия и удалить первую.
call MirrAddInv;mov AX,1;call DelAXSym
jmp @xEnd
@x0097:
inc ECX;cmp EAX,ECX;jne @x0098
// Зеркало + инверсия и удалить две первых.
call MirrAddInv;mov AX,1;call DelAXSym;mov AX,1;call DelAXSym
jmp @xEnd
@x0098:
inc ECX;cmp EAX,ECX;jne @x0099
// Добавить в начало 1, а в конец 2s.
mov AX,'1';call InsAX
mov RCX,R9;call SBLen
xor CX,CX;mov DX,'2'
mov [R9+RAX],DX;mov DX,'s'
mov [R9+RAX+2],DX
mov [R9+RAX+4],CX
jmp @xEnd
@x0099:
inc ECX;cmp EAX,ECX;jne @x0100
// Добавить в начало и в конец xXx
lea RDX,TempVS
mov AX,'x';mov [RDX],AX;mov [RDX+4],AX
mov AX,'X';mov [RDX+2],AX;mov [RDX+6],0
call InsTempVS;mov RCX,R9;call SBLen
mov DX,'x';mov [R9+RAX],DX;mov [R9+RAX+4],DX
mov DX,'X';mov [R9+RAX+2],DX;mov [R9+RAX+6],0
jmp @xEnd
@x0100:
inc ECX;cmp EAX,ECX;jne @x0101
// Добавить в начало и в конец 7
mov AX,'7';call InsAX
mov AX,'7';jmp PsSym
jmp @xEnd
@x0101:
inc ECX;cmp EAX,ECX;jne @x0102
// Добавить DE_ в начало и удалить последнюю.
lea RDX,TempVS
mov AX,'D';mov [RDX],AX;
mov AX,'E';mov [RDX+2],AX;
mov AX,'_';mov [RDX+4],AX;
mov [RDX+6],0
call InsTempVS;call RemLS
jmp @xEnd
@x0102:
inc ECX;cmp EAX,ECX;jne @x0103
// Инверсия + зеркало и удалить последнюю.
call InvAddMirr;call RemLS
jmp @xEnd
@x0103:
inc ECX;cmp EAX,ECX;jne @x0104
// Инверсия + зеркало и удалить две последних.
call InvAddMirr;call Rem2LS
jmp @xEnd
@x0104:
inc ECX;cmp EAX,ECX;jne @x0105
// Инверсия + зеркало и удалить первую.
call InvAddMirr;mov AX,1;call DelAXSym
jmp @xEnd
@x0105:
inc ECX;cmp EAX,ECX;jne @x0106
// Инверсия + зеркало и удалить две первых.
call InvAddMirr;mov AX,1;call DelAXSym;mov AX,1;call DelAXSym
jmp @xEnd
@x0106:
inc ECX;cmp EAX,ECX;jne @x0107
// Зеркало + зеркало и заменить последнюю на 1.
call Mul2Mirr;mov RCX,R9 ;call SBLen
mov DX,'1';mov [R9+RAX-2],DX
jmp @xEnd
@x0107:
inc ECX;cmp EAX,ECX;jne @x0108
// Зеркало + зеркало и заменить последнюю на 2.
call Mul2Mirr;mov RCX,R9 ;call SBLen
mov DX,'2';mov [R9+RAX-2],DX
jmp @xEnd
@x0108:
inc ECX;cmp EAX,ECX;jne @x0109
// Зеркало + зеркало и заменить последнюю на 3.
call Mul2Mirr;mov RCX,R9 ;call SBLen
mov DX,'3';mov [R9+RAX-2],DX
jmp @xEnd
@x0109:
inc ECX;cmp EAX,ECX;jne @x0110
// Зеркало + зеркало и заменить последнюю на 4.
call Mul2Mirr;mov RCX,R9 ;call SBLen
mov DX,'4';mov [R9+RAX-2],DX
jmp @xEnd
@x0110:
inc ECX;cmp EAX,ECX;jne @x0111
// Зеркало + зеркало и заменить последнюю на 5.
call Mul2Mirr;mov RCX,R9 ;call SBLen
mov DX,'5';mov [R9+RAX-2],DX
jmp @xEnd
@x0111:
inc ECX;cmp EAX,ECX;jne @x0112
// Зеркало + инверсия и заменить последнюю на 1.
call MirrAddInv;mov RCX,R9 ;call SBLen
mov DX,'1';mov [R9+RAX-2],DX
jmp @xEnd
@x0112:
inc ECX;cmp EAX,ECX;jne @x0113
// Зеркало + инверсия и заменить последнюю на 2.
call MirrAddInv;mov RCX,R9 ;call SBLen
mov DX,'2';mov [R9+RAX-2],DX
jmp @xEnd
@x0113:
inc ECX;cmp EAX,ECX;jne @x0114
// Зеркало + инверсия и заменить последнюю на 3.
call MirrAddInv;mov RCX,R9 ;call SBLen
mov DX,'3';mov [R9+RAX-2],DX
jmp @xEnd
@x0114:
inc ECX;cmp EAX,ECX;jne @x0115
// Зеркало + инверсия и заменить последнюю на 4.
call MirrAddInv;mov RCX,R9 ;call SBLen
mov DX,'4';mov [R9+RAX-2],DX
jmp @xEnd
@x0115:
inc ECX;cmp EAX,ECX;jne @x0116
// Зеркало + инверсия и заменить последнюю на 5.
call MirrAddInv;mov RCX,R9 ;call SBLen
mov DX,'5';mov [R9+RAX-2],DX
jmp @xEnd
@x0116:
inc ECX;cmp EAX,ECX;jne @x0117
// Инверсия + инверсия и заменить последнюю на 1.
call Mult2Inv;mov RCX,R9 ;call SBLen
mov DX,'1';mov [R9+RAX-2],DX
jmp @xEnd
@x0117:
inc ECX;cmp EAX,ECX;jne @x0118
// Инверсия + инверсия и заменить последнюю на 2.
call Mult2Inv;mov RCX,R9 ;call SBLen
mov DX,'2';mov [R9+RAX-2],DX
jmp @xEnd
@x0118:
inc ECX;cmp EAX,ECX;jne @x0119
// Инверсия + инверсия и заменить последнюю на 3.
call Mult2Inv;mov RCX,R9 ;call SBLen
mov DX,'3';mov [R9+RAX-2],DX
jmp @xEnd
@x0119:
inc ECX;cmp EAX,ECX;jne @x0120
// Инверсия + инверсия и заменить последнюю на 4.
call Mult2Inv;mov RCX,R9 ;call SBLen
mov DX,'4';mov [R9+RAX-2],DX
jmp @xEnd
@x0120:
inc ECX;cmp EAX,ECX;jne @x0121
// Инверсия + инверсия и заменить последнюю на 5.
call Mult2Inv;mov RCX,R9 ;call SBLen
mov DX,'5';mov [R9+RAX-2],DX
jmp @xEnd
@x0121:
inc ECX;cmp EAX,ECX;jne @x0122
// Инверсия + зеркало и заменить последнюю на 1.
call InvAddMirr;mov RCX,R9 ;call SBLen
mov DX,'1';mov [R9+RAX-2],DX
jmp @xEnd
@x0122:
inc ECX;cmp EAX,ECX;jne @x0123
// Инверсия + зеркало и заменить последнюю на 2.
call InvAddMirr;mov RCX,R9 ;call SBLen
mov DX,'2';mov [R9+RAX-2],DX
jmp @xEnd
@x0123:
inc ECX;cmp EAX,ECX;jne @x0124
// Инверсия + зеркало и заменить последнюю на 3.
call InvAddMirr;mov RCX,R9 ;call SBLen
mov DX,'3';mov [R9+RAX-2],DX
jmp @xEnd
@x0124:
inc ECX;cmp EAX,ECX;jne @x0125
// Инверсия + зеркало и заменить последнюю на 4.
call InvAddMirr;mov RCX,R9 ;call SBLen
mov DX,'4';mov [R9+RAX-2],DX
jmp @xEnd
@x0125:
inc ECX;cmp EAX,ECX;jne @x0126
// Инверсия + зеркало и заменить последнюю на 5.
call InvAddMirr;mov RCX,R9 ;call SBLen
mov DX,'5';mov [R9+RAX-2],DX
jmp @xEnd
@x0126:
inc ECX;cmp EAX,ECX;jne @x0127
// Инвертировать и поменять чётные с нечётными местами.
push R9;xor ECX,ECX;mov EDX,5;xor R8,R8;call BMA;pop R9
push R9;xor ECX,ECX;mov EDX,1;xor R8,R8;call BMA;pop R9
jmp @xEnd
@x0127:
inc ECX;cmp EAX,ECX;jne @xEnd
// Отзеркалить и поменять чётные с нечётными местами.
push R9;xor ECX,ECX;mov EDX,2;xor R8,R8;call BMA;pop R9
push R9;xor ECX,ECX;mov EDX,1;xor R8,R8;call BMA;pop R9
@xEnd: // Ошибка.
pop R9;pop RSI;pop RDI;pop RBP
end;

const
DefaultPassChars:packed array[0..75]of WideChar=(
'!','#','$','%','&','(',')','+',',','-','.','0','1','2','3','4','5','6','7','8',
'9',':',';','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q',
'R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',#0);
var
isOpened:bool=False;
NumAll:dword=0; // Общее количество адресов.
NumCur:dword=0; // Текущий адрес.
DPasswordLength:dword;
DPasswordChars:packed array[0..127]of WideChar;
DFileName:packed array[0..4095]of WideChar;


function GeneratePassword(MinLength,MaxLength:dword;var PassStr:array of WideChar):dword;stdcall;
asm
{ RCX - Минимальная длина пароля.
RDX - Максимальная длина пароля.
********************************
-> RCX - Длина пароля.}
push RBP;push R9
xor RAX,RAX;test ECX,ECX;jz @YeZZ;test EDX,EDX;jnz @NoZZ
@YeZZ:jmp @EEnd;@NoZZ:cmp EDX,64;jle @Bel64;jmp @EEnd
@Bel64:cmp ECX,EDX;je @IsEQ;jl @IsBe;jmp @EEnd
@IsBe:push RCX;xchg RCX,RDX;inc RCX;sub RCX,RDX
call DRnd1;pop RCX;add RCX,RAX
@IsEQ: // В (RCX) получили готовое значение длины пароля, теперь сама генерация.
push RCX;mov R9W,CX;@LoopGen:
mov ECX,DPasswordLength // Содержит длину набора символов для пароля.
call DRnd1;shl RAX,1
lea RDX,DPasswordChars // Указатель на набор допустимых символов для пароля.
add RDX,RAX;mov AX,word ptr[RDX];mov word ptr[R8],AX
inc R8;inc R8;dec R9W;test R9W,R9W;jnz @LoopGen
xor AX,AX;mov word ptr[R8],AX;pop RAX
@EEnd:pop R9;pop RBP
end;

function GetEnabledMailSym:PWideChar;
begin
Result:=nil;
end;
function GetEnabledNickSym:PWideChar;
begin
Result:=nil;
end;
function SetEnabledMailSym(const Syms:PWideChar):bool;
begin
Result:=False;
end;
function SetEnabledNickSym(const Syms:PWideChar):bool;
begin
Result:=False;
end;

function GetEnabledPasswordSym:PWideChar;
begin Result:=DPasswordChars end;

function SetEnabledPasswordSym(const Syms:PWideChar):bool;
begin
Result:=False;
if lstrLenW(Syms)>127 then exit;
if lstrLenW(Syms)<26 then exit else Result:=True;
FillChar(DPasswordChars,SizeOf(DPasswordChars),0);
lstrCpyW(DPasswordChars,Syms);
DPasswordLength:=lstrLenW(DPasswordChars);
end;

const
FemaleNamesMax=449;MaleNamesMax=612;FamArrayMax=254;
RuFemaleNamesMax=135;RuMaleNamesMax=292;RuFamArrayMax=251;
MaxNNN=146;

EngMaleEnd:PWideChar=nil;
EngFemaleEnd:PWideChar=nil;
RuMaleEnd:PWideChar=nil;
RuFemaleEnd:PWideChar='а';

FemaleNamesArray:array[0..448]of PWideChar=(
'Abbey','Abbie','Abigail','Ada','Adelaide','Adele','Adrienne','Agatha','Agnes','Aileen','Alana','Alex','Alexandra','Alice','Alina','Alison','Alma','Amanda','Amber','Amelia',
'Amy','Andrea','Angela','Ann','Annabelle','Anne','Anthea','April','Arlene','Ashley','Audrey','Ava','Avril','Babs','Barbara','Bea','Beatrix','Becky','Belinda','Bella',
'Bernice','Berry','Bertha','Beryl','Bess','Bet','Beth','Bethany','Betsy','Betty','Beverly','Blanche','Bobbie','Bonnie','Brenda','Brianne','Bridget','Britney','Brittany','Brooke',
'Camilla','Candice','Cara','Carissa','Carla','Carly','Carmel','Carol','Caroline','Carrie','Cass','Catherine','Cathy','Charis','Charity','Charlene','Charlie','Charlotte','Chelsea','Cherida',
'Cherish','Cheryl','Chloe','Christina','Christine','Clara','Clare','Clarissa','Claudia','Connie','Courtney','Cynthia','Daisy','Darlene','Davida','Dawn','Deborah','Dee','Deirdre','Delia',
'Dena','Diana','Dina','Dolly','Donna','Dora','Doreen','Doris','Dorothy','Ebony','Edith','Edna','Edwina','Effie','Elaine','Eleanor','Elena','Elinor','Eliza','Elizabeth',
'Ella','Ellen','Ellie','Elsa','Emily','Emma','Emmy','Enola','Erin','Esta','Estelle','Ethel','Eudora','Eugenia','Eunice','Eve','Evelyn','Evette','Evie','Evonne',
'Faith','Fanny','Fay','Faye','Felicity','Fern','Flo','Flora','Florence','Florrie','Fran','Frances','Freda','Gail','Gale','Gayle','Gaynor','Georgia','Georgiana','Geraldine',
'ermaine','Gertrude','Gill','Gillian','Gloria','Glynis','Grace','Gracie','Gretta','Guinevere','Haley','Harriet','Hattie','Hayley','Hazel','Heather','Helen','Henrietta','Hettie','Hilary',
'Hilda','Hollie','Holly','Honey','Hope','Hyacinth','Ida','Imogen','Iole','Irene','Iris','Isabel','Isabella','Isabelle','Ivy','Jackie','Jacqueline','Jade','Jane','Janet',
'Janette','Janice','Jasmine','Jay','Jean','Jeane','Jennet','Jennifer','Jenny','Jess','Jessica','Jessie','Jewel','Jill','Joan','Jodie','Josephine','Joy','Joyce','Judy',
'Juliet','June','Justine','Kaley','Kate','Katherine','Katie','Katy','Kay','Kayla','Kayley','Keeley','Kelly','Kendra','Kerena','Kerry','Kim','Kimberley','Kitty','Kyla',
'Kyle','Kylie','Lacey','Lana','Laura','Lauren','Leanne','Lee','Lena','Leona','Lesley','Lexi','Lexy','Libby','Lilian','Lilly','Lily','Linda','Linda','Lindsay',
'Lindy','Linette','Liona','Lisa','Livia','Liz','Liza','Lizzie','Lola','Loretta','orraine','Lottie','Louise','Lucy','Lynette','Lynn','Mabel','Madeline','Madge','Madonna',
'Maggie','Maggie','Malvina','Mandy','Mara','Marcia','Margaret','Marice','Marilyn','Mary','Maud','Maura','Maureen','Mavis','Maxine','May','Maya','Meg','Melanie','Melinda',
'Melissa','Melody','Mercy','Merle','Mildred','Millicent','Millie','Minnie','Mirabelle','Miranda','Misty','Molly','Mona','Monica','Muriel','Myra','Myrtle','Nadia','Nancy','Nell',
'Nerissa','Nessa','Nicola','Nita','Nora','Noreen','Norma','Octavia','Olive','Olivia','Opal','Pamela','Pandora','Pansy','Patience','Patricia','Patsy','Paula','Pearl','Peggy',
'Penelope','Petra','Petula','Philippa','Philomena','Phoebe','Phyllis','Pippa','Polly','Poppy','Primrose','Prudence','Prunella','Queenie','Rachel','Raine','Reanna','Reenie','Regina','Rhoda',
'Rikki','Rina','Rita','Robin','Ronnie','Rosalind','Roseanne','Rose','Rosemary','Rosie','Rowena','Roxanne','Ruby','Sabella','Sabrina','Sadie','Sally','Samantha','Sandra','Sandy',
'Sapphire','Scarlett','Selena','Shannah','Shannon','Sharon','Sheila','Shirley','Silver','Sissy','Skye','Sue','Summer','Susan','Sybil','Sylvia','Tammy','Tamsin','Tansy','Tara',
'Tasha','Tawny','Teri','Tessa','Thelma','Tiffany','Tilda','Tori','Tracy','Trina','Trisha','Trixie','Trudy','Unity','Ursa','Ursula','Val','Valda','Valene','Valerie',
'Vanessa','Velma','Vera','Verity','Verona','Vicky','Victoria','Viola','Violet','Virginia','Vita','Vivian','Wanda','Wendy','Whitney','Willa','Willow','Wilona','Winifred','Wynne',
'Xenia','Xenthe','Yasmin','Yolanda','Zanna','Zelda','Zelene','Zera','Zoe');

MaleNamesArray:array[0..611]of PWideChar=(
'Abbott','Abe','Addison','Adrian','Aiken','Ainsley','Al','Alan','Alaric','Alban','Albert','Albion','Aldrich','Alec','Alex','Alexander','Alexis','Alf','Alfie','Alfred',
'Alger','Algernon','Alick','Allan','Allen','Alton','Alvin','Ambrose','Andrew','Andy','Anthony','Archer','Armstrong','Arnold','Ashley','Aston','Atwater','Aubrey','Austin','Avery',
'Bailey','Baldwin','Barclay','Barrett','Barnaby','Bartholomew','Barton','Basil','Baxter','Baz','Benedict','Benjamin','Bennett','Benson','Bentley','Berkley','Bernard','Bert','Bill','Blake',
'Bob','Bobby','Bond','Brad','Bradley','Brent','Bret','Brewster','Brian','Brigham','Brooke','Bruce','Bruno','Bryant','Buck','Bud','Burgess','Burton','Byron','Cade',
'Caesar','Caldwell','Calvert','Calvin','Carl','Carlton','Carter','Carver','Cary','Casey','Cassian','Cecil','Cedric','Chad','Chandler','Chapman','Charles','Charlie','Charlton','Chase',
'Chester','Chris','Christian','Christopher','Chuck','Clarence','Claude','Clay','Clayton','Clement','Cliff','Clifford','Clifton','Clive','Clyde','Cole','Coleman','Colin','Conrad','Constant',
'Conway','Corwin','Courtney','Craig','Crispin','Crosby','Curtis','Cuthbert','Cyril','Dale','Daley','Dalton','Damian','Damon','Dane','Daniel','Danny','Darcy','Darell','Darren',
'Davy','Dean','Del','Den','Dennis','Dene','Denton','Denzil','Derek','Derick','Des','Desmond','Dexter','Digby','Dominic','Don','Donald','Doran','Dorian','Doug',
'Douglas','Doyle','Drogo','Drake','Dudley','Duncan','Dunstan','Dustin','Duggie','Dwayne','Dwight','Earl','Ebenezer','Ed','Eddie','Eden','Edgar','Edric','Edmond','Edwin',
'Egbert','Elbert','Eldon','Ellis','Elmer','Elliot','Elton','Ellery','Elmer','Elton','Elvis','Emerson','Emmett','Erasmus','Eric','Ernest','Errol','Esmond','Eugene','Everett',
'Fabian','Fenton','Ferdinand','Ferris','Fletcher','Floyd','Ford','Forrest','Francis','Franklin','Fred','Freddie','Frank','Frederick','Freeman','Garfield','Garrison','Gary','Gardner','Garret',
'Garrick','Garth','Gavin','Gaylord','Gene','George','Ged','Geoffrey','Gerard','Gerald','Georgie','Gerry','Gilbert','Giles','Ginger','Glen','Goddard','Godfrey','Godwin','Goodwin',
'Graham','Grant','Granville','Greg','Grayson','Gregory','Greville','Gresham','Grover','Gyles','Guy','Hadden','Hadley','Hadwin','Halbert','Hale','Halsey','Hannibal','Hanley','Happy',
'Harding','Harlan','Harley','Harry','Harper','Harold','Harrison','Hartley','Harvey','Heath','Hector','Hedley','Henry','Herb','Herbert','Herman','Hilary','Homer','Hopkin','Horace',
'Horati','Howard','Howell','Hubert','Hugh','Hughie','Humbert','Humphrey','Hunter','Ike','Ingram','Irving','Isaiah','Ivor','Jack','Jackie','Jackson','Jacob','Jake','Jamie',
'James','Jarvis','Jason','Jasper','Jed','Jeff','Jeffrey','Jefferson','Jenson','Jeremy','Jermaine','Jerome','Jerrard','Jerrold','Jerry','Jesse','Jethro','Jim','Jimmy','Joe',
'Jody','Joey','John','Johnathan','Johnny','Jordan','Joseph','Josh','Judd','Jude','Julian','Justin','Keith','Kelly','Kelsey','Kelvin','Kemp','Ken','Kendrick','Kenelm',
'Kennard','Kenneth','Kent','Kenton','Kermit','Kerr','Kerry','Kevin','King','Kingsley','Kit','Kyran','Lacey','Lambert','Lance','Lancelot','Larry','Laurel','Laurence','Lawrence',
'Lee','Leighton','Leland','Len','Lennard','Lenny','Leo','Leon','Leonard','Leopold','Leroy','Les','Lesley','Lester','Lewie','Lex','Lincoln','Linden','Lindon','Linsay',
'Linford','Linton','Lionel','Lonnie','Lorne','Louie','Lovell','Lucas','Ludo','Luke','Luther','Lyndon','Lyle','Magnus','Malcolm','Mallory','Manfred','Manley','Marc','Marian',
'Mark','Marlon','Marmaduke','Marsh','Marshall','Martin','Marty','Marvin','Mason','Matt','Matthew','Maurice','Max','Maxwell','Maynard','Mel','Melville','Melvin','Melvin','Merlin',
'Michael','Mick','Mike','Milburn','Miles','Milo','Milton','Monroe','Montague','Montgomery','Monty','Morris','Mortimer','Morton','Nathaniel','Neal','Ned','Neil','Nelson','Neville',
'Nicholas','Nigel','Noah','Norman','Norris','Obadiah','Oliver','Ollie','Omar','Orson','Orville','Osbert','Oscar','Osmond','Oswald','Otis','Paddy','Pancras','Pat','Patrick',
'Paul','Pearce','Perce','Percival','Percy','Perry','Peter','Phil','Philbert','Philip','Philo','Pierce','Piers','Quentin','Quincy','Quinn','Quintus','Rafe','Ralph','Randall',
'Randolph','Randy','Raphael','Ray','Raymond','Reg','Reggie','Reginald','Reid','Remus','Renfred','Rex','Reynard','Rich','Richard','Richie','Ridley','Riley','Robert','Robin',
'Rocky','Rod','Roderick','Rodney','Roger','Roland','Rolf','Roly','Ronald','Ronnie','Ross','Rowan','Rowley','Roy','Royle','Rufus','Rupert','Russ','Russell','Rusty',
'Ryan','Samson','Samuel','Sandford','Sandy','Sanford','Scott','Sebastian','Selwyn','Seymour','Shane','Shaun','Shawn','Sheldon','Shelley','Sidney','Sigmund','Sylvester','Simon','Sinclair',
'Skipper','Spencer','Spike','Stacy','Stan','Stanley','Stephan','Stephen','Sterling','Stewart','Stuart','Tad','Taylor','Ted','Teddy','Terence','Terry','Theo','Theobold','Theodore',
'Theo','Thomas','Timothy','Toby','Todd','Tom','Tommy','Tony','Travis','Tristan','Tristram','Troy','Truman','Tyler','Tyrone','Ulric','Urban','Valentine','Vere','Vergil',
'Vernon','Victor','Vince','Vincent','Virgil','Waally','Wade','Waldo','Wallace','Walter','Ward','Warren','Warwick','Watkin','Wayne','Webster','Wesley','Wilberforce','Wilbur','Wilfrid',
'Will','Willard','William','Wilmot','Windsor','Winston','Winthrop','Winton','Woody','Zach','Zachary','Zeph');

FamArray:array[0..253]of PWideChar=(
'Abramson','Adamson','Adderiy','Addington','Adrian','Albertson','Aldridge','Allford','Alsopp','Anderson','Andrews','Archibald','Arnold','Arthurs','Atcheson','Attwood','Audley','Austin','Ayrton','Babcock',
'Backer','Baldwin','Bargeman','Barnes','Barrington','Bawerman','Becker','Benson','Berrington','Birch','Bishop','Black','Blare','Blomfield','Boolman','Bootman','Bosworth','Bradberry','Bradshaw','Brickman',
'Brooks','Brown','Bush','Calhoun','Campbell','Carey','Carrington','Carroll','Carter','Chandter','Chapman','Charlson','Chesterton','Clapton','Clifford','Coleman','Conors','Cook','Cramer','Creighton',
'Croftoon','Crossman','Daniels','Davidson','Day','Dean','Derrick','Dickinson','Dodson','Donaldson','Donovan','Douglas','Dowman','Dutton','Duncan','Dunce','Durham','Dyson','Eddington','Edwards',
'Ellington','Elmers','Enderson','Erickson','Evans','Faber','Fane','Farmer','Farrell','Ferguson','Finch','Fisher','Fitzgerald','Flannagan','Flatcher','Fleming','Ford','Forman','Forster','Foster',
'Francis','Fraser','Freeman','Fulton','Galbraith','Gardner','Garrison','Gate','Gerald','Gibbs','Gilbert','Gill','Gilmore','Gilson','Gimson','Goldman','Goodman','Gustman','Haig','Hailey',
'Hamphrey','Hancock','Hardman','Harrison','Hawkins','Higgins','Hodges','Hoggarth','Holiday','Holmes','Howard','Jacobson','James','Jeff','Jenkin','Jerome','Johnson','Jones','Keat','Kelly',
'Kendal','Kennedy','Kennett','Kingsman','Kirk','Laird','Lamberts','Larkins','Lawman','Leapman','Leman','Lewin','Little','Livingston','Longman','MacAdam','MacAlister','MacDonald','Macduff','Macey',
'Mackenzie','Mansfield','Marlow','Marshman','Mason','Mathews','Mercer','Michaelson','Miers','Miller','Miln','Milton','Molligan','Morrison','Murphy','Nash','Nathan','Neal','Nelson','Nevill',
'Nicholson','Nyman','Oakman','Ogden','Oldman','Oldridge','Oliver','Osborne','Oswald','Otis','Owen','Page','Palmer','Parkinson','Parson','Pass','Paterson','Peacock','Pearcy','Peterson',
'Philips','Porter','Quincy','Raleigh','Ralphs','Ramacey','Reynolds','Richards','Roberts','Roger','Russel','Ryder','Salisburry','Salomon','Samuels','Saunder','Shackley','Sheldon','Sherlock','Shorter',
'Simon','Simpson','Smith','Stanley','Stephen','Stevenson','Sykes','Taft','Taylor','Thomson','Thorndike','Thornton','Timmons','Tracey','Turner','Vance','Vaughan','Wainwright','Walkman','Wallace',
'Waller','Walter','Ward','Warren','Watson','Wayne','Webster','Wesley','White','Wilkinson',
'Winter','Wood','Youmans','Young');

RuFemaleNamesArray:array[0..134]of PWideChar=(
'Авдотья','Агафья','Аглая','Агнесса','Аграфена','Агрипина','Аделаида','Аксинья','Акулина','Александра','Александрина','Алена','Алина','Алиса','Алла','Альбина','Альма','Анастасия','Анжела','Анжелина',
'Анна','Антонина','Антония','Анфиса','Аполлинария','Арина','Ася','Афанасия','Барбара','Болеслава','Борислава','Бронислава','Валентина','Валерия','Варвара','Василиса','Вера','Вероника','Виктория','Гавриила',
'Гала','Галина','Глафира','Груша','Гуля','Дарья','Дуня','Ева','Евгения','Евдокия','Евпраксия','Екатерина','Елена','Елизавета','Есфирь','Ефимия','Ефросинья','Жанна','Заря','Зинаида',
'Зоя','Инна','Иоланта','Ирина','Исидора','Капека','Карина','Катерина','Кира','Клавдия','Клара','Ксения','Лана','Лариса','Лидия','Лиза','Лизавета','Любовь','Людмила','Магдалина',
'Маня','Маргарита','Марианна','Марина','Мария','Марфа','Марья','Марьямна','Матрона','Маша','Надежда','Найда','Настасья','Наталия','Ника','Нина','Нинель','Нона','Нонна','Оксана',
'Ольга','Пелагея','Полина','Прасковья','Рада','Радинка','Раиса','Раиса','Римма','Роза','Роксана','Руфина','Светлана','Серафима','Серафима','Слава','София','Софья','Стася','Сюзанна',
'Таисия','Тамара','Татьяна','Таша','Ульяна','Устинья','Фаина','Фёкла','Феодора','Филиппа','Шура','Юлиана','Юлия','Юстина','Ярослава');

RuMaleNamesArray:array[0..291]of PWideChar=(
'Август','Авдей','Аверкий','Аверьян','Авксентий','Автоном','Агап','Агафон','Аггей','Адам','Адриан','Азарий','Александр','Алексей','Амвросий','Амос','Ананий','Анатолий','Андрей','Андриан',
'Андрон','Андроник','Аникей','Аникита','Анисим','Антип','Аполлинарий','Аполлон','Арефий','Аристарх','Аркадий','Арсений','Артем','Артемий','Архип','Аскольд','Афанасий','Афиноген','Бажен','Богдан',
'Болеслав','Борис','Борислав','Боян','Бронислав','Вадим','Валентин','Валерий','Валерьян','Варфоломей','Василий','Вацлав','Венедикт','Вениамин','Викентий','Виктор','Викторин','Виссарион','Виталий','Владимир',
'Владислав','Влас','Всеволод','Вячеслав','Гавриил','Гаврила','Галактион','Гедеон','Геннадий','Георгий','Герасим','Герман','Глеб','Гордей','Григорий','Гурий','Давид','Давыд','Даниил','Данила',
'Дементий','Демид','Демьян','Денис','Дмитрий','Дорофей','Евгений','Евграф','Евдоким','Евлампий','Евсей','Евстафий','Евстигней','Егор','Елизар','Елисей','Емельян','Епифан','Еремей','Ермил',
'Ермолай','Ерофей','Ефим','Ефрем','Захар','Зиновий','Зосим','Иван','Игнатий','Игорь','Измаил','Изот','Изяслав','Илларион','Илья','Иннокентий','Иосиф','Ипат','Ипатий','Ипполит',
'Ираклий','Исай','Исидор','Казимир','Каллистрат','Капитон','Карл','Карп','Касьян','Ким','Кир','Кирилл','Клавдий','Клементий','Клим','Климент','Кондрат','Кондратий','Константин','Корней',
'Корнил','Корнилий','Кузьма','Лавр','Лаврентий','Ладислав','Лазарь','Лев','Леон','Леонид','Леонтий','Лонгин','Лука','Лукьян','Лучезар','Любомир','Макар','Максим','Максимильян','Мариан','Марк',
'Мартын','Матвей','Мефодий','Мечислав','Милан','Милен','Мина','Мир','Мирон','Мирослав','Митрофан','Михаил','Михей','Модест','Моисей','Мокий','Мстислав','Назар','Натан','Наум',
'Нестор','Никандр','Никанор','Никита','Никифор','Никодим','Николай','Никон','Нифонт','Олег','Олимпий','Онисим','Онуфрий','Орест','Осип','Остап','Павел','Панкрат','Пантелеймон','Парамон',
'Парфем','Пахом','Петр','Пимен','Платон','Поликарп','Порфирий','Потап','Прокл','Прохор','Радим','Ратибор','Ратмир','Родион','Роман','Ростислав','Рубен','Руслан','Рюрик','Савва',
'Савватий','Савелий','Самсон','Самуил','Светозар','Святослав','Севастьян','Селиван','Семен','Серафим','Сергей','Сидор','Сила','Сильвестр','Симон','Сократ','Соломон','Софрон','Спартак','Спиридон',
'Станимир','Станислав','Степан','Стоян','Тарас','Твердислав','Творимир','Терентий','Тимофей','Тимур','Тит','Тихон','Трифон','Трофим','Ульян','Устин','Фаддей','Федор','Федосий','Федот',
'Феликс','Феоктист','Феофан','Ферапонт','Филарет','Филимон','Филипп','Флорентин','Фока','Фома','Фортунат','Фотий','Фрол','Харитон','Харлампий','Христофор','Чеслав','Эдуард','Эмиль','Эммануил',
'Эраст','Эрнест','Эрнст','Юлиан','Юлий','Юрий','Яков','Якуб','Ян','Януарий','Ярослав');

RuFamArray:array[0..250]of PWideChar=(
'Смирнов','Иванов','Кузнецов','Попов','Соколов','Лебедев','Козлов','Новиков','Морозов','Петров','Волков','Соловьёв','Васильев','Зайцев','Павлов','Семёнов','Голубев','Виноградов','Богданов','Воробьёв',
'Фёдоров','Михайлов','Беляев','Тарасов','Белов','Комаров','Орлов','Киселёв','Макаров','Андреев','Ковалёв','Ильин','Гусев','Титов','Кузьмин','Кудрявцев','Баранов','Куликов','Алексеев','Степанов',
'Яковлев','Сорокин','Сергеев','Романов','Захаров','Борисов','Королёв','Герасимов','Пономарёв','Григорьев','Лазарев','Медведев','Ершов','Никитин','Соболев','Рябов','Поляков','Цветков','Данилов','Жуков',
'Фролов','Журавлёв','Николаев','Крылов','Максимов','Сидоров','Осипов','Белоусов','Федотов','Дорофеев','Егоров','Матвеев','Бобров','Дмитриев','Калинин','Анисимов','Петухов','Антонов','Тимофеев','Никифоров',
'Веселов','Филиппов','Марков','Большаков','Суханов','Миронов','Ширяев','Александров','Коновалов','Шестаков','Казаков','Ефимов','Денисов','Громов','Фомин','Давыдов','Мельников','Щербаков','Блинов','Колесников',
'Карпов','Афанасьев','Власов','Маслов','Исаков','Тихонов','Аксёнов','Гаврилов','Родионов','Котов','Горбунов','Кудряшов','Быков','Зуев','Третьяков','Савельев','Панов','Рыбаков','Суворов','Абрамов',
'Воронов','Мухин','Архипов','Трофимов','Мартынов','Емельянов','Горшков','Чернов','Овчинников','Селезнёв','Панфилов','Копылов','Михеев','Галкин','Назаров','Лобанов','Лукин','Беляков','Потапов','Некрасов',
'Хохлов','Жданов','Наумов','Шилов','Воронцов','Ермаков','Дроздов','Игнатьев','Савин','Логинов','Сафонов','Капустин','Кириллов','Моисеев','Елисеев','Кошелев','Костин','Горбачёв','Орехов','Ефремов',
'Исаев','Евдокимов','Калашников','Кабанов','Носков','Юдин','Кулагин','Лапин','Прохоров','Нестеров','Харитонов','Агафонов','Муравьёв','Ларионов','Федосеев','Зимин','Пахомов','Шубин','Игнатов','Филатов',
'Крюков','Рогов','Кулаков','Терентьев','Молчанов','Владимиров','Артемьев','Гурьев','Зиновьев','Гришин','Кононов','Дементьев','Ситников','Симонов','Мишин','Фадеев','Комиссаров','Мамонтов','Носов','Гуляев',
'Шаров','Устинов','Вишняков','Eвсеев','Лаврентьев','Брагин','Константинов','Корнилов','Авдеев','Зыков','Бирюков','Шарапов','Никонов','Щукин','Дьячков','Одинцов','Сазонов','Якушев','Красильников','Гордеев',
'Самойлов','Князев','Беспалов','Уваров','Шашков','Бобылёв','Доронин','Белозёров','Рожков','Самсонов','Мясников','Лихачёв','Буров','Сысоев','Фомичёв','Русаков','Стрелков','Гущин','Тетерин','Колобов',
'Субботин','Фокин','Блохин','Селиверстов','Пестов','Кондратьев','Силин','Меркушев','Лыткин','Туров','Иванков');

ENNN:array[0..145]of PWideChar=(
'1st','2nd','Amaryllis','Anemone','Asphodel','Aurora','BeautyFull','Behaviour','BestFriend','Betrayal',
'BigBoss','Black','BlackMagic','Blossom','Blue','Bobolink','Bounty','BrightFire','Brown','Bumblebee',
'Butterfly','Camellia','Cerulean','Chalice','Child','Chimes','Conseq','Const','Dairy','Daisy',
'Damask','Dark','Dawn','Delicacy','Demure','Desire','Destiny','****','Dissembl','Dumb',
'Eloquence','Epiphany','EterLove','Eterni','Fabul','Fagot','Faith','Fantast','FavorCharm','Fawn',
'Fire','Flower','Fool','Freedom','Freedom','FreshWind','Galaxy','Galaxy','Golden','GoldSam',
'Gorgeous','Gossamer','Grace','Grey','Guilt','Halcyon','HappyDay','Hilarious','Hush','Infinity',
'Innuendo','Insat','Inspir','IronMan','JollyJam','Jonquil','JungleCh','Kiddy','KingSize','Liberty',
'Light','Lilly','Little','Lol','Love','Lullaby','Luminous','LunarQuest','Magnif','MainHouse',
'Marigold','Meadow','Melody','Mignonette','MilkyWay','Mist','Murmuring','Myrrh','Naive','Nigella',
'Night','Northstar','NumberOne','Oblivion','Oleander','Orange','Oriole','Passion','Passion','Peach',
'Perfect','Piebald','Popper','Pronun','Pure','Recon','Rosemary','Sadness','Sempit','Small',
'Smile','Snow','Snowflake','Solitude','SpaceRacer','Steel','Success','Summer','Summon','SunnySmile',
'Sunshine','Super','Sweet','Tendril','Thrush','Tranq','Tranquil','Twinkling','Unbel','White',
'WhiteAngel','Winter','WinterDay','Wonder','Xonix','Yellow');
ResN:array[0..145]of PWideChar=(
'1st','2nd','Amaryllis','Anemone','Asphodel','Aurora','BeautyFull','Behaviour','BestFriend','Betrayal',
'BigBoss','Black','BlackMagic','Blossom','Blue','Bobolink','Bounty','BrightFire','Brown','Bumblebee',
'Butterfly','Camellia','Cerulean','Chalice','Child','Chimes','Conseq','Const','Dairy','Daisy',
'Damask','Dark','Dawn','Delicacy','Demure','Desire','Destiny','****','Dissembl','Dumb',
'Eloquence','Epiphany','EterLove','Eterni','Fabul','Fagot','Faith','Fantast','FavorCharm','Fawn',
'Fire','Flower','Fool','Freedom','Freedom','FreshWind','Galaxy','Galaxy','Golden','GoldSam',
'Gorgeous','Gossamer','Grace','Grey','Guilt','Halcyon','HappyDay','Hilarious','Hush','Infinity',
'Innuendo','Insat','Inspir','IronMan','JollyJam','Jonquil','JungleCh','Kiddy','KingSize','Liberty',
'Light','Lilly','Little','Lol','Love','Lullaby','Luminous','LunarQuest','Magnif','MainHouse',
'Marigold','Meadow','Melody','Mignonette','MilkyWay','Mist','Murmuring','Myrrh','Naive','Nigella',
'Night','Northstar','NumberOne','Oblivion','Oleander','Orange','Oriole','Passion','Passion','Peach',
'Perfect','Piebald','Popper','Pronun','Pure','Recon','Rosemary','Sadness','Sempit','Small',
'Smile','Snow','Snowflake','Solitude','SpaceRacer','Steel','Success','Summer','Summon','SunnySmile',
'Sunshine','Super','Sweet','Tendril','Thrush','Tranq','Tranquil','Twinkling','Unbel','White',
'WhiteAngel','Winter','WinterDay','Wonder','Xonix','Yellow');

var
fIsCreated:bool=False;
fIsOpened:bool=False;
FileHandle:tHandle=0;
GenParams:TDGenParams;

procedure InitVars;var x,y:dword;
begin
for x:=0 to 145 do begin y:=SLen(ResN[x]);if y<5 then Continue end;
DMinYear:=1900;DMaxYear:=2027;
DMinPassLn:=8;DMaxPassLn:=MaxPassCb div 2;
FillChar(DFileName,SizeOf(DFileName),0);
lstrCpyW(DPasswordChars,DefaultPassChars);
DPasswordLength:=lstrLenW(DPasswordChars);
DRndSet;
end;


function InitGenerator(FName:PWideChar):bool;var NWD:dword;
begin
Result:=False;
if lstrLenW(FName)=0 then exit;
CloseGenerator;
FileHandle:=CreateFile(FName,GENERIC_READ or GENERIC_WRITE,0,nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_RANDOM_ACCESS,0);
if(FileHandle=0)or(FileHandle=INVALID_HANDLE_VALUE)then exit;
FillChar(GenParams,SizeOf(GenParams),0);
GenParams.Header[0]:=#68;GenParams.Header[1]:=#65;GenParams.Header[2]:=#65;GenParams.Header[3]:=#49;
GenParams.cbSize:=SizeOf(GenParams);
GenParams.Flags:=DDefaultFlags;
GenParams.SizeElement:=SizeOf(GenParams);
GenParams.NumElements:=0;
WriteFile(FileHandle,GenParams,SizeOf(TDGenParams),NWD,nil);
if NWD<SizeOf(GenParams)then begin CloseGenerator;exit end else Result:=True;
fIsCreated:=True;fIsOpened:=False;
end;

function OpenGenerator(FName:PWideChar):bool;var NWD:dword;
begin
Result:=False;
if lstrLenW(FName)=0 then exit;
CloseGenerator;
FileHandle:=CreateFile(FName,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_RANDOM_ACCESS,0);
if(FileHandle=0)or(FileHandle=INVALID_HANDLE_VALUE)then exit;
if GetFileSize(FileHandle,nil)<SizeOf(GenParams)then begin CloseGenerator;exit end;

ReadFile(FileHandle,GenParams,SizeOf(TDGenParams),NWD,nil);
if NWD<SizeOf(GenParams)then begin CloseGenerator;exit end else Result:=True;
end;
function GetFieldsCount:dword;var z:dword;
begin
Result:=0;
if(FileHandle=0)or(FileHandle=INVALID_HANDLE_VALUE)then exit;
SetFilePointer(FileHandle,0,nil,FILE_BEGIN);
ReadFile(FileHandle,GenParams,SizeOf(TDGenParams),z,nil);
if z<SizeOf(TDGenParams)then exit;
Result:=GenParams.NumElements
end;
function CloseGenerator:bool;
begin
Result:=False;
fIsCreated:=False;fIsOpened:=False;
if(FileHandle<>0)and(FileHandle<>INVALID_HANDLE_VALUE)then
begin FlushFileBuffers(FileHandle);CloseHandle(FileHandle);FileHandle:=0;Result:=True end;
end;

const
One64:UInt64=$FFFFFFFFFFFFFFFF;
var gYear,gMonth,gDay,gMinY,gMaxY:dword;gDate:word;
gEngM,gEngF,gRuM,gRuF,gEngFam,gRuFam,gMods,gENNN:dword;
gMem:pointer;
gMemUI:UInt64 absolute gMem;
gEls:PDElements absolute gMem;
tgMem:pointer;
tgMemUI:UInt64 absolute tgMem;
tgEls:PDElements absolute tgMem;
gLL:tHandle;

procedure AddDate(var Value:UInt64;aDate:word);stdcall;
asm
movzx RDX,DX
shl RDX,48
add [RCX],RDX
end;
function FGenDate:dword;stdcall;
asm
push RCX;push RDX;push R8;push RBP
mov CX,12;movzx RCX,CX;call DRnd1;inc RAX;lea RDX,gMonth;mov [RDX],EAX
cmp EAX,2;je @d28;cmp EAX,4;je @d30;cmp EAX,6;je @d30
cmp EAX,9;je @d30;cmp EAX,11;je @d30;mov CX,31;jmp @dGm
@d28:mov CX,28;jmp @dGm;@d30:mov CX,30;@dGm:
movzx RCX,CX;call DRnd1;inc RAX;lea RDX,gDay;mov [RDX],EAX
mov EDX,gMinY;mov EAX,gMaxY;sub EAX,EDX;inc EAX;mov RCX,RAX;call DRnd1
add EAX,gMinY;lea RDX,gYear;mov [RDX],EAX;mov ECX,gDay;mov EDX,gMonth
mov R8D,gYear;lea R9D,gDate;call DPackDate;mov AX,gDate;movzx RAX,AX
pop RBP;pop R8;pop RDX;pop RCX
end;

var Temp64:UInt64;
procedure DQS(var Els:array of TDElement;iLo,iHi:UInt64);
var qLo,qHi,qMid:UInt64;
begin
qLo:=iLo; qHi:=iHi;qMid:=Els[(qLo+qHi)div 2].Code;
repeat
while Els[qLo].Code<qMid do Inc(qLo);
while Els[qHi].Code>qMid do Dec(qHi);
if qLo<=qHi then
begin Temp64:=Els[qLo].Code;Els[qLo].Code:=Els[qHi].Code;Els[qHi].Code:=Temp64;Inc(qLo);Dec(qHi)end;
until qLo>qHi;
if qHi>iLo then DQS(Els,iLo,qHi);if qLo<iHi then DQS(Els,qLo,iHi);
end;

procedure FormCode(var Code:UInt64);stdcall;
asm
push RCX;mov CX,256;movzx RCX,CX;call DRnd1
shl RAX,36;pop RCX;add [RCX],RAX
end;

function Generate(var Num:dword;Flags:dword;MinY,MaxY,MinPl,MaxPl:dword):bool;
var x,y,z:dword;
begin
Result:=False;
if(FileHandle=0)or(FileHandle=INVALID_HANDLE_VALUE)then exit;
if Num<10 then Num:=10;if Num>10000000 then exit;
if MinPl<2 then exit;if MaxPl>MaxPassCb then exit;if MinPl>MaxPl then exit;
if Flags and DGenDate>0 then begin
if Flags and DRangeDate>0 then begin
if(MinY<DMinYear)or(MaxY>DMaxYear)then exit;
if MinY>MaxY then exit;
end else begin MinY:=DMinYear;MaxY:=DMaxYear end;
gMinY:=MinY;
gMaxY:=MaxY;
end;
if((Flags and DGenMales>0)or(Flags and DGenFemales>0))and((Flags and DGenEng>0)or(Flags and DGenRus>0))then
begin DRndSet;GenParams.Flags:=Flags end else exit;

gMem:=AllocMem(SizeOf(TDElement)*(Num*2+2));
//gLL:=GlobalAlloc(GPTR,SizeOf(TDElement)*(Num*2+2));gMem:=GlobalLock(gLL);
tgMemUI:=gMemUI+SizeOf(TDElement)*(Num+1);
{ 10 - Имя. (10 0..9)
8 - Фамилия. (18 10..17)
8 - ENNN (26 18..25)
1 - Пол. (27 26) 0=M ( 26 )
1 - Нац. (28 27) 0=Eng ( 27 )
8 - Модификатор. (36 28..35)
8 - Случайные с. (44 36..43)
16 - Дата. (64)}
for x:=0 to Num-1 do begin
y:=0;
repeat
gEls^[x].Code:=0;
inc(y);
z:=DRnd1(5);
case z of
0:if(BitTst(Flags,bGenMales ))and(BitTst(Flags,bGenEng))then
begin gEngM:=DRnd1(MaleNamesMax);
gEngFam:=DRnd1(FamArrayMax);gENNN:=DRnd1(MaxNNN);gMods:=DRnd1(256);
gEls^[x].Code:=gEngM+(gEngFam shl 10)+(gENNN shl 18)+(gMods shl 28);FormCode(gEls^[x].Code);
BitClr(gEls^[x].Code,26);BitClr(gEls^[x].Code,27);break
end;
1:if(BitTst(Flags,bGenFemales))and(BitTst(Flags,bGenEng))then
begin gEngF:=DRnd1(FemaleNamesMax);
gEngFam:=DRnd1(FamArrayMax);gENNN:=DRnd1(MaxNNN);gMods:=DRnd1(256);
gEls^[x].Code:=gEngF+(gEngFam shl 10)+(gENNN shl 18)+(gMods shl 28);FormCode(gEls^[x].Code);
BitSet(gEls^[x].Code,26);BitClr(gEls^[x].Code,27);break
end;
2:if(BitTst(Flags,bGenMales ))and(BitTst(Flags,bGenRus))then
begin gRuM:=DRnd1(RuMaleNamesMax);
gRuFam:=DRnd1(RuFamArrayMax);gENNN:=DRnd1(MaxNNN);gMods:=DRnd1(256);
gEls^[x].Code:=gRuM+(gRuFam shl 10)+(gENNN shl 18)+(gMods shl 28);FormCode(gEls^[x].Code);
BitClr(gEls^[x].Code,26);BitSet(gEls^[x].Code,27);break
end;
3:if(BitTst(Flags,bGenFemales))and(BitTst(Flags,bGenRus))then
begin gRuF:=DRnd1(RuFemaleNamesMax);
gRuFam:=DRnd1(RuFamArrayMax);gENNN:=DRnd1(MaxNNN);gMods:=DRnd1(256);
gEls^[x].Code:=gRuF+(gRuFam shl 10)+(gENNN shl 18)+(gMods shl 28);FormCode(gEls^[x].Code);
BitSet(gEls^[x].Code,26);BitSet(gEls^[x].Code,27);break
end;
else Continue;
end;
if y>=65536 then break;
until False;
// Обработка возможной ошибки.
if y>=65536 then begin if gMem<>nil then FreeMemory(gMem);gMem:=nil;exit end;
if x mod 1024=0 then DRndSet;
end;
Sleep(0);
z:=0;
DQS(gEls^,0,Num-1);
Sleep(0);
for x:=0 to Num-2 do if gEls^[x].Code=gEls^[x+1].Code then begin gEls^[x].Code:=One64 end;
Sleep(0);
y:=0;
for x:=0 to Num-1 do if gEls^[x].Code<>One64 then begin tgEls^[y].Code:=gEls^[x].Code;inc(y)end;
Num:=y;
Sleep(0);
for x:=0 to Num-1 do begin
gDate:=FGenDate;AddDate(tgEls^[x].Code,gDate);
GeneratePassword(MinPl,MaxPl,tgEls^[x].Password);
end;
Sleep(0);
GenParams.Header[0]:=#68;GenParams.Header[1]:=#65;GenParams.Header[2]:=#65;GenParams.Header[3]:=#49;
GenParams.cbSize:=SizeOf(GenParams);
GenParams.Flags:=Flags;
GenParams.SizeElement:=SizeOf(TDElement);
GenParams.NumElements:=Num;
SetFilePointer(FileHandle,0,nil,FILE_BEGIN);
WriteFile(FileHandle,GenParams,SizeOf(GenParams),z,nil);
SetFilePointer(FileHandle,SizeOf(TDGenParams),nil,FILE_BEGIN);
WriteFile(FileHandle,tgEls^,SizeOf(TDElement)*Num,z,nil);
FlushFileBuffers(FileHandle);SetEndOfFile(FileHandle);
if z>=SizeOf(TDElement)*Num then Result:=True;
if gMem<>nil then begin FreeMemory(gMem);gMem:=nil end;
end;

procedure Rem2LS(var Val:array of WideChar);stdcall;
asm push RCX;call SBLen;sub EAX,4;pop RCX;add RCX,RAX;xor EAX,EAX;mov [RCX],EAX end;


function ExtractField(Num:dword;var Field:TDRetParams):bool;
var Params:TDGenParams;z:dword;
El:TDElement;
ss:array[0..255]of WideChar;
begin
Result:=False;
if(FileHandle=0)or(FileHandle=INVALID_HANDLE_VALUE)then exit;
SetFilePointer(FileHandle,0,nil,FILE_BEGIN);
ReadFile(FileHandle,Params,SizeOf(TDGenParams),z,nil);
{ОШИБКА! Выход за границы диапазона}
if Num+1>Params.NumElements then exit;
SetFilePointer(FileHandle,SizeOf(TDGenParams)+Num*SizeOf(TDElement),nil,FILE_BEGIN);
ReadFile(FileHandle,El,SizeOf(TDElement),z,nil);
{ОШИБКА! Данные загружены не полностью.}
if z<SizeOf(TDElement)then exit;
DUnpackDate(El.Code shr 48,Field.DateDay,Field.DateMonth,Field.DateYear);
{ 10 - Имя. (10)
8 - Фамилия. (18)
8 - ENNN (26)
1 - Пол. (27) 0=M ( 26 )
1 - Нац. (28) 0=Eng ( 27 )
8 - Модификатор. (36)
8 - Случайные с. (44)
16 - Дата. (64)}
z:=0;
if BitTst(El.Code,26)then BitSet(z,0);
if BitTst(El.Code,27)then BitSet(z,1);
case z of
0:begin SCpy(Field.Name,MaleNamesArray[El.Code and $3FF]);SCpy(Field.Fam,FamArray[(El.Code shr 10)and $FF])end;
1:begin SCpy(Field.Name,FemaleNamesArray[El.Code and $3FF]);SCpy(Field.Fam,FamArray[(El.Code shr 10)and $FF])end;
2:begin SCpy(Field.Name,RuMaleNamesArray[El.Code and $3FF]);SCpy(Field.Fam,RuFamArray[(El.Code shr 10)and $FF])end;
3:begin SCpy(Field.Name,RuFemaleNamesArray[El.Code and $3FF]);SCpy(Field.Fam,RuFamArray[(El.Code shr 10)and $FF]);lstrCatW(Field.Fam,RuFemaleEnd);end;
end;
SCpy(Field.Password,El.Password);
SCpy(Field.Nick,Field.Fam);
Field.isFemale:=BitTst(El.Code,26);
Field.isRus:=BitTst(El.Code,27);
if Field.isRus then DCryptName(Field.Nick);
SCpy(Field.Nick,ENNN[(El.Code shr 18)and $FF]);
if BitTst(El.Code,35)then SCpy(ss,Field.Name)else SCpy(ss,Field.Fam);if Field.isRus then DCryptName(ss);
lstrCatW(Field.Nick,ss);
CMA((El.Code shr 28)and $7F,0,0,Field.Nick);
if BitTst(El.Code,35)then SCpy(ss,Field.Fam)else SCpy(ss,Field.Name);if Field.isRus then DCryptName(ss);
SCpy(Field.eMail,ss);
lstrCatW(Field.eMail,ENNN[(El.Code shr 18)and $FF]);
if SLen(Field.eMail)>12 then Rem2LS(Field.eMail);
CMA((El.Code shr 28)and $7F,0,0,Field.eMail);
if BitTst(El.Code,43)then SCpy(ss,Field.Fam)else SCpy(ss,Field.Name);if Field.isRus then DCryptName(ss);
lstrCat(Field.eMail,ss);
Rem2LS(Field.eMail);
if SLen(Field.eMail)>16 then Rem2LS(Field.eMail);
z:=(El.Code shr 36)and $FF;
case z of
0..25 :begin ss[0]:='1';ss[1]:=WideChar(word('A')+loword(z)-0 )end;
26..51 :begin ss[0]:='2';ss[1]:=WideChar(word('A')+loword(z)-26 )end;
52..77 :begin ss[0]:='3';ss[1]:=WideChar(word('A')+loword(z)-52 )end;
78..103 :begin ss[0]:='4';ss[1]:=WideChar(word('A')+loword(z)-78 )end;
104..129:begin ss[0]:='5';ss[1]:=WideChar(word('A')+loword(z)-104)end;
130..155:begin ss[0]:='6';ss[1]:=WideChar(word('A')+loword(z)-130)end;
156..181:begin ss[0]:='7';ss[1]:=WideChar(word('A')+loword(z)-156)end;
182..207:begin ss[0]:='8';ss[1]:=WideChar(word('A')+loword(z)-182)end;
208..233:begin ss[0]:='9';ss[1]:=WideChar(word('A')+loword(z)-208)end;
234..255:begin ss[0]:='0';ss[1]:=WideChar(word('A')+loword(z)-234)end;
end;ss[2]:=#0;ss[3]:=#0;
lstrCatW(Field.Nick,ss);

lstrCatW(Field.eMail,ss);
if SLen(Field.eMail)<16 then begin Str(Field.DateYear,ss);lstrCatW(Field.eMail,ss)end;
CharLowerBuffW(Field.eMail,SLen(Field.eMail));
Result:=True;
end;

function ExtractFields(StartNum,EndNum:dword;Sep,StrSep:PWideChar;out Fields:PWideChar;cbFields:dword):bool;
begin
Result:=False;
end;

function TranslateToFile(FileName:PWideChar;Flags:dword;EofCallBack:DEofCallBack):bool;
begin
Result:=False;
end;



initialization InitVars;
finalization CloseGenerator;
end.



Пример вызова

var
sex:Dword;
if not opengenerator('system\Name.txt') then
begin
InitGenerator('system\Name.txt');
Sex:=10000;
Generate(sex,$00037773,1999,2020,5,25);
end;
дальше смотрите по префиксам наверху полное описание.
 
Очень интересная тема, мало таких можно встретить в сети. А если еще и есть немного знаний то можно применить к делу.
 
Очень интересная тема, мало таких можно встретить в сети. А если еще и есть немного знаний то можно применить к делу.
Ну я обычно использую для автоматизаций , заполнение данных , например в веб браузере при регистраций , или в эмуляторе нокс , а так можно применить в любое русло была бы фантазия)))
 
Вверх Снизу