過去のMEMO

2005.12,4 (Sun)

 コンテ撮用カットの切り出し        anime↑

コンテ撮というのは流れを確認するためにコンテの絵を尺どおりに撮影するものです。(TVシリーズでスケジュールが厳しくなってくると、これでカッティングやアフレコをする事もありますが)
ムービー用のコンテ等では尺も短いのでたいした手間ではありませんでしたが、シリーズの1話分まるごとやってみようと思い、切り出し作業の自動化を試してみました。一応、誰にでも出来るようにPhotoshopCSでの手法を考えました。(Mirageでスクリプトを組んだ方が楽なような気はするんですが、それだと私以外の役に立たないので…)

段取りとしては 
 1.絵コンテをスキャン、連番でフォルダに保存。
 2.PhotoshopCSで読み込み、コマを選択範囲で切り取ってレイヤー化。
 3.javaスクリプトでレイヤー毎に連番保存 。

上の2、3をアクションで組み、バッチ(自動実行)作業にします。

まずjavaスクリプトの準備から行います。
PhotoshopCSにはプリセットで「レイヤーからファイルへ書き出し」というスクリプトが付属しています。

  script

ただし上のようなダイアログ表示が出てしまうので、自動実行のアクションに組み込むにはちょっと不便です。
そこで、デフォルトの設定を書き換え、ダイアログ表示せずに実行するように改造します。

PhotoshopCSのインストールフォルダ内のプリセット→スクリプトの中にある「レイヤーからファイルへ書き出し.js」をエディタで開きます(Notepadでも可)。
まず別の名前(レイヤー保存_JPG.js とか)を付けてから保存し、以下の個所を変更します。("//"はコメント記号でスクリプトはその行を無視します)


//------------------------------------- デフォルト設定
    exportInfo.destination = new String("");
    exportInfo.fileNamePrefix = new String("untitled_");
    exportInfo.visibleOnly = false;
    exportInfo.fileType = 1; // JPEG=1, PSD=2, TIFF=3, PDF=4, Targa=5, BMP=6
    exportInfo.icc = false;
    exportInfo.jpegQuality = 5;
    exportInfo.psdMaxComp = false;
    exportInfo.tiffCompression = TIFFEncoding.NONE;
    exportInfo.tiffJpegQuality = 8;
    exportInfo.pdfEncoding = PDFEncoding.JPEG;
    exportInfo.pdfJpegQuality = 8;
    exportInfo.targaDepth = TargaBitsPerPixels.TWENTYFOUR;
    exportInfo.bmpDepth = BMPDepthType.TWENTYFOUR;
//-------------------------------------------------

 デフォルト設定を必要な内容に書き換えます。
上の例ではjpg形式、表示されて無いレイヤーも保存、ICCプロファイル無視、画質5(中)となっています。
ダイアログを表示しないようにしますので、動作設定はここの記述で決まります。


// --------*作業対象ファイルのあるフォルダの直下にcutフォルダを作っておく------------
      var saveFile = new File(exportInfo.destination + "/cut/" + fileNameBody + ".jpg");
//--------------------------------------------------------------------  

 「作業対象ファイル のあるフォルダ」とは「絵コンテの連番ファイルのあるフォルダ」の事です。
ここでは「cut」というフォルダをその下に作成しておき、スクリプトの記述を合わせて変更しています。
 上記はjpg保存の場合です。他の画像形式を使う場合はその下に続けて列挙されている該当行を変更して下さい。
 切り出したファイルが「cut」フォルダ内に保存されます。


//-------- レイヤーネーム 省略 --------
//        fileNameBody += "_" + layerName;
//---------------------------------- 

 このスクリプトはたとえば「AAA」という名前のファイルで作業すると「AAA_000(連番)_レイヤー名」 という命名規則でレイヤーを保存します。
 今回レイヤー名は必要ないので上記のようにコメントアウト(行頭に"//"を挿入)します。
 レイヤー連番は上から0000、0001、0002〜となります (4桁では多いと思う場合は上の行にある zeroSuppress(i,4) の4を変更して下さい、今回の場合は1で可。)


//-------- 開始ダイアログ 表示省略-------------
//    if (0 == settingDialog(exportInfo)) return; // quit
// -----------------------------------------

 開始ダイアログの表示をコメントアウトして省略。


//-------------------- 終了ダイアログ 表示省略------
//          alert(uiTitleLayersToFiles + uiAlertWasSuccessful);
//------------------------------------------------

 終了ダイアログの表示をコメントアウトして省略。

以上で改造終了。保存しておきます。

次にPhotoshopCSで絵コンテのスキャン画像を読み込み、新規アクションの記録を開始して以下の作業を行います。

 コンテの1コマ(フレーム)目を選択範囲でとり、新規レイヤーにコピーします。
 背景レイヤーに移動し、2コマ目を同じように新規レイヤーにコピーし、移動コマンドで1コマ目の下に重なるように移動させます。
 以下、背景レイヤーに戻って繰り返し、最後に背景レイヤーを消去します。
 そして、コマ(フレーム)の形に切り取って、最終的に必要なサイズに縮小します。(私は横320ピクセルにしています)

ここで、レイヤーの上から1コマ目から順に重なったレイヤーファイルが出来ました。(通常のコンテ用紙だと5コマ)

  ekonte

上のような絵コンテ用紙の場合には下のようなレイヤー構成になります。

  layer

この状態で先ほど改造したスクリプトを呼び出します。ダイアログ無しですぐ実行され、cutフォルダ内に連番jpgが5つ保存されます。

スクリプトが動作を終えたら、ファイルを閉じます(「保存しますか?」とダイアログが出ますが、「いいえ」を選択)

アクションの記録を停止します。

例えば絵コンテ連番ファイル名が 作品名_001.jpg だった場合はcutフォルダ内のファイルは

作品名_001_0000.jpg
作品名_001_0001.jpg
作品名_001_0002.jpg
作品名_001_0003.jpg
作品名_001_0004.jpg

となっているはずです。
これでアクションが完成しました。

  
アクションを選択、絵コンテのフォルダを指定してからバッチを実行します。
(絵コンテ用紙とスキャン時の解像度を統一しておけば全て同じアクションで処理できます)

最終的にcutフォルダ内には

作品名_001_0000.jpg
作品名_001_0001.jpg
作品名_001_0002.jpg
作品名_001_0003.jpg
作品名_001_0004.jpg
作品名_002_0000.jpg
作品名_002_0001.jpg
作品名_002_0002.jpg
作品名_002_0003.jpg
作品名_002_0004.jpg
作品名_003_0000.jpg
作品名_003_0001.jpg
作品名_003_0002.jpg
作品名_003_0003.jpg
作品名_003_0004.jpg
とファイルが保存されます。
このままでも一応順番に並びますが、リネームソフトなどで一括して連番にリネームした方が使い勝手はいいと思います。
あ、そのまえにビューワーソフト(VixやLinarなど)で空コマを削除しておきましょう。

AfterEfect等で読み込んで尺を付け、ムービーにします。(私の場合はVideoToastorかMirageですが、4コマ/秒位の表示能力があれば他のソフトでもいいでしょう)

2005.12,12 (Mon)

ちょっとスクリプトを組み始めたら一日終わってしまった…他の仕事をやるつもりだったのに…

 Mirageで尺付けと擬似タイムシート管理        Mirage↑ anime↑

前回作成したコンテ連番に尺を付ける為のスクリプトです。

SliceLayer.grg
  ↓動作概念図
  slice
連番をレイヤーに展開します。その際最初のレイヤー名_001〜という規則でレイヤー名をつけます。
  トップレイヤーが静止画レイヤーになるように修正 2006/03/21


// SliceLayer
// westvill
// アニメレイヤーを1フレーム毎にレイヤーに展開 。ターゲットレイヤーのスタート位置に合わせて下方向にレイヤーを追加します。
//レイヤー名を連番化。 最大フレーム数は999
// また、1フレームのアニメレイヤーに適用すると静止画レイヤーに変換します。
//トップレイヤーがアニメーションレイヤーになっていたのを修正(2006/03/22)
Param none
tv_LayerCurrentID
    TopID = result
tv_LayerInfo TopID                            //レイヤー情報取得
parse result display position opacity name type startframe endframe prelighttable 
                                                //返り値を変数にセット
CheckAnim = CMP(type,"IMAGE")
    if (CheckAnim == 1)                                 // アニメレイヤーでない時は終了
        tv_Warn "Layer Must Be An Anim Layer!"
        exit
    end
//// メインループ
do
    tv_LayerImage EndFrame
    tv_LayerCut
      num = EndFrame - startframe + 1
if (num > 999)                            //フレーム数が999より大きい時は終了
    exit
end 
length = LEN(num)         // 数字の桁に合わせてゼロを追加
if (length == 1)
    znum = concat ("_00",num)
end
if (length == 2)
    znum = concat ("_0",num)
end
if (length == 3)
    znum = concat ("_",num)
end
    Lname = concat (name,znum)
    tv_LayerCreate Lname
    currentlayer = result
    tv_LayerPaste
    tv_LayerShift  currentlayer startframe  //ターゲットレイヤーのスタート位置に合わせる
    tv_LayerSet TopID
    EndFrame = EndFrame - 1
until ((EndFrame -startframe + 1) == 0)
//// ループを抜けた時点で最上位二つのレイヤーが入れ替わっている。
tv_LayerCurrentID
    IDs = result  
tv_LayerGetPos IDs    
    Pos = result
    Pos = Pos - 1 
tv_LayerMove Pos     //スタートフレームレイヤーを一つ上に移動
tv_Display current               //カレント表示モードにする
exit

  00

SliceLayerを使うと下のようになります。

  slicelayer

Input-frameLayer.grg
入力支援スクリプトです。フレーム数と時間を選べます。数値を入力すると下のレイヤーに移動して入力待ち、を繰り返します。(0を入力するとそのレイヤーをスキップ)


// Input-framelayer
// westvill
//
//基本的にSlicelayer.grg適用後等のレイヤー群にフレーム長を入力するものです。
//数値を入力すると下のレイヤーに移動して順次入力していく事が出来ます。(元のフレーム数は1でなくても可)
//"Cancel"クリック、最下位レイヤーで終了。
//"0"を入力するとスキップします。
//スタートはどこからでも可。また、レイヤー位置を揃えてなくても大丈夫です。
Param none
    tv_Request "Key? |Frame|Time"  //入力値が"フレーム"か"時間"かを選択 
        data =result                        // Frameの時は"1" Timeの時は"0"
    tv_ProjectCurrentID
        projectID = result
    tv_Projectinfo   projectID
        parse result name width height aspect framerate filedmode startframe //プロジェクトのフレームレートのみ使用
                                                                                             //*プレビュー再生のレートではありません 
do
    if (CMP(data,"0") == 1)
        tv_ReqFloat 1 0 99 "Input Times"    //初期値1、最小値0(スキップ)、最大値99) (単位は秒)  (1+12k、24fps)→1.5
            times = result
        if (CMP(times,"cancel") == 1)
            exit
        end 
        count = times*framerate   //秒数×フレームレート
    else
        tv_ReqNum 1 0 999 "Input Frames"    //初期値1、最小値0(スキップ)、最大値999) (単位はフレーム)  
            times = result
        if (CMP(times,"cancel") == 1)
            exit
        end 
        count = times
    end
    tv_LayerCurrentID
        ID = result                                 //カレントレイヤーIDを取得
    tv_LayerInfo ID                //レイヤー情報取得
        parse result display position opacity name type start end1 prelighttable posth selection
    length= (end1 - start + 1)        //*現在のレイヤーフレーム数取得 
        if (times == 0)                            //"0"が入力されたら差分=0に
            count = 0
        else
            count = count - length         //入力されたフレーム数と現在のフレーム数の差分
        end
    tv_LayerStretch ID "end" count "fast"       //カレントレイヤーをストレッチ 
                                                          //start位置を保持してend方向にストレッチ。補間無し
    tv_LayerGetPos ID                           //カレントレイヤーの位置(上下方向)を取得
        Pos = result
    tv_LayerGetID (Pos+1)                     //一つ下のレイヤーIDを取得
        ID = result
    tv_LayerSet ID                                //カレントレイヤーを移動
until (CMP(ID,"NONE") == 1)                     // 次のレイヤーが無い場合、終了
exit

入力後は以下のようになります。
  script

SlideLayer.grg
このままでは再生出来ないので、Mirageに付属してくるSlideLayer.grgを使って横に並べます。
  ↓概念図
  slide
  ↓適用後
  slide01
*SliceLayer.grgはレイヤー表示モードを「カレント(のみ表示)」に切り替えますので、プレビュー再生の前には「all(全て表示)」にする必要があります。

zerolayer.grg
Mirageに付属してくるスクリプト。
  ↓概念図
  zero

以上のスクリプトでムービーの編集、プレビューが手早く出来るようになります。(フレーム単位の増減は"i"で数値入力してコピーか、レイヤーバーをスライド。"shift+←、→"で選択、カット。等の方法があります)

ついでにconfig.iniを利用して擬似的にタイムシート的な使い方をするスクリプトを組んでみました。
詳しい説明はスクリプトのコメント参照。

↓config.iniの例
  config


// Writelayers.grg
// westvill
//
// 各レイヤ-のフレーム数をconfig.ini中の[カット名]セクションに書き出します。 c00n=m(フレーム数または時間)
//レイヤーの並びは任意で可。(揃えておく必要はありません)
//Mirage起動中にconfig.iniをエディターなどで編集した場合はその変更は反映されません。
//Writelayers.grgで書き出した内容はMirage終了時にiniファイルに反映されます。
//Writelayers.grgで書き出した内容はMirage起動中にReadlayer.grgで読み込み出来ます。
//不要なセクションは適時消去して下さい。config.iniが巨大になると起動、終了が遅くなります。
Param none
    tv_Request "Key? |Frame|Time"  //出力値が"フレーム"か"時間"かを選択 
                                              //*割り切れないフレームレート(30、24、12等)では"フレーム"を選択して下さい。 
        data =result                        // Frameの時は"1" Timeの時は"0"
    tv_ProjectCurrentID
        projectID = result
    tv_Projectinfo   projectID
        parse result name width height aspect framerate filedmode startframe //プロジェクトのフレームレートのみ使用
                                                                                                       //*プレビュー再生のレートではありません
    i = 0
DO                             //レイヤーID取得ルーチン
     tv_LayerGetID i
     i = i + 1
      ID(i) = result
UNTIL (cmp(ID(i),"NONE") == 1)
        Lnum= i - 1      //レイヤー総数
    if (Lnum > 999)       //レイヤー数が999を超える場合は終了
        exit
        tv_warn "レイヤー数が999を超えています"
    end
    tv_ReqString "Title ?"      //カット名(作品名)入力待ち
        title = result
    if (cmp(title,"cancel") == 1)
        exit
    end
for Li= 1 to Lnum
    tv_LayerInfo ID(Li)             //レイヤー情報取得
        parse result display position opacity name type start end prelighttable posth selection
    atime(Li)= (end - start + 1)
    length1 = LEN(Li)
                               // 桁数に応じてゼロを追加
    if (length1 == 1)
        znum = concat ("c00",Li)
    end
    if (length1 == 2)
        znum = concat ("c0",Li)
    end
    if (length1 == 3)
        znum = concat ("c",Li)
    end
    if (data == 0)
        atime(Li) = atime(Li)/framerate    //出力値が時間の時はフレームレート(プロジェクトに依存)で除算
        tv_WriteUserString title "data" "time"
    else
        tv_WriteUserString title "data" "frame      "
    end
    tv_WriteUserString title znum atime(Li)
end
    print title" を "Lnum"レイヤー 書き出しました"
    tv_ReadUserString "Writehistory" "hist"  " "   //iniファイルから書き込みセクション名の履歴を読み取り
        parse result hist1 hist2 hist3 hist4 hist5
    hist1 =" """hist1       //文字列の頭に" "(スペース)を挿入   
    hist2 =" """hist2
    hist3 =" """hist3
    hist4 =" """hist4
    historynew =title""hist1""hist2""hist3""hist4
    tv_WriteUserString "Writehistory" "hist" historynew            //config.iniに履歴を書き込み
exit

 


// Readlayesr.grg
// westvill
//Read frames from [title] section in config.ini
//各レイヤ-のフレーム数をconfig.ini中の[カット名]セクション以下の  c00n(n=1〜)=m(フレーム数または時間) から読み出して適用する。
//レイヤーの並びは任意で可。(揃えておく必要はありません)
//各レイヤーのスタート位置は保持されます。
//Mirage起動中にconfig.iniをエディターなどで編集した場合はその変更は反映されません。
//Writelayers.grgで書き出した内容はMirage終了時にiniファイルに反映されます。
//Writelayers.grgで書き出した内容はMirage起動中にReadlayer.grgで読み込み出来ます。
Param none
    tv_ProjectCurrentID
        projectID = result
    tv_Projectinfo   projectID
        parse result name width height aspect framerate filedmode startframe //プロジェクトのフレームレートのみ使用
                                                                                                        //*プレビュー再生のレートではありません
    i = 0
DO                              // レイヤーID取得ルーチン
     tv_LayerGetID i
     i = i + 1
      ID(i) = result
UNTIL (cmp(ID(i),"NONE") == 1)
        Lnum= i - 1      //レイヤー総数
    tv_ReadUserString "Writehistory" "hist"  "0"   //iniファイルから書き込み履歴読み取り
    parse result t1 t2 t3 t4 t5
    if (CMP(t1,"0") == 1)       // 行が存在しない時終了
        tv_warn "履歴がありません"
    else
        print t1 t2 t3 t4 t5         //履歴を表示  *ここで選択できると便利なんですが…
    end 
    tv_ReqString "Title ?"       //カット名(読み込むセクション名) 入力待ち
    title = result
    if (cmp(title,"cancel") == 1)
        exit
    end
    tv_ReadUserString title "data" "0"   //iniファイルから入力値の形式読み取り (frameかtime)
        data = result
    if (CMP(data,"0") == 1)
        tv_warn "データがありません"
        exit
    end
for Li = 1 to Lnum
    length1 = LEN(Li)        
                                        //行の名前生成
    if (length1 == 1)
        znum = concat ("c00",Li)
    end
    if (length1 == 2)
        znum = concat ("c0",Li)
    end
    if (length1 == 3)
        znum = concat ("c",Li)
    end
    tv_ReadUserString title znum "0"   //iniファイルから読み取り
    times = result
    if (CMP(times,"0") == 1)       // 行が存在しない時終了
        exit
    end 
    if (CMP(data, "time") == 1)
        times = times*framerate    //入力値が時間の時はフレームレート(プロジェクトに依存)を乗算
    end 
    tv_LayerInfo ID(Li)                //レイヤー情報取得
    parse result display position opacity name type start end1 prelighttable posth selection
    length= (end1 - start + 1)        //現在のレイヤーフレーム数取得
          num = times - length         //iniファイルに記述されているフレーム数との差分
        tv_LayerStretch ID(Li) end num fast    //レイヤーをストレッチ 
                                                          //start位置を保持してend方向にストレッチ。補間無し
end
//ここにslidelayers.grgをコピー&ペーストしておくと自動で並び替えてくれるので便利です。
exit

それほど便利ではないかも(苦笑

MirageやGoergeについて質問等あればメールかBBSでどうぞ。最近書き込みが少ない某巨大掲示板の方にでも構いません。レスはこちらに書きますが。

 AnimationDiscその後   anime↑

DISCはカナダの業者に発注し、東急ハンズでボードを穴あけ加工してもらい、立て掛け用のスタンドはルミナスライト(スチールラック)で組みました。
しばらく使ってみてレビューします。
とりあえず組み上げ直後の写真。

  disk1
DISC(円盤)を外した状態。中に見えるのは補助用のクリップライト。
  disk

参考:ChromaColour

2005.12,18 (Sun)

 寒い。
 W-ZERO3は盛り上がってますね。PDA好きとしては嬉しいです。Toshibaがキーボード付きの新型を出してくれないかなあ…

 キングコング   監督:ピーター・ジャクソン     cinema↑

コングのアクションがひたすらかっこいいです。もうほとんどスパイダーマンなみ。ティラノ(?)との組んずほぐれつの格闘も延々と続きます。恐竜のスタンピードもあり。
加えて怪しい異形のクリーチャーがテンコ盛りでお腹一杯。
コングの表情演技は素晴らしく、最後はきちんと泣かせる終わりになってました。
そのコングの演技を担当したアンディ・サーキスも船員役で印象に残る存在感を見せていました。素顔の方ももっと見たいですね。
少年ジミー役は「リトル・ダンサー」の主役を演じたジェイミー・ベル。

☆☆☆☆☆

 ファイアハウス    ディヴィット・ハルバースタム   book↑

9.11で多くの消防士を失ったある分署に取材したハルバースタムのノンフィクション。冷静な視点で彼らの生まれ、考え、家族や仲間との生活を淡々と描写し、心に沁みる。

(@ASIN:4087733823)

☆☆☆☆☆

 9・11生死を分けた102分   ジム・ドワイヤー ケヴィン・フリン  book↑

ハルバースタムの書では何故、消防士たちが還らなかったのか、という点についてはほとんど触れていません。事故後の膨大な記録の調査によって明らかになった驚くべき事実。
警察との連携の不備、旧式の無線による情報伝達の失敗によって崩壊するビルの中で(それを知らずに)取り残された多くの消防士たち。
1968年の法改正による建築基準の引き下げ(*1)や経済性を重視して安全性をないがしろにした設計が多くの被害者を生んだ大きな要因となっていたという事実は、最近の建築業界での不祥事の事も含めて非常に憂鬱な気分になりました。
 最近出向しているスタジオの非常階段を実際に下りてみた…。

(@ASIN:4163674306)

☆☆☆☆☆

*1: 高層建築に設置すべき非常階段の数を半分に減らし、煙が入りこまない構造の耐火階段を廃止した。非常階段同士の距離を2倍にすべしという条項が1984年に加えられたが、WTCは既に開業済みだった。
2005.12,30 (Fri)

 先週末から風邪でダウン。一昨日から自宅で仕事してましたが忘年会関係は全てパス。年内の仕事の予定が厳しくなってしまった…。

 ペイントツールSAI 19c soft↑

頻繁に改訂版が出るのでしばらく傍観してましたが(笑
今回、仕事絵で本格的に使ってみました。
2カラー保持出来るようになり(Xで切り替え)、塗りの効率が良くなっています。
キャンバスが回転できるのは非常に便利。髪の毛等の塗りや描画には本当に助かります。回転のレスポンスもいいし、プレビューの品質も高いです。
今のところ複数キャンバスの読み込みは出来ませんが、将来的には対応予定とのこと。
あとはHSLスライダがあれば完璧。

インターフェース周りの不満は、ブラシサイズのサークルが常に表示されている点です。
まったく非表示でも問題ないですが、サイズ変更の時だけの表示にできるオプションがあれば嬉しいですね。(Mirageでは1ドット表示のみにしてます)

新しい水彩筆のデフォルト設定がいい感じのムラ&滲み。

「鉛筆ツール」メインで、手ぶれ補正は「なし」、描画品質「速度優先」で使っています。
スクリーン、乗算などのレイヤー演算もあるので、この調子で行けば今後はMirageの出番が減るかもしれないです。

ペイントツールSAI
ペイントツールSAI-Wiki

 女魔術師ポルガラ   ディビッド&リー ・エディングス     book↑

(@ASIN:4150203997)
(@ASIN:4150204020)
(@ASIN:4150204055)

魔術師ベルガラスの3部作と同じ時代を娘のポルガラの側から描いた年代記。
内容的には繰り返しが多いのですが、父親との関係を再確認し最終的に家族の物語で締めくくるあたりは上手いと思いました。

☆☆☆☆☆

 マラカンドラ 別世界通信 1  C・S・ルイス    book↑

(@ASIN:4480021213)

「ナルニア」を読む前に、長いこと積んだままになっていた「別世界通信3部作」にとりかかりました。
正直もっと高尚で難解な物を想像していたので思ったより読みやすかったです。

☆☆☆☆

 狩人の夜   監督:チャールズ・ロートン  cinema↑

(@ASIN:B0000W3NGQ)

ロバート・ミッチャム演じる伝導師のキャラクターが強烈。

☆☆☆☆☆

 裁かるるジャンヌ   カール・H・ドライヤー  cinema↑

(@ASIN:B00091PFLO)

 ヨーロッパ映画のドキュメンタリー-(映画の宝物)で紹介されていて、ずっと観たかった作品です。
アップの撮影が多いのですが、陰影が豊かで緊張感のあるモノクロ画面には圧倒されます。
火刑シーンの容赦のない描写には正直驚きました。

☆☆☆☆★

Mirage anime book cinema draw etc hard nDiary PDA soft
2003 01 02 03 04 05 06 07 08 09 10 11 12
2004 01 02 03 04 05 06 07 08 09 10 11 12
2005 01 02 03 04 05 06 07 08 09 10 11 12
2006 01 02 03 04 05 06 07 08 09 10 11 12
2007 01 02 03 04 05 06 07 08 09 10 11 12
2008 01 02 03 04 05 06 07 08 09 10 11 12
2009 01 02 03 04 05 06 07 08 09 10 11 12
HOME