Skip to content

Instantly share code, notes, and snippets.

@Yardanico
Last active January 9, 2018 10:25
Show Gist options
  • Save Yardanico/e42fc343cbc3884871229aee376e51f3 to your computer and use it in GitHub Desktop.
Save Yardanico/e42fc343cbc3884871229aee376e51f3 to your computer and use it in GitHub Desktop.
osu file format v14
[General]
AudioFilename: control.mp3
AudioLeadIn: 1000
PreviewTime: 85495
Countdown: 0
SampleSet: Normal
StackLeniency: 0.8
Mode: 0
LetterboxInBreaks: 0
WidescreenStoryboard: 0
[Editor]
Bookmarks: 1132,4041,15677,27313,38950,50586,62222,73859,82586,85495,108768,114586,126222,137859,149495,158222,161132,184404,190223,196041,207677,219313,225859,226586,238222,246950,249677,251313,274586,276041,287677,299313,300768,308404,309495
DistanceSpacing: 1.2
BeatDivisor: 4
GridSize: 8
TimelineZoom: 3.499999
[Metadata]
Title:Remote Control
TitleUnicode:リモコン
Artist:kradness&Reol
ArtistUnicode:kradness&れをる
Creator:Taeyang
Version:Max Control!
Source:
Tags:Jesus-P じーざすP Giga Official Rimokon Wonderful*Opportunity Kagamine Rin Len Glider
BeatmapID:774965
BeatmapSetID:351630
[Difficulty]
HPDrainRate:6.5
CircleSize:4
OverallDifficulty:9
ApproachRate:9.2
SliderMultiplier:1.72
SliderTickRate:1
[Events]
//Background and Video events
0,0,"reol.jpg",0,0
//Break Periods
2,184604,189653
//Storyboard Layer 0 (Background)
//Storyboard Layer 1 (Fail)
//Storyboard Layer 2 (Pass)
//Storyboard Layer 3 (Foreground)
//Storyboard Sound Samples
[TimingPoints]
-1777,363.636363636364,4,2,0,30,1,0
1132,-133.333333333333,4,2,0,30,0,0
1404,-133.333333333333,4,2,0,5,0,0
1495,-133.333333333333,4,2,0,15,0,0
2495,-133.333333333333,4,2,0,5,0,0
2586,-133.333333333333,4,2,0,25,0,0
2859,-133.333333333333,4,2,0,15,0,0
3313,-133.333333333333,4,2,0,25,0,0
3586,-133.333333333333,4,2,0,15,0,0
4041,-133.333333333333,4,2,1,30,0,0
15677,-100,4,2,1,50,0,0
16404,-133.333333333333,4,2,1,40,0,0
17859,-133.333333333333,4,2,0,40,0,0
18586,-133.333333333333,4,2,1,40,0,0
20950,-133.333333333333,4,2,0,40,0,0
21495,-100,4,2,1,50,0,0
22222,-133.333333333333,4,2,1,40,0,0
23677,-133.333333333333,4,2,0,40,0,0
24404,-133.333333333333,4,2,1,40,0,0
26768,-133.333333333333,4,2,0,40,0,0
27313,-100,4,2,2,50,0,0
33132,-100,4,2,2,55,0,0
37495,-100,4,2,2,60,0,0
37677,-100,4,2,2,70,0,0
37859,-100,4,2,2,80,0,0
38223,-100,4,2,2,70,0,0
38404,-100,4,2,2,60,0,0
38586,-133.333333333333,4,2,2,55,0,0
38859,-133.333333333333,4,2,2,5,0,0
38950,-83.3333333333333,4,2,3,60,0,0
49313,-83.3333333333333,4,2,3,50,0,0
50041,-83.3333333333333,4,2,3,60,0,0
50586,-100,4,2,4,50,0,0
62223,-83.3333333333333,4,2,3,60,0,0
73859,-100,4,2,4,50,0,0
82586,-100,4,2,3,60,0,0
82768,-100,4,2,4,50,0,0
83313,-100,4,2,3,60,0,0
83495,-100,4,2,4,50,0,0
83859,-100,4,2,3,60,0,0
84223,-100,4,2,4,50,0,0
84404,-100,4,2,3,60,0,0
84586,-133.333333333333,4,2,4,50,0,0
85041,-133.333333333333,4,2,4,5,0,0
85132,-50,4,2,4,60,0,0
85404,-50,4,2,4,5,0,0
85495,-66.6666666666667,4,1,2,70,0,1
108768,-66.6666666666667,4,2,4,55,0,0
114041,-66.6666666666667,4,2,4,60,0,0
114586,-83.3333333333333,4,2,3,60,0,0
124950,-83.3333333333333,4,2,3,50,0,0
125495,-83.3333333333333,4,2,3,60,0,0
126223,-100,4,2,4,50,0,0
137859,-83.3333333333333,4,2,3,60,0,0
149495,-100,4,2,4,50,0,0
158223,-100,4,2,3,60,0,0
158404,-100,4,2,4,50,0,0
158950,-100,4,2,3,60,0,0
159132,-100,4,2,4,50,0,0
159495,-100,4,2,3,60,0,0
159859,-100,4,2,4,50,0,0
160041,-100,4,2,3,60,0,0
160223,-133.333333333333,4,2,4,50,0,0
160677,-133.333333333333,4,2,4,5,0,0
160768,-50,4,2,1,60,0,0
161132,-66.6666666666667,4,1,2,70,0,1
184404,-66.6666666666667,4,1,2,60,0,0
190223,-133.333333333333,4,2,4,40,0,0
196041,-100,4,2,4,50,0,0
207677,-100,4,2,4,60,0,0
219313,-66.6666666666667,4,2,4,50,0,0
220768,-66.6666666666667,4,2,4,60,0,0
222223,-66.6666666666667,4,2,4,50,0,0
222950,-66.6666666666667,4,2,4,60,0,0
223677,-66.6666666666667,4,2,4,50,0,0
224041,-66.6666666666667,4,2,4,60,0,0
224404,-66.6666666666667,4,2,4,50,0,0
224586,-66.6666666666667,4,2,4,60,0,0
224768,-66.6666666666667,4,2,4,50,0,0
224950,-66.6666666666667,4,2,4,60,0,0
225132,-66.6666666666667,4,2,4,70,0,0
225859,-100,4,2,4,50,0,0
226132,-100,4,2,4,5,0,0
226223,-50,4,2,4,55,0,0
226495,-50,4,2,4,5,0,0
226586,-83.3333333333333,4,2,3,60,0,0
238223,-100,4,2,4,50,0,0
246950,-100,4,2,3,60,0,0
247132,-100,4,2,4,50,0,0
247677,-100,4,2,3,60,0,0
247859,-100,4,2,4,50,0,0
248223,-100,4,2,3,60,0,0
248950,-100,4,2,4,50,0,0
249677,-83.3333333333333,4,2,3,70,0,0
250404,-83.3333333333333,4,2,4,60,0,0
251132,-83.3333333333333,4,2,3,70,0,0
251313,-62.5,4,1,2,80,0,1
274223,-62.5,4,1,2,85,0,1
274404,-62.5,4,1,2,90,0,0
274950,-100,4,2,2,70,0,0
275223,-100,4,2,2,5,0,0
275313,-50,4,2,2,70,0,0
275586,-50,4,2,2,5,0,0
275677,-66.6666666666667,4,2,2,70,0,0
275950,-66.6666666666667,4,2,2,5,0,0
276041,-62.5,4,1,2,80,0,1
286223,-62.5,4,1,2,70,0,1
286404,-62.5,4,1,2,80,0,1
286586,-62.5,4,1,2,90,0,1
286950,-62.5,4,1,2,80,0,1
287132,-62.5,4,1,2,70,0,1
287313,-62.5,4,1,2,60,0,1
287677,-62.5,4,1,2,80,0,1
300404,-62.5,4,1,2,90,0,1
300768,-62.5,4,1,2,100,0,0
301495,-62.5,4,2,2,92,0,0
302223,-62.5,4,2,2,84,0,0
302950,-62.5,4,2,2,76,0,0
303677,-62.5,4,2,2,68,0,0
304404,-62.5,4,2,2,60,0,0
305132,-62.5,4,2,2,52,0,0
305859,-62.5,4,2,2,44,0,0
306586,-62.5,4,2,2,36,0,0
307313,-62.5,4,2,2,28,0,0
308041,-62.5,4,2,2,20,0,0
308404,-62.5,4,1,4,10,0,0
[Colours]
Combo1 : 189,143,214
Combo2 : 223,125,117
Combo3 : 166,219,106
Combo4 : 120,163,209
[HitObjects]
83,59,1132,6,0,P|102:102|147:125,1,96.7500036907198,8|0,0:3|0:0,0:0:0:0:
224,138,1495,2,0,P|139:198|282:194,1,354.750013532639,4|0,0:3|0:0,0:0:0:0:
304,131,2586,6,0,P|341:135|385:129,1,64.5000024604798,8|0,0:3|0:0,0:0:0:0:
448,123,2859,2,0,L|443:225,1,96.7500036907198,4|0,0:3|0:0,0:0:0:0:
293,277,3313,6,0,L|297:202,1,64.5000024604798,8|0,0:3|0:0,0:0:0:0:
304,131,3586,2,0,P|256:124|208:131,1,96.7500036907198,4|0,0:3|0:0,0:0:0:0:
58,192,4041,5,2,0:0:0:0:
113,335,4404,1,8,0:0:0:0:
201,136,4768,5,2,0:0:0:0:
256,279,5132,1,8,0:0:0:0:
494,175,5495,5,2,0:0:0:0:
428,346,5859,1,8,0:0:0:0:
322,107,6223,5,8,0:3:0:0:
256,279,6586,1,4,3:0:0:0:
58,192,6950,6,0,B|72:161|72:161|176:149,1,129.00000492096,2|8,0:0|0:0,0:0:0:0:
454,192,7677,2,0,B|440:161|440:161|336:149,1,129.00000492096,2|8,0:0|0:0,0:0:0:0:
112,312,8404,5,2,0:0:0:0:
400,312,8768,1,8,0:0:0:0:
256,104,9132,1,8,0:3:0:0:
256,368,9495,1,4,0:3:0:0:
104,67,9859,5,2,0:0:0:0:
256,104,10223,1,8,0:0:0:0:
408,104,10586,5,2,0:0:0:0:
256,141,10949,1,8,0:0:0:0:
74,141,11313,5,2,0:0:0:0:
256,185,11676,1,8,0:0:0:0:
438,185,12040,5,8,0:3:0:0:
256,229,12403,1,4,0:3:0:0:
74,141,12768,6,0,B|105:155|105:155|117:259,1,129.00000492096,2|8,0:0|0:0,0:0:0:0:
438,141,13495,2,0,B|407:155|407:155|395:259,1,129.00000492096,2|8,0:0|0:0,0:0:0:0:
256,344,14222,5,2,0:0:0:0:
256,40,14586,1,8,0:0:0:0:
170,277,14950,1,8,0:3:0:0:
341,106,15314,1,4,0:3:0:0:
158,192,15677,6,0,L|150:96,1,86,2|2,0:0|0:0,0:0:0:0:
361,95,16041,2,0,L|354:151,1,43,8|0,0:0|0:0,0:0:0:0:
340,242,16222,1,2,0:0:0:0:
177,183,16404,6,0,L|171:95,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
341,106,16768,2,0,L|337:154,1,32.2500012302399,8|0,0:0|0:0,0:0:0:0:
330,223,16950,1,2,0:0:0:0:
181,300,17132,6,0,P|151:306|116:302,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
43,276,17404,1,2,0:0:0:0:
27,268,17495,2,0,L|25:202,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
111,71,17859,1,0,0:0:0:0:
111,71,18042,2,0,L|112:135,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
187,201,18405,1,2,0:0:0:0:
270,151,18586,6,0,P|300:145|335:149,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
408,175,18859,1,2,0:0:0:0:
424,183,18950,2,0,L|426:249,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
288,328,19313,2,0,L|286:262,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
279,135,19677,1,2,0:0:0:0:
270,151,20041,6,0,L|149:162,1,96.7500036907198,2|0,0:0|0:0,0:0:0:0:
125,166,20404,2,0,P|123:201|130:235,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
192,303,20768,1,2,0:0:0:0:
273,250,20950,2,0,P|305:251|335:267,2,64.5000024604798,2|2|2,0:0|0:0|0:0,0:0:0:0:
114,269,21495,6,0,P|109:226|119:184,1,86,2|2,0:0|0:0,0:0:0:0:
326,187,21859,2,0,L|322:240,1,43,8|0,0:0|0:0,0:0:0:0:
288,328,22041,1,2,0:0:0:0:
134,262,22222,6,0,P|133:216|144:184,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
309,199,22586,2,0,L|306:250,1,32.2500012302399,8|0,0:0|0:0,0:0:0:0:
280,312,22768,1,2,0:0:0:0:
114,269,22950,6,0,L|116:182,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
118,119,23222,1,2,0:0:0:0:
102,127,23313,2,0,P|53:122|34:111,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
205,57,23677,1,0,0:0:0:0:
205,57,23859,2,0,L|203:121,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
197,217,24222,1,2,0:0:0:0:
288,189,24404,6,0,P|338:188|374:197,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
433,209,24677,1,2,0:0:0:0:
446,197,24768,2,0,L|450:128,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
392,52,25132,2,0,P|361:44|329:45,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
205,57,25495,1,2,0:0:0:0:
191,69,25859,6,0,L|194:177,1,96.7500036907198,2|0,0:0|0:0,0:0:0:0:
197,217,26222,2,0,P|228:222|260:219,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
419,271,26586,2,0,P|387:276|355:273,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
222,345,26950,2,0,P|253:350|285:347,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
443,257,27313,6,0,L|435:342,1,86,2|0,0:0|0:0,0:0:0:0:
377,191,27677,1,0,0:0:0:0:
377,191,27768,1,0,0:0:0:0:
377,191,27859,2,0,L|384:118,1,43,2|2,0:0|0:0,0:0:0:0:
391,55,28041,1,8,0:0:0:0:
471,168,28223,1,2,0:0:0:0:
278,210,28404,1,0,0:0:0:0:
281,177,28494,1,0,0:0:0:0:
285,145,28585,1,8,0:0:0:0:
289,113,28676,1,0,0:0:0:0:
293,81,28767,5,2,0:0:0:0:
100,97,28950,2,0,P|100:137|108:193,1,86,8|0,0:0|0:0,0:0:0:0:
179,277,29313,1,2,0:0:0:0:
278,210,29495,2,0,P|362:211|430:232,2,129,8|2|8,0:0|0:0|0:0,0:0:0:0:
96,278,30222,6,0,B|149:287|149:287|181:277,1,86,2|0,0:0|0:0,0:0:0:0:
315,214,30586,1,0,0:0:0:0:
323,193,30677,1,0,0:0:0:0:
332,172,30768,2,0,L|270:177,1,43,2|2,0:0|0:0,0:0:0:0:
196,187,30950,1,8,0:0:0:0:
286,291,31132,1,2,0:0:0:0:
361,91,31313,1,0,0:0:0:0:
328,94,31403,1,0,0:0:0:0:
296,97,31494,1,0,0:0:0:0:
264,101,31585,1,0,0:0:0:0:
232,104,31676,5,2,0:0:0:0:
108,149,31859,2,0,P|100:203|126:254,1,86
212,312,32223,1,2,0:0:0:0:
212,312,32313,1,2,0:0:0:0:
212,312,32404,1,8,0:0:0:0:
281,178,32586,2,0,L|196:187,2,86,2|0|0,0:0|0:0|0:0,0:0:0:0:
446,162,33132,5,2,0:0:0:0:
361,68,33313,1,0,0:0:0:0:
340,71,33403,1,0,0:0:0:0:
318,73,33495,1,2,0:0:0:0:
290,58,33585,1,0,0:0:0:0:
259,54,33676,1,0,0:0:0:0:
227,61,33767,1,0,0:0:0:0:
201,79,33859,6,0,L|199:182,1,86,2|0,0:0|0:0,0:0:0:0:
196,187,34131,1,0,0:0:0:0:
194,209,34223,1,2,0:0:0:0:
169,229,34313,1,0,0:0:0:0:
155,257,34404,1,0,0:0:0:0:
156,289,34495,1,0,0:0:0:0:
170,318,34586,6,0,P|224:319|288:313,1,86,2|0,0:0|0:0,0:0:0:0:
457,255,34950,1,2,0:0:0:0:
293,197,35132,1,0,0:0:0:0:
370,331,35313,5,2,0:0:0:0:
399,153,35495,1,0,0:0:0:0:
403,132,35586,1,0,0:0:0:0:
407,111,35676,1,2,0:0:0:0:
378,97,35767,1,0,0:0:0:0:
347,91,35858,1,0,0:0:0:0:
315,96,35949,1,0,0:0:0:0:
289,113,36041,6,0,P|294:196|282:232,1,86,2|0,0:0|0:0,0:0:0:0:
206,308,36404,2,0,L|147:310,1,43,2|0,0:0|0:0,0:0:0:0:
76,313,36586,1,0,0:0:0:0:
72,109,36768,6,0,P|155:104|191:116,1,86,2|0,0:0|0:0,0:0:0:0:
50,198,37132,1,2,0:0:0:0:
81,191,37222,1,0,0:0:0:0:
113,188,37313,1,0,0:0:0:0:
145,188,37404,1,0,0:0:0:0:
177,193,37495,5,2,0:0:0:0:
361,220,37677,1,2,0:0:0:0:
290,92,37859,1,2,0:0:0:0:
290,92,38041,1,2,0:0:0:0:
260,335,38223,5,2,0:0:0:0:
336,212,38405,1,2,0:0:0:0:
177,193,38586,2,0,P|113:186|65:194,1,96.7500036907198,2|0,0:0|0:0,0:0:0:0:
81,190,38950,6,0,L|89:294,1,103.199996850586,6|0,0:0|0:0,0:0:0:0:
160,343,39223,1,0,0:0:0:0:
160,343,39313,2,0,P|235:330|281:344,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
467,245,39677,2,0,P|392:258|345:246,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
252,78,40041,1,8,0:0:0:0:
289,78,40132,1,0,0:0:0:0:
328,75,40223,1,0,0:0:0:0:
367,74,40313,1,0,0:0:0:0:
407,72,40404,6,0,P|417:139|406:185,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
261,334,40768,2,0,P|251:267|262:221,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
443,264,41132,1,2,0:0:0:0:
241,349,41313,1,0,0:0:0:0:
262,101,41495,2,0,L|368:96,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
443,264,41859,6,0,P|445:315|440:337,2,51.599998425293,2|0|0,0:0|0:0|0:0,0:0:0:0:
365,96,42223,2,0,P|363:45|368:23,2,51.599998425293,8|0|0,0:0|0:0|0:0,0:0:0:0:
277,244,42586,2,0,P|225:247|176:232,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
340,176,42950,1,8,0:0:0:0:
360,208,43041,1,0,0:0:0:0:
366,246,43131,1,0,0:0:0:0:
357,283,43222,1,0,0:0:0:0:
334,314,43313,6,0,P|285:331|234:334,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
70,266,43677,1,8,0:0:0:0:
246,167,43859,1,0,0:0:0:0:
122,53,44041,2,0,L|123:188,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
128,339,44404,1,8,0:0:0:0:
164,351,44494,1,0,0:0:0:0:
202,355,44585,1,0,0:0:0:0:
241,352,44676,1,0,0:0:0:0:
278,341,44768,6,0,L|276:222,1,103.199996850586,6|0,0:0|0:0,0:0:0:0:
272,149,45041,1,0,0:0:0:0:
272,149,45132,2,0,P|358:142|392:151,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
175,236,45495,2,0,P|89:243|55:234,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
54,78,45859,1,8,0:0:0:0:
90,66,45949,1,0,0:0:0:0:
129,61,46040,1,0,0:0:0:0:
167,64,46131,1,0,0:0:0:0:
204,73,46223,6,0,P|255:90|310:91,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
486,174,46586,2,0,P|435:190|380:191,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
255,171,46950,1,2,0:0:0:0:
414,78,47132,1,0,0:0:0:0:
414,322,47313,2,0,L|310:317,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
146,327,47677,6,0,L|94:324,2,51.599998425293,2|0|0,0:0|0:0|0:0,0:0:0:0:
272,243,48041,2,0,L|323:245,2,51.599998425293,8|0|0,0:0|0:0|0:0,0:0:0:0:
117,195,48404,2,0,P|99:142|118:91,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
344,153,48768,1,8,0:0:0:0:
305,150,48858,1,0,0:0:0:0:
266,148,48949,1,0,0:0:0:0:
228,146,49040,1,0,0:0:0:0:
189,143,49132,5,2,0:0:0:0:
374,131,49313,1,2,0:0:0:0:
231,249,49495,1,2,0:0:0:0:
277,71,49677,1,2,0:0:0:0:
345,243,49859,1,2,0:0:0:0:
152,124,50041,5,8,0:0:0:0:
403,107,50223,1,8,0:0:0:0:
292,332,50404,1,8,0:0:0:0:
148,259,50586,5,6,0:0:0:0:
148,259,50768,2,0,P|188:245|231:249,1,86,0|8,0:0|0:0,0:0:0:0:
292,332,51132,1,0,0:0:0:0:
388,297,51313,2,0,L|397:191,1,86,2|0,0:0|0:0,0:0:0:0:
403,107,51677,1,8,0:0:0:0:
317,164,51859,1,0,0:0:0:0:
481,244,52041,6,0,L|490:138,1,86,2|0,0:0|0:0,0:0:0:0:
410,90,52404,1,8,0:0:0:0:
324,146,52587,2,0,P|281:154|240:144,1,86
153,95,52950,2,0,L|145:180,2,86,0|8|0,0:0|0:0|0:0,0:0:0:0:
49,219,53495,6,0,P|110:278|192:272,1,172,2|8,0:0|0:0,0:0:0:0:
249,184,54041,1,0,0:0:0:0:
263,82,54223,2,0,P|182:105|145:179,1,172,2|8,0:0|0:0,0:0:0:0:
193,273,54768,1,0,0:0:0:0:
383,198,54950,5,2,0:0:0:0:
289,158,55132,2,0,B|283:217|283:217|304:266|304:266|299:325,1,172
383,198,55677,2,0,L|390:112,1,86,2|0,0:0|0:0,0:0:0:0:
204,290,56041,2,0,L|197:376,1,86,8|0,0:0|0:0,0:0:0:0:
167,173,56404,6,0,P|100:163|58:177,1,86,2|0,0:0|0:0,0:0:0:0:
118,264,56768,1,8,0:0:0:0:
262,181,56950,1,0,0:0:0:0:
173,78,57132,2,0,P|240:68|282:82,1,86,2|0,0:0|0:0,0:0:0:0:
353,108,57495,2,0,L|346:194,1,86,8|0,0:0|0:0,0:0:0:0:
389,288,57859,5,2,0:0:0:0:
429,66,58041,2,0,P|358:21|276:64,1,172
210,126,58586,2,0,P|134:123|114:111,1,86,2|0,0:0|0:0,0:0:0:0:
43,57,58950,1,8,0:0:0:0:
178,42,59132,1,0,0:0:0:0:
73,201,59313,6,0,P|155:226|241:221,1,172,2|8,0:0|0:0,0:0:0:0:
326,161,59859,1,0,0:0:0:0:
414,213,60041,2,0,L|405:321,1,86,2|0,0:0|0:0,0:0:0:0:
315,179,60404,1,8,0:0:0:0:
492,144,60586,1,0,0:0:0:0:
406,298,60768,6,0,P|341:292|314:281,1,86,2|0,0:0|0:0,0:0:0:0:
231,234,61132,2,0,P|166:240|139:251,1,86,8|0,0:0|0:0,0:0:0:0:
98,338,61495,1,2,0:0:0:0:
252,324,61677,1,8,0:0:0:0:
83,360,61859,1,8,0:0:0:0:
271,341,62041,1,8,0:0:0:0:
315,179,62223,6,0,P|264:170|213:178,1,103.199996850586,6|0,0:0|0:0,0:0:0:0:
191,188,62495,1,0,0:0:0:0:
168,200,62586,2,0,L|173:315,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
323,271,62950,1,2,0:0:0:0:
216,100,63132,1,0,0:0:0:0:
409,75,63313,1,8,0:0:0:0:
416,112,63403,1,0,0:0:0:0:
419,151,63494,1,0,0:0:0:0:
416,190,63585,1,0,0:0:0:0:
407,227,63677,6,0,L|272:216,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
373,330,64041,2,0,L|238:319,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
100,300,64404,1,2,0:0:0:0:
216,100,64586,1,0,0:0:0:0:
323,271,64768,2,0,P|245:273|211:262,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
101,126,65132,6,0,P|76:119|50:120,2,51.599998425293,2|0|0,0:0|0:0|0:0,0:0:0:0:
251,191,65495,2,0,P|275:197|301:196,2,51.599998425293,8|0|0,0:0|0:0|0:0,0:0:0:0:
86,276,65859,2,0,P|81:345|105:386,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
320,349,66223,1,8,0:0:0:0:
321,310,66313,1,0,0:0:0:0:
323,271,66404,1,0,0:0:0:0:
325,233,66495,1,0,0:0:0:0:
327,194,66586,5,2,0:0:0:0:
188,322,66768,1,0,0:0:0:0:
408,374,66950,2,0,L|412:244,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
381,53,67313,1,2,0:0:0:0:
498,153,67495,1,0,0:0:0:0:
327,193,67677,1,8,0:0:0:0:
289,202,67767,1,0,0:0:0:0:
250,203,67858,1,0,0:0:0:0:
212,197,67949,1,0,0:0:0:0:
176,184,68041,6,0,P|154:236|156:295,1,103.199996850586,6|0,0:0|0:0,0:0:0:0:
170,303,68313,1,0,0:0:0:0:
188,322,68404,2,0,L|321:317,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
430,197,68768,2,0,L|297:192,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
139,80,69132,1,8,0:0:0:0:
172,61,69222,1,0,0:0:0:0:
210,53,69313,1,0,0:0:0:0:
249,55,69404,1,0,0:0:0:0:
285,68,69495,6,0,L|274:203,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
388,102,69859,2,0,L|377:237,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
358,375,70222,1,2,0:0:0:0:
158,259,70404,1,0,0:0:0:0:
329,152,70586,2,0,P|331:230|320:264,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
179,352,70950,6,0,P|153:350|127:346,2,51.599998425293,2|0|0,0:0|0:0|0:0,0:0:0:0:
342,277,71313,2,0,P|367:273|393:271,2,51.599998425293,8|0|0,0:0|0:0|0:0,0:0:0:0:
138,227,71677,1,2,0:0:0:0:
351,166,71859,1,0,0:0:0:0:
245,44,72041,1,8,0:0:0:0:
231,80,72131,1,0,0:0:0:0:
225,118,72222,1,0,0:0:0:0:
228,156,72313,1,0,0:0:0:0:
240,193,72404,6,0,P|336:200|392:224,1,154.799995275879,2|0,0:0|0:0,0:0:0:0:
472,255,72768,2,0,P|376:261|320:285,1,154.799995275879,2|0,0:0|0:0,0:0:0:0:
242,322,73132,1,2,0:0:0:0:
423,356,73313,1,8,0:0:0:0:
237,293,73495,1,8,0:0:0:0:
452,229,73677,1,8,0:0:0:0:
232,264,73859,6,0,P|221:235|223:177,1,86,6|0,0:0|0:0,0:0:0:0:
328,135,74223,2,0,P|398:138|439:119,1,86,8|0,0:0|0:0,0:0:0:0:
229,58,74586,2,0,P|158:54|117:73,1,86,2|0,0:0|0:0,0:0:0:0:
65,153,74950,2,0,L|70:260,1,86,8|0,0:0|0:0,0:0:0:0:
232,264,75313,5,2,0:0:0:0:
168,154,75495,1,0,0:0:0:0:
165,338,75677,1,8,0:0:0:0:
315,173,75859,1,0,0:0:0:0:
175,70,76041,2,0,P|162:110|167:153,1,86,2|0,0:0|0:0,0:0:0:0:
232,264,76404,2,0,L|349:271,1,86,8|0,0:0|0:0,0:0:0:0:
485,157,76768,6,0,L|399:166,1,86,2|0,0:0|0:0,0:0:0:0:
317,269,77132,2,0,L|403:260,1,86,8|0,0:0|0:0,0:0:0:0:
302,177,77495,2,0,L|216:186,1,86,2|0,0:0|0:0,0:0:0:0:
134,289,77859,2,0,L|220:280,1,86,8|0,0:0|0:0,0:0:0:0:
77,218,78223,6,0,P|49:250|44:292,1,86,2|0,0:0|0:0,0:0:0:0:
108,135,78586,2,0,P|66:127|27:144,1,86,8|0,0:0|0:0,0:0:0:0:
165,205,78950,2,0,P|192:173|197:131,1,86,2|0,0:0|0:0,0:0:0:0:
133,288,79313,2,0,P|175:296|214:279,1,86,8|0,0:0|0:0,0:0:0:0:
300,221,79677,6,0,L|304:117,1,86,2|0,0:0|0:0,0:0:0:0:
399,94,80041,2,0,L|395:198,1,86,8|0,0:0|0:0,0:0:0:0:
375,297,80404,2,0,P|451:300|474:284,1,86,2|0,0:0|0:0,0:0:0:0:
300,221,80768,2,0,P|224:218|201:234,1,86,8|0,0:0|0:0,0:0:0:0:
133,288,81132,5,2,0:0:0:0:
280,318,81313,1,0,0:0:0:0:
124,262,81495,1,8,0:0:0:0:
323,208,81677,1,0,0:0:0:0:
113,235,81859,2,0,P|108:164|112:120,1,86,2|0,0:0|0:0,0:0:0:0:
346,195,82223,2,0,P|351:124|347:80,1,86,8|0,0:0|0:0,0:0:0:0:
117,51,82586,5,2,0:0:0:0:
434,64,82768,1,2,0:0:0:0:
115,184,83313,5,2,0:0:0:0:
421,201,83495,1,2,0:0:0:0:
199,289,83859,6,0,B|219:295|235:307|235:307|252:292|252:292|268:311|268:311|284:295|284:295|299:312|299:312|317:301|336:301,1,172,2|2,0:0|0:0,0:0:0:0:
429,292,84404,1,2,0:0:0:0:
109,264,84586,6,0,B|104:209|104:209|124:153|124:153|117:106,1,161.2500061512,2|0,0:0|0:0,0:0:0:0:
169,38,85132,6,0,P|219:127|118:108,1,258,8|0,0:0|0:0,0:0:0:0:
150,27,85495,6,0,P|214:24|278:32,1,129.00000492096,6|0,0:0|0:0,0:0:0:0:
396,237,85859,1,8,0:0:0:0:
211,172,86041,1,0,0:0:0:0:
426,23,86223,2,0,P|424:92|414:165,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
372,338,86586,2,0,L|231:329,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
92,200,86950,6,0,P|140:170|238:186,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
372,338,87313,2,0,P|316:306|288:249,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
352,27,87677,2,0,P|353:83|291:160,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
159,287,88041,1,8,0:0:0:0:
141,59,88223,1,0,0:0:0:0:
391,106,88404,5,2,0:0:0:0:
391,106,88586,2,0,P|392:172|380:241,1,129.00000492096,0|8,0:0|0:0,0:0:0:0:
216,182,88950,1,0,0:0:0:0:
479,84,89132,2,0,P|479:180|464:275,1,193.50000738144,2|0,0:0|0:0,0:0:0:0:
390,343,89495,2,0,L|254:339,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
96,153,89859,5,2,0:0:0:0:
366,133,90041,1,2,0:0:0:0:
158,304,90223,1,8,0:0:0:0:
225,45,90404,1,2,0:0:0:0:
382,253,90586,5,2,0:0:0:0:
50,227,90768,1,2,0:0:0:0:
255,36,90950,1,8,0:0:0:0:
241,360,91132,1,2,0:0:0:0:
116,75,91313,6,0,L|244:66,1,129.00000492096,6|0,0:0|0:0,0:0:0:0:
373,281,91677,1,8,0:0:0:0:
208,215,91859,1,0,0:0:0:0:
415,77,92041,2,0,P|421:144|405:208,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
136,159,92404,2,0,P|191:127|253:140,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
373,281,92768,6,0,L|392:151,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
120,153,93132,2,0,L|139:281,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
320,77,93495,2,0,P|255:71|191:77,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
122,303,93859,1,8,0:0:0:0:
390,303,94041,1,0,0:0:0:0:
280,169,94223,5,2,0:0:0:0:
122,303,94404,2,0,P|234:318|279:302,1,129.00000492096,0|8,0:0|0:0,0:0:0:0:
120,153,94768,1,0,0:0:0:0:
403,138,94950,2,0,L|394:266,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
305,53,95313,2,0,L|296:181,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
120,153,95677,5,2,0:0:0:0:
392,125,95859,1,2,0:0:0:0:
218,337,96041,1,8,0:0:0:0:
191,64,96223,1,2,0:0:0:0:
402,239,96404,5,2,0:0:0:0:
131,264,96586,1,2,0:0:0:0:
305,53,96768,1,8,0:0:0:0:
332,327,96950,1,2,0:0:0:0:
88,127,97132,6,0,P|152:122|216:129,1,129.00000492096,6|0,0:0|0:0,0:0:0:0:
375,223,97495,1,8,0:0:0:0:
182,344,97677,1,0,0:0:0:0:
392,366,97859,2,0,P|404:293|394:204,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
349,65,98223,2,0,L|220:75,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
74,210,98586,6,0,P|62:272|90:328,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
287,240,98950,2,0,P|223:240|162:259,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
368,295,99313,2,0,P|385:235|363:176,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
161,85,99677,1,8,0:0:0:0:
182,344,99859,1,0,0:0:0:0:
46,236,100041,5,2,0:0:0:0:
251,166,100223,2,0,P|334:172|363:207,1,129.00000492096,0|8,0:0|0:0,0:0:0:0:
263,360,100586,1,0,0:0:0:0:
148,213,100768,2,0,L|134:81,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
345,14,101132,2,0,L|331:142,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
131,192,101495,5,2,0:0:0:0:
440,159,101677,1,2,0:0:0:0:
148,213,101859,1,8,0:0:0:0:
413,273,102041,1,2,0:0:0:0:
153,338,102223,5,2,0:0:0:0:
266,74,102404,1,2,0:0:0:0:
432,298,102586,1,8,0:0:0:0:
114,171,102768,1,2,0:0:0:0:
414,45,102950,6,0,P|414:150|396:192,1,129.00000492096,6|0,0:0|0:0,0:0:0:0:
284,320,103313,2,0,P|348:362|335:287,1,193.50000738144,8|0,0:0|0:0,0:0:0:0:
260,230,103677,1,2,0:0:0:0:
442,79,103859,1,0,0:0:0:0:
213,22,104041,2,0,P|200:89|213:151,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
372,301,104404,6,0,P|320:256|259:236,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
119,93,104768,2,0,P|167:51|229:32,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
336,148,105132,2,0,P|274:135|211:146,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
107,333,105495,1,8,0:0:0:0:
246,224,105677,1,0,0:0:0:0:
64,217,105859,5,2,0:0:0:0:
308,295,106041,2,0,P|339:235|321:167,1,129.00000492096,0|8,0:0|0:0,0:0:0:0:
170,168,106404,1,0,0:0:0:0:
236,351,106586,1,2,0:0:0:0:
255,98,106768,1,0,0:0:0:0:
172,281,106950,1,8,0:0:0:0:
419,233,107132,1,0,0:0:0:0:
226,66,107313,5,12,0:0:0:0:
337,350,107495,1,2,0:0:0:0:
351,107,107677,5,8,0:0:0:0:
218,306,107859,1,2,0:0:0:0:
113,99,108041,5,8,0:0:0:0:
413,58,108223,2,0,P|420:148|272:115,1,258.000009841919,2|2,0:0|0:0,0:0:0:0:
196,35,108768,5,2,0:0:0:0:
183,330,109132,1,8,0:0:0:0:
226,66,109495,5,2,0:0:0:0:
222,186,109677,1,2,0:0:0:0:
218,306,109859,1,8,0:0:0:0:
73,214,110223,5,2,0:0:0:0:
368,227,110587,1,8,0:0:0:0:
102,182,110950,5,2,0:0:0:0:
222,186,111132,1,2,0:0:0:0:
342,190,111314,1,8,0:0:0:0:
368,39,111677,5,2,0:0:0:0:
381,334,112041,1,8,0:0:0:0:
338,70,112404,5,2,0:0:0:0:
342,190,112586,1,2,0:0:0:0:
346,310,112768,1,8,0:0:0:0:
493,216,113132,5,2,0:0:0:0:
462,186,113495,5,8,0:0:0:0:
222,194,113677,1,2,0:0:0:0:
493,216,114041,5,8,0:0:0:0:
198,229,114223,1,8,0:0:0:0:
353,363,114404,1,8,0:0:0:0:
338,70,114586,6,0,P|264:67|224:78,1,103.199996850586,6|0,0:0|0:0,0:0:0:0:
53,147,114950,2,0,P|127:144|167:155,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
335,223,115313,2,0,P|261:220|221:231,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
58,261,115677,1,8,0:0:0:0:
49,224,115767,1,0,0:0:0:0:
48,184,115858,1,0,0:0:0:0:
53,147,115949,1,0,0:0:0:0:
65,110,116040,5,2,0:0:0:0:
266,136,116223,1,0,0:0:0:0:
170,50,116404,1,8,0:0:0:0:
151,223,116586,1,0,0:0:0:0:
288,281,116768,2,0,B|319:264|319:264|330:174,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
330,170,117041,1,0,0:0:0:0:
333,144,117132,1,8,0:0:0:0:
134,203,117313,1,0,0:0:0:0:
212,308,117495,6,0,P|204:333|191:355,2,51.599998425293,2|0|0,0:0|0:0|0:0,0:0:0:0:
281,153,117859,2,0,P|280:110|290:84,2,51.599998425293,8|0|0,0:0|0:0|0:0,0:0:0:0:
359,308,118223,2,0,P|434:311|486:300,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
433,139,118586,1,8,0:0:0:0:
395,136,118676,1,0,0:0:0:0:
356,137,118767,1,0,0:0:0:0:
318,143,118858,1,0,0:0:0:0:
281,153,118950,6,0,P|198:136|172:107,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
335,44,119313,1,8,0:0:0:0:
210,228,119495,1,0,0:0:0:0:
105,85,119677,2,0,P|140:48|190:37,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
361,21,120041,1,8,0:0:0:0:
359,59,120131,1,0,0:0:0:0:
357,98,120222,1,0,0:0:0:0:
356,137,120313,1,0,0:0:0:0:
354,175,120404,6,0,L|251:163,1,103.199996850586,6|0,0:0|0:0,0:0:0:0:
143,266,120768,2,0,L|245:254,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
160,154,121132,2,0,L|57:142,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
64,286,121495,1,8,0:0:0:0:
80,320,121585,1,0,0:0:0:0:
111,343,121676,1,0,0:0:0:0:
149,349,121767,1,0,0:0:0:0:
185,336,121859,5,2,0:0:0:0:
308,163,122041,1,0,0:0:0:0:
174,189,122223,1,8,0:0:0:0:
340,284,122404,1,0,0:0:0:0:
394,130,122586,2,0,P|366:87|319:68,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
294,77,122859,1,0,0:0:0:0:
270,86,122950,1,8,0:0:0:0:
252,231,123132,1,0,0:0:0:0:
126,204,123313,6,0,P|106:185|91:165,2,51.599998425293,2|0|0,0:0|0:0|0:0,0:0:0:0:
149,349,123677,2,0,P|124:349|97:355,2,51.599998425293,8|0|0,0:0|0:0|0:0,0:0:0:0:
321,332,124041,2,0,P|348:289|348:235,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
230,148,124404,1,8,0:0:0:0:
269,151,124495,1,0,0:0:0:0:
307,144,124586,1,0,0:0:0:0:
343,129,124677,1,0,0:0:0:0:
374,107,124768,5,2,0:0:0:0:
123,91,124951,1,2,0:0:0:0:
236,318,125133,1,2,0:0:0:0:
236,318,125314,1,2,0:0:0:0:
250,59,125496,5,2,0:0:0:0:
147,225,125677,1,2,0:0:0:0:
348,237,125859,1,8,0:0:0:0:
366,217,126223,6,0,L|373:131,1,86,6|0,0:0|0:0,0:0:0:0:
468,90,126586,2,0,L|461:176,1,86,8|0,0:0|0:0,0:0:0:0:
451,290,126950,1,2,0:0:0:0:
451,290,127132,1,0,0:0:0:0:
354,350,127313,2,0,P|311:352|269:344,1,86,8|0,0:0|0:0,0:0:0:0:
204,214,127677,6,0,L|92:230,1,86,2|0,0:0|0:0,0:0:0:0:
67,316,128041,1,8,0:0:0:0:
256,286,128223,2,0,P|292:212|253:139,1,172
153,111,128768,2,0,P|105:87|81:47,1,86,8|0,0:0|0:0,0:0:0:0:
122,226,129132,6,0,P|164:230|204:214,1,86,2|0,0:0|0:0,0:0:0:0:
285,150,129495,1,8,0:0:0:0:
285,150,129677,1,0,0:0:0:0:
312,248,129859,2,0,P|295:287|263:316,1,86,2|0,0:0|0:0,0:0:0:0:
425,280,130223,2,0,P|429:238|413:199,1,86,8|0,0:0|0:0,0:0:0:0:
385,98,130586,6,0,L|395:1,1,86,2|0,0:0|0:0,0:0:0:0:
293,64,130950,2,0,L|283:161,1,86,8|0,0:0|0:0,0:0:0:0:
368,278,131313,2,0,L|378:181,1,86,2|0,0:0|0:0,0:0:0:0:
276,244,131677,2,0,L|266:341,1,86,8|0,0:0|0:0,0:0:0:0:
169,365,132041,6,0,P|126:368|86:353,1,86,2|0,0:0|0:0,0:0:0:0:
114,165,132404,2,0,P|156:161|196:176,1,86,8|0,0:0|0:0,0:0:0:0:
141,265,132768,1,2,0:0:0:0:
141,265,132950,1,0,0:0:0:0:
41,239,133132,2,0,P|15:203|10:160,1,86,8|0,0:0|0:0,0:0:0:0:
247,265,133495,6,0,P|280:237|296:197,1,86,2|0,0:0|0:0,0:0:0:0:
263,96,133859,1,8,0:0:0:0:
188,24,134041,2,0,P|161:122|196:176,1,172
294,198,134586,2,0,P|336:187|377:197,1,86,8|0,0:0|0:0,0:0:0:0:
425,290,134950,6,0,P|412:330|383:361,1,86,2|0,0:0|0:0,0:0:0:0:
293,312,135313,1,8,0:0:0:0:
293,312,135495,1,0,0:0:0:0:
202,262,135677,2,0,P|173:293|160:334,1,86,2|0,0:0|0:0,0:0:0:0:
134,183,136041,2,0,P|171:162|214:161,1,86,8|0,0:0|0:0,0:0:0:0:
377,197,136404,5,2,0:0:0:0:
377,197,136586,2,0,P|341:175|319:139,1,86,0|8,0:0|0:0,0:0:0:0:
289,39,136950,1,2,0:0:0:0:
275,60,137313,5,8,0:0:0:0:
212,210,137495,1,8,0:0:0:0:
112,81,137677,1,8,0:0:0:0:
279,145,137859,6,0,P|304:189|302:240,1,103.199996850586,6|0,0:0|0:0,0:0:0:0:
286,261,138132,1,0,0:0:0:0:
270,281,138223,2,0,L|154:289,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
16,190,138586,2,0,L|132:198,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
112,81,138950,1,8,0:0:0:0:
150,84,139040,1,0,0:0:0:0:
189,87,139131,1,0,0:0:0:0:
227,90,139222,1,0,0:0:0:0:
266,93,139313,5,2,0:0:0:0:
477,110,139495,1,0,0:0:0:0:
320,194,139677,1,8,0:0:0:0:
393,39,139859,1,0,0:0:0:0:
396,248,140041,2,0,P|358:282|306:287,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
81,193,140404,2,0,L|88:332,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
215,344,140768,6,0,P|245:355|287:360,2,51.599998425293,2|0|0,0:0|0:0|0:0,0:0:0:0:
275,219,141132,2,0,P|303:205|337:179,2,51.599998425293,8|0|0,0:0|0:0|0:0,0:0:0:0:
138,86,141495,2,0,P|204:77|258:102,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
405,133,141859,1,8,0:0:0:0:
402,171,141949,1,0,0:0:0:0:
399,210,142040,1,0,0:0:0:0:
396,248,142131,1,0,0:0:0:0:
393,287,142223,5,2,0:0:0:0:
201,249,142404,1,0,0:0:0:0:
286,373,142586,2,0,L|299:249,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
146,204,142950,2,0,L|157:307,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
393,287,143313,1,8,0:0:0:0:
406,250,143404,1,0,0:0:0:0:
416,214,143495,1,0,0:0:0:0:
418,175,143586,1,0,0:0:0:0:
415,133,143677,6,0,P|363:136|312:128,1,103.199996850586,6|0,0:0|0:0,0:0:0:0:
292,113,143950,1,0,0:0:0:0:
273,96,144041,2,0,P|222:87|170:90,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
61,216,144404,2,0,P|111:224|163:221,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
366,317,144768,1,8,0:0:0:0:
329,330,144858,1,0,0:0:0:0:
291,336,144949,1,0,0:0:0:0:
252,335,145040,1,0,0:0:0:0:
215,326,145131,5,2,0:0:0:0:
204,140,145313,1,0,0:0:0:0:
291,245,145495,1,8,0:0:0:0:
133,234,145677,1,0,0:0:0:0:
147,79,145859,2,0,P|192:56|242:66,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
394,248,146223,2,0,L|290:244,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
204,140,146586,6,0,P|172:142|126:138,2,51.599998425293,2|0|0,0:0|0:0|0:0,0:0:0:0:
319,67,146950,2,0,P|351:69|397:65,2,51.599998425293,8|0|0,0:0|0:0|0:0,0:0:0:0:
102,75,147313,2,0,P|70:148|84:185,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
262,202,147677,1,8,0:0:0:0:
265,240,147767,1,0,0:0:0:0:
263,279,147858,1,0,0:0:0:0:
255,316,147949,1,0,0:0:0:0:
241,352,148040,5,2,0:0:0:0:
155,202,148223,1,0,0:0:0:0:
351,191,148404,2,0,P|357:243|351:294,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
220,370,148768,1,2,0:0:0:0:
204,140,148950,1,8,0:0:0:0:
128,318,149132,1,8,0:0:0:0:
351,293,149313,1,8,0:0:0:0:
321,65,149495,6,0,P|278:56|234:64,1,86,6|0,0:0|0:0,0:0:0:0:
126,125,149859,1,8,0:0:0:0:
265,240,150041,1,0,0:0:0:0:
265,240,150223,2,0,P|274:198|276:153,1,86,2|0,0:0|0:0,0:0:0:0:
128,218,150586,2,0,P|130:260|139:302,1,86,8|0,0:0|0:0,0:0:0:0:
260,344,150950,5,2,0:0:0:0:
395,229,151132,1,0,0:0:0:0:
376,351,151313,1,8,0:0:0:0:
272,180,151495,1,0,0:0:0:0:
424,140,151677,2,0,P|461:160|483:196,1,86,2|0,0:0|0:0,0:0:0:0:
396,331,152041,2,0,L|310:325,1,86,8|0,0:0|0:0,0:0:0:0:
116,331,152404,6,0,L|202:325,1,86,2|0,0:0|0:0,0:0:0:0:
131,248,152768,2,0,L|217:242,1,86,8|0,0:0|0:0,0:0:0:0:
357,185,153132,2,0,L|271:179,1,86,2|0,0:0|0:0,0:0:0:0:
342,102,153496,2,0,L|256:96,1,86,8|0,0:0|0:0,0:0:0:0:
147,94,153859,6,0,P|154:135|181:169,1,86,2|0,0:0|0:0,0:0:0:0:
131,248,154223,2,0,P|171:262|213:255,1,86,8|0,0:0|0:0,0:0:0:0:
256,338,154586,2,0,P|288:310|303:270,1,86,2|0,0:0|0:0,0:0:0:0:
396,274,154950,2,0,P|388:232|361:198,1,86,8|0,0:0|0:0,0:0:0:0:
327,112,155313,6,0,P|369:105|410:120,1,86,2|0,0:0|0:0,0:0:0:0:
268,187,155677,2,0,P|225:193|185:179,1,86,8|0,0:0|0:0,0:0:0:0:
361,198,156041,2,0,L|357:300,1,86,2|0,0:0|0:0,0:0:0:0:
442,343,156404,2,0,L|446:241,1,86,8|0,0:0|0:0,0:0:0:0:
435,153,156768,5,2,0:0:0:0:
248,194,156950,1,0,0:0:0:0:
448,120,157132,1,8,0:0:0:0:
234,88,157314,1,0,0:0:0:0:
461,87,157495,2,0,P|466:151|457:204,1,86,2|0,0:0|0:0,0:0:0:0:
225,286,157859,2,0,P|222:243|227:200,1,86,8|0,0:0|0:0,0:0:0:0:
345,49,158223,5,2,0:0:0:0:
323,350,158405,1,2,0:0:0:0:
215,58,158950,5,2,0:0:0:0:
227,328,159132,1,2,0:0:0:0:
102,83,159495,6,0,B|81:81|58:93|58:93|64:111|91:124|91:124|71:146|90:163|90:163|84:183|94:197,1,172,2|2,0:0|0:0,0:0:0:0:
134,303,160041,1,2,0:0:0:0:
409,297,160223,6,0,P|419:232|401:131,1,161.2500061512,2|0,0:0|0:0,0:0:0:0:
395,116,160768,6,0,P|329:168|249:146,1,172,0|0,1:0|0:0,0:0:0:0:
102,83,161132,6,0,B|107:127|107:127|94:166|94:166|100:209,1,129.00000492096,6|0,0:0|0:0,0:0:0:0:
285,249,161495,1,8,0:0:0:0:
134,303,161677,1,0,0:0:0:0:
335,327,161859,2,0,P|377:281|374:218,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
189,44,162223,2,0,P|180:107|183:172,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
415,130,162586,6,0,P|351:123|297:155,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
102,83,162950,2,0,P|127:141|182:171,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
218,378,163313,2,0,P|256:326|255:263,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
189,44,163677,1,8,0:0:0:0:
134,303,163859,1,0,0:0:0:0:
374,218,164041,5,2,0:0:0:0:
247,137,164223,2,0,P|239:200|254:262,1,129.00000492096,0|8,0:0|0:0,0:0:0:0:
384,335,164586,1,0,0:0:0:0:
464,80,164768,2,0,P|400:89|335:110,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
128,192,165132,1,8,0:0:0:0:
387,238,165313,1,0,0:0:0:0:
191,351,165495,5,2,0:0:0:0:
220,54,165677,1,2,0:0:0:0:
371,311,165859,1,8,0:0:0:0:
97,191,166041,1,2,0:0:0:0:
413,120,166223,5,2,0:0:0:0:
66,190,166404,1,2,0:0:0:0:
317,362,166586,1,8,0:0:0:0:
296,47,166768,1,2,0:0:0:0:
83,323,166950,6,0,P|145:337|209:335,1,129.00000492096,6|0,0:0|0:0,0:0:0:0:
399,291,167313,1,8,0:0:0:0:
240,168,167495,1,0,0:0:0:0:
438,64,167677,2,0,L|433:192,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
202,246,168041,2,0,P|158:203|158:140,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
341,20,168404,6,0,L|336:148,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
333,306,168768,2,0,P|405:322|469:306,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
266,234,169132,2,0,P|234:289|248:351,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
439,188,169495,1,8,0:0:0:0:
168,221,169677,1,0,0:0:0:0:
280,72,169859,5,2,0:0:0:0:
71,51,170041,2,0,P|65:116|72:200,1,129.00000492096,0|8,0:0|0:0,0:0:0:0:
105,318,170404,1,0,0:0:0:0:
294,216,170586,2,0,P|210:209|150:228,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
279,342,170950,1,8,0:0:0:0:
208,115,171132,1,0,0:0:0:0:
354,64,171313,5,2,0:0:0:0:
335,327,171495,1,2,0:0:0:0:
196,93,171677,1,8,0:0:0:0:
216,326,171859,1,2,0:0:0:0:
369,43,172041,5,2,0:0:0:0:
349,345,172223,1,2,0:0:0:0:
184,69,172404,1,8,0:0:0:0:
197,341,172586,1,2,0:0:0:0:
434,169,172768,6,0,P|370:156|306:154,1,129.00000492096,6|0,0:0|0:0,0:0:0:0:
105,147,173132,1,8,0:0:0:0:
274,273,173313,1,0,0:0:0:0:
76,351,173495,2,0,P|71:286|78:222,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
174,49,173859,2,0,L|325:54,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
399,286,174223,6,0,P|334:290|273:272,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
426,75,174586,2,0,P|461:128|477:190,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
230,157,174950,2,0,P|258:99|304:54,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
484,279,175313,1,8,0:0:0:0:
222,323,175495,1,0,0:0:0:0:
352,148,175677,5,2,0:0:0:0:
348,339,175859,2,0,P|283:339|221:322,1,129.00000492096,0|8,0:0|0:0,0:0:0:0:
464,256,176223,1,0,0:0:0:0:
271,81,176404,2,0,P|250:142|266:203,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
366,360,176768,1,8,0:0:0:0:
373,130,176950,1,0,0:0:0:0:
160,195,177132,5,2,0:0:0:0:
471,219,177313,1,2,0:0:0:0:
197,314,177495,1,8,0:0:0:0:
464,256,177676,1,2,0:0:0:0:
250,53,177859,5,2,0:0:0:0:
329,364,178041,1,2,0:0:0:0:
464,77,178223,1,8,0:0:0:0:
137,182,178404,1,2,0:0:0:0:
430,334,178586,6,0,P|438:271|428:207,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
250,53,178950,2,0,P|206:122|286:142,1,193.50000738144,8|0,0:0|0:0,0:0:0:0:
353,61,179313,1,2,0:0:0:0:
464,256,179495,1,0,0:0:0:0:
228,327,179677,2,0,P|161:336|98:320,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
464,256,180041,6,0,P|402:271|339:263,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
123,202,180404,2,0,P|187:211|250:197,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
436,123,180768,2,0,P|372:133|310:119,1,129.00000492096,2|0,0:0|0:0,0:0:0:0:
156,35,181132,1,8,0:0:0:0:
212,221,181313,1,0,0:0:0:0:
248,40,181495,5,2,0:0:0:0:
123,202,181677,2,0,P|130:264|176:307,1,129.00000492096,0|8,0:0|0:0,0:0:0:0:
411,325,182041,1,0,0:0:0:0:
310,123,182223,1,2,0:0:0:0:
273,345,182404,1,0,0:0:0:0:
434,188,182586,1,8,0:0:0:0:
212,221,182768,1,0,0:0:0:0:
423,346,182950,5,12,0:0:0:0:
157,324,183132,1,2,0:0:0:0:
310,123,183313,5,8,0:0:0:0:
296,361,183494,1,2,0:0:0:0:
137,163,183677,5,8,0:0:0:0:
406,197,183859,1,2,0:0:0:0:
222,347,184041,2,0,P|210:284|211:220,1,129.00000492096,8|0,0:0|0:0,0:0:0:0:
248,71,184404,5,6,0:0:0:0:
85,101,190223,6,0,P|100:130|132:155,1,64.5000024604798,6|0,0:0|0:0,0:0:0:0:
75,216,190586,2,0,P|102:233|142:239,1,64.5000024604798,0|0,1:0|0:0,0:0:0:0:
123,320,190950,2,0,P|155:321|193:306,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
256,271,191313,2,0,L|256:198,1,64.5000024604798,0|0,1:0|0:0,0:0:0:0:
326,311,191677,6,0,P|356:321|389:320,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
378,239,192041,2,0,P|410:233|437:216,1,64.5000024604798,0|0,1:0|0:0,0:0:0:0:
388,150,192404,2,0,P|412:129|427:101,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
256,48,192768,2,0,L|256:121,1,64.5000024604798,0|0,1:0|0:0,0:0:0:0:
182,173,193132,6,0,P|150:167|124:150,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
172,253,193495,2,0,P|204:255|235:245,1,64.5000024604798,0|0,1:0|0:0,0:0:0:0:
388,150,193859,2,0,P|416:134|436:110,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
419,222,194222,2,0,P|389:232|357:232,1,64.5000024604798,0|0,1:0|0:0,0:0:0:0:
182,173,194586,6,0,P|149:174|120:188,1,64.5000024604798,2|2,0:0|0:0,0:0:0:0:
89,265,194859,1,2,0:0:0:0:
89,265,194950,1,0,1:0:0:0:
89,265,195041,2,0,P|63:246|46:220,2,64.5000024604798,0|0|0,1:0|1:0|1:0,0:0:0:0:
155,314,195495,1,0,1:0:0:0:
163,300,195586,1,2,0:0:0:0:
169,285,195676,1,2,0:0:0:0:
172,269,195767,1,2,0:0:0:0:
172,253,195858,1,0,1:0:0:0:
128,112,196041,5,6,0:0:0:0:
128,112,196223,2,0,L|213:118,1,86,0|8,0:0|0:0,0:0:0:0:
388,132,196586,1,0,0:0:0:0:
461,205,196768,2,0,P|465:250|456:302,1,86,2|0,0:0|0:0,0:0:0:0:
361,324,197132,2,0,P|355:281|359:238,1,86,8|0,0:0|0:0,0:0:0:0:
388,132,197495,5,2,0:0:0:0:
388,132,197677,2,0,L|302:138,1,86,0|8,0:0|0:0,0:0:0:0:
128,152,198040,1,0,0:0:0:0:
210,89,198223,2,0,P|228:127|230:169,1,86,2|0,0:0|0:0,0:0:0:0:
46,215,198586,2,0,P|27:176|25:134,1,86,8|0,0:0|0:0,0:0:0:0:
110,63,198950,5,2,0:0:0:0:
110,63,199132,2,0,L|207:57,1,86,0|8,0:0|0:0,0:0:0:0:
369,42,199495,1,0,0:0:0:0:
306,124,199677,2,0,P|303:166|318:206,1,86,2|0,0:0|0:0,0:0:0:0:
388,349,200041,2,0,P|403:309|402:267,1,86,8|0,0:0|0:0,0:0:0:0:
287,365,200404,6,0,L|182:356,1,86,2|0,0:0|0:0,0:0:0:0:
325,280,200768,2,0,L|239:272,1,86,8|0,0:0|0:0,0:0:0:0:
78,207,201132,2,0,L|164:200,1,86,2|0,0:0|0:0,0:0:0:0:
40,123,201496,2,0,L|145:114,1,86,8|0,0:0|0:0,0:0:0:0:
332,91,201859,5,6,0:0:0:0:
332,91,202041,2,0,P|332:153|318:197,1,86,0|8,0:0|0:0,0:0:0:0:
232,326,202404,1,0,0:0:0:0:
329,362,202586,2,0,P|332:298|318:270,1,86,2|0,0:0|0:0,0:0:0:0:
134,290,202950,2,0,P|126:331|138:372,1,86,8|0,0:0|0:0,0:0:0:0:
116,187,203313,6,0,P|75:201|46:232,1,86,2|0,0:0|0:0,0:0:0:0:
196,118,203677,2,0,P|163:91|122:81,1,86,8|0,0:0|0:0,0:0:0:0:
212,221,204041,2,0,P|244:248|285:258,1,86,2|0,0:0|0:0,0:0:0:0:
292,152,204404,2,0,P|332:138|362:107,1,86,8|0,0:0|0:0,0:0:0:0:
463,90,204768,5,2,0:0:0:0:
463,90,204950,2,0,L|456:192,1,86,0|8,0:0|0:0,0:0:0:0:
443,349,205313,1,0,0:0:0:0:
346,311,205495,2,0,P|287:303|244:312,1,86,2|0,0:0|0:0,0:0:0:0:
170,358,205859,2,0,P|110:358|69:345,1,86,8|0,0:0|0:0,0:0:0:0:
213,169,206223,6,0,P|272:168|313:181,1,86,2|0,0:0|0:0,0:0:0:0:
430,315,206586,2,0,P|387:318|345:310,1,86,8|0,0:0|0:0,0:0:0:0:
170,358,206950,2,0,P|212:360|254:352,1,86,2|0,0:0|0:0,0:0:0:0:
473,212,207313,2,0,P|430:214|388:206,1,86,8|0,0:0|0:0,0:0:0:0:
134,117,207677,5,6,0:0:0:0:
134,117,207859,2,0,P|119:171|132:214,1,86,0|8,0:0|0:0,0:0:0:0:
206,264,208223,1,0,0:0:0:0:
302,228,208404,2,0,L|311:142,1,86,2|0,0:0|0:0,0:0:0:0:
398,197,208768,2,0,L|407:111,1,86,8|0,0:0|0:0,0:0:0:0:
215,178,209132,6,0,L|205:263,1,86,2|0,0:0|0:0,0:0:0:0:
119,209,209496,2,0,L|109:294,1,86,8|0,0:0|0:0,0:0:0:0:
53,140,209859,2,0,P|96:116|135:113,1,86,2|0,0:0|0:0,0:0:0:0:
215,178,210223,2,0,P|258:200|295:208,1,86,8|0,0:0|0:0,0:0:0:0:
398,197,210586,5,2,0:0:0:0:
398,197,210768,2,0,L|407:111,1,86,0|8,0:0|0:0,0:0:0:0:
204,94,211132,1,0,0:0:0:0:
128,164,211313,2,0,P|129:204|159:246,1,86,2|0,0:0|0:0,0:0:0:0:
248,284,211677,2,0,L|336:278,1,86,8|0,0:0|0:0,0:0:0:0:
398,197,212041,6,0,P|385:131|358:99,1,86,2|0,0:0|0:0,0:0:0:0:
333,278,212404,2,0,P|396:300|437:292,1,86,8|0,0:0|0:0,0:0:0:0:
295,181,212768,2,0,P|244:224|230:264,1,86,2|0,0:0|0:0,0:0:0:0:
206,340,213132,2,0,L|111:331,1,86,8|0,0:0|0:0,0:0:0:0:
46,217,213495,6,0,L|131:208,1,86,6|0,0:0|0:0,0:0:0:0:
183,83,213859,2,0,L|97:74,1,86,8|0,0:0|0:0,0:0:0:0:
226,198,214223,2,0,L|311:189,1,86,2|0,0:0|0:0,0:0:0:0:
363,100,214587,2,0,L|277:91,1,86,8|0,0:0|0:0,0:0:0:0:
406,179,214950,5,2,0:0:0:0:
406,179,215132,2,0,P|414:228|404:268,1,86,0|8,0:0|0:0,0:0:0:0:
338,340,215495,1,0,0:0:0:0:
256,276,215677,2,0,P|191:261|164:263,1,86,2|0,0:0|0:0,0:0:0:0:
111,375,216041,2,0,P|153:373|194:360,1,86,8|0,0:0|0:0,0:0:0:0:
256,276,216404,5,2,0:0:0:0:
256,276,216586,2,0,L|256:175,1,86,0|8,0:0|0:0,0:0:0:0:
256,86,216950,1,0,0:0:0:0:
158,51,217132,2,0,P|156:117|168:140,1,86,2|0,0:0|0:0,0:0:0:0:
348,133,217495,2,0,P|360:93|354:51,1,86,8|0,0:0|0:0,0:0:0:0:
174,217,217859,6,0,P|128:231|76:228,1,86,2|0,0:0|0:0,0:0:0:0:
338,217,218223,2,0,P|384:231|436:228,1,86,8|0,0:0|0:0,0:0:0:0:
140,37,218586,2,0,L|148:134,1,86,2|0,0:0|0:0,0:0:0:0:
364,122,218950,2,0,L|372:37,1,86,8|0,0:0|0:0,0:0:0:0:
256,24,219313,6,0,L|256:56,30,32.2500012302399,0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0,3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0,3:0:0:0:
192,144,220768,2,0,L|192:176,30,32.2500012302399,0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0,3:2|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0,3:0:0:0:
320,208,222223,6,0,L|320:240,14,32.2500012302399,0|0|0|0|0|0|0|0|0|0|0|0|0|0|0,3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0,3:0:0:0:
256,327,222950,2,0,L|256:360,14,32.2500012302399,0|0|0|0|0|0|0|0|0|0|0|0|0|0|0,3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0|3:0,3:0:0:0:
169,305,223677,6,0,P|153:307|137:312,4,32.2500012302399,0|0|0|0|0,3:0|3:0|3:0|3:0|3:0,3:0:0:0:
343,305,224041,2,0,P|358:307|374:312,4,32.2500012302399,0|0|0|0|0,3:0|3:0|3:0|3:0|3:0,3:0:0:0:
124,200,224404,6,0,P|153:217|185:220,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
388,200,224586,2,0,P|359:217|327:220,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
166,74,224768,6,0,L|182:145,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
346,74,224950,2,0,L|330:145,1,64.5000024604798,2|0,0:0|0:0,0:0:0:0:
256,31,225132,6,0,L|256:64,1,32.2500012302399,4|0,1:0|0:0,0:0:0:0:
256,63,225859,6,0,L|256:192,1,129,2|0,0:0|0:0,0:0:0:0:
213,227,226223,6,0,P|256:134|297:228,1,258,8|0,0:3|0:0,0:0:0:0:
256,304,226586,6,0,P|192:312|144:304,1,103.199996850586,6|0,0:0|0:0,0:0:0:0:
73,235,226859,1,0,0:0:0:0:
73,235,226950,2,0,L|68:132,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
224,25,227313,2,0,L|219:128,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
256,304,227677,1,8,0:0:0:0:
293,317,227767,1,0,0:0:0:0:
331,320,227858,1,0,0:0:0:0:
369,313,227949,1,0,0:0:0:0:
403,295,228041,6,0,L|408:172,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
408,88,228313,1,0,0:0:0:0:
408,88,228404,2,0,L|326:75,1,51.599998425293,8|0,0:0|0:0,0:0:0:0:
267,173,228586,2,0,L|317:164,1,51.599998425293
268,64,228768,2,0,B|200:56|200:56|172:76,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
119,285,229132,1,8,0:0:0:0:
147,310,229222,1,0,0:0:0:0:
183,323,229313,1,0,0:0:0:0:
221,321,229404,1,0,0:0:0:0:
256,304,229495,6,0,P|303:286|359:283,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
457,303,229768,1,0,0:0:0:0:
457,303,229859,2,0,L|468:168,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
319,56,230223,2,0,L|330:191,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
192,231,230586,1,8,0:0:0:0:
193,193,230677,1,0,0:0:0:0:
194,154,230768,1,0,0:0:0:0:
195,115,230859,1,0,0:0:0:0:
197,77,230950,6,0,P|115:69|75:84,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
26,150,231223,1,0,0:0:0:0:
26,149,231313,2,0,P|24:201|32:252,1,103.199996850586,8|0,0:0|0:0,0:0:0:0:
186,334,231677,2,0,P|194:284|192:232,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
160,86,232041,1,8,0:0:0:0:
197,77,232131,1,0,0:0:0:0:
236,73,232222,1,0,0:0:0:0:
274,72,232313,1,0,0:0:0:0:
313,76,232404,5,2,0:0:0:0:
280,212,232586,1,0,0:0:0:0:
280,212,232677,1,0,0:0:0:0:
280,212,232768,2,0,P|216:205|200:197,2,51.599998425293,8|0|0,0:0|0:0|0:0,0:0:0:0:
437,213,233132,1,2,0:0:0:0:
444,250,233223,1,0,0:0:0:0:
442,288,233314,1,0,0:0:0:0:
429,325,233405,1,0,0:0:0:0:
408,357,233495,1,8,0:0:0:0:
372,341,233587,1,0,0:0:0:0:
339,361,233678,1,0,0:0:0:0:
304,346,233769,1,0,0:0:0:0:
273,368,233859,6,0,B|240:358|240:358|234:275,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
225,189,234132,1,0,0:0:0:0:
225,189,234223,2,0,P|193:192|161:204,1,51.599998425293,8|0,0:0|0:0,0:0:0:0:
66,272,234404,2,0,P|98:275|133:284,1,51.599998425293
234,289,234586,2,0,P|283:274|318:236,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
191,59,234950,1,8,0:0:0:0:
175,93,235040,1,0,0:0:0:0:
176,131,235131,1,0,0:0:0:0:
193,166,235222,1,0,0:0:0:0:
225,189,235313,6,0,P|276:184|327:189,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
431,205,235586,1,0,0:0:0:0:
431,205,235677,2,0,L|437:153,1,51.599998425293,8|0,0:0|0:0,0:0:0:0:
354,90,235859,1,2,0:0:0:0:
437,304,236041,6,0,P|393:315|323:303,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
234,289,236313,1,0,0:0:0:0:
234,289,236404,2,0,P|208:288|182:291,1,51.599998425293,8|0,0:0|0:0,0:0:0:0:
81,315,236586,1,2,0:0:0:0:
47,101,236768,6,0,P|103:94|153:99,1,103.199996850586,2|0,0:0|0:0,0:0:0:0:
246,136,237041,1,0,0:0:0:0:
246,136,237132,2,0,L|241:200,1,51.599998425293,8|0,0:0|0:0,0:0:0:0:
234,289,237313,1,2,0:0:0:0:
407,221,237495,5,2,0:0:0:0:
142,224,237677,1,8,0:0:0:0:
320,84,237859,1,8,0:0:0:0:
308,336,238041,1,8,0:0:0:0:
161,140,238223,6,0,P|204:132|246:136,1,86,6|0,0:0|0:0,0:0:0:0:
306,219,238586,2,0,L|297:323,1,86,8|0,0:0|0:0,0:0:0:0:
461,163,238950,2,0,P|420:148|378:145,1,86,2|0,0:0|0:0,0:0:0:0:
306,219,239313,1,8,0:0:0:0:
306,219,239495,1,0,0:0:0:0:
150,274,239677,6,0,P|190:288|233:291,1,86,2|0,0:0|0:0,0:0:0:0:
404,244,240041,1,8,0:0:0:0:
207,193,240223,1,0,0:0:0:0:
378,146,240404,1,2,0:0:0:0:
233,291,240586,1,0,0:0:0:0:
391,327,240768,2,0,P|405:286|403:243,1,86,8|0,0:0|0:0,0:0:0:0:
292,154,241132,6,0,L|380:145,1,86,2|0,0:0|0:0,0:0:0:0:
311,66,241495,2,0,L|397:57,1,86,8|0,0:0|0:0,0:0:0:0:
170,37,241859,2,0,P|161:79|165:121,1,86,2|0,0:0|0:0,0:0:0:0:
228,206,242223,2,0,P|236:248|232:290,1,86,8|0,0:0|0:0,0:0:0:0:
52,251,242586,6,0,P|94:242|136:246,1,86,2|0,0:0|0:0,0:0:0:0:
232,290,242950,2,0,P|274:293|316:285,1,86,8|0,0:0|0:0,0:0:0:0:
323,182,243313,2,0,L|328:96,1,86,2|0,0:0|0:0,0:0:0:0:
416,150,243677,2,0,L|410:235,1,86,8|0,0:0|0:0,0:0:0:0:
228,206,244041,6,0,L|233:120,1,86,2|0,0:0|0:0,0:0:0:0:
137,242,244404,2,0,P|94:238|58:216,1,86,8|0,0:0|0:0,0:0:0:0:
311,255,244768,2,0,P|353:258|392:242,1,86,2|0,0:0|0:0,0:0:0:0:
315,133,245132,2,0,P|275:116|233:120,1,86,8|0,0:0|0:0,0:0:0:0:
144,262,245495,5,2,0:0:0:0:
381,277,245677,1,0,0:0:0:0:
121,171,245859,1,8,0:0:0:0:
403,150,246041,1,0,0:0:0:0:
198,44,246223,2,0,L|202:145,1,86,2|0,0:0|0:0,0:0:0:0:
314,340,246586,2,0,L|310:239,1,86,8|0,0:0|0:0,0:0:0:0:
303,42,246950,5,2,0:0:0:0:
209,342,247132,1,2,0:0:0:0:
394,64,247677,5,2,0:0:0:0:
117,319,247859,1,2,0:0:0:0:
444,154,248223,6,0,B|423:165|391:153|391:153|377:169|346:175|324:166|324:166|303:180|282:182,1,172,2|2,0:0|0:0,0:0:0:0:
68,230,248768,1,2,0:0:0:0:
423,306,248950,1,2,0:0:0:0:
450,284,249677,6,0,B|438:302|422:305|422:305|394:286|392:267|392:267|354:284|337:253|337:253|310:262|301:235|285:235,1,206.399993701172,2|2,0:0|0:0,0:0:0:0:
53,128,250223,1,2,0:0:0:0:
449,77,250404,1,2,0:0:0:0:
464,50,251132,5,2,0:0:0:0:
475,193,251313,6,0,P|397:237|329:230,1,137.6,6|0,0:0|0:0,0:0:0:0:
95,211,251677,1,8,0:0:0:0:
317,96,251859,1,0,0:0:0:0:
370,308,252041,2,0,P|302:306|233:299,1,137.6,2|0,0:0|0:0,0:0:0:0:
64,111,252404,2,0,P|132:104|201:102,1,137.6,8|0,0:0|0:0,0:0:0:0:
412,86,252768,6,0,P|397:152|340:187,1,137.6,2|0,0:0|0:0,0:0:0:0:
385,338,253132,2,0,P|301:323|257:275,1,137.6,8|0,0:0|0:0,0:0:0:0:
131,339,253495,2,0,P|116:264|127:194,1,137.6,2|0,0:0|0:0,0:0:0:0:
271,52,253859,1,8,0:0:0:0:
264,288,254041,1,0,0:0:0:0:
466,160,254223,5,2,0:0:0:0:
466,160,254404,2,0,P|407:129|341:144,1,137.6,0|8,0:0|0:0,0:0:0:0:
110,207,254768,1,0,0:0:0:0:
399,359,254950,2,0,P|400:290|393:222,1,137.6,2|0,0:0|0:0,0:0:0:0:
269,66,255313,1,8,0:0:0:0:
242,317,255495,1,0,0:0:0:0:
127,177,255677,5,8,0:0:0:0:
383,205,255859,1,2,0:0:0:0:
67,236,256041,5,8,0:0:0:0:
442,145,256223,1,2,0:0:0:0:
49,155,256404,5,8,0:0:0:0:
460,227,256586,1,8,0:0:0:0:
271,39,256768,1,8,0:0:0:0:
238,342,256950,1,2,0:0:0:0:
132,61,257132,6,0,P|200:60|269:65,1,137.6,6|0,0:0|0:0,0:0:0:0:
328,306,257495,1,8,0:0:0:0:
174,175,257677,1,0,0:0:0:0:
391,76,257859,2,0,L|383:213,1,137.6,2|0,0:0|0:0,0:0:0:0:
135,249,258223,2,0,P|92:199|102:133,1,137.6,8|0,0:0|0:0,0:0:0:0:
271,39,258586,6,0,B|317:26|317:26|391:76,1,137.6,2|0,0:0|0:0,0:0:0:0:
381,281,258950,2,0,B|369:327|369:327|288:366,1,137.6,8|0,0:0|0:0,0:0:0:0:
115,255,259313,2,0,B|81:222|81:222|88:132,1,137.6,2|0,0:0|0:0,0:0:0:0:
271,39,259677,1,8,0:0:0:0:
213,313,259859,1,0,0:0:0:0:
88,132,260041,5,2,0:0:0:0:
88,131,260223,2,0,P|161:121|243:131,1,137.6,0|8,0:0|0:0,0:0:0:0:
451,152,260586,1,0,0:0:0:0:
348,316,260768,2,0,P|279:321|212:312,1,137.6,2|0,0:0|0:0,0:0:0:0:
271,39,261132,1,8,0:0:0:0:
395,242,261312,1,0,0:0:0:0:
88,131,261495,5,8,0:0:0:0:
440,118,261677,1,2,0:0:0:0:
106,240,261859,1,8,0:0:0:0:
412,254,262040,1,2,0:0:0:0:
68,120,262223,5,8,0:0:0:0:
455,105,262405,1,2,0:0:0:0:
91,250,262587,1,8,0:0:0:0:
427,265,262768,1,2,0:0:0:0:
186,362,262950,6,0,P|170:294|194:228,1,137.6,6|0,0:0|0:0,0:0:0:0:
357,69,263313,1,8,0:0:0:0:
278,300,263495,1,0,0:0:0:0:
125,60,263677,2,0,P|209:58|275:62,1,137.6,2|0,0:0|0:0,0:0:0:0:
458,189,264041,2,0,P|374:191|308:187,1,137.6,8|0,0:0|0:0,0:0:0:0:
90,200,264404,6,0,P|73:265|84:333,1,137.6,2|0,0:0|0:0,0:0:0:0:
451,322,264769,2,0,P|468:256|457:188,1,137.6,8|0,0:0|0:0,0:0:0:0:
256,55,265132,2,0,P|238:121|250:188,1,137.6,2|0,0:0|0:0,0:0:0:0:
411,42,265495,1,8,0:0:0:0:
125,60,265677,1,0,0:0:0:0:
49,304,265859,5,2,0:0:0:0:
49,303,266041,2,0,P|124:308|203:278,1,137.6,0|8,0:0|0:0,0:0:0:0:
256,55,266404,1,0,0:0:0:0:
463,303,266586,2,0,P|388:308|309:278,1,137.6,2|0,0:0|0:0,0:0:0:0:
136,200,266950,1,8,0:0:0:0:
399,131,267131,1,0,0:0:0:0:
256,312,267313,5,8,0:0:0:0:
125,60,267495,1,2,0:0:0:0:
256,336,267677,5,8,0:0:0:0:
387,60,267859,1,2,0:0:0:0:
56,271,268041,5,8,0:0:0:0:
456,271,268223,1,8,0:0:0:0:
256,24,268404,1,8,0:0:0:0:
256,360,268586,1,2,0:0:0:0:
454,130,268768,6,0,P|388:103|323:126,1,137.6,6|0,0:0|0:0,0:0:0:0:
68,245,269132,2,0,P|130:302|144:218,1,206.4,8|0,0:0|0:0,0:0:0:0:
78,158,269495,1,2,0:0:0:0:
178,367,269677,1,0,0:0:0:0:
372,330,269859,2,0,P|386:263|384:194,1,137.6,8|0,0:0|0:0,0:0:0:0:
103,38,270223,6,0,P|89:105|90:173,1,137.6,2|0,0:0|0:0,0:0:0:0:
256,360,270586,2,0,L|256:216,1,137.6,8|0,0:0|0:0,0:0:0:0:
409,38,270950,2,0,P|422:105|421:173,1,137.6,2|0,0:0|0:0,0:0:0:0:
113,276,271313,1,8,0:0:0:0:
256,72,271495,1,0,0:0:0:0:
361,297,271677,5,2,0:0:0:0:
361,297,271859,2,0,P|295:311|227:300,1,137.6,0|8,0:0|0:0,0:0:0:0:
93,114,272223,1,0,0:0:0:0:
352,166,272404,1,2,0:0:0:0:
113,276,272586,1,0,0:0:0:0:
241,46,272768,1,8,0:0:0:0:
272,307,272950,1,0,0:0:0:0:
78,137,273132,5,8,0:0:0:0:
415,120,273313,1,2,0:0:0:0:
90,260,273495,5,8,0:0:0:0:
386,281,273676,1,2,0:0:0:0:
258,33,273859,1,8,0:0:0:0:
210,360,274041,5,2,0:0:0:0:
430,205,274223,1,2,0:0:0:0:
78,137,274404,1,2,0:0:0:0:
86,161,274950,6,0,P|160:160|240:136,1,129,8|0,0:3|0:0,0:0:0:0:
321,99,275313,6,0,P|322:203|242:138,1,258,4|0,0:3|0:0,0:0:0:0:
344,83,275677,6,0,P|374:169|309:233,1,193.50000738144,8|0,0:0|0:0,0:0:0:0:
223,269,276041,6,0,B|190:282|190:282|287:311,1,137.6,6|0,0:0|0:0,0:0:0:0:
459,337,276404,2,0,P|387:371|372:368,2,68.8,8|0|0,0:0|0:0|0:0,0:0:0:0:
487,183,276768,2,0,P|409:183|344:206,1,137.6,2|0,0:0|0:0,0:0:0:0:
209,64,277132,2,0,P|287:64|352:87,1,137.6,8|0,0:0|0:0,0:0:0:0:
223,269,277495,6,0,P|156:304|84:282,1,137.6,2|0,0:0|0:0,0:0:0:0:
133,68,277859,2,0,L|145:206,1,137.6,8|0,0:0|0:0,0:0:0:0:
308,25,278223,2,0,L|296:162,1,137.6,2|0,0:0|0:0,0:0:0:0:
464,114,278586,1,8,0:0:0:0:
455,147,278676,1,0,0:0:0:0:
447,180,278767,1,0,0:0:0:0:
439,214,278858,1,0,0:0:0:0:
431,247,278950,6,0,P|341:248|293:236,1,137.6,2|0,0:0|0:0,0:0:0:0:
236,57,279313,1,8,0:0:0:0:
201,55,279403,1,0,0:0:0:0:
167,58,279494,1,0,0:0:0:0:
133,68,279585,1,0,0:0:0:0:
102,82,279677,2,0,L|112:233,1,137.6,2|0,0:0|0:0,0:0:0:0:
289,339,280041,1,8,0:0:0:0:
291,304,280131,1,0,0:0:0:0:
293,270,280222,1,0,0:0:0:0:
295,236,280313,1,0,0:0:0:0:
298,201,280404,5,2,0:0:0:0:
309,58,280586,2,0,P|343:57|377:61,2,68.8,0|0|8,0:0|0:0|0:0,0:0:0:0:
102,82,280950,1,0,0:0:0:0:
152,247,281132,1,2,0:0:0:0:
220,98,281313,2,0,P|214:62|220:28,2,68.8,0|0|8,0:0|0:0|0:0,0:0:0:0:
291,304,281677,1,0,0:0:0:0:
448,168,281859,6,0,P|380:140|314:163,1,137.6,6|0,0:0|0:0,0:0:0:0:
152,247,282223,2,0,P|140:214|136:180,2,68.8,8|0|0,0:0|0:0|0:0,0:0:0:0:
371,368,282586,2,0,L|378:231,1,137.6,2|0,0:0|0:0,0:0:0:0:
220,98,282950,2,0,L|226:235,1,137.6,8|0,0:0|0:0,0:0:0:0:
447,167,283313,6,0,P|386:140|321:157,1,137.6,2|0,0:0|0:0,0:0:0:0:
305,335,283677,2,0,P|360:296|378:231,1,137.6,8|0,0:0|0:0,0:0:0:0:
231,127,284041,2,0,P|238:195|286:243,1,137.6,2|0,0:0|0:0,0:0:0:0:
449,202,284404,1,8,0:0:0:0:
447,167,284494,1,0,0:0:0:0:
445,133,284585,1,0,0:0:0:0:
443,98,284676,1,0,0:0:0:0:
441,64,284768,6,0,P|366:52|299:52,1,137.6,2|0,0:0|0:0,0:0:0:0:
117,130,285132,1,8,0:0:0:0:
115,164,285223,1,0,0:0:0:0:
113,199,285314,1,0,0:0:0:0:
111,233,285405,1,0,0:0:0:0:
109,268,285495,2,0,P|195:283|259:268,1,137.6,2|0,0:0|0:0,0:0:0:0:
445,133,285859,1,8,0:0:0:0:
411,126,285949,1,0,0:0:0:0:
377,121,286040,1,0,0:0:0:0:
342,119,286131,1,0,0:0:0:0:
308,120,286223,5,2,0:0:0:0:
113,199,286404,1,2,0:0:0:0:
357,256,286586,1,8,0:0:0:0:
102,354,286768,1,8,0:0:0:0:
338,243,286950,5,2,0:0:0:0:
137,198,287132,1,2,0:0:0:0:
299,135,287313,2,0,B|304:207|295:243|295:243|326:228,1,137.6,8|0,0:0|0:0,0:0:0:0:
442,160,287677,5,6,0:0:0:0:
216,122,287859,1,0,0:0:0:0:
216,122,287950,1,0,0:0:0:0:
216,122,288041,2,0,P|214:217|222:291,1,137.6,8|0,0:0|0:0,0:0:0:0:
383,277,288404,1,2,0:0:0:0:
417,51,288586,1,0,0:0:0:0:
417,51,288677,1,0,0:0:0:0:
417,51,288768,2,0,P|333:39|266:55,1,137.6,8|0,0:0|0:0,0:0:0:0:
72,89,289132,6,0,L|82:240,1,137.6,2|0,0:0|0:0,0:0:0:0:
430,226,289495,2,0,L|440:89,1,137.6,8|0,0:0|0:0,0:0:0:0:
190,279,289859,2,0,P|256:295|322:279,1,137.6,2|0,0:0|0:0,0:0:0:0:
322,61,290223,1,8,0:0:0:0:
289,49,290313,1,0,0:0:0:0:
255,45,290404,1,0,0:0:0:0:
221,49,290495,1,0,0:0:0:0:
189,60,290586,6,0,L|180:198,1,137.6,2|0,0:0|0:0,0:0:0:0:
351,151,290950,1,8,0:0:0:0:
354,186,291040,1,0,0:0:0:0:
356,220,291131,1,0,0:0:0:0:
358,254,291222,1,0,0:0:0:0:
361,289,291313,2,0,P|292:307|221:308,1,137.6,2|0,0:0|0:0,0:0:0:0:
45,178,291677,1,8,0:0:0:0:
79,176,291767,1,0,0:0:0:0:
113,179,291858,1,0,0:0:0:0:
147,186,291949,1,0,0:0:0:0:
179,197,292041,6,0,P|226:226|318:215,1,137.6,2|0,0:0|0:0,0:0:0:0:
351,151,292313,1,0,0:0:0:0:
351,151,292404,2,0,P|350:112|361:72,2,68.8,8|0|0,0:0|0:0|0:0,0:0:0:0:
369,336,292768,2,0,P|301:322|212:323,1,137.6,2|0,0:0|0:0,0:0:0:0:
151,337,293041,1,0,0:0:0:0:
151,337,293132,2,0,P|112:338|72:327,2,68.8,8|0|0,0:0|0:0|0:0,0:0:0:0:
383,223,293495,6,0,P|401:288|382:354,1,137.6,2|0,0:0|0:0,0:0:0:0:
230,250,293859,1,8,0:0:0:0:
216,219,293950,1,0,0:0:0:0:
211,185,294041,1,0,0:0:0:0:
215,151,294132,1,0,0:0:0:0:
229,120,294223,1,2,0:0:0:0:
434,156,294404,1,0,0:0:0:0:
369,336,294586,2,0,P|261:342|205:335,1,137.6,8|0,0:0|0:0,0:0:0:0:
73,183,294950,6,0,P|67:75|81:20,1,137.6,2|0,0:0|0:0,0:0:0:0:
439,46,295313,2,0,P|447:114|439:183,1,137.6,8|0,0:0|0:0,0:0:0:0:
256,352,295677,2,0,L|256:200,1,137.6,2|0,0:0|0:0,0:0:0:0:
93,84,296041,1,8,0:0:0:0:
90,119,296132,1,0,0:0:0:0:
90,153,296223,1,0,0:0:0:0:
96,187,296314,1,0,0:0:0:0:
105,221,296404,6,0,P|176:232|256:232,1,137.6,2|0,0:0|0:0,0:0:0:0:
464,208,296768,1,8,0:0:0:0:
294,129,296950,1,0,0:0:0:0:
396,321,297132,1,2,0:0:0:0:
425,95,297313,2,0,P|357:102|294:129,1,137.6,0|8,0:0|0:0,0:0:0:0:
105,221,297677,1,0,0:0:0:0:
417,331,297859,5,2,0:0:0:0:
82,211,298041,1,2,0:0:0:0:
405,105,298223,5,8,0:0:0:0:
59,201,298404,1,2,0:0:0:0:
308,356,298586,5,8,0:0:0:0:
322,53,298768,1,2,0:0:0:0:
111,297,298950,5,2,0:0:0:0:
426,242,299132,1,8,0:0:0:0:
103,148,299313,5,2,0:0:0:0:
212,344,299495,1,8,0:0:0:0:
298,40,299677,1,2,0:0:0:0:
407,234,299859,1,2,0:0:0:0:
16,117,300041,5,10,0:0:0:0:
494,265,300404,1,10,0:0:0:0:
256,192,300768,5,14,0:0:0:0:
256,192,300859,12,4,308404,0:0:0:0:
#!/usr/bin/env python
'''
osu! pp and difficulty calculator.
pure python implementation of oppai-ng
this is meant to be used as a completely standalone python module,
more portable and easier to use than bindings.
this is over 10 times slower than the C version, so if you need to
calculate hundreds or thousands of scores you should consider
using the C version or making python bindings for it.
for comparison, the C version runs through the test suite (~12k
unique scores) in ~9-10 seconds on my i7-4790k while pyttanko takes
100+ seconds
if you want a command line interface, check out
https://github.com/Francesco149/oppai-ng
-------------------------------------------------------------------
usage:
put pyttanko.py in your project's folder and import pyttanko
for example usage, check out the __main__ at the bottom of the file
you can run it like:
cat /path/to/map.osu | ./pyttanko.py +HDDT 200x 1m 95%
also, check out "pydoc pyttanko" for full documentation
-------------------------------------------------------------------
this is free and unencumbered software released into the public
domain. check the attached UNLICENSE or http://unlicense.org/
'''
__author__ = "Franc[e]sco <lolisamurai@tfwno.gf>"
__version__ = "1.0.19"
import sys
import math
if sys.version_info[0] < 3:
# hack to force utf-8
reload(sys)
sys.setdefaultencoding("utf-8")
info = sys.stderr.write
class v2f:
'''2D vector with float values'''
def __init__(self, x=0.0, y=0.0):
self.x = x
self.y = y
def __sub__(self, other):
return v2f(self.x - other.x, self.y - other.y)
def __mul__(self, other):
return v2f(self.x * other, self.y * other)
def len(self):
return math.sqrt(self.x * self.x + self.y * self.y)
def __str__(self):
return str(self.__dict__)
def __repr__(self):
return str(self)
''' ----------------------------------------------------------- '''
''' beatmap utils '''
MODE_STD = 0
class circle:
def __init__(self, pos=None):
'''initializes a circle object.
if pos is None, it will be set to v2f()'''
if pos == None:
pos = v2f()
self.pos = pos
def __str__(self):
return str(self.__dict__)
def __repr__(self):
return str(self)
class slider:
def __init__(self, pos=None, distance=0.0, repetitions=0):
'''initializes a slider object.
distance: distance travelled by one repetition (float)
pos: instance of v2f. if None, it will be set to v2f()'''
if pos == None:
pos = v2f()
self.pos = pos
self.distance = distance
self.repetitions = repetitions
def __str__(self):
return str(self.__dict__)
def __repr__(self):
return str(self)
OBJ_CIRCLE = 1<<0
OBJ_SLIDER = 1<<1
OBJ_SPINNER = 1<<3
class hitobject:
def __init__(self, time=0.0, objtype=OBJ_CIRCLE, data=None):
'''initializes a new hitobject.
time: start time in milliseconds (float)
data: an instance of circle, slider or None'''
self.time = time
self.objtype = objtype
self.data = data
self.normpos = v2f()
self.strains = [ 0.0, 0.0 ]
self.is_single = False
def typestr(self):
res = ""
if self.objtype & OBJ_CIRCLE != 0:
res += "circle | "
if self.objtype & OBJ_SLIDER != 0:
res += "slider | "
if self.objtype & OBJ_SPINNER != 0:
res += "spinner | "
return res[0:-3]
def __str__(self):
return (
'''hitobject(time=%g, objtype=%s, data=%s,
normpos=%s, strains=%s, is_single=%s)''' % (
self.time, self.typestr(), str(self.data),
str(self.normpos), str(self.strains),
str(self.is_single)
)
)
def __repr__(self):
return str(self)
class timing:
def __init__(self, time=0.0, ms_per_beat=-100.0, change=False):
'''initializes a timing point
time: start time in milliseconds (float)
ms_per_beat: float
change: if False, ms_per_beat is -100.0 * bpm_multiplier'''
self.time = time
self.ms_per_beat = ms_per_beat
self.change = change
def __str__(self):
return str(self.__dict__)
def __repr__(self):
return str(self)
class beatmap:
'''the bare minimum amount of data about a beatmap to perform
difficulty and pp calculation
fields:
mode: gamemode, see MODE_* constants (integer)
title title_unicode artist artist_unicode
creator: mapper name
version: difficulty name
ncircles, nsliders, nspinners
hp cs od ar (float)
sv tick_rate (float)
hitobjects: list (hitobject)
timing_points: list (timing)'''
def __init__(self):
# i tried pre-allocating hitobjects and timing_points
# as well as object data.
# it didn't show any appreciable performance improvement
self.format_version = 1
self.hitobjects = []
self.timing_points = []
'''these are assumed to be ordered by time low to high'''
self.reset()
def reset(self):
'''resets fields to prepare the object to store a new
beatmap. used internally by the parser'''
self.mode = MODE_STD
self.title = ""
self.title_unicode = ""
self.artist = ""
self.artist_unicode = ""
self.creator = ""
self.version = ""
self.ncircles = self.nsliders = self.nspinners = 0
self.hp = self.cs = self.od = 5
self.ar = None
self.sv = self.tick_rate = 1.0
self.hitobjects[:] = []
self.timing_points[:] = []
def __str__(self):
s = self
return '''beatmap(
title="%s", title_unicode="%s"
artist="%s", artist_unicode="%s",
creator="%s", version="%s",
hitobjects=[ %s ],
timing_points=[ %s ],
ncircles=%d, nsliders=%d, nspinners=%d,
hp=%g, cs=%g, od=%g, ar=%g,
sv=%g, tick_rate=%g\n)''' % (
s.title, s.title_unicode, s.artist, s.artist_unicode,
s.creator, s.version,
",\n ".join([str(x) for x in s.hitobjects]),
",\n ".join([str(x) for x in s.timing_points]),
s.ncircles, s.nsliders, s.nspinners, s.hp, s.cs, s.od,
s.ar, s.sv, s.tick_rate
)
def __repr__(self):
return str(self)
def max_combo(self):
res = 0
points = self.timing_points
tindex = -1
tnext = -float("inf")
px_per_beat = None
for obj in self.hitobjects:
if obj.objtype & OBJ_SLIDER == 0:
res += 1
continue
# keep track of the current timing point without
# looping through all of the timing points for every
# object
while tnext != None and obj.time >= tnext:
tindex += 1
if len(points) > tindex + 1:
tnext = points[tindex + 1].time
else:
tnext = None
t = points[tindex]
sv_multiplier = 1.0
if not t.change and t.ms_per_beat < 0:
sv_multiplier = (-100.0 / t.ms_per_beat)
px_per_beat = self.sv * 100.0 * sv_multiplier
if self.format_version < 8:
px_per_beat /= sv_multiplier
# slider ticks
sl = obj.data
num_beats = (
(sl.distance * sl.repetitions) / px_per_beat
)
ticks = int(
math.ceil(
(num_beats - 0.1) /
sl.repetitions * self.tick_rate
)
)
ticks -= 1
ticks *= sl.repetitions
ticks += sl.repetitions + 1
res += max(0, ticks)
return res
''' ----------------------------------------------------------- '''
''' beatmap parser '''
class parser:
'''beatmap parser.
fields:
lastline lastpos: last line and token touched (strings)
nline: last line number touched
done: True if the parsing completed successfully'''
def __init__(self):
self.lastline = ""
self.lastpos = ""
self.nline = 0
self.done = False
def __str__(self):
'''formats parser status if the parsing failed'''
if self.done:
return "parsing successful"
return (
"in line %d\n%s\n> %s\n" % (
self.nline, self.lastline, self.lastpos
)
)
def __repr__(self):
return str(self)
def setlastpos(self, v):
# sets lastpos to v and returns v
# should be used to access any string that can make the
# parser fail
self.lastpos = v
return v
def property(self, line):
# parses PropertyName:Value into a tuple
s = line.split(":")
if len(s) < 2:
raise SyntaxError(
"property must be a pair of ':'-separated values"
)
return (s[0], "".join(s[1:]))
def metadata(self, b, line):
p = self.property(line)
if p[0] == "Title":
b.title = p[1]
elif p[0] == "TitleUnicode":
b.title_unicode = p[1]
elif p[0] == "Artist":
b.artist = p[1]
elif p[0] == "ArtistUnicode":
b.artist_unicode = p[1]
elif p[0] == "Creator":
b.creator = p[1]
elif p[0] == "Version":
b.version = p[1]
def general(self, b, line):
p = self.property(line)
if p[0] == "Mode":
b.mode = int(self.setlastpos(p[1]))
def difficulty(self, b, line):
p = self.property(line)
if p[0] == "CircleSize":
b.cs = float(self.setlastpos(p[1]))
elif p[0] == "OverallDifficulty":
b.od = float(self.setlastpos(p[1]))
elif p[0] == "ApproachRate":
b.ar = float(self.setlastpos(p[1]))
elif p[0] == "HPDrainRate":
b.hp = float(self.setlastpos(p[1]))
elif p[0] == "SliderMultiplier":
b.sv = float(self.setlastpos(p[1]))
elif p[0] == "SliderTickRate":
b.tick_rate = float(self.setlastpos(p[1]))
def timing(self, b, line):
s = line.split(",")
if len(s) > 8:
info("W: timing point with trailing values\n")
elif len(s) < 2:
raise SyntaxError(
"timing point must have at least two fields"
)
t = timing(
time=float(self.setlastpos(s[0])),
ms_per_beat=float(self.setlastpos(s[1]))
)
if len(s) >= 7:
t.change = int(s[6]) != 0
b.timing_points.append(t)
def objects_std(self, b, line):
s = line.split(",")
if len(s) > 11:
info("W: object with trailing values\n")
if len(s) < 5:
raise SyntaxError(
"hitobject must have at least 5 fields"
)
# I already tried calling the constructor with all of the
# values on the fly and it wasn't any faster, don't bother
obj = hitobject()
obj.time = float(self.setlastpos(s[2]))
obj.objtype = int(self.setlastpos(s[3]))
if obj.objtype < 0 or obj.objtype > 255:
raise SyntaxError("invalid hitobject type")
# x,y,...
if obj.objtype & OBJ_CIRCLE != 0:
b.ncircles += 1
c = circle()
c.pos.x = float(self.setlastpos(s[0]))
c.pos.y = float(self.setlastpos(s[1]))
obj.data = c
# ?,?,?,?,?,end_time,custom_sample_banks
elif obj.objtype & OBJ_SPINNER != 0:
b.nspinners += 1
# x,y,time,type,sound_type,points,repetitions,distance,
# per_node_sounds,per_node_samples,custom_sample_banks
elif obj.objtype & OBJ_SLIDER != 0:
if len(s) < 7:
raise SyntaxError(
"slider must have at least 7 fields"
)
b.nsliders += 1
sli = slider()
sli.pos.x = float(self.setlastpos(s[0]))
sli.pos.y = float(self.setlastpos(s[1]))
sli.repetitions = int(self.setlastpos(s[6]))
sli.distance = float(self.setlastpos(s[7]))
obj.data = sli
b.hitobjects.append(obj)
def objects(self, b, line):
if b.mode == MODE_STD:
self.objects_std(b, line)
# TODO: other modes
else:
raise NotImplementedError
def map(self, osu_file, bmap = None):
'''reads a file object and parses it into a beatmap object
which is then returned.
if bmap is specified, it will be reused as a pre-allocated
beatmap object instead of building a new one, speeding
up parsing slightly because of less allocations'''
f = osu_file
self.done = False
section = ""
b = bmap
if b == None:
b = beatmap()
else:
b.reset()
for line in osu_file:
self.nline += 1
self.lastline = line
# comments (according to lazer)
if line.startswith(" ") or line.startswith("_"):
continue
line = line.strip()
if line == "":
continue
# c++ style comments
if line.startswith("//"):
continue
# [SectionName]
if line.startswith("["):
section = line[1:-1]
continue
if section == "Metadata":
self.metadata(b, line)
elif section == "General":
self.general(b, line)
elif section == "Difficulty":
self.difficulty(b, line)
elif section == "TimingPoints":
self.timing(b, line)
elif section == "HitObjects":
self.objects(b, line)
else:
OSU_MAGIC = "file format v"
findres = line.strip().find(OSU_MAGIC)
if findres > 0:
b.format_version = int(
line[findres+len(OSU_MAGIC):]
)
if b.ar is None:
b.ar = b.od
self.done = True
return b
''' ----------------------------------------------------------- '''
''' mods utils '''
MODS_NOMOD = 0
MODS_NF = 1<<0
MODS_EZ = 1<<1
MODS_TOUCH_DEVICE = 1<<2
MODS_HD = 1<<3
MODS_HR = 1<<4
MODS_DT = 1<<6
MODS_HT = 1<<8
MODS_NC = 1<<9
MODS_FL = 1<<10
MODS_SO = 1<<12
def mods_str(mods):
'''gets string representation of mods, such as HDDT.
returns "nomod" for nomod'''
if mods == 0:
return "nomod"
res = ""
if mods & MODS_HD != 0: res += "HD"
if mods & MODS_HT != 0: res += "HT"
if mods & MODS_HR != 0: res += "HR"
if mods & MODS_EZ != 0: res += "EZ"
if mods & MODS_TOUCH_DEVICE != 0: res += "TD"
if mods & MODS_NC != 0: res += "NC"
elif mods & MODS_DT != 0: res += "DT"
if mods & MODS_FL != 0: res += "FL"
if mods & MODS_SO != 0: res += "SO"
if mods & MODS_NF != 0: res += "NF"
return res
def mods_from_str(string):
'''get mods bitmask from their string representation
(touch device is TD)'''
res = 0
while string != "":
if string.startswith("HD"): res |= MODS_HD
elif string.startswith("HT"): res |= MODS_HT
elif string.startswith("HR"): res |= MODS_HR
elif string.startswith("EZ"): res |= MODS_EZ
elif string.startswith("TD"): res |= MODS_TOUCH_DEVICE
elif string.startswith("NC"): res |= MODS_NC
elif string.startswith("DT"): res |= MODS_DT
elif string.startswith("FL"): res |= MODS_FL
elif string.startswith("SO"): res |= MODS_SO
elif string.startswith("NF"): res |= MODS_NF
else:
string = string[1:]
continue
string = string[2:]
return res
def mods_apply(mods, ar = None, od = None, cs = None, hp = None):
''' calculates speed multiplier, ar, od, cs, hp with the given
mods applied. returns (speed_mul, ar, od, cs, hp).
the base stats are all optional and default to None. if a base
stat is None, then it won't be calculated and will also be
returned as None.'''
OD0_MS = 79.5
OD10_MS = 19.5
AR0_MS = 1800
AR5_MS = 1200
AR10_MS = 450
OD_MS_STEP = (OD0_MS - OD10_MS) / 10.0
AR_MS_STEP1 = (AR0_MS - AR5_MS) / 5.0
AR_MS_STEP2 = (AR5_MS - AR10_MS) / 5.0
MODS_SPEED_CHANGING = MODS_DT | MODS_HT | MODS_NC
MODS_MAP_CHANGING = MODS_HR | MODS_EZ | MODS_SPEED_CHANGING
if mods & MODS_MAP_CHANGING == 0:
return (1.0, ar, od, cs, hp)
speed_mul = 1.0
if mods & (MODS_DT | MODS_NC) != 0:
speed_mul = 1.5
if mods & MODS_HT != 0:
speed_mul *= 0.75
od_ar_hp_multiplier = 1.0
if mods & MODS_HR != 0:
od_ar_hp_multiplier = 1.4
if mods & MODS_EZ:
od_ar_hp_multiplier *= 0.5
if ar != None:
ar *= od_ar_hp_multiplier
# convert AR into milliseconds
arms = AR5_MS
if ar < 5.0:
arms = AR0_MS - AR_MS_STEP1 * ar
else:
arms = AR5_MS - AR_MS_STEP2 * (ar - 5)
# stats must be capped to 0-10 before HT/DT which brings
# them to a range of -4.42-11.08 for OD and -5-11 for AR
arms = min(AR0_MS, max(AR10_MS, arms))
arms /= speed_mul
# convert back to AR
if arms > AR5_MS:
ar = (AR0_MS - arms) / AR_MS_STEP1
else:
ar = 5.0 + (AR5_MS - arms) / AR_MS_STEP2
if od != None:
od *= od_ar_hp_multiplier
odms = OD0_MS - math.ceil(OD_MS_STEP * od)
odms = min(OD0_MS, max(OD10_MS, odms))
odms /= speed_mul
od = (OD0_MS - odms) / OD_MS_STEP
if cs != None:
if mods & MODS_HR != 0:
cs *= 1.3
if mods & MODS_EZ != 0:
cs *= 0.5
cs = min(10.0, cs)
if hp != None:
hp = min(10.0, hp * od_ar_hp_multiplier)
return (speed_mul, ar, od, cs, hp)
''' ----------------------------------------------------------- '''
''' difficulty calculator '''
DIFF_SPEED = 0
DIFF_AIM = 1
def d_spacing_weight(difftype, distance):
# calculates spacing weight and returns (weight, is_single)
# NOTE: is_single is only computed for DIFF_SPEED
ALMOST_DIAMETER = 90.0 # almost the normalized circle diameter
# arbitrary thresholds to determine when a stream is spaced
# enough that it becomes hard to alternate
STREAM_SPACING = 110.0
SINGLE_SPACING = 125.0
if difftype == DIFF_AIM:
return (pow(distance, 0.99), False)
elif difftype == DIFF_SPEED:
if distance > SINGLE_SPACING:
return (2.5, True)
elif distance > STREAM_SPACING:
return ((
1.6 + 0.9 * (distance - STREAM_SPACING) /
(SINGLE_SPACING - STREAM_SPACING)
), False)
elif distance > ALMOST_DIAMETER:
return ((
1.2 + 0.4 * (distance - ALMOST_DIAMETER) /
(STREAM_SPACING - ALMOST_DIAMETER)
), False)
elif distance > ALMOST_DIAMETER / 2.0:
return ((
0.95 + 0.25 * (distance - ALMOST_DIAMETER / 2.0) /
(ALMOST_DIAMETER / 2.0)
), False)
return (0.95, False)
raise NotImplementedError
DECAY_BASE = [ 0.3, 0.15 ] # strain decay per interval
def d_strain(difftype, obj, prevobj, speed_mul):
# calculates the difftype strain value for a hitobject. stores
# the result in obj.strains[difftype]
# this assumes that normpos is already computed
WEIGHT_SCALING = [ 1400.0, 26.25 ] # balances speed and aim
t = difftype
value = 0.0
time_elapsed = (obj.time - prevobj.time) / speed_mul
decay = pow(DECAY_BASE[t], time_elapsed / 1000.0)
# this implementation doesn't account for sliders
if obj.objtype & (OBJ_SLIDER | OBJ_CIRCLE) != 0:
value, is_single = d_spacing_weight(
t, (obj.normpos - prevobj.normpos).len()
)
value *= WEIGHT_SCALING[t]
if t == DIFF_SPEED:
obj.is_single = is_single
# prevents retarded results for hit object spams
value /= max(time_elapsed, 50.0)
obj.strains[t] = prevobj.strains[t] * decay + value
class diff_calc:
'''difficulty calculator.
fields:
total: star rating
aim: aim stars
speed: speed stars
nsingles: number of notes that are considered singletaps by
the difficulty calculator
nsingles_threshold: number of taps slower or equal to the
singletap threshold value'''
def __init__(self):
self.strains = []
# NOTE: i tried pre-allocating this to 600 elements or so
# and it didn't show appreciable performance improvements
self.reset()
def reset(self):
self.total = self.aim = self.speed = 0.0
self.nsingles = self.nsingles_threshold = 0
def __str__(self):
return '''%g stars (%g aim, %g speed)
%d spacing singletaps
%d taps within singletap threshold''' % (
self.total, self.aim, self.speed, self.nsingles,
self.nsingles_threshold
)
def calc_individual(self, difftype, bmap, speed_mul):
# calculates total strain for difftype. this assumes the
# normalized positions for hitobjects are already present
# max strains are weighted from highest to lowest.
# this is how much the weight decays
DECAY_WEIGHT = 0.9
''' strains are calculated by analyzing the map in chunks
and taking the peak strains in each chunk. this is the
length of a strain interval in milliseconds '''
strain_step = 400.0 * speed_mul
self.strains[:] = []
interval_end = strain_step
max_strain = 0.0
objs = bmap.hitobjects
t = difftype
for i, obj in enumerate(objs[1:]):
prev = objs[i]
d_strain(difftype, obj, prev, speed_mul)
while obj.time > interval_end:
# add max strain for this interval
self.strains.append(max_strain)
# decay last object's strains until the next
# interval and use that as the initial max strain
decay = pow(
DECAY_BASE[t],
(interval_end - prev.time) / 1000.0
)
max_strain = prev.strains[t] * decay
interval_end += strain_step
max_strain = max(max_strain, obj.strains[t])
# weight the top strains sorted from highest to lowest
weight = 1.0
difficulty = 0.0
strains = self.strains
strains.sort(reverse=True)
for strain in strains:
difficulty += strain * weight
weight *= DECAY_WEIGHT
return difficulty
def calc(self, bmap, mods=MODS_NOMOD, singletap_threshold=125):
'''calculates difficulty and stores results in self.total,
self.aim, self.speed, self.nsingles,
self.nsingles_threshold.
returns self.
singletap_threshold is the smallest milliseconds interval
that will be considered singletappable, defaults to 125ms
which is 240 bpm 1/2 ((60000 / 240) / 2)'''
# non-normalized diameter where the small circle size buff
# starts
CIRCLESIZE_BUFF_THRESHOLD = 30.0
STAR_SCALING_FACTOR = 0.0675 # global stars multiplier
# 50% of the difference between aim and speed is added to
# star rating to compensate aim only or speed only maps
EXTREME_SCALING_FACTOR = 0.5
PLAYFIELD_WIDTH = 512.0 # in osu!pixels
playfield_center = v2f(
PLAYFIELD_WIDTH / 2, PLAYFIELD_WIDTH / 2
)
if bmap.mode != MODE_STD:
raise NotImplementedError
self.reset()
# calculate CS with mods
speed_mul, _, _, cs, _ = mods_apply(mods, cs=bmap.cs)
# circle radius
radius = (
(PLAYFIELD_WIDTH / 16.0) *
(1.0 - 0.7 * (cs - 5.0) / 5.0)
)
# positions are normalized on circle radius so that we can
# calc as if everything was the same circlesize
scaling_factor = 52.0 / radius
# low cs buff (credits to osuElements)
if radius < CIRCLESIZE_BUFF_THRESHOLD:
scaling_factor *= (
1.0 +
min(CIRCLESIZE_BUFF_THRESHOLD - radius, 5.0)
/ 50.0
)
playfield_center *= scaling_factor
# calculate normalized positions
objs = bmap.hitobjects
for obj in objs:
if obj.objtype & OBJ_SPINNER != 0:
obj.normpos = v2f(
playfield_center.x, playfield_center.y
)
else:
obj.normpos = obj.data.pos * scaling_factor
# speed and aim stars
b = bmap
self.speed = self.calc_individual(DIFF_SPEED, b, speed_mul)
self.aim = self.calc_individual(DIFF_AIM, b, speed_mul)
self.speed = math.sqrt(self.speed) * STAR_SCALING_FACTOR
self.aim = math.sqrt(self.aim) * STAR_SCALING_FACTOR
if mods & MODS_TOUCH_DEVICE != 0:
self.aim = pow(self.aim, 0.8)
# total stars
self.total = self.aim + self.speed
self.total += (
abs(self.speed - self.aim) *
EXTREME_SCALING_FACTOR
)
# singletap stats
for i, obj in enumerate(objs[1:]):
prev = objs[i]
if obj.is_single:
self.nsingles += 1
if obj.objtype & (OBJ_CIRCLE | OBJ_SLIDER) == 0:
continue
interval = (obj.time - prev.time) / speed_mul
if interval >= singletap_threshold:
self.nsingles_threshold += 1
return self
''' ----------------------------------------------------------- '''
''' pp calculator '''
def acc_calc(n300, n100, n50, misses):
'''calculates accuracy (0.0-1.0)'''
h = n300 + n100 + n50 + misses
if h <= 0:
return 0.0
return (n50 * 50.0 + n100 * 100.0 + n300 * 300.0) / (h * 300.0)
def acc_round(acc_percent, nobjects, misses):
'''rounds to the closest amount of 300s, 100s, 50s
returns (n300, n100, n50)'''
misses = min(nobjects, misses)
max300 = nobjects - misses
maxacc = acc_calc(max300, 0, 0, misses) * 100.0
acc_percent = max(0.0, min(maxacc, acc_percent))
n50 = n300 = 0
# just some black magic maths from wolfram alpha
n100 = round(
-3.0 *
((acc_percent * 0.01 - 1.0) * nobjects + misses) * 0.5
)
n100 = int(n100)
if n100 > nobjects - misses:
# acc lower than all 100s, use 50s
n100 = 0
n50 = round(
-6.0 * (
(acc_percent * 0.01 - 1.0) * nobjects
+ misses
) * 0.5
)
n50 = int(n50)
n50 = min(max300, n50)
else:
n100 = min(max300, n100)
n300 = nobjects - n100 - n50 - misses
return (n300, n100, n50)
def pp_base(stars):
# base pp value for stars, used internally by ppv2
return (
pow(5.0 * max(1.0, stars / 0.0675) - 4.0, 3.0) / 100000.0
)
def ppv2(
aim_stars=None, speed_stars=None, max_combo=None,
nsliders=None, ncircles=None, nobjects=None, base_ar=5.0,
base_od=5.0, mode=MODE_STD, mods=MODS_NOMOD, combo=None,
n300=None, n100=0, n50=0, nmiss=0, score_version=1, bmap=None
):
'''calculates ppv2
returns (pp, aim_pp, speed_pp, acc_pp, acc_percent)
if bmap is provided, mode, base_ar, base_od, max_combo,
nsliders, ncircles and nobjects are taken from it. otherwise
they must be provided.
if combo is None, max_combo is used.
if n300 is None, max_combo - n100 - n50 - nmiss is used.'''
if mode != MODE_STD:
info(
"ppv2 is only implemented for osu!std at the moment\n"
)
raise NotImplementedError
if bmap != None:
mode = bmap.mode
base_ar = bmap.ar
base_od = bmap.od
max_combo = bmap.max_combo()
nsliders = bmap.nsliders
ncircles = bmap.ncircles
nobjects = len(bmap.hitobjects)
else:
if aim_stars == None:
raise ValueError("missing aim_stars or bmap")
if speed_stars == None:
raise ValueError("missing speed_stars")
if max_combo == None:
raise ValueError("missing max_combo or bmap")
if nsliders == None:
raise ValueError("missing nsliders or bmap")
if ncircles == None:
raise ValueError("missing ncircles or bmap")
if nobjects == None:
raise ValueError("missing nobjects or bmap")
if max_combo <= 0:
info("W: max_combo <= 0, changing to 1\n")
max_combo = 1
if combo == None:
combo = max_combo - nmiss
if n300 == None:
n300 = nobjects - n100 - n50 - nmiss
# accuracy ----------------------------------------------------
accuracy = acc_calc(n300, n100, n50, nmiss)
real_acc = accuracy
if score_version == 1:
# scorev1 ignores sliders since they are free 300s
# for whatever reason it also ignores spinners
nspinners = nobjects - nsliders - ncircles
real_acc = acc_calc(
n300 - nsliders - nspinners, n100, n50, nmiss
)
# can go negative if we miss everything
real_acc = max(0.0, real_acc)
elif score_version == 2:
ncircles = nobjects
else:
info("unsupported scorev%d\n" % (score_version))
raise NotImplementedError
# global values -----------------------------------------------
nobjects_over_2k = nobjects / 2000.0
length_bonus = 0.95 + 0.4 * min(1.0, nobjects_over_2k)
if nobjects > 2000:
length_bonus += math.log10(nobjects_over_2k) * 0.5
miss_penality = pow(0.97, nmiss)
combo_break = pow(combo, 0.8) / pow(max_combo, 0.8)
# calculate stats with mods
speed_mul, ar, od, _, _ = (
mods_apply(mods, ar=base_ar, od=base_od)
)
# ar bonus ----------------------------------------------------
ar_bonus = 1.0
if ar > 10.33:
ar_bonus += 0.45 * (ar - 10.33)
elif ar < 8.0:
low_ar_bonus = 0.01 * (8.0 - ar)
if mods & MODS_HD != 0:
low_ar_bonus *= 2.0
ar_bonus += low_ar_bonus
# aim pp ------------------------------------------------------
aim = pp_base(aim_stars)
aim *= length_bonus
aim *= miss_penality
aim *= combo_break
aim *= ar_bonus
if mods & MODS_HD != 0:
aim *= 1.18
if mods & MODS_FL != 0:
aim *= 1.45 * length_bonus
acc_bonus = 0.5 + accuracy / 2.0
od_bonus = 0.98 + (od * od) / 2500.0
aim *= acc_bonus
aim *= od_bonus
# speed pp ----------------------------------------------------
speed = pp_base(speed_stars)
speed *= length_bonus
speed *= miss_penality
speed *= combo_break
speed *= acc_bonus
speed *= od_bonus
# acc pp ------------------------------------------------------
acc = pow(1.52163, od) * pow(real_acc, 24.0) * 2.83
# length bonus (not the same as speed/aim length bonus)
acc *= min(1.15, pow(ncircles / 1000.0, 0.3))
if mods & MODS_HD != 0:
acc *= 1.02
if mods & MODS_FL != 0:
acc *= 1.02
# total pp ----------------------------------------------------
final_multiplier = 1.12
if mods & MODS_NF != 0:
final_multiplier *= 0.90
if mods & MODS_SO != 0:
final_multiplier *= 0.95
total = (
pow(
pow(aim, 1.1) + pow(speed, 1.1) + pow(acc, 1.1),
1.0 / 1.1
) * final_multiplier
)
return (total, aim, speed, acc, accuracy * 100.0)
''' ----------------------------------------------------------- '''
''' usage example '''
hr = MODS_HR
nc = MODS_NC
ht = MODS_HT
so = MODS_SO
nf = MODS_NF
ez = MODS_EZ
nomod = MODS_NOMOD
fl = MODS_FL
dt = MODS_DT
hd = MODS_HD
# id max_combo n300 n100 n50 nmiss mods pp
s = (774965, 1773, 1165, 8, 0, 0, dt | hd, 817.164)
ERROR_MARGIN = 0.02
'''pp can be off by +- 2%
margin is actually 3x for < 100pp, 2x for 100-200,
1.5x for 200-300'''
p = parser()
bmap = beatmap()
stars = diff_calc()
count = 0
with open("%d.osu" % (s[0]), "r") as f:
p.map(f, bmap=bmap)
stars.calc(bmap, s[6])
pp, _, _, _, _ = ppv2(
stars.aim, stars.speed, bmap=bmap, mods=s[6],
n300=s[2], n100=s[3], n50=s[4], nmiss=s[5],
combo=s[1]
)
margin = s[7] * ERROR_MARGIN
if s[7] < 100:
margin *= 3
elif s[7] < 200:
margin *= 2
elif s[7] < 300:
margin *= 1.5
if abs(pp - s[7]) >= margin:
info(
"failed test: got %gpp, expected %g\n" % (
pp, s[7]
)
)
exit(1)
print(pp)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment