From db9e913bebcfba6251351e97118db8ee01c76cc0 Mon Sep 17 00:00:00 2001 From: Ketmar Dark Date: Wed, 6 Sep 2017 23:23:41 +0300 Subject: [PATCH] mapdef cleanup; renamed some fields; mapdef.txt is RC0 now --- src/game/g_game.pas | 4 +- src/game/g_main.pas | 2 +- src/game/g_monsters.pas | 2 + src/game/g_panel.pas | 2 +- src/mapdef/mapdef.txt | 392 +++++----- src/shared/MAPDEF.pas | 4 +- src/shared/hashtable.pas | 10 + src/shared/mapdef.inc | 1427 ++++++++++++++++++------------------ src/shared/mapdef_help.inc | 133 ++-- src/shared/mapdef_impl.inc | 111 ++- src/shared/xdynrec.pas | 316 ++++---- src/shared/xparser.pas | 17 + src/tools/mapgen.dpr | 36 +- 13 files changed, 1236 insertions(+), 1220 deletions(-) diff --git a/src/game/g_game.pas b/src/game/g_game.pas index 3be9651..7f77a41 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -5231,7 +5231,7 @@ begin g_Console_Add('player left the map'); gExitByTrigger := True; //g_Game_ExitLevel(gTriggers[a].Data.MapName); - g_Game_ExitLevel(gTriggers[a].trigData.trigMapName); + g_Game_ExitLevel(gTriggers[a].trigData.trigMap); break; end; end; @@ -6101,7 +6101,7 @@ begin begin gExitByTrigger := True; //gNextMap := gTriggers[a].Data.MapName; - gNextMap := gTriggers[a].trigData.trigMapName; + gNextMap := gTriggers[a].trigData.trigMap; Break; end; // Èùåì ñëåäóþùóþ êàðòó â WAD ôàéëå diff --git a/src/game/g_main.pas b/src/game/g_main.pas index 06e5ace..f3e3872 100644 --- a/src/game/g_main.pas +++ b/src/game/g_main.pas @@ -303,7 +303,7 @@ begin begin gExitByTrigger := True; //g_Game_ExitLevel(gTriggers[a].Data.MapName); - g_Game_ExitLevel(gTriggers[a].trigData.trigMapName); + g_Game_ExitLevel(gTriggers[a].trigData.trigMap); Break; end; goto Cheated; diff --git a/src/game/g_monsters.pas b/src/game/g_monsters.pas index accdcb7..d982204 100644 --- a/src/game/g_monsters.pas +++ b/src/game/g_monsters.pas @@ -38,12 +38,14 @@ const MONSTATE_REVIVE = 10; MONSTATE_RUNOUT = 11; +{ in mapdef now BH_NORMAL = 0; BH_KILLER = 1; BH_MANIAC = 2; BH_INSANE = 3; BH_CANNIBAL = 4; BH_GOOD = 5; +} type TMonster = Class (TObject) diff --git a/src/game/g_panel.pas b/src/game/g_panel.pas index 6f45fc2..55190ae 100644 --- a/src/game/g_panel.pas +++ b/src/game/g_panel.pas @@ -872,7 +872,7 @@ begin if (mOldMovingActive <> mMovingActive) then mNeedSend := true; mOldMovingActive := mMovingActive; - if g_Game_IsServer and g_Game_IsNet then + if not g_Game_IsClient then begin if actMoveTrig then g_Triggers_Press(mEndPosTrig, ACTIVATE_CUSTOM); if actSizeTrig then g_Triggers_Press(mEndSizeTrig, ACTIVATE_CUSTOM); diff --git a/src/mapdef/mapdef.txt b/src/mapdef/mapdef.txt index 591eadb..ed2f95d 100644 --- a/src/mapdef/mapdef.txt +++ b/src/mapdef/mapdef.txt @@ -4,7 +4,7 @@ // notes: // field without offset is not in binary format -// fields with `omitdefault` won't be written when they contain default values +// fields with `writedefault` won't be written when they contain default values // fields with `internal` won't be written to any file ever (and won't be read) // `ubyte` is unsigned byte, and `byte` is signed byte // all strings are in utf-8 @@ -20,120 +20,72 @@ //////////////////////////////////////////////////////////////////////////////// // main blocks -TMapHeaderRec_1 is "map" size 452 bytes header binblock 7 { - //_ is "version" type uint minvalue 1 maxvalue 1; - MapName is "name" type char[32] offset 0; - MapAuthor is "author" type char[32] offset 32 default "" omitdefault; - MapDescription is "description" type char[256] offset 64 default "" omitdefault; - MusicName is "music" type char[64] offset 320 default 'Standart.wad:D2DMUS\ПРОСТОТА' omitdefault; - SkyName is "sky" type char[64] offset 384 default 'Standart.wad:D2DSKY\RSKY1' omitdefault; - //Width is "width" type ushort offset 448; - //Height is "height" type ushort offset 450; - Size is "size" type size offset 448 as wh; - // not in binary - Title is "title" type string default "" omitdefault; -} - -TTextureRec_1 is "texture" size 65 bytes binblock 1 { - Resource is "path" type char[64] offset 0; - Anim is "animated" type bool offset 64 default false omitdefault; - // internals - TexIdx is "texidx" type uint internal; -} - -TPanelRec_1 is "panel" size 18 bytes binblock 2 { - //X is "x" type int offset 0; - //Y is "y" type int offset 4; - Pos is "position" type point offset 0 as xy; - //Width is "width" type ushort offset 8; - //Height is "height" type ushort offset 10; - Size is "size" type size offset 8 as wh as wh; - TextureNum is "texture" type ushort offset 12 texture; - PanelType is "type" type ushort offset 14 bitset unique PanelType; - Alpha is "alpha" type ubyte offset 16 default 0 omitdefault; - Flags is "flags" type ubyte offset 17 bitset PanelFlag default PANEL_FLAG_NONE omitdefault; +"map" size 452 bytes header binblock 7 { + "name" type char[32] offset 0 writedefault; + "author" type char[32] offset 32 default ""; + "description" type char[256] offset 64 default ""; + "music" type char[64] offset 320 default 'Standart.wad:D2DMUS\ПРОСТОТА'; + "sky" type char[64] offset 384 default 'Standart.wad:D2DSKY\RSKY1'; + "size" type size offset 448 as wh writedefault; +} + +"texture" size 65 bytes binblock 1 { + "path" type char[64] offset 0 writedefault; + "animated" type bool offset 64 default false; +} + +"panel" size 18 bytes binblock 2 { + "position" type point offset 0 as xy writedefault; + "size" type size offset 8 as wh as wh writedefault; + "texture" type ushort offset 12 texture writedefault; + "type" type ushort offset 14 bitset unique PanelType writedefault; + "alpha" type ubyte offset 16 default 0; + "flags" type ubyte offset 17 bitset PanelFlag default PANEL_FLAG_NONE; // moving platform options, not in binary - MoveSpeed is "move_speed" type point default (0 0) omitdefault; - SizeSpeed is "size_speed" type point default (0 0) omitdefault; // alas, `size` cannot be negative - MoveStart is "move_start" type point default (0 0) omitdefault; - MoveEnd is "move_end" type point default (0 0) omitdefault; - SizeEnd is "size_end" type size default (0 0) omitdefault; - MoveActive is "move_active" type bool default false omitdefault; - MoveOnce is "move_once" type bool default false omitdefault; - EndPosTrigger is "end_pos_trigger" type int trigger default null omitdefault; - EndSizeTrigger is "end_size_trigger" type int trigger default null omitdefault; - // not in binary - //Id is "id" type string default "" omitdefault; - // internals - PanIdx is "panidx" type uint internal; -} - -TItemRec_1 is "item" size 10 bytes binblock 3 { - //X is "x" type int offset 0; - //Y is "y" type int offset 4; - Pos is "position" type point offset 0 as xy; - ItemType is "type" type ubyte offset 8 enum Item; - Options is "options" type ubyte offset 9 bitset ItemOption default ITEM_OPTION_NONE omitdefault; - // not in binary - //Id is "id" type string default "" omitdefault; - // internals - ItemIdx is "itemidx" type uint internal; -} - -TMonsterRec_1 is "monster" size 10 bytes binblock 5 { - //X is "x" type int offset 0; - //Y is "y" type int offset 4; - Pos is "position" type point offset 0 as xy; - MonsterType is "type" type ubyte offset 8 enum Monster; - Direction is "direction" type ubyte offset 9 enum DirType default DIR_LEFT omitdefault; - // not in binary - //Id is "id" type string default "" omitdefault; - // internals - MonsIdx is "monsidx" type uint internal; -} - -TAreaRec_1 is "area" size 10 bytes binblock 4 { - //X is "x" type int offset 0; - //Y is "y" type int offset 4; - Pos is "position" type point offset 0 as xy; - AreaType is "type" type ubyte offset 8 enum AreaType; - Direction is "direction" type ubyte offset 9 enum DirType default DIR_LEFT omitdefault; - // not in binary - //Id is "id" type string default "" omitdefault; - // internals - AreaIdx is "areaidx" type uint internal; -} - -TTriggerRec_1 is "trigger" size 148 bytes binblock 6 { - //X is "x" type int offset 0; - //Y is "y" type int offset 4; - Pos is "position" type point offset 0 as xy; - //Width is "width" type ushort offset 8; - //Height is "height" type ushort offset 10; - Size is "size" type size offset 8 as wh; - Enabled is "enabled" type bool offset 12 default true omitdefault; - TexturePanel is "texturepanel" type int offset 13 panel default null omitdefault; - TriggerType is "type" type ubyte offset 17 enum TriggerType; - ActivateType is "activatetype" type ubyte offset 18 bitset ActivateType; - Keys is "keys" type ubyte offset 19 bitset Key default KEY_NONE omitdefault; + "move_speed" type point default (0 0); + "size_speed" type point default (0 0); // alas, `size` cannot be negative + "move_start" type point default (0 0); + "move_end" type point default (0 0); + "size_end" type size default (0 0); + "move_active" type bool default false; + "move_once" type bool default false; + "end_pos_trigger" trigger default null; + "end_size_trigger" trigger default null; +} + +"item" size 10 bytes binblock 3 { + "position" type point offset 0 as xy writedefault; + "type" type ubyte offset 8 enum Item writedefault; + "options" type ubyte offset 9 bitset ItemOption default ITEM_OPTION_NONE; +} + +"monster" size 10 bytes binblock 5 { + "position" type point offset 0 as xy writedefault; + "type" type ubyte offset 8 enum Monster writedefault; + "direction" type ubyte offset 9 enum DirType default DIR_LEFT; +} + +"area" size 10 bytes binblock 4 { + "position" type point offset 0 as xy writedefault; + "type" type ubyte offset 8 enum AreaType writedefault; + "direction" type ubyte offset 9 enum DirType default DIR_LEFT; +} + +"trigger" size 148 bytes binblock 6 { + "position" type point offset 0 as xy writedefault; + "size" type size offset 8 as wh writedefault; + "enabled" type bool offset 12 default true; + "texture_panel" type int offset 13 panel default null; + "type" type ubyte offset 17 enum TriggerType writedefault; + "activate_type" type ubyte offset 18 bitset ActivateType; + "keys" type ubyte offset 19 bitset Key default KEY_NONE; //WARNING: "trigdata" MUST be defined before "type", and "type" MUST be named "type" (for now, can be changed later) - DATA is "triggerdata" type trigdata[128] offset 20; // the only special nested structure - // not in binary - //Id is "id" type string default "" omitdefault; - // internals - TrigIdx is "trigidx" type uint internal; + "triggerdata" type trigdata[128] offset 20; // the only special nested structure } //////////////////////////////////////////////////////////////////////////////// -/* -enum { - TEXTURE_NAME_WATER = '_water_0', - TEXTURE_NAME_ACID1 = '_water_1', - TEXTURE_NAME_ACID2 = '_water_2', -} -*/ - +// special texture identifiers, used to generate pascal sources enum TextureSpecial { TEXTURE_SPECIAL_WATER = -1, TEXTURE_SPECIAL_ACID1 = -2, @@ -301,6 +253,17 @@ enum Monster { MONSTER_BARREL, // 18 MONSTER_ROBO, // 19 MONSTER_MAN, // 20 + // aliases (fixme: it should be `MONSTER_ZOMBIE = MONSTER_ZOMBY`!) + MONSTER_ZOMBIE = 3, +} + +enum MonsterBehaviour { + BH_NORMAL, // 0 + BH_KILLER, // 1 + BH_MANIAC, // 2 + BH_INSANE, // 3 + BH_CANNIBAL, // 4 + BH_GOOD, // 5 } enum TriggerShot { @@ -360,6 +323,32 @@ enum TriggerEffectPos { TRIGGER_EFFECT_POS_AREA, // 1 } +enum TriggerMusicAction { + TRIGGER_MUSIC_ACTION_STOP, // 0 + TRIGGER_MUSIC_ACTION_PLAY, // 1; unpause or restart +} + +enum TriggerScoreAction { + TRIGGER_SCORE_ACTION_ADD, // 0 + TRIGGER_SCORE_ACTION_SUB, // 1 + TRIGGER_SCORE_ACTION_WIN, // 2 + TRIGGER_SCORE_ACTION_LOOSE, // 3 +} + +enum TriggerMessageDest { + TRIGGER_MESSAGE_DEST_ME, // 0 + TRIGGER_MESSAGE_DEST_MY_TEAM, // 1 + TRIGGER_MESSAGE_DEST_ENEMY_TEAM, // 2 + TRIGGER_MESSAGE_DEST_RED_TEAM, // 3 + TRIGGER_MESSAGE_DEST_BLUE_TEAM, // 4 + TRIGGER_MESSAGE_DEST_EVERYONE, // 5 +} + +enum TriggerMessageKind { + TRIGGER_MESSAGE_KIND_CHAT, // 0 + TRIGGER_MESSAGE_KIND_GAME, // 1 +} + bitset ActivateType { ACTIVATE_NONE = 0, // 0 ACTIVATE_PLAYERCOLLIDE, // 1 @@ -384,144 +373,147 @@ bitset Key { //////////////////////////////////////////////////////////////////////////////// // various triggers TriggerData for TRIGGER_EXIT { - MapName is "map" type char[16] offset 0; + "map" type char[16] offset 0 writedefault; } TriggerData for TRIGGER_TELEPORT { - TargetPoint is "target" type point offset 0; - d2d_teleport is "d2d" type bool offset 8 default false omitdefault; - silent_teleport is "silent" type bool offset 9 default false omitdefault; - TlpDir is "direction" type ubyte offset 10 enum DirType default DIR_LEFT omitdefault; + "target" type point offset 0 writedefault; + "d2d" type bool offset 8 default false; + "silent" type bool offset 9 default false; + "direction" type ubyte offset 10 enum DirType default DIR_LEFT; } TriggerData for (TRIGGER_OPENDOOR, TRIGGER_CLOSEDOOR, TRIGGER_DOOR, TRIGGER_DOOR5, TRIGGER_CLOSETRAP, TRIGGER_TRAP, TRIGGER_LIFTUP, TRIGGER_LIFTDOWN, TRIGGER_LIFT) { - PanelID is "panelid" type int offset 0 panel; - NoSound is "silent" type bool offset 4 default false omitdefault; - d2d_doors is "d2d" type bool offset 5 default false omitdefault; + "panelid" type int offset 0 panel writedefault; + "silent" type bool offset 4 default false; + "d2d" type bool offset 5 default false; } TriggerData for (TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF) { - //tX is "tx" type int offset 0; - //tY is "ty" type int offset 4; - Pos is "position" type point offset 0 as txy default (0 0); - //tWidth is "width" type ushort offset 8; - //tHeight is "height" type ushort offset 10; - Size is "size" type size offset 8 as twh default (0 0); - Wait is "wait" type ushort offset 12 default 0; - Count is "count" type ushort offset 14 default 0; - MonsterID is "monsterid" type int offset 16 monster as monsterid default null; - ExtRandom is "extrandom" type bool offset 20 default false; + "position" type point offset 0 as txy default (0 0) writedefault; + "size" type size offset 8 as twh default (0 0); + "wait" type ushort offset 12 default 0; + "count" alias pressCount type ushort offset 14 default 0; + "monsterid" type int offset 16 monster as monsterid default null; + "ext_random" type bool offset 20 default false; // this one is for moving platforms - PanelId is "panelid" type int panel default null omitdefault; + "panelid" panel default null; +} + +enum TriggerScoreTeam { + TRIGGER_SCORE_TEAM_MINE_RED, // 0 + TRIGGER_SCORE_TEAM_MINE_BLUE, // 1 + TRIGGER_SCORE_TEAM_FORCE_RED, // 2 + TRIGGER_SCORE_TEAM_FORCE_BLUE, // 3 } TriggerData for TRIGGER_SECRET { } TriggerData for TRIGGER_TEXTURE { - ActivateOnce is "activateonce" type bool offset 0; - AnimOnce is "animateonce" type bool offset 1; + "activate_once" type bool offset 0 default false writedefault; + "animate_once" type bool offset 1 default false writedefault; } TriggerData for TRIGGER_SOUND { - SoundName is "soundname" type char[64] offset 0; - Volume is "volume" type ubyte offset 64; - Pan is "pan" type ubyte offset 65; - Local is "local" type bool offset 66; - PlayCount is "playcount" type ubyte offset 67; - SoundSwitch is "soundswitch" type bool offset 68; + "sound_name" type char[64] offset 0 writedefault; + "volume" type ubyte offset 64 default 0 writedefault; //??? default ??? + "pan" type ubyte offset 65 default 0; + "local" type bool offset 66 default true; //??? default ??? + "play_count" type ubyte offset 67 default 1; + "sound_switch" type bool offset 68 default false; //??? default ??? } TriggerData for TRIGGER_SPAWNMONSTER { - MonPos is "position" type point offset 0; - MonType is "type" type ubyte offset 8; - MonHealth is "health" type int offset 12; - MonDir is "direction" type ubyte offset 16 enum DirType; - MonActive is "active" type bool offset 17; - MonCount is "count" type int offset 20; - MonEffect is "effect" type ubyte offset 24; - MonMax is "max" type ushort offset 26; - MonDelay is "delay" type ushort offset 28; - MonBehav is "behaviour" type ubyte offset 30; + "position" type point offset 0 as txy writedefault; + "type" alias spawnMonsType type ubyte offset 8 enum Monster default MONSTER_IMP writedefault; + "health" type int offset 12 writedefault; + "direction" type ubyte offset 16 enum DirType default DIR_LEFT writedefault; + "active" type bool offset 17 default true; + "count" alias monsCount type int offset 20 default 1 writedefault; + "effect" type ubyte offset 24 enum EffectAction default EFFECT_NONE writedefault; + "max" type ushort offset 26 default 1 writedefault; + "delay" type ushort offset 28 default 1000 writedefault; + "behaviour" type ubyte offset 30 enum MonsterBehaviour default BH_NORMAL; } TriggerData for TRIGGER_SPAWNITEM { - ItemPos is "position" type point offset 0; - ItemType is "type" type ubyte offset 8; - ItemFalls is "gravity" type bool offset 9; - ItemOnlyDM is "dmonly" type bool offset 10; - ItemCount is "count" type int offset 12; - ItemEffect is "effect" type ubyte offset 16; - ItemMax is "max" type ushort offset 18; - ItemDelay is "delay" type ushort offset 20; + "position" type point offset 0 as txy writedefault; + "type" alias spawnItemType type ubyte offset 8 enum Item default ITEM_NONE writedefault; + "gravity" type bool offset 9 default true; + "dmonly" type bool offset 10 default false; + "count" alias itemCount type int offset 12 default 1; + "effect" type ubyte offset 16 enum EffectAction default EFFECT_NONE writedefault; + "max" type ushort offset 18 default 1; + "delay" type ushort offset 20 default 1000 writedefault; } TriggerData for TRIGGER_MUSIC { - MusicName is "name" type char[64] offset 0; - MusicAction is "action" type ubyte offset 64; + "name" alias musicName type char[64] offset 0 writedefault; + "action" alias musicAction type ubyte offset 64 enum TriggerMusicAction writedefault; } TriggerData for TRIGGER_PUSH { - PushAngle is "angle" type ushort offset 0; - PushForce is "force" type ubyte offset 2; - ResetVel is "resetvelocity" type bool offset 3; + "angle" type ushort offset 0 writedefault; + "force" type ubyte offset 2 writedefault; + "reset_velocity" type bool offset 3 default false writedefault; } TriggerData for TRIGGER_SCORE { - ScoreAction is "action" type ubyte offset 0; - ScoreCount is "count" type ubyte offset 1; - ScoreTeam is "team" type ubyte offset 2; - ScoreCon is "console" type bool offset 3; - ScoreMsg is "message" type bool offset 4; + "action" alias scoreAction type ubyte offset 0 enum TriggerScoreAction default TRIGGER_SCORE_ACTION_ADD writedefault; + "count" alias scoreCount type ubyte offset 1 default 1 writedefault; + "team" alias scoreTeam type ubyte offset 2 enum TriggerScoreTeam writedefault; + "console" alias scoreCon type bool offset 3 default false writedefault; + "message" alias scoreMsg type bool offset 4 default true writedefault; } TriggerData for TRIGGER_MESSAGE { - MessageKind is "kind" type ubyte offset 0; - MessageSendTo is "sendto" type ubyte offset 1; - MessageText is "text" type char[100] offset 2; - MessageTime is "time" type ushort offset 102; + "kind" type ubyte offset 0 enum TriggerMessageKind default TRIGGER_MESSAGE_KIND_GAME writedefault; + "dest" alias msgDest type ubyte enum TriggerMessageDest offset 1; + "text" type char[100] offset 2 writedefault; + "time" alias msgTime type ushort offset 102 writedefault; } TriggerData for TRIGGER_DAMAGE { - DamageValue is "amount" type ushort offset 0; - DamageInterval is "interval" type ushort offset 2; + "amount" type ushort offset 0 writedefault; + "interval" type ushort offset 2 writedefault; } TriggerData for TRIGGER_HEALTH { - HealValue is "amount" type ushort offset 0; - HealInterval is "interval" type ushort offset 2; - HealMax is "max" type bool offset 4; - HealSilent is "silent" type bool offset 5; + "amount" type ushort offset 0 writedefault; + "interval" type ushort offset 2 writedefault; + "max" alias healMax type bool offset 4 writedefault; + "silent" type bool offset 5 writedefault; } TriggerData for TRIGGER_SHOT { - ShotPos is "position" type point offset 0; - ShotType is "type" type ubyte offset 8 enum TriggerShot; - ShotTarget is "target" type ubyte offset 9 enum TriggerShotTarget; - ShotSound is "silent" type negbool offset 10; // negbool! - ShotAim is "aim" type byte offset 11; - ShotPanelID is "panelid" type int offset 12; - ShotIntSight is "sight" type ushort offset 16; - ShotAngle is "angle" type ushort offset 18; - ShotWait is "wait" type ushort offset 20; - ShotAccuracy is "accuracy" type ushort offset 22; - ShotAmmo is "ammo" type ushort offset 24; - ShotIntReload is "reload" type ushort offset 26; + "position" type point offset 0 as txy writedefault; + "type" alias shotType type ubyte offset 8 enum TriggerShot writedefault; + "target" alias shotTarget type ubyte offset 9 enum TriggerShotTarget writedefault; + "quiet" type negbool offset 10; // negbool! + "aim" type byte offset 11 enum TriggerShotAim default TRIGGER_SHOT_AIM_DEFAULT; + "panelid" type int offset 12 panel default null writedefault; + "sight" type ushort offset 16; + "angle" type ushort offset 18; + "wait" type ushort offset 20; + "accuracy" type ushort offset 22; + "ammo" type ushort offset 24; + "reload" type ushort offset 26; } TriggerData for TRIGGER_EFFECT { - FXCount is "count" type ubyte offset 0; - FXType is "type" type ubyte offset 1; - FXSubType is "subtype" type ubyte offset 2; - FXColorR is "colorr" type ubyte offset 3; - FXColorG is "colorg" type ubyte offset 4; - FXColorB is "colorb" type ubyte offset 5; - FXPos is "position" type ubyte offset 6; - FXWait is "wait" type ushort offset 8; - FXVelX is "velx" type byte offset 10; - FXVelY is "vely" type byte offset 11; - FXSpreadL is "spreadl" type ubyte offset 12; - FXSpreadR is "spreadr" type ubyte offset 13; - FXSpreadU is "spreadu" type ubyte offset 14; - FXSpreadD is "spreadd" type ubyte offset 15; + "count" alias FXCount type ubyte offset 0 writedefault; + "type" alias FXType type ubyte offset 1 enum TriggerEffect default TRIGGER_EFFECT_PARTICLE writedefault; + "subtype" alias FXSubType type ubyte offset 2 enum TriggerEffectType default TRIGGER_EFFECT_SPARK writedefault; + "red" alias FXRed type ubyte offset 3 writedefault; + "green" alias FXGreen type ubyte offset 4 writedefault; + "blue" alias FXBlue type ubyte offset 5 writedefault; + "pos" alias FXPos type ubyte offset 6 enum TriggerEffectPos default TRIGGER_EFFECT_POS_CENTER writedefault; + "wait" type ushort offset 8 writedefault; + "vel_x" type byte offset 10 writedefault; + "vel_y" type byte offset 11 writedefault; + "spread_l" type ubyte offset 12 writedefault; + "spread_r" type ubyte offset 13 writedefault; + "spread_u" type ubyte offset 14 writedefault; + "spread_d" type ubyte offset 15 writedefault; } diff --git a/src/shared/MAPDEF.pas b/src/shared/MAPDEF.pas index 2e7ec96..4f4a3cd 100644 --- a/src/shared/MAPDEF.pas +++ b/src/shared/MAPDEF.pas @@ -371,11 +371,11 @@ function TDynRecordHelper.Direction (): Byte; inline; begin result := Byte(getFi function TDynRecordHelper.AreaType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end; function TDynRecordHelper.Enabled (): Boolean; inline; begin result := (getFieldWithType('enabled', TDynField.TType.TBool).ival <> 0); end; function TDynRecordHelper.TriggerType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.ActivateType (): Byte; inline; begin result := Byte(getFieldWithType('activatetype', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.ActivateType (): Byte; inline; begin result := Byte(getFieldWithType('activate_type', TDynField.TType.TUByte).ival); end; function TDynRecordHelper.Keys (): Byte; inline; begin result := Byte(getFieldWithType('keys', TDynField.TType.TUByte).ival); end; function TDynRecordHelper.getPanelId (): Integer; inline; begin result := getFieldWithType('panelid', TDynField.TType.TInt).recrefIndex; end; -function TDynRecordHelper.getTexturePanel (): Integer; begin result := getFieldWithType('texturepanel', TDynField.TType.TInt).recrefIndex; end; +function TDynRecordHelper.getTexturePanel (): Integer; begin result := getFieldWithType('texture_panel', TDynField.TType.TInt).recrefIndex; end; {$INCLUDE mapdef_impl.inc} diff --git a/src/shared/hashtable.pas b/src/shared/hashtable.pas index ea71555..8aaa522 100644 --- a/src/shared/hashtable.pas +++ b/src/shared/hashtable.pas @@ -161,9 +161,11 @@ type type THashIntInt = specialize THashBase; THashStrInt = specialize THashBase; + THashStrStr = specialize THashBase; function hashNewIntInt (): THashIntInt; function hashNewStrInt (): THashStrInt; +function hashNewStrStr (): THashStrStr; function u32Hash (a: LongWord): LongWord; inline; @@ -176,6 +178,8 @@ function nextPOT (x: LongWord): LongWord; inline; // for integer keys function hiiequ (constref a, b: Integer): Boolean; function hiihash (constref k: Integer): LongWord; +function hsiequ (constref a, b: AnsiString): Boolean; +function hsihash (constref k: AnsiString): LongWord; implementation @@ -238,6 +242,12 @@ begin end; +function hashNewStrStr (): THashStrStr; +begin + result := THashStrStr.Create(hsihash, hsiequ); +end; + + // ////////////////////////////////////////////////////////////////////////// // {$PUSH} {$RANGECHECKS OFF} diff --git a/src/shared/mapdef.inc b/src/shared/mapdef.inc index c4ab984..3000a29 100644 --- a/src/shared/mapdef.inc +++ b/src/shared/mapdef.inc @@ -168,6 +168,16 @@ const MONSTER_BARREL = 18; MONSTER_ROBO = 19; MONSTER_MAN = 20; + MONSTER_ZOMBIE = 3; + +// MonsterBehaviour +const + BH_NORMAL = 0; + BH_KILLER = 1; + BH_MANIAC = 2; + BH_INSANE = 3; + BH_CANNIBAL = 4; + BH_GOOD = 5; // TriggerShot const @@ -225,6 +235,32 @@ const TRIGGER_EFFECT_POS_CENTER = 0; TRIGGER_EFFECT_POS_AREA = 1; +// TriggerMusicAction +const + TRIGGER_MUSIC_ACTION_STOP = 0; + TRIGGER_MUSIC_ACTION_PLAY = 1; + +// TriggerScoreAction +const + TRIGGER_SCORE_ACTION_ADD = 0; + TRIGGER_SCORE_ACTION_SUB = 1; + TRIGGER_SCORE_ACTION_WIN = 2; + TRIGGER_SCORE_ACTION_LOOSE = 3; + +// TriggerMessageDest +const + TRIGGER_MESSAGE_DEST_ME = 0; + TRIGGER_MESSAGE_DEST_MY_TEAM = 1; + TRIGGER_MESSAGE_DEST_ENEMY_TEAM = 2; + TRIGGER_MESSAGE_DEST_RED_TEAM = 3; + TRIGGER_MESSAGE_DEST_BLUE_TEAM = 4; + TRIGGER_MESSAGE_DEST_EVERYONE = 5; + +// TriggerMessageKind +const + TRIGGER_MESSAGE_KIND_CHAT = 0; + TRIGGER_MESSAGE_KIND_GAME = 1; + // ActivateType const ACTIVATE_NONE = 0; @@ -245,6 +281,13 @@ const KEY_REDTEAM = 8; KEY_BLUETEAM = 16; +// TriggerScoreTeam +const + TRIGGER_SCORE_TEAM_MINE_RED = 0; + TRIGGER_SCORE_TEAM_MINE_BLUE = 1; + TRIGGER_SCORE_TEAM_FORCE_RED = 2; + TRIGGER_SCORE_TEAM_FORCE_BLUE = 3; + const defaultMapDef: AnsiString = ''+ #47#47#32#121#101#115#44#32#116#104#105#115#32#102#105#108#101#32#115#101+ @@ -263,13 +306,13 @@ const defaultMapDef: AnsiString = ''+ #101#115#58#10#47#47#32#32#32#102#105#101#108#100#32#119#105#116#104#111#117+ #116#32#111#102#102#115#101#116#32#105#115#32#110#111#116#32#105#110#32#98+ #105#110#97#114#121#32#102#111#114#109#97#116#10#47#47#32#32#32#102#105#101+ - #108#100#115#32#119#105#116#104#32#96#111#109#105#116#100#101#102#97#117#108+ - #116#96#32#119#111#110#39#116#32#98#101#32#119#114#105#116#116#101#110#32+ - #119#104#101#110#32#116#104#101#121#32#99#111#110#116#97#105#110#32#100#101+ - #102#97#117#108#116#32#118#97#108#117#101#115#10#47#47#32#32#32#102#105#101+ - #108#100#115#32#119#105#116#104#32#96#105#110#116#101#114#110#97#108#96#32+ - #119#111#110#39#116#32#98#101#32#119#114#105#116#116#101#110#32#116#111#32+ - #97#110#121#32#102#105#108#101#32#101#118#101#114#32#40#97#110#100#32#119+ + #108#100#115#32#119#105#116#104#32#96#119#114#105#116#101#100#101#102#97#117+ + #108#116#96#32#119#111#110#39#116#32#98#101#32#119#114#105#116#116#101#110+ + #32#119#104#101#110#32#116#104#101#121#32#99#111#110#116#97#105#110#32#100+ + #101#102#97#117#108#116#32#118#97#108#117#101#115#10#47#47#32#32#32#102#105+ + #101#108#100#115#32#119#105#116#104#32#96#105#110#116#101#114#110#97#108#96+ + #32#119#111#110#39#116#32#98#101#32#119#114#105#116#116#101#110#32#116#111+ + #32#97#110#121#32#102#105#108#101#32#101#118#101#114#32#40#97#110#100#32#119+ #111#110#39#116#32#98#101#32#114#101#97#100#41#10#47#47#32#32#32#96#117#98+ #121#116#101#96#32#105#115#32#117#110#115#105#103#110#101#100#32#98#121#116+ #101#44#32#97#110#100#32#96#98#121#116#101#96#32#105#115#32#115#105#103#110+ @@ -300,711 +343,689 @@ const defaultMapDef: AnsiString = ''+ #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+ #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+ #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#10#47#47#32#109#97#105#110+ - #32#98#108#111#99#107#115#10#84#77#97#112#72#101#97#100#101#114#82#101#99#95+ - #49#32#105#115#32#34#109#97#112#34#32#115#105#122#101#32#52#53#50#32#98#121+ - #116#101#115#32#104#101#97#100#101#114#32#98#105#110#98#108#111#99#107#32#55+ - #32#123#10#32#32#47#47#95#32#105#115#32#34#118#101#114#115#105#111#110#34#32+ - #116#121#112#101#32#117#105#110#116#32#109#105#110#118#97#108#117#101#32#49+ - #32#109#97#120#118#97#108#117#101#32#49#59#10#32#32#77#97#112#78#97#109#101+ - #32#105#115#32#34#110#97#109#101#34#32#116#121#112#101#32#99#104#97#114#91+ - #51#50#93#32#111#102#102#115#101#116#32#48#59#10#32#32#77#97#112#65#117#116+ - #104#111#114#32#105#115#32#34#97#117#116#104#111#114#34#32#116#121#112#101+ - #32#99#104#97#114#91#51#50#93#32#111#102#102#115#101#116#32#51#50#32#100#101+ - #102#97#117#108#116#32#34#34#32#111#109#105#116#100#101#102#97#117#108#116+ - #59#10#32#32#77#97#112#68#101#115#99#114#105#112#116#105#111#110#32#105#115+ - #32#34#100#101#115#99#114#105#112#116#105#111#110#34#32#116#121#112#101#32+ - #99#104#97#114#91#50#53#54#93#32#111#102#102#115#101#116#32#54#52#32#100#101+ - #102#97#117#108#116#32#34#34#32#111#109#105#116#100#101#102#97#117#108#116+ - #59#10#32#32#77#117#115#105#99#78#97#109#101#32#105#115#32#34#109#117#115+ - #105#99#34#32#116#121#112#101#32#99#104#97#114#91#54#52#93#32#111#102#102+ - #115#101#116#32#51#50#48#32#100#101#102#97#117#108#116#32#39#83#116#97#110+ - #100#97#114#116#46#119#97#100#58#68#50#68#77#85#83#92#208#159#208#160#208+ - #158#208#161#208#162#208#158#208#162#208#144#39#32#111#109#105#116#100#101+ - #102#97#117#108#116#59#10#32#32#83#107#121#78#97#109#101#32#105#115#32#34+ - #115#107#121#34#32#116#121#112#101#32#99#104#97#114#91#54#52#93#32#111#102+ - #102#115#101#116#32#51#56#52#32#100#101#102#97#117#108#116#32#39#83#116#97+ - #110#100#97#114#116#46#119#97#100#58#68#50#68#83#75#89#92#82#83#75#89#49#39+ - #32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#47#47#87#105#100+ - #116#104#32#105#115#32#34#119#105#100#116#104#34#32#116#121#112#101#32#117+ - #115#104#111#114#116#32#111#102#102#115#101#116#32#52#52#56#59#10#32#32#47+ - #47#72#101#105#103#104#116#32#105#115#32#34#104#101#105#103#104#116#34#32+ - #116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#52+ - #53#48#59#10#32#32#83#105#122#101#32#105#115#32#34#115#105#122#101#34#32#116+ - #121#112#101#32#115#105#122#101#32#111#102#102#115#101#116#32#52#52#56#32#97+ - #115#32#119#104#59#10#32#32#47#47#32#110#111#116#32#105#110#32#98#105#110#97+ - #114#121#10#32#32#84#105#116#108#101#32#105#115#32#34#116#105#116#108#101#34+ - #32#116#121#112#101#32#115#116#114#105#110#103#32#100#101#102#97#117#108#116+ - #32#34#34#32#32#111#109#105#116#100#101#102#97#117#108#116#59#10#125#10#10+ - #84#84#101#120#116#117#114#101#82#101#99#95#49#32#105#115#32#34#116#101#120+ + #32#98#108#111#99#107#115#10#34#109#97#112#34#32#115#105#122#101#32#52#53#50+ + #32#98#121#116#101#115#32#104#101#97#100#101#114#32#98#105#110#98#108#111#99+ + #107#32#55#32#123#10#32#32#34#110#97#109#101#34#32#116#121#112#101#32#99#104+ + #97#114#91#51#50#93#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101+ + #100#101#102#97#117#108#116#59#10#32#32#34#97#117#116#104#111#114#34#32#116+ + #121#112#101#32#99#104#97#114#91#51#50#93#32#111#102#102#115#101#116#32#51+ + #50#32#100#101#102#97#117#108#116#32#34#34#59#10#32#32#34#100#101#115#99#114+ + #105#112#116#105#111#110#34#32#116#121#112#101#32#99#104#97#114#91#50#53#54+ + #93#32#111#102#102#115#101#116#32#54#52#32#100#101#102#97#117#108#116#32#34+ + #34#59#10#32#32#34#109#117#115#105#99#34#32#116#121#112#101#32#99#104#97#114+ + #91#54#52#93#32#111#102#102#115#101#116#32#51#50#48#32#100#101#102#97#117+ + #108#116#32#39#83#116#97#110#100#97#114#116#46#119#97#100#58#68#50#68#77#85+ + #83#92#208#159#208#160#208#158#208#161#208#162#208#158#208#162#208#144#39#59+ + #10#32#32#34#115#107#121#34#32#116#121#112#101#32#99#104#97#114#91#54#52#93+ + #32#111#102#102#115#101#116#32#51#56#52#32#100#101#102#97#117#108#116#32#39+ + #83#116#97#110#100#97#114#116#46#119#97#100#58#68#50#68#83#75#89#92#82#83#75+ + #89#49#39#59#10#32#32#34#115#105#122#101#34#32#116#121#112#101#32#115#105+ + #122#101#32#111#102#102#115#101#116#32#52#52#56#32#97#115#32#119#104#32#119+ + #114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#34#116#101#120+ #116#117#114#101#34#32#115#105#122#101#32#54#53#32#98#121#116#101#115#32#98+ - #105#110#98#108#111#99#107#32#49#32#123#10#32#32#82#101#115#111#117#114#99+ - #101#32#105#115#32#34#112#97#116#104#34#32#116#121#112#101#32#99#104#97#114+ - #91#54#52#93#32#111#102#102#115#101#116#32#48#59#10#32#32#65#110#105#109#32+ - #105#115#32#34#97#110#105#109#97#116#101#100#34#32#116#121#112#101#32#98#111+ - #111#108#32#111#102#102#115#101#116#32#54#52#32#100#101#102#97#117#108#116+ - #32#102#97#108#115#101#32#111#109#105#116#100#101#102#97#117#108#116#59#10+ - #32#32#47#47#32#105#110#116#101#114#110#97#108#115#10#32#32#84#101#120#73+ - #100#120#32#105#115#32#34#116#101#120#105#100#120#34#32#116#121#112#101#32+ - #117#105#110#116#32#105#110#116#101#114#110#97#108#59#10#125#10#10#84#80#97+ - #110#101#108#82#101#99#95#49#32#105#115#32#34#112#97#110#101#108#34#32#115+ - #105#122#101#32#49#56#32#98#121#116#101#115#32#98#105#110#98#108#111#99#107+ - #32#50#32#123#10#32#32#47#47#88#32#105#115#32#34#120#34#32#116#121#112#101+ - #32#105#110#116#32#111#102#102#115#101#116#32#48#59#10#32#32#47#47#89#32#105+ - #115#32#34#121#34#32#116#121#112#101#32#105#110#116#32#111#102#102#115#101+ - #116#32#52#59#10#32#32#80#111#115#32#105#115#32#34#112#111#115#105#116#105+ - #111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115#101+ - #116#32#48#32#97#115#32#120#121#59#10#32#32#47#47#87#105#100#116#104#32#105+ - #115#32#34#119#105#100#116#104#34#32#116#121#112#101#32#117#115#104#111#114+ - #116#32#111#102#102#115#101#116#32#56#59#10#32#32#47#47#72#101#105#103#104+ - #116#32#105#115#32#34#104#101#105#103#104#116#34#32#116#121#112#101#32#117+ - #115#104#111#114#116#32#111#102#102#115#101#116#32#49#48#59#10#32#32#83#105+ - #122#101#32#105#115#32#34#115#105#122#101#34#32#116#121#112#101#32#115#105+ - #122#101#32#111#102#102#115#101#116#32#56#32#97#115#32#119#104#32#97#115#32+ - #119#104#59#10#32#32#84#101#120#116#117#114#101#78#117#109#32#105#115#32#34+ - #116#101#120#116#117#114#101#34#32#116#121#112#101#32#117#115#104#111#114+ - #116#32#111#102#102#115#101#116#32#49#50#32#116#101#120#116#117#114#101#59+ - #10#32#32#80#97#110#101#108#84#121#112#101#32#105#115#32#34#116#121#112#101+ - #34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116+ - #32#49#52#32#98#105#116#115#101#116#32#117#110#105#113#117#101#32#80#97#110+ - #101#108#84#121#112#101#59#10#32#32#65#108#112#104#97#32#105#115#32#34#97+ - #108#112#104#97#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+ - #115#101#116#32#49#54#32#100#101#102#97#117#108#116#32#48#32#111#109#105#116+ - #100#101#102#97#117#108#116#59#10#32#32#70#108#97#103#115#32#105#115#32#34+ - #102#108#97#103#115#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102+ - #102#115#101#116#32#49#55#32#98#105#116#115#101#116#32#80#97#110#101#108#70+ - #108#97#103#32#100#101#102#97#117#108#116#32#80#65#78#69#76#95#70#76#65#71+ - #95#78#79#78#69#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#47+ - #47#32#109#111#118#105#110#103#32#112#108#97#116#102#111#114#109#32#111#112+ - #116#105#111#110#115#44#32#110#111#116#32#105#110#32#98#105#110#97#114#121+ - #10#32#32#77#111#118#101#83#112#101#101#100#32#105#115#32#34#109#111#118#101+ - #95#115#112#101#101#100#34#32#116#121#112#101#32#112#111#105#110#116#32#100+ - #101#102#97#117#108#116#32#40#48#32#48#41#32#111#109#105#116#100#101#102#97+ - #117#108#116#59#10#32#32#83#105#122#101#83#112#101#101#100#32#105#115#32#34+ - #115#105#122#101#95#115#112#101#101#100#34#32#116#121#112#101#32#112#111#105+ - #110#116#32#100#101#102#97#117#108#116#32#40#48#32#48#41#32#111#109#105#116+ - #100#101#102#97#117#108#116#59#32#47#47#32#97#108#97#115#44#32#96#115#105+ - #122#101#96#32#99#97#110#110#111#116#32#98#101#32#110#101#103#97#116#105#118+ - #101#10#32#32#77#111#118#101#83#116#97#114#116#32#105#115#32#34#109#111#118+ - #101#95#115#116#97#114#116#34#32#116#121#112#101#32#112#111#105#110#116#32+ - #100#101#102#97#117#108#116#32#40#48#32#48#41#32#111#109#105#116#100#101#102+ - #97#117#108#116#59#10#32#32#77#111#118#101#69#110#100#32#105#115#32#34#109+ - #111#118#101#95#101#110#100#34#32#116#121#112#101#32#112#111#105#110#116#32+ - #100#101#102#97#117#108#116#32#40#48#32#48#41#32#111#109#105#116#100#101#102+ - #97#117#108#116#59#10#32#32#83#105#122#101#69#110#100#32#105#115#32#34#115+ - #105#122#101#95#101#110#100#34#32#116#121#112#101#32#115#105#122#101#32#100+ - #101#102#97#117#108#116#32#40#48#32#48#41#32#111#109#105#116#100#101#102#97+ - #117#108#116#59#10#32#32#77#111#118#101#65#99#116#105#118#101#32#105#115#32+ - #34#109#111#118#101#95#97#99#116#105#118#101#34#32#116#121#112#101#32#98#111+ - #111#108#32#100#101#102#97#117#108#116#32#102#97#108#115#101#32#111#109#105+ - #116#100#101#102#97#117#108#116#59#10#32#32#77#111#118#101#79#110#99#101#32+ - #105#115#32#34#109#111#118#101#95#111#110#99#101#34#32#116#121#112#101#32#98+ - #111#111#108#32#100#101#102#97#117#108#116#32#102#97#108#115#101#32#111#109+ - #105#116#100#101#102#97#117#108#116#59#10#32#32#69#110#100#80#111#115#84#114+ - #105#103#103#101#114#32#105#115#32#34#101#110#100#95#112#111#115#95#116#114+ - #105#103#103#101#114#34#32#116#121#112#101#32#105#110#116#32#116#114#105#103+ - #103#101#114#32#100#101#102#97#117#108#116#32#110#117#108#108#32#111#109#105+ - #116#100#101#102#97#117#108#116#59#10#32#32#69#110#100#83#105#122#101#84#114+ - #105#103#103#101#114#32#105#115#32#34#101#110#100#95#115#105#122#101#95#116+ - #114#105#103#103#101#114#34#32#116#121#112#101#32#105#110#116#32#116#114#105+ - #103#103#101#114#32#100#101#102#97#117#108#116#32#110#117#108#108#32#111#109+ - #105#116#100#101#102#97#117#108#116#59#10#32#32#47#47#32#110#111#116#32#105+ - #110#32#98#105#110#97#114#121#10#32#32#47#47#73#100#32#105#115#32#34#105#100+ - #34#32#116#121#112#101#32#115#116#114#105#110#103#32#100#101#102#97#117#108+ - #116#32#34#34#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#47+ - #47#32#105#110#116#101#114#110#97#108#115#10#32#32#80#97#110#73#100#120#32+ - #105#115#32#34#112#97#110#105#100#120#34#32#116#121#112#101#32#117#105#110+ - #116#32#105#110#116#101#114#110#97#108#59#10#125#10#10#84#73#116#101#109#82+ - #101#99#95#49#32#105#115#32#34#105#116#101#109#34#32#115#105#122#101#32#49+ - #48#32#98#121#116#101#115#32#98#105#110#98#108#111#99#107#32#51#32#123#10#32+ - #32#47#47#88#32#105#115#32#34#120#34#32#116#121#112#101#32#105#110#116#32+ - #111#102#102#115#101#116#32#48#59#10#32#32#47#47#89#32#105#115#32#34#121#34+ - #32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#52#59#10#32+ - #32#80#111#115#32#105#115#32#34#112#111#115#105#116#105#111#110#34#32#116+ - #121#112#101#32#112#111#105#110#116#32#111#102#102#115#101#116#32#48#32#97+ - #115#32#120#121#59#10#32#32#73#116#101#109#84#121#112#101#32#105#115#32#34+ - #116#121#112#101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+ - #115#101#116#32#56#32#101#110#117#109#32#73#116#101#109#59#10#32#32#79#112+ - #116#105#111#110#115#32#105#115#32#34#111#112#116#105#111#110#115#34#32#116+ - #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#57#32#98+ - #105#116#115#101#116#32#73#116#101#109#79#112#116#105#111#110#32#100#101#102+ - #97#117#108#116#32#73#84#69#77#95#79#80#84#73#79#78#95#78#79#78#69#32#111+ - #109#105#116#100#101#102#97#117#108#116#59#10#32#32#47#47#32#110#111#116#32+ - #105#110#32#98#105#110#97#114#121#10#32#32#47#47#73#100#32#105#115#32#34#105+ - #100#34#32#116#121#112#101#32#115#116#114#105#110#103#32#100#101#102#97#117+ - #108#116#32#34#34#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32+ - #47#47#32#105#110#116#101#114#110#97#108#115#10#32#32#73#116#101#109#73#100+ - #120#32#105#115#32#34#105#116#101#109#105#100#120#34#32#116#121#112#101#32+ - #117#105#110#116#32#105#110#116#101#114#110#97#108#59#10#125#10#10#84#77#111+ - #110#115#116#101#114#82#101#99#95#49#32#105#115#32#34#109#111#110#115#116+ - #101#114#34#32#115#105#122#101#32#49#48#32#98#121#116#101#115#32#98#105#110+ - #98#108#111#99#107#32#53#32#123#10#32#32#47#47#88#32#105#115#32#34#120#34#32+ - #116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#48#59#10#32#32+ - #47#47#89#32#105#115#32#34#121#34#32#116#121#112#101#32#105#110#116#32#111+ - #102#102#115#101#116#32#52#59#10#32#32#80#111#115#32#105#115#32#34#112#111+ - #115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111+ - #102#102#115#101#116#32#48#32#97#115#32#120#121#59#10#32#32#77#111#110#115+ - #116#101#114#84#121#112#101#32#105#115#32#34#116#121#112#101#34#32#116#121+ - #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101#110+ - #117#109#32#77#111#110#115#116#101#114#59#10#32#32#68#105#114#101#99#116#105+ - #111#110#32#105#115#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121+ + #105#110#98#108#111#99#107#32#49#32#123#10#32#32#34#112#97#116#104#34#32#116+ + #121#112#101#32#99#104#97#114#91#54#52#93#32#111#102#102#115#101#116#32#48+ + #32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#97#110#105+ + #109#97#116#101#100#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102+ + #115#101#116#32#54#52#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59+ + #10#125#10#10#34#112#97#110#101#108#34#32#115#105#122#101#32#49#56#32#98#121+ + #116#101#115#32#98#105#110#98#108#111#99#107#32#50#32#123#10#32#32#34#112+ + #111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32+ + #111#102#102#115#101#116#32#48#32#97#115#32#120#121#32#119#114#105#116#101+ + #100#101#102#97#117#108#116#59#10#32#32#34#115#105#122#101#34#32#116#121#112+ + #101#32#115#105#122#101#32#111#102#102#115#101#116#32#56#32#97#115#32#119+ + #104#32#97#115#32#119#104#32#119#114#105#116#101#100#101#102#97#117#108#116+ + #59#10#32#32#34#116#101#120#116#117#114#101#34#32#116#121#112#101#32#117#115+ + #104#111#114#116#32#111#102#102#115#101#116#32#49#50#32#116#101#120#116#117+ + #114#101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34+ + #116#121#112#101#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+ + #102#115#101#116#32#49#52#32#98#105#116#115#101#116#32#117#110#105#113#117+ + #101#32#80#97#110#101#108#84#121#112#101#32#119#114#105#116#101#100#101#102+ + #97#117#108#116#59#10#32#32#34#97#108#112#104#97#34#32#116#121#112#101#32+ + #117#98#121#116#101#32#111#102#102#115#101#116#32#49#54#32#100#101#102#97+ + #117#108#116#32#48#59#10#32#32#34#102#108#97#103#115#34#32#116#121#112#101+ + #32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#55#32#98#105#116#115+ + #101#116#32#80#97#110#101#108#70#108#97#103#32#100#101#102#97#117#108#116#32+ + #80#65#78#69#76#95#70#76#65#71#95#78#79#78#69#59#10#32#32#47#47#32#109#111+ + #118#105#110#103#32#112#108#97#116#102#111#114#109#32#111#112#116#105#111+ + #110#115#44#32#110#111#116#32#105#110#32#98#105#110#97#114#121#10#32#32#34+ + #109#111#118#101#95#115#112#101#101#100#34#32#116#121#112#101#32#112#111#105+ + #110#116#32#100#101#102#97#117#108#116#32#40#48#32#48#41#59#10#32#32#34#115+ + #105#122#101#95#115#112#101#101#100#34#32#116#121#112#101#32#112#111#105#110+ + #116#32#100#101#102#97#117#108#116#32#40#48#32#48#41#59#32#47#47#32#97#108+ + #97#115#44#32#96#115#105#122#101#96#32#99#97#110#110#111#116#32#98#101#32+ + #110#101#103#97#116#105#118#101#10#32#32#34#109#111#118#101#95#115#116#97+ + #114#116#34#32#116#121#112#101#32#112#111#105#110#116#32#100#101#102#97#117+ + #108#116#32#40#48#32#48#41#59#10#32#32#34#109#111#118#101#95#101#110#100#34+ + #32#116#121#112#101#32#112#111#105#110#116#32#100#101#102#97#117#108#116#32+ + #40#48#32#48#41#59#10#32#32#34#115#105#122#101#95#101#110#100#34#32#116#121+ + #112#101#32#115#105#122#101#32#100#101#102#97#117#108#116#32#40#48#32#48#41+ + #59#10#32#32#34#109#111#118#101#95#97#99#116#105#118#101#34#32#116#121#112+ + #101#32#98#111#111#108#32#100#101#102#97#117#108#116#32#102#97#108#115#101+ + #59#10#32#32#34#109#111#118#101#95#111#110#99#101#34#32#116#121#112#101#32+ + #98#111#111#108#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#32+ + #32#34#101#110#100#95#112#111#115#95#116#114#105#103#103#101#114#34#32#116+ + #114#105#103#103#101#114#32#100#101#102#97#117#108#116#32#110#117#108#108#59+ + #10#32#32#34#101#110#100#95#115#105#122#101#95#116#114#105#103#103#101#114+ + #34#32#116#114#105#103#103#101#114#32#100#101#102#97#117#108#116#32#110#117+ + #108#108#59#10#125#10#10#34#105#116#101#109#34#32#115#105#122#101#32#49#48+ + #32#98#121#116#101#115#32#98#105#110#98#108#111#99#107#32#51#32#123#10#32#32+ + #34#112#111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110+ + #116#32#111#102#102#115#101#116#32#48#32#97#115#32#120#121#32#119#114#105+ + #116#101#100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#116+ + #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101+ + #110#117#109#32#73#116#101#109#32#119#114#105#116#101#100#101#102#97#117#108+ + #116#59#10#32#32#34#111#112#116#105#111#110#115#34#32#116#121#112#101#32#117+ + #98#121#116#101#32#111#102#102#115#101#116#32#57#32#98#105#116#115#101#116+ + #32#73#116#101#109#79#112#116#105#111#110#32#100#101#102#97#117#108#116#32+ + #73#84#69#77#95#79#80#84#73#79#78#95#78#79#78#69#59#10#125#10#10#34#109#111+ + #110#115#116#101#114#34#32#115#105#122#101#32#49#48#32#98#121#116#101#115#32+ + #98#105#110#98#108#111#99#107#32#53#32#123#10#32#32#34#112#111#115#105#116+ + #105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115+ + #101#116#32#48#32#97#115#32#120#121#32#119#114#105#116#101#100#101#102#97+ + #117#108#116#59#10#32#32#34#116#121#112#101#34#32#116#121#112#101#32#117#98+ + #121#116#101#32#111#102#102#115#101#116#32#56#32#101#110#117#109#32#77#111+ + #110#115#116#101#114#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+ + #32#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121#112#101#32#117#98+ + #121#116#101#32#111#102#102#115#101#116#32#57#32#101#110#117#109#32#68#105+ + #114#84#121#112#101#32#100#101#102#97#117#108#116#32#68#73#82#95#76#69#70#84+ + #59#10#125#10#10#34#97#114#101#97#34#32#115#105#122#101#32#49#48#32#98#121+ + #116#101#115#32#98#105#110#98#108#111#99#107#32#52#32#123#10#32#32#34#112+ + #111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32+ + #111#102#102#115#101#116#32#48#32#97#115#32#120#121#32#119#114#105#116#101+ + #100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#116#121#112+ + #101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101#110#117+ + #109#32#65#114#101#97#84#121#112#101#32#119#114#105#116#101#100#101#102#97+ + #117#108#116#59#10#32#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121+ #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#57#32#101#110+ #117#109#32#68#105#114#84#121#112#101#32#100#101#102#97#117#108#116#32#68#73+ - #82#95#76#69#70#84#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32+ - #47#47#32#110#111#116#32#105#110#32#98#105#110#97#114#121#10#32#32#47#47#73+ - #100#32#105#115#32#34#105#100#34#32#116#121#112#101#32#115#116#114#105#110+ - #103#32#100#101#102#97#117#108#116#32#34#34#32#111#109#105#116#100#101#102+ - #97#117#108#116#59#10#32#32#47#47#32#105#110#116#101#114#110#97#108#115#10+ - #32#32#77#111#110#115#73#100#120#32#105#115#32#34#109#111#110#115#105#100+ - #120#34#32#116#121#112#101#32#117#105#110#116#32#105#110#116#101#114#110#97+ - #108#59#10#125#10#10#84#65#114#101#97#82#101#99#95#49#32#105#115#32#34#97+ - #114#101#97#34#32#115#105#122#101#32#49#48#32#98#121#116#101#115#32#98#105+ - #110#98#108#111#99#107#32#52#32#123#10#32#32#47#47#88#32#105#115#32#34#120+ - #34#32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#48#59#10+ - #32#32#47#47#89#32#105#115#32#34#121#34#32#116#121#112#101#32#105#110#116#32+ - #111#102#102#115#101#116#32#52#59#10#32#32#80#111#115#32#105#115#32#34#112+ - #111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32+ - #111#102#102#115#101#116#32#48#32#97#115#32#120#121#59#10#32#32#65#114#101+ - #97#84#121#112#101#32#105#115#32#34#116#121#112#101#34#32#116#121#112#101#32+ - #117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101#110#117#109#32+ - #65#114#101#97#84#121#112#101#59#10#32#32#68#105#114#101#99#116#105#111#110+ - #32#105#115#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121#112#101+ - #32#117#98#121#116#101#32#111#102#102#115#101#116#32#57#32#101#110#117#109+ - #32#68#105#114#84#121#112#101#32#100#101#102#97#117#108#116#32#68#73#82#95+ - #76#69#70#84#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#47#47+ - #32#110#111#116#32#105#110#32#98#105#110#97#114#121#10#32#32#47#47#73#100#32+ - #105#115#32#34#105#100#34#32#116#121#112#101#32#115#116#114#105#110#103#32+ - #100#101#102#97#117#108#116#32#34#34#32#111#109#105#116#100#101#102#97#117+ - #108#116#59#10#32#32#47#47#32#105#110#116#101#114#110#97#108#115#10#32#32#65+ - #114#101#97#73#100#120#32#105#115#32#34#97#114#101#97#105#100#120#34#32#116+ - #121#112#101#32#117#105#110#116#32#105#110#116#101#114#110#97#108#59#10#125+ - #10#10#84#84#114#105#103#103#101#114#82#101#99#95#49#32#105#115#32#34#116+ - #114#105#103#103#101#114#34#32#115#105#122#101#32#49#52#56#32#98#121#116#101+ - #115#32#98#105#110#98#108#111#99#107#32#54#32#123#10#32#32#47#47#88#32#105+ - #115#32#34#120#34#32#116#121#112#101#32#105#110#116#32#111#102#102#115#101+ - #116#32#48#59#10#32#32#47#47#89#32#105#115#32#34#121#34#32#116#121#112#101+ - #32#105#110#116#32#111#102#102#115#101#116#32#52#59#10#32#32#80#111#115#32+ - #105#115#32#34#112#111#115#105#116#105#111#110#34#32#116#121#112#101#32#112+ - #111#105#110#116#32#111#102#102#115#101#116#32#48#32#97#115#32#120#121#59#10+ - #32#32#47#47#87#105#100#116#104#32#105#115#32#34#119#105#100#116#104#34#32+ - #116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#56+ - #59#10#32#32#47#47#72#101#105#103#104#116#32#105#115#32#34#104#101#105#103+ - #104#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+ - #101#116#32#49#48#59#10#32#32#83#105#122#101#32#105#115#32#34#115#105#122+ - #101#34#32#116#121#112#101#32#115#105#122#101#32#111#102#102#115#101#116#32+ - #56#32#97#115#32#119#104#59#10#32#32#69#110#97#98#108#101#100#32#105#115#32+ - #34#101#110#97#98#108#101#100#34#32#116#121#112#101#32#98#111#111#108#32#111+ - #102#102#115#101#116#32#49#50#32#100#101#102#97#117#108#116#32#116#114#117+ - #101#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#84#101#120+ - #116#117#114#101#80#97#110#101#108#32#105#115#32#34#116#101#120#116#117#114+ - #101#112#97#110#101#108#34#32#116#121#112#101#32#105#110#116#32#111#102#102+ - #115#101#116#32#49#51#32#112#97#110#101#108#32#100#101#102#97#117#108#116#32+ - #110#117#108#108#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32+ - #84#114#105#103#103#101#114#84#121#112#101#32#105#115#32#34#116#121#112#101+ - #34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+ - #49#55#32#101#110#117#109#32#84#114#105#103#103#101#114#84#121#112#101#59#10+ - #32#32#65#99#116#105#118#97#116#101#84#121#112#101#32#105#115#32#34#97#99+ - #116#105#118#97#116#101#116#121#112#101#34#32#116#121#112#101#32#117#98#121+ - #116#101#32#111#102#102#115#101#116#32#49#56#32#98#105#116#115#101#116#32#65+ - #99#116#105#118#97#116#101#84#121#112#101#59#10#32#32#75#101#121#115#32#105+ - #115#32#34#107#101#121#115#34#32#116#121#112#101#32#117#98#121#116#101#32+ - #111#102#102#115#101#116#32#49#57#32#98#105#116#115#101#116#32#75#101#121#32+ - #100#101#102#97#117#108#116#32#75#69#89#95#78#79#78#69#32#111#109#105#116+ - #100#101#102#97#117#108#116#59#10#32#32#47#47#87#65#82#78#73#78#71#58#32#34+ - #116#114#105#103#100#97#116#97#34#32#77#85#83#84#32#98#101#32#100#101#102+ - #105#110#101#100#32#98#101#102#111#114#101#32#34#116#121#112#101#34#44#32#97+ - #110#100#32#34#116#121#112#101#34#32#77#85#83#84#32#98#101#32#110#97#109#101+ - #100#32#34#116#121#112#101#34#32#40#102#111#114#32#110#111#119#44#32#99#97+ - #110#32#98#101#32#99#104#97#110#103#101#100#32#108#97#116#101#114#41#10#32+ - #32#68#65#84#65#32#105#115#32#34#116#114#105#103#103#101#114#100#97#116#97+ - #34#32#116#121#112#101#32#116#114#105#103#100#97#116#97#91#49#50#56#93#32+ - #111#102#102#115#101#116#32#50#48#59#32#47#47#32#116#104#101#32#111#110#108+ - #121#32#115#112#101#99#105#97#108#32#110#101#115#116#101#100#32#115#116#114+ - #117#99#116#117#114#101#10#32#32#47#47#32#110#111#116#32#105#110#32#98#105+ - #110#97#114#121#10#32#32#47#47#73#100#32#105#115#32#34#105#100#34#32#116#121+ - #112#101#32#115#116#114#105#110#103#32#100#101#102#97#117#108#116#32#34#34+ - #32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#47#47#32#105#110+ - #116#101#114#110#97#108#115#10#32#32#84#114#105#103#73#100#120#32#105#115#32+ - #34#116#114#105#103#105#100#120#34#32#116#121#112#101#32#117#105#110#116#32+ - #105#110#116#101#114#110#97#108#59#10#125#10#10#10#47#47#47#47#47#47#47#47+ + #82#95#76#69#70#84#59#10#125#10#10#34#116#114#105#103#103#101#114#34#32#115+ + #105#122#101#32#49#52#56#32#98#121#116#101#115#32#98#105#110#98#108#111#99+ + #107#32#54#32#123#10#32#32#34#112#111#115#105#116#105#111#110#34#32#116#121+ + #112#101#32#112#111#105#110#116#32#111#102#102#115#101#116#32#48#32#97#115+ + #32#120#121#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34+ + #115#105#122#101#34#32#116#121#112#101#32#115#105#122#101#32#111#102#102#115+ + #101#116#32#56#32#97#115#32#119#104#32#119#114#105#116#101#100#101#102#97+ + #117#108#116#59#10#32#32#34#101#110#97#98#108#101#100#34#32#116#121#112#101+ + #32#98#111#111#108#32#111#102#102#115#101#116#32#49#50#32#100#101#102#97#117+ + #108#116#32#116#114#117#101#59#10#32#32#34#116#101#120#116#117#114#101#95+ + #112#97#110#101#108#34#32#116#121#112#101#32#105#110#116#32#111#102#102#115+ + #101#116#32#49#51#32#112#97#110#101#108#32#100#101#102#97#117#108#116#32#110+ + #117#108#108#59#10#32#32#34#116#121#112#101#34#32#116#121#112#101#32#117#98+ + #121#116#101#32#111#102#102#115#101#116#32#49#55#32#101#110#117#109#32#84+ + #114#105#103#103#101#114#84#121#112#101#32#119#114#105#116#101#100#101#102+ + #97#117#108#116#59#10#32#32#34#97#99#116#105#118#97#116#101#95#116#121#112+ + #101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116+ + #32#49#56#32#98#105#116#115#101#116#32#65#99#116#105#118#97#116#101#84#121+ + #112#101#59#10#32#32#34#107#101#121#115#34#32#116#121#112#101#32#117#98#121+ + #116#101#32#111#102#102#115#101#116#32#49#57#32#98#105#116#115#101#116#32#75+ + #101#121#32#100#101#102#97#117#108#116#32#75#69#89#95#78#79#78#69#59#10#32+ + #32#47#47#87#65#82#78#73#78#71#58#32#34#116#114#105#103#100#97#116#97#34#32+ + #77#85#83#84#32#98#101#32#100#101#102#105#110#101#100#32#98#101#102#111#114+ + #101#32#34#116#121#112#101#34#44#32#97#110#100#32#34#116#121#112#101#34#32+ + #77#85#83#84#32#98#101#32#110#97#109#101#100#32#34#116#121#112#101#34#32#40+ + #102#111#114#32#110#111#119#44#32#99#97#110#32#98#101#32#99#104#97#110#103+ + #101#100#32#108#97#116#101#114#41#10#32#32#34#116#114#105#103#103#101#114+ + #100#97#116#97#34#32#116#121#112#101#32#116#114#105#103#100#97#116#97#91#49+ + #50#56#93#32#111#102#102#115#101#116#32#50#48#59#32#47#47#32#116#104#101#32+ + #111#110#108#121#32#115#112#101#99#105#97#108#32#110#101#115#116#101#100#32+ + #115#116#114#117#99#116#117#114#101#10#125#10#10#10#47#47#47#47#47#47#47#47+ #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+ #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+ - #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#10#47#42+ - #10#101#110#117#109#32#123#10#32#32#84#69#88#84#85#82#69#95#78#65#77#69#95+ - #87#65#84#69#82#32#61#32#39#95#119#97#116#101#114#95#48#39#44#10#32#32#84#69+ - #88#84#85#82#69#95#78#65#77#69#95#65#67#73#68#49#32#61#32#39#95#119#97#116+ - #101#114#95#49#39#44#10#32#32#84#69#88#84#85#82#69#95#78#65#77#69#95#65#67+ - #73#68#50#32#61#32#39#95#119#97#116#101#114#95#50#39#44#10#125#10#42#47#10+ - #10#101#110#117#109#32#84#101#120#116#117#114#101#83#112#101#99#105#97#108+ - #32#123#10#32#32#84#69#88#84#85#82#69#95#83#80#69#67#73#65#76#95#87#65#84#69+ - #82#32#61#32#45#49#44#10#32#32#84#69#88#84#85#82#69#95#83#80#69#67#73#65#76+ - #95#65#67#73#68#49#32#61#32#45#50#44#10#32#32#84#69#88#84#85#82#69#95#83#80+ - #69#67#73#65#76#95#65#67#73#68#50#32#61#32#45#51#44#10#32#32#84#69#88#84#85+ - #82#69#95#78#79#78#69#32#61#32#45#52#44#10#125#10#10#47#47#32#100#105#114+ - #101#99#116#105#111#110#115#10#101#110#117#109#32#68#105#114#84#121#112#101+ - #32#123#10#32#32#68#73#82#95#76#69#70#84#44#32#47#47#32#48#10#32#32#68#73#82+ - #95#82#73#71#72#84#44#32#47#47#32#49#10#32#32#68#73#82#95#83#79#77#69#84#72+ - #73#78#71#50#44#32#47#47#32#50#10#125#10#10#47#47#32#116#114#105#103#103#101+ - #114#115#10#101#110#117#109#32#84#114#105#103#103#101#114#84#121#112#101#32+ - #123#10#32#32#84#82#73#71#71#69#82#95#78#79#78#69#44#32#47#47#32#48#10#32#32+ - #84#82#73#71#71#69#82#95#69#88#73#84#44#32#47#47#32#49#10#32#32#84#82#73#71+ - #71#69#82#95#84#69#76#69#80#79#82#84#44#32#47#47#32#50#10#32#32#84#82#73#71+ - #71#69#82#95#79#80#69#78#68#79#79#82#44#32#47#47#32#51#10#32#32#84#82#73#71+ - #71#69#82#95#67#76#79#83#69#68#79#79#82#44#32#47#47#32#52#10#32#32#84#82#73+ - #71#71#69#82#95#68#79#79#82#44#32#47#47#32#53#10#32#32#84#82#73#71#71#69#82+ - #95#68#79#79#82#53#44#32#47#47#32#54#10#32#32#84#82#73#71#71#69#82#95#67#76+ - #79#83#69#84#82#65#80#44#32#47#47#32#55#10#32#32#84#82#73#71#71#69#82#95#84+ - #82#65#80#44#32#47#47#32#56#10#32#32#84#82#73#71#71#69#82#95#80#82#69#83#83+ - #44#32#47#47#32#57#10#32#32#84#82#73#71#71#69#82#95#83#69#67#82#69#84#44#32+ - #47#47#32#49#48#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#85#80#44#32#47+ - #47#32#49#49#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#68#79#87#78#44#32+ - #47#47#32#49#50#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#44#32#47#47#32+ - #49#51#10#32#32#84#82#73#71#71#69#82#95#84#69#88#84#85#82#69#44#32#47#47#32+ - #49#52#10#32#32#84#82#73#71#71#69#82#95#79#78#44#32#47#47#32#49#53#10#32#32+ - #84#82#73#71#71#69#82#95#79#70#70#44#32#47#47#32#49#54#10#32#32#84#82#73#71+ - #71#69#82#95#79#78#79#70#70#44#32#47#47#32#49#55#10#32#32#84#82#73#71#71#69+ - #82#95#83#79#85#78#68#44#32#47#47#32#49#56#10#32#32#84#82#73#71#71#69#82#95+ - #83#80#65#87#78#77#79#78#83#84#69#82#44#32#47#47#32#49#57#10#32#32#84#82#73+ - #71#71#69#82#95#83#80#65#87#78#73#84#69#77#44#32#47#47#32#50#48#10#32#32#84+ - #82#73#71#71#69#82#95#77#85#83#73#67#44#32#47#47#32#50#49#10#32#32#84#82#73+ - #71#71#69#82#95#80#85#83#72#44#32#47#47#32#50#50#10#32#32#84#82#73#71#71#69+ - #82#95#83#67#79#82#69#44#32#47#47#32#50#51#10#32#32#84#82#73#71#71#69#82#95+ - #77#69#83#83#65#71#69#44#32#47#47#32#50#52#10#32#32#84#82#73#71#71#69#82#95+ - #68#65#77#65#71#69#44#32#47#47#32#50#53#10#32#32#84#82#73#71#71#69#82#95#72+ - #69#65#76#84#72#44#32#47#47#32#50#54#10#32#32#84#82#73#71#71#69#82#95#83#72+ - #79#84#44#32#47#47#32#50#55#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67+ - #84#44#32#47#47#32#50#56#10#32#32#84#82#73#71#71#69#82#95#83#67#82#73#80#84+ - #44#32#47#47#32#50#57#10#32#32#47#47#10#32#32#84#82#73#71#71#69#82#95#77#65+ - #88#32#61#32#77#65#88#44#10#125#10#10#47#47#32#34#97#115#32#88#88#88#34#32+ - #109#101#97#110#115#32#34#103#101#110#101#114#97#116#101#32#116#104#105#115+ - #32#105#100#101#110#116#105#102#105#101#114#32#102#111#114#32#112#97#115#99+ - #97#108#32#115#111#117#114#99#101#115#10#98#105#116#115#101#116#32#80#97#110+ - #101#108#84#121#112#101#32#123#10#32#32#80#65#78#69#76#95#78#79#78#69#32#61+ - #32#48#44#32#47#47#32#48#10#32#32#80#65#78#69#76#95#87#65#76#76#44#32#47#47+ - #32#49#10#32#32#80#65#78#69#76#95#66#65#67#75#44#32#47#47#32#50#10#32#32#80+ - #65#78#69#76#95#70#79#82#69#44#32#47#47#32#52#10#32#32#80#65#78#69#76#95#87+ - #65#84#69#82#44#32#47#47#32#56#10#32#32#80#65#78#69#76#95#65#67#73#68#49#44+ - #32#47#47#32#49#54#10#32#32#80#65#78#69#76#95#65#67#73#68#50#44#32#47#47#32+ - #51#50#10#32#32#80#65#78#69#76#95#83#84#69#80#44#32#47#47#32#54#52#10#32#32+ - #80#65#78#69#76#95#76#73#70#84#85#80#44#32#47#47#32#49#50#56#10#32#32#80#65+ - #78#69#76#95#76#73#70#84#68#79#87#78#44#32#47#47#32#50#53#54#10#32#32#80#65+ - #78#69#76#95#79#80#69#78#68#79#79#82#44#32#47#47#32#53#49#50#10#32#32#80#65+ - #78#69#76#95#67#76#79#83#69#68#79#79#82#44#32#47#47#32#49#48#50#52#10#32#32+ - #80#65#78#69#76#95#66#76#79#67#75#77#79#78#44#32#47#47#32#50#48#52#56#10#32+ - #32#80#65#78#69#76#95#76#73#70#84#76#69#70#84#44#32#47#47#32#52#48#57#54#10+ - #32#32#80#65#78#69#76#95#76#73#70#84#82#73#71#72#84#44#32#47#47#32#56#49#57+ - #50#10#125#10#10#98#105#116#115#101#116#32#80#97#110#101#108#70#108#97#103+ - #32#123#10#32#32#80#65#78#69#76#95#70#76#65#71#95#78#79#78#69#32#61#32#48#44+ - #32#47#47#32#48#10#32#32#80#65#78#69#76#95#70#76#65#71#95#66#76#69#78#68#73+ - #78#71#44#32#47#47#32#49#10#32#32#80#65#78#69#76#95#70#76#65#71#95#72#73#68+ - #69#44#32#47#47#32#50#10#32#32#80#65#78#69#76#95#70#76#65#71#95#87#65#84#69+ - #82#84#69#88#84#85#82#69#83#44#32#47#47#32#52#10#125#10#10#101#110#117#109+ - #32#69#102#102#101#99#116#65#99#116#105#111#110#32#123#10#32#32#69#70#70#69+ - #67#84#95#78#79#78#69#44#32#47#47#32#48#10#32#32#69#70#70#69#67#84#95#84#69+ - #76#69#80#79#82#84#44#32#47#47#32#49#10#32#32#69#70#70#69#67#84#95#82#69#83+ - #80#65#87#78#44#32#47#47#32#50#10#32#32#69#70#70#69#67#84#95#70#73#82#69#44+ - #32#47#47#32#51#10#125#10#10#101#110#117#109#32#73#116#101#109#32#123#10#32+ - #32#73#84#69#77#95#78#79#78#69#44#32#47#47#32#48#10#32#32#73#84#69#77#95#77+ - #69#68#75#73#84#95#83#77#65#76#76#44#32#47#47#32#49#10#32#32#73#84#69#77#95+ - #77#69#68#75#73#84#95#76#65#82#71#69#44#32#47#47#32#50#10#32#32#73#84#69#77+ - #95#77#69#68#75#73#84#95#66#76#65#67#75#44#32#47#47#32#51#10#32#32#73#84#69+ - #77#95#65#82#77#79#82#95#71#82#69#69#78#44#32#47#47#32#52#10#32#32#73#84#69+ - #77#95#65#82#77#79#82#95#66#76#85#69#44#32#47#47#32#53#10#32#32#73#84#69#77+ - #95#83#80#72#69#82#69#95#66#76#85#69#44#32#47#47#32#54#10#32#32#73#84#69#77+ - #95#83#80#72#69#82#69#95#87#72#73#84#69#44#32#47#47#32#55#10#32#32#73#84#69+ - #77#95#83#85#73#84#44#32#47#47#32#56#10#32#32#73#84#69#77#95#79#88#89#71#69+ - #78#44#32#47#47#32#57#10#32#32#73#84#69#77#95#73#78#86#85#76#44#32#47#47#32+ - #49#48#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#65#87#44#32#47#47#32+ - #49#49#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#72#79#84#71#85#78#49+ - #44#32#47#47#32#49#50#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#72#79+ - #84#71#85#78#50#44#32#47#47#32#49#51#10#32#32#73#84#69#77#95#87#69#65#80#79+ - #78#95#67#72#65#73#78#71#85#78#44#32#47#47#32#49#52#10#32#32#73#84#69#77#95+ - #87#69#65#80#79#78#95#82#79#67#75#69#84#76#65#85#78#67#72#69#82#44#32#47#47+ - #32#49#53#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#80#76#65#83#77#65#44+ - #32#47#47#32#49#54#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#66#70#71#44+ - #32#47#47#32#49#55#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#85#80#69+ - #82#80#85#76#69#77#69#84#44#32#47#47#32#49#56#10#32#32#73#84#69#77#95#65#77+ - #77#79#95#66#85#76#76#69#84#83#44#32#47#47#32#49#57#10#32#32#73#84#69#77#95+ - #65#77#77#79#95#66#85#76#76#69#84#83#95#66#79#88#44#32#47#47#32#50#48#10#32+ - #32#73#84#69#77#95#65#77#77#79#95#83#72#69#76#76#83#44#32#47#47#32#50#49#10+ - #32#32#73#84#69#77#95#65#77#77#79#95#83#72#69#76#76#83#95#66#79#88#44#32#47+ - #47#32#50#50#10#32#32#73#84#69#77#95#65#77#77#79#95#82#79#67#75#69#84#44#32+ - #47#47#32#50#51#10#32#32#73#84#69#77#95#65#77#77#79#95#82#79#67#75#69#84#95+ - #66#79#88#44#32#47#47#32#50#52#10#32#32#73#84#69#77#95#65#77#77#79#95#67#69+ - #76#76#44#32#47#47#32#50#53#10#32#32#73#84#69#77#95#65#77#77#79#95#67#69#76+ - #76#95#66#73#71#44#32#47#47#32#50#54#10#32#32#73#84#69#77#95#65#77#77#79#95+ - #66#65#67#75#80#65#67#75#44#32#47#47#32#50#55#10#32#32#73#84#69#77#95#75#69+ - #89#95#82#69#68#44#32#47#47#32#50#56#10#32#32#73#84#69#77#95#75#69#89#95#71+ - #82#69#69#78#44#32#47#47#32#50#57#10#32#32#73#84#69#77#95#75#69#89#95#66#76+ - #85#69#44#32#47#47#32#51#48#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#75+ - #65#83#84#69#84#44#32#47#47#32#51#49#10#32#32#73#84#69#77#95#87#69#65#80#79+ - #78#95#80#73#83#84#79#76#44#32#47#47#32#51#50#10#32#32#73#84#69#77#95#66#79+ - #84#84#76#69#44#32#47#47#32#51#51#10#32#32#73#84#69#77#95#72#69#76#77#69#84+ - #44#32#47#47#32#51#52#10#32#32#73#84#69#77#95#74#69#84#80#65#67#75#44#32#47+ - #47#32#51#53#10#32#32#73#84#69#77#95#73#78#86#73#83#44#32#47#47#32#51#54#10+ - #32#32#73#84#69#77#95#87#69#65#80#79#78#95#70#76#65#77#69#84#72#82#79#87#69+ - #82#44#32#47#47#32#51#55#10#32#32#73#84#69#77#95#65#77#77#79#95#70#85#69#76+ - #67#65#78#44#32#47#47#32#51#56#10#32#32#47#47#10#32#32#73#84#69#77#95#77#65+ - #88#32#61#32#77#65#88#44#32#47#47#32#115#116#111#114#101#32#116#104#101#32+ - #108#97#115#116#32#105#116#101#109#39#115#32#105#100#32#105#110#32#104#101+ - #114#101#32#117#115#101#32#116#104#105#115#32#105#110#32#102#111#114#32#108+ - #111#111#112#115#10#125#10#10#98#105#116#115#101#116#32#73#116#101#109#79+ - #112#116#105#111#110#32#123#10#32#32#73#84#69#77#95#79#80#84#73#79#78#95#78+ - #79#78#69#32#61#32#48#44#32#47#47#32#48#10#32#32#73#84#69#77#95#79#80#84#73+ - #79#78#95#79#78#76#89#68#77#44#32#47#47#32#49#10#32#32#73#84#69#77#95#79#80+ - #84#73#79#78#95#70#65#76#76#44#32#47#47#32#50#10#125#10#10#101#110#117#109+ - #32#65#114#101#97#84#121#112#101#32#123#10#32#32#65#82#69#65#95#78#79#78#69+ - #44#32#47#47#32#48#10#32#32#65#82#69#65#95#80#76#65#89#69#82#80#79#73#78#84+ - #49#44#32#47#47#32#49#10#32#32#65#82#69#65#95#80#76#65#89#69#82#80#79#73#78+ - #84#50#44#32#47#47#32#50#10#32#32#65#82#69#65#95#68#77#80#79#73#78#84#44#32+ - #47#47#32#51#10#32#32#65#82#69#65#95#82#69#68#70#76#65#71#44#32#47#47#32#52+ - #10#32#32#65#82#69#65#95#66#76#85#69#70#76#65#71#44#32#47#47#32#53#10#32#32+ - #65#82#69#65#95#68#79#77#70#76#65#71#44#32#47#47#32#54#10#32#32#65#82#69#65+ - #95#82#69#68#84#69#65#77#80#79#73#78#84#44#32#47#47#32#55#10#32#32#65#82#69+ - #65#95#66#76#85#69#84#69#65#77#80#79#73#78#84#44#32#47#47#32#56#10#125#10#10+ - #101#110#117#109#32#77#111#110#115#116#101#114#32#123#10#32#32#77#79#78#83+ - #84#69#82#95#78#79#78#69#44#32#47#47#32#48#10#32#32#77#79#78#83#84#69#82#95+ - #68#69#77#79#78#44#32#47#47#32#49#10#32#32#77#79#78#83#84#69#82#95#73#77#80+ - #44#32#47#47#32#50#10#32#32#77#79#78#83#84#69#82#95#90#79#77#66#89#44#32#47+ - #47#32#51#10#32#32#77#79#78#83#84#69#82#95#83#69#82#71#44#32#47#47#32#52#10+ - #32#32#77#79#78#83#84#69#82#95#67#89#66#69#82#44#32#47#47#32#53#10#32#32#77+ - #79#78#83#84#69#82#95#67#71#85#78#44#32#47#47#32#54#10#32#32#77#79#78#83#84+ - #69#82#95#66#65#82#79#78#44#32#47#47#32#55#10#32#32#77#79#78#83#84#69#82#95+ - #75#78#73#71#72#84#44#32#47#47#32#56#10#32#32#77#79#78#83#84#69#82#95#67#65+ - #67#79#44#32#47#47#32#57#10#32#32#77#79#78#83#84#69#82#95#83#79#85#76#44#32+ - #47#47#32#49#48#10#32#32#77#79#78#83#84#69#82#95#80#65#73#78#44#32#47#47#32+ - #49#49#10#32#32#77#79#78#83#84#69#82#95#83#80#73#68#69#82#44#32#47#47#32#49+ - #50#10#32#32#77#79#78#83#84#69#82#95#66#83#80#44#32#47#47#32#49#51#10#32#32+ - #77#79#78#83#84#69#82#95#77#65#78#67#85#66#44#32#47#47#32#49#52#10#32#32#77+ - #79#78#83#84#69#82#95#83#75#69#76#44#32#47#47#32#49#53#10#32#32#77#79#78#83+ - #84#69#82#95#86#73#76#69#44#32#47#47#32#49#54#10#32#32#77#79#78#83#84#69#82+ - #95#70#73#83#72#44#32#47#47#32#49#55#10#32#32#77#79#78#83#84#69#82#95#66#65+ - #82#82#69#76#44#32#47#47#32#49#56#10#32#32#77#79#78#83#84#69#82#95#82#79#66+ - #79#44#32#47#47#32#49#57#10#32#32#77#79#78#83#84#69#82#95#77#65#78#44#32#47+ - #47#32#50#48#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#83+ - #104#111#116#32#123#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#80#73#83+ - #84#79#76#44#32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95+ - #66#85#76#76#69#84#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#83#72+ - #79#84#95#83#72#79#84#71#85#78#44#32#47#47#32#50#10#32#32#84#82#73#71#71#69+ - #82#95#83#72#79#84#95#83#83#71#44#32#47#47#32#51#10#32#32#84#82#73#71#71#69+ - #82#95#83#72#79#84#95#73#77#80#44#32#47#47#32#52#10#32#32#84#82#73#71#71#69+ - #82#95#83#72#79#84#95#80#76#65#83#77#65#44#32#47#47#32#53#10#32#32#84#82#73+ - #71#71#69#82#95#83#72#79#84#95#83#80#73#68#69#82#44#32#47#47#32#54#10#32#32+ - #84#82#73#71#71#69#82#95#83#72#79#84#95#67#65#67#79#44#32#47#47#32#55#10#32+ - #32#84#82#73#71#71#69#82#95#83#72#79#84#95#66#65#82#79#78#44#32#47#47#32#56+ - #10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#77#65#78#67#85#66#44#32#47+ - #47#32#57#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#82#69#86#44#32#47+ - #47#32#49#48#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#82#79#67#75#69+ - #84#44#32#47#47#32#49#49#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#66+ - #70#71#44#32#47#47#32#49#50#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95+ - #69#88#80#76#44#32#47#47#32#49#51#10#32#32#84#82#73#71#71#69#82#95#83#72#79+ - #84#95#66#70#71#69#88#80#76#44#32#47#47#32#49#52#10#32#32#47#47#10#32#32#84+ - #82#73#71#71#69#82#95#83#72#79#84#95#77#65#88#32#61#32#77#65#88#44#10#125#10+ - #10#101#110#117#109#32#84#114#105#103#103#101#114#83#104#111#116#84#97#114+ - #103#101#116#32#123#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84#65#82+ - #71#69#84#95#78#79#78#69#44#32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95+ - #83#72#79#84#95#84#65#82#71#69#84#95#77#79#78#44#32#47#47#32#49#10#32#32#84+ - #82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#80#76#82#44#32#47+ - #47#32#50#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69#84+ - #95#82#69#68#44#32#47#47#32#51#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84+ - #95#84#65#82#71#69#84#95#66#76#85#69#44#32#47#47#32#52#10#32#32#84#82#73#71+ - #71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#77#79#78#80#76#82#44#32#47+ - #47#32#53#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69#84+ - #95#80#76#82#77#79#78#44#32#47#47#32#54#10#125#10#10#101#110#117#109#32#84+ - #114#105#103#103#101#114#83#104#111#116#65#105#109#32#123#10#32#32#84#82#73+ - #71#71#69#82#95#83#72#79#84#95#65#73#77#95#68#69#70#65#85#76#84#44#32#47#47+ - #32#48#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#65#73#77#95#65#76#76+ - #77#65#80#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95+ - #65#73#77#95#84#82#65#67#69#44#32#47#47#32#50#10#32#32#84#82#73#71#71#69#82+ - #95#83#72#79#84#95#65#73#77#95#84#82#65#67#69#65#76#76#44#32#47#47#32#51#10+ - #125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#69#102#102#101#99+ - #116#32#123#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#80#65#82+ - #84#73#67#76#69#44#32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#69#70#70+ - #69#67#84#95#65#78#73#77#65#84#73#79#78#44#32#47#47#32#49#10#125#10#10#101+ - #110#117#109#32#84#114#105#103#103#101#114#69#102#102#101#99#116#84#121#112+ - #101#32#123#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#83#76#73+ - #81#85#73#68#44#32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69+ - #67#84#95#76#76#73#81#85#73#68#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69+ - #82#95#69#70#70#69#67#84#95#68#76#73#81#85#73#68#44#32#47#47#32#50#10#32#32+ - #84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#66#76#79#79#68#44#32#47#47#32+ - #51#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#83#80#65#82#75#44+ - #32#47#47#32#52#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#66#85+ - #66#66#76#69#44#32#47#47#32#53#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69+ - #67#84#95#77#65#88#32#61#32#77#65#88#44#10#125#10#10#101#110#117#109#32#84+ - #114#105#103#103#101#114#69#102#102#101#99#116#80#111#115#32#123#10#32#32#84+ - #82#73#71#71#69#82#95#69#70#70#69#67#84#95#80#79#83#95#67#69#78#84#69#82#44+ - #32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#80#79+ - #83#95#65#82#69#65#44#32#47#47#32#49#10#125#10#10#98#105#116#115#101#116#32+ - #65#99#116#105#118#97#116#101#84#121#112#101#32#123#10#32#32#65#67#84#73#86+ - #65#84#69#95#78#79#78#69#32#61#32#48#44#32#47#47#32#48#10#32#32#65#67#84#73+ - #86#65#84#69#95#80#76#65#89#69#82#67#79#76#76#73#68#69#44#32#47#47#32#49#10+ - #32#32#65#67#84#73#86#65#84#69#95#77#79#78#83#84#69#82#67#79#76#76#73#68#69+ - #44#32#47#47#32#50#10#32#32#65#67#84#73#86#65#84#69#95#80#76#65#89#69#82#80+ - #82#69#83#83#44#32#47#47#32#52#10#32#32#65#67#84#73#86#65#84#69#95#77#79#78+ - #83#84#69#82#80#82#69#83#83#44#32#47#47#32#56#10#32#32#65#67#84#73#86#65#84+ - #69#95#83#72#79#84#44#32#47#47#32#49#54#10#32#32#65#67#84#73#86#65#84#69#95+ - #78#79#77#79#78#83#84#69#82#44#32#47#47#32#51#50#10#32#32#65#67#84#73#86#65+ - #84#69#95#67#85#83#84#79#77#32#61#32#50#53#53#44#32#47#47#32#110#111#116#101+ - #32#116#104#97#116#32#34#100#105#114#101#99#116#32#97#115#115#105#103#110#34+ - #32#102#105#101#108#100#32#100#111#101#115#110#39#116#32#97#102#102#101#99+ - #116#32#98#105#116#32#99#111#117#110#116#101#114#10#125#10#10#98#105#116#115+ - #101#116#32#75#101#121#32#123#10#32#32#75#69#89#95#78#79#78#69#32#61#32#48+ - #44#32#47#47#32#48#10#32#32#75#69#89#95#82#69#68#44#32#47#47#32#49#10#32#32+ - #75#69#89#95#71#82#69#69#78#44#32#47#47#32#50#10#32#32#75#69#89#95#66#76#85+ - #69#44#32#47#47#32#52#10#32#32#75#69#89#95#82#69#68#84#69#65#77#44#32#47#47+ - #32#56#10#32#32#75#69#89#95#66#76#85#69#84#69#65#77#44#32#47#47#32#49#54#10+ - #125#10#10#10#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+ + #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#10#47#47+ + #32#115#112#101#99#105#97#108#32#116#101#120#116#117#114#101#32#105#100#101+ + #110#116#105#102#105#101#114#115#44#32#117#115#101#100#32#116#111#32#103#101+ + #110#101#114#97#116#101#32#112#97#115#99#97#108#32#115#111#117#114#99#101+ + #115#10#101#110#117#109#32#84#101#120#116#117#114#101#83#112#101#99#105#97+ + #108#32#123#10#32#32#84#69#88#84#85#82#69#95#83#80#69#67#73#65#76#95#87#65+ + #84#69#82#32#61#32#45#49#44#10#32#32#84#69#88#84#85#82#69#95#83#80#69#67#73+ + #65#76#95#65#67#73#68#49#32#61#32#45#50#44#10#32#32#84#69#88#84#85#82#69#95+ + #83#80#69#67#73#65#76#95#65#67#73#68#50#32#61#32#45#51#44#10#32#32#84#69#88+ + #84#85#82#69#95#78#79#78#69#32#61#32#45#52#44#10#125#10#10#47#47#32#100#105+ + #114#101#99#116#105#111#110#115#10#101#110#117#109#32#68#105#114#84#121#112+ + #101#32#123#10#32#32#68#73#82#95#76#69#70#84#44#32#47#47#32#48#10#32#32#68+ + #73#82#95#82#73#71#72#84#44#32#47#47#32#49#10#32#32#68#73#82#95#83#79#77#69+ + #84#72#73#78#71#50#44#32#47#47#32#50#10#125#10#10#47#47#32#116#114#105#103+ + #103#101#114#115#10#101#110#117#109#32#84#114#105#103#103#101#114#84#121#112+ + #101#32#123#10#32#32#84#82#73#71#71#69#82#95#78#79#78#69#44#32#47#47#32#48+ + #10#32#32#84#82#73#71#71#69#82#95#69#88#73#84#44#32#47#47#32#49#10#32#32#84+ + #82#73#71#71#69#82#95#84#69#76#69#80#79#82#84#44#32#47#47#32#50#10#32#32#84+ + #82#73#71#71#69#82#95#79#80#69#78#68#79#79#82#44#32#47#47#32#51#10#32#32#84+ + #82#73#71#71#69#82#95#67#76#79#83#69#68#79#79#82#44#32#47#47#32#52#10#32#32+ + #84#82#73#71#71#69#82#95#68#79#79#82#44#32#47#47#32#53#10#32#32#84#82#73#71+ + #71#69#82#95#68#79#79#82#53#44#32#47#47#32#54#10#32#32#84#82#73#71#71#69#82+ + #95#67#76#79#83#69#84#82#65#80#44#32#47#47#32#55#10#32#32#84#82#73#71#71#69+ + #82#95#84#82#65#80#44#32#47#47#32#56#10#32#32#84#82#73#71#71#69#82#95#80#82+ + #69#83#83#44#32#47#47#32#57#10#32#32#84#82#73#71#71#69#82#95#83#69#67#82#69+ + #84#44#32#47#47#32#49#48#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#85#80+ + #44#32#47#47#32#49#49#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#68#79#87+ + #78#44#32#47#47#32#49#50#10#32#32#84#82#73#71#71#69#82#95#76#73#70#84#44#32+ + #47#47#32#49#51#10#32#32#84#82#73#71#71#69#82#95#84#69#88#84#85#82#69#44#32+ + #47#47#32#49#52#10#32#32#84#82#73#71#71#69#82#95#79#78#44#32#47#47#32#49#53+ + #10#32#32#84#82#73#71#71#69#82#95#79#70#70#44#32#47#47#32#49#54#10#32#32#84+ + #82#73#71#71#69#82#95#79#78#79#70#70#44#32#47#47#32#49#55#10#32#32#84#82#73+ + #71#71#69#82#95#83#79#85#78#68#44#32#47#47#32#49#56#10#32#32#84#82#73#71#71+ + #69#82#95#83#80#65#87#78#77#79#78#83#84#69#82#44#32#47#47#32#49#57#10#32#32+ + #84#82#73#71#71#69#82#95#83#80#65#87#78#73#84#69#77#44#32#47#47#32#50#48#10+ + #32#32#84#82#73#71#71#69#82#95#77#85#83#73#67#44#32#47#47#32#50#49#10#32#32+ + #84#82#73#71#71#69#82#95#80#85#83#72#44#32#47#47#32#50#50#10#32#32#84#82#73+ + #71#71#69#82#95#83#67#79#82#69#44#32#47#47#32#50#51#10#32#32#84#82#73#71#71+ + #69#82#95#77#69#83#83#65#71#69#44#32#47#47#32#50#52#10#32#32#84#82#73#71#71+ + #69#82#95#68#65#77#65#71#69#44#32#47#47#32#50#53#10#32#32#84#82#73#71#71#69+ + #82#95#72#69#65#76#84#72#44#32#47#47#32#50#54#10#32#32#84#82#73#71#71#69#82+ + #95#83#72#79#84#44#32#47#47#32#50#55#10#32#32#84#82#73#71#71#69#82#95#69#70+ + #70#69#67#84#44#32#47#47#32#50#56#10#32#32#84#82#73#71#71#69#82#95#83#67#82+ + #73#80#84#44#32#47#47#32#50#57#10#32#32#47#47#10#32#32#84#82#73#71#71#69#82+ + #95#77#65#88#32#61#32#77#65#88#44#10#125#10#10#47#47#32#34#97#115#32#88#88+ + #88#34#32#109#101#97#110#115#32#34#103#101#110#101#114#97#116#101#32#116#104+ + #105#115#32#105#100#101#110#116#105#102#105#101#114#32#102#111#114#32#112#97+ + #115#99#97#108#32#115#111#117#114#99#101#115#10#98#105#116#115#101#116#32#80+ + #97#110#101#108#84#121#112#101#32#123#10#32#32#80#65#78#69#76#95#78#79#78#69+ + #32#61#32#48#44#32#47#47#32#48#10#32#32#80#65#78#69#76#95#87#65#76#76#44#32+ + #47#47#32#49#10#32#32#80#65#78#69#76#95#66#65#67#75#44#32#47#47#32#50#10#32+ + #32#80#65#78#69#76#95#70#79#82#69#44#32#47#47#32#52#10#32#32#80#65#78#69#76+ + #95#87#65#84#69#82#44#32#47#47#32#56#10#32#32#80#65#78#69#76#95#65#67#73#68+ + #49#44#32#47#47#32#49#54#10#32#32#80#65#78#69#76#95#65#67#73#68#50#44#32#47+ + #47#32#51#50#10#32#32#80#65#78#69#76#95#83#84#69#80#44#32#47#47#32#54#52#10+ + #32#32#80#65#78#69#76#95#76#73#70#84#85#80#44#32#47#47#32#49#50#56#10#32#32+ + #80#65#78#69#76#95#76#73#70#84#68#79#87#78#44#32#47#47#32#50#53#54#10#32#32+ + #80#65#78#69#76#95#79#80#69#78#68#79#79#82#44#32#47#47#32#53#49#50#10#32#32+ + #80#65#78#69#76#95#67#76#79#83#69#68#79#79#82#44#32#47#47#32#49#48#50#52#10+ + #32#32#80#65#78#69#76#95#66#76#79#67#75#77#79#78#44#32#47#47#32#50#48#52#56+ + #10#32#32#80#65#78#69#76#95#76#73#70#84#76#69#70#84#44#32#47#47#32#52#48#57+ + #54#10#32#32#80#65#78#69#76#95#76#73#70#84#82#73#71#72#84#44#32#47#47#32#56+ + #49#57#50#10#125#10#10#98#105#116#115#101#116#32#80#97#110#101#108#70#108#97+ + #103#32#123#10#32#32#80#65#78#69#76#95#70#76#65#71#95#78#79#78#69#32#61#32+ + #48#44#32#47#47#32#48#10#32#32#80#65#78#69#76#95#70#76#65#71#95#66#76#69#78+ + #68#73#78#71#44#32#47#47#32#49#10#32#32#80#65#78#69#76#95#70#76#65#71#95#72+ + #73#68#69#44#32#47#47#32#50#10#32#32#80#65#78#69#76#95#70#76#65#71#95#87#65+ + #84#69#82#84#69#88#84#85#82#69#83#44#32#47#47#32#52#10#125#10#10#101#110#117+ + #109#32#69#102#102#101#99#116#65#99#116#105#111#110#32#123#10#32#32#69#70#70+ + #69#67#84#95#78#79#78#69#44#32#47#47#32#48#10#32#32#69#70#70#69#67#84#95#84+ + #69#76#69#80#79#82#84#44#32#47#47#32#49#10#32#32#69#70#70#69#67#84#95#82#69+ + #83#80#65#87#78#44#32#47#47#32#50#10#32#32#69#70#70#69#67#84#95#70#73#82#69+ + #44#32#47#47#32#51#10#125#10#10#101#110#117#109#32#73#116#101#109#32#123#10+ + #32#32#73#84#69#77#95#78#79#78#69#44#32#47#47#32#48#10#32#32#73#84#69#77#95+ + #77#69#68#75#73#84#95#83#77#65#76#76#44#32#47#47#32#49#10#32#32#73#84#69#77+ + #95#77#69#68#75#73#84#95#76#65#82#71#69#44#32#47#47#32#50#10#32#32#73#84#69+ + #77#95#77#69#68#75#73#84#95#66#76#65#67#75#44#32#47#47#32#51#10#32#32#73#84+ + #69#77#95#65#82#77#79#82#95#71#82#69#69#78#44#32#47#47#32#52#10#32#32#73#84+ + #69#77#95#65#82#77#79#82#95#66#76#85#69#44#32#47#47#32#53#10#32#32#73#84#69+ + #77#95#83#80#72#69#82#69#95#66#76#85#69#44#32#47#47#32#54#10#32#32#73#84#69+ + #77#95#83#80#72#69#82#69#95#87#72#73#84#69#44#32#47#47#32#55#10#32#32#73#84+ + #69#77#95#83#85#73#84#44#32#47#47#32#56#10#32#32#73#84#69#77#95#79#88#89#71+ + #69#78#44#32#47#47#32#57#10#32#32#73#84#69#77#95#73#78#86#85#76#44#32#47#47+ + #32#49#48#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#65#87#44#32#47#47+ + #32#49#49#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#72#79#84#71#85#78+ + #49#44#32#47#47#32#49#50#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#72+ + #79#84#71#85#78#50#44#32#47#47#32#49#51#10#32#32#73#84#69#77#95#87#69#65#80+ + #79#78#95#67#72#65#73#78#71#85#78#44#32#47#47#32#49#52#10#32#32#73#84#69#77+ + #95#87#69#65#80#79#78#95#82#79#67#75#69#84#76#65#85#78#67#72#69#82#44#32#47+ + #47#32#49#53#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#80#76#65#83#77#65+ + #44#32#47#47#32#49#54#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#66#70#71+ + #44#32#47#47#32#49#55#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#83#85#80+ + #69#82#80#85#76#69#77#69#84#44#32#47#47#32#49#56#10#32#32#73#84#69#77#95#65+ + #77#77#79#95#66#85#76#76#69#84#83#44#32#47#47#32#49#57#10#32#32#73#84#69#77+ + #95#65#77#77#79#95#66#85#76#76#69#84#83#95#66#79#88#44#32#47#47#32#50#48#10+ + #32#32#73#84#69#77#95#65#77#77#79#95#83#72#69#76#76#83#44#32#47#47#32#50#49+ + #10#32#32#73#84#69#77#95#65#77#77#79#95#83#72#69#76#76#83#95#66#79#88#44#32+ + #47#47#32#50#50#10#32#32#73#84#69#77#95#65#77#77#79#95#82#79#67#75#69#84#44+ + #32#47#47#32#50#51#10#32#32#73#84#69#77#95#65#77#77#79#95#82#79#67#75#69#84+ + #95#66#79#88#44#32#47#47#32#50#52#10#32#32#73#84#69#77#95#65#77#77#79#95#67+ + #69#76#76#44#32#47#47#32#50#53#10#32#32#73#84#69#77#95#65#77#77#79#95#67#69+ + #76#76#95#66#73#71#44#32#47#47#32#50#54#10#32#32#73#84#69#77#95#65#77#77#79+ + #95#66#65#67#75#80#65#67#75#44#32#47#47#32#50#55#10#32#32#73#84#69#77#95#75+ + #69#89#95#82#69#68#44#32#47#47#32#50#56#10#32#32#73#84#69#77#95#75#69#89#95+ + #71#82#69#69#78#44#32#47#47#32#50#57#10#32#32#73#84#69#77#95#75#69#89#95#66+ + #76#85#69#44#32#47#47#32#51#48#10#32#32#73#84#69#77#95#87#69#65#80#79#78#95+ + #75#65#83#84#69#84#44#32#47#47#32#51#49#10#32#32#73#84#69#77#95#87#69#65#80+ + #79#78#95#80#73#83#84#79#76#44#32#47#47#32#51#50#10#32#32#73#84#69#77#95#66+ + #79#84#84#76#69#44#32#47#47#32#51#51#10#32#32#73#84#69#77#95#72#69#76#77#69+ + #84#44#32#47#47#32#51#52#10#32#32#73#84#69#77#95#74#69#84#80#65#67#75#44#32+ + #47#47#32#51#53#10#32#32#73#84#69#77#95#73#78#86#73#83#44#32#47#47#32#51#54+ + #10#32#32#73#84#69#77#95#87#69#65#80#79#78#95#70#76#65#77#69#84#72#82#79#87+ + #69#82#44#32#47#47#32#51#55#10#32#32#73#84#69#77#95#65#77#77#79#95#70#85#69+ + #76#67#65#78#44#32#47#47#32#51#56#10#32#32#47#47#10#32#32#73#84#69#77#95#77+ + #65#88#32#61#32#77#65#88#44#32#47#47#32#115#116#111#114#101#32#116#104#101+ + #32#108#97#115#116#32#105#116#101#109#39#115#32#105#100#32#105#110#32#104+ + #101#114#101#32#117#115#101#32#116#104#105#115#32#105#110#32#102#111#114#32+ + #108#111#111#112#115#10#125#10#10#98#105#116#115#101#116#32#73#116#101#109+ + #79#112#116#105#111#110#32#123#10#32#32#73#84#69#77#95#79#80#84#73#79#78#95+ + #78#79#78#69#32#61#32#48#44#32#47#47#32#48#10#32#32#73#84#69#77#95#79#80#84+ + #73#79#78#95#79#78#76#89#68#77#44#32#47#47#32#49#10#32#32#73#84#69#77#95#79+ + #80#84#73#79#78#95#70#65#76#76#44#32#47#47#32#50#10#125#10#10#101#110#117+ + #109#32#65#114#101#97#84#121#112#101#32#123#10#32#32#65#82#69#65#95#78#79#78+ + #69#44#32#47#47#32#48#10#32#32#65#82#69#65#95#80#76#65#89#69#82#80#79#73#78+ + #84#49#44#32#47#47#32#49#10#32#32#65#82#69#65#95#80#76#65#89#69#82#80#79#73+ + #78#84#50#44#32#47#47#32#50#10#32#32#65#82#69#65#95#68#77#80#79#73#78#84#44+ + #32#47#47#32#51#10#32#32#65#82#69#65#95#82#69#68#70#76#65#71#44#32#47#47#32+ + #52#10#32#32#65#82#69#65#95#66#76#85#69#70#76#65#71#44#32#47#47#32#53#10#32+ + #32#65#82#69#65#95#68#79#77#70#76#65#71#44#32#47#47#32#54#10#32#32#65#82#69+ + #65#95#82#69#68#84#69#65#77#80#79#73#78#84#44#32#47#47#32#55#10#32#32#65#82+ + #69#65#95#66#76#85#69#84#69#65#77#80#79#73#78#84#44#32#47#47#32#56#10#125#10+ + #10#101#110#117#109#32#77#111#110#115#116#101#114#32#123#10#32#32#77#79#78+ + #83#84#69#82#95#78#79#78#69#44#32#47#47#32#48#10#32#32#77#79#78#83#84#69#82+ + #95#68#69#77#79#78#44#32#47#47#32#49#10#32#32#77#79#78#83#84#69#82#95#73#77+ + #80#44#32#47#47#32#50#10#32#32#77#79#78#83#84#69#82#95#90#79#77#66#89#44#32+ + #47#47#32#51#10#32#32#77#79#78#83#84#69#82#95#83#69#82#71#44#32#47#47#32#52+ + #10#32#32#77#79#78#83#84#69#82#95#67#89#66#69#82#44#32#47#47#32#53#10#32#32+ + #77#79#78#83#84#69#82#95#67#71#85#78#44#32#47#47#32#54#10#32#32#77#79#78#83+ + #84#69#82#95#66#65#82#79#78#44#32#47#47#32#55#10#32#32#77#79#78#83#84#69#82+ + #95#75#78#73#71#72#84#44#32#47#47#32#56#10#32#32#77#79#78#83#84#69#82#95#67+ + #65#67#79#44#32#47#47#32#57#10#32#32#77#79#78#83#84#69#82#95#83#79#85#76#44+ + #32#47#47#32#49#48#10#32#32#77#79#78#83#84#69#82#95#80#65#73#78#44#32#47#47+ + #32#49#49#10#32#32#77#79#78#83#84#69#82#95#83#80#73#68#69#82#44#32#47#47#32+ + #49#50#10#32#32#77#79#78#83#84#69#82#95#66#83#80#44#32#47#47#32#49#51#10#32+ + #32#77#79#78#83#84#69#82#95#77#65#78#67#85#66#44#32#47#47#32#49#52#10#32#32+ + #77#79#78#83#84#69#82#95#83#75#69#76#44#32#47#47#32#49#53#10#32#32#77#79#78+ + #83#84#69#82#95#86#73#76#69#44#32#47#47#32#49#54#10#32#32#77#79#78#83#84#69+ + #82#95#70#73#83#72#44#32#47#47#32#49#55#10#32#32#77#79#78#83#84#69#82#95#66+ + #65#82#82#69#76#44#32#47#47#32#49#56#10#32#32#77#79#78#83#84#69#82#95#82#79+ + #66#79#44#32#47#47#32#49#57#10#32#32#77#79#78#83#84#69#82#95#77#65#78#44#32+ + #47#47#32#50#48#10#32#32#47#47#32#97#108#105#97#115#101#115#32#40#102#105+ + #120#109#101#58#32#105#116#32#115#104#111#117#108#100#32#98#101#32#96#77#79+ + #78#83#84#69#82#95#90#79#77#66#73#69#32#61#32#77#79#78#83#84#69#82#95#90#79+ + #77#66#89#96#33#41#10#32#32#77#79#78#83#84#69#82#95#90#79#77#66#73#69#32#61+ + #32#51#44#10#125#10#10#101#110#117#109#32#77#111#110#115#116#101#114#66#101+ + #104#97#118#105#111#117#114#32#123#10#32#32#66#72#95#78#79#82#77#65#76#44#32+ + #47#47#32#48#10#32#32#66#72#95#75#73#76#76#69#82#44#32#47#47#32#49#10#32#32+ + #66#72#95#77#65#78#73#65#67#44#32#47#47#32#50#10#32#32#66#72#95#73#78#83#65+ + #78#69#44#32#47#47#32#51#10#32#32#66#72#95#67#65#78#78#73#66#65#76#44#32#47+ + #47#32#52#10#32#32#66#72#95#71#79#79#68#44#32#47#47#32#53#10#125#10#10#101+ + #110#117#109#32#84#114#105#103#103#101#114#83#104#111#116#32#123#10#32#32#84+ + #82#73#71#71#69#82#95#83#72#79#84#95#80#73#83#84#79#76#44#32#47#47#32#48#10+ + #32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#66#85#76#76#69#84#44#32#47#47+ + #32#49#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#83#72#79#84#71#85#78+ + #44#32#47#47#32#50#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#83#83#71+ + #44#32#47#47#32#51#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#73#77#80+ + #44#32#47#47#32#52#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#80#76#65+ + #83#77#65#44#32#47#47#32#53#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95+ + #83#80#73#68#69#82#44#32#47#47#32#54#10#32#32#84#82#73#71#71#69#82#95#83#72+ + #79#84#95#67#65#67#79#44#32#47#47#32#55#10#32#32#84#82#73#71#71#69#82#95#83+ + #72#79#84#95#66#65#82#79#78#44#32#47#47#32#56#10#32#32#84#82#73#71#71#69#82+ + #95#83#72#79#84#95#77#65#78#67#85#66#44#32#47#47#32#57#10#32#32#84#82#73#71+ + #71#69#82#95#83#72#79#84#95#82#69#86#44#32#47#47#32#49#48#10#32#32#84#82#73+ + #71#71#69#82#95#83#72#79#84#95#82#79#67#75#69#84#44#32#47#47#32#49#49#10#32+ + #32#84#82#73#71#71#69#82#95#83#72#79#84#95#66#70#71#44#32#47#47#32#49#50#10+ + #32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#69#88#80#76#44#32#47#47#32#49+ + #51#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#66#70#71#69#88#80#76#44+ + #32#47#47#32#49#52#10#32#32#47#47#10#32#32#84#82#73#71#71#69#82#95#83#72#79+ + #84#95#77#65#88#32#61#32#77#65#88#44#10#125#10#10#101#110#117#109#32#84#114+ + #105#103#103#101#114#83#104#111#116#84#97#114#103#101#116#32#123#10#32#32#84+ + #82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#78#79#78#69#44#32+ + #47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69+ + #84#95#77#79#78#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#83#72#79+ + #84#95#84#65#82#71#69#84#95#80#76#82#44#32#47#47#32#50#10#32#32#84#82#73#71+ + #71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#82#69#68#44#32#47#47#32#51+ + #10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#66#76+ + #85#69#44#32#47#47#32#52#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#84+ + #65#82#71#69#84#95#77#79#78#80#76#82#44#32#47#47#32#53#10#32#32#84#82#73#71+ + #71#69#82#95#83#72#79#84#95#84#65#82#71#69#84#95#80#76#82#77#79#78#44#32#47+ + #47#32#54#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#83#104+ + #111#116#65#105#109#32#123#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95+ + #65#73#77#95#68#69#70#65#85#76#84#44#32#47#47#32#48#10#32#32#84#82#73#71#71+ + #69#82#95#83#72#79#84#95#65#73#77#95#65#76#76#77#65#80#44#32#47#47#32#49#10+ + #32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#65#73#77#95#84#82#65#67#69#44+ + #32#47#47#32#50#10#32#32#84#82#73#71#71#69#82#95#83#72#79#84#95#65#73#77#95+ + #84#82#65#67#69#65#76#76#44#32#47#47#32#51#10#125#10#10#101#110#117#109#32+ + #84#114#105#103#103#101#114#69#102#102#101#99#116#32#123#10#32#32#84#82#73+ + #71#71#69#82#95#69#70#70#69#67#84#95#80#65#82#84#73#67#76#69#44#32#47#47#32+ + #48#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#65#78#73#77#65#84+ + #73#79#78#44#32#47#47#32#49#10#125#10#10#101#110#117#109#32#84#114#105#103+ + #103#101#114#69#102#102#101#99#116#84#121#112#101#32#123#10#32#32#84#82#73+ + #71#71#69#82#95#69#70#70#69#67#84#95#83#76#73#81#85#73#68#44#32#47#47#32#48+ + #10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#76#76#73#81#85#73#68+ + #44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#68+ + #76#73#81#85#73#68#44#32#47#47#32#50#10#32#32#84#82#73#71#71#69#82#95#69#70+ + #70#69#67#84#95#66#76#79#79#68#44#32#47#47#32#51#10#32#32#84#82#73#71#71#69+ + #82#95#69#70#70#69#67#84#95#83#80#65#82#75#44#32#47#47#32#52#10#32#32#84#82+ + #73#71#71#69#82#95#69#70#70#69#67#84#95#66#85#66#66#76#69#44#32#47#47#32#53+ + #10#32#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#77#65#88#32#61#32#77+ + #65#88#44#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#69#102+ + #102#101#99#116#80#111#115#32#123#10#32#32#84#82#73#71#71#69#82#95#69#70#70+ + #69#67#84#95#80#79#83#95#67#69#78#84#69#82#44#32#47#47#32#48#10#32#32#84#82+ + #73#71#71#69#82#95#69#70#70#69#67#84#95#80#79#83#95#65#82#69#65#44#32#47#47+ + #32#49#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#77#117#115+ + #105#99#65#99#116#105#111#110#32#123#10#32#32#84#82#73#71#71#69#82#95#77#85+ + #83#73#67#95#65#67#84#73#79#78#95#83#84#79#80#44#32#47#47#32#48#10#32#32#84+ + #82#73#71#71#69#82#95#77#85#83#73#67#95#65#67#84#73#79#78#95#80#76#65#89#44+ + #32#47#47#32#49#59#32#117#110#112#97#117#115#101#32#111#114#32#114#101#115+ + #116#97#114#116#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114+ + #83#99#111#114#101#65#99#116#105#111#110#32#123#10#32#32#84#82#73#71#71#69+ + #82#95#83#67#79#82#69#95#65#67#84#73#79#78#95#65#68#68#44#32#47#47#32#48#10+ + #32#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95#65#67#84#73#79#78#95#83#85+ + #66#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95#65+ + #67#84#73#79#78#95#87#73#78#44#32#47#47#32#50#10#32#32#84#82#73#71#71#69#82+ + #95#83#67#79#82#69#95#65#67#84#73#79#78#95#76#79#79#83#69#44#32#47#47#32#51+ + #10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#77#101#115#115+ + #97#103#101#68#101#115#116#32#123#10#32#32#84#82#73#71#71#69#82#95#77#69#83+ + #83#65#71#69#95#68#69#83#84#95#77#69#44#32#47#47#32#48#10#32#32#84#82#73#71+ + #71#69#82#95#77#69#83#83#65#71#69#95#68#69#83#84#95#77#89#95#84#69#65#77#44+ + #32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#77#69#83#83#65#71#69#95#68+ + #69#83#84#95#69#78#69#77#89#95#84#69#65#77#44#32#47#47#32#50#10#32#32#84#82+ + #73#71#71#69#82#95#77#69#83#83#65#71#69#95#68#69#83#84#95#82#69#68#95#84#69+ + #65#77#44#32#47#47#32#51#10#32#32#84#82#73#71#71#69#82#95#77#69#83#83#65#71+ + #69#95#68#69#83#84#95#66#76#85#69#95#84#69#65#77#44#32#47#47#32#52#10#32#32+ + #84#82#73#71#71#69#82#95#77#69#83#83#65#71#69#95#68#69#83#84#95#69#86#69#82+ + #89#79#78#69#44#32#47#47#32#53#10#125#10#10#101#110#117#109#32#84#114#105+ + #103#103#101#114#77#101#115#115#97#103#101#75#105#110#100#32#123#10#32#32#84+ + #82#73#71#71#69#82#95#77#69#83#83#65#71#69#95#75#73#78#68#95#67#72#65#84#44+ + #32#47#47#32#48#10#32#32#84#82#73#71#71#69#82#95#77#69#83#83#65#71#69#95#75+ + #73#78#68#95#71#65#77#69#44#32#47#47#32#49#10#125#10#10#98#105#116#115#101+ + #116#32#65#99#116#105#118#97#116#101#84#121#112#101#32#123#10#32#32#65#67#84+ + #73#86#65#84#69#95#78#79#78#69#32#61#32#48#44#32#47#47#32#48#10#32#32#65#67+ + #84#73#86#65#84#69#95#80#76#65#89#69#82#67#79#76#76#73#68#69#44#32#47#47#32+ + #49#10#32#32#65#67#84#73#86#65#84#69#95#77#79#78#83#84#69#82#67#79#76#76#73+ + #68#69#44#32#47#47#32#50#10#32#32#65#67#84#73#86#65#84#69#95#80#76#65#89#69+ + #82#80#82#69#83#83#44#32#47#47#32#52#10#32#32#65#67#84#73#86#65#84#69#95#77+ + #79#78#83#84#69#82#80#82#69#83#83#44#32#47#47#32#56#10#32#32#65#67#84#73#86+ + #65#84#69#95#83#72#79#84#44#32#47#47#32#49#54#10#32#32#65#67#84#73#86#65#84+ + #69#95#78#79#77#79#78#83#84#69#82#44#32#47#47#32#51#50#10#32#32#65#67#84#73+ + #86#65#84#69#95#67#85#83#84#79#77#32#61#32#50#53#53#44#32#47#47#32#110#111+ + #116#101#32#116#104#97#116#32#34#100#105#114#101#99#116#32#97#115#115#105+ + #103#110#34#32#102#105#101#108#100#32#100#111#101#115#110#39#116#32#97#102+ + #102#101#99#116#32#98#105#116#32#99#111#117#110#116#101#114#10#125#10#10#98+ + #105#116#115#101#116#32#75#101#121#32#123#10#32#32#75#69#89#95#78#79#78#69+ + #32#61#32#48#44#32#47#47#32#48#10#32#32#75#69#89#95#82#69#68#44#32#47#47#32+ + #49#10#32#32#75#69#89#95#71#82#69#69#78#44#32#47#47#32#50#10#32#32#75#69#89+ + #95#66#76#85#69#44#32#47#47#32#52#10#32#32#75#69#89#95#82#69#68#84#69#65#77+ + #44#32#47#47#32#56#10#32#32#75#69#89#95#66#76#85#69#84#69#65#77#44#32#47#47+ + #32#49#54#10#125#10#10#10#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+ #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+ #47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47#47+ - #47#47#47#47#47#47#47#47#47#10#47#47#32#118#97#114#105#111#117#115#32#116+ - #114#105#103#103#101#114#115#10#84#114#105#103#103#101#114#68#97#116#97#32+ - #102#111#114#32#84#82#73#71#71#69#82#95#69#88#73#84#32#123#10#32#32#77#97+ - #112#78#97#109#101#32#105#115#32#34#109#97#112#34#32#116#121#112#101#32#99+ - #104#97#114#91#49#54#93#32#111#102#102#115#101#116#32#48#59#10#125#10#10#84+ + #47#47#47#47#47#47#47#47#47#47#47#47#47#10#47#47#32#118#97#114#105#111#117+ + #115#32#116#114#105#103#103#101#114#115#10#84#114#105#103#103#101#114#68#97+ + #116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#69#88#73#84#32#123#10#32+ + #32#34#109#97#112#34#32#116#121#112#101#32#99#104#97#114#91#49#54#93#32#111+ + #102#102#115#101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116+ + #59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32+ + #84#82#73#71#71#69#82#95#84#69#76#69#80#79#82#84#32#123#10#32#32#34#116#97+ + #114#103#101#116#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102+ + #115#101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+ + #32#32#34#100#50#100#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102+ + #115#101#116#32#56#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10+ + #32#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111#108#32+ + #111#102#102#115#101#116#32#57#32#100#101#102#97#117#108#116#32#102#97#108+ + #115#101#59#10#32#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121#112+ + #101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#48#32#101#110+ + #117#109#32#68#105#114#84#121#112#101#32#100#101#102#97#117#108#116#32#68#73+ + #82#95#76#69#70#84#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97+ + #32#102#111#114#32#40#84#82#73#71#71#69#82#95#79#80#69#78#68#79#79#82#44#32+ + #84#82#73#71#71#69#82#95#67#76#79#83#69#68#79#79#82#44#32#84#82#73#71#71#69+ + #82#95#68#79#79#82#44#32#84#82#73#71#71#69#82#95#68#79#79#82#53#44#32#84#82+ + #73#71#71#69#82#95#67#76#79#83#69#84#82#65#80#44#32#84#82#73#71#71#69#82#95+ + #84#82#65#80#44#32#84#82#73#71#71#69#82#95#76#73#70#84#85#80#44#32#84#82#73+ + #71#71#69#82#95#76#73#70#84#68#79#87#78#44#32#84#82#73#71#71#69#82#95#76#73+ + #70#84#41#32#123#10#32#32#34#112#97#110#101#108#105#100#34#32#116#121#112+ + #101#32#105#110#116#32#111#102#102#115#101#116#32#48#32#112#97#110#101#108+ + #32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#115#105+ + #108#101#110#116#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115+ + #101#116#32#52#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#32+ + #32#34#100#50#100#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115+ + #101#116#32#53#32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#125+ + #10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#40#84#82#73+ + #71#71#69#82#95#80#82#69#83#83#44#32#84#82#73#71#71#69#82#95#79#78#44#32#84+ + #82#73#71#71#69#82#95#79#70#70#44#32#84#82#73#71#71#69#82#95#79#78#79#70#70+ + #41#32#123#10#32#32#34#112#111#115#105#116#105#111#110#34#32#116#121#112#101+ + #32#112#111#105#110#116#32#111#102#102#115#101#116#32#48#32#97#115#32#116+ + #120#121#32#100#101#102#97#117#108#116#32#40#48#32#48#41#32#119#114#105#116+ + #101#100#101#102#97#117#108#116#59#10#32#32#34#115#105#122#101#34#32#116#121+ + #112#101#32#115#105#122#101#32#111#102#102#115#101#116#32#56#32#97#115#32+ + #116#119#104#32#100#101#102#97#117#108#116#32#40#48#32#48#41#59#10#32#32#34+ + #119#97#105#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+ + #102#115#101#116#32#49#50#32#100#101#102#97#117#108#116#32#48#59#10#32#32#34+ + #99#111#117#110#116#34#32#97#108#105#97#115#32#112#114#101#115#115#67#111+ + #117#110#116#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102+ + #115#101#116#32#49#52#32#100#101#102#97#117#108#116#32#48#59#10#32#32#34#109+ + #111#110#115#116#101#114#105#100#34#32#116#121#112#101#32#105#110#116#32#111+ + #102#102#115#101#116#32#49#54#32#109#111#110#115#116#101#114#32#97#115#32+ + #109#111#110#115#116#101#114#105#100#32#100#101#102#97#117#108#116#32#110+ + #117#108#108#59#10#32#32#34#101#120#116#95#114#97#110#100#111#109#34#32#116+ + #121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#50#48#32#100+ + #101#102#97#117#108#116#32#102#97#108#115#101#59#10#32#32#47#47#32#116#104+ + #105#115#32#111#110#101#32#105#115#32#102#111#114#32#109#111#118#105#110#103+ + #32#112#108#97#116#102#111#114#109#115#10#32#32#34#112#97#110#101#108#105+ + #100#34#32#112#97#110#101#108#32#100#101#102#97#117#108#116#32#110#117#108+ + #108#59#10#125#10#10#101#110#117#109#32#84#114#105#103#103#101#114#83#99#111+ + #114#101#84#101#97#109#32#123#10#32#32#84#82#73#71#71#69#82#95#83#67#79#82+ + #69#95#84#69#65#77#95#77#73#78#69#95#82#69#68#44#32#47#47#32#48#10#32#32#84+ + #82#73#71#71#69#82#95#83#67#79#82#69#95#84#69#65#77#95#77#73#78#69#95#66#76+ + #85#69#44#32#47#47#32#49#10#32#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95+ + #84#69#65#77#95#70#79#82#67#69#95#82#69#68#44#32#47#47#32#50#10#32#32#84#82+ + #73#71#71#69#82#95#83#67#79#82#69#95#84#69#65#77#95#70#79#82#67#69#95#66#76+ + #85#69#44#32#47#47#32#51#10#125#10#10#84#114#105#103#103#101#114#68#97#116+ + #97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#69#67#82#69#84#32#123#10+ + #125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82+ + #73#71#71#69#82#95#84#69#88#84#85#82#69#32#123#10#32#32#34#97#99#116#105#118+ + #97#116#101#95#111#110#99#101#34#32#116#121#112#101#32#98#111#111#108#32#111+ + #102#102#115#101#116#32#48#32#100#101#102#97#117#108#116#32#102#97#108#115+ + #101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#97#110+ + #105#109#97#116#101#95#111#110#99#101#34#32#116#121#112#101#32#98#111#111+ + #108#32#111#102#102#115#101#116#32#49#32#100#101#102#97#117#108#116#32#102+ + #97#108#115#101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125+ + #10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71+ + #71#69#82#95#83#79#85#78#68#32#123#10#32#32#34#115#111#117#110#100#95#110#97+ + #109#101#34#32#116#121#112#101#32#99#104#97#114#91#54#52#93#32#111#102#102+ + #115#101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+ + #32#32#34#118#111#108#117#109#101#34#32#116#121#112#101#32#117#98#121#116+ + #101#32#111#102#102#115#101#116#32#54#52#32#100#101#102#97#117#108#116#32#48+ + #32#119#114#105#116#101#100#101#102#97#117#108#116#59#32#47#47#63#63#63#32+ + #100#101#102#97#117#108#116#32#63#63#63#10#32#32#34#112#97#110#34#32#116#121+ + #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#54#53#32#100+ + #101#102#97#117#108#116#32#48#59#10#32#32#34#108#111#99#97#108#34#32#116#121+ + #112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#54#54#32#100#101+ + #102#97#117#108#116#32#116#114#117#101#59#32#47#47#63#63#63#32#100#101#102+ + #97#117#108#116#32#63#63#63#10#32#32#34#112#108#97#121#95#99#111#117#110#116+ + #34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+ + #54#55#32#100#101#102#97#117#108#116#32#49#59#10#32#32#34#115#111#117#110+ + #100#95#115#119#105#116#99#104#34#32#116#121#112#101#32#98#111#111#108#32+ + #111#102#102#115#101#116#32#54#56#32#100#101#102#97#117#108#116#32#102#97+ + #108#115#101#59#32#47#47#63#63#63#32#100#101#102#97#117#108#116#32#63#63#63+ + #10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84+ + #82#73#71#71#69#82#95#83#80#65#87#78#77#79#78#83#84#69#82#32#123#10#32#32#34+ + #112#111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110+ + #116#32#111#102#102#115#101#116#32#48#32#97#115#32#116#120#121#32#119#114+ + #105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32+ + #97#108#105#97#115#32#115#112#97#119#110#77#111#110#115#84#121#112#101#32+ + #116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32+ + #101#110#117#109#32#77#111#110#115#116#101#114#32#100#101#102#97#117#108#116+ + #32#77#79#78#83#84#69#82#95#73#77#80#32#119#114#105#116#101#100#101#102#97+ + #117#108#116#59#10#32#32#34#104#101#97#108#116#104#34#32#116#121#112#101#32+ + #105#110#116#32#111#102#102#115#101#116#32#49#50#32#119#114#105#116#101#100+ + #101#102#97#117#108#116#59#10#32#32#34#100#105#114#101#99#116#105#111#110#34+ + #32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49+ + #54#32#101#110#117#109#32#68#105#114#84#121#112#101#32#100#101#102#97#117+ + #108#116#32#68#73#82#95#76#69#70#84#32#119#114#105#116#101#100#101#102#97+ + #117#108#116#59#10#32#32#34#97#99#116#105#118#101#34#32#116#121#112#101#32+ + #98#111#111#108#32#111#102#102#115#101#116#32#49#55#32#100#101#102#97#117+ + #108#116#32#116#114#117#101#59#10#32#32#34#99#111#117#110#116#34#32#97#108+ + #105#97#115#32#109#111#110#115#67#111#117#110#116#32#116#121#112#101#32#105+ + #110#116#32#111#102#102#115#101#116#32#50#48#32#100#101#102#97#117#108#116+ + #32#49#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#101+ + #102#102#101#99#116#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102+ + #102#115#101#116#32#50#52#32#101#110#117#109#32#69#102#102#101#99#116#65#99+ + #116#105#111#110#32#100#101#102#97#117#108#116#32#69#70#70#69#67#84#95#78#79+ + #78#69#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#109+ + #97#120#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+ + #101#116#32#50#54#32#100#101#102#97#117#108#116#32#49#32#119#114#105#116#101+ + #100#101#102#97#117#108#116#59#10#32#32#34#100#101#108#97#121#34#32#116#121+ + #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#56#32+ + #100#101#102#97#117#108#116#32#49#48#48#48#32#119#114#105#116#101#100#101+ + #102#97#117#108#116#59#10#32#32#34#98#101#104#97#118#105#111#117#114#34#32+ + #116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#51#48+ + #32#101#110#117#109#32#77#111#110#115#116#101#114#66#101#104#97#118#105#111+ + #117#114#32#100#101#102#97#117#108#116#32#66#72#95#78#79#82#77#65#76#59#10+ + #125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82+ + #73#71#71#69#82#95#83#80#65#87#78#73#84#69#77#32#123#10#32#32#34#112#111#115+ + #105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102+ + #102#115#101#116#32#48#32#97#115#32#116#120#121#32#119#114#105#116#101#100+ + #101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#97#108#105#97+ + #115#32#115#112#97#119#110#73#116#101#109#84#121#112#101#32#116#121#112#101+ + #32#117#98#121#116#101#32#111#102#102#115#101#116#32#56#32#101#110#117#109+ + #32#73#116#101#109#32#100#101#102#97#117#108#116#32#73#84#69#77#95#78#79#78+ + #69#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#103#114+ + #97#118#105#116#121#34#32#116#121#112#101#32#98#111#111#108#32#111#102#102+ + #115#101#116#32#57#32#100#101#102#97#117#108#116#32#116#114#117#101#59#10#32+ + #32#34#100#109#111#110#108#121#34#32#116#121#112#101#32#98#111#111#108#32+ + #111#102#102#115#101#116#32#49#48#32#100#101#102#97#117#108#116#32#102#97+ + #108#115#101#59#10#32#32#34#99#111#117#110#116#34#32#97#108#105#97#115#32+ + #105#116#101#109#67#111#117#110#116#32#116#121#112#101#32#105#110#116#32#111+ + #102#102#115#101#116#32#49#50#32#100#101#102#97#117#108#116#32#49#59#10#32+ + #32#34#101#102#102#101#99#116#34#32#116#121#112#101#32#117#98#121#116#101#32+ + #111#102#102#115#101#116#32#49#54#32#101#110#117#109#32#69#102#102#101#99+ + #116#65#99#116#105#111#110#32#100#101#102#97#117#108#116#32#69#70#70#69#67+ + #84#95#78#79#78#69#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+ + #32#32#34#109#97#120#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111+ + #102#102#115#101#116#32#49#56#32#100#101#102#97#117#108#116#32#49#59#10#32+ + #32#34#100#101#108#97#121#34#32#116#121#112#101#32#117#115#104#111#114#116+ + #32#111#102#102#115#101#116#32#50#48#32#100#101#102#97#117#108#116#32#49#48+ + #48#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84+ #114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82+ - #95#84#69#76#69#80#79#82#84#32#123#10#32#32#84#97#114#103#101#116#80#111#105+ - #110#116#32#105#115#32#34#116#97#114#103#101#116#34#32#116#121#112#101#32+ - #112#111#105#110#116#32#111#102#102#115#101#116#32#48#59#10#32#32#100#50#100+ - #95#116#101#108#101#112#111#114#116#32#105#115#32#34#100#50#100#34#32#116+ - #121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#56#32#100#101+ - #102#97#117#108#116#32#102#97#108#115#101#32#111#109#105#116#100#101#102#97+ - #117#108#116#59#10#32#32#115#105#108#101#110#116#95#116#101#108#101#112#111+ - #114#116#32#105#115#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32+ - #98#111#111#108#32#111#102#102#115#101#116#32#57#32#100#101#102#97#117#108+ - #116#32#102#97#108#115#101#32#111#109#105#116#100#101#102#97#117#108#116#59+ - #10#32#32#84#108#112#68#105#114#32#105#115#32#34#100#105#114#101#99#116#105+ - #111#110#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101+ - #116#32#49#48#32#101#110#117#109#32#68#105#114#84#121#112#101#32#100#101#102+ - #97#117#108#116#32#68#73#82#95#76#69#70#84#32#111#109#105#116#100#101#102#97+ - #117#108#116#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102+ - #111#114#32#40#84#82#73#71#71#69#82#95#79#80#69#78#68#79#79#82#44#32#84#82+ - #73#71#71#69#82#95#67#76#79#83#69#68#79#79#82#44#32#84#82#73#71#71#69#82#95+ - #68#79#79#82#44#32#84#82#73#71#71#69#82#95#68#79#79#82#53#44#32#84#82#73#71+ - #71#69#82#95#67#76#79#83#69#84#82#65#80#44#32#84#82#73#71#71#69#82#95#84#82+ - #65#80#44#32#84#82#73#71#71#69#82#95#76#73#70#84#85#80#44#32#84#82#73#71#71+ - #69#82#95#76#73#70#84#68#79#87#78#44#32#84#82#73#71#71#69#82#95#76#73#70#84+ - #41#32#123#10#32#32#80#97#110#101#108#73#68#32#105#115#32#34#112#97#110#101+ - #108#105#100#34#32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116+ - #32#48#32#112#97#110#101#108#59#10#32#32#78#111#83#111#117#110#100#32#105+ - #115#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111#108+ - #32#111#102#102#115#101#116#32#52#32#100#101#102#97#117#108#116#32#102#97+ - #108#115#101#32#111#109#105#116#100#101#102#97#117#108#116#59#10#32#32#100+ - #50#100#95#100#111#111#114#115#32#105#115#32#34#100#50#100#34#32#116#121#112+ - #101#32#98#111#111#108#32#111#102#102#115#101#116#32#53#32#100#101#102#97+ - #117#108#116#32#102#97#108#115#101#32#111#109#105#116#100#101#102#97#117#108+ - #116#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114+ - #32#40#84#82#73#71#71#69#82#95#80#82#69#83#83#44#32#84#82#73#71#71#69#82#95+ - #79#78#44#32#84#82#73#71#71#69#82#95#79#70#70#44#32#84#82#73#71#71#69#82#95+ - #79#78#79#70#70#41#32#123#10#32#32#47#47#116#88#32#105#115#32#34#116#120#34+ - #32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#48#59#10#32+ - #32#47#47#116#89#32#105#115#32#34#116#121#34#32#116#121#112#101#32#105#110+ - #116#32#111#102#102#115#101#116#32#52#59#10#32#32#80#111#115#32#105#115#32+ - #34#112#111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110+ - #116#32#111#102#102#115#101#116#32#48#32#97#115#32#116#120#121#32#100#101+ - #102#97#117#108#116#32#40#48#32#48#41#59#10#32#32#47#47#116#87#105#100#116+ - #104#32#105#115#32#34#119#105#100#116#104#34#32#116#121#112#101#32#117#115+ - #104#111#114#116#32#111#102#102#115#101#116#32#56#59#10#32#32#47#47#116#72+ - #101#105#103#104#116#32#105#115#32#34#104#101#105#103#104#116#34#32#116#121+ - #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#48#59+ - #10#32#32#83#105#122#101#32#105#115#32#34#115#105#122#101#34#32#116#121#112+ - #101#32#115#105#122#101#32#111#102#102#115#101#116#32#56#32#97#115#32#116+ - #119#104#32#100#101#102#97#117#108#116#32#40#48#32#48#41#59#10#32#32#87#97+ - #105#116#32#105#115#32#34#119#97#105#116#34#32#116#121#112#101#32#117#115+ - #104#111#114#116#32#111#102#102#115#101#116#32#49#50#32#100#101#102#97#117+ - #108#116#32#48#59#10#32#32#67#111#117#110#116#32#105#115#32#34#99#111#117+ - #110#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+ - #101#116#32#49#52#32#100#101#102#97#117#108#116#32#48#59#10#32#32#77#111#110+ - #115#116#101#114#73#68#32#105#115#32#34#109#111#110#115#116#101#114#105#100+ - #34#32#116#121#112#101#32#105#110#116#32#111#102#102#115#101#116#32#49#54#32+ - #109#111#110#115#116#101#114#32#97#115#32#109#111#110#115#116#101#114#105+ - #100#32#100#101#102#97#117#108#116#32#110#117#108#108#59#10#32#32#69#120#116+ - #82#97#110#100#111#109#32#105#115#32#34#101#120#116#114#97#110#100#111#109+ - #34#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#50#48+ - #32#100#101#102#97#117#108#116#32#102#97#108#115#101#59#10#32#32#47#47#32+ - #116#104#105#115#32#111#110#101#32#105#115#32#102#111#114#32#109#111#118#105+ - #110#103#32#112#108#97#116#102#111#114#109#115#10#32#32#80#97#110#101#108#73+ - #100#32#105#115#32#34#112#97#110#101#108#105#100#34#32#116#121#112#101#32+ - #105#110#116#32#112#97#110#101#108#32#100#101#102#97#117#108#116#32#110#117+ - #108#108#32#111#109#105#116#100#101#102#97#117#108#116#59#10#125#10#10#84+ + #95#77#85#83#73#67#32#123#10#32#32#34#110#97#109#101#34#32#97#108#105#97#115+ + #32#109#117#115#105#99#78#97#109#101#32#116#121#112#101#32#99#104#97#114#91+ + #54#52#93#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101#100#101+ + #102#97#117#108#116#59#10#32#32#34#97#99#116#105#111#110#34#32#97#108#105#97+ + #115#32#109#117#115#105#99#65#99#116#105#111#110#32#116#121#112#101#32#117+ + #98#121#116#101#32#111#102#102#115#101#116#32#54#52#32#101#110#117#109#32#84+ + #114#105#103#103#101#114#77#117#115#105#99#65#99#116#105#111#110#32#119#114+ + #105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84#114#105#103#103+ + #101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#80#85#83#72+ + #32#123#10#32#32#34#97#110#103#108#101#34#32#116#121#112#101#32#117#115#104+ + #111#114#116#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101#100#101+ + #102#97#117#108#116#59#10#32#32#34#102#111#114#99#101#34#32#116#121#112#101+ + #32#117#98#121#116#101#32#111#102#102#115#101#116#32#50#32#119#114#105#116+ + #101#100#101#102#97#117#108#116#59#10#32#32#34#114#101#115#101#116#95#118+ + #101#108#111#99#105#116#121#34#32#116#121#112#101#32#98#111#111#108#32#111+ + #102#102#115#101#116#32#51#32#100#101#102#97#117#108#116#32#102#97#108#115+ + #101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84+ #114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82+ - #95#83#69#67#82#69#84#32#123#10#125#10#10#84#114#105#103#103#101#114#68#97+ - #116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#84#69#88#84#85#82#69#32+ - #123#10#32#32#65#99#116#105#118#97#116#101#79#110#99#101#32#105#115#32#34#97+ - #99#116#105#118#97#116#101#111#110#99#101#34#32#116#121#112#101#32#98#111+ - #111#108#32#111#102#102#115#101#116#32#48#59#10#32#32#65#110#105#109#79#110+ - #99#101#32#105#115#32#34#97#110#105#109#97#116#101#111#110#99#101#34#32#116+ - #121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#49#59#10#125#10+ - #10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71+ - #69#82#95#83#79#85#78#68#32#123#10#32#32#83#111#117#110#100#78#97#109#101#32+ - #105#115#32#34#115#111#117#110#100#110#97#109#101#34#32#116#121#112#101#32+ - #99#104#97#114#91#54#52#93#32#111#102#102#115#101#116#32#48#59#10#32#32#86+ - #111#108#117#109#101#32#105#115#32#34#118#111#108#117#109#101#34#32#116#121+ - #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#54#52#59#10#32+ - #32#80#97#110#32#105#115#32#34#112#97#110#34#32#116#121#112#101#32#117#98+ - #121#116#101#32#111#102#102#115#101#116#32#54#53#59#10#32#32#76#111#99#97+ - #108#32#105#115#32#34#108#111#99#97#108#34#32#116#121#112#101#32#98#111#111+ - #108#32#111#102#102#115#101#116#32#54#54#59#10#32#32#80#108#97#121#67#111+ - #117#110#116#32#105#115#32#34#112#108#97#121#99#111#117#110#116#34#32#116+ - #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#54#55#59#10+ - #32#32#83#111#117#110#100#83#119#105#116#99#104#32#105#115#32#34#115#111#117+ - #110#100#115#119#105#116#99#104#34#32#116#121#112#101#32#98#111#111#108#32+ - #111#102#102#115#101#116#32#54#56#59#10#125#10#10#84#114#105#103#103#101#114+ - #68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#80#65#87#78#77#79+ - #78#83#84#69#82#32#123#10#32#32#77#111#110#80#111#115#32#105#115#32#34#112+ - #111#115#105#116#105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32+ - #111#102#102#115#101#116#32#48#59#10#32#32#77#111#110#84#121#112#101#32#105+ - #115#32#34#116#121#112#101#34#32#116#121#112#101#32#117#98#121#116#101#32+ - #111#102#102#115#101#116#32#56#59#10#32#32#77#111#110#72#101#97#108#116#104+ - #32#105#115#32#34#104#101#97#108#116#104#34#32#116#121#112#101#32#105#110+ - #116#32#111#102#102#115#101#116#32#49#50#59#10#32#32#77#111#110#68#105#114+ - #32#105#115#32#34#100#105#114#101#99#116#105#111#110#34#32#116#121#112#101+ - #32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#54#32#101#110#117+ - #109#32#68#105#114#84#121#112#101#59#10#32#32#77#111#110#65#99#116#105#118+ - #101#32#105#115#32#34#97#99#116#105#118#101#34#32#116#121#112#101#32#98#111+ - #111#108#32#111#102#102#115#101#116#32#49#55#59#10#32#32#77#111#110#67#111+ - #117#110#116#32#105#115#32#34#99#111#117#110#116#34#32#116#121#112#101#32+ - #105#110#116#32#111#102#102#115#101#116#32#50#48#59#10#32#32#77#111#110#69+ - #102#102#101#99#116#32#105#115#32#34#101#102#102#101#99#116#34#32#116#121+ - #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#50#52#59#10#32+ - #32#77#111#110#77#97#120#32#105#115#32#34#109#97#120#34#32#116#121#112#101+ - #32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#54#59#10#32#32+ - #77#111#110#68#101#108#97#121#32#105#115#32#34#100#101#108#97#121#34#32#116+ - #121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#56+ - #59#10#32#32#77#111#110#66#101#104#97#118#32#105#115#32#34#98#101#104#97#118+ - #105#111#117#114#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+ - #115#101#116#32#51#48#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116+ - #97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#80#65#87#78#73#84#69#77#32+ - #123#10#32#32#73#116#101#109#80#111#115#32#105#115#32#34#112#111#115#105#116+ - #105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115+ - #101#116#32#48#59#10#32#32#73#116#101#109#84#121#112#101#32#105#115#32#34+ - #116#121#112#101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+ - #115#101#116#32#56#59#10#32#32#73#116#101#109#70#97#108#108#115#32#105#115+ - #32#34#103#114#97#118#105#116#121#34#32#116#121#112#101#32#98#111#111#108#32+ - #111#102#102#115#101#116#32#57#59#10#32#32#73#116#101#109#79#110#108#121#68+ - #77#32#105#115#32#34#100#109#111#110#108#121#34#32#116#121#112#101#32#98#111+ - #111#108#32#111#102#102#115#101#116#32#49#48#59#10#32#32#73#116#101#109#67+ - #111#117#110#116#32#105#115#32#34#99#111#117#110#116#34#32#116#121#112#101+ - #32#105#110#116#32#111#102#102#115#101#116#32#49#50#59#10#32#32#73#116#101+ - #109#69#102#102#101#99#116#32#105#115#32#34#101#102#102#101#99#116#34#32#116+ - #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#54#59#10+ - #32#32#73#116#101#109#77#97#120#32#105#115#32#34#109#97#120#34#32#116#121+ - #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#56#59+ - #10#32#32#73#116#101#109#68#101#108#97#121#32#105#115#32#34#100#101#108#97+ - #121#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101+ - #116#32#50#48#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102+ - #111#114#32#84#82#73#71#71#69#82#95#77#85#83#73#67#32#123#10#32#32#77#117+ - #115#105#99#78#97#109#101#32#105#115#32#34#110#97#109#101#34#32#116#121#112+ - #101#32#99#104#97#114#91#54#52#93#32#111#102#102#115#101#116#32#48#59#10#32+ - #32#77#117#115#105#99#65#99#116#105#111#110#32#105#115#32#34#97#99#116#105+ - #111#110#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101+ - #116#32#54#52#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102+ - #111#114#32#84#82#73#71#71#69#82#95#80#85#83#72#32#123#10#32#32#80#117#115+ - #104#65#110#103#108#101#32#105#115#32#34#97#110#103#108#101#34#32#116#121+ - #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#48#59#10+ - #32#32#80#117#115#104#70#111#114#99#101#32#105#115#32#34#102#111#114#99#101+ - #34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+ - #50#59#10#32#32#82#101#115#101#116#86#101#108#32#105#115#32#34#114#101#115+ - #101#116#118#101#108#111#99#105#116#121#34#32#116#121#112#101#32#98#111#111+ - #108#32#111#102#102#115#101#116#32#51#59#10#125#10#10#84#114#105#103#103#101+ - #114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#67#79#82#69+ - #32#123#10#32#32#83#99#111#114#101#65#99#116#105#111#110#32#105#115#32#34#97+ - #99#116#105#111#110#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102+ - #102#115#101#116#32#48#59#10#32#32#83#99#111#114#101#67#111#117#110#116#32+ - #105#115#32#34#99#111#117#110#116#34#32#116#121#112#101#32#117#98#121#116+ - #101#32#111#102#102#115#101#116#32#49#59#10#32#32#83#99#111#114#101#84#101+ - #97#109#32#105#115#32#34#116#101#97#109#34#32#116#121#112#101#32#117#98#121+ - #116#101#32#111#102#102#115#101#116#32#50#59#10#32#32#83#99#111#114#101#67+ - #111#110#32#105#115#32#34#99#111#110#115#111#108#101#34#32#116#121#112#101+ - #32#98#111#111#108#32#111#102#102#115#101#116#32#51#59#10#32#32#83#99#111+ - #114#101#77#115#103#32#105#115#32#34#109#101#115#115#97#103#101#34#32#116+ - #121#112#101#32#98#111#111#108#32#111#102#102#115#101#116#32#52#59#10#125#10+ - #10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71+ - #69#82#95#77#69#83#83#65#71#69#32#123#10#32#32#77#101#115#115#97#103#101#75+ - #105#110#100#32#105#115#32#34#107#105#110#100#34#32#116#121#112#101#32#117+ - #98#121#116#101#32#111#102#102#115#101#116#32#48#59#10#32#32#77#101#115#115+ - #97#103#101#83#101#110#100#84#111#32#105#115#32#34#115#101#110#100#116#111+ - #34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32+ - #49#59#10#32#32#77#101#115#115#97#103#101#84#101#120#116#32#105#115#32#34+ - #116#101#120#116#34#32#116#121#112#101#32#99#104#97#114#91#49#48#48#93#32+ - #111#102#102#115#101#116#32#50#59#10#32#32#77#101#115#115#97#103#101#84#105+ - #109#101#32#105#115#32#34#116#105#109#101#34#32#116#121#112#101#32#117#115+ - #104#111#114#116#32#111#102#102#115#101#116#32#49#48#50#59#10#125#10#10#84+ + #95#83#67#79#82#69#32#123#10#32#32#34#97#99#116#105#111#110#34#32#97#108#105+ + #97#115#32#115#99#111#114#101#65#99#116#105#111#110#32#116#121#112#101#32+ + #117#98#121#116#101#32#111#102#102#115#101#116#32#48#32#101#110#117#109#32+ + #84#114#105#103#103#101#114#83#99#111#114#101#65#99#116#105#111#110#32#100+ + #101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#83#67#79#82#69#95#65#67+ + #84#73#79#78#95#65#68#68#32#119#114#105#116#101#100#101#102#97#117#108#116+ + #59#10#32#32#34#99#111#117#110#116#34#32#97#108#105#97#115#32#115#99#111#114+ + #101#67#111#117#110#116#32#116#121#112#101#32#117#98#121#116#101#32#111#102+ + #102#115#101#116#32#49#32#100#101#102#97#117#108#116#32#49#32#119#114#105+ + #116#101#100#101#102#97#117#108#116#59#10#32#32#34#116#101#97#109#34#32#97+ + #108#105#97#115#32#115#99#111#114#101#84#101#97#109#32#116#121#112#101#32+ + #117#98#121#116#101#32#111#102#102#115#101#116#32#50#32#101#110#117#109#32+ + #84#114#105#103#103#101#114#83#99#111#114#101#84#101#97#109#32#119#114#105+ + #116#101#100#101#102#97#117#108#116#59#10#32#32#34#99#111#110#115#111#108+ + #101#34#32#97#108#105#97#115#32#115#99#111#114#101#67#111#110#32#116#121#112+ + #101#32#98#111#111#108#32#111#102#102#115#101#116#32#51#32#100#101#102#97+ + #117#108#116#32#102#97#108#115#101#32#119#114#105#116#101#100#101#102#97#117+ + #108#116#59#10#32#32#34#109#101#115#115#97#103#101#34#32#97#108#105#97#115+ + #32#115#99#111#114#101#77#115#103#32#116#121#112#101#32#98#111#111#108#32+ + #111#102#102#115#101#116#32#52#32#100#101#102#97#117#108#116#32#116#114#117+ + #101#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84+ #114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82+ - #95#68#65#77#65#71#69#32#123#10#32#32#68#97#109#97#103#101#86#97#108#117#101+ - #32#105#115#32#34#97#109#111#117#110#116#34#32#116#121#112#101#32#117#115+ - #104#111#114#116#32#111#102#102#115#101#116#32#48#59#10#32#32#68#97#109#97+ - #103#101#73#110#116#101#114#118#97#108#32#105#115#32#34#105#110#116#101#114+ - #118#97#108#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102+ - #115#101#116#32#50#59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97+ - #32#102#111#114#32#84#82#73#71#71#69#82#95#72#69#65#76#84#72#32#123#10#32#32+ - #72#101#97#108#86#97#108#117#101#32#105#115#32#34#97#109#111#117#110#116#34+ - #32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32+ - #48#59#10#32#32#72#101#97#108#73#110#116#101#114#118#97#108#32#105#115#32#34+ - #105#110#116#101#114#118#97#108#34#32#116#121#112#101#32#117#115#104#111#114+ - #116#32#111#102#102#115#101#116#32#50#59#10#32#32#72#101#97#108#77#97#120#32+ - #105#115#32#34#109#97#120#34#32#116#121#112#101#32#98#111#111#108#32#111#102+ - #102#115#101#116#32#52#59#10#32#32#72#101#97#108#83#105#108#101#110#116#32+ - #105#115#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111+ - #108#32#111#102#102#115#101#116#32#53#59#10#125#10#10#84#114#105#103#103#101+ - #114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#83#72#79#84#32+ - #123#10#32#32#83#104#111#116#80#111#115#32#105#115#32#34#112#111#115#105#116+ + #95#77#69#83#83#65#71#69#32#123#10#32#32#34#107#105#110#100#34#32#116#121+ + #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#48#32#101#110+ + #117#109#32#84#114#105#103#103#101#114#77#101#115#115#97#103#101#75#105#110+ + #100#32#100#101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#77#69#83#83#65+ + #71#69#95#75#73#78#68#95#71#65#77#69#32#119#114#105#116#101#100#101#102#97+ + #117#108#116#59#10#32#32#34#100#101#115#116#34#32#97#108#105#97#115#32#109+ + #115#103#68#101#115#116#32#116#121#112#101#32#117#98#121#116#101#32#101#110+ + #117#109#32#84#114#105#103#103#101#114#77#101#115#115#97#103#101#68#101#115+ + #116#32#111#102#102#115#101#116#32#49#59#10#32#32#34#116#101#120#116#34#32+ + #116#121#112#101#32#99#104#97#114#91#49#48#48#93#32#111#102#102#115#101#116+ + #32#50#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#116+ + #105#109#101#34#32#97#108#105#97#115#32#109#115#103#84#105#109#101#32#116+ + #121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#48+ + #50#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#125#10#10#84#114+ + #105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82#73#71#71#69#82#95+ + #68#65#77#65#71#69#32#123#10#32#32#34#97#109#111#117#110#116#34#32#116#121+ + #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#48#32#119+ + #114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#105#110#116#101+ + #114#118#97#108#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+ + #102#115#101#116#32#50#32#119#114#105#116#101#100#101#102#97#117#108#116#59+ + #10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84+ + #82#73#71#71#69#82#95#72#69#65#76#84#72#32#123#10#32#32#34#97#109#111#117+ + #110#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+ + #101#116#32#48#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32+ + #34#105#110#116#101#114#118#97#108#34#32#116#121#112#101#32#117#115#104#111+ + #114#116#32#111#102#102#115#101#116#32#50#32#119#114#105#116#101#100#101#102+ + #97#117#108#116#59#10#32#32#34#109#97#120#34#32#97#108#105#97#115#32#104#101+ + #97#108#77#97#120#32#116#121#112#101#32#98#111#111#108#32#111#102#102#115+ + #101#116#32#52#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32+ + #34#115#105#108#101#110#116#34#32#116#121#112#101#32#98#111#111#108#32#111+ + #102#102#115#101#116#32#53#32#119#114#105#116#101#100#101#102#97#117#108#116+ + #59#10#125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32+ + #84#82#73#71#71#69#82#95#83#72#79#84#32#123#10#32#32#34#112#111#115#105#116+ #105#111#110#34#32#116#121#112#101#32#112#111#105#110#116#32#111#102#102#115+ - #101#116#32#48#59#10#32#32#83#104#111#116#84#121#112#101#32#105#115#32#34+ - #116#121#112#101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+ - #115#101#116#32#56#32#101#110#117#109#32#84#114#105#103#103#101#114#83#104+ - #111#116#59#10#32#32#83#104#111#116#84#97#114#103#101#116#32#105#115#32#34+ - #116#97#114#103#101#116#34#32#116#121#112#101#32#117#98#121#116#101#32#111+ - #102#102#115#101#116#32#57#32#101#110#117#109#32#84#114#105#103#103#101#114+ - #83#104#111#116#84#97#114#103#101#116#59#10#32#32#83#104#111#116#83#111#117+ - #110#100#32#105#115#32#34#115#105#108#101#110#116#34#32#116#121#112#101#32+ - #110#101#103#98#111#111#108#32#111#102#102#115#101#116#32#49#48#59#32#47#47+ - #32#110#101#103#98#111#111#108#33#10#32#32#83#104#111#116#65#105#109#32#105+ - #115#32#34#97#105#109#34#32#116#121#112#101#32#98#121#116#101#32#111#102#102+ - #115#101#116#32#49#49#59#10#32#32#83#104#111#116#80#97#110#101#108#73#68#32+ - #105#115#32#34#112#97#110#101#108#105#100#34#32#116#121#112#101#32#105#110+ - #116#32#111#102#102#115#101#116#32#49#50#59#10#32#32#83#104#111#116#73#110+ - #116#83#105#103#104#116#32#105#115#32#34#115#105#103#104#116#34#32#116#121+ - #112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#54#59+ - #10#32#32#83#104#111#116#65#110#103#108#101#32#105#115#32#34#97#110#103#108+ - #101#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101+ - #116#32#49#56#59#10#32#32#83#104#111#116#87#97#105#116#32#105#115#32#34#119+ - #97#105#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102+ - #115#101#116#32#50#48#59#10#32#32#83#104#111#116#65#99#99#117#114#97#99#121+ - #32#105#115#32#34#97#99#99#117#114#97#99#121#34#32#116#121#112#101#32#117+ - #115#104#111#114#116#32#111#102#102#115#101#116#32#50#50#59#10#32#32#83#104+ - #111#116#65#109#109#111#32#105#115#32#34#97#109#109#111#34#32#116#121#112+ - #101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#52#59#10#32+ - #32#83#104#111#116#73#110#116#82#101#108#111#97#100#32#105#115#32#34#114#101+ - #108#111#97#100#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102+ - #102#115#101#116#32#50#54#59#10#125#10#10#84#114#105#103#103#101#114#68#97+ - #116#97#32#102#111#114#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#32#123+ - #10#32#32#70#88#67#111#117#110#116#32#105#115#32#34#99#111#117#110#116#34#32+ - #116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#48#59+ - #10#32#32#70#88#84#121#112#101#32#105#115#32#34#116#121#112#101#34#32#116+ - #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#59#10#32+ - #32#70#88#83#117#98#84#121#112#101#32#105#115#32#34#115#117#98#116#121#112+ - #101#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116+ - #32#50#59#10#32#32#70#88#67#111#108#111#114#82#32#105#115#32#34#99#111#108+ - #111#114#114#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115+ - #101#116#32#51#59#10#32#32#70#88#67#111#108#111#114#71#32#105#115#32#34#99+ - #111#108#111#114#103#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102+ - #102#115#101#116#32#52#59#10#32#32#70#88#67#111#108#111#114#66#32#105#115#32+ - #34#99#111#108#111#114#98#34#32#116#121#112#101#32#117#98#121#116#101#32#111+ - #102#102#115#101#116#32#53#59#10#32#32#70#88#80#111#115#32#105#115#32#34#112+ - #111#115#105#116#105#111#110#34#32#116#121#112#101#32#117#98#121#116#101#32+ - #111#102#102#115#101#116#32#54#59#10#32#32#70#88#87#97#105#116#32#105#115#32+ - #34#119#97#105#116#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111+ - #102#102#115#101#116#32#56#59#10#32#32#70#88#86#101#108#88#32#105#115#32#34+ - #118#101#108#120#34#32#116#121#112#101#32#98#121#116#101#32#111#102#102#115+ - #101#116#32#49#48#59#10#32#32#70#88#86#101#108#89#32#105#115#32#34#118#101+ - #108#121#34#32#116#121#112#101#32#98#121#116#101#32#111#102#102#115#101#116+ - #32#49#49#59#10#32#32#70#88#83#112#114#101#97#100#76#32#105#115#32#34#115+ - #112#114#101#97#100#108#34#32#116#121#112#101#32#117#98#121#116#101#32#111+ - #102#102#115#101#116#32#49#50#59#10#32#32#70#88#83#112#114#101#97#100#82#32+ - #105#115#32#34#115#112#114#101#97#100#114#34#32#116#121#112#101#32#117#98+ - #121#116#101#32#111#102#102#115#101#116#32#49#51#59#10#32#32#70#88#83#112+ - #114#101#97#100#85#32#105#115#32#34#115#112#114#101#97#100#117#34#32#116#121+ - #112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#52#59#10#32+ - #32#70#88#83#112#114#101#97#100#68#32#105#115#32#34#115#112#114#101#97#100+ - #100#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116+ - #32#49#53#59#10#125#10 + #101#116#32#48#32#97#115#32#116#120#121#32#119#114#105#116#101#100#101#102+ + #97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#97#108#105#97#115#32+ + #115#104#111#116#84#121#112#101#32#116#121#112#101#32#117#98#121#116#101#32+ + #111#102#102#115#101#116#32#56#32#101#110#117#109#32#84#114#105#103#103#101+ + #114#83#104#111#116#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10+ + #32#32#34#116#97#114#103#101#116#34#32#97#108#105#97#115#32#115#104#111#116+ + #84#97#114#103#101#116#32#116#121#112#101#32#117#98#121#116#101#32#111#102+ + #102#115#101#116#32#57#32#101#110#117#109#32#84#114#105#103#103#101#114#83+ + #104#111#116#84#97#114#103#101#116#32#119#114#105#116#101#100#101#102#97#117+ + #108#116#59#10#32#32#34#113#117#105#101#116#34#32#116#121#112#101#32#110#101+ + #103#98#111#111#108#32#111#102#102#115#101#116#32#49#48#59#32#47#47#32#110+ + #101#103#98#111#111#108#33#10#32#32#34#97#105#109#34#32#116#121#112#101#32+ + #98#121#116#101#32#111#102#102#115#101#116#32#49#49#32#101#110#117#109#32#84+ + #114#105#103#103#101#114#83#104#111#116#65#105#109#32#100#101#102#97#117#108+ + #116#32#84#82#73#71#71#69#82#95#83#72#79#84#95#65#73#77#95#68#69#70#65#85#76+ + #84#59#10#32#32#34#112#97#110#101#108#105#100#34#32#116#121#112#101#32#105+ + #110#116#32#111#102#102#115#101#116#32#49#50#32#112#97#110#101#108#32#100+ + #101#102#97#117#108#116#32#110#117#108#108#32#119#114#105#116#101#100#101+ + #102#97#117#108#116#59#10#32#32#34#115#105#103#104#116#34#32#116#121#112#101+ + #32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#49#54#59#10#32#32+ + #34#97#110#103#108#101#34#32#116#121#112#101#32#117#115#104#111#114#116#32+ + #111#102#102#115#101#116#32#49#56#59#10#32#32#34#119#97#105#116#34#32#116+ + #121#112#101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#48+ + #59#10#32#32#34#97#99#99#117#114#97#99#121#34#32#116#121#112#101#32#117#115+ + #104#111#114#116#32#111#102#102#115#101#116#32#50#50#59#10#32#32#34#97#109+ + #109#111#34#32#116#121#112#101#32#117#115#104#111#114#116#32#111#102#102#115+ + #101#116#32#50#52#59#10#32#32#34#114#101#108#111#97#100#34#32#116#121#112+ + #101#32#117#115#104#111#114#116#32#111#102#102#115#101#116#32#50#54#59#10+ + #125#10#10#84#114#105#103#103#101#114#68#97#116#97#32#102#111#114#32#84#82+ + #73#71#71#69#82#95#69#70#70#69#67#84#32#123#10#32#32#34#99#111#117#110#116+ + #34#32#97#108#105#97#115#32#70#88#67#111#117#110#116#32#116#121#112#101#32+ + #117#98#121#116#101#32#111#102#102#115#101#116#32#48#32#119#114#105#116#101+ + #100#101#102#97#117#108#116#59#10#32#32#34#116#121#112#101#34#32#97#108#105+ + #97#115#32#70#88#84#121#112#101#32#116#121#112#101#32#117#98#121#116#101#32+ + #111#102#102#115#101#116#32#49#32#101#110#117#109#32#84#114#105#103#103#101+ + #114#69#102#102#101#99#116#32#100#101#102#97#117#108#116#32#84#82#73#71#71+ + #69#82#95#69#70#70#69#67#84#95#80#65#82#84#73#67#76#69#32#119#114#105#116+ + #101#100#101#102#97#117#108#116#59#10#32#32#34#115#117#98#116#121#112#101#34+ + #32#97#108#105#97#115#32#70#88#83#117#98#84#121#112#101#32#116#121#112#101+ + #32#117#98#121#116#101#32#111#102#102#115#101#116#32#50#32#101#110#117#109+ + #32#84#114#105#103#103#101#114#69#102#102#101#99#116#84#121#112#101#32#100+ + #101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84#95#83+ + #80#65#82#75#32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32+ + #34#114#101#100#34#32#97#108#105#97#115#32#70#88#82#101#100#32#116#121#112+ + #101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#51#32#119#114#105+ + #116#101#100#101#102#97#117#108#116#59#10#32#32#34#103#114#101#101#110#34#32+ + #97#108#105#97#115#32#70#88#71#114#101#101#110#32#116#121#112#101#32#117#98+ + #121#116#101#32#111#102#102#115#101#116#32#52#32#119#114#105#116#101#100#101+ + #102#97#117#108#116#59#10#32#32#34#98#108#117#101#34#32#97#108#105#97#115#32+ + #70#88#66#108#117#101#32#116#121#112#101#32#117#98#121#116#101#32#111#102+ + #102#115#101#116#32#53#32#119#114#105#116#101#100#101#102#97#117#108#116#59+ + #10#32#32#34#112#111#115#34#32#97#108#105#97#115#32#70#88#80#111#115#32#116+ + #121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#54#32#101+ + #110#117#109#32#84#114#105#103#103#101#114#69#102#102#101#99#116#80#111#115+ + #32#100#101#102#97#117#108#116#32#84#82#73#71#71#69#82#95#69#70#70#69#67#84+ + #95#80#79#83#95#67#69#78#84#69#82#32#119#114#105#116#101#100#101#102#97#117+ + #108#116#59#10#32#32#34#119#97#105#116#34#32#116#121#112#101#32#117#115#104+ + #111#114#116#32#111#102#102#115#101#116#32#56#32#119#114#105#116#101#100#101+ + #102#97#117#108#116#59#10#32#32#34#118#101#108#95#120#34#32#116#121#112#101+ + #32#98#121#116#101#32#111#102#102#115#101#116#32#49#48#32#119#114#105#116+ + #101#100#101#102#97#117#108#116#59#10#32#32#34#118#101#108#95#121#34#32#116+ + #121#112#101#32#98#121#116#101#32#111#102#102#115#101#116#32#49#49#32#119+ + #114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#115#112#114#101+ + #97#100#95#108#34#32#116#121#112#101#32#117#98#121#116#101#32#111#102#102+ + #115#101#116#32#49#50#32#119#114#105#116#101#100#101#102#97#117#108#116#59+ + #10#32#32#34#115#112#114#101#97#100#95#114#34#32#116#121#112#101#32#117#98+ + #121#116#101#32#111#102#102#115#101#116#32#49#51#32#119#114#105#116#101#100+ + #101#102#97#117#108#116#59#10#32#32#34#115#112#114#101#97#100#95#117#34#32+ + #116#121#112#101#32#117#98#121#116#101#32#111#102#102#115#101#116#32#49#52+ + #32#119#114#105#116#101#100#101#102#97#117#108#116#59#10#32#32#34#115#112+ + #114#101#97#100#95#100#34#32#116#121#112#101#32#117#98#121#116#101#32#111+ + #102#102#115#101#116#32#49#53#32#119#114#105#116#101#100#101#102#97#117#108+ + #116#59#10#125#10 ; \ No newline at end of file diff --git a/src/shared/mapdef_help.inc b/src/shared/mapdef_help.inc index efd7623..3e8dfec 100644 --- a/src/shared/mapdef_help.inc +++ b/src/shared/mapdef_help.inc @@ -1,88 +1,107 @@ // *** WARNING! *** // regenerate this part directly from "mapdef.txt" with 'mapgen', NEVER manually change anything here! -function trigMapName (): AnsiString; inline; -function trigTargetPoint (): TDFPoint; inline; -function trigd2d_teleport (): Boolean; inline; -function trigsilent_teleport (): Boolean; inline; -function trigTlpDir (): Byte; inline; -function trigNoSound (): Boolean; inline; -function trigd2d_doors (): Boolean; inline; + +// TRIGGER_EXIT +function trigMap (): AnsiString; inline; + +// TRIGGER_TELEPORT +function trigTarget (): TDFPoint; inline; +function trigD2d (): Boolean; inline; +function trigSilent (): Boolean; inline; +function trigDirection (): Byte; inline; + +// TRIGGER_OPENDOOR, TRIGGER_CLOSEDOOR, TRIGGER_DOOR, TRIGGER_DOOR5, TRIGGER_CLOSETRAP, TRIGGER_TRAP, TRIGGER_LIFTUP, TRIGGER_LIFTDOWN, TRIGGER_LIFT + +// TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF function trigTX (): LongInt; inline; function trigTY (): LongInt; inline; function trigTWidth (): Word; inline; function trigTHeight (): Word; inline; function trigWait (): Word; inline; -function trigCount (): Word; inline; +function trigPressCount (): Word; inline; function trigExtRandom (): Boolean; inline; + +// TRIGGER_SECRET + +// TRIGGER_TEXTURE function trigActivateOnce (): Boolean; inline; -function trigAnimOnce (): Boolean; inline; +function trigAnimateOnce (): Boolean; inline; + +// TRIGGER_SOUND function trigSoundName (): AnsiString; inline; function trigVolume (): Byte; inline; function trigPan (): Byte; inline; function trigLocal (): Boolean; inline; function trigPlayCount (): Byte; inline; function trigSoundSwitch (): Boolean; inline; -function trigMonPos (): TDFPoint; inline; -function trigMonType (): Byte; inline; -function trigMonHealth (): LongInt; inline; -function trigMonDir (): Byte; inline; -function trigMonActive (): Boolean; inline; -function trigMonCount (): LongInt; inline; -function trigMonEffect (): Byte; inline; -function trigMonMax (): Word; inline; -function trigMonDelay (): Word; inline; -function trigMonBehav (): Byte; inline; -function trigItemPos (): TDFPoint; inline; -function trigItemType (): Byte; inline; -function trigItemFalls (): Boolean; inline; -function trigItemOnlyDM (): Boolean; inline; + +// TRIGGER_SPAWNMONSTER +function trigSpawnMonsType (): Byte; inline; +function trigHealth (): LongInt; inline; +function trigActive (): Boolean; inline; +function trigMonsCount (): LongInt; inline; +function trigEffect (): Byte; inline; +function trigMax (): Word; inline; +function trigDelay (): Word; inline; +function trigBehaviour (): Byte; inline; + +// TRIGGER_SPAWNITEM +function trigSpawnItemType (): Byte; inline; +function trigGravity (): Boolean; inline; +function trigDmonly (): Boolean; inline; function trigItemCount (): LongInt; inline; -function trigItemEffect (): Byte; inline; -function trigItemMax (): Word; inline; -function trigItemDelay (): Word; inline; + +// TRIGGER_MUSIC function trigMusicName (): AnsiString; inline; function trigMusicAction (): Byte; inline; -function trigPushAngle (): Word; inline; -function trigPushForce (): Byte; inline; -function trigResetVel (): Boolean; inline; + +// TRIGGER_PUSH +function trigAngle (): Word; inline; +function trigForce (): Byte; inline; +function trigResetVelocity (): Boolean; inline; + +// TRIGGER_SCORE function trigScoreAction (): Byte; inline; function trigScoreCount (): Byte; inline; function trigScoreTeam (): Byte; inline; function trigScoreCon (): Boolean; inline; function trigScoreMsg (): Boolean; inline; -function trigMessageKind (): Byte; inline; -function trigMessageSendTo (): Byte; inline; -function trigMessageText (): AnsiString; inline; -function trigMessageTime (): Word; inline; -function trigDamageValue (): Word; inline; -function trigDamageInterval (): Word; inline; -function trigHealValue (): Word; inline; -function trigHealInterval (): Word; inline; + +// TRIGGER_MESSAGE +function trigKind (): Byte; inline; +function trigMsgDest (): Byte; inline; +function trigText (): AnsiString; inline; +function trigMsgTime (): Word; inline; + +// TRIGGER_DAMAGE +function trigAmount (): Word; inline; +function trigInterval (): Word; inline; + +// TRIGGER_HEALTH function trigHealMax (): Boolean; inline; -function trigHealSilent (): Boolean; inline; -function trigShotPos (): TDFPoint; inline; + +// TRIGGER_SHOT function trigShotType (): Byte; inline; function trigShotTarget (): Byte; inline; -function trigShotSound (): Boolean; inline; -function trigShotAim (): SmallInt; inline; -function trigShotIntSight (): Word; inline; -function trigShotAngle (): Word; inline; -function trigShotWait (): Word; inline; -function trigShotAccuracy (): Word; inline; -function trigShotAmmo (): Word; inline; -function trigShotIntReload (): Word; inline; +function trigQuiet (): Boolean; inline; +function trigAim (): SmallInt; inline; +function trigSight (): Word; inline; +function trigAccuracy (): Word; inline; +function trigAmmo (): Word; inline; +function trigReload (): Word; inline; + +// TRIGGER_EFFECT function trigFXCount (): Byte; inline; function trigFXType (): Byte; inline; function trigFXSubType (): Byte; inline; -function trigFXColorR (): Byte; inline; -function trigFXColorG (): Byte; inline; -function trigFXColorB (): Byte; inline; +function trigFXRed (): Byte; inline; +function trigFXGreen (): Byte; inline; +function trigFXBlue (): Byte; inline; function trigFXPos (): Byte; inline; -function trigFXWait (): Word; inline; -function trigFXVelX (): SmallInt; inline; -function trigFXVelY (): SmallInt; inline; -function trigFXSpreadL (): Byte; inline; -function trigFXSpreadR (): Byte; inline; -function trigFXSpreadU (): Byte; inline; -function trigFXSpreadD (): Byte; inline; +function trigVelX (): SmallInt; inline; +function trigVelY (): SmallInt; inline; +function trigSpreadL (): Byte; inline; +function trigSpreadR (): Byte; inline; +function trigSpreadU (): Byte; inline; +function trigSpreadD (): Byte; inline; diff --git a/src/shared/mapdef_impl.inc b/src/shared/mapdef_impl.inc index f491dbf..2528113 100644 --- a/src/shared/mapdef_impl.inc +++ b/src/shared/mapdef_impl.inc @@ -4,17 +4,15 @@ // trigger helpers // TRIGGER_EXIT -function TDynRecordHelper.trigMapName (): AnsiString; inline; begin result := utf2win(getFieldWithType('map', TDynField.TType.TChar).sval); end; +function TDynRecordHelper.trigMap (): AnsiString; inline; begin result := utf2win(getFieldWithType('map', TDynField.TType.TChar).sval); end; // TRIGGER_TELEPORT -function TDynRecordHelper.trigTargetPoint (): TDFPoint; inline; begin result := getPointField('target'); end; -function TDynRecordHelper.trigd2d_teleport (): Boolean; inline; begin result := (getFieldWithType('d2d', TDynField.TType.TBool).ival <> 0); end; -function TDynRecordHelper.trigsilent_teleport (): Boolean; inline; begin result := (getFieldWithType('silent', TDynField.TType.TBool).ival <> 0); end; -function TDynRecordHelper.trigTlpDir (): Byte; inline; begin result := Byte(getFieldWithType('direction', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigTarget (): TDFPoint; inline; begin result := getPointField('target'); end; +function TDynRecordHelper.trigD2d (): Boolean; inline; begin result := (getFieldWithType('d2d', TDynField.TType.TBool).ival <> 0); end; +function TDynRecordHelper.trigSilent (): Boolean; inline; begin result := (getFieldWithType('silent', TDynField.TType.TBool).ival <> 0); end; +function TDynRecordHelper.trigDirection (): Byte; inline; begin result := Byte(getFieldWithType('direction', TDynField.TType.TUByte).ival); end; // TRIGGER_OPENDOOR, TRIGGER_CLOSEDOOR, TRIGGER_DOOR, TRIGGER_DOOR5, TRIGGER_CLOSETRAP, TRIGGER_TRAP, TRIGGER_LIFTUP, TRIGGER_LIFTDOWN, TRIGGER_LIFT -function TDynRecordHelper.trigNoSound (): Boolean; inline; begin result := (getFieldWithType('silent', TDynField.TType.TBool).ival <> 0); end; -function TDynRecordHelper.trigd2d_doors (): Boolean; inline; begin result := (getFieldWithType('d2d', TDynField.TType.TBool).ival <> 0); end; // TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF function TDynRecordHelper.trigTX (): LongInt; inline; begin result := LongInt(getFieldWithType('position', TDynField.TType.TPoint).ival); end; @@ -22,53 +20,47 @@ function TDynRecordHelper.trigTY (): LongInt; inline; begin result := LongInt(ge function TDynRecordHelper.trigTWidth (): Word; inline; begin result := Word(getFieldWithType('size', TDynField.TType.TSize).ival); end; function TDynRecordHelper.trigTHeight (): Word; inline; begin result := Word(getFieldWithType('size', TDynField.TType.TSize).ival2); end; function TDynRecordHelper.trigWait (): Word; inline; begin result := Word(getFieldWithType('wait', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigCount (): Word; inline; begin result := Word(getFieldWithType('count', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigExtRandom (): Boolean; inline; begin result := (getFieldWithType('extrandom', TDynField.TType.TBool).ival <> 0); end; +function TDynRecordHelper.trigPressCount (): Word; inline; begin result := Word(getFieldWithType('count', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigExtRandom (): Boolean; inline; begin result := (getFieldWithType('ext_random', TDynField.TType.TBool).ival <> 0); end; // TRIGGER_SECRET // TRIGGER_TEXTURE -function TDynRecordHelper.trigActivateOnce (): Boolean; inline; begin result := (getFieldWithType('activateonce', TDynField.TType.TBool).ival <> 0); end; -function TDynRecordHelper.trigAnimOnce (): Boolean; inline; begin result := (getFieldWithType('animateonce', TDynField.TType.TBool).ival <> 0); end; +function TDynRecordHelper.trigActivateOnce (): Boolean; inline; begin result := (getFieldWithType('activate_once', TDynField.TType.TBool).ival <> 0); end; +function TDynRecordHelper.trigAnimateOnce (): Boolean; inline; begin result := (getFieldWithType('animate_once', TDynField.TType.TBool).ival <> 0); end; // TRIGGER_SOUND -function TDynRecordHelper.trigSoundName (): AnsiString; inline; begin result := utf2win(getFieldWithType('soundname', TDynField.TType.TChar).sval); end; +function TDynRecordHelper.trigSoundName (): AnsiString; inline; begin result := utf2win(getFieldWithType('sound_name', TDynField.TType.TChar).sval); end; function TDynRecordHelper.trigVolume (): Byte; inline; begin result := Byte(getFieldWithType('volume', TDynField.TType.TUByte).ival); end; function TDynRecordHelper.trigPan (): Byte; inline; begin result := Byte(getFieldWithType('pan', TDynField.TType.TUByte).ival); end; function TDynRecordHelper.trigLocal (): Boolean; inline; begin result := (getFieldWithType('local', TDynField.TType.TBool).ival <> 0); end; -function TDynRecordHelper.trigPlayCount (): Byte; inline; begin result := Byte(getFieldWithType('playcount', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigSoundSwitch (): Boolean; inline; begin result := (getFieldWithType('soundswitch', TDynField.TType.TBool).ival <> 0); end; +function TDynRecordHelper.trigPlayCount (): Byte; inline; begin result := Byte(getFieldWithType('play_count', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigSoundSwitch (): Boolean; inline; begin result := (getFieldWithType('sound_switch', TDynField.TType.TBool).ival <> 0); end; // TRIGGER_SPAWNMONSTER -function TDynRecordHelper.trigMonPos (): TDFPoint; inline; begin result := getPointField('position'); end; -function TDynRecordHelper.trigMonType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigMonHealth (): LongInt; inline; begin result := LongInt(getFieldWithType('health', TDynField.TType.TInt).ival); end; -function TDynRecordHelper.trigMonDir (): Byte; inline; begin result := Byte(getFieldWithType('direction', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigMonActive (): Boolean; inline; begin result := (getFieldWithType('active', TDynField.TType.TBool).ival <> 0); end; -function TDynRecordHelper.trigMonCount (): LongInt; inline; begin result := LongInt(getFieldWithType('count', TDynField.TType.TInt).ival); end; -function TDynRecordHelper.trigMonEffect (): Byte; inline; begin result := Byte(getFieldWithType('effect', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigMonMax (): Word; inline; begin result := Word(getFieldWithType('max', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigMonDelay (): Word; inline; begin result := Word(getFieldWithType('delay', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigMonBehav (): Byte; inline; begin result := Byte(getFieldWithType('behaviour', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigSpawnMonsType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigHealth (): LongInt; inline; begin result := LongInt(getFieldWithType('health', TDynField.TType.TInt).ival); end; +function TDynRecordHelper.trigActive (): Boolean; inline; begin result := (getFieldWithType('active', TDynField.TType.TBool).ival <> 0); end; +function TDynRecordHelper.trigMonsCount (): LongInt; inline; begin result := LongInt(getFieldWithType('count', TDynField.TType.TInt).ival); end; +function TDynRecordHelper.trigEffect (): Byte; inline; begin result := Byte(getFieldWithType('effect', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigMax (): Word; inline; begin result := Word(getFieldWithType('max', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigDelay (): Word; inline; begin result := Word(getFieldWithType('delay', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigBehaviour (): Byte; inline; begin result := Byte(getFieldWithType('behaviour', TDynField.TType.TUByte).ival); end; // TRIGGER_SPAWNITEM -function TDynRecordHelper.trigItemPos (): TDFPoint; inline; begin result := getPointField('position'); end; -function TDynRecordHelper.trigItemType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigItemFalls (): Boolean; inline; begin result := (getFieldWithType('gravity', TDynField.TType.TBool).ival <> 0); end; -function TDynRecordHelper.trigItemOnlyDM (): Boolean; inline; begin result := (getFieldWithType('dmonly', TDynField.TType.TBool).ival <> 0); end; +function TDynRecordHelper.trigSpawnItemType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigGravity (): Boolean; inline; begin result := (getFieldWithType('gravity', TDynField.TType.TBool).ival <> 0); end; +function TDynRecordHelper.trigDmonly (): Boolean; inline; begin result := (getFieldWithType('dmonly', TDynField.TType.TBool).ival <> 0); end; function TDynRecordHelper.trigItemCount (): LongInt; inline; begin result := LongInt(getFieldWithType('count', TDynField.TType.TInt).ival); end; -function TDynRecordHelper.trigItemEffect (): Byte; inline; begin result := Byte(getFieldWithType('effect', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigItemMax (): Word; inline; begin result := Word(getFieldWithType('max', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigItemDelay (): Word; inline; begin result := Word(getFieldWithType('delay', TDynField.TType.TUShort).ival); end; // TRIGGER_MUSIC function TDynRecordHelper.trigMusicName (): AnsiString; inline; begin result := utf2win(getFieldWithType('name', TDynField.TType.TChar).sval); end; function TDynRecordHelper.trigMusicAction (): Byte; inline; begin result := Byte(getFieldWithType('action', TDynField.TType.TUByte).ival); end; // TRIGGER_PUSH -function TDynRecordHelper.trigPushAngle (): Word; inline; begin result := Word(getFieldWithType('angle', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigPushForce (): Byte; inline; begin result := Byte(getFieldWithType('force', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigResetVel (): Boolean; inline; begin result := (getFieldWithType('resetvelocity', TDynField.TType.TBool).ival <> 0); end; +function TDynRecordHelper.trigAngle (): Word; inline; begin result := Word(getFieldWithType('angle', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigForce (): Byte; inline; begin result := Byte(getFieldWithType('force', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigResetVelocity (): Boolean; inline; begin result := (getFieldWithType('reset_velocity', TDynField.TType.TBool).ival <> 0); end; // TRIGGER_SCORE function TDynRecordHelper.trigScoreAction (): Byte; inline; begin result := Byte(getFieldWithType('action', TDynField.TType.TUByte).ival); end; @@ -78,46 +70,39 @@ function TDynRecordHelper.trigScoreCon (): Boolean; inline; begin result := (get function TDynRecordHelper.trigScoreMsg (): Boolean; inline; begin result := (getFieldWithType('message', TDynField.TType.TBool).ival <> 0); end; // TRIGGER_MESSAGE -function TDynRecordHelper.trigMessageKind (): Byte; inline; begin result := Byte(getFieldWithType('kind', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigMessageSendTo (): Byte; inline; begin result := Byte(getFieldWithType('sendto', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigMessageText (): AnsiString; inline; begin result := utf2win(getFieldWithType('text', TDynField.TType.TChar).sval); end; -function TDynRecordHelper.trigMessageTime (): Word; inline; begin result := Word(getFieldWithType('time', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigKind (): Byte; inline; begin result := Byte(getFieldWithType('kind', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigMsgDest (): Byte; inline; begin result := Byte(getFieldWithType('dest', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigText (): AnsiString; inline; begin result := utf2win(getFieldWithType('text', TDynField.TType.TChar).sval); end; +function TDynRecordHelper.trigMsgTime (): Word; inline; begin result := Word(getFieldWithType('time', TDynField.TType.TUShort).ival); end; // TRIGGER_DAMAGE -function TDynRecordHelper.trigDamageValue (): Word; inline; begin result := Word(getFieldWithType('amount', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigDamageInterval (): Word; inline; begin result := Word(getFieldWithType('interval', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigAmount (): Word; inline; begin result := Word(getFieldWithType('amount', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigInterval (): Word; inline; begin result := Word(getFieldWithType('interval', TDynField.TType.TUShort).ival); end; // TRIGGER_HEALTH -function TDynRecordHelper.trigHealValue (): Word; inline; begin result := Word(getFieldWithType('amount', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigHealInterval (): Word; inline; begin result := Word(getFieldWithType('interval', TDynField.TType.TUShort).ival); end; function TDynRecordHelper.trigHealMax (): Boolean; inline; begin result := (getFieldWithType('max', TDynField.TType.TBool).ival <> 0); end; -function TDynRecordHelper.trigHealSilent (): Boolean; inline; begin result := (getFieldWithType('silent', TDynField.TType.TBool).ival <> 0); end; // TRIGGER_SHOT -function TDynRecordHelper.trigShotPos (): TDFPoint; inline; begin result := getPointField('position'); end; function TDynRecordHelper.trigShotType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end; function TDynRecordHelper.trigShotTarget (): Byte; inline; begin result := Byte(getFieldWithType('target', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigShotSound (): Boolean; inline; begin result := (getFieldWithType('silent', TDynField.TType.TBool).ival = 0); end; -function TDynRecordHelper.trigShotAim (): SmallInt; inline; begin result := ShortInt(getFieldWithType('aim', TDynField.TType.TByte).ival); end; -function TDynRecordHelper.trigShotIntSight (): Word; inline; begin result := Word(getFieldWithType('sight', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigShotAngle (): Word; inline; begin result := Word(getFieldWithType('angle', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigShotWait (): Word; inline; begin result := Word(getFieldWithType('wait', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigShotAccuracy (): Word; inline; begin result := Word(getFieldWithType('accuracy', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigShotAmmo (): Word; inline; begin result := Word(getFieldWithType('ammo', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigShotIntReload (): Word; inline; begin result := Word(getFieldWithType('reload', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigQuiet (): Boolean; inline; begin result := (getFieldWithType('quiet', TDynField.TType.TBool).ival = 0); end; +function TDynRecordHelper.trigAim (): SmallInt; inline; begin result := ShortInt(getFieldWithType('aim', TDynField.TType.TByte).ival); end; +function TDynRecordHelper.trigSight (): Word; inline; begin result := Word(getFieldWithType('sight', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigAccuracy (): Word; inline; begin result := Word(getFieldWithType('accuracy', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigAmmo (): Word; inline; begin result := Word(getFieldWithType('ammo', TDynField.TType.TUShort).ival); end; +function TDynRecordHelper.trigReload (): Word; inline; begin result := Word(getFieldWithType('reload', TDynField.TType.TUShort).ival); end; // TRIGGER_EFFECT function TDynRecordHelper.trigFXCount (): Byte; inline; begin result := Byte(getFieldWithType('count', TDynField.TType.TUByte).ival); end; function TDynRecordHelper.trigFXType (): Byte; inline; begin result := Byte(getFieldWithType('type', TDynField.TType.TUByte).ival); end; function TDynRecordHelper.trigFXSubType (): Byte; inline; begin result := Byte(getFieldWithType('subtype', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigFXColorR (): Byte; inline; begin result := Byte(getFieldWithType('colorr', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigFXColorG (): Byte; inline; begin result := Byte(getFieldWithType('colorg', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigFXColorB (): Byte; inline; begin result := Byte(getFieldWithType('colorb', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigFXPos (): Byte; inline; begin result := Byte(getFieldWithType('position', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigFXWait (): Word; inline; begin result := Word(getFieldWithType('wait', TDynField.TType.TUShort).ival); end; -function TDynRecordHelper.trigFXVelX (): SmallInt; inline; begin result := ShortInt(getFieldWithType('velx', TDynField.TType.TByte).ival); end; -function TDynRecordHelper.trigFXVelY (): SmallInt; inline; begin result := ShortInt(getFieldWithType('vely', TDynField.TType.TByte).ival); end; -function TDynRecordHelper.trigFXSpreadL (): Byte; inline; begin result := Byte(getFieldWithType('spreadl', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigFXSpreadR (): Byte; inline; begin result := Byte(getFieldWithType('spreadr', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigFXSpreadU (): Byte; inline; begin result := Byte(getFieldWithType('spreadu', TDynField.TType.TUByte).ival); end; -function TDynRecordHelper.trigFXSpreadD (): Byte; inline; begin result := Byte(getFieldWithType('spreadd', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigFXRed (): Byte; inline; begin result := Byte(getFieldWithType('red', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigFXGreen (): Byte; inline; begin result := Byte(getFieldWithType('green', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigFXBlue (): Byte; inline; begin result := Byte(getFieldWithType('blue', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigFXPos (): Byte; inline; begin result := Byte(getFieldWithType('pos', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigVelX (): SmallInt; inline; begin result := ShortInt(getFieldWithType('vel_x', TDynField.TType.TByte).ival); end; +function TDynRecordHelper.trigVelY (): SmallInt; inline; begin result := ShortInt(getFieldWithType('vel_y', TDynField.TType.TByte).ival); end; +function TDynRecordHelper.trigSpreadL (): Byte; inline; begin result := Byte(getFieldWithType('spread_l', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigSpreadR (): Byte; inline; begin result := Byte(getFieldWithType('spread_r', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigSpreadU (): Byte; inline; begin result := Byte(getFieldWithType('spread_u', TDynField.TType.TUByte).ival); end; +function TDynRecordHelper.trigSpreadD (): Byte; inline; begin result := Byte(getFieldWithType('spread_d', TDynField.TType.TUByte).ival); end; diff --git a/src/shared/xdynrec.pas b/src/shared/xdynrec.pas index fe9c561..3bce723 100644 --- a/src/shared/xdynrec.pas +++ b/src/shared/xdynrec.pas @@ -44,17 +44,16 @@ type // TSize: pair of UShorts // TList: actually, array of records // TTrigData: array of mMaxDim bytes, but internally a record (mRecRef) - // arrays of chars are pascal shortstrings (with counter in the first byte) + // in binary: arrays of chars are pascal shortstrings (with counter in the first byte) private type TEBS = (TNone, TRec, TEnum, TBitSet); private - mOwner: TDynRecord; - mPasName: AnsiString; - mName: AnsiString; - mType: TType; + mOwner: TDynRecord; // owner record + mName: AnsiString; // field name + mType: TType; // field type mIVal: Integer; // for all integer types mIVal2: Integer; // for point and size mSVal: AnsiString; // string; for byte and char arrays @@ -67,7 +66,7 @@ type mAsT: Boolean; // for points and sizes, use separate fields, names starts with `t` mDefined: Boolean; mHasDefault: Boolean; - mOmitDef: Boolean; + mWriteDef: Boolean; mInternal: Boolean; mNegBool: Boolean; mBitSetUnique: Boolean; // bitset can contain only one value @@ -88,6 +87,9 @@ type mTagInt: Integer; mTagPtr: Pointer; + // for pasgen + mAlias: AnsiString; + private procedure cleanup (); @@ -120,8 +122,10 @@ type class function getTypeName (t: TType): AnsiString; + // build "alias name" for pascal code + function palias (firstUp: Boolean=false): AnsiString; + function definition (): AnsiString; - function pasdef (): AnsiString; function clone (newOwner: TDynRecord=nil; registerIn: TDynRecord=nil): TDynField; @@ -139,7 +143,6 @@ type function GetEnumerator (): TDynRecList.TEnumerator; inline; public - property pasname: AnsiString read mPasName; property name: AnsiString read mName; property baseType: TType read mType; property negbool: Boolean read mNegBool; @@ -175,7 +178,6 @@ type private mOwner: TDynMapDef; mId: AnsiString; - mPasName: AnsiString; mName: AnsiString; mSize: Integer; mFields: TDynFieldList; @@ -224,7 +226,6 @@ type destructor Destroy (); override; function definition (): AnsiString; - function pasdef (): AnsiString; function clone (registerIn: TDynRecord): TDynRecord; @@ -242,16 +243,11 @@ type // number of records of the given instance function instanceCount (const typename: AnsiString): Integer; - //procedure setUserField (const fldname: AnsiString; v: LongInt); - //procedure setUserField (const fldname: AnsiString; v: AnsiString); - //procedure setUserField (const fldname: AnsiString; v: Boolean); - function getUserVar (const aname: AnsiString): Variant; procedure setUserVar (const aname: AnsiString; val: Variant); public property id: AnsiString read mId; // for map parser - property pasname: AnsiString read mPasName; property name: AnsiString read mName; // record name property size: Integer read mSize; // size in bytes //property fields: TDynFieldList read mFields; @@ -331,7 +327,6 @@ type function findTrigFor (const aname: AnsiString): TDynRecord; function findEBSType (const aname: AnsiString): TDynEBS; - function pasdef (): AnsiString; function pasdefconst (): AnsiString; // creates new header record @@ -486,7 +481,7 @@ begin mAsT := false; mHasDefault := false; mDefined := false; - mOmitDef := false; + mWriteDef := false; mInternal := true; mDefUnparsed := ''; mDefSVal := ''; @@ -502,6 +497,7 @@ begin mRecRefId := ''; mTagInt := 0; mTagPtr := nil; + mAlias := ''; end; @@ -512,7 +508,6 @@ begin result := TDynField.Create(mName, mType); result.mOwner := mOwner; if (newOwner <> nil) then result.mOwner := newOwner else result.mOwner := mOwner; - result.mPasName := mPasName; result.mName := mName; result.mType := mType; result.mIVal := mIVal; @@ -531,7 +526,7 @@ begin result.mAsT := mAsT; result.mDefined := mDefined; result.mHasDefault := mHasDefault; - result.mOmitDef := mOmitDef; + result.mWriteDef := mWriteDef; result.mInternal := mInternal; result.mNegBool := mNegBool; result.mBitSetUnique := mBitSetUnique; @@ -547,6 +542,30 @@ begin result.mRecRefId := mRecRefId; result.mTagInt := mTagInt; result.mTagPtr := mTagPtr; + result.mAlias := mAlias; +end; + + +function TDynField.palias (firstUp: Boolean=false): AnsiString; +var + nextUp: Boolean; + ch: AnsiChar; +begin + if (Length(mAlias) > 0) then + begin + if firstUp then result := UpCase1251(mAlias[1])+Copy(mAlias, 2, Length(mAlias)-1) else result := mAlias; + end + else + begin + result := ''; + nextUp := firstUp; + for ch in mName do + begin + if (ch = '_') then begin nextUp := true; continue; end; + if nextUp then result += UpCase1251(ch) else result += ch; + nextUp := false; + end; + end; end; @@ -838,8 +857,9 @@ end; function TDynField.definition (): AnsiString; begin - result := mPasName+' is '+quoteStr(mName)+' type '; + result := quoteStr(mName)+' type '; result += getTypeName(mType); + if (Length(mAlias) > 0) then result += ' alias '+mAlias; if (mMaxDim >= 0) then result += Format('[%d]', [mMaxDim]); if (mBinOfs >= 0) then result += Format(' offset %d', [mBinOfs]); case mEBS of @@ -855,49 +875,20 @@ begin if (mType = TType.TPoint) then begin if (mAsT) then result += ' as txy' else result += ' as xy'; end else if (mType = TType.TSize) then begin if (mAsT) then result += ' as twh' else result += ' as wh'; end; end; - if mOmitDef then result += ' omitdefault'; + if mWriteDef then result += ' writedefault'; if mInternal then result += ' internal'; end; -function TDynField.pasdef (): AnsiString; -begin - result := mPasName+': '; - case mType of - TType.TBool: result += 'Boolean;'; - TType.TChar: if (mMaxDim > 0) then result += formatstrf('Char%d;', [mMaxDim]) else result += 'Char;'; - TType.TByte: result += 'ShortInt;'; - TType.TUByte: result += 'Byte;'; - TType.TShort: result += 'SmallInt;'; - TType.TUShort: result += 'Word;'; - TType.TInt: result += 'LongInt;'; - TType.TUInt: result += 'LongWord;'; - TType.TString: result += 'AnsiString;'; - TType.TPoint: - if mAsT then result := 'tX, tY: Integer;' - else if mSepPosSize then result := 'X, Y: Integer;' - else result += 'TDFPoint;'; - TType.TSize: - if mAsT then result := 'tWidth, tHeight: Word;' - else if mSepPosSize then result := 'Width, Height: Word;' - else result += 'TSize;'; - TType.TList: assert(false); - TType.TTrigData: result += formatstrf('Byte%d;', [mMaxDim]); - else raise Exception.Create('ketmar forgot to handle some field type'); - end; -end; - - procedure TDynField.parseDef (pr: TTextParser); var fldname: AnsiString; fldtype: AnsiString; fldofs: Integer; fldrecname: AnsiString; - fldpasname: AnsiString; asxy, aswh, ast: Boolean; ainternal: Boolean; - omitdef: Boolean; + writedef: Boolean; defstr: AnsiString; defint, defint2: Integer; hasdefStr: Boolean; @@ -908,8 +899,8 @@ var unique: Boolean; asmonid: Boolean; defech: AnsiChar; + xalias: AnsiString; begin - fldpasname := ''; fldname := ''; fldtype := ''; fldofs := -1; @@ -918,7 +909,7 @@ begin aswh := false; ast := false; ainternal := false; - omitdef := false; + writedef := false; defstr := ''; defint := 0; defint2 := 0; @@ -929,25 +920,36 @@ begin asmonid := false; lmaxdim := -1; lebs := TDynField.TEBS.TNone; + xalias := ''; - fldpasname := pr.expectId(); // pascal field name // field name - pr.expectId('is'); - fldname := pr.expectStr(); - // field type - pr.expectId('type'); - fldtype := pr.expectId(); - - // fixed-size array? - if pr.eatDelim('[') then - begin - lmaxdim := pr.expectInt(); - if (lmaxdim < 1) then raise Exception.Create(Format('invalid field ''%s'' array size', [fldname])); - pr.expectDelim(']'); - end; + fldname := pr.expectStrOrId(); while (pr.tokType <> pr.TTSemi) do begin + if pr.eatId('type') then + begin + if (Length(fldtype) > 0) then raise Exception.Create(Format('duplicate type definition for field ''%s''', [fldname])); + // field type + fldtype := pr.expectId(); + // fixed-size array? + if pr.eatDelim('[') then + begin + lmaxdim := pr.expectInt(); + // arbitrary limits + if (lmaxdim < 1) or (lmaxdim > 32768) then raise Exception.Create(Format('invalid field ''%s'' array size', [fldname])); + pr.expectDelim(']'); + end; + continue; + end; + + if pr.eatId('alias') then + begin + if (Length(xalias) > 0) then raise Exception.Create(Format('duplicate alias definition for field ''%s''', [fldname])); + xalias := pr.expectId(); + continue; + end; + if pr.eatId('offset') then begin if (fldofs >= 0) then raise Exception.Create(Format('duplicate field ''%s'' offset', [fldname])); @@ -1017,9 +1019,9 @@ begin continue; end; - if pr.eatId('omitdefault') then + if pr.eatId('writedefault') then begin - omitdef := true; + writedef := true; continue; end; @@ -1029,6 +1031,7 @@ begin continue; end; + // record type, no special modifiers if (pr.tokType <> pr.TTId) then raise Exception.Create(Format('field ''%s'' has something unexpected in definition', [fldname])); if (Length(fldrecname) <> 0) then raise Exception.Create(Format('field ''%s'' already typed as ''%s''', [fldname, fldrecname])); @@ -1053,16 +1056,41 @@ begin else if (fldtype = 'point') then mType := TType.TPoint else if (fldtype = 'size') then mType := TType.TSize else if (fldtype = 'trigdata') then mType := TType.TTrigData - else raise Exception.Create(Format('field ''%s'' has invalid type ''%s''', [fldname, fldtype])); + else + begin + // record types defaults to int + if (Length(fldrecname) > 0) then + begin + mType := TType.TInt; + end + else + begin + if (Length(fldtype) = 0) then raise Exception.Create(Format('field ''%s'' has no type', [fldname])) + else raise Exception.Create(Format('field ''%s'' has invalid type ''%s''', [fldname, fldtype])); + end; + end; + // check for valid arrays if (lmaxdim > 0) and (mType <> TType.TChar) and (mType <> TType.TTrigData) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot be array', [fldname, fldtype])); + + // check for valid trigdata or record type if (mType = TType.TTrigData) then begin - if (lmaxdim < 1) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot be array', [fldname, fldtype])); - if (Length(fldrecname) > 0) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot have another type', [fldname, fldtype])); + // trigdata + if (lmaxdim < 1) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot be non-array', [fldname, 'trigdata'])); + if (Length(fldrecname) > 0) then raise Exception.Create(Format('field ''%s'' of type ''%s'' cannot have another type', [fldname, 'trigdata'])); lebs := TDynField.TEBS.TRec; + end + else if (Length(fldrecname) > 0) then + begin + // record + if not (mType in [TType.TByte, TType.TUByte, TType.TShort, TType.TUShort, TType.TInt, TType.TUInt]) then + begin + raise Exception.Create(Format('field ''%s'' of record type ''%s'' cannot have type ''%s''', [fldname, fldrecname, fldtype])); + end; end; + // setup default value if hasdefStr then self.mDefUnparsed := quoteStr(defstr) else if hasdefId then self.mDefUnparsed := defstr else if hasdefInt then @@ -1073,7 +1101,6 @@ begin end; self.mHasDefault := (hasdefStr or hasdefId or hasdefInt); - self.mPasName := fldpasname; self.mEBS := lebs; self.mEBSTypeName := fldrecname; self.mBitSetUnique := unique; @@ -1082,8 +1109,9 @@ begin self.mBinOfs := fldofs; self.mSepPosSize := (asxy or aswh); self.mAsT := ast; - self.mOmitDef := omitdef; + self.mWriteDef := writedef; self.mInternal := ainternal; + self.mAlias := xalias; end; @@ -2009,7 +2037,6 @@ begin result := TDynRecord.Create(); result.mOwner := mOwner; result.mId := mId; - result.mPasName := mPasName; result.mName := mName; result.mSize := mSize; result.mHeader := mHeader; @@ -2197,9 +2224,7 @@ begin end else begin - mPasName := pr.expectId(); // pascal record name - pr.expectId('is'); - mName := pr.expectStr(); + mName := pr.expectStrOrId(); while (pr.tokType <> pr.TTBegin) do begin if pr.eatId('header') then begin mHeader := true; continue; end; @@ -2240,30 +2265,6 @@ begin end; -function TDynRecord.pasdef (): AnsiString; -var - fld: TDynField; -begin - if isTrigData then - begin - assert(false); - result := ''; - end - else - begin - // record - result := ' '+mPasName+' = packed record'#10; - end; - for fld in mFields do - begin - if fld.mInternal then continue; - if (fld.mBinOfs < 0) then continue; - result += ' '+fld.pasdef+#10; - end; - result += ' end;'#10; -end; - - function TDynRecord.definition (): AnsiString; var f: Integer; @@ -2290,7 +2291,7 @@ begin else begin // record - result := mPasName+' is '+quoteStr(mName); + result := quoteStr(mName); if (mSize >= 0) then result += Format(' size %d bytes', [mSize]); if mHeader then result += ' header'; end; @@ -2588,7 +2589,7 @@ begin continue; end; if fld.mInternal then continue; - if fld.mOmitDef and fld.isDefaultValue then continue; + if (not fld.mWriteDef) and fld.isDefaultValue then continue; wr.putIndent(); fld.writeTo(wr); end; @@ -3078,37 +3079,41 @@ begin while true do begin if not pr.skipBlanks() then break; - if (pr.tokType <> pr.TTId) then raise Exception.Create('identifier expected'); - if (pr.tokStr = 'enum') or (pr.tokStr = 'bitset') then + if (pr.tokType = pr.TTId) then begin - eb := TDynEBS.Create(pr); - if (findEBSType(eb.name) <> nil) then + // enum or bitset + if (pr.tokStr = 'enum') or (pr.tokStr = 'bitset') then begin - eb.Free(); - raise Exception.Create(Format('duplicate enum/bitset ''%s''', [eb.name])); + eb := TDynEBS.Create(pr); + if (findEBSType(eb.name) <> nil) then + begin + eb.Free(); + raise Exception.Create(Format('duplicate enum/bitset ''%s''', [eb.name])); + end; + eb.mOwner := self; + ebsTypes.append(eb); + //writeln(eb.definition); writeln; + continue; end; - eb.mOwner := self; - ebsTypes.append(eb); - //writeln(eb.definition); writeln; - continue; - end; - if (pr.tokStr = 'TriggerData') then - begin - rec := TDynRecord.Create(pr); - for f := 0 to High(rec.mTrigTypes) do + // triggerdata + if (pr.tokStr = 'TriggerData') then begin - if (findTrigFor(rec.mTrigTypes[f]) <> nil) then + rec := TDynRecord.Create(pr); + for f := 0 to High(rec.mTrigTypes) do begin - rec.Free(); - raise Exception.Create(Format('duplicate trigdata ''%s''', [rec.mTrigTypes[f]])); + if (findTrigFor(rec.mTrigTypes[f]) <> nil) then + begin + rec.Free(); + raise Exception.Create(Format('duplicate trigdata ''%s''', [rec.mTrigTypes[f]])); + end; end; + rec.mOwner := self; + trigTypes.append(rec); + //writeln(dr.definition); writeln; + continue; end; - rec.mOwner := self; - trigTypes.append(rec); - //writeln(dr.definition); writeln; - continue; end; rec := TDynRecord.Create(pr); @@ -3147,7 +3152,6 @@ end; function TDynMapDef.parseMap (pr: TTextParser): TDynRecord; var res: TDynRecord = nil; - //fo: TextFile; begin result := nil; try @@ -3159,17 +3163,6 @@ begin res := nil; finally res.Free(); - { - except on e: Exception do - begin - //TMP:segfaults! - AssignFile(fo, 'z.log'); - Rewrite(fo); - DumpExceptionBackTrace(fo); - CloseFile(fo); - res.Free(); - end; - } end; end; @@ -3191,53 +3184,6 @@ begin end; -function TDynMapDef.pasdef (): AnsiString; -var - ebs: TDynEBS; - rec: TDynRecord; - fld: TDynField; - needComma: Boolean; - tn: AnsiString; -begin - result := ''; - result += '// ////////////////////////////////////////////////////////////////////////// //'#10; - result += '// enums and bitsets'#10; - for ebs in ebsTypes do result += #10+ebs.pasdef(); - result += #10#10'// ////////////////////////////////////////////////////////////////////////// //'#10; - result += '// records'#10'type'#10; - for rec in recTypes do - begin - if (rec.mSize < 1) then continue; - result += rec.pasdef(); - result += #10; - end; - result += #10#10'// ////////////////////////////////////////////////////////////////////////// //'#10; - result += '// triggerdata'#10'type'#10; - result += ' TTriggerData = record'#10; - result += ' case Byte of'#10; - result += ' 0: (Default: Byte128);'#10; - for rec in trigTypes do - begin - result += ' '; - needComma := false; - for tn in rec.mTrigTypes do - begin - if needComma then result += ', ' else needComma := true; - result += tn; - end; - result += ': ('#10; - for fld in rec.mFields do - begin - if fld.mInternal then continue; - if (fld.mBinOfs < 0) then continue; - result += ' '+fld.pasdef+#10; - end; - result += ' );'#10; - end; - result += ' end;'#10; -end; - - function TDynMapDef.pasdefconst (): AnsiString; var ebs: TDynEBS; diff --git a/src/shared/xparser.pas b/src/shared/xparser.pas index 76ac3c0..01c49b4 100644 --- a/src/shared/xparser.pas +++ b/src/shared/xparser.pas @@ -75,6 +75,8 @@ type function expectStr (allowEmpty: Boolean=false): AnsiString; function expectInt (): Integer; + function expectStrOrId (allowEmpty: Boolean=false): AnsiString; + procedure expectTT (ttype: Integer); function eatTT (ttype: Integer): Boolean; @@ -544,6 +546,21 @@ begin end; +function TTextParser.expectStrOrId (allowEmpty: Boolean=false): AnsiString; +begin + case mTokType of + TTStr: + if (not allowEmpty) and (Length(mTokStr) = 0) then raise Exception.Create('non-empty string expected'); + TTId: + begin end; + else + raise Exception.Create('string or identifier expected'); + end; + result := mTokStr; + skipToken(); +end; + + function TTextParser.expectInt (): Integer; begin if (mTokType <> TTInt) then raise Exception.Create('string expected'); diff --git a/src/tools/mapgen.dpr b/src/tools/mapgen.dpr index c53aa4e..27c7183 100644 --- a/src/tools/mapgen.dpr +++ b/src/tools/mapgen.dpr @@ -16,6 +16,9 @@ uses // ////////////////////////////////////////////////////////////////////////// // +type + THashStrFld = specialize THashBase; + var pr: TTextParser; dfmapdef: TDynMapDef; @@ -28,7 +31,11 @@ var needComma: Boolean; trec: TDynRecord; fld: TDynField; + palias: AnsiString; + fldknown: THashStrFld = nil; // key: palias; value: prev field + knownfld: TDynField; begin + fldknown := THashStrFld.Create(hsihash, hsiequ); //writeln(getFilenamePath(ParamStr(0)), '|'); e_InitWritelnDriver(); @@ -55,7 +62,7 @@ begin dfmapdef := TDynMapDef.Create(pr); except on e: Exception do begin - writeln('ERROR at (', pr.line, ',', pr.col, '): ', e.message); + writeln('ERROR at (', pr.tokLine, ',', pr.tokCol, '): ', e.message); Halt(1); end; end; @@ -92,14 +99,18 @@ function TDynRecordHelper.trigTlpDir (): Byte; inline; begin result := Byte(getF begin // header comment write(foimpl, #10'// '); + write(fohlp, #10'// '); needComma := false; trec := dfmapdef.trigType[tidx]; for nidx := 0 to trec.forTrigCount-1 do begin + if needComma then write(fohlp, ', '); if needComma then write(foimpl, ', ') else needComma := true; + write(fohlp, trec.forTrigAt[nidx]); write(foimpl, trec.forTrigAt[nidx]); end; write(foimpl, #10); + write(fohlp, #10); // fields for fidx := 0 to trec.count-1 do begin @@ -109,13 +120,26 @@ function TDynRecordHelper.trigTlpDir (): Byte; inline; begin result := Byte(getF // HACK! if (fld.name = 'panelid') or (fld.name = 'monsterid') then begin - writeln('skipping ', fld.pasname, ' <', fld.name, '>'); + writeln('skipping <', fld.name, '>'); + continue; + end; + palias := fld.palias(true); + // check for known aliases + //writeln('<', palias, '> : <', toLowerCase1251(palias), '>'); + knownfld := nil; + if fldknown.get(toLowerCase1251(palias), knownfld) then + begin + if (fld.name <> knownfld.name) then raise Exception.Create(formatstrf('field ''%s'' of record ''%s'' conflicts with other field ''%s''', [fld.name, trec.name, knownfld.name])); + if (fld.baseType <> knownfld.baseType) then raise Exception.Create(formatstrf('field ''%s'' of record ''%s'' conflicts with other field ''%s'' by type', [fld.name, trec.name, knownfld.name])); + writeln('skipped duplicate field ''', fld.name, ''''); continue; end; + fldknown.put(toLowerCase1251(palias), fld); + // write it if (fld.baseType <> TDynField.TType.TPoint) and (fld.baseType <> TDynField.TType.TSize) then begin - write(foimpl, 'function TDynRecordHelper.trig', fld.pasname, ' (): '); - write(fohlp, 'function trig', fld.pasname, ' (): '); + write(foimpl, 'function TDynRecordHelper.trig', palias, ' (): '); + write(fohlp, 'function trig', palias, ' (): '); end; case fld.baseType of TDynField.TType.TBool: @@ -182,8 +206,8 @@ function TDynRecordHelper.trigTlpDir (): Byte; inline; begin result := Byte(getF end else begin - write(fohlp, 'function trig', fld.pasname, ' (): TDFPoint; inline;'#10); - write(foimpl, 'function TDynRecordHelper.trig', fld.pasname, ' (): TDFPoint; inline; begin result := getPointField(''', fld.name, '''); end;'#10); + write(fohlp, 'function trig', palias, ' (): TDFPoint; inline;'#10); + write(foimpl, 'function TDynRecordHelper.trig', palias, ' (): TDFPoint; inline; begin result := getPointField(''', fld.name, '''); end;'#10); end; end; TDynField.TType.TSize: -- 2.29.2