From 7a7adf4bac6a75e24c48f06205127c18ae5bd778 Mon Sep 17 00:00:00 2001 From: emeraldzhang Date: Fri, 12 Jul 2024 16:34:51 +0100 Subject: [PATCH 01/12] adding xgboost --- go.mod | 2 + go.sum | 6 ++ oceanprefilter/oceanprefilter.go | 3 +- oceanprefilter/xg_boost_dump.json | 142 ++++++++++++++++++++++++++++++ oceanprefilter/xgboost.go | 99 +++++++++++++++++++++ 5 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 oceanprefilter/xg_boost_dump.json create mode 100644 oceanprefilter/xgboost.go diff --git a/go.mod b/go.mod index 0bf5989..6d1f18a 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( cloud.google.com/go/iam v1.1.1 // indirect cloud.google.com/go/storage v1.30.1 // indirect git.sr.ht/~sbinet/gg v0.3.1 // indirect + github.com/Elvenson/xgboost-go v0.1.4 // indirect github.com/a8m/envsubst v1.4.2 // indirect github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect github.com/aybabtme/uniplot v0.0.0-20151203143629-039c559e5e7e // indirect @@ -28,6 +29,7 @@ require ( github.com/campoy/embedmd v1.0.0 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/chewxy/math32 v1.10.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect diff --git a/go.sum b/go.sum index c8c9a41..f95b336 100644 --- a/go.sum +++ b/go.sum @@ -52,6 +52,8 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/CPRT/roboclaw v0.0.0-20190825181223-76871438befc h1:X6Ptoxdi1w0lofv51zchUBBvULiL97ruSjtTRa/SL5Q= github.com/CPRT/roboclaw v0.0.0-20190825181223-76871438befc/go.mod h1:1nLByU34wsr4qNJ4yrfxuGFmIl/0/eAuB8VAiGK0GHs= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/Elvenson/xgboost-go v0.1.4 h1:mX5BNTYZB+j4plNsqRldfne7VXhbdpr48UeP7EJwW+c= +github.com/Elvenson/xgboost-go v0.1.4/go.mod h1:jfDQZeX6eYYJYM+SIlMGIVf8Frl8DQ8lIfMECPx7ws8= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= @@ -155,6 +157,8 @@ github.com/chewxy/hm v1.0.0 h1:zy/TSv3LV2nD3dwUEQL2VhXeoXbb9QkpmdRAVUFiA6k= github.com/chewxy/hm v1.0.0/go.mod h1:qg9YI4q6Fkj/whwHR1D+bOGeF7SniIP40VweVepLjg0= github.com/chewxy/math32 v1.0.8 h1:fU5E4Ec4Z+5RtRAi3TovSxUjQPkgRh+HbP7tKB2OFbM= github.com/chewxy/math32 v1.0.8/go.mod h1:dOB2rcuFrCn6UHrze36WSLVPKtzPMRAQvBvUwkSsLqs= +github.com/chewxy/math32 v1.10.1 h1:LFpeY0SLJXeaiej/eIp2L40VYfscTvKh/FSEZ68uMkU= +github.com/chewxy/math32 v1.10.1/go.mod h1:dOB2rcuFrCn6UHrze36WSLVPKtzPMRAQvBvUwkSsLqs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -1463,6 +1467,7 @@ golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4X golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201031021630-582c62ec74d0/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -1637,6 +1642,7 @@ gorgonia.org/vecf32 v0.9.0 h1:PClazic1r+JVJ1dEzRXgeiVl4g1/Hf/w+wUSqnco1Xg= gorgonia.org/vecf32 v0.9.0/go.mod h1:NCc+5D2oxddRL11hd+pCB1PEyXWOyiQxfZ/1wwhOXCA= gorgonia.org/vecf64 v0.9.0 h1:bgZDP5x0OzBF64PjMGC3EvTdOoMEcmfAh1VCUnZFm1A= gorgonia.org/vecf64 v0.9.0/go.mod h1:hp7IOWCnRiVQKON73kkC/AUMtEXyf9kGlVrtPQ9ccVA= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/oceanprefilter/oceanprefilter.go b/oceanprefilter/oceanprefilter.go index 0f51756..01bf3c8 100644 --- a/oceanprefilter/oceanprefilter.go +++ b/oceanprefilter/oceanprefilter.go @@ -226,7 +226,8 @@ func run(ctx context.Context, rc runConfig, trigger *atomic.Bool, currImg *atomi currImg.Store(&img) // this function is where the decision happens //isTriggered, err := mlFilter(ctx, img, rc) - isTriggered, newHists, err := histogramChangeFilter(oldHists, img, rc) + //TODO: change this to inference! + isTriggered, err := inference(img, rc) if err != nil { rc.logger.Infow("resetting histograms", "error", err.Error()) if rc.motionTrigger { diff --git a/oceanprefilter/xg_boost_dump.json b/oceanprefilter/xg_boost_dump.json new file mode 100644 index 0000000..dd4e90e --- /dev/null +++ b/oceanprefilter/xg_boost_dump.json @@ -0,0 +1,142 @@ +[ + { "nodeid": 0, "depth": 0, "split": "f327", "split_condition": 110.783333, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f14", "split_condition": 199.883331, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f436", "split_condition": 108.216667, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": 0.96825397 }, + { "nodeid": 8, "leaf": -0 } + ]}, + { "nodeid": 4, "leaf": -0 } + ]}, + { "nodeid": 2, "depth": 1, "split": "f628", "split_condition": 107.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.800000012 }, + { "nodeid": 6, "leaf": 0.200000003 } + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f327", "split_condition": 110.783333, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f14", "split_condition": 199.883331, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f436", "split_condition": 108.216667, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": -0.96825397 }, + { "nodeid": 8, "leaf": -0 } + ]}, + { "nodeid": 4, "leaf": -0 } + ]}, + { "nodeid": 2, "depth": 1, "split": "f628", "split_condition": 107.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.800000012 }, + { "nodeid": 6, "leaf": -0.200000003 } + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f401", "split_condition": 111.400002, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.570969284 }, + { "nodeid": 6, "leaf": -0.183552772 } + ]}, + { "nodeid": 4, "leaf": -0.117992692 } + ]}, + { "nodeid": 2, "leaf": -0.571418047 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f401", "split_condition": 111.400002, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.570969284 }, + { "nodeid": 6, "leaf": 0.183552772 } + ]}, + { "nodeid": 4, "leaf": 0.117992707 } + ]}, + { "nodeid": 2, "leaf": 0.571418047 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f410", "split_condition": 110.650002, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.466001004 }, + { "nodeid": 6, "leaf": -0.0753230453 } + ]}, + { "nodeid": 4, "leaf": -0.0537564792 } + ]}, + { "nodeid": 2, "leaf": -0.356984079 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f410", "split_condition": 110.650002, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.466000974 }, + { "nodeid": 6, "leaf": 0.0753231421 } + ]}, + { "nodeid": 4, "leaf": 0.0537564307 } + ]}, + { "nodeid": 2, "leaf": 0.356984049 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f284", "split_condition": 101.400002, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.347005337 }, + { "nodeid": 2, "depth": 1, "split": "f300", "split_condition": 95.5, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "leaf": -0.381696463 }, + { "nodeid": 4, "depth": 2, "split": "f656", "split_condition": 104.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.073965922 }, + { "nodeid": 6, "leaf": 0.385791391 } + ]} + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f284", "split_condition": 101.400002, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.347005308 }, + { "nodeid": 2, "depth": 1, "split": "f300", "split_condition": 95.5, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "leaf": 0.381696492 }, + { "nodeid": 4, "depth": 2, "split": "f656", "split_condition": 104.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.0739660487 }, + { "nodeid": 6, "leaf": -0.385791391 } + ]} + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f743", "split_condition": 90.1333313, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.279968023 }, + { "nodeid": 2, "depth": 1, "split": "f290", "split_condition": 108.033333, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "leaf": -0.234077886 }, + { "nodeid": 4, "leaf": 0.147569537 } + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f743", "split_condition": 90.1333313, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.279968172 }, + { "nodeid": 2, "depth": 1, "split": "f290", "split_condition": 108.033333, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "leaf": 0.234077781 }, + { "nodeid": 4, "leaf": -0.147569537 } + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.197402045 }, + { "nodeid": 2, "leaf": -0.139941201 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.197402418 }, + { "nodeid": 2, "leaf": 0.13994123 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f53", "split_condition": 127.416664, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.166276604 }, + { "nodeid": 2, "leaf": -0.126794532 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f53", "split_condition": 127.416664, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.166276589 }, + { "nodeid": 2, "leaf": 0.126794517 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f712", "split_condition": 92.8833313, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.123596296 }, + { "nodeid": 2, "leaf": 0.151612476 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f712", "split_condition": 92.8833313, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.123594895 }, + { "nodeid": 2, "leaf": -0.151612416 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.113635384 }, + { "nodeid": 2, "leaf": -0.107038438 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.11363478 }, + { "nodeid": 2, "leaf": 0.107038461 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f602", "split_condition": 92.8499985, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.1141828 }, + { "nodeid": 2, "leaf": 0.110286467 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f602", "split_condition": 92.8499985, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.114181779 }, + { "nodeid": 2, "leaf": -0.110286497 } + ]} +] \ No newline at end of file diff --git a/oceanprefilter/xgboost.go b/oceanprefilter/xgboost.go new file mode 100644 index 0000000..8aa6271 --- /dev/null +++ b/oceanprefilter/xgboost.go @@ -0,0 +1,99 @@ +package oceanprefilter + +import ( + "fmt" + "image" + "github.com/Elvenson/xgboost-go/activation" + "github.com/Elvenson/xgboost-go/mat" + // "github.com/Elvenson/xgboost-go/models" +) + +// Vector represents a dense vector. +type Vector []float32 + +// SparseVector is a map with index as a key and value as a value at that index. +type SparseVector map[int]float32 + +// SparseMatrix is a list of sparse vectors. +type SparseMatrix struct { + Vectors []SparseVector +} + + +// ConvertImageToSparseMatrix converts an image to a SparseMatrix. +func ConvertImageToSparseMatrix(img image.Image) SparseMatrix { + bounds := img.Bounds() + width, height := bounds.Max.X, bounds.Max.Y + + matrix := SparseMatrix{ + Vectors: make([]SparseVector, height), + } + + for y := 0; y < height; y++ { + sparseVector := make(SparseVector) + for x := 0; x < width; x++ { + // Extract RGB values from the image + r, g, b, _ := img.At(x, y).RGBA() + + // Compute average of RGB values + avg := (float32(r/257) + float32(g/257) + float32(b/257)) / 3.0 // 257 is the divisor to scale down from 16-bit to 8-bit range + + if avg > 0 { // Store non-zero pixels + sparseVector[x] = avg + } + } + matrix.Vectors[y] = sparseVector + } + + return matrix +} + +func inference(input image.Image, rc runConfig) (bool, error) { + ensemble, err := models.LoadXGBoostFromJSON("xg_boost_dump.json", + "", 1, 4, &activation.Logistic{}) + if err != nil { + panic(err) + } + + // ******* + thresh := rc.threshold + // find the horizon, take the average y value + linePoints, err := findHorizonLine(newImg) + if err != nil { + return false, nil, err + } + if len(linePoints) < 2 { + return false, nil, errors.New("function to find the horizon line returned less than 2 points") + } + cropY := int(math.Max(float64(linePoints[0].Y), float64(linePoints[1].Y))) + if rc.debug { + rc.logger.Debugf("found horizon at y = %v", cropY) + } + if cropY >= (newImg.Bounds().Max.Y-1) || cropY <= 1 { + return false, nil, errors.Errorf("could not find horizon in image. Got a horizon value of y = %v", cropY) + } + imgs, err := splitUpImage(newImg, rc.excludedZone, cropY, NHSplit, NVSplit) + if err != nil { + return false, nil, err + } + + // new code -> checks if any square is interesting + trigger := false + for i, img := range imgs { + // change image format + img = ConvertImageToSparseMatrix(img) + result, err := ensemble.PredictProba(img) + if err != nil { + panic(err) + } + + if result { + return true + } + } + +// ****************** + + // fmt.Printf("%+v\n", triggers) + return false, nil +} \ No newline at end of file From 8321410101d535c823877feb0f4c1d5fd670b421 Mon Sep 17 00:00:00 2001 From: emeraldzhang Date: Fri, 12 Jul 2024 20:01:25 +0100 Subject: [PATCH 02/12] adding test --- oceanprefilter/test.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 oceanprefilter/test.go diff --git a/oceanprefilter/test.go b/oceanprefilter/test.go new file mode 100644 index 0000000..1de444f --- /dev/null +++ b/oceanprefilter/test.go @@ -0,0 +1,23 @@ +package oceanprefilter + + +import ( + "fmt" + "image" + "os" +) + +f, err := os.Open("") + +defer f.Close() +image, _, err := image.Decode(f) + +rc := runConfig{} +rc.threshold = 0.25 + +res, err = inference(f, rc) +if err != nil { + fmt.Printf("err") +} + +fmt.Printf("%+v\n", res) \ No newline at end of file From b225fe6475e5ba3690520b521691d632bf06303a Mon Sep 17 00:00:00 2001 From: Emerald Date: Mon, 22 Jul 2024 11:35:08 -0400 Subject: [PATCH 03/12] adding code changes with xgboost method --- go.mod | 15 +- go.sum | 15 +- oceanprefilter/oceanprefilter.go | 114 ++++--- oceanprefilter/prefilter_test.go | 119 ++++++++ oceanprefilter/utils.go | 78 ++++- oceanprefilter/xg_boost_dump.json | 482 +++++++++++++++++++++++------- oceanprefilter/xgboost.go | 123 ++++---- 7 files changed, 728 insertions(+), 218 deletions(-) create mode 100644 oceanprefilter/prefilter_test.go diff --git a/go.mod b/go.mod index 6d1f18a..e33ba51 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,8 @@ module github.com/viamrobotics/ocean-prefilter go 1.21.7 require ( + github.com/Elvenson/xgboost-go v0.1.4 + github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/pkg/errors v0.9.1 go.viam.com/rdk v0.28.0 go.viam.com/utils v0.1.79 @@ -16,7 +18,6 @@ require ( cloud.google.com/go/iam v1.1.1 // indirect cloud.google.com/go/storage v1.30.1 // indirect git.sr.ht/~sbinet/gg v0.3.1 // indirect - github.com/Elvenson/xgboost-go v0.1.4 // indirect github.com/a8m/envsubst v1.4.2 // indirect github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b // indirect github.com/aybabtme/uniplot v0.0.0-20151203143629-039c559e5e7e // indirect @@ -56,7 +57,7 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/gonuts/binary v0.2.0 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/s2a-go v0.1.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect @@ -130,14 +131,14 @@ require ( go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 // indirect golang.org/x/crypto v0.23.0 // indirect golang.org/x/exp v0.0.0-20230725012225-302865e7556b // indirect - golang.org/x/image v0.15.0 // indirect - golang.org/x/mod v0.14.0 // indirect + golang.org/x/image v0.18.0 // indirect + golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.25.0 // indirect golang.org/x/oauth2 v0.10.0 // indirect - golang.org/x/sync v0.6.0 // indirect + golang.org/x/sync v0.7.0 // indirect golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect - golang.org/x/tools v0.17.0 // indirect + golang.org/x/text v0.16.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gonum.org/v1/gonum v0.12.0 // indirect gonum.org/v1/plot v0.12.0 // indirect diff --git a/go.sum b/go.sum index f95b336..9120dc5 100644 --- a/go.sum +++ b/go.sum @@ -155,8 +155,6 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= github.com/chewxy/hm v1.0.0 h1:zy/TSv3LV2nD3dwUEQL2VhXeoXbb9QkpmdRAVUFiA6k= github.com/chewxy/hm v1.0.0/go.mod h1:qg9YI4q6Fkj/whwHR1D+bOGeF7SniIP40VweVepLjg0= -github.com/chewxy/math32 v1.0.8 h1:fU5E4Ec4Z+5RtRAi3TovSxUjQPkgRh+HbP7tKB2OFbM= -github.com/chewxy/math32 v1.0.8/go.mod h1:dOB2rcuFrCn6UHrze36WSLVPKtzPMRAQvBvUwkSsLqs= github.com/chewxy/math32 v1.10.1 h1:LFpeY0SLJXeaiej/eIp2L40VYfscTvKh/FSEZ68uMkU= github.com/chewxy/math32 v1.10.1/go.mod h1:dOB2rcuFrCn6UHrze36WSLVPKtzPMRAQvBvUwkSsLqs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -433,6 +431,8 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -1167,6 +1167,8 @@ golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeap golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= +golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1192,6 +1194,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1270,6 +1274,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1378,6 +1384,8 @@ golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1482,6 +1490,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1642,6 +1652,7 @@ gorgonia.org/vecf32 v0.9.0 h1:PClazic1r+JVJ1dEzRXgeiVl4g1/Hf/w+wUSqnco1Xg= gorgonia.org/vecf32 v0.9.0/go.mod h1:NCc+5D2oxddRL11hd+pCB1PEyXWOyiQxfZ/1wwhOXCA= gorgonia.org/vecf64 v0.9.0 h1:bgZDP5x0OzBF64PjMGC3EvTdOoMEcmfAh1VCUnZFm1A= gorgonia.org/vecf64 v0.9.0/go.mod h1:hp7IOWCnRiVQKON73kkC/AUMtEXyf9kGlVrtPQ9ccVA= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/oceanprefilter/oceanprefilter.go b/oceanprefilter/oceanprefilter.go index 01bf3c8..c39f22c 100644 --- a/oceanprefilter/oceanprefilter.go +++ b/oceanprefilter/oceanprefilter.go @@ -3,13 +3,14 @@ package oceanprefilter import ( "context" - "fmt" "sync" "sync/atomic" "time" - + _ "embed" "image" - + xgb "github.com/Elvenson/xgboost-go" + "github.com/Elvenson/xgboost-go/activation" + "github.com/Elvenson/xgboost-go/inference" "github.com/pkg/errors" "go.viam.com/rdk/components/camera" "go.viam.com/rdk/logging" @@ -38,6 +39,9 @@ var ( errUnimplemented = errors.New("unimplemented") ) +//go:embed xg_boost_dump.json +var modelbytes []byte + func init() { resource.RegisterService(vision.API, Model, resource.Registration[vision.Service, *Config]{ Constructor: newPrefilter, @@ -59,14 +63,10 @@ type Config struct { // Validate validates the config and returns implicit dependencies, // this Validate checks if the camera and detector(optional) exist for the module's vision model. func (cfg *Config) Validate(path string) ([]string, error) { - // this makes them required for the model to successfully build if cfg.CameraName == "" { - return nil, fmt.Errorf(`expected "camera_name" attribute for object tracker %q`, path) + return []string{}, nil } - if cfg.DetectorName == "" { - return []string{cfg.CameraName}, nil - } - return []string{cfg.CameraName, cfg.DetectorName}, nil + return []string{cfg.CameraName}, nil } // prefilter is the main struct for this module. It is a vision service classifier that will return a "TRIGGER" class @@ -81,6 +81,7 @@ type prefilter struct { currImg atomic.Pointer[image.Image] camName string properties vision.Properties + rc runConfig } // runConfig are the settings that will be fed to the background thread that will constantly be evaluating images for events @@ -96,6 +97,7 @@ type runConfig struct { excludedZone *image.Rectangle motionTrigger bool debug bool + model *inference.Ensemble } // newPrefilter creates the vision service classifier @@ -157,18 +159,6 @@ func (pf *prefilter) Reconfigure(ctx context.Context, deps resource.Dependencies rc.threshold = DefaultThreshold } - rc.camName = prefilterConfig.CameraName - pf.camName = prefilterConfig.CameraName - rc.cam, err = camera.FromDependencies(deps, prefilterConfig.CameraName) - if err != nil { - return errors.Wrapf(err, "unable to get camera %v for ocean prefilter", prefilterConfig.CameraName) - } - if prefilterConfig.DetectorName != "" { - rc.detector, err = vision.FromDependencies(deps, prefilterConfig.DetectorName) - if err != nil { - return errors.Wrapf(err, "unable to get camera %v for ocean prefilter", prefilterConfig.DetectorName) - } - } rc.motionTrigger = prefilterConfig.TriggerOnMotion rc.chosenLabels = prefilterConfig.ChosenLabels // if you configred an optional detector, this determines the labels and confidences to use if len(prefilterConfig.ExcludedRegion) != 0 { @@ -179,22 +169,40 @@ func (pf *prefilter) Reconfigure(ctx context.Context, deps resource.Dependencies theZone := image.Rectangle{image.Point{er[0], er[1]}, image.Point{er[2], er[3]}} rc.excludedZone = &theZone } + ensemble, err := xgb.LoadXGBoostFromJSONBytes(modelbytes, + "", 2, 8, &activation.Softmax{}) // wrong activation logistic is 1 class only + if err != nil { + panic(err) + } + rc.model = ensemble - // now start the background thread - pf.activeBackgroundWorkers.Add(1) - viamutils.ManagedGo(func() { - // if you get an error while running just keep trying forever - for { - runErr := run(pf.cancelContext, rc, pf.triggerFlag, &pf.currImg) - if runErr != nil { - pf.logger.Errorw("background camera stream exited with error", "error", runErr) - continue // keep trying to run, forever - } - return + + if prefilterConfig.CameraName != "" { + rc.camName = prefilterConfig.CameraName + pf.camName = prefilterConfig.CameraName + rc.cam, err = camera.FromDependencies(deps, prefilterConfig.CameraName) + if err != nil { + return errors.Wrapf(err, "unable to get camera %v for ocean prefilter", prefilterConfig.CameraName) } - }, func() { - pf.activeBackgroundWorkers.Done() - }) + + // now start the background thread only if a camera dependency is given + pf.activeBackgroundWorkers.Add(1) + viamutils.ManagedGo(func() { + // if you get an error while running just keep trying forever + for { + runErr := run(pf.cancelContext, rc, pf.triggerFlag, &pf.currImg) + if runErr != nil { + pf.logger.Errorw("background camera stream exited with error", "error", runErr) + continue // keep trying to run, forever + } + return + } + }, func() { + pf.activeBackgroundWorkers.Done() + }) + } else { + pf.rc = rc + } return nil } @@ -210,8 +218,6 @@ func run(ctx context.Context, rc runConfig, trigger *atomic.Bool, currImg *atomi return err } defer stream.Close(ctx) - // create the oldHist object to store the old histograms - oldHists := []Histogram{} for { select { case <-ctx.Done(): @@ -225,9 +231,7 @@ func run(ctx context.Context, rc runConfig, trigger *atomic.Bool, currImg *atomi } currImg.Store(&img) // this function is where the decision happens - //isTriggered, err := mlFilter(ctx, img, rc) - //TODO: change this to inference! - isTriggered, err := inference(img, rc) + isTriggered, err := make_inference(img, rc) if err != nil { rc.logger.Infow("resetting histograms", "error", err.Error()) if rc.motionTrigger { @@ -243,7 +247,7 @@ func run(ctx context.Context, rc runConfig, trigger *atomic.Bool, currImg *atomi } else { trigger.Store(false) } - oldHists = newHists + // oldHists = newHists release() if rc.debug && trigger.Load() { rc.logger.Info("TRIGGER is true") @@ -301,18 +305,32 @@ func (pf *prefilter) ClassificationsFromCamera( func (pf *prefilter) Classifications(ctx context.Context, img image.Image, n int, extra map[string]interface{}, ) (classification.Classifications, error) { - select { - case <-ctx.Done(): - return nil, errors.Wrap(ctx.Err(), "module might be configuring") - case <-pf.cancelContext.Done(): - return nil, errors.Wrap(pf.cancelContext.Err(), "lost connection with background camera stream loop") - default: + if pf.camName == "" { + isTriggered, err := make_inference(img, pf.rc) + if err != nil { + pf.logger.Infow("classification error", "error", err.Error()) + } cls := []classification.Classification{} - if pf.triggerFlag.Load() { + if isTriggered { c := classification.NewClassification(1.0, triggerClassName) cls = append(cls, c) } return classification.Classifications(cls), nil + + } else { + select { + case <-ctx.Done(): + return nil, errors.Wrap(ctx.Err(), "module might be configuring") + case <-pf.cancelContext.Done(): + return nil, errors.Wrap(pf.cancelContext.Err(), "lost connection with background camera stream loop") + default: + cls := []classification.Classification{} + if pf.triggerFlag.Load() { + c := classification.NewClassification(1.0, triggerClassName) + cls = append(cls, c) + } + return classification.Classifications(cls), nil + } } } diff --git a/oceanprefilter/prefilter_test.go b/oceanprefilter/prefilter_test.go new file mode 100644 index 0000000..38cbdbb --- /dev/null +++ b/oceanprefilter/prefilter_test.go @@ -0,0 +1,119 @@ +package oceanprefilter + +import ( + "fmt" + "image" + "math" + "os" + "path/filepath" + "testing" + "image/jpeg" + xgb "github.com/Elvenson/xgboost-go" + "github.com/Elvenson/xgboost-go/activation" +) + + +func TestGeneralModel(t * testing.T) { + + f, err := os.Open("numbered_data/1000.jpg") + fmt.Print(err) + defer f.Close() + img, _, err := image.Decode(f) + + rc := runConfig{} + ensemble, err := xgb.LoadXGBoostFromJSONBytes(modelbytes, + "", 2, 8, &activation.Softmax{}) // wrong activation logistic is 1 class only + if err != nil { + panic(err) + } + rc.model = ensemble + rc.threshold = 0.25 + rect := image.Rectangle{ + Min: image.Point{X: 250, Y: 350}, + Max: image.Point{X: 580, Y: 480}, + } + rc.excludedZone = &rect + + res, err := make_inference(img, rc) + if err != nil { + fmt.Printf("err") + } + + fmt.Printf("output result is %+v\n", res) +} + +func TestAcc(t * testing.T) { + dir := "numbered_data/" + files, _ := os.ReadDir(dir) + for _, file := range files { + if file.Name() == ".DS_Store" { + continue + } + fp := filepath.Join(dir, file.Name()) + fmt.Println(fp) + f, err := os.Open(fp) + defer f.Close() + img, _, err := image.Decode(f) + + rc := runConfig{} + ensemble, err := xgb.LoadXGBoostFromJSONBytes(modelbytes, + "", 2, 8, &activation.Softmax{}) // wrong activation logistic is 1 class only + if err != nil { + panic(err) + } + + rc.model = ensemble + rc.threshold = 0.25 + rect := image.Rectangle{ + Min: image.Point{X: 250, Y: 350}, + Max: image.Point{X: 580, Y: 480}, + } + rc.excludedZone = &rect + + res, err := make_inference(img, rc) + if res { + + } else { + + } + } +} + +func TestSplitData(t * testing.T) { + dir := "triggers/2/" + files, _ := os.ReadDir(dir) + for _, file := range files { + if file.Name() == ".DS_Store" { + continue + } + fp := filepath.Join(dir, file.Name()) + fmt.Println(fp) + f, err := os.Open(fp) + defer f.Close() + img, _, err := image.Decode(f) + + rc := runConfig{} + rc.threshold = 0.25 + rect := image.Rectangle{ + Min: image.Point{X: 250, Y: 350}, + Max: image.Point{X: 580, Y: 480}, + } + rc.excludedZone = &rect + linePoints, err := findHorizonLine(img) + cropY := int(math.Max(float64(linePoints[0].Y), float64(linePoints[1].Y))) + + imgs, err := splitUpImageConst(img, rc.excludedZone, cropY, 80, 200) + if err != nil { + fmt.Printf("err") + } + + for idx, img := range imgs { + //// + filename := fmt.Sprintf("temp/%d_%s", idx, file.Name()) + file, _ := os.Create(filename) + defer file.Close() + jpeg.Encode(file, img, nil) + //// + } + } +} diff --git a/oceanprefilter/utils.go b/oceanprefilter/utils.go index 0a8bcc4..16394b5 100644 --- a/oceanprefilter/utils.go +++ b/oceanprefilter/utils.go @@ -4,7 +4,8 @@ import ( "fmt" "image" "image/draw" - + "math" + "github.com/disintegration/imaging" "github.com/pkg/errors" "gocv.io/x/gocv" ) @@ -87,7 +88,7 @@ func splitUpImage(img image.Image, exZone *image.Rectangle, yValue, nh, nv int) draw.Draw(croppedImg, croppedImg.Bounds(), img, croppedRect.Min, draw.Src) // Split the cropped image into n horizontal bands - bandHeight := croppedImg.Bounds().Dy() / nh + bandHeight := croppedImg.Bounds().Dy() /nh bandWidth := croppedImg.Bounds().Dx() / nv images := make([]image.Image, 0, nv*nh) for i := 0; i < nh; i++ { @@ -99,6 +100,79 @@ func splitUpImage(img image.Image, exZone *image.Rectangle, yValue, nh, nv int) } bandImg := image.NewRGBA(bandRect) draw.Draw(bandImg, bandImg.Bounds(), croppedImg, image.Point{bandRect.Min.X, bandRect.Min.Y + yValue}, draw.Src) + + images = append(images, bandImg) + } + } + return images, nil +} + + +// crop the image from yValue -> img.Bounds().Max.Y +// and then split the cropped image into nh horizontal and nv vertical bands of equal height and width (dimensions given) +func splitUpImageConst(img image.Image, exZone *image.Rectangle, yValue, h, w int) ([]image.Image, error) { + if img == nil { + return nil, errors.New("input image to split up is nil") + } + if h <= 0 { + return nil, fmt.Errorf("height must be greater than 0") + } + if w <= 0 { + return nil, fmt.Errorf("width must be greater than 0") + } + + // Crop the image from yValue to img.Bounds().Max.Y + bounds := img.Bounds() + croppedHeight := bounds.Max.Y - yValue + if croppedHeight <= 0 { + return nil, fmt.Errorf("yValue must be within the image bounds") + } + // edit exluded zone to take the crop into account + excludedBox := image.Rectangle{} + if exZone != nil { + excludedBox.Min.X = exZone.Min.X + excludedBox.Min.Y = exZone.Min.Y - yValue + excludedBox.Max.X = exZone.Max.X + excludedBox.Max.Y = exZone.Max.Y - yValue + } + croppedRect := image.Rect(0, yValue, bounds.Max.X, bounds.Max.Y) + croppedImg := image.NewRGBA(image.Rect(0, 0, croppedRect.Dx(), croppedRect.Dy())) + draw.Draw(croppedImg, croppedImg.Bounds(), img, croppedRect.Min, draw.Src) + + // Split the cropped image into n horizontal bands + nv := int(math.Ceil(float64(croppedImg.Bounds().Dy()) / float64(h))) + nh := int(math.Ceil(float64(croppedImg.Bounds().Dx()) / float64(w))) + images := make([]image.Image, 0, w*h) + edgeX := croppedImg.Bounds().Max.X + edgeY := croppedImg.Bounds().Max.Y + + for i := 0; i < nv; i++ { + for j := 0; j < nh; j++ { + flag := false + xEnd := (j+1)*w + yEnd := (i+1)*h + //bounds checking + if xEnd >= edgeX { + xEnd = edgeX - 1 + flag = true + } + if yEnd >= edgeY { + yEnd = edgeY - 1 + flag = true + } + bandRect := image.Rect(j*w, i*h, xEnd, yEnd) + // if rect in excluded zone, skip it + if exZone != nil && bandRect.Overlaps(excludedBox) { + continue + } + bandImg := image.NewRGBA(bandRect) + draw.Draw(bandImg, bandImg.Bounds(), croppedImg, image.Point{bandRect.Min.X, bandRect.Min.Y}, draw.Src) + + if flag { + resized := imaging.Resize(bandImg, w, h, imaging.Lanczos) + bandImg = (*image.RGBA)(resized) + } + images = append(images, bandImg) } } diff --git a/oceanprefilter/xg_boost_dump.json b/oceanprefilter/xg_boost_dump.json index dd4e90e..43c10ad 100644 --- a/oceanprefilter/xg_boost_dump.json +++ b/oceanprefilter/xg_boost_dump.json @@ -1,142 +1,424 @@ [ - { "nodeid": 0, "depth": 0, "split": "f327", "split_condition": 110.783333, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "depth": 1, "split": "f14", "split_condition": 199.883331, "yes": 3, "no": 4, "missing": 4 , "children": [ - { "nodeid": 3, "depth": 2, "split": "f436", "split_condition": 108.216667, "yes": 7, "no": 8, "missing": 8 , "children": [ - { "nodeid": 7, "leaf": 0.96825397 }, - { "nodeid": 8, "leaf": -0 } + { "nodeid": 0, "depth": 0, "split": "f754", "split_condition": 86.0333328, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f88", "split_condition": 111.199997, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f4", "split_condition": 117.366669, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": 0.987096786 }, + { "nodeid": 8, "leaf": -0.5 } ]}, - { "nodeid": 4, "leaf": -0 } + { "nodeid": 4, "depth": 2, "split": "f0", "split_condition": 84.9666672, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "leaf": -0.600000024 }, + { "nodeid": 10, "leaf": -0 } + ]} ]}, - { "nodeid": 2, "depth": 1, "split": "f628", "split_condition": 107.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ - { "nodeid": 5, "leaf": -0.800000012 }, - { "nodeid": 6, "leaf": 0.200000003 } + { "nodeid": 2, "depth": 1, "split": "f468", "split_condition": 115.099998, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "depth": 2, "split": "f372", "split_condition": 106.633331, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "depth": 3, "split": "f472", "split_condition": 96.4333344, "yes": 15, "no": 16, "missing": 16 , "children": [ + { "nodeid": 15, "leaf": 0.230769232 }, + { "nodeid": 16, "leaf": -0.814814806 } + ]}, + { "nodeid": 12, "depth": 3, "split": "f304", "split_condition": 122.800003, "yes": 17, "no": 18, "missing": 18 , "children": [ + { "nodeid": 17, "leaf": 0.862068951 }, + { "nodeid": 18, "leaf": -0.555555582 } + ]} + ]}, + { "nodeid": 6, "depth": 2, "split": "f516", "split_condition": 106.099998, "yes": 13, "no": 14, "missing": 14 , "children": [ + { "nodeid": 13, "depth": 3, "split": "f8", "split_condition": 115.099998, "yes": 19, "no": 20, "missing": 20 , "children": [ + { "nodeid": 19, "leaf": -0.5 }, + { "nodeid": 20, "leaf": 0.5 } + ]}, + { "nodeid": 14, "leaf": -0.961538434 } + ]} ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f327", "split_condition": 110.783333, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "depth": 1, "split": "f14", "split_condition": 199.883331, "yes": 3, "no": 4, "missing": 4 , "children": [ - { "nodeid": 3, "depth": 2, "split": "f436", "split_condition": 108.216667, "yes": 7, "no": 8, "missing": 8 , "children": [ - { "nodeid": 7, "leaf": -0.96825397 }, - { "nodeid": 8, "leaf": -0 } + { "nodeid": 0, "depth": 0, "split": "f754", "split_condition": 86.0333328, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f88", "split_condition": 111.199997, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f4", "split_condition": 117.366669, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": -0.987096786 }, + { "nodeid": 8, "leaf": 0.5 } ]}, - { "nodeid": 4, "leaf": -0 } + { "nodeid": 4, "depth": 2, "split": "f0", "split_condition": 84.9666672, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "leaf": 0.600000024 }, + { "nodeid": 10, "leaf": -0 } + ]} ]}, - { "nodeid": 2, "depth": 1, "split": "f628", "split_condition": 107.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ - { "nodeid": 5, "leaf": 0.800000012 }, - { "nodeid": 6, "leaf": -0.200000003 } + { "nodeid": 2, "depth": 1, "split": "f468", "split_condition": 115.099998, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "depth": 2, "split": "f372", "split_condition": 106.633331, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "depth": 3, "split": "f472", "split_condition": 96.4333344, "yes": 15, "no": 16, "missing": 16 , "children": [ + { "nodeid": 15, "leaf": -0.230769232 }, + { "nodeid": 16, "leaf": 0.814814806 } + ]}, + { "nodeid": 12, "depth": 3, "split": "f304", "split_condition": 122.800003, "yes": 17, "no": 18, "missing": 18 , "children": [ + { "nodeid": 17, "leaf": -0.862068951 }, + { "nodeid": 18, "leaf": 0.555555582 } + ]} + ]}, + { "nodeid": 6, "depth": 2, "split": "f516", "split_condition": 106.099998, "yes": 13, "no": 14, "missing": 14 , "children": [ + { "nodeid": 13, "depth": 3, "split": "f8", "split_condition": 115.099998, "yes": 19, "no": 20, "missing": 20 , "children": [ + { "nodeid": 19, "leaf": 0.5 }, + { "nodeid": 20, "leaf": -0.5 } + ]}, + { "nodeid": 14, "leaf": 0.961538434 } + ]} ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ - { "nodeid": 3, "depth": 2, "split": "f401", "split_condition": 111.400002, "yes": 5, "no": 6, "missing": 6 , "children": [ - { "nodeid": 5, "leaf": 0.570969284 }, - { "nodeid": 6, "leaf": -0.183552772 } + { "nodeid": 0, "depth": 0, "split": "f93", "split_condition": 99.6999969, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f14", "split_condition": 112.966667, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f96", "split_condition": 101.833336, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "depth": 3, "split": "f40", "split_condition": 109.716667, "yes": 13, "no": 14, "missing": 14 , "children": [ + { "nodeid": 13, "leaf": 0.611040354 }, + { "nodeid": 14, "leaf": 0.152010784 } + ]}, + { "nodeid": 8, "leaf": 0.115841269 } ]}, - { "nodeid": 4, "leaf": -0.117992692 } + { "nodeid": 4, "depth": 2, "split": "f34", "split_condition": 112.76667, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "leaf": -0.630977273 }, + { "nodeid": 10, "leaf": 0.0993870422 } + ]} ]}, - { "nodeid": 2, "leaf": -0.571418047 } + { "nodeid": 2, "depth": 1, "split": "f683", "split_condition": 117.599998, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "depth": 2, "split": "f201", "split_condition": 96.1666641, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "depth": 3, "split": "f755", "split_condition": 82.2666702, "yes": 15, "no": 16, "missing": 16 , "children": [ + { "nodeid": 15, "leaf": 0.0324974582 }, + { "nodeid": 16, "leaf": -0.714057803 } + ]}, + { "nodeid": 12, "depth": 3, "split": "f468", "split_condition": 112.98333, "yes": 17, "no": 18, "missing": 18 , "children": [ + { "nodeid": 17, "leaf": 0.214839593 }, + { "nodeid": 18, "leaf": -0.514603674 } + ]} + ]}, + { "nodeid": 6, "leaf": 0.838169098 } + ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ - { "nodeid": 3, "depth": 2, "split": "f401", "split_condition": 111.400002, "yes": 5, "no": 6, "missing": 6 , "children": [ - { "nodeid": 5, "leaf": -0.570969284 }, - { "nodeid": 6, "leaf": 0.183552772 } + { "nodeid": 0, "depth": 0, "split": "f93", "split_condition": 99.6999969, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f14", "split_condition": 112.966667, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f96", "split_condition": 101.833336, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "depth": 3, "split": "f40", "split_condition": 109.716667, "yes": 13, "no": 14, "missing": 14 , "children": [ + { "nodeid": 13, "leaf": -0.611040413 }, + { "nodeid": 14, "leaf": -0.152010888 } + ]}, + { "nodeid": 8, "leaf": -0.115841366 } ]}, - { "nodeid": 4, "leaf": 0.117992707 } + { "nodeid": 4, "depth": 2, "split": "f34", "split_condition": 112.76667, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "leaf": 0.630977213 }, + { "nodeid": 10, "leaf": -0.0993870944 } + ]} ]}, - { "nodeid": 2, "leaf": 0.571418047 } + { "nodeid": 2, "depth": 1, "split": "f683", "split_condition": 117.599998, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "depth": 2, "split": "f201", "split_condition": 96.1666641, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "depth": 3, "split": "f755", "split_condition": 82.2666702, "yes": 15, "no": 16, "missing": 16 , "children": [ + { "nodeid": 15, "leaf": -0.0324975811 }, + { "nodeid": 16, "leaf": 0.714057803 } + ]}, + { "nodeid": 12, "depth": 3, "split": "f468", "split_condition": 112.98333, "yes": 17, "no": 18, "missing": 18 , "children": [ + { "nodeid": 17, "leaf": -0.214839667 }, + { "nodeid": 18, "leaf": 0.514603674 } + ]} + ]}, + { "nodeid": 6, "leaf": -0.838169217 } + ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ - { "nodeid": 3, "depth": 2, "split": "f410", "split_condition": 110.650002, "yes": 5, "no": 6, "missing": 6 , "children": [ - { "nodeid": 5, "leaf": 0.466001004 }, - { "nodeid": 6, "leaf": -0.0753230453 } + { "nodeid": 0, "depth": 0, "split": "f96", "split_condition": 105.900002, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f20", "split_condition": 114.866669, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f693", "split_condition": 98.0333328, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "depth": 3, "split": "f24", "split_condition": 45.2333336, "yes": 13, "no": 14, "missing": 14 , "children": [ + { "nodeid": 13, "leaf": 0.0703155994 }, + { "nodeid": 14, "leaf": 0.548320293 } + ]}, + { "nodeid": 8, "depth": 3, "split": "f116", "split_condition": 97.5333328, "yes": 15, "no": 16, "missing": 16 , "children": [ + { "nodeid": 15, "leaf": 0.203430355 }, + { "nodeid": 16, "leaf": -0.32286194 } + ]} ]}, - { "nodeid": 4, "leaf": -0.0537564792 } + { "nodeid": 4, "leaf": -0.431843519 } ]}, - { "nodeid": 2, "leaf": -0.356984079 } + { "nodeid": 2, "depth": 1, "split": "f100", "split_condition": 114.033333, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "depth": 2, "split": "f676", "split_condition": 106.699997, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "depth": 3, "split": "f199", "split_condition": 122.73333, "yes": 17, "no": 18, "missing": 18 , "children": [ + { "nodeid": 17, "leaf": -0.5832057 }, + { "nodeid": 18, "leaf": 0.0148218283 } + ]}, + { "nodeid": 10, "depth": 3, "split": "f484", "split_condition": 114.633331, "yes": 19, "no": 20, "missing": 20 , "children": [ + { "nodeid": 19, "leaf": 0.416478157 }, + { "nodeid": 20, "leaf": -0.381625086 } + ]} + ]}, + { "nodeid": 6, "depth": 2, "split": "f336", "split_condition": 117.599998, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "leaf": 0.596420705 }, + { "nodeid": 12, "leaf": -0.350840688 } + ]} + ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ - { "nodeid": 3, "depth": 2, "split": "f410", "split_condition": 110.650002, "yes": 5, "no": 6, "missing": 6 , "children": [ - { "nodeid": 5, "leaf": -0.466000974 }, - { "nodeid": 6, "leaf": 0.0753231421 } + { "nodeid": 0, "depth": 0, "split": "f96", "split_condition": 105.900002, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f20", "split_condition": 114.866669, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f693", "split_condition": 98.0333328, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "depth": 3, "split": "f24", "split_condition": 45.2333336, "yes": 13, "no": 14, "missing": 14 , "children": [ + { "nodeid": 13, "leaf": -0.0703159049 }, + { "nodeid": 14, "leaf": -0.548320293 } + ]}, + { "nodeid": 8, "depth": 3, "split": "f116", "split_condition": 97.5333328, "yes": 15, "no": 16, "missing": 16 , "children": [ + { "nodeid": 15, "leaf": -0.203430548 }, + { "nodeid": 16, "leaf": 0.32286191 } + ]} ]}, - { "nodeid": 4, "leaf": 0.0537564307 } + { "nodeid": 4, "leaf": 0.431843489 } ]}, - { "nodeid": 2, "leaf": 0.356984049 } + { "nodeid": 2, "depth": 1, "split": "f100", "split_condition": 114.033333, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "depth": 2, "split": "f676", "split_condition": 106.699997, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "depth": 3, "split": "f199", "split_condition": 122.73333, "yes": 17, "no": 18, "missing": 18 , "children": [ + { "nodeid": 17, "leaf": 0.5832057 }, + { "nodeid": 18, "leaf": -0.0148218572 } + ]}, + { "nodeid": 10, "depth": 3, "split": "f484", "split_condition": 114.633331, "yes": 19, "no": 20, "missing": 20 , "children": [ + { "nodeid": 19, "leaf": -0.416478187 }, + { "nodeid": 20, "leaf": 0.381624937 } + ]} + ]}, + { "nodeid": 6, "depth": 2, "split": "f336", "split_condition": 117.599998, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "leaf": -0.596420705 }, + { "nodeid": 12, "leaf": 0.350840628 } + ]} + ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f284", "split_condition": 101.400002, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": 0.347005337 }, - { "nodeid": 2, "depth": 1, "split": "f300", "split_condition": 95.5, "yes": 3, "no": 4, "missing": 4 , "children": [ - { "nodeid": 3, "leaf": -0.381696463 }, - { "nodeid": 4, "depth": 2, "split": "f656", "split_condition": 104.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ - { "nodeid": 5, "leaf": -0.073965922 }, - { "nodeid": 6, "leaf": 0.385791391 } + { "nodeid": 0, "depth": 0, "split": "f435", "split_condition": 111.566666, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f746", "split_condition": 101.033333, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f780", "split_condition": 82.4333344, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "depth": 3, "split": "f88", "split_condition": 111.199997, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "leaf": 0.444764972 }, + { "nodeid": 12, "leaf": -0.100074396 } + ]}, + { "nodeid": 8, "depth": 3, "split": "f446", "split_condition": 100.633331, "yes": 13, "no": 14, "missing": 14 , "children": [ + { "nodeid": 13, "leaf": -0.345263779 }, + { "nodeid": 14, "leaf": 0.183891743 } + ]} + ]}, + { "nodeid": 4, "depth": 2, "split": "f468", "split_condition": 110.849998, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "leaf": 0.573228776 }, + { "nodeid": 10, "leaf": 0.098170884 } ]} + ]}, + { "nodeid": 2, "depth": 1, "split": "f232", "split_condition": 117.76667, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.0966188833 }, + { "nodeid": 6, "leaf": -0.443057448 } ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f284", "split_condition": 101.400002, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": -0.347005308 }, - { "nodeid": 2, "depth": 1, "split": "f300", "split_condition": 95.5, "yes": 3, "no": 4, "missing": 4 , "children": [ - { "nodeid": 3, "leaf": 0.381696492 }, - { "nodeid": 4, "depth": 2, "split": "f656", "split_condition": 104.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ - { "nodeid": 5, "leaf": 0.0739660487 }, - { "nodeid": 6, "leaf": -0.385791391 } + { "nodeid": 0, "depth": 0, "split": "f435", "split_condition": 111.566666, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f746", "split_condition": 101.033333, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f780", "split_condition": 82.4333344, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "depth": 3, "split": "f88", "split_condition": 111.199997, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "leaf": -0.444764942 }, + { "nodeid": 12, "leaf": 0.100074396 } + ]}, + { "nodeid": 8, "depth": 3, "split": "f446", "split_condition": 100.633331, "yes": 13, "no": 14, "missing": 14 , "children": [ + { "nodeid": 13, "leaf": 0.345263898 }, + { "nodeid": 14, "leaf": -0.183891654 } + ]} + ]}, + { "nodeid": 4, "depth": 2, "split": "f468", "split_condition": 110.849998, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "leaf": -0.573228776 }, + { "nodeid": 10, "leaf": -0.098170802 } ]} + ]}, + { "nodeid": 2, "depth": 1, "split": "f232", "split_condition": 117.76667, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.096618928 }, + { "nodeid": 6, "leaf": 0.443057448 } ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f743", "split_condition": 90.1333313, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": 0.279968023 }, - { "nodeid": 2, "depth": 1, "split": "f290", "split_condition": 108.033333, "yes": 3, "no": 4, "missing": 4 , "children": [ - { "nodeid": 3, "leaf": -0.234077886 }, - { "nodeid": 4, "leaf": 0.147569537 } + { "nodeid": 0, "depth": 0, "split": "f754", "split_condition": 86.0333328, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f218", "split_condition": 71.5500031, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f88", "split_condition": 97.0999985, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": 0.256520808 }, + { "nodeid": 8, "leaf": -0.296602577 } + ]}, + { "nodeid": 4, "leaf": 0.482284367 } + ]}, + { "nodeid": 2, "depth": 1, "split": "f742", "split_condition": 99.4000015, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "depth": 2, "split": "f92", "split_condition": 99.6999969, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "depth": 3, "split": "f4", "split_condition": 106.050003, "yes": 13, "no": 14, "missing": 14 , "children": [ + { "nodeid": 13, "leaf": 0.332425684 }, + { "nodeid": 14, "leaf": -0.076178357 } + ]}, + { "nodeid": 10, "depth": 3, "split": "f728", "split_condition": 99.0666656, "yes": 15, "no": 16, "missing": 16 , "children": [ + { "nodeid": 15, "leaf": -0.45597133 }, + { "nodeid": 16, "leaf": -0.091123499 } + ]} + ]}, + { "nodeid": 6, "depth": 2, "split": "f336", "split_condition": 116.666664, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "depth": 3, "split": "f723", "split_condition": 97.2333298, "yes": 17, "no": 18, "missing": 18 , "children": [ + { "nodeid": 17, "leaf": -0.0619269013 }, + { "nodeid": 18, "leaf": 0.403616577 } + ]}, + { "nodeid": 12, "leaf": -0.276073456 } + ]} ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f743", "split_condition": 90.1333313, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": -0.279968172 }, - { "nodeid": 2, "depth": 1, "split": "f290", "split_condition": 108.033333, "yes": 3, "no": 4, "missing": 4 , "children": [ - { "nodeid": 3, "leaf": 0.234077781 }, - { "nodeid": 4, "leaf": -0.147569537 } + { "nodeid": 0, "depth": 0, "split": "f754", "split_condition": 86.0333328, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f218", "split_condition": 71.5500031, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f88", "split_condition": 97.0999985, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": -0.256520808 }, + { "nodeid": 8, "leaf": 0.296602547 } + ]}, + { "nodeid": 4, "leaf": -0.482284397 } + ]}, + { "nodeid": 2, "depth": 1, "split": "f742", "split_condition": 99.4000015, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "depth": 2, "split": "f92", "split_condition": 99.6999969, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "depth": 3, "split": "f4", "split_condition": 106.050003, "yes": 13, "no": 14, "missing": 14 , "children": [ + { "nodeid": 13, "leaf": -0.332425684 }, + { "nodeid": 14, "leaf": 0.0761782452 } + ]}, + { "nodeid": 10, "depth": 3, "split": "f728", "split_condition": 99.0666656, "yes": 15, "no": 16, "missing": 16 , "children": [ + { "nodeid": 15, "leaf": 0.45597133 }, + { "nodeid": 16, "leaf": 0.0911235809 } + ]} + ]}, + { "nodeid": 6, "depth": 2, "split": "f336", "split_condition": 116.666664, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "depth": 3, "split": "f723", "split_condition": 97.2333298, "yes": 17, "no": 18, "missing": 18 , "children": [ + { "nodeid": 17, "leaf": 0.0619269609 }, + { "nodeid": 18, "leaf": -0.403616607 } + ]}, + { "nodeid": 12, "leaf": 0.276073545 } + ]} ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": 0.197402045 }, - { "nodeid": 2, "leaf": -0.139941201 } + { "nodeid": 0, "depth": 0, "split": "f510", "split_condition": 110.466667, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f401", "split_condition": 74.7333298, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f96", "split_condition": 95.6666641, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": 0.069376111 }, + { "nodeid": 8, "leaf": -0.281907052 } + ]}, + { "nodeid": 4, "depth": 2, "split": "f541", "split_condition": 93.4000015, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "leaf": 0.391687393 }, + { "nodeid": 10, "depth": 3, "split": "f146", "split_condition": 103.900002, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "leaf": -0.301997572 }, + { "nodeid": 12, "leaf": 0.213275462 } + ]} + ]} + ]}, + { "nodeid": 2, "depth": 1, "split": "f100", "split_condition": 109.333336, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.320079803 }, + { "nodeid": 6, "leaf": -0.0643817782 } + ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": -0.197402418 }, - { "nodeid": 2, "leaf": 0.13994123 } + { "nodeid": 0, "depth": 0, "split": "f510", "split_condition": 110.466667, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f401", "split_condition": 74.7333298, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f96", "split_condition": 95.6666641, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": -0.0693770126 }, + { "nodeid": 8, "leaf": 0.281906992 } + ]}, + { "nodeid": 4, "depth": 2, "split": "f541", "split_condition": 93.4000015, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "leaf": -0.391687453 }, + { "nodeid": 10, "depth": 3, "split": "f146", "split_condition": 103.900002, "yes": 11, "no": 12, "missing": 12 , "children": [ + { "nodeid": 11, "leaf": 0.301997721 }, + { "nodeid": 12, "leaf": -0.213275313 } + ]} + ]} + ]}, + { "nodeid": 2, "depth": 1, "split": "f100", "split_condition": 109.333336, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.320079863 }, + { "nodeid": 6, "leaf": 0.0643816367 } + ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f53", "split_condition": 127.416664, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": 0.166276604 }, - { "nodeid": 2, "leaf": -0.126794532 } + { "nodeid": 0, "depth": 0, "split": "f14", "split_condition": 111.76667, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f97", "split_condition": 105.400002, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f796", "split_condition": 87.9666672, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": 0.312046558 }, + { "nodeid": 8, "leaf": 0.0674411133 } + ]}, + { "nodeid": 4, "depth": 2, "split": "f29", "split_condition": 106.900002, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "leaf": -0.188310519 }, + { "nodeid": 10, "leaf": 0.127114445 } + ]} + ]}, + { "nodeid": 2, "depth": 1, "split": "f37", "split_condition": 119.800003, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.327614278 }, + { "nodeid": 6, "leaf": 0.0948115662 } + ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f53", "split_condition": 127.416664, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": -0.166276589 }, - { "nodeid": 2, "leaf": 0.126794517 } + { "nodeid": 0, "depth": 0, "split": "f14", "split_condition": 111.76667, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f97", "split_condition": 105.400002, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f796", "split_condition": 87.9666672, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": -0.312046528 }, + { "nodeid": 8, "leaf": -0.0674411729 } + ]}, + { "nodeid": 4, "depth": 2, "split": "f29", "split_condition": 106.900002, "yes": 9, "no": 10, "missing": 10 , "children": [ + { "nodeid": 9, "leaf": 0.188310578 }, + { "nodeid": 10, "leaf": -0.127114356 } + ]} + ]}, + { "nodeid": 2, "depth": 1, "split": "f37", "split_condition": 119.800003, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.327614158 }, + { "nodeid": 6, "leaf": -0.094811745 } + ]} ]}, - { "nodeid": 0, "depth": 0, "split": "f712", "split_condition": 92.8833313, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": -0.123596296 }, - { "nodeid": 2, "leaf": 0.151612476 } + { "nodeid": 0, "depth": 0, "split": "f498", "split_condition": 111.366669, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f498", "split_condition": 104.76667, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f783", "split_condition": 93.9000015, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "depth": 3, "split": "f410", "split_condition": 80.5833359, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": -0.103438042 }, + { "nodeid": 8, "leaf": 0.228252679 } + ]}, + { "nodeid": 6, "leaf": -0.214825168 } + ]}, + { "nodeid": 4, "leaf": 0.269576341 } + ]}, + { "nodeid": 2, "leaf": -0.211860463 } ]}, - { "nodeid": 0, "depth": 0, "split": "f712", "split_condition": 92.8833313, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": 0.123594895 }, - { "nodeid": 2, "leaf": -0.151612416 } + { "nodeid": 0, "depth": 0, "split": "f498", "split_condition": 111.366669, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f498", "split_condition": 104.76667, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f783", "split_condition": 93.9000015, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "depth": 3, "split": "f410", "split_condition": 80.5833359, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": 0.103436887 }, + { "nodeid": 8, "leaf": -0.228252456 } + ]}, + { "nodeid": 6, "leaf": 0.214825347 } + ]}, + { "nodeid": 4, "leaf": -0.269576311 } + ]}, + { "nodeid": 2, "leaf": 0.211860493 } ]}, - { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": 0.113635384 }, - { "nodeid": 2, "leaf": -0.107038438 } + { "nodeid": 0, "depth": 0, "split": "f526", "split_condition": 109.966667, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f56", "split_condition": 105.033333, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f696", "split_condition": 84.3666687, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.0917328075 }, + { "nodeid": 6, "leaf": -0.202868819 } + ]}, + { "nodeid": 4, "depth": 2, "split": "f608", "split_condition": 101.5, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": 0.264595151 }, + { "nodeid": 8, "leaf": 0.0331644081 } + ]} + ]}, + { "nodeid": 2, "leaf": -0.16308853 } ]}, - { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": -0.11363478 }, - { "nodeid": 2, "leaf": 0.107038461 } + { "nodeid": 0, "depth": 0, "split": "f526", "split_condition": 109.966667, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f56", "split_condition": 105.033333, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f696", "split_condition": 84.3666687, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.0917329937 }, + { "nodeid": 6, "leaf": 0.2028687 } + ]}, + { "nodeid": 4, "depth": 2, "split": "f608", "split_condition": 101.5, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": -0.264595121 }, + { "nodeid": 8, "leaf": -0.0331642814 } + ]} + ]}, + { "nodeid": 2, "leaf": 0.163088754 } ]}, - { "nodeid": 0, "depth": 0, "split": "f602", "split_condition": 92.8499985, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": -0.1141828 }, - { "nodeid": 2, "leaf": 0.110286467 } + { "nodeid": 0, "depth": 0, "split": "f90", "split_condition": 120.199997, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f752", "split_condition": 102.533333, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f797", "split_condition": 89.6999969, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.100745961 }, + { "nodeid": 6, "leaf": -0.155119032 } + ]}, + { "nodeid": 4, "leaf": 0.189036936 } + ]}, + { "nodeid": 2, "leaf": -0.143735901 } ]}, - { "nodeid": 0, "depth": 0, "split": "f602", "split_condition": 92.8499985, "yes": 1, "no": 2, "missing": 2 , "children": [ - { "nodeid": 1, "leaf": 0.114181779 }, - { "nodeid": 2, "leaf": -0.110286497 } + { "nodeid": 0, "depth": 0, "split": "f90", "split_condition": 120.199997, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f752", "split_condition": 102.533333, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f797", "split_condition": 89.6999969, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.10074497 }, + { "nodeid": 6, "leaf": 0.155118898 } + ]}, + { "nodeid": 4, "leaf": -0.189037144 } + ]}, + { "nodeid": 2, "leaf": 0.143735975 } ]} ] \ No newline at end of file diff --git a/oceanprefilter/xgboost.go b/oceanprefilter/xgboost.go index 8aa6271..09d3a02 100644 --- a/oceanprefilter/xgboost.go +++ b/oceanprefilter/xgboost.go @@ -1,99 +1,104 @@ package oceanprefilter import ( - "fmt" "image" - "github.com/Elvenson/xgboost-go/activation" + "math" "github.com/Elvenson/xgboost-go/mat" - // "github.com/Elvenson/xgboost-go/models" + "github.com/pkg/errors" ) -// Vector represents a dense vector. -type Vector []float32 +func flatten(matrix mat.SparseMatrix) mat.SparseMatrix{ + flatVector := mat.SparseVector{} + offset := 0 -// SparseVector is a map with index as a key and value as a value at that index. -type SparseVector map[int]float32 - -// SparseMatrix is a list of sparse vectors. -type SparseMatrix struct { - Vectors []SparseVector -} - - -// ConvertImageToSparseMatrix converts an image to a SparseMatrix. -func ConvertImageToSparseMatrix(img image.Image) SparseMatrix { - bounds := img.Bounds() - width, height := bounds.Max.X, bounds.Max.Y + for _, vector := range matrix.Vectors { + for idx, value := range vector { + flatIndex := offset + idx + flatVector[flatIndex] = value + } + offset += len(vector) + } - matrix := SparseMatrix{ - Vectors: make([]SparseVector, height), + flatMatrix := mat.SparseMatrix{ + Vectors: []mat.SparseVector{flatVector}, } - for y := 0; y < height; y++ { - sparseVector := make(SparseVector) - for x := 0; x < width; x++ { - // Extract RGB values from the image - r, g, b, _ := img.At(x, y).RGBA() + return flatMatrix +} - // Compute average of RGB values - avg := (float32(r/257) + float32(g/257) + float32(b/257)) / 3.0 // 257 is the divisor to scale down from 16-bit to 8-bit range - if avg > 0 { // Store non-zero pixels - sparseVector[x] = avg +func AvgPoolFull(img image.Image, patchSize image.Point) mat.SparseMatrix { + bounds := img.Bounds() + width, height := bounds.Dx(), bounds.Dy() + patchWidth, patchHeight := patchSize.X, patchSize.Y + + h := height / patchHeight + w := width / patchWidth + + downsize := make([]mat.SparseVector, h) + + for i := 0; i < h; i++ { + row := make(mat.SparseVector) + for j := 0; j < w; j++ { + sum := 0.0 + count := 0 + for x := 0; x < patchWidth; x++ { + for y := 0; y < patchHeight; y++ { + px := bounds.Min.X + j*patchWidth + x + py := bounds.Min.Y + i*patchHeight + y + r, g, b, a := img.At(px, py).RGBA() + avg := float64(r+g+b) / 3.0 / 256.0 + if a > 0 { + sum += avg + count++ + } + } + } + if count > 0 { + row[j] = float32(sum / float64(count)) } } - matrix.Vectors[y] = sparseVector + downsize[i] = row } - return matrix -} - -func inference(input image.Image, rc runConfig) (bool, error) { - ensemble, err := models.LoadXGBoostFromJSON("xg_boost_dump.json", - "", 1, 4, &activation.Logistic{}) - if err != nil { - panic(err) - } + return mat.SparseMatrix{Vectors: downsize} - // ******* - thresh := rc.threshold +} +func make_inference(input image.Image, rc runConfig) (bool, error) { // find the horizon, take the average y value - linePoints, err := findHorizonLine(newImg) + linePoints, err := findHorizonLine(input) if err != nil { - return false, nil, err + return false, err } if len(linePoints) < 2 { - return false, nil, errors.New("function to find the horizon line returned less than 2 points") + return false, errors.New("function to find the horizon line returned less than 2 points") } cropY := int(math.Max(float64(linePoints[0].Y), float64(linePoints[1].Y))) if rc.debug { rc.logger.Debugf("found horizon at y = %v", cropY) } - if cropY >= (newImg.Bounds().Max.Y-1) || cropY <= 1 { - return false, nil, errors.Errorf("could not find horizon in image. Got a horizon value of y = %v", cropY) + if cropY >= (input.Bounds().Max.Y-1) || cropY <= 1 { + return false, errors.Errorf("could not find horizon in image. Got a horizon value of y = %v", cropY) } - imgs, err := splitUpImage(newImg, rc.excludedZone, cropY, NHSplit, NVSplit) + imgs, err := splitUpImageConst(input, rc.excludedZone, cropY, 80, 200) if err != nil { - return false, nil, err + return false, err } // new code -> checks if any square is interesting - trigger := false - for i, img := range imgs { - // change image format - img = ConvertImageToSparseMatrix(img) - result, err := ensemble.PredictProba(img) + for _, img := range imgs { + in_mat := AvgPoolFull(img, image.Point{10, 2}) + in_mat = flatten(in_mat) + + result, err := rc.model.Predict(in_mat) if err != nil { panic(err) } - - if result { - return true + + if (*result.Vectors[0])[0] == 1 { + return true, nil } } -// ****************** - - // fmt.Printf("%+v\n", triggers) return false, nil } \ No newline at end of file From 486796f5674b1b31f624924a0b1f1dcd0bfbcdf9 Mon Sep 17 00:00:00 2001 From: Emerald Date: Mon, 22 Jul 2024 11:39:41 -0400 Subject: [PATCH 04/12] modified readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 60b9604..f496d3e 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ This module implements the [`rdk:service:vision` API](https://docs.viam.com/ml/v When you configure a machine with this module, the module: - Locates the horizon, crops the image to only include the water, and then divides the water into patches. -- Turns the resulting patches into histograms, which it interprets as probability distrubutions for their color/intensity values. -- Conducts a Kolmogorov-Smirnov test on the histograms from before and after images and determines if the scenes are consistent or if a new element has appeared. +- Performs feature extraction on the resulting patches, average pooling the the patches with a window size of (10, 2) and taking the RGB mean of each sub-patch +- Classifies the frame using XGBoost - this will trigger if any patch in the given image is found interesting Strong motion of the waves or bobbing up-and-down of the boat can trigger the pre-filter. This vision service only returns one label classification called `TRIGGER` with a confidence of `1.0`. @@ -56,7 +56,7 @@ Copy and paste the following attribute template into your vision service's attri | Name | Type | Inclusion | Description | Value | |-------|-------|-----------|-------------| ------| -| `camera_name` | string | **Required** | Links the pre-filter to a specific camera and continuously monitors the camera stream for changes or triggers in the background. | The name of your camera component. | +| `camera_name` | string | Optional | Links the pre-filter to a specific camera and continuously monitors the camera stream for changes or triggers in the background. | The name of your camera component. | If the camera name is not provided, you can input your own image from the CLI | | `threshold` | int | Optional | Determines the sensitivity of the pre-filter trigger. This enables the pre-filter to detect significant motion such as boat or wave movements, and identifies objects like other boats, buoys, or any deviations from typical water patterns. | 0 to 1
Default: `0.25` | | `max_frequency_hz`| int | Optional | Determines the frequency that the vision service monitors the background camera stream for changes. If your scene changes very slowly set this below 1. | 1 to 10
Default: `10` | | `excluded_region` | object | Optional | Specifies areas within the cameras view to ignore. This is useful for excluding static parts of the camera stream, like parts of the boat. | A list of coordinates in frame. | From 48c5a86ebdef695a0336618c3d7fd0572d7f59bd Mon Sep 17 00:00:00 2001 From: Emerald Date: Mon, 22 Jul 2024 11:52:56 -0400 Subject: [PATCH 05/12] readme changes again --- README.md | 2 +- oceanprefilter/oceanprefilter.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f496d3e..9acdb38 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ Copy and paste the following attribute template into your vision service's attri | Name | Type | Inclusion | Description | Value | |-------|-------|-----------|-------------| ------| -| `camera_name` | string | Optional | Links the pre-filter to a specific camera and continuously monitors the camera stream for changes or triggers in the background. | The name of your camera component. | If the camera name is not provided, you can input your own image from the CLI | +| `camera_name` | string | Optional | Links the pre-filter to a specific camera and continuously monitors the camera stream for changes or triggers in the background. | The name of your camera component. If the camera name is not provided, you can input your own image from the CLI | | `threshold` | int | Optional | Determines the sensitivity of the pre-filter trigger. This enables the pre-filter to detect significant motion such as boat or wave movements, and identifies objects like other boats, buoys, or any deviations from typical water patterns. | 0 to 1
Default: `0.25` | | `max_frequency_hz`| int | Optional | Determines the frequency that the vision service monitors the background camera stream for changes. If your scene changes very slowly set this below 1. | 1 to 10
Default: `10` | | `excluded_region` | object | Optional | Specifies areas within the cameras view to ignore. This is useful for excluding static parts of the camera stream, like parts of the boat. | A list of coordinates in frame. | diff --git a/oceanprefilter/oceanprefilter.go b/oceanprefilter/oceanprefilter.go index c39f22c..852ad39 100644 --- a/oceanprefilter/oceanprefilter.go +++ b/oceanprefilter/oceanprefilter.go @@ -64,7 +64,7 @@ type Config struct { // this Validate checks if the camera and detector(optional) exist for the module's vision model. func (cfg *Config) Validate(path string) ([]string, error) { if cfg.CameraName == "" { - return []string{}, nil + return nil, nil } return []string{cfg.CameraName}, nil } From 0a31fdc38613f76e1b600c132811d595c46785c5 Mon Sep 17 00:00:00 2001 From: Emerald Zhang <54640231+Emerald-Z@users.noreply.github.com> Date: Mon, 22 Jul 2024 14:11:59 -0400 Subject: [PATCH 06/12] Delete oceanprefilter/test.go --- oceanprefilter/test.go | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 oceanprefilter/test.go diff --git a/oceanprefilter/test.go b/oceanprefilter/test.go deleted file mode 100644 index 1de444f..0000000 --- a/oceanprefilter/test.go +++ /dev/null @@ -1,23 +0,0 @@ -package oceanprefilter - - -import ( - "fmt" - "image" - "os" -) - -f, err := os.Open("") - -defer f.Close() -image, _, err := image.Decode(f) - -rc := runConfig{} -rc.threshold = 0.25 - -res, err = inference(f, rc) -if err != nil { - fmt.Printf("err") -} - -fmt.Printf("%+v\n", res) \ No newline at end of file From 8ac46452533ec8c19cdd0db31954e689b22d3b3b Mon Sep 17 00:00:00 2001 From: Emerald Date: Mon, 22 Jul 2024 15:00:30 -0400 Subject: [PATCH 07/12] edits for pr revew: changed tests, created example --- README.md | 13 ++- example/main.go | 53 +++++++++++ example/test.libsvm | 20 ++++ example/xg_boost_dump.json | 142 ++++++++++++++++++++++++++++ oceanprefilter/histogram_compare.go | 6 +- oceanprefilter/ml_filtering.go | 2 +- oceanprefilter/oceanprefilter.go | 80 ++++++---------- oceanprefilter/prefilter_test.go | 101 +++++--------------- oceanprefilter/test.go | 23 ----- oceanprefilter/test_data/2288.jpg | Bin 0 -> 24851 bytes oceanprefilter/utils.go | 18 ++-- oceanprefilter/xgboost.go | 16 ++-- 12 files changed, 301 insertions(+), 173 deletions(-) create mode 100644 example/main.go create mode 100644 example/test.libsvm create mode 100644 example/xg_boost_dump.json delete mode 100644 oceanprefilter/test.go create mode 100644 oceanprefilter/test_data/2288.jpg diff --git a/README.md b/README.md index 9acdb38..cd6b42a 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ This module implements the [`rdk:service:vision` API](https://docs.viam.com/ml/v When you configure a machine with this module, the module: - Locates the horizon, crops the image to only include the water, and then divides the water into patches. -- Performs feature extraction on the resulting patches, average pooling the the patches with a window size of (10, 2) and taking the RGB mean of each sub-patch -- Classifies the frame using XGBoost - this will trigger if any patch in the given image is found interesting +- Performs feature extraction on the resulting patches, average pooling the the patches with a window size of (10, 2) and taking the mean of the R, G, B channels for each resulting sub-patch +- Classifies the frame using XGBoost - this will trigger if any patch in the given image is found "interesting" Strong motion of the waves or bobbing up-and-down of the boat can trigger the pre-filter. This vision service only returns one label classification called `TRIGGER` with a confidence of `1.0`. @@ -56,7 +56,14 @@ Copy and paste the following attribute template into your vision service's attri | Name | Type | Inclusion | Description | Value | |-------|-------|-----------|-------------| ------| -| `camera_name` | string | Optional | Links the pre-filter to a specific camera and continuously monitors the camera stream for changes or triggers in the background. | The name of your camera component. If the camera name is not provided, you can input your own image from the CLI | +| `camera_name` | string | Optional | Links the pre-filter to a specific camera and continuously monitors the camera stream for changes or triggers in the background. | The name of your camera component. If the camera name is not provided, you can input your own image from the VIAM API | | `threshold` | int | Optional | Determines the sensitivity of the pre-filter trigger. This enables the pre-filter to detect significant motion such as boat or wave movements, and identifies objects like other boats, buoys, or any deviations from typical water patterns. | 0 to 1
Default: `0.25` | | `max_frequency_hz`| int | Optional | Determines the frequency that the vision service monitors the background camera stream for changes. If your scene changes very slowly set this below 1. | 1 to 10
Default: `10` | | `excluded_region` | object | Optional | Specifies areas within the cameras view to ignore. This is useful for excluding static parts of the camera stream, like parts of the boat. | A list of coordinates in frame. | + +### Example +The test module example gives an example of how to run/use the service +provide your test directory to the module in the form of a command line argument +``` + run main.go +``` \ No newline at end of file diff --git a/example/main.go b/example/main.go new file mode 100644 index 0000000..789a6cc --- /dev/null +++ b/example/main.go @@ -0,0 +1,53 @@ +package main + +import ( + _ "embed" + "fmt" + "image" + "os" + "path/filepath" + + xgb "github.com/Elvenson/xgboost-go" + "github.com/Elvenson/xgboost-go/activation" + "github.com/viamrobotics/ocean-prefilter/oceanprefilter" +) + +//go:embed xg_boost_dump.json +var modelbytes []byte + +func main() { + dir := os.Args[1] + fmt.Println(dir) + files, _ := os.ReadDir(dir) + + rc := oceanprefilter.RunConfig{} + ensemble, err := xgb.LoadXGBoostFromJSONBytes(modelbytes, + "", 2, 8, &activation.Softmax{}) + + if err != nil { + fmt.Println(err) + } + + rc.Model = ensemble + rc.Threshold = 0.25 + rect := image.Rectangle{ + Min: image.Point{X: 250, Y: 350}, + Max: image.Point{X: 580, Y: 480}, + } + + rc.ExcludedZone = &rect + for _, file := range files { + fp := filepath.Join(dir, file.Name()) + f, _ := os.Open(fp) + + defer f.Close() + img, _, _ := image.Decode(f) + + res, err := oceanprefilter.MakeInference(img, rc) + if err != nil { + fmt.Println("error making inference: ", err) + } else { + fmt.Printf("output is %t: ", res) + } + } +} diff --git a/example/test.libsvm b/example/test.libsvm new file mode 100644 index 0000000..27809e5 --- /dev/null +++ b/example/test.libsvm @@ -0,0 +1,20 @@ +0 0:88.90000000000001 1:88.90000000000001 2:88.90000000000001 3:88.90000000000001 4:87.5 5:87.5 6:87.5 7:87.5 8:91.23333333333333 9:91.23333333333333 10:91.23333333333333 11:91.23333333333333 12:90.43333333333334 13:90.43333333333334 14:90.43333333333334 15:90.43333333333334 16:87.26666666666667 17:87.26666666666667 18:87.26666666666667 19:87.26666666666667 20:87.56666666666666 21:87.56666666666666 22:87.56666666666666 23:87.56666666666666 24:91.5 25:91.5 26:91.5 27:91.5 28:87.7 29:87.7 30:87.7 31:87.7 32:88.7 33:88.7 34:88.7 35:88.7 36:91.3 37:91.3 38:91.3 39:91.3 40:90.96666666666667 41:90.96666666666667 42:90.96666666666667 43:90.96666666666667 44:88.06666666666666 45:88.06666666666666 46:88.06666666666666 47:88.06666666666666 48:94.7 49:94.7 50:94.7 51:94.7 52:96.3 53:96.25 54:96.2 55:96.2 56:92.63333333333334 57:92.63333333333334 58:92.63333333333334 59:92.63333333333334 60:91.93333333333334 61:91.93333333333334 62:91.93333333333334 63:91.93333333333334 64:95.83333333333333 65:95.83333333333333 66:95.83333333333333 67:95.83333333333333 68:92.63333333333334 69:91.33333333333333 70:89.38333333333334 71:87.98333333333333 72:90.58333333333333 73:92.08333333333333 74:93.88333333333334 75:95.23333333333333 76:91.33333333333333 77:89.83333333333333 78:88.03333333333333 79:86.36666666666666 80:94.01666666666667 81:93.86666666666666 82:93.86666666666666 83:93.91666666666667 84:94.51666666666667 85:95.11666666666666 86:95.86666666666666 87:96.56666666666666 88:98.46666666666667 89:98.46666666666667 90:98.46666666666667 91:98.46666666666667 92:104.8166666666667 93:99.91666666666667 94:93.26666666666667 95:88.61666666666666 96:86.71666666666667 97:87.66666666666667 98:89.11666666666666 99:90.16666666666667 100:83.63333333333334 101:83.63333333333334 102:83.63333333333334 103:83.63333333333334 104:75.33333333333333 105:75.33333333333333 106:75.33333333333333 107:75.15000000000001 108:71.86666666666666 109:71.63333333333334 110:71.63333333333334 111:71.63333333333334 112:74.43333333333334 113:74.43333333333334 114:74.43333333333334 115:74.40000000000001 116:75.8 117:75.76666666666667 118:75.76666666666667 119:75.76666666666667 120:81.36666666666666 121:81.36666666666666 122:81.36666666666666 123:81.43333333333334 124:85.11666666666666 125:85.13333333333334 126:85.13333333333334 127:85.13333333333334 128:82.63333333333334 129:82.63333333333334 130:82.63333333333334 131:82.63333333333334 132:79.13333333333334 133:79.13333333333334 134:79.13333333333334 135:79.13333333333334 136:82.83333333333333 137:82.83333333333333 138:82.83333333333333 139:82.83333333333333 140:80.66666666666667 141:80.66666666666667 142:80.66666666666667 143:80.66666666666667 144:77.66666666666667 145:77.66666666666667 146:77.66666666666667 147:77.66666666666667 148:87 149:87 150:87 151:87 152:87.8 153:87.8 154:87.75 155:87.7 156:89.56666666666666 157:89.56666666666666 158:89.56666666666666 159:89.56666666666666 160:85.06666666666666 161:85.06666666666666 162:85.06666666666666 163:85.06666666666666 164:83.03333333333333 165:83.03333333333333 166:83.03333333333333 167:83.03333333333333 168:77.53333333333333 169:77.53333333333333 170:77.53333333333333 171:77.41666666666667 172:82.66666666666667 173:82.53333333333333 174:82.53333333333333 175:82.53333333333333 176:85.53333333333333 177:85.53333333333333 178:85.53333333333333 179:85.53333333333333 180:86.76666666666667 181:86.91666666666667 182:86.71666666666667 183:86.86666666666666 184:79.86666666666666 185:79.31666666666666 186:78.46666666666667 187:77.76666666666667 188:78.16666666666667 189:78.16666666666667 190:78.16666666666667 191:78.16666666666667 192:75.36666666666666 193:79.51666666666667 194:85.36666666666666 195:89.51666666666667 196:90.81666666666666 197:88.41666666666667 198:84.76666666666667 199:82.11666666666666 200:76.46666666666667 201:76.46666666666667 202:76.46666666666667 203:76.46666666666667 204:77.06666666666666 205:77.06666666666666 206:77.06666666666666 207:76.90000000000001 208:73.33333333333333 209:73.13333333333334 210:73.13333333333334 211:73.13333333333334 212:74.53333333333333 213:74.53333333333333 214:74.53333333333333 215:74.46666666666667 216:75.46666666666667 217:75.43333333333334 218:75.43333333333334 219:75.43333333333334 220:77.33333333333333 221:77.33333333333333 222:77.33333333333333 223:77.33333333333333 224:76.83333333333333 225:76.86666666666666 226:76.86666666666666 227:76.86666666666666 228:83.66666666666667 229:82.41666666666667 230:80.41666666666667 231:79.2 232:78.96666666666667 233:78.96666666666667 234:78.96666666666667 235:78.96666666666667 236:80.16666666666667 237:80.16666666666667 238:80.16666666666667 239:80.16666666666667 240:80.46666666666667 241:80.46666666666667 242:80.46666666666667 243:80.46666666666667 244:80.66666666666667 245:80.66666666666667 246:80.66666666666667 247:80.66666666666667 248:84.53333333333333 249:84.53333333333333 250:84.53333333333333 251:84.53333333333333 252:85.33333333333333 253:84.83333333333333 254:84.48333333333333 255:84.28333333333333 256:85.7 257:83.3 258:80.09999999999999 259:77.7 260:70.55 261:72.09999999999999 262:74.25 263:75.8 264:82.51666666666667 265:81.01666666666667 266:78.86666666666666 267:77.21666666666667 268:81.86666666666666 269:81.86666666666666 270:81.86666666666666 271:81.78333333333333 272:83.5 273:84.95 274:87.2 275:88.7 276:83.09999999999999 277:83.09999999999999 278:83.09999999999999 279:83.09999999999999 280:88.16666666666667 281:88.06666666666666 282:88.16666666666667 283:88.21666666666667 284:87.76666666666667 285:87.76666666666667 286:87.76666666666667 287:87.76666666666667 288:89.8 289:89.8 290:89.8 291:89.8 292:88.8 293:89.59999999999999 294:90.5 295:91 296:86.46666666666667 297:86.41666666666667 298:86.41666666666667 299:86.36666666666666 300:78.36666666666666 301:78.36666666666666 302:78.36666666666666 303:78.36666666666666 304:85.26666666666667 305:85.26666666666667 306:85.26666666666667 307:85.26666666666667 308:80.86666666666666 309:80.86666666666666 310:80.86666666666666 311:80.86666666666666 312:85.36666666666666 313:85.36666666666666 314:85.36666666666666 315:85.03333333333333 316:81.66666666666667 317:81.33333333333333 318:81.33333333333333 319:81.33333333333333 320:75.48333333333333 321:73.18333333333334 322:70.03333333333333 323:67.75 324:80.73333333333333 325:80.73333333333333 326:80.73333333333333 327:80.73333333333333 328:90.88333333333334 329:88.68333333333334 330:85.28333333333333 331:83.03333333333333 332:85.36666666666666 333:85.36666666666666 334:85.36666666666666 335:85.36666666666666 336:84.76666666666667 337:84.76666666666667 338:84.76666666666667 339:84.76666666666667 340:81.66666666666667 341:81.66666666666667 342:81.66666666666667 343:81.66666666666667 344:83.06666666666666 345:83.06666666666666 346:83.06666666666666 347:83.06666666666666 348:81.46666666666667 349:83.46666666666667 350:87.01666666666667 351:89.06666666666666 352:82.66666666666667 353:81.21666666666667 354:79.86666666666666 355:78.41666666666667 356:74.8 357:79.09999999999999 358:86 359:90.40000000000001 360:89.15000000000001 361:87.65000000000001 362:85.5 363:84.09999999999999 364:92.8 365:94.2 366:96.40000000000001 367:97.84999999999999 368:86 369:86 370:86 371:86 372:79.7 373:78.05 374:75.90000000000001 375:74.3 376:83.59999999999999 377:84.34999999999999 378:85.59999999999999 379:86.40000000000001 380:88.56666666666666 381:88.56666666666666 382:88.56666666666666 383:88.56666666666666 384:86.86666666666666 385:86.86666666666666 386:86.86666666666666 387:86.86666666666666 388:80.90000000000001 389:80.90000000000001 390:80.90000000000001 391:80.90000000000001 392:81.09999999999999 393:81.09999999999999 394:81.09999999999999 395:81.2 396:79.46666666666667 397:79.46666666666667 398:79.46666666666667 399:79.46666666666667 400:70.66666666666667 401:70.66666666666667 402:70.66666666666667 403:70.66666666666667 404:74.36666666666666 405:74.36666666666666 406:74.36666666666666 407:74.36666666666666 408:79.93333333333334 409:79.93333333333334 410:79.93333333333334 411:79.93333333333334 412:81.08333333333333 413:84.33333333333333 414:88.73333333333333 415:91.86666666666666 416:84.06666666666666 417:84.03333333333333 418:84.03333333333333 419:84.03333333333333 420:79.78333333333333 421:78.38333333333334 422:76.53333333333333 423:75.08333333333333 424:80.63333333333334 425:80.66666666666667 426:80.66666666666667 427:80.66666666666667 428:75.76666666666667 429:75.76666666666667 430:75.76666666666667 431:75.8 432:69.11666666666666 433:72.31666666666666 434:76.76666666666667 435:79.96666666666667 436:79.76666666666667 437:79.76666666666667 438:79.76666666666667 439:79.81666666666666 440:79.56666666666666 441:79.56666666666666 442:79.56666666666666 443:79.56666666666666 444:84.06666666666666 445:84.06666666666666 446:83.96666666666667 447:83.96666666666667 448:82.66666666666667 449:84.01666666666667 450:85.81666666666666 451:87.31666666666666 452:87.56666666666666 453:85.31666666666666 454:82.36666666666666 455:80.31666666666666 456:76 457:80.7 458:86.84999999999999 459:91.55 460:90 461:90 462:90 463:90 464:91.34999999999999 465:88.05 466:83.84999999999999 467:80.65000000000001 468:84.3 469:84.3 470:84.3 471:84.3 472:89.09999999999999 473:89.09999999999999 474:89.09999999999999 475:89.09999999999999 476:88.7 477:86.95 478:84.7 479:83.45 480:89.66666666666667 481:89.66666666666667 482:89.66666666666667 483:89.66666666666667 484:91.86666666666666 485:91.86666666666666 486:91.86666666666666 487:91.86666666666666 488:87.8 489:87.8 490:87.8 491:87.8 492:90.40000000000001 493:90.40000000000001 494:90.40000000000001 495:90.40000000000001 496:90.43333333333334 497:90.43333333333334 498:90.43333333333334 499:90.43333333333334 500:68.56666666666666 501:68.56666666666666 502:68.56666666666666 503:68.56666666666666 504:64.21666666666667 505:67.91666666666667 506:73.11666666666666 507:76.76666666666667 508:76.23333333333333 509:76.23333333333333 510:76.23333333333333 511:76.23333333333333 512:73.63333333333334 513:74.08333333333333 514:74.63333333333334 515:75.13333333333334 516:71.83333333333333 517:71.83333333333333 518:71.83333333333333 519:71.83333333333333 520:80.33333333333333 521:80.33333333333333 522:80.33333333333333 523:80.33333333333333 524:84.76666666666667 525:84.76666666666667 526:84.76666666666667 527:84.76666666666667 528:78.66666666666667 529:78.66666666666667 530:78.66666666666667 531:78.66666666666667 532:84.01666666666667 533:84.46666666666667 534:85.01666666666667 535:85.46666666666667 536:82.21666666666667 537:82.31666666666666 538:82.16666666666667 539:82.16666666666667 540:79.96666666666667 541:79.96666666666667 542:79.96666666666667 543:79.96666666666667 544:85.86666666666666 545:89.61666666666666 546:94.86666666666666 547:98.51666666666667 548:100.7166666666667 549:96.96666666666667 550:91.76666666666667 551:88.06666666666666 552:89.41666666666667 553:93.96666666666667 554:99.91666666666667 555:104.1666666666667 556:99.13333333333334 557:95.88333333333334 558:91.38333333333334 559:88.28333333333333 560:88.03333333333333 561:88.03333333333333 562:88.03333333333333 563:88.03333333333333 564:85.91666666666667 565:85.51666666666667 566:84.91666666666667 567:84.51666666666667 568:85.36666666666666 569:85.36666666666666 570:85.36666666666666 571:85.36666666666666 572:85.46666666666667 573:85.46666666666667 574:85.46666666666667 575:85.46666666666667 576:82.71666666666667 577:83.81666666666666 578:85.36666666666666 579:86.41666666666667 580:93.91666666666667 581:93.51666666666667 582:93.01666666666667 583:92.51666666666667 584:91.26666666666667 585:91.26666666666667 586:91.26666666666667 587:91.26666666666667 588:89.90000000000001 589:89.90000000000001 590:89.90000000000001 591:89.90000000000001 592:81.59999999999999 593:81.59999999999999 594:81.59999999999999 595:81.59999999999999 596:84.3 597:84.3 598:84.3 599:84.3 600:73.33333333333333 601:73.33333333333333 602:73.33333333333333 603:73.33333333333333 604:76.08333333333333 605:76.03333333333333 606:75.93333333333334 607:75.93333333333334 608:75.40000000000001 609:75.40000000000001 610:75.40000000000001 611:75.40000000000001 612:72.8 613:72.8 614:72.8 615:72.8 616:74.53333333333333 617:74.53333333333333 618:74.53333333333333 619:74.53333333333333 620:73.03333333333333 621:73.03333333333333 622:73.03333333333333 623:73.03333333333333 624:77.06666666666666 625:77.06666666666666 626:77.06666666666666 627:77.06666666666666 628:75.66666666666667 629:75.66666666666667 630:75.66666666666667 631:75.66666666666667 632:74.46666666666667 633:74.46666666666667 634:74.46666666666667 635:74.46666666666667 636:80.56666666666666 637:79.71666666666667 638:78.51666666666667 639:77.71666666666667 640:84.76666666666667 641:84.76666666666667 642:84.76666666666667 643:84.76666666666667 644:84.36666666666666 645:85.21666666666667 646:86.41666666666667 647:87.16666666666667 648:70.66666666666667 649:70.71666666666667 650:70.76666666666667 651:70.76666666666667 652:79.91666666666667 653:80.81666666666666 654:81.86666666666666 655:82.51666666666667 656:89.2 657:89.2 658:89.25 659:89.3 660:80 661:80 662:80 663:80 664:74.86666666666666 665:74.86666666666666 666:74.86666666666666 667:74.86666666666666 668:72.96666666666667 669:72.96666666666667 670:72.96666666666667 671:72.96666666666667 672:72.76666666666667 673:72.76666666666667 674:72.76666666666667 675:72.76666666666667 676:67.41666666666667 677:70.61666666666666 678:75.16666666666667 679:78.21666666666667 680:78.96666666666667 681:76.01666666666667 682:71.86666666666666 683:69.06666666666666 684:74.86666666666666 685:74.86666666666666 686:74.86666666666666 687:74.86666666666666 688:82.46666666666667 689:80.66666666666667 690:78.21666666666667 691:76.41666666666667 692:79.36666666666666 693:79.36666666666666 694:79.36666666666666 695:79.36666666666666 696:77.7 697:77.7 698:77.7 699:77.7 700:80.53333333333333 701:80.53333333333333 702:80.53333333333333 703:80.53333333333333 704:83.33333333333333 705:83.33333333333333 706:83.33333333333333 707:83.33333333333333 708:84.5 709:84.5 710:84.5 711:84.5 712:85.5 713:85.5 714:85.5 715:85.5 716:85.03333333333333 717:85.03333333333333 718:85.03333333333333 719:85.03333333333333 720:82.13333333333334 721:82.13333333333334 722:82.13333333333334 723:82.09999999999999 724:81.26666666666667 725:81.26666666666667 726:81.26666666666667 727:81.26666666666667 728:83.86666666666666 729:85.96666666666667 730:89.51666666666667 731:91.36666666666666 732:91.66666666666667 733:91.66666666666667 734:91.66666666666667 735:91.66666666666667 736:92.61666666666666 737:93.36666666666666 738:94.61666666666666 739:95.41666666666667 740:85.88333333333334 741:86.65000000000001 742:87.84999999999999 743:88.65000000000001 744:89.25 745:89.7 746:90.59999999999999 747:91.25 748:88.90000000000001 749:88.90000000000001 750:88.90000000000001 751:88.90000000000001 752:76.34999999999999 753:78.7 754:81.75 755:83.88333333333334 756:86.46666666666667 757:86.40000000000001 758:86.40000000000001 759:86.40000000000001 760:82.40000000000001 761:82.40000000000001 762:82.40000000000001 763:82.43333333333334 764:80.75 765:83 766:86.25 767:88.45 768:87.7 769:87.7 770:87.7 771:87.63333333333334 772:90.06666666666666 773:90.06666666666666 774:90.06666666666666 775:90.06666666666666 776:90.06666666666666 777:90.06666666666666 778:90.06666666666666 779:89.96666666666667 780:89.36666666666666 781:89.16666666666667 782:88.76666666666667 783:88.46666666666667 784:81.46666666666667 785:81.46666666666667 786:81.46666666666667 787:81.46666666666667 788:84.61666666666666 789:86.46666666666667 790:88.91666666666667 791:90.71666666666667 792:81.76666666666667 793:81.76666666666667 794:81.76666666666667 795:81.76666666666667 796:81.55 797:83.81666666666666 798:87.01666666666667 799:89.31666666666666 +1 0:205.9 1:205.9 2:205.9 3:205.9 4:205.9 5:205.9 6:205.9 7:205.9 8:205.9 9:205.9 10:205.9 11:205.9 12:205.9 13:205.9 14:205.9 15:205.9 16:205.9 17:205.9 18:205.9 19:205.9 20:205.9 21:205.9 22:205.9 23:205.9 24:205.9666666666667 25:206.0166666666667 26:206.0166666666667 27:206.0166666666667 28:206.9166666666667 29:206.9166666666667 30:206.9166666666667 31:206.9166666666667 32:207.3166666666667 33:207.3166666666667 34:207.3166666666667 35:207.3166666666667 36:207.3166666666667 37:207.3166666666667 38:207.3166666666667 39:207.3166666666667 40:207.3166666666667 41:207.3166666666667 42:207.3166666666667 43:207.3166666666667 44:207.2166666666667 45:207.2166666666667 46:207.2166666666667 47:207.2333333333333 48:206.4333333333333 49:206.4 50:206.4 51:206.4 52:206.4 53:206.4 54:206.4 55:206.4 56:206.4 57:206.4 58:206.3333333333333 59:206.3333333333333 60:206.4 61:206.4 62:206.4 63:206.6 64:209.1 65:209.1333333333333 66:209.2 67:209.2 68:209.8 69:209.9333333333333 70:209.9333333333333 71:210.0666666666667 72:214.85 73:214.9 74:214.9 75:214.9 76:214.9 77:214.9 78:214.9 79:214.8833333333333 80:210.1333333333333 81:210 82:210 83:210 84:210 85:210 86:210 87:210 88:210.3666666666667 89:210.3666666666667 90:210.3666666666667 91:210.3666666666667 92:209.3666666666667 93:209.3666666666667 94:209.3666666666667 95:209.3666666666667 96:206 97:206 98:206 99:206 100:202.2833333333333 101:202.2833333333333 102:202.2833333333333 103:202.2833333333333 104:202.2833333333333 105:202.2833333333333 106:202.2833333333333 107:202.3 108:202.3166666666667 109:202.3166666666667 110:202.3166666666667 111:202.3166666666667 112:202.3166666666667 113:202.3166666666667 114:202.3166666666667 115:202.3666666666667 116:201.65 117:201.6833333333333 118:201.6833333333333 119:201.6833333333333 120:201.5833333333333 121:201.5833333333333 122:201.5833333333333 123:201.7 124:202.0166666666667 125:202.1833333333333 126:202.1833333333333 127:202.1833333333333 128:202.5833333333333 129:202.5833333333333 130:202.5833333333333 131:202.6166666666667 132:202.9833333333333 133:202.9833333333333 134:202.9833333333333 135:202.9833333333333 136:202.9833333333333 137:202.9833333333333 138:202.9833333333333 139:202.9833333333333 140:202.9833333333333 141:202.9833333333333 142:202.9833333333333 143:202.9833333333333 144:203.7833333333333 145:203.7833333333333 146:203.7833333333333 147:203.6333333333333 148:203.4833333333333 149:203.4666666666667 150:203.4666666666667 151:203.4666666666667 152:203.4666666666667 153:203.4666666666667 154:203.4666666666667 155:203.5 156:203.0166666666667 157:203.0333333333333 158:202.95 159:202.95 160:202.95 161:203.0333333333333 162:203.1166666666667 163:203.2 164:204.5833333333333 165:204.6 166:204.6333333333333 167:204.6666666666667 168:204.6666666666667 169:204.6666666666667 170:204.6666666666667 171:204.7333333333333 172:201.3166666666667 173:201.3666666666667 174:201.3666666666667 175:201.3666666666667 176:201.3666666666667 177:201.3666666666667 178:201.3666666666667 179:201.3333333333333 180:204.4666666666667 181:204.3666666666667 182:204.3666666666667 183:204.3666666666667 184:204.4 185:204.4333333333333 186:204.4333333333333 187:204.6166666666667 188:205.1666666666667 189:205.1666666666667 190:205.1 191:205.05 192:204.9 193:205 194:204.95 195:204.6666666666667 196:203.05 197:203.0666666666667 198:203.0666666666667 199:203.0666666666667 200:142.5 201:142.5 202:142.5 203:142.5 204:142.6 205:142.6 206:142.6 207:142.6333333333333 208:142.5166666666667 209:142.5833333333333 210:142.5833333333333 211:142.5833333333333 212:142.5833333333333 213:142.5833333333333 214:142.5833333333333 215:142.6333333333333 216:140.8 217:140.8 218:140.8 219:140.8 220:140.1 221:140.1 222:140.1 223:140.2666666666667 224:141.0833333333333 225:141.25 226:141.25 227:141.25 228:141.25 229:141.25 230:141.25 231:141.3333333333333 232:141.2 233:141.1666666666667 234:141.1666666666667 235:141.1666666666667 236:141.1666666666667 237:141.1666666666667 238:141.1666666666667 239:141.1666666666667 240:141.15 241:141.1666666666667 242:141.1666666666667 243:141.1666666666667 244:141.5666666666667 245:141.5666666666667 246:141.5666666666667 247:141.4166666666667 248:142.5833333333333 249:142.45 250:142.45 251:142.45 252:142.45 253:142.45 254:142.45 255:142.45 256:139.8666666666667 257:139.8833333333333 258:139.8833333333333 259:139.8833333333333 260:139.8833333333333 261:139.8833333333333 262:139.8833333333333 263:139.8833333333333 264:142.4833333333333 265:142.55 266:142.55 267:142.55 268:142.55 269:142.55 270:142.55 271:142.55 272:139.5166666666667 273:139.5166666666667 274:139.5166666666667 275:139.5166666666667 276:139.5166666666667 277:139.5166666666667 278:139.5166666666667 279:139.55 280:142.7166666666667 281:142.6833333333333 282:142.6166666666667 283:142.6166666666667 284:143.35 285:143.45 286:143.4666666666667 287:143.3833333333333 288:167.6333333333333 289:192.2833333333333 290:195.2666666666667 291:180.5666666666667 292:170.45 293:155.5 294:145.7 295:148.85 296:141.7833333333333 297:141.85 298:141.85 299:141.85 300:107.9333333333333 301:107.9333333333333 302:107.9333333333333 303:107.9333333333333 304:108.7333333333333 305:108.7333333333333 306:108.7333333333333 307:108.45 308:108.55 309:108.15 310:108.15 311:108.0166666666667 312:108.95 313:108.95 314:109.05 315:109.3333333333333 316:110.5833333333333 317:110.6666666666667 318:110.6666666666667 319:110.6666666666667 320:110 321:109.8666666666667 322:109.8666666666667 323:109.85 324:110.15 325:109.9833333333333 326:109.9833333333333 327:109.9833333333333 328:109.7833333333333 329:109.7833333333333 330:109.7833333333333 331:109.6666666666667 332:109.4166666666667 333:109.1333333333333 334:109.1333333333333 335:109.1333333333333 336:109.3333333333333 337:109.3333333333333 338:109.3333333333333 339:109.3666666666667 340:110.3 341:110.2666666666667 342:110.2666666666667 343:110.2666666666667 344:109.6666666666667 345:109.6666666666667 346:109.6666666666667 347:109.6166666666667 348:108.5166666666667 349:108.4333333333333 350:108.4333333333333 351:108.4333333333333 352:108.8333333333333 353:108.8333333333333 354:108.8333333333333 355:108.8833333333333 356:107.9833333333333 357:107.9 358:107.9 359:107.9 360:108.3 361:108.3 362:108.3 363:108.15 364:107.65 365:107.4333333333333 366:107.4333333333333 367:107.4333333333333 368:107.4333333333333 369:107.4333333333333 370:107.4333333333333 371:107.4166666666667 372:106.7 373:106.4333333333333 374:106.4333333333333 375:106.4333333333333 376:106.4333333333333 377:106.4333333333333 378:106.4333333333333 379:106.4333333333333 380:106.25 381:106.2166666666667 382:106.2166666666667 383:106.2166666666667 384:108.2166666666667 385:108.25 386:108.25 387:108.2833333333333 388:114.35 389:114.3166666666667 390:114.15 391:114.3333333333333 392:109.6 393:109.8333333333333 394:109.85 395:109.8 396:106.9333333333333 397:106.9333333333333 398:106.9333333333333 399:106.9333333333333 400:110.1333333333333 401:110.1333333333333 402:110.1333333333333 403:110.1333333333333 404:109.3333333333333 405:109.3333333333333 406:109.3333333333333 407:109.2166666666667 408:108.8333333333333 409:108.6666666666667 410:108.6 411:108.6 412:109 413:109.0666666666667 414:109.1333333333333 415:109.2666666666667 416:109.9166666666667 417:110 418:110 419:110.0666666666667 420:108.7666666666667 421:108.7666666666667 422:108.7 423:108.6833333333333 424:109.5166666666667 425:109.4 426:109.4 427:109.4 428:109.6 429:109.6 430:109.6 431:109.55 432:109.1333333333333 433:108.9333333333333 434:108.9333333333333 435:108.9333333333333 436:110.3333333333333 437:110.3333333333333 438:110.3333333333333 439:110.3833333333333 440:112.8666666666667 441:112.7833333333333 442:112.7833333333333 443:112.7833333333333 444:112.4833333333333 445:112.4833333333333 446:112.4833333333333 447:112.45 448:111.5 449:111.4 450:111.4 451:111.4 452:110.8 453:110.8 454:110.8 455:110.8 456:111.6 457:111.6 458:111.6 459:111.6 460:111.4 461:111.4 462:111.4 463:111.2833333333333 464:110.1666666666667 465:110 466:110 467:110 468:112.9 469:112.9 470:112.9 471:112.9 472:108.6666666666667 473:108.5333333333333 474:108.5333333333333 475:108.5333333333333 476:107.3333333333333 477:107.3333333333333 478:107.3333333333333 479:107.3333333333333 480:110.5333333333333 481:110.5333333333333 482:110.5333333333333 483:110.5333333333333 484:111.3333333333333 485:111.3333333333333 486:111.3333333333333 487:111.3333333333333 488:110.85 489:110.9 490:110.9 491:110.9 492:112.1 493:112.1 494:112.1 495:112.0833333333333 496:110.6166666666667 497:110.6666666666667 498:110.6666666666667 499:110.6666666666667 500:108 501:108 502:108 503:108 504:107.2 505:107.2 506:107.2 507:107.2 508:107.3 509:107.3 510:107.3 511:107.3 512:109.6 513:109.6 514:109.6 515:109.6 516:107.8 517:107.8 518:107.8 519:107.8 520:107.7 521:107.7 522:107.7 523:107.7 524:106.0333333333333 525:106.0333333333333 526:106.0333333333333 527:106.0333333333333 528:108.1333333333333 529:108.1333333333333 530:108.1333333333333 531:108.1333333333333 532:107.3333333333333 533:107.3333333333333 534:107.3333333333333 535:107.3333333333333 536:108.0333333333333 537:108.0333333333333 538:108.0333333333333 539:108.0333333333333 540:108.4666666666667 541:108.3 542:108.3 543:108.3 544:109.1 545:109.1 546:109.1 547:109.1 548:110.8 549:110.8 550:110.8 551:110.8 552:109 553:109 554:109 555:109 556:109.2166666666667 557:109.25 558:109.25 559:109.25 560:110.25 561:110.25 562:110.25 563:110.2 564:108.8666666666667 565:108.8 566:108.8 567:108.8 568:106.1 569:106.1 570:106.1 571:106.1 572:107 573:107 574:107 575:107 576:107.1 577:107.1 578:107.1 579:107.1 580:109.1 581:109.1 582:109.1 583:109.1 584:109.8 585:109.8 586:109.8 587:109.8 588:106.5333333333333 589:106.5333333333333 590:106.5333333333333 591:106.5333333333333 592:108.8333333333333 593:108.8333333333333 594:108.8333333333333 595:108.8333333333333 596:110.6166666666667 597:110.65 598:110.65 599:110.65 600:107.5333333333333 601:107.5333333333333 602:107.5333333333333 603:107.5333333333333 604:106.5333333333333 605:106.5333333333333 606:106.5333333333333 607:106.5333333333333 608:103.5333333333333 609:103.5333333333333 610:103.5333333333333 611:103.5333333333333 612:106.7333333333333 613:106.7333333333333 614:106.7333333333333 615:106.75 616:107.1 617:107.1 618:107.1 619:107.1 620:105.2 621:105.2 622:105.2 623:105.2 624:101.8 625:101.8 626:101.8 627:101.8 628:106.6 629:106.6 630:106.6 631:106.6 632:104.9333333333333 633:104.9333333333333 634:104.9333333333333 635:104.9333333333333 636:104.1333333333333 637:104.1333333333333 638:104.1333333333333 639:104.1333333333333 640:105.7333333333333 641:105.6666666666667 642:105.6666666666667 643:105.6666666666667 644:107.8666666666667 645:107.8666666666667 646:107.8666666666667 647:107.8666666666667 648:108.4 649:108.4 650:108.4 651:108.4 652:109.1 653:109.1 654:109.1 655:108.9333333333333 656:102.2666666666667 657:102.1833333333333 658:102.1833333333333 659:102.1833333333333 660:105.1833333333333 661:105.1833333333333 662:105.1833333333333 663:105.2 664:107.2 665:107.2 666:107.2 667:107.2 668:106.8 669:106.8 670:106.8 671:106.8 672:104.5666666666667 673:104.5666666666667 674:104.5666666666667 675:104.5666666666667 676:105.2666666666667 677:105.2666666666667 678:105.2666666666667 679:105.1333333333333 680:104.3 681:104.3 682:104.3 683:104.3 684:104.3 685:104.3 686:104.3 687:104.3 688:105.4333333333333 689:105.4333333333333 690:105.4333333333333 691:105.4333333333333 692:107.7333333333333 693:107.7333333333333 694:107.7333333333333 695:107.6 696:106.7666666666667 697:106.6833333333333 698:106.6833333333333 699:106.6833333333333 700:104.2 701:104.2 702:104.2 703:104.2 704:104.4 705:104.4 706:104.4 707:104.4 708:102.8 709:102.8 710:102.8 711:102.8 712:104.8 713:104.8 714:104.8 715:104.8166666666667 716:108.2333333333333 717:108.2333333333333 718:108.2333333333333 719:108.2333333333333 720:106.1333333333333 721:106.1333333333333 722:106.1333333333333 723:106.1333333333333 724:104.9666666666667 725:104.9666666666667 726:104.9666666666667 727:104.9666666666667 728:109.4666666666667 729:109.4666666666667 730:109.4666666666667 731:109.3666666666667 732:105.9333333333333 733:105.8666666666667 734:105.8666666666667 735:105.8666666666667 736:103.4666666666667 737:103.4666666666667 738:103.4666666666667 739:103.4666666666667 740:105.0333333333333 741:105.0666666666667 742:105.0666666666667 743:105.0666666666667 744:109.4666666666667 745:109.4666666666667 746:109.4666666666667 747:109.4666666666667 748:107.4 749:107.4 750:107.4 751:107.4 752:101.6 753:101.6 754:101.6 755:101.4333333333333 756:99.53333333333333 757:99.43333333333334 758:99.43333333333334 759:99.43333333333334 760:103.6333333333333 761:103.6333333333333 762:103.6333333333333 763:103.65 764:103.8666666666667 765:103.8666666666667 766:103.8666666666667 767:103.8666666666667 768:105.9666666666667 769:105.9666666666667 770:105.9666666666667 771:105.9666666666667 772:108.8666666666667 773:108.8666666666667 774:108.8666666666667 775:108.8666666666667 776:108.5666666666667 777:108.5666666666667 778:108.5666666666667 779:108.4 780:107.6 781:107.6 782:107.6 783:107.6 784:106.4 785:106.4 786:106.4 787:106.3666666666667 788:103.6 789:103.55 790:103.55 791:103.55 792:107.35 793:107.35 794:107.35 795:107.2666666666667 796:103.8 797:103.7 798:103.7 799:103.7 +0 0:198.1666666666667 1:198.1666666666667 2:198.1666666666667 3:198.1666666666667 4:199.2166666666667 5:199.1166666666667 6:199.0666666666667 7:199.25 8:199.25 9:199.0666666666667 10:199.25 11:199.3 12:198.8 13:198.8 14:198.6666666666667 15:198.6666666666667 16:198.5666666666667 17:198.6666666666667 18:198.8 19:198.8 20:201.5 21:201.5 22:201.3666666666667 23:201.2333333333333 24:203.9333333333333 25:198.75 26:196.1833333333333 27:197.3166666666667 28:201.2666666666667 29:201.0666666666667 30:200.7 31:200.6166666666667 32:202.0166666666667 33:202.0833333333333 34:202.2 35:202.35 36:202 37:201.8 38:201.6666666666667 39:201.6833333333333 40:201.7333333333333 41:201.7333333333333 42:201.7333333333333 43:201.7333333333333 44:202.7333333333333 45:202.7333333333333 46:202.7333333333333 47:202.7333333333333 48:202.7333333333333 49:202.7333333333333 50:202.7333333333333 51:202.7333333333333 52:203.6333333333333 53:203.6333333333333 54:203.6333333333333 55:203.6333333333333 56:204.7333333333333 57:204.7333333333333 58:204.7333333333333 59:204.7333333333333 60:204.7333333333333 61:204.7333333333333 62:204.7333333333333 63:204.7333333333333 64:204.7333333333333 65:204.7333333333333 66:204.7333333333333 67:204.7333333333333 68:203.6333333333333 69:203.6333333333333 70:203.6333333333333 71:203.6333333333333 72:203.6333333333333 73:203.6333333333333 74:203.6333333333333 75:203.6333333333333 76:203.6333333333333 77:203.6333333333333 78:203.6333333333333 79:203.6333333333333 80:203.6333333333333 81:203.6333333333333 82:203.6333333333333 83:203.55 84:205.35 85:205.2833333333333 86:205.2 87:205.2333333333333 88:204.4166666666667 89:204.35 90:204.3333333333333 91:204.2833333333333 92:205.4833333333333 93:205.4166666666667 94:205.4666666666667 95:205.45 96:205.8833333333333 97:205.8 98:205.8 99:205.8 100:195.0166666666667 101:195.1666666666667 102:195.0666666666667 103:195.1166666666667 104:197.4666666666667 105:197.1333333333333 106:203.15 107:194.7166666666667 108:209.85 109:194.5666666666667 110:196.6333333333333 111:196.85 112:198.3333333333333 113:198.3 114:198.4166666666667 115:198.3833333333333 116:197.0666666666667 117:197.0333333333333 118:197.1333333333333 119:197 120:198.85 121:198.75 122:198.2333333333333 123:197.5166666666667 124:222.5833333333333 125:233.95 126:230.4333333333333 127:205.2666666666667 128:234.2 129:190.4333333333333 130:195.95 131:191.8666666666667 132:193.7833333333333 133:190.25 134:190.8833333333333 135:195.9 136:197.85 137:198.3833333333333 138:198.4666666666667 139:198.7166666666667 140:198.6166666666667 141:198.5166666666667 142:198.5833333333333 143:198.5833333333333 144:199.4833333333333 145:199.4833333333333 146:199.4833333333333 147:199.4833333333333 148:199.4833333333333 149:199.35 150:199.35 151:199.35 152:199.75 153:199.75 154:199.75 155:199.75 156:200.2166666666667 157:200.2166666666667 158:200.2833333333333 159:200.2833333333333 160:200.2833333333333 161:200.2833333333333 162:200.2833333333333 163:200.2833333333333 164:200.15 165:200.15 166:200.15 167:200.15 168:199.75 169:199.75 170:199.75 171:199.75 172:199.75 173:199.75 174:199.75 175:199.75 176:199.75 177:199.75 178:199.75 179:199.75 180:199.8833333333333 181:199.8833333333333 182:199.85 183:199.85 184:200.25 185:200.2 186:200.2 187:200.2333333333333 188:200.3 189:200.2333333333333 190:200.1166666666667 191:199.9833333333333 192:201.05 193:200.8166666666667 194:200.6833333333333 195:200.7166666666667 196:201.0333333333333 197:201.1166666666667 198:201.1166666666667 199:201.1166666666667 200:148.4166666666667 201:145 202:139.9 203:136.2 204:136.8 205:133.1 206:136.6333333333333 207:120.6666666666667 208:122.8666666666667 209:114.3833333333333 210:122.55 211:119.1333333333333 212:118.7 213:126.1333333333333 214:137.1166666666667 215:145.0333333333333 216:141.45 217:141.45 218:141.4833333333333 219:141.3 220:138.5166666666667 221:145.4166666666667 222:139.8666666666667 223:124.75 224:112.35 225:151.3833333333333 226:150.4333333333333 227:123.4166666666667 228:111.7666666666667 229:89.03333333333333 230:85.05 231:84.5 232:93.96666666666667 233:87.40000000000001 234:102.7666666666667 235:132.35 236:139.7333333333333 237:140.55 238:140.5166666666667 239:140.7666666666667 240:141.05 241:141.0166666666667 242:141.0166666666667 243:140.95 244:141.15 245:141.15 246:141.0166666666667 247:141.0166666666667 248:140.8166666666667 249:140.8666666666667 250:140.9 251:141.05 252:141.0666666666667 253:141.1666666666667 254:141.2 255:141.2333333333333 256:141 257:140.9666666666667 258:140.9666666666667 259:140.9 260:140.9 261:140.9 262:140.7833333333333 263:140.8166666666667 264:141.15 265:141.1666666666667 266:141.1666666666667 267:141.1666666666667 268:141.1666666666667 269:141.1666666666667 270:141.1666666666667 271:141.1666666666667 272:141.25 273:141.25 274:141.25 275:141.25 276:141.25 277:141.25 278:141.25 279:141.2666666666667 280:140.9666666666667 281:141 282:141 283:141 284:141.1 285:141.1 286:141.1 287:141.1 288:141.3666666666667 289:141.3833333333333 290:141.1666666666667 291:140.8666666666667 292:141.0833333333333 293:140.75 294:140.4166666666667 295:140.3666666666667 296:140.6 297:140.7166666666667 298:140.7166666666667 299:140.7166666666667 300:102.2166666666667 301:102.3166666666667 302:102.1666666666667 303:102.3166666666667 304:102.6666666666667 305:102.6666666666667 306:102.7166666666667 307:102.7666666666667 308:103.4666666666667 309:103.3333333333333 310:103.2166666666667 311:103.0166666666667 312:100.2833333333333 313:100.2166666666667 314:100.3166666666667 315:100.3666666666667 316:102.6666666666667 317:102.6 318:102.6 319:102.6 320:104.6166666666667 321:104.7666666666667 322:104.6666666666667 323:104.8333333333333 324:103.7666666666667 325:103.7333333333333 326:103.5666666666667 327:103.5833333333333 328:105.6 329:105.7666666666667 330:105.75 331:105.75 332:104.7333333333333 333:104.9666666666667 334:105.0166666666667 335:105.25 336:103.15 337:103.6333333333333 338:103.8333333333333 339:103.9666666666667 340:105.3166666666667 341:105.25 342:105.25 343:105.25 344:104.2166666666667 345:103.6333333333333 346:103.6333333333333 347:103.5666666666667 348:105.0666666666667 349:105.2 350:105.4666666666667 351:106.1166666666667 352:105.2666666666667 353:105.8666666666667 354:105.9333333333333 355:106.0333333333333 356:106.0666666666667 357:106 358:106 359:105.6666666666667 360:105.3333333333333 361:104.7666666666667 362:104.7666666666667 363:104.7666666666667 364:105.5 365:105.5 366:105.5 367:105.5 368:105.8333333333333 369:105.8333333333333 370:105.8333333333333 371:105.8333333333333 372:106.65 373:106.65 374:106.65 375:106.65 376:106.85 377:106.85 378:106.85 379:106.8666666666667 380:106.0666666666667 381:106.0666666666667 382:106.0666666666667 383:106.2 384:107.6666666666667 385:107.7333333333333 386:107.8 387:107.8666666666667 388:107.9333333333333 389:107.9 390:107.8 391:107.25 392:107.1833333333333 393:106.3833333333333 394:106.3333333333333 395:106.2 396:106.5333333333333 397:106.55 398:106.55 399:106.55 400:101.2333333333333 401:101.2333333333333 402:101.2333333333333 403:101.2333333333333 404:102.6333333333333 405:102.6333333333333 406:102.6333333333333 407:102.6333333333333 408:102.5666666666667 409:102.4333333333333 410:102.4333333333333 411:102.3 412:102.4666666666667 413:102.3333333333333 414:102.2 415:102.2 416:101.6 417:101.6 418:101.6 419:101.7333333333333 420:98.73333333333333 421:99 422:99 423:99 424:98.16666666666667 425:98.16666666666667 426:98.16666666666667 427:98.16666666666667 428:101.4 429:101.4 430:101.4 431:101.4 432:102 433:102.1333333333333 434:102.2 435:102.2666666666667 436:105.8666666666667 437:106 438:106.1333333333333 439:106.4 440:102.5333333333333 441:102.5333333333333 442:102.4 443:102.4 444:106.0666666666667 445:105.75 446:105.7333333333333 447:105.6666666666667 448:102.5333333333333 449:102.7333333333333 450:102.8666666666667 451:103.2 452:106.6 453:106.8666666666667 454:107 455:107 456:107.8666666666667 457:107.7333333333333 458:107.7333333333333 459:107.5 460:107.0333333333333 461:106.4 462:106.4 463:106.3333333333333 464:106 465:106 466:106 467:106 468:105.8 469:105.8 470:105.8 471:105.8 472:105.6666666666667 473:105.6666666666667 474:105.6666666666667 475:105.6666666666667 476:107.3666666666667 477:107.3666666666667 478:107.3666666666667 479:107.3666666666667 480:106.4333333333333 481:106.6666666666667 482:106.6666666666667 483:107.0666666666667 484:109.4 485:109.6666666666667 486:109.6666666666667 487:109.8666666666667 488:109.5333333333333 489:109.4 490:109.1333333333333 491:109 492:109.8 493:109.6 494:109.2 495:109 496:109.6 497:109.6 498:109.6 499:109.6 500:104.7333333333333 501:104.7333333333333 502:104.7333333333333 503:104.7333333333333 504:105.7333333333333 505:105.7333333333333 506:105.7333333333333 507:105.7333333333333 508:105.4 509:105.3333333333333 510:105.3333333333333 511:105.3333333333333 512:104.3333333333333 513:104.3333333333333 514:104.3333333333333 515:104.3333333333333 516:102.1333333333333 517:102.1333333333333 518:102.1333333333333 519:102.1333333333333 520:101.9333333333333 521:101.9333333333333 522:101.9333333333333 523:102 524:99.83333333333333 525:99.83333333333333 526:99.83333333333333 527:99.83333333333333 528:102 529:102 530:102 531:102 532:102 533:102 534:102 535:102 536:104.2 537:104.2 538:104.2 539:104.2 540:102.0666666666667 541:102 542:102 543:101.9333333333333 544:103.3333333333333 545:103.3333333333333 546:103.3333333333333 547:103.3333333333333 548:102.9333333333333 549:102.9333333333333 550:102.9333333333333 551:102.9333333333333 552:105.1333333333333 553:105.1333333333333 554:105.1333333333333 555:105.1333333333333 556:107.4333333333333 557:107.4333333333333 558:107.4333333333333 559:107.3666666666667 560:107.7 561:107.6333333333333 562:107.6333333333333 563:107.6333333333333 564:105.9333333333333 565:105.9333333333333 566:105.9333333333333 567:105.9333333333333 568:105.3333333333333 569:105.3333333333333 570:105.3333333333333 571:105.3333333333333 572:105.2333333333333 573:105.2333333333333 574:105.2333333333333 575:105.2333333333333 576:105.8333333333333 577:105.8333333333333 578:105.8333333333333 579:105.8333333333333 580:106.3333333333333 581:106.3333333333333 582:106.4666666666667 583:107.0666666666667 584:108.6666666666667 585:109.2666666666667 586:109.4 587:109.4 588:107.2 589:107.2 590:107.2 591:107.2 592:107.4 593:107.4 594:107.4 595:107.4 596:106.5 597:106.5 598:106.5 599:106.5 600:103 601:103 602:103 603:103 604:104 605:104 606:104 607:104 608:104.0666666666667 609:104.0666666666667 610:104.0666666666667 611:104 612:102.1333333333333 613:102.1333333333333 614:102.1333333333333 615:102.1333333333333 616:105.0333333333333 617:105.0333333333333 618:105.0333333333333 619:105.0333333333333 620:104.2 621:104.2666666666667 622:104.2666666666667 623:104.2666666666667 624:104.7 625:104.7 626:104.7 627:104.7 628:103.8666666666667 629:103.8666666666667 630:103.8666666666667 631:103.8666666666667 632:103.9666666666667 633:103.9666666666667 634:103.9666666666667 635:103.9666666666667 636:104.6666666666667 637:104.6666666666667 638:104.6666666666667 639:104.6666666666667 640:103.9333333333333 641:103.9333333333333 642:103.9333333333333 643:103.8666666666667 644:104.3333333333333 645:104.3333333333333 646:104.3333333333333 647:104.3333333333333 648:105.1333333333333 649:105.1333333333333 650:105.1333333333333 651:105 652:104.3333333333333 653:104.3333333333333 654:104.3333333333333 655:104.3333333333333 656:104.4333333333333 657:104.4333333333333 658:104.4333333333333 659:104.4333333333333 660:101.9666666666667 661:101.9666666666667 662:101.9666666666667 663:101.9 664:102.5333333333333 665:102.5333333333333 666:102.5333333333333 667:102.5333333333333 668:102.3333333333333 669:102.3333333333333 670:102.3333333333333 671:102.3333333333333 672:103.1333333333333 673:103.1333333333333 674:103.1333333333333 675:103.1333333333333 676:102.3333333333333 677:102.3333333333333 678:102.3333333333333 679:102.3333333333333 680:102.3 681:102.5 682:102.6333333333333 683:102.6333333333333 684:103.7333333333333 685:103.7333333333333 686:103.8666666666667 687:104 688:103.1666666666667 689:103.1666666666667 690:103.1666666666667 691:103.1666666666667 692:105.1666666666667 693:105.1666666666667 694:105.1666666666667 695:105.1666666666667 696:106.5666666666667 697:106.5666666666667 698:106.5666666666667 699:106.5666666666667 700:100.0833333333333 701:101.4833333333333 702:103.0833333333333 703:104.2333333333333 704:105.5333333333333 705:105.5333333333333 706:105.5333333333333 707:105.5333333333333 708:99.2 709:99.2 710:99.2 711:99.2 712:99 713:99 714:99 715:99 716:104.8 717:104.8 718:104.8 719:104.8 720:100.7 721:100.7 722:100.7 723:100.7 724:99.13333333333334 725:99.13333333333334 726:99.13333333333334 727:99.13333333333334 728:102.4333333333333 729:102.4333333333333 730:102.4333333333333 731:102.4333333333333 732:102.4333333333333 733:102.4333333333333 734:102.4333333333333 735:102.4333333333333 736:102.7333333333333 737:102.7333333333333 738:102.7333333333333 739:102.7333333333333 740:105.1333333333333 741:105.1333333333333 742:105.1333333333333 743:105.1333333333333 744:103.3333333333333 745:103.3333333333333 746:103.3333333333333 747:103.3333333333333 748:107.4 749:107.4 750:107.2666666666667 751:107.1333333333333 752:106.4666666666667 753:106.4666666666667 754:106.4 755:106.3333333333333 756:104.8 757:104.8 758:104.8 759:104.8 760:104 761:104 762:104 763:104 764:107.7333333333333 765:107.6666666666667 766:107.6666666666667 767:107.6 768:104.7333333333333 769:104.7333333333333 770:104.7333333333333 771:104.7333333333333 772:105.0333333333333 773:105.0333333333333 774:105.0333333333333 775:105.0333333333333 776:104.4 777:104.4666666666667 778:104.4666666666667 779:104.5333333333333 780:103.2 781:103.2 782:103.2 783:103.2 784:105.1 785:105.1 786:105.1 787:105.1 788:107.7 789:106.9 790:105.65 791:104.6 792:102.9 793:102.9 794:102.9 795:102.9 796:107.5333333333333 797:107.5333333333333 798:107.5333333333333 799:107.5333333333333 +0 0:67.90000000000001 1:68.8 2:70 3:70.8 4:66.90000000000001 5:66.90000000000001 6:66.90000000000001 7:66.96666666666667 8:58.6 9:58.6 10:58.6 11:58.6 12:57.9 13:57.9 14:57.9 15:57.9 16:64.96666666666667 17:64.96666666666667 18:64.96666666666667 19:64.96666666666667 20:64.56666666666666 21:64.56666666666666 22:64.56666666666666 23:64.5 24:76.76666666666667 25:76.05 26:75.15000000000001 27:74.59999999999999 28:76.09999999999999 29:76.75 30:77.65000000000001 31:78.3 32:83.18333333333334 33:83.83333333333333 34:84.68333333333334 35:85.23333333333333 36:84.93333333333334 37:84.38333333333334 38:83.48333333333333 39:82.83333333333333 40:78.83333333333333 41:78.83333333333333 42:78.83333333333333 43:78.83333333333333 44:74.33333333333333 45:74.33333333333333 46:74.33333333333333 47:74.3 48:77.06666666666666 49:77.06666666666666 50:77.06666666666666 51:77.06666666666666 52:79.46666666666667 53:79.46666666666667 54:79.46666666666667 55:79.46666666666667 56:79.33333333333333 57:79.63333333333334 58:79.93333333333334 59:80.33333333333333 60:80.53333333333333 61:81.28333333333333 62:82.43333333333334 63:83.28333333333333 64:77.28333333333333 65:77.83333333333333 66:78.68333333333334 67:79.38333333333334 68:81.53333333333333 69:81.53333333333333 70:81.53333333333333 71:81.53333333333333 72:83.33333333333333 73:83.33333333333333 74:83.33333333333333 75:83.33333333333333 76:81.88333333333334 77:83.23333333333333 78:85.13333333333334 79:86.58333333333333 80:78.73333333333333 81:79.13333333333334 82:79.83333333333333 83:80.18333333333334 84:81.93333333333334 85:78.28333333333333 86:73.23333333333333 87:69.58333333333333 88:75.73333333333333 89:75.76666666666667 90:75.96666666666667 91:75.96666666666667 92:78.03333333333333 93:78.03333333333333 94:78.03333333333333 95:78.03333333333333 96:75.2 97:76.25 98:77.5 99:78.25 100:62.03333333333333 101:62.03333333333333 102:62.03333333333333 103:62.03333333333333 104:65.43333333333334 105:65.43333333333334 106:65.43333333333334 107:65.43333333333334 108:64.83333333333333 109:64.83333333333333 110:64.83333333333333 111:64.83333333333333 112:67.03333333333333 113:67.03333333333333 114:67.03333333333333 115:67.03333333333333 116:70.90000000000001 117:71.45 118:72.55 119:73.2 120:72.3 121:72.3 122:72.3 123:72 124:68.3 125:67.96666666666667 126:67.96666666666667 127:67.96666666666667 128:66.31666666666666 129:65.66666666666667 130:64.76666666666667 131:64.01666666666667 132:65.73333333333333 133:65.73333333333333 134:65.73333333333333 135:65.73333333333333 136:67.83333333333333 137:67.83333333333333 138:67.83333333333333 139:67.83333333333333 140:68.86666666666666 141:68.86666666666666 142:68.86666666666666 143:68.86666666666666 144:72.56666666666666 145:72.56666666666666 146:72.56666666666666 147:72.56666666666666 148:71.56666666666666 149:71.56666666666666 150:71.56666666666666 151:71.56666666666666 152:73.76666666666667 153:73.76666666666667 154:73.76666666666667 155:73.76666666666667 156:82.68333333333334 157:79.78333333333333 158:75.08333333333333 159:72.23333333333333 160:72.93333333333334 161:72.93333333333334 162:72.98333333333333 163:72.93333333333334 164:71.88333333333334 165:73.38333333333334 166:75.48333333333333 167:76.93333333333334 168:68.73333333333333 169:68.73333333333333 170:68.73333333333333 171:68.73333333333333 172:74.03333333333333 173:74.03333333333333 174:74.03333333333333 175:74.03333333333333 176:75.78333333333333 177:75.28333333333333 178:74.58333333333333 179:73.83333333333333 180:74.03333333333333 181:74.03333333333333 182:74.03333333333333 183:74.03333333333333 184:70.73333333333333 185:70.83333333333333 186:70.83333333333333 187:70.83333333333333 188:73.06666666666666 189:73.06666666666666 190:73.06666666666666 191:73.2 192:73.93333333333334 193:73.93333333333334 194:73.93333333333334 195:73.96666666666667 196:71.05 197:72.45 198:74.3 199:75.75 200:58.93333333333333 201:58.93333333333333 202:58.93333333333333 203:58.93333333333333 204:62.23333333333333 205:62.23333333333333 206:62.23333333333333 207:62.23333333333333 208:63.53333333333333 209:63.53333333333333 210:63.53333333333333 211:63.53333333333333 212:62.63333333333333 213:62.63333333333333 214:62.63333333333333 215:62.5 216:57.65 217:57.28333333333333 218:56.78333333333333 219:56.48333333333333 220:58.53333333333333 221:58.53333333333333 222:58.53333333333333 223:58.65 224:67.2 225:67.2 226:67.2 227:67.2 228:61 229:61.05 230:61.15 231:61.13333333333333 232:60.86666666666667 233:60.83333333333334 234:60.83333333333334 235:60.83333333333334 236:65.03333333333333 237:65.03333333333333 238:65.03333333333333 239:65.03333333333333 240:59.1 241:59.06666666666667 242:59.06666666666667 243:59.06666666666667 244:61.96666666666667 245:61.96666666666667 246:61.96666666666667 247:61.96666666666667 248:61.76666666666667 249:61.66666666666666 250:61.66666666666666 251:61.66666666666666 252:60.66666666666666 253:60.66666666666666 254:60.66666666666666 255:60.66666666666666 256:63.33333333333334 257:63.38333333333333 258:63.33333333333334 259:63.33333333333334 260:70.73333333333333 261:70.73333333333333 262:70.73333333333333 263:70.73333333333333 264:67.63333333333334 265:66.23333333333333 266:64.23333333333333 267:62.53333333333333 268:63.23333333333333 269:63.23333333333333 270:63.23333333333333 271:63.23333333333333 272:59.43333333333333 273:61.48333333333333 274:64.93333333333334 275:67.03333333333333 276:61.88333333333333 277:61.98333333333333 278:61.98333333333333 279:62.03333333333333 280:63.33333333333334 281:63.33333333333334 282:63.33333333333334 283:63.33333333333334 284:63.53333333333333 285:63.53333333333333 286:63.53333333333333 287:63.43333333333333 288:64.05 289:63.96666666666667 290:63.96666666666667 291:63.96666666666667 292:59.76666666666667 293:59.76666666666667 294:59.76666666666667 295:59.76666666666667 296:63.65 297:66 298:69.25 299:71.45 300:67.2 301:67.2 302:67.2 303:67.2 304:68.7 305:68.7 306:68.7 307:68.7 308:65.13333333333334 309:65.13333333333334 310:65.13333333333334 311:65.13333333333334 312:65.73333333333333 313:65.73333333333333 314:65.73333333333333 315:65.40000000000001 316:63.71666666666667 317:62.55 318:61.2 319:60.35 320:62.9 321:62.9 322:62.9 323:63.06666666666667 324:68.09999999999999 325:68.36666666666666 326:68.36666666666666 327:68.36666666666666 328:72.06666666666666 329:72.06666666666666 330:72.06666666666666 331:71.90000000000001 332:69.06666666666666 333:68.76666666666667 334:68.76666666666667 335:68.76666666666667 336:66.56666666666666 337:66.56666666666666 338:66.56666666666666 339:66.56666666666666 340:67.03333333333333 341:67.03333333333333 342:67.03333333333333 343:67.03333333333333 344:62.33333333333334 345:62.33333333333334 346:62.33333333333334 347:62.33333333333334 348:61.4 349:60.96666666666667 350:60.86666666666667 351:60.66666666666666 352:64.46666666666667 353:64.46666666666667 354:64.46666666666667 355:64.46666666666667 356:63.63333333333333 357:64.38333333333334 358:65.58333333333333 359:66.38333333333334 360:60.43333333333333 361:60.43333333333333 362:60.43333333333333 363:60.43333333333333 364:61.93333333333333 365:61.98333333333333 366:62.03333333333333 367:62.08333333333334 368:66.23333333333333 369:66.23333333333333 370:66.23333333333333 371:66.23333333333333 372:60.43333333333333 373:61.68333333333333 374:63.83333333333334 375:65.08333333333333 376:60.83333333333334 377:60.83333333333334 378:60.83333333333334 379:60.83333333333334 380:54.16666666666666 381:54.16666666666666 382:54.16666666666666 383:54.16666666666666 384:53.46666666666667 385:53.46666666666667 386:53.46666666666667 387:53.3 388:52.88333333333333 389:52.88333333333333 390:52.88333333333333 391:52.88333333333333 392:56.28333333333333 393:56.28333333333333 394:56.28333333333333 395:56.4 396:61.03333333333333 397:61.16666666666666 398:61.06666666666667 399:61.06666666666667 400:50.63333333333333 401:50.63333333333333 402:50.63333333333333 403:50.63333333333333 404:55.73333333333333 405:55.73333333333333 406:55.73333333333333 407:55.73333333333333 408:61.93333333333333 409:61.93333333333333 410:61.93333333333333 411:61.93333333333333 412:67.13333333333334 413:67.13333333333334 414:67.13333333333334 415:67.11666666666666 416:64.68333333333334 417:65.96666666666667 418:67.66666666666667 419:69.01666666666667 420:65.66666666666667 421:65.66666666666667 422:65.66666666666667 423:65.68333333333334 424:66.61666666666666 425:66.63333333333334 426:66.63333333333334 427:66.53333333333333 428:66.93333333333334 429:66.93333333333334 430:66.93333333333334 431:66.95 432:65 433:65.03333333333333 434:65.08333333333333 435:65.03333333333333 436:66.83333333333333 437:66.68333333333334 438:66.88333333333334 439:66.78333333333333 440:67.16666666666667 441:67.16666666666667 442:67.16666666666667 443:67.16666666666667 444:72.26666666666667 445:71.46666666666667 446:70.41666666666667 447:69.56666666666666 448:67.88333333333334 449:67.33333333333333 450:66.43333333333334 451:66.03333333333333 452:68.63333333333334 453:68.63333333333334 454:68.63333333333334 455:68.63333333333334 456:65.26666666666667 457:64.46666666666667 458:63.26666666666667 459:62.46666666666667 460:61.66666666666666 461:61.66666666666666 462:61.66666666666666 463:61.66666666666666 464:60.96666666666667 465:60.96666666666667 466:60.96666666666667 467:60.96666666666667 468:67.16666666666667 469:67.16666666666667 470:67.16666666666667 471:67.16666666666667 472:64.01666666666667 473:64.06666666666666 474:63.96666666666667 475:64.01666666666667 476:68.26666666666667 477:68.26666666666667 478:68.26666666666667 479:68.26666666666667 480:61.76666666666667 481:61.81666666666667 482:61.86666666666667 483:61.81666666666667 484:60.16666666666666 485:60.16666666666666 486:60.16666666666666 487:60 488:60.83333333333334 489:60.81666666666667 490:60.81666666666667 491:60.81666666666667 492:58.71666666666667 493:58.71666666666667 494:58.71666666666667 495:58.75 496:60.18333333333333 497:60.95 498:61.85 499:62.4 500:62.25 501:60.85 502:58.95 503:57.55 504:62.5 505:62.5 506:62.5 507:62.5 508:62.06666666666667 509:62.06666666666667 510:62.06666666666667 511:62.06666666666667 512:62.26666666666667 513:62.26666666666667 514:62.26666666666667 515:62.26666666666667 516:65.93333333333334 517:65.31666666666666 518:64.26666666666667 519:63.61666666666667 520:57.66666666666666 521:57.66666666666666 522:57.66666666666666 523:57.66666666666666 524:57.96666666666667 525:57.96666666666667 526:58.06666666666667 527:58.06666666666667 528:65.76666666666667 529:65.76666666666667 530:65.76666666666667 531:65.78333333333333 532:65.59999999999999 533:65.48333333333333 534:65.43333333333334 535:65.43333333333334 536:64.13333333333334 537:64.13333333333334 538:64.13333333333334 539:64.08333333333333 540:66.13333333333334 541:66.13333333333334 542:66.13333333333334 543:66.13333333333334 544:64.03333333333333 545:66.48333333333333 546:69.78333333333333 547:71.88333333333334 548:65.91666666666667 549:66.36666666666666 550:67.26666666666667 551:67.96666666666667 552:61.86666666666667 553:61.86666666666667 554:61.86666666666667 555:61.86666666666667 556:64.63333333333334 557:64.28333333333333 558:63.83333333333334 559:63.48333333333333 560:67.43333333333334 561:67.43333333333334 562:67.43333333333334 563:67.43333333333334 564:68.56666666666666 565:68.56666666666666 566:68.56666666666666 567:68.56666666666666 568:66.96666666666667 569:66.96666666666667 570:66.96666666666667 571:66.96666666666667 572:64.73333333333333 573:64.83333333333333 574:64.83333333333333 575:64.83333333333333 576:69.33333333333333 577:67.78333333333333 578:65.68333333333334 579:64.23333333333333 580:67.66666666666667 581:67.51666666666667 582:67.41666666666667 583:67.46666666666667 584:69.46666666666667 585:69.46666666666667 586:69.46666666666667 587:69.34999999999999 588:69.65000000000001 589:69.59999999999999 590:69.59999999999999 591:69.59999999999999 592:69.5 593:69.5 594:69.5 595:69.58333333333333 596:69.98333333333333 597:69.31666666666666 598:68.41666666666667 599:67.86666666666666 600:61.95 601:59.8 602:56.65 603:54.25 604:53.1 605:53.1 606:53.1 607:53.1 608:54.83333333333334 609:54.83333333333334 610:54.83333333333334 611:54.83333333333334 612:56.83333333333334 613:56.83333333333334 614:56.83333333333334 615:56.83333333333334 616:52.63333333333333 617:52.63333333333333 618:52.68333333333333 619:52.68333333333333 620:56.63333333333333 621:56.63333333333333 622:56.63333333333333 623:56.63333333333333 624:57.23333333333333 625:57.23333333333333 626:57.23333333333333 627:57.23333333333333 628:64.03333333333333 629:64.03333333333333 630:64.03333333333333 631:63.7 632:62.9 633:62.73333333333333 634:62.73333333333333 635:62.73333333333333 636:67.28333333333333 637:65.18333333333334 638:61.98333333333333 639:59.73333333333333 640:65.73333333333333 641:65.73333333333333 642:65.73333333333333 643:65.73333333333333 644:67.08333333333333 645:65.18333333333334 646:63.23333333333333 647:61.73333333333333 648:63.26666666666667 649:63.26666666666667 650:63.21666666666667 651:63.26666666666667 652:64.06666666666666 653:64.06666666666666 654:64.06666666666666 655:64.06666666666666 656:64.13333333333334 657:64.48333333333333 658:64.88333333333334 659:65.23333333333333 660:71.93333333333334 661:71.93333333333334 662:71.93333333333334 663:71.93333333333334 664:67.86666666666666 665:67.86666666666666 666:67.86666666666666 667:67.86666666666666 668:70.96666666666667 669:70.96666666666667 670:70.96666666666667 671:70.81666666666666 672:70.23333333333333 673:70.23333333333333 674:70.23333333333333 675:70.23333333333333 676:68.73333333333333 677:68.08333333333333 678:67.08333333333333 679:66.23333333333333 680:68.76666666666667 681:68.76666666666667 682:68.76666666666667 683:68.76666666666667 684:66.86666666666666 685:66.86666666666666 686:66.86666666666666 687:66.86666666666666 688:67.33333333333333 689:67.33333333333333 690:67.33333333333333 691:67.33333333333333 692:68.93333333333334 693:68.93333333333334 694:68.93333333333334 695:68.93333333333334 696:65.16666666666667 697:65.16666666666667 698:65.16666666666667 699:65.21666666666667 700:48.9 701:48.9 702:49 703:49.05 704:45.8 705:45.8 706:45.8 707:45.8 708:45.26666666666667 709:45.26666666666667 710:45.26666666666667 711:45.26666666666667 712:53.26666666666667 713:55.11666666666667 714:57.56666666666667 715:58.96666666666667 716:58.15 717:57.35 718:56.15 719:55.25 720:55.3 721:55.3 722:55.3 723:55.3 724:55.65 725:54.8 726:53.9 727:53.3 728:56.1 729:56.1 730:56.1 731:56.03333333333333 732:56.23333333333333 733:56.2 734:56.2 735:56.2 736:49.2 737:47.65 738:45.75 739:44.35 740:46.3 741:46.3 742:46.3 743:46.3 744:45.8 745:45.85 746:45.9 747:45.9 748:53.06666666666667 749:53.06666666666667 750:53.06666666666667 751:53.06666666666667 752:50.76666666666667 753:50.76666666666667 754:50.76666666666667 755:50.76666666666667 756:50.73333333333333 757:50.83333333333334 758:50.83333333333334 759:50.83333333333334 760:50.93333333333333 761:50.93333333333333 762:50.93333333333333 763:50.93333333333333 764:54.95 765:54.86666666666667 766:54.86666666666667 767:54.86666666666667 768:57.06666666666667 769:57.06666666666667 770:57.06666666666667 771:57.03333333333333 772:56.73333333333333 773:57.53333333333333 774:58.68333333333333 775:59.63333333333333 776:54.68333333333333 777:53.18333333333333 778:51.43333333333333 779:49.98333333333333 780:55.2 781:55.2 782:55.2 783:55.2 784:53.5 785:56.6 786:61.25 787:64.15000000000001 788:63.1 789:63.1 790:63.1 791:63.1 792:58.6 793:58.6 794:58.6 795:58.6 796:61.4 797:61.4 798:61.4 799:61.4 +0 0:85.93333333333334 1:85.93333333333334 2:85.93333333333334 3:85.93333333333334 4:85.43333333333334 5:85.43333333333334 6:85.43333333333334 7:85.43333333333334 8:84.28333333333333 9:86.08333333333333 10:88.23333333333333 11:89.98333333333333 12:92.83333333333333 13:92.83333333333333 14:92.83333333333333 15:92.83333333333333 16:90.88333333333334 17:89.58333333333333 18:87.68333333333334 19:86.23333333333333 20:78.38333333333334 21:79.68333333333334 22:81.63333333333334 23:82.93333333333334 24:89.23333333333333 25:90.68333333333334 26:92.58333333333333 27:93.93333333333334 28:94.03333333333333 29:94.03333333333333 30:94.03333333333333 31:94.03333333333333 32:98.83333333333333 33:98.83333333333333 34:98.83333333333333 35:98.83333333333333 36:100.2333333333333 37:100.2333333333333 38:100.2333333333333 39:100.2333333333333 40:96.34999999999999 41:95.7 42:94.65000000000001 43:94 44:94.3 45:94.3 46:94.3 47:94.2 48:86.90000000000001 49:86.90000000000001 50:86.90000000000001 51:86.90000000000001 52:89 53:89 54:88.95 55:88.95 56:86.59999999999999 57:87.75 58:89.40000000000001 59:90.45 60:93.2 61:94.5 62:96.59999999999999 63:98.15000000000001 64:92.40000000000001 65:93.09999999999999 66:94.40000000000001 67:95.15000000000001 68:87.25 69:86.25 70:84.95 71:84.25 72:82.90000000000001 73:82.90000000000001 74:82.90000000000001 75:82.90000000000001 76:84 77:84 78:84 79:84 80:80.90000000000001 81:80.90000000000001 82:80.8 83:80.8 84:73.34999999999999 85:76.45 86:80.8 87:83.75 88:84.84999999999999 89:85.55 90:86.5 91:87.25 92:86.34999999999999 93:85.65000000000001 94:84.5 95:83.84999999999999 96:88.2 97:88.34999999999999 98:88.25 99:88.2 100:83.43333333333334 101:83.43333333333334 102:83.43333333333334 103:83.43333333333334 104:79.33333333333333 105:79.33333333333333 106:79.33333333333333 107:79.33333333333333 108:84.48333333333333 109:81.43333333333334 110:77.13333333333334 111:74.13333333333334 112:74.68333333333334 113:75.98333333333333 114:78.08333333333333 115:79.68333333333334 116:74.83333333333333 117:72.48333333333333 118:69.48333333333333 119:67.18333333333334 120:61.73333333333333 121:65.53333333333333 122:70.88333333333334 123:74.68333333333334 124:72.13333333333334 125:74.48333333333333 126:77.68333333333334 127:79.93333333333334 128:77.73333333333333 129:77.73333333333333 130:77.73333333333333 131:77.73333333333333 132:81.33333333333333 133:81.33333333333333 134:81.33333333333333 135:81.33333333333333 136:86.33333333333333 137:86.33333333333333 138:86.33333333333333 139:86.33333333333333 140:89.2 141:89.2 142:89.2 143:89.15000000000001 144:84.8 145:86.34999999999999 146:88.5 147:90.05 148:93 149:93 150:93 151:93 152:89.40000000000001 153:88.40000000000001 154:87.3 155:86.59999999999999 156:79.34999999999999 157:81.84999999999999 158:85.34999999999999 159:87.90000000000001 160:87.3 161:85.90000000000001 162:83.8 163:82.2 164:79.75 165:78.90000000000001 166:77.65000000000001 167:76.7 168:82.25 169:85.95 170:91.3 171:95.15000000000001 172:85.8 173:85.8 174:85.8 175:85.8 176:83 177:83 178:83.15000000000001 179:83.09999999999999 180:75.95 181:78.25 182:81.7 183:83.8 184:82.95 185:82.55 186:82.2 187:82 188:88.25 189:85.3 190:81 191:78.25 192:76.25 193:75.8 194:75 195:74.55 196:75 197:75.34999999999999 198:75.7 199:75.90000000000001 200:72.93333333333334 201:72.83333333333333 202:72.83333333333333 203:72.78333333333333 204:75.63333333333334 205:75.63333333333334 206:75.63333333333334 207:75.63333333333334 208:72.18333333333334 209:73.68333333333334 210:75.83333333333333 211:77.23333333333333 212:79.98333333333333 213:77.63333333333334 214:74.58333333333333 215:72.43333333333334 216:74.83333333333333 217:74.88333333333334 218:74.93333333333334 219:75.03333333333333 220:78.83333333333333 221:77.28333333333333 222:75.08333333333333 223:73.68333333333334 224:77.43333333333334 225:77.43333333333334 226:77.43333333333334 227:77.43333333333334 228:79.93333333333334 229:79.93333333333334 230:79.93333333333334 231:79.93333333333334 232:87.33333333333333 233:87.43333333333334 234:87.38333333333334 235:87.38333333333334 236:84.83333333333333 237:84.83333333333333 238:84.83333333333333 239:84.83333333333333 240:81.75 241:78.5 242:74.25 243:70.95 244:80.40000000000001 245:78.84999999999999 246:76.75 247:75.2 248:76.3 249:76.15000000000001 250:76.09999999999999 251:76.09999999999999 252:75.40000000000001 253:76.15000000000001 254:77.3 255:78.09999999999999 256:85.3 257:85.3 258:85.3 259:85.3 260:80.90000000000001 261:80.90000000000001 262:80.90000000000001 263:80.90000000000001 264:79.7 265:79.7 266:79.7 267:79.7 268:79 269:79 270:79 271:79 272:80.3 273:80.3 274:80.3 275:80.3 276:71 277:73.75 278:77.75 279:80.65000000000001 280:79.3 281:82.84999999999999 282:87.59999999999999 283:91.09999999999999 284:92.2 285:92.2 286:92.2 287:92.2 288:83.3 289:81.84999999999999 290:80 291:78.59999999999999 292:70.90000000000001 293:75.15000000000001 294:81.09999999999999 295:85.5 296:82.65000000000001 297:79.59999999999999 298:74.34999999999999 299:71.2 300:69.33333333333333 301:69.28333333333333 302:69.18333333333334 303:69.13333333333334 304:75.53333333333333 305:75.53333333333333 306:75.53333333333333 307:75.53333333333333 308:85.03333333333333 309:84.23333333333333 310:82.98333333333333 311:81.98333333333333 312:81.98333333333333 313:81.78333333333333 314:81.58333333333333 315:81.43333333333334 316:86.83333333333333 317:83.38333333333334 318:78.23333333333333 319:74.53333333333333 320:71.18333333333334 321:71.58333333333333 322:72.18333333333334 323:72.68333333333334 324:73.43333333333334 325:73.43333333333334 326:73.43333333333334 327:73.43333333333334 328:79.33333333333333 329:79.33333333333333 330:79.33333333333333 331:79.33333333333333 332:76.68333333333334 333:76.73333333333333 334:76.88333333333334 335:76.98333333333333 336:76.83333333333333 337:77.58333333333333 338:78.68333333333334 339:79.78333333333333 340:77.15000000000001 341:76.7 342:76 343:75.34999999999999 344:82.8 345:82.8 346:82.8 347:82.8 348:81.40000000000001 349:85.15000000000001 350:89.95 351:93.59999999999999 352:83.90000000000001 353:81.59999999999999 354:84.7 355:91.05 356:94.09999999999999 357:93.59999999999999 358:92.95 359:92.55 360:91.7 361:91.7 362:91.7 363:91.7 364:84.40000000000001 365:84.40000000000001 366:84.40000000000001 367:84.40000000000001 368:80.7 369:80.7 370:80.7 371:80.7 372:72.8 373:72.8 374:72.8 375:72.8 376:67.59999999999999 377:64.75 378:60.75 379:57.9 380:59.05 381:61.05 382:63.9 383:65.90000000000001 384:57.1 385:57.1 386:57.1 387:57.1 388:56.7 389:56.7 390:56.7 391:56.7 392:58.6 393:59.1 394:60.05 395:60.5 396:67.2 397:66.84999999999999 398:66.15000000000001 399:65.75 400:73.13333333333334 401:74.68333333333334 402:76.58333333333333 403:77.98333333333333 404:78.93333333333334 405:78.88333333333334 406:78.83333333333333 407:78.83333333333333 408:78.63333333333334 409:79.48333333333333 410:80.73333333333333 411:81.53333333333333 412:72.88333333333334 413:73.53333333333333 414:74.78333333333333 415:75.68333333333334 416:77.13333333333334 417:77.13333333333334 418:77.13333333333334 419:77.13333333333334 420:77.13333333333334 421:80.43333333333334 422:84.83333333333333 423:88.03333333333333 424:87.33333333333333 425:87.33333333333333 426:87.33333333333333 427:87.33333333333333 428:86.23333333333333 429:86.23333333333333 430:86.23333333333333 431:86.23333333333333 432:80.48333333333333 433:80.38333333333334 434:80.33333333333333 435:80.23333333333333 436:79.78333333333333 437:78.83333333333333 438:77.78333333333333 439:76.88333333333334 440:81.40000000000001 441:81.45 442:81.3 443:81.5 444:79.55 445:78.45 446:76.90000000000001 447:75.95 448:80.2 449:77.45 450:73.34999999999999 451:70.65000000000001 452:74.59999999999999 453:75.75 454:72.45 455:66.75 456:65.09999999999999 457:62.05 458:57.55 459:54.45 460:72.5 461:72.5 462:72.55 463:72.5 464:73.05 465:72.25 466:71.09999999999999 467:70.2 468:70.15000000000001 469:71.45 470:73.45 471:74.59999999999999 472:73.90000000000001 473:73.90000000000001 474:73.90000000000001 475:73.90000000000001 476:76.34999999999999 477:76.3 478:76.3 479:76.3 480:74.34999999999999 481:72.75 482:70.55 483:69 484:63.6 485:63.6 486:63.6 487:63.6 488:56.8 489:56.8 490:56.8 491:56.8 492:58.5 493:58.5 494:58.5 495:58.5 496:70 497:69.95 498:70 499:70 500:64.38333333333334 501:66.68333333333334 502:69.78333333333333 503:72.08333333333333 504:67.93333333333334 505:68.68333333333334 506:69.88333333333334 507:70.58333333333333 508:72.73333333333333 509:73.03333333333333 510:73.48333333333333 511:73.78333333333333 512:77.83333333333333 513:77.83333333333333 514:77.83333333333333 515:77.83333333333333 516:73.13333333333334 517:73.13333333333334 518:73.13333333333334 519:73.13333333333334 520:74.83333333333333 521:75.48333333333333 522:75.98333333333333 523:76.28333333333333 524:74.33333333333333 525:74.33333333333333 526:74.33333333333333 527:74.33333333333333 528:69.08333333333333 529:69.03333333333333 530:69.13333333333334 531:69.13333333333334 532:76.63333333333334 533:76.63333333333334 534:76.63333333333334 535:76.63333333333334 536:74.23333333333333 537:75.23333333333333 538:76.73333333333333 539:77.63333333333334 540:68.40000000000001 541:68.40000000000001 542:68.40000000000001 543:68.40000000000001 544:68.55 545:65.90000000000001 546:62.25 547:59.55 548:54.25 549:54.85 550:55.85 551:56.3 552:51.2 553:52.3 554:52.45 555:51.55 556:55.8 557:55.85 558:55.9 559:56 560:59.8 561:59.95 562:60.35 563:60.5 564:63.7 565:64.34999999999999 566:65.55 567:66.15000000000001 568:63.4 569:63.95 570:65.25 571:65.75 572:57.6 573:57.55 574:57.6 575:57.5 576:58.4 577:60.05 578:62.15 579:63.55 580:65.8 581:67.25 582:69.45 583:71.05 584:64.3 585:64.3 586:64.3 587:64.3 588:68.3 589:68.3 590:68.3 591:68.3 592:68.75 593:70.40000000000001 594:72.45 595:73.90000000000001 596:73.75 597:74.59999999999999 598:75.55 599:76.45 600:66.13333333333334 601:66.13333333333334 602:66.13333333333334 603:66.13333333333334 604:73.98333333333333 605:72.18333333333334 606:70.18333333333334 607:68.73333333333333 608:69.73333333333333 609:70.03333333333333 610:70.33333333333333 611:70.68333333333334 612:72.43333333333334 613:72.43333333333334 614:72.43333333333334 615:72.43333333333334 616:69.83333333333333 617:69.88333333333334 618:69.88333333333334 619:69.93333333333334 620:68.08333333333333 621:68.23333333333333 622:68.48333333333333 623:68.58333333333333 624:64.33333333333333 625:64.33333333333333 626:64.33333333333333 627:64.33333333333333 628:71.48333333333333 629:71.38333333333334 630:71.43333333333334 631:71.53333333333333 632:70.03333333333333 633:70.53333333333333 634:71.58333333333333 635:72.33333333333333 636:77.88333333333334 637:73.73333333333333 638:67.68333333333334 639:63.68333333333333 640:64.8 641:64.8 642:64.8 643:64.8 644:69.90000000000001 645:69.3 646:68.34999999999999 647:67.7 648:75.15000000000001 649:73.75 650:71.90000000000001 651:70.65000000000001 652:68.40000000000001 653:68.45 654:68.5 655:68.40000000000001 656:69.25 657:68.7 658:67.75 659:67.3 660:67.65000000000001 661:66.65000000000001 662:65.05 663:64.2 664:57.3 665:60.95 666:66.25 667:69.90000000000001 668:65.7 669:66.2 670:67.15000000000001 671:67.8 672:71.3 673:72.3 674:73.40000000000001 675:74.2 676:65.55 677:64.09999999999999 678:61.95 679:60.4 680:68.34999999999999 681:69.25 682:70.15000000000001 683:70.65000000000001 684:72.09999999999999 685:72.09999999999999 686:72.09999999999999 687:72.09999999999999 688:74.3 689:74.3 690:74.3 691:74.3 692:75.2 693:73.75 694:71.55 695:70.05 696:73.90000000000001 697:73.05 698:71.95 699:70.95 700:58.03333333333333 701:58.03333333333333 702:58.03333333333333 703:58.03333333333333 704:58.58333333333334 705:56.18333333333333 706:51.73333333333333 707:49.38333333333333 708:49.13333333333333 709:51.93333333333333 710:56.78333333333333 711:59.48333333333333 712:60.43333333333333 713:60.43333333333333 714:60.43333333333333 715:60.43333333333333 716:62.43333333333333 717:62.43333333333333 718:62.48333333333333 719:62.48333333333333 720:68.13333333333334 721:66.83333333333333 722:64.93333333333334 723:63.63333333333333 724:66.23333333333333 725:66.88333333333334 726:67.78333333333333 727:68.48333333333333 728:66.53333333333333 729:67.28333333333333 730:68.28333333333333 731:69.03333333333333 732:71.03333333333333 733:70.68333333333334 734:70.48333333333333 735:70.18333333333334 736:60.88333333333333 737:60.53333333333333 738:59.93333333333333 739:59.18333333333333 740:62.4 741:62.4 742:62.4 743:62.4 744:64.59999999999999 745:65.25 746:66.15000000000001 747:66.8 748:69.25 749:69.8 750:70.7 751:71.34999999999999 752:69 753:69 754:68.95 755:69.05 756:65.45 757:65.90000000000001 758:66.84999999999999 759:67.40000000000001 760:61.8 761:62.55 762:63.65 763:64.40000000000001 764:64.5 765:64.5 766:64.5 767:64.5 768:63.7 769:64.59999999999999 770:65.8 771:66.7 772:65.90000000000001 773:65.05 774:63.95 775:63 776:68.90000000000001 777:68.90000000000001 778:68.90000000000001 779:68.90000000000001 780:71.3 781:70.34999999999999 782:68.65000000000001 783:67.34999999999999 784:65.3 785:65.3 786:65.3 787:65.3 788:62.3 789:62.3 790:62.3 791:62.3 792:69.15000000000001 793:69.2 794:69.05 795:69.15000000000001 796:68.84999999999999 797:68.7 798:68.90000000000001 799:68.8 +0 0:24.63333333333333 1:24.63333333333333 2:24.63333333333333 3:24.63333333333333 4:30.63333333333333 5:30.63333333333333 6:30.63333333333333 7:30.63333333333333 8:35.33333333333334 9:35.33333333333334 10:35.33333333333334 11:35.33333333333334 12:34.73333333333333 13:34.73333333333333 14:34.73333333333333 15:34.73333333333333 16:36.83333333333334 17:36.83333333333334 18:36.83333333333334 19:36.83333333333334 20:32.23333333333333 21:32.23333333333333 22:32.23333333333333 23:32.23333333333333 24:36.53333333333333 25:36.53333333333333 26:36.53333333333333 27:36.53333333333333 28:31.13333333333333 29:31.13333333333333 30:31.13333333333333 31:31.13333333333333 32:34.53333333333333 33:34.53333333333333 34:34.53333333333333 35:34.53333333333333 36:36.53333333333333 37:36.53333333333333 38:36.53333333333333 39:36.53333333333333 40:39.53333333333333 41:39.53333333333333 42:39.53333333333333 43:39.53333333333333 44:37.53333333333333 45:37.53333333333333 46:37.53333333333333 47:37.53333333333333 48:39.43333333333333 49:39.43333333333333 50:39.43333333333333 51:39.43333333333333 52:35.63333333333333 53:35.63333333333333 54:35.63333333333333 55:35.63333333333333 56:37.43333333333333 57:37.43333333333333 58:37.43333333333333 59:37.43333333333333 60:38.68333333333333 61:37.23333333333333 62:35.33333333333334 63:33.93333333333333 64:37.13333333333333 65:37.13333333333333 66:37.13333333333333 67:37.13333333333333 68:35.93333333333333 69:35.93333333333333 70:35.93333333333333 71:35.93333333333333 72:31.83333333333333 73:31.83333333333333 74:31.83333333333333 75:31.83333333333333 76:36.33333333333334 77:36.33333333333334 78:36.33333333333334 79:36.33333333333334 80:35.33333333333334 81:35.33333333333334 82:35.33333333333334 83:35.33333333333334 84:36.03333333333333 85:36.03333333333333 86:36.03333333333333 87:36.03333333333333 88:36.23333333333333 89:36.23333333333333 90:36.23333333333333 91:36.23333333333333 92:33.43333333333333 93:33.43333333333333 94:33.43333333333333 95:33.43333333333333 96:36.13333333333333 97:36.13333333333333 98:36.13333333333333 99:36.13333333333333 100:30.73333333333333 101:30.73333333333333 102:30.73333333333333 103:30.73333333333333 104:32.73333333333333 105:32.73333333333333 106:32.73333333333333 107:32.73333333333333 108:34.83333333333334 109:34.83333333333334 110:34.83333333333334 111:34.83333333333334 112:36.33333333333334 113:36.33333333333334 114:36.33333333333334 115:36.33333333333334 116:38.83333333333334 117:38.83333333333334 118:38.83333333333334 119:38.83333333333334 120:38.43333333333333 121:38.43333333333333 122:38.43333333333333 123:38.43333333333333 124:37.43333333333333 125:37.43333333333333 126:37.43333333333333 127:37.43333333333333 128:43.63333333333333 129:43.63333333333333 130:43.63333333333333 131:43.63333333333333 132:44.63333333333333 133:44.63333333333333 134:44.63333333333333 135:44.63333333333333 136:44.43333333333333 137:44.43333333333333 138:44.43333333333333 139:44.43333333333333 140:46.73333333333333 141:46.73333333333333 142:46.73333333333333 143:46.73333333333333 144:41.23333333333333 145:41.23333333333333 146:41.23333333333333 147:41.23333333333333 148:36.43333333333333 149:36.43333333333333 150:36.43333333333333 151:36.43333333333333 152:37.33333333333334 153:37.33333333333334 154:37.33333333333334 155:37.33333333333334 156:35.13333333333333 157:35.13333333333333 158:35.13333333333333 159:35.13333333333333 160:39.13333333333333 161:36.93333333333333 162:33.63333333333333 163:31.53333333333333 164:34.73333333333333 165:34.73333333333333 166:34.73333333333333 167:34.73333333333333 168:39.13333333333333 169:39.33333333333334 170:39.33333333333334 171:39.33333333333334 172:36.83333333333334 173:36.83333333333334 174:36.83333333333334 175:36.83333333333334 176:37.63333333333333 177:37.63333333333333 178:37.63333333333333 179:37.63333333333333 180:39.73333333333333 181:39.73333333333333 182:39.73333333333333 183:39.73333333333333 184:39.53333333333333 185:39.53333333333333 186:39.53333333333333 187:39.53333333333333 188:38.73333333333333 189:38.73333333333333 190:38.73333333333333 191:38.73333333333333 192:43.43333333333333 193:43.43333333333333 194:43.43333333333333 195:43.43333333333333 196:40.13333333333333 197:40.13333333333333 198:40.13333333333333 199:40.13333333333333 200:37.33333333333334 201:37.33333333333334 202:37.33333333333334 203:37.33333333333334 204:36.43333333333333 205:36.43333333333333 206:36.43333333333333 207:36.43333333333333 208:37.43333333333333 209:37.43333333333333 210:37.43333333333333 211:37.43333333333333 212:37.03333333333333 213:37.03333333333333 214:37.03333333333333 215:37.03333333333333 216:38.43333333333333 217:38.43333333333333 218:38.43333333333333 219:38.43333333333333 220:39.93333333333333 221:39.93333333333333 222:39.93333333333333 223:39.93333333333333 224:41.43333333333333 225:41.43333333333333 226:41.43333333333333 227:41.43333333333333 228:44.73333333333333 229:44.73333333333333 230:44.73333333333333 231:44.73333333333333 232:42.33333333333334 233:42.33333333333334 234:42.33333333333334 235:42.33333333333334 236:38.33333333333334 237:38.33333333333334 238:38.33333333333334 239:38.33333333333334 240:38.33333333333334 241:38.33333333333334 242:38.33333333333334 243:38.33333333333334 244:38.83333333333334 245:38.83333333333334 246:38.83333333333334 247:38.83333333333334 248:39.73333333333333 249:39.73333333333333 250:39.73333333333333 251:39.73333333333333 252:41.73333333333333 253:41.73333333333333 254:41.73333333333333 255:41.73333333333333 256:43.83333333333334 257:43.83333333333334 258:43.83333333333334 259:43.83333333333334 260:43.53333333333333 261:43.53333333333333 262:43.53333333333333 263:43.53333333333333 264:41.93333333333333 265:41.93333333333333 266:41.93333333333333 267:41.93333333333333 268:35.98333333333333 269:35.18333333333333 270:34.33333333333334 271:33.68333333333333 272:36.83333333333334 273:36.83333333333334 274:36.83333333333334 275:36.83333333333334 276:36.43333333333333 277:36.43333333333333 278:36.43333333333333 279:36.43333333333333 280:37.53333333333333 281:37.53333333333333 282:37.53333333333333 283:37.53333333333333 284:37.23333333333333 285:37.23333333333333 286:37.23333333333333 287:37.23333333333333 288:37.33333333333334 289:37.38333333333333 290:37.38333333333333 291:37.43333333333333 292:39.73333333333333 293:39.73333333333333 294:39.73333333333333 295:39.73333333333333 296:39.53333333333333 297:39.53333333333333 298:39.53333333333333 299:39.53333333333333 300:32.13333333333333 301:32.13333333333333 302:32.13333333333333 303:32.13333333333333 304:33.13333333333333 305:33.13333333333333 306:33.13333333333333 307:33.13333333333333 308:33.73333333333333 309:33.73333333333333 310:33.73333333333333 311:33.73333333333333 312:32.83333333333334 313:32.83333333333334 314:32.83333333333334 315:32.83333333333334 316:36.33333333333334 317:36.33333333333334 318:36.33333333333334 319:36.33333333333334 320:36.43333333333333 321:36.43333333333333 322:36.43333333333333 323:36.43333333333333 324:36.63333333333333 325:36.63333333333333 326:36.63333333333333 327:36.63333333333333 328:37.63333333333333 329:37.63333333333333 330:37.63333333333333 331:37.63333333333333 332:34.43333333333333 333:34.43333333333333 334:34.43333333333333 335:34.43333333333333 336:36.93333333333333 337:36.93333333333333 338:36.93333333333333 339:36.93333333333333 340:33.83333333333334 341:33.83333333333334 342:33.83333333333334 343:33.83333333333334 344:33.18333333333333 345:33.83333333333334 346:34.73333333333333 347:35.33333333333334 348:35.23333333333333 349:35.23333333333333 350:35.23333333333333 351:35.23333333333333 352:35.73333333333333 353:35.73333333333333 354:35.73333333333333 355:35.8 356:35.5 357:35.53333333333333 358:35.53333333333333 359:35.53333333333333 360:31.83333333333333 361:31.83333333333333 362:31.83333333333333 363:31.86666666666667 364:27.93333333333333 365:27.93333333333333 366:27.93333333333333 367:27.93333333333333 368:28.18333333333333 369:28.73333333333333 370:29.63333333333333 371:30.23333333333333 372:29.83333333333333 373:29.83333333333333 374:29.83333333333333 375:29.83333333333333 376:34.23333333333333 377:34.23333333333333 378:34.23333333333333 379:34.23333333333333 380:31.73333333333333 381:31.73333333333333 382:31.73333333333333 383:31.73333333333333 384:32.33333333333334 385:32.33333333333334 386:32.33333333333334 387:32.33333333333334 388:35.93333333333333 389:35.98333333333333 390:36.03333333333333 391:36.08333333333334 392:33.63333333333333 393:33.63333333333333 394:33.63333333333333 395:33.63333333333333 396:32.43333333333333 397:32.43333333333333 398:32.43333333333333 399:32.43333333333333 400:27.03333333333333 401:27.03333333333333 402:27.03333333333333 403:27.03333333333333 404:24.63333333333333 405:24.63333333333333 406:24.63333333333333 407:24.63333333333333 408:27.43333333333333 409:27.43333333333333 410:27.43333333333333 411:27.43333333333333 412:26.83333333333333 413:26.83333333333333 414:26.83333333333333 415:26.83333333333333 416:28.83333333333333 417:28.83333333333333 418:28.83333333333333 419:28.83333333333333 420:28.33333333333333 421:28.33333333333333 422:28.33333333333333 423:28.33333333333333 424:28.33333333333333 425:28.33333333333333 426:28.33333333333333 427:28.33333333333333 428:27.73333333333333 429:27.73333333333333 430:27.73333333333333 431:27.73333333333333 432:28.33333333333333 433:28.33333333333333 434:28.33333333333333 435:28.33333333333333 436:31.93333333333333 437:31.93333333333333 438:31.93333333333333 439:31.76666666666667 440:32.73333333333333 441:32.61666666666667 442:32.61666666666667 443:32.61666666666667 444:32.36666666666667 445:31.71666666666667 446:30.86666666666667 447:30 448:28.01666666666667 449:27.95 450:27.95 451:27.95 452:25.35 453:25.35 454:25.35 455:25.43333333333333 456:27.83333333333333 457:27.88333333333333 458:27.88333333333333 459:27.88333333333333 460:29.68333333333333 461:29.68333333333333 462:29.68333333333333 463:29.81666666666667 464:27.66666666666667 465:27.83333333333333 466:27.83333333333333 467:27.83333333333333 468:20.93333333333333 469:20.93333333333333 470:20.93333333333333 471:20.93333333333333 472:22.26666666666667 473:22.26666666666667 474:22.26666666666667 475:22.26666666666667 476:29.16666666666667 477:29.16666666666667 478:29.16666666666667 479:29.16666666666667 480:35.73333333333333 481:35.73333333333333 482:35.73333333333333 483:35.73333333333333 484:32.63333333333333 485:32.63333333333333 486:32.63333333333333 487:32.63333333333333 488:31.93333333333333 489:31.93333333333333 490:31.93333333333333 491:31.93333333333333 492:29.53333333333333 493:29.53333333333333 494:29.53333333333333 495:29.53333333333333 496:29.83333333333333 497:29.83333333333333 498:29.83333333333333 499:29.83333333333333 500:30.33333333333333 501:30.33333333333333 502:30.33333333333333 503:30.33333333333333 504:30.33333333333333 505:30.33333333333333 506:30.33333333333333 507:30.33333333333333 508:32.33333333333334 509:32.33333333333334 510:32.33333333333334 511:32.33333333333334 512:35.83333333333334 513:35.83333333333334 514:35.83333333333334 515:35.83333333333334 516:31.23333333333333 517:31.23333333333333 518:31.23333333333333 519:31.23333333333333 520:31.83333333333333 521:31.83333333333333 522:31.83333333333333 523:31.83333333333333 524:32.33333333333334 525:32.33333333333334 526:32.33333333333334 527:32.33333333333334 528:32.83333333333334 529:32.83333333333334 530:32.83333333333334 531:32.83333333333334 532:33.83333333333334 533:33.83333333333334 534:33.83333333333334 535:33.83333333333334 536:29.23333333333333 537:29.23333333333333 538:29.23333333333333 539:29.06666666666667 540:24.93333333333333 541:24.73333333333333 542:24.73333333333333 543:24.73333333333333 544:27.13333333333333 545:27.13333333333333 546:27.13333333333333 547:27.11666666666667 548:26.21666666666667 549:26.2 550:26.2 551:26.2 552:25.8 553:25.8 554:25.8 555:25.8 556:25 557:25 558:25 559:25 560:27 561:27 562:27 563:27.08333333333333 564:26.93333333333333 565:27.05 566:27.05 567:27.05 568:27.15 569:27.15 570:27.15 571:27.23333333333333 572:29.26666666666667 573:29.26666666666667 574:29.26666666666667 575:29.26666666666667 576:29.46666666666667 577:29.46666666666667 578:29.46666666666667 579:29.5 580:26.63333333333333 581:26.63333333333333 582:26.63333333333333 583:26.63333333333333 584:29.23333333333333 585:29.23333333333333 586:29.23333333333333 587:29.23333333333333 588:28.63333333333333 589:28.63333333333333 590:28.63333333333333 591:28.63333333333333 592:25.43333333333333 593:25.43333333333333 594:25.43333333333333 595:25.43333333333333 596:22.83333333333333 597:22.83333333333333 598:22.83333333333333 599:22.83333333333333 600:27.46666666666667 601:27.46666666666667 602:27.46666666666667 603:27.46666666666667 604:29.16666666666667 605:29.16666666666667 606:29.16666666666667 607:29.16666666666667 608:31.16666666666667 609:31.16666666666667 610:31.16666666666667 611:31.16666666666667 612:31.06666666666667 613:31.06666666666667 614:31.06666666666667 615:31.06666666666667 616:32.43333333333333 617:32.43333333333333 618:32.43333333333333 619:32.43333333333333 620:33.83333333333334 621:33.83333333333334 622:33.83333333333334 623:33.83333333333334 624:32.63333333333333 625:32.63333333333333 626:32.63333333333333 627:32.63333333333333 628:32.43333333333333 629:32.43333333333333 630:32.43333333333333 631:32.43333333333333 632:30.63333333333333 633:30.63333333333333 634:30.63333333333333 635:30.63333333333333 636:31.73333333333333 637:31.73333333333333 638:31.73333333333333 639:31.61666666666667 640:30.13333333333333 641:29.86666666666667 642:29.86666666666667 643:29.86666666666667 644:31.16666666666667 645:31.16666666666667 646:31.16666666666667 647:31.13333333333333 648:28.01666666666667 649:28 650:28 651:28 652:24.9 653:24.9 654:24.9 655:24.9 656:26.9 657:26.9 658:26.9 659:26.9 660:30 661:30 662:30 663:30 664:29.06666666666667 665:29.06666666666667 666:29.06666666666667 667:29.06666666666667 668:25.96666666666667 669:25.96666666666667 670:25.96666666666667 671:25.96666666666667 672:26.86666666666667 673:26.86666666666667 674:26.86666666666667 675:26.93333333333333 676:26.76666666666667 677:26.76666666666667 678:26.76666666666667 679:26.8 680:27.73333333333333 681:27.73333333333333 682:27.73333333333333 683:27.73333333333333 684:27.83333333333333 685:27.83333333333333 686:27.83333333333333 687:27.83333333333333 688:28.53333333333333 689:28.53333333333333 690:28.53333333333333 691:28.53333333333333 692:26.33333333333333 693:26.33333333333333 694:26.33333333333333 695:26.33333333333333 696:27.03333333333333 697:27.03333333333333 698:27.03333333333333 699:27.03333333333333 700:27.96666666666667 701:27.96666666666667 702:27.96666666666667 703:27.96666666666667 704:28.06666666666667 705:28.06666666666667 706:28.06666666666667 707:28.06666666666667 708:29.36666666666667 709:29.36666666666667 710:29.36666666666667 711:29.36666666666667 712:29.56666666666667 713:29.56666666666667 714:29.56666666666667 715:29.6 716:31.33333333333333 717:31.33333333333333 718:31.33333333333333 719:31.33333333333333 720:30.13333333333333 721:30.13333333333333 722:30.13333333333333 723:30.13333333333333 724:30.13333333333333 725:30.13333333333333 726:30.13333333333333 727:30.13333333333333 728:30.43333333333333 729:30.43333333333333 730:30.43333333333333 731:30.43333333333333 732:27.43333333333333 733:27.43333333333333 734:27.43333333333333 735:27.43333333333333 736:24.53333333333333 737:24.53333333333333 738:24.53333333333333 739:24.53333333333333 740:23.46666666666667 741:23.46666666666667 742:23.46666666666667 743:23.46666666666667 744:25.36666666666667 745:25.36666666666667 746:25.36666666666667 747:25.36666666666667 748:25.71666666666667 749:25.71666666666667 750:25.71666666666667 751:25.71666666666667 752:27.11666666666667 753:27.11666666666667 754:27.11666666666667 755:26.96666666666667 756:27.73333333333333 757:27.6 758:27.6 759:27.6 760:24.9 761:24.9 762:24.9 763:24.9 764:24.5 765:24.5 766:24.5 767:24.5 768:24.2 769:24.2 770:24.2 771:24.2 772:23.86666666666667 773:23.9 774:24.1 775:24.1 776:22.56666666666667 777:22.56666666666667 778:22.56666666666667 779:22.56666666666667 780:22.73333333333333 781:22.73333333333333 782:22.73333333333333 783:22.73333333333333 784:24.53333333333333 785:24.53333333333333 786:24.53333333333333 787:24.53333333333333 788:27.43333333333333 789:27.43333333333333 790:27.43333333333333 791:27.43333333333333 792:31.33333333333333 793:31.33333333333333 794:31.33333333333333 795:31.33333333333333 796:27.03333333333333 797:27.03333333333333 798:27.03333333333333 799:27.03333333333333 +0 0:199.8333333333333 1:199.7333333333333 2:199.6666666666667 3:199.5833333333333 4:200.3166666666667 5:200.0833333333333 6:200.0166666666667 7:200.0166666666667 8:199.8166666666667 9:199.9 10:200.0833333333333 11:200.1 12:199.6833333333333 13:199.75 14:199.8 15:199.9333333333333 16:200.25 17:200.25 18:200.35 19:200.3666666666667 20:200.4 21:200.5333333333333 22:200.7333333333333 23:200.7666666666667 24:200.7666666666667 25:200.7666666666667 26:200.5166666666667 27:200.4166666666667 28:200.2666666666667 29:200.2333333333333 30:200.1666666666667 31:200.1166666666667 32:199.8833333333333 33:200.1333333333333 34:200.1833333333333 35:200.1333333333333 36:199.05 37:199.1166666666667 38:199.1333333333333 39:199.0833333333333 40:199.2166666666667 41:199.2166666666667 42:199.2166666666667 43:199.2166666666667 44:199.1166666666667 45:199.1166666666667 46:199.1166666666667 47:199.1166666666667 48:199.1166666666667 49:199.1166666666667 50:199.0333333333333 51:198.9333333333333 52:197.8333333333333 53:197.7833333333333 54:197.7666666666667 55:197.7666666666667 56:197.8333333333333 57:197.8333333333333 58:197.8333333333333 59:197.8333333333333 60:197.9333333333333 61:197.9333333333333 62:197.9333333333333 63:197.8833333333333 64:197.6666666666667 65:197.7666666666667 66:197.7666666666667 67:197.6666666666667 68:194.7666666666667 69:194.75 70:194.6166666666667 71:194.65 72:193.9333333333333 73:193.9833333333333 74:193.9833333333333 75:193.9833333333333 76:194.6833333333333 77:194.6833333333333 78:194.6833333333333 79:194.6833333333333 80:193.4666666666667 81:193.5166666666667 82:193.5833333333333 83:193.6166666666667 84:191.1333333333333 85:191.2 86:191.3833333333333 87:191.3833333333333 88:190.6 89:190.6333333333333 90:190.7666666666667 91:190.8166666666667 92:192.75 93:192.8333333333333 94:192.9666666666667 95:192.9666666666667 96:192.25 97:192.1333333333333 98:192.0666666666667 99:191.9 100:115.9 101:115.9666666666667 102:116.0333333333333 103:115.9333333333333 104:113.4666666666667 105:113.6333333333333 106:113.6 107:113.5833333333333 108:113.55 109:113.6333333333333 110:113.8 111:114.2 112:116.5166666666667 113:116.65 114:117.1333333333333 115:117.1333333333333 116:117.0333333333333 117:117.0333333333333 118:117.0333333333333 119:117.0333333333333 120:117.05 121:117.05 122:117.05 123:117.05 124:117.05 125:117.05 126:117.05 127:117.0333333333333 128:117.0333333333333 129:117.0333333333333 130:117.0333333333333 131:117.0333333333333 132:117 133:117.0166666666667 134:116.9666666666667 135:117 136:115.1833333333333 137:115.1833333333333 138:115.1833333333333 139:115.2166666666667 140:115.2166666666667 141:115.25 142:115.25 143:115.25 144:115.25 145:115.25 146:115.25 147:115.25 148:115.25 149:115.25 150:115.25 151:115.25 152:114.15 153:114.15 154:114.15 155:114.15 156:114.55 157:114.55 158:114.55 159:114.55 160:112.45 161:112.45 162:112.45 163:112.5166666666667 164:112.5166666666667 165:112.5166666666667 166:112.4166666666667 167:111.95 168:112.7833333333333 169:112.3166666666667 170:112.1833333333333 171:112.1166666666667 172:112.2166666666667 173:112.2833333333333 174:112.2833333333333 175:112.2833333333333 176:111.4833333333333 177:111.4833333333333 178:111.4833333333333 179:111.4833333333333 180:111.5833333333333 181:111.5833333333333 182:111.6 183:111.6333333333333 184:111.7666666666667 185:111.9 186:111.9 187:111.9 188:112.5 189:112.5 190:112.5 191:112.5 192:112.5 193:112.5166666666667 194:112.5166666666667 195:112.5166666666667 196:112.3 197:112.3 198:112.3 199:112.3 200:106.2 201:106.2 202:106.2 203:106.2 204:104.6 205:104.6 206:104.6 207:104.6 208:104.4666666666667 209:104.6 210:104.8666666666667 211:105.2666666666667 212:106.0333333333333 213:106.4333333333333 214:106.5666666666667 215:106.5666666666667 216:107.2 217:107.0666666666667 218:107 219:106.8666666666667 220:105.0666666666667 221:104.9333333333333 222:104.8666666666667 223:104.6 224:105.2666666666667 225:105.2666666666667 226:105.2666666666667 227:105.2666666666667 228:104.2666666666667 229:104.2666666666667 230:104.2666666666667 231:104.2666666666667 232:104.2666666666667 233:104.2666666666667 234:104.2666666666667 235:104.2666666666667 236:102.8666666666667 237:102.8666666666667 238:102.8666666666667 239:102.8666666666667 240:103.3333333333333 241:103.3333333333333 242:103.3333333333333 243:103.1333333333333 244:103.1333333333333 245:103 246:103 247:102.8666666666667 248:102.8666666666667 249:103 250:103 251:103.1333333333333 252:102.6333333333333 253:102.8333333333333 254:102.8333333333333 255:102.8333333333333 256:103 257:103.2666666666667 258:103.3333333333333 259:103.4666666666667 260:102.9666666666667 261:103.1 262:103.1666666666667 263:103.3 264:103.6666666666667 265:103.6 266:103.6 267:103.3333333333333 268:102.7666666666667 269:102.6333333333333 270:102.5 271:102.3666666666667 272:103.7333333333333 273:103.7333333333333 274:103.7333333333333 275:103.3333333333333 276:103.6 277:103.2 278:103.2 279:103.1333333333333 280:102.1666666666667 281:102.1666666666667 282:102.1666666666667 283:102.1666666666667 284:102.4333333333333 285:102.5666666666667 286:102.5666666666667 287:102.6333333333333 288:102.1833333333333 289:102.15 290:102.15 291:102.0166666666667 292:102.3833333333333 293:102.3833333333333 294:102.3833333333333 295:102.3833333333333 296:102.3833333333333 297:102.3833333333333 298:102.3833333333333 299:102.3833333333333 300:107.4 301:107.4 302:107.4 303:107.2666666666667 304:109.4666666666667 305:109.4666666666667 306:109.4666666666667 307:109.5333333333333 308:106.9333333333333 309:107.3333333333333 310:107.4666666666667 311:108 312:110.0666666666667 313:110.4 314:110.5333333333333 315:110.7333333333333 316:110.1 317:109.9666666666667 318:109.9 319:109.6333333333333 320:108.5333333333333 321:108.0666666666667 322:108.0666666666667 323:107.8 324:108.4 325:108.4 326:108.4 327:108.4 328:106.4 329:106.4 330:106.4 331:106.4 332:107.2 333:107.2 334:107.2 335:107.2 336:106.2 337:106.2 338:106.2 339:106.2 340:106.4 341:106.4 342:106.2666666666667 343:106.1333333333333 344:106.5333333333333 345:106.4 346:106.4 347:106.4 348:104.9 349:104.9 350:104.9 351:105.0333333333333 352:104.9333333333333 353:105.0666666666667 354:105.2 355:105.2 356:104.1333333333333 357:104.4 358:104.4 359:104.6666666666667 360:104.8 361:105 362:105.1333333333333 363:105.4666666666667 364:105.5 365:105.5 366:105.3666666666667 367:105.3 368:105 369:105.0666666666667 370:105.0666666666667 371:105.0666666666667 372:105.7333333333333 373:105.6666666666667 374:105.5333333333333 375:105.0666666666667 376:105.1666666666667 377:104.3 378:104.2333333333333 379:104.2333333333333 380:104.4 381:104.4 382:104.4 383:104.4 384:106.6666666666667 385:106.7333333333333 386:106.7333333333333 387:106.7333333333333 388:103.0333333333333 389:103.0333333333333 390:103.0333333333333 391:102.9666666666667 392:105.4 393:105.4 394:105.4 395:105.4 396:103.7 397:103.7 398:103.7 399:103.7 400:108.9666666666667 401:108.9 402:108.7666666666667 403:108.6333333333333 404:110.2666666666667 405:109.7333333333333 406:109.7333333333333 407:109.7333333333333 408:106.8333333333333 409:106.8333333333333 410:106.8333333333333 411:107.1 412:107.8666666666667 413:108.0666666666667 414:108.0666666666667 415:108.0666666666667 416:107.7666666666667 417:107.8333333333333 418:107.8333333333333 419:107.3 420:108.6333333333333 421:108.3 422:108.1666666666667 423:108.1 424:109.3333333333333 425:109.3333333333333 426:109.3333333333333 427:109.4 428:107.6 429:107.8 430:107.8666666666667 431:107.8666666666667 432:108.3 433:108.3 434:108.3 435:108.3 436:108.4 437:108.4 438:108.4 439:108.4 440:106.6 441:106.6 442:106.6 443:106.6 444:107.4 445:107.4 446:107.4 447:107.4 448:103.9 449:103.9 450:103.9 451:103.9 452:109 453:109 454:109 455:109 456:105.8 457:105.8 458:105.8 459:106.0666666666667 460:107.1666666666667 461:107.3666666666667 462:107.3666666666667 463:107.3666666666667 464:106.4333333333333 465:106.4333333333333 466:106.4333333333333 467:106.4333333333333 468:105.0333333333333 469:105.0333333333333 470:105.0333333333333 471:105.1666666666667 472:105.3333333333333 473:105.2 474:105.2 475:105.2 476:101.7 477:101.7 478:101.7 479:101.7 480:106.3 481:106.3 482:106.3 483:106.3 484:102.7 485:102.7 486:102.7 487:102.7 488:99.90000000000001 489:99.90000000000001 490:99.90000000000001 491:99.90000000000001 492:101.8 493:101.8 494:101.8 495:101.8 496:99.2 497:99.2 498:99.2 499:99.2 500:106.1333333333333 501:106.1333333333333 502:106 503:105.8 504:103.9333333333333 505:103.6 506:103.5333333333333 507:103.5333333333333 508:104.5833333333333 509:104.7 510:104.7 511:104.7666666666667 512:101.1 513:101.2333333333333 514:101.2333333333333 515:101.3666666666667 516:104.7 517:104.9 518:104.8833333333333 519:104.5 520:101.9833333333333 521:101.7333333333333 522:101.7333333333333 523:101.7333333333333 524:101.5666666666667 525:101.5666666666667 526:101.5666666666667 527:101.7666666666667 528:105.3333333333333 529:105.3333333333333 530:105.3333333333333 531:105.3333333333333 532:104.0333333333333 533:104.0333333333333 534:104.0333333333333 535:104.0333333333333 536:103.1333333333333 537:103.1333333333333 538:103.1333333333333 539:103.1333333333333 540:101.9333333333333 541:101.9333333333333 542:101.9333333333333 543:101.9333333333333 544:100.5333333333333 545:100.5333333333333 546:100.5333333333333 547:100.5333333333333 548:98.33333333333333 549:98.33333333333333 550:98.33333333333333 551:98.33333333333333 552:101.2333333333333 553:101.2333333333333 554:101.2333333333333 555:101.2333333333333 556:99.73333333333333 557:99.73333333333333 558:99.73333333333333 559:99.8 560:100.5 561:100.6333333333333 562:100.6333333333333 563:100.6333333333333 564:102.0333333333333 565:102.0333333333333 566:102.0333333333333 567:102.0333333333333 568:104.0333333333333 569:104.0333333333333 570:104.0333333333333 571:104.0333333333333 572:105.1333333333333 573:105.1333333333333 574:105.1333333333333 575:105.1333333333333 576:103.0666666666667 577:103 578:103 579:103 580:99.7 581:99.7 582:99.7 583:99.7 584:102.4 585:102.4 586:102.4 587:102.4 588:102.8 589:102.8 590:102.8 591:102.8 592:99.5 593:99.5 594:99.5 595:99.5 596:100.8 597:100.8 598:100.8 599:100.8 600:103.2333333333333 601:103.2333333333333 602:103.3 603:103.3666666666667 604:105.4333333333333 605:105.4333333333333 606:105.4333333333333 607:105.4333333333333 608:108.4333333333333 609:108.4333333333333 610:108.4333333333333 611:108.4333333333333 612:106.6 613:106.6666666666667 614:106.6666666666667 615:106.6666666666667 616:102.1666666666667 617:102.2333333333333 618:102.2666666666667 619:101.9 620:104.5333333333333 621:104.2166666666667 622:104.2666666666667 623:104.2666666666667 624:103.9666666666667 625:103.9666666666667 626:103.9666666666667 627:103.9666666666667 628:105.4333333333333 629:105.4333333333333 630:105.4333333333333 631:105.4333333333333 632:108.0833333333333 633:106.4833333333333 634:104.2333333333333 635:102.6833333333333 636:102.3333333333333 637:102.3333333333333 638:102.3333333333333 639:102.3333333333333 640:100.6333333333333 641:100.6333333333333 642:100.6333333333333 643:100.6333333333333 644:99.43333333333334 645:99.43333333333334 646:99.43333333333334 647:99.43333333333334 648:104.5333333333333 649:104.5333333333333 650:104.5333333333333 651:104.5333333333333 652:98.33333333333333 653:98.33333333333333 654:98.33333333333333 655:98.33333333333333 656:95.53333333333333 657:95.53333333333333 658:95.53333333333333 659:95.53333333333333 660:95.93333333333334 661:95.93333333333334 662:95.93333333333334 663:95.93333333333334 664:94.08333333333333 665:95.68333333333334 666:97.93333333333334 667:99.53333333333333 668:97.43333333333334 669:97.43333333333334 670:97.43333333333334 671:97.43333333333334 672:92.93333333333334 673:92.93333333333334 674:92.93333333333334 675:92.93333333333334 676:96.09999999999999 677:96.09999999999999 678:96.09999999999999 679:96.09999999999999 680:99.5 681:99.5 682:99.5 683:99.5 684:101.5 685:101.5 686:101.5 687:101.5 688:98.90000000000001 689:98.90000000000001 690:98.90000000000001 691:98.90000000000001 692:99.09999999999999 693:99.09999999999999 694:99.09999999999999 695:99.09999999999999 696:95.8 697:95.8 698:95.8 699:95.8 700:102.3 701:102.3 702:102.3 703:102.3 704:107.5333333333333 705:107.5333333333333 706:107.5333333333333 707:107.5333333333333 708:103.1333333333333 709:103.1333333333333 710:103.1333333333333 711:103.1333333333333 712:107.8666666666667 713:107.8666666666667 714:107.8666666666667 715:107.8666666666667 716:106.8666666666667 717:106.8666666666667 718:106.8666666666667 719:106.8 720:107.6333333333333 721:107.5666666666667 722:107.5 723:107.5 724:103.6 725:103.6 726:103.6 727:103.7333333333333 728:104.0333333333333 729:104.0333333333333 730:104.0333333333333 731:104.0333333333333 732:102.7333333333333 733:104.4833333333333 734:106.6833333333333 735:108.2833333333333 736:105.5333333333333 737:105.5333333333333 738:105.5333333333333 739:105.5333333333333 740:103.4333333333333 741:103.4333333333333 742:103.4333333333333 743:103.4333333333333 744:98.53333333333333 745:98.53333333333333 746:98.53333333333333 747:98.53333333333333 748:100.2333333333333 749:100.2333333333333 750:100.2333333333333 751:100.2333333333333 752:102.5333333333333 753:102.5333333333333 754:102.5333333333333 755:102.5333333333333 756:102.4333333333333 757:102.4333333333333 758:102.4333333333333 759:102.4333333333333 760:96.33333333333333 761:96.33333333333333 762:96.33333333333333 763:96.33333333333333 764:99.23333333333333 765:97.63333333333334 766:95.43333333333334 767:93.93333333333334 768:95.93333333333334 769:95.93333333333334 770:95.93333333333334 771:95.93333333333334 772:96.33333333333333 773:96.33333333333333 774:96.33333333333333 775:96.33333333333333 776:98.83333333333333 777:98.96666666666667 778:98.96666666666667 779:98.96666666666667 780:96.26666666666667 781:96.26666666666667 782:96.26666666666667 783:96.26666666666667 784:96.26666666666667 785:96.26666666666667 786:96.26666666666667 787:96.26666666666667 788:96.36666666666666 789:96.36666666666666 790:96.36666666666666 791:96.5 792:91.59999999999999 793:91.59999999999999 794:91.59999999999999 795:91.59999999999999 796:90.84999999999999 797:93.75 798:98.59999999999999 799:101.55 +0 0:19.56666666666667 1:19.56666666666667 2:19.56666666666667 3:19.56666666666667 4:19.36666666666667 5:19.36666666666667 6:19.36666666666667 7:19.36666666666667 8:20.46666666666667 9:20.46666666666667 10:20.46666666666667 11:20.46666666666667 12:26.56666666666667 13:26.56666666666667 14:26.56666666666667 15:26.56666666666667 16:26.38333333333333 17:26.4 18:26.4 19:26.4 20:29.7 21:29.7 22:29.7 23:29.7 24:28.6 25:28.6 26:28.6 27:28.6 28:27.3 29:27.3 30:27.3 31:27.33333333333333 32:24.53333333333333 33:24.53333333333333 34:24.53333333333333 35:24.53333333333333 36:26.53333333333333 37:26.53333333333333 38:26.53333333333333 39:26.53333333333333 40:27.63333333333333 41:27.63333333333333 42:27.63333333333333 43:27.63333333333333 44:29.03333333333333 45:29.03333333333333 46:29.03333333333333 47:29.01666666666667 48:21.56666666666667 49:21.5 50:21.5 51:21.5 52:19.6 53:19.6 54:19.6 55:19.43333333333333 56:19 57:18.86666666666667 58:18.86666666666667 59:18.86666666666667 60:20.06666666666667 61:20.06666666666667 62:20.06666666666667 63:20.06666666666667 64:21.86666666666667 65:21.86666666666667 66:21.86666666666667 67:21.86666666666667 68:24.36666666666667 69:24.36666666666667 70:24.36666666666667 71:24.5 72:27.88333333333333 73:28.03333333333333 74:28.03333333333333 75:28.03333333333333 76:27.93333333333333 77:27.93333333333333 78:27.93333333333333 79:27.9 80:31.4 81:31.38333333333333 82:31.38333333333333 83:31.38333333333333 84:27.18333333333333 85:27.18333333333333 86:27.18333333333333 87:27.18333333333333 88:28.28333333333333 89:28.28333333333333 90:28.28333333333333 91:28.28333333333333 92:32.98333333333333 93:32.98333333333333 94:32.98333333333333 95:33.05 96:31.6 97:31.63333333333333 98:31.63333333333333 99:31.63333333333333 100:24.66666666666667 101:24.66666666666667 102:24.66666666666667 103:24.66666666666667 104:26.26666666666667 105:26.26666666666667 106:26.26666666666667 107:26.26666666666667 108:26.1 109:26.1 110:26.1 111:26.1 112:24.4 113:24.4 114:24.4 115:24.4 116:23.33333333333333 117:23.33333333333333 118:23.33333333333333 119:23.33333333333333 120:22.83333333333333 121:22.83333333333333 122:22.83333333333333 123:22.83333333333333 124:23.43333333333333 125:23.43333333333333 126:23.43333333333333 127:23.43333333333333 128:24.33333333333333 129:24.33333333333333 130:24.33333333333333 131:24.33333333333333 132:24.33333333333333 133:24.33333333333333 134:24.33333333333333 135:24.33333333333333 136:24.83333333333333 137:24.83333333333333 138:24.83333333333333 139:24.83333333333333 140:27.33333333333333 141:27.33333333333333 142:27.33333333333333 143:27.33333333333333 144:25.83333333333333 145:25.83333333333333 146:25.83333333333333 147:25.68333333333333 148:24.16666666666667 149:23.83333333333333 150:23.83333333333333 151:23.83333333333333 152:23.33333333333333 153:23.33333333333333 154:23.33333333333333 155:23.33333333333333 156:23.83333333333333 157:23.83333333333333 158:23.83333333333333 159:23.83333333333333 160:23.43333333333333 161:23.43333333333333 162:23.43333333333333 163:23.43333333333333 164:25.33333333333333 165:25.33333333333333 166:25.33333333333333 167:25.33333333333333 168:23.93333333333333 169:23.93333333333333 170:23.93333333333333 171:23.96666666666667 172:26.63333333333333 173:26.63333333333333 174:26.63333333333333 175:26.63333333333333 176:25.73333333333333 177:25.73333333333333 178:25.73333333333333 179:25.56666666666667 180:22.63333333333333 181:22.5 182:22.5 183:22.5 184:22 185:22 186:22 187:22 188:25.46666666666667 189:25.46666666666667 190:25.46666666666667 191:25.46666666666667 192:21.46666666666667 193:21.46666666666667 194:21.46666666666667 195:21.6 196:22.16666666666667 197:22.33333333333333 198:22.33333333333333 199:22.33333333333333 200:20.16666666666667 201:20.16666666666667 202:20.16666666666667 203:20.16666666666667 204:21.26666666666667 205:21.26666666666667 206:21.26666666666667 207:21.26666666666667 208:22 209:22 210:22 211:22 212:20.6 213:20.6 214:20.6 215:20.6 216:20.73333333333333 217:20.73333333333333 218:20.73333333333333 219:20.73333333333333 220:23.73333333333333 221:23.73333333333333 222:23.73333333333333 223:23.73333333333333 224:24.23333333333333 225:24.23333333333333 226:24.23333333333333 227:24.23333333333333 228:24.23333333333333 229:24.23333333333333 230:24.23333333333333 231:24.23333333333333 232:25.33333333333333 233:25.33333333333333 234:25.33333333333333 235:25.33333333333333 236:24.23333333333333 237:24.23333333333333 238:24.23333333333333 239:24.23333333333333 240:27.03333333333333 241:27.03333333333333 242:27.03333333333333 243:27.03333333333333 244:25.73333333333333 245:25.73333333333333 246:25.73333333333333 247:25.73333333333333 248:25.8 249:25.8 250:25.8 251:25.8 252:27.1 253:27.1 254:27.1 255:27.1 256:24.4 257:24.4 258:24.4 259:24.4 260:26 261:26 262:26 263:26 264:23.8 265:23.8 266:23.8 267:23.8 268:23.9 269:23.9 270:23.9 271:23.9 272:22.83333333333333 273:22.83333333333333 274:22.83333333333333 275:22.83333333333333 276:26.33333333333333 277:26.33333333333333 278:26.33333333333333 279:26.28333333333333 280:26.55 281:26.51666666666667 282:26.51666666666667 283:26.51666666666667 284:28.31666666666667 285:28.31666666666667 286:28.31666666666667 287:28.2 288:28.2 289:28.1 290:28.1 291:28.1 292:29.5 293:29.5 294:29.5 295:29.51666666666667 296:26.86666666666667 297:26.9 298:26.9 299:26.9 300:19.5 301:19.5 302:19.5 303:19.5 304:19.5 305:19.5 306:19.5 307:19.5 308:21 309:21 310:21 311:21 312:21.1 313:21.1 314:21.1 315:21.1 316:21 317:21 318:21 319:21 320:21 321:21 322:21 323:21 324:19.03333333333333 325:19.03333333333333 326:19.03333333333333 327:19.03333333333333 328:20.33333333333333 329:20.33333333333333 330:20.33333333333333 331:20.33333333333333 332:25.23333333333333 333:25.23333333333333 334:25.23333333333333 335:25.23333333333333 336:26.83333333333333 337:26.83333333333333 338:26.83333333333333 339:26.83333333333333 340:27.13333333333333 341:27.13333333333333 342:27.13333333333333 343:27.13333333333333 344:27.13333333333333 345:27.13333333333333 346:27.13333333333333 347:27.13333333333333 348:27.23333333333333 349:27.23333333333333 350:27.23333333333333 351:27.23333333333333 352:32.03333333333333 353:32.03333333333333 354:32.03333333333333 355:32.03333333333333 356:29.93333333333333 357:29.93333333333333 358:29.93333333333333 359:29.93333333333333 360:26.83333333333333 361:26.83333333333333 362:26.83333333333333 363:26.86666666666667 364:28.83333333333333 365:28.83333333333333 366:28.83333333333333 367:28.83333333333333 368:33.53333333333333 369:33.53333333333333 370:33.53333333333333 371:33.53333333333333 372:33.6 373:33.6 374:33.6 375:33.6 376:31.8 377:31.8 378:31.8 379:31.76666666666667 380:30.18333333333333 381:30.16666666666667 382:30.16666666666667 383:30.16666666666667 384:30.16666666666667 385:30.16666666666667 386:30.16666666666667 387:30.06666666666667 388:28.76666666666667 389:28.6 390:28.6 391:28.6 392:23.3 393:23.3 394:23.3 395:23.3 396:24.23333333333333 397:24.23333333333333 398:24.23333333333333 399:24.23333333333333 400:22.06666666666667 401:22.06666666666667 402:22.06666666666667 403:22.06666666666667 404:21.46666666666667 405:21.46666666666667 406:21.46666666666667 407:21.46666666666667 408:22.06666666666667 409:22.06666666666667 410:22.06666666666667 411:22.06666666666667 412:22.36666666666667 413:22.36666666666667 414:22.36666666666667 415:22.36666666666667 416:22.8 417:22.8 418:22.8 419:22.8 420:21.4 421:21.4 422:21.4 423:21.4 424:23.13333333333333 425:23.13333333333333 426:23.13333333333333 427:23.13333333333333 428:25.13333333333333 429:25.13333333333333 430:25.13333333333333 431:25.13333333333333 432:26.33333333333333 433:26.33333333333333 434:26.33333333333333 435:26.33333333333333 436:27.03333333333333 437:27.03333333333333 438:27.03333333333333 439:27.03333333333333 440:25.03333333333333 441:25.03333333333333 442:25.03333333333333 443:25.03333333333333 444:25.53333333333333 445:25.53333333333333 446:25.53333333333333 447:25.36666666666667 448:25.33333333333333 449:25.21666666666667 450:25.21666666666667 451:25.21666666666667 452:22.81666666666667 453:22.81666666666667 454:22.81666666666667 455:22.81666666666667 456:22.88333333333333 457:22.88333333333333 458:22.88333333333333 459:22.88333333333333 460:24.88333333333333 461:24.88333333333333 462:24.88333333333333 463:25.01666666666667 464:27.96666666666667 465:28.13333333333333 466:28.13333333333333 467:28.13333333333333 468:25.73333333333333 469:25.73333333333333 470:25.73333333333333 471:25.58333333333333 472:24.56666666666667 473:24.23333333333333 474:24.23333333333333 475:24.23333333333333 476:22.13333333333333 477:22.13333333333333 478:22.13333333333333 479:22.13333333333333 480:23.65 481:23.61666666666667 482:23.61666666666667 483:23.61666666666667 484:21.21666666666667 485:21.21666666666667 486:21.21666666666667 487:21.26666666666667 488:26.33333333333333 489:26.33333333333333 490:26.33333333333333 491:26.33333333333333 492:27.63333333333333 493:27.63333333333333 494:27.63333333333333 495:27.63333333333333 496:30.73333333333333 497:30.73333333333333 498:30.73333333333333 499:30.73333333333333 500:19.16666666666667 501:19.16666666666667 502:19.16666666666667 503:19.16666666666667 504:19.66666666666667 505:19.66666666666667 506:19.66666666666667 507:19.66666666666667 508:20.06666666666667 509:20.06666666666667 510:20.06666666666667 511:20.06666666666667 512:23.06666666666667 513:23.06666666666667 514:23.06666666666667 515:23.06666666666667 516:25 517:25 518:25 519:25 520:25.5 521:25.5 522:25.5 523:25.5 524:26.23333333333333 525:26.23333333333333 526:26.23333333333333 527:26.23333333333333 528:27.33333333333333 529:27.33333333333333 530:27.33333333333333 531:27.33333333333333 532:27.73333333333333 533:27.73333333333333 534:27.73333333333333 535:27.73333333333333 536:26.83333333333333 537:26.83333333333333 538:26.83333333333333 539:26.76666666666667 540:24.5 541:24.45 542:24.45 543:24.45 544:20.05 545:20.05 546:20.05 547:19.98333333333333 548:20.36666666666667 549:20.26666666666667 550:20.26666666666667 551:20.26666666666667 552:19.86666666666667 553:19.86666666666667 554:19.86666666666667 555:19.86666666666667 556:20.5 557:20.5 558:20.5 559:20.5 560:21.4 561:21.4 562:21.4 563:21.45 564:22.13333333333333 565:22.2 566:22.2 567:22.2 568:21.1 569:21.1 570:21.1 571:21.06666666666667 572:26.86666666666667 573:26.83333333333333 574:26.83333333333333 575:26.83333333333333 576:28.33333333333333 577:28.33333333333333 578:28.33333333333333 579:28.43333333333333 580:30.03333333333333 581:30.15 582:30.15 583:30.15 584:32.05 585:32.05 586:32.05 587:31.98333333333333 588:31.93333333333333 589:31.83333333333333 590:31.83333333333333 591:31.83333333333333 592:30.43333333333333 593:30.43333333333333 594:30.43333333333333 595:30.43333333333333 596:29.23333333333333 597:29.23333333333333 598:29.23333333333333 599:29.23333333333333 600:16.76666666666667 601:16.76666666666667 602:16.76666666666667 603:16.76666666666667 604:19.26666666666667 605:19.26666666666667 606:19.26666666666667 607:19.26666666666667 608:19.56666666666667 609:19.56666666666667 610:19.56666666666667 611:19.56666666666667 612:19.66666666666667 613:19.66666666666667 614:19.66666666666667 615:19.66666666666667 616:20.7 617:20.7 618:20.7 619:20.7 620:21.9 621:21.9 622:21.9 623:21.9 624:21.83333333333333 625:21.83333333333333 626:21.83333333333333 627:21.83333333333333 628:23.43333333333333 629:23.43333333333333 630:23.43333333333333 631:23.43333333333333 632:22.21666666666667 633:22.23333333333333 634:22.23333333333333 635:22.23333333333333 636:28.43333333333333 637:28.43333333333333 638:28.43333333333333 639:28.26666666666667 640:32 641:31.86666666666667 642:31.86666666666667 643:31.86666666666667 644:30.66666666666667 645:30.66666666666667 646:30.66666666666667 647:30.63333333333333 648:29.86666666666667 649:29.86666666666667 650:29.86666666666667 651:29.86666666666667 652:28.86666666666667 653:28.86666666666667 654:28.86666666666667 655:28.86666666666667 656:28.1 657:28.1 658:28.1 659:28.1 660:25.7 661:25.7 662:25.7 663:25.7 664:25.13333333333333 665:25.13333333333333 666:25.13333333333333 667:25.13333333333333 668:22.73333333333333 669:22.73333333333333 670:22.73333333333333 671:22.73333333333333 672:24.43333333333333 673:24.43333333333333 674:24.43333333333333 675:24.43333333333333 676:19.43333333333333 677:19.43333333333333 678:19.43333333333333 679:19.46666666666667 680:19.25 681:19.3 682:19.3 683:19.3 684:19.6 685:19.6 686:19.6 687:19.51666666666667 688:21.33333333333333 689:21.23333333333333 690:21.23333333333333 691:21.23333333333333 692:21.83333333333333 693:21.83333333333333 694:21.83333333333333 695:21.83333333333333 696:20.23333333333333 697:20.23333333333333 698:20.23333333333333 699:20.23333333333333 700:18.46666666666667 701:18.46666666666667 702:18.46666666666667 703:18.46666666666667 704:18.76666666666667 705:18.76666666666667 706:18.76666666666667 707:18.76666666666667 708:21.16666666666667 709:21.16666666666667 710:21.16666666666667 711:21.16666666666667 712:19.26666666666667 713:19.26666666666667 714:19.26666666666667 715:19.26666666666667 716:20.83333333333333 717:20.83333333333333 718:20.83333333333333 719:20.83333333333333 720:22.63333333333333 721:22.63333333333333 722:22.63333333333333 723:22.63333333333333 724:24.46666666666667 725:24.46666666666667 726:24.46666666666667 727:24.46666666666667 728:24.66666666666667 729:24.66666666666667 730:24.66666666666667 731:24.66666666666667 732:24.03333333333333 733:24.08333333333333 734:24.08333333333333 735:24.08333333333333 736:22.08333333333333 737:22.08333333333333 738:22.08333333333333 739:22.05 740:23.68333333333333 741:23.63333333333333 742:23.63333333333333 743:23.63333333333333 744:24.33333333333333 745:24.33333333333333 746:24.33333333333333 747:24.33333333333333 748:25.16666666666667 749:25.16666666666667 750:25.16666666666667 751:25.16666666666667 752:19.36666666666667 753:19.36666666666667 754:19.36666666666667 755:19.36666666666667 756:21.63333333333333 757:21.63333333333333 758:21.63333333333333 759:21.63333333333333 760:20.33333333333333 761:20.33333333333333 762:20.33333333333333 763:20.33333333333333 764:21.36666666666667 765:21.36666666666667 766:21.36666666666667 767:21.36666666666667 768:18.86666666666667 769:18.86666666666667 770:18.86666666666667 771:18.86666666666667 772:19.83333333333333 773:19.83333333333333 774:19.83333333333333 775:19.83333333333333 776:19.53333333333333 777:19.53333333333333 778:19.53333333333333 779:19.53333333333333 780:17.96666666666667 781:17.96666666666667 782:17.96666666666667 783:17.96666666666667 784:18.76666666666667 785:18.76666666666667 786:18.76666666666667 787:18.76666666666667 788:20.03333333333333 789:20.03333333333333 790:20.03333333333333 791:20.03333333333333 792:20.33333333333333 793:20.33333333333333 794:20.33333333333333 795:20.33333333333333 796:18.73333333333333 797:18.73333333333333 798:18.73333333333333 799:18.73333333333333 +0 0:101.1333333333333 1:101.1333333333333 2:101.1333333333333 3:101.0666666666667 4:99.63333333333334 5:99.56666666666666 6:99.56666666666666 7:99.56666666666666 8:99.2 9:99.46666666666667 10:99.53333333333333 11:99.8 12:99.86666666666666 13:100.2666666666667 14:100.6666666666667 15:100.8 16:101.1333333333333 17:101.1333333333333 18:101.1333333333333 19:101.1333333333333 20:98.8 21:98.8 22:98.8 23:98.8 24:98.8 25:98.8 26:98.8 27:98.8 28:98.2 29:98.2 30:98.2 31:98.2 32:99.2 33:99.2 34:99.2 35:99.2 36:99.73333333333333 37:99.73333333333333 38:99.73333333333333 39:99.73333333333333 40:98.53333333333333 41:98.53333333333333 42:98.53333333333333 43:98.53333333333333 44:98.53333333333333 45:98.53333333333333 46:98.53333333333333 47:98.53333333333333 48:97.33333333333333 49:97.33333333333333 50:97.33333333333333 51:97.33333333333333 52:97.43333333333334 53:97.43333333333334 54:97.43333333333334 55:97.43333333333334 56:97.33333333333333 57:97.33333333333333 58:97.33333333333333 59:97.33333333333333 60:96.3 61:96.3 62:96.3 63:96.3 64:94.8 65:94.8 66:94.8 67:94.8 68:95.40000000000001 69:95.40000000000001 70:95.40000000000001 71:95.40000000000001 72:96.40000000000001 73:96.40000000000001 74:96.40000000000001 75:96.40000000000001 76:96 77:96 78:96 79:96 80:96.40000000000001 81:96.40000000000001 82:96.40000000000001 83:96.40000000000001 84:96.40000000000001 85:96.40000000000001 86:96.40000000000001 87:96.40000000000001 88:96 89:96 90:96 91:96 92:96.8 93:96.8 94:96.8 95:96.8 96:95.7 97:95.7 98:95.7 99:95.7 100:105.5666666666667 101:105.5 102:105.5 103:105.4333333333333 104:103.0666666666667 105:103 106:103 107:102.9333333333333 108:103.4 109:103.4666666666667 110:103.5333333333333 111:103.6666666666667 112:103.8666666666667 113:104.1333333333333 114:104.2666666666667 115:104.4 116:103.9333333333333 117:103.9333333333333 118:103.9333333333333 119:103.8666666666667 120:102.2 121:102.2 122:102.2 123:102.2 124:100.4 125:100.4 126:100.4 127:100.4 128:100.1 129:100.1 130:100.1 131:100.1 132:100.6 133:100.6 134:100.6 135:100.6 136:100.2 137:100.2 138:100.2 139:100.2 140:101.2666666666667 141:101.2666666666667 142:101.2666666666667 143:101.2666666666667 144:100.6666666666667 145:100.6666666666667 146:100.6666666666667 147:100.6666666666667 148:98.46666666666667 149:98.46666666666667 150:98.46666666666667 151:98.46666666666667 152:99.56666666666666 153:99.56666666666666 154:99.56666666666666 155:99.56666666666666 156:101.5 157:101.5 158:101.5 159:101.5 160:100.5 161:100.5 162:100.5 163:100.5 164:98 165:98 166:98 167:98 168:97.3 169:97.3 170:97.3 171:97.3 172:97.59999999999999 173:97.59999999999999 174:97.59999999999999 175:97.59999999999999 176:96.59999999999999 177:96.59999999999999 178:96.59999999999999 179:96.59999999999999 180:97.59999999999999 181:97.59999999999999 182:97.59999999999999 183:97.59999999999999 184:98.2 185:98.2 186:98.2 187:98.2 188:97.2 189:97.2 190:97.2 191:97.2 192:97.40000000000001 193:97.40000000000001 194:97.40000000000001 195:97.40000000000001 196:97.5 197:97.5 198:97.5 199:97.5 200:100.9666666666667 201:100.9666666666667 202:100.9666666666667 203:100.9666666666667 204:103.4666666666667 205:103.4666666666667 206:103.4666666666667 207:103.4666666666667 208:104.6 209:104.6 210:104.6 211:104.6 212:105.2666666666667 213:105.2666666666667 214:105.2666666666667 215:105.2666666666667 216:105.1333333333333 217:105.0666666666667 218:105.0666666666667 219:105 220:103.0666666666667 221:103 222:103 223:103 224:104.6 225:104.6 226:104.6 227:104.6 228:104.1 229:104.1 230:104.1 231:104.1 232:103.2 233:103.2 234:103.2 235:103.2 236:104.7 237:104.7 238:104.7 239:104.7 240:102.8 241:102.8 242:102.8 243:102.8 244:101 245:101 246:101 247:101 248:102.3 249:102.3 250:102.3 251:102.3 252:101 253:101 254:101 255:101 256:100.6 257:100.6 258:100.6 259:100.6 260:102 261:102 262:102 263:102 264:102.2 265:102.2 266:102.2 267:102.2 268:102 269:102 270:102 271:102 272:104.5 273:104.5 274:104.5 275:104.5 276:98.59999999999999 277:98.59999999999999 278:98.59999999999999 279:98.59999999999999 280:99.59999999999999 281:99.59999999999999 282:99.59999999999999 283:99.59999999999999 284:99 285:99 286:99 287:99 288:98 289:98 290:98 291:98 292:98.59999999999999 293:98.59999999999999 294:98.59999999999999 295:98.59999999999999 296:99 297:99 298:99 299:99 300:100.7666666666667 301:100.7666666666667 302:100.7666666666667 303:100.7666666666667 304:99.59999999999999 305:99.59999999999999 306:99.59999999999999 307:99.59999999999999 308:102.1333333333333 309:102.1333333333333 310:102.1333333333333 311:102.1333333333333 312:103 313:103 314:103 315:103 316:103.2 317:103.2 318:103.2 319:103.2 320:102.8 321:102.8 322:102.8 323:102.8 324:102.1 325:102.1 326:102.1 327:102.1 328:100.4 329:100.4 330:100.4 331:100.4 332:98 333:98 334:98 335:98 336:102.8 337:102.8 338:102.8 339:102.8 340:104.5 341:104.5 342:104.5 343:104.5 344:102.7 345:102.7 346:102.7 347:102.7 348:96.2 349:96.2 350:96.2 351:96.2 352:100.9 353:100.9 354:100.9 355:100.9 356:101.6333333333333 357:101.6333333333333 358:101.6333333333333 359:101.6333333333333 360:100.1333333333333 361:100.1333333333333 362:100.1333333333333 363:100.1333333333333 364:100.6333333333333 365:100.6333333333333 366:100.6333333333333 367:100.6333333333333 368:100.5333333333333 369:100.5333333333333 370:100.5333333333333 371:100.5333333333333 372:101.4 373:101.4 374:101.4 375:101.4 376:98.7 377:98.7 378:98.7 379:98.7 380:98.90000000000001 381:98.90000000000001 382:98.90000000000001 383:98.90000000000001 384:98.5 385:98.5 386:98.5 387:98.5 388:95.73333333333333 389:95.73333333333333 390:95.73333333333333 391:95.73333333333333 392:95.13333333333334 393:95.13333333333334 394:95.13333333333334 395:95.13333333333334 396:97.59999999999999 397:97.59999999999999 398:97.59999999999999 399:97.59999999999999 400:104.2666666666667 401:104.2666666666667 402:104.2666666666667 403:104.2666666666667 404:102.1333333333333 405:102.1333333333333 406:102.1333333333333 407:102.1333333333333 408:101.2333333333333 409:101.2333333333333 410:101.2333333333333 411:101.2333333333333 412:105.4666666666667 413:105.4666666666667 414:105.4666666666667 415:105.4666666666667 416:104.5333333333333 417:104.5333333333333 418:104.5333333333333 419:104.5333333333333 420:101.7333333333333 421:101.7333333333333 422:101.7333333333333 423:101.7333333333333 424:102.0333333333333 425:102.0333333333333 426:102.0333333333333 427:102.0333333333333 428:97.83333333333333 429:97.83333333333333 430:97.83333333333333 431:97.83333333333333 432:98.09999999999999 433:98.09999999999999 434:98.09999999999999 435:98.09999999999999 436:102.7333333333333 437:102.7333333333333 438:102.7333333333333 439:102.7333333333333 440:97.13333333333334 441:97.13333333333334 442:97.13333333333334 443:97.13333333333334 444:101.5666666666667 445:101.5666666666667 446:101.5666666666667 447:101.5666666666667 448:94.68333333333334 449:96.43333333333334 450:98.63333333333334 451:100.2833333333333 452:96.96666666666667 453:96.96666666666667 454:96.96666666666667 455:96.96666666666667 456:93.73333333333333 457:93.8 458:93.8 459:93.8 460:97.06666666666666 461:97.06666666666666 462:97.06666666666666 463:97.06666666666666 464:97.66666666666667 465:97.66666666666667 466:97.66666666666667 467:97.66666666666667 468:95.93333333333334 469:95.93333333333334 470:95.93333333333334 471:95.93333333333334 472:91.53333333333333 473:91.53333333333333 474:91.53333333333333 475:91.53333333333333 476:93.90000000000001 477:93.90000000000001 478:93.90000000000001 479:93.90000000000001 480:94.40000000000001 481:94.40000000000001 482:94.40000000000001 483:94.40000000000001 484:91.73333333333333 485:91.73333333333333 486:91.73333333333333 487:91.73333333333333 488:94.06666666666666 489:94.13333333333334 490:94.13333333333334 491:94.13333333333334 492:95.21666666666667 493:93.71666666666667 494:90.96666666666667 495:89.41666666666667 496:94.05 497:94 498:94.06666666666666 499:93.93333333333334 500:100.1666666666667 501:100.1666666666667 502:100.1666666666667 503:100.1666666666667 504:102.3333333333333 505:102.3333333333333 506:102.3333333333333 507:102.3333333333333 508:103.4333333333333 509:103.4333333333333 510:103.4333333333333 511:103.4333333333333 512:103.3333333333333 513:103.3333333333333 514:103.3333333333333 515:103.3333333333333 516:100.5333333333333 517:100.5333333333333 518:100.5333333333333 519:100.5333333333333 520:100.1333333333333 521:100.1333333333333 522:100.1333333333333 523:100.1333333333333 524:102.8333333333333 525:102.8333333333333 526:102.8333333333333 527:102.8333333333333 528:105.1333333333333 529:105.1333333333333 530:105.1333333333333 531:105.1333333333333 532:100.6333333333333 533:100.6333333333333 534:100.6333333333333 535:100.6333333333333 536:99.8 537:99.8 538:99.8 539:99.8 540:101.7 541:101.7 542:101.7 543:101.7 544:100.4666666666667 545:100.4666666666667 546:100.4666666666667 547:100.4666666666667 548:101.6666666666667 549:100.0166666666667 550:97.71666666666667 551:96.01666666666667 552:98.73333333333333 553:98.73333333333333 554:98.73333333333333 555:98.73333333333333 556:104.3333333333333 557:104.3333333333333 558:104.3333333333333 559:104.3333333333333 560:98.16666666666667 561:98.16666666666667 562:98.16666666666667 563:98.16666666666667 564:98.86666666666666 565:98.86666666666666 566:98.86666666666666 567:98.86666666666666 568:98.2 569:98.2 570:98.2 571:98.2 572:99.09999999999999 573:99.09999999999999 574:99.09999999999999 575:99.09999999999999 576:94.73333333333333 577:94.73333333333333 578:94.73333333333333 579:94.73333333333333 580:94.33333333333333 581:94.33333333333333 582:94.33333333333333 583:94.33333333333333 584:95.40000000000001 585:95.40000000000001 586:95.40000000000001 587:95.40000000000001 588:96 589:96 590:96 591:96 592:97.01666666666667 593:95.41666666666667 594:92.51666666666667 595:90.91666666666667 596:91.06666666666666 597:91.06666666666666 598:91.06666666666666 599:91.06666666666666 600:100.6666666666667 601:100.6666666666667 602:100.6666666666667 603:100.6666666666667 604:98.93333333333334 605:98.93333333333334 606:98.93333333333334 607:98.93333333333334 608:96.3 609:96.3 610:96.3 611:96.3 612:93.2 613:93.2 614:93.2 615:93.2 616:90.93333333333334 617:90.93333333333334 618:90.93333333333334 619:90.93333333333334 620:88.03333333333333 621:88.03333333333333 622:88.03333333333333 623:88.03333333333333 624:93.83333333333333 625:93.83333333333333 626:93.83333333333333 627:93.83333333333333 628:93.23333333333333 629:93.23333333333333 630:93.23333333333333 631:93.23333333333333 632:94.59999999999999 633:94.59999999999999 634:94.59999999999999 635:94.59999999999999 636:95.56666666666666 637:95.56666666666666 638:95.56666666666666 639:95.56666666666666 640:94.8 641:94.8 642:94.8 643:94.8 644:96.56666666666666 645:96.56666666666666 646:96.56666666666666 647:96.56666666666666 648:97.46666666666667 649:97.46666666666667 650:97.46666666666667 651:97.46666666666667 652:90.33333333333333 653:90.33333333333333 654:90.33333333333333 655:90.33333333333333 656:89.23333333333333 657:89.23333333333333 658:89.23333333333333 659:89.23333333333333 660:93.86666666666666 661:93.86666666666666 662:93.86666666666666 663:93.86666666666666 664:97.13333333333334 665:97.13333333333334 666:97.13333333333334 667:97.13333333333334 668:96.76666666666667 669:96.76666666666667 670:96.76666666666667 671:96.76666666666667 672:95.01666666666667 673:95.06666666666666 674:95.11666666666666 675:94.96666666666667 676:91.5 677:91.5 678:91.5 679:91.5 680:95.59999999999999 681:95.59999999999999 682:95.59999999999999 683:95.59999999999999 684:92.96666666666667 685:92.96666666666667 686:92.96666666666667 687:92.96666666666667 688:92.46666666666667 689:92.46666666666667 690:92.46666666666667 691:92.46666666666667 692:86.73333333333333 693:86.73333333333333 694:86.73333333333333 695:86.73333333333333 696:90.36666666666666 697:90.36666666666666 698:90.36666666666666 699:90.36666666666666 700:91.40000000000001 701:91.40000000000001 702:91.40000000000001 703:91.40000000000001 704:86.8 705:86.8 706:86.8 707:86.8 708:87.33333333333333 709:87.33333333333333 710:87.33333333333333 711:87.33333333333333 712:87.66666666666667 713:87.66666666666667 714:87.66666666666667 715:87.66666666666667 716:86.73333333333333 717:86.73333333333333 718:86.73333333333333 719:86.73333333333333 720:92.83333333333333 721:92.83333333333333 722:92.83333333333333 723:92.83333333333333 724:92.43333333333334 725:92.43333333333334 726:92.43333333333334 727:92.43333333333334 728:93.23333333333333 729:93.23333333333333 730:93.23333333333333 731:93.23333333333333 732:95.33333333333333 733:95.33333333333333 734:95.33333333333333 735:95.33333333333333 736:100.2333333333333 737:100.2333333333333 738:100.2333333333333 739:100.2333333333333 740:98.63333333333334 741:98.63333333333334 742:98.63333333333334 743:98.63333333333334 744:97.73333333333333 745:97.73333333333333 746:97.73333333333333 747:97.73333333333333 748:93.33333333333333 749:93.33333333333333 750:93.33333333333333 751:93.33333333333333 752:98.73333333333333 753:98.73333333333333 754:98.73333333333333 755:98.73333333333333 756:94.73333333333333 757:94.73333333333333 758:94.73333333333333 759:94.73333333333333 760:93.83333333333333 761:93.83333333333333 762:93.83333333333333 763:93.83333333333333 764:87.33333333333333 765:87.33333333333333 766:87.33333333333333 767:87.33333333333333 768:90.53333333333333 769:90.53333333333333 770:90.53333333333333 771:90.53333333333333 772:93.03333333333333 773:93.13333333333334 774:93.08333333333333 775:93.18333333333334 776:98.33333333333333 777:98.33333333333333 778:98.33333333333333 779:98.33333333333333 780:95.73333333333333 781:95.73333333333333 782:95.73333333333333 783:95.73333333333333 784:90.93333333333334 785:90.93333333333334 786:90.93333333333334 787:90.93333333333334 788:90.63333333333334 789:90.63333333333334 790:90.63333333333334 791:90.63333333333334 792:96.83333333333333 793:96.83333333333333 794:96.83333333333333 795:96.83333333333333 796:97.53333333333333 797:97.53333333333333 798:97.53333333333333 799:97.53333333333333 +0 0:87.63333333333334 1:87.63333333333334 2:87.63333333333334 3:87.63333333333334 4:83.33333333333333 5:83.33333333333333 6:83.33333333333333 7:83.33333333333333 8:86.96666666666667 9:86.96666666666667 10:86.96666666666667 11:86.96666666666667 12:90.16666666666667 13:90.16666666666667 14:90.16666666666667 15:90.16666666666667 16:87.93333333333334 17:87.93333333333334 18:87.93333333333334 19:87.93333333333334 20:86.53333333333333 21:86.53333333333333 22:86.53333333333333 23:86.53333333333333 24:90.18333333333334 25:91.33333333333333 26:92.78333333333333 27:93.88333333333334 28:92.78333333333333 29:91.63333333333334 30:90.03333333333333 31:88.88333333333334 32:93.90000000000001 33:95.05 34:96.8 35:97.95 36:92.09999999999999 37:91.15000000000001 38:89.90000000000001 39:89.15000000000001 40:90.33333333333333 41:90.33333333333333 42:90.33333333333333 43:90.33333333333333 44:88.83333333333333 45:87.83333333333333 46:86.08333333333333 47:85.03333333333333 48:86.96666666666667 49:86.96666666666667 50:86.96666666666667 51:86.96666666666667 52:85.16666666666667 53:85.16666666666667 54:85.16666666666667 55:85.16666666666667 56:88.43333333333334 57:88.43333333333334 58:88.43333333333334 59:88.43333333333334 60:83.43333333333334 61:83.43333333333334 62:83.43333333333334 63:83.43333333333334 64:88.33333333333333 65:88.33333333333333 66:88.33333333333333 67:88.33333333333333 68:84.73333333333333 69:84.73333333333333 70:84.73333333333333 71:84.73333333333333 72:83.06666666666666 73:83.06666666666666 74:83.06666666666666 75:83.06666666666666 76:87.96666666666667 77:87.96666666666667 78:87.96666666666667 79:87.8 80:89.40000000000001 81:89.40000000000001 82:89.40000000000001 83:89.40000000000001 84:85.2 85:85.2 86:85.2 87:85.2 88:83.23333333333333 89:84.93333333333334 90:87.58333333333333 91:89.13333333333334 92:88.03333333333333 93:88.13333333333334 94:88.03333333333333 95:87.93333333333334 96:88.09999999999999 97:88.09999999999999 98:88.09999999999999 99:88.09999999999999 100:81.15000000000001 101:82.40000000000001 102:84.15000000000001 103:85.2 104:84.8 105:84.8 106:84.8 107:84.8 108:80.86666666666666 109:80.86666666666666 110:80.86666666666666 111:80.86666666666666 112:86.76666666666667 113:86.76666666666667 114:86.76666666666667 115:86.76666666666667 116:83.7 117:83.7 118:83.7 119:83.7 120:87.3 121:87.3 122:87.3 123:87.31666666666666 124:86.43333333333334 125:86.33333333333333 126:86.28333333333333 127:86.23333333333333 128:89.73333333333333 129:89.73333333333333 130:89.73333333333333 131:89.73333333333333 132:86.40000000000001 133:86.40000000000001 134:86.40000000000001 135:86.40000000000001 136:78.65000000000001 137:79.45 138:80.7 139:81.55 140:82.33333333333333 141:82.33333333333333 142:82.33333333333333 143:82.33333333333333 144:86.73333333333333 145:86.73333333333333 146:86.78333333333333 147:86.83333333333333 148:86.66666666666667 149:86.66666666666667 150:86.66666666666667 151:86.66666666666667 152:83.26666666666667 153:83.16666666666667 154:83.06666666666666 155:83.06666666666666 156:88.25 157:88.23333333333333 158:88.23333333333333 159:88.23333333333333 160:93.83333333333333 161:93.83333333333333 162:93.83333333333333 163:93.81666666666666 164:92.03333333333333 165:92.03333333333333 166:92.03333333333333 167:92.03333333333333 168:89.63333333333334 169:89.63333333333334 170:89.63333333333334 171:89.63333333333334 172:82.18333333333334 173:82.2 174:82.2 175:82.2 176:87.90000000000001 177:87.90000000000001 178:87.90000000000001 179:87.8 180:80.75 181:80.73333333333333 182:80.73333333333333 183:80.73333333333333 184:84.73333333333333 185:84.73333333333333 186:84.73333333333333 187:84.76666666666667 188:84.11666666666666 189:86.03333333333333 190:88.48333333333333 191:90.38333333333334 192:89.73333333333333 193:91.03333333333333 194:92.78333333333333 195:93.91666666666667 196:95.90000000000001 197:95.84999999999999 198:95.8 199:95.7 200:91.41666666666667 201:90.26666666666667 202:88.61666666666666 203:87.41666666666667 204:84.26666666666667 205:84.26666666666667 206:84.26666666666667 207:84.26666666666667 208:83.96666666666667 209:83.96666666666667 210:83.96666666666667 211:83.96666666666667 212:89.06666666666666 213:89.06666666666666 214:89.06666666666666 215:89.06666666666666 216:92.46666666666667 217:92.51666666666667 218:92.46666666666667 219:92.51666666666667 220:90.96666666666667 221:90.96666666666667 222:90.96666666666667 223:90.96666666666667 224:92.11666666666666 225:88.66666666666667 226:83.56666666666666 227:79.96666666666667 228:84.26666666666667 229:84.26666666666667 230:84.26666666666667 231:84.26666666666667 232:88.46666666666667 233:88.46666666666667 234:88.46666666666667 235:88.46666666666667 236:86.96666666666667 237:86.96666666666667 238:86.96666666666667 239:86.96666666666667 240:86.46666666666667 241:86.46666666666667 242:86.46666666666667 243:86.46666666666667 244:84.06666666666666 245:84.01666666666667 246:83.91666666666667 247:83.86666666666666 248:85.76666666666667 249:85.76666666666667 250:85.76666666666667 251:85.76666666666667 252:85.26666666666667 253:81.76666666666667 254:76.66666666666667 255:73.06666666666666 256:81.55 257:81.56666666666666 258:81.56666666666666 259:81.56666666666666 260:85.41666666666667 261:85.51666666666667 262:85.46666666666667 263:85.46666666666667 264:85.93333333333334 265:85.93333333333334 266:85.93333333333334 267:85.93333333333334 268:82.13333333333334 269:82.13333333333334 270:82.13333333333334 271:82.13333333333334 272:88.93333333333334 273:88.93333333333334 274:88.93333333333334 275:88.93333333333334 276:88.03333333333333 277:88.03333333333333 278:88.03333333333333 279:87.90000000000001 280:84.01666666666667 281:84.01666666666667 282:84.01666666666667 283:84.01666666666667 284:84.41666666666667 285:84.41666666666667 286:84.41666666666667 287:84.43333333333334 288:84.2 289:84.2 290:84.2 291:84.2 292:93.45 293:92.25 294:90.59999999999999 295:89.45 296:90.45 297:90.40000000000001 298:90.3 299:90.34999999999999 300:76.91666666666667 301:76.96666666666667 302:76.91666666666667 303:76.81666666666666 304:75.16666666666667 305:75.16666666666667 306:75.16666666666667 307:75.16666666666667 308:75.76666666666667 309:75.76666666666667 310:75.76666666666667 311:75.76666666666667 312:68.26666666666667 313:68.26666666666667 314:68.26666666666667 315:68.26666666666667 316:63.86666666666667 317:63.76666666666667 318:63.86666666666667 319:63.76666666666667 320:66.26666666666667 321:66.26666666666667 322:66.26666666666667 323:66.26666666666667 324:68.31666666666666 325:68.16666666666667 326:68.31666666666666 327:68.21666666666667 328:71.46666666666667 329:71.46666666666667 330:71.46666666666667 331:71.46666666666667 332:71.36666666666666 333:71.36666666666666 334:71.36666666666666 335:71.36666666666666 336:79.46666666666667 337:79.46666666666667 338:79.46666666666667 339:79.46666666666667 340:79.86666666666666 341:79.86666666666666 342:79.86666666666666 343:79.86666666666666 344:76.96666666666667 345:76.96666666666667 346:77.01666666666667 347:77.01666666666667 348:74.66666666666667 349:74.66666666666667 350:74.66666666666667 351:74.66666666666667 352:76.16666666666667 353:76.11666666666666 354:76.06666666666666 355:76.06666666666666 356:76.03333333333333 357:76.03333333333333 358:76.03333333333333 359:76.03333333333333 360:70.23333333333333 361:73.93333333333334 362:79.03333333333333 363:82.48333333333333 364:82.46666666666667 365:82.46666666666667 366:82.46666666666667 367:82.46666666666667 368:86.86666666666666 369:86.11666666666666 370:84.71666666666667 371:83.96666666666667 372:83.3 373:83.3 374:83.3 375:83.3 376:84.8 377:84.8 378:84.8 379:84.8 380:88.05 381:88.05 382:88.05 383:88.05 384:91.45 385:91.45 386:91.45 387:91.45 388:90.05 389:88.95 390:87.40000000000001 391:86.3 392:83.3 393:83.3 394:83.3 395:83.3 396:84.40000000000001 397:84.5 398:84.55 399:84.59999999999999 400:73.26666666666667 401:73.26666666666667 402:73.26666666666667 403:73.26666666666667 404:70.66666666666667 405:70.66666666666667 406:70.66666666666667 407:70.66666666666667 408:68.66666666666667 409:68.66666666666667 410:68.66666666666667 411:68.66666666666667 412:69.31666666666666 413:71.06666666666666 414:73.46666666666667 415:75.06666666666666 416:70.61666666666666 417:71.36666666666666 418:72.61666666666666 419:73.36666666666666 420:75.36666666666666 421:75.36666666666666 422:75.36666666666666 423:75.36666666666666 424:71.86666666666666 425:70.26666666666667 426:67.91666666666667 427:66.16666666666667 428:65.46666666666667 429:67.16666666666667 430:69.41666666666667 431:70.86666666666666 432:75.16666666666667 433:75.16666666666667 434:75.16666666666667 435:75.16666666666667 436:76.96666666666667 437:76.96666666666667 438:76.96666666666667 439:76.96666666666667 440:72.81666666666666 441:72.76666666666667 442:72.71666666666667 443:72.66666666666667 444:72.76666666666667 445:72.76666666666667 446:72.76666666666667 447:72.76666666666667 448:71.76666666666667 449:71.76666666666667 450:71.76666666666667 451:71.76666666666667 452:74.46666666666667 453:74.46666666666667 454:74.46666666666667 455:74.46666666666667 456:73.23333333333333 457:73.13333333333334 458:73.13333333333334 459:73.13333333333334 460:71.93333333333334 461:71.93333333333334 462:71.93333333333334 463:71.93333333333334 464:70.76666666666667 465:70.76666666666667 466:70.76666666666667 467:70.76666666666667 468:77.21666666666667 469:74.31666666666666 470:70.56666666666666 471:67.81666666666666 472:69.76666666666667 473:68.21666666666667 474:65.81666666666666 475:64.06666666666666 476:64.16666666666667 477:64.16666666666667 478:64.16666666666667 479:64.08333333333333 480:64.86666666666666 481:64.76666666666667 482:64.76666666666667 483:64.76666666666667 484:61.16666666666666 485:61.16666666666666 486:61.16666666666666 487:61.16666666666666 488:55.25 489:56.35 490:57.8 491:58.9 492:67 493:67 494:67 495:67 496:74.45 497:72.75 498:70.2 499:68.5 500:72.56666666666666 501:72.56666666666666 502:72.56666666666666 503:72.56666666666666 504:66.26666666666667 505:66.26666666666667 506:66.26666666666667 507:66.26666666666667 508:63.26666666666667 509:63.26666666666667 510:63.26666666666667 511:63.26666666666667 512:62.46666666666667 513:60.86666666666667 514:58.51666666666667 515:56.86666666666667 516:59.61666666666667 517:58.76666666666667 518:57.61666666666667 519:56.71666666666667 520:52.56666666666667 521:52.56666666666667 522:52.56666666666667 523:52.56666666666667 524:60.01666666666667 525:61.71666666666667 526:64.01666666666667 527:65.66666666666667 528:71.66666666666667 529:70.11666666666666 530:67.76666666666667 531:66.16666666666667 532:64.76666666666667 533:64.76666666666667 534:64.76666666666667 535:64.76666666666667 536:72.66666666666667 537:72.66666666666667 538:72.66666666666667 539:72.66666666666667 540:72.11666666666666 541:73.31666666666666 542:75.01666666666667 543:76.41666666666667 544:68.36666666666666 545:68.36666666666666 546:68.36666666666666 547:68.36666666666666 548:67.66666666666667 549:67.66666666666667 550:67.66666666666667 551:67.66666666666667 552:70.96666666666667 553:70.96666666666667 554:70.96666666666667 555:70.96666666666667 556:70.26666666666667 557:70.26666666666667 558:70.26666666666667 559:70.26666666666667 560:66.26666666666667 561:66.26666666666667 562:66.26666666666667 563:66.26666666666667 564:71.05 565:71.06666666666666 566:71.06666666666666 567:71.06666666666666 568:67.86666666666666 569:67.86666666666666 570:67.86666666666666 571:67.86666666666666 572:69.36666666666666 573:70.91666666666667 574:73.16666666666667 575:74.76666666666667 576:76.66666666666667 577:76.66666666666667 578:76.66666666666667 579:76.5 580:73.33333333333333 581:73.23333333333333 582:73.28333333333333 583:73.38333333333334 584:71.83333333333333 585:71.83333333333333 586:71.83333333333333 587:71.83333333333333 588:72.7 589:72.7 590:72.7 591:72.7 592:73.5 593:73.5 594:73.5 595:73.5 596:80.76666666666667 597:79.06666666666666 598:76.31666666666666 599:74.66666666666667 600:64.76666666666667 601:64.76666666666667 602:64.76666666666667 603:64.76666666666667 604:66.46666666666667 605:66.46666666666667 606:66.46666666666667 607:66.46666666666667 608:65.16666666666667 609:65.16666666666667 610:65.16666666666667 611:65.16666666666667 612:70.36666666666666 613:70.36666666666666 614:70.36666666666666 615:70.36666666666666 616:71.06666666666666 617:71.06666666666666 618:71.06666666666666 619:71.06666666666666 620:64.56666666666666 621:64.56666666666666 622:64.56666666666666 623:64.56666666666666 624:61.5 625:61.5 626:61.5 627:61.5 628:61.36666666666667 629:61.36666666666667 630:61.36666666666667 631:61.36666666666667 632:62.76666666666667 633:62.76666666666667 634:62.76666666666667 635:62.76666666666667 636:69.26666666666667 637:69.26666666666667 638:69.26666666666667 639:69.26666666666667 640:68.11666666666666 641:66.96666666666667 642:65.31666666666666 643:64.11666666666666 644:65.96666666666667 645:65.96666666666667 646:65.96666666666667 647:65.96666666666667 648:61.96666666666667 649:61.96666666666667 650:61.96666666666667 651:61.96666666666667 652:62.86666666666667 653:62.86666666666667 654:62.86666666666667 655:62.86666666666667 656:69.26666666666667 657:69.16666666666667 658:69.26666666666667 659:69.36666666666666 660:71.66666666666667 661:71.66666666666667 662:71.66666666666667 663:71.66666666666667 664:74.40000000000001 665:74.40000000000001 666:74.40000000000001 667:74.40000000000001 668:77.90000000000001 669:77.90000000000001 670:77.90000000000001 671:77.90000000000001 672:77.53333333333333 673:77.53333333333333 674:77.53333333333333 675:77.53333333333333 676:67.73333333333333 677:67.73333333333333 678:67.73333333333333 679:67.73333333333333 680:59.73333333333333 681:63.23333333333333 682:68.43333333333334 683:71.98333333333333 684:67.63333333333334 685:67.63333333333334 686:67.63333333333334 687:67.63333333333334 688:71 689:71 690:71 691:71 692:66.3 693:66.3 694:66.3 695:66.15000000000001 696:71.56666666666666 697:71.56666666666666 698:71.56666666666666 699:71.56666666666666 700:69.96666666666667 701:69.96666666666667 702:69.96666666666667 703:69.96666666666667 704:70.16666666666667 705:70.16666666666667 706:70.16666666666667 707:70.16666666666667 708:67.06666666666666 709:67.06666666666666 710:67.06666666666666 711:67.06666666666666 712:66.06666666666666 713:66.06666666666666 714:66.06666666666666 715:66.06666666666666 716:66.46666666666667 717:66.46666666666667 718:66.46666666666667 719:66.46666666666667 720:70.46666666666667 721:70.46666666666667 722:70.46666666666667 723:70.46666666666667 724:68.86666666666666 725:68.86666666666666 726:68.86666666666666 727:68.86666666666666 728:72.36666666666666 729:72.36666666666666 730:72.36666666666666 731:72.36666666666666 732:68.26666666666667 733:68.26666666666667 734:68.26666666666667 735:68.26666666666667 736:67.86666666666666 737:67.86666666666666 738:67.86666666666666 739:67.86666666666666 740:70.46666666666667 741:70.46666666666667 742:70.46666666666667 743:70.46666666666667 744:74.46666666666667 745:74.46666666666667 746:74.46666666666667 747:74.46666666666667 748:74.16666666666667 749:74.16666666666667 750:74.16666666666667 751:74.16666666666667 752:78.56666666666666 753:78.01666666666667 754:77.16666666666667 755:76.51666666666667 756:70.65000000000001 757:70.59999999999999 758:70.45 759:70.40000000000001 760:77 761:77 762:77 763:77 764:74.01666666666667 765:74 766:74 767:74 768:77.3 769:77.3 770:77.3 771:77.3 772:78.09999999999999 773:78.09999999999999 774:78.09999999999999 775:78.09999999999999 776:73.40000000000001 777:73.40000000000001 778:73.40000000000001 779:73.40000000000001 780:75.33333333333333 781:71.73333333333333 782:66.48333333333333 783:62.98333333333333 784:74.03333333333333 785:74.03333333333333 786:74.03333333333333 787:74.03333333333333 788:74.48333333333333 789:73.31666666666666 790:71.71666666666667 791:70.46666666666667 792:70.76666666666667 793:70.76666666666667 794:70.76666666666667 795:70.75 796:66.21666666666667 797:65.16666666666667 798:63.56666666666667 799:62.46666666666667 +0 0:92.8 1:92.86666666666666 2:93.11666666666666 3:93.46666666666667 4:100.5833333333333 5:97.23333333333333 6:92.56666666666666 7:89.16666666666667 8:89.36666666666666 9:89.21666666666667 10:89.21666666666667 11:89.43333333333334 12:98.90000000000001 13:98.90000000000001 14:98.90000000000001 15:98.90000000000001 16:98.59999999999999 17:98.59999999999999 18:98.59999999999999 19:98.40000000000001 20:97.43333333333334 21:97.36666666666666 22:97.36666666666666 23:97.36666666666666 24:94.96666666666667 25:94.96666666666667 26:94.96666666666667 27:95.03333333333333 28:96.3 29:96.5 30:96.5 31:96.5 32:103.1 33:103.1 34:103.1 35:102.9 36:101.3333333333333 37:101.1333333333333 38:101.1333333333333 39:101.1166666666667 40:93.96666666666667 41:94.93333333333334 42:96.13333333333334 43:97.08333333333333 44:95.33333333333333 45:94.3 46:93 47:92.11666666666666 48:96.01666666666667 49:96 50:96 51:95.86666666666666 52:93.66666666666667 53:90.46666666666667 54:84.86666666666666 55:81.66666666666667 56:91.86666666666666 57:91.86666666666666 58:91.86666666666666 59:91.86666666666666 60:93.06666666666666 61:93.06666666666666 62:93.06666666666666 63:93.06666666666666 64:92.26666666666667 65:92.26666666666667 66:92.26666666666667 67:92.26666666666667 68:92.26666666666667 69:92.26666666666667 70:92.26666666666667 71:92.26666666666667 72:96.96666666666667 73:96.96666666666667 74:96.96666666666667 75:96.96666666666667 76:92.06666666666666 77:92.06666666666666 78:92.06666666666666 79:92.06666666666666 80:89.26666666666667 81:92.46666666666667 82:98.06666666666666 83:101.5333333333333 84:98 85:98.13333333333334 86:98.2 87:98.33333333333333 88:98.59999999999999 89:99.7 90:101.4 91:102.6333333333333 92:99.23333333333333 93:99.23333333333333 94:99.23333333333333 95:99.23333333333333 96:91.93333333333334 97:91.93333333333334 98:91.93333333333334 99:91.93333333333334 100:86.43333333333334 101:86.5 102:86.5 103:86.34999999999999 104:83.5 105:83.25 106:83.5 107:83.56666666666666 108:88.68333333333334 109:90.51666666666667 110:93.08333333333333 111:95.18333333333334 112:94.71666666666667 113:93.25 114:90.75 115:88.90000000000001 116:89.7 117:91.3 118:94.09999999999999 119:95.7 120:92.8 121:90.90000000000001 122:88.40000000000001 123:86.55 124:88.55 125:90.40000000000001 126:92.90000000000001 127:94.8 128:99.34999999999999 129:97.65000000000001 130:95.3 131:93.65000000000001 132:92.09999999999999 133:92.09999999999999 134:92.09999999999999 135:92.09999999999999 136:93.86666666666666 137:93.86666666666666 138:93.86666666666666 139:93.86666666666666 140:97.66666666666667 141:100.4666666666667 142:104.2166666666667 143:106.9166666666667 144:105.0166666666667 145:100.6666666666667 146:94.66666666666667 147:90.05 148:92.90000000000001 149:92.76666666666667 150:92.7 151:92.5 152:90.76666666666667 153:90.76666666666667 154:90.76666666666667 155:90.76666666666667 156:90.36666666666666 157:90.36666666666666 158:90.36666666666666 159:90.36666666666666 160:90.91666666666667 161:92.51666666666667 162:94.91666666666667 163:96.46666666666667 164:98.26666666666667 165:98.26666666666667 166:98.26666666666667 167:98.26666666666667 168:97.86666666666666 169:97.86666666666666 170:97.86666666666666 171:97.86666666666666 172:93.96666666666667 173:93.96666666666667 174:93.96666666666667 175:93.96666666666667 176:94.26666666666667 177:92.71666666666667 178:90.31666666666666 179:88.71666666666667 180:90.06666666666666 181:91.51666666666667 182:93.86666666666666 183:95.61666666666666 184:95.40000000000001 185:95.40000000000001 186:95.40000000000001 187:95.40000000000001 188:92.59999999999999 189:91.5 190:89.8 191:88.76666666666667 192:94.33333333333333 193:94.33333333333333 194:94.33333333333333 195:94.33333333333333 196:97.43333333333334 197:97.43333333333334 198:97.43333333333334 199:97.43333333333334 200:91.5 201:91.5 202:91.5 203:91.33333333333333 204:90.40000000000001 205:92.81666666666666 206:96.95 207:99.75 208:91.95 209:90.25 210:88.21666666666667 211:86.91666666666667 212:90.31666666666666 213:89.96666666666667 214:89.09999999999999 215:88.5 216:85.8 217:87.40000000000001 218:90.2 219:91.8 220:86.34999999999999 221:84.5 222:82 223:80.09999999999999 224:76 225:77.90000000000001 226:80.40000000000001 227:82.25 228:86.2 229:87.84999999999999 230:90.15000000000001 231:91.84999999999999 232:85.40000000000001 233:85.40000000000001 234:85.40000000000001 235:85.40000000000001 236:82.86666666666666 237:82.86666666666666 238:82.86666666666666 239:82.86666666666666 240:84.86666666666666 241:84.86666666666666 242:84.8 243:84.66666666666667 244:88.78333333333333 245:90.33333333333333 246:92.56666666666666 247:94.06666666666666 248:86.53333333333333 249:86.53333333333333 250:86.46666666666667 251:86.40000000000001 252:80.06666666666666 253:84.01666666666667 254:89.46666666666667 255:93.21666666666667 256:95.86666666666666 257:95.86666666666666 258:95.86666666666666 259:95.86666666666666 260:98.71666666666667 261:97.11666666666666 262:94.71666666666667 263:93.16666666666667 264:88.96666666666667 265:88.96666666666667 266:88.96666666666667 267:88.96666666666667 268:95.86666666666666 269:95.86666666666666 270:95.86666666666666 271:95.86666666666666 272:92.76666666666667 273:92.76666666666667 274:92.76666666666667 275:92.76666666666667 276:85.16666666666667 277:86.71666666666667 278:89.11666666666666 279:90.71666666666667 280:87.66666666666667 281:86.21666666666667 282:83.86666666666666 283:82.11666666666666 284:87.13333333333334 285:88.34999999999999 286:90.09999999999999 287:91.40000000000001 288:84.03333333333333 289:86.90000000000001 290:90.65000000000001 291:93.46666666666667 292:95.56666666666666 293:95.63333333333334 294:95.63333333333334 295:95.7 296:92.43333333333334 297:92.43333333333334 298:92.43333333333334 299:92.43333333333334 300:96.73333333333333 301:93 302:88.2 303:84.28333333333333 304:91.36666666666666 305:95.58333333333333 306:102.0166666666667 307:106.85 308:103.2833333333333 309:99.53333333333333 310:94.75 311:91.5 312:91.58333333333333 313:90.45 314:88.98333333333333 315:88.16666666666667 316:84.53333333333333 317:84.53333333333333 318:84.46666666666667 319:84.46666666666667 320:81.3 321:81.31666666666666 322:81.31666666666666 323:81.31666666666666 324:85.81666666666666 325:85.81666666666666 326:85.81666666666666 327:85.81666666666666 328:85.31666666666666 329:85.31666666666666 330:85.31666666666666 331:85.28333333333333 332:81.15000000000001 333:81.13333333333334 334:81.13333333333334 335:81.33333333333333 336:79.2 337:79.40000000000001 338:79.40000000000001 339:79.40000000000001 340:78.59999999999999 341:78.66666666666667 342:78.61666666666666 343:78.40000000000001 344:82.93333333333334 345:82.71666666666667 346:82.90000000000001 347:82.83333333333333 348:75.09999999999999 349:75.09999999999999 350:75.09999999999999 351:75.09999999999999 352:80.38333333333334 353:80.06666666666666 354:79.76666666666667 355:79.46666666666667 356:87.46666666666667 357:87.46666666666667 358:87.46666666666667 359:87.46666666666667 360:86.46666666666667 361:86.46666666666667 362:86.46666666666667 363:86.46666666666667 364:87.26666666666667 365:87.26666666666667 366:87.26666666666667 367:87.26666666666667 368:82.46666666666667 369:82.46666666666667 370:82.46666666666667 371:82.46666666666667 372:77.36666666666666 373:77.36666666666666 374:77.36666666666666 375:77.36666666666666 376:86.21666666666667 377:86.46666666666667 378:86.46666666666667 379:86.21666666666667 380:88.86666666666666 381:88.86666666666666 382:88.86666666666666 383:88.86666666666666 384:81.51666666666667 385:83.46666666666667 386:87.36666666666666 387:89.36666666666666 388:85.96666666666667 389:86.81666666666666 390:88.16666666666667 391:89.06666666666666 392:86.83333333333333 393:86.90000000000001 394:86.90000000000001 395:86.90000000000001 396:88.7 397:88.7 398:88.7 399:88.7 400:84.73333333333333 401:83.90000000000001 402:82.65000000000001 403:81.59999999999999 404:88.21666666666667 405:88.76666666666667 406:90.15000000000001 407:91.11666666666666 408:90.86666666666666 409:90.86666666666666 410:90.86666666666666 411:90.73333333333333 412:91.76666666666667 413:91.76666666666667 414:91.90000000000001 415:91.86666666666666 416:89.36666666666666 417:89.36666666666666 418:89.5 419:89.5 420:89.66666666666667 421:89.83333333333333 422:89.96666666666667 423:89.96666666666667 424:90 425:90 426:90 427:90 428:83.40000000000001 429:83.40000000000001 430:83.40000000000001 431:83.40000000000001 432:87.33333333333333 433:87.59999999999999 434:87.73333333333333 435:87.66666666666667 436:83.51666666666667 437:85.16666666666667 438:86.83333333333333 439:88.06666666666666 440:81.46666666666667 441:82.61666666666666 442:84.31666666666666 443:85.63333333333334 444:88.40000000000001 445:88.06666666666666 446:88.40000000000001 447:88.40000000000001 448:83.5 449:83.5 450:83.5 451:83.5 452:88.09999999999999 453:88.09999999999999 454:88.09999999999999 455:88.09999999999999 456:82 457:82 458:82 459:82 460:81.3 461:81.3 462:81.3 463:81.3 464:76.7 465:76.7 466:76.7 467:76.7 468:74 469:77.5 470:82.7 471:86.25 472:86.7 473:86.7 474:86.7 475:86.63333333333334 476:86.03333333333333 477:85.96666666666667 478:85.96666666666667 479:85.96666666666667 480:94.96666666666667 481:94.96666666666667 482:94.96666666666667 483:95.03333333333333 484:93.68333333333334 485:90.09999999999999 486:85 487:81.5 488:79.7 489:79.7 490:79.7 491:79.63333333333334 492:83.33333333333333 493:83.2 494:83.2 495:83.2 496:93.3 497:93.3 498:93.3 499:93.3 500:98.40000000000001 501:95.78333333333333 502:91.98333333333333 503:89.11666666666666 504:91.5 505:94.13333333333334 506:97.81666666666666 507:100.5166666666667 508:92.53333333333333 509:94.01666666666667 510:96.51666666666667 511:98.06666666666666 512:89.13333333333334 513:89.06666666666666 514:89.06666666666666 515:89 516:85.16666666666667 517:85.16666666666667 518:85.16666666666667 519:85.16666666666667 520:84.73333333333333 521:84.86666666666666 522:84.86666666666666 523:84.86666666666666 524:84.16666666666667 525:84.16666666666667 526:84.16666666666667 527:84.16666666666667 528:89.56666666666666 529:89.56666666666666 530:89.56666666666666 531:89.56666666666666 532:91.3 533:91.36666666666666 534:91.36666666666666 535:91.5 536:95.2 537:92.41666666666667 538:88.31666666666666 539:85.58333333333333 540:85.11666666666666 541:87.65000000000001 542:90.75 543:93.08333333333333 544:91 545:90.83333333333333 546:91.26666666666667 547:91.33333333333333 548:85.36666666666666 549:87.16666666666667 550:89.76666666666667 551:91.53333333333333 552:89.09999999999999 553:89.09999999999999 554:89.09999999999999 555:89.09999999999999 556:81.59999999999999 557:81.59999999999999 558:81.59999999999999 559:81.59999999999999 560:79.93333333333334 561:79.86666666666666 562:79.86666666666666 563:79.86666666666666 564:82.76666666666667 565:82.76666666666667 566:82.76666666666667 567:82.76666666666667 568:81.76666666666667 569:81.76666666666667 570:81.76666666666667 571:81.76666666666667 572:79.76666666666667 573:79.76666666666667 574:79.76666666666667 575:79.83333333333333 576:76.43333333333334 577:76.36666666666666 578:76.36666666666666 579:76.36666666666666 580:73.66666666666667 581:73.66666666666667 582:73.66666666666667 583:73.73333333333333 584:77 585:77 586:77 587:77 588:78.5 589:78.5 590:78.5 591:78.5 592:78.8 593:78.59999999999999 594:78.59999999999999 595:78.53333333333333 596:78.40000000000001 597:78.40000000000001 598:78.40000000000001 599:78.40000000000001 600:90.63333333333334 601:90.63333333333334 602:90.63333333333334 603:90.63333333333334 604:91.40000000000001 605:91.46666666666667 606:91.46666666666667 607:91.46666666666667 608:87.06666666666666 609:88.06666666666666 610:89.86666666666666 611:90.91666666666667 612:90.33333333333333 613:90.26666666666667 614:90.26666666666667 615:90.26666666666667 616:90.26666666666667 617:90.26666666666667 618:90.26666666666667 619:90.26666666666667 620:88.06666666666666 621:86.86666666666666 622:85.26666666666667 623:84.06666666666666 624:86.61666666666666 625:87.21666666666667 626:88.01666666666667 627:88.66666666666667 628:84.66666666666667 629:84.66666666666667 630:84.66666666666667 631:84.66666666666667 632:92.36666666666666 633:92.36666666666666 634:92.36666666666666 635:92.3 636:92.08333333333333 637:90.34999999999999 638:87.84999999999999 639:86.05 640:88.03333333333333 641:88.43333333333334 642:88.25 643:88.73333333333333 644:89.06666666666666 645:90.68333333333334 646:92.08333333333333 647:93.33333333333333 648:89.81666666666666 649:91.61666666666666 650:94.11666666666666 651:95.96666666666667 652:97.8 653:97.8 654:97.8 655:97.8 656:92.40000000000001 657:92.40000000000001 658:92.40000000000001 659:92.33333333333333 660:96.8 661:96.73333333333333 662:96.73333333333333 663:96.53333333333333 664:95.66666666666667 665:95.66666666666667 666:95.53333333333333 667:95.53333333333333 668:92.83333333333333 669:92.83333333333333 670:92.83333333333333 671:92.83333333333333 672:84.46666666666667 673:84.46666666666667 674:84.46666666666667 675:84.53333333333333 676:88.43333333333334 677:88.5 678:88.5 679:88.5 680:89.90000000000001 681:89.90000000000001 682:89.90000000000001 683:89.90000000000001 684:87.09999999999999 685:87.09999999999999 686:87.09999999999999 687:87.09999999999999 688:88.8 689:88.8 690:88.8 691:88.8 692:88.8 693:88.8 694:88.8 695:88.8 696:83.5 697:83.5 698:83.5 699:83.5 700:85.2 701:85.2 702:85.2 703:85.26666666666667 704:84.06666666666666 705:84.06666666666666 706:84.06666666666666 707:84.06666666666666 708:86.76666666666667 709:87.76666666666667 710:88.96666666666667 711:89.65000000000001 712:90.83333333333333 713:90.90000000000001 714:90.90000000000001 715:90.7 716:84.2 717:84.2 718:84.2 719:84.26666666666667 720:80.86666666666666 721:82.01666666666667 722:83.66666666666667 723:84.81666666666666 724:84.76666666666667 725:84.16666666666667 726:83.26666666666667 727:82.66666666666667 728:84.06666666666666 729:84.13333333333334 730:84.13333333333334 731:84.13333333333334 732:87.40000000000001 733:87.33333333333333 734:87.33333333333333 735:87.26666666666667 736:87.93333333333334 737:87.8 738:87.8 739:87.8 740:86.2 741:86.2 742:85.73333333333333 743:86.18333333333334 744:85.84999999999999 745:85.03333333333333 746:82.78333333333333 747:81.40000000000001 748:88.86666666666666 749:89.01666666666667 750:89.06666666666666 751:88.96666666666667 752:91.26666666666667 753:91.33333333333333 754:91.33333333333333 755:91.33333333333333 756:89.09999999999999 757:88.76666666666667 758:88.43333333333334 759:88.06666666666666 760:95.11666666666666 761:94.55 762:94.34999999999999 763:94.33333333333333 764:92.38333333333334 765:96.16666666666667 766:101.2333333333333 767:104.9833333333333 768:106.3666666666667 769:106.5666666666667 770:106.6333333333333 771:106.5666666666667 772:105.25 773:105.3833333333333 774:105.5 775:105.8 776:96.76666666666667 777:97.23333333333333 778:97.23333333333333 779:97.3 780:96.83333333333333 781:96.83333333333333 782:96.83333333333333 783:96.90000000000001 784:101.1 785:101.1 786:101.1 787:101.1 788:93.90000000000001 789:93.90000000000001 790:93.90000000000001 791:93.90000000000001 792:93.7 793:93.7 794:93.7 795:93.7 796:86.3 797:86.25 798:86.34999999999999 799:86.3 +1 0:190.15 1:186.65 2:191.5666666666667 3:188.05 4:185.2 5:185.2 6:185.2 7:185.3 8:191.05 9:191.1333333333333 10:191.1333333333333 11:191.1333333333333 12:191.8333333333333 13:191.8333333333333 14:191.8333333333333 15:191.7333333333333 16:190.55 17:190.1833333333333 18:190.0833333333333 19:190.0666666666667 20:190.3666666666667 21:190.3666666666667 22:190.5 23:190.8166666666667 24:191.85 25:191.9333333333333 26:191.9333333333333 27:191.9333333333333 28:186.5333333333333 29:186.5333333333333 30:186.5333333333333 31:186.5333333333333 32:188.4833333333333 33:188.9833333333333 34:189.5833333333333 35:190.0833333333333 36:193.7333333333333 37:195.2666666666667 38:192.9833333333333 39:193.2333333333333 40:194.1 41:194.2333333333333 42:194.2333333333333 43:194.2333333333333 44:194.2333333333333 45:194.2333333333333 46:194.2333333333333 47:194.2833333333333 48:196.0833333333333 49:195.1833333333333 50:197.8333333333333 51:196.7833333333333 52:196.7833333333333 53:196.7833333333333 54:196.7833333333333 55:196.8333333333333 56:196.3833333333333 57:196.3666666666667 58:196.3666666666667 59:196.3666666666667 60:197.2666666666667 61:197.2666666666667 62:197.2666666666667 63:197.3833333333333 64:194.45 65:194.6 66:194.6 67:194.6 68:195.5 69:195.5 70:195.5 71:195.4833333333333 72:196.5166666666667 73:196.5166666666667 74:196.5166666666667 75:196.5166666666667 76:196.4166666666667 77:196.4166666666667 78:196.4166666666667 79:196.4 80:196.05 81:196.0166666666667 82:196.0166666666667 83:196.0166666666667 84:196.0166666666667 85:196.0166666666667 86:196.0166666666667 87:196.0833333333333 88:196.3333333333333 89:196.3833333333333 90:196.3166666666667 91:196.3166666666667 92:196.4166666666667 93:196.5166666666667 94:196.5333333333333 95:196.55 96:196.5 97:196.2 98:195.65 99:195.4 100:116.5 101:109.05 102:119.5 103:112 104:116.2 105:116.2 106:116.2 107:116.0666666666667 108:114.6333333333333 109:114.45 110:114.45 111:114.45 112:122.45 113:122.45 114:122.45 115:122.4333333333333 116:120.25 117:120.0666666666667 118:119.9666666666667 119:119.9666666666667 120:118.3666666666667 121:118.4 122:118.4 123:118.7 124:117.1333333333333 125:117.0666666666667 126:117.0666666666667 127:117.0666666666667 128:112.6666666666667 129:112.6666666666667 130:112.6666666666667 131:112.6666666666667 132:108.4 133:111.6666666666667 134:116.0166666666667 135:119.0833333333333 136:117.5333333333333 137:143.2333333333333 138:110.95 139:118.15 140:118.8 141:118.8333333333333 142:118.9 143:118.7666666666667 144:118.3 145:118.3 146:118.4333333333333 147:118.4333333333333 148:124.15 149:117.2166666666667 150:135.7166666666667 151:129.1166666666667 152:117.7666666666667 153:117.7666666666667 154:117.7666666666667 155:117.65 156:119.0166666666667 157:118.9166666666667 158:118.9166666666667 159:118.9166666666667 160:115.8166666666667 161:115.8166666666667 162:115.8166666666667 163:116 164:119.5 165:119.8 166:119.8 167:119.8 168:124.6 169:124.6 170:124.6 171:124.5666666666667 172:120.4833333333333 173:120.4333333333333 174:120.4333333333333 175:120.4333333333333 176:120.6333333333333 177:120.6333333333333 178:120.6333333333333 179:120.6333333333333 180:121.0333333333333 181:121.0333333333333 182:121.0333333333333 183:121.0333333333333 184:121.0333333333333 185:121.0333333333333 186:121.0333333333333 187:120.9 188:119.65 189:119.65 190:119.6333333333333 191:119.6333333333333 192:120.1333333333333 193:120.1666666666667 194:120.1666666666667 195:119.85 196:118.2833333333333 197:122.1 198:128.2 199:132.5 200:94.13333333333334 201:94.03333333333333 202:94.18333333333334 203:94.03333333333333 204:95.13333333333334 205:95.13333333333334 206:95.13333333333334 207:95.08333333333333 208:94.88333333333334 209:94.83333333333333 210:94.83333333333333 211:94.83333333333333 212:91.83333333333333 213:91.83333333333333 214:91.83333333333333 215:92.15000000000001 216:96.68333333333334 217:97.11666666666666 218:97.11666666666666 219:97.11666666666666 220:98.11666666666666 221:98.11666666666666 222:98.11666666666666 223:97.90000000000001 224:96.40000000000001 225:96.16666666666667 226:96.16666666666667 227:96.16666666666667 228:100.6666666666667 229:100.6666666666667 230:100.6666666666667 231:100.8 232:98.11666666666666 233:104.65 234:106.0833333333333 235:101.1 236:110.1833333333333 237:142.9333333333333 238:118.0666666666667 239:123.7333333333333 240:114.6333333333333 241:114.35 242:102.45 243:94.90000000000001 244:96.96666666666667 245:97.76666666666667 246:98.46666666666667 247:98.59999999999999 248:97.56666666666666 249:97.43333333333334 250:97.58333333333333 251:97.53333333333333 252:99.13333333333334 253:99.13333333333334 254:99.13333333333334 255:99.18333333333334 256:99.3 257:99.40000000000001 258:99.40000000000001 259:99.40000000000001 260:99.40000000000001 261:99.40000000000001 262:99.40000000000001 263:99.55 264:100.95 265:101.1 266:101.1 267:101.1 268:101.4 269:101.4 270:101.4 271:101.3833333333333 272:100.3 273:100.3 274:100.3 275:100.3 276:99.7 277:99.7 278:99.7 279:99.7 280:99.73333333333333 281:99.76666666666667 282:99.76666666666667 283:99.76666666666667 284:99.76666666666667 285:99.76666666666667 286:99.76666666666667 287:99.76666666666667 288:100.65 289:100.6333333333333 290:100.6333333333333 291:100.6333333333333 292:100.2333333333333 293:100.2333333333333 294:100.2333333333333 295:100.1833333333333 296:101.3666666666667 297:101.5 298:101.55 299:101.5 300:94.06666666666666 301:94.06666666666666 302:94.06666666666666 303:94.06666666666666 304:94.46666666666667 305:94.46666666666667 306:94.46666666666667 307:94.13333333333334 308:93.43333333333334 309:93.31666666666666 310:93.31666666666666 311:93.31666666666666 312:95.71666666666667 313:95.71666666666667 314:95.71666666666667 315:95.71666666666667 316:98.13333333333334 317:98.13333333333334 318:98.13333333333334 319:98.13333333333334 320:98.73333333333333 321:98.73333333333333 322:98.73333333333333 323:98.75 324:98.8 325:98.8 326:98.73333333333333 327:98.73333333333333 328:102.4 329:102.4 330:102.4 331:102.5 332:109.4666666666667 333:114.3333333333333 334:117.8666666666667 335:152.2333333333333 336:151.2333333333333 337:154.45 338:149.4666666666667 339:139.5833333333333 340:135.4833333333333 341:126.7166666666667 342:117.7166666666667 343:105.55 344:110.35 345:114.5333333333333 346:105.0166666666667 347:104.7166666666667 348:103.5833333333333 349:103.35 350:103.35 351:103.2 352:103.05 353:102.9833333333333 354:102.9833333333333 355:102.9166666666667 356:103.0833333333333 357:103.1 358:103.1 359:103.1 360:100.6 361:100.6 362:100.6 363:100.6833333333333 364:100.4 365:100.4 366:100.4 367:100.4 368:101.4 369:101.4 370:101.4 371:101.5333333333333 372:102.85 373:102.9166666666667 374:102.9166666666667 375:102.9166666666667 376:102.4166666666667 377:102.4166666666667 378:102.4166666666667 379:102.4833333333333 380:100.95 381:100.9666666666667 382:100.9666666666667 383:100.9666666666667 384:100.3666666666667 385:100.3666666666667 386:100.3666666666667 387:100.3666666666667 388:101.9666666666667 389:101.9666666666667 390:101.9666666666667 391:101.9666666666667 392:100.9666666666667 393:100.9666666666667 394:100.9666666666667 395:100.9666666666667 396:103.0333333333333 397:103.0333333333333 398:103.0333333333333 399:103.0333333333333 400:99.26666666666667 401:99.26666666666667 402:99.26666666666667 403:99.26666666666667 404:99.46666666666667 405:99.46666666666667 406:99.46666666666667 407:99.46666666666667 408:100.5166666666667 409:100.5166666666667 410:100.5166666666667 411:100.5166666666667 412:102.6166666666667 413:102.6166666666667 414:102.6166666666667 415:102.5166666666667 416:102.1666666666667 417:102.0333333333333 418:102.0333333333333 419:102.0333333333333 420:101.9333333333333 421:101.9333333333333 422:101.9333333333333 423:101.75 424:102.5 425:102.4333333333333 426:102.4333333333333 427:102.4333333333333 428:100.2333333333333 429:100.1666666666667 430:100.1666666666667 431:99.86666666666666 432:105.3 433:94.38333333333334 434:106.55 435:141.8333333333333 436:155.9 437:186.7 438:165.2666666666667 439:151.5166666666667 440:136.6666666666667 441:137.4 442:146.5333333333333 443:158.0333333333333 444:146.4333333333333 445:155.3666666666667 446:153.95 447:132.1166666666667 448:109.5833333333333 449:123.0833333333333 450:123.2333333333333 451:109.05 452:109.8 453:110.0166666666667 454:112.8 455:111.75 456:107.2 457:105.7166666666667 458:104.4666666666667 459:104.2666666666667 460:110.8666666666667 461:110.7666666666667 462:110.7333333333333 463:110.6833333333333 464:104.6666666666667 465:104.8833333333333 466:104.7333333333333 467:106.4333333333333 468:106.8333333333333 469:109.7333333333333 470:107.4333333333333 471:110.2166666666667 472:109.3333333333333 473:109.9666666666667 474:105.05 475:114.9333333333333 476:107.1666666666667 477:103.0166666666667 478:101.9833333333333 479:105.1666666666667 480:105.75 481:105.8333333333333 482:105.8333333333333 483:105.8333333333333 484:103.7333333333333 485:103.7333333333333 486:103.7333333333333 487:103.7333333333333 488:106.0666666666667 489:106.0666666666667 490:106.0666666666667 491:106.0666666666667 492:106.3666666666667 493:106.3666666666667 494:106.3666666666667 495:106.3666666666667 496:104.6333333333333 497:104.6333333333333 498:104.6333333333333 499:104.6333333333333 500:98.46666666666667 501:98.46666666666667 502:98.46666666666667 503:98.46666666666667 504:99.86666666666666 505:99.86666666666666 506:99.86666666666666 507:99.98333333333333 508:103.9333333333333 509:104.1666666666667 510:104.1666666666667 511:104.1666666666667 512:103.0666666666667 513:103.0666666666667 514:103.0666666666667 515:102.85 516:101.1333333333333 517:100.9166666666667 518:100.9166666666667 519:100.9166666666667 520:98.91666666666667 521:98.91666666666667 522:98.91666666666667 523:99 524:99.05 525:99.31666666666666 526:99.34999999999999 527:99.38333333333334 528:102.0166666666667 529:101.7666666666667 530:101.6166666666667 531:101 532:101.3833333333333 533:148.0166666666667 534:180.9166666666667 535:160.55 536:189.7166666666667 537:231.2166666666667 538:240.15 539:204.9333333333333 540:222.6833333333333 541:216.15 542:198.1 543:203.3833333333333 544:195.45 545:232.65 546:212.4 547:197.0166666666667 548:186.6666666666667 549:172.1666666666667 550:145.2666666666667 551:190.15 552:196.1833333333333 553:165.8333333333333 554:158.3 555:145.5833333333333 556:146.3166666666667 557:159.7 558:161.0333333333333 559:149.6666666666667 560:151.95 561:157.6333333333333 562:164.7833333333333 563:168.2833333333333 564:177.8166666666667 565:181.1166666666667 566:186.05 567:186.6666666666667 568:173.7 569:167.3166666666667 570:167.8666666666667 571:158.7833333333333 572:152.2166666666667 573:146.9333333333333 574:164.0833333333333 575:146.3166666666667 576:115.5166666666667 577:105.35 578:100.6833333333333 579:106.3333333333333 580:99.01666666666667 581:99 582:99 583:99 584:99.3 585:99.3 586:99.3 587:99.3 588:100.2333333333333 589:100.2333333333333 590:100.2333333333333 591:100.2333333333333 592:104.2333333333333 593:104.2333333333333 594:104.2333333333333 595:104.2333333333333 596:103.65 597:103.6333333333333 598:103.6333333333333 599:103.6333333333333 600:102.2666666666667 601:102.1 602:102.0833333333333 603:102.0833333333333 604:99.28333333333333 605:105.9666666666667 606:107.4666666666667 607:103.2 608:101.3833333333333 609:99.91666666666667 610:97.83333333333333 611:96.08333333333333 612:96.18333333333334 613:98.26666666666667 614:101.6 615:103.9333333333333 616:103.75 617:100.3166666666667 618:97.7 619:97.63333333333334 620:105.0666666666667 621:105.2 622:105.0666666666667 623:104.8333333333333 624:127.3666666666667 625:125.1333333333333 626:130.3 627:138.8166666666667 628:141.1333333333333 629:140.9166666666667 630:140.25 631:138.95 632:171.1 633:216 634:223.9833333333333 635:222.7666666666667 636:186.6833333333333 637:200.8166666666667 638:240.4833333333333 639:243.85 640:236.1833333333333 641:197 642:193.25 643:203.1 644:205.0833333333333 645:237.3833333333333 646:220.5333333333333 647:216.5333333333333 648:212.4166666666667 649:222.5333333333333 650:225.1833333333333 651:234.6333333333333 652:240.1166666666667 653:242.0333333333333 654:243.5666666666667 655:243.45 656:231.6166666666667 657:231.9166666666667 658:230.4833333333333 659:229.15 660:217.3666666666667 661:212.2833333333333 662:206.5333333333333 663:202.85 664:194.5 665:190.15 666:182.2666666666667 667:176.0666666666667 668:172.1833333333333 669:165.1333333333333 670:154.7833333333333 671:146.4333333333333 672:131.2833333333333 673:119.5833333333333 674:116.95 675:100.3666666666667 676:94.48333333333333 677:95.48333333333333 678:95.88333333333334 679:96.78333333333333 680:93.71666666666667 681:93.5 682:93.5 683:93.5 684:99.8 685:99.8 686:99.8 687:99.8 688:97.93333333333334 689:97.93333333333334 690:97.93333333333334 691:97.93333333333334 692:96.63333333333334 693:96.63333333333334 694:96.63333333333334 695:96.63333333333334 696:101.8333333333333 697:101.8333333333333 698:101.8333333333333 699:101.8333333333333 700:214.7 701:214.5833333333333 702:214.55 703:214.75 704:209.35 705:207.05 706:210.8333333333333 707:218.0166666666667 708:206.3 709:199.5333333333333 710:189.6333333333333 711:182.4166666666667 712:186.1666666666667 713:188.55 714:191.4666666666667 715:193.15 716:202.3 717:188.2 718:179.8666666666667 719:181.6666666666667 720:169.7666666666667 721:166.5166666666667 722:162.25 723:158.7333333333333 724:205.7166666666667 725:229.1 726:243.1166666666667 727:242.6 728:237.75 729:239.0833333333333 730:240.8333333333333 731:242.2333333333333 732:241.1333333333333 733:240.35 734:238.2166666666667 735:237.0333333333333 736:238.9166666666667 737:239.4833333333333 738:239.9166666666667 739:239.3833333333333 740:234.3166666666667 741:231.4333333333333 742:226.2833333333333 743:221.5666666666667 744:209.8666666666667 745:206.8666666666667 746:201.4333333333333 747:196.4333333333333 748:188.9666666666667 749:189.9166666666667 750:190.2 751:189.2833333333333 752:192.7666666666667 753:191.75 754:191.3333333333333 755:192.3166666666667 756:175.5833333333333 757:182.1333333333333 758:174.95 759:159.7 760:159.7833333333333 761:163.5166666666667 762:164.6 763:162.7666666666667 764:162.7833333333333 765:164.35 766:166.6166666666667 767:167.45 768:162.0833333333333 769:162.2 770:162.2 771:162.5166666666667 772:148.4333333333333 773:147.9166666666667 774:144.7333333333333 775:127.4166666666667 776:101.4333333333333 777:101.7666666666667 778:101.85 779:102 780:98.26666666666667 781:98.3 782:98.3 783:98.3 784:100.6 785:100.6 786:100.6 787:100.6 788:103.4333333333333 789:103.4333333333333 790:103.4333333333333 791:103.4333333333333 792:105.0333333333333 793:105.0333333333333 794:105.0333333333333 795:105.0333333333333 796:107.0666666666667 797:107.0666666666667 798:107.0666666666667 799:107.0666666666667 +0 0:90.13333333333334 1:90.13333333333334 2:90.13333333333334 3:90.13333333333334 4:78.73333333333333 5:77.28333333333333 6:74.98333333333333 7:73.63333333333334 8:80.53333333333333 9:80.53333333333333 10:80.53333333333333 11:80.53333333333333 12:84.13333333333334 13:84.13333333333334 14:84.13333333333334 15:84.13333333333334 16:76.38333333333334 17:78.58333333333333 18:81.98333333333333 19:84.13333333333334 20:82.03333333333333 21:82.03333333333333 22:82.03333333333333 23:82.03333333333333 24:78.98333333333333 25:72.03333333333333 26:72.03333333333333 27:78.98333333333333 28:77.53333333333333 29:77.53333333333333 30:77.53333333333333 31:77.53333333333333 32:80.08333333333333 33:80.13333333333334 34:80.13333333333334 35:80.23333333333333 36:77.53333333333333 37:79.88333333333334 38:83.03333333333333 39:85.33333333333333 40:76.03333333333333 41:76.03333333333333 42:76.03333333333333 43:76.03333333333333 44:79.33333333333333 45:79.33333333333333 46:79.33333333333333 47:79.33333333333333 48:78.53333333333333 49:78.53333333333333 50:78.53333333333333 51:78.53333333333333 52:78.63333333333334 53:78.63333333333334 54:78.63333333333334 55:78.63333333333334 56:77.93333333333334 57:77.93333333333334 58:77.93333333333334 59:77.93333333333334 60:85.13333333333334 61:85.13333333333334 62:85.13333333333334 63:85.13333333333334 64:82.83333333333333 65:82.83333333333333 66:82.76666666666667 67:82.7 68:81 69:80.93333333333334 70:80.86666666666666 71:80.86666666666666 72:79.75 73:78.3 74:76.09999999999999 75:74.5 76:83.65000000000001 77:83.59999999999999 78:83.59999999999999 79:83.5 80:90.59999999999999 81:90.59999999999999 82:90.59999999999999 83:90.59999999999999 84:86.25 85:88.40000000000001 86:91.55 87:93.90000000000001 88:94.09999999999999 89:94.09999999999999 90:94.09999999999999 91:94.09999999999999 92:94.40000000000001 93:94.8 94:95.15000000000001 95:95.5 96:88.59999999999999 97:90.3 98:92.45 99:94.05 100:81.23333333333333 101:81.23333333333333 102:81.23333333333333 103:81.23333333333333 104:80.98333333333333 105:80.88333333333334 106:80.83333333333333 107:80.98333333333333 108:82.13333333333334 109:82.13333333333334 110:82.13333333333334 111:82.13333333333334 112:85.18333333333334 113:86.58333333333333 114:88.73333333333333 115:90.23333333333333 116:87.28333333333333 117:87.38333333333334 118:88.28333333333333 119:88.48333333333333 120:91.68333333333334 121:91.73333333333333 122:91.73333333333333 123:91.73333333333333 124:81.03333333333333 125:81.03333333333333 126:80.98333333333333 127:81.03333333333333 128:82.23333333333333 129:82.23333333333333 130:82.23333333333333 131:82.23333333333333 132:82.33333333333333 133:79.28333333333333 134:74.53333333333333 135:71.43333333333334 136:72.53333333333333 137:73.93333333333334 138:75.63333333333334 139:76.98333333333333 140:76.23333333333333 141:76.23333333333333 142:76.23333333333333 143:76.23333333333333 144:72.13333333333334 145:72.13333333333334 146:72.13333333333334 147:72.13333333333334 148:75.53333333333333 149:75.53333333333333 150:75.58333333333333 151:75.58333333333333 152:79.13333333333334 153:79.08333333333333 154:78.98333333333333 155:78.98333333333333 156:69.43333333333334 157:69.43333333333334 158:69.43333333333334 159:69.43333333333334 160:73.63333333333334 161:73.63333333333334 162:73.63333333333334 163:73.63333333333334 164:75.43333333333334 165:75.23333333333333 166:75.23333333333333 167:74.96666666666667 168:76.7 169:76.7 170:76.7 171:76.7 172:78.3 173:78.3 174:78.3 175:78.3 176:80.5 177:83.55 178:88.2 179:91.09999999999999 180:96.2 181:96.2 182:96.2 183:96.2 184:96.34999999999999 185:96.40000000000001 186:96.3 187:96.25 188:95.7 189:95.7 190:95.7 191:95.7 192:90.65000000000001 193:90.25 194:89.8 195:89.40000000000001 196:93.8 197:92.3 198:90.09999999999999 199:88.5 200:85.33333333333333 201:85.33333333333333 202:85.33333333333333 203:85.33333333333333 204:83.48333333333333 205:83.73333333333333 206:83.83333333333333 207:83.73333333333333 208:90.13333333333334 209:90.13333333333334 210:90.13333333333334 211:90.13333333333334 212:87.73333333333333 213:82.88333333333334 214:75.73333333333333 215:70.48333333333333 216:62.73333333333333 217:68.58333333333333 218:76.88333333333334 219:83.08333333333333 220:79.08333333333333 221:75.68333333333334 222:70.58333333333333 223:67.08333333333333 224:68.73333333333333 225:72.23333333333333 226:77.18333333333334 227:80.78333333333333 228:83.83333333333333 229:83.03333333333333 230:81.63333333333334 231:80.78333333333333 232:74.13333333333334 233:73.98333333333333 234:73.18333333333334 235:72.88333333333334 236:74.53333333333333 237:74.53333333333333 238:74.53333333333333 239:74.53333333333333 240:78.43333333333334 241:78.43333333333334 242:78.43333333333334 243:78.43333333333334 244:72.43333333333334 245:72.43333333333334 246:72.43333333333334 247:72.43333333333334 248:70.08333333333333 249:69.98333333333333 250:70.03333333333333 251:70.03333333333333 252:65.48333333333333 253:68.93333333333334 254:74.18333333333334 255:77.73333333333333 256:79.13333333333334 257:79.13333333333334 258:79.13333333333334 259:79.13333333333334 260:70.76666666666667 261:70.83333333333333 262:70.83333333333333 263:70.83333333333333 264:76.36666666666666 265:76.36666666666666 266:76.3 267:76.16666666666667 268:74.83333333333333 269:74.76666666666667 270:74.76666666666667 271:74.7 272:77.36666666666666 273:77.36666666666666 274:77.36666666666666 275:77.36666666666666 276:77.91666666666667 277:75.46666666666667 278:71.41666666666667 279:68.81666666666666 280:66.16666666666667 281:66.16666666666667 282:66.16666666666667 283:66.16666666666667 284:79.16666666666667 285:82.61666666666666 286:88.06666666666666 287:91.46666666666667 288:94.76666666666667 289:94.76666666666667 290:94.76666666666667 291:94.76666666666667 292:92.66666666666667 293:91.71666666666667 294:90.66666666666667 295:89.86666666666666 296:100.2166666666667 297:96.41666666666667 298:91.21666666666667 299:87.71666666666667 300:95.66666666666667 301:95.66666666666667 302:95.66666666666667 303:95.66666666666667 304:99.26666666666667 305:98.01666666666667 306:96.11666666666666 307:94.81666666666666 308:91.01666666666667 309:92.31666666666666 310:94.21666666666667 311:95.51666666666667 312:86.76666666666667 313:88.21666666666667 314:90.06666666666666 315:91.26666666666667 316:86.21666666666667 317:87.46666666666667 318:89.11666666666666 319:90.31666666666666 320:86.66666666666667 321:86.61666666666666 322:86.56666666666666 323:86.56666666666666 324:84.36666666666666 325:84.31666666666666 326:84.36666666666666 327:84.36666666666666 328:80.86666666666666 329:81.66666666666667 330:82.66666666666667 331:83.56666666666666 332:76.96666666666667 333:76.96666666666667 334:76.96666666666667 335:76.96666666666667 336:77.46666666666667 337:77.46666666666667 338:77.46666666666667 339:77.46666666666667 340:73.26666666666667 341:73.26666666666667 342:73.26666666666667 343:73.26666666666667 344:75.36666666666666 345:75.36666666666666 346:75.36666666666666 347:75.36666666666666 348:79.36666666666666 349:79.31666666666666 350:79.26666666666667 351:79.26666666666667 352:82.56666666666666 353:82.46666666666667 354:82.46666666666667 355:82.46666666666667 356:79.76666666666667 357:79.76666666666667 358:79.76666666666667 359:79.76666666666667 360:81.73333333333333 361:81.73333333333333 362:81.73333333333333 363:81.73333333333333 364:84.76666666666667 365:84.76666666666667 366:84.7 367:84.63333333333334 368:81.93333333333334 369:81.93333333333334 370:81.93333333333334 371:81.93333333333334 372:78.33333333333333 373:78.33333333333333 374:78.33333333333333 375:78.33333333333333 376:69.38333333333334 377:70.73333333333333 378:72.73333333333333 379:74.13333333333334 380:64.78333333333333 381:67.63333333333334 382:71.63333333333334 383:74.48333333333333 384:81.18333333333334 385:81.08333333333333 386:81.18333333333334 387:81.13333333333334 388:71.43333333333334 389:71.43333333333334 390:71.43333333333334 391:71.43333333333334 392:75.13333333333334 393:75.83333333333333 394:76.98333333333333 395:77.78333333333333 396:78.33333333333333 397:79.08333333333333 398:80.28333333333333 399:81.28333333333333 400:73.71666666666667 401:72.11666666666666 402:70.01666666666667 403:68.46666666666667 404:69.66666666666667 405:67.46666666666667 406:64.21666666666667 407:62.01666666666667 408:61.91666666666666 409:64.31666666666666 410:67.51666666666667 411:69.66666666666667 412:75.41666666666667 413:81.41666666666667 414:89.86666666666666 415:95.76666666666667 416:91.56666666666666 417:89.21666666666667 418:86.06666666666666 419:83.61666666666666 420:80.46666666666667 421:78.36666666666666 422:74.96666666666667 423:72.76666666666667 424:77.91666666666667 425:77.16666666666667 426:76.06666666666666 427:75.26666666666667 428:77.56666666666666 429:75.26666666666667 430:72.06666666666666 431:69.71666666666667 432:73.56666666666666 433:73.56666666666666 434:73.61666666666666 435:73.66666666666667 436:74.76666666666667 437:74.76666666666667 438:74.76666666666667 439:74.76666666666667 440:74.11666666666666 441:76.51666666666667 442:79.71666666666667 443:81.91666666666667 444:81.76666666666667 445:80.36666666666666 446:78.16666666666667 447:76.61666666666666 448:73.66666666666667 449:73.66666666666667 450:73.66666666666667 451:73.66666666666667 452:68.86666666666666 453:68.86666666666666 454:68.86666666666666 455:68.86666666666666 456:73.56666666666666 457:73.56666666666666 458:73.56666666666666 459:73.56666666666666 460:73.53333333333333 461:73.53333333333333 462:73.53333333333333 463:73.53333333333333 464:78.58333333333333 465:78.53333333333333 466:78.53333333333333 467:78.53333333333333 468:80.33333333333333 469:80.33333333333333 470:80.33333333333333 471:80.33333333333333 472:78.73333333333333 473:78.73333333333333 474:78.73333333333333 475:78.73333333333333 476:78.73333333333333 477:76.63333333333334 478:73.93333333333334 479:72.08333333333333 480:69.78333333333333 481:74.53333333333333 482:81.28333333333333 483:86.08333333333333 484:92.33333333333333 485:91.48333333333333 486:90.53333333333333 487:89.93333333333334 488:89.43333333333334 489:87.98333333333333 490:85.83333333333333 491:84.33333333333333 492:88.13333333333334 493:88.13333333333334 494:88.13333333333334 495:88.13333333333334 496:90.43333333333334 497:89.53333333333333 498:88.33333333333333 499:87.48333333333333 500:55.61666666666667 501:57.11666666666667 502:59.31666666666667 503:60.86666666666667 504:70.3 505:70.23333333333333 506:70.23333333333333 507:70.23333333333333 508:79.21666666666667 509:78.46666666666667 510:77.61666666666666 511:76.86666666666666 512:76.66666666666667 513:76.51666666666667 514:76.26666666666667 515:76.26666666666667 516:71.43333333333334 517:74.38333333333334 518:79.28333333333333 519:82.25 520:84.76666666666667 521:83.51666666666667 522:81.36666666666666 523:80.36666666666666 524:82.11666666666666 525:82.86666666666666 526:83.96666666666667 527:84.91666666666667 528:93.86666666666666 529:92.61666666666666 530:90.71666666666667 531:89.41666666666667 532:90.21666666666667 533:86.96666666666667 534:82.51666666666667 535:79.36666666666666 536:81.66666666666667 537:81.66666666666667 538:81.66666666666667 539:81.66666666666667 540:78.86666666666666 541:80.21666666666667 542:82.16666666666667 543:83.46666666666667 544:77.81666666666666 545:79.31666666666666 546:81.46666666666667 547:82.91666666666667 548:74.96666666666667 549:74.96666666666667 550:74.96666666666667 551:74.96666666666667 552:78.86666666666666 553:78.86666666666666 554:78.86666666666666 555:78.86666666666666 556:80.51666666666667 557:79.96666666666667 558:79.01666666666667 559:78.36666666666666 560:72.33333333333333 561:72.33333333333333 562:72.33333333333333 563:72.33333333333333 564:73.58333333333333 565:72.78333333333333 566:71.93333333333334 567:71.08333333333333 568:73.43333333333334 569:73.43333333333334 570:73.43333333333334 571:73.43333333333334 572:76.73333333333333 573:76.73333333333333 574:76.73333333333333 575:76.73333333333333 576:80.63333333333334 577:80.63333333333334 578:80.63333333333334 579:80.63333333333334 580:71.83333333333333 581:71.83333333333333 582:71.83333333333333 583:71.83333333333333 584:69.13333333333334 585:69.73333333333333 586:70.88333333333334 587:71.68333333333334 588:71.48333333333333 589:72.93333333333334 590:75.03333333333333 591:76.63333333333334 592:89.53333333333333 593:89.53333333333333 594:89.53333333333333 595:89.53333333333333 596:90.93333333333334 597:90.93333333333334 598:90.93333333333334 599:90.93333333333334 600:57.06666666666667 601:57.06666666666667 602:57.06666666666667 603:57.06666666666667 604:59.93333333333333 605:59.93333333333333 606:59.93333333333333 607:59.93333333333333 608:57.13333333333333 609:57.78333333333333 610:58.78333333333333 611:59.43333333333333 612:55.93333333333333 613:56.43333333333333 614:57.13333333333333 615:57.58333333333334 616:59.38333333333333 617:59.63333333333333 618:60.48333333333333 619:60.63333333333333 620:63.86666666666667 621:63.86666666666667 622:63.86666666666667 623:63.86666666666667 624:64.66666666666667 625:64.31666666666666 626:63.81666666666667 627:63.41666666666666 628:60.36666666666667 629:60.36666666666667 630:60.36666666666667 631:60.36666666666667 632:55.26666666666667 633:58.46666666666667 634:62.81666666666667 635:66.01666666666667 636:66.16666666666667 637:66.16666666666667 638:66.16666666666667 639:66.16666666666667 640:72.26666666666667 641:72.26666666666667 642:72.26666666666667 643:72.26666666666667 644:71.31666666666666 645:70.71666666666667 646:70.11666666666666 647:69.71666666666667 648:68.66666666666667 649:68.66666666666667 650:68.66666666666667 651:68.66666666666667 652:60.96666666666667 653:60.96666666666667 654:60.96666666666667 655:60.96666666666667 656:61.46666666666667 657:62.16666666666666 658:63.06666666666667 659:63.66666666666666 660:69.23333333333333 661:69.23333333333333 662:69.23333333333333 663:69.23333333333333 664:65.55 665:66.3 666:67.25 667:67.90000000000001 668:69.3 669:69.3 670:69.3 671:69.3 672:74.84999999999999 673:75.75 674:77 675:77.90000000000001 676:75.55 677:75.15000000000001 678:74.45 679:74.09999999999999 680:79.3 681:79.3 682:79.3 683:79.3 684:76.75 685:76.8 686:76.84999999999999 687:76.84999999999999 688:80.40000000000001 689:83.90000000000001 690:89.05 691:92.75 692:91.3 693:91.3 694:91.3 695:91.3 696:89.7 697:89.2 698:88.15000000000001 699:87.5 700:62.9 701:62.9 702:62.9 703:62.83333333333334 704:64.73333333333333 705:64.73333333333333 706:64.73333333333333 707:64.73333333333333 708:62.33333333333334 709:62.33333333333334 710:62.33333333333334 711:62.33333333333334 712:60.28333333333333 713:63.33333333333334 714:68.13333333333334 715:70.93333333333334 716:74.43333333333334 717:74.43333333333334 718:74.43333333333334 719:74.43333333333334 720:79.16666666666667 721:79.16666666666667 722:79.16666666666667 723:79.16666666666667 724:83.71666666666667 725:82.11666666666666 726:79.41666666666667 727:77.61666666666666 728:72.06666666666666 729:72.06666666666666 730:72.06666666666666 731:72.06666666666666 732:70.46666666666667 733:70.46666666666667 734:70.46666666666667 735:70.36666666666666 736:76.76666666666667 737:76.76666666666667 738:76.76666666666667 739:76.76666666666667 740:81.16666666666667 741:81.16666666666667 742:81.16666666666667 743:81.16666666666667 744:83.61666666666666 745:80.36666666666666 746:75.86666666666666 747:72.71666666666667 748:70.36666666666666 749:70.36666666666666 750:70.36666666666666 751:70.36666666666666 752:66.66666666666667 753:66.66666666666667 754:66.66666666666667 755:66.66666666666667 756:67.61666666666666 757:66.36666666666666 758:64.46666666666667 759:63.06666666666667 760:73.06666666666666 761:71.90000000000001 762:70.40000000000001 763:69.40000000000001 764:72.56666666666666 765:72.56666666666666 766:72.56666666666666 767:72.56666666666666 768:64.66666666666667 769:64.66666666666667 770:64.66666666666667 771:64.66666666666667 772:57.86666666666667 773:57.06666666666667 774:55.71666666666667 775:54.91666666666666 776:56.61666666666667 777:53.71666666666667 778:48.91666666666666 779:45.81666666666667 780:49.66666666666666 781:49.66666666666666 782:49.66666666666666 783:49.66666666666666 784:52.71666666666667 785:52.66666666666666 786:52.66666666666666 787:52.66666666666666 788:59.06666666666667 789:59.06666666666667 790:59.06666666666667 791:59.06666666666667 792:67.66666666666667 793:67.66666666666667 794:67.66666666666667 795:67.66666666666667 796:75.31666666666666 797:76.11666666666666 798:76.96666666666667 799:77.71666666666667 +0 0:84.08333333333333 1:83.98333333333333 2:84.03333333333333 3:84.03333333333333 4:83.68333333333334 5:83.28333333333333 6:82.68333333333334 7:82.2 8:86 9:86 10:86 11:86 12:85.3 13:81.65000000000001 14:76.7 15:73 16:73.59999999999999 17:73.3 18:72.65000000000001 19:72.2 20:80.90000000000001 21:80.90000000000001 22:80.90000000000001 23:80.90000000000001 24:82.3 25:82.3 26:82.3 27:82.3 28:86.09999999999999 29:85.45 30:84.55 31:84 32:79.55 33:78.7 34:77.40000000000001 35:76.55 36:86.59999999999999 37:87.84999999999999 38:90 39:91.40000000000001 40:94.75 41:95.2 42:95.84999999999999 43:96.25 44:95.09999999999999 45:95.09999999999999 46:95.09999999999999 47:95.09999999999999 48:94.26666666666667 49:94.26666666666667 50:94.26666666666667 51:94.26666666666667 52:93.96666666666667 53:94.51666666666667 54:95.41666666666667 55:96.06666666666666 56:92.2 57:92.2 58:92.2 59:92.2 60:82.8 61:82.8 62:82.8 63:82.8 64:90.48333333333333 65:91.46666666666667 66:92.66666666666667 67:93.51666666666667 68:93.63333333333334 69:93.56666666666666 70:93.56666666666666 71:93.56666666666666 72:90.31666666666666 73:86.76666666666667 74:81.61666666666666 75:78.11666666666666 76:80.76666666666667 77:80.76666666666667 78:80.76666666666667 79:80.76666666666667 80:82.11666666666666 81:82.03333333333333 82:82.03333333333333 83:82.03333333333333 84:82.23333333333333 85:83.13333333333334 86:84.33333333333333 87:85.28333333333333 88:86.13333333333334 89:84.78333333333333 90:82.58333333333333 91:81.23333333333333 92:84.83333333333333 93:84.83333333333333 94:84.88333333333334 95:84.83333333333333 96:87.09999999999999 97:87 98:87.05 99:87.15000000000001 100:77.38333333333334 101:77.38333333333334 102:77.33333333333333 103:77.33333333333333 104:83.23333333333333 105:80.08333333333333 106:75.84999999999999 107:72.65000000000001 108:70.3 109:70.59999999999999 110:70.59999999999999 111:70.59999999999999 112:81.25 113:81.25 114:81.3 115:81.3 116:82.15000000000001 117:82.40000000000001 118:83 119:83.3 120:91.75 121:92.75 122:94.15000000000001 123:95.2 124:92.3 125:91.05 126:89.05 127:87.84999999999999 128:84.09999999999999 129:86.25 130:89.40000000000001 131:91.5 132:91.15000000000001 133:92.09999999999999 134:93.15000000000001 135:94.09999999999999 136:95.8 137:94.40000000000001 138:92.2 139:90.75 140:87.7 141:87.7 142:87.7 143:87.7 144:88.09999999999999 145:88.09999999999999 146:88.09999999999999 147:88.09999999999999 148:87.09999999999999 149:87.09999999999999 150:87.09999999999999 151:87.09999999999999 152:89.65000000000001 153:88.95 154:87.95 155:87.3 156:87.5 157:87.5 158:87.5 159:87.5 160:83.05 161:84.5 162:86.59999999999999 163:88.05 164:95.86666666666666 165:95.03333333333333 166:93.83333333333333 167:93.03333333333333 168:94.73333333333333 169:94.73333333333333 170:94.73333333333333 171:94.73333333333333 172:96.58333333333333 173:96.59999999999999 174:96.55 175:96.5 176:94.3 177:94.3 178:94.3 179:94.3 180:91.46666666666667 181:91.36666666666666 182:91.36666666666666 183:91.36666666666666 184:88.86666666666666 185:88.86666666666666 186:88.86666666666666 187:88.76666666666667 188:78.71666666666667 189:80.05 190:82.05 191:83.34999999999999 192:90.84999999999999 193:90.95 194:90.84999999999999 195:90.84999999999999 196:86.59999999999999 197:86.59999999999999 198:86.65000000000001 199:86.59999999999999 200:88.43333333333334 201:88.43333333333334 202:88.43333333333334 203:88.43333333333334 204:86.88333333333334 205:86.88333333333334 206:87.5 207:87.5 208:86.83333333333333 209:87.5 210:87.5 211:87.5 212:92 213:92 214:92 215:92 216:88.90000000000001 217:88.55 218:88 219:87.65000000000001 220:84.95 221:87.65000000000001 222:91.3 223:93.8 224:77.84999999999999 225:75.65000000000001 226:72.34999999999999 227:69.90000000000001 228:68.3 229:67.8 230:66.7 231:66.3 232:60.3 233:60.3 234:60.4 235:60.45 236:67.59999999999999 237:67.59999999999999 238:67.59999999999999 239:67.59999999999999 240:82 241:82 242:82 243:82 244:84.3 245:84.3 246:84.3 247:84.3 248:86 249:86 250:86 251:86 252:88.3 253:86.09999999999999 254:83 255:80.8 256:75.40000000000001 257:75.40000000000001 258:75.40000000000001 259:75.40000000000001 260:79.3 261:76.3 262:72 263:68.84999999999999 264:79.3 265:79.2 266:79.15000000000001 267:79.09999999999999 268:79.90000000000001 269:79.90000000000001 270:79.90000000000001 271:79.90000000000001 272:81.73333333333333 273:81.73333333333333 274:81.73333333333333 275:81.73333333333333 276:79.73333333333333 277:81.88333333333334 278:85.08333333333333 279:87.33333333333333 280:87.01666666666667 281:88.61666666666666 282:90.96666666666667 283:92.46666666666667 284:88.26666666666667 285:88.26666666666667 286:88.26666666666667 287:87.93333333333334 288:82.75 289:84.71666666666667 290:87.96666666666667 291:90.31666666666666 292:91.56666666666666 293:91.56666666666666 294:91.56666666666666 295:91.56666666666666 296:79.23333333333333 297:79.23333333333333 298:79.23333333333333 299:79.23333333333333 300:77.26666666666667 301:77.26666666666667 302:77.26666666666667 303:77.26666666666667 304:71.56666666666666 305:71.56666666666666 306:71.63333333333334 307:71.8 308:75.43333333333334 309:75.63333333333334 310:75.63333333333334 311:75.63333333333334 312:68.08333333333333 313:67.53333333333333 314:66.53333333333333 315:66.05 316:62.7 317:65.90000000000001 318:70.40000000000001 319:73.40000000000001 320:68.55 321:68.59999999999999 322:68.59999999999999 323:68.5 324:73.3 325:73.34999999999999 326:73.40000000000001 327:73.5 328:76.34999999999999 329:75.45 330:74.45 331:73.40000000000001 332:80.90000000000001 333:80.90000000000001 334:80.90000000000001 335:80.90000000000001 336:78.2 337:78.2 338:78.2 339:78.2 340:71.8 341:71.8 342:71.8 343:71.8 344:68.3 345:68.3 346:68.3 347:68.3 348:61.05 349:63.95 350:68.90000000000001 351:71.59999999999999 352:71.45 353:70 354:68.2 355:66.84999999999999 356:67.59999999999999 357:67.59999999999999 358:67.59999999999999 359:67.59999999999999 360:74.09999999999999 361:75.55 362:77.95 363:79.5 364:70 365:71.5 366:73.75 367:75.25 368:77.5 369:77.5 370:77.5 371:77.40000000000001 372:79.21666666666667 373:79.16666666666667 374:79.16666666666667 375:79.16666666666667 376:82.91666666666667 377:84.36666666666666 378:86.21666666666667 379:87.45 380:82.28333333333333 381:80.59999999999999 382:78.34999999999999 383:76.90000000000001 384:79.5 385:79.5 386:79.5 387:79.46666666666667 388:80.71666666666667 389:83.7 390:88.09999999999999 391:91.09999999999999 392:88.5 393:88.5 394:88.5 395:88.5 396:88.63333333333334 397:86.23333333333333 398:82.78333333333333 399:80.33333333333333 400:72.15000000000001 401:71.75 402:71 403:70.59999999999999 404:74.90000000000001 405:74.90000000000001 406:74.90000000000001 407:74.90000000000001 408:79.13333333333334 409:79.16666666666667 410:79.16666666666667 411:79.16666666666667 412:82.71666666666667 413:82.56666666666666 414:82.61666666666666 415:82.45 416:87.53333333333333 417:84.51666666666667 418:79.96666666666667 419:76.76666666666667 420:78.86666666666666 421:78.86666666666666 422:78.86666666666666 423:78.86666666666666 424:82.2 425:81.55 426:80.65000000000001 427:80.09999999999999 428:71.45 429:71.5 430:71.59999999999999 431:71.56666666666666 432:66.45 433:69.88333333333334 434:75.38333333333334 435:78.63333333333334 436:77.78333333333333 437:77.78333333333333 438:77.78333333333333 439:77.83333333333333 440:74.31666666666666 441:74.66666666666667 442:75.41666666666667 443:75.76666666666667 444:77.86666666666666 445:77.86666666666666 446:77.86666666666666 447:77.86666666666666 448:79.5 449:79.90000000000001 450:80.45 451:80.95 452:84.7 453:84.7 454:84.7 455:84.7 456:78.65000000000001 457:78.3 458:77.75 459:77.34999999999999 460:75.5 461:75.5 462:75.5 463:75.5 464:78.06666666666666 465:79.61666666666666 466:82.01666666666667 467:83.71666666666667 468:81.21666666666667 469:81.61666666666666 470:82.31666666666666 471:82.43333333333334 472:82.45 473:82.26666666666667 474:82.26666666666667 475:82.26666666666667 476:80.86666666666666 477:80.86666666666666 478:80.86666666666666 479:80.59999999999999 480:77.21666666666667 481:77.09999999999999 482:77.09999999999999 483:77.09999999999999 484:72.7 485:72.25 486:71.55 487:71.09999999999999 488:69.86666666666666 489:70.51666666666667 490:71.26666666666667 491:72.01666666666667 492:64.66666666666667 493:64.66666666666667 494:64.66666666666667 495:64.66666666666667 496:72.01666666666667 497:70.08333333333333 498:67.33333333333333 499:65.13333333333334 500:74.40000000000001 501:71.5 502:66.59999999999999 503:63.6 504:69.59999999999999 505:69.59999999999999 506:69.59999999999999 507:69.59999999999999 508:75.73333333333333 509:75.73333333333333 510:75.73333333333333 511:75.73333333333333 512:69.18333333333334 513:69.83333333333333 514:70.63333333333334 515:71.28333333333333 516:78.55 517:78.56666666666666 518:78.51666666666667 519:78.56666666666666 520:76.56666666666666 521:76.56666666666666 522:76.56666666666666 523:76.58333333333333 524:67.90000000000001 525:66.90000000000001 526:65.65000000000001 527:64.75 528:67.34999999999999 529:67.25 530:67.3 531:66.86666666666666 532:68.55 533:68.31666666666666 534:68.31666666666666 535:68.16666666666667 536:71.56666666666666 537:71.56666666666666 538:71.56666666666666 539:71.56666666666666 540:72.21666666666667 541:75.11666666666666 542:79.91666666666667 543:82.81666666666666 544:81.16666666666667 545:81.16666666666667 546:81.16666666666667 547:81.18333333333334 548:79.05 549:78.84999999999999 550:78.25 551:78.05 552:80.09999999999999 553:80.09999999999999 554:80.09999999999999 555:80.09999999999999 556:83.7 557:80.45 558:75.90000000000001 559:72.75 560:77.09999999999999 561:77.09999999999999 562:77.09999999999999 563:76.86666666666666 564:76 565:72.71666666666667 566:68.21666666666667 567:65.16666666666667 568:64.21666666666667 569:67.31666666666666 570:71.91666666666667 571:74.84999999999999 572:71.03333333333333 573:70.86666666666666 574:70.86666666666666 575:70.86666666666666 576:65.76666666666667 577:65.76666666666667 578:65.76666666666667 579:65.76666666666667 580:67.7 581:67.7 582:67.7 583:67.7 584:74.15000000000001 585:70.90000000000001 586:66.5 587:63.4 588:66 589:65.84999999999999 590:65.59999999999999 591:65.45 592:65.40000000000001 593:65.40000000000001 594:65.40000000000001 595:65.40000000000001 596:69.40000000000001 597:70.15000000000001 598:71.45 599:72.15000000000001 600:84.3 601:84.25 602:84.25 603:84.2 604:79.2 605:79.2 606:79.2 607:79.2 608:75.23333333333333 609:75.23333333333333 610:75.23333333333333 611:75.23333333333333 612:74.43333333333334 613:74.33333333333333 614:74.18333333333334 615:74.23333333333333 616:73.90000000000001 617:73.90000000000001 618:73.90000000000001 619:73.90000000000001 620:67 621:67 622:67.40000000000001 623:67.40000000000001 624:67.51666666666667 625:69.40000000000001 626:71.7 627:73.09999999999999 628:70.5 629:71.2 630:72.2 631:72.61666666666666 632:71.16666666666667 633:70.83333333333333 634:70.83333333333333 635:70.83333333333333 636:67.98333333333333 637:69.98333333333333 638:73.43333333333334 639:75.38333333333334 640:75.59999999999999 641:73.2 642:70.2 643:67.95 644:70.40000000000001 645:70.40000000000001 646:70.8 647:70.8 648:68.86666666666666 649:69.55 650:70 651:70.3 652:70.7 653:72.25 654:74.5 655:76.05 656:75.40000000000001 657:75.5 658:75.45 659:75.5 660:72.59999999999999 661:72.59999999999999 662:72.59999999999999 663:72.26666666666667 664:73.56666666666666 665:73.40000000000001 666:73.5 667:73.5 668:77.15000000000001 669:77.15000000000001 670:77.09999999999999 671:77 672:75.71666666666667 673:73.45 674:70.34999999999999 675:68.15000000000001 676:69.3 677:72.8 678:77.65000000000001 679:81.09999999999999 680:69.40000000000001 681:69.40000000000001 682:69.40000000000001 683:69.40000000000001 684:77.90000000000001 685:77.90000000000001 686:77.95 687:78 688:77 689:77 690:77 691:77 692:75 693:76.5 694:78.7 695:80.05 696:82.31666666666666 697:82.3 698:82.3 699:82.25 700:57.6 701:57.6 702:57.6 703:57.6 704:55.1 705:55.1 706:55.1 707:55.1 708:55.93333333333333 709:55.93333333333333 710:55.93333333333333 711:55.93333333333333 712:56.23333333333333 713:56.23333333333333 714:56.23333333333333 715:56.23333333333333 716:56.23333333333333 717:56.23333333333333 718:56.23333333333333 719:56.23333333333333 720:59.73333333333333 721:59.73333333333333 722:60.4 723:60.4 724:56.63333333333333 725:57.3 726:57.2 727:57.2 728:57.05 729:60 730:64.05 731:66.66666666666667 732:63.56666666666667 733:63.23333333333333 734:63.23333333333333 735:63.23333333333333 736:65.08333333333333 737:66.48333333333333 738:68.63333333333334 739:69.83333333333333 740:65.93333333333334 741:68.88333333333334 742:73.13333333333334 743:76.43333333333334 744:68.13333333333334 745:68.13333333333334 746:68.8 747:68.8 748:61.78333333333333 749:59.45 750:55.05 751:51.9 752:62.1 753:60.45 754:58.25 755:56.7 756:62.1 757:62.7 758:63.75 759:64.3 760:59.9 761:59.9 762:59.9 763:59.56666666666667 764:59.96666666666667 765:59.8 766:59.8 767:59.8 768:70.8 769:70.8 770:70.8 771:70.8 772:71.98333333333333 773:70.48333333333333 774:68.63333333333334 775:67.33333333333333 776:70.93333333333334 777:74.18333333333334 778:78.88333333333334 779:82.08333333333333 780:83.23333333333333 781:83.23333333333333 782:83.23333333333333 783:83.23333333333333 784:77.33333333333333 785:77.33333333333333 786:77.33333333333333 787:77.33333333333333 788:75.63333333333334 789:75.63333333333334 790:75.63333333333334 791:75.63333333333334 792:74.73333333333333 793:76.38333333333334 794:78.68333333333334 795:80.33333333333333 796:74.5 797:74.5 798:74.5 799:74.5 +0 0:123.3666666666667 1:123.3666666666667 2:123.7666666666667 3:123.5 4:126.5 5:126.1 6:126.4333333333333 7:126.5 8:129.3 9:129.7333333333333 10:129.3666666666667 11:129.1333333333333 12:130.1833333333333 13:130.1 14:129.7666666666667 15:130.1666666666667 16:124.5 17:124.5 18:124.5 19:124.5 20:126.1333333333333 21:126.2666666666667 22:126.2666666666667 23:126.2666666666667 24:123.3666666666667 25:123.3666666666667 26:122.7 27:123.3666666666667 28:124.0666666666667 29:124.7333333333333 30:124.0666666666667 31:124.0666666666667 32:121.0666666666667 33:121.0666666666667 34:121.0666666666667 35:121.0666666666667 36:121.7666666666667 37:121.7666666666667 38:121.7666666666667 39:121.7666666666667 40:113.45 41:116.8166666666667 42:122.4166666666667 43:124.9833333333333 44:118.55 45:118.05 46:118 47:118.3333333333333 48:118.2166666666667 49:118.0333333333333 50:118.0666666666667 51:118.5333333333333 52:113.25 53:113.6666666666667 54:113.7 55:113.4833333333333 56:116.2666666666667 57:116.2666666666667 58:116.2 59:116.1333333333333 60:116.9333333333333 61:116.8 62:116.7333333333333 63:116.6666666666667 64:114.9 65:115.2333333333333 66:115.2333333333333 67:114.9 68:114.1 69:113.7666666666667 70:113.7666666666667 71:114.1 72:111.6666666666667 73:111.7333333333333 74:111.7333333333333 75:111.8 76:108.0666666666667 77:108.2 78:108.2 79:108.2666666666667 80:110.0666666666667 81:110.1333333333333 82:110.1333333333333 83:110.2 84:105 85:105.2 86:105.2 87:105.3333333333333 88:109.2666666666667 89:109.4 90:109.4 91:109.5333333333333 92:105.5333333333333 93:105.7333333333333 94:105.7333333333333 95:105.8 96:102.2 97:102.2 98:102.2 99:102.2 100:124.4333333333333 101:124.4333333333333 102:124.6333333333333 103:124.5666666666667 104:121.1833333333333 105:121.45 106:122.5333333333333 107:123.1333333333333 108:126 109:126.1333333333333 110:126.3333333333333 111:126.0166666666667 112:124.0666666666667 113:123.9333333333333 114:123.8666666666667 115:124.0666666666667 116:124.0666666666667 117:123.9333333333333 118:123.8666666666667 119:123.8666666666667 120:119.2 121:120.1333333333333 122:121.7333333333333 123:122.8833333333333 124:119.7333333333333 125:119.7333333333333 126:119.2 127:119.8666666666667 128:113.7666666666667 129:114.4333333333333 130:113.7666666666667 131:113.8166666666667 132:117.5666666666667 133:117.5666666666667 134:117.5666666666667 135:117.5666666666667 136:119.1666666666667 137:119.1666666666667 138:119.1666666666667 139:119.1666666666667 140:118.2333333333333 141:118.3166666666667 142:118.55 143:117.7166666666667 144:114.1333333333333 145:113.5166666666667 146:113.5333333333333 147:113.7333333333333 148:112.9333333333333 149:112.8 150:112.8666666666667 151:113.2666666666667 152:114.4 153:114.9666666666667 154:115.1 155:114.8666666666667 156:116 157:116 158:116.1333333333333 159:116.2666666666667 160:111.2 161:111.0666666666667 162:111 163:111.0166666666667 164:110.5 165:110.6666666666667 166:110.65 167:110.3833333333333 168:110.0166666666667 169:109.8166666666667 170:109.8 171:110 172:106.2666666666667 173:107.2 174:108.5 175:109.5666666666667 176:107.7333333333333 177:107.6666666666667 178:107.6666666666667 179:107.6666666666667 180:107.4333333333333 181:107.5 182:107.5 183:107.5666666666667 184:106.3666666666667 185:106.4333333333333 186:106.4333333333333 187:106.4333333333333 188:107.1666666666667 189:107.1666666666667 190:107.1666666666667 191:107.3 192:106.2666666666667 193:106.4 194:106.4 195:106.4 196:102.4 197:101.55 198:100.1 199:99.2 200:118.6 201:118.6666666666667 202:118.7333333333333 203:118.7333333333333 204:115.9333333333333 205:115.3333333333333 206:114.5333333333333 207:113.9333333333333 208:118.8833333333333 209:118.0333333333333 210:117.1666666666667 211:115.8166666666667 212:116.1333333333333 213:115.6333333333333 214:115.9666666666667 215:115.9666666666667 216:116.8666666666667 217:116.8666666666667 218:116.6666666666667 219:116.5333333333333 220:123.4333333333333 221:122.4333333333333 222:120.7333333333333 223:119.3833333333333 224:122.1333333333333 225:122.1333333333333 226:121.5333333333333 227:122.1333333333333 228:121.1666666666667 229:121.7666666666667 230:121.1666666666667 231:121.2333333333333 232:117.2666666666667 233:117.2666666666667 234:117.2666666666667 235:117.2666666666667 236:117.1666666666667 237:117.1666666666667 238:117.1666666666667 239:117.1666666666667 240:112.8666666666667 241:112.8666666666667 242:113.2 243:112.5333333333333 244:113.1333333333333 245:112.6333333333333 246:112.8 247:112.8 248:117.9333333333333 249:117.9333333333333 250:117.9333333333333 251:117.9333333333333 252:118.5333333333333 253:118.5333333333333 254:118.5333333333333 255:118.5333333333333 256:114.6333333333333 257:114.6333333333333 258:114.6333333333333 259:114.9 260:109.4 261:109.9333333333333 262:110.0666666666667 263:110.2 264:101.9666666666667 265:103.8166666666667 266:106.45 267:108.3 268:106.1666666666667 269:105.9 270:105.9 271:106.1 272:101.5 273:104.2 274:107.85 275:110.5 276:104.25 277:106.15 278:108.65 279:110.3833333333333 280:102.4 281:104.1 282:107 283:108.7333333333333 284:107.3833333333333 285:105.7166666666667 286:103.1666666666667 287:101.4166666666667 288:100.4666666666667 289:102.1166666666667 290:104.5166666666667 291:106.1666666666667 292:105.8666666666667 293:105.9333333333333 294:105.9333333333333 295:106.0666666666667 296:107.0833333333333 297:104.6333333333333 298:100.6333333333333 299:98.33333333333333 300:114.5666666666667 301:113.1166666666667 302:111.1166666666667 303:110.0333333333333 304:114.9333333333333 305:113.9166666666667 306:112.3666666666667 307:111.6 308:110.8833333333333 309:111.7833333333333 310:112.7 311:113.8 312:109.3333333333333 313:109.7 314:109.3 315:109.3 316:110.4 317:110.4 318:110.4 319:110.3333333333333 320:112.3833333333333 321:113.9833333333333 322:116.4833333333333 323:118.2 324:114.8333333333333 325:114.8333333333333 326:114.7666666666667 327:114.8666666666667 328:114.7 329:115 330:114.9333333333333 331:114.9333333333333 332:115.9666666666667 333:115.9666666666667 334:115.9666666666667 335:115.9666666666667 336:107.0666666666667 337:107.0666666666667 338:107.0666666666667 339:107.0666666666667 340:114.1666666666667 341:114.1666666666667 342:114.8 343:113.8333333333333 344:114.15 345:113.3666666666667 346:113.9333333333333 347:113.9333333333333 348:109.1666666666667 349:109.6666666666667 350:110.6 351:111.35 352:108.9666666666667 353:109.1666666666667 354:109.3 355:109.3 356:101.9833333333333 357:104.6833333333333 358:108.7 359:111.4166666666667 360:101.2333333333333 361:101.3666666666667 362:101.5 363:101.5 364:99.66666666666667 365:101.4166666666667 366:103.8666666666667 367:105.4666666666667 368:105.2666666666667 369:105.1 370:105.1 371:105.1 372:108.1 373:105.35 374:101.6 375:99 376:100.7 377:102.45 378:105 379:106.75 380:105.3 381:104.5 382:103.15 383:102.3833333333333 384:98.11666666666666 385:96.41666666666667 386:93.76666666666667 387:92.06666666666666 388:89.06666666666666 389:87.26666666666667 390:84.96666666666667 391:83.31666666666666 392:90.13333333333334 393:90.13333333333334 394:90.13333333333334 395:90.13333333333334 396:99.03333333333333 397:98.98333333333333 398:98.98333333333333 399:98.98333333333333 400:103.8666666666667 401:101.9166666666667 402:99.15000000000001 403:97.48333333333333 404:101.65 405:102.9 406:104.7333333333333 407:105.9166666666667 408:114.0833333333333 409:114.0666666666667 410:113.8 411:114.1333333333333 412:110.2666666666667 413:110.6 414:110.4 415:110.8 416:109.4666666666667 417:109.4666666666667 418:109.4666666666667 419:109.4666666666667 420:116.1666666666667 421:114.2666666666667 422:111.8166666666667 423:110.1166666666667 424:107.3666666666667 425:106.9666666666667 426:106.7666666666667 427:106.7666666666667 428:111.0666666666667 429:111.0666666666667 430:111.0666666666667 431:111.0666666666667 432:116.6166666666667 433:116.4666666666667 434:116.5166666666667 435:116.5166666666667 436:112.0666666666667 437:111.9666666666667 438:112.1666666666667 439:112.2166666666667 440:101.9666666666667 441:101.9666666666667 442:102.4666666666667 443:101.6 444:91.11666666666666 445:90.26666666666667 446:90.73333333333333 447:91.08333333333333 448:94.58333333333333 449:93.78333333333333 450:93.31666666666666 451:92.95 452:96.3 453:96.7 454:96.96666666666667 455:96.96666666666667 456:97.51666666666667 457:98.2 458:99.26666666666667 459:100.1666666666667 460:102.1166666666667 461:105.2166666666667 462:110.8166666666667 463:114.0666666666667 464:103.8666666666667 465:103.8166666666667 466:103.8666666666667 467:103.7 468:94.06666666666666 469:93.8 470:93.75 471:93.8 472:99.95 473:99.09999999999999 474:97.8 475:96.84999999999999 476:103.05 477:99.65000000000001 478:94.40000000000001 479:90.95 480:87.95 481:90.65000000000001 482:94.34999999999999 483:97.2 484:95.76666666666667 485:95.76666666666667 486:95.76666666666667 487:95.76666666666667 488:94.46666666666667 489:94.46666666666667 490:94.46666666666667 491:94.46666666666667 492:84.58333333333333 493:88.03333333333333 494:93.43333333333334 495:96.73333333333333 496:94.63333333333334 497:94.63333333333334 498:94.63333333333334 499:94.63333333333334 500:111.4666666666667 501:111.4666666666667 502:111.6 503:111.7333333333333 504:115.1666666666667 505:114.5666666666667 506:113.4 507:112.5 508:111.85 509:111.6 510:110.7166666666667 511:111.0166666666667 512:111.2833333333333 513:112.5833333333333 514:113.1666666666667 515:113.8666666666667 516:115.0166666666667 517:114.3666666666667 518:113.5166666666667 519:112.9166666666667 520:120.3166666666667 521:116.6666666666667 522:111.6166666666667 523:108.0166666666667 524:109.7666666666667 525:109.7666666666667 526:109.7666666666667 527:109.7666666666667 528:104.4666666666667 529:104.4666666666667 530:104.4666666666667 531:104.4666666666667 532:104.0166666666667 533:100.4166666666667 534:95.51666666666667 535:91.91666666666667 536:103.4666666666667 537:103.5666666666667 538:103.5666666666667 539:103.5666666666667 540:96.16666666666667 541:96.16666666666667 542:96.16666666666667 543:96.16666666666667 544:100.2333333333333 545:101.3833333333333 546:103.0666666666667 547:104.1666666666667 548:98.46666666666667 549:98.51666666666667 550:98.43333333333334 551:98.48333333333333 552:102.5166666666667 553:103.0166666666667 554:103.7166666666667 555:104.2166666666667 556:99.21666666666667 557:97.91666666666667 558:96.16666666666667 559:95.06666666666666 560:99.66666666666667 561:99.66666666666667 562:99.71666666666667 563:99.81666666666666 564:99.11666666666666 565:99.21666666666667 566:99.21666666666667 567:98.95 568:101.1666666666667 569:99.84999999999999 570:98.40000000000001 571:97.3 572:98.59999999999999 573:98.59999999999999 574:98.59999999999999 575:98.59999999999999 576:94.09999999999999 577:95.25 578:96.84999999999999 579:98.05 580:93.55 581:91.40000000000001 582:87.55 583:85.40000000000001 584:93.06666666666666 585:93.06666666666666 586:93.06666666666666 587:93.06666666666666 588:94.96666666666667 589:94.96666666666667 590:94.96666666666667 591:94.96666666666667 592:98.28333333333333 593:98.33333333333333 594:98.33333333333333 595:98.38333333333334 596:92.58333333333333 597:90.48333333333333 598:87.58333333333333 599:85.48333333333333 600:108.65 601:108.65 602:108.65 603:108.7833333333333 604:106.2333333333333 605:105.3833333333333 606:104.2333333333333 607:103.3333333333333 608:99.3 609:103.1 610:108.3666666666667 611:112.8166666666667 612:115.35 613:115.4 614:114.3 615:113.8833333333333 616:104.9666666666667 617:105.7166666666667 618:106.4666666666667 619:107.1666666666667 620:102.8666666666667 621:102.8666666666667 622:102.8166666666667 623:102.9166666666667 624:103.2666666666667 625:103.2666666666667 626:103.2666666666667 627:103.2666666666667 628:104.1166666666667 629:102.4666666666667 630:100.0666666666667 631:98.31666666666666 632:101.4166666666667 633:102.9166666666667 634:105.1166666666667 635:106.7666666666667 636:113.6166666666667 637:111.9666666666667 638:109.7166666666667 639:108.1666666666667 640:107.0666666666667 641:107.0666666666667 642:107.0666666666667 643:107.0666666666667 644:105.5166666666667 645:104.1166666666667 646:102.6166666666667 647:101.5333333333333 648:95.63333333333334 649:95.26666666666667 650:95.31666666666666 651:95.11666666666666 652:92.61666666666666 653:91.91666666666667 654:91.36666666666666 655:90.81666666666666 656:91.31666666666666 657:92.66666666666667 658:94.31666666666666 659:95.76666666666667 660:86.66666666666667 661:88.46666666666667 662:90.81666666666666 663:92.51666666666667 664:100.4666666666667 665:100.4666666666667 666:100.5166666666667 667:100.2666666666667 668:98.01666666666667 669:97.59999999999999 670:96.90000000000001 671:96.3 672:94.90000000000001 673:94.90000000000001 674:94.90000000000001 675:94.90000000000001 676:96.59999999999999 677:95.34999999999999 678:93.75 679:92.5 680:90.09999999999999 681:88.8 682:87.05 683:85.68333333333334 684:88.7 685:88.56666666666666 686:88.56666666666666 687:88.56666666666666 688:94.71666666666667 689:92.76666666666667 690:90.21666666666667 691:88.41666666666667 692:85.33333333333333 693:85.40000000000001 694:85.40000000000001 695:85.40000000000001 696:83.2 697:81.59999999999999 698:79.45 699:77.95 700:98.40000000000001 701:98.40000000000001 702:98.40000000000001 703:98.40000000000001 704:96.45 705:99.3 706:103.6 707:106.6 708:100.8333333333333 709:100.5666666666667 710:100.2 711:100.6333333333333 712:102.4666666666667 713:102.8 714:102.4166666666667 715:102.3666666666667 716:102.2666666666667 717:102.3166666666667 718:102.3666666666667 719:102.3666666666667 720:99.26666666666667 721:99.26666666666667 722:99.26666666666667 723:99.26666666666667 724:98.96666666666667 725:98.96666666666667 726:98.96666666666667 727:98.96666666666667 728:103.2666666666667 729:104.7666666666667 730:107.1666666666667 731:108.9666666666667 732:111.4166666666667 733:109.8166666666667 734:107.5166666666667 735:105.9166666666667 736:99.46666666666667 737:98.51666666666667 738:96.96666666666667 739:96.01666666666667 740:93.16666666666667 741:87.91666666666667 742:92.31666666666666 743:103.6166666666667 744:100.7666666666667 745:100.3166666666667 746:99.56666666666666 747:99.01666666666667 748:99.91666666666667 749:99.86666666666666 750:99.86666666666666 751:99.76666666666667 752:104.2666666666667 753:104.2666666666667 754:104.2666666666667 755:104.2666666666667 756:101.7166666666667 757:100.4666666666667 758:98.76666666666667 759:97.76666666666667 760:103.8666666666667 761:102.8666666666667 762:101.3166666666667 763:100.3666666666667 764:88.46666666666667 765:88.46666666666667 766:88.63333333333334 767:88.46666666666667 768:78.21666666666667 769:79.84999999999999 770:82.2 771:83.8 772:86.8 773:86.8 774:86.8 775:86.8 776:87.90000000000001 777:87.95 778:88 779:88 780:83.65000000000001 781:82.65000000000001 782:80.90000000000001 783:79.66666666666667 784:85.3 785:85.3 786:85.3 787:85.3 788:88.59999999999999 789:86.84999999999999 790:84.45 791:82.65000000000001 792:91.43333333333334 793:91.7 794:91.76666666666667 795:91.76666666666667 796:88.06666666666666 797:88.01666666666667 798:87.96666666666667 799:87.96666666666667 +0 0:120.25 1:113.3 2:103.15 3:96 4:95.53333333333333 5:94.90000000000001 6:94.09999999999999 7:93.88333333333334 8:87.59999999999999 9:88.90000000000001 10:90.09999999999999 11:91.05 12:92.84999999999999 13:92.34999999999999 14:91.84999999999999 15:91.55 16:91.73333333333333 17:92.51666666666667 18:92.91666666666667 19:92.91666666666667 20:99.21666666666667 21:99.51666666666667 22:99.91666666666667 23:100.0333333333333 24:107.6166666666667 25:109.5166666666667 26:107.5833333333333 27:103.0833333333333 28:110.7333333333333 29:110.6333333333333 30:110.8333333333333 31:110.4666666666667 32:113.4166666666667 33:113.1833333333333 34:113.2333333333333 35:113.3166666666667 36:126.0333333333333 37:126.0333333333333 38:126.0166666666667 39:125.95 40:128.5833333333333 41:127.95 42:127.2 43:127.15 44:131.05 45:130.5 46:129.5333333333333 47:128.9 48:124.3166666666667 49:124.5833333333333 50:124.5333333333333 51:124.4666666666667 52:125.4833333333333 53:123.4833333333333 54:117.2833333333333 55:111.05 56:108.8333333333333 57:106.8 58:105.1 59:105.0333333333333 60:108.0833333333333 61:107.75 62:107.35 63:107.2833333333333 64:102.6666666666667 65:102.2333333333333 66:101.6666666666667 67:101.1166666666667 68:97.61666666666666 69:97.58333333333333 70:97.63333333333334 71:97.68333333333334 72:102.5333333333333 73:101.5166666666667 74:100.3833333333333 75:99.58333333333333 76:99.33333333333333 77:99.46666666666667 78:99.59999999999999 79:99.7 80:98.86666666666666 81:98.93333333333334 82:98.93333333333334 83:98.93333333333334 84:96.93333333333334 85:96.93333333333334 86:96.93333333333334 87:96.93333333333334 88:101.4666666666667 89:101.4666666666667 90:101.4666666666667 91:101.4666666666667 92:96.16666666666667 93:96.16666666666667 94:96.16666666666667 95:96.16666666666667 96:92.43333333333334 97:92.43333333333334 98:92.43333333333334 99:92.43333333333334 100:86.93333333333334 101:86.73333333333333 102:86.76666666666667 103:86.8 104:93.5 105:93.5 106:93.55 107:93.48333333333333 108:97.76666666666667 109:97.66666666666667 110:97.66666666666667 111:97.66666666666667 112:94.06666666666666 113:94.06666666666666 114:94.06666666666666 115:94.09999999999999 116:89.78333333333333 117:93.53333333333333 118:99.03333333333333 119:102.6333333333333 120:100.9333333333333 121:100.9333333333333 122:100.9333333333333 123:100.85 124:95.59999999999999 125:95.56666666666666 126:95.5 127:95.33333333333333 128:88.31666666666666 129:88.63333333333334 130:89.26666666666667 131:89.48333333333333 132:89.08333333333333 133:89.03333333333333 134:89.09999999999999 135:89.09999999999999 136:91.86666666666666 137:94.65000000000001 138:98.65000000000001 139:101.4166666666667 140:108.1833333333333 141:106.9833333333333 142:105.0833333333333 143:103.75 144:100.6166666666667 145:102.8166666666667 146:105.7333333333333 147:107.85 148:103.9166666666667 149:104 150:104.1333333333333 151:104.2666666666667 152:107.2166666666667 153:107.25 154:107.4666666666667 155:107.5166666666667 156:101.7166666666667 157:102.95 158:104.05 159:104.75 160:106.0666666666667 161:106.1333333333333 162:106.1333333333333 163:105.9333333333333 164:100.2833333333333 165:100.1166666666667 166:100.1166666666667 167:100.0833333333333 168:100.2166666666667 169:100.3166666666667 170:100.25 171:100.2166666666667 172:96.66666666666667 173:97.58333333333333 174:98.53333333333333 175:99.31666666666666 176:99.66666666666667 177:99.66666666666667 178:99.66666666666667 179:99.73333333333333 180:96.06666666666666 181:96.06666666666666 182:96.06666666666666 183:96.06666666666666 184:100.5666666666667 185:100.5666666666667 186:100.5666666666667 187:100.5666666666667 188:98.86666666666666 189:98.86666666666666 190:98.86666666666666 191:98.86666666666666 192:103.5666666666667 193:103.5666666666667 194:103.5666666666667 195:103.5666666666667 196:97.26666666666667 197:97.26666666666667 198:97.26666666666667 199:97.26666666666667 200:94.38333333333334 201:94.38333333333334 202:94.38333333333334 203:94.38333333333334 204:90.98333333333333 205:90.98333333333333 206:90.98333333333333 207:90.91666666666667 208:89.83333333333333 209:91.56666666666666 210:94.41666666666667 211:96.36666666666666 212:98.16666666666667 213:98.16666666666667 214:98.16666666666667 215:98.16666666666667 216:101.9166666666667 217:101.9666666666667 218:101.9666666666667 219:102.0166666666667 220:95.91666666666667 221:95.91666666666667 222:95.91666666666667 223:95.88333333333334 224:91.96666666666667 225:91.96666666666667 226:91.96666666666667 227:91.96666666666667 228:91.31666666666666 229:90.86666666666666 230:90.36666666666666 231:89.84999999999999 232:88.75 233:88.65000000000001 234:88.91666666666667 235:88.91666666666667 236:96.06666666666666 237:96.66666666666667 238:97.86666666666666 239:98.83333333333333 240:100.5 241:98.34999999999999 242:95.09999999999999 243:92.95 244:95.06666666666666 245:97.45 246:100.8333333333333 247:103.2 248:101.5166666666667 249:101.7 250:101.7 251:101.7 252:97.59999999999999 253:97.73333333333333 254:97.86666666666666 255:97.88333333333334 256:98.51666666666667 257:98.66666666666667 258:98.76666666666667 259:98.81666666666666 260:95.56666666666666 261:95.56666666666666 262:95.56666666666666 263:95.38333333333334 264:96.96666666666667 265:96.88333333333334 266:96.88333333333334 267:96.88333333333334 268:90.53333333333333 269:92.78333333333333 270:95.98333333333333 271:98.18333333333334 272:93.08333333333333 273:93.16666666666667 274:93.25 275:93.2 276:91.2 277:91.33333333333333 278:91.33333333333333 279:91.43333333333334 280:92.63333333333334 281:92.66666666666667 282:92.66666666666667 283:92.66666666666667 284:97.76666666666667 285:97.76666666666667 286:97.76666666666667 287:97.76666666666667 288:95.86666666666666 289:95.86666666666666 290:95.86666666666666 291:95.86666666666666 292:95.76666666666667 293:95.76666666666667 294:95.76666666666667 295:95.76666666666667 296:96.46666666666667 297:96.46666666666667 298:96.46666666666667 299:96.46666666666667 300:76.26666666666667 301:76.26666666666667 302:76.26666666666667 303:76.26666666666667 304:77.46666666666667 305:77.46666666666667 306:77.46666666666667 307:77.46666666666667 308:80.40000000000001 309:81.88333333333334 310:84.08333333333333 311:85.78333333333333 312:83.53333333333333 313:83.53333333333333 314:83.53333333333333 315:83.53333333333333 316:81.23333333333333 317:81.25 318:81.25 319:81.25 320:78.05 321:78.05 322:78.05 323:78.09999999999999 324:81.56666666666666 325:81.56666666666666 326:81.56666666666666 327:81.56666666666666 328:84.66666666666667 329:84.56666666666666 330:84.56666666666666 331:84.41666666666667 332:82.93333333333334 333:82.93333333333334 334:82.93333333333334 335:83.06666666666666 336:86.46666666666667 337:86.46666666666667 338:86.33333333333333 339:86.34999999999999 340:83.43333333333334 341:83.7 342:83.81666666666666 343:83.86666666666666 344:79.66666666666667 345:82.76666666666667 346:86.96666666666667 347:90.2 348:96.8 349:96.8 350:96.8 351:96.8 352:89.2 353:89.2 354:89.2 355:89.05 356:83.45 357:83.43333333333334 358:83.43333333333334 359:83.43333333333334 360:84.13333333333334 361:84.13333333333334 362:84.13333333333334 363:84.01666666666667 364:70.2 365:70.68333333333334 366:71.73333333333333 367:72.28333333333333 368:75.73333333333333 369:77.13333333333334 370:78.93333333333334 371:80.33333333333333 372:83.84999999999999 373:83.05 374:82.09999999999999 375:81.56666666666666 376:79.76666666666667 377:79.76666666666667 378:79.76666666666667 379:79.81666666666666 380:84.26666666666667 381:84.33333333333333 382:84.73333333333333 383:84.73333333333333 384:83.46666666666667 385:83.46666666666667 386:83.46666666666667 387:83.46666666666667 388:79.56666666666666 389:79.56666666666666 390:79.56666666666666 391:79.56666666666666 392:81.26666666666667 393:81.26666666666667 394:81.26666666666667 395:81.26666666666667 396:87.8 397:87.8 398:87.8 399:87.8 400:79.16666666666667 401:79.16666666666667 402:79.16666666666667 403:79.16666666666667 404:83.56666666666666 405:83.56666666666666 406:83.56666666666666 407:83.56666666666666 408:81.93333333333334 409:81.93333333333334 410:81.93333333333334 411:81.93333333333334 412:84.13333333333334 413:83.48333333333333 414:82.48333333333333 415:81.53333333333333 416:86.21666666666667 417:85.91666666666667 418:85.91666666666667 419:85.91666666666667 420:86.71666666666667 421:85.06666666666666 422:82.81666666666666 423:81.25 424:81 425:81.03333333333333 426:81.03333333333333 427:81.03333333333333 428:80.93333333333334 429:82.41666666666667 430:84.31666666666666 431:85.53333333333333 432:89.48333333333333 433:88.58333333333333 434:87.58333333333333 435:86.73333333333333 436:81.78333333333333 437:81.13333333333334 438:80.18333333333334 439:79.45 440:86.63333333333334 441:86.66666666666667 442:86.66666666666667 443:86.66666666666667 444:85.06666666666666 445:85.46666666666667 446:86.06666666666666 447:86.59999999999999 448:84.71666666666667 449:84.31666666666666 450:83.86666666666666 451:83.61666666666666 452:86.26666666666667 453:86.26666666666667 454:86.26666666666667 455:86.11666666666666 456:87.40000000000001 457:87.23333333333333 458:87.23333333333333 459:87.23333333333333 460:88.53333333333333 461:88.53333333333333 462:88.53333333333333 463:88.53333333333333 464:83.65000000000001 465:83 466:82.15000000000001 467:81.59999999999999 468:81.8 469:81.8 470:81.8 471:81.8 472:81.56666666666666 473:82.16666666666667 474:83.01666666666667 475:83.46666666666667 476:78.86666666666666 477:79.51666666666667 478:80.41666666666667 479:80.93333333333334 480:84.75 481:84.7 482:84.7 483:84.76666666666667 484:77.2 485:77.2 486:77.2 487:77.23333333333333 488:81.86666666666666 489:81.86666666666666 490:81.86666666666666 491:81.86666666666666 492:78.16666666666667 493:78.16666666666667 494:78.01666666666667 495:77.96666666666667 496:81.46666666666667 497:80.76666666666667 498:79.86666666666666 499:79.26666666666667 500:84.34999999999999 501:84.34999999999999 502:84.34999999999999 503:84.34999999999999 504:82.45 505:82.84999999999999 506:83.25 507:83.61666666666666 508:82.40000000000001 509:82.40000000000001 510:82.40000000000001 511:82.40000000000001 512:75.75 513:76.40000000000001 514:77.5 515:78.11666666666666 516:77.76666666666667 517:77.56666666666666 518:77.56666666666666 519:77.56666666666666 520:75.41666666666667 521:77.06666666666666 522:79.36666666666666 523:80.95 524:80.18333333333334 525:80.2 526:80.2 527:80.2 528:81.65000000000001 529:84.55 530:88.25 531:91.05 532:79.71666666666667 533:80.36666666666666 534:81.56666666666666 535:82.41666666666667 536:83.76666666666667 537:84.51666666666667 538:85.46666666666667 539:85.91666666666667 540:91.46666666666667 541:91.76666666666667 542:92.26666666666667 543:92.56666666666666 544:92.66666666666667 545:92.01666666666667 546:91.06666666666666 547:90.36666666666666 548:93.06666666666666 549:90.13333333333334 550:85.88333333333334 551:82.83333333333333 552:79.63333333333334 553:79.63333333333334 554:79.63333333333334 555:79.53333333333333 556:85.96666666666667 557:85.86666666666666 558:85.86666666666666 559:85.86666666666666 560:82.96666666666667 561:82.96666666666667 562:82.96666666666667 563:82.96666666666667 564:84.63333333333334 565:84.63333333333334 566:84.63333333333334 567:84.63333333333334 568:77.33333333333333 569:77.33333333333333 570:77.33333333333333 571:77.33333333333333 572:77.63333333333334 573:77.63333333333334 574:77.63333333333334 575:77.63333333333334 576:74.13333333333334 577:73.33333333333333 578:72.38333333333334 579:71.5 580:76.06666666666666 581:75.96666666666667 582:75.96666666666667 583:75.96666666666667 584:79.76666666666667 585:79.51666666666667 586:78.96666666666667 587:78.76666666666667 588:83.76666666666667 589:83.76666666666667 590:83.76666666666667 591:83.76666666666667 592:74.31666666666666 593:74.21666666666667 594:74.16666666666667 595:74.21666666666667 596:72.06666666666666 597:72.66666666666667 598:73.56666666666666 599:74.16666666666667 600:74.90000000000001 601:74.90000000000001 602:74.90000000000001 603:74.90000000000001 604:75.40000000000001 605:75.05 606:74.55 607:74.15000000000001 608:81.76666666666667 609:81.76666666666667 610:81.76666666666667 611:81.76666666666667 612:80.91666666666667 613:80.91666666666667 614:80.81666666666666 615:80.76666666666667 616:80.56666666666666 617:80.56666666666666 618:80.56666666666666 619:80.56666666666666 620:76.06666666666666 621:76.01666666666667 622:75.96666666666667 623:76.01666666666667 624:84.09999999999999 625:84.09999999999999 626:84.09999999999999 627:84.09999999999999 628:81.90000000000001 629:81.90000000000001 630:81.84999999999999 631:81.84999999999999 632:84.16666666666667 633:84.21666666666667 634:84.16666666666667 635:84.11666666666666 636:82.36666666666666 637:82.26666666666667 638:82.26666666666667 639:82.21666666666667 640:81.68333333333334 641:81.28333333333333 642:80.73333333333333 643:80.48333333333333 644:72.33333333333333 645:73.13333333333334 646:74.08333333333333 647:74.83333333333333 648:71.58333333333333 649:71.28333333333333 650:70.98333333333333 651:70.58333333333333 652:81.03333333333333 653:81.03333333333333 654:81.03333333333333 655:81.03333333333333 656:79.96666666666667 657:79.96666666666667 658:79.96666666666667 659:79.96666666666667 660:77.11666666666666 661:77.46666666666667 662:77.96666666666667 663:78.21666666666667 664:80.73333333333333 665:80.73333333333333 666:80.73333333333333 667:80.73333333333333 668:81.13333333333334 669:81.13333333333334 670:81.13333333333334 671:81.13333333333334 672:78.03333333333333 673:78.03333333333333 674:78.03333333333333 675:78.03333333333333 676:78.43333333333334 677:78.43333333333334 678:78.53333333333333 679:78.58333333333333 680:79.5 681:81.84999999999999 682:84.95 683:87.2 684:88.55 685:88.90000000000001 686:89.25 687:89.59999999999999 688:90 689:90 690:90 691:90 692:89.5 693:89.5 694:89.5 695:89.5 696:85.75 697:85.7 698:85.65000000000001 699:85.7 700:72.63333333333334 701:71.78333333333333 702:70.68333333333334 703:69.78333333333333 704:70.73333333333333 705:70.73333333333333 706:70.73333333333333 707:70.68333333333334 708:73.36666666666666 709:73.36666666666666 710:73.36666666666666 711:73.36666666666666 712:77.16666666666667 713:77.16666666666667 714:77.16666666666667 715:77.16666666666667 716:80.40000000000001 717:80.40000000000001 718:80.40000000000001 719:80.40000000000001 720:78.90000000000001 721:78.90000000000001 722:78.90000000000001 723:78.90000000000001 724:81.61666666666666 725:82.21666666666667 726:83.01666666666667 727:83.81666666666666 728:81.96666666666667 729:81.96666666666667 730:81.96666666666667 731:81.96666666666667 732:81.59999999999999 733:81.05 734:80.15000000000001 735:79.59999999999999 736:79.90000000000001 737:80.55 738:81.45 739:82.05 740:82.23333333333333 741:82.23333333333333 742:82.23333333333333 743:82.23333333333333 744:79.73333333333333 745:79.73333333333333 746:79.68333333333334 747:79.63333333333334 748:73.45 749:73.40000000000001 750:73.40000000000001 751:73.40000000000001 752:78.8 753:78.8 754:78.8 755:78.8 756:82.7 757:82.25 758:81.2 759:80.59999999999999 760:79.3 761:78.25 762:76.59999999999999 763:75.34999999999999 764:74.08333333333333 765:73.48333333333333 766:72.43333333333334 767:71.68333333333334 768:75.63333333333334 769:75.63333333333334 770:75.63333333333334 771:75.63333333333334 772:71.73333333333333 773:71.73333333333333 774:71.73333333333333 775:71.73333333333333 776:79.73333333333333 777:78.98333333333333 778:77.98333333333333 779:77.18333333333334 780:66.46666666666667 781:70.66666666666667 782:77.51666666666667 783:81.76666666666667 784:81.76666666666667 785:81.81666666666666 786:81.86666666666666 787:82.13333333333334 788:77.95 789:78.09999999999999 790:78.09999999999999 791:78.09999999999999 792:82.8 793:82.8 794:82.8 795:82.8 796:76.75 797:75.84999999999999 798:74.75 799:73.84999999999999 +0 0:99.33333333333333 1:99.33333333333333 2:99.33333333333333 3:99.33333333333333 4:102.6333333333333 5:102.6333333333333 6:102.6333333333333 7:102.6333333333333 8:101.4333333333333 9:101.4333333333333 10:101.4333333333333 11:101.4333333333333 12:109.0833333333333 13:107.5833333333333 14:105.3333333333333 15:103.7333333333333 16:100.2833333333333 17:100.3 18:100.3 19:100.2 20:103.2 21:103.2 22:103.2 23:103.2 24:103.1 25:101.35 26:98.75 27:96.90000000000001 28:100.25 29:100.6 30:101.05 31:101.5333333333333 32:105.1333333333333 33:105.1333333333333 34:105.1333333333333 35:105.1333333333333 36:101.2333333333333 37:101.3333333333333 38:101.2833333333333 39:101.3833333333333 40:97.43333333333334 41:97.43333333333334 42:97.43333333333334 43:97.43333333333334 44:99.33333333333333 45:99.33333333333333 46:99.33333333333333 47:99.33333333333333 48:102.1333333333333 49:102.1333333333333 50:102.1333333333333 51:102.1333333333333 52:102.4833333333333 53:101.7333333333333 54:100.4833333333333 55:99.63333333333334 56:97.93333333333334 57:97.93333333333334 58:97.93333333333334 59:97.93333333333334 60:99.43333333333334 61:99.43333333333334 62:99.43333333333334 63:99.43333333333334 64:102.3833333333333 65:100.8833333333333 66:98.28333333333333 67:96.53333333333333 68:94.93333333333334 69:96.58333333333333 70:99.13333333333334 71:100.9833333333333 72:101.2333333333333 73:101.2333333333333 74:101.2333333333333 75:101.2333333333333 76:96.83333333333333 77:98.63333333333334 78:100.9333333333333 79:102.5833333333333 80:106.9333333333333 81:105.6333333333333 82:103.9333333333333 83:102.8833333333333 84:100.1333333333333 85:103.9333333333333 86:109.3333333333333 87:113.1333333333333 88:103.5 89:103.5 90:103.5 91:103.5 92:95.55 93:95.40000000000001 94:95.05 95:94.8 96:96.59999999999999 97:97.75 98:99.59999999999999 99:100.75 100:100.0333333333333 101:100.0333333333333 102:100.1333333333333 103:100.1333333333333 104:91.83333333333333 105:91.83333333333333 106:91.83333333333333 107:91.83333333333333 108:96.33333333333333 109:96.33333333333333 110:96.33333333333333 111:96.33333333333333 112:98.03333333333333 113:99.48333333333333 114:101.6833333333333 115:103.2833333333333 116:98.58333333333333 117:100.9833333333333 118:104.3833333333333 119:106.8333333333333 120:102.6333333333333 121:102.6333333333333 122:102.6333333333333 123:102.6333333333333 124:106.0333333333333 125:103.0333333333333 126:98.73333333333333 127:95.88333333333334 128:96.78333333333333 129:100.5333333333333 130:105.5833333333333 131:109.2333333333333 132:102.1333333333333 133:102.1333333333333 134:102.1333333333333 135:102.1333333333333 136:100.4333333333333 137:100.4333333333333 138:100.4833333333333 139:100.4333333333333 140:103.5833333333333 141:103.7333333333333 142:103.6333333333333 143:103.6333333333333 144:107.7333333333333 145:107.7333333333333 146:107.7333333333333 147:107.7333333333333 148:99.83333333333333 149:99.88333333333334 150:99.93333333333334 151:99.88333333333334 152:95.13333333333334 153:96.03333333333333 154:97.18333333333334 155:97.88333333333334 156:93.23333333333333 157:93.23333333333333 158:93.23333333333333 159:93.23333333333333 160:93.13333333333334 161:93.13333333333334 162:93.13333333333334 163:93.13333333333334 164:90.43333333333334 165:88.58333333333333 166:85.78333333333333 167:83.98333333333333 168:82.93333333333334 169:84.53333333333333 170:87.43333333333334 171:89.08333333333333 172:87.43333333333334 173:88.68333333333334 174:90.38333333333334 175:91.63333333333334 176:88.73333333333333 177:86.43333333333334 178:83.23333333333333 179:80.98333333333333 180:77.63333333333334 181:78.38333333333334 182:79.13333333333334 183:79.58333333333333 184:77.58333333333333 185:81.48333333333333 186:86.63333333333334 187:90.18333333333334 188:99.3 189:99.3 190:99.3 191:99.3 192:97.15000000000001 193:92.59999999999999 194:86.09999999999999 195:81.45 196:88.25 197:88.2 198:88.2 199:88.2 200:110.9333333333333 201:110.8833333333333 202:110.9833333333333 203:110.8333333333333 204:111.7333333333333 205:111.6333333333333 206:111.6333333333333 207:111.6333333333333 208:107.9333333333333 209:107.9333333333333 210:107.9333333333333 211:107.9333333333333 212:105.4333333333333 213:105.3833333333333 214:105.6333333333333 215:105.6833333333333 216:107.0333333333333 217:104.6833333333333 218:101.2833333333333 219:98.88333333333334 220:98.83333333333333 221:98.83333333333333 222:98.83333333333333 223:98.83333333333333 224:110.1833333333333 225:111.3833333333333 226:113.1333333333333 227:114.2333333333333 228:105.5333333333333 229:105.5833333333333 230:105.6333333333333 231:105.7333333333333 232:106.4333333333333 233:106.4333333333333 234:106.4333333333333 235:106.4333333333333 236:105.6833333333333 237:105.6833333333333 238:105.5833333333333 239:105.6333333333333 240:106.0833333333333 241:106.1333333333333 242:106.1833333333333 243:106.0833333333333 244:101.9333333333333 245:101.9333333333333 246:101.9333333333333 247:101.9333333333333 248:100.9333333333333 249:100.8833333333333 250:100.9333333333333 251:100.8833333333333 252:97.58333333333333 253:97.68333333333334 254:97.58333333333333 255:97.53333333333333 256:97.33333333333333 257:97.33333333333333 258:97.33333333333333 259:97.33333333333333 260:98.23333333333333 261:98.23333333333333 262:98.23333333333333 263:98.23333333333333 264:98.58333333333333 265:95.08333333333333 266:90.08333333333333 267:86.53333333333333 268:91.73333333333333 269:91.73333333333333 270:91.73333333333333 271:91.73333333333333 272:93.93333333333334 273:92.78333333333333 274:91.38333333333334 275:90.23333333333333 276:90.93333333333334 277:91.43333333333334 278:92.28333333333333 279:93.03333333333333 280:91.63333333333334 281:90.98333333333333 282:90.08333333333333 283:89.58333333333333 284:90.48333333333333 285:91.43333333333334 286:92.73333333333333 287:93.63333333333334 288:86.7 289:86.7 290:86.7 291:86.7 292:89.55 293:87 294:83.55 295:80.95 296:82.95 297:82.90000000000001 298:82.95 299:83.09999999999999 300:93.34999999999999 301:92.15000000000001 302:90.45 303:89.2 304:96.09999999999999 305:96.05 306:96 307:96 308:100.6 309:100.6 310:100.6 311:100.6 312:107 313:103.5 314:98.25 315:94.75 316:99.15000000000001 317:95.59999999999999 318:90.75 319:87.15000000000001 320:92.34999999999999 321:90.75 322:88.65000000000001 323:87.15000000000001 324:91.45 325:92.15000000000001 326:92.90000000000001 327:93.3 328:93.3 329:93.25 330:93.2 331:92.98333333333333 332:89.93333333333334 333:88.83333333333333 334:87.23333333333333 335:86.03333333333333 336:95.28333333333333 337:95.28333333333333 338:95.23333333333333 339:95.18333333333334 340:89.33333333333333 341:89.43333333333334 342:89.43333333333334 343:89.48333333333333 344:93.03333333333333 345:93.03333333333333 346:93.03333333333333 347:93.03333333333333 348:92.68333333333334 349:92.68333333333334 350:92.68333333333334 351:92.73333333333333 352:96.53333333333333 353:95.33333333333333 354:93.68333333333334 355:92.38333333333334 356:93.33333333333333 357:94.43333333333334 358:96.03333333333333 359:97.03333333333333 360:94.93333333333334 361:94.93333333333334 362:94.93333333333334 363:94.93333333333334 364:91.98333333333333 365:91.58333333333333 366:90.58333333333333 367:90.03333333333333 368:91.23333333333333 369:90.28333333333333 370:88.63333333333334 371:87.53333333333333 372:92.38333333333334 373:92.28333333333333 374:92.33333333333333 375:92.23333333333333 376:91.83333333333333 377:91.63333333333334 378:91.63333333333334 379:91.68333333333334 380:86.93333333333334 381:88.13333333333334 382:89.73333333333333 383:90.88333333333334 384:95.73333333333333 385:95.73333333333333 386:95.73333333333333 387:95.73333333333333 388:95.2 389:95.23333333333333 390:95.23333333333333 391:95.23333333333333 392:94.08333333333333 393:90.43333333333334 394:85.28333333333333 395:81.63333333333334 396:86.34999999999999 397:90 398:95.15000000000001 399:98.59999999999999 400:89.13333333333334 401:90.58333333333333 402:92.13333333333334 403:93.08333333333333 404:89.03333333333333 405:88.93333333333334 406:88.88333333333334 407:88.88333333333334 408:95.48333333333333 409:96.33333333333333 410:97.48333333333333 411:98.38333333333334 412:93.73333333333333 413:92.88333333333334 414:91.63333333333334 415:90.83333333333333 416:97.58333333333333 417:97.63333333333334 418:97.68333333333334 419:97.73333333333333 420:95.68333333333334 421:93.63333333333334 422:90.63333333333334 423:88.73333333333333 424:88.98333333333333 425:88.33333333333333 426:87.43333333333334 427:86.78333333333333 428:88.53333333333333 429:88.53333333333333 430:88.53333333333333 431:88.53333333333333 432:91.78333333333333 433:94.68333333333334 434:98.58333333333333 435:101.4833333333333 436:99.43333333333334 437:101.1833333333333 438:103.4333333333333 439:105.0833333333333 440:95.63333333333334 441:95.63333333333334 442:95.63333333333334 443:95.63333333333334 444:91.33333333333333 445:91.33333333333333 446:91.33333333333333 447:91.33333333333333 448:90.58333333333333 449:91.43333333333334 450:92.73333333333333 451:93.48333333333333 452:89.83333333333333 453:91.13333333333334 454:92.78333333333333 455:94.18333333333334 456:96.43333333333334 457:95.33333333333333 458:93.73333333333333 459:92.63333333333334 460:94.23333333333333 461:94.23333333333333 462:94.23333333333333 463:94.23333333333333 464:94.98333333333333 465:94.13333333333334 466:92.83333333333333 467:91.78333333333333 468:90.78333333333333 469:90.23333333333333 470:89.43333333333334 471:88.98333333333333 472:81.13333333333334 473:80.38333333333334 474:79.53333333333333 475:78.83333333333333 476:83.03333333333333 477:83.03333333333333 478:83.03333333333333 479:83.03333333333333 480:81.53333333333333 481:79.58333333333333 482:76.78333333333333 483:75.03333333333333 484:72.73333333333333 485:74.43333333333334 486:76.73333333333333 487:78.43333333333334 488:76.48333333333333 489:76.43333333333334 490:76.33333333333333 491:76.23333333333333 492:80.83333333333333 493:81.78333333333333 494:82.93333333333334 495:83.78333333333333 496:89.03333333333333 497:89.06666666666666 498:89.06666666666666 499:89.06666666666666 500:88.73333333333333 501:88.73333333333333 502:88.73333333333333 503:88.73333333333333 504:81.48333333333333 505:81.98333333333333 506:82.73333333333333 507:83.28333333333333 508:86.38333333333334 509:85.83333333333333 510:85.18333333333334 511:85.13333333333334 512:87.73333333333333 513:88.63333333333334 514:89.73333333333333 515:90.68333333333334 516:86.13333333333334 517:89.08333333333333 518:92.43333333333334 519:95.48333333333333 520:99.58333333333333 521:101.2833333333333 522:103.8333333333333 523:105.7333333333333 524:109.6833333333333 525:107.6833333333333 526:104.5833333333333 527:102.5833333333333 528:102.3333333333333 529:102.2833333333333 530:102.2333333333333 531:102.1833333333333 532:96.68333333333334 533:95.13333333333334 534:92.93333333333334 535:91.18333333333334 536:94.03333333333333 537:92.48333333333333 538:90.13333333333334 539:88.48333333333333 540:84.33333333333333 541:84.33333333333333 542:84.33333333333333 543:84.33333333333333 544:86.63333333333334 545:86.63333333333334 546:86.63333333333334 547:86.63333333333334 548:88.78333333333333 549:87.93333333333334 550:86.48333333333333 551:85.43333333333334 552:86.88333333333334 553:85.58333333333333 554:83.98333333333333 555:82.93333333333334 556:88.03333333333333 557:88.03333333333333 558:88.03333333333333 559:88.03333333333333 560:92.63333333333334 561:92.63333333333334 562:92.63333333333334 563:92.68333333333334 564:88.08333333333333 565:87.13333333333334 566:85.78333333333333 567:84.53333333333333 568:78.93333333333334 569:80.68333333333334 570:82.98333333333333 571:84.58333333333333 572:81.63333333333334 573:83.43333333333334 574:85.98333333333333 575:87.78333333333333 576:84.83333333333333 577:84.83333333333333 578:84.83333333333333 579:84.83333333333333 580:80.18333333333334 581:80.88333333333334 582:81.88333333333334 583:82.58333333333333 584:84.18333333333334 585:82.58333333333333 586:80.23333333333333 587:78.53333333333333 588:79.23333333333333 589:80.48333333333333 590:82.08333333333333 591:83.23333333333333 592:85.58333333333333 593:84.73333333333333 594:83.38333333333334 595:82.63333333333334 596:86.2 597:86.2 598:86.2 599:86.2 600:83.03333333333333 601:83.03333333333333 602:83.03333333333333 603:83.18333333333334 604:86.38333333333334 605:85.83333333333333 606:84.93333333333334 607:84.28333333333333 608:74.33333333333333 609:73.93333333333334 610:73.28333333333333 611:72.68333333333334 612:79.13333333333334 613:79.13333333333334 614:79.13333333333334 615:79.13333333333334 616:76.28333333333333 617:77.33333333333333 618:78.43333333333334 619:79.58333333333333 620:80.43333333333334 621:82.48333333333333 622:85.53333333333333 623:87.78333333333333 624:90.13333333333334 625:88.63333333333334 626:86.43333333333334 627:85.18333333333334 628:91.38333333333334 629:87.68333333333334 630:82.78333333333333 631:79.03333333333333 632:75.68333333333334 633:79.28333333333333 634:84.28333333333333 635:87.88333333333334 636:83.43333333333334 637:83.43333333333334 638:83.43333333333334 639:83.43333333333334 640:83.63333333333334 641:83.63333333333334 642:83.63333333333334 643:83.63333333333334 644:81.33333333333333 645:81.33333333333333 646:81.33333333333333 647:81.33333333333333 648:90.33333333333333 649:90.33333333333333 650:90.33333333333333 651:90.33333333333333 652:89.53333333333333 653:90.73333333333333 654:92.43333333333334 655:93.73333333333333 656:93.08333333333333 657:93.03333333333333 658:93.13333333333334 659:93.13333333333334 660:83.08333333333333 661:79.43333333333334 662:74.38333333333334 663:70.78333333333333 664:68.78333333333333 665:67.93333333333334 666:66.63333333333334 667:65.63333333333334 668:67.63333333333334 669:71.03333333333333 670:76.18333333333334 671:79.63333333333334 672:86.03333333333333 673:85.03333333333333 674:83.48333333333333 675:82.33333333333333 676:84.63333333333334 677:81.13333333333334 678:76.08333333333333 679:72.63333333333334 680:72.33333333333333 681:75.93333333333334 682:81.03333333333333 683:84.78333333333333 684:78.08333333333333 685:81.83333333333333 686:86.78333333333333 687:90.38333333333334 688:91.63333333333334 689:90.68333333333334 690:89.08333333333333 691:87.93333333333334 692:87.38333333333334 693:87.58333333333333 694:87.53333333333333 695:87.53333333333333 696:85.73333333333333 697:85.73333333333333 698:85.73333333333333 699:85.73333333333333 700:87.73333333333333 701:86.43333333333334 702:84.83333333333333 703:83.68333333333334 704:90.33333333333333 705:91.53333333333333 706:93.08333333333333 707:94.28333333333333 708:87.83333333333333 709:87.83333333333333 710:87.83333333333333 711:87.83333333333333 712:86.03333333333333 713:86.03333333333333 714:86.03333333333333 715:86.03333333333333 716:83.63333333333334 717:83.58333333333333 718:83.48333333333333 719:83.43333333333334 720:77.43333333333334 721:77.53333333333333 722:77.58333333333333 723:77.63333333333334 724:72.58333333333333 725:72.63333333333334 726:72.53333333333333 727:72.33333333333333 728:86.48333333333333 729:87.58333333333333 730:89.08333333333333 731:90.33333333333333 732:90.23333333333333 733:90.23333333333333 734:90.23333333333333 735:90.23333333333333 736:88.23333333333333 737:88.23333333333333 738:88.23333333333333 739:88.23333333333333 740:84.93333333333334 741:84.93333333333334 742:84.93333333333334 743:84.93333333333334 744:82.73333333333333 745:83.38333333333334 746:84.18333333333334 747:84.83333333333333 748:87.23333333333333 749:87.23333333333333 750:87.23333333333333 751:87.23333333333333 752:86.93333333333334 753:88.08333333333333 754:89.83333333333333 755:90.88333333333334 756:86.83333333333333 757:83.48333333333333 758:78.38333333333334 759:74.53333333333333 760:82.63333333333334 761:82.63333333333334 762:82.63333333333334 763:82.63333333333334 764:84.18333333333334 765:86.53333333333333 766:89.88333333333334 767:92.28333333333333 768:86.28333333333333 769:86.38333333333334 770:86.23333333333333 771:86.33333333333333 772:85.83333333333333 773:85.98333333333333 774:85.93333333333334 775:86.03333333333333 776:84.03333333333333 777:79.23333333333333 778:72.63333333333334 779:67.78333333333333 780:68.63333333333334 781:68.63333333333334 782:68.63333333333334 783:68.63333333333334 784:69.23333333333333 785:69.23333333333333 786:69.23333333333333 787:69.23333333333333 788:73.83333333333333 789:73.98333333333333 790:73.83333333333333 791:73.78333333333333 792:67.33333333333333 793:66.78333333333333 794:65.88333333333334 795:65.28333333333333 796:70.58333333333333 797:70.63333333333334 798:70.68333333333334 799:70.83333333333333 +0 0:97.59999999999999 1:97.34999999999999 2:97.40000000000001 3:97.40000000000001 4:101.95 5:100.4666666666667 6:98.16666666666667 7:96.51666666666667 8:92.96666666666667 9:92.96666666666667 10:92.96666666666667 11:92.96666666666667 12:88.36666666666666 13:88.36666666666666 14:88.26666666666667 15:88.21666666666667 16:83.76666666666667 17:85.36666666666666 18:87.81666666666666 19:89.09999999999999 20:86.59999999999999 21:89.45 22:93.25 23:95.90000000000001 24:88.59999999999999 25:88.59999999999999 26:88.59999999999999 27:88.59999999999999 28:93.03333333333333 29:93.08333333333333 30:93.13333333333334 31:93.23333333333333 32:91.83333333333333 33:91.83333333333333 34:91.93333333333334 35:91.93333333333334 36:92.06666666666666 37:91.96666666666667 38:91.91666666666667 39:91.86666666666666 40:91.36666666666666 41:88.76666666666667 42:84.86666666666666 43:81.88333333333334 44:90.63333333333334 45:90.5 46:90.43333333333334 47:90.36666666666666 48:89.5 49:89.5 50:89.45 51:89.40000000000001 52:84.2 53:85.34999999999999 54:87.2 55:88.25 56:83.66666666666667 57:83.66666666666667 58:83.71666666666667 59:83.66666666666667 60:86.61666666666666 61:89.26666666666667 62:92.81666666666666 63:95.51666666666667 64:99.26666666666667 65:99.26666666666667 66:99.26666666666667 67:99.33333333333333 68:92.03333333333333 69:92.03333333333333 70:92.03333333333333 71:92.03333333333333 72:93.53333333333333 73:93.53333333333333 74:93.53333333333333 75:93.53333333333333 76:86.13333333333334 77:87.96666666666667 78:90.51666666666667 79:92.21666666666667 80:94.76666666666667 81:94.71666666666667 82:94.66666666666667 83:94.59999999999999 84:89.8 85:89.8 86:89.8 87:89.8 88:84.90000000000001 89:84.90000000000001 90:84.90000000000001 91:85.23333333333333 92:81.23333333333333 93:81.5 94:81.63333333333334 95:81.76666666666667 96:82.34999999999999 97:82.34999999999999 98:82.3 99:82.2 100:89.90000000000001 101:90.45 102:91.15000000000001 103:91.75 104:91.15000000000001 105:92.8 106:95.15000000000001 107:96.84999999999999 108:88.3 109:88.3 110:88.3 111:88.3 112:86.84999999999999 113:86.3 114:85.59999999999999 115:84.95 116:88 117:86.45 118:84.15000000000001 119:82.7 120:83.7 121:83.7 122:83.5 123:83.3 124:88.59999999999999 125:88.59999999999999 126:88.59999999999999 127:88.59999999999999 128:80.43333333333334 129:80.98333333333333 130:81.88333333333334 131:82.38333333333334 132:77.18333333333334 133:79.78333333333333 134:83.48333333333333 135:86.33333333333333 136:92.26666666666667 137:91.71666666666667 138:90.81666666666666 139:90.31666666666666 140:89.26666666666667 141:89.26666666666667 142:89.26666666666667 143:89.26666666666667 144:84.90000000000001 145:84.83333333333333 146:84.83333333333333 147:84.78333333333333 148:84.86666666666666 149:83.73333333333333 150:81.88333333333334 151:80.73333333333333 152:82.98333333333333 153:81.48333333333333 154:79.40000000000001 155:78.05 156:79.34999999999999 157:81.95 158:85.78333333333333 159:88.43333333333334 160:92.61666666666666 161:87.55 162:80.40000000000001 163:75.15000000000001 164:81.73333333333333 165:81.73333333333333 166:81.73333333333333 167:81.8 168:81.90000000000001 169:81.90000000000001 170:82.03333333333333 171:82.03333333333333 172:79.63333333333334 173:79.63333333333334 174:79.63333333333334 175:79.63333333333334 176:79.33333333333333 177:81.08333333333333 178:83.73333333333333 179:85.48333333333333 180:79.33333333333333 181:79.23333333333333 182:79.38333333333334 183:79.48333333333333 184:80.90000000000001 185:80.8 186:80.8 187:80.65000000000001 188:75.59999999999999 189:75.59999999999999 190:75.59999999999999 191:75.59999999999999 192:76.34999999999999 193:78.98333333333333 194:82.13333333333334 195:84.58333333333333 196:81.33333333333333 197:80.73333333333333 198:79.88333333333334 199:79.33333333333333 200:85.05 201:84.55 202:83.90000000000001 203:83.34999999999999 204:85.8 205:85.84999999999999 206:85.90000000000001 207:85.95 208:87.5 209:87.40000000000001 210:87.3 211:87.2 212:92 213:92.65000000000001 214:93.55 215:94.3 216:87.95 217:91.55 218:96.5 219:100.05 220:100.75 221:97.55 222:92.05 223:88.8 224:92.05 225:92.2 226:92.15000000000001 227:92.09999999999999 228:100.3833333333333 229:99.78333333333333 230:98.98333333333333 231:98.48333333333333 232:91.93333333333334 233:89.28333333333333 234:85.38333333333334 235:82.78333333333333 236:82.25 237:82.91666666666667 238:83.81666666666666 239:84.41666666666667 240:74.66666666666667 241:74.66666666666667 242:74.66666666666667 243:74.66666666666667 244:74.73333333333333 245:74.88333333333334 246:74.83333333333333 247:74.83333333333333 248:79.25 249:83.81666666666666 250:91.03333333333333 251:95.38333333333334 252:89.78333333333333 253:87.59999999999999 254:84.25 255:81.96666666666667 256:81.41666666666667 257:82.2 258:83.55 259:84.21666666666667 260:82.16666666666667 261:83.88333333333334 262:85.91666666666667 263:87.26666666666667 264:85.36666666666666 265:85.41666666666667 266:85.41666666666667 267:85.40000000000001 268:88 269:88.06666666666666 270:88.06666666666666 271:88.13333333333334 272:86.63333333333334 273:86.63333333333334 274:86.63333333333334 275:86.7 276:76.63333333333334 277:76.63333333333334 278:76.63333333333334 279:76.63333333333334 280:76.53333333333333 281:76.53333333333333 282:76.53333333333333 283:76.53333333333333 284:87.56666666666666 285:83.5 286:78.90000000000001 287:75.15000000000001 288:73.76666666666667 289:73.76666666666667 290:73.83333333333333 291:74.23333333333333 292:77.46666666666667 293:75.06666666666666 294:71.90000000000001 295:69.55 296:79.15000000000001 297:79.8 298:80.65000000000001 299:81.3 300:99.3 301:99.3 302:99.3 303:99.3 304:96.40000000000001 305:96.45 306:96.25 307:96.25 308:84.5 309:84.95 310:85.5 311:85.8 312:81.7 313:81.55 314:81.5 315:81.45 316:77.3 317:77.40000000000001 318:77.34999999999999 319:77.40000000000001 320:79.8 321:79.84999999999999 322:79.75 323:79.8 324:91.09999999999999 325:91.09999999999999 326:91.09999999999999 327:91.09999999999999 328:92.91666666666667 329:94.28333333333333 330:96.08333333333333 331:96.93333333333334 332:97.53333333333333 333:97.53333333333333 334:97.53333333333333 335:97.53333333333333 336:89.83333333333333 337:88.68333333333334 338:86.93333333333334 339:85.63333333333334 340:88.58333333333333 341:88.68333333333334 342:88.58333333333333 343:88.83333333333333 344:88.96666666666667 345:84.31666666666666 346:78.06666666666666 347:73.51666666666667 348:78.03333333333333 349:76.36666666666666 350:74.8 351:73.40000000000001 352:79.65000000000001 353:79.33333333333333 354:79.08333333333333 355:78.95 356:79.31666666666666 357:80.06666666666666 358:80.86666666666666 359:81.46666666666667 360:80.21666666666667 361:79.36666666666666 362:77.66666666666667 363:76.41666666666667 364:73.84999999999999 365:74.06666666666666 366:73.96666666666667 367:74.05 368:67.83333333333333 369:68.03333333333333 370:68.03333333333333 371:68.03333333333333 372:67.43333333333334 373:67.43333333333334 374:67.43333333333334 375:67.56666666666666 376:76.8 377:77 378:77 379:77.13333333333334 380:76.13333333333334 381:75.03333333333333 382:73.48333333333333 383:72.33333333333333 384:81.18333333333334 385:81.13333333333334 386:81.23333333333333 387:81.08333333333333 388:85.06666666666666 389:85.06666666666666 390:85.26666666666667 391:85.26666666666667 392:81.53333333333333 393:81.53333333333333 394:81.53333333333333 395:81.53333333333333 396:78.63333333333334 397:78.63333333333334 398:78.63333333333334 399:78.63333333333334 400:89.55 401:91.40000000000001 402:93.95 403:95.59999999999999 404:94.7 405:94.75 406:94.8 407:94.8 408:99.65000000000001 409:93.90000000000001 410:85.75 411:80 412:90.59999999999999 413:90.59999999999999 414:90.65000000000001 415:90.7 416:83.59999999999999 417:83.59999999999999 418:83.59999999999999 419:83.59999999999999 420:78.8 421:77 422:74.5 423:72.7 424:74 425:74 426:74 427:74 428:71.05 429:71.7 430:72.45 431:72.95 432:72.15000000000001 433:74.75 434:78.34999999999999 435:81.16666666666667 436:81.48333333333333 437:82.68333333333334 438:84.28333333333333 439:85.28333333333333 440:84.23333333333333 441:84.18333333333334 442:84.2 443:84.15000000000001 444:76.36666666666666 445:75.31666666666666 446:74 447:72.84999999999999 448:69.11666666666666 449:70.31666666666666 450:72.11666666666666 451:73.46666666666667 452:72.06666666666666 453:72.01666666666667 454:71.96666666666667 455:71.90000000000001 456:69.31666666666666 457:71.41666666666667 458:74.56666666666666 459:76.56666666666666 460:71.96666666666667 461:73.21666666666667 462:74.71666666666667 463:75.91666666666667 464:75.8 465:75.8 466:75.8 467:75.86666666666666 468:77.46666666666667 469:77.46666666666667 470:77.36666666666666 471:77.56666666666666 472:74.56666666666666 473:74.56666666666666 474:74.56666666666666 475:74.56666666666666 476:73.91666666666667 477:75.61666666666666 478:78.21666666666667 479:79.86666666666666 480:83.11666666666666 481:82.61666666666666 482:81.61666666666666 483:80.8 484:70.98333333333333 485:72.73333333333333 486:74.93333333333334 487:76.58333333333333 488:71.90000000000001 489:72 490:72 491:71.90000000000001 492:74.7 493:74.7 494:74.75 495:74.7 496:75.09999999999999 497:75.15000000000001 498:75.09999999999999 499:75.05 500:82.53333333333333 501:84.28333333333333 502:86.88333333333334 503:88.96666666666667 504:85.5 505:86.7 506:88.5 507:89.59999999999999 508:79.95 509:78.15000000000001 510:75.5 511:73.65000000000001 512:69.34999999999999 513:72.09999999999999 514:75.90000000000001 515:78.7 516:79.5 517:79.40000000000001 518:79.40000000000001 519:79.5 520:72.90000000000001 521:71.25 522:68.34999999999999 523:66.7 524:78.09999999999999 525:78.25 526:78.3 527:78.3 528:80.84999999999999 529:79.75 530:78.25 531:77.3 532:74.75 533:75.75 534:77.25 535:78.09999999999999 536:78.58333333333333 537:79.8 538:81.55 539:82.7 540:83.83333333333333 541:81.13333333333334 542:77.38333333333334 543:75.06666666666666 544:75.45 545:75.01666666666667 546:74.41666666666667 547:74.13333333333334 548:73.15000000000001 549:76 550:79.65000000000001 551:82.36666666666666 552:78.56666666666666 553:78.21666666666667 554:78.38333333333334 555:78.13333333333334 556:76.26666666666667 557:74.71666666666667 558:72.26666666666667 559:70.61666666666666 560:71.26666666666667 561:71.40000000000001 562:71.46666666666667 563:71.46666666666667 564:74.93333333333334 565:74.93333333333334 566:74.93333333333334 567:75 568:72.21666666666667 569:71.61666666666666 570:70.61666666666666 571:70.11666666666666 572:68.36666666666666 573:68.36666666666666 574:68.36666666666666 575:68.36666666666666 576:70.16666666666667 577:72.71666666666667 578:77.31666666666666 579:80.11666666666666 580:74.16666666666667 581:72.31666666666666 582:69.66666666666667 583:67.96666666666667 584:72.53333333333333 585:70.61666666666666 586:68.46666666666667 587:67.06666666666666 588:62.38333333333333 589:65.08333333333333 590:68.7 591:71.36666666666666 592:75.68333333333334 593:75.96666666666667 594:76.7 595:77.2 596:73.51666666666667 597:73.06666666666666 598:72.01666666666667 599:71.36666666666666 600:78.83333333333333 601:78.88333333333334 602:79.03333333333333 603:79.13333333333334 604:83 605:78.2 606:71.25 607:66.40000000000001 608:72 609:72 610:72 611:72 612:70.40000000000001 613:71.3 614:72.59999999999999 615:73.40000000000001 616:64.15000000000001 617:68.15000000000001 618:74.05 619:78.05 620:78.5 621:78.5 622:78.5 623:78.5 624:75.75 625:75.75 626:75.7 627:75.7 628:67.09999999999999 629:66.40000000000001 630:65.55 631:64.95 632:68.3 633:64.8 634:59.6 635:56.1 636:48.8 637:47.85 638:46.25 639:44.95 640:52.95 641:52 642:50.7 643:49.7 644:54.23333333333333 645:53.08333333333334 646:51.28333333333333 647:50.03333333333333 648:58.11666666666667 649:62.13333333333333 650:68.93333333333334 651:72.7 652:75.25 653:74.28333333333333 654:74.58333333333333 655:74.25 656:72.38333333333334 657:71.43333333333334 658:70.26666666666667 659:69.8 660:69.40000000000001 661:69.73333333333333 662:69.73333333333333 663:69.73333333333333 664:68.43333333333334 665:68.43333333333334 666:68.43333333333334 667:68.43333333333334 668:68.56666666666666 669:69.11666666666666 670:69.96666666666667 671:70.51666666666667 672:71.15000000000001 673:71.25 674:71.15000000000001 675:71.05 676:74.65000000000001 677:73.34999999999999 678:71.95 679:70.7 680:66.34999999999999 681:66.25 682:66.34999999999999 683:66.40000000000001 684:59.55 685:59.6 686:59.6 687:59.4 688:54.76666666666667 689:55.76666666666667 690:57.06666666666667 691:57.91666666666666 692:55.36666666666667 693:54.78333333333333 694:53.93333333333333 695:53.38333333333333 696:51.83333333333334 697:52.48333333333333 698:53.33333333333334 699:53.98333333333333 700:68.48333333333333 701:71.83333333333333 702:76.68333333333334 703:80.08333333333333 704:78 705:78 706:78 707:78 708:78.09999999999999 709:78.75 710:79.59999999999999 711:80.15000000000001 712:79.34999999999999 713:75.3 714:68.40000000000001 715:64.2 716:64.3 717:64.2 718:64.15000000000001 719:64.15000000000001 720:65 721:65 722:65 723:65 724:57.6 725:56.65 726:55.6 727:54.5 728:57.5 729:57.5 730:57.5 731:57.5 732:54.5 733:54.5 734:54.5 735:54.55 736:59.6 737:60.9 738:62.55 739:63.85 740:57.55 741:58.8 742:60.5 743:61.7 744:59.5 745:59.41666666666666 746:59.36666666666667 747:59.36666666666667 748:54.48333333333333 749:54.36666666666667 750:54.6 751:54.55 752:56.9 753:56.9 754:56.96666666666667 755:56.83333333333334 756:65.56666666666666 757:65.7 758:65.7 759:65.76666666666667 760:64.09999999999999 761:64.23333333333333 762:64.23333333333333 763:64.23333333333333 764:65.33333333333333 765:65.33333333333333 766:65.33333333333333 767:65.33333333333333 768:67.13333333333334 769:67.2 770:67.2 771:67.2 772:67.53333333333333 773:67.48333333333333 774:67.43333333333334 775:67.33333333333333 776:63.23333333333333 777:63.23333333333333 778:63.23333333333333 779:63.23333333333333 780:67.83333333333333 781:67.78333333333333 782:67.73333333333333 783:67.63333333333334 784:70.78333333333333 785:70.73333333333333 786:70.73333333333333 787:70.83333333333333 788:73 789:73 790:73 791:72.93333333333334 792:74.53333333333333 793:73.48333333333333 794:71.63333333333334 795:70.48333333333333 796:67.73333333333333 797:67.48333333333333 798:67.28333333333333 799:67.08333333333333 +0 0:86.36666666666666 1:86.36666666666666 2:86.36666666666666 3:86.36666666666666 4:82.76666666666667 5:82.76666666666667 6:82.76666666666667 7:82.76666666666667 8:88.03333333333333 9:88.03333333333333 10:88.03333333333333 11:88.03333333333333 12:91.73333333333333 13:91.73333333333333 14:91.73333333333333 15:91.73333333333333 16:91.06666666666666 17:91.06666666666666 18:91.06666666666666 19:91.06666666666666 20:92.16666666666667 21:92.11666666666666 22:92.21666666666667 23:92.11666666666666 24:89.09999999999999 25:89.09999999999999 26:89.09999999999999 27:89.09999999999999 28:84.7 29:84.7 30:84.7 31:84.7 32:87.5 33:87.5 34:87.5 35:87.5 36:84.8 37:84.8 38:84.8 39:84.8 40:79.40000000000001 41:79.40000000000001 42:79.40000000000001 43:79.40000000000001 44:76.5 45:76.5 46:76.5 47:76.5 48:76.09999999999999 49:77.3 50:79.09999999999999 51:80.40000000000001 52:83.3 53:83.3 54:83.3 55:83.3 56:84.66666666666667 57:84.66666666666667 58:84.71666666666667 59:84.76666666666667 60:85.26666666666667 61:85.26666666666667 62:85.26666666666667 63:85.16666666666667 64:89.26666666666667 65:89.16666666666667 66:89.16666666666667 67:89.16666666666667 68:88.66666666666667 69:88.66666666666667 70:88.66666666666667 71:88.68333333333334 72:97.3 73:94.51666666666667 74:90.76666666666667 75:88.01666666666667 76:85.86666666666666 77:85.86666666666666 78:85.86666666666666 79:85.86666666666666 80:80.76666666666667 81:80.76666666666667 82:80.76666666666667 83:80.76666666666667 84:85.06666666666666 85:88.31666666666666 86:92.01666666666667 87:95.16666666666667 88:90.46666666666667 89:90.46666666666667 90:90.46666666666667 91:90.46666666666667 92:90.76666666666667 93:90.76666666666667 94:90.76666666666667 95:90.76666666666667 96:84.46666666666667 97:84.46666666666667 98:84.46666666666667 99:84.46666666666667 100:81.16666666666667 101:81.21666666666667 102:81.31666666666666 103:81.31666666666666 104:74.76666666666667 105:74.76666666666667 106:74.76666666666667 107:74.76666666666667 108:77.83333333333333 109:77.83333333333333 110:77.83333333333333 111:77.83333333333333 112:77.63333333333334 113:77.63333333333334 114:77.63333333333334 115:77.63333333333334 116:79.66666666666667 117:79.66666666666667 118:79.66666666666667 119:79.66666666666667 120:79.61666666666666 121:79.46666666666667 122:79.76666666666667 123:79.76666666666667 124:79.7 125:79.7 126:79.7 127:79.7 128:75.75 129:75.5 130:75.65000000000001 131:75.5 132:85 133:85 134:85 135:85 136:82.7 137:82.7 138:82.7 139:82.7 140:89.09999999999999 141:89.09999999999999 142:89.09999999999999 143:89.09999999999999 144:84.3 145:84.40000000000001 146:84.65000000000001 147:84.65000000000001 148:85.95 149:84.55 150:82.84999999999999 151:81.65000000000001 152:75.90000000000001 153:75.90000000000001 154:75.90000000000001 155:75.90000000000001 156:74.45 157:78 158:83.05 159:86.59999999999999 160:85.90000000000001 161:85.90000000000001 162:85.90000000000001 163:85.73333333333333 164:83 165:82.68333333333334 166:82.78333333333333 167:82.73333333333333 168:83.03333333333333 169:83.03333333333333 170:83.03333333333333 171:83.03333333333333 172:87.28333333333333 173:86.40000000000001 174:85.15000000000001 175:84.2 176:85.40000000000001 177:85.40000000000001 178:85.34999999999999 179:85.3 180:89.2 181:89.2 182:89.2 183:89.2 184:84.2 185:85 186:86.3 187:87.2 188:82.8 189:82.8 190:82.8 191:82.8 192:87.2 193:87.2 194:87.2 195:87.18333333333334 196:85.76666666666667 197:85.76666666666667 198:85.76666666666667 199:85.76666666666667 200:83.36666666666666 201:87.01666666666667 202:92.01666666666667 203:95.61666666666666 204:92.46666666666667 205:91.26666666666667 206:89.51666666666667 207:88.36666666666666 208:86.33333333333333 209:86.33333333333333 210:86.33333333333333 211:86.33333333333333 212:90.23333333333333 213:90.23333333333333 214:90.23333333333333 215:90.23333333333333 216:88.96666666666667 217:88.96666666666667 218:88.96666666666667 219:88.96666666666667 220:93.16666666666667 221:89.81666666666666 222:84.26666666666667 223:80.86666666666666 224:88.96666666666667 225:88.96666666666667 226:88.96666666666667 227:88.96666666666667 228:88.31666666666666 229:87.21666666666667 230:85.46666666666667 231:84.31666666666666 232:86.06666666666666 233:86.06666666666666 234:86.06666666666666 235:86.06666666666666 236:86.16666666666667 237:86.16666666666667 238:86.16666666666667 239:86.16666666666667 240:87.31666666666666 241:88.36666666666666 242:89.86666666666666 243:90.96666666666667 244:94.16666666666667 245:94.21666666666667 246:94.26666666666667 247:94.21666666666667 248:83.96666666666667 249:84.01666666666667 250:84.16666666666667 251:84.06666666666666 252:81.86666666666666 253:81.31666666666666 254:80.46666666666667 255:79.86666666666666 256:82.8 257:82.90000000000001 258:82.90000000000001 259:82.95 260:85.7 261:84.8 262:83.45 263:82.43333333333334 264:84.09999999999999 265:83.88333333333334 266:83.83333333333333 267:83.83333333333333 268:81.93333333333334 269:81.93333333333334 270:81.93333333333334 271:81.93333333333334 272:85.84999999999999 273:82.34999999999999 274:77.3 275:73.65000000000001 276:76.15000000000001 277:76.2 278:76.15000000000001 279:76.15000000000001 280:74.56666666666666 281:74.56666666666666 282:74.56666666666666 283:74.56666666666666 284:80.36666666666666 285:80.36666666666666 286:80.36666666666666 287:80.36666666666666 288:86.46666666666667 289:86.46666666666667 290:86.46666666666667 291:86.46666666666667 292:86.56666666666666 293:86.56666666666666 294:86.56666666666666 295:86.56666666666666 296:87.65000000000001 297:87.63333333333334 298:87.63333333333334 299:87.63333333333334 300:78.96666666666667 301:79.06666666666666 302:79.06666666666666 303:79.06666666666666 304:78.11666666666666 305:79.41666666666667 306:81.11666666666666 307:82.41666666666667 308:81.53333333333333 309:85.28333333333333 310:90.48333333333333 311:94.28333333333333 312:85.08333333333333 313:85.13333333333334 314:85.13333333333334 315:85.18333333333334 316:85.56666666666666 317:85.56666666666666 318:85.56666666666666 319:85.56666666666666 320:86.76666666666667 321:86.81666666666666 322:86.76666666666667 323:86.76666666666667 324:91.16666666666667 325:91.16666666666667 326:91.16666666666667 327:91.16666666666667 328:93.06666666666666 329:94.21666666666667 330:95.86666666666666 331:97.16666666666667 332:92.46666666666667 333:92.46666666666667 334:92.46666666666667 335:92.46666666666667 336:92.71666666666667 337:94.41666666666667 338:96.71666666666667 339:98.41666666666667 340:103.3666666666667 341:102.1666666666667 342:100.3166666666667 343:99.21666666666667 344:97.06666666666666 345:97.06666666666666 346:97.06666666666666 347:97.06666666666666 348:96.16666666666667 349:94.61666666666666 350:92.26666666666667 351:90.51666666666667 352:89.11666666666666 353:87.96666666666667 354:86.31666666666666 355:85.01666666666667 356:88.16666666666667 357:88.16666666666667 358:88.16666666666667 359:88.16666666666667 360:86.36666666666666 361:85.46666666666667 362:84.16666666666667 363:82.93333333333334 364:85.73333333333333 365:85.63333333333334 366:85.63333333333334 367:85.63333333333334 368:87.33333333333333 369:87.33333333333333 370:87.33333333333333 371:87.33333333333333 372:84.51666666666667 373:84.31666666666666 374:84.06666666666666 375:83.66666666666667 376:84.46666666666667 377:84.56666666666666 378:84.56666666666666 379:84.56666666666666 380:89.26666666666667 381:89.26666666666667 382:89.26666666666667 383:89.26666666666667 384:87.66666666666667 385:87.66666666666667 386:87.66666666666667 387:87.66666666666667 388:85.68333333333334 389:83.98333333333333 390:81.68333333333334 391:79.98333333333333 392:85.23333333333333 393:85.23333333333333 394:85.23333333333333 395:85.23333333333333 396:82.43333333333334 397:82.43333333333334 398:82.43333333333334 399:82.43333333333334 400:81.46666666666667 401:81.46666666666667 402:81.46666666666667 403:81.46666666666667 404:80.66666666666667 405:80.66666666666667 406:80.66666666666667 407:80.66666666666667 408:77.53333333333333 409:77.83333333333333 410:78.43333333333334 411:78.68333333333334 412:74.13333333333334 413:76.83333333333333 414:80.48333333333333 415:83.33333333333333 416:83.46666666666667 417:83.46666666666667 418:83.46666666666667 419:83.46666666666667 420:85.16666666666667 421:85.16666666666667 422:85.16666666666667 423:85.16666666666667 424:82.16666666666667 425:82.16666666666667 426:82.16666666666667 427:82.16666666666667 428:83.76666666666667 429:85.11666666666666 430:87.26666666666667 431:88.81666666666666 432:86.46666666666667 433:86.46666666666667 434:86.46666666666667 435:86.46666666666667 436:92.51666666666667 437:90.21666666666667 438:87.16666666666667 439:84.81666666666666 440:82.66666666666667 441:82.66666666666667 442:82.66666666666667 443:82.66666666666667 444:80.46666666666667 445:80.46666666666667 446:80.46666666666667 447:80.46666666666667 448:86.16666666666667 449:87.86666666666666 450:90.21666666666667 451:91.76666666666667 452:93.06666666666666 453:91.16666666666667 454:88.71666666666667 455:86.91666666666667 456:86.36666666666666 457:86.31666666666666 458:86.26666666666667 459:86.26666666666667 460:89.21666666666667 461:87.51666666666667 462:85.11666666666666 463:83.56666666666666 464:84.8 465:84.8 466:84.8 467:84.8 468:86.5 469:86.5 470:86.5 471:86.5 472:89.66666666666667 473:88.46666666666667 474:87.16666666666667 475:86.11666666666666 476:84.56666666666666 477:84.56666666666666 478:84.56666666666666 479:84.56666666666666 480:84.66666666666667 481:84.66666666666667 482:84.66666666666667 483:84.66666666666667 484:81.86666666666666 485:81.86666666666666 486:81.86666666666666 487:81.86666666666666 488:77.28333333333333 489:78.98333333333333 490:81.28333333333333 491:82.98333333333333 492:76.93333333333334 493:76.93333333333334 494:76.93333333333334 495:76.93333333333334 496:78.93333333333334 497:78.93333333333334 498:78.93333333333334 499:78.93333333333334 500:78.96666666666667 501:78.96666666666667 502:78.96666666666667 503:78.96666666666667 504:80.96666666666667 505:80.96666666666667 506:80.96666666666667 507:80.96666666666667 508:80.98333333333333 509:80.83333333333333 510:80.88333333333334 511:80.88333333333334 512:84.58333333333333 513:85.58333333333333 514:86.88333333333334 515:87.63333333333334 516:83.59999999999999 517:83.59999999999999 518:83.5 519:83.5 520:78.75 521:78.75 522:78.8 523:78.84999999999999 524:78.06666666666666 525:77.96666666666667 526:77.96666666666667 527:77.91666666666667 528:78.61666666666666 529:80.71666666666667 530:83.61666666666666 531:85.66666666666667 532:86.16666666666667 533:86.16666666666667 534:86.16666666666667 535:86.16666666666667 536:83.76666666666667 537:84.41666666666667 538:85.16666666666667 539:85.96666666666667 540:84.86666666666666 541:84.86666666666666 542:84.91666666666667 543:84.86666666666666 544:89.16666666666667 545:89.16666666666667 546:89.16666666666667 547:89.16666666666667 548:83.46666666666667 549:83.51666666666667 550:83.46666666666667 551:83.46666666666667 552:87.26666666666667 553:87.26666666666667 554:87.26666666666667 555:87.26666666666667 556:90.86666666666666 557:87.21666666666667 558:82.06666666666666 559:78.41666666666667 560:80.06666666666666 561:80.06666666666666 562:80.01666666666667 563:79.86666666666666 564:82.83333333333333 565:82.73333333333333 566:82.68333333333334 567:82.73333333333333 568:76.03333333333333 569:76.03333333333333 570:76.03333333333333 571:76.03333333333333 572:77.03333333333333 573:74.68333333333334 574:71.38333333333334 575:69.03333333333333 576:62.93333333333333 577:62.93333333333333 578:62.93333333333333 579:62.93333333333333 580:75.93333333333334 581:75.93333333333334 582:75.98333333333333 583:75.83333333333333 584:79.63333333333334 585:79.63333333333334 586:79.63333333333334 587:79.61666666666666 588:83.41666666666667 589:83.40000000000001 590:83.40000000000001 591:83.40000000000001 592:77.59999999999999 593:81.05 594:86 595:89.65000000000001 596:91.2 597:91.2 598:91.2 599:91.2 600:69.26666666666667 601:69.26666666666667 602:69.26666666666667 603:69.26666666666667 604:73.36666666666666 605:73.36666666666666 606:73.36666666666666 607:73.36666666666666 608:72.75 609:72.8 610:72.8 611:72.8 612:75.09999999999999 613:75.15000000000001 614:75.25 615:75.34999999999999 616:68.28333333333333 617:68.13333333333334 618:68.18333333333334 619:68.18333333333334 620:69.43333333333334 621:69.38333333333334 622:69.38333333333334 623:69.33333333333333 624:76.76666666666667 625:73.26666666666667 626:68.31666666666666 627:64.61666666666666 628:63.26666666666667 629:63.26666666666667 630:63.26666666666667 631:63.26666666666667 632:67.06666666666666 633:67.06666666666666 634:67.06666666666666 635:67.06666666666666 636:63.01666666666667 637:66.86666666666666 638:71.91666666666667 639:75.56666666666666 640:68.81666666666666 641:68.81666666666666 642:68.81666666666666 643:68.86666666666666 644:70.76666666666667 645:72.81666666666666 646:75.61666666666666 647:77.76666666666667 648:75.51666666666667 649:75.56666666666666 650:75.61666666666666 651:75.61666666666666 652:74.36666666666666 653:74.36666666666666 654:74.36666666666666 655:74.36666666666666 656:70.36666666666666 657:70.36666666666666 658:70.36666666666666 659:70.46666666666667 660:67.51666666666667 661:67.46666666666667 662:67.71666666666667 663:67.76666666666667 664:65.21666666666667 665:65.46666666666667 666:65.61666666666666 667:65.61666666666666 668:67.86666666666666 669:67.86666666666666 670:67.86666666666666 671:67.86666666666666 672:64.56666666666666 673:64.56666666666666 674:64.56666666666666 675:64.56666666666666 676:64.06666666666666 677:64.06666666666666 678:64.06666666666666 679:64.06666666666666 680:60.16666666666666 681:60.16666666666666 682:60.26666666666667 683:60.26666666666667 684:64.36666666666666 685:65.31666666666666 686:66.96666666666667 687:68.16666666666667 688:67.8 689:67.8 690:67.8 691:67.8 692:65.7 693:65.8 694:65.84999999999999 695:65.8 696:68.96666666666667 697:68.96666666666667 698:68.96666666666667 699:68.96666666666667 700:72.41666666666667 701:73.91666666666667 702:76.06666666666666 703:77.66666666666667 704:71.66666666666667 705:71.66666666666667 706:71.66666666666667 707:71.66666666666667 708:75.36666666666666 709:75.36666666666666 710:75.36666666666666 711:75.36666666666666 712:70.26666666666667 713:70.26666666666667 714:70.26666666666667 715:70.26666666666667 716:67.08333333333333 717:67.03333333333333 718:67.23333333333333 719:67.18333333333334 720:74.03333333333333 721:74.03333333333333 722:74.03333333333333 723:74.03333333333333 724:73.96666666666667 725:73.96666666666667 726:73.86666666666666 727:73.86666666666666 728:73.66666666666667 729:73.66666666666667 730:73.66666666666667 731:73.66666666666667 732:72.86666666666666 733:72.86666666666666 734:72.86666666666666 735:72.86666666666666 736:78.11666666666666 737:78.06666666666666 738:78.06666666666666 739:78.06666666666666 740:83.66666666666667 741:83.66666666666667 742:83.66666666666667 743:83.66666666666667 744:88.11666666666666 745:86.16666666666667 746:83.26666666666667 747:81.26666666666667 748:76.06666666666666 749:76.06666666666666 750:76.06666666666666 751:76.06666666666666 752:74.56666666666666 753:74.56666666666666 754:74.56666666666666 755:74.56666666666666 756:72.66666666666667 757:74.41666666666667 758:77.01666666666667 759:78.76666666666667 760:73.91666666666667 761:72.16666666666667 762:69.56666666666666 763:67.66666666666667 764:67.61666666666666 765:69.46666666666667 766:72.01666666666667 767:73.91666666666667 768:73.46666666666667 769:73.46666666666667 770:73.46666666666667 771:73.46666666666667 772:75.53333333333333 773:73.78333333333333 774:71.23333333333333 775:69.33333333333333 776:71.73333333333333 777:71.73333333333333 778:71.73333333333333 779:71.73333333333333 780:73.23333333333333 781:73.23333333333333 782:73.23333333333333 783:73.23333333333333 784:74.68333333333334 785:73.73333333333333 786:72.08333333333333 787:70.63333333333334 788:76.03333333333333 789:76.98333333333333 790:78.23333333333333 791:78.98333333333333 792:74.03333333333333 793:74.03333333333333 794:74.03333333333333 795:74.03333333333333 796:70.16666666666667 797:70.16666666666667 798:70.16666666666667 799:70.11666666666666 +0 0:101.5 1:101.5 2:101.5 3:101.5 4:105.6666666666667 5:105.6666666666667 6:105.6666666666667 7:105.6666666666667 8:105.8666666666667 9:105.8666666666667 10:105.8666666666667 11:105.8666666666667 12:107.2666666666667 13:107.2666666666667 14:107.2666666666667 15:107.2666666666667 16:103.4666666666667 17:103.4666666666667 18:103.4666666666667 19:103.4666666666667 20:108.6333333333333 21:108.6333333333333 22:108.6333333333333 23:108.6333333333333 24:105.0333333333333 25:105.0333333333333 26:105.0333333333333 27:105.0333333333333 28:104.9333333333333 29:104.9333333333333 30:104.9333333333333 31:104.9333333333333 32:106.6333333333333 33:106.6333333333333 34:106.6333333333333 35:106.6333333333333 36:105.6333333333333 37:105.6333333333333 38:105.6333333333333 39:105.5 40:103.6333333333333 41:103.6333333333333 42:103.6333333333333 43:103.6333333333333 44:104.9333333333333 45:104.9333333333333 46:104.9333333333333 47:104.9333333333333 48:105.8333333333333 49:105.8333333333333 50:105.8333333333333 51:105.8333333333333 52:103.2333333333333 53:103.2333333333333 54:103.2333333333333 55:103.2333333333333 56:100.7333333333333 57:100.7333333333333 58:100.7333333333333 59:100.7333333333333 60:100.9333333333333 61:100.9333333333333 62:100.9333333333333 63:100.9333333333333 64:95.33333333333333 65:95.33333333333333 66:95.33333333333333 67:95.33333333333333 68:93.63333333333334 69:93.63333333333334 70:93.63333333333334 71:93.63333333333334 72:98.13333333333334 73:98.13333333333334 74:98.13333333333334 75:98.13333333333334 76:99.2 77:99.2 78:99.2 79:99.2 80:100.0666666666667 81:100.0666666666667 82:100 83:100 84:100.8 85:100.8 86:100.8666666666667 87:100.85 88:98.90000000000001 89:98.86666666666666 90:98.86666666666666 91:98.86666666666666 92:97.73333333333333 93:97.73333333333333 94:97.73333333333333 95:97.73333333333333 96:97 97:97 98:97 99:96.86666666666666 100:101.4333333333333 101:101.5 102:101.5 103:101.5 104:106 105:106.0666666666667 106:106.0666666666667 107:106.0666666666667 108:105.4 109:105.4 110:105.4 111:105.4 112:108.8 113:107.7 114:105.9 115:104.75 116:101.9 117:101.9 118:101.9 119:101.9 120:104.4 121:104.4 122:104.4 123:104.4 124:105.3666666666667 125:105.3666666666667 126:105.3666666666667 127:105.3666666666667 128:103.6666666666667 129:103.6666666666667 130:103.6666666666667 131:103.6666666666667 132:108.9333333333333 133:108.9333333333333 134:108.8666666666667 135:108.8 136:107.8666666666667 137:107.8666666666667 138:107.8666666666667 139:107.8666666666667 140:101.7333333333333 141:101.7333333333333 142:101.7333333333333 143:101.7333333333333 144:100.1333333333333 145:100.1333333333333 146:100.1333333333333 147:100.1333333333333 148:102.9333333333333 149:102.9333333333333 150:102.9333333333333 151:102.9333333333333 152:105.4333333333333 153:105.4333333333333 154:105.4333333333333 155:105.4333333333333 156:108.3333333333333 157:108.3333333333333 158:108.3333333333333 159:108.3333333333333 160:107.1333333333333 161:107.1333333333333 162:107.1333333333333 163:107.1333333333333 164:104.3333333333333 165:104.3333333333333 166:104.3333333333333 167:104.3333333333333 168:101.2333333333333 169:101.2333333333333 170:101.2333333333333 171:101.5 172:101.4666666666667 173:101.4666666666667 174:101.4666666666667 175:101.4666666666667 176:104.4666666666667 177:104.5666666666667 178:104.4666666666667 179:104.3833333333333 180:101.1166666666667 181:101.1333333333333 182:101.1 183:100.75 184:99.25 185:98.98333333333333 186:98.93333333333334 187:98.93333333333334 188:99.09999999999999 189:99.16666666666667 190:99.23333333333333 191:99.55 192:98.08333333333333 193:98.25 194:98.45 195:98.65000000000001 196:102.3666666666667 197:102.2333333333333 198:102.2333333333333 199:102.1 200:100.25 201:100.2 202:100.15 203:100.3666666666667 204:101.1333333333333 205:101.1333333333333 206:101.1333333333333 207:101.15 208:104.8 209:104.85 210:104.85 211:104.85 212:100.75 213:102 214:103.7 215:104.85 216:102.65 217:102.65 218:102.65 219:102.65 220:100.65 221:100.65 222:100.65 223:100.65 224:103.95 225:103.95 226:103.95 227:103.95 228:104.95 229:104.95 230:104.95 231:104.95 232:100 233:99.95 234:99.95 235:99.8 236:88.41666666666667 237:88.41666666666667 238:88.41666666666667 239:88.41666666666667 240:96.36666666666666 241:96.36666666666666 242:96.36666666666666 243:96.36666666666666 244:95.56666666666666 245:95.56666666666666 246:95.56666666666666 247:95.56666666666666 248:96.63333333333334 249:96.63333333333334 250:96.63333333333334 251:96.63333333333334 252:95.43333333333334 253:95.43333333333334 254:95.43333333333334 255:95.43333333333334 256:96.63333333333334 257:96.63333333333334 258:96.63333333333334 259:96.63333333333334 260:100.4333333333333 261:100.4333333333333 262:100.4333333333333 263:100.4333333333333 264:100.8333333333333 265:100.8333333333333 266:100.8333333333333 267:100.8333333333333 268:93.71666666666667 269:93.56666666666666 270:93.65000000000001 271:93.5 272:97.76666666666667 273:97.91666666666667 274:97.76666666666667 275:97.96666666666667 276:95.56666666666666 277:95.56666666666666 278:95.56666666666666 279:95.65000000000001 280:97.26666666666667 281:97.76666666666667 282:97.7 283:97.13333333333334 284:95.63333333333334 285:95.05 286:95.09999999999999 287:95.43333333333334 288:96.09999999999999 289:96.09999999999999 290:96.09999999999999 291:96.76666666666667 292:86.01666666666667 293:89.75 294:95.09999999999999 295:98.40000000000001 296:100.8 297:100.8 298:100.8 299:100.8 300:94.3 301:95.55 302:97.2 303:98.45 304:98.45 305:99.08333333333333 306:99.98333333333333 307:100.7333333333333 308:97.03333333333333 309:97.03333333333333 310:97.03333333333333 311:97.03333333333333 312:95.45 313:92.05 314:86.90000000000001 315:83.40000000000001 316:85.40000000000001 317:85.40000000000001 318:85.40000000000001 319:85.40000000000001 320:88.73333333333333 321:88.73333333333333 322:88.73333333333333 323:88.73333333333333 324:93.13333333333334 325:93.13333333333334 326:93.13333333333334 327:93.13333333333334 328:97.13333333333334 329:97.13333333333334 330:97.13333333333334 331:97.13333333333334 332:100.6333333333333 333:97.08333333333333 334:91.98333333333333 335:88.38333333333334 336:95.63333333333334 337:95.63333333333334 338:95.63333333333334 339:95.63333333333334 340:96.16666666666667 341:96.16666666666667 342:96.16666666666667 343:96.16666666666667 344:97.73333333333333 345:97.73333333333333 346:97.73333333333333 347:97.73333333333333 348:96.73333333333333 349:96.73333333333333 350:96.73333333333333 351:96.73333333333333 352:101.3333333333333 353:101.3333333333333 354:101.4 355:101.5333333333333 356:94.09999999999999 357:94.09999999999999 358:94.09999999999999 359:94.3 360:98.46666666666667 361:98.46666666666667 362:98.46666666666667 363:98.46666666666667 364:95.26666666666667 365:95.26666666666667 366:95.26666666666667 367:94.93333333333334 368:101.1666666666667 369:99.83333333333333 370:98 371:96.8 372:93.13333333333334 373:96.08333333333333 374:100.3166666666667 375:102.9833333333333 376:99.73333333333333 377:99.73333333333333 378:99.83333333333333 379:99.83333333333333 380:97.83333333333333 381:97.03333333333333 382:95.76666666666667 383:94.88333333333334 384:97.90000000000001 385:97.83333333333333 386:97.90000000000001 387:98.03333333333333 388:91.59999999999999 389:92.90000000000001 390:94.5 391:95.78333333333333 392:93.66666666666667 393:92.63333333333334 394:90.98333333333333 395:89.68333333333334 396:93.46666666666667 397:93.46666666666667 398:93.46666666666667 399:93.46666666666667 400:96.65000000000001 401:95.5 402:93.75 403:92.55 404:98.91666666666667 405:98.16666666666667 406:97.16666666666667 407:96.56666666666666 408:92.11666666666666 409:95.86666666666666 410:100.8666666666667 411:104.5666666666667 412:98.43333333333334 413:98.43333333333334 414:98.43333333333334 415:98.43333333333334 416:98.73333333333333 417:101.1833333333333 418:104.8333333333333 419:107.2833333333333 420:96.16666666666667 421:96.16666666666667 422:96.16666666666667 423:96.16666666666667 424:93.26666666666667 425:93.26666666666667 426:93.26666666666667 427:93.26666666666667 428:88.06666666666666 429:88.06666666666666 430:88.06666666666666 431:88.06666666666666 432:98.16666666666667 433:98.16666666666667 434:98.16666666666667 435:98.16666666666667 436:92.13333333333334 437:92.23333333333333 438:92.23333333333333 439:92.23333333333333 440:87.53333333333333 441:87.53333333333333 442:87.59999999999999 443:87.59999999999999 444:93.36666666666666 445:93.36666666666666 446:93.43333333333334 447:93.43333333333334 448:94.26666666666667 449:94.13333333333334 450:94.13333333333334 451:94 452:93.53333333333333 453:93.46666666666667 454:93.46666666666667 455:93.46666666666667 456:93.90000000000001 457:93.84999999999999 458:93.86666666666666 459:93.81666666666666 460:94.15000000000001 461:92.33333333333333 462:90.08333333333333 463:88.18333333333334 464:97.76666666666667 465:97.76666666666667 466:97.7 467:97.56666666666666 468:92.96666666666667 469:94.13333333333334 470:95.73333333333333 471:96.91666666666667 472:97.73333333333333 473:98.73333333333333 474:100.4333333333333 475:101.3666666666667 476:106.9 477:105.4 478:102.9666666666667 479:101.1333333333333 480:103.5166666666667 481:101.1166666666667 482:96.76666666666667 483:94.36666666666666 484:98.06666666666666 485:98.06666666666666 486:98.06666666666666 487:98.06666666666666 488:96.81666666666666 489:95.61666666666666 490:93.96666666666667 491:92.81666666666666 492:88.34999999999999 493:91.25 494:95.15000000000001 495:97.90000000000001 496:95.15000000000001 497:96.84999999999999 498:99.34999999999999 499:101.15 500:88.90000000000001 501:88.90000000000001 502:88.90000000000001 503:88.90000000000001 504:90.81666666666666 505:89.56666666666666 506:87.86666666666666 507:86.76666666666667 508:76.96666666666667 509:77.41666666666667 510:77.91666666666667 511:78.36666666666666 512:88.66666666666667 513:88.66666666666667 514:88.66666666666667 515:88.66666666666667 516:96.61666666666666 517:94.11666666666666 518:90.66666666666667 519:88.11666666666666 520:87.56666666666666 521:87.56666666666666 522:87.56666666666666 523:87.56666666666666 524:86.66666666666667 525:86.66666666666667 526:86.66666666666667 527:86.66666666666667 528:84.46666666666667 529:84.46666666666667 530:84.46666666666667 531:84.46666666666667 532:88.21666666666667 533:90.21666666666667 534:93.36666666666666 535:95.26666666666667 536:92.16666666666667 537:92.66666666666667 538:93.56666666666666 539:94.06666666666666 540:92.56666666666666 541:92.83333333333333 542:92.96666666666667 543:93.3 544:85.40000000000001 545:85.73333333333333 546:85.86666666666666 547:86.13333333333334 548:92.23333333333333 549:91.83333333333333 550:91.76666666666667 551:91.63333333333334 552:90.8 553:90.81666666666666 554:90.66666666666667 555:90.71666666666667 556:87.56666666666666 557:84.91666666666667 558:81.06666666666666 559:78.41666666666667 560:82.01666666666667 561:80.21666666666667 562:77.66666666666667 563:75.81666666666666 564:73.86666666666666 565:73.86666666666666 566:73.86666666666666 567:73.86666666666666 568:78.66666666666667 569:78.66666666666667 570:78.66666666666667 571:78.66666666666667 572:77.46666666666667 573:77.46666666666667 574:77.46666666666667 575:77.46666666666667 576:78.81666666666666 577:80.31666666666666 578:82.56666666666666 579:84.26666666666667 580:87.86666666666666 581:87.86666666666666 582:87.86666666666666 583:87.86666666666666 584:88.56666666666666 585:88.61666666666666 586:88.71666666666667 587:88.66666666666667 588:85.46666666666667 589:85.46666666666667 590:85.46666666666667 591:85.46666666666667 592:89.25 593:87.55 594:85.25 595:83.59999999999999 596:85.34999999999999 597:87.09999999999999 598:89.75 599:91.55 600:74.7 601:74.7 602:74.7 603:74.7 604:77.21666666666667 605:78.46666666666667 606:80.11666666666666 607:81.36666666666666 608:76.66666666666667 609:76.66666666666667 610:76.66666666666667 611:76.66666666666667 612:78.46666666666667 613:78.46666666666667 614:78.46666666666667 615:78.46666666666667 616:79.8 617:79.8 618:79.8 619:79.8 620:86.5 621:86.5 622:86.5 623:86.5 624:89.3 625:89.3 626:89.3 627:89.3 628:88.5 629:88.5 630:88.5 631:88.5 632:85.7 633:87.3 634:89.34999999999999 635:90.8 636:81.25 637:80.7 638:79.84999999999999 639:79.25 640:77.7 641:77.7 642:77.7 643:77.7 644:82.40000000000001 645:82.40000000000001 646:82.40000000000001 647:82.40000000000001 648:81.2 649:81.2 650:81.2 651:81.13333333333334 652:81.06666666666666 653:81.16666666666667 654:81.11666666666666 655:81.01666666666667 656:85.11666666666666 657:84.16666666666667 658:82.71666666666667 659:81.91666666666667 660:87.41666666666667 661:84.01666666666667 662:78.81666666666666 663:75.31666666666666 664:80.86666666666666 665:80.86666666666666 666:80.86666666666666 667:80.86666666666666 668:83.56666666666666 669:83.56666666666666 670:83.56666666666666 671:83.56666666666666 672:83.16666666666667 673:83.16666666666667 674:83.16666666666667 675:83.16666666666667 676:87.66666666666667 677:87.66666666666667 678:87.66666666666667 679:87.66666666666667 680:85.96666666666667 681:85.96666666666667 682:85.96666666666667 683:85.96666666666667 684:84.61666666666666 685:84.76666666666667 686:84.71666666666667 687:84.76666666666667 688:85.26666666666667 689:85.26666666666667 690:85.26666666666667 691:85.26666666666667 692:88.09999999999999 693:88.09999999999999 694:88.09999999999999 695:88.09999999999999 696:87.33333333333333 697:87.33333333333333 698:87.33333333333333 699:87.33333333333333 700:72.46666666666667 701:72.46666666666667 702:72.46666666666667 703:72.46666666666667 704:73.56666666666666 705:73.56666666666666 706:73.56666666666666 707:73.56666666666666 708:67.66666666666667 709:67.66666666666667 710:67.66666666666667 711:67.66666666666667 712:75.13333333333334 713:75.13333333333334 714:75.13333333333334 715:75.13333333333334 716:75.53333333333333 717:75.53333333333333 718:75.53333333333333 719:75.53333333333333 720:77.03333333333333 721:77.03333333333333 722:77.03333333333333 723:77.03333333333333 724:73.53333333333333 725:73.53333333333333 726:73.53333333333333 727:73.53333333333333 728:73.53333333333333 729:74.08333333333333 730:74.78333333333333 731:75.48333333333333 732:76.13333333333334 733:76.13333333333334 734:76.13333333333334 735:76.13333333333334 736:76.33333333333333 737:76.33333333333333 738:76.33333333333333 739:76.33333333333333 740:76.08333333333333 741:77.18333333333334 742:78.78333333333333 743:80.03333333333333 744:76.06666666666666 745:76.06666666666666 746:76.06666666666666 747:76.06666666666666 748:77.86666666666666 749:77.86666666666666 750:77.86666666666666 751:77.86666666666666 752:81.41666666666667 753:84.06666666666666 754:87.41666666666667 755:89.96666666666667 756:88.16666666666667 757:84.51666666666667 758:79.61666666666666 759:76.01666666666667 760:73.31666666666666 761:74.71666666666667 762:76.31666666666666 763:77.41666666666667 764:75.66666666666667 765:75.66666666666667 766:75.66666666666667 767:75.66666666666667 768:76.96666666666667 769:76.96666666666667 770:76.96666666666667 771:76.96666666666667 772:79.36666666666666 773:79.36666666666666 774:79.36666666666666 775:79.36666666666666 776:73.56666666666666 777:73.56666666666666 778:73.56666666666666 779:73.56666666666666 780:76.46666666666667 781:76.46666666666667 782:76.46666666666667 783:76.46666666666667 784:72.06666666666666 785:71.96666666666667 786:71.91666666666667 787:71.86666666666666 788:69.76666666666667 789:69.76666666666667 790:69.76666666666667 791:69.76666666666667 792:69.36666666666666 793:69.36666666666666 794:69.36666666666666 795:69.36666666666666 796:67.16666666666667 797:67.16666666666667 798:67.16666666666667 799:67.16666666666667 diff --git a/example/xg_boost_dump.json b/example/xg_boost_dump.json new file mode 100644 index 0000000..dd4e90e --- /dev/null +++ b/example/xg_boost_dump.json @@ -0,0 +1,142 @@ +[ + { "nodeid": 0, "depth": 0, "split": "f327", "split_condition": 110.783333, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f14", "split_condition": 199.883331, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f436", "split_condition": 108.216667, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": 0.96825397 }, + { "nodeid": 8, "leaf": -0 } + ]}, + { "nodeid": 4, "leaf": -0 } + ]}, + { "nodeid": 2, "depth": 1, "split": "f628", "split_condition": 107.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.800000012 }, + { "nodeid": 6, "leaf": 0.200000003 } + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f327", "split_condition": 110.783333, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f14", "split_condition": 199.883331, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f436", "split_condition": 108.216667, "yes": 7, "no": 8, "missing": 8 , "children": [ + { "nodeid": 7, "leaf": -0.96825397 }, + { "nodeid": 8, "leaf": -0 } + ]}, + { "nodeid": 4, "leaf": -0 } + ]}, + { "nodeid": 2, "depth": 1, "split": "f628", "split_condition": 107.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.800000012 }, + { "nodeid": 6, "leaf": -0.200000003 } + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f401", "split_condition": 111.400002, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.570969284 }, + { "nodeid": 6, "leaf": -0.183552772 } + ]}, + { "nodeid": 4, "leaf": -0.117992692 } + ]}, + { "nodeid": 2, "leaf": -0.571418047 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f401", "split_condition": 111.400002, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.570969284 }, + { "nodeid": 6, "leaf": 0.183552772 } + ]}, + { "nodeid": 4, "leaf": 0.117992707 } + ]}, + { "nodeid": 2, "leaf": 0.571418047 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f410", "split_condition": 110.650002, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.466001004 }, + { "nodeid": 6, "leaf": -0.0753230453 } + ]}, + { "nodeid": 4, "leaf": -0.0537564792 } + ]}, + { "nodeid": 2, "leaf": -0.356984079 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f532", "split_condition": 140.75, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "depth": 1, "split": "f28", "split_condition": 204.416672, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "depth": 2, "split": "f410", "split_condition": 110.650002, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.466000974 }, + { "nodeid": 6, "leaf": 0.0753231421 } + ]}, + { "nodeid": 4, "leaf": 0.0537564307 } + ]}, + { "nodeid": 2, "leaf": 0.356984049 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f284", "split_condition": 101.400002, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.347005337 }, + { "nodeid": 2, "depth": 1, "split": "f300", "split_condition": 95.5, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "leaf": -0.381696463 }, + { "nodeid": 4, "depth": 2, "split": "f656", "split_condition": 104.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": -0.073965922 }, + { "nodeid": 6, "leaf": 0.385791391 } + ]} + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f284", "split_condition": 101.400002, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.347005308 }, + { "nodeid": 2, "depth": 1, "split": "f300", "split_condition": 95.5, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "leaf": 0.381696492 }, + { "nodeid": 4, "depth": 2, "split": "f656", "split_condition": 104.199997, "yes": 5, "no": 6, "missing": 6 , "children": [ + { "nodeid": 5, "leaf": 0.0739660487 }, + { "nodeid": 6, "leaf": -0.385791391 } + ]} + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f743", "split_condition": 90.1333313, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.279968023 }, + { "nodeid": 2, "depth": 1, "split": "f290", "split_condition": 108.033333, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "leaf": -0.234077886 }, + { "nodeid": 4, "leaf": 0.147569537 } + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f743", "split_condition": 90.1333313, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.279968172 }, + { "nodeid": 2, "depth": 1, "split": "f290", "split_condition": 108.033333, "yes": 3, "no": 4, "missing": 4 , "children": [ + { "nodeid": 3, "leaf": 0.234077781 }, + { "nodeid": 4, "leaf": -0.147569537 } + ]} + ]}, + { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.197402045 }, + { "nodeid": 2, "leaf": -0.139941201 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.197402418 }, + { "nodeid": 2, "leaf": 0.13994123 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f53", "split_condition": 127.416664, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.166276604 }, + { "nodeid": 2, "leaf": -0.126794532 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f53", "split_condition": 127.416664, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.166276589 }, + { "nodeid": 2, "leaf": 0.126794517 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f712", "split_condition": 92.8833313, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.123596296 }, + { "nodeid": 2, "leaf": 0.151612476 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f712", "split_condition": 92.8833313, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.123594895 }, + { "nodeid": 2, "leaf": -0.151612416 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.113635384 }, + { "nodeid": 2, "leaf": -0.107038438 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f633", "split_condition": 100.066666, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.11363478 }, + { "nodeid": 2, "leaf": 0.107038461 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f602", "split_condition": 92.8499985, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": -0.1141828 }, + { "nodeid": 2, "leaf": 0.110286467 } + ]}, + { "nodeid": 0, "depth": 0, "split": "f602", "split_condition": 92.8499985, "yes": 1, "no": 2, "missing": 2 , "children": [ + { "nodeid": 1, "leaf": 0.114181779 }, + { "nodeid": 2, "leaf": -0.110286497 } + ]} +] \ No newline at end of file diff --git a/oceanprefilter/histogram_compare.go b/oceanprefilter/histogram_compare.go index 46f6b47..6c17083 100644 --- a/oceanprefilter/histogram_compare.go +++ b/oceanprefilter/histogram_compare.go @@ -47,10 +47,10 @@ func Hist(buckets int, minVal, maxVal float64, input []float64) Histogram { } func histogramChangeFilter( - oldHists []Histogram, newImg image.Image, rc runConfig, + oldHists []Histogram, newImg image.Image, rc RunConfig, ) (bool, []Histogram, error) { firstHist := false - thresh := rc.threshold + thresh := rc.Threshold if len(oldHists) == 0 { firstHist = true // get the data for the first histogram } @@ -69,7 +69,7 @@ func histogramChangeFilter( if cropY >= (newImg.Bounds().Max.Y-1) || cropY <= 1 { return false, nil, errors.Errorf("could not find horizon in image. Got a horizon value of y = %v", cropY) } - imgs, err := splitUpImage(newImg, rc.excludedZone, cropY, NHSplit, NVSplit) + imgs, err := splitUpImage(newImg, rc.ExcludedZone, cropY, NHSplit, NVSplit) if err != nil { return false, nil, err } diff --git a/oceanprefilter/ml_filtering.go b/oceanprefilter/ml_filtering.go index dae99e2..5d6b029 100644 --- a/oceanprefilter/ml_filtering.go +++ b/oceanprefilter/ml_filtering.go @@ -5,7 +5,7 @@ import ( "image" ) -func mlFilter(ctx context.Context, img image.Image, rc runConfig) (bool, error) { +func mlFilter(ctx context.Context, img image.Image, rc RunConfig) (bool, error) { // first try if the optional detection is present if rc.detector == nil { return false, nil diff --git a/oceanprefilter/oceanprefilter.go b/oceanprefilter/oceanprefilter.go index 852ad39..15dd2eb 100644 --- a/oceanprefilter/oceanprefilter.go +++ b/oceanprefilter/oceanprefilter.go @@ -3,11 +3,12 @@ package oceanprefilter import ( "context" + _ "embed" + "image" "sync" "sync/atomic" "time" - _ "embed" - "image" + xgb "github.com/Elvenson/xgboost-go" "github.com/Elvenson/xgboost-go/activation" "github.com/Elvenson/xgboost-go/inference" @@ -81,11 +82,11 @@ type prefilter struct { currImg atomic.Pointer[image.Image] camName string properties vision.Properties - rc runConfig + rc RunConfig } -// runConfig are the settings that will be fed to the background thread that will constantly be evaluating images for events -type runConfig struct { +// RunConfig are the settings that will be fed to the background thread that will constantly be evaluating images for events +type RunConfig struct { logger logging.Logger cam camera.Camera camName string @@ -93,11 +94,11 @@ type runConfig struct { chosenLabels map[string]float64 frequency float64 minConfidence float64 - threshold float64 - excludedZone *image.Rectangle + Threshold float64 + ExcludedZone *image.Rectangle motionTrigger bool debug bool - model *inference.Ensemble + Model *inference.Ensemble } // newPrefilter creates the vision service classifier @@ -140,10 +141,10 @@ func (pf *prefilter) Reconfigure(ctx context.Context, deps resource.Dependencies } // the run config will store the relevant variables from the prefilterConfig for running - rc := runConfig{} + rc := RunConfig{} rc.logger = pf.logger rc.debug = prefilterConfig.Debug - // now load the relevant info into the runConfig + // now load the relevant info into the RunConfig if prefilterConfig.MaxFrequency < 0 { return errors.New("max_frequency_hz must be a non-negative number") } @@ -154,9 +155,9 @@ func (pf *prefilter) Reconfigure(ctx context.Context, deps resource.Dependencies if prefilterConfig.Threshold > 1.0 || prefilterConfig.Threshold < 0 { return errors.New("threshold must be a number between 0 and 1") } - rc.threshold = prefilterConfig.Threshold - if rc.threshold == 0 { - rc.threshold = DefaultThreshold + rc.Threshold = prefilterConfig.Threshold + if rc.Threshold == 0 { + rc.Threshold = DefaultThreshold } rc.motionTrigger = prefilterConfig.TriggerOnMotion @@ -167,15 +168,14 @@ func (pf *prefilter) Reconfigure(ctx context.Context, deps resource.Dependencies } er := prefilterConfig.ExcludedRegion theZone := image.Rectangle{image.Point{er[0], er[1]}, image.Point{er[2], er[3]}} - rc.excludedZone = &theZone + rc.ExcludedZone = &theZone } ensemble, err := xgb.LoadXGBoostFromJSONBytes(modelbytes, - "", 2, 8, &activation.Softmax{}) // wrong activation logistic is 1 class only + "", 2, 8, &activation.Softmax{}) if err != nil { - panic(err) + return errors.Wrapf(err, "unable to properly load XGBoost model") } - rc.model = ensemble - + rc.Model = ensemble if prefilterConfig.CameraName != "" { rc.camName = prefilterConfig.CameraName @@ -184,7 +184,7 @@ func (pf *prefilter) Reconfigure(ctx context.Context, deps resource.Dependencies if err != nil { return errors.Wrapf(err, "unable to get camera %v for ocean prefilter", prefilterConfig.CameraName) } - + // now start the background thread only if a camera dependency is given pf.activeBackgroundWorkers.Add(1) viamutils.ManagedGo(func() { @@ -208,7 +208,7 @@ func (pf *prefilter) Reconfigure(ctx context.Context, deps resource.Dependencies // run sets up a camera stream and then takes new pictures and processes them for anomalies // at the desired frequency. -func run(ctx context.Context, rc runConfig, trigger *atomic.Bool, currImg *atomic.Pointer[image.Image]) error { +func run(ctx context.Context, rc RunConfig, trigger *atomic.Bool, currImg *atomic.Pointer[image.Image]) error { triggerCount := 0 if rc.cam == nil { return errors.Errorf("underlying camera %q is nil, cannot start background stream", rc.camName) @@ -231,9 +231,9 @@ func run(ctx context.Context, rc runConfig, trigger *atomic.Bool, currImg *atomi } currImg.Store(&img) // this function is where the decision happens - isTriggered, err := make_inference(img, rc) + isTriggered, err := MakeInference(img, rc) if err != nil { - rc.logger.Infow("resetting histograms", "error", err.Error()) + rc.logger.Infow("inference error", "error", err.Error()) if rc.motionTrigger { isTriggered = true } @@ -247,7 +247,6 @@ func run(ctx context.Context, rc runConfig, trigger *atomic.Bool, currImg *atomi } else { trigger.Store(false) } - // oldHists = newHists release() if rc.debug && trigger.Load() { rc.logger.Info("TRIGGER is true") @@ -305,33 +304,16 @@ func (pf *prefilter) ClassificationsFromCamera( func (pf *prefilter) Classifications(ctx context.Context, img image.Image, n int, extra map[string]interface{}, ) (classification.Classifications, error) { - if pf.camName == "" { - isTriggered, err := make_inference(img, pf.rc) - if err != nil { - pf.logger.Infow("classification error", "error", err.Error()) - } - cls := []classification.Classification{} - if isTriggered { - c := classification.NewClassification(1.0, triggerClassName) - cls = append(cls, c) - } - return classification.Classifications(cls), nil - - } else { - select { - case <-ctx.Done(): - return nil, errors.Wrap(ctx.Err(), "module might be configuring") - case <-pf.cancelContext.Done(): - return nil, errors.Wrap(pf.cancelContext.Err(), "lost connection with background camera stream loop") - default: - cls := []classification.Classification{} - if pf.triggerFlag.Load() { - c := classification.NewClassification(1.0, triggerClassName) - cls = append(cls, c) - } - return classification.Classifications(cls), nil - } + isTriggered, err := MakeInference(img, pf.rc) + if err != nil { + pf.logger.Infow("classification error", "error", err.Error()) + } + cls := []classification.Classification{} + if isTriggered { + c := classification.NewClassification(1.0, triggerClassName) + cls = append(cls, c) } + return classification.Classifications(cls), nil } func (pf *prefilter) GetObjectPointClouds( diff --git a/oceanprefilter/prefilter_test.go b/oceanprefilter/prefilter_test.go index 38cbdbb..79d83fd 100644 --- a/oceanprefilter/prefilter_test.go +++ b/oceanprefilter/prefilter_test.go @@ -1,119 +1,66 @@ package oceanprefilter import ( - "fmt" "image" "math" "os" "path/filepath" "testing" - "image/jpeg" + xgb "github.com/Elvenson/xgboost-go" "github.com/Elvenson/xgboost-go/activation" + "go.viam.com/test" ) - -func TestGeneralModel(t * testing.T) { - - f, err := os.Open("numbered_data/1000.jpg") - fmt.Print(err) +func TestXGBoostInference(t *testing.T) { + f, err := os.Open("test_data/2288.jpg") defer f.Close() img, _, err := image.Decode(f) + test.That(t, err, test.ShouldBeNil) - rc := runConfig{} + rc := RunConfig{} ensemble, err := xgb.LoadXGBoostFromJSONBytes(modelbytes, - "", 2, 8, &activation.Softmax{}) // wrong activation logistic is 1 class only - if err != nil { - panic(err) - } - rc.model = ensemble - rc.threshold = 0.25 + "", 2, 8, &activation.Softmax{}) + test.That(t, err, test.ShouldBeNil) + + rc.Model = ensemble + rc.Threshold = 0.25 rect := image.Rectangle{ Min: image.Point{X: 250, Y: 350}, Max: image.Point{X: 580, Y: 480}, } - rc.excludedZone = &rect - - res, err := make_inference(img, rc) - if err != nil { - fmt.Printf("err") - } - - fmt.Printf("output result is %+v\n", res) -} - -func TestAcc(t * testing.T) { - dir := "numbered_data/" - files, _ := os.ReadDir(dir) - for _, file := range files { - if file.Name() == ".DS_Store" { - continue - } - fp := filepath.Join(dir, file.Name()) - fmt.Println(fp) - f, err := os.Open(fp) - defer f.Close() - img, _, err := image.Decode(f) - - rc := runConfig{} - ensemble, err := xgb.LoadXGBoostFromJSONBytes(modelbytes, - "", 2, 8, &activation.Softmax{}) // wrong activation logistic is 1 class only - if err != nil { - panic(err) - } + rc.ExcludedZone = &rect - rc.model = ensemble - rc.threshold = 0.25 - rect := image.Rectangle{ - Min: image.Point{X: 250, Y: 350}, - Max: image.Point{X: 580, Y: 480}, - } - rc.excludedZone = &rect - - res, err := make_inference(img, rc) - if res { - - } else { - - } - } + res, err := MakeInference(img, rc) + test.That(t, err, test.ShouldBeNil) + test.That(t, res, test.ShouldBeTrue) } -func TestSplitData(t * testing.T) { - dir := "triggers/2/" +func TestSplitData(t *testing.T) { + dir := "test_data/2288.jpg/" files, _ := os.ReadDir(dir) for _, file := range files { if file.Name() == ".DS_Store" { continue } fp := filepath.Join(dir, file.Name()) - fmt.Println(fp) f, err := os.Open(fp) defer f.Close() img, _, err := image.Decode(f) + test.That(t, err, test.ShouldBeNil) - rc := runConfig{} - rc.threshold = 0.25 + rc := RunConfig{} + rc.Threshold = 0.25 rect := image.Rectangle{ Min: image.Point{X: 250, Y: 350}, Max: image.Point{X: 580, Y: 480}, } - rc.excludedZone = &rect + rc.ExcludedZone = &rect linePoints, err := findHorizonLine(img) cropY := int(math.Max(float64(linePoints[0].Y), float64(linePoints[1].Y))) - imgs, err := splitUpImageConst(img, rc.excludedZone, cropY, 80, 200) - if err != nil { - fmt.Printf("err") - } - - for idx, img := range imgs { - //// - filename := fmt.Sprintf("temp/%d_%s", idx, file.Name()) - file, _ := os.Create(filename) - defer file.Close() - jpeg.Encode(file, img, nil) - //// - } + _, err = splitUpImageConst(img, rc.ExcludedZone, cropY, 80, 200) + test.That(t, err, test.ShouldBeNil) + } } diff --git a/oceanprefilter/test.go b/oceanprefilter/test.go deleted file mode 100644 index 1de444f..0000000 --- a/oceanprefilter/test.go +++ /dev/null @@ -1,23 +0,0 @@ -package oceanprefilter - - -import ( - "fmt" - "image" - "os" -) - -f, err := os.Open("") - -defer f.Close() -image, _, err := image.Decode(f) - -rc := runConfig{} -rc.threshold = 0.25 - -res, err = inference(f, rc) -if err != nil { - fmt.Printf("err") -} - -fmt.Printf("%+v\n", res) \ No newline at end of file diff --git a/oceanprefilter/test_data/2288.jpg b/oceanprefilter/test_data/2288.jpg new file mode 100644 index 0000000000000000000000000000000000000000..158a9d4b6ae2e73544591e74386a00f8844de7b6 GIT binary patch literal 24851 zcmbTe30PC-_CC6qoGlJSD;|wnk-;L){tgy`+K5atgh4^YYL&ra4pnL!8aCLfH5?j6 zMJ)${0Z9OnV+n$`m<}SXwhdt{!9t720)dEV5;P&3|NF)M{`Yt9^W6K~d+h^HNp|-B zhPB@Hu6M03V?FHQUi?firvI0_VT|ZPC&du8Wqu`NrS==C;B8&6TUxu3gJ^{kzY9t$u68nzgIR zO>8Dlo;+>pwAZIke|`1hzb#(<|M}neH`L5YHox0N+u1CkY-ifo&9oW6OR+Id2OH}@ z>aTw`ws!Uo6DCfYJY^~_sF^|8+Su9I+S@re*xTc3A>OC#XFAMUylT^g+2QX@T$1Xv zI_vC}NpEbv@hvMt{dDP?eeWNiJY~+@*XKFAEOT{p_gK4b{f7VgyZ4s2xm*3W1qAXU zqoQMW?2O(2?ty~|iAl*vj;4KZ?8A=)pL}}a9U{pazYefOa%(ocz!H)D5>PMLz#dpZ!CIDx_*hp=N&e{`XQv&vjeAH=Qg@mH2is>22xzgr_fX zchuIJx$n{6dCJGBminXV`+QET!edr=lBcN;r+h8)RUH|pd=)>==ktx(sxLcs^8YxL zPQNgXQ`_WU`^bb6i^uILy%jqKrM#9gA6eIHo+pKa`+sCD*r-}~;g`ga5c$|hxJ6oW zKy+0;(98VLH9ITXR~^(R4)puTFixF#vUcPwb7uK#_50HQIpy)X>E7Lsm^&5MbM`wc zwnrCNND^+1Q*I%Esal0zboF$5NBma{%twa{?HysPyyu!=(L20bz&Y`TbS=#FVOeqdUL-Y(ENEKwNHEO_l({iW)CjBGfqA1vW!#pW2|Laf6%X0 zeP6IK@~fvBZEXmZ7d~y_yXTxA3?A&h`#@UV-tqnI#?QarcqrwM`8gh~s-+v6;=g_T zk+QDm_0C%r@jKLd9lN1pj^@C%IY#9^3_5(A+P$=*INSBtGvU!|g?3xp-*W9O2;#M* z^nG>mkfdjv`o@DZrGMc9&a~HR)2?iyk2>77a6Vf9qvMN6;d>c(MWWW4rnS2hzT4pZ z+s)73TK5tE&yUu04Kt39%oX*V?${sjjBVAmx5p_l?K?%2!%sdCE&h_t^<>?!pXa=ljJdHcxxT^0_tw1#GdI*Iimz^sDwPHX{Yu0*)mWdf zYgbhG>hgDa1Ife2v}6Ce>byM8?2P#w01_@+;CoY9UH)f5afI>Pq2T%Hg8p&pM&%RE zz=_1JE=yrm4Cm$sqw9S6hXQQ858b?cR=t;w_4A;2nsQ7S+fuwkvhT=Rg(BvopLUN^ z7rlR}D`V6FJ3gy`tv~$ffRon!vlRTw)VQ~X*(JhK@2R&-GvD~%7JvVLI6(kBp@2)R z7o`E}gSdcq1#yrFprzGu@C)~X)k{Sb`6-qQi-(SJ4qzLrp5s@$e&J+w4c{^8w&c?l zA7`H%r@YoM&wpWFN=g` zwM)g83zgy-wWka@3Fg3#-U%1>y>;o2XPZ8czooP&O-Ydh7xvs$b+N`Ads7yT`E-m^ z3PZ)D71vz>S$SpiF0L{LO1|&*__zAb%#pHRHfGhL&-vILNE-xokA<#i2L0w|W}#Ir@0hBcDWGg*1o# zZbEcz%@XNVY3<6z*baMfnR{|$=inRroMW46Yh@3kC!B~Ae8p$Z?lkP{?v+;`?(P{f zRPuLO?i9x;6)A(C^{-3jRJYDC<#5cKi@wy=dsp94`)l0h9nLq3RAw$au_$*ONC%iL zkJ{JWUGnAQ-E#MfPMJ51qEF0zf+&t6%ENv)(^TG*Sbl-E!#O^&?2dY;lQOYvrrILC z_EGOGrEbbG=nwlDBk;)(Lim)BkcyM&{1U zN4(y9&mz5Q=Ds78%FNuD8;xDBee0Lp9*u`b3Tu&zr;BI!8|8tb zl9E-)jT(pG~YhxKkx81hDWwT9W@C$5_9;!osp$aUJ1C0p0n#zGNbz=0&r2 z?`_p0LCZkakCwvTD{x!E;NZrvmOJX;PYO%queiY@?UhQ)Y5P%D1Xi}@;HD5+MD)Ek z+*`G=R~#!o7-emhnSBl(dbTmXmC^#A>Va%3db>=S9`VglSR*!@OBL~pO0my|xk_z_X&%dK z>sl(A#$Do0tq)MWlAA>D-_^?Q>|pKrRkANqssKcmD~)Lloc9uj0?$YGB$P&-;UYX= zK`0Lho)8gv{ye3LC0i7jE84$=?93a|t0g7&M=y9feM1bu9tIKM_gNyg_M|%WDgu6) zThY6bk&5#+ES9I!w9iGkd0A)G*jIeIq-fGWt3r#<_~w$pA4`3nC*j(@QBs!VX6pfa zSklv}^&YsRio(DuPIWD~bNBAm3M+9fPb)ifUU6P=Hz3H$jXk$b<$C8GzZZ^Y+6@_+ z`ZdCR(e-zVje`4S^|RlHcYT?m=2@h5ArF`j^`#bRS)|jnCNtL`zDpQy=6YXs#LGv` z|E8Ohl!qg%QB=!M4W7)YF6-%R z*AFWqEYeJmhl%Y5UYNR4Hv}ShC`iZJ+S^;zHRH$y&m_d0Xy(_(U;ot*#M>3uCg}hB zz2rme;Qp8ZPaV)`Qf@8;c2!pZKv74 zb6~{^kBge+v-j`Uu@fuS8!q!>Sy^Q+F*2UVR^NOq?7YY)p4!Lj6*Es51yx2tfBBS- zuGiCN7fNe&hzXDWl<$gb*B^S_Jli+-T6F!roLE9%vx1^mcrvQ6_LKXQ-1R(L50AjW zeaII|_C@?pr@eHNgt=LHuTlXUka!IVS$x88>#GXwYkiVl`ns1a!{zWXp>O{Os(XGIRnuW%$xr`U=ZI}Yiz{pzUm#yM8Kgx z{=TQucqlc?*XW!iiDkycx*U(s%dB8Z)$@dfUoz?lI`LtIZC|H$N|jOcxxy|QKwE6N z0^TjT!M^DU8?i{Ql(rY%ZS0z>d$N3c_bpSkQS^lZ`1qAEUGPI)OBqLT7*IUr!Dz8X zy*XD_8k2Nyb-{M&rR?~`$}Yj575?VUw>%2g23?$E$d6{!;Sp;WmFrE*_uB>ul>F4l zJ7f%zUrbHiX-Mwvt!SG!HTLEx>s)BX+?(E^3SNeqzhkX3@jAWlX!`z$Vl(%kMT*~? zeO~V!5`r2{S6n`~fV&FF&wBfuI+{~`-Ge`5mY9xJ zy`}%BHc)9P2u8YDvC5;>Xt=?b#kDI<>k^2e{{#S)ntfDbrjGFK*M9yb&ay0jcT_{e zJ22dn+$n)dzDy{+oGKF*Ui(QFQqcqan%Jp5y%;efap?gkMHI<2m)Ig_-I8R@G7*2K zOY?FwN&Y)a)D7%#f5jL$s$_hGl<<=10S_IKePn%m$j5p z_dNn{S#nZSHyspuro{>~Zz>uEe4|gTrh12YfBe4pYgk8}>%X3(_5Ee#p(%lG4 zxv&nti%h8!kyPk3V?BPIT%B7Y%{rrwh~UkzCQ^}+=Xo>9ZdfBF*e4QtpanQ(nY(qv z{`v(Ub|*t{&vI}w0b6qk;PzjY%0Gc&Y}B#D+>a6}bvYao7JrsS*v0Fdh85AfUAFxk zuZR#z%Ua=gqS-nYTjSo-->Rx^%MCG#F6x|A)m_cI;+mEue=Zjm<_8})aE$^n0Z5N~ z8;A76)h)j20HcUP_PM7Dw`rR<6QFVJ2V{u3zz=Ik2OTDfp$$xK`KDKSVqQVewu#N* z0bx7W#g(ts{?r66y7k(i_{Er=c-C}pfXAgAaPoltfV12$7tG>Ux0(5fsPT$ON#gbW z@=zo$g3JCl=Pjt;!!%t37mcJ7OTsHGSHeJlqNa$>%w4ge#*Je7)#l@Cz|5Z8CJkdUq4{x5w^>hh4E{b)hB1qmVFLNtJlw5}? z6Azjh9ue+0IUph;!qypg$h;2@GeOPuTsaFavj{O&T9kQJD!Qv%5EQ`m`%x~Jm+aiH zbGk6yY2wXgX72j@fMCgczM=!3t1UNNTwFZYtnvu_ToODnJb=68M~~#=xh1yZ>ef8{ zpoppf*h$OW7Ud7=mB<$KhTyV8Yc@L$X-^Fqj_FuPt?K`6IlVnUro13IVQ4F0I{ec4 z2z9Unk*Hz=(_9w6CTnqT70rV3B!mHcviYi$HYM?0PbUadJa@fj->iawAisuJY%WhU zc@F-JScMd`q@`;r*Tw0iZ>hY@aJlRtq9$womv7!M3izE`=abhq?~05{E~%X47S4-^ zF7>^e;vW$ic^Xc7Z4(rrMbMfES*%zyKVZA`%nUUzJTd?)?UYGUryY=vHf<)^)cRaW z0NmS}V1aC&=gCXA5iV(e6l`V2`rJIx7VL%7q%^1SU43ChYEy)B?H0UJop_64-K3ZI zHLHXCCWn^t`XO+6Z1sfV1;HuuGdF48na1!4UZSlt)*;a@2_hPiz!m{N?5$S?1O)`! z7GNK36j4>xYNG(F!{QGarmvhI#AW$8UGU@#8I~+>Zf(_oL*?bl?WH1jN}-5o&B8nS z3oe`f-7};Ot!^o6yIiEIZf;3Rd_5vOVB4f*k1sAqF7^nFuWnOTH#x)}a613fj~>pk z2NG8)Aev1E?XjQCb&7iZgj0CzEEfdWS*t~9EUWG92gY4{fM2CVlCy0F{5fDs(_bxU zf9Vo$ERP-0SO_Z@%?Cgqw8ND8ypIDj_xJymhT;_ptCRIPKKDA-j3P63l;-9U96f_O zZnKJ)8X_u^=Y(@voAD07COl$?7R$Q1wT2b2^PhPlk%$6p+z-Tlh6hA1)@xIoW_fzL zfTiP(m_>A^Z(eR*(U(8Nyky*WR}X94FKicWSyoaS9&Kw4*|DNaQ{mK2wvlj4NR-mc zekV#wq-XG9o=swDxZf;Z(s@nO*+i-6;9@LGu2VR7n{~p8;HVfC`H|cHwIp`9%$jMt zL#(i--GOc;MfTGC0KeCyxuWB5OY7*V$((_UoaEbbLxKNJ^MRi$+d4WK)j0Lm@;9yx zyIptP+J4v*Y--T5r2RIcYB$uQ^3OcO!-UfEhso=aT0b*Hgl9;08Z|lfjbnn}gwpFR zGfZw*OBXA6^rP-#bBNON7TqJtbd}~CvuViR)DIv;VfL*xppDUw?vi^vAMu;NHquIX ztIbiB9q`rqMva?|9?W+V*&pG-r0&JFtsnc#2lAB9{&?I{Q{Zo&@86onc{zIg>owor zRv9;(_B3p)dO2(!r(P^rEiUSpiuPhBgJFqQ$szZon(OrA0X>i=~%NyUF{D-aa3Bl($sKTHr#F2a+pG zAc=>o{bq-UBaCc&w>5HY&1N>a0r^zsf*`!-D3#*R68V6eZJ>uYez_|mb3eLzvj9p3 zXJpMdb#tNr@bbVO^Zf9y$EnkWvQ%S*_$B{88NYL!3@cs-PdL?;w3=xfr##0*kCaar zO2(pk}9Yb((R+~=B~e48$C`XKjRn$jq2;1-cUYsVVvTyA6}2q&1LI{1B_zR zALCTUEXfVq?wsEFVqG>}vzu0hT5L;OYUbyQ_3?VaPvcZ=oTC}3puffYSD4lr@5;@O z%+9}bYX=!$W$R0p<5+MSdnhGzNcp@)^=$bi@_{LFw4Q!B3c*0@H{h%0ry9R_09pnm z@nW0^Y3$*4gO_Fn{iwsj#_|@uCfVAaqCd1Te|ISJYt+VcSiVXZtxPb#$s~-`USq#_ zK|V;2Wn8_999Ghq@c{afxM|JR))gx}_36S7+6OIjEx}J?98%*XiR083vsY&d^I)8^ zE2k4~64CnI1$jBCBfFnvYoi-V4rlXrUJ?=!bAz>U!Rt51ytpD2)w2!;?78 zoYstS>V8#N%hy{{WprbehNJshpE;EB#8;hQtccC~df2=LwlOkjG}C5&1pVGaXrSX1 zwBb-@*){)T+<$;kv-Jjgocf#|Su6P;|NqUCvYLi*>botN2qy-P*Edeh_8(iif&JWo zmp+fQ(L}{rLBqEKa^9yWVT#afM($Up$}PoA250!Yu!%G`mGkrr9@@e9mEvZ+Be+@o zOIwBAEoq(dMc{SLPfqlAJmzB&rSsq@V&;xhlS5QvmQ64ek2_be0EtZ#)A^)4!ihF` ze&j!PM_69_&?vkFpbiG9N){{rS$7Bly_D+IZ7~ zgFE|MFFfe_@Fama<>OQ5%r6$^_1s;aZ)3Ci;}eNRl;?fjp<`7QlMxIVmCpv@NZLsoW0&XO90^hW$~;ILr+k37 zb4=cy&xn}|+v`TAE4zT&gP+o)#;klrG-qt7_pvbx z4_6)?erYP5P|3Q8i?Lu~bc7T^6yq>qT1@a086Aeq(;s%Td`bdPF&var`rPcZH^U7Qs0i63W&ptFNzk z6XHUKDr&86ez=)!ib{R~4coG;a<}bUTw~c&&!X!0Y2QQt)cxHQc(=Cw=5(m?m~7xt5hE_N)D_gC1)y1SLR zA@(@Uz{H(wTv#k8ClZBLPi!go2;3XW-L$>LZs2@Gm|a;L%ZW0jZP{Klv6+`xM8cil ztO%YvqF?0EsN7gaT~`O3DG#;AiSqN>y}KE8E8VAk#9*f^#VBH_S`Aw-M@*+VEm9G^_GuOfN$Q?>y;|qz+cddBTHBU(<5nOfcMxht@tycQcAhXBgqUGy{ zbdSlc(ynW+Ubp$tc6diz1tJQ^bh`=Y^B{bjDrJxM-ZHu8;uhZ>z<67x#J>oxVVmCB zWpG*P&401IhW*k|Tg=R^MAZ?6Ds@gl-c{2?vA0F6I}jKu;oTO{T+OH zyF&T>jRIeWSxAAok1$9P;OC@rz)kcHXWW7b;Ep6rro7lEciN&wpvSzW%b`f~v7) z(eT8<)KE<5eh*5+%TGwp{PLWc?YR+uxYK{EZc+BN_tts1&FrDSJ0PQ51el>>*u>xE z;7J{mJUu_qqaWd>u8p!e3=#6k0$ZN^YSG(AwNNE<3xZ{>=UqI#b2H~fv>r80Sf6)M zH`hrh?JYU$cJ*p$*mO&SN zX{`PF+=7tu8JZOTkn))>{@Y8Nw%r%HIDO;po}}z=+dRcxnQ*nl%Gw)n_2hXF*h?4d zYZmy*_l1K4+ax6^q9*0$hm=NUn$kSi%WYA)jkNJxUm`Eh6t2(9-!`H3{Czj76gfxH zJg(D)&GUnTWz942*(SUGQl5L3i?3AH0@kb!KHCZ-o}mceUS#tqu#zsZL+ z9YU#XgXb0$NM?ElM3u*Gag`QdEm<9#76p8eW}Q>}TW&)mZjD;U-S%#c7h@l}cAOfU zR5X$P-DgW`IHF*|VUJKngd5G+wXT&U%Ho=A>5`T^s*n;mkk-vMzPg#`sT}CQ`j*lq zP4=z#X_LQYW9#`z$HfYsQm4&lXeh{zWBA)XoLTIzWe`MifmKGR($!Ftb! za5hfK%6--2)E@nhZy?nE?gMp%Z3?lSt8+4?K~^k!6BWnbxtl`FKH#WEQ3A%)Gq9FY z;0ALM@Jy}oiA7woK3TZMC^$8w|MAV{$fHn|v*wg}u&WMUE%n})W@47%yn#%`1qTj-2&i)iC|!Cp)}+4Q##bGJ znkz)g%mu;n5U&kYvmJo)B`X574zwa80@umRdJT54DB9j}OM@m2YqcIP}@ zas`l46)Rjhry$%?D8c@pN75-QJTt2~lARzQusM7=oY!yDs!()^_M(^|x+3G*He$^@ zl$P6VA}Ypu9kZGKLY9tXri@<;}p3FJtyPC@K9i&W11 zK?sT?*@?A9Z(o?cW1RA@lhIw3E8T<==8i{vbyo{eU5CCB?L{3&|2#GLINK~B82`j0 zUgv0ffm^ss`bXK%hl3}NQ%{%Vqi!b&o~*48hxsEyo!IPWgQ?ir!-`=->cz2V9hqNlVwuWmBMG*TwW3OL6~oA< zrh(+dn*~T=4Ri6*?orN+3>Ogo#u4AudY#d;SzihKza}7Du<9^i&XX&M_IxK5Hy*FvwVk zEflgl1rLU@kPPvVAhh~nm;+~QqO{cP!;(M1%{{S#1t8S{*X@dOFIt?7Wfp1gCC4&% z$-vtCe%3vz2^}KZUTQSmoM_v&I-fZgPIt7~xt4jHScA3KZcU_%QBS}ex5Ad&RxURC zYuw4o>`o5+L`U)xhn22oj^$(MqGryRFv?M}i+<47w!_SYd{G~nb;!K6i^-^b;=xwX zUG>Pqo)0o-kvo(x&lXYj$WH}wlsd^8gW}n`*>K3Vmz46{=56TIX}w;&AS!MU`N#_8 z%Y~V5+sFL`mZ;jVjdeiDQe`B^lY*{8@&N3f_Egq*1!X6|$2RLessaIV6kjJQk?XQ}B z)?a4Ce7{o`3DfPtsqT76Kd4;8{DvE^Vd_&3yV>+~YSK1hMGPYW+nFZfWPnpBYB1*- zufK8&#HHHu8?176HQiFvkcdqL=iQbMjO%43oRkQ4!e|KV&3yYMeT& zZM58OnSm=TUt$p($8KYChig1nx&e9UmWG`$%hFc*APJ%G=HfMkpprHkZC1XO!s4-) z`jeiB_**MDiSquLj$`TL)PuH7F-o#R-AEO%!7{<#P0Tr956u6vw$Hks1q|KM>N-6rK?1KJE8YmzV2#eCzNrTJqI$CR^dSI;T^9Rn~uo`vJL}4qd3jU zp^9B$_UDzThi~tNg$WOHh8qI-sf1!u!}@el;bnps3L97B30HtiUpt@}-XtmKn?fk| z$Ovq;*6GzlbMe+UA_}m@=_9rk8E-Ve`aJ^ED4y9T6z+@Bt18KsL{3UmYCK8X;W^!0 zj(&t6Jx=Mg1x$|L3?74dhel!>j+r*REG(IHc*P1gd4`HlIvArLdGX4KCL$|8r(=C{ zbSjTV5E>Z?Fbb$+rgh#$s9I+_DgcdLm7&DxJDjHF`jlQ|M+np%|bsFdvzK zN^7XUSNxH&s)oLbgf{_*P>*DJdva*C7U9Pz@;e;Ge{MF(jC3`oZ3(iD#%8}&tU@8Y zqNV?Jm4a?*+h~QB)NnGBK8qmCp+^CUv>2xT%)ker16aGWrkBwQ&Oke&c;lD})9I>d zSn~GGx?9)@G?t-ThQu{lc{Wz_xdBTB!Nu&n?@iF5J1Fqtlf5!nxkx-TI!FJF7-K-7 zgvf#t7V_N;&dB|X#F(MS(#24aRP`(8@%jAd40uF5z?C!D!~7btYgZiJ>R|j!?Jqj@ z=xNij@>WTog}c%f#w$m>FZ0Fqd{%UKcjlW2@W4c2;W^9$CMgrqR-?UUDZDgOC`IX# zV{rxo`%SdIEFu1qU|B}cy*v{r@uQ%E$wAFq@;+isu=*8+>! zUdtY3GF@d@rb2)mUPCA9%MW1!iA8U702Rajq>X4wHh6FrW?}2mpzIvnsGBIgo{p2*WfvUhiwqgV=!u z-&!<@qu}Ve0iOOum@GdvWE^FALCN1X0WJ%=4dRUQR2FNa#kr)G$exne&%s`@LDL{$ zR1qS`0Zl>~qTC{53J-h4W6-9wvJBO>DLqC*s1?F4#sllM-uo7iu-jFM3;_sYx75tt zN%(=>z13y|!p@)F`9`t%!)wFlv|{GB>mGjfmMa8{h80nva3(P!1OuO`twWWG%_AgO z!@3}*mJ6kim_iT4WGr&qBF~3WwE2VDQcEf9yQl&i1_zOp+xx%Tr6|$z)LaZ4j@W}c zCMgrZ8<0!!lKJ{%D)1QDF@dmwVq4uxh-IxOQB)=In{9=$7A3<8vlOCLwuQuhyV*l} z8a_!Na-g>e5LvYE6={W9WqMK09)Mf&cJ11QXh31Y{#e9|v7riVYleq->|rInjC>9J-Jo`;MVrSK5gCRaUjC?&r6MZ0=1bSaBn^#2HW*L)em=t z*>(|M!0Us=4q=>**h-@7tM$qeSp3493LBd7b^$;NO!sySdE_yO*K2~QGnF`%;3WD>s9xTx%R~dju zIW`uyCI*I%0l()_-_VGi>+3D5U=OUd;pyfe>lg{e22_>bK>Ew0RVL9HR|4&5M8kBp z8~h1AT0<8{4++gwG@Y&gg5cL+@0W~979|GUOb`PVdn=+g!h2P1FmZn552!kWesw+M zDHR}4JrK6q5S~FTFnyNhama$Al$jer=oh4Z+* zm}x>f(|wjJF{go_)W(U;k@S=<=|I~57LRWB)YgJ2Ki0PQc3&oZv}iKsEYs7)yD7?2OV;xS-2wXu5%O+;zMe=G=*WNXos zo<56k%`3Fi_L(+}nOc}v=LIP6&^Af+!zi+Jsy6DsFXAJaZ>e;}rIrXwF}U|^q+0sS z1mg)MxH*Ey3WTTB5Y%me1BV2A*JD|UFGZ)_D>y=cTcto6=v#T%kxY_xGEbS?u znvIou2NAL%>eV@q8nou2@DeuRltu6x6p3o)T;y7vcW<|XR>StkCLKpZXYJS+QDH;% zl9zBlrNN;Q)a5&{31K1PLOO&@^mMkSz?-{!OU+wJ1lLddD(VSG)q{|Rwfl=L6KC-| zouT&c)N8MRCKDlQRvZ%gdTWs8M5-{S%l$BEB z*YgOTR^g}$+`{RHwJ=aX9zRriX(mB;70N(h{;jk%(#KYzfCU8@1J~aR4X(99v4Bsc zuNG^(&AM3m#NAiDGsa3E2KhmJIW1X|`6d>zrOnDm!Z!-?A#%uz(Mh}r`~eTYSe}iT z2RYdvrdADb7WOZ~gZ9AMF$Yy!WqpvPAeCeWEp9iMoTxi$nXsDKTBrvqc!V$o(~4+vO#eSwPlr< z?l9EC=@CE*uT`MJ1RLg!0$B>osE|HW2!J=A(#V*vX{w6Id;3*Hu>|5mW9wl5^)6( zl}NGq3GeOR&oH89`@DI@Q(%dbDeVUAv{R*Ilk zLHg-vwEUyUf!NV;5NUI$#T$J{7HQUHNkW~KaLQ?HFZK_i(YjRjFq6~bF3uw@l5fP4 zY{5CQc=Dx4e{8glL>z4LaC`x}Ag;2^jMm|q9mu1hbb*?Y5H?Ku7SdalFC6{mVXw_x z+;)~0O_%&&IF-p#m^pXIlomoZ6IzAmK<-Xtxvxy(Ktsa@Yw8(1K`1RHb_bfs*SK>O zDNl$Lis{sEz-HmzQ3ylGIWreveGm#qdn+v@8+|?;1@kU4b5~u26AiRW3EQy<3onNg z9&NXo1QztL83lRAgI>|*YQ*%PVZ~~>T@2&WwxFT@0M<|5vPeymWx8ZnWW0t0??4v? z4u>@Cs%=fQ4W!B?@1HIV@Coc_kMN%)tE~sy}usd;3m7Jj;g{^L= zHTjR-wiH4O3^V%{V;?gYSPHBLTrdF9ob!l8Z=0S3#IvFUJ8ojfvIVD5oPzZe0gnRm zeUmOW^Ue1YK*b+aG5+OrB3U3Bog%fwregPUhKz;{C_<1o)biZ3*3~y!eB#=W9dtGDUfn=K)WG1$N?kkhnXOQX8n&dSqBs5tN7pNl>uSY5 zVPKLtWNGf`e1UOy)FTBsM-m<_v=SI%UvH)haRFI5PEr6M%4@BW-z)OGO)*3UxbIG- z296KCYB-2ky>Jc*Uu6OL|etMpxo6bm;0NPCTj z$26@#Civ1+Q*^+q`e7XK70oBZmYuJ1$tpz@Uy;<|^ngZExHrU@F0jH-d7p-(Ivb8W zgu>w<)H~obNm#Ia)G=R>z;tfNbPW0lRQ4~>re4P61Q}@sOrT-qEK%U{cM#R-mPUrd zi{xnLpwzh?S@g5znf)tJ#w>{B^zIL9ns5pWz-_=m6019n_&KMsqR4JCXR&fC?^7*c zB8QfNUo+>3Vr5fd%<%_aE3L;(E0D5AR_YAst|EniL(H=EM0N3dz#dsuTShk@+F;&- zDar<hZxF+8klJ%h4M_tgOLB3FZx#Kj%bA5^H5b8B>rXu^Os?55t8S{-fyK_yioo zgOzNr@gFi8k)?r+sAX>rsq^x@#~nY<`9Z-<(!7;o+`BYlX$|Vo9uUN6~&v zGZIONM-LL5N6fFGSOoC+B~xjWpr)=&sr$3H5-AR-kl#sRK2um;)1b8YfVI^yIgvmU zXcGw)Y@;EPQOkfSIOuZNSB=1)$`2>os%itjg8o-)xq|fqA>~-=qxq1((b>K_giV;A zoYu8N3Jf9%O6h8j`9!PITG$DN<5rD{!;wUHbXuzduiTIa4g0dShX?hbQ3m=;lS4Tl zb+3NbcHm!0lS73V{-kR2tZ#_MJ@N%Yl7nx(THccY(n;-!kO2lW^4xj0yEwug-oO5-ibzQox)GvLbD%o$^ulf;xY@^M@D(5$#lEO7H15P zApRtl8`vOBe%Y+))`VV*(pV&o@KGg70Qp&>G~!q)=o@NDR>Fy16QXqkzHb8QF>3MH zrBZ7o!{!<3vFtFqB(8OamK&G;l4FBS4M8Ae<^8ED4l+3&wuOJq7q| zew%d*hZ!u+S!d$9z=x~GslS1JL$yQ@OTd^>#jG`+;1XNnvyQ+33bbBUO|;7L0v5dm zwN|fc;8|M((!X*Va*d$L!J3I7=tEO1XD6agn^1>F9;+a_3o12M{m^P0uymUB9!T#Y zaWw$(L1hB$91jdAn%eVM^bAS|o+DIv#J{-I%7z@gX_*9jZHb^0kQn=eeF&4Yol)N+J9^BRQ#)pAvX5b7l_arM zq|#XdBt})%&xuh5#N4qS>L^1nMjui!DSY$8=)^Fv&XN|ocRyM-q`f$Tie@E{b@sqI zALOL<4W1Ma>OPtv(9_^I+am3*!uJl;eT@LoCb1Okc08pROi%Yo9%TMS!lIkq`ktL6 zH4n6gLZt!QI(d7sygN>VVAu07W1M2*7$ava;|5(VH*-3NVGGU5$6u!{N=%+(G<|U6 z$RU{D^Ox)5EY6Cz_LKdcEd05xW9;h~PHHL%9B=0hWT=7PDY)+6QR3j^b^AkKjFx#CrV94P z5UL&64CeUqc=1iRSP|C|rqEHp6S{RA^9!Ls<)TMK{X?(TCKo<-kuX?17T7K+4}EbF z3E0ZHj4v7nBTH3z^PZJTdALtuXD~(;+7>4b~%0E z*2uC!sYjw;)tAMHXMOG0NJZavE|Pyoh$Imfz=ALVJ-_g50d*@C@$i_8=(ED)<-(0) zFAc6ZhDy2ID*#VQL!kS$on&}K4#1XrfhO10!reHi>6P`2tg_>Ro)9G} zH`^dFh#V}LAC->7Q}~h-3!xTqG>k*l7EQ7kj9);hNtV@GbD4jwts-4C0mOZ)oTJE4 zkq`>*rfS=QLsjv*`G`en6>JTQhg`9nGx#ZMqQ--|0mAKXJoWM!sn2&P38a&bC2FI2 zGvtP@_G2W|9Ya$%x*4DnbYH?5uQ=Q@nnb7Dq^e$N_4xJJs~>>9B->om%1NlJgnM{o zVh{mkkQig}r6E24t(DI;rg4x}b!CfEkP~<}ZBs$N$g@_S(a3|G20YTd6`6KQzwIbk z5ZjzangEC!>b3T(F~EzQmmikKY1fakM+R|*#aNqZqi zReF&IfUNV#oO)|A)WJp5kZreLG_4Clr3_(iYs=anho2}1PAqck>T0XfC$}>9YRw1g zE8E(X8fD*i-&>Z2GOn<2*{)qlnstwVzJBo#x{G0yqxjMgPzFY=5)=NyG9(hpK9|=a@bQ!SE3xciMLlyOT-drcq?@`sDkxPj(5q@y6ojH?L>R z{qR$|vHh$46Pw^7r>}*?f1~-O(6=q+$o>ktLu^u+duub^xU9;yiF@b$e}DGV-J>Ee zqjvPW-&Y*oJF#TOM~%#Fx}t2}*+-u9&Hg)T&7K(j*J8tL)#HE-sxj6#$*H&L(hlascp!Wu;z-+!cONFTs;WB<$l_k4 zH^e8^)ZCP8YkNz)(PB4x97kfjjS}uAkN%BSL9jPwj_>l9lvD?2zU?{Ee zq;?rj!VY$pG^^Z(;D?w|B>+PoQ1-V@;*SND(Y?E2XbWrN{=3?e19BNTsop540NQRN ziFtWGfbzM)kL9kkqFXr}G7I|7B@qoyZb-$`hxP6?%u_-LZp5%|lC%X>mLw1$+}`r( zUe&F~02lhfNXTPX5Gq!#wNiAkH5_0$VdIi=G4orZoj=es)Uxbq8A(uBM9I+hUd7C1 zRUm`Ip|9dQ{a4~_Gm%slT5q=F-iB0u1llFg&(=e*CSCLuh$(QTc8(z%0!s)Y>3~hK z97Q@FmOKrzINtS&A7FVI$>}91WM1G@uM*4_9pU%rfHAG3)~7NbhVo>s-{MN};x zQX{&n;t*G2%ZO-g8bw~G%|!h;iut9Mpe;djQ9VDx28WKpW$;PSMaDDb~u*C1-qj1g#q!GDuR1*R$hIzR2ZGq*4wc^oCU?H{mHH zC`pJ#9aiw>#p&kGWgWJD+l|R^Z7@4sWDl?UMu3(ERw&~G9;=n$lgNTz6uo_ME{iv0 zknwQ@;6aDReTAE?q*MDCdOf6R_`>9Mq`uyV5d=O$1jxAVA%=j57CTfs@;JIbyJcVs z8{^tTP275@79#stbjct<;V?UbDd~;7SByNVzJW`KjP%k}oWn+gvY8uS3+iLHIzts< zDO51(xZB50;iv)A25_B~y@S)IG^t+LhP`ot7F#SSLDhtYDFUl8Ko z>p~>`!7CW6j}`3xah&>CsQD3yj`LO5uU}um8LZ#-fRm`M{1!;dz%&8Mw{PNf$m~A> zopPqLuC5wb)zPV=`#xpg7BeqGEnie?pWyq4-W!}_+FdpFHT{5o`G`HL-I_AcZe$id zef-N;u+EkZ#W9#bw;qCvO?%>OS+cS3Tm-H~tLd}01(&%-6e{XGe z9QFR9Zt+VkPrU4!dQ*Q?*3;OTmt(*q{vE&1aY$&r*J@`n$v_kQ@?9Aa*y zb8qYReH{C+OPH7ReBxUfPfD7g7Zi7~f1}G5c!W5<`QrN&@yw)-c>Ue)O&$4`!g_O~ z$)WMH_Y~&1{mt)(TAm*Id7Y!}i|nl=AR<@$kdr=6bw*wO8*-?%gAat;J5bacr-Tkk zAD*%-eAdIOK~K_d$OqTxfqzP#H9NkTio$h6;(!sSR-AnrPm*0cj2(=3A7ejViY2e` zb0*>d+Vv?%FUa%B}0wOF4s?f%7&)^2Y=OU_>6wkK4_kR zqY?QpZ?@1wKL&4|i=us>c1nWr=bBxuZ+XfSN9lvDI$5UkRZBtS5*puh0}W1qc`h`> zBkvdt-iku+09vo{eGNDGshgHG3!#tVC^$Qzbd>~R6TZV_5cvwpbDShEX8JkNMDvir zl-4O zrV^&9Y^IFV1SO-i1d*|U>?V365zcp` zIBqn!LN@EpTm*jx++8fMB53#A0bc-i164b8PdJ)FIH)bIu`DDVzydVopr(beo;-mh zgBwxM^+$H|^Bt5YP>n$u1Q`a}BkR#>USTbEOy;QdIBrP+e#*$!K4PN7aJYb{Z`kuYqth$hVp_%5+RWS9XJ z91ZxgCqZ28r5__1+dRU>Jyp`@8 zz=j|M#ePMI2)2t`Q&U&>e834wbEPb?!&z*K8B5oE%iLk;-~8d-=nUV@+-vz7abj_( z-hvZk{VH z)in*?s%HNZ2TW04{8W8eS=aXSS8>xf=%%0gsWa3I zU{v<;Du;&B9EV#i8NYyMv^A;y?mtgEHONy3M7~kb{xQ4w(4!5}XY&6=SJ{nz!c5$? z7D~eK&_s=*lD8rH`OBt{a9U-zK%TYyW${l> z-Y9a^=d7{JWzxSj|Il#6N_pdErFozF3J<`fwh+FX;(2=2k1K z6}kiv?-4h$9D2mRB;}QnaGs6)2CAvZzQ{%rc0p zVZ-GyNP$6ISw*FAp6lAqkL>%bqXpAIvbB$-TLc z@AsYGIp=p?F7rOSy_0fS(0_4yXx6}Ig72ZB3Wkod7Ele7^?X#Lt;W^#LlqD3PTv7G0C}a$KNL!Lm>6gFe1y)B3qMa|2TM0C48`JCymaKxvQB_51*IiC1YgJ|Q)MXW z0Q!j_yivRzcw5Nh&cODKtPv2uShQete-*^!pFW|pA!Bai@gFZ2;Dh=`c- zv7w1vwJ2{uzwc}cc2KXZE$l)DxJXF-zOVebaxjKf@qi&s}sR6 z{uUueQL^}xLV@L)0~!_74yuW{W?6V3sW455!sXNh8TLA${(()n_gxWiQr5j8BYlm& z@CJYfQ)82q(F+S4=aT`dgF-mm)-wCy*00{&FKR=>kHdJu4&QgeI+htuhQ9$t4)PSC zEypkXjD*D<5KsZRGswjk?&R$bhk;IsK&*SmkZH$Lwh#3o!pZ`Ya>OXn@9>tuMy5th zcejF388#uvaYS??zugt1<_LO3xxTI1e8!jA%4#=Br)PHX=}D}RgLTY!xV6`(>K1Q$ zMF$d0j+@A**oK=apH4(~sFl5^h#yNFLk-70WTuw4;eZW(iD^PpYg$cg*2JOj==-_$ zh7^>Mcd0o=LWFY=Q-YF?zDD&Iw(fP; zr6gp8{5f2@yOK9{qogS}wLmX^f@DW%{88zFA*EkuP_}0Zeq8=|CN^!u2sQK^hg+nw z+SkH`xL$pua7EW&ZTvfHsfRM$gC$KN_KkBn@3$qR(#>wqU*GE6cD0&42V-HQ<8$hS zL^D`I*ns8_r)QS=Q}{efCNH%Y1i0QY?vtcUQZH{QpJ!asi=N#Z@DX z3sHtrl!ggr)VTct7AEQ#q?B$2dQ8&XWr)PzyZX$(sxe7Uxjj8ad+kT-JIFSqu3L14 zTj$}S<8eQ#5t>TQ>SG)E?ZZ4Eg`<}lmA#gy&QBC!=Yp zsXhvF3$>*wyxtK3QDvawvB0qr%M zYHQp_?ERn*9-^q>8}*(6y`(SZlIaxGgbl?^84%8t_6gi_X;?-)z{u=UK%=W*-2r-n z^rA0g%$6*=73pzRW+X_jWx__F7jd|tI#KMBB9uekAhj^kWe++SwqqRXh*>Pc$#k*A z^KMDpyHnaCt_)Ey=6nAXSc|1!h*m-*z_eg`aF)P!-VSg?@9(~62Z~{2rh8819}CS6cI|DF4!38wlgq@r?E^T9sANXv4U-K9jX5$ z!=FvWmt-1n9asw-M3ZVsa4p+2g3`anc2ZT2Z33oGIGwnJNr$PsrQ!$@X)BY2Ez{r> zUr!{U?o+0M<*J;Enn7=cg4S2vK?zYV{$#(J{7+`e$Qlu8zh~7Km+(UuydOVo$v@_n zJ7TX3rPO;{c82tMdT&fVr^rG$pUH2L1pz&-y@$EmZ4(mN04H^^^yY~zTE7QLMQ<#|i} zI-{m=t~qG!JJsAftQjgxAuT$}@>-B@;;qJV(V5;{6_C$B& zBKs^Jy5BNz$?hwCe*S5-@#4$V(CF7KK6p`T)WjDq)E;pjyiqB2|KX+yReIhv?53S> zbcd0pcgE&Eqg+j3ugTQc83Wa3nrse!phT(*1T1+aJG8eopeNl33_Rw?(gNtF?)H&? z;L z%ng7G_>V>cDzFVveXep`V8x-aUhk7eB-@*6mtMkfhn8jTq8etgP&p20oOCeaj}kVO SmxZxf#8T*scKys=ANU^`DybU) literal 0 HcmV?d00001 diff --git a/oceanprefilter/utils.go b/oceanprefilter/utils.go index 16394b5..53fe94f 100644 --- a/oceanprefilter/utils.go +++ b/oceanprefilter/utils.go @@ -63,17 +63,17 @@ func splitUpImage(img image.Image, exZone *image.Rectangle, yValue, nh, nv int) return nil, errors.New("input image to split up is nil") } if nv <= 0 { - return nil, fmt.Errorf("number of vertical lines must be greater than 0") + return nil, fmt.Errorf("Vertical bands must be greater than 0, got %v", nv) } if nh <= 0 { - return nil, fmt.Errorf("number of horizontal lines must be greater than 0") + return nil, fmt.Errorf("horizontal bands must be greater than 0, got %v", nh) } // Crop the image from yValue to img.Bounds().Max.Y bounds := img.Bounds() croppedHeight := bounds.Max.Y - yValue if croppedHeight <= 0 { - return nil, fmt.Errorf("yValue must be within the image bounds") + return nil, errors.New("yValue must be within the image bounds") } // edit exluded zone to take the crop into account excludedBox := image.Rectangle{} @@ -115,17 +115,17 @@ func splitUpImageConst(img image.Image, exZone *image.Rectangle, yValue, h, w in return nil, errors.New("input image to split up is nil") } if h <= 0 { - return nil, fmt.Errorf("height must be greater than 0") + return nil, fmt.Errorf("height must be greater than 0, got %v", h) } if w <= 0 { - return nil, fmt.Errorf("width must be greater than 0") + return nil, fmt.Errorf("width must be greater than 0, got %v", w) } // Crop the image from yValue to img.Bounds().Max.Y bounds := img.Bounds() croppedHeight := bounds.Max.Y - yValue if croppedHeight <= 0 { - return nil, fmt.Errorf("yValue must be within the image bounds") + return nil, errors.New("yValue must be within the image bounds") } // edit exluded zone to take the crop into account excludedBox := image.Rectangle{} @@ -170,10 +170,10 @@ func splitUpImageConst(img image.Image, exZone *image.Rectangle, yValue, h, w in if flag { resized := imaging.Resize(bandImg, w, h, imaging.Lanczos) - bandImg = (*image.RGBA)(resized) + images = append(images, resized) + } else { + images = append(images, bandImg) } - - images = append(images, bandImg) } } return images, nil diff --git a/oceanprefilter/xgboost.go b/oceanprefilter/xgboost.go index 09d3a02..710e94b 100644 --- a/oceanprefilter/xgboost.go +++ b/oceanprefilter/xgboost.go @@ -3,11 +3,12 @@ package oceanprefilter import ( "image" "math" + "github.com/Elvenson/xgboost-go/mat" "github.com/pkg/errors" ) -func flatten(matrix mat.SparseMatrix) mat.SparseMatrix{ +func flatten(matrix mat.SparseMatrix) mat.SparseMatrix { flatVector := mat.SparseVector{} offset := 0 @@ -26,8 +27,7 @@ func flatten(matrix mat.SparseMatrix) mat.SparseMatrix{ return flatMatrix } - -func AvgPoolFull(img image.Image, patchSize image.Point) mat.SparseMatrix { +func avgPoolFull(img image.Image, patchSize image.Point) mat.SparseMatrix { bounds := img.Bounds() width, height := bounds.Dx(), bounds.Dy() patchWidth, patchHeight := patchSize.X, patchSize.Y @@ -64,7 +64,7 @@ func AvgPoolFull(img image.Image, patchSize image.Point) mat.SparseMatrix { return mat.SparseMatrix{Vectors: downsize} } -func make_inference(input image.Image, rc runConfig) (bool, error) { +func MakeInference(input image.Image, rc RunConfig) (bool, error) { // find the horizon, take the average y value linePoints, err := findHorizonLine(input) if err != nil { @@ -80,17 +80,17 @@ func make_inference(input image.Image, rc runConfig) (bool, error) { if cropY >= (input.Bounds().Max.Y-1) || cropY <= 1 { return false, errors.Errorf("could not find horizon in image. Got a horizon value of y = %v", cropY) } - imgs, err := splitUpImageConst(input, rc.excludedZone, cropY, 80, 200) + imgs, err := splitUpImageConst(input, rc.ExcludedZone, cropY, 80, 200) if err != nil { return false, err } // new code -> checks if any square is interesting for _, img := range imgs { - in_mat := AvgPoolFull(img, image.Point{10, 2}) + in_mat := avgPoolFull(img, image.Point{10, 2}) in_mat = flatten(in_mat) - result, err := rc.model.Predict(in_mat) + result, err := rc.Model.Predict(in_mat) if err != nil { panic(err) } @@ -101,4 +101,4 @@ func make_inference(input image.Image, rc runConfig) (bool, error) { } return false, nil -} \ No newline at end of file +} From a2867a16ddcc637ea0c277e2b4248f0130cb4a02 Mon Sep 17 00:00:00 2001 From: Emerald Date: Mon, 22 Jul 2024 15:19:08 -0400 Subject: [PATCH 08/12] linting --- oceanprefilter/prefilter_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/oceanprefilter/prefilter_test.go b/oceanprefilter/prefilter_test.go index 79d83fd..14ecb79 100644 --- a/oceanprefilter/prefilter_test.go +++ b/oceanprefilter/prefilter_test.go @@ -13,7 +13,7 @@ import ( ) func TestXGBoostInference(t *testing.T) { - f, err := os.Open("test_data/2288.jpg") + f, _ := os.Open("test_data/2288.jpg") defer f.Close() img, _, err := image.Decode(f) test.That(t, err, test.ShouldBeNil) @@ -44,7 +44,7 @@ func TestSplitData(t *testing.T) { continue } fp := filepath.Join(dir, file.Name()) - f, err := os.Open(fp) + f, _ := os.Open(fp) defer f.Close() img, _, err := image.Decode(f) test.That(t, err, test.ShouldBeNil) @@ -56,7 +56,7 @@ func TestSplitData(t *testing.T) { Max: image.Point{X: 580, Y: 480}, } rc.ExcludedZone = &rect - linePoints, err := findHorizonLine(img) + linePoints, _ := findHorizonLine(img) cropY := int(math.Max(float64(linePoints[0].Y), float64(linePoints[1].Y))) _, err = splitUpImageConst(img, rc.ExcludedZone, cropY, 80, 200) From 2e4836ab6a846d07ab55c8927514c9cd6152e23e Mon Sep 17 00:00:00 2001 From: Emerald Date: Mon, 22 Jul 2024 15:23:13 -0400 Subject: [PATCH 09/12] removing unused private fnc --- oceanprefilter/histogram_compare.go | 206 ---------------------------- oceanprefilter/ml_filtering.go | 31 ----- oceanprefilter/oceanprefilter.go | 1 - oceanprefilter/utils.go | 52 ------- 4 files changed, 290 deletions(-) delete mode 100644 oceanprefilter/histogram_compare.go delete mode 100644 oceanprefilter/ml_filtering.go diff --git a/oceanprefilter/histogram_compare.go b/oceanprefilter/histogram_compare.go deleted file mode 100644 index 6c17083..0000000 --- a/oceanprefilter/histogram_compare.go +++ /dev/null @@ -1,206 +0,0 @@ -package oceanprefilter - -import ( - "fmt" - "image" - "image/draw" - "math" - - "github.com/pkg/errors" -) - -const NVSplit = 4 -const NHSplit = 4 - -type Bucket struct { - Count int -} - -type Histogram struct { - Count int - Buckets []Bucket - spacing float64 -} - -func Hist(buckets int, minVal, maxVal float64, input []float64) Histogram { - // make evenly spaced buckets between min and max - // values outside of min and max are discarded - space := (maxVal - minVal) / float64(buckets) - bkts := make([]Bucket, buckets) - hist := Histogram{ - Count: 0, - Buckets: bkts, - spacing: space, - } - for _, val := range input { - if val >= maxVal || val < minVal { // skip over out of range values - continue - } - bucketIndex := int((val - minVal) / space) - if bucketIndex < 0 || bucketIndex > len(hist.Buckets)-1 { - panic(fmt.Sprintf("value of %v out of range between (%v, %v)", val, maxVal, minVal)) - } - hist.Count++ - hist.Buckets[bucketIndex].Count++ - } - return hist -} - -func histogramChangeFilter( - oldHists []Histogram, newImg image.Image, rc RunConfig, -) (bool, []Histogram, error) { - firstHist := false - thresh := rc.Threshold - if len(oldHists) == 0 { - firstHist = true // get the data for the first histogram - } - // find the horizon, take the average y value - linePoints, err := findHorizonLine(newImg) - if err != nil { - return false, nil, err - } - if len(linePoints) < 2 { - return false, nil, errors.New("function to find the horizon line returned less than 2 points") - } - cropY := int(math.Max(float64(linePoints[0].Y), float64(linePoints[1].Y))) - if rc.debug { - rc.logger.Debugf("found horizon at y = %v", cropY) - } - if cropY >= (newImg.Bounds().Max.Y-1) || cropY <= 1 { - return false, nil, errors.Errorf("could not find horizon in image. Got a horizon value of y = %v", cropY) - } - imgs, err := splitUpImage(newImg, rc.ExcludedZone, cropY, NHSplit, NVSplit) - if err != nil { - return false, nil, err - } - newHists := []Histogram{} // a histogram for each RGB channel - trigger := false - if !firstHist && len(imgs) != len(oldHists) { - return false, nil, errors.New("image changed drastically, cannot evaluate histogram difference. Can be caused by large amounts of motion") - } - for i, img := range imgs { - resultHists := createGrayHistograms(img) - for j, h := range resultHists { - newHist := h - splitTrigger := false - if !firstHist { - oldHist := oldHists[i*len(resultHists)+j] - if len(oldHist.Buckets) != len(newHist.Buckets) { - return false, nil, errors.Errorf("hists should have same number of buckets, old hist: %v, new hist: %v", len(oldHist.Buckets), len(newHist.Buckets)) - } - splitTrigger = histogramTrigger(oldHist, newHist, thresh) - } - newHists = append(newHists, newHist) - if splitTrigger { - trigger = true - } - } - } - return trigger, newHists, nil -} - -// take in an old image histogram, a new image, and return a trigger bool and the new image histogram -// returns a bool based on the thresh value -func histogramTrigger(oldHist, newHist Histogram, thresh float64) bool { - //result := basicCompare(oldHist, newHist) - ecdf1 := histogramToECDF(oldHist) - ecdf2 := histogramToECDF(newHist) - result := kolmogorovSmirnovTest(ecdf1, ecdf2) - trigger := false - if result >= thresh { - trigger = true - } - return trigger -} - -func convertToFloat64(uint8Slice []uint8) []float64 { - float64Slice := make([]float64, len(uint8Slice)) - - for i, v := range uint8Slice { - float64Slice[i] = float64(v) - } - return float64Slice -} - -func createGrayHistograms(pic image.Image) []Histogram { - hists := make([]Histogram, 0, 1) - img := toGray(pic) - pix := []float64{} - for x := 0; x < img.Bounds().Dx(); x++ { - for y := 0; y < img.Bounds().Dy(); y++ { - c := img.GrayAt(x, y) - pix = append(pix, float64(c.Y)) - } - } - hists = append(hists, Hist(32, 0, 256, pix)) // 32 bin, 8 values in each bin in 255 total - return hists -} - -func createColorHistograms(pic image.Image) []Histogram { - hists := make([]Histogram, 0, 3) - img := image.NewRGBA(pic.Bounds()) - if rgbaImg, ok := pic.(*image.RGBA); ok { - img = rgbaImg - } else { - draw.Draw(img, pic.Bounds(), pic, pic.Bounds().Min, draw.Src) - } - rPix := []float64{} - gPix := []float64{} - bPix := []float64{} - for x := 0; x < img.Bounds().Dx(); x++ { - for y := 0; y < img.Bounds().Dy(); y++ { - c := img.RGBAAt(x, y) - rPix = append(rPix, float64(c.R)) - gPix = append(gPix, float64(c.G)) - bPix = append(bPix, float64(c.B)) - } - } - hists = append(hists, Hist(32, 0, 256, rPix)) // 32 bin, 8 values in each bin in 255 total - hists = append(hists, Hist(32, 0, 256, gPix)) // 32 bin, 8 values in each bin in 255 total - hists = append(hists, Hist(32, 0, 256, bPix)) // 32 bin, 8 values in each bin in 255 total - return hists -} - -// basicCompare compares two histograms and returns a measure of their difference -func basicCompare(hist1, hist2 Histogram) float64 { - var sum float64 - for i := range hist1.Buckets { - diff := hist1.Buckets[i].Count - hist2.Buckets[i].Count - if diff < 0 { - diff = -diff - } - sum += float64(diff) - } - // Normalize the difference based on the number of pixels - totalPixels := float64(hist1.Count + hist2.Count) // hist2 has the same number of pixels - score := sum / totalPixels - return score -} - -// histogramToECDF converts a histogram to an empirical cumulative distribution function (ECDF) -// Assumes histogram bins are evenly distributed over the data range -func histogramToECDF(hist Histogram) []float64 { - total := float64(hist.Count) - ecdf := make([]float64, len(hist.Buckets)) - cumulativeCount := 0.0 - if total == 0 { - return ecdf - } - for i, bkt := range hist.Buckets { - cumulativeCount += float64(bkt.Count) - ecdf[i] = cumulativeCount / total - } - return ecdf -} - -// kolmogorovSmirnovTest computes the Kolmogorov-Smirnov statistic for two ECDFs -func kolmogorovSmirnovTest(ecdf1, ecdf2 []float64) float64 { - maxDiff := 0.0 - for i := range ecdf1 { - diff := math.Abs(ecdf1[i] - ecdf2[i]) - if diff > maxDiff { - maxDiff = diff - } - } - return maxDiff -} diff --git a/oceanprefilter/ml_filtering.go b/oceanprefilter/ml_filtering.go deleted file mode 100644 index 5d6b029..0000000 --- a/oceanprefilter/ml_filtering.go +++ /dev/null @@ -1,31 +0,0 @@ -package oceanprefilter - -import ( - "context" - "image" -) - -func mlFilter(ctx context.Context, img image.Image, rc RunConfig) (bool, error) { - // first try if the optional detection is present - if rc.detector == nil { - return false, nil - } - dets, _ := rc.detector.Detections(ctx, img, nil) - if dets == nil { - return false, nil - } - if rc.chosenLabels == nil { - if len(dets) != 0 { - return true, nil - } - return false, nil - } - for _, d := range dets { - if conf, ok := rc.chosenLabels[d.Label()]; ok { - if d.Score() >= conf { - return true, nil - } - } - } - return false, nil -} diff --git a/oceanprefilter/oceanprefilter.go b/oceanprefilter/oceanprefilter.go index 15dd2eb..675b4cf 100644 --- a/oceanprefilter/oceanprefilter.go +++ b/oceanprefilter/oceanprefilter.go @@ -90,7 +90,6 @@ type RunConfig struct { logger logging.Logger cam camera.Camera camName string - detector vision.Service chosenLabels map[string]float64 frequency float64 minConfidence float64 diff --git a/oceanprefilter/utils.go b/oceanprefilter/utils.go index 53fe94f..9f67ac9 100644 --- a/oceanprefilter/utils.go +++ b/oceanprefilter/utils.go @@ -56,58 +56,6 @@ func toGray(pic image.Image) *image.Gray { return gray } -// crop the image from yValue -> img.Bounds().Max.Y -// and then split the cropped image into nh horizontal and nv vertical bands of equal height and width -func splitUpImage(img image.Image, exZone *image.Rectangle, yValue, nh, nv int) ([]image.Image, error) { - if img == nil { - return nil, errors.New("input image to split up is nil") - } - if nv <= 0 { - return nil, fmt.Errorf("Vertical bands must be greater than 0, got %v", nv) - } - if nh <= 0 { - return nil, fmt.Errorf("horizontal bands must be greater than 0, got %v", nh) - } - - // Crop the image from yValue to img.Bounds().Max.Y - bounds := img.Bounds() - croppedHeight := bounds.Max.Y - yValue - if croppedHeight <= 0 { - return nil, errors.New("yValue must be within the image bounds") - } - // edit exluded zone to take the crop into account - excludedBox := image.Rectangle{} - if exZone != nil { - excludedBox.Min.X = exZone.Min.X - excludedBox.Min.Y = exZone.Min.Y - yValue - excludedBox.Max.X = exZone.Max.X - excludedBox.Max.Y = exZone.Max.Y - yValue - } - croppedRect := image.Rect(bounds.Min.X, yValue, bounds.Max.X, bounds.Max.Y) - croppedImg := image.NewRGBA(croppedRect) - draw.Draw(croppedImg, croppedImg.Bounds(), img, croppedRect.Min, draw.Src) - - // Split the cropped image into n horizontal bands - bandHeight := croppedImg.Bounds().Dy() /nh - bandWidth := croppedImg.Bounds().Dx() / nv - images := make([]image.Image, 0, nv*nh) - for i := 0; i < nh; i++ { - for j := 0; j < nv; j++ { - bandRect := image.Rect(j*bandWidth, i*bandHeight, (j+1)*bandWidth, (i+1)*bandHeight) - // if rect in excluded zone, skip it - if exZone != nil && bandRect.Overlaps(excludedBox) { - continue - } - bandImg := image.NewRGBA(bandRect) - draw.Draw(bandImg, bandImg.Bounds(), croppedImg, image.Point{bandRect.Min.X, bandRect.Min.Y + yValue}, draw.Src) - - images = append(images, bandImg) - } - } - return images, nil -} - - // crop the image from yValue -> img.Bounds().Max.Y // and then split the cropped image into nh horizontal and nv vertical bands of equal height and width (dimensions given) func splitUpImageConst(img image.Image, exZone *image.Rectangle, yValue, h, w int) ([]image.Image, error) { From f7b4c8c8c764bf2d4c63f35636a68897e202670f Mon Sep 17 00:00:00 2001 From: Emerald Date: Mon, 22 Jul 2024 16:50:31 -0400 Subject: [PATCH 10/12] pr review --- oceanprefilter/oceanprefilter.go | 5 +---- oceanprefilter/prefilter_test.go | 9 ++++++--- oceanprefilter/utils.go | 5 ++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/oceanprefilter/oceanprefilter.go b/oceanprefilter/oceanprefilter.go index 675b4cf..d6ec35c 100644 --- a/oceanprefilter/oceanprefilter.go +++ b/oceanprefilter/oceanprefilter.go @@ -232,10 +232,7 @@ func run(ctx context.Context, rc RunConfig, trigger *atomic.Bool, currImg *atomi // this function is where the decision happens isTriggered, err := MakeInference(img, rc) if err != nil { - rc.logger.Infow("inference error", "error", err.Error()) - if rc.motionTrigger { - isTriggered = true - } + return errors.Errorf("inference error: %q", err) } if isTriggered { triggerCount = triggerCountdown diff --git a/oceanprefilter/prefilter_test.go b/oceanprefilter/prefilter_test.go index 14ecb79..b284104 100644 --- a/oceanprefilter/prefilter_test.go +++ b/oceanprefilter/prefilter_test.go @@ -13,7 +13,8 @@ import ( ) func TestXGBoostInference(t *testing.T) { - f, _ := os.Open("test_data/2288.jpg") + f, err := os.Open("test_data/2288.jpg") + test.That(t, err, test.ShouldBeNil) defer f.Close() img, _, err := image.Decode(f) test.That(t, err, test.ShouldBeNil) @@ -44,7 +45,8 @@ func TestSplitData(t *testing.T) { continue } fp := filepath.Join(dir, file.Name()) - f, _ := os.Open(fp) + f, err := os.Open(fp) + test.That(t, err, test.ShouldBeNil) defer f.Close() img, _, err := image.Decode(f) test.That(t, err, test.ShouldBeNil) @@ -56,7 +58,8 @@ func TestSplitData(t *testing.T) { Max: image.Point{X: 580, Y: 480}, } rc.ExcludedZone = &rect - linePoints, _ := findHorizonLine(img) + linePoints, err := findHorizonLine(img) + test.That(t, err, test.ShouldBeNil) cropY := int(math.Max(float64(linePoints[0].Y), float64(linePoints[1].Y))) _, err = splitUpImageConst(img, rc.ExcludedZone, cropY, 80, 200) diff --git a/oceanprefilter/utils.go b/oceanprefilter/utils.go index 9f67ac9..c7f9083 100644 --- a/oceanprefilter/utils.go +++ b/oceanprefilter/utils.go @@ -1,7 +1,6 @@ package oceanprefilter import ( - "fmt" "image" "image/draw" "math" @@ -63,10 +62,10 @@ func splitUpImageConst(img image.Image, exZone *image.Rectangle, yValue, h, w in return nil, errors.New("input image to split up is nil") } if h <= 0 { - return nil, fmt.Errorf("height must be greater than 0, got %v", h) + return nil, errors.Errorf("height must be greater than 0, got %v", h) } if w <= 0 { - return nil, fmt.Errorf("width must be greater than 0, got %v", w) + return nil, errors.Errorf("width must be greater than 0, got %v", w) } // Crop the image from yValue to img.Bounds().Max.Y From 19166db5b951bbd373fdcfb684f5c44e81b68b77 Mon Sep 17 00:00:00 2001 From: Emerald Date: Tue, 23 Jul 2024 09:57:20 -0400 Subject: [PATCH 11/12] linting failed --- go.mod | 5 +- go.sum | 12 --- oceanprefilter/histogram_compare.go | 155 ---------------------------- 3 files changed, 2 insertions(+), 170 deletions(-) delete mode 100644 oceanprefilter/histogram_compare.go diff --git a/go.mod b/go.mod index 36fdc78..5f54ea3 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.21.12 require ( github.com/Elvenson/xgboost-go v0.1.4 - github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 + github.com/disintegration/imaging v1.6.2 github.com/pkg/errors v0.9.1 go.viam.com/rdk v0.28.0 go.viam.com/test v1.1.1-0.20220913152726-5da9916c08a2 @@ -37,7 +37,6 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect - github.com/disintegration/imaging v1.6.2 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/edaniels/golog v0.0.0-20230215213219-28954395e8d0 // indirect github.com/edaniels/lidario v0.0.0-20220607182921-5879aa7b96dd // indirect @@ -62,7 +61,7 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/gonuts/binary v0.2.0 // indirect github.com/google/flatbuffers v2.0.8+incompatible // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/s2a-go v0.1.4 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect diff --git a/go.sum b/go.sum index bf1ac6d..c8c5a0f 100644 --- a/go.sum +++ b/go.sum @@ -434,8 +434,6 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -1180,8 +1178,6 @@ golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+o golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= -golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1207,8 +1203,6 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1287,8 +1281,6 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1398,8 +1390,6 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1504,8 +1494,6 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.17.0 h1:FvmRgNOcs3kOa+T20R1uhfP9F6HgG2mfxDv1vrx1Htc= -golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/oceanprefilter/histogram_compare.go b/oceanprefilter/histogram_compare.go deleted file mode 100644 index 7aedb94..0000000 --- a/oceanprefilter/histogram_compare.go +++ /dev/null @@ -1,155 +0,0 @@ -package oceanprefilter - -import ( - "fmt" - "image" - "math" - - "github.com/pkg/errors" -) - -const NVSplit = 4 -const NHSplit = 4 - -type Bucket struct { - Count int -} - -type Histogram struct { - Count int - Buckets []Bucket - spacing float64 -} - -func Hist(buckets int, minVal, maxVal float64, input []float64) Histogram { - // make evenly spaced buckets between min and max - // values outside of min and max are discarded - space := (maxVal - minVal) / float64(buckets) - bkts := make([]Bucket, buckets) - hist := Histogram{ - Count: 0, - Buckets: bkts, - spacing: space, - } - for _, val := range input { - if val >= maxVal || val < minVal { // skip over out of range values - continue - } - bucketIndex := int((val - minVal) / space) - if bucketIndex < 0 || bucketIndex > len(hist.Buckets)-1 { - panic(fmt.Sprintf("value of %v out of range between (%v, %v)", val, maxVal, minVal)) - } - hist.Count++ - hist.Buckets[bucketIndex].Count++ - } - return hist -} - -func histogramChangeFilter( - oldHists []Histogram, newImg image.Image, rc runConfig, -) (bool, []Histogram, error) { - firstHist := false - thresh := rc.threshold - if len(oldHists) == 0 { - firstHist = true // get the data for the first histogram - } - // find the horizon, take the average y value - linePoints, err := findHorizonLine(newImg) - if err != nil { - return false, nil, err - } - if len(linePoints) < 2 { - return false, nil, errors.New("function to find the horizon line returned less than 2 points") - } - cropY := int(math.Max(float64(linePoints[0].Y), float64(linePoints[1].Y))) - if rc.debug { - rc.logger.Debugf("found horizon at y = %v", cropY) - } - if cropY >= (newImg.Bounds().Max.Y-1) || cropY <= 1 { - return false, nil, errors.Errorf("could not find horizon in image. Got a horizon value of y = %v", cropY) - } - imgs, err := splitUpImage(newImg, rc.excludedZone, cropY, NHSplit, NVSplit) - if err != nil { - return false, nil, err - } - newHists := []Histogram{} // a histogram for each RGB channel - trigger := false - if !firstHist && len(imgs) != len(oldHists) { - return false, nil, errors.New("image changed drastically, cannot evaluate histogram difference. Can be caused by large amounts of motion") - } - for i, img := range imgs { - resultHists := createGrayHistograms(img) - for j, h := range resultHists { - newHist := h - splitTrigger := false - if !firstHist { - oldHist := oldHists[i*len(resultHists)+j] - if len(oldHist.Buckets) != len(newHist.Buckets) { - return false, nil, errors.Errorf("hists should have same number of buckets, old hist: %v, new hist: %v", len(oldHist.Buckets), len(newHist.Buckets)) - } - splitTrigger = histogramTrigger(oldHist, newHist, thresh) - } - newHists = append(newHists, newHist) - if splitTrigger { - trigger = true - } - } - } - return trigger, newHists, nil -} - -// take in an old image histogram, a new image, and return a trigger bool and the new image histogram -// returns a bool based on the thresh value -func histogramTrigger(oldHist, newHist Histogram, thresh float64) bool { - //result := basicCompare(oldHist, newHist) - ecdf1 := histogramToECDF(oldHist) - ecdf2 := histogramToECDF(newHist) - result := kolmogorovSmirnovTest(ecdf1, ecdf2) - trigger := false - if result >= thresh { - trigger = true - } - return trigger -} - -func createGrayHistograms(pic image.Image) []Histogram { - hists := make([]Histogram, 0, 1) - img := toGray(pic) - pix := []float64{} - for x := 0; x < img.Bounds().Dx(); x++ { - for y := 0; y < img.Bounds().Dy(); y++ { - c := img.GrayAt(x, y) - pix = append(pix, float64(c.Y)) - } - } - hists = append(hists, Hist(32, 0, 256, pix)) // 32 bin, 8 values in each bin in 255 total - return hists -} - -// histogramToECDF converts a histogram to an empirical cumulative distribution function (ECDF) -// Assumes histogram bins are evenly distributed over the data range -func histogramToECDF(hist Histogram) []float64 { - total := float64(hist.Count) - ecdf := make([]float64, len(hist.Buckets)) - cumulativeCount := 0.0 - if total == 0 { - return ecdf - } - for i, bkt := range hist.Buckets { - cumulativeCount += float64(bkt.Count) - ecdf[i] = cumulativeCount / total - } - return ecdf -} - -// kolmogorovSmirnovTest computes the Kolmogorov-Smirnov statistic for two ECDFs -func kolmogorovSmirnovTest(ecdf1, ecdf2 []float64) float64 { - maxDiff := 0.0 - for i := range ecdf1 { - diff := math.Abs(ecdf1[i] - ecdf2[i]) - if diff > maxDiff { - maxDiff = diff - } - } - return maxDiff -} From 83f26a7dc79799fa91cc7d9c38ac8973478b0587 Mon Sep 17 00:00:00 2001 From: Emerald Date: Tue, 23 Jul 2024 12:03:31 -0400 Subject: [PATCH 12/12] updateing test --- oceanprefilter/oceanprefilter_test.go | 68 ++++++++++++--------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/oceanprefilter/oceanprefilter_test.go b/oceanprefilter/oceanprefilter_test.go index 10e2861..e452eab 100644 --- a/oceanprefilter/oceanprefilter_test.go +++ b/oceanprefilter/oceanprefilter_test.go @@ -7,11 +7,14 @@ import ( "sync/atomic" "testing" "unsafe" - + "os" "go.viam.com/rdk/services/vision" "go.viam.com/rdk/vision/classification" "go.viam.com/rdk/vision/viscapture" "go.viam.com/test" + + xgb "github.com/Elvenson/xgboost-go" + "github.com/Elvenson/xgboost-go/activation" ) // MockImage creates a mock RGBA image for testing purposes. @@ -35,7 +38,7 @@ func TestConfigValidate(t *testing.T) { path := "test_path" dependencies, err := cfg.Validate(path) test.That(t, dependencies, test.ShouldBeNil) - test.That(t, err.Error(), test.ShouldEqual, `expected "camera_name" attribute for object tracker "test_path"`) + test.That(t, err, test.ShouldBeNil) // Test case where detector name is empty cfg = &Config{ @@ -46,16 +49,6 @@ func TestConfigValidate(t *testing.T) { dependencies, err = cfg.Validate(path) test.That(t, dependencies, test.ShouldResemble, []string{"camera1"}) test.That(t, err, test.ShouldBeNil) - - // Test case where both camera name and detector name are provided - cfg = &Config{ - CameraName: "camera1", - DetectorName: "detector1", - } - path = "test_path" - dependencies, err = cfg.Validate(path) - test.That(t, dependencies, test.ShouldResemble, []string{"camera1", "detector1"}) - test.That(t, err, test.ShouldBeNil) } func TestClassificationsFromCamera(t *testing.T) { @@ -104,43 +97,42 @@ func TestClassificationsFromCamera(t *testing.T) { } func TestClassifications(t *testing.T) { + // only tests that get_classifications works with a given image + // context no longer needed for this function + rc := RunConfig{} + ensemble, err := xgb.LoadXGBoostFromJSONBytes(modelbytes, + "", 2, 8, &activation.Softmax{}) + test.That(t, err, test.ShouldBeNil) + rc.Model = ensemble + rc.Threshold = 0.25 + rect := image.Rectangle{ + Min: image.Point{X: 250, Y: 350}, + Max: image.Point{X: 580, Y: 480}, + } + rc.ExcludedZone = &rect pf := &prefilter{ triggerFlag: &atomic.Bool{}, cancelContext: context.Background(), + rc: rc, } ctx := context.Background() - img := image.NewRGBA(image.Rect(0, 0, 100, 100)) + f, err := os.Open("test_data/2288.jpg") + test.That(t, err, test.ShouldBeNil) + defer f.Close() + img, _, err := image.Decode(f) + test.That(t, err, test.ShouldBeNil) + + classifications, err := pf.Classifications(ctx, img, 1, nil) + test.That(t, err, test.ShouldBeNil) + test.That(t, classifications, test.ShouldNotBeNil) // Test case where context is canceled cancelledCtx, cancel := context.WithCancel(ctx) cancel() - classifications, err := pf.Classifications(cancelledCtx, img, 1, nil) - test.That(t, classifications, test.ShouldBeNil) - test.That(t, err.Error(), test.ShouldEqual, "module might be configuring: context canceled") - - // Test case where internal context is canceled - cancelledInternalCtx, internalCancel := context.WithCancel(ctx) - pf.cancelContext = cancelledInternalCtx - internalCancel() - classifications, err = pf.Classifications(ctx, img, 1, nil) - test.That(t, classifications, test.ShouldBeNil) - test.That(t, err.Error(), test.ShouldEqual, "lost connection with background camera stream loop: context canceled") - - // Test case where trigger flag is not set - pf.cancelContext = context.Background() - classifications, err = pf.Classifications(ctx, img, 1, nil) - test.That(t, classifications, test.ShouldBeEmpty) - test.That(t, err, test.ShouldBeNil) - - // Test case where trigger flag is set - pf.triggerFlag.Store(true) - classifications, err = pf.Classifications(ctx, img, 1, nil) - expectedClassifications := classification.Classifications{ - classification.NewClassification(1.0, "TRIGGER"), - } - test.That(t, classifications, test.ShouldResemble, expectedClassifications) + classifications, err = pf.Classifications(cancelledCtx, img, 1, nil) test.That(t, err, test.ShouldBeNil) + test.That(t, classifications, test.ShouldNotBeNil) } func TestGetProperties(t *testing.T) {