Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@p_kato

Delphi VCLでFluent Designに挑戦(その2) - Reveal Highlight

More than 1 year has passed since last update.

Delphi Advent Calender 2018の18日の記事です。

Delphi VCLでFluent Designに挑戦(その1) - Arcylic Form (アクリル フォーム)
https://qiita.com/p_kato/private/eb8c2d166506b7944b9a
では,Delphi VCLでアクリルフォームの表示をして,移動やリサイズができるようにしました。今回は,その1で作成したアクリルフォームに載せることができるメニューボタンを作ろうと思います。

Windowsアプリの制作者のためのFluent Design System
https://docs.microsoft.com/ja-jp/windows/uwp/design/fluent-design-system/
の「ライトの使用」に書かれている効果を追加したいと思います。このボタンは既にWindows10のEdgeのボタンやURL表示,Newsアプリのメニュー,計算機アプリのボタンなどで実装が進んでいるようです。

ボタンの周りに輪郭線とボヤっとした光(Reveal focus)を追加するのであれば,FMXなら簡単にできそうですね。VCLだとどのようにかけるかトライしたいと思います。

Reveal Highlightの実現方法

表示を見ていると,ボタンが光っている周りのボタンも影響を受けているようです。
そこで,複数のボタンを一つのコントロールで表示することにします。
また,アクリルフォームに重ねるコントロールはTWinControlではせっかくアクリルに表示された効果が上書きされてしまいましたので。TControlから選ぶことにし,TImageをベースにすることにしました。

光の当たっていない画像と光の当たった画像を2つ用意して,光の当たった部分と光の当たっていない部分を重ね合わせた画像を生成するようにしました。
字は16x16の白黒のアイコンから文字と同じ色で描画し,文字とアイコンは不透明で描画しその他のところはアルファブレンディングすることにしました。
メニューの文字はTStringListで格納し,アイコンはImageListでbf32bitで格納しました。0番目のメニューはStringList[0]とImageList[0]に対応します。
そして,ボタンの描画はTimerで集約します。OnMouseLeaveが期待したタイミングでもらえなかったので,Timerでマウスカーソルがボタンから離れた時の処理を書きます。
メニューが選択された結果はOnMouseUpイベントに書かれた処理の後,RMenuIndexに格納されます。
なお,ライトのマスクは,お絵かきソフトで黒地に光の当たる部分を白にしたBMPファイルからデータを作りました。

Reveal Highlightを実現させるユニット

アクリルフォームと合わせて以下のようなユニットを作りました。

unit uFluent;

interface

uses
  System.Types, System.Classes,
  winapi.Windows, winapi.Messages,
  Vcl.Graphics, Vcl.Forms, Vcl.Controls, Vcl.ExtCtrls, Vcl.Imaging.pngimage;

// acrylic form

var
  FAllowSize: Boolean=True; // フォームをリサイズできる
  FAllowMove: Boolean=True; // フォームを移動できる

function AcrylicFormSet(AForm:TForm;AColor:UInt32):integer;
procedure _WMNCHitTest(AForm:TForm;var Msg: TWMNCHitTest);

// Reveal Menu

var
  RMenuList:TStringList; // メニューのラベル名
  RMenuIndex:integer;    // メニューで選択されたIndex

procedure RMenuCreate; // メニューの初期化
procedure RMenuUpdate(AWidth,AHeight:integer); // メニューの情報を更新
procedure RMenuDestroy; // メニューを破棄

procedure RMenuColorsSet(AColor:TColor); // AColorから全体の色セットを設定する

procedure RMenuMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseDown処理
procedure RMenuMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseMove処理
procedure RMenuMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseUp処理
procedure RMenuTimer(AHandle:HWND;AImage:TImage;AImageList:TImageList); // メニューのOnTimerの処理

implementation

uses
  Vcl.GraphUtil;

type
  AccentPolicy = packed record
    AccentState: Integer;
    AccentFlags: Integer;
    GradientColor: Integer;
    AnimationId: Integer;
  end;

  WindowCompositionAttributeData = packed record
    Attribute: Cardinal;
    Data: Pointer;
    SizeOfData: Integer;
  end;

var
  SetWindowCompositionAttribute:function (hWnd: HWND; var data: WindowCompositionAttributeData):integer; stdcall;

function AcrylicFormSet(AForm:TForm;AColor:UInt32):integer;
const
  WCA_ACCENT_POLICY = 19;
  ACCENT_ENABLE_ACRYLICBLURBEHIND = 4; // Windows 10 April 2018 Update
  DrawLeftBorder = $20;
  DrawTopBorder = $40;
  DrawRightBorder = $80;
  DrawBottomBorder = $100;

var
  dwm10: THandle;
  data: WindowCompositionAttributeData;
  accent: AccentPolicy;
begin
  Result:=-1;// Not found Windows 10 SetWindowCompositionAttribute in user32.dll

  AForm.GlassFrame.Bottom:=-1;
  AForm.GlassFrame.Top:=-1;
  AForm.GlassFrame.Left:=-1;
  AForm.GlassFrame.Right:=-1;
  AForm.GlassFrame.SheetOfGlass:=True;
  AForm.GlassFrame.Enabled:=True;
  AForm.BorderStyle := bsNone;
  AForm.BorderIcons := [biSystemMenu, biMinimize];
  AForm.DoubleBuffered:=True;

  dwm10 := LoadLibrary('user32.dll');
  try
    @SetWindowCompositionAttribute := GetProcAddress(dwm10, 'SetWindowCompositionAttribute');
    if @SetWindowCompositionAttribute <> nil then begin
      accent.AccentState := ACCENT_ENABLE_ACRYLICBLURBEHIND;
      accent.GradientColor := AColor;
      accent.AccentFlags := DrawLeftBorder or DrawTopBorder or DrawRightBorder or DrawBottomBorder;
      data.Attribute := WCA_ACCENT_POLICY;
      data.SizeOfData := SizeOf(accent);
      data.Data := @accent;
      SetWindowCompositionAttribute(AForm.Handle, data);
      Result:=0;
    end;
  finally
    FreeLibrary(dwm10);
  end;
end;

procedure _WMNCHitTest(AForm:TForm;var Msg: TWMNCHitTest);
const
  hCORNER: Integer=19;
  hWIDTH : Integer= 3;
  hHEIGHT: Integer=48;

var
  ScreenPt : TPoint;
  MoveArea : TRect;
begin
  Msg.Result :=HTTRANSPARENT;
  if not (csDesigning in AForm.ComponentState) then begin
    ScreenPt := AForm.ScreenToClient(Point(Msg.Xpos, Msg.Ypos));
    if FAllowSize then begin
      if (ScreenPt.x <  hCORNER)and(ScreenPt.y <  hCORNER) then begin                             // top left corner
        Msg.Result := HTTOPLEFT
      end else if (ScreenPt.x <  hCORNER)and(ScreenPt.y >= AForm.Height-hCORNER) then begin       // bottom left corner
        Msg.Result := HTBOTTOMLEFT
      end else if (ScreenPt.x >= AForm.Width-hCORNER)and(ScreenPt.y <  hCORNER) then begin        // top right corner
        Msg.Result := HTTOPRIGHT
      end else if (ScreenPt.x >= AForm.Width-hCORNER)and(ScreenPt.y >= AForm.Height-hCORNER) then begin // bottom right corner
        Msg.Result := HTBOTTOMRIGHT
      end else if (ScreenPt.x<hWIDTH) then begin              // left side
        Msg.Result := HTLEFT
      end else if (ScreenPt.y<hWIDTH) then begin              // top side
        Msg.Result := HTTOP
      end else if (ScreenPt.x>=AForm.Width -hWIDTH) then begin // right side
        Msg.Result := HTRIGHT
      end else if (ScreenPt.y>=AForm.Height-hWIDTH) then begin // bottom side
        Msg.Result := HTBOTTOM
      end;
    end;
  end;
  if FAllowMove then begin // スクリーンをドラッグで動かしたい場合 上部だけ
    MoveArea := Rect(hWIDTH, hWIDTH, AForm.Width - hWIDTH, hHEIGHT - hWIDTH);
    if PtInRect(MoveArea, ScreenPt) then begin
      Msg.Result := HTCAPTION;
    end;
  end;
end;

// Reveal Menu

const
  fdw0=256;  // メニューの最大幅
  fdw1=16;   // マージン アイコンの左上
  fdw2=16*2; // アイコンの右下
  fdw3=16*3; // 48 メニューの高さ
  fdw4=16*4; // 64 文字の左上
  fdw5=fdw0-fdw1; // 240 文字の右下

// 表示モード

type
  TMenuState=(msNone,msNormal,msHover,msSelected,msNotUse); // ボタンの表示モード

// 色指定

type
  TRMenuColor =array[0..2]of TColor;             // 一つの状態のボタンの色
  TRMenuColors=array[0..1,0..3]of TRMenuColor;
var
  RMenuColors:TRMenuColors; // ボタンのすべての状態の色を保存する
  RMenuNColor,RMenuSColor:TRMenuColor;

// ボタンの色指定にHLSを利用する

// 適正なL値S値に調整する
function HLS_LSAdjust(AValue:Word):Word;
begin
  if AValue>240 then begin
    Result:=240
  end else if AValue<0 then begin
    Result := 0;
  end else begin
    Result :=AValue;
  end;
end;

// 適正なL値H値に調整する
function HLS_HAdjust(AValue:Word):Word;
begin
  Result:=AValue mod 240;
end;

// H,L,Sを適切な値に調整してから適用する H:0-239 L:0-240 S:0-240
function ColorHLSToRGBAdjust(H,L,S:Word):TColor;
begin
  Result:=ColorHLSToRGB(HLS_HAdjust(H),HLS_LSAdjust(L),HLS_LSAdjust(S));
end;

procedure RMenuColorsSet(AColor:TColor); // 一つの色から全体の色セットを設定する
var
  H, L, S, H2:word;
begin
  ColorRGBToHLS(AColor,H, L, S);
  H2:=H+80;
  // オリジナル
  // msNormal
  RMenuColors[0,0,0]:=ColorHLSToRGBAdjust(H,L,120); // 線
  RMenuColors[0,0,1]:=ColorHLSToRGBAdjust(H,L,  0); // 字
  RMenuColors[0,0,2]:=ColorHLSToRGBAdjust(H,L,120); // 背景
  // msHover
  RMenuColors[0,1,0]:=ColorHLSToRGBAdjust(H2,160,240); // 線
  RMenuColors[0,1,1]:=ColorHLSToRGBAdjust(H2,240,200); // 字
  RMenuColors[0,1,2]:=ColorHLSToRGBAdjust(H2,160,120); // 背景
  // msSelected
  RMenuColors[0,2,0]:=ColorHLSToRGBAdjust(H2,  L,120); // 線
  RMenuColors[0,2,1]:=ColorHLSToRGBAdjust(H2,240,240); // 字
  RMenuColors[0,2,2]:=ColorHLSToRGBAdjust(H2,  L,120); // 背景
  // msNotUse
  RMenuColors[0,3,0]:=ColorHLSToRGBAdjust(H, 20,120); // 線
  RMenuColors[0,3,1]:=ColorHLSToRGBAdjust(H, 20,240); // 字
  RMenuColors[0,3,2]:=ColorHLSToRGBAdjust(H, 20,120); // 背景
  // スポットライト
  // msNormal
  RMenuColors[1,0,0]:=ColorHLSToRGBAdjust(H,200,240); // 線
  RMenuColors[1,0,1]:=ColorHLSToRGBAdjust(H,  L, 40); // 字
  RMenuColors[1,0,2]:=ColorHLSToRGBAdjust(H,  L,160); // 背景
  // msHover
  RMenuColors[1,1,0]:=ColorHLSToRGBAdjust(H2,  L,240); // 線
  RMenuColors[1,1,1]:=ColorHLSToRGBAdjust(H2,240,240); // 字
  RMenuColors[1,1,2]:=ColorHLSToRGBAdjust(H2,160,160); // 背景
  // msSelected
  RMenuColors[1,2,0]:=ColorHLSToRGBAdjust(H2,  L,240); // 線
  RMenuColors[1,2,1]:=ColorHLSToRGBAdjust(H2,240,200); // 字
  RMenuColors[1,2,2]:=ColorHLSToRGBAdjust(H2,  L,100); // 背景
  // msNotUse
  RMenuColors[1,3,0]:=ColorHLSToRGBAdjust(H, 20,  0); // 線
  RMenuColors[1,3,1]:=ColorHLSToRGBAdjust(H, 20,240); // 字
  RMenuColors[1,3,2]:=ColorHLSToRGBAdjust(H, 20,120); // 背景
end;


function RMenuColorOrgGet(AMenuState:TMenuState):TRMenuColor; // 色セットからオリジナル用ビットマップ色を取得
begin
  case AMenuState of
    msNormal:begin
      Result:=RMenuColors[0,0];
    end;
    msHover:begin
      Result:=RMenuColors[0,1];
    end;
    msSelected:begin
      Result:=RMenuColors[0,2];
    end;
    msNotUse,msNone:begin
      Result:=RMenuColors[0,3];
    end;
  end;
end;

function RMenuColorSptGet(AMenuState:TMenuState):TRMenuColor; // 色セットかスポットライト用ビットマップ色を取得
begin
  case AMenuState of
    msNormal:begin
      Result:=RMenuColors[1,0];
    end;
    msHover:begin
      Result:=RMenuColors[1,1];
    end;
    msSelected:begin
      Result:=RMenuColors[1,2];
    end;
    msNotUse,msNone:begin
      Result:=RMenuColors[1,3];
    end;
  end;
end;

procedure IconPDraw(ABitmap:TBitmap;AIndex,x,y:integer;AColor:TColor;AImageList:TImageList);
var
  i,j,i0,i1:integer;
  SL,SL0: pByteArray;
  Bitmap:TBitmap;
  r,g,b:byte;
begin
  r:=(AColor and $FF0000) shr 16;
  g:=(AColor and $00FF00) shr  8;
  b:=(AColor and $0000FF);
  Bitmap:=TBitmap.Create;
  Bitmap.PixelFormat:=TPixelFormat.pf24Bit;
  AImageList.GetBitmap(AIndex,Bitmap);
  for j:=0 to Bitmap.Height-1 do begin
    SL :=Bitmap.ScanLine[j];
    SL0:=ABitmap.ScanLine[j+y];
    for i:=0 to Bitmap.Width-1 do begin
      i0:=i*3;
      i1:=(i+x)*3;
      SL0[i1  ]:=trunc((r*SL[i0]+SL0[i0  ]*(255-SL[i0]))/255);
      SL0[i1+1]:=trunc((g*SL[i0]+SL0[i0+1]*(255-SL[i0]))/255);
      SL0[i1+2]:=trunc((b*SL[i0]+SL0[i0+2]*(255-SL[i0]))/255);
    end;
  end;
  Bitmap.Free;
end;

procedure IconMDraw(ABitmap:TBitmap;AIndex,x,y:integer;AImageList:TImageList);
var
  i,j,i0:integer;
  SL,SL0: pByteArray;
  Bitmap:TBitmap;
begin
  Bitmap:=TBitmap.Create;
  Bitmap.PixelFormat:=TPixelFormat.pf24Bit;
  AImageList.GetBitmap(AIndex,Bitmap);
  for j:=0 to Bitmap.Height-1 do begin
    SL :=Bitmap.ScanLine[j];
    SL0:=ABitmap.ScanLine[j+y];
    for i:=0 to Bitmap.Width-1 do begin
      i0:=(i+x)*3;
      SL0[i0  ]:=SL[i0];
      SL0[i0+1]:=SL[i0];
      SL0[i0+2]:=SL[i0];
    end;
  end;
  Bitmap.Free;
end;

procedure RMenuPDraw(ABitmap:TBitmap;AMenuList:TStringList;AImageList:TImageList;AIndex:integer);
var
  w,h,i,c:integer;
  ARect:TRect;
  s:string;
  MenuColor3:TRMenuColor;
begin
  c:=AMenuList.Count;
  w:=ABitmap.Width;
  h:=ABitmap.Height;
  ABitmap.Canvas.Brush.Color:=$FFFFFF;
  ABitmap.Canvas.Brush.Style:=bsSolid;
  ABitmap.Canvas.Pen.Style  :=psClear;
  ABitmap.Canvas.Rectangle(0,0,w+1,h+1);
  for i:=0 to c-1 do begin
    if (i=AIndex) then begin
      MenuColor3:=RMenuSColor;
      // 背景
      ABitmap.Canvas.Brush.Color:=MenuColor3[2];
      ABitmap.Canvas.Brush.Style:=bsSolid;
      ABitmap.Canvas.Pen.Style  :=psClear;
      ABitmap.Canvas.Rectangle(0,i*fdw3,w,(i+1)*fdw3);
    end else begin
      MenuColor3:=RMenuNColor;
    end;
    // アイコン
    IconPDraw(ABitmap,i,fdw1,i*fdw3+fdw1,MenuColor3[1],AImageList);
    // 文字
    ABitmap.Canvas.Brush.Style:=bsClear;
    ABitmap.Canvas.Font.Color:=MenuColor3[1];
    ABitmap.Canvas.Font.Name:='Sagoe UI';
    ABitmap.Canvas.Font.Height:=15;
    ARect:=Rect(fdw4,i*fdw3,fdw5,(i+1)*fdw3);
    s:=AMenuList[i];
    ABitmap.Canvas.TextRect(ARect,s,[TTextFormats.tfSingleLine,TTextFormats.tfVerticalCenter]);
    // 線
    if MenuColor3[2]<>MenuColor3[0] then begin
      ABitmap.Canvas.Brush.Style:=bsClear;
      ABitmap.Canvas.Pen.Style:=psSolid;
      ABitmap.Canvas.Pen.Color:=MenuColor3[0];
      ABitmap.Canvas.Pen.Width:=1;
      ABitmap.Canvas.Rectangle(1,i*fdw3+1,w-1,(i+1)*fdw3-1);
    end;
  end;
//  ABitmap.SaveToFile('d:\pascal\desktop\test.bmp');
end;

procedure RMenuMDraw(ABitmap:TBitmap;AMenuList:TStringList;AImageList:TImageList);
var
  w,h,i,c:integer;
  ARect:TRect;
  s:string;
begin
  c:=AMenuList.Count;
  w:=ABitmap.Width;
  h:=ABitmap.Height;
  ABitmap.Canvas.Brush.Color:=$000000;
  ABitmap.Canvas.Brush.Style:=bsSolid;
  ABitmap.Canvas.Pen.Style  :=psClear;
  ABitmap.Canvas.Rectangle(0,0,w+1,h+1);
  for i:=0 to c-1 do begin
    // アイコン
    IconMDraw(ABitmap,i,fdw1,i*fdw3+fdw1,AImageList);
    // 文字
    ABitmap.Canvas.Brush.Style:=bsClear;
    ABitmap.Canvas.Font.Color:=$FFFFFF;
    ABitmap.Canvas.Font.Name:='Sagoe UI';
    ABitmap.Canvas.Font.Height:=15;
    ARect:=Rect(fdw4,i*fdw3,fdw5,(i+1)*fdw3);
    s:=AMenuList[i];
    ABitmap.Canvas.TextRect(ARect,s,[TTextFormats.tfSingleLine,TTextFormats.tfVerticalCenter]);
  end;
end;

const
  RMMaskMax=120; // 照明の直径
  RMMaskR  = 60; // 証明の半径
type
  TRMMask=array[0..RMMaskMax,0..RMMaskMax] of byte;

const
  RMMask:TRMMask=(
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FD,$FE,$FE,$FE,$FD,$FD,$FC,$FB,$FB,$F9,$FA,$F9,$F8,$F7,$F6,$F4,$F4,$F4,$F1,$F0,$EF,$EE,$ED,$EB,$EA,$E8,$E8,$E6,$E4,$E3,$E1,$E1,$DF,$DE,$DD,$DC,$DB,$DB,$DA,$DA,$D9,$D9,$D8,$D8,$D8,$D9,$DA,$DA,$DB,$DB,$DC,$DD,$DE,$DF,$E0,$E1,$E4,$E4,$E6,$E7,$E8,$E9,$EA,$ED,$EE,$EF,$F0,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FB,$FC,$FC,$FC,$FD,$FD,$FE,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FD,$FD,$FC,$FB,$FA,$FA,$F9,$F8,$F7,$F6,$F5,$F3,$F3,$F2,$F1,$EE,$ED,$EC,$EA,$E8,$E7,$E5,$E3,$E2,$E0,$DF,$DD,$DD,$DA,$D8,$D7,$D6,$D5,$D4,$D3,$D3,$D2,$D2,$D0,$D1,$D1,$D1,$D2,$D2,$D2,$D4,$D4,$D5,$D6,$D7,$D8,$D9,$DB,$DC,$DD,$E0,$E1,$E4,$E4,$E6,$E7,$E9,$EB,$ED,$EE,$EF,$F2,$F2,$F4,$F5,$F5,$F7,$F9,$F8,$FA,$F9,$FA,$FB,$FC,$FC,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FB,$FA,$F8,$F8,$F7,$F6,$F5,$F4,$F3,$F1,$F0,$ED,$EC,$EB,$EA,$E8,$E5,$E3,$E1,$DF,$DD,$DC,$D9,$D8,$D5,$D4,$D2,$D0,$D0,$CE,$CD,$CC,$CB,$CA,$C9,$C8,$C9,$C9,$C8,$C8,$C9,$CA,$CA,$CB,$CC,$CD,$CE,$CE,$D1,$D2,$D3,$D5,$D7,$D9,$DA,$DC,$DE,$E0,$E2,$E4,$E7,$E9,$EA,$EC,$ED,$EF,$F0,$F2,$F4,$F5,$F7,$F7,$F8,$F8,$FA,$FA,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FE,$FE,$FD,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FA,$F9,$F9,$F8,$F7,$F6,$F3,$F3,$F1,$EF,$EE,$EB,$EA,$E7,$E7,$E4,$E2,$E1,$DD,$DB,$D8,$D5,$D5,$D2,$D0,$CE,$CB,$CA,$C8,$C6,$C5,$C4,$C2,$C2,$C0,$BF,$C0,$BF,$BE,$BF,$BE,$C0,$BF,$C0,$C2,$C2,$C4,$C5,$C6,$C8,$C9,$CA,$CD,$CF,$D1,$D3,$D5,$D7,$DA,$DC,$DE,$E1,$E3,$E5,$E7,$EA,$EC,$EC,$F0,$F0,$F2,$F4,$F4,$F6,$F7,$F9,$FA,$FB,$FB,$FC,$FC,$FB,$FD,$FE,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FC,$FC,$FC,$FB,$FA,$F9,$F7,$F7,$F5,$F5,$F4,$F2,$F0,$EF,$EC,$EA,$E7,$E6,$E4,$E1,$DF,$DC,$D9,$D6,$D4,$D1,$CF,$CB,$CA,$C7,$C5,$C2,$C1,$C0,$BD,$BC,$BA,$B8,$B7,$B5,$B6,$B5,$B4,$B3,$B3,$B3,$B5,$B5,$B6,$B7,$B8,$B9,$BB,$BD,$BE,$BF,$C2,$C3,$C6,$C8,$CA,$CD,$D0,$D3,$D5,$D8,$DB,$DD,$E0,$E3,$E6,$E7,$E9,$EB,$EE,$EE,$F0,$F3,$F3,$F5,$F7,$F7,$F9,$FA,$FB,$FB,$FC,$FD,$FD,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FD,$FC,$FA,$FB,$FA,$F9,$F8,$F7,$F5,$F4,$F3,$F1,$EE,$EC,$EB,$E9,$E5,$E4,$E0,$DE,$DB,$D8,$D5,$D2,$CF,$CD,$C8,$C6,$C4,$C1,$BE,$BA,$B9,$B6,$B4,$B2,$B0,$AF,$AE,$AB,$AA,$A9,$A9,$A9,$A7,$A8,$A7,$A8,$AA,$AA,$AB,$AC,$AE,$AF,$B0,$B2,$B4,$B8,$BB,$BC,$C0,$C2,$C4,$C8,$CB,$CE,$D0,$D4,$D6,$D9,$DD,$E0,$E2,$E4,$E7,$E9,$EB,$ED,$F0,$F2,$F4,$F5,$F5,$F7,$F8,$FA,$FB,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$F8,$F9,$F8,$F5,$F5,$F2,$F0,$F0,$ED,$EB,$E9,$E6,$E4,$E1,$DE,$DA,$D7,$D4,$D0,$CE,$CA,$C7,$C4,$C0,$BC,$B9,$B6,$B3,$B0,$AE,$AA,$A9,$A6,$A5,$A2,$A0,$9F,$9D,$9D,$9D,$9C,$9B,$9C,$9B,$9B,$9D,$9E,$9F,$9F,$A3,$A4,$A4,$A7,$AA,$AB,$AE,$B2,$B5,$B8,$BC,$BE,$C1,$C5,$C9,$CC,$CF,$D2,$D6,$D9,$DC,$DF,$E2,$E5,$E7,$E9,$EC,$EE,$EF,$F3,$F3,$F5,$F6,$F7,$F9,$FA,$FB,$FC,$FC,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FB,$F9,$F8,$F7,$F6,$F4,$F2,$F0,$EF,$EC,$E9,$E7,$E4,$E1,$DE,$DB,$D6,$D2,$D0,$CC,$C9,$C4,$C0,$BD,$BA,$B6,$B2,$AE,$AB,$A7,$A5,$A2,$9E,$9C,$99,$98,$96,$94,$92,$90,$90,$8F,$8E,$8E,$8D,$8D,$8E,$90,$91,$92,$94,$95,$97,$99,$9B,$9D,$A0,$A3,$A7,$A9,$AD,$B1,$B4,$B7,$BC,$C0,$C4,$C6,$CA,$CF,$D1,$D6,$D9,$DC,$E1,$E2,$E5,$E7,$EB,$EC,$EF,$F1,$F3,$F5,$F6,$F8,$F9,$FA,$FA,$FC,$FD,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FC,$FA,$FA,$F9,$F8,$F6,$F5,$F3,$F2,$F0,$ED,$EA,$E8,$E5,$E3,$E0,$DC,$D8,$D4,$D0,$CC,$C8,$C3,$C0,$BB,$B7,$B4,$AE,$AB,$A6,$A2,$9F,$9C,$99,$95,$91,$8F,$8D,$8B,$89,$86,$85,$83,$82,$81,$81,$80,$80,$80,$81,$82,$83,$84,$86,$87,$8A,$8C,$8E,$91,$93,$96,$9A,$9D,$A1,$A5,$A9,$AE,$B2,$B6,$BB,$BD,$C1,$C7,$CB,$CF,$D1,$D6,$DA,$DE,$E1,$E4,$E6,$EA,$EB,$EE,$F0,$F3,$F4,$F6,$F7,$F9,$FA,$FB,$FC,$FB,$FC,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FB,$FA,$F9,$F9,$F7,$F5,$F5,$F2,$F1,$EF,$EC,$E9,$E6,$E3,$E0,$DD,$D9,$D5,$D1,$CB,$C7,$C3,$BF,$BA,$B7,$B1,$AD,$A7,$A2,$9E,$9A,$97,$92,$8E,$8C,$88,$85,$82,$7F,$7D,$7A,$78,$76,$75,$73,$73,$72,$72,$72,$72,$73,$74,$75,$76,$78,$79,$7C,$7E,$80,$84,$86,$89,$8E,$92,$96,$99,$9D,$A2,$A7,$AA,$B0,$B4,$B9,$BD,$C2,$C6,$CA,$CE,$D3,$D7,$DB,$DE,$E2,$E5,$E9,$EA,$EE,$EF,$F2,$F3,$F5,$F7,$F9,$FA,$FB,$FB,$FC,$FC,$FD,$FD,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FD,$FD,$FD,$FB,$FA,$F9,$F9,$F8,$F5,$F3,$F3,$F1,$EE,$EB,$E8,$E5,$E2,$DE,$DB,$D6,$D2,$CD,$C9,$C5,$BF,$BA,$B5,$B2,$AB,$A6,$A1,$9B,$97,$93,$8E,$89,$84,$80,$7E,$7A,$77,$75,$72,$6F,$6C,$6A,$68,$66,$66,$66,$64,$64,$64,$64,$65,$66,$67,$67,$69,$6B,$6D,$71,$72,$76,$79,$7C,$80,$84,$88,$8D,$90,$95,$9A,$9F,$A5,$A8,$AE,$B3,$B8,$BE,$C2,$C7,$CC,$D0,$D5,$D9,$DD,$E1,$E4,$E8,$EB,$ED,$F0,$F0,$F3,$F6,$F7,$F9,$FA,$FA,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FA,$F8,$F7,$F5,$F4,$F2,$F0,$ED,$EB,$E7,$E5,$E1,$DD,$D8,$D4,$D0,$CB,$C5,$C1,$BB,$B7,$B2,$AB,$A6,$A0,$9C,$95,$90,$8B,$86,$82,$7C,$77,$73,$6F,$6B,$69,$66,$64,$61,$5E,$5D,$5A,$58,$58,$58,$56,$56,$56,$56,$57,$57,$59,$59,$5B,$5D,$5F,$62,$65,$67,$6B,$6F,$72,$76,$7B,$7F,$85,$88,$8D,$93,$98,$9F,$A3,$A9,$AF,$B4,$BA,$BF,$C4,$C8,$CE,$D2,$D7,$DC,$DF,$E3,$E6,$E8,$ED,$EE,$F1,$F4,$F5,$F6,$F9,$FA,$FB,$FC,$FD,$FD,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FB,$FB,$FA,$F9,$F7,$F5,$F4,$F2,$EF,$ED,$EB,$E6,$E3,$DF,$DB,$D7,$D2,$CE,$C9,$C3,$BD,$B7,$B3,$AD,$A8,$A1,$9B,$95,$8F,$89,$83,$7E,$78,$74,$6F,$6A,$66,$62,$5E,$5B,$59,$56,$53,$51,$4F,$4C,$4B,$49,$49,$49,$48,$48,$48,$49,$49,$4B,$4D,$4D,$50,$52,$54,$56,$59,$5C,$60,$64,$69,$6D,$71,$77,$7C,$81,$85,$8C,$93,$98,$9E,$A3,$AA,$B0,$B5,$BB,$C1,$C5,$CB,$D1,$D5,$DB,$DE,$E1,$E5,$E9,$EB,$EF,$F0,$F2,$F5,$F7,$F9,$F9,$FB,$FB,$FC,$FD,$FD,$FE,$FE,$FE,$FE,$FF,$FF,$FF),
    ($FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FB,$FB,$FA,$F8,$F6,$F6,$F4,$F2,$EF,$ED,$E9,$E6,$E3,$DE,$DA,$D5,$D0,$CA,$C7,$C1,$BA,$B5,$AE,$A7,$A2,$9C,$94,$8F,$89,$81,$7C,$77,$70,$6C,$67,$62,$5D,$59,$55,$51,$4D,$4A,$49,$46,$43,$41,$3F,$3E,$3D,$3D,$3C,$3C,$3C,$3A,$3B,$3D,$3F,$40,$40,$42,$44,$47,$49,$4D,$50,$54,$57,$5B,$60,$64,$69,$6F,$73,$7A,$7F,$86,$8C,$92,$97,$9F,$A5,$AB,$B1,$B8,$BD,$C4,$C9,$CE,$D4,$D8,$DC,$E1,$E4,$E9,$EC,$ED,$EF,$F3,$F5,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FE,$FE,$FE,$FE,$FF,$FF),
    ($FF,$FE,$FE,$FE,$FD,$FD,$FD,$FC,$FB,$FA,$F9,$F7,$F6,$F4,$F1,$EF,$EC,$E9,$E5,$E2,$DE,$DA,$D4,$CD,$C9,$C3,$BE,$B8,$B2,$AB,$A3,$9D,$97,$90,$89,$83,$7C,$76,$70,$6A,$63,$5E,$59,$55,$50,$4B,$47,$44,$41,$3F,$3C,$3A,$37,$35,$34,$33,$31,$30,$30,$2F,$30,$2F,$2F,$31,$33,$33,$34,$36,$38,$3A,$3D,$3F,$43,$47,$4A,$4F,$53,$58,$5D,$61,$67,$6C,$73,$7A,$7F,$86,$8C,$92,$99,$A0,$A8,$AE,$B4,$BC,$C1,$C7,$CC,$D1,$D7,$DC,$E0,$E4,$E7,$EB,$ED,$F1,$F2,$F4,$F7,$F7,$F9,$FB,$FB,$FC,$FD,$FE,$FE,$FD,$FD,$FF,$FF),
    ($FE,$FE,$FE,$FE,$FD,$FC,$FC,$FB,$FA,$F9,$F8,$F5,$F4,$F2,$EF,$ED,$E8,$E4,$E1,$DD,$D9,$D3,$CE,$C7,$C1,$BB,$B5,$AE,$A8,$A0,$99,$92,$8B,$84,$7D,$76,$6F,$69,$63,$5D,$58,$51,$4C,$48,$44,$3F,$3B,$38,$35,$33,$30,$2E,$2B,$2A,$29,$28,$27,$26,$26,$25,$25,$25,$26,$26,$27,$28,$29,$2B,$2D,$2E,$31,$33,$37,$3A,$3E,$42,$46,$4A,$50,$54,$59,$5F,$66,$6B,$72,$7A,$80,$87,$8E,$96,$9E,$A5,$AB,$B2,$B8,$BF,$C5,$CA,$D0,$D6,$DB,$E0,$E3,$E7,$EA,$ED,$F1,$F2,$F5,$F6,$F8,$FA,$FB,$FB,$FD,$FD,$FD,$FE,$FE,$FE,$FF),
    ($FE,$FE,$FE,$FD,$FD,$FC,$FB,$FB,$F8,$F6,$F5,$F4,$F1,$EF,$ED,$EA,$E5,$E0,$DC,$D8,$D2,$CD,$C6,$C0,$B9,$B3,$AD,$A6,$9D,$96,$8D,$86,$7F,$78,$71,$69,$63,$5B,$55,$51,$4A,$45,$40,$3B,$38,$33,$2F,$2E,$2B,$27,$26,$24,$21,$20,$1F,$1E,$1F,$1E,$1D,$1D,$1C,$1C,$1D,$1E,$1E,$1F,$21,$21,$22,$25,$27,$29,$2C,$2F,$32,$36,$3A,$3D,$43,$49,$4D,$53,$58,$5F,$66,$6D,$74,$7B,$83,$8B,$92,$9A,$A1,$A9,$B0,$B7,$BD,$C4,$CB,$D0,$D6,$DB,$DF,$E4,$E7,$EB,$EE,$F0,$F2,$F4,$F7,$F8,$FA,$FB,$FB,$FC,$FD,$FE,$FE,$FE,$FF),
    ($FE,$FE,$FD,$FD,$FC,$FB,$FA,$FA,$F8,$F6,$F4,$F2,$EF,$ED,$E8,$E5,$E1,$DC,$D8,$D3,$CD,$C7,$C0,$B9,$B2,$A9,$A2,$9B,$92,$89,$82,$7A,$74,$6C,$64,$5D,$56,$4F,$49,$44,$3E,$39,$34,$2F,$2C,$29,$26,$23,$21,$1F,$1D,$1C,$1A,$19,$17,$16,$16,$15,$15,$16,$15,$16,$16,$17,$16,$17,$18,$19,$1B,$1C,$1E,$20,$23,$25,$28,$2B,$2F,$34,$38,$3D,$42,$47,$4D,$53,$59,$61,$68,$70,$77,$7F,$87,$90,$98,$9E,$A6,$AE,$B5,$BC,$C4,$C9,$CF,$D6,$DB,$E0,$E3,$E7,$EA,$EE,$F1,$F3,$F4,$F7,$F9,$FA,$FB,$FC,$FD,$FE,$FE,$FE,$FE),
    ($FE,$FD,$FD,$FD,$FC,$FB,$F9,$F8,$F6,$F5,$F3,$F0,$EE,$E9,$E4,$E1,$DD,$D8,$D2,$CC,$C6,$BF,$B7,$B0,$A7,$A1,$98,$90,$88,$7E,$76,$6F,$66,$5F,$57,$51,$4A,$43,$3E,$38,$33,$2E,$2B,$27,$24,$20,$1D,$1B,$1A,$17,$15,$14,$14,$12,$11,$11,$11,$11,$11,$11,$10,$0F,$11,$10,$12,$12,$13,$13,$14,$15,$17,$18,$1B,$1D,$1F,$22,$25,$2A,$2D,$32,$36,$3C,$41,$48,$4D,$54,$5B,$63,$6C,$73,$7B,$84,$8C,$95,$9E,$A6,$AD,$B5,$BC,$C1,$C9,$CF,$D6,$DB,$E0,$E3,$E7,$EB,$ED,$F1,$F4,$F6,$F7,$F9,$FB,$FC,$FC,$FD,$FD,$FE,$FE),
    ($FE,$FD,$FC,$FC,$FA,$FA,$F7,$F6,$F4,$F3,$EF,$ED,$EA,$E5,$E2,$DC,$D8,$D2,$CB,$C4,$BD,$B8,$AF,$A8,$9F,$97,$8F,$86,$7C,$74,$6C,$63,$5B,$53,$4C,$46,$40,$39,$33,$2F,$29,$25,$22,$1E,$1B,$19,$17,$15,$13,$12,$10,$10,$0E,$0D,$0C,$0C,$0C,$0B,$0A,$0A,$0A,$0B,$0A,$0B,$0C,$0C,$0E,$0F,$0F,$10,$12,$12,$14,$16,$18,$19,$1D,$21,$24,$28,$2B,$30,$36,$3C,$42,$49,$50,$58,$60,$68,$70,$78,$81,$8A,$93,$9B,$A4,$AB,$B4,$BA,$C1,$C8,$CF,$D5,$DB,$DF,$E4,$E8,$EC,$EE,$F2,$F3,$F6,$F8,$FA,$FB,$FC,$FD,$FD,$FD,$FE),
    ($FD,$FD,$FC,$FB,$FA,$F8,$F7,$F4,$F2,$F0,$ED,$EA,$E6,$E2,$DD,$D8,$D2,$CC,$C5,$BD,$B6,$AF,$A7,$9E,$95,$8D,$83,$7A,$70,$69,$60,$58,$4F,$48,$41,$3B,$34,$2F,$2A,$26,$21,$1D,$1A,$17,$15,$13,$11,$10,$0D,$0D,$0C,$0A,$08,$09,$06,$06,$06,$07,$06,$06,$06,$06,$06,$07,$07,$07,$08,$08,$0A,$0A,$0C,$0D,$10,$10,$13,$14,$16,$19,$1C,$1F,$23,$28,$2C,$32,$37,$3E,$45,$4C,$53,$5D,$64,$6D,$75,$7F,$88,$92,$9A,$A3,$AB,$B4,$BA,$C1,$C9,$CF,$D4,$DB,$E0,$E5,$E8,$EB,$EE,$F1,$F3,$F5,$F8,$FA,$FB,$FC,$FC,$FD,$FE),
    ($FD,$FC,$FA,$FA,$F9,$F8,$F6,$F3,$F0,$EE,$EB,$E7,$E2,$DE,$D9,$D3,$CC,$C5,$BE,$B7,$AF,$A6,$9C,$94,$8B,$82,$78,$6F,$66,$5E,$54,$4C,$45,$3D,$37,$31,$2C,$26,$21,$1E,$19,$17,$14,$13,$10,$0E,$0C,$0B,$08,$09,$06,$06,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$07,$07,$09,$09,$0A,$0C,$0D,$0F,$12,$13,$15,$18,$1C,$20,$23,$29,$2E,$35,$3B,$41,$48,$51,$58,$61,$6B,$74,$7E,$86,$90,$99,$A1,$AB,$B4,$BA,$C1,$CA,$D0,$D6,$DC,$E2,$E6,$E9,$EC,$EF,$F2,$F5,$F7,$F9,$FA,$FB,$FC,$FD,$FD),
    ($FC,$FC,$FB,$FA,$F7,$F6,$F5,$F2,$EF,$EB,$E8,$E4,$DE,$D8,$D4,$CE,$C7,$BF,$B7,$AE,$A7,$9D,$94,$89,$80,$76,$6D,$64,$5B,$52,$4B,$43,$39,$34,$2E,$28,$22,$1E,$1A,$17,$14,$11,$10,$0D,$0C,$09,$06,$06,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$07,$06,$09,$0A,$0C,$0E,$11,$13,$16,$19,$1C,$20,$25,$2C,$30,$37,$3F,$46,$4F,$57,$60,$6A,$73,$7C,$85,$8F,$9A,$A2,$AB,$B3,$BA,$C2,$CA,$D1,$D7,$DC,$E1,$E6,$E9,$ED,$F0,$F3,$F6,$F7,$F9,$FA,$FC,$FD,$FD),
    ($FC,$FB,$FA,$F9,$F6,$F4,$F2,$F0,$ED,$E8,$E4,$DF,$DA,$D5,$CF,$C7,$C0,$B8,$AE,$A7,$9E,$94,$8B,$80,$76,$6C,$63,$59,$50,$47,$40,$38,$31,$2B,$25,$20,$1B,$17,$14,$11,$10,$0C,$0A,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$07,$0B,$0C,$0E,$11,$13,$17,$1A,$1E,$23,$28,$2E,$35,$3D,$44,$4D,$55,$5E,$68,$72,$7C,$86,$90,$99,$A3,$AC,$B3,$BD,$C3,$CB,$D2,$D8,$DD,$E2,$E8,$EB,$EE,$F1,$F3,$F5,$F8,$FA,$FB,$FC,$FD),
    ($FC,$F9,$F9,$F8,$F6,$F2,$F1,$ED,$E9,$E6,$E1,$DC,$D6,$D1,$C8,$C1,$B9,$B1,$A6,$9D,$95,$89,$80,$76,$6D,$62,$58,$50,$46,$3D,$37,$2E,$29,$23,$1E,$19,$14,$13,$10,$0C,$0C,$09,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$09,$0C,$0F,$11,$14,$17,$1C,$20,$26,$2C,$33,$3B,$43,$4A,$53,$5D,$68,$72,$7C,$86,$90,$99,$A4,$AD,$B6,$BD,$C4,$CD,$D3,$D9,$DF,$E5,$E8,$ED,$EE,$F2,$F4,$F7,$F8,$FA,$FB,$FC),
    ($FB,$FA,$F7,$F7,$F5,$F1,$EE,$EA,$E6,$E2,$DE,$D8,$D2,$CB,$C3,$BB,$B1,$A8,$9F,$96,$8C,$80,$76,$6C,$62,$57,$4E,$45,$3D,$35,$2E,$27,$21,$1B,$18,$14,$10,$0E,$0C,$06,$07,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$07,$08,$0E,$10,$13,$16,$19,$1F,$24,$2A,$32,$3A,$41,$4A,$54,$5E,$68,$72,$7C,$87,$91,$9A,$A5,$AE,$B7,$C0,$C7,$CE,$D5,$DB,$E0,$E5,$E9,$EC,$F0,$F3,$F6,$F6,$F9,$FA,$FC),
    ($FA,$F9,$F7,$F4,$F2,$F0,$ED,$E8,$E4,$DE,$DA,$D4,$CD,$C4,$BD,$B4,$AB,$A2,$96,$8C,$82,$78,$6D,$62,$58,$4E,$45,$3B,$34,$2C,$26,$20,$1A,$15,$13,$0F,$0D,$0B,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0B,$0E,$11,$15,$19,$1D,$23,$2A,$31,$38,$41,$4B,$54,$5E,$69,$72,$7D,$88,$93,$9D,$A5,$AF,$B8,$C2,$C9,$CF,$D6,$DD,$E3,$E7,$EB,$ED,$F1,$F4,$F6,$F9,$FA,$FB),
    ($F9,$F8,$F5,$F3,$F1,$EE,$EA,$E6,$E1,$DB,$D5,$CE,$C7,$BD,$B6,$AC,$A2,$99,$8E,$84,$79,$6E,$63,$58,$4F,$46,$3B,$33,$2D,$24,$1E,$19,$16,$12,$0E,$0C,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$08,$0B,$0C,$10,$14,$18,$1D,$22,$29,$30,$38,$41,$4A,$55,$5F,$6A,$74,$7F,$8A,$95,$9E,$A7,$B2,$BB,$C4,$CC,$D2,$D8,$DE,$E4,$E8,$EB,$EF,$F1,$F4,$F7,$F8,$FB),
    ($F9,$F7,$F5,$F2,$EE,$EC,$E7,$E3,$DD,$D7,$D0,$CA,$C1,$B9,$AF,$A6,$9B,$91,$85,$7A,$70,$65,$59,$4F,$45,$3D,$33,$2B,$25,$1E,$18,$14,$11,$0F,$0A,$07,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$06,$09,$0C,$10,$13,$16,$1B,$21,$29,$30,$38,$41,$4C,$56,$61,$6C,$76,$81,$8C,$97,$A1,$AC,$B5,$BE,$C6,$CE,$D3,$DA,$E0,$E5,$EA,$EC,$F0,$F3,$F5,$F8,$FA),
    ($F8,$F6,$F3,$F0,$ED,$E9,$E4,$E0,$D8,$D3,$CC,$C3,$BC,$B2,$A9,$9F,$92,$87,$7D,$72,$67,$5C,$51,$46,$3C,$33,$2B,$24,$1E,$19,$14,$11,$0D,$0A,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$08,$0C,$0F,$12,$16,$1C,$22,$29,$31,$39,$42,$4D,$57,$62,$6C,$78,$84,$8F,$9A,$A5,$AD,$B7,$C0,$C9,$CF,$D6,$DC,$E2,$E7,$EB,$EE,$F2,$F4,$F7,$F9),
    ($F6,$F5,$F2,$EE,$EB,$E6,$E1,$DC,$D6,$CF,$C7,$BF,$B6,$AC,$A1,$96,$8B,$80,$74,$68,$5D,$52,$48,$3E,$35,$2C,$25,$1E,$18,$13,$10,$0D,$0A,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0A,$0F,$13,$17,$1C,$21,$28,$31,$3A,$44,$4E,$5A,$64,$71,$7B,$85,$92,$9C,$A6,$B1,$BA,$C4,$CB,$D3,$D9,$DF,$E4,$EA,$ED,$F0,$F2,$F6,$F8),
    ($F5,$F4,$EF,$ED,$E8,$E4,$DE,$D9,$D2,$CB,$C1,$B9,$AF,$A5,$9A,$8F,$84,$79,$6C,$61,$54,$4B,$40,$37,$2E,$26,$1F,$19,$14,$11,$0E,$08,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0A,$0F,$12,$16,$1B,$23,$2A,$32,$3B,$47,$51,$5B,$67,$73,$7E,$8B,$95,$A1,$AB,$B5,$BF,$C7,$CF,$D6,$DC,$E1,$E6,$EB,$EE,$F2,$F4,$F7),
    ($F5,$F1,$EE,$EA,$E6,$E1,$DB,$D5,$CE,$C6,$BD,$B4,$AA,$9E,$93,$88,$7B,$71,$65,$5A,$4D,$43,$39,$30,$27,$20,$1A,$14,$11,$0E,$08,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$0A,$0F,$12,$17,$1D,$24,$2C,$34,$3F,$49,$54,$5F,$6A,$76,$82,$8E,$9A,$A4,$AF,$B9,$C2,$CA,$D2,$D9,$DE,$E4,$E8,$EE,$F0,$F3,$F6),
    ($F4,$EF,$EB,$E8,$E4,$DE,$D8,$D1,$C9,$C1,$B9,$AF,$A3,$98,$8D,$81,$74,$67,$5C,$51,$45,$3B,$32,$29,$22,$1B,$15,$11,$0D,$09,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$0F,$14,$18,$1E,$26,$2D,$37,$41,$4B,$58,$63,$6F,$7B,$87,$94,$9F,$AA,$B3,$BD,$C5,$CE,$D5,$DB,$E1,$E6,$EC,$EE,$F1,$F5),
    ($F2,$EE,$EA,$E5,$E1,$DC,$D5,$CE,$C6,$BC,$B3,$A8,$9C,$91,$85,$7A,$6E,$60,$55,$49,$3F,$34,$2C,$24,$1D,$16,$12,$0D,$0A,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0C,$10,$13,$1A,$20,$28,$2F,$3A,$45,$50,$5B,$67,$74,$80,$8D,$97,$A3,$AF,$B8,$C2,$CA,$D0,$D8,$DE,$E4,$E9,$EC,$F1,$F3),
    ($F0,$EC,$E9,$E3,$DF,$D9,$D1,$CA,$C2,$B8,$AE,$A1,$96,$8A,$7F,$72,$66,$59,$4D,$42,$38,$2E,$25,$1E,$18,$13,$0E,$0A,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0D,$12,$16,$1B,$23,$2A,$34,$3E,$49,$54,$5F,$6C,$79,$86,$91,$9D,$A8,$B4,$BC,$C5,$CE,$D5,$DD,$E1,$E6,$EB,$F0,$F2),
    ($EF,$EA,$E6,$E1,$DC,$D5,$CE,$C5,$BD,$B3,$A7,$9C,$91,$84,$79,$6A,$5E,$52,$47,$3C,$32,$29,$21,$1A,$14,$10,$0C,$06,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$08,$0F,$12,$18,$1E,$25,$2E,$38,$42,$4D,$59,$65,$72,$7F,$8B,$98,$A2,$AD,$B7,$C2,$CA,$D2,$D9,$DF,$E4,$EA,$ED,$F1),
    ($EE,$E9,$E4,$DF,$D9,$D3,$CB,$C1,$B9,$AE,$A3,$98,$8B,$7F,$71,$64,$57,$4B,$41,$36,$2C,$23,$1C,$16,$11,$0C,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$10,$14,$1A,$20,$28,$31,$3B,$46,$52,$5E,$6A,$79,$85,$92,$9E,$A8,$B4,$BE,$C7,$CF,$D6,$DD,$E2,$E7,$EB,$EF),
    ($EB,$E8,$E2,$DD,$D7,$CF,$C6,$BE,$B4,$A8,$9C,$91,$85,$78,$6A,$5D,$51,$46,$3A,$30,$27,$1F,$19,$13,$0E,$0B,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0E,$11,$15,$1B,$23,$2C,$36,$42,$4C,$57,$65,$71,$7E,$8C,$98,$A4,$AE,$B9,$C3,$CC,$D3,$DB,$E0,$E6,$EA,$EF),
    ($EA,$E6,$E0,$DB,$D4,$CA,$C2,$B9,$AF,$A4,$97,$8B,$7E,$71,$64,$59,$4C,$40,$35,$2C,$22,$1B,$15,$10,$0C,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$08,$0E,$13,$18,$1F,$27,$31,$3B,$47,$53,$5F,$6C,$7A,$85,$92,$9F,$AB,$B5,$BE,$C8,$D0,$D8,$DF,$E4,$E9,$ED),
    ($E9,$E5,$DF,$D9,$D1,$C7,$BF,$B4,$A9,$9E,$93,$86,$79,$6C,$5F,$53,$46,$3B,$2F,$26,$1F,$17,$13,$0D,$09,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$10,$15,$1C,$23,$2B,$35,$41,$4D,$59,$65,$73,$80,$8D,$99,$A6,$B1,$BB,$C5,$CD,$D5,$DC,$E1,$E7,$EB),
    ($E8,$E2,$DD,$D6,$CE,$C6,$BB,$B1,$A5,$9A,$8F,$81,$75,$66,$58,$4D,$41,$36,$2A,$21,$1B,$15,$0F,$0B,$07,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0B,$0F,$12,$17,$1E,$26,$30,$3C,$48,$53,$60,$6E,$7B,$88,$95,$A1,$AC,$B8,$C1,$C9,$D2,$D9,$DF,$E6,$EA),
    ($E6,$E0,$DA,$D3,$CB,$C3,$B8,$AC,$A1,$95,$8A,$7D,$6F,$61,$54,$47,$3C,$31,$27,$1F,$18,$13,$0D,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0C,$10,$15,$1C,$23,$2E,$37,$42,$4F,$5B,$69,$77,$83,$91,$9D,$A9,$B4,$BD,$C7,$D0,$D7,$DD,$E5,$E9),
    ($E4,$DF,$D8,$D1,$C8,$BF,$B4,$AA,$9E,$90,$85,$77,$6A,$5D,$4F,$43,$37,$2C,$23,$1C,$15,$11,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0E,$12,$19,$20,$29,$32,$3D,$49,$57,$64,$70,$7F,$8C,$99,$A4,$AF,$BB,$C3,$CE,$D5,$DC,$E2,$E7),
    ($E3,$DD,$D6,$CD,$C4,$BB,$B1,$A7,$9A,$8C,$80,$72,$65,$58,$4A,$3E,$32,$29,$1F,$19,$13,$0D,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$11,$16,$1C,$25,$2F,$39,$45,$52,$5F,$6C,$79,$87,$95,$A0,$AC,$B6,$C1,$CB,$D3,$DA,$E0,$E6),
    ($E1,$DB,$D4,$CC,$C2,$B9,$AE,$A3,$96,$89,$7B,$6E,$60,$53,$47,$3A,$2F,$25,$1C,$16,$10,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$08,$0E,$13,$1A,$22,$2C,$36,$40,$4E,$59,$67,$74,$82,$90,$9C,$A8,$B3,$BE,$C9,$D1,$D8,$DE,$E4),
    ($DF,$D9,$D2,$C9,$C1,$B5,$AB,$9F,$92,$85,$77,$6A,$5C,$4F,$42,$36,$2B,$23,$19,$14,$0F,$0A,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0D,$11,$18,$1F,$28,$31,$3C,$49,$56,$63,$71,$7E,$8C,$99,$A6,$B1,$BC,$C5,$CE,$D6,$DD,$E4),
    ($DE,$D7,$D0,$C7,$BD,$B3,$A7,$9B,$8F,$81,$73,$66,$58,$4B,$3E,$32,$29,$20,$18,$13,$0D,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$10,$15,$1D,$24,$2E,$38,$45,$52,$60,$6D,$7B,$89,$95,$A3,$AF,$BA,$C3,$CB,$D5,$DC,$E2),
    ($DE,$D5,$CE,$C6,$BC,$B1,$A5,$98,$8C,$7E,$6F,$61,$54,$48,$3A,$2F,$26,$1D,$17,$11,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0F,$13,$1A,$22,$2B,$35,$42,$4E,$5B,$6A,$78,$86,$93,$9F,$AC,$B6,$C1,$CA,$D3,$DA,$E1),
    ($DC,$D5,$CD,$C2,$B9,$AE,$A2,$96,$88,$7A,$6C,$5E,$51,$45,$38,$2C,$24,$1B,$13,$0E,$0A,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0D,$11,$17,$1F,$28,$32,$3E,$4B,$59,$65,$74,$83,$90,$9D,$A9,$B5,$BF,$C9,$D1,$D8,$DF),
    ($DB,$D3,$CB,$C0,$B7,$AB,$9F,$93,$86,$77,$6A,$5C,$4E,$42,$35,$2A,$20,$19,$13,$0E,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$11,$16,$1C,$25,$30,$3C,$47,$56,$63,$72,$7F,$8D,$9A,$A7,$B3,$BC,$C7,$D0,$D7,$DE),
    ($DA,$D2,$C9,$C0,$B5,$A9,$9D,$91,$83,$75,$67,$59,$4D,$40,$33,$27,$1F,$17,$12,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0A,$10,$14,$1B,$24,$2D,$39,$45,$53,$61,$6F,$7C,$8A,$97,$A5,$B0,$BA,$C4,$CE,$D6,$DD),
    ($D9,$D1,$C8,$BE,$B3,$A8,$9A,$8E,$80,$73,$65,$57,$49,$3D,$30,$26,$1E,$16,$11,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0F,$13,$1A,$22,$2D,$36,$43,$51,$5F,$6B,$79,$88,$96,$A2,$AE,$BA,$C3,$CD,$D5,$DC),
    ($D7,$CF,$C7,$BC,$B1,$A6,$99,$8C,$7E,$6F,$62,$54,$47,$3B,$2F,$25,$1B,$15,$0F,$0B,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0D,$13,$18,$21,$2A,$34,$41,$4E,$5C,$6A,$77,$86,$92,$9F,$AD,$B9,$C3,$CB,$D3,$DB),
    ($D5,$CE,$C6,$BB,$B0,$A3,$97,$89,$7D,$6F,$60,$52,$45,$39,$2D,$23,$1B,$14,$0F,$0A,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$08,$0C,$11,$17,$20,$2A,$33,$3F,$4C,$5A,$68,$76,$84,$91,$9E,$AB,$B7,$C1,$CB,$D3,$DA),
    ($D6,$CE,$C5,$BA,$AE,$A2,$96,$88,$7B,$6D,$5F,$50,$43,$37,$2B,$22,$1A,$14,$0E,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0C,$10,$16,$1E,$28,$32,$3C,$49,$58,$67,$74,$82,$90,$9E,$AA,$B5,$BF,$CA,$D2,$D9),
    ($D4,$CD,$C3,$B8,$AD,$A1,$95,$87,$79,$6A,$5C,$4F,$42,$36,$2B,$22,$19,$13,$0D,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0A,$0F,$16,$1D,$26,$30,$3C,$48,$57,$65,$74,$80,$8E,$9D,$A8,$B4,$BF,$C9,$D1,$D9),
    ($D5,$CD,$C3,$B9,$AE,$A0,$93,$86,$78,$6A,$5B,$4F,$41,$34,$2A,$21,$18,$13,$0E,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$10,$15,$1C,$25,$30,$3B,$48,$56,$64,$73,$80,$8E,$9C,$A7,$B3,$BD,$C7,$D1,$D8),
    ($D4,$CC,$C2,$B8,$AC,$A1,$93,$86,$77,$69,$5B,$4D,$40,$34,$29,$20,$18,$11,$0E,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0B,$10,$15,$1B,$25,$2F,$3B,$48,$55,$63,$71,$7F,$8D,$9B,$A8,$B3,$BE,$C8,$D1,$D8),
    ($D3,$CC,$C1,$B6,$AC,$A1,$93,$84,$76,$68,$5A,$4D,$40,$34,$29,$20,$17,$12,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0A,$0F,$15,$1C,$24,$2E,$3A,$47,$55,$62,$71,$7F,$8D,$9A,$A6,$B3,$BD,$C8,$D0,$D8),
    ($D4,$CC,$C2,$B7,$AC,$A0,$93,$85,$76,$68,$59,$4D,$40,$33,$28,$1F,$17,$11,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0E,$15,$1C,$25,$2E,$3A,$47,$54,$62,$71,$7E,$8C,$9A,$A7,$B3,$BD,$C8,$D0,$D8),
    ($D4,$CC,$C2,$B8,$AB,$A0,$93,$85,$76,$67,$59,$4D,$40,$32,$28,$1F,$18,$11,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0A,$10,$15,$1B,$24,$2E,$39,$45,$53,$62,$70,$7E,$8B,$9A,$A7,$B2,$BC,$C6,$D0,$D8),
    ($D3,$CA,$C3,$B7,$AD,$A0,$93,$85,$77,$69,$5A,$4C,$3F,$33,$29,$1F,$17,$12,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$10,$14,$1B,$24,$2F,$3A,$47,$55,$62,$70,$7F,$8D,$9A,$A6,$B3,$BD,$C7,$D0,$D7),
    ($D4,$CC,$C3,$B7,$AD,$A1,$93,$86,$77,$68,$5B,$4E,$40,$34,$28,$20,$18,$12,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0F,$15,$1C,$26,$2F,$3A,$47,$56,$64,$71,$7F,$8C,$9A,$A8,$B4,$BD,$C7,$D0,$D8),
    ($D5,$CD,$C4,$B9,$AD,$A1,$94,$87,$78,$6A,$5B,$4E,$41,$35,$29,$20,$19,$12,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$10,$15,$1C,$25,$30,$3A,$48,$56,$64,$72,$80,$8E,$9B,$A8,$B3,$BE,$C8,$D2,$D9),
    ($D5,$CC,$C3,$B9,$AF,$A3,$96,$87,$79,$6B,$5D,$4F,$42,$36,$2B,$21,$19,$13,$0D,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$11,$15,$1D,$27,$31,$3D,$49,$57,$65,$74,$81,$8F,$9D,$A9,$B5,$BE,$C9,$D2,$D9),
    ($D6,$CE,$C5,$B9,$AE,$A3,$96,$89,$7B,$6D,$5F,$51,$44,$38,$2C,$22,$19,$13,$0E,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0C,$11,$16,$1E,$28,$33,$3E,$4C,$59,$67,$76,$83,$8F,$9D,$AA,$B5,$C0,$C9,$D2,$D9),
    ($D6,$CE,$C6,$BB,$B1,$A4,$99,$8A,$7D,$6F,$60,$52,$45,$39,$2E,$23,$1A,$14,$0F,$08,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0D,$12,$17,$1F,$29,$33,$3F,$4D,$5A,$69,$77,$84,$91,$A0,$AC,$B8,$C2,$CB,$D3,$DA),
    ($D7,$D0,$C8,$BC,$B1,$A5,$9B,$8D,$7F,$70,$62,$54,$47,$3B,$30,$25,$1C,$15,$10,$0A,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0D,$13,$19,$20,$2A,$35,$41,$4E,$5C,$6B,$78,$86,$94,$A2,$AE,$B7,$C1,$CC,$D4,$DB),
    ($D9,$D1,$C9,$BE,$B3,$A8,$9C,$8F,$81,$72,$65,$56,$49,$3C,$31,$27,$1E,$17,$11,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$09,$0F,$14,$1B,$23,$2D,$38,$43,$51,$5E,$6C,$7A,$88,$96,$A3,$AF,$BA,$C4,$CE,$D5,$DC),
    ($DA,$D2,$C8,$C0,$B5,$A9,$9E,$90,$83,$76,$67,$59,$4C,$3F,$33,$29,$20,$17,$12,$0D,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$0F,$15,$1D,$24,$2E,$39,$45,$54,$61,$6F,$7D,$89,$98,$A4,$B1,$BC,$C6,$CF,$D5,$DD),
    ($DB,$D4,$CA,$C1,$B8,$AC,$A0,$94,$86,$78,$6A,$5C,$4E,$41,$36,$2A,$22,$19,$14,$0D,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0C,$11,$17,$1E,$27,$31,$3C,$49,$55,$64,$71,$7F,$8D,$9A,$A6,$B2,$BC,$C7,$D1,$D8,$DE),
    ($DC,$D5,$CC,$C4,$BA,$AE,$A2,$96,$89,$7B,$6D,$5F,$51,$45,$38,$2D,$23,$1C,$15,$0F,$0B,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$08,$0D,$12,$19,$20,$29,$33,$3E,$4B,$5A,$67,$74,$82,$90,$9D,$A9,$B4,$BF,$C9,$D1,$D9,$DF),
    ($DE,$D7,$CE,$C5,$BC,$B1,$A5,$98,$8C,$7E,$71,$62,$54,$47,$3A,$2F,$26,$1D,$17,$10,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0F,$14,$1B,$22,$2B,$36,$42,$4F,$5C,$6A,$78,$85,$92,$9F,$AD,$B6,$C0,$CB,$D3,$DA,$E2),
    ($DF,$D9,$D1,$C7,$BE,$B3,$A7,$9B,$8F,$82,$74,$66,$58,$4C,$3E,$34,$29,$20,$19,$13,$0D,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$10,$15,$1D,$24,$2E,$3A,$45,$52,$60,$6D,$7B,$89,$96,$A3,$AE,$B9,$C4,$CD,$D5,$DC,$E3),
    ($E1,$DA,$D2,$CA,$C1,$B6,$AA,$9F,$91,$86,$79,$6B,$5C,$4F,$43,$37,$2C,$22,$1A,$15,$0E,$0A,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0D,$12,$18,$1F,$28,$31,$3D,$48,$56,$64,$71,$7F,$8D,$9A,$A7,$B1,$BD,$C5,$CE,$D7,$DE,$E3),
    ($E2,$DC,$D4,$CB,$C2,$B8,$AE,$A2,$96,$89,$7B,$6F,$61,$53,$46,$3B,$30,$26,$1D,$17,$11,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0B,$10,$14,$19,$21,$2B,$36,$41,$4E,$5B,$67,$75,$82,$91,$9D,$AA,$B4,$BE,$C9,$D0,$D8,$DF,$E4),
    ($E4,$DD,$D7,$CE,$C5,$BC,$B2,$A6,$99,$8D,$80,$72,$65,$59,$4C,$3F,$33,$29,$20,$19,$14,$0F,$09,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$08,$0C,$10,$16,$1D,$25,$2F,$3A,$46,$52,$5F,$6B,$79,$87,$95,$A1,$AC,$B7,$C2,$CA,$D3,$DA,$E1,$E6),
    ($E5,$DF,$D9,$D1,$C9,$C0,$B5,$AA,$9E,$92,$85,$78,$6A,$5C,$50,$43,$36,$2C,$23,$1C,$15,$10,$0C,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$08,$0F,$12,$19,$20,$29,$34,$3E,$49,$57,$64,$71,$7F,$8C,$99,$A4,$B0,$BA,$C5,$CD,$D6,$DD,$E4,$E7),
    ($E7,$E1,$DB,$D4,$CC,$C1,$B8,$AD,$A1,$96,$8A,$7D,$70,$61,$55,$48,$3B,$31,$28,$1F,$18,$12,$0D,$09,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0C,$11,$15,$1C,$23,$2D,$37,$43,$4F,$5C,$69,$76,$84,$90,$9D,$A8,$B3,$BF,$C8,$D0,$D7,$DF,$E4,$EA),
    ($E8,$E3,$DD,$D6,$CE,$C6,$BC,$B2,$A6,$9A,$8E,$82,$74,$67,$5A,$4D,$41,$36,$2B,$22,$1B,$15,$0F,$0C,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0F,$13,$18,$1F,$27,$32,$3C,$48,$54,$61,$6D,$7B,$89,$95,$A1,$AD,$B7,$C1,$CA,$D2,$DA,$E1,$E6,$EA),
    ($E9,$E6,$DF,$D9,$D1,$C8,$C0,$B6,$AB,$9F,$93,$87,$7A,$6D,$5F,$53,$47,$3A,$31,$27,$1F,$18,$13,$0E,$0B,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$08,$0C,$10,$15,$1C,$23,$2C,$36,$42,$4E,$59,$66,$74,$80,$8C,$9B,$A7,$B1,$BC,$C4,$CE,$D5,$DC,$E2,$E9,$ED),
    ($EB,$E6,$E1,$DB,$D4,$CB,$C3,$B9,$B0,$A4,$97,$8B,$80,$72,$66,$5A,$4C,$41,$36,$2B,$23,$1C,$15,$11,$0E,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0A,$0E,$13,$19,$20,$28,$32,$3D,$46,$53,$60,$6C,$79,$87,$92,$9E,$AA,$B6,$C0,$C9,$D0,$D7,$DE,$E4,$EA,$EE),
    ($EC,$E8,$E3,$DE,$D7,$CE,$C7,$BE,$B3,$A8,$9D,$92,$86,$79,$6D,$5F,$53,$47,$3D,$30,$28,$1F,$19,$13,$0F,$0A,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0D,$12,$15,$1C,$24,$2D,$37,$42,$4C,$59,$66,$73,$80,$8C,$99,$A3,$AF,$B9,$C4,$CB,$D4,$DA,$E1,$E7,$EC,$EF),
    ($EE,$EA,$E5,$E0,$DA,$D2,$CA,$C2,$B9,$AD,$A2,$98,$8B,$7F,$72,$66,$59,$4E,$42,$37,$2D,$25,$1D,$17,$11,$0D,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$11,$14,$19,$20,$29,$33,$3E,$49,$52,$60,$6D,$79,$86,$93,$9D,$A9,$B3,$BE,$C6,$CF,$D7,$DD,$E3,$E8,$ED,$EF),
    ($F0,$EC,$E7,$E2,$DD,$D6,$CE,$C6,$BD,$B3,$A9,$9D,$92,$86,$79,$6C,$60,$54,$48,$3D,$33,$2A,$21,$1B,$15,$0F,$0C,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0A,$10,$13,$17,$1E,$26,$2F,$38,$43,$50,$5A,$67,$73,$7F,$8D,$99,$A4,$AF,$B9,$C3,$CA,$D3,$D9,$E1,$E5,$EB,$EE,$F2),
    ($F0,$EC,$E9,$E5,$DF,$D9,$D2,$CA,$C2,$B7,$AE,$A2,$98,$8C,$80,$73,$67,$5B,$50,$44,$39,$30,$27,$1F,$18,$13,$0F,$0C,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0B,$0E,$11,$16,$1C,$23,$2B,$35,$3F,$4B,$56,$61,$6D,$7A,$87,$93,$9E,$A9,$B3,$BD,$C7,$CF,$D6,$DC,$E2,$E7,$ED,$F0,$F3),
    ($F2,$EF,$EC,$E7,$E1,$DC,$D6,$CD,$C5,$BD,$B4,$A9,$9E,$92,$86,$7A,$6E,$62,$56,$4A,$3F,$36,$2D,$24,$1D,$18,$13,$0F,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$07,$08,$0D,$11,$14,$1A,$22,$29,$32,$3C,$45,$51,$5D,$69,$75,$80,$8E,$9A,$A4,$AE,$B9,$C2,$CB,$D2,$D9,$DF,$E4,$EA,$EE,$F0,$F4),
    ($F3,$F1,$EE,$EA,$E5,$DF,$D9,$D2,$CA,$C0,$B9,$AF,$A4,$99,$8E,$81,$76,$69,$5E,$52,$47,$3D,$32,$2A,$23,$1B,$17,$12,$0F,$0B,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0C,$0F,$14,$19,$20,$27,$2F,$38,$43,$4E,$58,$64,$70,$7C,$88,$95,$A0,$AA,$B5,$BE,$C7,$CF,$D6,$DC,$E2,$E8,$EB,$EF,$F3,$F4),
    ($F5,$F1,$EF,$EC,$E7,$E1,$DC,$D6,$CE,$C6,$BD,$B5,$AB,$A0,$94,$89,$7D,$71,$66,$5A,$4F,$44,$3A,$31,$29,$22,$1B,$15,$10,$0D,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0C,$10,$14,$18,$1E,$25,$2D,$36,$40,$4A,$56,$61,$6C,$78,$84,$90,$9A,$A5,$AF,$BA,$C3,$CB,$D3,$D9,$DF,$E5,$E9,$EE,$F1,$F2,$F6),
    ($F6,$F4,$F0,$ED,$EA,$E4,$DF,$D9,$D3,$CA,$C3,$BA,$AF,$A7,$9C,$8F,$85,$7A,$6E,$63,$56,$4C,$42,$38,$30,$27,$20,$1A,$15,$11,$0E,$0B,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$07,$09,$0C,$0F,$14,$17,$1D,$24,$2B,$34,$3E,$48,$52,$5E,$69,$74,$80,$8C,$97,$A1,$AB,$B5,$BF,$C8,$CF,$D6,$DC,$E2,$E7,$EC,$EF,$F2,$F4,$F7),
    ($F7,$F6,$F3,$EF,$EB,$E7,$E2,$DC,$D7,$D0,$C8,$BF,$B7,$AE,$A3,$98,$8D,$81,$76,$6A,$5F,$54,$49,$3F,$36,$2D,$26,$20,$1A,$14,$11,$0E,$0A,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0C,$10,$13,$17,$1C,$23,$2B,$32,$3C,$46,$4F,$5A,$66,$71,$7C,$89,$94,$9F,$A9,$B3,$BC,$C3,$CC,$D3,$DA,$E0,$E6,$EA,$ED,$F0,$F3,$F6,$F7),
    ($F8,$F7,$F5,$F1,$EE,$E9,$E5,$DF,$DA,$D4,$CD,$C5,$BC,$B3,$AA,$9F,$95,$8A,$7E,$73,$69,$5E,$52,$47,$3F,$35,$2D,$26,$20,$19,$15,$10,$0D,$0B,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0A,$0C,$10,$13,$16,$1D,$22,$2A,$31,$3A,$44,$4F,$57,$64,$6E,$7A,$85,$90,$9B,$A5,$B0,$B9,$C1,$C9,$D1,$D8,$DE,$E3,$E8,$ED,$EF,$F1,$F5,$F8,$F9),
    ($F9,$F7,$F6,$F3,$F0,$EB,$E8,$E3,$DE,$D8,$D1,$CA,$C2,$BA,$B0,$A6,$9D,$92,$87,$7C,$71,$66,$5B,$51,$46,$3D,$34,$2D,$26,$1F,$1A,$15,$11,$0F,$0C,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0A,$0D,$10,$13,$17,$1C,$23,$29,$32,$3A,$43,$4C,$57,$61,$6D,$77,$83,$8E,$98,$A2,$AD,$B5,$BF,$C7,$CE,$D5,$DB,$E1,$E6,$EA,$ED,$F1,$F4,$F6,$F8,$F9),
    ($F9,$F8,$F6,$F4,$F2,$ED,$EA,$E6,$E1,$DC,$D5,$CF,$C8,$BF,$B7,$AD,$A4,$99,$90,$86,$7A,$6F,$65,$59,$50,$46,$3E,$35,$2C,$26,$20,$1B,$15,$12,$0F,$0C,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0B,$0D,$11,$14,$18,$1D,$23,$2B,$32,$3A,$43,$4C,$55,$60,$6B,$75,$81,$8C,$96,$9F,$AA,$B3,$BD,$C3,$CB,$D3,$D9,$DF,$E4,$E9,$EC,$F0,$F3,$F6,$F8,$F9,$FB),
    ($FA,$F9,$F7,$F5,$F4,$F0,$EC,$E9,$E4,$DF,$DA,$D4,$CD,$C5,$BE,$B5,$AC,$A2,$98,$8E,$83,$79,$6F,$64,$5A,$50,$47,$3E,$36,$2E,$27,$21,$1B,$17,$13,$10,$0D,$0A,$06,$07,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$09,$0C,$0F,$11,$15,$1A,$1F,$25,$2C,$33,$3A,$43,$4C,$54,$5F,$69,$74,$7F,$8A,$94,$9D,$A7,$B1,$BB,$C1,$C9,$D0,$D7,$DD,$E2,$E7,$EC,$EE,$F2,$F4,$F7,$F7,$FA,$FB),
    ($FB,$F9,$F8,$F7,$F5,$F3,$EF,$EC,$E7,$E2,$DE,$D8,$D2,$CC,$C3,$BC,$B4,$AB,$A1,$96,$8C,$82,$77,$6E,$64,$5A,$50,$47,$3E,$37,$2E,$29,$23,$1D,$19,$15,$11,$0E,$0C,$0B,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$06,$09,$0B,$0D,$11,$13,$17,$1A,$20,$26,$2C,$33,$3B,$43,$4B,$55,$60,$6A,$73,$7E,$88,$92,$9B,$A5,$AE,$B9,$C0,$C8,$CF,$D4,$DB,$E2,$E5,$EA,$EE,$F1,$F4,$F5,$F7,$F9,$FB,$FC),
    ($FA,$FB,$F9,$F7,$F7,$F4,$F1,$ED,$EA,$E5,$E1,$DD,$D7,$D1,$C9,$C2,$BA,$B1,$A8,$9F,$96,$8C,$82,$78,$6E,$64,$5A,$51,$48,$3F,$38,$31,$29,$24,$1F,$1A,$16,$13,$11,$0D,$0C,$09,$06,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$07,$09,$0B,$0E,$10,$11,$15,$19,$1D,$21,$27,$2D,$35,$3B,$44,$4D,$56,$60,$69,$74,$7E,$88,$91,$9B,$A5,$AD,$B7,$BF,$C6,$CD,$D4,$DA,$E0,$E4,$E8,$EC,$F0,$F3,$F5,$F7,$F9,$FA,$FA,$FC),
    ($FC,$FB,$F9,$F9,$F7,$F4,$F2,$F0,$ED,$E8,$E4,$E0,$DB,$D6,$D0,$C9,$C1,$B9,$B1,$A9,$9F,$96,$8C,$82,$79,$6E,$65,$5C,$52,$49,$42,$39,$32,$2C,$27,$21,$1D,$19,$15,$13,$10,$0E,$0B,$08,$08,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$08,$0B,$0C,$0F,$12,$14,$18,$1B,$1F,$25,$2A,$2F,$36,$3E,$46,$4E,$57,$60,$6A,$73,$7E,$87,$92,$99,$A4,$AE,$B6,$BD,$C5,$CC,$D2,$D8,$DE,$E3,$E8,$EB,$EE,$F2,$F4,$F5,$F8,$FA,$FB,$FC,$FD),
    ($FC,$FC,$FB,$FA,$F8,$F5,$F5,$F3,$EF,$EB,$E7,$E3,$E0,$DA,$D5,$CE,$C8,$C1,$B9,$B1,$A7,$9F,$96,$8C,$82,$79,$70,$66,$5D,$55,$4B,$43,$3D,$35,$2F,$2A,$24,$1F,$1B,$18,$15,$12,$10,$0D,$0C,$0A,$08,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$07,$09,$0B,$0B,$0D,$10,$10,$14,$17,$1A,$1D,$21,$26,$2C,$32,$39,$40,$48,$50,$5A,$63,$6A,$75,$7E,$86,$92,$9A,$A3,$AD,$B5,$BE,$C5,$CB,$D2,$D6,$DD,$E1,$E6,$EB,$EE,$F0,$F3,$F6,$F7,$FA,$FB,$FC,$FD,$FD),
    ($FC,$FC,$FB,$FB,$F9,$F7,$F5,$F5,$F2,$EE,$EC,$E8,$E3,$DE,$D9,$D4,$CD,$C7,$C0,$B8,$B0,$A8,$9F,$94,$8C,$84,$7A,$71,$68,$60,$57,$4E,$46,$3F,$39,$33,$2C,$27,$23,$1F,$1A,$18,$16,$13,$10,$10,$0D,$0A,$09,$09,$07,$06,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$06,$06,$09,$08,$0B,$0B,$0C,$0D,$10,$11,$14,$16,$1A,$1C,$21,$25,$29,$2F,$36,$3C,$44,$4B,$53,$5B,$64,$6D,$77,$7F,$89,$92,$9A,$A4,$AD,$B4,$BD,$C4,$CA,$D0,$D7,$DC,$E1,$E5,$EA,$ED,$EF,$F2,$F4,$F8,$F9,$FA,$FB,$FD,$FD,$FD),
    ($FD,$FC,$FC,$FB,$FA,$F9,$F8,$F6,$F4,$F1,$EE,$EA,$E7,$E2,$DD,$D9,$D3,$CD,$C6,$C0,$B7,$AF,$A9,$9F,$97,$8E,$85,$7D,$74,$6A,$62,$5A,$52,$4B,$44,$3C,$36,$30,$2B,$26,$22,$1F,$1C,$19,$16,$14,$12,$0F,$0E,$0D,$0C,$0A,$0B,$09,$08,$07,$07,$06,$06,$06,$06,$06,$08,$08,$06,$09,$09,$0B,$0A,$0C,$0D,$0F,$10,$11,$13,$16,$17,$1A,$1E,$20,$24,$29,$2E,$33,$3A,$41,$48,$4E,$56,$5E,$67,$70,$78,$82,$8A,$93,$9B,$A3,$AC,$B5,$BC,$C4,$CA,$D1,$D6,$DC,$E1,$E5,$E8,$EC,$EF,$F2,$F5,$F7,$F9,$FA,$FB,$FC,$FD,$FD,$FE),
    ($FD,$FD,$FC,$FC,$FB,$FA,$F9,$F7,$F6,$F4,$F1,$EE,$E9,$E6,$E2,$DD,$D8,$D3,$CE,$C6,$BF,$B7,$B0,$A9,$A0,$98,$8F,$88,$7F,$75,$6D,$65,$5D,$56,$4F,$48,$41,$3C,$36,$30,$2B,$27,$23,$1F,$1D,$1B,$18,$16,$15,$13,$11,$10,$0F,$0F,$0E,$0C,$0C,$0C,$0C,$0B,$0B,$0B,$0C,$0C,$0C,$0E,$0D,$0E,$10,$11,$13,$14,$14,$16,$19,$1C,$1F,$21,$25,$29,$2D,$32,$39,$3F,$45,$4B,$53,$5A,$62,$6A,$73,$7A,$84,$8C,$95,$9D,$A3,$AC,$B5,$BB,$C2,$CA,$D1,$D6,$DB,$E0,$E4,$E9,$EB,$EE,$F2,$F4,$F6,$F8,$F9,$FA,$FB,$FC,$FD,$FD,$FE),
    ($FE,$FD,$FD,$FC,$FC,$FB,$FA,$F7,$F7,$F4,$F3,$F0,$ED,$EA,$E5,$E2,$DD,$D8,$D3,$CE,$C7,$C1,$B9,$B1,$AA,$A1,$9A,$91,$8A,$81,$79,$70,$69,$62,$5A,$53,$4D,$47,$41,$3A,$35,$31,$2D,$29,$25,$22,$1F,$1C,$1B,$19,$18,$17,$14,$14,$13,$11,$12,$11,$11,$11,$10,$11,$10,$11,$11,$12,$13,$15,$16,$17,$17,$1A,$1B,$1E,$21,$25,$26,$2B,$2F,$33,$38,$3E,$43,$4A,$50,$56,$5E,$66,$6D,$75,$7D,$86,$8D,$96,$9E,$A6,$AD,$B5,$BC,$C4,$CA,$D0,$D6,$DB,$E0,$E4,$E8,$EB,$EE,$F1,$F5,$F6,$F7,$F9,$FB,$FB,$FC,$FD,$FD,$FE,$FE),
    ($FE,$FD,$FD,$FD,$FC,$FB,$FB,$F9,$F8,$F6,$F5,$F3,$EF,$EC,$EA,$E6,$E2,$DD,$D8,$D3,$CD,$C7,$C2,$BB,$B2,$AB,$A3,$9C,$94,$8D,$85,$7D,$75,$6E,$67,$5F,$58,$52,$4D,$47,$42,$3B,$37,$33,$2F,$2C,$28,$26,$23,$20,$1F,$1C,$1C,$1A,$19,$18,$17,$17,$17,$16,$16,$16,$16,$18,$18,$18,$19,$1B,$1D,$1E,$1F,$22,$23,$27,$29,$2D,$31,$35,$3A,$3E,$44,$49,$4F,$54,$5C,$63,$6B,$71,$79,$81,$89,$91,$99,$A0,$A8,$B0,$B6,$BD,$C5,$CA,$D0,$D5,$DB,$E0,$E4,$E8,$EC,$EF,$F1,$F4,$F6,$F8,$F8,$FA,$FB,$FC,$FC,$FD,$FE,$FE,$FE),
    ($FE,$FE,$FE,$FD,$FD,$FC,$FA,$FA,$F9,$F7,$F7,$F5,$F2,$EF,$EE,$EA,$E5,$E1,$DD,$D8,$D3,$CE,$C9,$C2,$BB,$B5,$AE,$A6,$9F,$98,$90,$88,$82,$7A,$73,$6B,$65,$5E,$59,$53,$4D,$47,$43,$3D,$39,$36,$33,$2F,$2D,$2A,$28,$27,$24,$23,$22,$20,$1F,$1E,$1E,$1E,$1E,$1E,$1E,$1F,$20,$20,$21,$23,$25,$26,$28,$2C,$2E,$31,$34,$38,$3C,$40,$46,$4B,$50,$56,$5C,$61,$68,$70,$77,$7E,$86,$8B,$93,$9D,$A4,$A9,$B2,$B9,$BE,$C6,$CD,$D1,$D7,$DB,$E0,$E4,$E9,$EB,$ED,$F1,$F4,$F6,$F6,$F8,$FA,$FB,$FC,$FC,$FD,$FE,$FE,$FE,$FE),
    ($FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FA,$F9,$F8,$F6,$F3,$F2,$EF,$EC,$EA,$E5,$E2,$DD,$D9,$D4,$CF,$CA,$C4,$BE,$B7,$B1,$AA,$A1,$9A,$94,$8D,$86,$7F,$78,$71,$6B,$65,$5F,$59,$54,$4F,$49,$46,$42,$3E,$39,$37,$34,$33,$30,$2E,$2C,$2A,$2A,$29,$27,$27,$27,$26,$27,$27,$28,$2A,$2A,$2B,$2D,$2F,$30,$33,$36,$38,$3C,$40,$44,$48,$4C,$52,$57,$5C,$62,$68,$6F,$76,$7C,$83,$8A,$90,$98,$9F,$A7,$AE,$B4,$BA,$C1,$C6,$CD,$D3,$D7,$DC,$E0,$E4,$E7,$EB,$EE,$F0,$F4,$F6,$F8,$F9,$FA,$FB,$FC,$FC,$FD,$FE,$FE,$FD,$FE,$FF),
    ($FF,$FE,$FE,$FE,$FE,$FD,$FC,$FB,$FB,$FA,$F9,$F7,$F6,$F5,$F3,$EF,$ED,$EA,$E6,$E2,$DE,$DA,$D5,$D1,$CC,$C5,$BF,$B9,$B4,$AB,$A6,$9F,$99,$93,$8C,$85,$7E,$78,$71,$6C,$65,$61,$5C,$57,$53,$4E,$49,$47,$44,$41,$3D,$3B,$3A,$37,$36,$34,$33,$33,$32,$32,$31,$31,$33,$34,$34,$36,$37,$38,$3A,$3C,$3E,$42,$45,$49,$4C,$50,$55,$5A,$5E,$63,$69,$70,$75,$7B,$82,$88,$8F,$96,$9D,$A2,$AA,$B0,$B6,$BD,$C3,$C8,$CF,$D3,$D8,$DD,$E0,$E4,$E7,$EA,$EE,$F0,$F3,$F5,$F7,$F9,$F9,$FB,$FC,$FC,$FC,$FD,$FE,$FD,$FE,$FF,$FF),
    ($FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FA,$FB,$FA,$F9,$F8,$F7,$F4,$F3,$F0,$EC,$EA,$E7,$E3,$DF,$DA,$D7,$D2,$CC,$C7,$C2,$BD,$B6,$B0,$A9,$A5,$9E,$98,$92,$8B,$85,$7F,$79,$73,$6D,$6A,$65,$60,$5B,$56,$52,$50,$4E,$4B,$48,$45,$44,$42,$41,$3F,$3E,$3D,$3E,$3E,$3E,$3E,$3F,$40,$41,$43,$45,$47,$49,$4C,$4F,$52,$55,$5A,$5D,$62,$66,$6C,$71,$76,$7C,$82,$88,$8E,$94,$9A,$A2,$A7,$AC,$B3,$BA,$C0,$C5,$CB,$D0,$D5,$D9,$DD,$E1,$E5,$E9,$EB,$ED,$F0,$F4,$F5,$F7,$F8,$FA,$FB,$FC,$FC,$FC,$FD,$FD,$FE,$FE,$FF,$FF,$FF),
    ($FF,$FF,$FE,$FE,$FE,$FE,$FC,$FD,$FC,$FB,$FB,$FA,$F8,$F7,$F5,$F5,$F2,$EF,$ED,$EA,$E7,$E3,$DF,$DC,$D8,$D3,$CE,$CA,$C5,$BF,$B9,$B3,$AE,$A8,$A2,$9C,$98,$92,$8C,$86,$80,$7B,$77,$72,$6C,$68,$64,$61,$5D,$5A,$58,$56,$53,$51,$4F,$4E,$4C,$4C,$4A,$4B,$4A,$4C,$4B,$4C,$4D,$4F,$50,$51,$54,$57,$5A,$5D,$60,$63,$67,$6A,$70,$74,$79,$7F,$83,$89,$8F,$93,$9B,$9F,$A5,$AC,$B1,$B6,$BC,$C1,$C8,$CE,$D1,$D6,$DB,$DE,$E1,$E5,$EA,$ED,$EE,$F1,$F3,$F6,$F7,$F8,$FA,$FB,$FC,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FA,$F9,$F8,$F6,$F4,$F3,$F1,$ED,$EB,$E9,$E4,$E1,$DD,$DA,$D5,$D0,$CD,$C7,$C3,$BE,$B8,$B3,$AD,$A8,$A2,$9E,$97,$93,$8D,$89,$84,$7F,$7A,$77,$72,$6E,$6C,$69,$66,$63,$60,$5E,$5C,$5B,$59,$5A,$59,$57,$57,$58,$5A,$59,$5A,$5B,$5E,$60,$61,$64,$68,$6A,$6E,$72,$75,$79,$7D,$82,$86,$8C,$91,$96,$9B,$9F,$A6,$AB,$B0,$B7,$BB,$C1,$C5,$CA,$CF,$D4,$D8,$DC,$E0,$E3,$E6,$E9,$ED,$F0,$F1,$F3,$F5,$F7,$F9,$FA,$FB,$FC,$FC,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FE,$FE,$FD,$FD,$FC,$FC,$FC,$FB,$FA,$F8,$F8,$F7,$F5,$F3,$F0,$EE,$EC,$E9,$E6,$E2,$DF,$DB,$D6,$D3,$CF,$CB,$C6,$C1,$BC,$B8,$B2,$AD,$A8,$A3,$A0,$99,$95,$91,$8C,$88,$84,$81,$7D,$7A,$77,$74,$71,$6E,$6D,$6B,$6A,$68,$68,$67,$66,$66,$67,$68,$68,$69,$6A,$6C,$6D,$6F,$72,$75,$78,$7B,$7F,$83,$87,$8B,$90,$94,$98,$9E,$A1,$A6,$AC,$AF,$B6,$BB,$C0,$C4,$C8,$CD,$D2,$D6,$DA,$DD,$E1,$E4,$E7,$EB,$ED,$F0,$F1,$F3,$F5,$F7,$F8,$F9,$FB,$FB,$FC,$FC,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FD,$FD,$FD,$FC,$FB,$FB,$FA,$F9,$F7,$F7,$F6,$F4,$F1,$EE,$ED,$EB,$E7,$E4,$E2,$DD,$DA,$D6,$D2,$CD,$CA,$C5,$C2,$BD,$B7,$B3,$AF,$AA,$A5,$A1,$9E,$9A,$95,$91,$8E,$8B,$88,$85,$82,$7F,$7D,$7A,$79,$77,$76,$75,$75,$75,$74,$74,$75,$76,$77,$78,$7A,$7C,$7E,$80,$83,$86,$88,$8C,$8F,$94,$97,$9B,$9F,$A3,$A8,$AD,$B2,$B6,$BA,$C0,$C3,$C8,$CC,$D1,$D5,$D8,$DC,$DF,$E2,$E6,$E8,$EB,$ED,$F0,$F3,$F4,$F6,$F8,$F8,$F9,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FC,$FA,$FA,$F8,$F7,$F6,$F4,$F2,$F1,$ED,$EB,$E9,$E6,$E2,$E0,$DC,$D9,$D5,$D1,$CD,$CA,$C6,$C2,$BE,$B9,$B5,$B0,$AD,$A9,$A5,$A1,$9D,$9B,$98,$95,$91,$8E,$8D,$8B,$88,$86,$85,$85,$84,$83,$83,$83,$83,$84,$85,$85,$87,$88,$89,$8C,$8D,$90,$93,$96,$9A,$9C,$9F,$A5,$A7,$AB,$B0,$B4,$B8,$BC,$BF,$C3,$C7,$CC,$D0,$D3,$D7,$DB,$DE,$E1,$E5,$E7,$EA,$EC,$F0,$F1,$F3,$F5,$F6,$F7,$F9,$FA,$FB,$FC,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FB,$FA,$F8,$F7,$F6,$F5,$F2,$F0,$EF,$ED,$EA,$E7,$E5,$E1,$DF,$DC,$D9,$D5,$D2,$CD,$CB,$C7,$C2,$BE,$BB,$B7,$B5,$B1,$AD,$AA,$A7,$A5,$A1,$9E,$9C,$9A,$98,$95,$95,$93,$92,$91,$91,$8F,$90,$90,$92,$93,$94,$95,$96,$97,$99,$9C,$9E,$A0,$A3,$A6,$A8,$AB,$B0,$B2,$B5,$BA,$BD,$C2,$C4,$C8,$CD,$D0,$D4,$D7,$DA,$DD,$E0,$E3,$E6,$EA,$EC,$EE,$F0,$F2,$F3,$F6,$F8,$F9,$F9,$FA,$FB,$FC,$FC,$FC,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FD,$FE,$FE,$FD,$FD,$FD,$FC,$FB,$FA,$F9,$F8,$F7,$F6,$F5,$F4,$F2,$EF,$EE,$EC,$E9,$E6,$E4,$E1,$DF,$DC,$D9,$D6,$D3,$CF,$CC,$C9,$C4,$C2,$BE,$BB,$B8,$B6,$B3,$AF,$AC,$AC,$A9,$A6,$A6,$A2,$A1,$A0,$A0,$9F,$9E,$9E,$9E,$9D,$9F,$9F,$A0,$A1,$A3,$A4,$A7,$A8,$AA,$AD,$AF,$B0,$B4,$B7,$B9,$BC,$BF,$C3,$C7,$CA,$CC,$D1,$D3,$D7,$DA,$DD,$DF,$E2,$E5,$E8,$EB,$ED,$EF,$F0,$F3,$F5,$F6,$F8,$F8,$FA,$FB,$FC,$FC,$FD,$FD,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FD,$FD,$FD,$FC,$FC,$FB,$FA,$F8,$F7,$F7,$F6,$F4,$F3,$F1,$EF,$ED,$EA,$EA,$E6,$E4,$E1,$DE,$DD,$DA,$D7,$D3,$D0,$CD,$CB,$C7,$C4,$C3,$BF,$BC,$BB,$B8,$B6,$B4,$B3,$B1,$B0,$AE,$AC,$AB,$AA,$AB,$AA,$AB,$AA,$AB,$AB,$AD,$AE,$AE,$AF,$B1,$B4,$B4,$B8,$B8,$BB,$BD,$C1,$C4,$C6,$C9,$CC,$CF,$D1,$D4,$D8,$DA,$DD,$DF,$E2,$E4,$E7,$EA,$ED,$EF,$EF,$F3,$F4,$F5,$F6,$F8,$F9,$FA,$FB,$FA,$FC,$FD,$FC,$FD,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FB,$FB,$FB,$FA,$FA,$F9,$F8,$F7,$F5,$F4,$F3,$F0,$EE,$EE,$EB,$E8,$E7,$E4,$E2,$DF,$DD,$DA,$D8,$D6,$D3,$D0,$CE,$CB,$C8,$C6,$C4,$C2,$C1,$BF,$BD,$BA,$BA,$B8,$B8,$B6,$B5,$B6,$B6,$B6,$B7,$B7,$B7,$B7,$B8,$B9,$BA,$BC,$BF,$BF,$C1,$C3,$C6,$C7,$CA,$CD,$CF,$D1,$D4,$D7,$D9,$DC,$DE,$E0,$E2,$E5,$E7,$EA,$EB,$EE,$EF,$F1,$F4,$F5,$F6,$F8,$F9,$F9,$FA,$FB,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FE,$FC,$FB,$FC,$FC,$FB,$FA,$F9,$F7,$F7,$F5,$F4,$F3,$F1,$F0,$EF,$ED,$EA,$EA,$E6,$E4,$E3,$E0,$DE,$DC,$DA,$D8,$D6,$D3,$D2,$CE,$CE,$CC,$CA,$C8,$C7,$C6,$C4,$C3,$C3,$C1,$C0,$C1,$C0,$C1,$C1,$C1,$C2,$C2,$C3,$C4,$C5,$C7,$C8,$CA,$CC,$CD,$CF,$D0,$D2,$D5,$D7,$D9,$DB,$DD,$E0,$E2,$E3,$E5,$E7,$EB,$EC,$EE,$F0,$F2,$F3,$F5,$F6,$F7,$F8,$F8,$FA,$FB,$FB,$FC,$FC,$FD,$FE,$FE,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FD,$FD,$FC,$FB,$FB,$FA,$FA,$F8,$F8,$F6,$F5,$F4,$F4,$F0,$F0,$EE,$EE,$EC,$E9,$E7,$E5,$E4,$E2,$E0,$DF,$DD,$DB,$DA,$D7,$D6,$D4,$D2,$D1,$D0,$CE,$CD,$CC,$CC,$CB,$CB,$CB,$CA,$CB,$CA,$CB,$CC,$CC,$CC,$CE,$CE,$CE,$D1,$D1,$D4,$D4,$D7,$D8,$DA,$DC,$DF,$DF,$E1,$E4,$E5,$E7,$E9,$EB,$EC,$ED,$EF,$F0,$F3,$F5,$F6,$F7,$F7,$F9,$FA,$FA,$FB,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FC,$FC,$FC,$FB,$FB,$FA,$F9,$F9,$F7,$F7,$F6,$F3,$F3,$F2,$F1,$EF,$EE,$ED,$EB,$E9,$E8,$E5,$E4,$E2,$E0,$DF,$DE,$DD,$DC,$DA,$D9,$D8,$D6,$D5,$D5,$D4,$D4,$D3,$D3,$D3,$D3,$D3,$D3,$D4,$D4,$D5,$D6,$D6,$D7,$D9,$DA,$DB,$DC,$DE,$DF,$E1,$E2,$E3,$E5,$E6,$E8,$EA,$EC,$ED,$EF,$F0,$F1,$F2,$F4,$F6,$F7,$F8,$F9,$FA,$FA,$FB,$FB,$FC,$FC,$FC,$FC,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF)
);

procedure RevealDraw(x,y:integer;ABitmap0,ABitmap1,ABitmap:TBitmap);
var
  x0,y0,x1,y1:integer;
  i0,j0:integer;
  i,j:integer;
  SL,SL0,SL1: pByteArray;
  k0,k1,k2:integer;
  d:byte;
begin
  ABitmap.Assign(ABitmap0);
  if x<0 then exit;
  x0:=x-RMMaskR; x1:=x+RMMaskR; i0:=x0;
  y0:=y-RMMaskR; y1:=y+RMMaskR; j0:=y0;
  // クリッピング
  if x0<0 then begin
    i0:=x0; x0:=0;
  end;
  if y0<0 then begin
    j0:=y0; y0:=0;
  end;

  if x1>=ABitmap0.Width then begin
    x1:=ABitmap0.Width-1;
  end;
  if y1>=ABitmap0.Height then begin
    y1:=ABitmap0.Height-1;
  end;
  for j:=y0 to y1 do begin
    SL :=ABitmap.ScanLine[j];
    SL0:=ABitmap0.ScanLine[j];
    SL1:=ABitmap1.ScanLine[j];
    for i:= x0 to x1 do begin
      k0:=i*3; k1:=k0+1; k2:=k0+2;
      d:=RMMask[i-i0,j-j0];
      SL[k0]:=trunc((SL0[k0]*d+SL1[k0]*($FF-d))/$FF);
      SL[k1]:=trunc((SL0[k1]*d+SL1[k1]*($FF-d))/$FF);
      SL[k2]:=trunc((SL0[k2]*d+SL1[k2]*($FF-d))/$FF);
    end;
  end;
end;

procedure RMenuBitmapToImage(ABitmap,MBitmap:TBitmap;AAlpha:byte;AImage:TImage);
// BitmapをImageコンポーネントに転送 PNGImage経由でないと透明にならない
var
  PngImage: TPngImage;
  x,y: integer;
  SL0,SLM: pByteArray;
  a:Single;
begin
  PngImage := TPngImage.Create;
  a:=(255-AAlpha)/255;
  try
    PngImage.Assign(ABitmap);
    PngImage.CreateAlpha;
    for y:=0 to PngImage.Height-1 do begin
      SL0 := PngImage.AlphaScanline[y];
      SLM := MBitmap.ScanLine[y];
      for x:=0 to PngImage.Width-1 do begin
        SL0[x]:=AAlpha+Trunc(SLM[x*3]*a);
      end;
    end;
    AImage.Picture.Assign(PngImage);
  finally
    PngImage.Free;
  end;
end;

var
  isMenuUpdated:Boolean;                       // 更新されたらTrue タイマーでビットマップが更新される
  MenuBitmap0,MenuBitmap1,MenuBitmap2:TBitmap; // メニューを描画するためのビットマップ
  MenuBitmapM:TBitmap;                         // メニューのマスク画像
  isMenuMove:boolean;                          // マウスがメニュー場を移動しているか
  MenuX,MenuY:integer;                         // ホバー時のマウスカーソルの位置
  MenuIndex0,MenuIndex1:integer;               // 現在選択されているメニューのインデックス 選ばれていないときは-1
  MenuState:TMenuState;                        // マウスが押されているか
  MenuWidth:integer;                           // メニューの幅

function MenuIndexGet(AX,AY:integer):integer; // メニューの選択番号を返す
var
  r:integer;
begin
  r:=AY div fdw3;
  if (AX<0)or(AX>=MenuWidth) then begin
    r:=-1;
  end;
  Result:=r;
end;

//

procedure RMenuCreate;
begin
  RMenuList:=TStringList.Create;
  MenuBitmap0:=TBitmap.Create; MenuBitmap0.PixelFormat:=pf24bit;
  MenuBitmap1:=TBitmap.Create; MenuBitmap1.PixelFormat:=pf24bit;
  MenuBitmap2:=TBitmap.Create; MenuBitmap2.PixelFormat:=pf24bit;
  MenuBitmapM:=TBitmap.Create; MenuBitmapM.PixelFormat:=pf24bit;
  RMenuIndex:=-1;
end;

procedure RMenuUpdate(AWidth,AHeight:integer); // メニューの情報を更新
begin
  isMenuUpdated:=False;
  MenuWidth:=AWidth;
  MenuBitmap0.SetSize(AWidth,AHeight);
  MenuBitmap1.SetSize(AWidth,AHeight);
  MenuBitmap2.SetSize(AWidth,AHeight);
  MenuBitmapM.SetSize(AWidth,AHeight);

  isMenuMove:=False;
  MenuIndex0:=-1; MenuIndex1:=-1;
  MenuState:=TMenuState.msNormal;
  isMenuUpdated:=True;
end;

procedure RMenuDestroy; // メニューを破棄
begin
  RMenuList.Free;
  MenuBitmap0.Free;
  MenuBitmap1.Free;
  MenuBitmap2.Free;
  MenuBitmapM.Free;
end;

procedure RMenuMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseDown処理
var
  LIndex:integer;
begin
  isMenuUpdated:=False;
  LIndex:=MenuIndexGet(X,Y);
  if (LIndex>=0)and(LIndex<RMenuList.Count) then begin
    MenuIndex0:=LIndex;
    MenuIndex1:=LIndex;
    MenuState:=TMenuState.msSelected;
  end;
  MenuX:=X; MenuY:=Y;
  isMenuMove:=True;
  isMenuUpdated:=True;
end;

procedure RMenuMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseMove処理
var
  LIndex:integer;
begin
  isMenuUpdated:=False;
  LIndex:=MenuIndexGet(X,Y);
  MenuIndex1:=LIndex;
  if (LIndex>=0)and(LIndex<RMenuList.Count) then begin
    if MenuIndex0=-1 then begin // MouseDownしてなかったら
      MenuState:=TMenuState.msHover;
    end else begin
      if MenuIndex0=LIndex then begin
        MenuState:=TMenuState.msSelected;
      end else begin
        MenuIndex1:=-1;
        MenuState:=TMenuState.msNormal;
      end;
    end;
  end else begin
    MenuState:=TMenuState.msNormal;
  end;
  MenuX:=X; MenuY:=Y;
  isMenuMove:=True;
  isMenuUpdated:=True;
end;

procedure RMenuMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseUp処理
var
  LIndex:integer;
begin
  isMenuUpdated:=False;
  LIndex:=MenuIndexGet(X,Y);
  if (LIndex=MenuIndex0) then begin
    RMenuIndex:=LIndex;
  end else begin
    RMenuIndex:=-1;
  end;
  MenuIndex0:=-1;
  MenuState:=TMenuState.msHover;
  isMenuMove:=True;
  isMenuUpdated:=True;
end;

procedure RMenuTimer(AHandle:HWND;AImage:TImage;AImageList:TImageList); // メニューのOnTimerの処理
// AHandleはImageのParent.Handleで取得できるはず
var
  P: TPoint;
begin // ボタン描画用
  if isMenuUpdated=False then exit;
  if MenuIndex1<>-1 then begin
    winapi.Windows.GetCursorPos(P);
    winapi.Windows.ScreenToClient(aHandle,P);
    if (P.X<(AImage.Left))or(P.X>(AImage.Left+AImage.Width))
     or (P.Y<(AImage.Top))or(P.Y>(AImage.Top +AImage.Height)) then begin
      MenuIndex1:=-1;
      MenuX:=-1;MenuY:=-1;
      MenuState:=TMenuState.msNormal;
    end;
  end;
  RMenuNColor:=RMenuColorOrgGet(TMenuState.msNormal);
  RMenuSColor:=RMenuColorOrgGet(MenuState);
  RMenuPDraw(MenuBitmap1,RMenuList,AImageList,MenuIndex1);
  RMenuMDraw(MenuBitmapM,RMenuList,AImageList);
  if isMenuMove then begin
    RMenuNColor:=RMenuColorSptGet(TMenuState.msNormal);
    RMenuSColor:=RMenuColorSptGet(MenuState);
    RMenuPDraw(MenuBitmap2,RMenuList,AImageList,MenuIndex1);
    RevealDraw(MenuX,MenuY,MenuBitmap1,MenuBitmap2,MenuBitmap0);
    RMenuBitmapToImage(MenuBitmap0,MenuBitmapM,100,AImage);
    isMenuMove:=False;
  end else begin
    RMenuBitmapToImage(MenuBitmap1,MenuBitmapM,100,AImage);
  end;
  isMenuUpdated:=False;
end;

利用するフォームの設定

これを使って,フォームにボタンButton1とImage1,Timer1,ImageList1
を配置します。
フォームは,DoubleBufferedをTrueに設定してください。

フォームの上48ピクセルはフォームの移動用になりますので,配置しないでください。
Image1は幅256ピクセル 高さ150ピクセル以上で,ボトムにもアンカーを設定してください。
Timer1はEnabledをFalseに,Intervalを100に設定してください。
(ボタン描画は0.1秒ごとに行われます)
ImageList1はHeightとWidthを16に設定し,ColorDepthをcd24Bitにしてください。メニューの数の画像を用意して,イメージリストに追加してください。追加時には透明色を黒と白以外に設定してください。
画像は黒いところが透明に,白いところが文字と同じ色に描画されます。灰色は半透明に表示されます。他の色は使わないでください。

フォームのコードは以下のようになります。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,
  System.ImageList, Vcl.ImgList,
  uFLuent;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
  private
    procedure WMNCHitTest(var Msg: TWMNCHitTest);message WM_NCHITTEST;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  Vcl.GraphUtil;

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  inherited;
  _WMNCHitTest(Self,Msg); // アクリルフォームがリサイズや移動ができるための処理
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AcrylicFormSet(Self,$11FF0000); // アクリルフォームにする

  RMenuCreate; // メニューの初期化

  // メニュー項目の追加
  RMenuList.Add('Menu1');
  RMenuList.Add('Menu2');
  RMenuList.Add('Menu3');

  RMenuColorsSet($FF0000); // メニューの色相を決める $RRGGBB

  RMenuUpdate(Image1.Width,Image1.Height); // メニューの情報を更新

  Timer1.Enabled:=True;
end;

procedure TForm1.FormDestroy(Sender: TObject); // メニューを破棄
begin
  RMenuDestroy;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  RMenuUpdate(Image1.Width,Image1.Height); // メニューの情報を更新
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  LIndex:integer;
begin
  RMenuMouseDown(Sender,Button,Shift,X,Y); // メニューのOnMouseDown処理
  // Label1.Caption:='Down:'+IntToStr(LIndex);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  RMenuMouseMove(Sender,Shift,X,Y); // メニューのOnMouseMove処理
  // Label1.Caption:=IntToStr(MenuIndex0);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  RMenuMouseUp(Sender,Button,Shift,X,Y); // メニューのOnMouseUp処理
  case RMenuIndex of // コマンドの実行
  0:begin
      button1.Caption:='0がクリックされました';
    end;
  1:begin
      button1.Caption:='1がクリックされました';
    end;
  2:begin
      button1.Caption:='2がクリックされました';
    end;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin // ボタン描画用
  RMenuTimer(Self.Handle,Image1,ImageList1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close; // 終了ボタンが表示されないので,必ず作ってください
end;

end.

メニューが選択されるとボタンの文字が変わるようにしています。

実装時の注意

この機能もアクリルフォームと同じように,省電力のためオフにする機能が必要でしょう。

まとめ

VCLでもReveal Heighlight風のボタンを作ることができました。Timeイベントで描画しているので,アニメーションへの変更も可能だと思います。

参考文献

CODIGOBIT - Enable Windows 10 Aero Glass a.k.a Blur Behind in our Delphi project
http://vhanla.codigobit.info/2015/07/enable-windows-10-aero-glass-aka-blur.html
Slashback Software - Borderless window resizing with WM_NCHITTEST
https://slashbackassociates.com/blog/Borderless-window-resizing-with-WM-NCHITTEST
ACCENT_ENABLE_ACRYLICBLURBEHIND
https://stackoverflow.com/questions/32724187/how-do-you-set-the-glass-blend-colour-on-windows-10
RGBからHLS形式へ変換する
http://www.geocities.jp/asumaroyuumaro/program/tips/rgb2hls.html

2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
p_kato
Delphiとの付き合いはTurbo Pascal 3.0Aから。古いだけが取り柄のDelphiプログラマです。あとPHPなどでも仕事しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?