0.はじめに

 以下はMJIR2019にて発表予定の「R言語を用いた再生可能な教学IR情報の分析と可視化」(発表者:専修大学西山慶太)の事例紹介において作成したRスクリプトです.
 使用するデータはダミーデータを読み込み,“dat”というオブジェクトに格納されていることを前提に進めます.ダミーデータを生成したRスクリプトは以下のリンクから見れます.

ダミーデータ生成スクリプト http://rpubs.com/keita_nishiyama/534598

また,今回のランク計算に用いたcume_dist関数の説明と,他の関数ではうまく行かないというシミュレーション結果とともに載せています.

ランキング関数の比較 http://rpubs.com/keita_nishiyama/557416

1.データセットの確認 

##          sID school department grade  GPA credit
## 1    工機1-1 工学部 機会工学科     1 2.05     29
## 2 工機1-1049 工学部 機会工学科     1 3.04     39
## 3  工機1-105 工学部 機会工学科     1 0.42     17
## 4 工機1-1060 工学部 機会工学科     1 2.44     29
## 5 工機1-1101 工学部 機会工学科     1 1.45      9
## 6 工機1-1121 工学部 機会工学科     1 2.50     27

 これをみると,sID,school,department,grade,GPA,creditという6つの列にデータが格納させていることがわかります.
   それではもう少し詳しく見ていきます.

## 'data.frame':    12000 obs. of  6 variables:
##  $ sID       : chr  "工機1-1" "工機1-1049" "工機1-105" "工機1-1060" ...
##  $ school    : Factor w/ 7 levels "工学部","社会科学部",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ department: Factor w/ 23 levels "応用ファイナンス学科",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ grade     : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ GPA       : num  2.05 3.04 0.42 2.44 1.45 2.5 2.4 1.16 1.12 2.93 ...
##  $ credit    : int  29 39 17 29 9 27 25 21 23 34 ...

 まずstr()の結果です,12000行6列のデータフレームであることがわかります.また,GPAはnumericつまり数値としてデータが格納されています.creditとgradeはintegerつまり整数値,schoolとdepartmentはFactor型(要素),sIDはcharactorつまり文字列として格納されています.
 

##      sID                   school          department       grade     
##  Length:12000       工学部    :1250   国際法学科:1000   Min.   :1.00  
##  Class :character   社会科学部:3000   法律学科  :1000   1st Qu.:1.75  
##  Mode  :character   情報学部  : 750   経営学科  : 800   Median :2.50  
##                     人間科学部: 500   経済学科  : 800   Mean   :2.50  
##                     人文学部  :2000   商学科    : 800   3rd Qu.:3.25  
##                     農学部    :1000   政治学科  : 800   Max.   :4.00  
##                     法学部    :3500   (Other)   :6800                 
##       GPA            credit      
##  Min.   :0.010   Min.   :  1.00  
##  1st Qu.:1.690   1st Qu.: 36.00  
##  Median :2.280   Median : 66.00  
##  Mean   :2.242   Mean   : 70.31  
##  3rd Qu.:2.830   3rd Qu.:100.00  
##  Max.   :4.000   Max.   :159.00  
## 

 つづいてsummary()の結果はそれぞれの変数ごとに,最小値,1/4位点,中央値,平均値,3/4位点,最大値が表示されます.またFactorや文字列などの計算が出来ない変数については属性とデータ数が表示されます.

2.グループごとのGPA順位(ランク)の計算 

 データの構造等が把握できたので,早速ですがGPA順位の計算に移ります.
 
 文部科学省から出されている修学支援新制度の支援打切りや警告に関する基準の内,「GPA(平均成績)等が下位1/4に属すること」という基準があります.よって特定のグループ内でGPAの順位づけをする必要があります(在学生採用のの基準もあり下位1/2なのでそれも一緒に).
 まずは,学部,学科,学年の3要因をグループとして用いて計算してみます.  

 必要なコードはたったこれだけです.計算結果は下の表の通りです.  

 このようにR言語ではこうしたデータの前処理がとても簡単に,そして高速に実行できます.

3.「警告」ボーダーラインの計算とデータテーブルの作成

 上の例では各グループごとの警告対象者が加えられた全データが格納されているデータテーブルに列として追加し,保存までしました.
 しかし,グループごとの統計量を求められることもありますし,次項から説明する可視化のコードを書く際にも,グループごとの統計量テーブルがあると便利なので,この章の最後にこれを作成しておきます.

 作成したデータテーブルは以下の様になっています

データの前処理はここまでです.グルーピングと順位の計算はRでの処理が圧倒的に楽です.

4.データの可視化

4−2.散布図 

 しかし,高等教育の修学支援新制度には,GPAの下位1/4の警告要件の他に,標準単位数の5割以下で打切り,6割以下で警告という要件もあります.これらの基準値を念頭に,GPAと修得単位数の二変数を用いて,散布図を書いてみます.ただし,グラフの数が膨大になるため,学年ごとに分けて描写します.  

5.まとめ

 R言語でデータ処理をすると,このように基データから前処理,統計処理,可視化,レポーティングまで,すべてRstudio上で行う事ができます.
 加えて,このようなデータ処理はルーチンワークとして毎年行う必要がありますが,Rscriptとして保存しておくと,inputするデータを変えるだけで同じ処理を行うことができます.Excelで処理を行った場合,毎年グループ数×学年の処理が必要となり,業務量が増えるだけでなく,ヒューマンエラーの原因にもなります.
 Rを使って業務の効率化を図り,データ処理の再生性を高めることは,大学事務組織にとって有益であると考えられます.   ここに記載したプログラム等は2次利用していただいてOKです.ただし,実際の大学業務に使用する際には,自己責任でお願いします.プログラムを使用したことによる不利益等は責任を負いかねますので予めご了承ください.
   また,不備等もあろうかと思いますので,ご質問等は西山(k.nis80[at]gmail.com)までお願いします.

LS0tCnRpdGxlOiAiUm1hcmtkb3duIFJlcG9ydGluZyBTY3JpcHQoUmV2aXNlZCB2ZXJzaW9uKSIKYXV0aG9yOiAiS2VpdGEgTmlzaGl5YW1hIgpkYXRlOiAiMTEvMjgvMjAxOSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgICMgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIHRoZW1lOiBmbGF0bHkKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmxvYWQoIk1KSVIyMDE5LlJEYXRhIikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoRFQpCmBgYAoKCiMg77yQ77yO44Gv44GY44KB44GrICAK44CA5Lul5LiL44GvTUpJUjIwMTnjgavjgabnmbrooajkuojlrprjga7jgIxS6KiA6Kqe44KS55So44GE44Gf5YaN55Sf5Y+v6IO944Gq5pWZ5a2mSVLmg4XloLHjga7liIbmnpDjgajlj6/oppbljJbjgI3vvIjnmbrooajogIXvvJrlsILkv67lpKflrabopb/lsbHmhbblpKrvvInjga7kuovkvovntLnku4vjgavjgYrjgYTjgabkvZzmiJDjgZfjgZ9S44K544Kv44Oq44OX44OI44Gn44GZ77yOICAK44CA5L2/55So44GZ44KL44OH44O844K/44Gv44OA44Of44O844OH44O844K/44KS6Kqt44G/6L6844G/77yMImRhdCLjgajjgYTjgYbjgqrjg5bjgrjjgqfjgq/jg4jjgavmoLzntI3jgZXjgozjgabjgYTjgovjgZPjgajjgpLliY3mj5DjgavpgLLjgoHjgb7jgZnvvI7jg4Djg5/jg7zjg4fjg7zjgr/jgpLnlJ/miJDjgZfjgZ9S44K544Kv44Oq44OX44OI44Gv5Lul5LiL44Gu44Oq44Oz44Kv44GL44KJ6KaL44KM44G+44GZ77yOICAKCuODgOODn+ODvOODh+ODvOOCv+eUn+aIkOOCueOCr+ODquODl+ODiAo8aHR0cDovL3JwdWJzLmNvbS9rZWl0YV9uaXNoaXlhbWEvNTM0NTk4PiAgCgrjgb7jgZ/vvIzku4rlm57jga7jg6njg7Pjgq/oqIjnrpfjgavnlKjjgYTjgZ9jdW1lX2Rpc3TplqLmlbDjga7oqqzmmI7jgajvvIzku5bjga7plqLmlbDjgafjga/jgYbjgb7jgY/ooYzjgYvjgarjgYTjgajjgYTjgYbjgrfjg5/jg6Xjg6zjg7zjgrfjg6fjg7PntZDmnpzjgajjgajjgoLjgavovInjgZvjgabjgYTjgb7jgZnvvI4KCuODqeODs+OCreODs+OCsOmWouaVsOOBruavlOi8gwogPGh0dHA6Ly9ycHVicy5jb20va2VpdGFfbmlzaGl5YW1hLzU1NzQxNj4KCgojIO+8ke+8juODh+ODvOOCv+OCu+ODg+ODiOOBrueiuuiqjeOAgAoKYGBge3IsIGVycm9yPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFfQojZGF044Gu5YWI6aCt6KGM44KS6KGo56S644GV44Gb44KLCmRhdCAlPiUgCiAgaGVhZCgpCmBgYArjgIDjgZPjgozjgpLjgb/jgovjgajvvIxzSUQsc2Nob29sLGRlcGFydG1lbnQsZ3JhZGUsR1BBLGNyZWRpdOOBqOOBhOOBhu+8luOBpOOBruWIl+OBq+ODh+ODvOOCv+OBjOagvOe0jeOBleOBm+OBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBme+8jiAgCuOAgArjgIDjgZ3jgozjgafjga/jgoLjgYblsJHjgZfoqbPjgZfjgY/opovjgabjgYTjgY3jgb7jgZnvvI4KCmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KI2RhdOOBruani+mAoOOCkuOBv+OCiwpkYXQgJT4lIAogIHN0cigpCmBgYArjgIDjgb7jgZpzdHIoKeOBrue1kOaenOOBp+OBme+8jDEyMDAw6KGMNuWIl+OBruODh+ODvOOCv+ODleODrOODvOODoOOBp+OBguOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBme+8juOBvuOBn++8jEdQQeOBr251bWVyaWPjgaTjgb7jgormlbDlgKTjgajjgZfjgabjg4fjg7zjgr/jgYzmoLzntI3jgZXjgozjgabjgYTjgb7jgZnvvI5jcmVkaXTjgahncmFkZeOBr2ludGVnZXLjgaTjgb7jgormlbTmlbDlgKTvvIxzY2hvb2zjgahkZXBhcnRtZW5044GvRmFjdG9y5Z6L77yI6KaB57Sg77yJLHNJROOBr2NoYXJhY3RvcuOBpOOBvuOCiuaWh+Wtl+WIl+OBqOOBl+OBpuagvOe0jeOBleOCjOOBpuOBhOOBvuOBme+8jiAgCuOAgApgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CiNkYXTjga7opoHntITntbHoqIjph4/jgpLjgb/jgosKZGF0ICU+JSAKICBzdW1tYXJ5KCkKYGBgCuOAgOOBpOOBpeOBhOOBpnN1bW1hcnkoKeOBrue1kOaenOOBr+OBneOCjOOBnuOCjOOBruWkieaVsOOBlOOBqOOBq++8jOacgOWwj+WApO+8jDEvNOS9jeeCue+8jOS4reWkruWApO+8jOW5s+Wdh+WApO+8jDMvNOS9jeeCue+8jOacgOWkp+WApOOBjOihqOekuuOBleOCjOOBvuOBme+8juOBvuOBn0ZhY3RvcuOChOaWh+Wtl+WIl+OBquOBqeOBruioiOeul+OBjOWHuuadpeOBquOBhOWkieaVsOOBq+OBpOOBhOOBpuOBr+WxnuaAp+OBqOODh+ODvOOCv+aVsOOBjOihqOekuuOBleOCjOOBvuOBme+8jiAgCgojIO+8ku+8juOCsOODq+ODvOODl+OBlOOBqOOBrkdQQemghuS9je+8iOODqeODs+OCr++8ieOBruioiOeul+OAgAoK44CA44OH44O844K/44Gu5qeL6YCg562J44GM5oqK5o+h44Gn44GN44Gf44Gu44Gn77yM5pep6YCf44Gn44GZ44GMR1BB6aCG5L2N44Gu6KiI566X44Gr56e744KK44G+44GZ77yOICAK44CAICAK44CA5paH6YOo56eR5a2m55yB44GL44KJ5Ye644GV44KM44Gm44GE44KL5L+u5a2m5pSv5o+05paw5Yi25bqm44Gu5pSv5o+05omT5YiH44KK44KE6K2m5ZGK44Gr6Zai44GZ44KL5Z+65rqW44Gu5YaF77yM44CMR1BB77yI5bmz5Z2H5oiQ57i+77yJ562J44GM5LiL5L2NMS8044Gr5bGe44GZ44KL44GT44Go44CN44Go44GE44GG5Z+65rqW44GM44GC44KK44G+44GZ77yO44KI44Gj44Gm54m55a6a44Gu44Kw44Or44O844OX5YaF44GnR1BB44Gu6aCG5L2N44Gl44GR44KS44GZ44KL5b+F6KaB44GM44GC44KK44G+44GZ77yI5Zyo5a2m55Sf5o6h55So44Gu44Gu5Z+65rqW44KC44GC44KK5LiL5L2NMS8y44Gq44Gu44Gn44Gd44KM44KC5LiA57eS44Gr77yJ77yOICAK44CA44G+44Ga44Gv77yM5a2m6YOo77yM5a2m56eR77yM5a2m5bm044Gu77yT6KaB5Zug44KS44Kw44Or44O844OX44Go44GX44Gm55So44GE44Gm6KiI566X44GX44Gm44G/44G+44GZ77yOCuOAgApgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CiPlrabpg6jvvIzlrablubTjgZTjgajjga5HUEHjg6njg7Pjgq/jgpLku5jkuI4KZGF0ICU+JSAjZGF044Go44GE44GG44OH44O844K/44OV44Os44O844Og44GL44KJCiAgZ3JvdXBfYnkoc2Nob29sLGRlcGFydG1lbnQsZ3JhZGUpICU+JSAjc2Nob29s44GoZGVwYXJ0bWVudCxncmFkZeOBp+OCsOODq+ODvOODl+WMluOBlwogIG11dGF0ZShxdWFydGVyX3RhcmdldCA9IGlmX2Vsc2UoY3VtZV9kaXN0KEdQQSk8PSAwLjI1LDEsMCkpICU+JSAKICBtdXRhdGUoaGFsZl90YXJnZXQgPSBpZl9lbHNlKGN1bWVfZGlzdChHUEEpPD0gMC41LDEsMCkpIC0+R1BBcmFuayAj44Kw44Or44O844OX44GU44Go44GrR1BB44Gu57Sv56mN44Op44Oz44Kv5Ymy5ZCI44KS6KiI566X44GX77yM5paw44GX44GP5a6a576p44GX44GfdGFyZ2V05YiX44Gr5qC857SNCmBgYAogIArjgIDlv4XopoHjgarjgrPjg7zjg4njga/jgZ/jgaPjgZ/jgZPjgozjgaDjgZHjgafjgZnvvI7oqIjnrpfntZDmnpzjga/kuIvjga7ooajjga7pgJrjgorjgafjgZnvvI4K44CACmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KI+e1kOaenOOBruihqOekuiAgCkdQQXJhbmsgJT4lIAogIGRhdGF0YWJsZShmaWx0ZXIgPSAgInRvcCIsIAogICAgICAgICAgZXh0ZW5zaW9ucyA9ICdTY3JvbGxlcicsIG9wdGlvbnMgPSBsaXN0KAogIGRlZmVyUmVuZGVyID0gVFJVRSwKICBkb20gPSAiZnJ0aVMiLAogIHNjcm9sbFkgPSAyMDAsCiAgc2Nyb2xsQ29sbGFwc2UgPSBUUlVFCikpCmBgYAoK44CA44GT44Gu44KI44GG44GrUuiogOiqnuOBp+OBr+OBk+OBhuOBl+OBn+ODh+ODvOOCv+OBruWJjeWHpueQhuOBjOOBqOOBpuOCguewoeWNmOOBq++8jOOBneOBl+OBpumrmOmAn+OBq+Wun+ihjOOBp+OBjeOBvuOBme+8jiAgCgoKIyDvvJPvvI7jgIzorablkYrjgI3jg5zjg7zjg4Djg7zjg6njgqTjg7Pjga7oqIjnrpfjgajjg4fjg7zjgr/jg4bjg7zjg5bjg6vjga7kvZzmiJAK44CA5LiK44Gu5L6L44Gn44Gv5ZCE44Kw44Or44O844OX44GU44Go44Gu6K2m5ZGK5a++6LGh6ICF44GM5Yqg44GI44KJ44KM44Gf5YWo44OH44O844K/44GM5qC857SN44GV44KM44Gm44GE44KL44OH44O844K/44OG44O844OW44Or44Gr5YiX44Go44GX44Gm6L+95Yqg44GX77yM5L+d5a2Y44G+44Gn44GX44G+44GX44Gf77yOICAK44CA44GX44GL44GX77yM44Kw44Or44O844OX44GU44Go44Gu57Wx6KiI6YeP44KS5rGC44KB44KJ44KM44KL44GT44Go44KC44GC44KK44G+44GZ44GX77yM5qyh6aCF44GL44KJ6Kqs5piO44GZ44KL5Y+v6KaW5YyW44Gu44Kz44O844OJ44KS5pu444GP6Zqb44Gr44KC77yM44Kw44Or44O844OX44GU44Go44Gu57Wx6KiI6YeP44OG44O844OW44Or44GM44GC44KL44Go5L6/5Yip44Gq44Gu44Gn77yM44GT44Gu56ug44Gu5pyA5b6M44Gr44GT44KM44KS5L2c5oiQ44GX44Gm44GK44GN44G+44GZ77yOICAKCmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KI+WQhOWfuua6luOBruWvvuixoeiAheaVsOOBqOOCq+ODg+ODiOODqeOCpOODs++8iOWvvuixoeiAheOBruOBhuOBoeOCguOBo+OBqOOCgumrmOOBhEdQQe+8ieOCkueul+WHuuOBl++8jOS/neWtmApHUEFyYW5rICU+JSAKICBncm91cF9ieShzY2hvb2wsIGRlcGFydG1lbnQsIGdyYWRlKSAlPiUgI+OCsOODq+ODvOODlOODs+OCsAogIHN1bW1hcmlzZSh0b3RhbF9zdHVkZW50ID0gbigpLCAj5a++6LGh44Kw44Or44O844OX44Gu5a2m55Sf5pWwCiAgICAgICAgICAgIG5fcXVhcnRlcl90YXJnZXQgPSBzdW0ocXVhcnRlcl90YXJnZXQpLCAj5LiL5L2NMS8044Gr6Kmy5b2T44GZ44KL5a2m55Sf44Gu5ZCI6KiI5pWwCiAgICAgICAgICAgIHF1YXJ0ZXJfY3V0bGluZSA9IG1heChHUEFbcXVhcnRlcl90YXJnZXQ9PTFdKSwgI+S4i+S9jTEvNOOBruOCq+ODg+ODiOODqeOCpOODswogICAgICAgICAgICBuX2hhbGZfdGFyZ2VyID0gc3VtKGhhbGZfdGFyZ2V0KSwgI+S4i+S9jTEvMuOBq+ipsuW9k+OBmeOCi+WtpueUn+OBruWQiOioiOaVsAogICAgICAgICAgICBoYWxmX2N1dGxpbmUgPSBtYXgoR1BBW2hhbGZfdGFyZ2V0PT0xXSkgI+S4i+S9jTEvMuOBruOCq+ODg+ODiOODqeOCpOODswogICAgICAgICAgICApLT7jgIBHUEFfc2VwICAj6KiI566X57WQ5p6c44KSR1BBX3NlcOOBq+S/neWtmAogIApgYGAKCuOAgOS9nOaIkOOBl+OBn+ODh+ODvOOCv+ODhuODvOODluODq+OBr+S7peS4i+OBruanmOOBq+OBquOBo+OBpuOBhOOBvuOBmQpgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CiPntZDmnpzjga7ooajnpLogIApHUEFfc2VwICU+JSAKICBkYXRhdGFibGUoZmlsdGVyID0gICJ0b3AiLCAKICAgICAgICAgIGV4dGVuc2lvbnMgPSAnU2Nyb2xsZXInLCBvcHRpb25zID0gbGlzdCgKICBkZWZlclJlbmRlciA9IFRSVUUsCiAgZG9tID0gImZydGlTIiwKICBzY3JvbGxZID0gMjAwLAogIHNjcm9sbENvbGxhcHNlID0gVFJVRQopKQpgYGAKIAoKIAoKICDjg4fjg7zjgr/jga7liY3lh6bnkIbjga/jgZPjgZPjgb7jgafjgafjgZnvvI7jgrDjg6vjg7zjg5Tjg7PjgrDjgajpoIbkvY3jga7oqIjnrpfjga9S44Gn44Gu5Yem55CG44GM5Zyn5YCS55qE44Gr5qW944Gn44GZ77yOCiAgCiAgCiMg77yU77yO44OH44O844K/44Gu5Y+v6KaW5YyWIAoKIyMg77yU4oiS77yR77yO44OS44K544OI44Kw44Op44OgCuOAgOS7iuWbnuOBruOCseODvOOCueOBp+ODkuOCueODiOOCsOODqeODoOOCkuS9nOaIkOOBmeOCi+OBq+OBr+WJjeWHpueQhuOBl+OBn+ODh+ODvOOCv+OBmeOCieW/heimgeOBguOCiuOBvuOBm+OCk++8juWfuuODh+ODvOOCv+OBp+OBguOCi2RhdOWkieaVsOOCkuS9v+eUqOOBl+OBpuabuOOBhOOBpuOBv+OBvuOBme+8jgoKYGBge3IsIGVycm9yPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFfQoKI+WFqOS9k+OBruWIhuW4gwpkYXQgJT4lIAogIGdncGxvdChhZXMoeCA9IEdQQSkpKwogIGdlb21faGlzdG9ncmFtKCkrCiAgdGhlbWVfZ3JheSAoYmFzZV9mYW1pbHkgPSAiSGlyYUtha3VQcm8tVzMiKSAKCiPlrabpg6jjgZTjgajjga7liIbluIMKZGF0ICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBHUEEsIGZpbGwgPSBzY2hvb2wpKSsKICBnZW9tX2hpc3RvZ3JhbSgpKwogIGZhY2V0X2dyaWQoIH4gc2Nob29sKSsKICB0aGVtZV9ncmF5IChiYXNlX2ZhbWlseSA9ICJIaXJhS2FrdVByby1XMyIpIAoKI+WtpumDqOODu+WtpuenkeOBlOOBqOOBruWIhuW4gwpkYXQgJT4lIAogIGdncGxvdChhZXMoeCA9IEdQQSwgZmlsbCA9IHNjaG9vbCkpKwogIGdlb21faGlzdG9ncmFtKCkrCiAgZmFjZXRfd3JhcCh+ZGVwYXJ0bWVudCwgbnJvdyA9IDUsIG5jb2wgPSA1KSsKICB0aGVtZV9ncmF5IChiYXNlX2ZhbWlseSA9ICJIaXJhS2FrdVByby1XMyIpIApgYGAKCgoKIyMg77yU4oiS77yS77yO5pWj5biD5Zuz44CACuOAgOOBl+OBi+OBl++8jOmrmOetieaVmeiCsuOBruS/ruWtpuaUr+aPtOaWsOWItuW6puOBq+OBr++8jEdQQeOBruS4i+S9jTEvNOOBruitpuWRiuimgeS7tuOBruS7luOBq++8jOaomea6luWNmOS9jeaVsOOBru+8leWJsuS7peS4i+OBp+aJk+WIh+OCiu+8jO+8luWJsuS7peS4i+OBp+itpuWRiuOBqOOBhOOBhuimgeS7tuOCguOBguOCiuOBvuOBme+8juOBk+OCjOOCieOBruWfuua6luWApOOCkuW/temgreOBq++8jEdQQeOBqOS/ruW+l+WNmOS9jeaVsOOBruS6jOWkieaVsOOCkueUqOOBhOOBpu+8jOaVo+W4g+Wbs+OCkuabuOOBhOOBpuOBv+OBvuOBme+8juOBn+OBoOOBl++8jOOCsOODqeODleOBruaVsOOBjOiGqOWkp+OBq+OBquOCi+OBn+OCge+8jOWtpuW5tOOBlOOBqOOBq+WIhuOBkeOBpuaPj+WGmeOBl+OBvuOBme+8jgrjgIAKCmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KIyMx5bm05qyhCkdQQXJhbmsgJT4lIAogIGZpbHRlcihncmFkZT09MSkgJT4lIAogIGdncGxvdChhZXMoR1BBLCBjcmVkaXQpKSsKICBnZW9tX3BvaW50KHNpemUgPSAxKSsKICBnZW9tX3ZsaW5lKGRhdGEgPSBHUEFfc2VwICU+JSBmaWx0ZXIoZ3JhZGU9PTEgKSwKICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeGludGVyY2VwdCA9IHF1YXJ0ZXJfY3V0bGluZSksIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmx1ZSIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9ICgoMTI0LzQpKjEpKjAuNiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAoKDEyNC80KSoxKSowLjUsIGxpbmV0eXBlPSJzb2xpZCIsIGNvbG9yID0gInJlZCIpKwogIGZhY2V0X3dyYXAofmRlcGFydG1lbnQsbnJvdyA9IDUsIG5jb2wgPSA1KSsKICBnZ3RpdGxlKCIyMDE45bm05bqm44CAMeW5tOasoSIpK3hsYWIoIuW5tOW6puWGhUdQQSIpK3lsYWIoIuS/ruW+l+WNmOS9jeaVsCIpKwogIGxhYnMoY2FwdGlvbiA9ICLotaTlrp/nt5rvvJrmlK/mj7TmiZPjgaHliIfjgorvvIzpnZLngrnnt5rvvJrorablkYoiKSsKICB0aGVtZV9ncmF5IChiYXNlX2ZhbWlseSA9ICJIaXJhS2FrdVByby1XMyIpIAoKIyMy5bm05qyhCkdQQXJhbmsgJT4lIAogIGZpbHRlcihncmFkZT09MikgJT4lIAogIGdncGxvdChhZXMoR1BBLCBjcmVkaXQpKSsKICBnZW9tX3BvaW50KHNpemUgPSAxKSsKICBnZW9tX3ZsaW5lKGRhdGEgPSBHUEFfc2VwICU+JSBmaWx0ZXIoZ3JhZGU9PTIgKSwKICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeGludGVyY2VwdCA9IHF1YXJ0ZXJfY3V0bGluZSksIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmx1ZSIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9ICgoMTI0LzQpKjIpKjAuNiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAoKDEyNC80KSoyKSowLjUsIGxpbmV0eXBlPSJzb2xpZCIsIGNvbG9yID0gInJlZCIpKwogIGZhY2V0X3dyYXAofmRlcGFydG1lbnQsbnJvdyA9IDUsIG5jb2wgPSA1KSsKICBnZ3RpdGxlKCIyMDE45bm05bqm44CAMuW5tOasoSIpK3hsYWIoIuW5tOW6puWGhUdQQSIpK3lsYWIoIuS/ruW+l+WNmOS9jeaVsCIpKwogIGxhYnMoY2FwdGlvbiA9ICLotaTlrp/nt5rvvJrmlK/mj7TmiZPjgaHliIfjgorvvIzpnZLngrnnt5rvvJrorablkYoiKSsKICB0aGVtZV9ncmF5IChiYXNlX2ZhbWlseSA9ICJIaXJhS2FrdVByby1XMyIpIAoKIyMz5bm05qyhCkdQQXJhbmsgJT4lIAogIGZpbHRlcihncmFkZT09MykgJT4lIAogIGdncGxvdChhZXMoR1BBLCBjcmVkaXQpKSsKICBnZW9tX3BvaW50KHNpemUgPSAxKSsKICBnZW9tX3ZsaW5lKGRhdGEgPSBHUEFfc2VwICU+JSBmaWx0ZXIoZ3JhZGU9PTMgKSwKICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeGludGVyY2VwdCA9IHF1YXJ0ZXJfY3V0bGluZSksIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmx1ZSIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9ICgoMTI0LzQpKjMpKjAuNiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAoKDEyNC80KSozKSowLjUsIGxpbmV0eXBlPSJzb2xpZCIsIGNvbG9yID0gInJlZCIpKwogIGZhY2V0X3dyYXAofmRlcGFydG1lbnQsbnJvdyA9IDUsIG5jb2wgPSA1KSsKICBnZ3RpdGxlKCIyMDE45bm05bqm44CAM+W5tOasoSIpK3hsYWIoIuW5tOW6puWGhUdQQSIpK3lsYWIoIuS/ruW+l+WNmOS9jeaVsCIpKwogIGxhYnMoY2FwdGlvbiA9ICLotaTlrp/nt5rvvJrmlK/mj7TmiZPjgaHliIfjgorvvIzpnZLngrnnt5rvvJrorablkYoiKSsKICB0aGVtZV9ncmF5IChiYXNlX2ZhbWlseSA9ICJIaXJhS2FrdVByby1XMyIpIAoKIyM05bm05qyhCkdQQXJhbmsgJT4lIAogIGZpbHRlcihncmFkZT09NCkgJT4lIAogIGdncGxvdChhZXMoR1BBLCBjcmVkaXQpKSsKICBnZW9tX3BvaW50KHNpemUgPSAxKSsKICBnZW9tX3ZsaW5lKGRhdGEgPSBHUEFfc2VwICU+JSBmaWx0ZXIoZ3JhZGU9PTQgKSwKICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeGludGVyY2VwdCA9IHF1YXJ0ZXJfY3V0bGluZSksIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmx1ZSIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9ICgoMTI0LzQpKjQpKjAuNiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAoKDEyNC80KSo0KSowLjUsIGxpbmV0eXBlPSJzb2xpZCIsIGNvbG9yID0gInJlZCIpKwogIGZhY2V0X3dyYXAofmRlcGFydG1lbnQsbnJvdyA9IDUsIG5jb2wgPSA1KSsKICBnZ3RpdGxlKCIyMDE45bm05bqm44CANOW5tOasoSIpK3hsYWIoIuW5tOW6puWGhUdQQSIpK3lsYWIoIuS/ruW+l+WNmOS9jeaVsCIpKwogIGxhYnMoY2FwdGlvbiA9ICLotaTlrp/nt5rvvJrmlK/mj7TmiZPjgaHliIfjgorvvIzpnZLngrnnt5rvvJrorablkYoiKSsKICB0aGVtZV9ncmF5IChiYXNlX2ZhbWlseSA9ICJIaXJhS2FrdVByby1XMyIpIApgYGAKCgoKIyDvvJXvvI7jgb7jgajjgoEgIArjgIBS6KiA6Kqe44Gn44OH44O844K/5Yem55CG44KS44GZ44KL44Go77yM44GT44Gu44KI44GG44Gr5Z+644OH44O844K/44GL44KJ5YmN5Yem55CG77yM57Wx6KiI5Yem55CG77yM5Y+v6KaW5YyW77yM44Os44Od44O844OG44Kj44Oz44Kw44G+44Gn77yM44GZ44G544GmUnN0dWRpb+S4iuOBp+ihjOOBhuS6i+OBjOOBp+OBjeOBvuOBme+8jiAgCuOAgOWKoOOBiOOBpu+8jOOBk+OBruOCiOOBhuOBquODh+ODvOOCv+WHpueQhuOBr+ODq+ODvOODgeODs+ODr+ODvOOCr+OBqOOBl+OBpuavjuW5tOihjOOBhuW/heimgeOBjOOBguOCiuOBvuOBmeOBjO+8jFJzY3JpcHTjgajjgZfjgabkv53lrZjjgZfjgabjgYrjgY/jgajvvIxpbnB1dOOBmeOCi+ODh+ODvOOCv+OCkuWkieOBiOOCi+OBoOOBkeOBp+WQjOOBmOWHpueQhuOCkuihjOOBhuOBk+OBqOOBjOOBp+OBjeOBvuOBme+8jkV4Y2Vs44Gn5Yem55CG44KS6KGM44Gj44Gf5aC05ZCI77yM5q+O5bm044Kw44Or44O844OX5pWww5flrablubTjga7lh6bnkIbjgYzlv4XopoHjgajjgarjgorvvIzmpa3li5nph4/jgYzlopfjgYjjgovjgaDjgZHjgafjgarjgY/vvIzjg5Ljg6Xjg7zjg57jg7Pjgqjjg6njg7zjga7ljp/lm6DjgavjgoLjgarjgorjgb7jgZnvvI4gIArjgIBS44KS5L2/44Gj44Gm5qWt5YuZ44Gu5Yq5546H5YyW44KS5Zuz44KK77yM44OH44O844K/5Yem55CG44Gu5YaN55Sf5oCn44KS6auY44KB44KL44GT44Go44Gv77yM5aSn5a2m5LqL5YuZ57WE57mU44Gr44Go44Gj44Gm5pyJ55uK44Gn44GC44KL44Go6ICD44GI44KJ44KM44G+44GZ77yOCuOAgAog44GT44GT44Gr6KiY6LyJ44GX44Gf44OX44Ot44Kw44Op44Og562J44Gv77yS5qyh5Yip55So44GX44Gm44GE44Gf44Gg44GE44GmT0vjgafjgZnvvI7jgZ/jgaDjgZfvvIzlrp/pmpvjga7lpKflrabmpa3li5njgavkvb/nlKjjgZnjgovpmpvjgavjga/vvIzoh6rlt7Hosqzku7vjgafjgYrpoZjjgYTjgZfjgb7jgZnvvI7jg5fjg63jgrDjg6njg6DjgpLkvb/nlKjjgZfjgZ/jgZPjgajjgavjgojjgovkuI3liKnnm4rnrYnjga/osqzku7vjgpLosqDjgYTjgYvjga3jgb7jgZnjga7jgafkuojjgoHjgZTkuobmib/jgY/jgaDjgZXjgYTvvI4gIArjgIAK44CA44G+44Gf77yM5LiN5YKZ562J44KC44GC44KN44GG44GL44Go5oCd44GE44G+44GZ44Gu44Gn77yM44GU6LOq5ZWP562J44Gv6KW/5bGxKGsubmlzODBbYXRdZ21haWwuY29tKeOBvuOBp+OBiumhmOOBhOOBl+OBvuOBme+8jg==