# HG changeset patch # User Nozomi Teruya # Date 1462698437 -32400 # Node ID f07b74bc74854975ce94e88ef75020707d8b030f # Parent 7de82f13512b9dadb60fe573c108766de2e9c657 first commit diff -r 7de82f13512b -r f07b74bc7485 .DS_Store Binary file .DS_Store has changed diff -r 7de82f13512b -r f07b74bc7485 paper/.DS_Store Binary file paper/.DS_Store has changed diff -r 7de82f13512b -r f07b74bc7485 paper/.sigos.tex.swp Binary file paper/.sigos.tex.swp has changed diff -r 7de82f13512b -r f07b74bc7485 paper/TopologyManagerの改良.mm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/TopologyManagerの改良.mm Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7de82f13512b -r f07b74bc7485 paper/images/.DS_Store Binary file paper/images/.DS_Store has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/TreeVNC.pdf Binary file paper/images/TreeVNC.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/TreeVNC.xbb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/TreeVNC.xbb Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,8 @@ +%%Title: ./TreeVNC.pdf +%%Creator: extractbb 20130405 +%%BoundingBox: 20 276 527 712 +%%HiResBoundingBox: 19.828200 276.334500 527.055300 711.739600 +%%PDFVersion: 1.4 +%%Pages: 1 +%%CreationDate: Tue Nov 10 23:07:15 2015 + diff -r 7de82f13512b -r f07b74bc7485 paper/images/delay.pdf Binary file paper/images/delay.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/delay.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/delay.svg Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7de82f13512b -r f07b74bc7485 paper/images/delay.xbb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/delay.xbb Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,8 @@ +%%Title: ./delay.pdf +%%Creator: extractbb 20130405 +%%BoundingBox: 41 236 517 747 +%%HiResBoundingBox: 40.926320 235.792700 517.482600 747.254500 +%%PDFVersion: 1.3 +%%Pages: 1 +%%CreationDate: Sun Nov 29 14:16:40 2015 + diff -r 7de82f13512b -r f07b74bc7485 paper/images/directConnection.pdf Binary file paper/images/directConnection.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/directConnection.xbb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/directConnection.xbb Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,8 @@ +%%Title: ./directConnection.pdf +%%Creator: extractbb 20130405 +%%BoundingBox: 0 0 715 375 +%%HiResBoundingBox: 0.000000 0.000000 715.000000 375.000000 +%%PDFVersion: 1.3 +%%Pages: 1 +%%CreationDate: Sun May 8 00:22:42 2016 + diff -r 7de82f13512b -r f07b74bc7485 paper/images/globalconnect.pdf Binary file paper/images/globalconnect.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/globalconnect.xbb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/globalconnect.xbb Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,8 @@ +%%Title: ./globalconnect.pdf +%%Creator: extractbb 20130405 +%%BoundingBox: 50 398 540 748 +%%HiResBoundingBox: 49.923550 398.343900 540.324300 747.631100 +%%PDFVersion: 1.3 +%%Pages: 1 +%%CreationDate: Sun May 8 00:12:28 2016 + diff -r 7de82f13512b -r f07b74bc7485 paper/images/metaCS.pdf Binary file paper/images/metaCS.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/metaCS.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/metaCS.svg Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7de82f13512b -r f07b74bc7485 paper/images/metaCS.xbb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/metaCS.xbb Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,8 @@ +%%Title: ./metaCS.pdf +%%Creator: extractbb 20130405 +%%BoundingBox: 31 511 515 732 +%%HiResBoundingBox: 30.601520 511.100000 515.413800 732.012800 +%%PDFVersion: 1.3 +%%Pages: 1 +%%CreationDate: Mon Nov 30 21:38:12 2015 + diff -r 7de82f13512b -r f07b74bc7485 paper/images/overNAT.pdf Binary file paper/images/overNAT.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/overNAT.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/overNAT.svg Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,629 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7de82f13512b -r f07b74bc7485 paper/images/overNAT.xbb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/overNAT.xbb Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,8 @@ +%%Title: ./overNAT.pdf +%%Creator: extractbb 20130405 +%%BoundingBox: 5 412 533 757 +%%HiResBoundingBox: 5.484846 412.335200 533.336600 756.600900 +%%PDFVersion: 1.3 +%%Pages: 1 +%%CreationDate: Sun Nov 29 22:58:49 2015 + diff -r 7de82f13512b -r f07b74bc7485 paper/images/privateconnect.pdf Binary file paper/images/privateconnect.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/privateconnect.xbb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/privateconnect.xbb Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,8 @@ +%%Title: ./privateconnect.pdf +%%Creator: extractbb 20130405 +%%BoundingBox: 46 403 460 674 +%%HiResBoundingBox: 45.954070 403.068600 459.716300 673.736300 +%%PDFVersion: 1.3 +%%Pages: 1 +%%CreationDate: Sun May 8 00:12:32 2016 + diff -r 7de82f13512b -r f07b74bc7485 paper/images/replay_delay.pdf Binary file paper/images/replay_delay.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/replay_delay.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/replay_delay.svg Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7de82f13512b -r f07b74bc7485 paper/images/send_delay.pdf Binary file paper/images/send_delay.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/send_delay.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/send_delay.svg Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 7de82f13512b -r f07b74bc7485 paper/images/somehostname.pdf Binary file paper/images/somehostname.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/somehostname.xbb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/somehostname.xbb Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,8 @@ +%%Title: ./somehostname.pdf +%%Creator: extractbb 20130405 +%%BoundingBox: 123 368 424 736 +%%HiResBoundingBox: 122.857500 367.754400 423.649200 735.764800 +%%PDFVersion: 1.3 +%%Pages: 1 +%%CreationDate: Sun May 8 00:12:18 2016 + diff -r 7de82f13512b -r f07b74bc7485 paper/images/timelog_compress_depth3.pdf Binary file paper/images/timelog_compress_depth3.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/images/topologymanager.bb --- a/paper/images/topologymanager.bb Wed Jul 08 17:34:13 2015 +0900 +++ b/paper/images/topologymanager.bb Sun May 08 18:07:17 2016 +0900 @@ -1,5 +1,5 @@ -%%Title: ./images/topologymanager.pdf -%%Creator: extractbb 20130405 +%%Title: ./topologymanager.pdf +%%Creator: extractbb 20110311 %%BoundingBox: 0 0 258 313 -%%CreationDate: Tue May 5 17:14:21 2015 +%%CreationDate: Thu Feb 9 05:26:40 2012 diff -r 7de82f13512b -r f07b74bc7485 paper/images/topologymanager.eps --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/images/topologymanager.eps Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,1280 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%HiResBoundingBox: 0.000000 0.000000 258.000000 313.000000 +%APL_DSC_Encoding: UTF8 +%%Title: (Unknown) +%%Creator: (Unknown) +%%CreationDate: (Unknown) +%%For: (Unknown) +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 0 0 258 313 +%%EndComments +%%BeginProlog +%%BeginFile: cg-pdf.ps +%%Copyright: Copyright 2000-2004 Apple Computer Incorporated. +%%Copyright: All Rights Reserved. +currentpacking true setpacking +/cg_md 141 dict def +cg_md begin +/L3? languagelevel 3 ge def +/bd{bind def}bind def +/ld{load def}bd +/xs{exch store}bd +/xd{exch def}bd +/cmmtx matrix def +mark +/sc/setcolor +/scs/setcolorspace +/dr/defineresource +/fr/findresource +/T/true +/F/false +/d/setdash +/w/setlinewidth +/J/setlinecap +/j/setlinejoin +/M/setmiterlimit +/i/setflat +/rc/rectclip +/rf/rectfill +/rs/rectstroke +/f/fill +/f*/eofill +/sf/selectfont +/s/show +/xS/xshow +/yS/yshow +/xyS/xyshow +/S/stroke +/m/moveto +/l/lineto +/c/curveto +/h/closepath +/n/newpath +/q/gsave +/Q/grestore +counttomark 2 idiv +{ld}repeat pop +/SC{ + /ColorSpace fr scs +}bd +/sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld +/soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld +/cgmtx matrix def +/sdmtx{cgmtx currentmatrix pop}bd +/CM {cgmtx setmatrix}bd +/cm {cmmtx astore CM concat}bd +/W{clip newpath}bd +/W*{eoclip newpath}bd +statusdict begin product end dup (HP) anchorsearch{ + pop pop pop + true +}{ + pop + (hp) anchorsearch{ + pop pop true + }{ + pop false + }ifelse +}ifelse +{ + { + { + pop pop + (0)dup 0 4 -1 roll put + F charpath + }cshow + } +}{ + {F charpath} +}ifelse +/cply exch bd +/cps {cply stroke}bd +/pgsave 0 def +/bp{/pgsave save store}bd +/ep{pgsave restore showpage}def +/re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd +/scrdict 10 dict def +/scrmtx matrix def +/patarray 0 def +/createpat{patarray 3 1 roll put}bd +/makepat{ +scrmtx astore pop +gsave +initgraphics +CM +patarray exch get +scrmtx +makepattern +grestore +setpattern +}bd +/cg_BeginEPSF{ + userdict save/cg_b4_Inc_state exch put + userdict/cg_endepsf/cg_EndEPSF load put + count userdict/cg_op_count 3 -1 roll put + countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put + 3 sub{end}repeat + /showpage {} def + 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin + 10 setmiterlimit [] 0 setdash newpath + false setstrokeadjust false setoverprint +}bd +/cg_EndEPSF{ + countdictstack 3 sub { end } repeat + cg_dict_array 3 1 index length 3 sub getinterval + {begin}forall + count userdict/cg_op_count get sub{pop}repeat + userdict/cg_b4_Inc_state get restore + F setpacking +}bd +/cg_biproc{currentfile/RunLengthDecode filter}bd +/cg_aiproc{currentfile/ASCII85Decode filter/RunLengthDecode filter}bd +/ImageDataSource 0 def +L3?{ + /cg_mibiproc{pop pop/ImageDataSource{cg_biproc}def}bd + /cg_miaiproc{pop pop/ImageDataSource{cg_aiproc}def}bd +}{ + /ImageBandMask 0 def + /ImageBandData 0 def + /cg_mibiproc{ + string/ImageBandMask xs + string/ImageBandData xs + /ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx + /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd + }bd + /cg_miaiproc{ + string/ImageBandMask xs + string/ImageBandData xs + /ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter + dup ImageBandMask/readstring cvx + /pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd + }bd +}ifelse +/imsave 0 def +/BI{save/imsave xd mark}bd +/EI{imsave restore}bd +/ID{ +counttomark 2 idiv +dup 2 add +dict begin +{def} repeat +pop +/ImageType 1 def +/ImageMatrix[Width 0 0 Height neg 0 Height]def +currentdict dup/ImageMask known{ImageMask}{F}ifelse exch +L3?{ + dup/MaskedImage known + { + pop + << + /ImageType 3 + /InterleaveType 2 + /DataDict currentdict + /MaskDict + << /ImageType 1 + /Width Width + /Height Height + /ImageMatrix ImageMatrix + /BitsPerComponent 1 + /Decode [0 1] + currentdict/Interpolate known + {/Interpolate Interpolate}if + >> + >> + }if +}if +exch +{imagemask}{image}ifelse +end +}bd +/cguidfix{statusdict begin mark version end +{cvr}stopped{cleartomark 0}{exch pop}ifelse +2012 lt{dup findfont dup length dict begin +{1 index/FID ne 2 index/UniqueID ne and +{def} {pop pop} ifelse}forall +currentdict end definefont pop +}{pop}ifelse +}bd +/t_array 0 def +/t_i 0 def +/t_c 1 string def +/x_proc{ + exch t_array t_i get add exch moveto + /t_i t_i 1 add store +}bd +/y_proc{ + t_array t_i get add moveto + /t_i t_i 1 add store +}bd +/xy_proc{ + + t_array t_i 2 copy 1 add get 3 1 roll get + 4 -1 roll add 3 1 roll add moveto + /t_i t_i 2 add store +}bd +/sop 0 def +/cp_proc/x_proc ld +/base_charpath +{ + /t_array xs + /t_i 0 def + { + t_c 0 3 -1 roll put + currentpoint + t_c cply sop + cp_proc + }forall + /t_array 0 def +}bd +/sop/stroke ld +/nop{}def +/xsp/base_charpath ld +/ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd +/xysp{/cp_proc/xy_proc ld base_charpath/cp_proc/x_proc ld}bd +/xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd +/ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd +/xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd +/refnt{ +findfont dup length dict copy dup +/Encoding 4 -1 roll put +definefont pop +}bd +/renmfont{ +findfont dup length dict copy definefont pop +}bd +L3? dup dup{save exch}if +/Range 0 def +/DataSource 0 def +/val 0 def +/nRange 0 def +/mulRange 0 def +/d0 0 def +/r0 0 def +/di 0 def +/ri 0 def +/a0 0 def +/a1 0 def +/r1 0 def +/r2 0 def +/dx 0 def +/Nsteps 0 def +/sh3tp 0 def +/ymax 0 def +/ymin 0 def +/xmax 0 def +/xmin 0 def +/setupFunEval +{ + begin + /nRange Range length 2 idiv store + /mulRange + + [ + 0 1 nRange 1 sub + { + 2 mul/nDim2 xd + Range nDim2 get + Range nDim2 1 add get + 1 index sub + + 255 div + exch + }for + ]store + end +}bd +/FunEval +{ + begin + + nRange mul /val xd + + 0 1 nRange 1 sub + { + dup 2 mul/nDim2 xd + val + add DataSource exch get + mulRange nDim2 get mul + mulRange nDim2 1 add get + add + }for + end +}bd +/max +{ + 2 copy lt + {exch pop}{pop}ifelse +}bd +/sh2 +{ + /Coords load aload pop + 3 index 3 index translate + + 3 -1 roll sub + 3 1 roll exch + sub + 2 copy + dup mul exch dup mul add sqrt + dup + scale + atan + + rotate + + /Function load setupFunEval + + + clippath {pathbbox}stopped {0 0 0 0}if newpath + /ymax xs + /xmax xs + /ymin xs + /xmin xs + currentdict/Extend known + { + /Extend load 0 get + { + 0/Function load FunEval sc + xmin ymin xmin abs ymax ymin sub rectfill + }if + }if + + /Nsteps/Function load/Size get 0 get 1 sub store + /dx 1 Nsteps div store + gsave + /di ymax ymin sub store + /Function load + + 0 1 Nsteps + { + 1 index FunEval sc + 0 ymin dx di rectfill + dx 0 translate + }for + pop + grestore + currentdict/Extend known + { + /Extend load 1 get + { + Nsteps/Function load FunEval sc + 1 ymin xmax 1 sub abs ymax ymin sub rectfill + }if + }if +}bd +/shp +{ + 4 copy + + dup 0 gt{ + 0 exch a1 a0 arc + }{ + pop 0 moveto + }ifelse + dup 0 gt{ + 0 exch a0 a1 arcn + }{ + pop 0 lineto + }ifelse + + fill + + dup 0 gt{ + 0 exch a0 a1 arc + }{ + pop 0 moveto + }ifelse + dup 0 gt{ + 0 exch a1 a0 arcn + }{ + pop 0 lineto + }ifelse + + fill +}bd +/calcmaxs +{ + + xmin dup mul ymin dup mul add sqrt + xmax dup mul ymin dup mul add sqrt + xmin dup mul ymax dup mul add sqrt + xmax dup mul ymax dup mul add sqrt + max max max +}bd +/sh3 +{ + /Coords load aload pop + 5 index 5 index translate + 3 -1 roll 6 -1 roll sub + 3 -1 roll 5 -1 roll sub + 2 copy dup mul exch dup mul add sqrt + /dx xs + 2 copy 0 ne exch 0 ne or + { + + exch atan rotate + }{ + pop pop + }ifelse + + /r2 xs + /r1 xs + /Function load + dup/Size get 0 get 1 sub + /Nsteps xs + setupFunEval + + + + + + dx r2 add r1 lt{ + + 0 + }{ + dx r1 add r2 le + { + 1 + }{ + r1 r2 eq + { + 2 + }{ + 3 + }ifelse + }ifelse + }ifelse + /sh3tp xs + clippath {pathbbox}stopped {0 0 0 0}if + newpath + /ymax xs + /xmax xs + /ymin xs + /xmin xs + + dx dup mul r2 r1 sub dup mul sub dup 0 gt + { + sqrt r2 r1 sub atan + /a0 exch 180 exch sub store + /a1 a0 neg store + }{ + pop + /a0 0 store + /a1 360 store + }ifelse + currentdict/Extend known + { + /Extend load 0 get r1 0 gt and + { + 0/Function load FunEval sc + + + + + { + { + dx 0 r1 360 0 arcn + xmin ymin moveto + xmax ymin lineto + xmax ymax lineto + xmin ymax lineto + xmin ymin lineto + eofill + } + { + r1 0 gt{0 0 r1 0 360 arc fill}if + } + { + + + + + 0 r1 xmin abs r1 add neg r1 shp + } + { + + + r2 r1 gt{ + + 0 r1 + r1 neg r2 r1 sub div dx mul + 0 + shp + }{ + + + + 0 r1 calcmaxs + dup + + r2 add dx mul dx r1 r2 sub sub div + neg + exch 1 index + abs exch sub + shp + }ifelse + } + }sh3tp get exec + }if + }if + + /d0 0 store + /r0 r1 store + /di dx Nsteps div store + /ri r2 r1 sub Nsteps div store + /Function load + 0 1 Nsteps + { + 1 index FunEval sc + d0 di add r0 ri add d0 r0 shp + { + + d0 0 r0 a1 a0 arc + d0 di add 0 r0 ri add a0 a1 arcn + fill + + + d0 0 r0 a0 a1 arc + d0 di add 0 r0 ri add a1 a0 arcn + fill + }pop + + + /d0 d0 di add store + /r0 r0 ri add store + }for + pop + + currentdict/Extend known + { + /Extend load 1 get r2 0 gt and + { + Nsteps/Function load FunEval sc + + + + + { + { + dx 0 r2 0 360 arc fill + } + { + dx 0 r2 360 0 arcn + xmin ymin moveto + xmax ymin lineto + xmax ymax lineto + xmin ymax lineto + xmin ymin lineto + eofill + } + { + + + xmax abs r1 add r1 dx r1 shp + } + { + + r2 r1 gt{ + + + + calcmaxs dup + + r1 add dx mul dx r2 r1 sub sub div + exch 1 index + exch sub + dx r2 + shp + }{ + + r1 neg r2 r1 sub div dx mul + 0 + dx + r2 + shp + }ifelse + } + } + sh3tp get exec + }if + }if +}bd +/sh +{ + begin + /ShadingType load dup dup 2 eq exch 3 eq or + { + gsave + newpath + /ColorSpace load scs + currentdict/BBox known + { + /BBox load aload pop + 2 index sub + 3 index + 3 -1 roll exch sub + exch rectclip + }if + 2 eq + {sh2}{sh3}ifelse + grestore + }{ + + pop + (DEBUG: shading type unimplemented\n)print flush + }ifelse + end +}bd +{restore}if not dup{save exch}if + L3?{ + /sh/shfill ld + /csq/clipsave ld + /csQ/cliprestore ld + }if +{restore}if +end +setpacking +%%EndFile +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%PageBoundingBox: 0 0 258 313 +%%BeginPageSetup +cg_md begin +bp +sdmtx +%RBIBeginFontSubset: Helvetica +%!FontType1-1.0: Helvetica 1.0000.0.0000 + 14 dict begin/FontName /Helvetica def + /PaintType 0 def + /Encoding 256 array 0 1 255{1 index exch/.notdef put}for + dup 33 /T put + dup 34 /o put + dup 35 /p put + dup 36 /l put + dup 37 /g put + dup 38 /y put + dup 39 /M put + dup 40 /a put + dup 41 /n put + dup 42 /e put + dup 43 /r put + dup 44 /i put + dup 45 /period put + dup 46 /d put + dup 47 /t put + dup 48 /N put + readonly def + 42/FontType resourcestatus{pop pop false}{true}ifelse + %APLsfntBegin + {currentfile 0(%APLsfntEnd\n)/SubFileDecode filter flushfile}if + /FontType 42 def + /FontMatrix matrix def + /FontBBox[2048 -1947 1 index div -985 2 index div 2961 3 index div 2297 5 -1 roll div]cvx def + /sfnts [< + 74727565000900000000000063767420000000000000009C0000036C6670676D000000000000040800000A1D676C79660000000000000E2800000D9C686561640000000000001BC400000036686865610000000000001BFC00000024686D74780000000000001C20000000446C6F63610000000000001C64000000246D6178700000000000001C8800000020707265700000000000001CA8000003CF05C0001005BD00280580001A042F001F0000FFD90000FFDA0000FFD9FE55FFE605C70010FE6DFFF1033B000000B9000000B902FE3F3C00C0008D009B00AF000600A800C00028005E009800C9016A00B9015C00B400D6011E002E0080000400B8004C00CC01FFFFD1006600A400AF007400C2009500B1000C0028006D0015004C008E0125FF7A000C0040004C00620084FFA200240038008600BD0039005E008E00EDFFA9FFB300400052005500AA00AB00C200CB012302B10413FFAEFFE4000800510074008400AA00D1FF4CFFAF0012002C004200500051008400BE012503DAFF680018003B0098009C009F00A100C100EC018201B4FF68FF76FFD0FFE100020018001C00530053007D01B401E103AF0486FF9CFFEAFFFE001F0028002A00520060009300A300AA00AF00AF00C001000145016B0174019301950240028202B404850517FEFD00060029004700470048006F008800B400B900C400F200F901EF02180310037403C5FF35FFF3000B004B004C0052005500650076007600870087008E00AB00BB0106013001430150017D0194019501D3022A025502580277027802E6034E035C037903D3047304B2058C0598060BFEF5FFBBFFC7FFD50017001D005B0072007E009C00C200D000F400FA01030106011C0125013B0142015E015E0180019B02B901A101B9025001C001D002AA01DF01E301EF01FB0205020C0215022B0274029302AB02C202CE03690395039903DF03F5043E050205A105E5062507DBFE62FE89FECEFF3BFFE1FFF800030008002100390042004E005F0061006F00700034007F008E00AD00AD00AF00BD00C400C500C900C900C900E3011C00ED00F800F901000112011A0132014D014D014E014F01660169019E01BA01BA01BE01E301EF01F602000200020902110217021C02530262026D028002D50280031B032A034A035A03AF03AF03C803D603FB03FB04050413041504470449008C046D049A049A04A604A804B204CF0539053E054E055605800589058C036305D105D6067E068E06B206EF06F00728074C076F078C00B400C900C000C10000000000000000000000000004012400AF0032006E0063014401620096014301A10161008A00740064018801EF01700028FF5D037E0347023000AA00BE007B0062009A007D0089035C00A1FFD803AA00D70093006C0000008000A70442001D0597001D00820030002A + 002A002A002A002A40292A292827262524232221201F1E1D1C1B1A191817161514131211100D0C0B0A090807060504030201002C4523466020B02660B004262348482D2C452346236120B02661B004262348482D2C45234660B0206120B04660B004262348482D2C4523462361B0206020B02661B02061B004262348482D2C45234660B0406120B06660B004262348482D2C4523462361B0406020B02661B04061B004262348482D2C0110203C003C2D2C20452320B0CD442320B8015A51582320B08D44235920B0ED51582320B04D44235920B09051582320B00D44235921212D2C20204518684420B001602045B04676688A4560442D2C01B9400000000A2D2C00B9000040000B2D2C2045B00043617D6818B0004360442D2C45B01A234445B01923442D2C2045B00325456164B050515845441B2121592D2C20B0032552582359212D2C69B04061B0008B0C6423648BB8400062600C642364615C58B0036159B002602D2C45B0112BB0172344B0177AE5182D2C45B0112BB01723442D2C45B0112BB017458CB0172344B0177AE5182D2CB002254661658A46B040608B482D2CB0022546608A46B040618C482D2C4B53205C58B002855958B00185592D2C20B0032545B019236A4445B01A23444565234520B00325606A20B009234223688A6A606120B0005258B21A401A4523614459B0005058B219401945236144592D2CB9187E3B210B2D2CB92D412D410B2D2CB93B21187E0B2D2CB93B21E7830B2D2CB92D41D2C00B2D2CB9187EC4E00B2D2C4B525845441B2121592D2C0120B003252349B04060B0206320B000525823B002253823B002256538008A63381B212121212159012D2C456920B00943B0022660B00325B005254961B0805358B21940194523616844B21A401A4523606A44B209191A45652345604259B00943608A103A2D2C01B005251023208AF500B0016023EDEC2D2C01B005251023208AF500B0016123EDEC2D2C01B0062510F500EDEC2D2C20B001600110203C003C2D2C20B001610110203C003C2D2C764520B003254523616818236860442D2C7645B00325452361682318456860442D2C7645B0032545616823452361442D2C4569B014B0324B505821B0205961442DB8002B2C4BB800095058B101018E59B801FF85B800441DB9000900035F5E2DB8002C2C2020456944B001602DB8002D2CB8002C2A212DB8002E2C2046B003254652582359208A208A49648A204620686164B004254620686164525823658A592F20B00053586920B000545821B040591B6920B000545821B0406559593A2DB8002F2C2046B00425465258238A592046206A6164B0042546206A61645258238A592FFD2DB800302C4B20B0032650585158B080441BB04044591B21212045B0C05058B0C0441B2159592DB800312C2020456944B0016020 + 20457D691844B001602DB800322CB800312A2DB800332C4B20B003265358B0801BB040598A8A20B0032653582321B0C08A8A1B8A235920B0032653582321B801008A8A1B8A235920B0032653582321B801408A8A1B8A235920B80003265358B0032545B8018050582321B8018023211BB003254523212321591B2159442DB800342C4B535845441B2121592DB800352C4BB800095058B101018E59B801FF85B800441DB9000900035F5E2DB800362C2020456944B001602DB800372CB800362A212DB800382C2046B003254652582359208A208A49648A204620686164B004254620686164525823658A592F20B00053586920B000545821B040591B6920B000545821B0406559593A2DB800392C2046B00425465258238A592046206A6164B0042546206A61645258238A592FFD2DB8003A2C4B20B0032650585158B080441BB04044591B21212045B0C05058B0C0441B2159592DB8003B2C2020456944B001602020457D691844B001602DB8003C2CB8003B2A2DB8003D2C4B20B003265358B0801BB040598A8A20B0032653582321B0C08A8A1B8A235920B0032653582321B801008A8A1B8A235920B0032653582321B801408A8A1B8A235920B80003265358B0032545B8018050582321B8018023211BB003254523212321591B2159442DB8003E2C4B535845441B2121592DB8003F2C4BB800095058B101018E59B801FF85B800441DB9000900035F5E2DB800402C2020456944B001602DB800412CB800402A212DB800422C2046B003254652582359208A208A49648A204620686164B004254620686164525823658A592F20B00053586920B000545821B040591B6920B000545821B0406559593A2DB800432C2046B00425465258238A592046206A6164B0042546206A61645258238A592FFD2DB800442C4B20B0032650585158B080441BB04044591B21212045B0C05058B0C0441B2159592DB800452C2020456944B001602020457D691844B001602DB800462CB800452A2DB800472C4B20B003265358B0801BB040598A8A20B0032653582321B0C08A8A1B8A235920B0032653582321B801008A8A1B8A235920B0032653582321B801408A8A1B8A235920B80003265358B0032545B8018050582321B8018023211BB003254523212321591B2159442DB800482C4B535845441B2121592DB800492C4BB800095058B101018E59B801FF85B800441DB9000900035F5E2DB8004A2C2020456944B001602DB8004B2CB8004A2A212DB8004C2C2046B003254652582359208A208A49648A204620686164B004254620686164525823658A592F20B00053586920B000545821B040591B6920B000545821B0406559593A2DB8004D2C2046B00425465258238A592046206A6164B0042546206A61645258238A592FFD2DB8004E2C4B20B0032650585158 + B080441BB04044591B21212045B0C05058B0C0441B2159592DB8004F2C2020456944B001602020457D691844B001602DB800502CB8004F2A2DB800512C4B20B003265358B0801BB040598A8A20B0032653582321B0C08A8A1B8A235920B0032653582321B801008A8A1B8A235920B0032653582321B801408A8A1B8A235920B80003265358B0032545B8018050582321B8018023211BB003254523212321591B2159442DB800522C4B535845441B2121592DB800532C4BB800095058B101018E59B801FF85B800441DB9000900035F5E2DB800542C2020456944B001602DB800552CB800542A212DB800562C2046B003254652582359208A208A49648A204620686164B004254620686164525823658A592F20B00053586920B000545821B040591B6920B000545821B0406559593A2DB800572C2046B00425465258238A592046206A6164B0042546206A61645258238A592FFD2DB800582C4B20B0032650585158B080441BB04044591B21212045B0C05058B0C0441B2159592DB800592C2020456944B001602020457D691844B001602DB8005A2CB800592A2DB8005B2C4B20B003265358B0401BB000598A8A20B0032653582321B0808A8A1B8A235920B0032653582321B800C08A8A1B8A235920B0032653582321B801008A8A1B8A235920B0032653582321B801408A8A1B8A235920B80003265358B0032545B8018050582321B8018023211BB003254523212321591B2159442DB8005C2C4B535845441B2121592D00000000020042000004D005BD00030007003FB800532BB800082FB800092FB8000810B80000D0B800002FB8000910B80003DCB80004DCB8000010B80007DC00BA0007000000562BBA0002000500562B3031331121112711211142048EB8FCE205BDFA43B8044DFBB30000000100AF0000018000DA000300264013012A030A0517171A01640019040564216365182B2B4EF44DFD4E456544E6003F4DED313037331523AFD1D1DADA000000000100970000061705BD001300CB405944014B03020601090316011903D7010513011C03140B1B0C57015803D401DB03D40BDB0C0A040A040D45028602045102970202290A280D380A380D4702570276020725640D0A0203120301020B0C120306081517171A040405B8019B400D0A1F030B06FD0C0102FD0D1F12B8019BB6130019147670182B4E10F43C4DFDE419F43939F4393918E4FD3C4E10456544E6003F173C3F3C1217394B5279B10D0CB801AAB40201020A0BB801AAB202020387054D2E7AFD047DC487052E7AFD047DC43130005D727101725D71132109012111231134363501230115141615112397011D01A601A3011ABD04FE5DC5FE5A05BE05BDFB2604DAFA4303632DD077FB2904D72D36DD34FC9D00000002009C0000052A05BD0009000A00764014370138060207 + 0117012701470158020507010202B8019B4017120606070207080301020806080A030A0A010608020302B8019BB505041A0C0708B8019B400A0900190B0CA0217670182B2B4EF43C4DFD3C4E10F63C4DFD3C11123939392F003F3F3C3F3C12393904872E2B877DC53130005D015D13330111331123011123019CEB02E6BDDFFD0FBE023A05BDFB5A04A6FA4304A5FB5B05BD000000010021000004C905BD00070034401A01061E00070204080917171A00FB0203250504FB0619088C5E182B4E10F44DF43CFD3CF44E456544E6003F3F3C4DFD3C3130011521112311213504C9FE11CAFE1105BDAFFAF2050EAF00000000030052FFDC04470449000F003B003C00DD40382A30010A100B1B0C1C2733481069096A10073908120C09031B320724091D100C1D3B2B022E293BB73B023B322A2512100705081C2722171CB8018A4023171D1F07271D2E0B021D350B3C073C3C1C1407292AA8241A3E1B291C4A0F2738193D3EBC0197002100B9019600182B2B4EF44DEDF4ED4E10F64DE4FDC412392F003F3FED3FED3FEDED1239111217395D1112392EED2EED01111239111739313043794028363715220001192501360F2100181E1B21001620142101212200370221001A1D1721011521172101002B2B2B01103C2B2B2B2B818181005D015D2416333237363D010E010F0106070615013637363534262322070607233E01333217161511141633323637150E0123222726270E012322263534363713010E724E5F59962168326D62315301B43E150C837A8D3B210AA805F7A3BD767517250C1E112A2C265D2A160937CE7C95BDBA978ACF5A2C49A691151C060E0D1C2F67016C082C182D5C534C2A53C69B484898FD971C220303850C06422340486AB58895A41301E40000020038FFDA03ED05C2000B001D00774032370E470E570EA704A91B05250814020F1D1000081D1D07130A021D170B052E132E102911121A1F0B271A191E1F87217242182B2B4EF44DED4E10F63C4DFDE4E4003FED3F3FED3F1139113931304379401A181C090A000101180B2600091C0B260000190226000A1B0826012B2B012B2B818181005D1216333236353426232206150017161711331123350E0123220035341233F692A17DA1A67A88A9018A53303DADA23FAC6FB3FEFAEFDE015FE8D7C9CBC3D0CA0237341E4B021DFA3E956358012DFAEA015700030048FFDA041A0449001C00240025010C40799708991AA71F03050E020F0514150E120F1514400C401408291A014B0BB603C701C603C71BD808D909D61FD823E817E8230BC711C712025C080521240F9A161D243906070716211D1C070A1D160B2507971CA71CB71CD71C0425160F251C05190A0C07110E270F1D27051A27242E072719192627D421A65D182B2B4EF44DFDE44E10F64DEDD4FD391239391112393912 + 392F5D003F3FED3FED12392F3CFD3C10ED1112393130437940460023040503050205010504061F26111012101310141004060C25221B24260020001D26011E1D09170726000B150E26010D0E231A2126011E0521260108180A26000D100A2600002B2B2B2B01103C2B2B103C2B2B2B2A2B2A8101715D00715D5D00161716171615211E013332373637330E01070607062322001110003301262726232206070102B4D638361210FCEF0590978D543014B1074F3152794152C8FEEA0118E2011F0B284AAD7CA805012304476B55516C4AA2A3C55D36473B912E501C100123010601020142FE26754682B38A01DC0000000003003DFE3B03E80449001F002D002E00B7404D36144908490958085909880CA91BA81DA927A62BB91B0B4008031622290EC40A221D1F070406291D190A121D0A0F2E072E2E051C032E162E2D29051A300C0E270D3E26271C192F3087217242182B2B4EF44DEDF4ED394E10F64DFDE4F51112392F003F3FED3FED3F3FED10ED1112393931304379402C23281A1E0B1124251026231E262600281A262600110B0E21000F0E0C0D251D222601271B2926000F0C122100002B2B2B01103C103C2B2B2B2B2B818181005D00171617353311140706212226273316171633323736270E0123222411100033002623220706151416333237363501027C5E3335A63C70FEC9ADEC0EB70D273D83CF40260336987DAEFEFB0107BA0144A47FBE4625937CC24F2CFED104423E234387FC32CC76DA9BA548273C9256DD5250F7011D010D012EFEA1C0B25F9AB5BDAF6384022D0000000200840000013B05BD000300070036401C07E50400010006030A0917171A06010229070300190809AA216242182B2B4EF43C4DC4FD3CC44E456544E6003F3F3C3F4DED3130133311231133152384B7B7B7B7042AFBD605BDCC0000000100890000013D05BD0003002940150000030A0517171A0102290003190405AA216242182B2B4EF43C4DFD3C4E456544E6003F3F31301333112389B4B405BDFA43000000020084000003ED04490019001A005E4031B706C706020406140627147606740705140C021418101D05070006180B0A1A071A1A000C29091A1C012E18291900191B1CB80106B3216242182B2B4EF43C4DFDE44E10F64DED12392F003F3F3C3F3FED1139390112393130005D015D1333153E01333217161511231134272623220706070E011511230184AB4CAA68E4502CB71D307E40294A382D1BB401A7042F985E529F57A2FD5102A3623C640D1642357169FDCF0449000003003BFFD90421044E000C0018001900904033980896109916A504A808A610A916B808C808D704E50EE9140C3A08061D18070C1D120B190719191502270F1A1B092715191A1BB80109B321725D182B2B4EF44DED4E10F64DED12392F003F3FED3FED3130437940 + 2C001704260B1309260000110226010717092600050D0226010A140C260001100C26000816062601030E0626012B2B2B2B012B2B2B2B2B81005D241235342726232206151416331200111002212200351000330702E085304CBAA59696A3D6011EFCFEF7DDFEFC0112E70674010FA6965E94FCB2ABE403DAFEECFEF4FEFDFEAE012BFC010E01400500020076FE5504250449000E00220074402CA908A717022808201C110E061D15070F060E1D1C0B220E0227181A240A2E102E2129220F1923248721BD5D182B2B4EF43C4DFDE4E44E10F64DED003F3FED3F3FED1139123931304379401C161B00051A260426001B022601051602260101190E260003170626012B2B012B2B2B2B8181005D243635342726232207061514171633013315363736333212111007062322272627112302C6A72546BABB45252546BAFE2EAF36405B7BB6FEB7749A7952303BB479D3D2805CB1BB649A7C57A603B18E49283CFEE9FEFDFEA2965F351E49FDDD00000100890000029204470011004F40262703260D37034704040E0810020E0911090C270805070006110A081A13012E10291100191213B80145B321627E182B2B4EF43C4DFDE44E10E6003F3F4D3FC4FDC411123939011112393130005D1333153E0133321617152E0123220615112389AB15A46B05181D101B108892B4042FB9369B0203BE0302AF72FD980000010017FFEF0209055A00180052B50D2E0AC00E01B8013F40250416391703060E0A111A17171A0301062900150E150F031F030203FC1619191AFC21677D182B2B4EF44DFD5D39C42F3CFD3C104E456544E6002F3F3F3C4DFD3CED10FDE431301333113315231114171633323637150E012322263511233533A8B6ABAB2615310D1E141F43277E5A9191055AFED593FD4538130B01028E0908816702C593000000020015FE4903E804490018001900CA406E8A158818A71803070617063812481258126707770377078C1498009705981597169717A800A8161048004B154717C915044405C605028705A600A601A705A8170524280518151716010006150C0B0F1D080E19071919161B17171A050001AF171518AF0C8F16191A1BD421677E182B2B194EF44DE418FD3939FD3939194E456544E61812392F003F3F4DFD3932192F183F3C3C3C123939014B5279401215150016166D121717180501016D12000018872E2B107DC418872E2B10087DC418015D71313071015D005D013306030207020623222627351E01333236373E0137013301030321C7268362429C809C26291E2F2A10322F10053E0EFE74CC011F01042F67FE91FEECAEFE66B40608A40D062118089424044EFC980382000001000000000000642C0B935F0F3CF500110800000000005F4D8F0000000000C621BCD6F865FC270B9108F900000009000100000000000000010000 + 0629FE2900000C01F865FCED0B9100010000000000000000000000000000001105120042023900AF06AA009705C7009C04E300210473005204730038047300480473003D01C7008401C70089047300840473003B0473007602AA0089023900170400001500000034005400E001360164022E029A0364040C043A045C04B8053005A205E8063806CE000100000011006F0009006B0007000200100010005D000007E80A1D00040001B800532BB800492BB8003F2BB800352BB8002B2B4118008001A6009001A600A001A600030069018B0079018B0089018B0099018B00040089018B0099018B00A9018B00B9018BB2040840BA0179001A014A400B041F5414191F180A0B1FD2B80106B49E1FD918E3BB0119000D00E10119B20D0009410A01A0019F0064001F01A50025017A00480028019AB3296C1F60410A01A9007001A9008001A90003008001A9000101A9B21E321FBE012C00250401001F0126001E0401B61FE7312D1FE531B80201B21FC227B80401B21FC11EB80201400F1FC01D9E1FBF1D671FBE1D671FAB27B80401B21FAA29B80401B61FA91D6C1F931EB8019AB21F921DB80101B21F911DB80101B21F751DB80201B61F6D29961F6431B8019AB21F4C96B802ABB21F391DB80156400B1F3638211F351DE41F2F27B80801400B1F2D1D4C1F2A31CD1F241DB802ABB21F201EB8012540111F1C1D931F3A1D4C1F1E1D45273A1D4527BB01AA019B002A019BB2254A1FBA019B0025017AB349293896B8017BB348283125B8017A403648289629482725294C1F252946272729482756C80784075B07410732072B072807260721071B071408120810080E080C080A08080807B801ACB23F1F06BB01AB003F001F01ABB308060805B801AEB23F1F04BB01AD003F001F01ADB70804080208000814B8FFE0B40000010014B801ABB41000000100B801ABB606100000010006B801ADB300000100B801AD401F04000001000410000001001002000001000200000001000002010802004A00B0018DB806008516763F183F123E113946443E113946443E113946443E113946443E113946443E11394660443E11394660443E11394660442B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B18011DB0964B5358B0AA1D59B0324B5358B0FF1D592B2B2B2B2B2B2B2B182B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B74752B2B2B65422B2B4B5279B376706A66456523456023456560234560B08B766818B080622020B16A704565234520B003266062636820B003266165B070236544B06A234420B176664565234520B003266062636820B003266165B066236544B0762344B10066455458B166406544B27640764523614459B36242725D456523456023456560234560B089766818B080622020B1 + 72424565234520B003266062636820B003266165B042236544B072234420B1625D4565234520B003266062636820B003266165B05D236544B0622344B1005D455458B15D406544B262406245236144592B2B2B2B456953427374B8019A2045694B20B02853B049515A58B020615944B801A6204569447500 + 00>] def + /CharStrings 17 dict dup begin + /.notdef 0 def +/period 1 def +/M 2 def +/N 3 def +/T 4 def +/a 5 def +/d 6 def +/e 7 def +/g 8 def +/i 9 def +/l 10 def +/n 11 def +/o 12 def +/p 13 def +/r 14 def +/t 15 def +/y 16 def + end readonly def + currentdict dup/FontName get exch definefont pop end + %APLsfntEnd + 42/FontType resourcestatus{pop pop true}{false}ifelse + {currentfile 0(%APLT1End\n)/SubFileDecode filter flushfile}if + /FontType 1 def + /FontMatrix [ 0.00048828125 0 0 0.00048828125 0 0 ] def + /FontBBox{-1947 -985 2961 2297}def + /UniqueID 4265107 def + currentdict currentfile eexec + 54544758EC884CF30C3CD503CEDBFF3839C47C3C3333173232E3FDBFF439491DB843E1924E63AA7726BBB0485AB56D93D8C0906F647A47162891E73FFC2A9873C4B1EAC5EEBDFFC4D06084FBD84139DF4583C6E259D10699944D1068C9C45667DCCCFB9B7EA01B606435EDCBD273ABAC093D14085CCBAC149BD7382E842CFE0D7FE4FD2EF589A2471F6074A80A8B675C2F7A50D63AC1EF90D787BADD11633CB01CF6EE3B37AAF9078A69AC4740E9B6525D78BBD839551A1CB80DB8682FA5E87591BBD6EE8B946063A2A58D9CA3685AB305495DC5FB5747EB8A9A059C4976C0FE4EEAB1D56FF47F1E9664ED9F4A7DAB763AF92B2F6CF2FA7DEC24710E0B9096E30F772BA7FEA9BDBE496C42ED2CEB58F54E80BDF57CE7B4DB6CCFE7182F43BF93CCA0767AF95D62C5D2C3DC6AE1E6D139F51A2C63432117F1714C5566572EE9967A715420ABDCD1D7BD74F8450B89965FCC81C6ACA565C5F3CCF91D430D1F953E4F1A645300A98DD8C47CD64555F08F422340A85404EAE0D3229C4F9336B9470CACBD6BBF3395104750A915CC6EAAC197668267B8C62D2764C8CD69FD937CA3C924D997A0EDE7964BEB9EA2F92EF70C5E5DA0AA5567765E71F2B911B3C5586B741EEB93F3C73016EC16BFF283758900903D203992EFC8BAFAF13579C602F38C91B322782D282AC603D1F5A452D1E7AE90B2FF78B151C731C717F5B5A2ECE57D3BD22888D365366CD700C67657245FE4E64FD98C2089406F6AF616EE272D822AE1D0F5FA55576E84178659053C4226366C59D493E2F81CDF74C3002839D80C2B5ABDCE3A50814C04252AAA91021570572224ABD2F2A153F6537407EE8ECD8C96FDC618185097902CB19308E83F0FCC973BF5EB37AA7CAC9E2D345166906EEF01368004DB3E66EABE8A1AA334394486DBFD9E2F38857F1CA92CA4B7D92AAD4AA49947EC32F7355C64EA3703662BCBC2455C17735C87E0FB6EB11BDD628D83F7023B09C2339AFCA11AD579A5309BA5B4849711EFCC5B3C19A39AEB3F9E2F4292534F193347AB1F2B0E52522AFA19F836150FEB5E132D4314A3522C72E45B4C25119120968B6A450E662DFB926221EDEE3EB1E4EA69EBA939F8BD52314F47516A6ADBD07B8CC083F61D4FB265CBF6EA1CFECAEDDBE388A62F6750510BD3C3D619D177610CF47FFE2E90AFB6991B57DD2866AA92B281ED7572C130C22713728BCA034C9CFF4F992D5D49B5DB05D0E50A3A67D069FE40408F357472BF03B2116542532448DF62919D220B7ED94E2AA460968588DB06A0D38B3518B8B1550C48859DF98F64E090C84CF5E5FB63E13E2B8E11AA81B73FEC64A1958FF4D598550680EE94C02B75453D8178329725425E609E62F68934BF74530C59077AB43FF4CD0333CFAACEC6646FB947ABF4133637426B8D6852C76F5EC71F54947FA1DAE1E8E6E3FFFF + 5CCE3C754EBC2E9A80BA8266A0A8AF901284A57A7925048EAE59A8219E029AB35036876593A2BD7C82E338287616FE7B54DCC7313AFFF2DFE9CD9C10A5451F3C4A92A04D3F369B4BFCFA11DA07387CC4D3790D2F8185EFE16D36A0CF1A280022EBE22D43DD0F9C808A22A4AD3C5B86EFEC43A3C6D559954343F1D2ADC96E6EDE39D973B19653C3D43ED489808A857D56EAC04BF463E2BCD75C58E4537F7CC9EC8968A5077EF2A8978D9B531B842DA24B16E73B8B932D3A7802DED2BBE480A1C42048D1259321B8F4B4C679FB30081797C85EB85F513A17D5B75DE5C94F8BF888CD82BE60C1C5F160EA1B7DB1CEF409AB63CF187B2244F20F3839AB626C3F033367B66CE62716B5651F9483333AA9EB1D6F3A26BEDAFC9146A9D7AD714BADF89F7E2600B3032FDD8D67AA113D6A292D49A478E0ECF912568F6BD4738B1503B274924DF1390BF5CE6E6C3703451735EDC6FCFD94AC2AD365A8B43FF9C876033C4E59DF1BB3EA0F95CBA35323C686F13CE00BB283ABB67CFE19691BA74AF8B79D53773044F2FB5328BF20D729D7085A4893520F03D0ABC5640A4DC7FA8BBE2913209157B99714561CF47C07C238931DC8E26750DFED271C6D9776D12911F0A551C34150564EA7C3DA305022EE35820AF012C1591BB80DDDB8AF30F99D574559B915AA202BBD4D9C067B0F87F44C089007CB647E53C1948115F0AE88FA1344A2AD72068F4097FF9F261C5CB33B887945DA437715ABE4A07A6F878DA78AF8C37AD518FCB891E958C2D9FA9C78069FA394DB88BEAA3170DBA03732F94A21EBE311E7EF9CA246B428637E618102727A9274072ADCA6702CE5376B49E67974DEC9B972C6E5FAC4045ECFAE3EE63CB4B79AD10263C8056FE297269027605C46815D6E94531079489F793146F5F4F64A3AFCECA516B0CCCFC7BDDF9684675906BC2795FF8895358E6CD37CEFC1F7AB3BB6AF5B6360F52447CE6E6B56465E6CFA1F7EC1C8DE216E4F10D4E113D01396AF70D1022C31CCCDC6FF68AB4FB2CE2D038FDF293376FFBBC3B33155ED465309FBA54F43B4253937FFE97C0E27B4633972E4771E5044E14145531FC5F50D82CCE4B0ACD819B59245CF27C2C857F0B5F5978A573A7A56110213501273D8C06A994F36714C2490043DD29C4710DEF22C8C52C40F229D1A3CCA056BCB8DEC02D2CAC413FEEA27A16C4EC232CA36285AEC54B0E3D848D2AF5C997C5013E420BA67DB6EF00038015AA2F0291FA366CDEA7F1F13950C2306D4386DE844AAAA7EDA2E658237606B25CCBB26B3A18DAE07CC77B1CD7B2D866FF0D0ABCC4956B49F8FA01FCA3DC3B9057E40E77034364384BF475E1A0C6DDF11F7FA86C6CCED121C9B49214EB69D5A4A035037CACCB66D4A7742725667BA5BF583A5B907672496A030616CC930439110463A48B038598FD7F151FE0E45074FA75B + 48D33276F12EFA677E9EBE869274371C2D77CA075F3C6650FD57C1B38742A7B6F26894B143A44C132AA90E020DF6769B673A6B131621B85B4AA3173513D9C1F031968BD2B968729C625697CCAAF4CCF5989D90F822D0C76DD4B6DA8C0A9C85C7AA33D81F2BE64277B4DA24423027E54D3E4F1D007B11CE98F27460568866F6A5FCAF36B9DF9CBC2A2774930BEF07D89CAEF0AC4D0C9ADDF6E277F3C9718AD09452D389B1926C82E432BE4947FCA23215711F58719897B05D95BFD984101520FB76F4944033A98C5FDBB27ACDF3208036EE43F8F076305AE88EA7E8AC34500540F5E18AB28232EED7427F012644BB277DBD856871B8F5C7CD3DDE91DB8A8C57DAE028BED132671CD888313A144539294FAB8A8BDDAE80D8D80C8CCAC8D783829A4CB9D331E752BA102D1C4F4133DC7277083C18B3825409BE632E46CA4DAE9665B119E2EDCA8BA33F6284E698F0FE0E8FF4BD88097AB5021B802A0D9B1508EFFBF5127D9C975D352823BDC6C600BF3DCF3B695B76F804092AA06E3A70B156D07A74FA9C2AE86A86C769241E88C3DF3FD1404C4AD63F594A6BD21EE9EE6DC90C8D56C01C0BB9E8142FD00E29EF46424BE63156A075BDECD5924AD3C89A9855DCAF5BDE0A3A9E7D8053075E5BA721A614DC894585344AECE6AFFFF477940A16C3E94DC42D0B3E588C94C90D85FFB1C9913111D6DA404479109A2140CB7DFC1AA7D975A28DE3E5E5584600093CBFE0C8F9F1C97E6EFA6BC2701DB89CD756898518F268CA33799D09B75310F00271C6D883CE2A74C8D74EA4F9479B0DCD94C8570C63ABA0F452F6302E9F39ECE33806EE2730384E86858F16B715A69E8CB3D4D3AC6DE5D0352D95E3AC85FECB640C716133B5A81E950430F52EDB80F087B45A133737837B8F686048A12821EB02517B5BE5A7A488C8A4F16A6E165830C49836C54C6FF92CE485FFAE63788560FBCDE7DFCA35224F08EF71D90FB3646369CEFF7EF1B18489A101464A42A076A963AD6DDC3C1818F298A56D069E + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + cleartomark end + %APLT1End + %RBIEndFontSubset +/Helvetica cguidfix +/F1.1/Helvetica renmfont +[ /CIEBasedABC 4 dict dup begin +/WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeABC [ { 1.8008 exp } bind { 1.8008 exp } bind { 1.8008 exp } bind ] def +/MatrixABC [ 0.4295 0.2318 0.0204 0.3278 0.6722 0.1111 0.1933 0.0960 0.9578 ] def +/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def +end ] /Cs1 exch/ColorSpace dr pop +[ /CIEBasedA 5 dict dup begin /WhitePoint [ 0.9505 1.0000 1.0891 ] def +/DecodeA { { 1.8008 exp } bind exec} bind +def +/MatrixA [ 0.9642 1.0000 0.8249 ] def +/RangeLMN [ 0.0 2.0000 0.0 2.0000 0.0 2.0000 ] def +/DecodeLMN [ { 0.9857 mul} bind { 1.0000 mul} bind { 1.3202 mul} bind ] def +end ] /Cs2 exch/ColorSpace dr pop +%%EndPageSetup +0.60000002 i +/Cs1 SC +1 1 1 sc +q +0 0 258 313 rc +11 274 m +91 274 l +91 233 l +11 233 l +h +11 274 m +f +1 J +1 j +0 0 0 sc +1 0 0 -1 -118 390 cm +129 116 m +209 116 l +209 157 l +129 157 l +h +129 116 m +S +/Cs2 SC +0 sc +0 i +1 0 0 -1 51 253.5 cm +/F1.1[ 12 0 0 -12 0 0]sf +-24.017578 -3 m +(!)s +-18.017578 -3 m +("#"$"%&)[ 6.673828 6.673828 6.673828 2.666016 6.673828 6.673828 0.000000 ] xS +-23.680664 11 m +('\(\)\(%*+)[ 9.996094 6.673828 6.673828 6.673828 6.673828 6.673828 0.000000 ] xS +0.60000002 i +/Cs1 SC +1 1 1 sc +CM +246.33331 277.23621 m +246.33331 285.00406 245.46548 285.96509 239.12622 293.65259 c +239.05923 293.73215 l +232.68646 301.5 232.62018 301.5 226.08002 301.5 c +217.37161 301.5 178 301.5 178 301.5 c +178 219.5 l +246.33331 219.5 l +246.33331 277.23621 l +h +246.33331 277.23621 m +f +0 0 0 sc +1 0 0 -1 -118 390 cm +364.33331 112.76379 m +364.33331 104.99594 363.46548 104.03491 357.12622 96.347412 c +357.05923 96.267853 l +350.68646 88.5 350.62018 88.5 344.08002 88.5 c +335.37161 88.5 296 88.5 296 88.5 c +296 170.5 l +364.33331 170.5 l +364.33331 112.76379 l +h +364.33331 112.36365 m +364.33331 104.99594 364.26636 104.99594 350.62018 104.99594 c +350.62018 104.99594 l +350.62018 88.580353 350.62018 88.5 344.48044 88.5 c +S +/Cs2 SC +0 sc +0 i +1 0 0 -1 212.16666 212.5 cm +-20.012695 4 m +(+,\)%-."/)[ 3.996094 2.666016 6.673828 6.673828 3.333984 6.673828 6.673828 0.000000 ] xS +0.60000002 i +/Cs1 SC +1 1 1 sc +CM +202.0585 293.44974 m +206.64719 290.71606 206.64719 286.28394 202.0585 283.55026 c +197.46985 280.81659 190.03015 280.81659 185.4415 283.55026 c +180.85281 286.28394 180.85281 290.71606 185.4415 293.44974 c +190.03015 296.18341 197.46985 296.18341 202.0585 293.44974 c +f +0 0 0 sc +1 0 0 -1 -118 390 cm +320.0585 96.550262 m +324.64719 99.283936 324.64719 103.71606 320.0585 106.44974 c +315.46985 109.18341 308.03015 109.18341 303.4415 106.44974 c +298.85281 103.71606 298.85281 99.283936 303.4415 96.550262 c +308.03015 93.816589 315.46985 93.816589 320.0585 96.550262 c +S +1 1 1 sc +CM +207.97516 238.44974 m +212.56384 235.71608 212.56384 231.28392 207.97516 228.55026 c +203.38651 225.81657 195.94681 225.81657 191.35815 228.55026 c +186.76947 231.28392 186.76947 235.71608 191.35815 238.44974 c +195.94681 241.18343 203.38651 241.18343 207.97516 238.44974 c +f +0 0 0 sc +1 0 0 -1 -118 390 cm +325.97516 151.55026 m +330.56384 154.28392 330.56384 158.71608 325.97516 161.44974 c +321.38651 164.18343 313.94681 164.18343 309.35815 161.44974 c +304.76947 158.71608 304.76947 154.28392 309.35815 151.55026 c +313.94681 148.81657 321.38651 148.81657 325.97516 151.55026 c +S +1 1 1 sc +CM +240.0585 265.44974 m +244.64719 262.71606 244.64719 258.28394 240.0585 255.55026 c +235.46985 252.81657 228.03015 252.81657 223.4415 255.55026 c +218.85281 258.28394 218.85281 262.71606 223.4415 265.44974 c +228.03015 268.18341 235.46985 268.18341 240.0585 265.44974 c +f +0 0 0 sc +1 0 0 -1 -118 390 cm +358.0585 124.55026 m +362.64719 127.28394 362.64719 131.71606 358.0585 134.44974 c +353.46985 137.18343 346.03015 137.18343 341.4415 134.44974 c +336.85281 131.71606 336.85281 127.28394 341.4415 124.55026 c +346.03015 121.81659 353.46985 121.81659 358.0585 124.55026 c +S +333.98935 117.8869 m +327.51068 113.11313 l +S +CM +203.07022 281.63248 m +207.73108 274.47171 l +211.29025 279.30206 l +h +203.07022 281.63248 m +f +0 J +0 j +1 0 0 -1 -118 390 cm +321.07022 108.36752 m +325.73108 115.52829 l +329.29025 110.69794 l +h +321.07022 108.36752 m +S +CM +222.42981 267.36749 m +217.76895 274.52826 l +214.20978 269.69794 l +h +222.42981 267.36749 m +f +1 0 0 -1 -118 390 cm +340.42981 122.63251 m +335.76895 115.47174 l +332.20978 120.30206 l +h +340.42981 122.63251 m +S +1 J +1 j +313.61386 118.82611 m +315.8028 139.17389 l +S +CM +198.65848 242.87199 m +200.78558 251.14697 l +194.82001 250.50522 l +h +198.65848 242.87199 m +f +0 J +0 j +1 0 0 -1 -118 390 cm +316.65848 147.12801 m +318.78558 138.85303 l +312.82001 139.49478 l +h +316.65848 147.12801 m +S +CM +194.75818 279.12799 m +192.63107 270.85303 l +198.59665 271.49478 l +h +194.75818 279.12799 m +f +1 0 0 -1 -118 390 cm +312.75818 110.87201 m +310.63107 119.14697 l +316.59665 118.50522 l +h +312.75818 110.87201 m +S +1 J +1 j +332.41394 144.08929 m +335.00275 141.91069 l +S +CM +223.12366 253.24045 m +215.07104 250.38466 l +218.93442 245.79396 l +h +223.12366 253.24045 m +f +0 J +0 j +1 0 0 -1 -118 390 cm +341.12366 136.75955 m +333.07104 139.61534 l +336.93442 144.20604 l +h +341.12366 136.75955 m +S +CM +208.29303 240.75957 m +216.34564 243.61536 l +212.4823 248.20605 l +h +208.29303 240.75957 m +f +1 0 0 -1 -118 390 cm +326.29303 149.24043 m +334.34564 146.38464 l +330.4823 141.79395 l +h +326.29303 149.24043 m +S +1 J +1 j +296 129.5 m +222.28563 135.43105 l +S +CM +92.893875 253.65237 m +104.62935 250.29704 l +103.94191 258.84085 l +h +92.893875 253.65237 m +f +0 J +0 j +1 0 0 -1 -118 390 cm +210.89388 136.34763 m +222.62935 139.70296 l +221.94191 131.15915 l +h +210.89388 136.34763 m +S +/Cs2 SC +0 sc +0 i +1 0 0 -1 152 267 cm +-12.008789 4 m +(+*\(.)[ 3.996094 6.673828 6.673828 0.000000 ] xS +0.60000002 i +/Cs1 SC +1 1 1 sc +CM +46 185 m +109 185 l +109 144 l +46 144 l +h +46 185 m +f +1 J +1 j +0 0 0 sc +1 0 0 -1 -118 390 cm +164 205 m +227 205 l +227 246 l +164 246 l +h +164 205 m +S +/Cs2 SC +0 sc +0 i +1 0 0 -1 77.5 164.5 cm +-24.017578 -3 m +(!)s +-18.017578 -3 m +("#"$"%&)[ 6.673828 6.673828 6.673828 2.666016 6.673828 6.673828 0.000000 ] xS +-14.34375 11 m +(0".*)[ 8.666016 6.673828 6.673828 0.000000 ] xS +0.60000002 i +/Cs1 SC +1 1 1 sc +CM +77 52 m +140 52 l +140 11 l +77 11 l +h +77 52 m +f +0 0 0 sc +1 0 0 -1 -118 390 cm +195 338 m +258 338 l +258 379 l +195 379 l +h +195 338 m +S +/Cs2 SC +0 sc +0 i +1 0 0 -1 108.5 31.5 cm +-24.017578 -3 m +(!)s +-18.017578 -3 m +("#"$"%&)[ 6.673828 6.673828 6.673828 2.666016 6.673828 6.673828 0.000000 ] xS +-14.34375 11 m +(0".*)[ 8.666016 6.673828 6.673828 0.000000 ] xS +0.60000002 i +/Cs1 SC +1 1 1 sc +CM +169.66666 129 m +232.66666 129 l +232.66666 88 l +169.66666 88 l +h +169.66666 129 m +f +0 0 0 sc +1 0 0 -1 -118 390 cm +287.66666 261 m +350.66666 261 l +350.66666 302 l +287.66666 302 l +h +287.66666 261 m +S +/Cs2 SC +0 sc +0 i +1 0 0 -1 201.16666 108.5 cm +-24.017578 -3 m +(!)s +-18.017578 -3 m +("#"$"%&)[ 6.673828 6.673828 6.673828 2.666016 6.673828 6.673828 0.000000 ] xS +-14.34375 11 m +(0".*)[ 8.666016 6.673828 6.673828 0.000000 ] xS +0.60000002 i +/Cs1 SC +0 0 0 sc +1 0 0 -1 -118 390 cm +203.41882 259.47879 m +218.5797 324.53235 l +S +CM +103.17363 54.337341 m +104.75356 66.440369 l +96.405823 64.494934 l +h +103.17363 54.337341 m +f +0 J +0 j +1 0 0 -1 -118 390 cm +221.17363 335.66266 m +222.75356 323.55963 l +214.40582 325.50507 l +h +221.17363 335.66266 m +S +CM +82.822296 141.66263 m +81.240784 129.54749 l +89.596863 131.4949 l +h +82.822296 141.66263 m +f +1 0 0 -1 -118 390 cm +200.8223 248.33737 m +199.24078 260.45251 l +207.59686 258.5051 l +h +200.8223 248.33737 m +S +1 J +1 j +239.60402 245.50504 m +275.07257 261.59311 l +S +CM +167.4805 123.68597 m +158.8429 132.30988 l +155.30222 124.50391 l +h +167.4805 123.68597 m +f +0 J +0 j +1 0 0 -1 -118 390 cm +285.4805 266.31403 m +276.8429 257.69012 l +273.30222 265.49609 l +h +285.4805 266.31403 m +S +CM +111.18567 149.2206 m +119.83191 140.58809 l +123.37613 148.40184 l +h +111.18567 149.2206 m +f +1 0 0 -1 -118 390 cm +229.18567 240.7794 m +237.83191 249.41191 l +241.37613 241.59816 l +h +229.18567 240.7794 m +S +1 J +1 j +261.95786 329.18051 m +284.16763 310.81561 l +S +CM +174.97516 86.467194 m +163.43655 82.487213 l +168.89865 75.881561 l +h +174.97516 86.467194 m +f +0 J +0 j +1 0 0 -1 -118 390 cm +292.97516 303.53281 m +281.43655 307.51279 l +286.89865 314.11844 l +h +292.97516 303.53281 m +S +CM +135.14148 53.529388 m +146.69162 57.513336 l +141.22406 64.12561 l +h +135.14148 53.529388 m +f +1 0 0 -1 -118 390 cm +253.14148 336.47061 m +264.69162 332.48666 l +259.22406 325.87439 l +h +253.14148 336.47061 m +S +1 J +1 j +[ +4 +4 +] 0 d +169 157 m +182.57994 192.10289 l +S +CM +68.7034 187.23834 m +68.576965 199.44341 l +60.582901 196.3508 l +h +68.7034 187.23834 m +f +0 J +0 j +[] 0 d +1 0 0 -1 -118 390 cm +186.7034 202.76166 m +186.57697 190.55659 l +178.5829 193.6492 l +h +186.7034 202.76166 m +S +1 J +1 j +[ +4 +4 +] 0 d +169 157 m +236.22632 195.15547 l +240.71504 197.70312 244.78224 200.93042 248.28337 204.72269 c +290.85989 250.83951 l +S +CM +180.61237 130.7634 m +176.00882 142.06767 l +169.71097 136.25333 l +h +180.61237 130.7634 m +f +0 J +0 j +[] 0 d +1 0 0 -1 -118 390 cm +298.61237 259.2366 m +294.00882 247.93233 l +287.71097 253.74667 l +h +298.61237 259.2366 m +S +1 J +1 j +[ +4 +4 +] 0 d +169 157 m +147.95767 235.15721 l +143.61098 251.30208 147.62175 268.55112 158.64548 281.12204 c +199.40558 327.60287 l +S +CM +88.940689 53.804443 m +84.627823 65.222778 l +78.183319 59.571442 l +h +88.940689 53.804443 m +f +0 J +0 j +[] 0 d +1 0 0 -1 -118 390 cm +206.94069 336.19556 m +202.62782 324.77722 l +196.18332 330.42856 l +h +206.94069 336.19556 m +S +ep +end +%%Trailer +%%EOF diff -r 7de82f13512b -r f07b74bc7485 paper/images/topologymanager.xbb --- a/paper/images/topologymanager.xbb Wed Jul 08 17:34:13 2015 +0900 +++ b/paper/images/topologymanager.xbb Sun May 08 18:07:17 2016 +0900 @@ -1,8 +1,8 @@ -%%Title: ./images/topologymanager.pdf +%%Title: ./topologymanager.pdf %%Creator: extractbb 20130405 %%BoundingBox: 0 0 258 313 %%HiResBoundingBox: 0.000000 0.000000 258.000000 313.000000 %%PDFVersion: 1.3 %%Pages: 1 -%%CreationDate: Tue May 5 17:15:05 2015 +%%CreationDate: Sun Nov 29 19:49:38 2015 diff -r 7de82f13512b -r f07b74bc7485 paper/sigos.aux --- a/paper/sigos.aux Wed Jul 08 17:34:13 2015 +0900 +++ b/paper/sigos.aux Sun May 08 18:07:17 2016 +0900 @@ -1,32 +1,23 @@ \relax -\newlabel{fig:RemoteDSM}{{1}{2}} -\newlabel{src:StartCodeSegment}{{1}{3}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}StartCodeSegmentの例}{3}} -\newlabel{src:CodeSegment}{{2}{3}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {2}CodeSegmentの例}{3}} -\newlabel{fig:vnc}{{2}{4}} -\newlabel{fig:treestructure}{{3}{4}} -\newlabel{src:flipAlice}{{3}{4}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {3}Aliceにおけるflip}{4}} -\newlabel{src:exampleFlip}{{4}{5}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {4}flipの使用例}{5}} -\newlabel{src:ReceiveData}{{5}{5}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {5}データを表現するクラス}{5}} -\newlabel{src:before}{{6}{5}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {6}通常のDSを扱うCSの例}{5}} +\citation{senkokenkyu} +\newlabel{fig:CS}{{1}{1}} +\citation{dot} +\newlabel{fig:Remote DSM}{{2}{2}} +\newlabel{src:topologyfile}{{1}{2}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}トポロジーファイルの例}{2}} +\newlabel{fig:topologymanager}{{3}{2}} +\citation{TreeVNC} +\citation{tightVNC} +\newlabel{fig:TreeVNC}{{4}{3}} +\newlabel{fig:DirectConnection}{{5}{3}} +\newlabel{fig:private}{{6}{4}} +\newlabel{fig:hostname}{{7}{4}} \citation{*} \bibstyle{ipsjunsrt} \bibdata{sigos} -\bibcite{Alice1}{1} -\bibcite{Alice2}{2} -\bibcite{Alice3}{3} -\bibcite{Alice4}{4} -\bibcite{Erlang}{5} -\newlabel{src:after}{{7}{6}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {7}圧縮したDSを扱うCSの例}{6}} -\newlabel{src:asClass}{{8}{6}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {8}asClassの処理}{6}} -\newlabel{src:CommandMessage}{{9}{6}} -\@writefile{lol}{\contentsline {lstlisting}{\numberline {9}CommandMessage}{6}} -\newlabel{tb:variable}{{1}{6}} -\gdef\ipsj@lastpage{6} +\bibcite{dot}{1} +\bibcite{TreeVNC}{2} +\bibcite{tightVNC}{3} +\bibcite{Alice1}{4} +\newlabel{fig:global}{{8}{5}} +\gdef\ipsj@lastpage{5} diff -r 7de82f13512b -r f07b74bc7485 paper/sigos.bbl --- a/paper/sigos.bbl Wed Jul 08 17:34:13 2015 +0900 +++ b/paper/sigos.bbl Sun May 08 18:07:17 2016 +0900 @@ -1,23 +1,19 @@ \begin{thebibliography}{1} +\bibitem{dot} +: Dot Language, \url{http://www.graphviz.org/}. + +\bibitem{TreeVNC} +{Tatsuki IHA and Shinji KONO}: 有線 LAN + 上のPC画面配信システムTreeVNCの改良,第56回プログラミング・シンポジウム + (2015). + +\bibitem{tightVNC} +: {TightVNC Software}, \url{http://www.tightvnc.com}. + \bibitem{Alice1} -{Yu SUGIMOTO and Shinji KONO}: 分散フレームワークAlice上のMeta - Computationと応用,琉球大学工学部情報工学科平成26年度学位論文(修士) (2014). - -\bibitem{Alice2} -{Kazuki AKAMINE and Shinji KONO}: - 分散フレームワークAliceの提案と実装,琉球大学工学部情報工学科平成24年度学位論文(修士) - (2012). - -\bibitem{Alice3} -{Nobuyasu OSHIRO, Yu SUGIMOTO, Shinji KONO and Tatsumi NAGAYAMA}: {Data Segment - の分散データベースへの応用},日本ソフトウェア科学会 (2013). - -\bibitem{Alice4} -{Yu SUGIMOTO and Shinji KONO}: 分散フレームワーク Alice の DataSegment - の更新に関する改良 (2013). - -\bibitem{Erlang} -柏原正三\:プログラミング言語Erlang入門,アスキー (2007). +{Nozomi Teruya and Shinji KONO}: + 分散フレームワークAliceのPC画面配信システムへの応用,第56回プログラミング・シンポジウム + (2015). \end{thebibliography} diff -r 7de82f13512b -r f07b74bc7485 paper/sigos.bib --- a/paper/sigos.bib Wed Jul 08 17:34:13 2015 +0900 +++ b/paper/sigos.bib Sun May 08 18:07:17 2016 +0900 @@ -1,40 +1,28 @@ @article{Alice1, - author = "{Yu SUGIMOTO and Shinji KONO}", - title = "分散フレームワークAlice上のMeta Computationと応用", - journal = "琉球大学工学部情報工学科平成26年度学位論文(修士) ", - month = "February", - year = 2014 + author = "{Nozomi Teruya and Shinji KONO}", + title = "分散フレームワークAliceのPC画面配信システムへの応用", + journal = "第56回プログラミング・シンポジウム ", + month = "Jan", + year = 2015 } -@article{Alice2, - author = "{Kazuki AKAMINE and Shinji KONO}", - title = "分散フレームワークAliceの提案と実装", - journal = "琉球大学工学部情報工学科平成24年度学位論文(修士) ", - month = "March", - year = 2012 + +@Misc{tightvnc, + title = "{TightVNC Software}", + howpublished = "\url{http://www.tightvnc.com}" } - -@article{Alice3, -author = "{Nobuyasu OSHIRO, Yu SUGIMOTO, Shinji KONO and Tatsumi NAGAYAMA}", -title = "{Data Segment の分散データベースへの応用}", -journal = "日本ソフトウェア科学会", -month = "September", -year = 2013 +@Misc{dot, + title = "Dot Language", + howpublished = "\url{http://www.graphviz.org/}" } -@article{Alice4, -author = "{Yu SUGIMOTO and Shinji KONO}", -title = "分散フレームワーク Alice の DataSegment の更新に関する改良", -month = "May", - year = 2013 +@article{TreeVNC, + author = "{Tatsuki IHA and Shinji KONO}", + title = "有線 LAN 上のPC画面配信システムTreeVNCの改良", + journal = "第56回プログラミング・シンポジウム", + month = "Jan", + year = 2015 } -@BOOK{Erlang, - title={プログラミング言語Erlang入門}, - author={柏原 正三}, - publisher={アスキー}, - year={2007}, - month={12}, -} diff -r 7de82f13512b -r f07b74bc7485 paper/sigos.blg --- a/paper/sigos.blg Wed Jul 08 17:34:13 2015 +0900 +++ b/paper/sigos.blg Sun May 08 18:07:17 2016 +0900 @@ -3,55 +3,53 @@ The top-level auxiliary file: sigos.aux The style file: ipsjunsrt.bst Database file #1: sigos.bib +Warning--I didn't find a database entry for "senkokenkyu" +Warning--Missing required argument author in dot +Warning--there's no number and/or volumeTreeVNC +Warning--Missing required argument pages in TreeVNC +Warning--Missing required argument author in tightVNC Warning--there's no number and/or volumeAlice1 Warning--Missing required argument pages in Alice1 -Warning--there's no number and/or volumeAlice2 -Warning--Missing required argument pages in Alice2 -Warning--there's no number and/or volumeAlice3 -Warning--Missing required argument pages in Alice3 -Warning--Missing required argument journal in Alice4 -Warning--there's no number and/or volumeAlice4 -Warning--Missing required argument pages in Alice4 -You've used 5 entries, +You've used 4 entries, 2207 wiz_defined-function locations, - 559 strings with 4651 characters, -and the built_in function-call counts, 780 in all, are: -= -- 44 -> -- 21 + 550 strings with 4444 characters, +and the built_in function-call counts, 523 in all, are: += -- 28 +> -- 10 < -- 0 -+ -- 10 -- -- 5 -* -- 57 -:= -- 127 -add.period$ -- 5 -call.type$ -- 5 ++ -- 6 +- -- 2 +* -- 36 +:= -- 78 +add.period$ -- 4 +call.type$ -- 4 change.case$ -- 0 chr.to.int$ -- 0 -cite$ -- 14 -duplicate$ -- 50 -empty$ -- 95 -format.name$ -- 9 -if$ -- 173 +cite$ -- 10 +duplicate$ -- 32 +empty$ -- 69 +format.name$ -- 4 +if$ -- 119 int.to.chr$ -- 0 -int.to.str$ -- 5 -missing$ -- 5 -newline$ -- 18 -num.names$ -- 5 -pop$ -- 17 +int.to.str$ -- 4 +missing$ -- 2 +newline$ -- 15 +num.names$ -- 2 +pop$ -- 16 preamble$ -- 1 purify$ -- 0 quote$ -- 0 -skip$ -- 39 +skip$ -- 28 stack$ -- 0 substring$ -- 0 swap$ -- 0 -text.length$ -- 1 +text.length$ -- 0 text.prefix$ -- 0 top$ -- 0 type$ -- 0 -warning$ -- 9 -while$ -- 5 -width$ -- 6 -write$ -- 36 -is.kanji.str$ -- 18 -(There were 9 warnings) +warning$ -- 6 +while$ -- 2 +width$ -- 5 +write$ -- 28 +is.kanji.str$ -- 12 +(There were 7 warnings) diff -r 7de82f13512b -r f07b74bc7485 paper/sigos.dvi Binary file paper/sigos.dvi has changed diff -r 7de82f13512b -r f07b74bc7485 paper/sigos.log --- a/paper/sigos.log Wed Jul 08 17:34:13 2015 +0900 +++ b/paper/sigos.log Sun May 08 18:07:17 2016 +0900 @@ -1,4 +1,4 @@ -This is e-pTeX, Version 3.1415926-p3.4-110825-2.6 (utf8.euc) (TeX Live 2013) (format=platex 2014.4.14) 6 MAY 2015 23:49 +This is e-pTeX, Version 3.1415926-p3.4-110825-2.6 (utf8.euc) (TeX Live 2013) (format=platex 2014.4.14) 8 MAY 2016 18:06 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -174,53 +174,44 @@ LaTeX Font Info: ... okay on input line 33. \c@lstlisting=\count111 LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <14.4> not available -(Font) Font shape `JT1/gt/m/n' tried instead on input line 81. +(Font) Font shape `JT1/gt/m/n' tried instead on input line 76. LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <14.4> not available -(Font) Font shape `JY1/gt/m/n' tried instead on input line 81. +(Font) Font shape `JY1/gt/m/n' tried instead on input line 76. +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <10.95> on input line 76. LaTeX Font Info: External font `cmex10' loaded for size -(Font) <10.95> on input line 81. +(Font) <8> on input line 76. +LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <12> not available +(Font) Font shape `JT1/gt/m/n' tried instead on input line 76. +LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <12> not available +(Font) Font shape `JY1/gt/m/n' tried instead on input line 76. LaTeX Font Info: External font `cmex10' loaded for size -(Font) <8> on input line 81. -LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <12> not available +(Font) <7> on input line 76. +LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <6> not available (Font) Font shape `JT1/gt/m/n' tried instead on input line 81. -LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <12> not available +LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <6> not available (Font) Font shape `JY1/gt/m/n' tried instead on input line 81. -LaTeX Font Info: External font `cmex10' loaded for size -(Font) <7> on input line 81. + + +LaTeX Warning: Citation `senkokenkyu' on page 1 undefined on input line 81. + LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <9> not available -(Font) Font shape `JT1/gt/m/n' tried instead on input line 104. +(Font) Font shape `JT1/gt/m/n' tried instead on input line 96. LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <9> not available -(Font) Font shape `JY1/gt/m/n' tried instead on input line 104. +(Font) Font shape `JY1/gt/m/n' tried instead on input line 96. +File: images/dsandcs2.pdf Graphic file (type pdf) + +LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <7> not available +(Font) Font shape `JT1/gt/m/n' tried instead on input line 106. +LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <7> not available +(Font) Font shape `JY1/gt/m/n' tried instead on input line 106. [1 ] File: images/remote_datasegment.pdf Graphic file (type pdf) -LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <7> not available -(Font) Font shape `JT1/gt/m/n' tried instead on input line 126. -LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <7> not available -(Font) Font shape `JY1/gt/m/n' tried instead on input line 126. - -Overfull \hbox (10.66351pt too wide) in paragraph at lines 139--140 -[]\OT1/cmtt/m/n/9 void update(String managerKey, String key, - [] - - -Overfull \hbox (1.21362pt too wide) in paragraph at lines 144--145 -[]\OT1/cmtt/m/n/9 void take(String managerKey, String key) - [] - - -Overfull \hbox (1.21362pt too wide) in paragraph at lines 149--150 -[]\OT1/cmtt/m/n/9 void peek(String managerKey, String key) - [] - -[2] (./source/StartCodeSegment.java -LaTeX Font Info: Font shape `JT1/mc/bx/n' in size <8> not available -(Font) Font shape `JT1/gt/m/n' tried instead on input line 1. -LaTeX Font Info: Font shape `JY1/mc/bx/n' in size <8> not available -(Font) Font shape `JY1/gt/m/n' tried instead on input line 1. +(./source/TopologyFile.dot LaTeX Font Info: Try loading font information for OMS+cmr on input line 1. (/usr/local/texlive/2013/texmf-dist/tex/latex/base/omscmr.fd @@ -228,41 +219,62 @@ ) LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <8> not available (Font) Font shape `OMS/cmsy/m/n' tried instead on input line 1. -) -(./source/TestCodeSegment.java) -Overfull \hbox (10.66351pt too wide) in paragraph at lines 212--213 -[]\OT1/cmtt/m/n/9 void setKey(String managerKey, String key) - [] - -[3] -File: images/vnc.pdf Graphic file (type pdf) - -File: images/treestructure.pdf Graphic file (type pdf) - (./source/flip.java) -(./source/Sort.java) [4] (./source/ReceiveData.java) -(./source/beforeCompress.java) (./source/afterCompress.java) -(./source/asClass.java -LaTeX Font Info: Try loading font information for OML+cmr on input line 1. +LaTeX Font Info: Try loading font information for OML+cmr on input line 2. (/usr/local/texlive/2013/texmf-dist/tex/latex/base/omlcmr.fd File: omlcmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions ) LaTeX Font Info: Font shape `OML/cmr/m/n' in size <8> not available -(Font) Font shape `OML/cmm/m/it' tried instead on input line 1. -) [5] -(./source/CommandMessage.java) -Overfull \hbox (17.32811pt too wide) in paragraph at lines 353--376 - [] +(Font) Font shape `OML/cmm/m/it' tried instead on input line 2. +) +File: images/topologymanager.pdf Graphic file (type pdf) + + [2] +File: images/treestructure.pdf Graphic file (type pdf) + +File: images/directConnection.pdf Graphic file (type pdf) + + + +LaTeX Warning: `h' float specifier changed to `ht'. + +File: images/privateconnect.pdf Graphic file (type pdf) + + +LaTeX Warning: `h' float specifier changed to `ht'. + + +Overfull \hbox (23.2414pt too wide) in paragraph at lines 241--242 +[]\OT1/cmtt/m/n/9 Topology Manager(B) \JY1/mc/m/n/9 は \OT1/cmtt/m/n/9 RootNode +(B) \JY1/mc/m/n/9 に \OT1/cmtt/m/n/9 Topology [] -(./sigos.bbl) [6] (./sigos.aux) ) +[3] +File: images/somehostname.pdf Graphic file (type pdf) + + +LaTeX Warning: `h' float specifier changed to `ht'. + +File: images/globalconnect.pdf Graphic file (type pdf) + + +LaTeX Warning: `h' float specifier changed to `ht'. + +[4] +Overfull \hbox (4.30293pt too wide) in paragraph at lines 301--302 +[]\JY1/mc/m/n/9 もし接続が確立されなければ 、 \OT1/cmtt/m/n/9 Global Topology + [] + +(./sigos.bbl) [5 + +] (./sigos.aux) ) Here is how much of TeX's memory you used: - 3060 strings out of 494008 - 41610 string characters out of 6154472 - 302061 words of memory out of 5000000 - 6475 multiletter control sequences out of 15000+600000 - 17796 words of font info for 69 fonts, out of 8000000 for 9000 + 2916 strings out of 494008 + 39808 string characters out of 6154472 + 159061 words of memory out of 5000000 + 6349 multiletter control sequences out of 15000+600000 + 18095 words of font info for 70 fonts, out of 8000000 for 9000 745 hyphenation exceptions out of 8191 - 33i,12n,58p,606b,1469s stack positions out of 5000i,500n,10000p,200000b,80000s + 33i,11n,58p,277b,1468s stack positions out of 5000i,500n,10000p,200000b,80000s -Output written on sigos.dvi (6 pages, 57400 bytes). +Output written on sigos.dvi (5 pages, 33568 bytes). diff -r 7de82f13512b -r f07b74bc7485 paper/sigos.pdf Binary file paper/sigos.pdf has changed diff -r 7de82f13512b -r f07b74bc7485 paper/sigos.tex --- a/paper/sigos.tex Wed Jul 08 17:34:13 2015 +0900 +++ b/paper/sigos.tex Sun May 08 18:07:17 2016 +0900 @@ -33,26 +33,23 @@ \begin{document} % 和文表題 -\title{分散フレームワークAliceの圧縮機能} +\title{分散システム向けのTopology Managerの改良} % 英文表題 -\etitle{} +\etitle{Improvement of Topology Manager for distributed system} % 所属ラベルの定義 \affilabel{1}{琉球大学工学部情報工学科\\Information Engineering, University of the Ryukyus.} -\affilabel{2}{琉球大学大学院理工学研究科情報工学専攻 \\Interdisciplinary Information Engineering, Graduate School of Engineering and Science, University of the Ryukyus.} \affilabel{3}{琉球大学工学部情報工学科\\Information Engineering, University of the Ryukyus.} % 和文著者名 \author{ 照屋 のぞみ\affiref{1}\and - 杉本 優\affiref{2}\and 河野 真治\affiref{3} } % 英文著者名 \eauthor{ Nozomi TERUYA\affiref{1}\and - Yu SUGIMOTO\affiref{2}\and Shinji KONO\affiref{3} } @@ -65,16 +62,14 @@ % 和文概要 \begin{abstract} - 当研究室ではデータをData Segment、タスクをCode Segmentという単位で分割して記述する手法を提唱しており、それに基づく並列分散フレームワークAliceを開発している。Aliceが分散プログラムを記述する能力を有することは、Aliceを用いた水族館の例題、分散データベースJungle、木構造画面共有システムAliceVNCによって確認された。しかし、AliceVNCを作成するには、通信時にData Segmentを圧縮形式で扱える機能が必要である。本研究では、Data SegmentにObject型、MessagePackを使ったByteArray型、圧縮されたByteArray型の3つの表現を同時に持つメタ計算の設計と実装を行うことで、Data Segmentの多態性を用いた圧縮機能を実現した。 - - +Aliceでは、スケーラブルな分散プログラムを信頼性高く記述できる環境を実現するために、ComputationとMetaComputationによる階層化を採用している。 +分散環境の構築等の複雑な処理をAliceがMeta Computationとして提供することで、仕様変更を抑え、変更前の信頼性を保ったまま拡張可能にする。 +本研究では、分散トポロジー管理のMeta ComputationであるTopology ManagerにNAT越えを実現するための設計を行う。 +そしてその設計がAliceアプリケーション同士の接続も可能にすることを示す。 \end{abstract} % 英文概要 仮 \begin{eabstract} - Alice is a framework for distributed programming, which uses Data Segment and Code Segment as programming units. We checked Alice has an ability to write distributed program using aquarium example, distributed database Jungle and screen sharing system AliceVNC. - -In this paper, we add Data Segment compression on Alice. These representations are combine with the Data Segment using Meta Data Segment. In this way, Alice Data Segment supports polymorphism of the implementations. \end{eabstract} % 表題などの出力 @@ -83,308 +78,233 @@ % 本文はここから始まる \section{研究背景と目的} -当研究室ではデータをData Segment、タスクをCode Segmentという単位で分割して記述する並列分散フレームワークAliceの開発を行っている。 -当研究室の先行研究であるFederated Lindaは、タプルというIDで番号付けられたデータの集合を相互接続された複数のタプルスペース(LindaServer)に出し入れするプログラミングモデルである。 -並列指向プログラミング言語Erlangでは、プロセスと呼ばれる独立性を備えたスレッドにPidという識別子 -が対応しており、Pidを指定してメッセージを送受信する手法を用いて並列分散環境を実現している。 -これら2つは分散環境の構築等の処理は全てユーザ側のプログラムに記述しなければいけなかった。 - -一方、AliceではString型のkeyに対応するQueueにデータが入っており、タスクはkeyを指定して必要なデータのみを出し入れするモデルを採用している。そのためタスクとデータの依存関係を分かりやすく記述でき、依存しない部分の並列実行が行える。さらに、AliceではCode SegmentをComputationとMeta Computationに分割して考え、分散環境の構築に必要な処理をMeta Computationとして提供することで、スケーラブルな分散プログラムを信頼性高く記述できる環境を実現している。 +当研究室ではデータをData Segment、タスクをCode Segmentという単位で記述する分散フレームワークAlice\cite{senkokenkyu}の開発を行っている。 +Aliceではスケーラブルな分散プログラムを信頼性高く記述できる環境を実現する。 +ここで言う信頼性とは、定められた環境下で安定して仕様に従った動作を行うことを指す。 -先行研究の水族館の例題等において、Alice が分散プログラムを記述する能力を有することは確認された。 -だが、実用的な分散プログラムを作成するためには、受け取ったデータをそのまま転送したい場合や圧縮されたデータ形式で通信を行いたい場合がある。 +Aliceでは、処理をComputationとMeta Computationに階層化し、コアな仕様と複雑な例外処理に分離する。 +そして分散環境の構築に必要な処理をMeta Computationとして提供する。 +プログラマはコアな仕様の変更を抑えつつプログラムの挙動変更ができるため、信頼性の高い分散アプリケーションの記述が可能となる。 -本研究では、 実用的なアプリケーションである画面共有システムTreeVNCをAliceで実装するにあたり必要となった圧縮機能を Meta Computation として実装した。 -プログラムに Alice の制御を行うメタプログラムを記述することにより、 -扱うデータの形式を元のコードを大きく変更することなく指定することができる。 -そして、データの多態性を実現し、扱いたいデータの状態に合わせてDataSegmentManagerを切り替えることで、ノード間通信における自由度の向上を図った。 +Meta ComputationのひとつであるTopologyManagerは、アプリケーション外部からトポロジーの構成・管理をサポートする。 +本研究では、分散アプリケーションにおける課題であるNAT越えの機能をTopologyManagerで実現するための設計を行う。 +同時にAliceVNCやAliceChatといったAlice上でのアプリケーションを連携するための設計を行うことで、 +相互干渉なく容易にアプリケーションの接続・拡張ができる環境の提供を目指す。 \section{分散フレームワーク Alice の概要} \subsection*{[Data SegmentとCode Segment]} -AliceはデータをData Segment、(以下DS)タスクをとCode Segment(以下CS)という単位に分割してプログラミングを行う。 -DSはAliceが内部にもつデータベースによって管理されている。DSに対応する一意のkeyが設定されており、そのkeyを用いてデータベースを操作する。 - -CSは実行に必要なDSが揃うと実行されるという性質を持ち、入力されたDSに応じた結果が出力される。 -CSを実行するために必要な入力DSはInputDS、CSが計算を行った後に出力されるDSはOutput DSと呼ばれる。データの依存関係にないCSは並列実行が可能であるため、並列度を上げるためにはCSの処理内容を細かく分割して依存するデータを少なくするのが望ましい。 +AliceではCode Segment(以下CS)とData Segment(以下DS)の依存関係を記述することでプログラミングを行う。 +CSは実行に必要なDSが全て揃うと実行される。CSを実行するために必要な入力されるDSのことをInputDS、CSが計算を行った後に出力されるDSのことをOutput DSと呼ぶ。 +データの依存関係にないCSは並列実行が可能である(図 \ref{fig:CS} )。 +CSの実行においてDSが他のCSから変更を受けることはない。そのためAliceではデータが他から変更され整合性がとれなくなることはない。 -\subsection*{[Data Segment]} -Aliceはデータを分割して記述する。その分割されたデータをDSと呼ぶ。 -Javaの実装ではMessagePackで特定のオブジェクトにマッピングされ、マッピングされたクラスを通してアクセスされる。 +\begin{figure}[htbp] + \begin{center} + \includegraphics[width=60mm]{images/dsandcs2.pdf} + \end{center} + \caption{CodeSegmentの依存関係 } + \label{fig:CS} +\end{figure} -CSの実行においてDSは占有されるため、Aliceではデータが他から変更され整合性がとれなくなることはない。 +AliceはJavaで実装されており、DSはJava Objectに相当する。プログラマがCSを記述する際は、CodeSegmentクラスを継承する。 \subsection*{[Data Segment Manager]} -DSは実際にはqueueに保存される。queueには対になるkeyが存在し、keyの数だけqueueが存在する。 -このkeyを指定してDSの保存、取得を行う。queueの集合体はデータベースとして捉えられる。このデータベースをAliceではDS Manager(以下DSM)と呼ぶ。DSMにはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。Remote DSMは他のノードのLocal DSMのproxyであり、接続しているノードの数だけ存在する。(図\ref{fig:RemoteDSM})Remote DSMに対して書き込むと対応するノードのLocal DSMに書き込まれる。 +DSは数値や文字列などの基本的なデータの集まりを指し、Aliceが内部にもつデータベースによって管理されている。このデータベースをAliceではDS Manager(以下DSM)と呼ぶ。 +CSは複数のDSMを持っている。DS Managerには対になるString型のkeyが存在し、それぞれのManagerにkeyを指定してDSにアクセスする。 +DSMにはLocal DSMとRemote DSMが存在する。Local DSMは各ノード固有のデータベースである。 +Remote DSMは他ノードのLocal DSMに対応するproxyであり、接続しているノードの数だけ存在する(図 \ref{fig:Remote DSM} )。 +他ノードのLocal DSMに書き込みたい場合はRemote DSMに対して書き込めば良い。 -\begin{figure}[htbp] -\begin{center} -\includegraphics[width=70mm]{images/remote_datasegment.pdf} -\end{center} -\caption{Remote DSMは他のノードのLocal DSMのproxy } -\label{fig:RemoteDSM} +\begin{figure}[h] + \begin{center} + \includegraphics[width=60mm]{images/remote_datasegment.pdf} + \end{center} + \caption{Remote DSMは他のノードのLocal DSMのproxy } + \label{fig:Remote DSM} \end{figure} -\subsection*{[Data Segment API]} -以下のData Segment APIを用いてデータベースにアクセスする。 -putとupdateはDSを追加する際に、peekとtakeはDSを取得する際に使用する。 - -\begin{itemize} -\item {\ttfamily void put(String managerKey, String key, \\ Object val)} -\end{itemize} -DSをqueueに追加するためのAPIである。第一引数で指定したDSMの中の、第二引数に対応するqueueに対してDSを追加している。 -\begin{itemize} -\item {\ttfamily void update(String managerKey, String key, \\ Object val)} -\end{itemize} -updateもqueueに追加するためのAPIである。putとの違いは、先頭のDSを削除してからDSを追加することである。そのためAPI実行前後でqueueの中にあるDSの個数は変わらない。 - -\begin{itemize} -\item {\ttfamily void take(String managerKey, String key)} -\end{itemize} -takeはDSを読み込むためのAPIである。読み込まれたDSは削除される。要求したDSが存在しなければ、CSの待ち合わせ (Blocking)が起こる。putやupdateによりDSに更新があった場合、takeが直ちに実行される。 - -\begin{itemize} -\item {\ttfamily void peek(String managerKey, String key)} -\end{itemize} -peekもDSを読み込むAPIである。takeとの違いは読み込まれたDSが削除されないことである。 +\subsection*{[ComputationとMeta Computation]} +Aliceでは、計算の本質的な処理をComputation、Computationとは直接関係ないが別のレベルでそれを支える処理をMeta Computationとして分けて考える。 +AliceのComputationは、keyによりDSを待ち合わせ、DSが揃ったCSを並列に実行する処理と捉えられる。 +それに対して、AliceのMeta Computation は、Remoteノードとの通信時のトポロジーの構成やデータの表現形式の選択の処理と言える。 +つまりこれらの処理はAliceのComputationを支えているComputationとみなすことができる。 - -\subsection*{[Data Segmentの表現]} -DSの表現にはMessagePack for Javaを利用している。 -\begin{itemize} -\item {\ttfamily DSは一般的なJavaのクラスオブジェクト} -\item {\ttfamily MessagePackを用いて変換したbyte[]で表現されたバイナリオブジェクト} -\end{itemize} -の2種類があり、LocalDSMにputされた場合は一般的なJavaのクラスオブジェクトとしてenQueueされる。 -RemoteDSMにputされた場合は通信時にbyteArrayに変換されたバイナリオブジェクトがenQueueされる。 +Aliceの機能を追加するということはプログラマ側が記述するComputationを支えるためのMeta Computationを追加することと言い換えられる。 +AliceではMeta Computationとして分散環境の構築等の機能を提供するため、プログラマはCSを記述する際にトポロジー構成や切断、再接続という状況を予め想定した処理にする必要はない。 +プログラマは目的の処理だけ記述し、切断や再接続が起こった場合の処理をMeta Computationとして指定する。 +このようにプログラムすることで、通常処理と例外処理を分離することができるため、仕様の変更を抑えたシンプルなプログラムを記述できる。 -\subsection*{[Code Segment]} -Alice上で実行されるタスクの単位がCSである。ユーザーはCSを組み合わせることでプログラミングを行う。CSをユーザーが記述する際に、内部で使用するDSの作成を記述する。 - -Input DS と Output DSはCSに用意されているAPIを用いて作成する。 -Input DSは、LocalかRemoteか、またkeyを指定する必要がある。CSは、記述したInput DSが全て揃うとThread poolに送られ、実行される。 - -Output DSもLocalかRemoteか、またkeyを指定する必要がある。 -Inputの場合はsetKeyを呼ぶ際、Outputの場合はput(またはupdate)の際にノードとkeyの指定を行っている。 -しかし、どの時点でノードとkeyの指定を行えばよいか、どのようなAPIを用意するべきかは、議論の余地がある。 - -\subsection*{[Code Segmentの記述方法]} -CSをユーザーが記述する際にはCSを継承して記述する(ソースコード \ref{src:StartCodeSegment} ,\ref{src:CodeSegment})。 -継承することによりCode Segmentで使用するAPIを利用する事ができる。 +\subsection*{[Topology Manager]} +Aliceでは、ノード間の接続管理やトポロジーの構成管理を、Topology ManagerというMeta Computationが提供している。 +このTopology ManagerもCS/DSを用いて実装されている。 +プログラマはトポロジーファイルを用意し、Topology Managerに読み込ませるだけでトポロジーを構成することができる。 +トポロジーファイルはDOT Language\cite{dot}という言語で記述される。 +DOT Languageとは、プレーンテキストを用いてデータ構造としてのグラフを表現するためのデータ記述言語の一つである。 +ソースコード\ref{src:topologyfile}は3台のノードでリングトポロジーを組むときのトポロジーファイルの例である。 \begin{table}[html] -\lstinputlisting[label=src:StartCodeSegment, caption=StartCodeSegmentの例]{source/StartCodeSegment.java} -\lstinputlisting[label=src:CodeSegment, caption=CodeSegmentの例]{source/TestCodeSegment.java} + \lstinputlisting[label=src:topologyfile, caption=トポロジーファイルの例]{source/TopologyFile.dot} \end{table} -Alice には、Start CS (ソースコード \ref{src:StartCodeSegment})というC の main に相当するような最初に実行される CS がある。 -Start CSはどのDSにも依存しない。つまりInput DSを持たない。 -このCSをmainメソッド内でnewし、executeメソッドを呼ぶことで実行を開始させることができる。 +また、DOT Languageファイルはdotコマンドを用いてグラフの画像ファイルを生成することができる。そのため、記述したトポロジーが正しいか可視化することが可能である。 -ソースコード \ref{src:StartCodeSegment}は、5行目で次に実行させたいCS(ソースコード \ref{src:CodeSegment})を作成している。8行目でOutput DSMを通してLocal DSMに対してDSをputしている。 -Output DSMはCSの{\tt ods}というフィールドを用いてアクセスする。 -Output DSMは{\tt put}と{\tt update}を実行することができる。 -TestCodeSegmentはこの"cnt"というkeyに対して依存関係があり、8行目でupdateが行われるとTestCodeSegmentは実行される。 +Topology Managerはトポロジーファイルを読み込み、参加を表明したクライアント(以下、Topology Node)に接続するべきクライアントのIPアドレスやポート番号、接続名を送る(図\ref{fig:topologymanager})。 -ソースコード\ref{src:CodeSegment}は、0から10までインクリメントする例題である。 -2行目で取得されたDSが格納される受け皿を作る。Input DSMがもつcreateメソッド使うことで作成できる。 -\begin{itemize} -\item {\ttfamily Receiver create(CommandType type)} -\end{itemize} - -引数にはCommandTypeが取られ、指定できるCommandTypeは{\tt PEEK}または{\tt TAKE}である。 -Input DSM はCSの{\tt ids}というフィールドを用いてアクセスする。 - -4行目から6行目はコンストラクタである。コンストラクタはオブジェクト指向のプログラミング言語で新たなオブジェクトを生成する際に呼び出されて内容の初期化を行う関数である。 - -TestCodeSegmentのコンストラクタが呼ばれた際には、 -\begin{enumerate} -\item TestCodeSegmentが持つフィールド変数Receiver input1の定義が行われる。 -\item 次にCSのコンストラクタが呼ばれ、CSが持つフィールド変数の定義と初期化が行われる。 -\item {\tt ids.create(CommandType.TAKE)}が行われ、input1の初期化が行われる。 -\item 最後にTestCodeSegmentのコンストラクタの5行目が実行される。 -\end{enumerate} +\begin{figure}[h] +\begin{center} +\includegraphics[width=40mm]{images/topologymanager.pdf} +\end{center} +\caption{Topology Managerが記述に従いトポロジーを構成} +\label{fig:topologymanager} +\end{figure} -5行目はInput DSMがもつsetKeyメソッドによりLocal DSMからDSを取得している。 -\begin{itemize} -\item \verb+void setKey(String managerKey, String key)+ -\end{itemize} -setKeyメソッドにより、どのDSMのあるkeyに対してpeekまたはtakeコマンドを実行させるかを指定できる。コマンドの結果がレスポンスとして届き次第CSは実行される。 - -runメソッドの内容としては10行目で取得されたDSをInteger型に変換してcountに代入している。 -16行目で もう一度TestCodeSegmentのCSが作られる。 -17行目でcountの値をインクリメントしてLocal DSMに値を追加する。 -13行目が終了条件であり、countの値が10になれば終了する。 - -\subsection*{[ComputationとMeta Computation]} -AliceのComputationは、keyで指し示されるDSを待ち合わせてCSを実行させると定義できる。 -それに対して、AliceのMeta Computationは、AliceのComputationを支えているComputationのプログラミングと定義できる。 - -例えば、トポロジーを指定するAPIはMeta Computationである。Aliceが動作するためにはトポロジーを決める必要がある。つまりトポロジーの構成はAliceのComputationを支えているComputationとみなすことができる。トポロジーが決定するとそのトポロジーを構成する計算が行われる。トポロジーを指定するAPIはその構成の計算をプログラミングして変更するものである。 -他にも再接続の動作を決めるAPIや切断時の動作を決めるAPIはMeta Computationである。 +トポロジーファイルでlavelとして指定した名前はRemote DSMの名前としてTopology Nodeに渡される。 +そのため、Topology NodeはTopology ManagerのIPアドレスさえ知っていれば自分の接続すべきノードのデータを受け取り、ノード間での正しい接続を実現できる。 -プログラマーはCSを記述する際にトポロジーや切断、再接続という状況を予め想定した処理にする必要はない。プログラマーは目的の処理だけ記述する。そして、切断や再接続が起こった場合の処理を記述しMeta Computationで指定する。 -このようにプログラムすることで、通常処理と例外処理を分離することができるため、シンプルなプログラムを記述できる。 - - -\subsection*{[Meta Data Segment]} -DSは、アプリケーションに管理されているデータのことである。アプリケーションを構成するCSによってその値は変更される。 -それに対してMeta DSは、分散フレームワークAliceが管理しているデータである。Aliceを構成するCSによってのみ、その値は変更される。一部のMeta DSはアプリケーションに利用することができる。 - -例えば、"start"というkeyをもつMeta DSは、ノードがStart CSを実行可能かどうかの状態を表す。他にも"\_CLIST"というkeyでは、利用可能なRemote DSの一覧が管理されている。ユーザーはこの一覧にある名前を指定することで、動的にDSの伝搬などを行うことができる。 +また、実際の分散アプリケーションでは参加するノードの数が予め決まっているとは限らない。 +そのためTopology Managerは動的トポロジーにも対応している。 +トポロジーの種類を選択してTopology Managerを立ち上げれば、あとは新しいTopology Nodeが参加表明するたびに、 +Topology ManagerからTopology Nodeに対して接続すべきTopology Nodeの情報が渡され接続処理が順次行われる。 +そしてTopology Managerが持つトポロジー情報が更新される。 +現在Topology Managerでは動的なトポロジータイプとしてBinary Tree とStarに対応している。 -また、Input DSに付随しているものもある。Input DSはCS内部でReceiverという入れ物に格納される。ユーザーは、Receiverに対して操作することでDSを入手できる。 -このReceiverには、fromというフィールドがあり、このDSを誰がputしたという情報が入っている。この情報をデータの伝搬する際に利用することで、DSをputしたノードに送り返すことを防ぐことができる。 - -Meta DSはDS同様にDS APIを用いて取得できる。 - -\subsection*{[Meta Code Segment]} -CSはアプリケーションを動作させるために必要なタスクであり、ユーザーによって定義される。 -それに対してMeta CSはAliceを構成するタスクである。つまりMeta CSの群はAliceのComputationと言い換えることができる。一部のみユーザーが定義をすることができ、Aliceの挙動を変更することができる。 - +さらに、Topology Managerではトポロジーの管理だけでなく、ノードとの接続状態を常に確認するMeta Computation(Keep Alive)や、 +切断・再接続時の処理を指定できるMeta Computationが用いられている。 +そのため、構成したノード間の接続が途切れても再構成することができる。 - -\section{AliceVNC} -当研究室では授業向け画面共有システムTreeVNCの開発を行っている。 -授業でVNCを使う場合、1つのコンピュータに多人数が同時につながるため、性能が大幅に落ちてしまう(図\ref{fig:vnc})。 -この問題をノード同士を接続させ、木構造を構成することで負荷分散を行い解決したものがTreeVNCである(図\ref{fig:treestructure})。 +\section{TreeVNCのNAT越え} +TreeVNCとは、当研究室で開発を行っている授業向け画面共有システムである\cite{TreeVNC}。 +オープンソースのVNCであるTightVNC \cite{tightVNC} をもとに作られている。 +授業でVNCを使う場合、1つのコンピュータに多人数が同時につながるため、性能が大幅に落ちてしまう。 +この問題をノード同士を接続させ、木構造を構成することで負荷分散を行い解決したものがTreeVNCである(図 \ref{fig:TreeVNC})。 - Aliceが実用的なアプリケーションを記述する能力をもつことを確認するために、TreeVNCをAliceを用いて実装したAliceVNCの作成を行った。 - -\begin{figure}[htbp] - \begin{center} - \includegraphics[width=60mm]{images/vnc.pdf} - \end{center} - \caption{VNCの構造 } - \label{fig:vnc} +\begin{figure}[h] +\begin{center} +\includegraphics[width=50mm]{images/treestructure.pdf} +\end{center} +\caption{TreeVNC の構造} +\label{fig:TreeVNC} \end{figure} -\begin{figure}[htbp] - \begin{center} - \includegraphics[height=50mm]{images/treestructure.pdf} - \end{center} - \caption{TreeVNC, AliceVNCの構造 } - \label{fig:treestructure} +TreeVNCは授業向けのシステムであるため、プライベートネットワーク内のみでの使用を前提に作られている。 +しかし学外から授業に参加したい場合、教室にカメラを設置するだけではスクリーンに写した教員のPC画面までは見ることは困難であるため、 +学外のノードからでも画面配信のTreeに入りたい要求が生まれた。 +つまり、NATを越えた通信に対応する必要がある。 +そのために、TreeVNCでは画面配信側ネットワークがグローバルIPアドレスを持っていることを前提とし、 +別ネットワーク上のノードが画面配信側ルートノードのIPアドレスを指定して直下の子になるDirect Connectionを実装した(図 \ref{fig:DirectConnection})。 + +\begin{figure}[h] +\begin{center} +\includegraphics[width=70mm]{images/directConnection.pdf} +\end{center} +\caption{TreeVNC のDirect Connection} +\label{fig:DirectConnection} \end{figure} +しかし、この方法だと複数の別ネットワークからの接続があった場合、ルートノードに大量に子が接続されてしまうためルートノードに接続台数分の負荷がかかってしまう。 +また、別ネットワーク側のノードが途中で画面を配信したい場合(Server Change Request)がある。 +TreeVNCではソケットの反転が考案されたが、ソースコードが膨大で拡張した場合どこに影響するかわからないほど複雜であったため、実装までに至らなかった。 + +さらに、どちらのノードもプライベートネットワークであった場合、TreeVNCではNAT越えのための中間サーバをプログラマが作らなければならない。 + +このように、NATは分散アプリケーション構築における課題の1つでもあるが、その実装は容易ではない。 +AliceのTopology ManagerにもNAT越えをサポートする機能が必要であると考えた。 -\section{Aliceの新機能} -実用的なアプリケーションであるTreeVNCをAlice上で実装することで、Aliceに必要な機能を洗い出した。 -\subsection*{[flip機能]} -Data Segment APIのput、updateを呼ぶとOutput Data Segmentが毎回新しく作成され、出力するデータのコピーが行われる。しかし、Input Data Segmentとして取得したデータをそのまま子ノードにOutput Data Segmentとして出力する場合、コピーを行なうのは無駄である。 +\section{AliceVNCとAliceChatの接続} +Aliceが実用的なアプリケーションを実装するのに充分な性能があるかをテストする例題として、Alice上にTreeVNCとStarトポロジーのChatが実装された。 +それぞれをAliceVNC、AliceChatと呼ぶ。 +これらは全く別のアプリケーションであるが、お互いに接続させたい要求がでてきた。 +例えば、AliceChat上にAliceVNCの画面のスナップショットを載せたい場合や、AliceVNC上にAliceChatの内容をコメントとして画面に流したい場合である。 -そこで、Input Data SegmentとOutput Data Segmentを交換する機能をflip機能として実装した。 -ソースコード\ref{src:exampleFlip}のようにInput Data SegmentであるReceiverをコピーせずにflipメソッドに引数として渡すことで、コピーのオーバーヘッドをなくしている。 -TreeVNCでは親ノードから受け取った画面データをそのまま子ノードに配信するため、Meta Computationとしてflip機能が有用である。 -\begin{table}[html] -\lstinputlisting[label=src:flipAlice, caption=Aliceにおけるflip]{source/flip.java} -\end{table} +このように別トポロジーのアプリケーション間で相互干渉なく接続するための機能が必要であると考えた。 + -\begin{table}[html] -\lstinputlisting[label=src:exampleFlip,caption=flipの使用例]{source/Sort.java} -\end{table} +\section{Topology Managerの拡張設計} +\subsection*{[別トポロジー間での接続]} +AliceVNCとAliceChatのように同一ネットワーク内での別アプリケーションの接続を実現する仕組みが図 \ref{fig:private} である。 -\subsection*{[Data Segmentの表現の追加(圧縮機能)]} -TreeVNCでは画面配信の際、データを圧縮してノード間通信を行っている。 -そのため、AliceVNCにも圧縮されたデータ形式を扱える機能が必要だと考えた。 -しかし、ただデータを圧縮する機構を追加すればいいわけではない。 - -AliceVNCでは、ノードは受け取った画面データを描画すると同時に、子ノードのRemote DS Managerに送信する。 -ノードはDSを受信するとそれを一度解凍して画面を表示し、再圧縮して子ノードに送信する。 -しかし、受け取ったデータを自分の子ノードに対して送信する際には、解凍する必要はない。 -圧縮状態のまま子ノードに送信ができれば、解凍・再圧縮するオーバーヘッドを無くすことができる。 - -そこで、1つのData Segmentに対し複数の表現を持たせることで、必要に応じた形式でDSを扱うことを可能にした。 -DSを扱うReceiveData.classに、次の3種類の表現を同時に持つことができる。 +\begin{figure}[h] +\begin{center} +\includegraphics[width=70mm]{images/privateconnect.pdf} +\end{center} +\caption{プライベートネットワーク内での接続} +\label{fig:private} +\end{figure} \begin{enumerate} - \item 一般的なJavaのクラスオブジェクト - \item MessagePack for Javaでシリアライズ化されたバイナリオブジェクト - \item 2を圧縮したバイナリオブジェクト + \item {\ttfamily 接続を要求する側のいずれかのNodeが接続先Topology Manager(A)のIPアドレスを自身を管理するTopology Manager(B)のDSMに保存} + \item {\ttfamily Topology Manager(B)はRootNode(B)にTopology Manager(A)への接続をするよう要求} + \item {\ttfamily RootNode(B)がTopology Manager(A)と接続し、自身の接続先ノードの情報を取得} + \item {\ttfamily 取得した情報をもとにRootNode(A)に接続} \end{enumerate} -ソースコード\ref {src:ReceiveData}はReceiveData.classが持つ表現であり、{\tt val}に(1) 一般的なJavaのクラスオブジェクト の表現でデータ本体が保存される。{\tt messagePack}には(2) シリアライズ化されたバイナリオブジェクトが保存され、通常のRemoteDSMへの通信にこの表現が扱われる。そして、{\tt zMessagePack}には(3) 圧縮されたバイナリオブジェクトが保存される。 -\begin{table}[html] -\lstinputlisting[label=src:ReceiveData, caption=データを表現するクラス]{source/ReceiveData.java} -\end{table} +これでAliceChat側にAliceVNCのスナップショット情報を送ることができる。 + +また、(1)の手順を踏むことでAliceChatのトポロジーの再構成時にAliceVNCへ再接続も自動で行うことができる。 +TopologyManagerはNode間の接続が切れるとトポロジーを再構成するため、RootNode(B)が落ちると、それを検知したTopology Manager(B)が他のノードをRootNodeとして配置し接続をやり直す。 +どのノードが落ちてもTopology Manager(B)が接続先Topology Manager(A)の情報を保持したままなので、再び(2)以降の手順でAliceVNCの接続が行われる。 + +今までのAliceでは、ノードに対してTopology Managerは1つと決められていた。 +Topology Managerと各ノードのやり取りをするのは、ノードごとに実行されるTopology NodeというMeta Computationである。 +Topology Managerは接続されたnodeの情報(nodeNameとIPアドレスのHashMap)を"nodeTable"というKeyに対応するDSとして保存している。 +そしてTopology NodeはTopology Managerから割り当てられたnodeNameを"hostname"というKeyに保存する。 +つまり、接続するTopology Managerが増えればTopoloyNodeに割り当てられるnodeNameも増えるため、今までのように"hostname"という1つのKeyだけでは対応できない。 +TopologyNodeが複数のTopologyManagerに対応できるようにしなければならない。 -また、圧縮状態を持つDSを扱うDSMとしてLocalとRemoteそれぞれにCompressed Data Segment Managerの追加した。Compressed DSMの内部では、put/updateが呼ばれた際にReceiveData.classが圧縮表現を持っていればそれを使用し、持っていなければその時点で圧縮表現を作ってput/updateを行う。 -ソースコード\ref{src:before}はRemoteからDSをtakeしインクリメントしてLocalにputすることを10回繰り返す例題である。これをDSを圧縮形式で行いたい場合、ソースコード\ref{src:after}のように指定するDSM名の先頭に"compressed"をつければCompressed DSM内部の圧縮Meta Computationが走りDSを圧縮状態で扱うようになる。 +そこで、Meta Computationとして、通常のLocal DSMとは別にTopology ManagerごとのLocal DSMを立ち上げる方法が考えられる(図 \ref{fig:hostname})。 +それぞれのTopology Managerに対応するDSMを作り、そこにそれぞれのnodeNameを格納することで、 +DSMを切り替えるだけでTopologyNodeの仕様は変えずに複数のTopology Managerに対応できる。 + +\begin{figure}[h] +\begin{center} +\includegraphics[width=60mm]{images/somehostname.pdf} +\end{center} +\caption{Topology Nodeは複数のnodeNameを持つ} +\label{fig:hostname} +\end{figure} + +しかし、現在のAliceのコードではDSMを管理するclassがstatic classであったため、複数のLocal DSMを持つことができない。 +staticを取り除くためにはAliceの大部分のコードを修正する必要がある。 +そのため、現状ではKeyである"hostname"のあとにTopology Managerごとの番号を付け加えることで、KeyによってTopology Managerごとの対応を分けている。 +Aliceの再設計を行う際にはstatic classのない実装を行い、DSM切り替えによる方式を実現したい。 -\begin{table}[html] -\lstinputlisting[label=src:before, caption=通常のDSを扱うCSの例]{source/beforeCompress.java} -\end{table} - -\begin{table}[html] -\lstinputlisting[label=src:after,caption=圧縮したDSを扱うCSの例]{source/afterCompress.java} -\end{table} - -これによりユーザは指定するDSMを変えるだけで、他の計算部分を変えずに圧縮表現を持つDSを扱うことができる。ノードは圧縮されたDSを受け取った後、そのまま子ノードにflipすれば圧縮状態のまま送信されるので、送信の際の再圧縮がなくなる。 -画面表示の際はReceiveData.class内の{\tt asClass()}(ソースコード\ref {src:asClass} )を使うことで適切な形式でデータを取得できる。 -{\tt asClass()}はDSを目的の型にcastするメソッドであり、ReceiveData.classが圧縮表現だけを持っている場合はこのメソッド内で解凍してcastを行っている。 -これによりDSの表現を必要になったときに作成できる。 +\subsection*{[別ネットワーク間での接続]} +TreeVNCでお互いにプライベートネットワークのノードの接続をするには、NAT越えのための中継プログラムをプログラマが書かなければならなかった。 +しかし、Aliceではトポロジー管理をアプリケーションから分離しているため、グローバルIPアドレスを持ったTopology Manager(以下、Global Topology Manager)を立てるだけで良い。 +プライベートネットワークのTopology Manager(以下、Private Topology Manager)はプライベートネットワーク内で木を構成し、 +Global Topology Managerは各ネットワークのroot nodeで木を構成する。つまり、3次元的な木構造が構成される。 +つまり複数のTopology Managerを立ち上げるだけで、Topology Manager自体の「参加表明のあったノードを木構造」に接続するという仕様は変更しなくとも良い。 -\begin{table}[html] -\lstinputlisting[label=src:asClass, caption=asClassの処理]{source/asClass.java} -\end{table} - -\subsection*{[Aliceの通信プロトコルの変更]} -2章 [Data Segmentの表現]で述べたように、Remoteからputされたデータは必ずシリアライズ化されておりbyteArrayで表現される。 -しかし、データの表現に圧縮したbyteArrayを追加したため、RemoteからputされたbyteArrayが圧縮されているのかそうでないのかを判断する必要がある。 - -そこで、Aliceの通信におけるヘッダにあたるCommandMessage.class(ソースコード\ref {src:CommandMessage})にシリアライズ状態表すフラグと、圧縮状態を表すフラグを追加した。 -これによってputされたDSMはフラグに応じた適切な形式でReceiveData.class内にDSを格納できる。 -また、CommandMessage.classに圧縮前のデータサイズも追加したことで、適切な解凍が可能になった。 - -\begin{table}[html] -\lstinputlisting[label=src:CommandMessage, caption=CommandMessage]{source/CommandMessage.java} -\end{table} +NAT越えのため以下の機能をTopology ManagerのMeta Computation、つまりMeta Meta Computationとして取り入れる。 -\begin{table}[htbp] -\caption{CommandMessageの変数名の説明} -\label{tb:variable} +\begin{figure}[h] \begin{center} -\begin{tabular} {|l|l|} - \hline - 変数名&説明\\ - \hline - type&CommandType {\tt PEEK, PUT}などを表す\\ - \hline - seq&\shortstack{Data Segmentの待ち合わせを行っている\\Code Segmentを表すunique number }\\ - \hline - key&どのKeyに対して操作を行うか指定する\\ - \hline +\includegraphics[width=70mm]{images/globalconnect.pdf} +\end{center} +\caption{NATを越えた接続} +\label{fig:global} +\end{figure} - quickFlag&SEDAを挟まずCommandを処理を行うかを示す\\ - \hline - serialized&データ本体のシリアライズ状態を示す\\ - \hline +\begin{enumerate} + \setcounter{enumi}{-1} + \item {\ttfamily 接続を受け入れる側(Network1)のルートノードがグローバルIPアドレスを持ったGlobal Topology Managerを立ちあげておく} + \item {\ttfamily 接続を要求する側(Network2)のいずれかのNodeがGlobal Topology ManagerのIPアドレスを自身を管理するTopology ManagerのDSMに保存} + \item {\ttfamily Topology ManagerはRootNodeにGlobal Topology Managerへの接続をするよう要求} + \item {\ttfamily RootNodeがGrobal Topology Managerと接続し、自身のIPアドレスを送る。Global Topology Managerが受け取ったIPアドレスがプライベートアドレスであれば、ノードに対してNATの外側IPアドレス/ポート番号を要求されるので、RootNodeはそれに返答。} + \item {\ttfamily UDP hole punchingが行われ、Network1のroot nodeとNetwork2のroot nodeが接続される} + \item {\ttfamily もし接続が確立されなければ、Global Topology Managerがデータ中継用のCSを用意しデータを中継する} +\end{enumerate} - compressed&データ本体の圧縮状態を示す\\ - \hline - - dataSize&圧縮前のデータサイズを表す\\ - \hline - -\end{tabular} -\end{center} -\end{table} +Meta Meta ComputationがNAT越えをサポートするため、Topology ManagerもTopology Nodeも接続要求のあったノードがグローバルかプライベートかを気にせず扱える。 \section{まとめ} -並列分散フレームワークAliceの計算モデルと実装について説明を行い、Aliceにおけるプログラミング手法を述べた。 - -Aliceが実用的なアプリケーションを記述するために必要なMeta Computationとして、データの多態性を実現し、指定するDSMの切り替えで扱うデータ表現を変えるようにした。 -これにより、必要に応じた形式を扱うことができ、ユーザが記述するComputation部分を大きく変えずに自由度の高い通信を行うことが可能になった。 -同様の手法を用いれば、圧縮形式以外にも暗号形式・JSON形式などの複数のデータ表現をユーザに扱いやすい形で拡張することができる。 - -今後の課題としては、圧縮機能をAliceVNCで用いることで有効性を測る必要がある。また、AliceのMeta ComputationにProxy機能を実装することで、TreeVNCでは実装が困難であったNAT越えの機能を提供できると期待される。 \nocite{*} %\nocite{opencl} diff -r 7de82f13512b -r f07b74bc7485 paper/source/.DS_Store Binary file paper/source/.DS_Store has changed diff -r 7de82f13512b -r f07b74bc7485 paper/source/TopologyFile.dot --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/source/TopologyFile.dot Sun May 08 18:07:17 2016 +0900 @@ -0,0 +1,8 @@ +digraph test{ + node0 -> node1[label="right"] + node0 -> node2[label="left"] + node1 -> node2[label="right"] + node1 -> node0[label="left"] + node2 -> node0[label="right"] + node2 -> node1[label="left"] +}