diff --git a/AGENTS.md b/AGENTS.md index 6360a051..9eae427c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,4 +1,4 @@ -OpenArc uses bleeding edge libraries and APIs you may not be familair with. When working through a task, use the deepwiki mcp server to get *contextual* information, and the command line to investigate python surfaces. Prefer the command line. +OpenArc uses bleeding edge libraries and APIs you may not be familair with. When working through a task, use the command line to investigate python surfaces. Prefer the command line to obtain ground truth from installed packages, OR follow the users instructions which take precedent. @@ -9,4 +9,5 @@ OpenArc uses bleeding edge libraries and APIs you may not be familair with. When DO NOT: -- Run uv sync without permission. \ No newline at end of file +- Run uv sync without permission. +- write files to /tmp. Use ./tmp instead. \ No newline at end of file diff --git a/benchmark/sonnet.txt b/benchmark/sonnet.txt new file mode 100644 index 00000000..34c444e8 --- /dev/null +++ b/benchmark/sonnet.txt @@ -0,0 +1,518 @@ +FROM fairest creatures we desire increase, +That thereby beauty's rose might never die, +But as the riper should by time decease, +His tender heir might bear his memory: +But thou, contracted to thine own bright eyes, +Feed'st thy light'st flame with self-substantial fuel, +Making a famine where abundance lies, +Thyself thy foe, to thy sweet self too cruel. +Thou that art now the world's fresh ornament +And only herald to the gaudy spring, +Within thine own bud buriest thy content +And, tender churl, makest waste in niggarding. +Pity the world, or else this glutton be, +To eat the world's due, by the grave and thee. +When forty winters shall beseige thy brow, +And dig deep trenches in thy beauty's field, +Thy youth's proud livery, so gazed on now, +Will be a tatter'd weed, of small worth held: +Then being ask'd where all thy beauty lies, +Where all the treasure of thy lusty days, +To say, within thine own deep-sunken eyes, +Were an all-eating shame and thriftless praise. +How much more praise deserved thy beauty's use, +If thou couldst answer 'This fair child of mine +Shall sum my count and make my old excuse,' +Proving his beauty by succession thine! +This were to be new made when thou art old, +And see thy blood warm when thou feel'st it cold. +Look in thy glass, and tell the face thou viewest +Now is the time that face should form another; +Whose fresh repair if now thou not renewest, +Thou dost beguile the world, unbless some mother. +For where is she so fair whose unear'd womb +Disdains the tillage of thy husbandry? +Or who is he so fond will be the tomb +Of his self-love, to stop posterity? +Thou art thy mother's glass, and she in thee +Calls back the lovely April of her prime: +So thou through windows of thine age shall see +Despite of wrinkles this thy golden time. +But if thou live, remember'd not to be, +Die single, and thine image dies with thee. +Unthrifty loveliness, why dost thou spend +Upon thyself thy beauty's legacy? +Nature's bequest gives nothing but doth lend, +And being frank she lends to those are free. +Then, beauteous niggard, why dost thou abuse +The bounteous largess given thee to give? +Profitless usurer, why dost thou use +So great a sum of sums, yet canst not live? +For having traffic with thyself alone, +Thou of thyself thy sweet self dost deceive. +Then how, when nature calls thee to be gone, +What acceptable audit canst thou leave? +Thy unused beauty must be tomb'd with thee, +Which, used, lives th' executor to be. +Those hours, that with gentle work did frame +The lovely gaze where every eye doth dwell, +Will play the tyrants to the very same +And that unfair which fairly doth excel: +For never-resting time leads summer on +To hideous winter and confounds him there; +Sap cheque'd with frost and lusty leaves quite gone, +Beauty o'ersnow'd and bareness every where: +Then, were not summer's distillation left, +A liquid prisoner pent in walls of glass, +Beauty's effect with beauty were bereft, +Nor it nor no remembrance what it was: +But flowers distill'd though they with winter meet, +Leese but their show; their substance still lives sweet. +Then let not winter's ragged hand deface +In thee thy summer, ere thou be distill'd: +Make sweet some vial; treasure thou some place +With beauty's treasure, ere it be self-kill'd. +That use is not forbidden usury, +Which happies those that pay the willing loan; +That's for thyself to breed another thee, +Or ten times happier, be it ten for one; +Ten times thyself were happier than thou art, +If ten of thine ten times refigured thee: +Then what could death do, if thou shouldst depart, +Leaving thee living in posterity? +Be not self-will'd, for thou art much too fair +To be death's conquest and make worms thine heir. +Lo! in the orient when the gracious light +Lifts up his burning head, each under eye +Doth homage to his new-appearing sight, +Serving with looks his sacred majesty; +And having climb'd the steep-up heavenly hill, +Resembling strong youth in his middle age, +yet mortal looks adore his beauty still, +Attending on his golden pilgrimage; +But when from highmost pitch, with weary car, +Like feeble age, he reeleth from the day, +The eyes, 'fore duteous, now converted are +From his low tract and look another way: +So thou, thyself out-going in thy noon, +Unlook'd on diest, unless thou get a son. +Music to hear, why hear'st thou music sadly? +Sweets with sweets war not, joy delights in joy. +Why lovest thou that which thou receivest not gladly, +Or else receivest with pleasure thine annoy? +If the true concord of well-tuned sounds, +By unions married, do offend thine ear, +They do but sweetly chide thee, who confounds +In singleness the parts that thou shouldst bear. +Mark how one string, sweet husband to another, +Strikes each in each by mutual ordering, +Resembling sire and child and happy mother +Who all in one, one pleasing note do sing: +Whose speechless song, being many, seeming one, +Sings this to thee: 'thou single wilt prove none.' +Is it for fear to wet a widow's eye +That thou consumest thyself in single life? +Ah! if thou issueless shalt hap to die. +The world will wail thee, like a makeless wife; +The world will be thy widow and still weep +That thou no form of thee hast left behind, +When every private widow well may keep +By children's eyes her husband's shape in mind. +Look, what an unthrift in the world doth spend +Shifts but his place, for still the world enjoys it; +But beauty's waste hath in the world an end, +And kept unused, the user so destroys it. +No love toward others in that bosom sits +That on himself such murderous shame commits. +For shame! deny that thou bear'st love to any, +Who for thyself art so unprovident. +Grant, if thou wilt, thou art beloved of many, +But that thou none lovest is most evident; +For thou art so possess'd with murderous hate +That 'gainst thyself thou stick'st not to conspire. +Seeking that beauteous roof to ruinate +Which to repair should be thy chief desire. +O, change thy thought, that I may change my mind! +Shall hate be fairer lodged than gentle love? +Be, as thy presence is, gracious and kind, +Or to thyself at least kind-hearted prove: +Make thee another self, for love of me, +That beauty still may live in thine or thee. +As fast as thou shalt wane, so fast thou growest +In one of thine, from that which thou departest; +And that fresh blood which youngly thou bestowest +Thou mayst call thine when thou from youth convertest. +Herein lives wisdom, beauty and increase: +Without this, folly, age and cold decay: +If all were minded so, the times should cease +And threescore year would make the world away. +Let those whom Nature hath not made for store, +Harsh featureless and rude, barrenly perish: +Look, whom she best endow'd she gave the more; +Which bounteous gift thou shouldst in bounty cherish: +She carved thee for her seal, and meant thereby +Thou shouldst print more, not let that copy die. +When I do count the clock that tells the time, +And see the brave day sunk in hideous night; +When I behold the violet past prime, +And sable curls all silver'd o'er with white; +When lofty trees I see barren of leaves +Which erst from heat did canopy the herd, +And summer's green all girded up in sheaves +Borne on the bier with white and bristly beard, +Then of thy beauty do I question make, +That thou among the wastes of time must go, +Since sweets and beauties do themselves forsake +And die as fast as they see others grow; +And nothing 'gainst Time's scythe can make defence +Save breed, to brave him when he takes thee hence. +O, that you were yourself! but, love, you are +No longer yours than you yourself here live: +Against this coming end you should prepare, +And your sweet semblance to some other give. +So should that beauty which you hold in lease +Find no determination: then you were +Yourself again after yourself's decease, +When your sweet issue your sweet form should bear. +Who lets so fair a house fall to decay, +Which husbandry in honour might uphold +Against the stormy gusts of winter's day +And barren rage of death's eternal cold? +O, none but unthrifts! Dear my love, you know +You had a father: let your son say so. +Not from the stars do I my judgment pluck; +And yet methinks I have astronomy, +But not to tell of good or evil luck, +Of plagues, of dearths, or seasons' quality; +Nor can I fortune to brief minutes tell, +Pointing to each his thunder, rain and wind, +Or say with princes if it shall go well, +By oft predict that I in heaven find: +But from thine eyes my knowledge I derive, +And, constant stars, in them I read such art +As truth and beauty shall together thrive, +If from thyself to store thou wouldst convert; +Or else of thee this I prognosticate: +Thy end is truth's and beauty's doom and date. +When I consider every thing that grows +Holds in perfection but a little moment, +That this huge stage presenteth nought but shows +Whereon the stars in secret influence comment; +When I perceive that men as plants increase, +Cheered and cheque'd even by the self-same sky, +Vaunt in their youthful sap, at height decrease, +And wear their brave state out of memory; +Then the conceit of this inconstant stay +Sets you most rich in youth before my sight, +Where wasteful Time debateth with Decay, +To change your day of youth to sullied night; +And all in war with Time for love of you, +As he takes from you, I engraft you new. +But wherefore do not you a mightier way +Make war upon this bloody tyrant, Time? +And fortify yourself in your decay +With means more blessed than my barren rhyme? +Now stand you on the top of happy hours, +And many maiden gardens yet unset +With virtuous wish would bear your living flowers, +Much liker than your painted counterfeit: +So should the lines of life that life repair, +Which this, Time's pencil, or my pupil pen, +Neither in inward worth nor outward fair, +Can make you live yourself in eyes of men. +To give away yourself keeps yourself still, +And you must live, drawn by your own sweet skill. +Who will believe my verse in time to come, +If it were fill'd with your most high deserts? +Though yet, heaven knows, it is but as a tomb +Which hides your life and shows not half your parts. +If I could write the beauty of your eyes +And in fresh numbers number all your graces, +The age to come would say 'This poet lies: +Such heavenly touches ne'er touch'd earthly faces.' +So should my papers yellow'd with their age +Be scorn'd like old men of less truth than tongue, +And your true rights be term'd a poet's rage +And stretched metre of an antique song: +But were some child of yours alive that time, +You should live twice; in it and in my rhyme. +Shall I compare thee to a summer's day? +Thou art more lovely and more temperate: +Rough winds do shake the darling buds of May, +And summer's lease hath all too short a date: +Sometime too hot the eye of heaven shines, +And often is his gold complexion dimm'd; +And every fair from fair sometime declines, +By chance or nature's changing course untrimm'd; +But thy eternal summer shall not fade +Nor lose possession of that fair thou owest; +Nor shall Death brag thou wander'st in his shade, +When in eternal lines to time thou growest: +So long as men can breathe or eyes can see, +So long lives this and this gives life to thee. +Devouring Time, blunt thou the lion's paws, +And make the earth devour her own sweet brood; +Pluck the keen teeth from the fierce tiger's jaws, +And burn the long-lived phoenix in her blood; +Make glad and sorry seasons as thou fleets, +And do whate'er thou wilt, swift-footed Time, +To the wide world and all her fading sweets; +But I forbid thee one most heinous crime: +O, carve not with thy hours my love's fair brow, +Nor draw no lines there with thine antique pen; +Him in thy course untainted do allow +For beauty's pattern to succeeding men. +Yet, do thy worst, old Time: despite thy wrong, +My love shall in my verse ever live young. +A woman's face with Nature's own hand painted +Hast thou, the master-mistress of my passion; +A woman's gentle heart, but not acquainted +With shifting change, as is false women's fashion; +An eye more bright than theirs, less false in rolling, +Gilding the object whereupon it gazeth; +A man in hue, all 'hues' in his controlling, +Much steals men's eyes and women's souls amazeth. +And for a woman wert thou first created; +Till Nature, as she wrought thee, fell a-doting, +And by addition me of thee defeated, +By adding one thing to my purpose nothing. +But since she prick'd thee out for women's pleasure, +Mine be thy love and thy love's use their treasure. +So is it not with me as with that Muse +Stirr'd by a painted beauty to his verse, +Who heaven itself for ornament doth use +And every fair with his fair doth rehearse +Making a couplement of proud compare, +With sun and moon, with earth and sea's rich gems, +With April's first-born flowers, and all things rare +That heaven's air in this huge rondure hems. +O' let me, true in love, but truly write, +And then believe me, my love is as fair +As any mother's child, though not so bright +As those gold candles fix'd in heaven's air: +Let them say more than like of hearsay well; +I will not praise that purpose not to sell. +My glass shall not persuade me I am old, +So long as youth and thou are of one date; +But when in thee time's furrows I behold, +Then look I death my days should expiate. +For all that beauty that doth cover thee +Is but the seemly raiment of my heart, +Which in thy breast doth live, as thine in me: +How can I then be elder than thou art? +O, therefore, love, be of thyself so wary +As I, not for myself, but for thee will; +Bearing thy heart, which I will keep so chary +As tender nurse her babe from faring ill. +Presume not on thy heart when mine is slain; +Thou gavest me thine, not to give back again. +As an unperfect actor on the stage +Who with his fear is put besides his part, +Or some fierce thing replete with too much rage, +Whose strength's abundance weakens his own heart. +So I, for fear of trust, forget to say +The perfect ceremony of love's rite, +And in mine own love's strength seem to decay, +O'ercharged with burden of mine own love's might. +O, let my books be then the eloquence +And dumb presagers of my speaking breast, +Who plead for love and look for recompense +More than that tongue that more hath more express'd. +O, learn to read what silent love hath writ: +To hear with eyes belongs to love's fine wit. +Mine eye hath play'd the painter and hath stell'd +Thy beauty's form in table of my heart; +My body is the frame wherein 'tis held, +And perspective it is the painter's art. +For through the painter must you see his skill, +To find where your true image pictured lies; +Which in my bosom's shop is hanging still, +That hath his windows glazed with thine eyes. +Now see what good turns eyes for eyes have done: +Mine eyes have drawn thy shape, and thine for me +Are windows to my breast, where-through the sun +Delights to peep, to gaze therein on thee; +Yet eyes this cunning want to grace their art; +They draw but what they see, know not the heart. +Let those who are in favour with their stars +Of public honour and proud titles boast, +Whilst I, whom fortune of such triumph bars, +Unlook'd for joy in that I honour most. +Great princes' favourites their fair leaves spread +But as the marigold at the sun's eye, +And in themselves their pride lies buried, +For at a frown they in their glory die. +The painful warrior famoused for fight, +After a thousand victories once foil'd, +Is from the book of honour razed quite, +And all the rest forgot for which he toil'd: +Then happy I, that love and am beloved +Where I may not remove nor be removed. +Lord of my love, to whom in vassalage +Thy merit hath my duty strongly knit, +To thee I send this written embassage, +To witness duty, not to show my wit: +Duty so great, which wit so poor as mine +May make seem bare, in wanting words to show it, +But that I hope some good conceit of thine +In thy soul's thought, all naked, will bestow it; +Till whatsoever star that guides my moving +Points on me graciously with fair aspect +And puts apparel on my tatter'd loving, +To show me worthy of thy sweet respect: +Then may I dare to boast how I do love thee; +Till then not show my head where thou mayst prove me. +Weary with toil, I haste me to my bed, +The dear repose for limbs with travel tired; +But then begins a journey in my head, +To work my mind, when body's work's expired: +For then my thoughts, from far where I abide, +Intend a zealous pilgrimage to thee, +And keep my drooping eyelids open wide, +Looking on darkness which the blind do see +Save that my soul's imaginary sight +Presents thy shadow to my sightless view, +Which, like a jewel hung in ghastly night, +Makes black night beauteous and her old face new. +Lo! thus, by day my limbs, by night my mind, +For thee and for myself no quiet find. +How can I then return in happy plight, +That am debarr'd the benefit of rest? +When day's oppression is not eased by night, +But day by night, and night by day, oppress'd? +And each, though enemies to either's reign, +Do in consent shake hands to torture me; +The one by toil, the other to complain +How far I toil, still farther off from thee. +I tell the day, to please them thou art bright +And dost him grace when clouds do blot the heaven: +So flatter I the swart-complexion'd night, +When sparkling stars twire not thou gild'st the even. +But day doth daily draw my sorrows longer +And night doth nightly make grief's strength seem stronger. +When, in disgrace with fortune and men's eyes, +I all alone beweep my outcast state +And trouble deal heaven with my bootless cries +And look upon myself and curse my fate, +Wishing me like to one more rich in hope, +Featured like him, like him with friends possess'd, +Desiring this man's art and that man's scope, +With what I most enjoy contented least; +Yet in these thoughts myself almost despising, +Haply I think on thee, and then my state, +Like to the lark at break of day arising +From sullen earth, sings hymns at heaven's gate; +For thy sweet love remember'd such wealth brings +That then I scorn to change my state with kings. +When to the sessions of sweet silent thought +I summon up remembrance of things past, +I sigh the lack of many a thing I sought, +And with old woes new wail my dear time's waste: +Then can I drown an eye, unused to flow, +For precious friends hid in death's dateless night, +And weep afresh love's long since cancell'd woe, +And moan the expense of many a vanish'd sight: +Then can I grieve at grievances foregone, +And heavily from woe to woe tell o'er +The sad account of fore-bemoaned moan, +Which I new pay as if not paid before. +But if the while I think on thee, dear friend, +All losses are restored and sorrows end. +Thy bosom is endeared with all hearts, +Which I by lacking have supposed dead, +And there reigns love and all love's loving parts, +And all those friends which I thought buried. +How many a holy and obsequious tear +Hath dear religious love stol'n from mine eye +As interest of the dead, which now appear +But things removed that hidden in thee lie! +Thou art the grave where buried love doth live, +Hung with the trophies of my lovers gone, +Who all their parts of me to thee did give; +That due of many now is thine alone: +Their images I loved I view in thee, +And thou, all they, hast all the all of me. +If thou survive my well-contented day, +When that churl Death my bones with dust shall cover, +And shalt by fortune once more re-survey +These poor rude lines of thy deceased lover, +Compare them with the bettering of the time, +And though they be outstripp'd by every pen, +Reserve them for my love, not for their rhyme, +Exceeded by the height of happier men. +O, then vouchsafe me but this loving thought: +'Had my friend's Muse grown with this growing age, +A dearer birth than this his love had brought, +To march in ranks of better equipage: +But since he died and poets better prove, +Theirs for their style I'll read, his for his love.' +Full many a glorious morning have I seen +Flatter the mountain-tops with sovereign eye, +Kissing with golden face the meadows green, +Gilding pale streams with heavenly alchemy; +Anon permit the basest clouds to ride +With ugly rack on his celestial face, +And from the forlorn world his visage hide, +Stealing unseen to west with this disgrace: +Even so my sun one early morn did shine +With all triumphant splendor on my brow; +But out, alack! he was but one hour mine; +The region cloud hath mask'd him from me now. +Yet him for this my love no whit disdaineth; +Suns of the world may stain when heaven's sun staineth. +Why didst thou promise such a beauteous day, +And make me travel forth without my cloak, +To let base clouds o'ertake me in my way, +Hiding thy bravery in their rotten smoke? +'Tis not enough that through the cloud thou break, +To dry the rain on my storm-beaten face, +For no man well of such a salve can speak +That heals the wound and cures not the disgrace: +Nor can thy shame give physic to my grief; +Though thou repent, yet I have still the loss: +The offender's sorrow lends but weak relief +To him that bears the strong offence's cross. +Ah! but those tears are pearl which thy love sheds, +And they are rich and ransom all ill deeds. +No more be grieved at that which thou hast done: +Roses have thorns, and silver fountains mud; +Clouds and eclipses stain both moon and sun, +And loathsome canker lives in sweetest bud. +All men make faults, and even I in this, +Authorizing thy trespass with compare, +Myself corrupting, salving thy amiss, +Excusing thy sins more than thy sins are; +For to thy sensual fault I bring in sense-- +Thy adverse party is thy advocate-- +And 'gainst myself a lawful plea commence: +Such civil war is in my love and hate +That I an accessary needs must be +To that sweet thief which sourly robs from me. +Let me confess that we two must be twain, +Although our undivided loves are one: +So shall those blots that do with me remain +Without thy help by me be borne alone. +In our two loves there is but one respect, +Though in our lives a separable spite, +Which though it alter not love's sole effect, +Yet doth it steal sweet hours from love's delight. +I may not evermore acknowledge thee, +Lest my bewailed guilt should do thee shame, +Nor thou with public kindness honour me, +Unless thou take that honour from thy name: +But do not so; I love thee in such sort +As, thou being mine, mine is thy good report. +As a decrepit father takes delight +To see his active child do deeds of youth, +So I, made lame by fortune's dearest spite, +Take all my comfort of thy worth and truth. +For whether beauty, birth, or wealth, or wit, +Or any of these all, or all, or more, +Entitled in thy parts do crowned sit, +I make my love engrafted to this store: +So then I am not lame, poor, nor despised, +Whilst that this shadow doth such substance give +That I in thy abundance am sufficed +And by a part of all thy glory live. +Look, what is best, that best I wish in thee: +This wish I have; then ten times happy me! \ No newline at end of file diff --git a/cb_hammer_inprocess.csv b/cb_hammer_inprocess.csv new file mode 100644 index 00000000..cd47da77 --- /dev/null +++ b/cb_hammer_inprocess.csv @@ -0,0 +1,6697 @@ +t_seconds,latency_ms +0.000217,32.0574 +0.003667,29.0480 +0.003991,29.1319 +0.004162,29.3804 +0.004309,29.6712 +0.004454,30.0057 +0.004584,30.3773 +0.004705,30.7934 +0.004830,31.2510 +0.004962,31.7884 +0.005092,32.3341 +0.005219,32.8859 +0.005341,33.3055 +0.005480,34.1554 +0.005686,37.2489 +0.005830,37.6906 +0.005955,38.0885 +0.006094,38.4731 +0.006231,38.8433 +0.006364,39.2352 +0.006500,39.8164 +0.006637,40.3815 +0.006790,40.8686 +0.006937,41.3202 +0.007079,41.7857 +0.007267,42.2367 +0.007409,42.7433 +0.007536,43.2774 +0.007674,47.7874 +0.007822,48.4204 +0.007955,49.0641 +0.008093,49.6626 +0.008243,50.2697 +0.008571,50.7092 +0.008870,51.1886 +0.009194,51.7190 +0.009463,52.3474 +0.009626,53.0398 +0.009769,53.7357 +0.009907,54.4561 +0.010069,55.1734 +0.010216,55.9196 +0.010352,56.8899 +0.010488,57.7465 +0.010626,58.5478 +0.010763,59.4875 +0.010896,60.3946 +0.011105,61.1746 +0.032276,44.0531 +0.042935,39.4344 +0.033543,51.2656 +0.034460,55.2557 +0.043521,48.8901 +0.046317,52.9843 +0.084809,17.7384 +0.038105,70.2089 +0.035499,73.8949 +0.049504,63.6522 +0.047660,71.7367 +0.047019,73.8946 +0.050813,71.7181 +0.102548,23.6411 +0.037427,92.3637 +0.048257,82.7788 +0.045599,88.1732 +0.039635,98.3464 +0.044044,95.4626 +0.058513,82.0003 +0.119397,26.0846 +0.129791,19.5406 +0.089716,60.8218 +0.059281,92.6652 +0.126189,27.1680 +0.038647,118.1375 +0.062667,96.6942 +0.137982,23.5749 +0.076330,91.1930 +0.149332,19.1706 +0.150538,21.7860 +0.061811,120.5808 +0.066136,117.2407 +0.057756,126.5609 +0.068235,117.0223 +0.034962,151.6563 +0.063505,125.8782 +0.168503,27.4051 +0.133774,63.5153 +0.067242,133.9817 +0.120914,82.6518 +0.161558,44.0807 +0.060059,151.8199 +0.195909,21.8747 +0.036082,185.3092 +0.156785,66.5230 +0.203566,20.6968 +0.060913,164.5527 +0.153358,73.1165 +0.205639,25.1083 +0.045075,192.3225 +0.048865,189.5279 +0.217784,25.3007 +0.131037,114.9376 +0.057020,193.2949 +0.113157,141.5135 +0.122532,133.7576 +0.071291,189.3088 +0.070251,194.9398 +0.183377,83.8801 +0.099302,169.4537 +0.050153,222.2972 +0.225466,48.9764 +0.254671,26.8824 +0.230748,56.6269 +0.032716,257.9008 +0.224263,67.9085 +0.151947,142.6231 +0.167524,130.0833 +0.201225,100.6247 +0.056243,248.2845 +0.036751,269.0060 +0.055462,251.2470 +0.221392,90.5473 +0.082370,234.4699 +0.256290,64.5408 +0.182392,139.3835 +0.197289,125.4497 +0.265192,60.8933 +0.274443,55.8303 +0.238393,92.9333 +0.245975,89.1708 +0.237398,102.9907 +0.069174,273.2923 +0.065243,279.6047 +0.326085,25.3517 +0.033981,318.9381 +0.272451,85.4453 +0.268756,91.1440 +0.267258,95.3631 +0.092411,272.6930 +0.072281,294.2274 +0.340389,28.1346 +0.044567,327.5926 +0.330274,47.3933 +0.352919,30.2873 +0.344849,42.2047 +0.290617,97.3760 +0.243085,148.5381 +0.145482,247.6496 +0.301850,92.2538 +0.287375,108.8228 +0.372160,26.3853 +0.294570,112.3485 +0.226475,182.2529 +0.033124,382.7194 +0.311940,104.8508 +0.387054,32.5818 +0.172325,251.2152 +0.383207,42.1726 +0.297608,128.6794 +0.306710,124.9650 +0.189384,245.5415 +0.185258,252.3169 +0.064364,375.4890 +0.304528,138.8437 +0.415843,28.9601 +0.416791,29.9607 +0.281554,168.0639 +0.159361,294.7755 +0.365105,91.5735 +0.260600,197.3565 +0.431675,28.6318 +0.305757,161.0797 +0.321776,146.7107 +0.211879,258.0793 +0.368524,105.4629 +0.351438,128.4547 +0.357897,123.4039 +0.140514,346.7070 +0.426288,63.0380 +0.439853,50.9013 +0.396198,100.3219 +0.362621,135.9082 +0.223308,276.2249 +0.479893,23.9694 +0.408728,100.7645 +0.460307,52.1007 +0.398546,117.8391 +0.391624,133.9742 +0.292173,235.0398 +0.468488,60.5567 +0.139508,390.5032 +0.320831,213.1273 +0.469959,68.6902 +0.419636,120.4837 +0.449618,93.7497 +0.437575,110.0936 +0.331328,219.0793 +0.394105,158.7775 +0.446752,107.3270 +0.377668,180.9341 +0.108315,453.2053 +0.533959,29.5467 +0.498530,68.6866 +0.387994,186.7878 +0.425380,151.0355 +0.473988,103.4596 +0.547669,30.7851 +0.443373,136.4964 +0.487222,96.0316 +0.466837,119.7035 +0.489326,101.9754 +0.550407,50.2241 +0.503863,97.9552 +0.393132,209.6125 +0.512409,91.2616 +0.335146,272.5671 +0.574782,34.3212 +0.583254,30.4481 +0.456679,158.6202 +0.554080,62.8456 +0.577448,45.8057 +0.525598,98.9606 +0.600632,28.0777 +0.496521,133.1158 +0.563506,68.2695 +0.481301,153.3504 +0.586541,51.8432 +0.561521,77.9616 +0.552883,88.4295 +0.342467,304.4247 +0.109394,538.9011 +0.509493,142.2560 +0.530011,123.0785 +0.628710,25.3186 +0.629637,28.0978 +0.538650,121.6021 +0.616926,51.3633 +0.609104,60.1007 +0.607714,62.8686 +0.366509,307.8880 +0.631776,46.1650 +0.613702,66.8436 +0.654029,27.8845 +0.591302,93.9871 +0.406919,283.9244 +0.651750,40.0628 +0.668290,27.8573 +0.576416,121.4832 +0.490755,213.5912 +0.601818,103.8824 +0.646892,60.3512 +0.685290,27.2460 +0.527213,191.6085 +0.641313,79.3851 +0.624559,98.7768 +0.696148,28.6684 +0.516386,209.4592 +0.529045,200.6466 +0.558603,177.4904 +0.615300,122.3726 +0.457957,281.5557 +0.634652,108.3687 +0.648296,95.6720 +0.718822,28.0243 +0.250315,499.6415 +0.707244,48.6788 +0.567217,191.1307 +0.697900,64.5976 +0.639483,126.2161 +0.743021,23.6455 +0.434925,334.6719 +0.743968,26.5932 +0.543368,228.1625 +0.623254,156.4110 +0.670583,110.0562 +0.691813,90.4459 +0.657735,131.9387 +0.677942,116.7112 +0.746847,49.2330 +0.660252,137.7194 +0.720698,81.1062 +0.758348,46.6462 +0.359901,446.1289 +0.712536,94.9725 +0.724817,84.7205 +0.579870,234.9326 +0.603671,212.7484 +0.723337,96.3951 +0.794654,28.5406 +0.769598,57.5007 +0.423541,404.5622 +0.578455,254.2342 +0.669205,167.5596 +0.444804,392.9420 +0.780640,58.9905 +0.653091,188.2911 +0.755923,90.2135 +0.797972,50.9676 +0.827099,22.8826 +0.540120,316.9274 +0.836765,23.5550 +0.739514,122.4345 +0.771531,91.3663 +0.841382,24.3438 +0.762498,105.1651 +0.823195,52.9217 +0.796080,81.0240 +0.681914,202.5088 +0.801805,83.5799 +0.704347,183.2180 +0.828103,61.7309 +0.782259,111.2937 +0.705701,188.8162 +0.770562,126.0729 +0.765700,134.6509 +0.184318,721.6045 +0.884424,22.3915 +0.849982,60.2589 +0.725845,188.6668 +0.766667,148.8764 +0.186618,733.2111 +0.779665,141.0950 +0.454137,467.5626 +0.680546,243.4265 +0.876117,50.2760 +0.905923,25.3835 +0.906816,27.7460 +0.914513,24.1834 +0.832689,110.1136 +0.814803,128.9272 +0.887565,57.3279 +0.638385,307.9210 +0.896635,55.8703 +0.690844,263.1212 +0.839631,115.7518 +0.877105,82.7525 +0.848940,113.6056 +0.938696,28.4968 +0.816420,152.2172 +0.942803,29.0834 +0.862898,113.8590 +0.861949,115.9536 +0.867664,114.4999 +0.499533,486.6048 +0.804995,182.9750 +0.900352,88.5460 +0.865727,124.8777 +0.737673,254.9495 +0.322739,671.3677 +0.968637,28.4539 +0.976757,24.7476 +0.934562,74.6990 +0.959858,50.7800 +0.910242,101.7374 +0.921700,91.7541 +0.988898,25.4971 +0.982164,39.9599 +0.674397,349.0933 +0.955383,69.7706 +0.809538,219.6199 +0.806030,224.5959 +0.885386,152.6139 +0.953966,85.3973 +0.943730,98.4876 +0.919830,125.9180 +0.846137,205.3750 +0.602745,449.6936 +0.819732,234.0624 +0.915544,139.6993 +1.030627,26.8719 +0.944894,120.5048 +1.001506,66.6032 +1.011979,58.5760 +0.789675,284.2459 +1.055244,23.2207 +0.931307,149.8928 +0.736094,348.5126 +0.920761,167.0845 +0.992623,96.1815 +1.045748,48.3814 +1.038000,62.8501 +0.986139,117.1038 +0.987971,116.6142 +0.889835,215.7432 +1.039364,68.5286 +0.971887,137.0349 +1.084607,30.5556 +0.857048,261.5064 +0.926394,198.1940 +1.065399,61.0979 +1.023491,104.6314 +0.860320,268.7540 +1.103243,28.3128 +1.022125,113.4673 +0.749957,386.7662 +0.729692,409.3493 +1.088805,52.5771 +1.118555,26.5025 +1.128123,24.5786 +0.807509,349.4693 +0.962547,195.3954 +1.025154,138.7158 +0.946307,220.7768 +1.115163,54.1154 +1.094130,76.9670 +0.994108,180.1292 +1.131556,47.5713 +1.156979,27.2938 +1.053795,132.0587 +1.029158,159.3487 +0.952506,238.1263 +1.104585,91.7845 +1.073921,125.8643 +1.068109,134.0083 +1.010639,196.1860 +1.152702,55.7044 +1.184273,26.5000 +0.923973,289.1756 +1.052439,166.3397 +1.014396,205.8059 +1.081200,143.8109 +1.129075,99.3357 +0.837746,391.7022 +1.171098,63.7487 +1.213149,25.0502 +1.179128,61.4279 +1.218779,24.9824 +1.163870,81.3626 +1.100851,149.1240 +1.228411,25.1327 +0.316841,942.8635 +1.145058,118.3045 +1.185854,80.6474 +1.206825,62.5759 +1.042218,230.4445 +1.249975,26.0519 +0.977903,300.3240 +1.174237,105.5162 +1.051512,232.5454 +0.893553,392.4719 +1.220202,69.8565 +1.208407,89.4902 +1.225011,73.9479 +1.108923,191.0706 +1.078465,225.1986 +1.253544,55.3957 +1.240556,73.1007 +1.169279,146.9608 +1.238200,79.3511 +1.245233,75.8207 +1.276028,46.0149 +1.297897,27.8724 +1.190633,139.7168 +1.009261,324.3668 +1.269402,65.5948 +1.308941,27.6429 +1.188507,149.4973 +1.229449,111.2794 +1.321055,23.4345 +1.157943,188.4676 +1.322043,25.7367 +1.298960,55.3166 +1.135593,222.9561 +1.202118,158.2432 +0.997092,366.1058 +1.286026,81.0280 +1.299994,69.4723 +1.136724,235.1754 +1.199786,177.3599 +1.259705,120.6404 +1.354277,29.4649 +1.013455,376.3758 +1.234847,158.5635 +1.330350,64.0949 +1.141382,255.5194 +1.167084,231.8097 +1.266502,133.8009 +1.325770,76.3491 +1.272663,131.8933 +1.380346,29.8985 +1.057499,355.9498 +1.263363,153.6647 +1.243762,176.2776 +1.126497,294.9584 +1.371900,50.7413 +1.290059,134.4298 +1.358549,67.7936 +1.279754,153.9831 +1.383742,51.3662 +0.967194,472.2616 +1.417028,26.3684 +1.344490,102.9308 +1.404557,46.4746 +1.426344,25.6497 +1.284058,168.8724 +1.317552,137.8298 +1.313658,149.7426 +1.070556,394.2552 +1.443397,24.2673 +1.347780,121.4466 +1.396902,75.2495 +1.420040,53.1114 +1.398894,78.6128 +1.394446,87.1550 +1.433738,48.8074 +1.105578,380.1899 +1.367054,125.3223 +1.435109,59.1093 +1.139042,357.7354 +1.196370,306.7422 +1.413449,91.6230 +1.400303,108.3293 +1.377146,135.7308 +1.464811,49.0092 +1.439456,79.4309 +1.369467,152.7298 +1.210774,316.2987 +1.303664,227.2591 +1.421456,110.4399 +1.481601,51.6844 +1.124588,412.8177 +1.513821,27.1291 +1.472152,73.7796 +1.482546,66.8157 +1.451032,101.0440 +0.894518,658.4931 +1.527073,28.0286 +1.087846,479.6109 +1.463401,106.8332 +1.485769,88.1123 +1.336584,240.0806 +1.340729,238.1272 +1.467665,115.0662 +1.469227,115.1194 +1.452931,135.0228 +1.346411,242.5863 +1.567457,27.1027 +1.360362,240.8885 +1.522197,80.1196 +1.402120,201.1735 +1.451994,155.3313 +1.582732,25.5913 +1.512877,105.2433 +1.338006,282.4466 +1.494219,127.5715 +1.594560,29.1140 +1.545932,79.1154 +1.424489,204.8542 +1.389831,240.9273 +1.531896,102.6615 +1.393411,247.3909 +1.455382,187.7448 +1.496778,150.5793 +1.578857,71.2467 +1.587954,63.5498 +1.576665,76.9580 +1.363198,296.4202 +1.570234,90.4414 +1.533286,129.2826 +1.620453,44.1496 +1.503113,164.8233 +1.505073,166.5203 +1.584347,88.2295 +1.608323,65.4508 +1.530924,146.5332 +1.540951,142.9976 +1.643127,44.3375 +1.473152,215.2329 +1.333629,356.0927 +1.667937,25.0437 +1.671594,26.0254 +1.672577,26.0303 +1.640803,61.8847 +1.625048,78.6167 +1.662569,44.7379 +1.621791,88.2266 +1.602317,109.8901 +1.316240,400.0020 +1.697620,23.9779 +1.477507,247.0460 +1.698608,27.4657 +1.603294,127.1494 +1.629344,102.5364 +1.647357,90.0974 +1.660676,78.1313 +1.710018,30.9521 +1.651505,91.4550 +0.990605,757.1129 +1.447421,302.1270 +1.721598,31.1272 +1.618121,138.5432 +1.730444,27.2544 +1.653623,108.6235 +1.607325,156.1074 +1.650104,114.2922 +1.623675,142.1090 +1.702688,68.9315 +1.630759,143.6462 +1.707307,69.7242 +1.664603,113.8454 +1.549362,236.2483 +1.762248,24.3408 +1.334997,453.0181 +1.555102,235.1662 +1.689722,105.2369 +1.659619,137.4327 +1.712208,91.9060 +1.518887,286.2622 +1.724554,81.5459 +1.553012,256.2576 +1.716243,94.7740 +1.786590,27.8749 +1.788016,29.7063 +1.726074,94.5442 +1.422642,403.6544 +1.757699,71.8142 +1.764397,67.9687 +1.673775,162.5096 +1.809270,29.9104 +1.742960,98.4734 +1.778449,66.0280 +1.740970,107.5566 +1.738808,111.7113 +1.829514,27.8160 +1.774405,90.6854 +1.756665,112.8975 +1.278227,592.8068 +1.817722,56.4178 +1.763433,111.9426 +1.737455,139.3985 +1.804114,76.4416 +1.857330,26.2542 +1.814465,73.5434 +1.844477,47.9273 +1.841434,55.4766 +1.839181,60.5267 +1.410245,492.0752 +1.865092,41.0611 +1.601251,306.0139 +1.749548,158.7322 +1.880557,29.7672 +1.573882,339.3222 +1.888009,30.0938 +1.892405,29.3936 +1.107893,814.8451 +1.692981,235.9233 +1.794959,134.9311 +1.790269,141.3247 +1.832366,101.8025 +1.777032,160.1084 +1.811017,131.7433 +1.820619,123.2009 +1.826297,120.7569 +1.588998,362.7976 +1.910324,45.6596 +1.634558,327.5603 +1.883585,81.5514 +1.805150,161.2730 +1.508633,459.8289 +1.934169,42.0447 +1.928905,48.8450 +1.703665,276.5903 +1.752726,230.6017 +1.677458,306.9836 +1.937141,51.1981 +1.875377,114.9479 +1.913204,82.9724 +1.797052,209.7554 +1.929891,78.8331 +1.836285,173.9248 +1.922738,88.5371 +1.806100,211.2289 +1.871034,150.0832 +1.988340,34.7129 +1.966424,58.5072 +1.850520,179.5279 +1.688386,343.9344 +2.006808,28.5306 +1.876854,162.5932 +1.687465,355.7869 +1.765784,281.0534 +1.965137,83.6798 +1.955984,96.1515 +1.931594,121.8855 +1.977751,76.6484 +1.976214,80.4017 +2.030048,28.2941 +1.980256,81.4181 +1.907265,159.4433 +1.942761,125.5159 +1.902320,178.9346 +1.951796,130.8333 +1.943820,140.5786 +1.908281,178.0938 +1.785611,302.2394 +2.066709,24.1302 +2.046838,45.9900 +2.043253,55.6762 +2.048817,55.8158 +2.081256,24.2811 +1.968463,139.4415 +2.011276,100.9444 +2.017330,96.4289 +2.010210,104.5942 +2.090840,26.8202 +1.990325,134.6039 +2.008724,119.3099 +2.084399,44.7589 +2.104633,25.9645 +2.105537,26.0330 +2.082630,52.5760 +2.107905,30.6862 +1.731881,411.1481 +1.537407,610.4423 +2.129159,24.4226 +2.131571,26.0200 +2.054399,105.0230 +1.983328,177.5839 +2.135206,27.6775 +2.035339,130.1916 +2.117661,53.8125 +1.947054,229.1690 +2.098929,78.6774 +1.896912,287.2729 +2.157591,29.4826 +1.747718,440.7040 +2.153582,35.7715 +2.024931,168.5349 +2.056617,139.7752 +2.032321,166.6446 +2.130598,73.4723 +1.918104,289.9952 +2.160912,48.2074 +2.184185,26.7724 +2.187074,25.3099 +2.188423,26.0485 +2.092829,127.7367 +2.113759,113.5341 +1.492377,736.9146 +2.114805,121.0442 +2.165531,72.5191 +2.052136,187.8946 +1.771620,470.1481 +1.874141,372.2195 +2.171474,76.8013 +2.124929,129.5002 +2.198966,60.3933 +1.996177,268.7235 +2.193467,74.6201 +2.214472,56.0339 +2.068277,203.1515 +2.162884,112.0364 +2.023053,254.1266 +2.159423,121.0833 +2.138592,143.1453 +2.143030,141.1466 +2.259360,28.3515 +1.683949,606.8780 +2.058343,236.8100 +2.039448,256.6726 +1.552077,746.1557 +2.270506,28.8214 +2.176224,126.8453 +2.281737,25.9381 +1.906153,404.5378 +2.241768,70.7894 +2.290827,26.0291 +2.189354,129.9433 +2.053480,272.7234 +2.248275,81.3395 +2.235851,95.8642 +2.208099,125.1249 +1.984442,354.6548 +2.220566,119.8626 +2.319297,25.7096 +2.204071,142.4229 +2.254430,98.9151 +2.021118,335.0510 +2.229292,131.7768 +2.240031,123.3489 +2.339097,26.7002 +1.962119,404.8692 +2.147849,222.0259 +2.299328,73.1197 +2.340429,38.3954 +2.295153,89.2837 +2.310691,74.7364 +2.361070,25.3459 +2.212385,176.6585 +2.264901,128.8788 +2.177607,217.6180 +2.331715,66.6751 +2.284177,117.1495 +1.921799,482.4334 +2.363381,43.9595 +2.246361,164.7806 +2.329615,84.8712 +2.365798,50.2460 +2.238051,178.9400 +1.848528,572.1515 +2.128035,296.8451 +2.268087,159.5015 +2.277180,155.6985 +2.326204,108.9622 +2.280507,157.0420 +2.356170,82.3338 +2.287712,154.1042 +2.353346,89.5608 +2.209120,240.4474 +2.296121,156.6631 +2.378825,74.9677 +2.086375,368.3351 +2.346495,113.3872 +2.416991,43.8184 +2.345008,124.4872 +2.404233,67.2236 +2.435167,40.5424 +2.384438,92.2134 +2.271429,207.5848 +2.372448,108.8367 +2.442907,41.7044 +2.459882,27.9076 +2.316857,173.3177 +2.307676,184.7842 +2.414487,81.5065 +2.416044,82.9575 +2.475710,28.0498 +2.298238,210.2918 +2.389044,122.2553 +2.411142,101.7735 +2.385428,130.2623 +2.393781,126.8111 +2.471457,50.4863 +2.061674,464.9468 +2.460810,68.3749 +2.503760,27.4417 +2.303069,236.3150 +2.512916,27.5058 +2.274921,268.7857 +2.401327,144.6338 +2.492460,57.5323 +2.227294,326.8614 +2.112221,442.8912 +2.454711,107.0136 +2.452785,110.5311 +2.515691,51.3116 +2.210958,358.9026 +2.424881,146.9689 +2.481285,95.8902 +2.490175,89.1969 +1.899708,681.5929 +2.476651,107.7544 +2.554156,35.1204 +2.437549,154.7694 +2.369876,225.2497 +2.511299,88.4330 +2.561725,40.7414 +2.577176,26.2189 +2.386416,221.3523 +2.398391,211.3988 +2.427589,184.8091 +2.584406,30.6172 +2.589277,29.6031 +2.555113,64.7235 +2.549993,72.2181 +2.312558,314.6655 +2.599733,29.5814 +2.479015,155.8029 +2.495994,140.3583 +2.520592,116.7759 +2.449568,191.8015 +2.540422,103.6364 +2.618880,26.0974 +2.619837,28.0589 +2.333225,320.5502 +2.627224,28.0640 +2.602467,55.2103 +2.634818,24.9588 +2.543707,122.9114 +2.508530,160.8708 +2.615024,55.6139 +2.521944,150.0907 +2.581301,101.3113 +2.531202,153.8341 +2.441816,244.1649 +2.539385,151.6501 +2.087850,604.2481 +2.438504,254.6192 +2.592319,106.5853 +2.420680,281.0309 +2.407341,299.5692 +2.641370,71.6889 +2.366989,347.5327 +2.691036,24.4734 +2.653775,66.6734 +2.526622,194.7773 +2.647896,76.3512 +2.609790,116.0352 +2.595126,134.5065 +2.672035,60.4389 +2.706911,28.6488 +2.629315,113.5391 +2.484612,259.1783 +2.685037,60.7998 +2.432879,315.3994 +2.701711,49.2148 +2.666619,86.0484 +2.644978,115.3881 +2.529186,232.6046 +2.395226,368.2841 +2.469495,297.6153 +2.742854,25.2175 +2.545961,229.5511 +2.750926,31.0753 +2.579372,206.8730 +2.715510,73.0232 +2.693124,96.8228 +2.637369,153.6358 +2.698905,94.8378 +2.767111,30.1676 +2.735560,64.1326 +2.768072,32.5927 +2.775514,28.8049 +2.782002,28.1284 +2.499002,318.5469 +2.607769,212.6806 +2.622212,199.7381 +2.636353,187.3682 +2.669401,155.3055 +2.487790,339.4869 +2.196392,636.0728 +2.804319,30.5410 +2.713060,127.1964 +2.745837,95.3780 +2.788533,62.5834 +2.724248,129.4269 +2.682613,172.0731 +2.692099,170.0134 +2.748279,117.0451 +2.569861,296.8975 +1.869563,998.1421 +2.763510,107.3355 +2.824707,48.1443 +2.567003,314.3651 +2.571850,313.4393 +2.827278,60.6405 +2.800666,90.0538 +2.612404,279.2440 +2.789947,105.8000 +2.720449,178.4382 +2.603395,296.4515 +2.854687,46.7967 +2.563316,340.1092 +2.817550,91.3813 +2.786246,126.0236 +2.862113,52.4768 +2.810131,108.7923 +2.752668,173.1442 +2.903426,24.8350 +2.721400,207.8434 +2.867706,63.9671 +2.793743,142.8397 +2.912270,27.2981 +2.823722,121.0874 +2.832466,113.6658 +2.872852,77.3212 +2.791005,164.1606 +2.870846,86.7754 +2.657678,303.3429 +2.655289,307.9570 +2.901484,62.7917 +2.936583,29.2125 +2.840256,133.5422 +2.898888,75.9474 +2.725826,250.0508 +2.714522,265.8924 +2.851117,134.0064 +2.865325,120.8418 +2.760366,228.7251 +2.899847,90.2699 +2.925813,66.7807 +2.743791,253.7667 +2.891649,107.4037 +2.939569,65.6770 +2.963246,44.0442 +2.929243,80.8592 +2.985124,28.2328 +2.881369,138.3398 +2.914590,106.6586 +2.965796,56.9561 +2.841216,183.0378 +2.890720,138.2105 +2.670638,364.1615 +2.986167,53.0516 +2.928262,112.4028 +2.761791,281.0694 +2.918924,127.6198 +3.019709,29.3185 +2.999053,53.3295 +2.866759,188.0566 +3.028931,29.1789 +2.992594,67.8109 +2.974836,87.9738 +2.957622,109.2207 +2.685982,386.7671 +3.013358,60.8468 +2.990118,86.2800 +2.944810,135.0228 +2.453793,627.9309 +2.659777,423.8532 +2.973801,113.4789 +2.821950,267.5110 +3.052383,40.7030 +3.040665,57.1266 +3.072749,26.5699 +3.005246,100.0071 +2.820450,286.6969 +3.049028,59.1185 +3.010103,100.6601 +3.074205,37.5269 +2.997558,120.4015 +2.732474,386.9067 +2.931673,189.0860 +3.097792,25.2502 +2.989092,134.8765 +2.887919,240.1263 +2.961021,169.2904 +2.853675,281.5307 +3.058110,80.6207 +2.729633,415.0578 +2.885290,260.3781 +3.042861,105.9392 +3.128046,24.3379 +3.083631,72.6690 +3.087280,73.3724 +3.138732,22.9668 +3.046544,118.7293 +3.120760,48.0910 +3.007291,168.2812 +2.975877,200.7375 +3.156301,27.6659 +3.022753,162.6986 +3.110764,75.6514 +3.130312,59.2756 +3.165274,25.7561 +3.135206,60.1705 +3.079833,119.5530 +2.895748,308.4939 +3.152384,55.3205 +3.123043,85.6436 +3.099320,111.8239 +3.060405,152.3474 +3.123969,90.1091 +3.021249,197.5423 +3.119381,102.4853 +3.160653,63.0065 +2.799693,428.1258 +3.034800,194.7821 +3.204242,28.4164 +3.175573,58.0418 +3.062810,180.0830 +3.076398,167.9537 +3.148801,96.7381 +3.183967,63.0195 +3.111732,137.6278 +2.946132,305.5633 +3.108147,144.4973 +2.908931,346.6473 +3.233615,26.3254 +3.144691,122.8261 +3.066844,202.7131 +3.081724,191.2311 +2.834861,439.9624 +3.105254,173.7931 +3.195377,86.2379 +3.117960,164.6121 +3.208687,77.3092 +3.245539,45.2974 +3.269557,25.7082 +3.251696,47.7026 +3.274823,26.2950 +3.223660,79.0910 +2.950173,357.2133 +2.955166,354.1544 +3.207705,107.9394 +3.214079,103.5002 +3.246987,72.0829 +3.185452,135.0955 +3.191031,130.4527 +2.644059,678.3607 +3.281616,47.7339 +3.189588,141.5393 +3.039219,294.8078 +3.301119,38.0428 +3.211144,129.8432 +3.320548,24.1320 +3.272956,73.1514 +3.322420,26.5947 +2.964276,387.9738 +3.282572,71.9218 +2.980415,378.0483 +3.307387,55.0992 +3.259941,103.5732 +3.340988,30.8783 +3.242894,131.4779 +3.344680,32.1486 +3.295266,86.4978 +3.218792,165.0174 +3.290837,96.8247 +3.093086,295.5879 +3.244352,147.0745 +3.371866,22.6109 +3.249361,146.0820 +3.285996,117.5842 +3.358469,48.4266 +3.302751,105.1710 +3.354495,55.1954 +3.252645,162.3268 +3.394478,21.9372 +3.395443,23.6052 +3.232659,188.0945 +3.255579,171.2888 +3.309321,118.5276 +3.227819,205.0220 +3.409691,24.5143 +3.212753,222.9585 +3.374372,63.1278 +3.416416,26.4803 +3.229583,216.5604 +3.426869,24.1759 +3.107147,345.8703 +3.427849,28.1693 +3.145668,311.7479 +3.432842,27.3548 +3.388675,73.5499 +3.352251,115.3928 +3.442896,27.5094 +3.321484,151.7954 +3.161699,314.8672 +3.186416,291.1113 +3.317579,162.1382 +3.168851,312.7889 +3.451045,31.5597 +3.362487,121.3282 +3.299399,192.4444 +3.434205,62.1790 +3.054816,442.9956 +3.363514,138.0493 +3.267518,235.0003 +3.279047,225.0418 +3.334028,175.7538 +3.473280,40.6964 +3.407923,107.4819 +3.467644,51.3132 +3.381764,139.1566 +3.501564,30.5856 +3.456019,77.8391 +3.339162,197.1595 +3.383810,153.6310 +3.462225,76.6152 +3.482605,57.7682 +3.476567,65.8985 +3.453018,97.0954 +3.515405,36.1029 +3.176616,375.9996 +3.406896,149.4207 +3.435712,121.5579 +3.477527,83.5128 +3.481640,86.7431 +2.797279,772.0678 +3.024254,546.9157 +3.509782,67.1906 +3.513977,64.0151 +3.552616,26.9610 +3.556317,26.1637 +3.536322,54.0800 +3.491844,99.9959 +3.532150,63.8016 +3.520921,76.6330 +3.437500,165.0530 +3.576973,27.3947 +3.315645,290.6465 +3.579577,28.2170 +3.460197,151.0045 +3.533858,82.3043 +3.391428,226.5743 +3.590403,30.4190 +3.551509,71.2315 +3.504090,125.1120 +3.602554,27.5601 +3.571170,60.2013 +3.604368,29.6175 +3.607795,27.8484 +3.199386,441.6195 +3.387662,254.2762 +3.403581,240.7119 +3.616163,29.5566 +3.376829,271.3541 +3.550114,102.9854 +3.537441,119.0777 +3.457417,200.2201 +3.420754,242.3024 +3.346108,320.0502 +3.446144,227.2185 +3.479718,196.2405 +3.597555,80.2944 +3.540374,138.8846 +3.221867,458.9095 +3.595953,90.2630 +3.631372,55.7790 +3.497812,190.3061 +3.663057,27.8632 +3.673363,25.3933 +3.656520,43.9702 +3.319070,385.2573 +3.561041,148.3601 +3.542466,168.3479 +3.591840,120.3866 +3.644294,71.3574 +3.666159,51.0498 +3.641006,80.2794 +3.568384,153.9035 +3.611202,118.0129 +3.502519,227.6523 +3.704328,27.4503 +3.680777,54.9172 +3.620822,117.3947 +3.329350,411.5852 +3.675959,67.0427 +3.715652,29.3186 +3.483816,265.0957 +3.688119,65.3901 +3.729216,25.2752 +3.712227,43.8125 +3.730171,28.4419 +3.622741,139.9048 +3.735695,28.5692 +3.690921,78.7013 +3.677850,95.2937 +3.648184,126.8621 +3.606292,171.8059 +3.496385,283.0979 +3.744971,38.2068 +3.089462,697.0294 +3.740936,46.9207 +3.349015,442.9722 +3.653100,145.1654 +3.518958,280.3065 +3.687151,113.1016 +3.577992,223.5950 +3.633986,171.3721 +3.686216,120.0909 +3.783178,26.8932 +3.710814,106.0610 +3.764265,54.2058 +3.791988,28.3242 +3.700490,121.6010 +3.470406,358.1783 +3.756040,74.8159 +3.805359,27.3085 +3.769622,64.9030 +3.778098,60.3878 +3.753509,90.0191 +3.722288,124.7537 +3.538841,310.5108 +3.798266,53.7386 +3.748912,110.1600 +3.419049,452.7069 +3.743002,130.3095 +3.698757,177.0009 +3.721286,158.8422 +3.786492,96.0053 +3.806307,82.1056 +3.810072,79.3919 +3.657638,233.8988 +3.635644,260.7646 +3.859074,41.6961 +3.871756,31.2767 +3.731779,173.1999 +3.754491,152.6179 +3.775047,139.2075 +3.888414,26.8882 +3.849352,70.4558 +3.738217,185.0305 +3.828585,96.6572 +3.896409,30.9008 +3.630114,301.5763 +3.779483,153.8776 +3.832668,104.4225 +3.834526,110.0859 +3.822092,127.3832 +3.903034,50.1539 +3.820313,133.8176 +3.773144,183.8658 +3.818471,141.2287 +3.907110,57.2654 +3.852005,113.3351 +3.889464,78.4007 +3.944612,25.8529 +3.880129,98.8225 +3.847042,132.9300 +3.953188,28.2807 +3.957010,26.7173 +3.949476,42.0150 +3.925243,67.1920 +3.891537,104.8899 +3.800253,197.1246 +3.914255,87.8178 +3.904979,97.9837 +3.978952,27.5897 +3.801588,205.9500 +3.787865,222.0083 +3.629202,385.1696 +3.927310,88.9758 +3.875759,143.8112 +3.762646,260.5842 +3.709401,316.0590 +3.838487,190.0769 +4.002963,28.8012 +4.006542,26.6715 +3.931691,103.4532 +3.618002,420.9570 +3.923248,118.4791 +3.717209,325.5663 +4.014372,30.7447 +4.023231,28.6431 +3.970466,82.8845 +3.981469,75.5586 +4.033215,27.3112 +3.645720,416.7914 +4.038960,27.5293 +4.009873,59.6331 +3.937091,134.0162 +3.992435,82.2788 +4.051874,24.7704 +4.053351,30.4648 +3.641939,445.2687 +4.025461,66.9473 +4.031765,63.1006 +3.997378,99.7005 +4.045118,54.6043 +3.582481,518.2097 +4.074715,27.5356 +3.882498,223.3181 +4.057028,53.0161 +4.087208,26.2042 +3.816876,298.2166 +3.331128,791.2410 +4.097079,27.2597 +3.758614,369.0809 +3.900771,228.4692 +4.007538,124.0272 +4.105816,28.8898 +3.557271,584.3236 +4.083816,58.7242 +4.094866,50.4746 +3.991491,157.9881 +4.122370,28.6696 +3.979973,171.9969 +4.066490,89.6432 +4.041728,115.6131 +4.115093,46.1942 +4.099722,65.7970 +4.062512,104.4100 +4.141595,28.0559 +4.016286,157.0489 +3.799265,375.8361 +4.156133,22.0358 +4.071107,110.0669 +3.919808,266.2472 +4.102251,85.1670 +4.035145,155.2596 +4.165520,27.4545 +4.113413,83.4449 +3.983728,214.6398 +3.569347,636.2782 +4.002073,205.3160 +3.933361,279.2324 +3.830857,383.1277 +4.169651,48.3206 +4.110045,109.4087 +3.954131,266.2791 +4.092409,128.9489 +4.019570,209.6568 +4.205626,27.8839 +4.100692,133.7543 +4.069507,169.9451 +3.967865,275.4019 +4.076645,168.2440 +3.679259,569.1312 +4.149480,100.8505 +4.134706,117.0010 +3.964375,290.5657 +4.181175,74.7818 +4.042776,216.5134 +4.234446,28.5171 +3.414972,848.9341 +4.161287,109.3697 +4.244890,27.2230 +4.151970,121.0885 +3.915302,363.6226 +4.212594,67.3490 +4.186056,95.3212 +4.196858,88.1322 +4.213985,74.2856 +4.217972,71.7713 +4.173336,123.2785 +3.843529,456.5698 +3.965340,339.0772 +4.250331,55.3630 +4.221358,89.7988 +4.288271,23.9060 +4.131566,181.9249 +4.281378,36.9756 +4.278925,41.3400 +4.151040,172.3886 +4.263907,60.9062 +4.304418,21.3046 +4.198368,131.9197 +4.305694,25.7522 +4.233511,106.8152 +4.318354,22.8928 +4.255957,86.8770 +4.028564,316.6817 +4.251708,98.8376 +4.272113,79.3507 +4.284991,68.4252 +4.330288,25.3947 +4.187418,169.8519 +4.341247,23.2146 +4.220410,146.0102 +3.959700,411.8479 +4.142541,231.7395 +4.157342,217.9206 +4.296615,80.0362 +4.254942,122.6840 +4.124340,255.5617 +4.273059,114.2086 +4.311157,77.1475 +4.192975,196.3708 +4.324813,69.4892 +4.353416,45.0471 +4.371549,27.8859 +4.374281,27.0629 +4.325723,76.6872 +4.060526,349.1233 +4.345246,70.2909 +4.376652,41.6234 +4.394303,27.1507 +4.248391,174.4088 +4.229228,194.7347 +4.300099,125.8269 +4.398464,31.7252 +4.342835,92.1196 +4.127695,309.0437 +4.243268,196.8636 +4.355684,88.8050 +4.312177,133.2580 +4.190405,257.2314 +4.422800,26.2184 +4.377626,77.7173 +4.389346,67.4833 +4.388305,71.5557 +4.421454,41.0919 +4.399435,65.9206 +4.440132,26.1996 +4.444489,25.2266 +4.175101,300.6663 +4.259290,219.1414 +4.320266,162.1060 +4.350546,133.6579 +4.323429,163.9350 +4.129241,359.5012 +4.425927,63.9772 +4.447637,51.0680 +4.459861,39.7972 +4.475768,24.8506 +4.445436,59.4563 +4.409650,98.8992 +4.466332,44.1562 +4.379902,133.1011 +4.145341,369.4274 +4.331447,187.0137 +4.469716,56.3667 +4.219454,307.5742 +4.357271,174.2854 +4.415538,120.4900 +4.513003,24.0347 +4.366421,172.1925 +4.207390,335.2934 +4.436739,110.3407 +4.434955,119.1561 +4.498705,58.9085 +4.270658,290.0678 +4.401344,160.9843 +4.402411,161.2164 +3.873313,691.6694 +4.387268,180.7430 +4.462547,106.7678 +4.536028,40.5302 +4.554111,31.0544 +4.489904,96.4226 +4.562329,26.1999 +4.375263,218.4360 +4.508550,86.1221 +4.527029,69.6081 +4.289744,308.0119 +4.510488,89.2619 +4.542683,64.9084 +4.585166,23.8635 +4.484204,126.6457 +4.465356,148.2636 +4.423963,193.1240 +4.456830,164.2981 +4.594672,28.4370 +3.996427,631.0518 +4.239453,392.7448 +4.531557,101.5695 +4.609030,25.0248 +4.478431,158.9080 +4.610851,27.5724 +4.449019,196.7938 +4.568012,78.7396 +4.538614,109.0655 +4.482372,169.9145 +4.560726,95.6873 +4.607592,49.8226 +4.564983,94.9041 +4.599751,63.9302 +4.638424,26.2222 +4.504893,162.9234 +4.262964,405.8187 +4.563628,112.2902 +4.313491,365.2583 +4.634055,49.9851 +4.364462,323.0593 +4.430190,259.5989 +4.166923,524.3208 +4.667817,24.5034 +4.557614,144.0708 +4.593699,109.4152 +4.632198,77.9661 +4.499659,212.0185 +4.684041,30.3932 +4.569315,146.5601 +4.537039,181.1201 +4.455344,263.8724 +4.351465,371.8872 +4.633127,94.9046 +4.668783,60.6514 +4.657415,73.4718 +4.487364,249.2132 +4.646752,91.1436 +4.678750,61.1313 +4.689789,52.5111 +4.627480,118.0143 +4.621128,126.5203 +4.576559,175.2390 +4.728032,25.1526 +4.656414,100.3805 +4.652287,106.3944 +4.719217,43.7438 +4.663681,101.5893 +4.617087,151.9140 +4.723352,50.9155 +4.710165,66.7904 +4.623110,161.2543 +4.178170,607.7936 +4.762961,23.9749 +4.730888,57.7344 +4.737896,56.8456 +4.675918,120.9589 +4.747649,51.5291 +4.774268,27.7124 +4.514769,290.3614 +4.645813,164.7669 +4.586327,231.5147 +4.701686,117.7548 +4.647680,172.7017 +4.526083,295.7025 +4.714435,111.1500 +4.739882,86.7835 +4.742301,88.0784 +4.596637,234.7044 +4.637340,197.0003 +4.659888,179.4833 +4.817843,24.5668 +4.664646,179.2159 +4.826666,23.4341 +4.692320,158.7315 +4.687522,167.9030 +4.279944,579.8449 +4.418275,442.4390 +4.500619,364.4804 +4.758682,107.7003 +4.745494,123.3013 +4.613620,257.0325 +4.810581,62.2969 +4.851052,25.9977 +4.718159,159.9934 +4.488742,393.9418 +4.715876,170.2845 +4.753185,135.1544 +4.865100,24.2037 +4.801981,89.0319 +4.825585,67.2558 +4.751798,144.9331 +4.872878,25.8203 +4.842410,59.2568 +4.866383,39.5815 +4.756795,155.9010 +4.891014,22.6613 +4.834342,83.6981 +4.868796,56.2848 +4.850101,77.1923 +4.799179,130.2405 +4.794742,135.6760 +4.831342,100.9808 +4.830380,105.1686 +4.796878,141.0069 +4.918041,23.1700 +4.788623,156.8478 +4.896732,51.9890 +4.888339,67.4420 +4.729435,227.9164 +4.769002,189.3238 +4.691244,270.8263 +4.878153,86.4379 +4.821786,144.4430 +4.927293,42.2646 +4.892841,81.5477 +4.889304,87.8309 +4.805131,178.9672 +4.962071,22.9296 +4.929420,58.3598 +4.703115,286.6773 +4.877051,114.1569 +4.786937,208.5122 +4.925081,74.0963 +4.843863,156.4981 +4.859789,141.5695 +4.930419,74.4223 +4.711678,296.3487 +4.597757,411.8498 +4.785964,227.1565 +4.547081,473.2836 +4.999178,24.9870 +4.958326,75.8261 +4.901667,133.5354 +4.855425,182.0046 +4.995449,45.1727 +4.987780,53.1206 +5.024166,17.7373 +4.945471,97.3661 +4.839372,204.4957 +4.913675,131.4902 +4.985001,61.8338 +4.886161,161.6060 +4.882685,165.3990 +5.020365,29.3631 +4.776956,273.7002 +5.043868,3715.2789 +4.820382,4021.5137 +4.898699,3944.5629 +4.964592,3879.3321 +5.008027,3836.5275 +5.034153,3811.6868 +5.041904,3804.2462 +5.000361,3846.0945 +4.991208,3855.5693 +8.759148,219.3370 +8.841897,137.7235 +8.843263,136.6613 +4.870653,4110.9504 +4.977136,4004.7799 +5.035203,3948.1842 +5.001359,3982.3107 +5.004842,3979.5772 +5.049728,3935.8139 +4.941212,4044.7696 +4.518461,4468.9468 +4.935549,4052.3688 +4.819441,4170.4819 +4.736578,4253.6844 +5.013121,3977.4690 +4.957352,4033.5751 +4.588529,4404.1433 +4.955782,4037.8625 +4.969558,4025.0715 +4.966230,4029.3300 +4.765271,4231.3525 +4.912696,4088.1815 +5.050656,3951.5154 +5.048084,3955.4354 +5.040622,3964.2650 +4.905965,4100.2989 +4.784365,4223.3628 +5.045166,3964.1013 +4.948722,4062.0606 +4.860715,4151.6895 +4.989793,4031.5375 +5.047767,3975.3934 +4.974390,4050.5482 +5.046835,3979.9925 +5.009607,4019.0807 +5.042837,3987.8058 +5.040901,3991.7824 +4.340326,4694.4007 +5.037431,3999.3678 +4.932323,4106.6573 +4.937885,4103.3880 +4.984099,4059.4289 +8.844555,659.8124 +8.843924,661.7770 +8.846456,659.5355 +8.845840,660.4426 +8.846778,660.8610 +8.846151,661.7868 +8.978486,529.7479 +8.979621,528.9228 +8.979924,528.9417 +8.981604,529.4993 +8.981916,529.6550 +8.983388,528.5954 +8.983670,528.7209 +8.985543,622.1685 +8.989924,619.1632 +9.000879,608.5138 +8.990928,618.7365 +9.004889,606.1795 +8.995561,615.8212 +9.012406,599.2831 +8.985982,626.0335 +8.992674,619.6979 +9.028689,585.8890 +8.996625,618.8137 +9.026830,589.5359 +9.043530,573.8203 +9.007729,610.6085 +9.006265,613.1333 +9.034729,585.7617 +9.023163,602.1449 +9.009269,617.1940 +8.993646,634.0263 +9.002173,626.7152 +9.030645,599.5511 +9.010784,620.7332 +9.032686,600.2125 +9.021332,619.3246 +9.003521,638.6622 +8.990263,653.5039 +8.984419,660.9273 +8.994631,652.3449 +9.036800,611.8294 +9.038983,611.3416 +9.024940,627.1376 +8.990590,663.2651 +8.987409,668.3222 +9.041275,616.3427 +8.987918,671.6055 +9.504369,157.1236 +9.505702,214.6796 +9.507639,214.5422 +9.508235,215.7412 +9.508867,216.9620 +9.507938,219.8053 +9.511572,226.3077 +9.511104,228.7077 +9.505992,235.8007 +9.511984,231.7970 +9.508544,237.2865 +9.506283,241.6235 +9.512392,237.6497 +9.607713,144.4920 +9.609087,212.6974 +9.611069,212.6780 +9.625309,200.4190 +9.661493,166.2719 +9.612372,217.4439 +9.630198,201.7035 +9.617351,223.6712 +9.612016,231.1987 +9.645348,200.0931 +9.632899,290.3388 +9.615439,309.8114 +9.720383,206.9044 +9.725830,203.5054 +9.653857,277.5740 +9.652079,281.4685 +9.650326,285.4390 +9.620491,317.4725 +9.648631,370.2074 +9.627674,393.1423 +9.614579,408.2174 +9.827767,197.0059 +9.743783,283.0104 +9.747909,280.9591 +9.722183,315.4305 +9.739814,299.9974 +9.643768,471.6013 +9.825729,291.5966 +9.619400,499.8387 +9.927289,193.9137 +9.929337,193.9186 +9.631518,493.8468 +9.737881,389.5779 +9.845443,284.1686 +9.752206,379.5938 +9.741794,468.5369 +9.937965,274.2619 +9.750043,464.0892 +10.018840,197.2015 +10.024775,193.2267 +9.745832,479.2822 +9.727745,499.3797 +9.609393,619.7882 +9.935766,295.5026 +9.823749,483.5378 +9.646977,662.1077 +10.026795,284.0885 +10.115372,197.3487 +10.121204,193.3970 +10.123256,193.2956 +9.642184,676.3295 +9.611690,708.8144 +9.640658,681.8994 +10.125367,204.5005 +9.628890,774.6106 +9.659525,745.7021 +10.129613,277.3483 +10.210333,198.4499 +10.216043,194.5539 +10.218003,194.4559 +9.609665,804.7348 +10.039813,376.5174 +10.020818,397.4929 +10.231270,193.4656 +9.611382,815.4422 +10.117328,379.6366 +10.212229,286.4957 +10.227126,273.3163 +10.307288,194.9041 +10.314602,189.4235 +10.316554,195.8830 +9.626464,887.9176 +10.022798,493.5316 +9.618339,899.9897 +9.925252,595.1541 +9.723977,798.5152 +10.037615,487.0333 +10.318515,280.5044 +10.309086,291.6815 +10.403502,199.0019 +10.410598,193.7355 +10.412460,193.7041 +9.831903,776.1210 +10.028869,581.1015 +10.214134,397.7867 +10.424737,189.1887 +10.329869,286.1078 +9.843216,846.9344 +10.127461,564.4058 +10.119240,574.3446 +10.496967,205.6105 +10.502194,202.1241 +10.504027,202.1092 +10.512438,195.5366 +9.657619,1052.2353 +10.426826,284.9461 +10.522494,191.2329 +10.514383,206.9440 +10.416332,306.9970 +9.829817,964.6780 +10.131801,664.3762 +10.599022,198.8966 +10.602506,197.1552 +10.604335,197.1050 +10.606166,197.1078 +10.524650,280.4884 +9.931432,875.5889 +10.615978,193.0025 +10.322558,488.4283 +10.229183,583.8184 +9.841024,974.0494 +10.611922,274.9703 +9.933568,955.0474 +10.690152,200.2138 +10.704320,194.5873 +10.706139,194.6444 +10.707976,194.6815 +10.498726,405.8673 +9.616367,1290.1960 +10.406963,501.6191 +10.709855,200.7558 +10.516331,397.6940 +10.600769,384.7626 +10.310885,676.3538 +10.702579,286.3771 +10.794497,196.1868 +10.801442,191.0207 +10.803275,191.0499 +10.609972,386.2212 +10.408784,589.3126 +10.713728,286.3232 +10.518330,483.7211 +10.721328,282.7630 +10.810987,277.9337 +10.711773,378.7450 +10.723330,368.7449 +10.890367,203.2919 +10.898909,196.4237 +10.900784,196.2200 +10.902659,196.1050 +10.414401,691.6899 +10.693587,414.2929 +10.914026,195.6837 +10.904594,206.9621 +10.520408,593.0414 +10.886894,296.6791 +10.797919,387.1164 +9.923240,1267.9882 +10.985534,207.1894 +10.990685,203.5418 +10.992464,203.3016 +10.994326,203.0398 +10.225116,973.8871 +10.910612,290.0759 +10.807022,395.3592 +10.500443,708.7158 +10.418312,792.6139 +10.405228,807.5087 +10.906564,308.0517 +10.691868,524.6332 +10.805139,476.0705 +10.815074,473.5943 +11.088923,201.2142 +11.095334,196.3555 +11.097006,196.2335 +11.098765,196.0553 +10.320505,975.9784 +10.799662,498.4885 +11.106093,193.8189 +10.987241,320.1730 +10.998098,311.1250 +10.988957,322.1255 +11.109711,203.2926 +10.808982,505.9467 +11.107881,273.3867 +10.996194,386.5390 +11.183574,200.6352 +11.192725,193.0063 +11.194228,197.9105 +11.195766,197.9311 +11.197368,197.9339 +10.613927,782.9905 +9.821787,1576.8057 +11.002052,398.2398 +11.113450,294.0998 +11.111558,297.7613 +10.608026,803.0527 +10.908583,504.3059 +11.090520,389.6781 +10.796179,685.3839 +11.288670,194.3129 +11.290139,194.2822 +11.291690,194.2206 +11.293241,199.7402 +11.294822,199.7453 +11.093661,402.4860 +11.199005,298.7715 +10.312722,1186.7451 +11.191230,309.9551 +11.202383,305.5712 +11.004093,505.4910 +11.216503,294.7826 +11.296485,216.5018 +11.214617,363.3879 +11.311084,268.2806 +11.384211,196.4845 +11.385732,196.3688 +11.392140,196.8478 +11.393699,196.7487 +11.395303,196.5988 +11.314930,278.4823 +11.212738,382.1791 +10.888617,707.9044 +11.299912,303.6063 +11.000053,605.0156 +11.307415,299.2513 +11.185038,423.2394 +11.382734,227.2147 +11.407551,204.1023 +11.400293,275.4940 +10.813002,863.3959 +11.480199,201.5183 +11.484422,198.5102 +11.485912,198.3291 +11.492983,192.5641 +11.494569,192.3467 +11.411080,277.2136 +11.398594,291.1555 +11.298152,398.3803 +11.381270,316.7992 +11.501186,198.3965 +11.309224,391.9655 +11.209161,493.6360 +11.512988,191.4610 +9.655732,2050.4621 +11.482984,290.5416 +11.281211,492.7738 +11.578006,197.3576 +11.580697,195.1243 +11.582103,197.9483 +11.588989,192.1293 +11.590449,191.7478 +11.591903,191.4178 +11.496148,288.3637 +11.509585,276.1364 +11.409320,383.3199 +11.481564,312.3254 +11.608279,186.9315 +11.210927,585.5959 +11.507956,289.9587 +11.511287,288.0399 +11.497778,303.0455 +11.092076,710.2494 +11.603520,200.3785 +11.594919,276.1330 +11.675788,196.3372 +11.681719,190.6922 +11.682933,190.7341 +11.684243,189.6995 +11.685548,188.6917 +11.686916,187.6134 +11.606668,269.3719 +11.313005,563.6776 +11.688295,189.1611 +11.699584,178.7032 +11.593413,285.7544 +11.200689,681.7061 +11.609950,273.2627 +11.689751,194.3006 +11.701191,183.7446 +11.706195,179.6404 +11.499469,390.0421 +11.702798,187.7319 +11.704451,187.1410 +11.696534,196.1749 +11.698070,266.5948 +11.773526,192.3300 +11.775822,190.3537 +11.780053,186.7088 +11.781120,186.7279 +11.782198,185.9509 +11.783322,185.1209 +11.605070,365.2782 +11.596523,374.2636 +11.775364,196.1113 +11.795211,177.0599 +11.785723,187.3821 +11.802326,171.6521 +11.412891,562.0250 +11.792641,186.6617 +11.784538,195.7363 +11.800824,180.4396 +11.676399,305.8284 +11.793891,189.4026 +11.803899,180.4929 +11.773986,211.5235 +11.799328,191.5103 +11.579366,412.7373 +11.396919,596.4323 +11.797915,196.7638 +11.611655,384.3639 +11.796524,200.9188 +11.871053,127.8066 +11.872126,195.6250 +11.872412,196.1930 +11.873668,195.7931 +11.873943,195.7757 +11.874240,196.4525 +11.874530,196.4586 +11.882396,188.8952 +11.877457,194.8802 +11.884936,187.7116 +11.884052,188.9035 +11.891593,186.0159 +11.879169,199.2486 +11.892710,186.4841 +11.889512,190.5211 +11.890531,190.3957 +11.885837,196.0207 +11.878288,204.5427 +11.883214,200.6474 +11.876684,208.2159 +11.876040,211.8349 +11.964666,124.3772 +11.965857,196.1588 +11.966176,197.1981 +11.966762,196.8933 +11.967848,196.0627 +11.968149,196.3432 +11.968444,197.4334 +11.979304,186.8616 +11.971476,194.9635 +11.982228,184.4993 +11.981265,185.7674 +11.990839,180.1591 +11.972272,199.5407 +11.980276,192.3763 +11.970787,202.7430 +11.970349,204.0844 +11.974916,200.4976 +11.984393,192.0176 +11.983294,194.1714 +11.973980,208.8400 +11.973106,210.8909 +11.997443,187.7128 +11.993353,193.0115 +11.996020,191.5661 +11.985510,203.3804 +11.994680,195.5365 +11.998861,192.7437 +11.992105,200.9096 +12.067752,126.7480 +12.068605,129.3518 +12.069462,195.0783 +12.069719,195.2358 +12.070693,195.7208 +12.070989,195.8362 +12.077610,189.8724 +12.072648,198.9562 +12.080034,192.5606 +12.079195,194.3853 +12.084901,189.7430 +12.083862,191.8844 +12.071292,211.1797 +12.080928,202.7111 +12.072956,211.8347 +12.072337,213.6701 +12.089045,198.2058 +12.078419,210.1423 +12.087876,202.0135 +12.082832,208.4678 +12.081858,210.8507 +12.162017,132.1907 +12.163374,199.9930 +12.163656,200.7921 +12.163911,200.9132 +12.164493,201.3261 +12.165878,200.2822 +12.182821,187.3432 +12.166728,204.1515 +12.186365,185.3073 +12.173531,198.9739 +12.193015,180.3671 +12.167033,207.2806 +12.170999,204.2816 +12.172654,203.6255 +12.174434,202.9130 +12.197958,184.1817 +12.188892,194.3601 +12.194501,189.8720 +12.166166,219.3774 +12.191606,195.1541 +12.185157,202.8251 +12.190218,199.0803 +12.176412,214.2030 +12.264541,195.7052 +12.264955,196.5692 +12.266414,195.3999 +12.266826,195.2534 +12.282473,181.0522 +12.187587,276.1997 +12.286009,178.0304 +12.275748,188.5682 +12.292710,171.8900 +12.271606,196.1738 +12.272596,195.9842 +12.289891,179.5188 +12.177467,292.8233 +12.274645,196.5694 +12.288562,183.6118 +12.175415,297.7843 +12.287252,189.8403 +12.273581,204.6174 +12.183998,295.3296 +12.267483,212.9827 +12.291301,190.3769 +12.166440,316.4495 +12.283640,200.5594 +12.294209,262.6540 +12.363368,195.1848 +12.364449,194.3817 +12.364825,194.6109 +12.365819,195.2290 +12.366160,195.1970 +12.382141,179.5113 +12.370165,191.7711 +12.385545,176.6979 +12.374314,188.6351 +12.171814,391.9565 +12.370881,196.9892 +12.371674,197.0623 +12.373384,196.2850 +12.377348,193.3016 +12.386761,184.8824 +12.375282,197.4201 +12.383253,190.5435 +12.372506,206.0677 +12.384374,195.3549 +12.389299,191.6059 +12.376280,205.8359 +12.387983,195.3805 +12.284792,299.8586 +12.390616,195.3658 +12.460247,127.1391 +12.461525,195.1383 +12.461815,195.8832 +12.462080,195.8948 +12.463526,195.5151 +12.477093,182.2263 +12.464316,195.2516 +12.480467,180.4502 +12.470291,190.9429 +12.464040,197.5053 +12.464600,197.2832 +12.467781,194.8508 +12.484201,181.3284 +12.473200,193.2283 +12.481679,185.6787 +12.468581,199.7086 +12.478200,191.0999 +12.472176,201.5778 +12.479328,195.5491 +12.471215,204.8239 +12.463787,213.4524 +12.469410,209.0947 +12.482891,196.8781 +12.556864,124.2629 +12.558553,197.6926 +12.558831,198.5692 +12.559436,198.2917 +12.561049,197.3725 +12.561358,198.3707 +12.578575,181.5717 +12.562243,198.2183 +12.582117,178.6511 +12.569670,193.8619 +12.561653,202.2294 +12.562950,201.3167 +12.563771,200.8736 +12.568737,196.3017 +12.572703,192.7227 +12.583365,182.4505 +12.570651,196.0268 +12.579731,189.2007 +12.567871,201.5223 +12.580906,188.9437 +12.573797,196.9901 +12.584651,187.3499 +12.561936,211.3534 +12.587387,187.1662 +12.585983,189.9071 +12.571644,208.4792 +12.656664,124.9017 +12.657699,125.3037 +12.657975,126.5575 +12.659042,207.1679 +12.665530,201.5699 +12.660918,206.7746 +12.668290,200.2086 +12.667358,201.4334 +12.676041,194.2397 +12.661234,209.3544 +12.666430,204.4674 +12.661884,209.5402 +12.674878,197.2948 +12.679770,195.0383 +12.677241,198.4547 +12.659568,217.0664 +12.662633,214.9644 +12.673755,208.3002 +12.681128,202.0073 +12.661546,222.7039 +12.659320,226.1064 +12.678507,208.0986 +12.669301,218.5487 +12.756247,132.8643 +12.757401,205.4742 +12.757729,206.2945 +12.758422,205.9033 +12.759729,205.7355 +12.768932,196.8122 +12.783003,183.0093 +12.784533,182.8929 +12.763532,204.2102 +12.772002,196.0897 +12.765426,203.0162 +12.760769,208.0407 +12.765039,206.7013 +12.770788,201.8176 +12.781567,191.9690 +12.769851,204.6692 +12.780125,195.3832 +12.765816,216.2189 +12.766679,216.4918 +12.760462,223.8364 +12.760147,225.3317 +12.764267,222.4018 +12.775891,212.0353 +12.769394,219.8022 +12.774554,215.9873 +12.773291,218.6054 +12.764645,228.7037 +12.763883,230.9092 +12.866211,130.0992 +12.867101,133.4904 +12.868499,197.8621 +12.874809,192.0300 +12.870281,198.6056 +12.877598,192.2311 +12.876636,194.2327 +12.885427,191.0342 +12.870589,207.0191 +12.875697,203.0523 +12.871425,208.5462 +12.884250,196.9596 +12.887851,194.6586 +12.867693,216.1215 +12.868816,221.9288 +12.882056,210.1281 +12.870897,222.7808 +12.872174,223.0084 +12.886606,210.1568 +12.883137,215.2347 +12.889113,210.9100 +12.962876,138.8771 +12.964024,139.4638 +12.964326,140.9429 +12.965465,202.2651 +12.967427,206.6269 +12.982036,193.5088 +12.968442,208.6104 +12.985480,193.1430 +12.974521,205.6925 +12.991897,189.9698 +12.968810,221.6079 +12.971742,220.3872 +12.968092,225.7776 +12.975509,220.1724 +13.000592,196.9070 +12.994793,204.5762 +12.986671,214.6212 +12.989197,214.0278 +12.990543,214.7051 +12.983172,229.2978 +12.966013,308.0901 +13.066362,216.7797 +13.076463,208.5478 +12.984299,302.6215 +13.069830,219.0401 +13.082511,208.2906 +13.070870,221.9503 +13.092185,202.6978 +13.078750,218.2072 +12.993350,305.7352 +13.103489,197.7715 +13.095184,213.6585 +12.972607,406.9206 +13.167731,213.8234 +13.174055,209.5180 +13.212471,173.1747 +13.105270,282.4816 +13.181868,208.0552 +13.175547,216.5661 +13.180215,221.0098 +13.193872,209.6640 +12.996311,483.8578 +13.081211,400.9884 +13.283144,201.0987 +13.083816,402.4864 +12.973537,514.8527 +13.292821,197.7129 +13.285012,207.7427 +13.077609,496.2586 +12.965744,610.0377 +13.288871,288.8370 +13.381556,198.1448 +13.383575,198.1176 +13.301261,282.4568 +13.294884,296.6128 +13.195683,397.9444 +13.177054,418.6874 +13.066840,601.0166 +13.392114,277.6709 +13.379529,298.1783 +13.480170,199.4249 +13.484244,197.2727 +13.079972,603.5481 +13.201293,484.2336 +13.401226,286.3333 +13.486303,203.3409 +13.190419,574.2308 +13.203226,571.2943 +13.101754,674.6708 +13.573870,204.4454 +13.579702,200.5562 +13.581693,200.5564 +13.205249,579.0234 +13.490536,295.7960 +13.482201,306.2248 +13.593629,196.9447 +13.274106,518.6809 +13.096764,773.9888 +13.403537,469.1362 +13.667859,206.7548 +13.681518,195.0351 +13.100024,778.5280 +13.575784,304.8185 +13.679597,203.0961 +13.595743,289.0718 +13.591498,295.4972 +13.299086,663.2701 +13.308843,655.4386 +13.764652,201.5103 +13.780259,194.3043 +13.782251,194.2686 +13.192131,786.3663 +13.683522,297.0006 +13.776427,206.1276 +13.492756,491.8874 +13.385647,678.7018 +12.987927,1078.1883 +13.784275,283.6025 +13.870755,198.9543 +13.874615,196.9231 +13.876554,196.8817 +13.098372,977.0420 +13.296959,780.4322 +13.886996,198.3852 +13.878553,208.9348 +13.884817,204.8151 +13.199371,960.1452 +13.286922,874.3921 +13.962358,200.7365 +13.974565,190.3557 +13.976521,190.3011 +13.290802,877.9295 +13.792788,377.8829 +13.583720,588.9432 +13.178625,996.0884 +13.389924,786.8588 +13.488391,774.3195 +12.967743,1296.6589 +13.774523,491.6045 +14.064351,203.4893 +14.071540,198.0702 +14.073438,198.0303 +13.786333,486.9982 +13.966163,309.0797 +13.880604,402.8963 +14.085383,200.1131 +13.788427,499.0527 +13.978498,383.1773 +13.090746,1272.5520 +13.068887,1295.9943 +14.163096,203.4274 +14.164922,203.3241 +14.166823,203.1225 +13.982556,389.1727 +14.075415,298.1402 +13.685528,689.8550 +13.872675,510.0627 +13.689645,695.0366 +14.174714,211.9068 +14.168733,219.8790 +14.159518,300.6641 +14.069711,392.0423 +14.262712,200.6391 +14.267842,197.1839 +14.269613,197.0968 +14.271470,203.4642 +13.387753,1088.9589 +13.980524,497.9478 +13.882694,597.6007 +14.273333,208.8465 +14.067879,416.1945 +14.089633,396.3793 +14.283501,204.5154 +13.778317,782.6648 +13.093679,1468.9194 +14.361677,202.5649 +14.366525,199.3559 +14.368248,199.3490 +14.369947,199.3781 +13.577710,993.3875 +14.266129,306.7904 +14.285498,295.2123 +13.687560,895.0846 +14.176784,407.8157 +14.087489,499.1404 +14.077393,511.2527 +13.964283,690.5112 +13.677709,984.0071 +14.463353,200.0340 +14.465027,199.9965 +14.466710,200.0325 +14.474935,193.5320 +14.170672,499.5836 +14.371730,300.3559 +14.484075,195.5575 +14.375384,306.1468 +14.461755,221.7167 +13.984645,700.8293 +14.386623,369.3321 +14.482181,275.3217 +14.488018,270.9845 +14.564243,196.3643 +14.565882,196.3229 +14.567598,202.3388 +14.569327,202.3538 +14.480296,293.1251 +13.197500,1577.6921 +14.384684,392.3321 +14.571098,207.7621 +14.478473,302.2709 +14.287482,500.5785 +14.580713,209.2007 +14.476713,377.7389 +14.654797,201.1866 +14.663388,194.2071 +14.665025,200.6623 +14.666744,200.6089 +14.668468,200.5586 +14.275244,595.5409 +14.661717,210.8199 +14.460183,414.1846 +14.670257,206.0036 +14.562600,315.5456 +14.582646,303.1690 +14.572921,314.7915 +14.172664,716.9318 +14.373557,581.1609 +14.755957,200.3518 +14.760609,197.2864 +14.762206,197.3336 +14.769938,197.6271 +14.771681,197.5421 +14.161315,809.5915 +14.681533,291.1250 +14.780745,193.6667 +14.264403,711.8358 +14.778861,199.2176 +13.669786,1310.1638 +14.364883,623.4182 +14.759004,293.0010 +14.388614,664.9304 +14.855985,205.0207 +14.857597,204.9321 +14.865689,198.4186 +14.867354,198.3578 +14.869028,198.3358 +14.757504,311.5484 +14.685475,390.4043 +14.878147,199.5447 +14.789915,289.5527 +14.876261,205.0296 +14.889597,193.5753 +14.363299,721.7590 +14.560983,592.9572 +14.588647,566.6939 +14.956310,200.3810 +14.957896,200.2361 +14.959541,200.0288 +14.967567,193.5187 +14.969225,193.3982 +14.870786,298.4916 +14.584601,586.3033 +14.978080,194.5034 +14.683473,490.8811 +14.382740,793.3559 +14.854454,323.4552 +14.887713,296.5143 +14.976240,209.6102 +14.775194,474.2569 +15.052007,198.0031 +15.061008,190.1395 +15.062531,189.8384 +15.064130,193.9147 +15.065713,193.6451 +15.067365,193.3650 +14.672086,590.0285 +14.872539,391.0283 +14.486013,779.0063 +15.079469,191.4720 +14.773422,498.9081 +14.974414,299.2988 +15.053546,221.6338 +15.069054,207.6054 +14.954719,323.4545 +14.874370,471.4171 +15.077693,269.1773 +15.153942,193.2149 +15.156693,191.6761 +15.158134,190.5119 +15.159571,189.3570 +15.161087,188.1216 +15.162625,188.0407 +15.184229,167.1119 +15.075881,276.2352 +14.970908,382.0273 +15.174355,179.4591 +15.081292,276.4433 +15.172585,185.9674 +13.790575,1568.8204 +14.066117,1294.1294 +15.176097,185.0698 +15.170906,193.1487 +15.155342,209.6957 +14.972659,464.8298 +14.777017,661.6294 +15.249451,189.4818 +15.250010,189.4775 +15.251148,189.5343 +15.252370,188.5899 +15.258047,183.1968 +15.259360,182.1772 +15.260731,182.4724 +14.988302,455.4870 +15.265021,179.5453 +14.679634,765.7744 +15.273714,172.5841 +14.586630,860.5490 +15.085060,366.8108 +15.083174,369.5265 +15.177910,275.6839 +15.275181,179.3567 +15.263568,191.9177 +15.270943,185.5692 +15.272331,185.2545 +15.278174,180.5087 +14.788068,677.1194 +14.979951,486.4182 +15.276660,190.9383 +14.885816,583.0217 +15.262116,208.0264 +15.185851,285.6105 +15.169279,303.5561 +15.345788,128.4717 +15.346871,192.4223 +15.347157,193.3698 +15.348369,192.4492 +15.348646,192.7785 +15.348929,194.0932 +15.349209,194.1042 +15.350666,192.9497 +15.364056,180.0781 +15.352936,195.0629 +15.352117,196.6535 +15.360248,189.3381 +15.359396,191.0025 +15.361168,190.1180 +15.358553,193.6571 +15.353815,199.3379 +15.351342,204.9057 +15.365039,192.1617 +15.357737,200.4579 +15.437490,121.6933 +15.438647,193.8457 +15.438934,194.7225 +15.439488,194.4551 +15.440683,193.8768 +15.440961,194.8389 +15.441244,194.8644 +15.441538,194.8763 +15.443204,193.5198 +15.465188,173.3149 +15.445409,193.8316 +15.468839,171.1898 +15.453595,187.2699 +15.443790,197.9474 +15.446299,196.3440 +15.447181,201.3190 +15.452701,196.6975 +15.454539,195.7180 +15.451872,199.3370 +15.471463,180.7263 +15.455487,197.6832 +15.470144,184.0882 +15.474260,181.0775 +15.444567,216.6467 +15.472837,189.6413 +15.458684,205.0518 +15.456513,208.5372 +15.457587,208.8048 +15.466370,201.4176 +15.467600,201.6052 +15.539295,131.3931 +15.540527,193.7629 +15.540819,194.6780 +15.541426,194.3580 +15.543023,193.0326 +15.543313,194.7045 +15.543616,194.6885 +15.556249,182.3273 +15.548772,190.0914 +15.559184,179.9884 +15.553154,189.7998 +15.544134,199.6308 +15.550399,194.2236 +15.551287,194.1895 +15.557202,189.2067 +15.558196,189.1913 +15.549587,198.7851 +15.548000,202.8691 +15.552212,199.6880 +15.632494,120.4750 +15.633657,193.8271 +15.633944,194.9374 +15.634561,194.6328 +15.635800,193.6696 +15.636109,194.9980 +15.636414,194.9529 +15.636725,194.9327 +15.648501,183.4538 +15.640030,192.2577 +15.651210,181.3844 +15.650258,186.7313 +15.638504,199.3548 +15.653171,185.5808 +15.649400,190.2474 +15.669206,171.4415 +15.665051,176.6183 +15.640866,201.8334 +15.662479,184.8084 +15.652190,196.1266 +15.642644,206.7462 +15.641739,208.7452 +15.666393,185.2395 +15.661215,191.6177 +15.639242,214.8284 +15.654233,201.1569 +15.670689,189.6916 +15.655339,206.4256 +15.667789,195.4133 +15.663737,200.9208 +15.734291,131.8937 +15.735498,196.0886 +15.735784,196.2225 +15.736056,197.3142 +15.738018,195.7756 +15.738305,195.9966 +15.750870,188.2784 +15.739173,200.9244 +15.738576,202.4694 +15.746409,195.6689 +15.738863,204.2730 +15.747388,202.6650 +15.744624,206.4981 +15.745477,206.6995 +15.742955,210.3424 +15.752970,201.4426 +15.751901,203.7242 +15.748373,208.4845 +15.743766,214.3856 +15.827486,131.9894 +15.828882,199.8148 +15.829194,200.6362 +15.829470,200.6723 +15.831108,199.6173 +15.831368,201.0490 +15.831658,201.0562 +15.847288,185.7153 +15.832595,200.7234 +15.850485,185.6717 +15.840648,196.2808 +15.831955,205.7745 +15.836990,201.5607 +15.837861,201.5492 +15.854071,186.2982 +15.841671,203.4104 +15.832288,213.8320 +15.852834,194.2875 +15.842700,205.4737 +15.851634,197.6485 +15.855391,195.0243 +15.848318,203.2925 +15.864659,188.1470 +15.839648,216.5085 +15.861765,265.1596 +15.931587,196.5159 +15.932007,196.4027 +15.933371,195.6331 +15.933795,197.7254 +15.934303,197.4953 +15.950055,182.0202 +15.940099,192.2777 +15.953298,182.8610 +15.863203,273.7168 +15.959476,178.2466 +15.941047,197.4894 +15.942079,197.3247 +15.956858,183.4622 +15.849391,291.8826 +15.939150,206.6412 +15.943137,203.6453 +15.838753,309.0475 +15.954414,194.4731 +15.955626,194.3472 +15.958153,192.9847 +15.951123,201.1912 +15.866186,287.3573 +15.860382,297.0932 +15.952178,206.6065 +16.028698,131.4800 +16.029831,197.5279 +16.030143,198.3049 +16.030725,198.0026 +16.032417,198.1043 +16.032714,198.0734 +16.045082,185.9596 +16.036158,195.1620 +16.048175,184.7410 +16.040370,193.2500 +16.033004,201.4000 +16.036930,198.3040 +16.052807,183.2666 +16.051612,187.8951 +16.047122,193.3090 +16.049283,192.0817 +16.038552,203.7643 +16.037731,205.6045 +16.056158,188.2178 +16.033319,215.4274 +16.050417,199.4756 +16.039411,211.6807 +16.046122,206.2080 +16.126926,126.6746 +16.128104,196.4484 +16.128410,197.2812 +16.129004,196.9829 +16.131520,195.0578 +16.131798,195.9606 +16.145792,182.2797 +16.136161,192.2112 +16.148888,179.8209 +16.140322,190.5168 +16.132075,199.5300 +16.136921,195.4772 +16.137724,195.5121 +16.152315,181.7846 +16.141274,193.7440 +16.160179,180.6747 +16.138537,203.2932 +16.157476,185.3790 +16.149974,193.9597 +16.147801,197.2154 +16.153544,192.6426 +16.146784,200.5708 +16.151139,197.4587 +16.132377,220.3022 +16.139405,214.6251 +16.158786,196.6300 +16.227360,129.4840 +16.228449,196.6435 +16.228728,197.2079 +16.230522,195.9830 +16.230788,196.5280 +16.239508,188.0833 +16.232917,195.9245 +16.242317,186.8410 +16.241366,188.1018 +16.249894,179.8992 +16.233621,199.8645 +16.240432,193.8479 +16.235235,199.8839 +16.248747,187.2529 +16.252331,184.5637 +16.231321,206.5765 +16.243336,199.2892 +16.244377,199.3368 +16.234405,210.4199 +16.236074,209.9044 +16.251093,196.1153 +16.231042,217.3848 +16.253602,196.1274 +16.324553,126.4776 +16.325692,197.3972 +16.325988,198.3950 +16.326579,198.0879 +16.327759,197.1771 +16.340855,185.5980 +16.328710,198.0144 +16.343935,183.0556 +16.334101,193.1944 +16.328072,199.5065 +16.330839,199.3185 +16.331606,199.3440 +16.347355,184.4448 +16.335019,197.6359 +16.333237,200.3407 +16.352680,181.8746 +16.328372,207.1606 +16.345018,195.7645 +16.342856,199.0426 +16.341832,201.1732 +16.355417,188.7267 +16.346188,199.1613 +16.332399,214.1558 +16.354031,193.8416 +16.348598,203.5073 +16.356845,196.6541 +16.425094,129.8057 +16.425937,130.4558 +16.426506,198.2077 +16.427317,198.4454 +16.433488,192.5581 +16.429159,198.1203 +16.436001,191.5846 +16.435120,192.7341 +16.443715,184.4344 +16.429794,199.8907 +16.449730,180.6912 +16.434282,196.9627 +16.427592,204.5294 +16.429468,203.5605 +16.447213,190.3614 +16.444826,193.7502 +16.442626,196.9683 +16.448428,192.2563 +16.451032,190.7280 +16.428842,214.0616 +16.445980,200.5700 +16.437898,209.8718 +16.436896,212.1814 +16.523090,127.2995 +16.524383,199.2841 +16.524667,200.1392 +16.524937,200.1768 +16.526453,199.2126 +16.540784,186.0569 +16.527296,199.8296 +16.544144,183.2555 +16.532656,195.0292 +16.552106,178.5382 +16.527579,203.8740 +16.530159,202.1315 +16.531801,201.3423 +16.533578,200.4720 +16.556394,178.6161 +16.546556,192.7781 +16.534556,205.8502 +16.545351,196.0977 +16.526724,215.8314 +16.543006,200.6802 +16.554900,189.9850 +16.526991,219.1346 +16.535534,211.8761 +16.547874,204.1157 +16.530951,222.4615 +16.553500,201.3176 +16.541900,214.4052 +16.624715,133.0749 +16.625763,200.3764 +16.627280,199.9982 +16.637576,191.6241 +16.628149,201.4257 +16.640686,189.5514 +16.632123,198.9633 +16.647771,188.0386 +16.626046,210.7383 +16.629685,208.1308 +16.627586,211.2817 +16.633030,206.9505 +16.627855,213.3054 +16.630422,211.9105 +16.649078,198.7840 +16.641761,207.4143 +16.642904,207.5500 +16.646551,205.2749 +16.638577,214.6171 +16.650391,204.2497 +16.631246,224.8594 +16.639596,218.0652 +16.723669,135.5690 +16.724807,203.6744 +16.725114,205.3409 +16.726841,204.1102 +16.739335,192.5536 +16.727686,205.3213 +16.742557,191.6258 +16.733145,205.2858 +16.727126,212.4904 +16.725666,215.1449 +16.730646,211.4359 +16.746127,205.3592 +16.734051,218.8090 +16.727400,226.8166 +16.744886,210.7490 +16.735011,222.0622 +16.743687,214.9021 +16.747411,212.6987 +16.740407,221.3026 +16.756306,207.0142 +16.732291,232.6838 +16.753414,213.2935 +16.757791,210.6562 +16.826140,210.0299 +16.829201,208.4334 +16.847863,191.2784 +16.831087,209.5409 +16.851827,190.3774 +16.837817,205.9789 +16.859239,186.2104 +16.741449,305.7072 +16.731454,322.8958 +16.836786,219.3144 +16.854642,203.2208 +16.835811,223.8682 +16.853195,208.3911 +16.827279,236.1984 +16.842334,223.0745 +16.841161,231.6528 +16.850456,224.3925 +16.754818,389.0162 +16.928482,217.1234 +16.930456,216.9771 +16.951488,197.8209 +16.933008,218.1584 +16.955636,197.4490 +16.939617,215.4301 +16.963321,193.7128 +16.934184,224.8758 +16.857662,303.4787 +16.930952,239.0927 +16.960111,212.1454 +16.829576,412.9168 +16.830238,414.1666 +17.036172,210.1619 +17.072815,175.5163 +16.952862,297.4879 +17.043797,208.6052 +17.037636,216.8531 +17.042205,214.4273 +17.056101,202.7294 +17.047158,291.8138 +16.942083,398.8600 +17.143836,199.0891 +17.145607,199.3620 +17.147434,199.5728 +16.966709,382.4024 +17.063478,292.7242 +16.931890,426.4689 +17.161142,199.3851 +17.074849,366.6390 +16.849176,594.1842 +17.153087,292.1686 +17.246335,200.8746 +17.155049,294.1141 +17.170046,281.1063 +16.957075,502.8103 +17.149310,312.7001 +17.040629,423.5266 +17.254490,284.2703 +17.252404,288.1648 +17.338973,203.4622 +17.344970,199.3818 +17.347009,205.9050 +17.039143,515.7835 +17.151168,405.7617 +17.242494,316.4812 +17.360528,200.5859 +17.045450,517.7841 +17.054351,587.7495 +17.340945,302.9696 +17.061587,584.1147 +17.441490,206.0324 +17.447212,202.2116 +16.751990,899.3309 +17.356204,297.0564 +17.349113,306.1656 +16.961711,695.5797 +16.954218,710.3903 +17.057864,676.9172 +17.449164,287.3579 +17.443362,294.9675 +17.538762,208.0482 +17.544353,204.2682 +17.552915,197.5753 +17.258832,493.5441 +16.839982,914.3132 +17.248332,507.9268 +17.059680,698.5891 +17.065409,694.9393 +17.561116,276.1734 +16.958591,880.3467 +17.542437,298.2233 +17.642102,200.2768 +17.647524,196.6265 +17.649425,196.5737 +17.250351,597.4989 +16.968448,881.3032 +17.540570,311.1487 +17.342927,515.1863 +17.462012,398.1241 +17.657292,204.9200 +17.256634,677.5523 +17.459887,476.0290 +17.734782,202.8685 +17.746812,192.6618 +17.748624,199.2917 +17.750492,199.2822 +16.938432,1013.2584 +17.451154,502.4833 +17.664610,291.0390 +17.445257,512.4216 +16.940813,1018.9574 +17.758270,203.6508 +17.736524,296.7463 +17.159068,875.9774 +17.837291,205.7674 +17.844152,200.7712 +17.846000,200.7627 +17.157035,891.6315 +17.244406,806.2122 +17.554929,497.6401 +17.847851,206.7188 +16.856106,1200.5178 +17.738331,320.4127 +17.858115,278.0814 +16.838869,1299.0497 +17.937653,202.0390 +17.939475,201.9867 +17.947917,195.3784 +17.949776,200.6404 +17.760350,391.9508 +17.756261,397.9322 +17.959772,196.3764 +17.951691,206.4311 +17.860137,300.0322 +17.464157,766.1680 +17.934189,297.7752 +17.840663,397.8741 +18.043060,197.1385 +18.044925,196.9980 +18.046764,196.9049 +17.851720,393.7389 +17.957680,289.6236 +17.655280,599.4741 +17.935917,320.7203 +17.172258,1086.3286 +18.033272,227.2493 +18.048668,280.2056 +18.035047,301.4772 +18.136198,202.0232 +18.139694,200.2070 +18.141463,200.1822 +18.143297,200.1174 +18.150418,194.8252 +17.651323,695.7939 +16.964977,1389.9284 +18.160170,196.6580 +18.152302,206.4765 +17.558977,801.8151 +18.052570,310.2505 +17.838939,588.6787 +18.158124,275.6587 +18.230327,205.1016 +18.241924,195.1272 +18.243670,195.0569 +18.058745,381.7437 +17.849752,598.5240 +18.240200,209.8918 +18.254756,197.1935 +17.842380,611.4493 +17.752377,703.3787 +18.154194,303.5469 +18.050620,476.9012 +18.328875,206.5446 +18.338223,198.7817 +18.339902,198.7070 +18.341647,198.6662 +18.343415,198.5627 +18.345245,198.4864 +17.955651,589.8918 +18.137920,409.4294 +17.862213,693.9229 +18.347119,210.8834 +18.260523,299.4361 +17.563236,998.6648 +18.256639,307.2567 +18.336526,293.6546 +18.362822,268.9553 +18.435430,197.9082 +18.437053,197.9178 +18.438728,205.3441 +18.056625,589.1446 +18.245461,401.9754 +17.754296,894.8546 +18.440490,210.4364 +18.258588,394.1323 +18.360793,293.7809 +18.450093,206.4126 +18.238538,425.1205 +18.448278,283.4954 +18.527523,205.7517 +18.537007,197.8327 +18.538611,197.7860 +18.540315,197.6810 +18.541980,197.6974 +18.543732,197.6288 +18.457742,291.6686 +18.054571,696.6538 +18.358780,394.2413 +17.953638,801.2283 +18.535421,221.3704 +18.563897,194.8290 +18.433784,326.9190 +17.643915,1183.3898 +18.231965,596.7933 +18.630182,205.2420 +18.633340,203.5593 +18.634972,203.3972 +18.644074,195.8045 +18.545544,295.8590 +17.961922,881.0867 +18.652722,191.9010 +18.453831,392.4402 +18.650928,201.2944 +18.663660,190.3019 +18.455757,399.9550 +17.358360,1568.5147 +18.656507,271.5417 +18.731775,197.5261 +18.733277,197.2756 +18.734841,197.0532 +18.736398,201.7263 +18.737997,201.5347 +18.739679,201.3222 +18.741362,201.1491 +18.451950,492.0933 +18.556137,394.8510 +18.356830,595.6589 +18.753023,201.0228 +17.556931,1398.6709 +18.558004,399.2296 +18.354906,603.9585 +18.561902,398.6743 +18.760704,265.0527 +18.754868,273.5724 +18.827307,202.2764 +18.836901,193.8858 +18.838371,193.6031 +18.839880,193.3885 +18.559961,478.4608 +18.247305,792.3811 +18.649152,391.8485 +18.547351,494.9957 +18.835426,213.7660 +18.647437,403.0288 +18.756793,294.9643 +18.846272,206.8542 +17.653262,1401.2396 +18.841404,214.5461 +18.156150,901.2745 +17.645704,1479.8840 +18.926876,199.7565 +18.930553,196.4613 +18.931895,196.2953 +18.938125,190.4400 +18.939533,193.1719 +18.941003,192.4815 +18.942513,191.8304 +18.751226,384.0199 +18.843010,293.1346 +18.950989,186.1270 +18.749413,388.7433 +18.929302,209.8913 +18.828760,315.5347 +18.855713,289.6677 +18.944045,202.4642 +18.954047,193.6003 +18.960597,188.2603 +18.758727,391.3461 +18.852224,299.1463 +18.955603,265.5522 +19.025757,196.5418 +19.029585,193.0145 +19.030788,192.4020 +19.031975,192.4868 +19.033269,191.4844 +19.049193,175.8537 +19.028441,196.9219 +19.039688,188.4705 +19.055951,172.9669 +18.958866,270.8523 +19.050467,180.0734 +18.928050,303.3758 +18.952490,279.8708 +18.645771,587.5589 +19.054502,183.3849 +18.427619,811.2546 +19.041002,198.9092 +18.957234,283.7356 +18.853963,388.1207 +19.051758,191.5005 +19.038423,206.0177 +19.057425,188.2681 +18.654575,594.3568 +18.631779,687.7740 +19.125589,195.0851 +19.126633,194.3329 +19.127015,194.5037 +19.128191,194.5103 +19.128566,194.4126 +19.132706,190.5589 +19.133485,190.0717 +19.134344,191.2105 +19.053127,273.1672 +19.137117,189.9567 +19.042348,285.5586 +19.136145,192.5953 +19.148859,180.8091 +19.139195,195.0647 +19.150074,185.0631 +19.147648,188.3847 +19.138157,198.7694 +19.146510,191.3884 +18.844624,494.3029 +19.135247,204.7094 +19.151371,189.6973 +19.144296,200.3479 +19.145382,200.4041 +19.221157,125.8547 +19.222300,194.2208 +19.222600,195.2528 +19.223191,194.9600 +19.224462,193.9585 +19.224754,195.1194 +19.237888,182.2537 +19.228159,192.2380 +19.240971,179.6939 +19.232361,188.5875 +19.225047,199.5233 +19.228919,196.4318 +19.229719,196.4717 +19.244441,182.6481 +19.239912,188.0718 +19.242085,186.8769 +19.230542,199.4478 +19.238875,192.1447 +19.248933,186.1550 +19.225364,210.8384 +19.233331,204.0278 +19.245695,192.8807 +19.231427,208.3780 +19.243260,197.8512 +19.319554,122.8570 +19.320674,194.8632 +19.320967,195.9053 +19.321519,195.6588 +19.322702,194.7543 +19.322979,196.0181 +19.323265,196.0315 +19.323558,196.0191 +19.325555,194.3493 +19.344645,175.5880 +19.327907,195.4757 +19.326296,197.9107 +19.336034,188.9808 +19.327075,198.8165 +19.341069,185.7549 +19.345787,181.9799 +19.334261,194.5197 +19.337899,195.3987 +19.328742,205.5150 +19.335138,200.1030 +19.339957,196.2706 +19.347012,190.2874 +19.338928,199.4621 +19.329669,209.8835 +19.336927,203.8333 +19.416521,127.7456 +19.417853,196.3474 +19.418151,197.2169 +19.418421,197.2410 +19.419874,196.3792 +19.435089,182.4144 +19.420665,197.1307 +19.438576,179.5450 +19.427091,191.3201 +19.420398,200.6829 +19.420949,200.8887 +19.424572,198.0651 +19.431020,192.4182 +19.429990,194.3294 +19.439806,185.4434 +19.427985,198.2017 +19.436203,194.8073 +19.425352,206.7305 +19.437360,195.8425 +19.442412,191.9123 +19.428963,206.5617 +19.441112,195.6423 +19.426192,211.8410 +19.420143,219.2237 +19.515539,126.9019 +19.516873,196.7723 +19.517179,197.5585 +19.517457,197.5734 +19.518998,197.3351 +19.519297,197.3106 +19.519577,197.3027 +19.519905,197.2715 +19.533299,185.3098 +19.524207,194.7366 +19.536229,183.4256 +19.528781,191.6967 +19.520233,201.1194 +19.525016,200.0079 +19.540762,185.0681 +19.539553,187.1236 +19.535242,192.3359 +19.537301,191.1701 +19.526825,202.6200 +19.525892,208.4626 +19.544268,191.1836 +19.523384,213.1542 +19.538391,199.3008 +19.527768,211.1153 +19.534258,205.8527 +19.614202,127.2114 +19.615369,198.2105 +19.615663,199.2608 +19.616254,198.9824 +19.621082,194.4284 +19.642442,173.6778 +19.623440,194.1151 +19.618411,199.4550 +19.631012,187.1696 +19.622638,195.8735 +19.636755,182.1004 +19.618122,205.1586 +19.626188,197.9925 +19.621839,203.2782 +19.635526,190.5482 +19.617797,209.3000 +19.617504,210.6264 +19.638034,191.2033 +19.625250,205.1501 +19.632084,202.9501 +19.634325,201.9351 +19.624321,213.1831 +19.633204,205.6057 +19.639367,200.7592 +19.713647,127.8942 +19.714738,128.2023 +19.715031,200.0779 +19.716334,199.8554 +19.716608,199.8652 +19.716880,200.8476 +19.717177,200.8246 +19.725025,193.2589 +19.719656,198.8972 +19.727579,192.3813 +19.726678,193.6510 +19.735453,185.5317 +19.721354,200.4440 +19.741414,181.2465 +19.725831,200.3381 +19.718609,208.4188 +19.720479,207.4846 +19.738884,190.0646 +19.736540,193.4219 +19.729446,201.5808 +19.734356,201.0685 +19.728473,208.1310 +19.718944,218.8509 +19.740112,198.9214 +19.737693,202.6659 +19.813580,128.1086 +19.814924,199.5493 +19.815237,200.5468 +19.817555,198.5245 +19.835035,181.3211 +19.818512,199.4697 +19.838811,179.4755 +19.825118,193.4573 +19.818182,200.7256 +19.818856,200.4091 +19.815510,204.1191 +19.829239,194.0704 +19.816120,208.1024 +19.823282,201.9099 +19.841542,184.6646 +19.827098,200.1542 +19.840127,188.2430 +19.817867,211.6133 +19.837505,197.0258 +19.842941,192.8063 +19.826075,210.9453 +19.828132,210.1548 +19.836261,203.3704 +19.824181,216.8018 +19.830401,212.0212 +19.915110,128.7469 +19.916190,131.4912 +19.916474,132.7556 +19.917729,203.6451 +19.918002,203.8050 +19.926170,197.6437 +19.919961,204.7234 +19.928950,196.6855 +19.927965,198.6867 +19.936605,191.0669 +19.920330,208.4452 +19.927029,206.5248 +19.921799,212.8980 +19.935426,200.4095 +19.940360,196.6770 +19.937796,200.5035 +19.918553,221.0214 +19.922662,223.0713 +19.918284,228.8509 +19.941690,206.8886 +19.920986,229.0575 +19.931028,220.5594 +19.939034,214.1022 +19.929963,224.7955 +20.014475,141.9382 +20.015785,208.3189 +20.017982,206.6694 +20.034532,190.6353 +20.018908,211.3440 +20.038288,193.2228 +20.024224,208.5931 +20.018287,215.9178 +20.019266,216.3278 +20.019630,222.5575 +20.023310,220.3276 +20.040984,204.1522 +20.016080,230.5768 +20.039633,208.5964 +20.047682,202.1716 +20.028371,223.1404 +20.027253,231.4419 +20.037022,223.4631 +20.018576,243.7162 +20.043858,220.3235 +20.029481,297.0882 +20.121375,205.9588 +20.121808,209.7667 +20.133555,198.7888 +20.123814,209.2865 +20.137038,196.8058 +20.128776,205.8565 +20.145734,189.6996 +20.124685,211.8196 +20.125637,212.6858 +20.156414,183.7976 +20.049231,299.0107 +20.154760,195.4215 +20.042424,309.7373 +20.138301,215.8768 +20.026208,330.0738 +20.016356,420.1217 +20.224105,214.1843 +20.242189,197.9456 +20.135836,306.1842 +20.153137,290.7703 +20.249855,203.0288 +20.235594,219.2634 +20.243639,213.1857 +20.260486,198.3724 +20.127672,333.2268 +20.232818,306.1213 +20.251513,289.2780 +20.327335,215.2616 +20.331575,212.8666 +20.151589,394.7841 +20.150045,398.2700 +20.335434,221.9080 +20.258696,300.7382 +20.334633,226.8973 +20.134698,428.9331 +20.245137,320.6405 +20.126652,511.8269 +20.147136,493.3481 +20.438291,204.1611 +20.354179,297.0037 +20.248230,404.9798 +20.338323,316.9511 +20.225168,432.1802 +20.333101,326.3712 +20.035749,625.9132 +20.440136,301.9964 +20.139576,604.5961 +20.538940,207.2886 +20.542598,205.6896 +20.544443,205.9297 +20.456826,295.6749 +20.025193,729.5027 +20.262294,494.6398 +20.230253,528.9461 +20.559435,202.0481 +20.546374,286.0802 +20.436480,397.9672 +20.642454,193.9819 +20.565779,280.7604 +20.348242,500.4614 +20.651185,199.6517 +20.340213,512.7870 +20.148580,777.1048 +20.454859,472.7428 +20.458859,470.6486 +20.742134,189.3400 +20.748289,190.9711 +20.750374,190.9138 +20.752502,190.8724 +20.234206,711.2782 +20.231512,716.0904 +20.452885,496.8974 +20.333844,685.9812 +20.460901,560.8359 +20.638481,385.1753 +20.832456,193.1556 +20.836437,197.8509 +20.563632,472.7058 +20.540792,497.5983 +20.442022,598.4501 +20.326570,716.0193 +20.754697,290.0757 +20.352162,764.7589 +20.653212,465.6915 +20.925687,195.2078 +20.939262,191.7530 +20.941289,191.8368 +20.943375,191.8410 +20.756935,380.4319 +20.224652,914.8903 +20.759200,382.5668 +20.761485,382.5444 +20.246658,971.1357 +20.846541,373.2919 +21.019827,202.0350 +21.034290,189.6300 +20.931476,294.5413 +20.659474,568.6859 +20.853002,377.3498 +20.557344,681.5915 +21.025613,288.9940 +21.042592,273.9575 +21.120896,197.5696 +21.131016,189.3828 +21.133127,189.2806 +21.135218,189.2650 +21.038393,288.1720 +20.949784,383.4795 +20.548316,787.0935 +20.850838,559.1012 +20.640486,771.2570 +20.657349,756.1880 +21.217796,197.5718 +21.221864,195.3689 +21.223922,195.2532 +21.044775,376.3430 +20.336506,1086.5926 +21.137368,287.7761 +20.947603,479.6123 +20.332345,1102.3666 +20.443909,1063.2486 +21.144031,364.9057 +21.314609,196.0923 +21.320401,192.1322 +21.322409,192.0047 +21.324484,191.8179 +21.040474,477.7695 +21.036339,483.8877 +21.141768,380.5033 +20.746230,778.1028 +20.834449,691.9971 +20.661663,937.3753 +21.326566,274.2188 +20.744174,858.3536 +21.409946,194.3616 +21.417235,195.4179 +21.419176,195.3937 +20.848705,767.7657 +21.333264,285.1341 +20.655276,965.1254 +20.561531,1060.8830 +21.118904,505.5938 +21.427217,267.2692 +21.415369,280.8446 +21.411745,286.1505 +21.510703,188.9235 +21.512534,195.6353 +21.514415,195.6146 +21.516303,195.5812 +20.356283,1357.5002 +21.421119,294.6101 +21.238937,478.7846 +21.318467,401.2601 +21.139543,582.2427 +21.524334,264.7996 +21.021738,774.7885 +21.507159,291.0371 +21.599040,200.8759 +21.604308,197.3281 +21.612654,190.7513 +21.614571,190.6891 +21.226018,586.5180 +21.335411,478.9535 +21.624499,191.7568 +21.616472,201.6752 +20.264183,1555.9068 +21.600786,221.2989 +20.927604,962.2075 +21.230353,661.1073 +21.694487,205.0678 +21.699627,201.6571 +21.708171,194.8429 +21.710031,194.7499 +21.711886,194.7036 +21.620402,288.0475 +21.423100,487.2477 +21.721787,190.4966 +21.713784,206.1849 +21.719728,202.2332 +21.508938,415.0913 +21.316551,673.1617 +21.425145,566.2193 +21.789136,203.8705 +21.801638,193.0413 +21.803407,193.0458 +21.805261,198.4615 +20.929510,1075.9909 +21.434712,572.6413 +21.798198,211.0001 +21.818148,192.9320 +21.618400,394.6265 +21.219835,795.1464 +21.696215,326.1729 +21.520228,565.9979 +21.889813,203.8525 +21.899557,195.7849 +21.901286,195.7706 +21.903016,195.7531 +21.904783,195.7746 +21.906591,195.7732 +21.116922,987.2590 +21.522273,583.8150 +21.717723,396.0891 +21.908451,207.3763 +21.602529,515.3153 +21.526447,593.4551 +20.350183,1837.0172 +21.413539,775.3124 +21.989714,200.7858 +21.994680,197.5083 +21.996454,202.8486 +22.003725,197.3460 +21.820091,382.7367 +21.924031,280.6361 +22.013027,193.4842 +21.799917,408.4721 +21.814366,395.9782 +21.715730,501.9222 +21.228161,1057.2901 +22.009199,277.7538 +21.796528,491.9227 +22.095344,194.6806 +22.097058,194.5611 +22.098770,200.2026 +22.100559,200.1406 +22.102366,200.0579 +21.822087,482.1200 +21.910349,395.6920 +21.921963,385.9253 +21.991366,325.1385 +21.891462,426.8587 +21.993008,327.1621 +21.816257,564.0167 +22.086227,301.4015 +22.187202,201.9187 +22.190501,200.1653 +22.192190,200.0357 +22.199304,194.5349 +22.201072,194.3967 +21.622416,774.7387 +22.206513,198.4993 +21.919971,486.7591 +21.023658,1384.8359 +22.011081,399.2383 +21.518245,893.9072 +22.188853,225.1762 +22.119903,301.3053 +22.106089,374.4592 +22.285453,196.6223 +22.290026,201.2870 +22.291620,201.2749 +22.298974,195.5405 +22.300701,195.4615 +22.302426,195.4227 +22.104183,395.3991 +22.007355,493.9848 +22.208390,300.1444 +21.697897,812.3813 +22.005502,506.5425 +22.204668,309.2428 +21.912285,603.5073 +22.288452,229.2867 +22.014982,564.6458 +22.380275,200.8782 +22.390668,192.0427 +22.392227,197.6552 +22.393840,197.6272 +22.395470,197.6172 +22.421210,173.5036 +22.304208,292.1862 +22.389122,208.9654 +22.406731,193.0989 +22.117845,483.8151 +22.093667,515.2010 +22.316506,294.1658 +22.320171,292.3716 +22.405013,273.0129 +22.480550,198.9626 +22.482077,198.9424 +22.491314,191.2461 +22.492896,195.9486 +22.494516,195.9317 +22.496164,195.9595 +22.497849,195.9283 +22.306042,389.4732 +22.318322,378.9506 +22.022389,681.8167 +22.408495,297.4129 +21.812538,895.0838 +22.307889,401.4839 +22.286954,424.2412 +22.517740,255.7501 +22.210345,567.3652 +22.581155,197.8741 +22.582712,197.7294 +22.589884,191.9516 +22.591469,197.9848 +22.593089,197.8215 +22.115829,676.5143 +22.512046,281.7762 +22.601662,193.6631 +22.217654,579.2587 +22.202829,595.6815 +22.612543,193.0457 +22.599831,207.4214 +22.610673,198.2250 +22.414030,458.4434 +22.515793,357.2185 +22.678028,199.0174 +22.681021,197.2315 +22.682562,196.9584 +22.688846,191.9432 +22.690449,191.7090 +22.692125,195.5076 +22.693779,195.1808 +22.412153,478.2319 +22.501341,390.4432 +22.596395,296.8594 +22.707623,187.1199 +22.513913,389.9006 +22.594714,310.5061 +22.679514,227.1627 +20.945485,1962.6776 +22.508536,401.1599 +22.579630,390.4776 +22.704207,266.9953 +22.773490,198.0794 +22.780443,192.2231 +22.781837,191.1870 +22.789455,187.7800 +22.790912,187.1728 +22.711196,267.7781 +22.779031,200.8812 +22.798512,182.3597 +22.777712,204.1811 +22.805591,177.3499 +22.598089,385.9687 +22.510279,478.8387 +22.113813,876.4258 +22.608869,382.5055 +22.709374,283.2029 +22.397156,596.6421 +22.793823,201.2583 +22.387630,676.7115 +22.872474,193.0821 +22.877046,188.8303 +22.878254,188.2249 +22.879521,188.2024 +22.880790,187.2298 +22.882160,186.1681 +22.887634,181.0058 +22.888961,182.7307 +22.807254,265.2647 +22.893256,180.0982 +22.697274,376.9469 +22.873012,202.1897 +22.891785,184.3800 +22.909697,167.4768 +22.796914,285.1266 +22.792345,290.6673 +22.890386,193.6271 +22.908164,176.8723 +22.695516,390.6091 +22.808899,278.3126 +22.499583,588.7804 +22.410321,679.2359 +22.906678,186.6943 +22.705909,388.7577 +22.894744,201.1802 +22.905222,256.7090 +22.970108,192.9764 +22.971570,191.8401 +22.972666,191.9996 +22.973024,191.9209 +22.977236,188.0235 +22.978086,187.4679 +22.978975,188.8615 +22.981894,186.7433 +22.971203,198.2729 +22.980873,189.4798 +22.992578,178.6820 +22.984058,188.1786 +22.993799,182.1869 +22.991376,185.5230 +22.982941,194.9151 +22.990240,188.5600 +22.795326,384.4957 +22.979913,200.9734 +22.995083,191.1541 +22.903815,283.5848 +22.989119,199.4901 +23.064343,125.4842 +23.065557,192.0840 +23.065877,192.9349 +23.066479,192.6635 +23.067724,191.9999 +23.068021,192.9044 +23.068328,192.9017 +23.068640,192.8855 +23.071694,190.1417 +23.093373,170.5255 +23.074222,190.4964 +23.072520,193.0418 +23.083014,183.4221 +23.073355,194.0014 +23.088365,179.9752 +23.094667,178.3755 +23.077175,196.7996 +23.095925,178.9662 +23.086127,189.7439 +23.084014,192.8705 +23.076166,201.7668 +23.082041,197.0327 +23.075203,205.0069 +23.089558,196.4067 +23.087212,200.0628 +23.085037,203.5373 +23.161932,127.9869 +23.163085,190.1278 +23.163411,191.1411 +23.164666,190.1856 +23.164946,190.1927 +23.165260,191.4472 +23.165554,191.4329 +23.175987,181.2861 +23.169477,188.0847 +23.178801,179.0646 +23.177858,183.9333 +23.187401,175.2513 +23.180888,182.6621 +23.176900,187.5462 +23.172238,193.1858 +23.167837,198.6112 +23.189829,177.6493 +23.168639,199.9495 +23.179823,192.5511 +23.186238,187.2688 +23.188610,186.0376 +23.170354,205.4853 +23.171261,205.8292 +23.257642,120.7267 +23.258813,188.9631 +23.259143,189.9883 +23.259725,189.7261 +23.260926,188.8006 +23.261230,190.1581 +23.261526,190.1600 +23.261836,190.1416 +23.273044,179.2624 +23.265563,187.0515 +23.275872,177.0678 +23.274892,181.9622 +23.263900,193.8713 +23.277934,180.7826 +23.273976,185.6920 +23.268341,192.3783 +23.289920,171.8576 +23.288576,174.2990 +23.285966,181.9513 +23.264719,204.3289 +23.266437,203.7151 +23.276885,194.4260 +23.279075,193.4185 +23.267357,206.3849 +23.280211,194.8045 +23.287276,189.0865 +23.353214,124.5223 +23.354553,189.8408 +23.354853,190.8609 +23.355139,190.8678 +23.356708,189.5854 +23.356987,190.7745 +23.372375,175.6702 +23.357866,190.4638 +23.375840,172.7750 +23.365425,183.4956 +23.377091,175.6220 +23.363551,190.0018 +23.364447,189.9975 +23.367479,187.8834 +23.362654,193.6769 +23.368589,188.7651 +23.373508,184.8790 +23.361792,197.7082 +23.357273,205.9128 +23.357562,206.7872 +23.374649,190.9189 +23.366450,200.3258 +23.378370,189.7027 +23.447777,121.6087 +23.449132,190.6186 +23.449451,191.6083 +23.449727,191.6564 +23.451389,190.2905 +23.451686,191.5397 +23.451978,191.5303 +23.467918,175.8638 +23.452940,191.1370 +23.471313,173.0713 +23.460721,186.4677 +23.477738,169.8463 +23.456856,191.1246 +23.457772,190.6021 +23.475016,173.7584 +23.470153,179.0449 +23.472494,177.5789 +23.461778,189.3914 +23.469049,186.1414 +23.458717,197.6168 +23.452307,205.1876 +23.452615,206.0610 +23.462876,197.0536 +23.473743,187.4554 +23.459669,202.8805 +23.476364,189.9348 +23.544395,123.3291 +23.545714,194.9989 +23.546007,195.9903 +23.546294,196.0263 +23.547762,194.8577 +23.563187,180.9184 +23.548616,195.7685 +23.566776,177.8777 +23.555363,189.5739 +23.568074,177.1727 +23.553554,195.4511 +23.554445,195.3952 +23.557356,193.3643 +23.552715,198.9286 +23.558388,194.2082 +23.569387,184.2238 +23.548046,206.5885 +23.548921,206.8195 +23.548330,211.1459 +23.565569,195.0527 +23.559501,202.3310 +23.564350,198.6875 +23.556331,208.0093 +23.639752,125.8890 +23.641060,195.7745 +23.641384,196.7828 +23.641680,196.7833 +23.643226,195.5120 +23.643509,196.8088 +23.655192,185.4071 +23.644385,196.4884 +23.658677,182.4903 +23.648775,192.6979 +23.666300,178.5024 +23.647189,198.4598 +23.647585,198.9355 +23.648375,199.0795 +23.651171,197.2299 +23.659931,189.4868 +23.649198,201.2913 +23.656335,195.2267 +23.647981,207.3213 +23.657495,198.9893 +23.662551,195.1359 +23.661200,197.7202 +23.667725,192.4776 +23.643783,217.7431 +23.644077,221.3940 +23.650075,216.8228 +23.740714,127.6536 +23.741998,193.5269 +23.742321,194.6555 +23.742621,194.6757 +23.744106,193.4846 +23.759478,179.8301 +23.744938,194.6869 +23.763039,176.8971 +23.751644,188.6244 +23.764342,176.2715 +23.749842,191.1691 +23.750721,192.6341 +23.753612,190.1845 +23.749006,195.4022 +23.754635,190.7785 +23.765642,180.8457 +23.744385,203.2075 +23.745247,203.5008 +23.744655,205.2763 +23.761833,191.5121 +23.755742,198.8715 +23.760623,195.2575 +23.752597,204.6385 +23.836836,121.7473 +23.838167,192.5302 +23.838464,193.5554 +23.838739,193.6106 +23.840318,192.3249 +23.855303,178.9154 +23.841167,193.3512 +23.858921,175.8877 +23.847455,187.6873 +23.866898,168.5806 +23.841474,197.8701 +23.844803,195.4151 +23.846521,194.5956 +23.850490,191.5182 +23.860204,182.7708 +23.848401,195.5950 +23.849418,195.6117 +23.840873,205.2781 +23.865472,185.1553 +23.868369,183.4620 +23.840599,212.4247 +23.845650,208.6574 +23.861527,194.0535 +23.851563,205.3720 +23.856486,201.8404 +23.857687,202.0612 +23.935526,127.6124 +23.936977,189.9436 +23.937297,190.4861 +23.939308,189.4489 +23.953346,175.7539 +23.940269,190.8429 +23.957236,174.5952 +23.943797,188.8195 +23.958584,174.8703 +23.948749,185.5762 +23.941011,194.2230 +23.939937,196.2775 +23.944409,196.2433 +23.939625,202.1169 +23.937592,205.2258 +23.943356,200.6156 +23.946489,198.6698 +23.949932,196.4695 +23.954614,193.0534 +23.945415,206.3814 +23.940623,212.5037 +23.947594,206.9224 +23.955881,200.0232 +24.030698,126.7061 +24.032020,193.3148 +24.032350,193.6782 +24.032643,194.1332 +24.034219,194.2970 +24.050629,178.2013 +24.035143,194.0053 +24.054308,175.1709 +24.042010,187.8140 +24.034519,196.0106 +24.035479,198.1584 +24.039345,195.1861 +24.041118,194.3508 +24.045031,191.3828 +24.055581,181.8522 +24.042976,199.6753 +24.043997,199.7704 +24.034809,210.1078 +24.059750,186.3818 +24.063140,184.2083 +24.058327,190.3213 +24.040220,209.7384 +24.056937,194.4319 +24.046152,206.6181 +24.051832,269.5003 +24.126921,195.5053 +24.127784,194.9498 +24.131112,192.2233 +24.151797,172.5758 +24.133455,191.2110 +24.155905,169.0521 +24.140654,186.1826 +24.157406,170.2024 +24.146403,182.0389 +24.135235,194.0825 +24.131833,198.3779 +24.141743,189.4248 +24.053025,279.1624 +24.147669,188.5292 +24.142818,194.4691 +24.143972,194.3803 +24.132617,206.8826 +24.128758,211.9233 +24.134326,207.5762 +24.154517,188.6683 +24.129101,218.6807 +24.153129,196.0321 +24.145160,205.4220 +24.136215,215.8065 +24.225335,128.2160 +24.226029,193.7488 +24.226777,193.9171 +24.233639,188.2190 +24.229149,193.0420 +24.236415,186.1039 +24.235470,189.3653 +24.244918,180.7635 +24.228517,198.0471 +24.234532,192.9108 +24.228831,199.5714 +24.249959,179.4577 +24.229480,205.2282 +24.243769,192.0409 +24.237434,199.5394 +24.230530,207.6086 +24.229824,209.5638 +24.252771,187.8805 +24.251370,190.6151 +24.246133,197.2226 +24.242652,202.1452 +24.247349,201.4716 +24.248649,201.6660 +24.321334,130.4851 +24.322427,195.0949 +24.322734,195.2258 +24.324374,195.2007 +24.336199,183.7998 +24.353552,169.8797 +24.326837,197.4571 +24.340682,184.5333 +24.331169,195.0236 +24.323336,203.8403 +24.352023,182.3037 +24.343186,192.2959 +24.329319,207.3643 +24.324667,213.2073 +24.328442,210.7061 +24.324958,215.4683 +24.347782,194.0010 +24.330211,212.9278 +24.332188,212.3620 +24.339501,206.5018 +24.341903,205.6556 +24.350583,198.5308 +24.349162,203.8190 +24.337289,217.3266 +24.419778,196.4674 +24.420695,196.1130 +24.424836,192.5837 +24.448822,173.9127 +24.338354,285.6095 +24.429418,195.8511 +24.422519,204.0554 +24.438140,189.8287 +24.450316,179.0574 +24.451820,184.0109 +24.435811,201.4229 +24.426565,212.1263 +24.421858,218.3082 +24.439389,202.2771 +24.444798,198.4465 +24.327609,317.2396 +24.422191,224.3382 +24.427444,226.3651 +24.443356,212.2267 +24.436975,220.4089 +24.425683,288.0089 +24.517523,203.8055 +24.517960,204.9425 +24.523433,201.0851 +24.552982,173.2060 +24.434709,293.1205 +24.428403,301.1371 +24.525217,206.1043 +24.537876,195.2261 +24.554616,180.3206 +24.536684,205.9346 +24.547560,197.0175 +24.519999,226.4974 +24.546004,202.4773 +24.540427,210.0766 +24.440653,311.9506 +24.535484,219.2240 +24.524295,291.8204 +24.616247,201.7152 +24.616808,203.0647 +24.635832,185.9836 +24.527178,303.4042 +24.640168,192.4409 +24.626576,208.0942 +24.543140,293.6439 +24.441987,396.9253 +24.622736,218.3551 +24.534328,308.9601 +24.644850,275.9865 +24.549115,373.6472 +24.721330,203.4010 +24.722904,203.8468 +24.724519,204.3088 +24.637235,293.6759 +24.638692,294.3664 +24.733103,202.1347 +24.643246,294.1960 +24.539150,400.5282 +24.746498,267.5612 +24.541785,474.2872 +24.817964,200.1549 +24.819875,200.2800 +24.629375,392.8920 +24.627970,396.4141 +24.734938,291.6060 +24.832610,196.1436 +24.726189,377.4780 +24.731322,374.2776 +24.713693,393.8625 +24.924733,184.7660 +24.926752,192.1618 +24.928830,192.1829 +24.816118,307.0628 +24.653810,471.4829 +24.617421,510.0511 +24.843289,354.5263 +24.933071,266.5638 +24.937443,263.9541 +25.014067,189.1243 +25.018121,186.9296 +25.020156,186.7520 +24.727831,480.9909 +24.742620,468.1719 +24.834671,378.1505 +25.022269,198.7523 +24.748483,538.7229 +24.655585,633.3271 +24.922764,374.9376 +25.103669,195.7951 +25.109500,191.7752 +25.118916,184.2482 +25.121014,184.0170 +24.544551,762.3911 +24.623965,684.9314 +24.830584,480.3386 +24.750506,562.4553 +24.646531,741.5842 +24.625270,764.5502 +24.752605,638.8996 +25.197817,195.4259 +25.205051,189.9571 +25.206910,189.9040 +24.920838,477.8322 +24.657385,743.1724 +25.028755,373.7031 +25.208823,195.5787 +24.821817,584.5948 +24.939679,538.5333 +24.729542,750.2842 +25.287207,194.1972 +25.299466,183.5798 +25.301276,183.4233 +25.303165,183.2455 +25.305032,183.1602 +25.201399,294.3781 +25.026546,471.0808 +24.935240,564.2593 +24.838913,662.5138 +25.221022,282.3520 +24.836785,736.5967 +25.125294,449.5903 +25.016073,560.3392 +25.388117,189.8790 +25.393244,186.3668 +25.395010,186.2797 +25.396815,186.1434 +25.105602,479.0849 +25.306944,285.1756 +25.288913,305.0287 +25.297703,298.0667 +24.641667,955.9873 +25.404403,195.2118 +25.402460,263.1352 +25.389822,277.2282 +25.478214,190.3308 +25.483047,192.3686 +25.484701,192.2830 +25.486412,192.1512 +25.488193,191.9865 +25.308897,372.9587 +25.212823,470.7047 +25.210794,480.3524 +25.499501,193.3628 +24.841093,853.5160 +25.024385,672.0047 +25.400558,297.6688 +25.123182,635.9936 +25.310923,454.7017 +25.573383,193.6949 +25.577997,190.5505 +25.579613,190.4706 +25.581291,190.3092 +25.582959,190.2479 +25.391506,383.3049 +24.754709,1027.1503 +24.744579,1038.9838 +25.481406,303.8633 +25.406413,380.5922 +25.127473,661.3548 +25.199636,591.0088 +24.526193,1266.3244 +25.501428,357.9747 +25.665597,195.2119 +25.668547,193.6643 +25.675417,188.2698 +25.676986,188.1738 +25.678564,188.1191 +25.680181,188.1000 +25.312962,563.9828 +25.595771,282.8901 +25.107557,772.7986 +25.597656,284.4019 +25.203193,680.5871 +25.503375,382.1642 +25.495779,391.6060 +25.698229,190.9969 +25.691148,260.2841 +25.759176,193.4093 +25.767080,186.8185 +25.768549,186.6947 +25.770085,190.6058 +25.771601,190.4951 +25.773209,190.2675 +25.497628,467.2990 +25.683529,282.8582 +25.781861,191.2287 +25.692865,281.5950 +25.765627,210.2422 +25.681857,295.4654 +25.398672,580.1450 +24.930912,1049.4769 +25.785270,260.0242 +25.667052,379.6889 +25.859405,187.7225 +25.860810,186.6827 +25.862212,186.4085 +25.863688,185.7577 +25.865160,189.9831 +25.866685,189.4277 +25.868282,188.8228 +25.696391,361.7118 +25.574886,484.2899 +25.878662,181.5799 +25.592121,469.2680 +25.876947,185.6268 +24.519575,1544.2211 +25.783564,284.9220 +25.889227,180.5171 +25.882059,188.9293 +25.479828,592.5053 +25.576414,562.5969 +25.951433,188.9207 +25.952587,188.0676 +25.953900,187.0276 +25.955245,187.1837 +25.960692,181.9909 +25.962098,180.8383 +25.963478,179.7379 +25.584688,558.8174 +25.885541,261.2066 +25.964928,182.6363 +25.975870,172.5226 +25.788829,360.4422 +25.774812,375.3652 +25.593943,557.1903 +25.787006,365.1424 +25.977324,179.3810 +25.599616,558.0708 +25.880357,278.2803 +25.978818,180.8336 +25.980390,180.3257 +25.966388,195.4253 +25.974461,188.5116 +25.887386,276.7600 +25.883781,353.2144 +26.045295,193.0373 +26.047494,191.1298 +26.048621,190.2731 +26.049446,190.9716 +26.055145,185.5473 +26.056113,184.8492 +26.057106,184.1543 +26.047128,194.4393 +26.060243,184.4953 +26.059177,186.3760 +25.792519,453.8513 +25.973091,274.1600 +26.046741,201.4229 +25.790646,458.4617 +26.063797,186.3241 +26.058104,196.2091 +26.070989,184.2804 +26.072334,183.8969 +26.068487,188.7578 +26.069745,188.5691 +26.061390,197.9969 +26.062574,197.9634 +25.694611,569.6746 +26.139012,126.5213 +26.140354,191.7481 +26.140655,192.5983 +26.140928,192.6107 +26.142430,191.6696 +26.142683,192.6668 +26.142937,192.7079 +26.143216,192.7286 +26.156706,179.5360 +26.147565,190.9161 +26.159652,179.6515 +26.152150,187.9545 +26.143506,197.3827 +26.148394,193.3661 +26.164147,178.5405 +26.162974,184.2499 +26.158638,189.5216 +26.160717,188.3262 +26.151134,198.8745 +26.150178,200.8582 +26.157688,194.3717 +26.146749,206.4311 +26.149272,205.0310 +26.161815,196.0862 +26.236997,122.1831 +26.238333,188.7843 +26.238624,189.6497 +26.238895,189.6730 +26.240419,188.7532 +26.240692,189.6656 +26.240963,189.6694 +26.241261,189.6457 +26.254314,176.8918 +26.245554,187.6725 +26.257246,176.7148 +26.250123,184.6224 +26.264286,171.2891 +26.246372,190.0336 +26.241567,195.7483 +26.260539,181.2889 +26.256232,186.5177 +26.258315,185.3609 +26.248165,196.4678 +26.247252,198.4046 +26.265534,181.1348 +26.244739,203.0220 +26.259388,189.5089 +26.249109,203.7430 +26.255271,198.8373 +26.332103,123.2680 +26.333254,189.6382 +26.333539,190.4404 +26.334100,190.1851 +26.335351,190.1773 +26.335645,190.1435 +26.335945,190.1006 +26.347225,179.1018 +26.339305,188.4322 +26.350010,178.0616 +26.349044,179.5504 +26.336243,193.1369 +26.340105,190.1416 +26.348161,185.7079 +26.341761,192.9379 +26.354304,181.2863 +26.359181,177.3468 +26.353181,184.2704 +26.351037,187.4245 +26.352069,190.8642 +26.338483,205.5655 +26.340890,204.2901 +26.342689,203.6886 +26.357902,189.6890 +26.427119,121.7544 +26.428274,189.9096 +26.428569,190.7417 +26.429172,190.4316 +26.430359,189.8030 +26.430633,190.6976 +26.430907,190.6972 +26.441829,180.0502 +26.433962,188.2094 +26.444634,179.1616 +26.443677,180.7513 +26.431207,193.9798 +26.434746,191.2451 +26.442750,184.1215 +26.436406,191.3452 +26.448898,183.4365 +26.454109,179.1712 +26.433228,201.0379 +26.445657,189.5997 +26.446670,189.6455 +26.435576,201.8575 +26.437317,201.2339 +26.452853,186.8859 +26.447762,196.3055 +26.455372,189.9967 +26.522893,123.7649 +26.523980,124.0389 +26.524285,125.1288 +26.525529,191.0181 +26.525789,191.5893 +26.526046,192.3698 +26.533870,184.8525 +26.528072,190.9149 +26.536529,183.4497 +26.535591,184.7753 +26.544049,176.6637 +26.538462,183.3356 +26.534699,187.6180 +26.530248,192.8453 +26.548874,176.9293 +26.547592,178.6135 +26.545181,181.8368 +26.527738,200.2811 +26.528596,200.4797 +26.537452,192.6804 +26.526327,204.9463 +26.529381,203.0400 +26.542934,190.7215 +26.546378,188.5210 +26.618185,119.3274 +26.619311,196.2948 +26.619604,197.3572 +26.620162,197.0999 +26.621331,196.2035 +26.621605,197.4812 +26.632335,187.0335 +26.623796,195.8240 +26.635258,184.6290 +26.627753,192.4290 +26.621879,201.1379 +26.624429,199.3948 +26.639740,184.9142 +26.638551,186.9551 +26.625187,201.2340 +26.622172,205.2166 +26.644069,184.3083 +26.649415,180.0633 +26.636317,196.4873 +26.634267,199.6523 +26.646659,188.4281 +26.626873,209.3691 +26.637435,200.0445 +26.625992,216.3339 +26.645370,198.2904 +26.633281,211.7603 +26.648021,198.4053 +26.716548,131.3301 +26.717379,131.9626 +26.718443,197.4067 +26.721798,195.1957 +26.737514,179.8754 +26.720713,197.9960 +26.726206,192.8986 +26.725804,193.7272 +26.731274,193.2367 +26.719979,205.5064 +26.718723,207.7585 +26.720367,207.1636 +26.730134,198.4505 +26.733656,196.0663 +26.718988,211.8988 +26.727019,205.0930 +26.728020,209.4441 +26.722318,216.4635 +26.723094,217.0082 +26.732422,209.0603 +26.729076,213.7961 +26.734900,209.4179 +26.815607,130.2012 +26.816962,197.6921 +26.817263,199.2762 +26.817535,199.4071 +26.819087,198.2523 +26.832806,186.9143 +26.849342,171.2947 +26.820182,201.4192 +26.837481,190.7346 +26.826422,202.7565 +26.819887,210.2346 +26.825508,205.6322 +26.836243,195.9628 +26.823825,209.4883 +26.835088,199.3858 +26.846427,189.2174 +26.827389,209.5084 +26.823018,215.1390 +26.843662,195.8383 +26.845043,200.3076 +26.829480,217.2829 +26.819369,228.8027 +26.819620,230.0264 +26.828378,222.7660 +26.915851,196.8287 +26.918710,195.7979 +26.937465,177.5062 +26.824655,290.8100 +26.941483,177.8099 +26.927532,192.8357 +26.919105,202.3381 +26.847879,274.7004 +26.924513,206.7075 +26.926483,205.9675 +26.916995,216.7555 +26.925486,209.5558 +26.944319,192.1262 +26.842327,295.5069 +26.919532,219.7863 +26.917390,223.4002 +26.940103,202.2448 +26.945810,198.1085 +26.930887,214.6619 +26.929724,281.2261 +27.014655,196.8404 +27.016539,195.4553 +27.016943,199.5101 +27.017340,200.4254 +27.020638,198.4184 +27.045351,175.0915 +26.932113,289.6869 +27.049648,179.2902 +27.032207,198.1595 +26.938783,292.9948 +27.028216,205.0777 +26.942874,291.9016 +27.046764,189.5972 +27.039501,198.4404 +27.019721,219.8655 +27.021602,226.0791 +27.051146,198.2025 +27.036899,214.0731 +27.038158,214.4945 +27.029180,225.2276 +27.112680,200.3942 +27.119294,195.3119 +27.030123,286.0478 +27.122581,195.1375 +27.035645,283.6796 +27.132452,188.5450 +27.114508,208.1703 +27.131222,198.5842 +27.142349,189.2401 +27.114972,218.4147 +27.140791,194.4227 +27.135044,202.0731 +27.120369,218.6476 +26.833920,507.0498 +27.115466,298.0160 +27.211496,203.6779 +27.211995,204.9277 +27.216454,202.2288 +27.217766,202.7144 +27.219058,203.2948 +27.247682,176.5462 +27.210951,215.1986 +27.139319,295.8604 +27.137835,299.3957 +27.234777,204.5252 +27.249349,192.0614 +27.250973,192.6082 +27.121445,387.8274 +27.231779,279.2263 +27.313077,199.7192 +26.928585,586.0589 +27.237943,278.5411 +27.320998,197.3615 +27.145550,380.1870 +27.319326,208.3755 +27.333388,196.2755 +27.221801,379.6148 +27.220444,382.7652 +27.136447,468.5757 +27.415175,198.5002 +27.416924,198.6225 +27.418684,198.7277 +27.420482,198.8616 +27.422354,198.9680 +27.048173,575.1117 +27.331591,293.7111 +27.143919,483.4618 +27.424230,205.2680 +27.228939,402.7213 +27.443583,258.7995 +27.317721,386.4652 +27.512797,193.2078 +27.316173,391.6665 +27.426151,283.5513 +27.033314,678.3102 +27.252654,460.9383 +27.329807,385.7860 +27.254408,463.2124 +27.322680,469.6821 +27.233295,560.8195 +27.613677,182.2443 +27.615548,182.1609 +27.617414,189.0575 +27.619345,189.0516 +27.621323,189.0328 +27.518361,293.9893 +27.413484,400.9151 +27.034475,781.9794 +27.435181,383.3785 +27.516485,373.9844 +27.603211,288.9296 +27.314608,579.2280 +27.702384,193.1587 +27.706006,191.2916 +27.335215,563.8947 +27.441412,459.5145 +27.715594,187.2016 +27.133752,770.9888 +27.230368,676.3178 +27.239587,743.6910 +27.339018,645.9710 +27.792364,194.3312 +27.795923,192.5038 +27.797710,192.5013 +27.806473,185.5744 +27.808398,185.4844 +27.810357,190.7517 +27.717622,285.3919 +27.704188,300.7860 +27.439303,567.6346 +27.709703,299.2320 +27.337118,673.8622 +27.818561,260.0848 +27.340972,739.3724 +27.631662,450.3603 +27.890472,193.2741 +27.897299,188.2308 +27.525739,561.5818 +27.812352,276.7955 +27.906687,184.3343 +27.711627,385.9079 +27.509274,590.1949 +27.713593,387.8324 +27.895544,276.0461 +27.437233,736.0594 +27.983280,191.7259 +27.988428,188.3844 +27.990213,188.3999 +27.992049,188.3959 +27.993884,195.0842 +28.001111,189.7693 +27.814400,378.4392 +27.816456,378.3660 +28.010982,185.8443 +27.707841,491.0397 +27.527703,673.2763 +27.601418,663.7596 +27.236362,1030.5370 +28.083748,184.8472 +28.085531,184.8052 +27.031141,1246.7459 +27.629499,650.2563 +27.529665,751.9475 +28.097536,185.9584 +28.089149,196.3001 +27.794117,493.3312 +28.078648,279.6591 +27.900928,458.9398 +28.171593,189.8763 +28.175008,188.1306 +28.176814,188.0059 +28.178614,187.9244 +28.180446,194.3932 +28.188970,187.7148 +28.190882,187.6747 +27.902797,477.6230 +28.087322,295.0203 +28.200981,183.3343 +28.192841,193.4914 +28.091022,297.3456 +27.627382,823.9364 +27.892142,560.6777 +28.265179,189.1884 +28.268596,187.2903 +28.270338,187.1518 +28.080346,378.7516 +27.893837,571.8634 +28.082024,385.3775 +28.281614,187.4718 +28.003015,467.8188 +28.194824,277.8241 +28.266900,207.5712 +28.277888,276.1550 +28.008936,546.8723 +28.358309,199.3091 +28.361470,197.9337 +28.363141,198.1108 +28.364822,198.3181 +28.366540,198.5530 +28.374842,192.1904 +28.376686,192.3413 +28.378557,192.5433 +27.899111,674.1157 +28.287449,294.9792 +28.388368,196.2856 +28.380422,206.4943 +28.198882,390.3173 +28.283496,308.0586 +28.386334,265.8645 +27.511007,1143.3580 +28.451321,287.9602 +28.454369,286.8005 +28.455888,287.2117 +28.457491,287.5357 +28.173294,573.7007 +28.279757,469.2690 +28.569028,182.0846 +28.571102,187.9331 +28.452821,308.4257 +28.555810,207.7032 +28.474473,364.0603 +28.584655,255.8373 +27.605024,1237.4163 +28.101427,742.9703 +28.582430,263.9524 +28.469087,379.3592 +27.904742,945.8154 +28.465702,386.9782 +28.554045,380.2412 +28.557619,378.6350 +28.384317,553.9123 +28.743101,197.1315 +28.745028,197.2607 +27.625303,1319.0980 +28.382344,564.1740 +28.591556,357.1255 +28.563142,387.7429 +28.467403,555.1359 +28.573228,451.4035 +28.589201,437.5178 +28.838535,190.4595 +28.565094,466.0749 +28.285450,747.9350 +28.848447,187.1996 +28.840494,197.4242 +28.559406,550.1981 +28.196827,914.9830 +28.586917,527.1070 +28.942290,173.9337 +28.470836,647.6418 +28.844399,276.3690 +28.761248,361.8883 +28.936256,263.2442 +28.459098,742.5852 +29.022542,181.3297 +28.763515,442.5930 +28.746995,462.6758 +28.741171,470.7638 +28.567033,724.7542 +28.654367,639.5914 +29.109606,186.5584 +29.116225,182.1246 +28.938232,362.3850 +28.749027,553.9007 +29.033386,271.8703 +28.739283,632.7595 +28.852682,521.5609 +29.199502,184.0514 +29.114026,271.7768 +28.934289,453.7970 +28.004976,1385.3910 +29.111813,355.4512 +27.623286,1846.0983 +28.652200,819.3465 +29.291789,181.9244 +29.298351,177.5605 +29.203873,274.2989 +29.206110,274.3596 +29.118480,435.3719 +28.561253,994.7375 +29.300618,257.5135 +29.383555,176.7277 +28.099471,1463.0138 +28.359869,1211.5494 +29.211936,361.7356 +29.293960,345.8499 +27.986697,1664.6877 +29.201685,451.8757 +29.467266,188.4796 +29.475914,182.0890 +29.388087,272.1907 +29.026721,635.8259 +28.946519,718.3484 +28.751114,982.5745 +29.302929,432.9208 +29.553853,184.2011 +29.471548,268.7463 +29.469386,273.1946 +29.305258,439.6269 +28.950886,881.3115 +29.480471,353.7811 +29.562486,273.8293 +29.655747,182.6679 +29.658004,182.5295 +29.037920,804.7953 +29.639812,205.1260 +28.006939,1907.4881 +29.035648,880.7662 +29.651386,267.0202 +29.733690,186.7725 +29.738056,184.5226 +29.024633,907.5164 +27.984991,1949.3308 +29.031170,905.3692 +29.735852,202.9529 +28.846384,1155.5804 +28.850559,1162.4069 +29.660279,354.7889 +29.832199,184.9615 +29.840534,178.7746 +28.842442,1179.0281 +29.664869,358.8146 +29.372044,653.8952 +28.940234,1160.4741 +29.478174,624.5922 +29.653563,451.2800 +29.914430,192.4673 +29.922580,186.4492 +29.662548,448.6585 +29.558133,555.2649 +28.472649,1642.9865 +29.740296,447.0920 +27.514646,2674.7426 +28.759037,1432.3476 +30.017163,176.2519 +30.019311,176.1939 +29.742582,455.0280 +29.573673,626.1195 +29.385804,816.1940 +29.390368,880.7619 +30.023685,249.4366 +29.120770,1154.3468 +30.100710,176.4134 +30.106899,180.7659 +30.109030,180.8091 +29.374245,917.8085 +29.916416,377.8219 +29.123138,1173.3348 +28.948683,1421.7308 +29.920465,451.8192 +29.473715,900.4713 +30.187390,188.7207 +30.193416,192.3067 +30.195506,192.2682 +29.296166,1093.6613 +30.025941,365.9881 +29.838417,555.6318 +30.189389,206.8346 +30.021471,439.2765 +29.209672,1252.9346 +30.271132,193.3452 +30.277125,189.2368 +30.287666,187.2367 +30.289842,187.0483 +29.744886,734.0040 +29.918408,562.5199 +30.111208,371.8104 +29.842717,642.4326 +30.001966,548.2739 +28.944403,1616.9121 +30.012968,550.2409 +30.370416,194.6874 +30.376112,190.9184 +30.385724,183.3008 +30.387776,183.2995 +30.102768,470.3467 +30.197611,377.5932 +30.292055,285.2507 +30.104844,474.6488 +29.836317,805.5504 +30.372286,271.4665 +30.460749,184.8649 +30.466364,181.1592 +30.474906,181.0765 +30.476892,181.1291 +29.936541,723.5171 +30.199793,462.3583 +29.938806,725.4756 +30.478892,187.5774 +30.273124,463.0785 +29.560285,1177.7002 +30.550242,189.5831 +30.565105,176.5209 +30.567032,176.4574 +30.569026,176.3602 +30.571077,176.2584 +30.396225,353.0952 +29.932150,819.1799 +30.394050,365.0968 +30.563210,198.0609 +30.483020,335.7363 +30.575206,245.3069 +30.641869,180.3460 +30.645616,178.3565 +30.647525,184.7745 +30.655984,178.1946 +30.658023,178.0513 +30.294240,543.7723 +30.462609,377.4157 +30.464479,377.5589 +30.660060,184.0452 +30.666470,241.6537 +29.571421,1338.3186 +29.934323,977.0615 +30.736205,176.8852 +30.741628,173.1854 +30.743490,178.5656 +30.745388,178.4754 +30.747337,178.4623 +30.113399,814.2576 +29.028996,1900.5478 +29.834253,1097.2270 +30.759148,174.3104 +30.389829,608.1937 +30.480929,518.6541 +30.749322,251.8605 +30.818759,183.9668 +30.822216,182.1381 +30.823974,182.0367 +30.832301,180.9547 +30.834180,180.7957 +30.836076,180.6801 +30.296475,722.0870 +30.579494,440.9002 +30.015070,1007.2126 +30.374188,650.0288 +29.844939,1186.5107 +30.737987,350.4400 +29.555992,1534.0993 +30.908126,183.5644 +30.913091,186.6387 +30.914815,186.5990 +30.922058,181.0898 +30.923865,181.0660 +30.925801,180.9173 +30.739827,368.7319 +30.751332,359.1073 +30.485151,627.2467 +30.927657,186.6842 +30.933460,182.8923 +30.909741,214.0621 +30.191386,988.4715 +30.115637,1065.9144 +30.998025,191.7956 +31.006012,185.5213 +31.013257,180.0326 +31.014977,180.0581 +31.016757,180.0986 +30.929545,269.1826 +30.838013,362.6274 +30.842040,360.5635 +31.018563,186.0872 +30.275118,931.5238 +30.391930,877.9051 +31.024218,254.1236 +31.091691,188.3467 +31.099732,182.0058 +31.101415,182.0596 +31.103149,182.1058 +31.104933,182.1000 +31.106719,182.1604 +31.022284,268.4865 +30.643754,648.9575 +31.116353,178.3032 +31.031451,265.2106 +31.114343,189.7093 +31.002727,359.9014 +30.840026,524.2195 +31.189822,181.8135 +31.191536,181.7869 +31.193291,181.6876 +31.195037,181.6780 +31.196857,181.6260 +30.820514,559.7466 +31.020396,361.7084 +30.761273,627.0965 +31.088430,301.7702 +31.200642,191.4323 +31.204652,249.5456 +31.202604,257.6299 +31.269837,191.8215 +31.280040,183.0920 +31.281740,182.8684 +31.283476,182.6644 +31.285257,189.0809 +31.287034,188.9217 +31.288881,188.6873 +31.090093,389.1389 +31.110440,370.5112 +30.844106,638.5888 +30.931481,553.0062 +31.296664,189.6593 +31.001184,487.0067 +31.179859,368.5848 +31.004356,549.2490 +31.362630,192.3296 +31.371637,184.6890 +31.373324,184.4244 +31.374981,184.2064 +31.376716,183.9496 +31.378485,183.7279 +31.123805,444.3130 +30.662153,907.4862 +31.290771,280.4202 +31.380262,192.5391 +30.561317,1013.1370 +31.304054,272.1004 +30.573116,1010.3625 +31.294658,290.3559 +31.364248,278.6461 +31.454199,190.8364 +31.461659,184.5640 +31.463133,184.1969 +31.464617,183.8513 +31.466142,183.5053 +31.474340,181.4400 +31.475957,181.0744 +31.477570,180.7424 +30.911386,748.2445 +31.382106,285.1506 +31.486324,182.1464 +31.181553,488.1743 +31.484489,186.5153 +31.278343,394.0257 +31.198729,475.0029 +30.999585,675.5705 +31.292713,383.8746 +30.577307,1155.4337 +31.548445,185.3549 +31.554961,179.1431 +31.556328,179.0746 +31.557750,177.9460 +31.559189,176.7980 +31.560667,176.0354 +31.562214,176.4799 +31.583480,156.0038 +31.488192,252.1231 +31.571193,169.9555 +31.390201,351.8393 +31.112398,633.2818 +31.460236,286.2667 +31.569640,177.7422 +30.664283,1084.0024 +31.206643,542.5936 +31.479233,271.0204 +31.574455,178.8327 +31.585015,169.3348 +31.576155,245.1713 +31.642894,179.7941 +31.645037,177.9687 +31.646225,177.0687 +31.647331,177.4605 +31.648469,176.6072 +31.649648,175.7381 +31.655781,169.9124 +31.657032,168.9874 +31.658313,170.9611 +31.388371,441.7686 +31.482696,348.2900 +30.202000,1629.9237 +31.669728,163.1471 +31.668472,165.4161 +31.676589,158.3908 +31.659632,176.4245 +31.667258,174.4649 +31.568119,274.6081 +31.675157,168.5834 +31.392076,452.7430 +31.673733,172.1592 +31.671005,176.0891 +31.672370,179.7004 +31.480953,372.2682 +31.553606,300.8187 +31.572802,282.8171 +31.108560,748.3433 +31.732741,125.4479 +31.733800,180.7025 +31.734105,181.4584 +31.735403,180.4407 +31.735696,181.4724 +31.735987,181.4549 +31.736703,181.0087 +31.738695,179.2849 +31.753289,167.0465 +31.741149,179.9097 +31.740316,181.5151 +31.748286,174.3315 +31.747384,176.0711 +31.749238,177.8169 +31.746504,181.3267 +31.742042,186.6050 +31.745681,183.8378 +31.739485,190.9046 +31.750254,181.0766 +31.754351,180.3318 +31.821328,114.3759 +31.822689,180.7872 +31.823006,181.8095 +31.823294,181.8271 +31.824792,180.6059 +31.825077,181.7622 +31.825387,181.7359 +31.825694,181.7014 +31.826020,181.6608 +31.829275,178.7089 +31.852072,158.8786 +31.831925,179.8376 +31.855620,156.9424 +31.841724,171.7051 +31.856904,157.4537 +31.845894,169.3856 +31.833889,182.4178 +31.830140,187.2023 +31.854426,168.1530 +31.858190,165.3329 +31.842728,181.7628 +31.853222,172.2351 +31.834981,191.5331 +31.836058,191.5116 +31.832876,200.0088 +31.843742,190.3644 +31.844820,190.4881 +31.847095,189.5139 +31.830987,206.9060 +31.914504,124.7596 +31.915564,181.1004 +31.915844,181.8933 +31.917169,180.8499 +31.917442,181.8481 +31.917712,182.2129 +31.917980,182.2286 +31.927056,173.4246 +31.921832,180.5267 +31.929520,173.5677 +31.928648,175.2037 +31.935705,168.9465 +31.923456,182.0406 +31.921060,188.0224 +31.920336,189.5562 +31.934684,176.0760 +31.931332,180.3533 +31.930390,182.2189 +31.922619,190.9918 +31.927831,189.0975 +32.003478,114.5164 +32.004816,181.0740 +32.005121,181.9236 +32.005398,181.9746 +32.006840,181.1066 +32.007123,182.0263 +32.007396,182.0406 +32.007682,182.0238 +32.007984,182.0066 +32.022580,170.2781 +32.012564,181.0415 +32.025458,168.9458 +32.017343,177.8431 +32.034107,161.9340 +32.013430,183.5271 +32.032886,168.8273 +32.010952,191.5895 +32.014359,189.0730 +32.016308,188.0493 +32.035309,169.9697 +32.011763,194.5185 +32.026515,180.7879 +32.024492,183.8868 +32.015281,198.5837 +32.037895,177.1627 +32.027571,188.7394 +32.039264,178.2826 +32.023524,195.3633 +32.036610,183.6365 +32.096665,125.0102 +32.097738,182.5345 +32.098020,182.5676 +32.099291,181.5663 +32.099925,182.4102 +32.100209,182.3852 +32.109083,173.7653 +32.103089,180.0323 +32.111687,171.7199 +32.110761,176.0040 +32.117995,169.5422 +32.113612,174.7557 +32.109894,179.3468 +32.105497,184.6187 +32.103852,187.2052 +32.100481,191.6120 +32.102360,193.0843 +32.112611,183.8966 +32.116930,180.6106 +32.104652,193.9847 +32.185891,113.8744 +32.187045,182.5881 +32.187373,183.4219 +32.187947,183.1538 +32.189150,182.5307 +32.189437,184.0336 +32.189706,184.0562 +32.189992,184.0594 +32.201715,172.6521 +32.194405,182.5116 +32.204358,173.3009 +32.203433,175.0018 +32.192860,186.3971 +32.206283,173.8417 +32.202543,178.4602 +32.221677,165.5526 +32.217548,170.6418 +32.195187,193.9231 +32.215058,175.0380 +32.205280,185.8155 +32.196959,195.1961 +32.196042,197.2069 +32.220248,174.1256 +32.213866,181.7246 +32.208380,188.4240 +32.207304,190.8133 +32.193606,205.8090 +32.216311,187.0605 +32.218889,185.8855 +32.280274,182.8986 +32.280588,184.7370 +32.280858,184.7634 +32.282336,186.0628 +32.282595,186.2958 +32.295446,174.0428 +32.283407,186.7212 +32.298638,172.1697 +32.290117,181.3724 +32.299767,172.4825 +32.288368,184.6854 +32.283121,190.7683 +32.291059,183.7465 +32.286766,188.9988 +32.282849,193.8809 +32.289242,191.1177 +32.292094,189.3502 +32.287538,195.0339 +32.296508,187.2253 +32.297542,187.3889 +32.369634,117.6377 +32.370796,182.5359 +32.371101,183.3811 +32.371681,183.0895 +32.373471,181.9063 +32.373763,182.8512 +32.374052,182.8523 +32.387230,169.9723 +32.377660,179.8461 +32.390097,170.9886 +32.389112,172.7191 +32.395592,166.9801 +32.378436,184.9468 +32.388191,176.0615 +32.376918,188.2109 +32.394375,171.7033 +32.381004,189.6628 +32.392156,179.5320 +32.391097,181.5702 +32.380126,193.5987 +32.379258,195.5282 +32.403373,172.5423 +32.398119,178.9644 +32.374367,203.9540 +32.393250,189.7622 +32.399417,184.9543 +32.404776,180.9376 +32.396805,190.3123 +32.463174,125.3805 +32.465326,183.0658 +32.465622,184.1349 +32.468400,181.7746 +32.468892,182.4947 +32.487273,164.5042 +32.470808,184.5577 +32.473055,182.7009 +32.470129,186.0183 +32.480360,176.4531 +32.472250,185.5053 +32.481445,177.3107 +32.476731,183.0332 +32.471490,189.3539 +32.484932,177.0103 +32.469489,193.6562 +32.482574,185.8526 +32.474806,194.8275 +32.483735,187.1762 +32.473891,198.2954 +32.475766,197.7837 +32.553333,121.5747 +32.554483,190.0033 +32.554771,190.8164 +32.555378,190.4962 +32.556614,190.4580 +32.556904,190.4527 +32.570668,176.9561 +32.561087,186.8179 +32.573725,175.6055 +32.565130,184.5294 +32.557203,193.0833 +32.561832,189.2423 +32.562573,189.3426 +32.577084,177.9303 +32.566079,189.7835 +32.557507,199.2738 +32.583014,174.7419 +32.588555,170.1648 +32.574788,188.8548 +32.563384,201.3559 +32.571689,194.1630 +32.587119,179.9034 +32.578323,189.9101 +32.564254,271.6547 +32.648392,188.6609 +32.649757,187.5966 +32.650175,187.7285 +32.651387,187.7700 +32.668428,171.0186 +32.572668,267.0471 +32.672187,167.8115 +32.657757,183.9966 +32.673551,168.8513 +32.663147,180.0190 +32.655756,188.2116 +32.651778,193.0545 +32.658757,186.9502 +32.674909,175.3101 +32.584372,266.8471 +32.659765,192.4784 +32.660845,192.4186 +32.575917,278.4672 +32.656815,198.6702 +32.655366,201.3111 +32.670912,186.9772 +32.585715,277.5170 +32.669635,194.9719 +32.661943,204.0074 +32.656148,211.2397 +32.744487,124.3262 +32.745588,124.7295 +32.745874,125.9940 +32.747073,186.7255 +32.747358,186.9387 +32.755015,179.7328 +32.749331,189.1516 +32.757757,181.8433 +32.756782,183.9653 +32.765853,176.0446 +32.749659,193.4981 +32.755863,194.2580 +32.751075,200.2977 +32.764741,187.9231 +32.768234,185.7304 +32.763644,191.7180 +32.758721,198.0142 +32.747624,210.5900 +32.747905,211.7840 +32.750287,210.9454 +32.751916,215.3974 +32.767023,201.9130 +32.835909,134.7297 +32.837054,190.7578 +32.837354,191.8110 +32.837904,192.6595 +32.839157,197.8016 +32.850220,188.1793 +32.839999,199.9062 +32.853265,188.1401 +32.844833,198.1243 +32.839447,205.0837 +32.841754,204.3953 +32.842403,212.4292 +32.871869,184.5950 +32.845708,212.4308 +32.870319,189.5558 +32.864608,196.9757 +32.854385,208.9696 +32.856679,208.5050 +32.857891,209.1213 +32.851220,273.6132 +32.933799,192.7274 +32.934297,193.9166 +32.950123,179.7965 +32.863233,274.2577 +32.939601,199.6935 +32.956736,184.3851 +32.843167,299.7613 +32.951374,193.3957 +32.967315,179.3630 +32.868815,279.8570 +32.943159,207.4871 +32.961234,261.0105 +32.953966,269.9937 +33.027813,197.9308 +33.029166,198.4069 +33.030565,198.8924 +33.036960,194.3664 +32.952665,280.5724 +32.839716,395.4788 +33.044531,192.6989 +32.970640,268.6211 +32.855486,391.6663 +32.867389,381.8963 +32.843969,464.2954 +33.065185,251.7226 +33.126528,192.2175 +33.128215,192.4160 +32.959691,362.8937 +32.958216,366.2832 +33.056465,270.0052 +33.141122,187.3621 +33.039907,290.6381 +33.041406,360.9765 +32.940748,463.4280 +33.059876,346.1262 +33.225745,182.1297 +33.227574,182.2280 +33.229458,182.2742 +33.231328,182.3780 +32.968937,446.8015 +33.038401,379.3845 +32.955363,464.5039 +32.865951,562.7370 +33.139296,354.4289 +32.934748,560.7225 +33.223961,273.2495 +33.318747,180.2636 +33.320633,180.2164 +33.222246,280.4750 +33.046150,458.4783 +33.330546,176.0319 +33.142930,365.6793 +33.146679,428.1743 +33.129921,452.4448 +33.144771,439.2534 +33.402384,183.3503 +33.407876,179.6144 +33.409805,179.4830 +33.411734,179.3936 +33.413708,179.3023 +33.150648,444.3008 +33.326473,276.4487 +33.235196,369.7616 +33.061585,545.3587 +33.148673,522.4468 +33.124835,547.9885 +32.941899,732.6322 +33.493727,182.5585 +33.499012,179.0960 +33.500850,184.7113 +33.233239,454.1652 +33.063356,625.8962 +33.316909,374.2796 +33.502722,190.3993 +33.508610,186.5062 +33.308266,457.3129 +33.322586,444.7027 +33.574855,194.0902 +33.587492,183.1779 +33.589290,183.1778 +33.591129,183.1247 +33.593012,183.0708 +33.406003,371.9851 +33.042958,736.9679 +33.585736,196.1551 +33.604959,178.9485 +33.324501,466.5875 +33.584026,271.4729 +33.054834,802.3642 +33.671121,187.7966 +33.676288,184.4068 +33.678110,184.3773 +33.685564,178.7488 +33.602924,263.2752 +33.417787,450.3576 +33.695118,179.7441 +33.687406,189.4160 +33.693123,185.7046 +33.237232,707.3105 +33.404178,541.9948 +33.765581,182.2537 +33.770672,178.9001 +33.772470,178.8389 +33.774255,178.8580 +33.776084,178.8791 +33.428690,528.2283 +33.582367,382.2236 +33.689254,277.3085 +33.674532,294.0351 +33.058140,912.4505 +33.783909,250.3886 +33.781893,254.0435 +33.855501,182.0350 +33.860696,178.4979 +33.862488,178.4489 +33.864314,178.3535 +32.852244,1192.2028 +33.495472,556.2043 +33.767290,286.2587 +33.137492,917.9526 +33.777990,279.3790 +33.791090,329.1100 +33.067013,1056.9862 +33.944545,180.1548 +33.947836,177.5546 +33.949573,176.5013 +33.951310,175.4771 +33.953115,174.4216 +33.954964,173.3413 +33.419868,709.2381 +33.606945,522.9419 +33.672825,460.0482 +33.966563,167.0839 +33.594950,539.4805 +33.691190,450.5215 +33.239262,903.2396 +33.506579,636.6709 +34.034299,109.6822 +34.039195,105.5382 +34.040938,104.5638 +34.042669,103.6402 +33.857200,289.9432 +33.858918,289.0408 +33.970592,178.2020 +33.504630,645.0194 +33.968569,184.2495 +33.328486,825.7712 +34.053550,101.8172 +33.247154,910.8038 +34.051678,111.1921 +34.120201,44.6928 +34.125391,42.0955 +34.126075,42.4954 +34.126788,45.3550 +34.127537,45.6649 +34.128306,48.9730 +33.956919,223.8700 +34.141713,42.2687 +34.146309,39.5114 +33.779928,407.7197 +34.124000,71.4033 +34.057370,139.2816 +33.946174,258.0275 +34.145503,60.4176 +33.768947,439.1684 +33.874863,337.4495 +34.162871,54.3802 +33.964592,256.3808 +33.878829,347.5574 +34.124700,106.6346 +33.497212,739.9581 +34.173202,65.6244 +34.195404,46.0987 +34.129107,115.4505 +33.868146,381.6512 +33.876824,375.1213 +34.168571,84.5316 +34.164894,94.3038 +34.187648,72.6263 +34.142502,120.8289 +34.237171,28.7902 +34.129888,142.1364 +34.134431,142.4986 +34.132874,147.9638 +34.217251,71.0376 +34.259198,32.0442 +32.938484,1354.3677 +34.147143,150.4948 +34.037538,265.4705 +34.231335,72.6832 +34.272025,35.2236 +34.143981,166.4660 +34.251946,67.4223 +34.291243,29.1384 +34.212314,109.3352 +34.288289,34.9596 +34.244558,80.2679 +34.177280,152.0710 +34.249797,81.8080 +34.154258,180.7657 +34.303009,33.1392 +34.147960,194.9353 +34.152819,194.7295 +34.155368,193.9238 +34.319368,31.5493 +34.320382,31.6744 +34.144734,211.8369 +34.220973,142.2847 +34.329352,36.1137 +34.253103,118.1476 +34.321649,52.9193 +34.180790,194.9031 +34.044448,338.2777 +34.265961,118.1981 +34.205921,181.0343 +34.148794,239.3938 +34.241503,152.3689 +34.363258,32.3216 +34.263332,140.9236 +34.347549,60.3027 +34.055446,355.0501 +33.866200,545.4486 +34.304019,110.3744 +34.185821,232.5264 +34.350918,73.3134 +34.324826,100.9379 +34.260275,169.6362 +34.297638,134.2864 +34.404256,30.5375 +34.356571,79.3975 +34.374569,70.5770 +34.349292,99.2134 +34.172143,277.4618 +34.424232,28.9195 +34.157959,297.5927 +34.371251,88.1353 +34.407852,52.5949 +34.226387,235.5438 +34.435969,29.1145 +34.393872,78.0843 +34.276930,196.1201 +34.445147,29.7244 +34.431925,49.5860 +34.310448,173.1399 +34.395580,93.4405 +34.133648,358.8603 +34.448506,45.9320 +34.474871,24.2457 +34.335024,174.3150 +34.292852,218.6170 +34.342896,171.0921 +34.471957,46.9590 +34.382727,143.6206 +34.434794,93.2139 +34.386956,143.1194 +34.280838,253.6708 +34.307249,228.9881 +34.410497,126.8676 +34.323249,215.2440 +34.384160,160.6785 +34.518917,30.9665 +34.449605,102.9273 +34.489021,70.4166 +34.411649,148.8762 +34.429911,131.7187 +34.365466,198.3383 +34.388188,176.6962 +34.167487,401.2830 +34.492509,83.0282 +34.465084,115.7137 +34.559439,26.9668 +34.561631,25.8353 +34.331606,262.9640 +34.538494,57.2122 +34.204202,393.5453 +34.352057,247.2895 +34.336148,271.1692 +34.459387,149.4257 +34.425765,184.6047 +34.586406,26.1079 +34.587466,28.1916 +34.544839,76.9001 +34.549890,78.2488 +34.580799,48.3821 +34.494438,137.4576 +34.612514,23.0792 +34.414394,228.2715 +34.575537,68.5085 +34.035938,612.6714 +34.599347,51.3123 +34.568770,87.7710 +34.621740,38.0881 +34.453152,208.0073 +34.635594,27.7171 +34.564885,106.3601 +34.530076,143.6778 +34.526348,149.0726 +34.149650,531.7421 +34.460447,223.7579 +34.536237,149.6556 +34.499118,191.7412 +34.607318,88.2041 +34.473051,224.0732 +34.597748,100.5107 +34.208116,497.2976 +34.608813,99.0585 +34.537365,175.0140 +34.648610,66.8086 +34.681392,37.7928 +34.629181,94.9211 +34.697124,28.1806 +34.183982,543.3780 +34.455552,273.3948 +34.705414,26.7592 +34.684206,55.2704 +34.481512,263.2690 +34.375694,375.3605 +34.483588,268.5865 +34.610370,142.9633 +33.415740,1338.7173 +34.673754,85.7816 +34.663312,97.9392 +34.732174,33.8603 +34.143251,629.3337 +34.712379,61.8878 +34.615658,160.8421 +33.249287,1530.0365 +34.751055,29.3595 +34.727360,57.5777 +34.650660,143.2218 +34.418348,377.2693 +34.552533,245.5457 +34.534509,268.4103 +34.759536,49.4746 +34.719186,93.4896 +34.461931,354.5045 +34.671246,146.5358 +34.728947,92.1386 +34.511470,313.5169 +34.509340,322.4521 +34.695523,137.8241 +34.774267,61.3247 +34.761251,76.8590 +34.563805,283.1454 +34.779324,70.6284 +34.752175,101.4917 +34.739477,118.4381 +34.766035,92.9624 +34.513988,347.3473 +34.631897,230.5017 +34.628139,237.3794 +34.707872,160.3245 +34.795618,80.0359 +34.196652,680.2249 +34.821086,64.0901 +34.831792,57.3504 +34.661160,229.9989 +34.780415,111.7927 +34.724103,169.1320 +34.675421,219.9843 +34.868197,30.0687 +34.753334,146.4920 +34.809011,92.4410 +34.793882,116.2944 +34.833347,84.3522 +34.772585,146.4183 +34.594570,326.0504 +34.685894,236.7373 +34.838111,86.7189 +34.528008,397.9373 +34.861336,67.7798 +34.754458,175.8158 +34.812676,125.7107 +34.698259,246.2682 +34.920621,26.6659 +34.656542,297.7195 +34.846951,111.0098 +34.560526,399.6882 +34.889143,72.6959 +34.862399,103.4820 +34.924830,44.2456 +34.944528,28.6118 +34.947288,28.9663 +34.865519,116.2106 +34.595707,389.8116 +34.901453,86.8745 +34.929117,63.4981 +34.776501,221.1140 +34.917700,81.0123 +34.973140,29.1627 +34.642666,361.5392 +34.922631,87.2022 +34.893235,118.4642 +34.817782,195.5336 +34.954262,61.1577 +34.895406,127.2352 +34.885177,138.4689 +34.997616,27.0266 +34.891159,137.0656 +34.961840,74.0341 +34.238827,798.1698 +35.009834,28.2446 +34.965881,73.3001 +34.892208,148.6044 +34.876878,169.5418 +34.690859,357.1997 +34.849953,200.2720 +35.022641,30.2810 +34.981730,80.8409 +34.998713,64.8878 +35.035874,30.2719 +34.992615,77.4986 +34.824987,249.6183 +34.938387,140.3958 +34.798080,285.0285 +34.957961,126.7802 +35.013316,73.9719 +35.023646,66.1056 +34.857915,232.9214 +35.062572,32.8394 +34.835593,263.1467 +35.046420,57.1868 +35.078783,30.0782 +34.816436,294.4421 +34.960215,158.6472 +34.659828,462.4872 +35.028225,95.8125 +34.784939,340.4504 +34.925946,203.7419 +35.070114,63.1846 +34.898267,236.2923 +35.015420,123.3949 +34.988328,154.8531 +35.052923,94.2107 +34.930274,217.9185 +34.899827,251.1702 +35.090837,65.3659 +34.644047,519.8432 +34.985519,182.2478 +35.108862,60.8943 +35.063601,107.8895 +35.039182,138.3762 +35.048060,138.5927 +34.725305,465.1872 +35.147134,45.6760 +34.919004,275.4027 +35.098740,99.6688 +35.087288,120.5307 +35.118862,90.1816 +35.095412,116.3013 +35.024643,189.7753 +35.103607,112.4836 +35.110879,108.9944 +35.143181,81.5754 +35.002304,226.2315 +35.004205,227.6159 +34.976255,260.0137 +35.138815,104.5181 +34.858998,386.6391 +35.219874,27.9205 +35.150997,102.7203 +35.186653,70.2350 +35.134559,123.5170 +35.169757,91.1113 +35.236269,31.7448 +35.243334,28.2873 +35.171491,104.8832 +34.969076,309.0216 +35.122316,160.4618 +34.853668,437.3674 +35.074606,217.5049 +34.910177,383.0081 +35.192810,104.9838 +35.083109,216.3540 +35.089752,216.7041 +35.271622,40.1004 +34.744781,569.0261 +35.214419,104.0752 +34.715419,604.6218 +35.256888,64.7550 +35.253718,71.0760 +35.292111,34.6190 +35.268014,67.0405 +35.260868,75.2991 +35.276375,61.4527 +35.228536,114.6319 +35.216091,132.4993 +35.320042,30.0947 +35.324795,28.0377 +35.167767,187.0155 +35.125390,231.5466 +35.313808,47.3855 +35.335055,29.5363 +35.148193,223.1079 +35.336168,36.1882 +35.129689,243.6872 +35.190493,188.1878 +35.133299,252.2344 +34.875655,510.9403 +35.209045,179.0959 +35.361194,29.1010 +35.321644,71.3340 +35.371302,27.0912 +35.318494,81.6639 +35.373376,29.8713 +35.247795,160.7399 +35.207820,206.0724 +35.194407,229.3139 +35.343168,81.6119 +35.299463,126.3795 +35.163890,263.4820 +35.297795,131.1479 +35.398393,32.7052 +35.040813,392.7034 +35.386596,52.2675 +35.306457,133.9101 +35.378682,63.2019 +35.038079,412.2814 +35.124038,327.3162 +35.364592,87.7838 +35.423722,29.6856 +35.424781,29.6772 +35.337828,120.2234 +35.245637,217.2324 +35.385534,78.9136 +35.231822,236.4950 +34.802920,673.1967 +35.050225,427.5311 +35.408535,70.2572 +35.451355,29.6006 +35.452376,35.6957 +35.458052,31.1247 +35.177559,316.6570 +35.468317,31.3031 +35.293185,208.0195 +35.428943,73.3489 +35.356937,149.7821 +35.392978,116.8269 +35.084741,427.8298 +35.291035,226.1364 +35.464448,57.0908 +35.311723,215.8944 +35.282778,246.8844 +35.388141,146.1102 +35.425843,109.5358 +35.258077,278.8157 +35.156204,385.5817 +35.494217,49.1918 +35.454458,93.4007 +35.521540,31.4671 +35.011700,548.1416 +35.502292,59.6918 +35.534252,28.7698 +35.535379,28.6311 +35.354783,210.6629 +35.066146,500.8561 +35.390295,178.8197 +35.489177,87.1733 +35.372357,207.5818 +35.350137,232.5080 +35.403248,182.1233 +35.453408,136.0382 +35.517172,73.3955 +35.564011,27.6096 +35.559842,33.9237 +35.352833,243.9872 +35.512572,88.7838 +35.476117,135.4351 +35.589446,24.5952 +35.198409,419.3950 +35.590568,28.3088 +35.499621,121.0383 +35.478793,149.0325 +35.536893,92.6063 +35.400159,231.4486 +35.527618,110.5655 +35.565446,73.7719 +35.278098,363.7931 +35.585372,60.1396 +35.506719,140.3254 +35.036997,615.9479 +35.541786,112.6765 +35.480956,174.5581 +35.348591,308.0597 +35.561985,100.7460 +35.618877,44.9188 +35.529663,136.3649 +35.614042,55.3263 +35.431099,240.3873 +35.441884,230.6567 +35.645512,30.6811 +35.326731,357.1400 +35.611553,75.5193 +35.638184,51.3050 +35.543409,156.6306 +35.591621,110.5316 +35.450361,253.1150 +35.427373,277.1882 +35.477757,229.4992 +35.663797,48.0993 +35.433517,282.7105 +35.224757,493.0757 +35.647045,76.8495 +35.576351,148.6185 +35.631608,96.0767 +35.676194,59.8006 +35.707257,29.8605 +35.652946,87.2616 +35.711897,30.4883 +35.620660,128.5905 +35.683871,67.8691 +35.601356,151.4024 +35.723895,29.8613 +35.569116,185.7848 +35.724970,33.2521 +35.488072,274.8514 +35.716228,51.7526 +35.702153,67.4191 +35.641892,129.2135 +35.617805,154.3779 +35.211713,565.7600 +35.547859,237.4030 +35.629500,157.4483 +35.654463,134.1661 +35.567003,225.4315 +35.656651,136.8996 +35.769572,29.2899 +35.672541,131.8500 +35.413893,394.7014 +35.751741,59.5856 +35.440367,375.8223 +35.687073,136.0462 +35.793551,30.6317 +35.742385,84.2748 +35.704561,124.2251 +35.762924,71.1599 +35.749251,92.0660 +35.703476,138.8743 +35.811327,36.8454 +35.792435,57.3261 +35.788629,62.7047 +35.671487,184.0082 +35.740208,116.3881 +35.772183,87.4302 +35.563022,299.6414 +35.823120,42.5652 +35.834085,35.0666 +35.639219,230.9681 +35.752759,120.9649 +35.593766,284.3557 +35.786949,93.7404 +35.735995,150.6081 +35.553007,335.2010 +35.828787,66.3035 +35.717833,179.5228 +35.758222,140.7951 +35.873724,29.1877 +35.727685,180.9984 +35.655515,256.3469 +35.849762,64.7643 +35.804392,115.0337 +35.627826,292.6307 +35.798863,126.0746 +35.689489,237.4946 +35.700040,228.7037 +35.771106,159.9401 +35.855496,78.8147 +35.908684,27.9810 +35.662732,280.8393 +35.669369,287.4783 +35.934311,25.2152 +35.888209,72.6318 +35.911862,51.1647 +35.579939,384.7161 +35.816190,152.0453 +35.754901,216.1127 +35.596820,380.0658 +35.880690,102.9623 +35.956848,28.6773 +35.897357,95.0327 +35.438864,556.5664 +35.960841,38.1065 +35.808594,192.9638 +35.462870,542.2071 +35.582645,423.5245 +35.870187,138.9715 +35.859614,154.8420 +35.848173,170.9934 +35.767981,252.7047 +35.826661,196.0511 +35.865685,160.7689 +36.001559,28.8982 +35.509806,529.6428 +35.902913,138.0953 +35.785263,261.2437 +35.777474,271.1861 +35.983653,66.7375 +35.995431,57.0498 +36.026455,29.2869 +36.005078,55.2104 +35.963027,101.8767 +35.931046,135.3877 +35.851335,216.1309 +35.856596,216.2797 +35.753757,320.1261 +35.998948,82.8907 +36.009159,74.2156 +35.943571,140.8598 +36.022712,63.2669 +36.006170,85.7030 +36.055742,37.1812 +35.924938,170.1725 +36.064905,31.9044 +35.985526,113.7713 +36.072877,30.6836 +36.019167,85.4673 +35.878122,236.2592 +35.976887,139.4983 +35.501205,617.8971 +35.968236,152.2299 +36.083375,42.2319 +36.060289,68.5443 +35.914526,217.9592 +36.084432,49.8396 +36.091874,50.4120 +35.666028,481.8314 +35.869152,279.7910 +36.125608,26.5418 +36.067466,94.0801 +36.096810,66.7613 +35.824183,342.4840 +35.959527,208.7734 +36.128834,43.8059 +36.147860,25.8222 +36.048661,126.1129 +35.841317,336.2409 +36.041008,142.7313 +36.085980,101.3886 +36.030457,158.5103 +36.095111,95.8473 +35.862664,335.7981 +36.172640,26.8401 +36.173683,26.8172 +35.926984,277.4896 +35.928744,278.5703 +36.152150,59.6752 +36.148943,65.3912 +36.187369,30.8581 +35.737118,482.3439 +35.886603,338.4547 +36.198462,30.9081 +36.199480,38.5020 +36.039449,200.0519 +36.099297,144.3696 +36.052481,196.8485 +35.895091,355.7582 +36.014456,238.4949 +36.190959,64.2152 +36.225058,31.8063 +36.142286,118.4905 +36.237983,27.9446 +35.971014,296.4787 +36.188968,83.0501 +36.103561,174.1683 +36.119103,161.6804 +36.214335,68.2898 +36.166668,117.5865 +36.020686,266.7406 +35.920457,372.7656 +36.161547,132.7126 +35.919426,378.3206 +36.265928,32.9727 +36.204474,101.6290 +36.211826,95.6941 +36.207315,101.2824 +36.120466,191.5857 +36.239501,74.2767 +36.255174,64.9340 +36.163571,159.1473 +36.104634,219.8555 +36.050391,282.9198 +36.183740,151.3644 +36.252952,86.5368 +35.992390,348.6163 +36.132486,212.0207 +36.168301,178.9883 +36.272019,76.9026 +36.066434,288.6339 +36.293223,67.0042 +35.936665,425.7539 +36.046507,319.5150 +36.339489,32.6202 +36.174774,199.5936 +36.287427,88.6598 +35.964656,420.5332 +36.229371,157.8174 +36.307520,83.7918 +35.899018,493.9426 +36.256865,138.2939 +36.322719,79.7257 +36.372110,31.5117 +36.284255,125.2933 +36.277729,136.1845 +36.347289,73.6906 +36.243668,182.0369 +36.335105,92.7645 +36.200501,229.0400 +36.344507,86.6079 +36.092924,346.2482 +36.280784,162.3975 +36.385190,60.3766 +36.313779,133.8284 +36.392961,58.2012 +36.376088,76.8045 +36.366023,88.1604 +36.391313,66.7428 +36.348922,117.3687 +36.073883,393.4990 +36.306104,168.9695 +36.218227,260.8071 +35.842351,637.9119 +36.420981,60.9025 +36.260777,225.3001 +36.298901,192.4343 +36.282625,213.2280 +36.431116,69.9389 +36.312053,190.6222 +36.443182,64.0441 +36.427870,82.6866 +36.134272,377.9336 +36.402445,113.8714 +36.308598,212.8193 +36.297747,225.6925 +36.403622,122.8211 +36.341007,186.7100 +36.294260,234.6210 +36.458056,73.9971 +36.177558,358.9439 +36.507227,32.6567 +36.374368,171.6251 +36.516317,31.3728 +36.521418,27.9411 +36.362420,190.7604 +36.429541,125.3433 +36.360228,201.2739 +36.320109,242.4132 +36.451163,112.4132 +36.536503,30.2258 +36.267493,302.9763 +36.395160,177.6253 +36.527717,47.4215 +36.480263,99.1984 +36.553181,29.5292 +36.561502,26.5410 +36.562522,26.5476 +36.387189,203.5779 +36.539884,56.3202 +36.466291,132.7752 +36.570470,31.2659 +36.549360,55.5019 +36.579462,30.8610 +36.249330,365.1203 +36.510557,105.6433 +36.588044,29.2850 +36.589071,31.7225 +36.554885,70.7798 +36.467383,163.8026 +36.409549,225.1602 +36.219462,417.4395 +36.425705,213.3670 +36.575139,65.1614 +36.324490,324.7309 +36.610324,40.5154 +36.333311,320.3889 +36.447607,207.1897 +36.532054,127.8106 +36.631186,30.9996 +36.601736,66.1406 +36.452893,218.6171 +36.590767,81.8991 +36.475074,199.2471 +36.355085,327.8635 +36.659865,24.1242 +36.614450,72.8014 +36.662186,27.8544 +36.604862,87.4817 +36.523440,172.6939 +36.547691,153.1795 +36.454183,247.8351 +36.616201,89.9225 +36.566729,146.2554 +36.502675,215.9417 +36.640301,80.9273 +36.696134,29.0275 +36.572785,153.9952 +36.479035,250.6497 +36.486078,248.7726 +36.582710,153.5109 +36.250850,486.9711 +36.712985,29.9720 +36.674321,71.0589 +36.634710,113.9107 +36.654798,100.4087 +36.726781,31.0921 +36.734851,27.3370 +36.690041,75.5569 +36.526444,241.5152 +36.667878,104.8303 +36.445567,329.8174 +36.721229,56.8722 +36.636902,145.9887 +36.501055,283.9194 +36.755207,32.8593 +36.649222,143.0219 +36.116386,681.0053 +36.725162,76.4942 +36.512206,290.9003 +36.114382,696.2961 +36.729685,82.7385 +36.413914,399.6451 +36.625665,189.0196 +36.528881,288.0117 +36.596204,223.4126 +36.792244,31.4496 +36.767959,68.1547 +36.775385,61.8339 +36.742958,95.3284 +36.491336,348.3795 +36.810679,32.8262 +36.788067,58.1671 +36.765598,83.4001 +36.687252,162.8606 +36.639072,215.0407 +36.816893,41.2540 +36.599067,264.2402 +36.837219,30.1542 +36.772708,96.9868 +36.671510,201.1528 +36.736222,139.2716 +36.081839,802.5330 +36.545994,339.9839 +36.745381,141.6573 +36.801657,88.6353 +36.867374,27.6105 +36.848999,48.6936 +36.819617,83.3173 +36.683990,220.5580 +36.784975,122.8763 +36.706124,207.8568 +36.890293,28.4022 +36.650840,269.8715 +36.682949,239.2921 +36.894985,29.6162 +36.875494,53.3905 +36.797391,136.3103 +36.836115,102.3710 +36.692344,251.8582 +36.838287,106.9406 +36.757874,190.6046 +36.481884,467.7365 +36.863308,94.1334 +36.869696,91.1845 +36.839716,122.5923 +36.823694,143.4086 +36.620794,347.3625 +36.737821,231.8639 +36.854114,116.7267 +36.944203,27.7580 +36.945228,33.2937 +36.884373,99.1091 +36.904548,85.4407 +36.803107,188.0205 +36.563576,436.0251 +36.948479,53.6364 +36.913981,91.0247 +36.949621,56.4845 +36.748621,262.5126 +36.922241,90.9087 +36.983482,39.9994 +36.812424,214.4326 +36.850113,178.1816 +36.970841,63.9402 +36.989989,46.9896 +36.846234,194.0579 +36.991127,50.8644 +36.957442,88.2305 +36.928885,118.7042 +36.918695,134.3176 +37.026857,30.4381 +36.653700,404.8221 +36.933702,127.6962 +37.034782,33.0049 +36.872664,199.4761 +36.920712,153.8107 +36.968157,109.6865 +36.700871,382.1746 +37.002116,83.2101 +36.718617,367.7669 +36.495854,592.6404 +37.005007,92.1346 +36.907852,190.4151 +36.778101,322.6509 +37.013150,94.0563 +36.967103,141.8646 +36.439172,671.4666 +36.938486,174.4952 +37.041992,81.7241 +36.762189,365.1180 +36.924602,204.3828 +36.999602,131.0602 +37.057296,79.0771 +37.036979,103.5362 +37.074523,68.1796 +36.969686,174.0843 +36.897693,250.5334 +36.782891,366.3983 +36.702019,450.7567 +36.813560,346.7475 +37.047590,114.1394 +37.077844,84.9458 +36.887038,283.6073 +37.053013,119.1200 +37.148227,24.3590 +37.107207,68.4007 +37.149290,26.8300 +37.110639,67.5750 +37.130663,54.9785 +37.160308,26.3845 +37.136373,53.5282 +37.098284,93.9031 +36.617329,578.6287 +37.040293,158.6812 +37.108969,92.5573 +37.152776,53.3674 +37.006106,200.4903 +36.962309,246.5689 +37.097142,112.7935 +37.140516,74.5865 +36.858148,360.1865 +37.011134,209.6414 +36.885978,339.5842 +37.123717,102.8757 +37.100753,126.3189 +36.843505,384.5224 +37.086385,142.1071 +36.971961,257.5701 +37.161729,71.9720 +36.960881,277.0114 +37.112982,126.9224 +36.902935,338.6826 +37.127307,114.8272 +36.814685,428.8422 +37.083046,161.5061 +37.067787,180.0082 +37.058523,190.3663 +37.143771,109.8375 +36.672667,584.2074 +37.128985,129.9233 +37.088495,172.6754 +36.978522,284.6197 +37.072140,193.0045 +37.142703,124.4426 +37.085326,183.2028 +37.028295,242.1488 +37.061399,209.8268 +37.023482,249.1420 +37.162790,110.7132 +37.045673,228.6119 diff --git a/cb_hammer_results.png b/cb_hammer_results.png new file mode 100644 index 00000000..38e28e33 Binary files /dev/null and b/cb_hammer_results.png differ diff --git a/cb_hammer_zmq.csv b/cb_hammer_zmq.csv new file mode 100644 index 00000000..6d535c7a --- /dev/null +++ b/cb_hammer_zmq.csv @@ -0,0 +1,18564 @@ +t_seconds,latency_ms +0.000234,24.1712 +0.000574,24.0884 +0.001656,23.2483 +0.001860,23.2962 +0.002022,23.4032 +0.002180,23.5401 +0.002332,23.7171 +0.002489,23.9037 +0.002653,24.0870 +0.002813,24.3072 +0.002976,26.9188 +0.003132,27.1958 +0.003292,27.4666 +0.003450,27.7344 +0.003621,27.9946 +0.004264,27.8255 +0.004455,28.1481 +0.004628,28.8138 +0.004793,29.4876 +0.004956,30.2032 +0.005118,30.9524 +0.005282,35.5081 +0.005447,36.3800 +0.005620,37.1921 +0.005790,37.7616 +0.005958,38.2908 +0.006125,38.8322 +0.006293,39.3403 +0.006552,39.7634 +0.006742,40.2985 +0.006915,40.9212 +0.007085,41.5566 +0.007255,42.1907 +0.007380,43.0763 +0.007502,46.6932 +0.007631,47.3715 +0.007803,47.9998 +0.007942,48.7028 +0.008074,49.4160 +0.008199,50.1451 +0.008324,50.9536 +0.008538,51.6629 +0.008685,52.4185 +0.008813,53.2244 +0.008939,54.0518 +0.009070,54.8866 +0.009200,55.7258 +0.009326,56.5953 +0.024406,45.0598 +0.029895,45.0673 +0.054195,26.2149 +0.025720,57.5957 +0.031616,55.5590 +0.032603,59.4046 +0.055803,39.7173 +0.059278,40.3025 +0.031185,71.7409 +0.026393,77.9484 +0.036071,70.4944 +0.027121,87.9906 +0.040791,75.9087 +0.095521,22.2475 +0.024663,97.2937 +0.060202,62.8166 +0.064926,60.7330 +0.063957,66.2804 +0.061104,73.8313 +0.025425,110.4777 +0.115112,21.7954 +0.121958,20.8541 +0.065922,80.8417 +0.046315,102.0143 +0.106566,46.5671 +0.030328,125.1857 +0.069466,87.1722 +0.134936,24.7997 +0.142812,24.9607 +0.125660,46.6370 +0.034281,142.9082 +0.130238,47.9172 +0.047837,134.1306 +0.057491,127.5860 +0.043552,143.1794 +0.044249,146.5710 +0.042812,151.5632 +0.104342,94.7346 +0.055003,145.5314 +0.116700,87.6960 +0.177190,29.0147 +0.092009,115.2200 +0.049446,166.8091 +0.025156,192.4871 +0.058344,161.0307 +0.156639,64.1409 +0.099581,124.8905 +0.044958,183.3096 +0.199077,30.7611 +0.026049,204.7934 +0.172298,60.4237 +0.032090,203.4055 +0.080411,160.8557 +0.045633,197.4829 +0.056645,188.8850 +0.047041,201.2808 +0.224472,29.5726 +0.041828,216.1806 +0.048642,211.8499 +0.087176,179.9709 +0.026741,241.9461 +0.123019,147.6111 +0.245531,27.4161 +0.030759,247.3478 +0.033442,246.1585 +0.207229,74.3081 +0.167774,117.3376 +0.260493,27.8127 +0.216256,74.1920 +0.135904,159.4455 +0.035160,261.1213 +0.148330,155.9537 +0.062991,243.4793 +0.178156,129.8495 +0.062038,248.5287 +0.285112,28.1321 +0.228268,88.1275 +0.268688,49.4220 +0.136908,184.7118 +0.295350,27.6863 +0.241267,86.4663 +0.254046,74.6868 +0.304284,25.4401 +0.248322,82.4111 +0.204397,130.4180 +0.200535,138.7926 +0.181968,162.6993 +0.243117,102.5191 +0.185077,163.4862 +0.235496,115.6758 +0.327734,26.9554 +0.230843,129.6245 +0.258009,104.2885 +0.146764,216.9981 +0.190821,185.7287 +0.102926,274.6280 +0.279601,99.3606 +0.155515,224.9522 +0.270631,110.8474 +0.229839,154.2993 +0.316396,68.6849 +0.321620,67.7989 +0.288306,104.9745 +0.310567,87.6850 +0.117769,281.4877 +0.272947,136.2782 +0.384139,26.1212 +0.308006,104.5636 +0.219376,196.4679 +0.050457,366.9378 +0.351172,70.1646 +0.306471,115.9691 +0.398252,28.6568 +0.267147,164.6559 +0.278107,157.6180 +0.345636,92.7463 +0.024905,416.5126 +0.186732,256.1179 +0.389420,54.9019 +0.281538,165.4035 +0.159736,291.2610 +0.399257,54.3350 +0.360468,96.0662 +0.431803,28.2751 +0.412570,50.9346 +0.232722,232.3297 +0.441418,25.5644 +0.409226,60.5356 +0.393281,79.8974 +0.329725,146.2920 +0.348564,135.2513 +0.083316,401.4697 +0.362298,123.4312 +0.206205,283.3302 +0.453593,38.6369 +0.074963,421.2028 +0.473179,23.9777 +0.377555,124.8519 +0.323036,181.8447 +0.485730,27.6334 +0.318110,198.9054 +0.313244,206.5363 +0.344668,177.1063 +0.476017,47.2047 +0.465052,59.1317 +0.463506,63.2603 +0.194376,333.3512 +0.502407,27.8670 +0.450997,86.2609 +0.497157,41.7248 +0.513364,27.4772 +0.380468,161.7907 +0.417396,128.2611 +0.415844,131.4935 +0.422440,128.5928 +0.381478,172.4769 +0.217644,337.6890 +0.354690,205.2362 +0.290448,270.4327 +0.537259,26.4866 +0.339328,227.0672 +0.545658,22.2555 +0.547338,25.1104 +0.378962,199.8113 +0.553956,26.3128 +0.484786,99.6891 +0.496166,89.6449 +0.334815,251.9846 +0.385082,209.3201 +0.519781,75.6008 +0.530274,66.5412 +0.504882,95.0530 +0.456535,144.3593 +0.296282,311.1883 +0.560881,51.6568 +0.426910,187.0091 +0.376550,239.7880 +0.466983,151.7051 +0.566395,53.3659 +0.538882,82.9538 +0.599935,24.8941 +0.595383,39.8280 +0.469762,166.7891 +0.523223,115.6277 +0.613919,26.2990 +0.596816,47.6488 +0.220780,427.0558 +0.555333,94.3899 +0.442850,209.6247 +0.551034,105.0511 +0.521775,138.7917 +0.363763,301.1252 +0.410260,257.3664 +0.621836,47.5989 +0.594402,79.3251 +0.619762,61.7274 +0.656085,26.3550 +0.489536,195.8685 +0.600894,87.3065 +0.330734,360.1213 +0.638851,53.1701 +0.460079,236.0170 +0.664889,36.5265 +0.527728,177.0691 +0.618688,88.0896 +0.681490,26.3029 +0.328733,382.8184 +0.435726,279.5819 +0.559927,158.1603 +0.526767,194.6717 +0.586800,139.2345 +0.438383,290.5508 +0.669436,62.7829 +0.647837,88.8517 +0.652476,85.2208 +0.607471,135.1759 +0.688201,56.0092 +0.483816,262.4492 +0.572449,180.7118 +0.635211,120.8722 +0.563746,193.8940 +0.540841,217.9342 +0.492230,271.5954 +0.718088,46.7517 +0.685405,83.2134 +0.690856,83.8873 +0.567914,208.8553 +0.578774,203.3202 +0.636552,147.5838 +0.446942,338.6211 +0.706779,81.8998 +0.667627,122.6474 +0.764840,28.0791 +0.726035,73.5387 +0.421337,381.0151 +0.763826,39.9246 +0.692021,119.6634 +0.696096,118.9976 +0.715308,102.5086 +0.673728,146.5382 +0.799574,24.0723 +0.790275,34.8148 +0.742647,83.4289 +0.776770,56.9896 +0.612539,222.6165 +0.792919,46.5826 +0.736689,107.2536 +0.644465,202.5290 +0.649723,200.2567 +0.707793,144.8766 +0.753162,103.7043 +0.640219,217.5878 +0.768619,96.1132 +0.803751,64.2616 +0.585811,284.3951 +0.843943,27.3148 +0.616338,260.1137 +0.517016,360.3999 +0.701416,178.9061 +0.788679,94.2564 +0.721439,164.4440 +0.757641,133.5426 +0.852670,39.5009 +0.756084,142.4463 +0.542259,357.3043 +0.737697,164.0565 +0.876452,28.1397 +0.802353,103.8796 +0.820266,88.5716 +0.524184,389.0623 +0.728934,185.2636 +0.815095,100.9311 +0.891184,27.8232 +0.898531,24.0616 +0.901754,26.9839 +0.660567,274.1137 +0.746265,192.0128 +0.811685,127.6325 +0.885884,55.3324 +0.704797,239.4511 +0.782095,163.7384 +0.922593,27.0719 +0.904593,50.6971 +0.823647,133.6541 +0.682441,276.0690 +0.880322,80.5401 +0.732219,232.3626 +0.939318,27.5061 +0.835156,138.3106 +0.624830,349.6161 +0.153133,824.7465 +0.899564,80.6202 +0.916026,67.1337 +0.584476,402.4885 +0.833760,157.3519 +0.919008,76.8340 +0.444322,552.4761 +0.949665,54.1743 +0.977880,26.9033 +0.980184,27.5762 +0.908839,103.7150 +0.870207,143.7537 +0.849981,165.8515 +0.580269,438.8123 +0.892171,128.4556 +0.996799,25.8250 +1.007761,22.9707 +0.941217,91.9177 +0.785564,251.7580 +0.882936,157.1865 +0.995842,46.9694 +0.986965,59.8695 +0.957302,94.1427 +0.991112,62.2216 +0.711552,346.3154 +1.033135,30.6043 +0.958510,106.5501 +0.955290,112.3277 +0.856866,214.8598 +0.945834,132.2622 +0.817817,261.6098 +1.004784,77.8299 +0.784136,300.4821 +0.871258,217.6155 +0.938279,153.1708 +0.744211,350.7681 +0.966825,131.1242 +1.019082,79.9095 +0.846995,253.9296 +1.015833,93.2508 +0.973467,139.2143 +1.084619,29.3713 +1.046835,72.1016 +1.003840,116.0463 +0.983160,141.6535 +1.067618,60.5999 +0.974446,155.7008 +0.914198,217.3426 +1.071727,62.4511 +1.065061,72.4800 +1.063740,77.9933 +0.774744,368.7594 +1.118937,27.6747 +1.022624,125.8773 +1.079428,74.2867 +1.100925,54.5469 +1.124814,33.9944 +1.097950,62.7250 +1.137541,27.5923 +1.030732,141.4682 +0.964582,209.4953 +0.826076,348.9789 +1.057868,118.9583 +1.153715,25.0830 +1.148502,37.4450 +1.053334,133.5889 +0.825091,363.2917 +0.906233,286.8173 +1.112681,82.1935 +0.868013,330.5034 +1.172201,27.3759 +1.094980,109.4616 +1.128219,80.4932 +1.109084,101.0481 +0.758776,452.7600 +1.185947,26.5585 +1.113990,104.8896 +1.194875,26.7089 +1.119887,103.8689 +0.864732,362.0765 +1.186924,42.8813 +1.130148,104.2011 +1.131542,107.7161 +1.134178,107.8920 +1.143504,102.3359 +1.078097,169.6971 +0.928738,321.9957 +1.013961,238.5129 +1.208713,46.2503 +1.218880,40.7757 +1.174078,90.8749 +0.934681,334.6383 +1.188383,83.4685 +1.175056,99.3441 +1.146612,130.3872 +1.198517,84.3992 +1.242071,42.2275 +1.051445,235.9416 +1.040123,249.3058 +1.042812,248.1266 +1.269320,25.4411 +1.088874,211.6626 +1.239258,64.1729 +1.165134,141.5764 +0.857807,450.0503 +0.960863,350.2135 +1.160675,157.9913 +1.204442,115.6413 +1.259657,61.9380 +1.155473,167.1265 +1.294761,29.8020 +1.300537,29.6858 +1.277000,56.1969 +1.229805,104.9307 +1.290939,51.8890 +0.877417,466.7837 +1.176827,173.8283 +1.271852,82.5966 +1.212506,144.2382 +1.141734,216.5016 +1.020628,339.0410 +1.226809,133.9604 +1.082614,284.5260 +1.289429,78.9689 +1.318667,52.2968 +1.344201,30.5116 +1.211536,167.6596 +1.091450,289.8957 +0.913247,469.5638 +1.282917,102.5267 +1.322600,68.9887 +1.354449,39.5373 +1.311077,86.8988 +1.199577,199.9272 +1.333198,69.6308 +1.379196,24.6307 +1.098992,307.8167 +1.356745,52.2890 +0.944249,467.6516 +1.306711,109.4216 +1.367141,53.0203 +1.303432,118.0593 +1.397976,27.4594 +1.370964,59.9814 +1.254963,177.4324 +1.374713,62.7395 +1.391589,47.3788 +1.158809,281.9895 +1.382811,59.9233 +0.839502,606.0644 +1.350656,100.2863 +1.245840,208.5374 +1.425436,30.3420 +1.221585,235.1171 +1.193051,270.3854 +1.223756,240.6266 +1.437453,27.8493 +1.399505,67.4055 +1.360770,109.4128 +1.385444,89.1198 +1.409035,68.3690 +1.393987,85.4180 +1.411901,75.3559 +1.456702,31.5471 +1.463437,25.8280 +1.464383,25.8600 +1.342828,151.6143 +1.403828,98.4639 +1.430946,72.7077 +1.250735,253.8339 +1.307858,198.8935 +1.440799,70.4479 +1.487257,26.3242 +1.432396,84.3930 +1.490244,30.1769 +1.274400,251.1846 +1.368399,158.7462 +1.445567,83.4025 +1.037322,497.8639 +1.465303,71.2897 +1.494443,45.7883 +1.474564,67.7963 +1.513582,30.4716 +1.488250,58.7108 +1.406809,141.1007 +1.470184,82.3852 +1.321595,231.8602 +1.525586,31.9828 +1.504569,56.9986 +1.450943,111.7637 +1.324564,239.0483 +1.234349,332.5466 +1.334737,235.5456 +1.402829,168.3586 +1.544055,29.5963 +1.502292,74.7876 +1.438968,140.5674 +1.552569,29.6944 +1.252474,333.7150 +1.511248,76.9532 +1.561568,28.0362 +1.012554,579.5128 +1.570283,25.1835 +1.571188,27.3388 +1.455779,145.9276 +1.264954,340.4557 +1.442735,164.7932 +1.381346,227.7635 +1.536593,73.9842 +1.588201,26.3450 +1.562707,58.8463 +1.577080,45.9227 +1.330224,294.1546 +1.421491,206.5689 +1.605410,23.5867 +1.247794,386.9777 +1.520421,115.8565 +1.614547,26.2304 +1.284299,357.4261 +1.546961,97.2053 +1.178798,470.5437 +1.628061,23.3344 +1.628997,25.8001 +1.566896,88.9988 +1.535186,122.1305 +1.610577,51.7388 +1.579536,85.6846 +1.598527,69.2835 +1.582264,90.6301 +1.649343,26.3900 +1.210133,467.8780 +1.540232,140.1842 +1.592067,92.4974 +1.662317,25.2850 +1.621554,69.7615 +1.563613,131.0384 +1.595467,100.6375 +1.553456,145.3499 +1.489265,213.4384 +1.665221,46.0761 +1.624379,88.3551 +1.506752,207.2111 +1.644167,79.5329 +1.547910,176.8149 +1.466911,258.7756 +1.416133,311.4068 +1.516790,216.9239 +1.479405,257.9307 +1.359670,378.8323 +1.636278,106.6335 +1.641725,104.5603 +1.589605,161.7070 +1.477404,276.6807 +1.678011,77.0291 +1.654798,104.1374 +1.694651,65.2790 +1.737336,23.6875 +1.601707,165.7823 +1.746286,24.7412 +1.754086,24.5548 +1.651396,128.7021 +1.503654,277.4883 +1.623003,161.2100 +1.687602,98.0340 +1.454378,335.5403 +1.680417,116.5470 +1.527145,271.3405 +1.698806,101.5028 +1.640778,161.7894 +1.691316,112.6263 +1.780098,29.8061 +1.711298,99.6062 +1.675733,136.3866 +1.767490,48.5299 +1.320084,499.1913 +1.542361,279.3888 +1.724725,101.2660 +1.802568,26.8411 +1.784214,46.1907 +1.667811,166.1233 +1.358236,478.6369 +1.702704,135.5058 +1.684565,157.7941 +1.657317,193.1194 +1.742912,110.6616 +1.830405,24.5946 +1.733714,122.4926 +1.287387,570.2680 +1.713964,153.1549 +1.781143,87.8517 +1.755041,114.9451 +1.759931,114.3486 +1.829409,45.8093 +1.850437,28.6708 +1.855000,26.4096 +1.789919,92.4671 +1.528970,355.6639 +1.821750,68.3401 +1.800309,91.2562 +1.712734,185.3938 +1.874280,24.8127 +1.758941,143.1851 +1.875219,28.3194 +1.809905,95.3053 +1.557569,350.3145 +1.853574,55.8001 +1.810904,103.1954 +1.798486,118.0137 +1.882386,40.7247 +1.902127,22.3603 +1.672895,257.7739 +1.842360,89.7133 +1.867119,69.1472 +1.833935,105.9774 +1.891566,49.3711 +1.898129,47.2166 +1.899093,50.0164 +1.924488,28.8729 +1.930669,23.6263 +1.856207,102.4323 +1.838210,123.6515 +1.803942,159.5478 +1.884635,83.6141 +1.923111,46.9411 +1.738503,233.1933 +1.903539,69.8225 +1.945346,33.1094 +1.761024,220.9607 +1.954296,28.6474 +1.725687,264.4723 +1.771028,220.5263 +1.696105,297.2922 +1.916500,78.8323 +1.932073,64.3686 +1.907884,90.0373 +1.953361,49.5847 +1.796964,208.8820 +1.949110,60.0388 +1.970053,43.5740 +1.990160,24.4214 +1.836873,179.4594 +1.723701,295.7932 +1.816020,207.3974 +1.909375,117.8958 +1.607529,421.4700 +2.002946,27.3939 +1.879109,153.6827 +1.936267,99.9411 +1.981985,56.4828 +1.961862,77.5326 +2.013628,28.8480 +2.019494,30.1873 +1.890091,163.8489 +1.819276,235.9027 +2.005847,51.1975 +1.978456,84.3239 +1.751312,315.6538 +1.991555,77.1614 +1.778641,291.9004 +1.586190,487.3569 +2.049682,27.4268 +2.030340,52.3214 +2.042476,45.0389 +1.634773,454.5781 +1.996442,96.1383 +2.038469,55.5888 +1.785637,312.1699 +1.812120,287.6296 +2.023418,78.8169 +1.881410,225.4871 +1.993397,114.4795 +2.082662,28.2790 +1.868995,246.9521 +1.968249,151.8168 +2.068717,54.2386 +1.963491,165.1253 +2.009150,120.4379 +2.070542,59.9914 +2.057045,75.8490 +2.039395,98.8938 +1.905211,234.9478 +2.102235,40.7235 +2.066966,80.6617 +2.122956,27.0454 +1.655895,495.7073 +1.995333,161.4159 +2.053940,107.2248 +2.032792,130.6608 +1.857655,310.6395 +2.028999,142.1645 +2.014582,159.8557 +2.036208,141.6172 +1.573652,608.2724 +2.089351,93.5099 +2.062780,121.2319 +1.914100,273.8300 +2.106898,85.0303 +2.132894,61.9029 +2.168296,28.7375 +2.099750,101.6760 +1.420162,782.1775 +2.142959,63.0510 +2.087516,121.6222 +2.107877,105.8592 +1.727540,490.8939 +2.140159,81.8128 +2.128616,94.3971 +1.940938,283.0117 +2.171164,53.7559 +2.156750,72.7209 +1.973362,260.2843 +2.206011,31.8693 +2.213737,31.3427 +2.194797,51.1796 +1.997928,249.1793 +1.825992,427.5417 +2.094058,160.9790 +2.197034,58.9524 +2.161166,98.8905 +2.097807,163.1846 +2.147629,114.7663 +2.237880,27.2121 +2.202340,64.2151 +2.245978,25.4662 +2.253534,22.8605 +1.869986,407.6194 +2.223014,57.4474 +2.120067,164.2492 +2.187931,98.4669 +1.609110,681.9199 +2.177826,118.0108 +2.130534,167.1181 +2.110942,187.7346 +2.201427,105.3188 +2.255037,52.6671 +2.223950,91.2387 +2.163453,152.7073 +2.276395,41.9247 +2.138289,180.9712 +1.958640,362.6086 +2.115948,209.3538 +2.265093,63.8940 +2.284316,45.6789 +1.982944,350.9295 +2.129588,207.6074 +2.151603,187.2954 +1.939913,402.5560 +2.286398,59.6853 +2.181925,165.9835 +2.328987,22.7157 +2.329996,25.2492 +2.191929,166.4315 +2.280462,79.4249 +2.295837,68.7890 +2.174438,191.5778 +1.971696,400.0741 +2.224921,148.7002 +2.233647,144.8154 +2.150002,230.4017 +2.351704,29.7208 +2.255986,133.1915 +2.321249,70.6612 +2.306746,90.4147 +2.371771,26.3374 +2.291031,108.6459 +2.092581,308.9895 +2.016333,387.7442 +2.297652,108.5221 +2.209138,199.8737 +2.333874,78.9460 +2.298677,115.6556 +2.389178,28.7017 +2.260057,163.8938 +2.397161,29.1858 +2.398109,29.1717 +2.406175,24.8385 +2.325302,107.1246 +2.027271,408.1169 +2.355245,87.3872 +2.381425,62.6077 +2.262395,183.0109 +2.391911,54.4586 +2.423951,28.3675 +2.431014,26.9984 +2.399677,63.6563 +2.247108,217.2032 +2.266573,199.1558 +2.338899,131.1377 +2.055179,420.1585 +2.432427,44.6054 +2.427281,52.5165 +2.229471,252.8530 +2.307705,176.2210 +2.378463,109.7087 +2.463334,28.5828 +2.218435,274.6759 +2.342469,156.6506 +2.417881,82.1605 +2.445407,56.3003 +2.221972,287.3175 +2.452319,57.9134 +2.182861,328.2931 +2.271444,241.5985 +2.488172,27.6384 +2.491917,30.8587 +2.458012,67.9782 +2.499120,30.1638 +2.479798,53.4248 +2.347909,186.2483 +2.493111,45.4428 +2.435388,104.5770 +2.426348,115.3944 +2.465729,79.1888 +2.364627,182.3252 +2.475338,75.8584 +2.464312,88.2675 +2.414333,143.3689 +2.359887,199.1706 +2.533223,29.5659 +2.442633,121.0956 +2.184012,386.7876 +2.477033,95.5853 +2.515811,59.4835 +2.404078,174.7225 +2.500042,80.8366 +2.444033,137.8500 +2.318320,265.5873 +2.511155,78.3658 +2.570800,23.1382 +2.551197,44.1465 +2.546952,54.8782 +2.470037,132.7123 +2.316161,288.0962 +2.534158,71.0743 +2.513043,96.9361 +2.482325,129.5919 +2.409012,207.0981 +2.562790,55.2804 +2.593939,26.1927 +2.601831,21.1661 +2.412820,217.3340 +2.260992,370.5933 +2.539966,92.9852 +2.315189,324.7536 +2.580879,61.1864 +2.544919,99.1160 +2.622998,23.9889 +2.557702,91.6969 +2.630155,21.2876 +2.337196,318.2183 +2.358361,301.3050 +2.611917,56.0920 +2.373621,297.2352 +2.245080,427.0000 +2.380404,297.3980 +2.581884,101.2242 +2.618071,65.9817 +2.501708,183.2933 +2.446370,241.9220 +2.552580,137.4872 +2.668010,31.8539 +2.563729,138.7697 +2.583908,123.9228 +2.659666,49.1849 +2.538554,171.3189 +2.688292,25.1439 +2.642066,73.5617 +2.604258,116.6681 +2.510233,215.4521 +2.670857,57.7391 +2.401571,330.7148 +2.509290,226.8299 +2.346084,392.7743 +2.713437,26.5833 +2.522776,219.1531 +2.366016,379.7496 +2.541742,207.3691 +2.709874,47.8060 +2.644035,115.3897 +2.732287,30.1596 +2.620132,148.8206 +2.277606,493.6321 +2.651443,121.7891 +2.649400,125.3744 +2.685001,91.9695 +2.655415,129.3178 +2.077109,709.1017 +2.768953,24.3540 +2.525991,269.1454 +2.589521,206.6532 +2.616111,186.2131 +2.684053,119.8437 +2.715628,89.2998 +2.699864,107.6894 +2.602750,209.9703 +2.605232,208.4553 +2.639943,178.0859 +2.759425,59.9669 +2.793308,29.0790 +2.646987,179.4067 +2.725685,106.5019 +2.595344,239.5308 +2.609980,225.9014 +2.672080,165.2635 +2.776971,64.2049 +2.575296,267.7424 +2.819393,28.3437 +2.529285,320.5772 +2.826394,27.0813 +2.690067,167.0762 +2.683108,179.8463 +2.728596,137.2924 +2.757680,109.2402 +2.708851,160.8089 +2.847737,25.0057 +2.762447,115.5540 +2.796175,85.3194 +2.857144,25.3369 +2.802325,84.5169 +2.773233,120.2977 +2.720926,174.7402 +2.862955,35.9058 +2.745766,162.2763 +2.813688,97.8354 +2.736121,176.3660 +2.707831,206.4740 +2.631586,284.6509 +2.572619,346.5684 +2.832188,90.4609 +2.803897,123.2564 +2.804928,126.7921 +2.784733,152.6929 +2.835882,104.6726 +2.818030,123.4789 +2.908043,34.3936 +2.319261,627.4284 +2.919188,28.5032 +2.632951,320.8489 +2.872743,83.0473 +2.740021,218.9560 +2.911524,49.1387 +2.937426,26.9540 +2.940555,24.7878 +2.941509,27.4411 +2.865889,104.1818 +2.841177,133.6766 +2.898862,79.9348 +2.849862,129.8720 +2.886842,97.9562 +2.869661,116.5002 +2.073547,915.9475 +2.931721,60.0051 +2.893531,102.4072 +2.965343,31.6229 +2.895667,106.3402 +2.812721,192.6688 +2.922649,86.1155 +2.834875,180.6279 +2.979735,38.5033 +2.964381,55.6751 +2.986162,41.3180 +2.677802,352.2809 +2.795137,236.7213 +2.807554,225.2510 +2.974854,60.4374 +2.843038,194.7535 +3.002008,38.3108 +2.946690,94.5930 +2.970072,78.0386 +3.005390,44.2274 +2.749112,304.7509 +2.960663,94.5887 +2.912487,145.9486 +2.968951,92.9371 +2.942439,121.1001 +2.771239,296.7589 +2.559058,515.0024 +2.882481,194.0594 +3.053864,25.5772 +2.991726,89.1120 +3.035292,48.5840 +2.978797,111.3347 +3.040319,51.9214 +2.822387,271.3131 +3.067998,32.5828 +2.878001,224.8891 +2.984799,119.5348 +2.774775,333.6232 +3.008765,101.1428 +2.927154,188.9482 +3.041283,76.7834 +2.947691,174.6606 +2.741930,381.4126 +2.881495,251.3203 +2.837344,298.1733 +3.031859,105.1337 +2.786211,351.7972 +3.080839,59.8166 +3.027480,114.9581 +3.083876,60.3226 +2.853476,301.3552 +3.123343,32.4026 +2.995939,162.7788 +3.030084,129.7008 +3.058436,102.2828 +3.104334,57.3395 +3.037792,130.2840 +3.061888,107.2400 +3.015503,156.1901 +2.866921,309.1631 +3.154832,22.2047 +2.916237,266.1848 +3.160720,25.3998 +3.092241,95.5109 +2.996967,196.8838 +3.020056,174.8616 +3.171694,24.1951 +2.989495,213.4557 +2.578801,630.4510 +3.187752,24.9084 +3.138009,77.3168 +3.161674,54.7167 +3.122353,95.0527 +3.079441,142.5019 +3.055252,170.9231 +3.102891,124.2121 +3.159785,75.3707 +3.063539,172.5780 +2.738859,502.1017 +2.958977,285.6961 +3.109909,136.1596 +2.702499,546.3782 +3.090132,160.3500 +3.100582,150.9175 +3.135518,116.9335 +3.177037,82.5575 +3.235156,25.8352 +3.236118,27.8672 +3.186120,81.5819 +3.216391,55.4319 +3.212661,60.6872 +3.193851,82.2663 +2.955791,323.1830 +3.049618,231.1451 +3.209252,72.5143 +3.226176,61.7975 +3.267702,24.5837 +2.483926,820.6753 +3.108398,197.5591 +3.202952,104.4269 +3.136994,172.2543 +3.142439,168.4393 +3.194918,117.9260 +3.215326,103.2738 +3.195889,123.6843 +3.221944,101.5440 +2.914306,412.4820 +3.182422,146.3376 +3.168077,162.9890 +3.246069,88.9772 +3.048111,292.5940 +3.273349,68.7497 +3.217406,131.7956 +3.252452,98.4489 +3.132816,219.0286 +3.326788,27.9101 +3.307379,49.2118 +3.278974,82.1328 +3.240961,122.1017 +3.292287,71.9501 +3.342099,28.2488 +3.116103,257.8939 +3.305958,71.2049 +3.354699,24.0398 +3.155746,224.6773 +3.331067,56.4000 +3.328760,60.3156 +3.118067,275.6135 +2.953801,440.8601 +3.318601,78.0344 +3.309248,90.5617 +3.074061,331.3101 +3.335046,72.2132 +3.251500,163.1354 +3.377163,39.6969 +3.304602,115.3817 +3.281767,141.4492 +3.227104,198.4804 +3.399811,27.2145 +3.176084,253.0127 +3.140656,294.6762 +3.323488,117.0843 +3.380424,62.6379 +3.414635,31.0640 +3.416861,31.6278 +3.351845,101.7582 +3.259595,195.3728 +3.263985,192.7691 +3.396635,63.5028 +3.373997,88.9474 +3.271824,192.0885 +3.435333,31.6886 +3.158718,313.2481 +3.405372,67.5990 +3.394661,82.1710 +3.319574,168.7568 +3.310879,178.4292 +3.393681,96.6024 +3.248878,245.4239 +3.419985,75.6988 +3.356591,142.1533 +3.445700,55.4294 +3.280763,227.4683 +3.032805,476.4289 +3.093701,418.4811 +3.144199,369.8637 +3.472971,44.0276 +3.250483,267.4606 +3.340705,178.4323 +3.494303,26.3228 +3.425584,104.7422 +3.407260,126.2713 +3.476833,58.5568 +3.260992,275.7316 +3.509235,31.2712 +3.423217,122.6024 +3.517944,28.8796 +3.460139,91.3031 +3.349209,203.2235 +3.018239,535.2174 +3.312845,245.6392 +3.533532,27.4592 +3.471967,93.4610 +3.361108,207.0110 +3.520626,49.5780 +3.508232,67.9762 +3.453603,124.9736 +3.456755,122.7842 +3.076541,505.7846 +3.558485,27.4360 +3.536724,51.4373 +3.350902,245.2746 +3.540506,57.0435 +3.546824,52.0646 +3.512183,89.4284 +3.370348,232.6890 +3.462945,141.2936 +3.551442,56.3089 +3.287974,324.9298 +3.530327,87.9809 +3.560992,59.0564 +3.535390,85.6346 +3.463913,158.9543 +3.443062,185.6246 +3.276118,354.1116 +3.565428,67.0880 +3.514064,123.5431 +3.495684,144.2505 +3.618308,25.0433 +3.545819,104.6853 +3.501130,151.3115 +3.570204,83.6121 +3.488331,170.4758 +3.598889,61.9630 +3.467022,194.8198 +3.519138,145.0587 +3.643352,24.9494 +3.489308,186.1839 +3.427026,251.1642 +3.490284,195.0967 +3.652442,34.7506 +3.454968,233.7817 +3.552433,139.3521 +3.576209,116.6124 +3.658808,38.8282 +3.440573,258.0199 +3.620048,86.2083 +3.378739,332.2573 +3.169129,542.8050 +3.661842,51.0707 +3.588162,126.2152 +3.604239,115.2883 +3.621025,102.4519 +3.596177,129.8821 +3.685381,42.0660 +3.568119,164.5810 +3.389077,346.1168 +3.579540,157.8853 +3.710997,28.7932 +3.553457,191.4564 +3.719528,28.0756 +3.622867,126.3157 +3.498745,251.5186 +3.628688,128.5902 +3.603038,155.6462 +3.737425,24.2462 +3.706257,58.2348 +3.650505,115.5767 +3.675493,94.8149 +3.750264,23.3610 +3.757278,21.8011 +3.732701,48.3399 +3.630230,154.9299 +3.766082,22.8422 +3.582326,209.7423 +3.585921,211.4402 +3.387467,410.8403 +3.597550,203.5842 +3.692822,109.2967 +3.779080,25.6535 +3.448489,365.8068 +3.726059,89.2027 +3.632516,185.5290 +3.653817,166.2223 +3.678190,146.1181 +3.744914,83.7398 +3.792069,38.0292 +3.612904,222.4178 +3.429098,407.1825 +3.637607,201.7126 +3.363063,481.3191 +3.797362,49.3117 +3.785160,63.7512 +3.688750,162.0670 +3.788925,65.5778 +3.828654,27.2361 +3.727448,130.9525 +3.773626,90.3130 +3.802119,63.7437 +3.844383,25.4653 +3.664197,214.0219 +3.691785,189.7132 +3.749184,137.2851 +3.761672,126.1507 +3.244674,644.3735 +3.770308,119.7502 +3.712913,180.3292 +3.747604,150.1438 +3.516999,382.1056 +3.711934,216.8280 +3.878220,53.0659 +3.698593,238.8197 +3.835322,103.9114 +3.723478,217.7363 +3.846674,98.6368 +3.758685,187.5979 +3.668302,279.2375 +3.697636,253.6722 +3.854503,102.3277 +3.869849,90.4295 +3.804734,156.5650 +3.687193,278.2534 +3.941214,28.6922 +3.850818,121.3372 +3.660852,317.2541 +3.928764,50.3396 +3.818046,163.7854 +3.937413,45.4061 +3.814296,175.3985 +3.601611,390.3904 +3.890059,103.0275 +3.965447,29.1028 +3.897748,99.8598 +3.820040,182.0145 +3.798310,205.1616 +3.855890,151.0540 +3.848912,162.6259 +3.951309,62.1921 +3.836281,178.1712 +3.889048,132.9091 +3.858401,165.8944 +4.002055,23.1889 +3.714378,312.5445 +3.887823,140.8245 +4.003472,32.5315 +4.013502,23.4326 +3.945311,92.5896 +3.899106,141.0584 +4.014452,27.1309 +3.982820,65.4741 +3.972156,77.1578 +3.979104,74.6060 +3.865863,193.4799 +3.931286,131.4022 +3.764492,300.7390 +3.981832,85.3595 +3.989695,80.4707 +3.830099,242.5225 +4.024296,52.9193 +4.049314,31.3414 +4.011538,73.3151 +3.969907,116.7029 +3.839320,248.7198 +3.893243,198.0544 +3.781041,315.6276 +4.040164,57.8096 +3.578577,521.7445 +4.077216,26.4229 +3.739791,367.6047 +4.084854,23.7220 +3.801135,309.6474 +4.062689,50.8985 +4.086610,28.4097 +4.096669,24.1017 +4.037901,84.9439 +3.997609,129.5491 +3.939234,190.4289 +3.735194,396.3362 +3.639935,495.9209 +3.863939,274.3614 +4.113588,26.2563 +4.041584,100.4428 +4.120771,26.1986 +4.127158,23.8042 +3.946283,205.6098 +3.992002,163.8494 +4.028648,130.0568 +4.080656,78.9979 +4.135856,24.7355 +4.067192,103.9349 +4.006945,165.7426 +4.048295,125.3884 +4.065232,109.4386 +4.150963,25.1099 +4.151893,26.4620 +4.088041,94.5023 +3.886469,300.3066 +3.978107,216.5505 +4.146970,49.0750 +4.138301,61.0681 +3.815263,385.1413 +4.142027,62.1640 +4.072622,137.7058 +4.021957,189.9644 +4.025244,188.1528 +4.103639,113.1797 +3.607752,609.9811 +4.194658,26.2198 +4.199370,25.9147 +4.159654,73.2732 +4.026923,208.1736 +4.059344,181.1191 +4.172688,68.7022 +4.216819,25.5035 +4.173683,70.2316 +4.155852,89.0424 +4.217733,28.5439 +4.091298,157.0245 +4.129664,122.5612 +4.139845,117.1602 +4.232928,31.9960 +4.158706,107.1507 +4.240464,29.4889 +3.947540,324.0357 +4.220878,53.0979 +4.213397,62.4946 +4.036004,243.1363 +4.131531,149.1397 +4.200404,81.2417 +3.961299,327.7250 +3.824309,468.7802 +4.265857,28.1560 +3.881499,413.4289 +4.100323,198.9171 +4.242323,60.3488 +4.275893,27.8043 +4.241391,63.6149 +4.204192,108.3601 +3.956832,356.7040 +4.210328,105.1018 +4.186776,130.9929 +4.294928,26.4739 +4.273977,51.0768 +4.122846,205.5574 +4.211922,120.0693 +4.248323,87.4549 +4.317770,21.3636 +4.178356,164.4022 +4.097975,248.5210 +4.264924,86.4932 +4.176073,178.0691 +4.160592,194.8200 +4.279141,77.4027 +4.182543,178.3744 +4.036935,327.5707 +4.289025,76.6216 +4.346496,27.0938 +4.108576,267.1011 +4.325054,60.4271 +4.246278,140.2152 +4.315431,73.0383 +4.312552,77.0316 +4.293089,99.3382 +4.243916,150.7243 +4.257005,141.9670 +4.335778,64.2085 +4.305008,100.7400 +4.252225,158.3444 +3.994550,417.9760 +4.385481,31.1068 +4.271576,148.2594 +4.360918,60.4480 +3.993087,430.4569 +4.398973,30.3938 +4.171127,260.4602 +4.355413,80.0415 +4.389584,49.3513 +4.280671,161.0043 +4.412527,30.9878 +4.174671,271.9348 +4.331992,117.3607 +4.302673,155.3176 +4.351418,108.0204 +4.339134,122.6497 +4.303697,160.9781 +4.394640,75.0782 +4.375678,95.5408 +4.328404,145.1693 +4.386493,88.0499 +4.196046,283.5651 +3.960279,523.3884 +4.405749,78.8721 +4.364506,128.6802 +4.225285,269.5358 +4.392428,103.7496 +4.443515,54.9623 +4.342758,159.8299 +4.053710,450.3468 +4.399987,106.9469 +4.235097,273.9184 +4.416589,96.0149 +4.365647,151.1606 +4.354143,163.5821 +4.493187,25.7136 +4.461784,63.3988 +4.294013,232.0912 +4.373590,154.1323 +4.410570,122.6927 +4.313536,222.2778 +4.244895,293.6207 +4.423544,116.8573 +4.321403,220.8943 +4.517726,26.9776 +4.070167,477.8699 +4.525183,27.2754 +3.364237,1192.8674 +4.533264,27.7824 +4.484621,78.0654 +4.429367,139.8327 +4.438936,132.8292 +4.469719,104.5239 +4.421367,154.2970 +4.479612,98.6061 +4.419836,161.3180 +4.516808,69.3213 +4.557105,29.9789 +4.518901,74.0454 +4.459439,137.8196 +4.569200,30.2956 +4.471219,129.2147 +4.483668,121.9964 +4.535814,71.8175 +4.281647,326.9732 +4.356544,253.2202 +4.107396,507.3522 +4.586130,29.5881 +4.552459,68.2847 +4.538516,83.6110 +4.599497,25.4507 +4.600434,27.5573 +4.506935,122.1142 +4.608620,25.8957 +4.561046,79.0080 +4.449353,192.9940 +4.571766,72.5960 +4.464676,184.8695 +4.581155,69.8253 +4.502589,150.0651 +4.578218,76.4284 +4.504058,153.8296 +4.634516,26.3472 +4.441676,223.4706 +4.622128,47.6738 +4.512604,166.3361 +4.494821,186.7964 +4.446606,237.2020 +4.620744,64.4833 +4.269953,417.3240 +4.627992,62.0567 +4.642348,52.8855 +4.575664,120.9518 +4.574243,125.7480 +4.678941,26.4257 +4.498478,207.8326 +4.681618,28.1746 +4.654647,57.1054 +4.548037,171.6914 +4.542298,178.8023 +4.388470,336.7896 +4.509015,219.1149 +4.629049,101.5190 +4.705367,26.1286 +4.540402,192.4542 +4.706311,30.3812 +4.709793,29.2771 +4.615718,128.4740 +4.657888,88.0367 +4.660864,87.8712 +4.719729,31.7153 +4.457991,297.8203 +4.731496,27.2313 +4.699992,60.8501 +4.473573,291.7640 +4.665147,102.3922 +4.544704,225.4802 +4.687278,84.4923 +4.744193,28.6412 +4.690049,87.7471 +4.650981,131.7286 +4.758728,26.3930 +4.755812,32.3010 +4.760842,31.0702 +4.299240,494.2786 +4.728131,72.4146 +4.745925,55.6590 +4.649546,153.2848 +4.739071,71.1607 +4.640055,174.1555 +4.730569,85.0110 +4.788113,28.4846 +4.526105,295.0808 +4.793519,31.0428 +4.751445,81.3079 +4.110783,724.3261 +4.770184,66.2127 +4.814211,25.1508 +4.597259,247.5431 +4.821186,25.8509 +4.115021,734.6831 +4.496178,354.4794 +4.624948,230.6690 +4.587085,273.2922 +4.835110,27.0156 +4.607632,255.9758 +4.810232,58.4752 +4.824563,49.4738 +4.435455,441.7287 +4.816598,61.9235 +4.802831,76.6809 +4.782710,98.2253 +4.721100,165.4122 +4.860377,27.0750 +4.862126,26.3455 +4.685228,207.6349 +4.765338,131.8471 +4.844803,54.8528 +4.767539,138.4990 +4.431588,476.1192 +4.847038,63.2305 +4.868708,43.8076 +4.832753,89.4616 +4.609764,314.6896 +4.725260,202.1689 +4.696617,233.3384 +4.839362,91.5703 +4.732857,199.8231 +4.887453,52.2171 +4.562687,380.5794 +4.605665,338.5630 +4.669802,275.8303 +4.877184,72.5987 +4.899656,58.4562 +4.886513,73.8401 +4.922215,39.9280 +4.943267,24.7130 +4.785121,186.6415 +4.614749,358.0350 +4.878522,95.2053 +4.863609,112.4217 +4.924455,58.0522 +4.527723,459.0384 +4.958113,30.8929 +4.892863,98.0002 +4.897186,96.2422 +4.927429,68.8555 +4.850658,146.5952 +4.967980,32.7511 +4.748736,255.3088 +4.888472,118.2194 +4.945633,65.3776 +4.989007,30.0147 +4.879512,140.7150 +4.912516,117.0003 +4.906039,124.0010 +4.976031,56.4030 +4.772835,260.4501 +4.990864,43.5286 +5.019022,17.4222 +4.736693,301.7311 +4.932680,106.0259 +4.972784,67.2758 +4.982507,58.0191 +4.800546,240.4116 +4.880936,161.3319 +5.006692,36.2394 +4.711753,331.4465 +4.644362,399.1149 +5.036444,8.5652 +5.038707,7.8951 +5.029517,19.1629 +4.695234,355.1825 +4.683809,367.9625 +4.801584,251.0553 +5.020228,33.2370 +5.042268,15.6394 +4.929956,128.7502 +5.050417,9.8819 +5.040958,20.8393 +4.652654,409.8492 +5.038424,26.1969 +4.849704,215.3368 +5.032434,35.7265 +5.045010,24.0028 +4.997254,72.1030 +5.043478,26.4464 +4.971763,101.6824 +5.052640,21.1390 +4.996285,80.0772 +5.040527,38.4483 +5.061798,18.1254 +4.907708,172.6191 +5.068162,13.1136 +5.043200,39.0607 +5.073446,10.7487 +4.910269,174.3160 +5.062504,22.6102 +5.060299,28.3955 +4.962144,127.8637 +5.078976,11.4526 +5.064622,26.8280 +4.815580,279.2807 +5.030041,66.0342 +4.930933,165.5774 +5.058706,38.8111 +4.986762,113.0473 +5.004045,96.0156 +4.777797,322.5928 +5.048680,54.7695 +5.088696,15.8457 +4.874037,231.9988 +5.034393,73.3337 +5.082261,27.0296 +5.094862,14.8587 +4.771770,339.2071 +5.096075,17.0197 +4.944228,172.0072 +4.474544,642.7128 +5.090008,27.8690 +5.090429,28.9741 +5.042932,76.9851 +4.592947,529.2598 +4.993428,129.2908 +5.080327,42.9043 +5.011011,113.4616 +5.069013,56.8495 +5.079924,49.1090 +5.084196,45.4249 +5.076363,53.8462 +5.051772,79.1160 +5.046602,84.7423 +5.069925,62.5734 +5.097518,36.6672 +5.103450,31.1719 +5.065042,71.5316 +5.057909,80.3358 +5.109292,30.4502 +5.096511,44.1122 +4.855617,286.0517 +5.099810,50.4918 +4.791913,359.3032 +5.053466,98.7320 +5.123232,29.9524 +5.116236,41.0288 +5.130889,27.1203 +5.104542,54.7710 +5.131346,31.5876 +4.949783,220.8937 +5.119404,51.9457 +5.140624,31.4160 +5.084585,92.4682 +5.100391,77.6195 +5.117257,62.7102 +5.117878,64.3566 +5.159314,24.8466 +5.129034,55.5368 +5.085115,101.5738 +5.119917,68.9821 +5.125864,65.4537 +4.836398,355.6744 +5.109721,83.0021 +5.162934,32.7041 +5.106037,91.9301 +5.184161,15.9593 +5.000732,202.4039 +4.939670,266.3530 +4.973728,232.9068 +5.130210,77.0331 +5.122720,85.2129 +5.150303,58.3290 +5.129621,82.8903 +5.195639,18.9773 +5.141669,76.9116 +5.033285,185.9186 +5.153185,67.5731 +5.203137,19.3558 +5.184571,40.7189 +5.206024,20.0955 +5.212512,15.1602 +5.158010,70.4694 +5.124473,108.1782 +5.170678,62.8330 +5.113096,121.5306 +5.179968,58.0327 +5.139742,100.1011 +5.132499,107.9767 +5.091450,151.2380 +5.188900,54.7350 +5.214617,33.1080 +5.208632,39.9434 +5.157265,91.7476 +5.218582,34.2989 +5.220759,35.6943 +5.171350,86.2255 +5.239844,20.0886 +5.178011,84.4192 +5.081276,184.0537 +5.073780,193.7940 +5.151217,116.9627 +5.197967,70.9868 +5.152198,121.1165 +5.226120,48.0972 +5.242689,33.0099 +5.252881,24.1272 +5.136574,144.1469 +5.219205,62.1845 +5.262431,20.6772 +5.234627,52.8786 +5.207244,81.4017 +5.134623,156.9268 +5.228480,66.1439 +5.249014,47.8138 +5.192073,105.7521 +5.268955,29.4936 +5.122207,182.9728 +5.233511,72.2838 +5.138245,169.8785 +5.177054,132.8073 +5.240476,71.4083 +5.040061,272.9577 +5.100061,213.9394 +5.294624,20.8792 +5.298449,19.5010 +5.287506,34.9322 +5.200121,125.2654 +5.257577,68.2644 +5.313019,13.8329 +5.280722,50.3058 +5.296828,34.9236 +5.274218,59.7642 +5.110978,224.2190 +5.206635,131.6931 +5.288646,51.6911 +5.322439,20.0725 +5.267575,78.6292 +5.273316,73.5682 +5.259933,87.6040 +5.207933,143.7083 +5.222493,131.6344 +5.265330,91.0097 +5.268180,88.8710 +5.338329,19.7962 +5.172041,189.9288 +5.069357,293.2305 +5.305796,58.5252 +5.192724,173.6132 +5.331753,36.8716 +5.227673,141.4847 +5.275700,94.3338 +5.305181,67.2573 +5.346205,27.9314 +5.325842,48.9262 +5.361970,13.4305 +5.134186,242.5560 +5.362589,14.9302 +5.366338,16.2679 +5.314001,69.6162 +5.357052,31.1903 +5.243636,145.9998 +5.375401,16.6189 +5.291550,103.5004 +5.364322,31.6248 +5.325387,71.6112 +5.368625,31.5549 +5.358126,43.4475 +5.383618,19.0188 +5.388243,16.9418 +5.346885,61.7276 +5.182235,227.0982 +5.238002,173.1448 +5.333983,77.8068 +5.342513,70.0624 +5.308124,104.8554 +5.382607,30.8793 +5.326852,89.4068 +5.405185,13.0480 +5.408613,12.2432 +5.232652,190.9330 +5.356341,68.4895 +5.413486,15.9882 +5.315504,117.5790 +5.309862,126.8486 +5.225291,212.0402 +5.418234,19.7212 +5.420857,19.9551 +5.340338,101.3696 +5.423586,20.4837 +5.331028,118.0804 +5.277009,173.5717 +5.351642,100.3096 +5.395051,59.8022 +5.186689,268.7980 +4.960354,496.4010 +5.441708,18.3856 +5.416260,45.5045 +5.107728,355.0922 +5.297826,168.2425 +5.436712,34.1245 +5.455488,16.7273 +5.191318,281.5560 +5.460094,16.6081 +5.317951,159.4001 +5.248576,234.9289 +5.392021,93.5183 +5.456755,29.6685 +5.402638,84.7010 +5.370034,118.3355 +5.470837,19.6511 +5.476703,17.0006 +5.429475,64.6341 +5.377519,117.6283 +5.369158,129.2523 +5.401574,97.4879 +5.440812,59.2381 +5.283108,218.1005 +5.389636,115.1781 +5.374769,131.1193 +5.462821,43.7839 +5.437332,72.1510 +5.451952,61.8345 +5.347538,166.9212 +5.424831,94.0126 +5.466069,54.6984 +5.412575,110.3147 +5.400181,123.4592 +5.354128,170.2320 +5.509483,18.8703 +5.485540,46.7179 +5.487340,46.7378 +5.433084,101.6335 +5.518844,16.6553 +5.454854,81.1277 +5.493704,44.9451 +5.495148,44.6025 +5.494110,46.1036 +5.411147,130.4888 +5.500051,42.5673 +5.412980,134.8914 +5.472875,77.0738 +5.437956,112.7451 +5.281390,270.8713 +5.461765,93.4772 +5.376743,182.5522 +5.528354,33.0261 +5.409334,152.8009 +5.444070,119.0940 +5.256454,310.0343 +5.311885,255.2714 +5.555243,17.5227 +5.490489,83.4023 +5.335198,240.4974 +5.498411,79.2555 +5.506605,71.6067 +5.520768,58.0538 +5.538650,42.2908 +5.504815,78.0750 +5.372439,213.2234 +5.449109,137.7197 +5.542619,46.4329 +5.247725,343.0662 +5.501210,93.9076 +5.499063,97.5396 +5.562135,35.2892 +5.374137,226.0750 +5.549950,51.7614 +5.566489,35.6405 +5.534718,68.0836 +5.523640,79.8006 +5.563165,47.4458 +5.573891,39.2993 +5.559296,55.1557 +5.600213,18.0309 +5.561381,58.0320 +5.539751,81.1861 +5.552262,71.7643 +5.550701,75.6947 +5.595118,32.6223 +5.477352,151.0732 +5.505888,123.6632 +5.618245,17.3456 +5.486424,151.1869 +5.580941,60.3093 +5.596603,45.3266 +5.597425,46.7396 +5.572766,72.3321 +5.628425,17.3807 +5.514460,137.5842 +5.450582,202.1097 +5.620938,37.3234 +5.590792,68.0896 +5.578822,82.4052 +5.602802,62.3910 +5.483506,182.2497 +5.513788,152.5297 +5.645099,22.7598 +5.577667,91.4943 +5.524361,146.6729 +5.603442,69.0201 +5.610612,64.7626 +5.629552,46.6147 +5.658262,18.6485 +5.645807,36.6682 +5.567157,116.2401 +5.602130,83.7067 +5.535500,152.4930 +5.589052,100.3596 +5.547872,145.1779 +5.395947,298.0133 +5.585663,110.8841 +5.672462,26.9495 +5.682476,18.4121 +5.637612,66.4821 +5.411790,296.0072 +5.601712,109.7747 +5.532258,180.0505 +5.671034,42.4974 +5.541636,172.3755 +5.626397,89.2478 +5.641930,75.7901 +5.661228,59.8632 +5.614452,108.3895 +5.624027,100.6170 +5.635591,92.0500 +5.619414,110.0442 +5.689413,40.8185 +5.665194,67.9888 +5.669162,65.0080 +5.711487,25.0419 +5.721092,17.7135 +5.724645,17.0726 +5.713532,31.5072 +5.658883,88.9046 +5.715645,36.4519 +5.687994,65.0077 +5.736530,16.8638 +5.722842,31.5503 +5.704095,50.9847 +5.699412,60.1331 +5.714012,46.4827 +5.676911,84.1099 +5.712309,49.2535 +5.707798,56.7327 +5.752098,13.7189 +5.641251,125.6071 +5.683398,85.5517 +5.675375,96.9750 +5.730232,43.1003 +5.652045,126.2776 +5.727641,52.2873 +5.665756,114.9312 +5.586830,195.9631 +5.768950,16.9496 +5.685838,103.3663 +5.773333,17.5295 +5.582890,211.0142 +5.540214,255.5258 +5.761032,38.2182 +5.535983,265.2649 +5.488370,313.8797 +5.733183,69.9551 +5.693961,110.0895 +5.753002,53.8964 +5.759546,49.5761 +5.793906,16.0474 +5.795741,17.6203 +5.738806,78.7104 +5.780688,40.1087 +5.700888,122.1289 +5.785901,38.5769 +5.806899,18.8005 +5.627741,199.9079 +5.809954,19.1850 +5.666318,164.8031 +5.693051,140.3713 +5.765817,68.6689 +5.817517,18.2491 +5.747788,90.2953 +5.729459,110.0078 +5.824478,15.8079 +5.578213,262.4913 +5.741718,103.1040 +5.803139,42.6483 +5.813362,35.2382 +5.766859,82.6195 +5.802251,48.6324 +5.782794,72.7338 +5.652692,204.0390 +5.613192,245.2629 +5.396999,463.1589 +5.825700,37.6326 +5.829139,37.1514 +5.779930,89.8502 +5.644165,227.5892 +5.717721,156.3482 +5.801248,74.8590 +5.761563,115.3880 +5.820798,57.2169 +5.799251,80.4995 +5.676167,204.6530 +5.840287,42.2517 +5.874070,12.7398 +5.790863,96.5948 +5.849479,41.9304 +5.879751,13.5601 +5.754393,141.2161 +5.856732,39.6600 +5.734171,162.8949 +5.855528,44.7893 +5.753394,150.0208 +5.848601,57.8264 +5.850884,58.3457 +5.860158,49.6855 +5.833422,79.3214 +5.878015,35.7046 +5.778323,136.0487 +5.880821,37.9427 +5.866291,53.9522 +5.858455,62.9885 +5.886810,37.0771 +5.887458,37.9330 +5.522891,402.9072 +5.869781,56.5810 +5.912745,14.4079 +5.876108,52.3931 +5.789205,141.7099 +5.918764,14.4507 +5.863333,73.6532 +5.900318,38.4595 +5.764532,175.8641 +5.834487,107.3568 +5.926362,17.5552 +5.906428,41.5369 +5.472216,477.9422 +5.913720,37.6525 +5.920244,32.2288 +5.923888,33.3341 +5.936987,21.2893 +5.938778,20.9593 +5.941844,20.8826 +5.943918,20.8364 +5.755080,212.4615 +5.835767,135.9311 +5.927153,45.1472 +5.823018,149.6900 +5.760495,214.2227 +5.914373,62.0472 +5.962727,15.4586 +5.893311,87.1397 +5.967542,14.7122 +5.772350,213.0171 +5.971698,14.3150 +5.745040,243.9367 +5.958277,34.6119 +5.978187,16.2604 +5.952474,43.5132 +5.896393,102.4316 +5.985368,15.7807 +5.930915,72.4810 +5.986014,18.0614 +5.928501,80.4514 +5.992890,16.6809 +5.845788,165.1865 +5.994448,17.7135 +5.976421,36.4400 +5.891410,125.2675 +5.696547,321.4072 +5.897066,121.5301 +5.925798,95.2868 +5.972709,49.2257 +6.008954,13.5532 +6.009572,13.5257 +5.903415,123.1570 +6.012162,17.5288 +5.988978,43.7558 +5.909844,124.6826 +6.012861,22.8547 +6.016678,20.6593 +5.804051,237.9828 +6.004076,38.9236 +5.933216,111.6265 +5.809123,239.2405 +5.839467,209.7879 +5.998825,51.4911 +5.838084,213.4525 +5.827650,226.1581 +5.575696,478.7678 +5.882539,173.7252 +5.982255,76.1711 +5.909230,151.0990 +6.034528,27.2673 +5.844823,218.4108 +5.957222,109.5109 +5.980452,87.6161 +6.054464,14.5206 +6.022507,50.6052 +6.061796,14.0560 +5.876952,199.8934 +6.017955,59.6605 +6.063234,17.3707 +5.947965,137.6678 +5.959738,127.5860 +5.974719,114.7140 +6.051537,39.1618 +5.534078,557.6777 +6.075852,16.5771 +6.018597,77.2105 +6.026573,70.2661 +6.068069,29.4386 +5.871755,229.0220 +6.043001,58.3515 +5.667860,434.4777 +6.068985,38.5562 +5.995988,112.2195 +6.060330,51.5788 +6.053809,59.9205 +6.056265,57.9178 +6.076846,45.0554 +5.921444,201.0871 +6.085634,37.5299 +6.021086,106.9722 +5.940396,189.9157 +6.003397,127.3076 +6.037338,95.5223 +6.095808,39.0296 +5.840704,294.5133 +6.066734,70.1981 +5.925392,213.3940 +6.021935,119.0297 +6.130313,13.9029 +6.049256,97.4193 +6.130705,16.6245 +5.951374,198.7559 +6.089433,61.2643 +6.077616,76.6681 +5.950159,205.6814 +6.138786,19.1840 +5.964755,197.0007 +6.035716,126.6217 +6.114183,49.4936 +6.144216,20.7111 +6.128059,40.0261 +6.042035,127.9827 +6.073113,98.8826 +6.044843,129.7279 +6.155841,19.6476 +6.048364,129.7024 +6.029691,150.1056 +6.161757,18.6417 +6.162339,19.7876 +6.080606,104.9590 +6.001150,185.6959 +6.168086,19.9802 +6.092430,98.5886 +6.140965,53.2021 +6.132861,62.3789 +6.134838,61.0536 +6.136933,59.8252 +6.179798,19.8785 +6.050317,152.3802 +6.185565,18.4151 +6.170018,35.5979 +5.972301,237.7567 +6.191019,20.9474 +6.113730,102.3830 +6.090699,126.4986 +6.010975,207.4745 +6.203981,16.8914 +6.023098,198.7304 +6.163677,61.8402 +6.205617,20.5450 +6.135218,95.4174 +6.174571,56.7109 +6.087325,144.6000 +6.180399,52.7898 +6.216113,19.9488 +6.220873,17.7995 +6.178067,64.2069 +6.032734,210.4782 +6.186846,57.5780 +5.895610,352.7975 +6.225518,23.6312 +6.211967,38.3962 +6.101352,150.2011 +6.238673,14.8754 +6.196759,61.1621 +6.164928,94.3126 +6.226162,36.2430 +6.096840,167.1959 +6.248408,18.0475 +6.108208,159.2387 +6.221829,46.2610 +6.195893,77.4448 +6.122532,151.4390 +6.236063,40.1771 +6.194168,83.7551 +6.231283,47.9767 +6.231925,49.6467 +6.150698,132.6750 +6.267448,16.4658 +6.150130,134.7225 +6.243213,43.4401 +6.233190,56.8784 +6.154285,136.4216 +6.279263,13.9685 +5.831122,463.7946 +6.262406,33.9876 +6.230636,68.2321 +6.249150,52.2254 +6.058427,243.6362 +6.259241,44.4029 +6.091756,217.2972 +6.273338,38.9319 +6.296394,17.0522 +6.257922,60.6093 +6.100778,218.8325 +6.242274,79.9906 +6.199677,125.2281 +6.102338,224.2458 +6.276241,54.4722 +6.293232,40.6666 +6.171997,162.5081 +6.121902,213.4803 +6.290707,47.7669 +6.283374,56.2404 +6.217198,124.2306 +6.146676,198.0536 +6.244425,101.3305 +6.312271,36.7950 +6.309054,40.7428 +6.123164,230.2864 +6.182127,172.7143 +6.266456,90.3505 +6.195241,166.3721 +6.277924,85.4216 +6.147330,217.0995 +6.326585,39.6141 +6.333900,33.8459 +6.210058,159.1068 +6.283914,86.5955 +6.097508,273.5686 +6.335383,36.8881 +6.294917,78.8899 +6.361613,14.2195 +6.319611,58.5740 +6.364430,15.8537 +6.302063,81.5246 +6.218450,165.7656 +6.290069,95.9883 +6.341430,46.8668 +6.281573,110.1214 +6.284853,109.3157 +6.188067,207.0948 +6.175489,220.6577 +6.380285,19.0111 +6.384216,16.6716 +6.298869,107.6115 +6.369166,38.7386 +6.366199,42.3299 +6.322266,87.5360 +6.353452,61.7310 +6.324906,91.3545 +6.344730,71.9441 +6.400889,16.2019 +6.157971,261.0382 +6.264036,157.0135 +6.202698,221.5723 +6.251554,175.1982 +6.372272,55.3266 +6.370510,58.2397 +6.395162,38.0369 +6.349066,84.8598 +6.339615,96.1372 +6.286653,153.1553 +6.396148,45.7916 +6.273972,171.2207 +6.391695,55.8693 +6.349798,98.3959 +6.433200,18.0480 +6.253549,198.6522 +6.406481,47.9264 +6.111909,344.7080 +6.313447,144.1590 +6.428750,30.6899 +6.419010,41.4806 +6.383589,77.9996 +6.426753,37.5036 +6.415183,49.7825 +6.375834,89.9627 +6.451249,15.1580 +6.356807,110.8221 +6.456618,14.9737 +6.416261,56.2700 +6.417091,60.3818 +6.301376,177.2609 +6.439809,39.6521 +6.367746,113.0853 +6.433927,47.7879 +6.464966,19.4811 +6.408530,80.6224 +6.466407,23.5835 +6.471592,19.4058 +6.424271,69.4598 +6.250364,246.3300 +6.334505,163.4048 +6.421050,78.3228 +6.330714,169.6307 +6.445193,56.4344 +6.484448,19.1819 +6.378186,126.4847 +6.338475,169.6454 +6.452202,58.2963 +6.416675,95.1903 +6.493731,20.7432 +6.363346,157.3965 +6.388297,134.4803 +6.467630,56.5399 +6.447565,77.7981 +6.399297,127.1698 +6.477473,49.7966 +6.457607,70.7371 +6.394170,136.1659 +6.497911,38.2112 +6.520743,18.9779 +6.481716,58.9888 +6.503631,38.8749 +6.480833,62.3597 +6.511866,34.8389 +6.472531,75.6206 +6.303645,246.2956 +6.490998,61.5183 +6.489153,66.6327 +6.524171,32.3122 +6.539722,17.1680 +6.540705,16.5903 +6.542506,18.3355 +6.345756,216.1859 +6.448194,118.7399 +6.460491,107.9013 +6.409802,160.0499 +6.556483,15.2479 +6.536123,39.2561 +6.557296,19.6029 +6.504671,73.6245 +6.354842,226.8191 +6.552517,30.6878 +6.528344,56.9092 +6.556890,30.9660 +6.571732,18.5106 +6.555786,35.1109 +6.386058,205.4733 +6.522778,70.3901 +6.496695,100.6869 +6.489991,107.9614 +6.441940,156.5248 +6.568393,31.4853 +6.499374,102.8043 +6.587857,15.1866 +6.478638,125.2890 +6.549941,55.5972 +6.591532,14.7099 +6.461589,149.9603 +6.560842,51.8419 +6.318531,300.2532 +6.602179,17.1710 +6.603044,16.8814 +6.603927,16.5894 +6.576900,44.2547 +6.578296,44.0447 +6.107542,515.4721 +6.435753,189.3712 +6.561943,66.9215 +6.599879,29.9845 +6.611550,19.4633 +6.618785,17.0072 +6.619350,16.8361 +6.593169,43.9645 +6.407905,229.6377 +6.619926,18.7353 +6.620517,18.5477 +6.454408,187.2581 +6.268090,374.4279 +6.606242,37.3845 +6.590243,53.9677 +6.569853,76.0321 +6.373808,275.5128 +6.622342,27.9277 +6.623015,29.4241 +6.527271,128.5978 +6.464257,192.8399 +6.641667,17.3553 +6.508121,152.9174 +6.465797,197.2741 +6.585254,81.4113 +6.479462,190.9086 +6.530336,144.4959 +6.566935,109.0497 +6.526467,150.5134 +6.657098,21.0212 +6.621155,57.8933 +6.612685,67.6044 +6.427599,253.3283 +6.625125,58.6085 +6.666666,18.7129 +6.649321,40.7348 +6.674833,15.8129 +6.590898,101.1499 +6.597953,94.7251 +6.510499,184.0159 +6.631014,68.2622 +6.643628,56.7414 +6.637543,63.7505 +6.543193,159.0297 +6.628865,75.1188 +6.635793,71.9556 +6.525364,183.0204 +6.690057,20.1979 +6.694516,20.5806 +6.699277,16.8186 +6.581662,138.3967 +6.605539,115.6587 +6.650270,71.3672 +6.636187,86.0975 +6.707749,15.2425 +6.459441,264.9038 +6.701294,25.9488 +6.637134,91.5685 +6.716096,13.2732 +6.683734,50.6132 +6.703984,30.9779 +6.700370,35.2138 +6.598465,139.4502 +6.638662,100.0460 +6.708385,34.2660 +6.679049,65.2425 +6.715097,29.8815 +6.501628,246.0709 +6.722285,30.0637 +6.734963,19.2753 +6.685380,70.1474 +6.655869,102.9566 +6.676981,82.2385 +6.690646,68.9626 +6.661039,99.1936 +6.742651,18.8441 +6.645886,118.8448 +6.629864,135.6165 +6.546705,220.2743 +6.692679,74.7773 +6.680290,90.5732 +6.758826,12.6672 +6.548152,224.0111 +6.744979,30.4292 +6.760234,19.2854 +6.659023,122.1917 +6.722992,60.5465 +6.735584,50.4691 +6.728703,58.6373 +6.771494,17.3452 +6.680928,108.7146 +6.738709,52.6212 +6.770864,25.0370 +6.644211,153.6143 +6.734348,64.9338 +6.737916,62.4179 +6.783540,18.5046 +6.754239,50.2402 +6.663072,142.4774 +6.670372,137.2856 +6.678120,134.6667 +6.642519,170.8262 +6.721638,93.7232 +6.583206,234.3252 +6.802045,17.0381 +6.710255,111.3803 +6.761496,61.8177 +6.781215,43.2280 +6.639066,185.8173 +6.759220,67.8622 +6.812787,16.4703 +6.800335,31.4595 +6.787341,48.6515 +6.729370,110.1070 +6.821636,19.8503 +6.766980,78.2519 +6.702223,144.9211 +6.786054,62.8949 +6.727244,122.7634 +6.823314,29.9118 +6.819083,37.8733 +6.764731,92.8650 +6.841487,18.2872 +6.652440,210.2295 +6.514475,351.4673 +6.795902,70.9766 +6.817532,51.9535 +6.752349,119.5952 +6.848949,24.7860 +6.799282,78.1768 +6.744292,134.3021 +6.804479,76.2699 +6.862670,18.7247 +6.824883,57.1559 +6.788840,96.2472 +6.791331,99.0805 +6.765481,127.8635 +6.371077,522.8932 +6.759609,135.0948 +6.747700,147.4134 +6.755528,142.8617 +6.882040,16.7925 +6.831795,71.4526 +6.865943,37.9752 +6.873736,30.8413 +6.597383,308.6739 +6.775409,135.2830 +6.878595,34.2909 +6.869486,47.0692 +6.866879,50.5262 +6.881395,37.3819 +6.789643,129.7894 +6.767457,152.9835 +6.797826,126.5105 +6.871945,54.0269 +6.845236,81.9150 +6.910693,18.2063 +6.903919,30.2244 +6.859775,75.0399 +6.877459,60.2604 +6.894705,43.6279 +6.724345,214.9094 +6.857597,82.3368 +6.880750,61.2089 +6.850008,92.4179 +6.893970,49.2576 +6.772164,175.1185 +6.934815,14.1330 +6.893345,61.1338 +6.919433,36.6207 +6.934144,25.9525 +6.898390,63.2259 +6.924337,38.2260 +6.925973,37.6257 +6.898833,66.5374 +6.927152,42.3974 +6.675985,296.9871 +6.839477,136.3299 +6.960097,16.0895 +6.916562,61.7415 +6.824444,154.4376 +6.906057,73.2307 +6.827083,152.9429 +6.813346,170.0844 +6.943229,40.8270 +6.918778,65.9782 +6.815361,173.3003 +6.903248,88.6682 +6.975808,16.6389 +6.885088,110.4762 +6.920441,75.5162 +6.853227,143.1065 +6.965371,31.5371 +6.976187,21.8907 +6.917406,83.6970 +6.963599,40.1372 +6.983431,23.1237 +6.721198,288.2169 +6.942426,67.6432 +6.829258,182.6916 +6.991917,20.6079 +6.992447,22.2340 +6.972973,42.4558 +6.995565,20.3044 +6.962564,56.2453 +6.995957,24.0909 +6.856957,164.1078 +7.001103,21.9752 +6.984756,42.0460 +6.954479,74.3441 +6.978882,51.4582 +7.014682,17.0909 +7.015869,18.2853 +6.692048,344.3561 +6.984056,56.0438 +7.003737,38.0095 +6.969550,73.1174 +6.805550,242.0852 +6.847146,201.9169 +6.961617,88.2201 +6.779520,271.6871 +7.036405,17.7576 +7.023079,37.4370 +6.835993,225.2859 +7.011950,49.9737 +6.941959,120.9443 +7.015430,52.5080 +6.904578,164.0020 +6.937720,132.3160 +6.720059,350.6248 +6.912887,159.7048 +7.026803,47.0473 +7.041748,34.9025 +7.047636,29.9405 +6.928900,154.0312 +6.890412,194.4833 +7.034155,52.3120 +7.020049,68.1286 +7.072592,17.7787 +7.073851,18.8578 +7.030341,63.5778 +6.948949,148.0755 +7.070684,28.9614 +7.051208,51.6940 +7.054163,49.8042 +7.068581,36.0068 +6.575379,530.7445 +7.049838,57.5088 +7.006555,101.4507 +7.031773,81.0170 +7.070037,46.5750 +6.939255,179.2518 +7.076651,42.8108 +6.979288,142.6324 +7.090371,33.4475 +7.021066,103.8181 +7.088178,39.9778 +7.028825,104.5369 +7.049063,85.5913 +7.010070,125.1870 +7.067938,70.8697 +6.980027,159.3944 +7.121922,19.8830 +7.018810,124.5141 +7.082932,63.4522 +7.062904,86.8888 +7.103968,46.6963 +7.116613,38.2221 +7.106124,49.9612 +7.099647,57.1306 +7.138809,18.8918 +7.084896,73.2953 +7.012526,148.1935 +7.093919,68.0413 +7.133362,29.2178 +7.102902,63.6024 +7.154835,12.2275 +6.938333,230.0458 +6.978304,192.6315 +7.134655,37.0924 +7.135258,37.6513 +7.160720,15.1829 +7.107347,71.0333 +7.156086,24.5657 +7.166505,15.5359 +7.167063,18.7652 +7.061280,126.8296 +7.157701,34.6842 +7.143325,50.7514 +7.119462,75.9682 +7.161961,34.7552 +7.060517,140.3782 +7.162581,39.6959 +6.996909,206.3683 +7.182042,22.4262 +7.185829,20.9957 +6.939934,269.1916 +7.170936,40.8336 +7.118507,97.1500 +7.128157,88.3500 +6.895114,323.2033 +6.996334,222.6166 +7.180652,39.3478 +7.042668,183.7166 +7.168380,59.2818 +7.188110,40.2211 +6.807658,421.3427 +6.500345,729.3554 +7.200896,33.0544 +7.202277,34.7422 +7.108006,131.7035 +7.178381,63.4862 +7.009416,233.0731 +7.061924,182.1746 +7.112791,133.6946 +7.215658,33.6928 +7.141805,108.2413 +7.233951,17.3547 +7.206826,46.4942 +7.149794,107.5169 +7.195431,65.4990 +7.086468,175.1859 +7.227662,34.6077 +7.150665,112.2407 +6.998078,265.8005 +7.250047,16.6397 +6.956055,317.3508 +7.211770,62.8103 +7.204469,71.3967 +7.175903,103.4891 +7.194077,88.5280 +7.097025,186.8784 +7.237020,49.2239 +7.146385,140.4959 +6.947283,340.6292 +7.244100,47.8297 +7.092709,200.1891 +7.123819,169.8898 +7.279393,14.8631 +7.158192,136.9655 +7.209127,91.4082 +7.286244,14.8818 +7.216508,85.2358 +7.228332,74.5425 +7.257311,46.2085 +7.262270,46.2836 +7.291930,17.2622 +7.286881,23.4902 +7.104588,208.3724 +7.253321,62.6556 +7.040101,276.8241 +7.218951,98.8961 +7.287913,31.7543 +7.241868,80.3141 +7.196717,127.3328 +7.220001,106.8833 +7.315977,13.1217 +7.293710,36.5408 +7.239711,91.3590 +7.274581,57.3184 +7.302875,32.3785 +7.246486,89.2670 +7.172910,163.6126 +7.229701,109.1391 +7.292899,46.9515 +7.329099,13.6154 +6.988662,356.9869 +7.330251,16.5946 +7.300536,50.4609 +7.242490,109.3022 +7.294257,58.7565 +7.266687,88.4030 +7.260931,98.2248 +7.282606,77.4963 +7.261655,100.4463 +7.342715,21.3880 +7.249351,117.0810 +7.345650,24.9494 +7.350997,20.1878 +7.301127,72.9935 +7.229001,148.6491 +7.339851,39.7583 +7.309193,71.7281 +7.324050,57.7964 +7.275866,107.0068 +7.312961,71.0209 +7.336523,49.7684 +7.283904,103.4859 +7.370600,19.5273 +7.156778,238.7662 +7.360103,36.3133 +7.353015,44.9089 +7.379610,20.1945 +7.273406,127.6002 +7.382874,20.4291 +7.326885,78.3122 +7.303521,103.6526 +7.301744,107.2129 +7.295158,115.8576 +7.322183,90.4965 +7.331070,83.1351 +7.366433,48.5804 +7.401007,15.1361 +7.218318,198.6857 +7.386292,31.5437 +7.226385,192.2075 +7.124885,294.1119 +7.364104,57.5998 +7.346846,79.6067 +7.412680,15.0945 +7.351793,76.6770 +7.263880,171.4137 +7.308555,127.6822 +7.416144,20.7666 +7.139422,299.7139 +7.414206,27.9553 +7.338841,105.7229 +7.428470,18.4598 +7.399805,50.1318 +7.417836,32.9332 +7.407174,45.8503 +7.396417,57.4247 +7.387391,68.2777 +7.335254,120.8345 +7.192386,266.5545 +7.395545,63.8220 +7.408958,50.9757 +7.449938,11.4474 +7.453025,11.2329 +7.377651,89.3975 +7.415014,54.9252 +7.411016,61.4609 +7.317848,155.9318 +7.359156,116.8367 +7.390128,88.4908 +7.427775,51.4804 +7.464258,17.3694 +7.467049,19.6867 +7.362102,125.2803 +7.251306,239.4775 +7.455669,36.0708 +7.459934,34.4378 +7.335754,162.4720 +7.316925,181.7107 +7.456089,43.6869 +7.436911,63.8210 +7.486736,15.6475 +7.418997,83.8756 +7.077577,429.6850 +7.494372,13.7740 +7.459367,50.5585 +7.418593,94.6515 +7.355091,159.4942 +7.374121,141.4189 +7.479256,39.1736 +7.502873,16.5769 +7.403303,123.0337 +7.439136,89.1909 +7.473780,56.2698 +7.513245,18.8140 +7.371186,165.3929 +7.461386,77.0828 +7.380922,162.1448 +7.426454,119.2868 +7.171749,376.0766 +7.515540,34.4539 +7.498226,52.8621 +7.481628,71.4193 +7.536579,19.0805 +7.262907,297.1679 +7.498637,62.0656 +7.543067,19.9635 +7.444565,120.8570 +7.491740,74.7666 +7.381847,186.7581 +7.530051,42.5000 +7.528328,44.8931 +7.532060,41.8188 +7.446931,131.2906 +7.490794,90.0505 +7.458941,123.8474 +7.526338,58.0457 +7.507263,78.4768 +7.453842,132.9440 +7.551089,36.0873 +7.547826,39.7409 +7.545741,44.9087 +7.549995,41.2365 +7.450770,141.2176 +7.383983,210.8793 +7.538469,57.0264 +7.436237,165.6432 +7.555660,48.7474 +7.475994,129.4036 +7.397924,208.1216 +7.500732,106.3858 +7.568606,42.0637 +7.594863,17.9569 +7.469940,143.9030 +7.560703,58.4635 +7.421704,200.2496 +7.518430,107.3025 +7.203278,423.5347 +7.610671,18.7648 +7.586786,44.0704 +7.487383,144.4410 +7.573222,59.5158 +7.435294,199.1977 +7.310372,324.5120 +7.565422,72.6675 +7.572552,67.8372 +7.472477,170.8207 +7.514586,129.4005 +7.442162,202.5066 +7.566508,78.7595 +7.553048,93.6710 +7.601881,47.2625 +7.417004,234.3230 +7.590650,64.2496 +7.606047,51.9995 +7.638090,21.1375 +7.587567,74.3668 +7.644669,18.0011 +7.646720,19.2423 +7.587177,79.6773 +7.478619,190.2648 +7.509926,161.5727 +7.630857,42.8557 +7.405197,269.7074 +7.585740,90.2326 +7.612821,66.4885 +7.662671,17.0544 +7.665963,14.5648 +7.563031,121.7053 +7.629436,56.3257 +7.671500,14.9339 +7.621955,65.8305 +7.675974,16.0119 +7.560075,132.6854 +7.632738,62.3394 +7.679309,16.3605 +7.519450,180.3999 +7.625733,75.8464 +7.595496,108.9845 +7.673714,31.9950 +7.640390,68.5326 +7.502384,210.0467 +7.692761,20.3839 +7.591232,122.7503 +7.631824,86.3659 +7.634885,85.5697 +7.699851,21.2168 +7.701581,23.3283 +7.651328,76.8730 +7.661935,67.6418 +7.668885,61.3745 +7.604409,127.2218 +7.319668,412.6124 +7.634492,100.3261 +7.704481,33.9433 +7.613843,126.9233 +7.645268,97.2409 +7.724910,19.2600 +7.728201,19.3509 +7.695671,52.7708 +7.584384,166.8273 +7.582789,172.3130 +7.649144,106.6804 +7.713146,43.9370 +7.705709,54.1092 +7.738425,22.2156 +7.578222,183.5718 +7.508147,254.3219 +7.734819,28.9109 +7.732281,32.8066 +7.730260,36.5178 +7.591988,181.0839 +7.573879,199.8323 +7.331900,444.6953 +7.684737,93.9127 +7.731631,49.7488 +7.607119,175.5742 +7.729577,53.7814 +7.713983,72.2364 +7.742509,46.6023 +7.773073,19.7339 +7.695078,102.0818 +7.659229,138.5856 +7.781381,16.8367 +7.760642,38.8822 +7.686434,115.5197 +7.666855,135.7694 +7.687786,116.4646 +7.789112,15.5449 +7.759819,45.5130 +7.680528,128.8294 +7.783359,27.1836 +7.643299,168.7527 +7.782693,32.0692 +7.708923,106.5572 +7.765088,53.5195 +7.619167,202.3256 +7.804251,17.8990 +7.755103,67.6878 +7.755825,71.1625 +7.809358,19.6520 +7.763730,66.2452 +7.712432,120.3881 +7.815481,18.8187 +7.744170,94.9958 +7.740767,99.5038 +7.799524,41.5865 +7.643987,198.6498 +7.829976,14.8764 +7.751212,95.2380 +7.721069,126.6047 +7.797160,51.4525 +7.747553,103.3723 +7.626813,227.5393 +7.605398,249.6026 +7.720455,137.5718 +7.812052,46.9508 +7.801954,59.1887 +7.757084,104.6996 +7.658047,206.5501 +7.844853,20.9986 +7.691986,177.4698 +7.778650,91.4264 +7.761794,113.6987 +7.829011,47.4809 +7.762469,115.8898 +7.861144,17.8743 +7.786220,95.3330 +7.580846,305.0839 +7.654901,232.8574 +7.869457,19.2229 +7.792807,97.7413 +7.848613,43.6168 +7.797815,96.5327 +7.840272,57.5500 +7.798218,101.7031 +7.832821,69.7149 +7.776596,129.4830 +7.499777,408.7196 +7.870077,40.8509 +7.864598,50.7000 +7.879019,36.9209 +7.818608,99.4706 +7.854353,66.3007 +7.902536,18.7580 +7.826989,97.8292 +7.805332,120.4141 +7.821493,108.6571 +7.847674,85.1561 +7.908497,25.3329 +7.861784,74.7641 +7.897822,40.3377 +7.920654,18.5489 +7.846451,93.4055 +7.822791,120.5381 +7.876493,69.3380 +7.899922,47.2516 +7.822151,128.0295 +7.865853,85.3160 +7.834300,120.2012 +7.890549,66.0676 +7.906080,51.3524 +7.945831,15.5406 +7.918080,45.4258 +7.878360,86.4566 +7.804658,163.4813 +7.748442,223.0325 +7.932831,39.5908 +7.939857,34.1600 +7.933831,40.7310 +7.679726,295.6276 +7.810543,167.9327 +7.859003,120.0249 +7.814763,168.8337 +7.930151,58.3098 +7.950181,39.9355 +7.975354,15.4043 +7.947174,45.2156 +7.956617,37.5452 +7.978477,16.8485 +7.885930,110.0611 +7.855001,144.1998 +7.983598,17.8599 +7.915299,91.4658 +7.841111,166.3309 +7.887759,120.6261 +7.842638,167.0107 +7.972423,40.3782 +7.910929,103.5217 +7.850926,165.2452 +7.943330,74.7895 +7.963506,55.2269 +7.924819,96.7476 +7.974562,47.8163 +7.674905,350.7139 +7.875494,150.7805 +7.961373,66.5830 +7.971475,58.9391 +7.766778,265.5371 +8.018120,15.0893 +8.014451,20.4217 +8.006765,34.2183 +8.008385,35.8988 +7.915940,130.5787 +7.685763,361.8012 +7.995992,52.2413 +8.012802,37.9859 +7.773712,277.9644 +8.034873,19.3026 +8.040985,17.7194 +7.994163,66.6189 +8.016172,45.6525 +8.026275,37.9451 +7.957433,108.0676 +7.839167,231.3762 +7.939204,131.9810 +7.892231,180.3623 +8.018734,55.5808 +8.009649,67.4439 +8.060783,17.4277 +8.001458,82.3731 +8.022379,62.2706 +8.051677,34.0446 +7.921295,167.3179 +8.007443,82.5055 +8.044285,46.9534 +7.938161,154.0936 +7.968140,125.7057 +8.030415,64.8080 +8.078211,18.4262 +8.027956,70.4146 +8.046519,52.2278 +8.061825,39.4261 +7.954502,147.5062 +7.990759,113.2136 +8.074315,30.0559 +8.033210,71.8846 +7.990117,116.2804 +8.058705,51.5541 +8.098371,14.5427 +8.089949,26.4865 +8.047564,70.3793 +7.951169,167.4330 +8.050788,68.4711 +7.999202,125.7684 +8.021567,106.4039 +7.894348,234.6266 +8.072594,57.4186 +7.979029,153.3665 +8.070543,63.4481 +8.117944,19.0457 +7.925747,211.9674 +7.974017,166.5186 +7.936548,207.8355 +7.988462,156.7294 +8.112915,33.1704 +8.133992,13.3412 +8.077094,70.8327 +8.054177,96.8948 +8.132396,21.1216 +8.118603,36.0806 +8.071185,86.9907 +8.065501,94.3528 +8.144384,17.2559 +8.098748,63.5456 +8.130013,33.2609 +8.124971,41.3033 +7.802625,366.9949 +8.136991,34.5018 +8.096638,78.4428 +8.147334,28.3792 +8.140537,36.6703 +8.158177,20.4297 +8.146086,36.6969 +8.085722,97.5010 +8.093846,91.3047 +7.858027,329.0976 +7.888680,301.4322 +8.092255,98.4821 +8.159854,33.7311 +7.992390,202.1047 +8.088613,106.4947 +8.154684,41.0360 +8.106398,93.0204 +8.025620,177.6917 +7.964817,240.0754 +7.881554,324.1934 +8.101251,104.8699 +8.119260,89.9565 +8.178607,31.0098 +8.193586,16.7526 +8.102009,110.9953 +8.163274,51.6288 +8.199419,17.8012 +8.177207,41.9080 +8.032316,188.5386 +8.204893,17.4881 +8.128975,96.6278 +8.209217,17.0189 +8.209617,19.5210 +8.169621,60.9856 +8.145192,88.5585 +8.103973,131.3403 +8.190113,45.8818 +8.162294,74.8167 +8.206122,33.4088 +8.222382,19.1464 +8.175714,72.8929 +8.183224,66.0830 +8.137715,112.1939 +8.175082,75.4370 +8.195109,56.3640 +8.233751,18.4091 +8.190738,65.9317 +8.083832,174.4404 +8.147927,111.7490 +8.182783,80.0861 +8.210339,55.6625 +8.248608,19.4298 +8.252161,17.5014 +8.230607,40.9625 +8.213005,61.3470 +8.219116,57.1977 +8.205748,72.3306 +8.217221,61.5440 +8.194495,84.7003 +8.266003,14.7979 +8.226241,56.5239 +8.241529,43.9415 +8.091239,197.1753 +8.249910,39.8970 +8.239531,52.4220 +8.237111,55.4993 +8.268038,27.9442 +8.095223,202.7317 +8.064221,234.7049 +8.161641,140.5266 +8.259677,43.7481 +8.280801,23.5662 +8.288415,16.6256 +7.718191,589.4980 +8.235314,75.6263 +8.104371,212.1501 +8.203312,113.6207 +8.295983,23.8419 +8.278765,42.1363 +8.285471,36.0077 +8.048234,274.1146 +8.220856,102.9289 +8.271570,52.9490 +8.298927,28.3127 +8.166275,161.8168 +8.249308,83.7615 +8.307690,27.0096 +8.319825,16.8143 +8.320902,16.3628 +8.214904,128.8535 +8.151072,194.7960 +8.084650,261.8228 +8.297956,49.1370 +8.105095,243.6707 +8.279196,70.6627 +8.269663,81.3151 +8.262870,88.7790 +8.333070,20.2623 +8.302168,55.2205 +8.276314,81.8905 +8.292611,67.3220 +8.291954,68.3832 +8.278079,84.9395 +8.321479,42.4045 +8.256670,107.6528 +8.250519,114.4337 +8.251473,115.3546 +8.282765,86.8174 +8.359934,12.0542 +8.187126,187.6484 +8.350978,26.3407 +8.324520,54.7707 +8.185151,195.0922 +8.343758,43.4392 +8.349860,38.2731 +8.305041,84.3242 +8.353333,38.6772 +8.303425,91.6332 +8.336640,59.1609 +8.310941,87.4291 +8.337265,64.2406 +8.351649,51.1264 +8.363019,45.6336 +8.392011,17.2719 +8.395059,15.2588 +8.346474,65.1458 +7.995326,418.3053 +8.380244,38.9443 +8.235996,183.8122 +8.402777,17.9070 +8.323785,99.7133 +8.374775,51.7191 +8.387198,39.9026 +8.347093,82.9331 +8.127971,302.9448 +8.258273,175.6859 +8.289808,145.6132 +8.413632,24.1080 +8.316934,122.2142 +8.328092,112.2105 +8.423499,17.6217 +8.427101,15.9214 +8.401507,41.9130 +8.316522,127.5601 +8.419809,27.0387 +8.345869,107.1831 +8.408653,46.7242 +8.395802,61.4233 +8.366829,91.0345 +8.322349,136.5516 +8.443420,17.0451 +8.409283,53.3916 +8.327240,136.0930 +8.446848,20.1527 +8.195721,275.3335 +8.348766,123.2574 +8.455378,17.2752 +8.437740,38.2197 +8.419189,58.7106 +8.364953,116.4108 +8.426494,55.5026 +8.389366,93.0351 +8.388133,94.8260 +8.357389,126.3846 +8.369584,115.6385 +8.472654,14.0847 +8.475961,12.8923 +8.477900,12.2385 +8.360338,133.1252 +8.225604,269.1562 +8.171494,326.1952 +8.457226,41.8645 +8.229139,270.6454 +8.485223,16.1862 +8.443023,60.2232 +8.481365,24.8686 +8.488854,18.2933 +8.363884,144.5299 +8.410319,101.4689 +8.379291,133.0979 +8.494761,19.4288 +8.371989,143.9015 +8.153518,367.3310 +8.458901,62.6493 +8.472024,49.9806 +8.110259,413.7748 +8.420684,104.4598 +8.411620,114.7011 +8.511788,14.9829 +8.444083,83.6151 +8.460466,69.9703 +8.440303,91.3948 +8.453053,81.8224 +8.507148,29.9165 +8.364323,173.3756 +8.524035,14.9485 +8.521551,22.1820 +8.514190,31.1715 +8.439148,107.8363 +8.430027,118.7087 +8.531699,18.7709 +8.493463,58.0911 +8.525145,32.0288 +8.304368,254.1689 +8.501409,61.5687 +8.520850,43.6049 +8.508415,56.6861 +8.526322,41.0957 +8.457864,113.2155 +8.527698,44.4077 +8.512389,61.1531 +8.441121,133.1996 +8.116436,462.1833 +8.515891,64.5100 +8.564456,17.6210 +8.482960,100.4184 +8.565102,19.7791 +8.567418,19.6687 +8.522005,68.0076 +8.481998,111.1931 +8.546986,47.3280 +8.490140,105.0884 +8.550470,48.1755 +8.543734,57.2618 +8.583379,18.5049 +8.503247,101.5168 +8.430917,174.9097 +8.483774,123.2124 +8.590014,18.9075 +8.545363,66.2561 +8.580402,32.2890 +8.497689,116.7565 +8.482402,133.5973 +8.435421,183.6794 +8.558538,61.5142 +8.398371,222.9047 +8.578620,44.6938 +8.463334,162.3731 +8.534876,94.5490 +8.486739,147.0955 +8.594314,41.6925 +8.619101,17.5960 +8.573543,64.2177 +8.625707,17.1940 +8.358205,285.3692 +8.537700,111.7171 +8.600996,49.0842 +8.584881,65.8182 +8.595229,56.9493 +8.593191,61.4881 +8.499091,157.0799 +8.614447,42.5642 +8.620052,37.4505 +8.582077,78.8388 +8.636698,25.2307 +8.616000,51.1156 +8.606987,61.4928 +8.551555,117.9049 +8.548737,123.1348 +8.526772,148.3450 +8.471055,204.9487 +8.660917,19.5828 +8.657012,24.1395 +8.608922,75.2086 +8.467001,222.4149 +8.587087,103.4927 +8.621276,71.4635 +8.433960,259.6874 +8.499785,195.8138 +8.675117,21.5666 +8.649417,48.3911 +8.681152,17.1820 +8.636007,65.8049 +8.623315,79.2246 +8.633835,69.2960 +8.530437,173.1702 +8.695599,12.5314 +8.629425,80.6908 +8.506234,204.9794 +8.643575,70.3661 +8.538984,176.1798 +8.571080,150.0821 +8.642902,79.5498 +8.689417,36.2354 +8.692741,38.1215 +8.713942,17.8275 +8.684131,49.0439 +8.562979,171.3233 +8.605827,131.3033 +8.377320,361.2100 +8.721163,19.6958 +8.667116,78.1498 +8.637761,109.3314 +8.710117,37.8888 +8.730863,19.0670 +8.574322,176.3247 +8.572107,182.3063 +8.669461,86.3072 +8.737131,20.1953 +8.711214,50.0660 +8.702540,61.2185 +8.745266,19.0641 +8.537065,228.4761 +8.733176,34.1310 +8.601885,167.0557 +8.690581,81.2039 +8.676005,96.8085 +8.754414,18.9997 +8.557174,217.5187 +8.598647,178.7249 +8.611619,167.6367 +8.767308,13.8001 +8.612691,169.0366 +8.765542,16.5808 +8.668481,115.6634 +8.757327,28.9140 +8.738530,48.2951 +8.680500,107.2205 +8.777372,12.0463 +8.334700,457.9434 +8.781108,12.1674 +8.661929,137.0244 +8.696685,103.6036 +8.761281,39.7046 +8.740859,60.8024 +8.784145,21.3186 +8.604765,202.6185 +8.792644,16.2221 +8.654680,155.8712 +8.793276,17.9469 +8.773414,41.6453 +8.652178,164.3763 +8.787721,34.6806 +8.697809,126.3699 +8.763759,61.5264 +8.693648,132.0790 +8.768941,58.1271 +8.771785,56.6034 +8.815060,14.6330 +8.725653,108.3074 +8.764331,71.9244 +8.810552,29.6081 +8.808867,31.9659 +8.755769,88.2041 +8.779257,66.4062 +8.800986,46.3442 +8.657503,191.6099 +8.708131,144.5357 +8.786242,67.9463 +8.840161,16.6956 +8.840833,17.9575 +8.822403,38.3664 +8.703608,162.2936 +8.703132,163.3056 +8.828389,38.4390 +8.701813,165.4532 +8.747094,122.0675 +8.807384,62.8232 +8.856857,13.7672 +8.462675,409.7768 +8.852668,22.2572 +8.650700,227.3206 +8.849114,31.8237 +8.843973,39.0690 +8.731770,153.8242 +8.854189,33.0371 +8.698334,189.8042 +8.858791,33.4964 +8.836256,57.5899 +8.782123,112.8451 +8.878022,18.8271 +8.880938,19.1532 +8.870208,31.9119 +8.860770,45.0350 +8.825286,84.1690 +8.800289,113.2817 +8.896849,17.4454 +8.872453,42.8430 +8.866829,51.1501 +8.274352,646.0652 +8.772814,150.2863 +8.825727,98.4885 +8.909455,17.0307 +8.722453,206.8023 +8.650081,283.0621 +8.805464,129.8228 +8.829693,107.1124 +8.789419,148.3698 +8.893847,44.6219 +8.913571,28.4318 +8.865902,77.5199 +8.715164,229.1876 +8.929256,16.8563 +8.885595,63.0980 +8.933144,16.7853 +8.656172,294.5820 +8.942004,12.2744 +8.894969,60.0591 +8.866438,89.9556 +8.926487,32.9412 +8.781728,178.3305 +8.902120,59.1751 +8.948693,13.2570 +8.924217,38.8397 +8.923101,42.3611 +8.950754,18.0787 +8.954279,17.2271 +8.786826,189.5906 +8.959429,17.5810 +8.961951,15.6566 +8.917980,60.8389 +8.938470,42.4148 +8.816555,165.1851 +8.946113,36.2748 +8.734303,251.8204 +8.892289,95.8317 +8.914295,76.0148 +8.976417,17.3877 +8.977011,17.2977 +8.977608,17.2184 +8.936807,59.5049 +8.874926,121.9661 +8.920418,78.1688 +8.867267,132.3393 +8.748006,254.4134 +8.801662,201.3481 +8.986124,18.1641 +8.845663,162.8366 +8.811224,198.1736 +8.824180,185.7997 +8.993806,16.7649 +8.994309,16.8680 +8.994827,16.9879 +8.833961,178.8368 +8.905805,108.1388 +8.999607,18.2022 +8.937789,81.3139 +8.869162,150.6794 +8.798954,226.4122 +8.870625,156.1829 +8.883043,146.7374 +8.749931,283.1650 +8.671872,362.2755 +8.996892,39.2862 +9.004289,33.1497 +8.982388,57.4835 +8.750647,291.0723 +8.990311,52.0680 +8.965463,78.6987 +9.029781,15.3401 +9.017810,28.4276 +8.968833,80.0882 +8.935287,117.7191 +8.971506,82.7659 +9.008501,49.2305 +9.019104,39.3226 +9.044162,14.7697 +9.026808,33.3157 +8.961296,101.0927 +9.039872,24.2212 +8.949929,116.8591 +8.955028,115.0552 +9.053007,19.1534 +9.003011,72.1045 +8.944353,132.5164 +8.943422,134.7193 +9.045122,38.3931 +9.064094,20.2952 +9.034149,52.7894 +9.010571,78.0085 +8.963057,126.5070 +8.774694,315.5815 +9.075116,20.7296 +9.078142,18.1210 +8.915297,184.2458 +9.054273,48.0820 +9.009980,95.0214 +9.037439,70.6640 +8.847331,263.2342 +9.095846,16.4583 +8.988121,125.1385 +9.002420,112.0085 +9.072161,42.9618 +9.099543,17.7471 +9.105002,17.1775 +9.112305,15.1835 +9.025367,103.7799 +9.011816,119.4467 +8.980885,153.1281 +9.046238,88.3889 +8.888139,247.7242 +9.013945,122.6082 +9.110566,28.6658 +9.048922,91.0772 +9.009398,133.7113 +9.041720,101.9833 +9.127490,18.8887 +9.083516,65.5173 +9.062389,87.2354 +9.012799,137.4675 +9.066789,86.9773 +9.117291,37.9293 +8.827069,328.7831 +9.108104,48.9122 +9.129148,31.4231 +9.143110,19.4115 +9.096264,68.6578 +9.149034,16.6778 +9.036183,134.5259 +9.134627,38.7436 +9.139232,34.7765 +9.157017,17.6373 +9.113260,64.2515 +9.102356,75.5705 +9.070084,109.2086 +9.165712,14.8306 +9.042379,141.4568 +9.060125,124.3089 +8.998588,188.7385 +9.058427,130.4606 +9.135864,53.6496 +9.177513,13.9497 +9.115124,77.6902 +8.887226,308.8771 +9.177927,21.1754 +9.183837,18.1437 +9.140000,63.4321 +9.131263,74.3762 +9.149625,57.9761 +9.179293,30.1765 +9.170710,43.6984 +8.978819,236.1995 +9.076870,140.4778 +9.201981,16.1756 +9.086939,132.0678 +9.084390,136.1440 +9.188888,32.2949 +8.996312,227.8341 +9.057732,167.2302 +9.155852,71.1760 +9.134014,97.7265 +9.058932,173.5323 +9.114429,121.1463 +9.196104,40.6061 +9.164922,73.1744 +9.033097,205.6630 +9.088580,151.2439 +9.155221,86.9567 +8.981741,262.4448 +9.189514,55.5299 +9.232465,18.9310 +9.218157,33.9209 +9.011177,246.1713 +9.180543,77.4537 +8.960060,298.8149 +9.224147,39.1611 +9.174654,89.3227 +9.173371,91.5116 +8.956394,310.7419 +9.252079,17.3596 +9.153767,118.9033 +9.219007,58.5826 +9.220534,58.2132 +9.245045,34.5957 +9.203433,78.1902 +9.235576,46.7522 +9.264884,18.4324 +9.146379,140.8256 +9.238097,50.3904 +9.272671,17.6522 +9.277591,15.6604 +9.278748,18.7435 +9.191463,106.6703 +9.238760,62.6066 +9.192815,110.3655 +9.239825,65.3023 +9.227029,81.4097 +9.089565,220.0110 +9.242178,68.0790 +9.236711,75.7629 +9.257998,55.3316 +9.199103,118.5500 +9.019842,298.2655 +9.301367,17.5603 +9.224963,97.4332 +9.209471,114.8065 +9.150267,178.3601 +9.312474,17.0396 +9.187327,144.2896 +9.287205,45.0903 +9.217348,116.3376 +9.317654,17.5794 +9.251397,85.4152 +9.322396,17.9310 +9.267136,76.2258 +9.318108,28.3778 +9.293252,54.1739 +9.258875,89.7481 +9.269439,83.7844 +9.221184,132.6497 +9.318928,38.4921 +9.283317,75.8152 +9.324278,35.2691 +9.298134,62.8697 +9.346486,14.9024 +9.347426,16.0097 +9.348624,15.9471 +9.244186,121.5465 +9.340328,30.0831 +9.263978,107.0501 +9.297493,77.0432 +9.361004,14.8260 +9.309576,67.4635 +9.184434,193.3006 +9.361389,17.6968 +9.363436,16.4398 +9.207602,175.5507 +9.343363,42.6115 +9.328627,63.2929 +9.214409,178.1428 +9.335234,57.9502 +9.162522,234.4326 +9.282329,116.3994 +9.263308,136.3125 +9.333686,68.9452 +9.303181,99.9723 +9.305128,98.4396 +8.900092,505.2894 +9.391921,13.8460 +9.392553,14.7616 +9.257349,150.4104 +9.143704,265.7705 +9.379086,33.8038 +9.374536,40.2399 +9.375831,39.9336 +9.331617,88.3626 +9.405382,15.2396 +9.353834,68.0793 +9.405768,17.0697 +9.290324,134.0110 +9.122180,303.5317 +9.409475,17.8396 +9.365734,64.6170 +9.402632,30.3442 +9.357421,79.4744 +9.174009,268.7033 +9.396956,46.8861 +9.215019,229.5015 +9.415765,33.6883 +9.231741,218.6500 +9.371028,80.4313 +9.436896,16.9039 +9.160572,296.4800 +9.336813,120.9705 +9.424336,36.0494 +9.449454,15.6943 +9.313330,153.3282 +9.353224,114.1252 +9.377735,90.9302 +9.359547,111.6324 +9.398729,73.5594 +9.457052,17.3978 +9.451460,28.2807 +9.425712,58.1418 +9.403568,82.6477 +9.407315,80.1054 +9.444522,43.6643 +9.279641,211.7213 +9.377041,115.0033 +9.421914,72.9250 +9.457784,40.0045 +9.471180,27.7499 +9.483855,17.2061 +9.472289,30.9246 +9.308439,196.3321 +9.385975,120.6216 +9.370412,138.5982 +9.479742,30.8891 +9.393185,121.7395 +9.422838,93.1119 +9.442714,74.8383 +9.503215,17.4689 +9.364572,159.0379 +9.492045,33.0131 +9.432977,93.0814 +9.332296,197.3796 +9.453801,76.5558 +9.466659,70.1957 +9.488186,49.4015 +9.403154,135.4752 +9.520684,18.6323 +9.504772,37.5991 +9.510632,32.6482 +9.443842,100.4959 +9.467350,79.7728 +9.509011,39.0295 +9.399622,148.8201 +9.536855,13.1062 +9.136554,416.2174 +9.468666,86.8978 +9.329515,226.7366 +9.359132,200.8150 +9.523611,38.1583 +9.205640,356.7859 +9.548041,15.5919 +9.501062,63.6017 +9.548442,17.1609 +9.552772,17.6753 +9.450392,124.8709 +9.379877,197.0653 +9.494840,84.1778 +9.537589,43.4260 +9.090276,492.1594 +9.420622,162.6599 +9.491363,92.9670 +9.310258,275.1308 +9.559948,28.0569 +9.556252,32.3867 +9.575263,14.3582 +9.407760,186.5340 +9.412891,183.8103 +9.460386,137.2128 +9.414777,186.2068 +9.563633,38.3981 +9.542372,60.4326 +9.465149,139.6366 +9.549962,60.4856 +9.427315,186.5732 +9.582436,33.9228 +9.525058,93.1435 +9.576943,42.1425 +9.544339,76.3234 +9.588639,33.1316 +9.514925,109.4672 +9.565604,63.0214 +9.383154,246.9783 +9.602805,28.9987 +9.543280,90.5032 +9.561770,75.4278 +9.562426,75.7131 +9.610448,29.0980 +9.583283,61.3435 +9.487421,161.1996 +9.530357,120.5144 +9.604787,48.5335 +9.564664,89.5839 +9.526059,129.3345 +9.589622,66.6915 +9.602032,58.9691 +9.618203,43.8599 +9.281624,381.3945 +9.539317,127.3451 +9.648621,19.2028 +9.288488,380.2977 +9.654249,17.3709 +9.624393,47.6934 +9.628626,45.0043 +9.616359,58.3445 +9.619086,58.3560 +9.585389,93.6422 +9.474451,205.8843 +9.419980,262.5728 +9.668787,16.1797 +9.638140,49.0137 +9.661002,27.1455 +9.570448,119.7529 +9.498931,194.0107 +9.620663,75.5623 +9.588006,108.8865 +9.682554,17.3547 +9.662063,40.7244 +9.672087,34.3314 +9.666663,40.8776 +9.621771,86.3861 +9.529676,180.2791 +9.671620,40.7339 +9.555565,158.3032 +9.673631,42.8583 +9.630133,86.9233 +9.684967,33.3328 +9.639547,83.6249 +9.709956,14.1971 +9.687154,39.0477 +9.680336,47.5618 +9.653321,79.4634 +9.716489,16.8795 +9.631804,102.2091 +9.717056,19.1987 +9.633784,105.6143 +9.663019,78.7932 +9.713868,29.5742 +9.430351,316.4238 +9.696226,52.6835 +9.667824,82.7460 +9.707541,43.4633 +9.708158,43.2142 +9.732785,19.5168 +9.733369,19.3384 +9.613898,139.5996 +9.739399,16.7249 +9.688148,69.4597 +9.690201,69.3786 +9.584331,176.5295 +9.692943,69.8333 +9.515951,248.8933 +9.727898,38.7289 +9.486216,282.1525 +9.579018,192.2348 +9.547123,224.7584 +9.706419,69.1092 +9.677443,98.4897 +9.637198,140.5767 +9.759581,19.0460 +9.762777,19.0772 +9.748910,39.0511 +9.506597,283.1744 +9.757608,33.1454 +9.746776,46.9735 +9.741813,53.5375 +9.674704,121.2314 +9.775528,21.0007 +9.775933,21.2175 +9.734014,63.8143 +9.594295,206.4779 +9.781855,21.4637 +9.650872,155.3144 +9.787962,19.4295 +9.751005,57.7916 +9.795936,15.6578 +9.768369,44.4264 +9.517553,299.3295 +9.756124,63.3544 +9.644627,176.3557 +9.753499,68.3751 +9.806187,16.5948 +9.696893,129.7219 +9.724154,103.7570 +9.811595,18.2723 +9.597599,236.1717 +9.766628,69.8317 +9.655394,183.2751 +9.807392,33.0520 +9.712354,129.1330 +9.750571,91.5210 +9.790754,52.8352 +9.777775,66.2794 +9.702788,142.6743 +9.771882,76.1336 +9.797829,52.9127 +9.760861,91.5722 +9.840445,12.6163 +9.699909,157.3790 +9.822783,36.2432 +9.718300,141.7823 +9.726203,136.5481 +9.751373,113.4374 +9.538630,329.4216 +9.581015,290.0246 +9.842092,29.8444 +9.857289,17.4462 +9.816883,58.7409 +9.778627,98.8389 +9.862752,17.7779 +9.826615,56.8090 +9.679032,206.0837 +9.864811,22.5433 +9.795351,92.6692 +9.838670,49.9403 +9.845463,43.8887 +9.821875,67.9862 +9.789773,100.8333 +9.820983,72.5126 +9.850742,48.7458 +9.875624,24.7698 +9.800774,100.2707 +9.808797,92.9212 +9.852434,56.9028 +9.844055,66.4081 +9.723173,188.9995 +9.859027,55.0172 +9.871937,43.2833 +9.877467,38.8207 +9.596702,322.2592 +9.901045,20.2950 +9.888611,36.1105 +9.600984,326.5989 +9.819479,109.2370 +9.853061,76.0713 +9.752302,177.5539 +9.752708,177.9721 +9.918962,14.1689 +9.860083,74.8335 +9.771254,166.9244 +9.656314,283.0867 +9.796530,144.1365 +9.887354,55.9294 +9.848017,97.0056 +9.841488,105.2640 +9.893496,54.6663 +9.880530,68.2763 +9.927584,26.2420 +9.764845,191.3515 +9.901719,55.2420 +9.812796,148.2000 +9.793750,167.9184 +9.885117,78.7628 +9.743443,221.3074 +9.843590,121.8362 +9.836460,133.7137 +9.915221,59.0670 +9.946752,28.2069 +9.948807,28.6609 +9.934917,43.8373 +9.827911,154.5798 +9.890606,92.5886 +9.889861,97.1164 +9.933131,55.9391 +9.953827,38.8755 +9.914044,79.3577 +9.948163,51.2681 +9.977468,23.2850 +9.963880,38.5703 +9.868052,136.8809 +9.829868,178.2740 +9.888021,120.8761 +9.921340,88.6964 +9.992703,18.0026 +9.965443,47.0729 +9.910464,106.5325 +9.999432,19.3624 +9.883425,137.9860 +9.928717,93.2947 +9.983196,40.1415 +9.982492,41.7757 +9.889352,135.3352 +9.956962,71.3929 +9.956197,75.7314 +9.974960,57.6277 +9.929857,106.1393 +9.900395,137.0538 +9.497789,544.6014 +10.018795,25.2984 +9.797151,249.2958 +10.021412,26.7836 +9.970175,79.0055 +10.004933,44.9059 +9.929133,123.5229 +9.943285,110.5613 +10.000754,57.5968 +10.042391,18.8868 +9.960997,101.4642 +9.833771,231.5436 +10.024688,41.0417 +9.912173,154.8663 +10.037449,30.3625 +10.031930,39.2380 +9.874736,198.2988 +10.061279,12.6681 +9.940667,135.2674 +10.062462,15.2502 +10.048196,31.0158 +9.978755,105.2248 +10.032588,54.7695 +9.989071,99.2182 +10.028355,62.7405 +10.075935,17.6607 +10.010707,84.7114 +10.079212,19.4815 +9.899489,204.0602 +9.909338,195.3004 +10.091097,14.2168 +9.871041,234.6853 +10.023338,83.8237 +10.044095,65.3591 +10.067812,42.9415 +10.024268,90.1710 +10.046447,69.8709 +10.095419,21.4729 +9.964751,155.6418 +10.093596,28.7594 +10.012517,110.3760 +10.071168,52.0336 +10.002451,123.2918 +10.109454,17.9112 +10.083981,45.5912 +10.116319,14.0629 +10.052657,78.6404 +10.116892,16.0798 +9.961669,172.6917 +9.736256,400.4844 +10.049181,88.4768 +10.008898,131.0396 +9.916288,225.0119 +10.016997,125.5116 +10.053847,89.6610 +10.088290,57.1888 +10.105726,40.4038 +10.049840,97.1187 +9.974289,173.3483 +10.136741,13.7868 +10.110754,42.3085 +9.939402,214.9037 +10.130383,26.1537 +10.145480,11.4706 +9.924722,233.2294 +10.146131,12.9194 +10.010038,151.9613 +9.938179,224.5854 +10.123202,40.7987 +10.065730,98.7065 +10.156537,11.6699 +10.156951,11.6689 +10.122356,46.7200 +9.930681,238.9877 +10.120394,53.1282 +9.945023,229.8218 +10.073035,102.4788 +10.087359,88.5810 +9.986979,192.4061 +9.993403,186.4226 +10.168207,14.1040 +10.168620,14.3734 +10.129573,55.5464 +10.065316,120.1020 +10.125744,59.9422 +10.143508,42.6309 +10.105314,82.3540 +10.164002,24.2642 +10.153064,36.1118 +10.107162,83.3425 +10.182312,9.3939 +10.162000,30.6397 +10.098694,95.1253 +10.185120,9.1212 +10.164437,33.8799 +10.182994,16.1182 +10.114440,85.0897 +10.154306,46.6217 +10.179385,23.8144 +10.067040,136.7498 +10.073947,131.2929 +10.193820,12.7690 +10.077713,130.0377 +10.175940,33.0845 +10.035997,177.4339 +10.146959,67.2438 +10.188267,27.4052 +10.132973,83.1488 +10.189176,27.7971 +10.104639,115.1813 +10.209025,12.5251 +10.187668,36.1229 +10.162765,62.1354 +10.173523,52.5677 +10.179826,48.5211 +10.199113,30.7823 +9.803319,427.1103 +10.008142,225.1166 +10.174846,58.7276 +10.134361,99.6874 +10.223792,11.0597 +10.226091,11.3837 +10.192640,45.1442 +10.127366,112.2910 +10.216974,23.1122 +10.207751,34.4815 +10.221551,23.9316 +10.141301,104.5909 +10.103550,143.2311 +10.214204,33.4602 +10.185418,62.6748 +10.022012,228.1275 +10.185686,66.3207 +10.224901,27.8322 +10.194242,60.4840 +10.131298,124.3427 +10.233260,24.5843 +10.142509,115.7565 +10.186140,72.5537 +10.219821,41.1921 +10.137659,124.9475 +10.250140,13.0556 +10.190505,76.3663 +10.206590,60.8826 +10.255641,12.7820 +10.198318,73.9483 +10.175515,98.4002 +10.157952,116.2536 +10.205241,69.2433 +10.247665,28.5159 +10.216122,60.6467 +10.257845,20.6182 +10.203200,76.0696 +10.229896,49.9900 +10.252734,28.7299 +10.272267,11.0397 +10.191706,92.0278 +10.273916,10.8269 +10.169669,115.5210 +10.169077,119.6269 +10.200928,89.1813 +10.199530,90.9946 +10.248094,44.9691 +10.230430,63.3343 +10.258694,35.6771 +10.281464,14.6286 +10.245892,50.5089 +10.240087,59.8358 +10.263197,39.0788 +10.159051,146.0339 +10.058352,247.3383 +10.276181,30.6149 +10.203790,105.5548 +10.296402,14.0883 +10.233574,77.6678 +10.213431,98.2203 +10.246781,65.3630 +10.147638,165.5455 +10.279271,34.7673 +10.305085,11.5236 +10.234049,86.8344 +10.309345,11.9773 +10.278463,43.6253 +10.293765,29.2993 +10.228348,95.1069 +10.239658,84.7612 +10.293063,32.9384 +10.261013,67.6122 +10.283735,45.8481 +10.313184,17.8371 +10.320884,12.3548 +10.215672,121.3366 +10.290110,47.4756 +10.299923,38.2360 +10.237475,102.1078 +10.122894,217.2845 +10.252008,89.9107 +10.329584,12.7909 +10.333240,11.8791 +10.268424,80.2965 +10.323065,27.8235 +10.242233,109.1018 +10.290525,61.4278 +10.296093,57.4416 +10.267473,86.7012 +10.326003,31.3483 +10.285191,72.5973 +10.305691,53.8714 +10.348721,13.2013 +10.338160,24.1847 +10.150528,212.3142 +10.294372,69.0340 +10.323455,42.2986 +10.321323,45.1815 +10.310491,56.5281 +10.322089,46.7454 +10.306797,62.3031 +10.237785,132.7708 +10.359563,11.4618 +10.362345,10.1234 +10.279886,93.3427 +10.234852,141.7793 +10.311652,65.5816 +10.337587,41.4285 +10.283307,97.3733 +10.266872,115.6085 +10.328626,54.3601 +10.284743,100.8878 +10.262607,124.2528 +10.288705,99.8860 +10.339584,50.1067 +10.379016,11.8207 +10.316610,76.9860 +10.382481,12.1910 +10.139938,256.2116 +10.351954,45.5738 +10.254726,147.0817 +10.361923,41.0195 +10.350889,52.9516 +10.371025,33.2766 +10.393596,11.2117 +10.385632,20.7325 +10.370562,37.0028 +10.376632,31.9807 +10.382987,27.6723 +10.331022,80.7247 +10.401809,10.2348 +10.390837,21.9757 +10.380681,34.6222 +10.357789,58.4083 +10.406365,10.4450 +10.353536,64.2733 +10.342375,77.9667 +10.354175,67.1516 +10.314039,108.5936 +10.410660,12.4250 +10.274485,153.2275 +10.345120,84.6934 +10.324420,106.7021 +10.258267,174.3957 +10.274206,159.2375 +10.389691,44.3024 +10.337010,98.5909 +10.245483,190.8024 +10.340179,98.4291 +10.411747,29.0465 +10.408613,32.8376 +10.429814,12.0543 +10.431123,13.2986 +10.388591,57.3566 +10.365754,81.1440 +10.311242,136.7483 +10.363406,85.8708 +10.412044,38.0871 +10.386860,64.3124 +10.441869,10.4374 +10.403842,49.1712 +10.397528,56.6323 +10.372469,82.6278 +10.446899,9.8983 +10.407565,50.8464 +10.312145,147.5702 +10.427713,34.7177 +10.351336,111.5398 +10.396150,67.1514 +10.357352,107.0419 +10.367019,100.8916 +10.451173,17.3276 +10.433994,34.8871 +10.432663,39.1946 +10.456798,17.4673 +10.422633,52.2266 +10.453013,23.4242 +10.415304,63.1579 +10.435601,43.9990 +10.441452,42.5544 +10.421328,63.1057 +10.459716,26.0211 +10.416810,69.9662 +10.474860,12.7420 +10.404302,86.7366 +10.478463,13.0072 +10.438609,53.8985 +10.484007,11.4344 +10.420343,76.0286 +10.484434,12.9161 +10.463302,36.7619 +10.458412,42.7568 +10.423085,78.9100 +10.471859,31.7326 +10.452306,52.7255 +10.402943,103.5224 +10.366505,140.3879 +10.440794,66.8139 +10.495442,13.0408 +10.497351,14.8582 +10.500065,13.4673 +10.449278,65.5760 +10.368835,148.7502 +10.476438,41.6851 +10.487603,32.7034 +10.462431,58.9952 +10.377234,146.5736 +10.464394,60.5109 +10.462876,63.0221 +10.486777,40.2367 +10.467911,61.4553 +10.394673,135.4718 +10.517586,13.2065 +10.276770,254.6141 +10.417810,115.6113 +10.479601,54.6814 +10.373229,161.7091 +10.527014,9.6527 +10.508483,29.3282 +10.436287,102.3496 +10.507609,32.3481 +10.524906,17.3735 +10.485737,57.4323 +10.533422,10.9962 +10.530145,17.5815 +10.444422,104.0411 +10.447991,101.5348 +10.362843,189.6872 +10.513533,39.9251 +10.525899,28.5849 +10.523809,31.4682 +10.543170,13.0606 +10.547727,11.8973 +10.530793,29.9123 +10.474266,87.3481 +10.512210,79.6970 +10.341919,250.5858 +10.454161,138.7905 +10.552531,41.8169 +10.544418,52.2424 +10.554485,44.2463 +10.534939,64.3529 +10.468882,133.9601 +10.496372,106.8725 +10.549527,54.4400 +10.514854,91.6537 +10.555277,51.8170 +10.548464,62.6124 +10.492508,119.1276 +10.559625,52.5381 +10.556232,58.1946 +10.542280,72.8742 +10.602843,12.6765 +10.603245,14.2912 +10.539958,77.8538 +10.553458,65.5918 +10.529367,91.5079 +10.611077,10.4099 +10.416198,206.0267 +10.404809,217.7202 +10.506894,116.3373 +10.501996,121.6718 +10.302276,323.3367 +10.617537,8.4109 +10.617812,10.2232 +10.412813,218.1578 +10.621487,12.5558 +10.521427,114.0873 +10.612164,24.0082 +10.622225,15.3637 +10.450132,188.1881 +10.505033,137.1759 +10.369100,274.2188 +10.625613,18.2234 +10.503592,141.1477 +10.625948,19.6374 +10.614427,33.3175 +10.630973,19.8683 +10.603967,47.3724 +10.634044,17.8262 +10.506466,148.2357 +10.638321,18.6188 +10.433445,224.7066 +10.468501,191.0667 +10.518124,142.3106 +10.598732,62.0501 +10.606509,54.7110 +10.561615,101.8824 +10.623668,45.7143 +10.607095,62.7899 +10.536668,134.6455 +10.659569,12.4834 +10.619050,57.6781 +10.637590,41.5122 +10.596662,83.1875 +10.628036,52.6611 +10.501170,183.2285 +10.537812,148.6131 +10.660435,26.5021 +10.642210,46.5781 +10.560706,128.9633 +10.676730,15.3502 +10.654703,37.9793 +10.615520,78.7351 +10.661220,33.9067 +10.645587,50.3340 +10.623231,76.4643 +10.647745,52.6222 +10.686426,18.5002 +10.680698,28.2750 +10.651871,60.4716 +10.520307,193.3669 +10.644741,70.7176 +10.658152,60.1416 +10.684399,35.0580 +10.699698,23.5076 +10.651340,73.1515 +10.695922,36.1744 +10.708975,24.3769 +10.622530,115.2988 +10.663498,75.2404 +10.643320,96.7666 +10.692081,48.6870 +10.592506,149.3303 +10.491040,255.8051 +10.671315,77.3932 +10.620876,131.0905 +10.732099,21.7804 +10.491470,267.2229 +10.733354,27.3724 +10.715460,46.9487 +10.538637,225.4728 +10.704927,61.9306 +10.723207,44.3403 +10.445948,326.4756 +10.615155,158.7429 +10.534283,240.5685 +10.694255,85.6740 +10.758695,22.8835 +10.679850,106.2224 +10.740088,46.7867 +10.688789,99.7329 +10.772426,21.9704 +10.636173,161.1187 +10.599293,199.8924 +10.779931,20.9064 +10.760728,43.0590 +10.786074,19.6359 +10.692683,117.0995 +10.672053,142.2438 +10.764111,50.8657 +10.746846,69.1958 +10.794398,23.2521 +10.741837,78.9078 +10.712345,109.6280 +10.751968,73.5303 +10.660782,167.3837 +10.767548,65.1809 +10.635516,199.1347 +10.797293,40.5323 +10.820747,17.7720 +10.788523,51.2812 +10.800839,45.2727 +10.805711,43.9094 +10.799187,51.1987 +10.531384,322.2870 +10.591908,265.8534 +10.594348,267.9455 +10.781581,83.4320 +10.592952,273.7609 +10.816043,51.9965 +10.713675,155.1239 +10.834652,38.4967 +10.766860,108.6403 +10.753881,122.6133 +10.857763,21.9776 +10.737830,145.4185 +10.719458,167.4193 +10.866715,21.1978 +10.738740,150.1323 +10.656941,235.2596 +10.873151,21.4570 +10.809784,87.0252 +10.774852,127.6675 +10.455097,448.4492 +10.837828,68.1607 +10.883250,24.0342 +10.846114,62.0432 +10.865014,43.8107 +10.886879,26.9720 +10.839805,75.8350 +10.669383,248.2651 +10.896810,22.0269 +10.814978,108.8216 +10.718295,210.6688 +10.700369,231.0198 +10.849622,82.4771 +10.868041,65.6164 +10.695128,241.2801 +10.679103,260.8038 +10.876496,64.1268 +10.832731,113.0399 +10.762410,184.4757 +10.902521,50.3605 +10.928965,24.6156 +10.724493,232.7457 +10.908826,50.6859 +10.908158,53.2850 +10.894609,67.6117 +10.907285,59.1809 +10.918838,50.4964 +10.946886,23.5444 +10.932101,43.3010 +10.838520,138.0579 +10.905990,75.5886 +10.879742,103.4444 +10.961445,22.9451 +10.887914,98.1291 +10.915642,71.8149 +10.931391,59.9459 +10.825500,170.1819 +10.669885,327.0016 +10.821974,179.1215 +10.643838,361.2708 +10.936410,73.9745 +10.888874,122.7444 +10.976580,36.4345 +10.952884,62.5856 +10.957241,62.1669 +10.850388,171.0442 +10.817651,205.2826 +10.686938,341.3711 +10.868807,161.9381 +10.853674,177.7236 +10.814299,218.7214 +10.975404,62.9115 +10.786877,253.4754 +10.862296,178.7341 +11.019409,23.5779 +10.828168,217.0725 +10.953582,92.4505 +10.940624,108.4225 +10.959513,90.2311 +10.981580,72.1582 +11.033022,21.7646 +11.028311,33.4949 +10.748710,314.4794 +10.991339,73.4810 +11.010386,58.8999 +11.049048,21.4505 +10.970432,104.2106 +11.001097,77.1400 +10.689670,391.1488 +10.650842,433.8397 +11.063191,22.9453 +10.913853,175.6493 +10.987458,104.7405 +10.892202,201.1573 +10.945772,150.3384 +11.041032,56.5815 +11.042989,59.0704 +11.084684,20.9014 +11.005110,102.4375 +11.086138,23.4716 +10.996889,115.7901 +11.053740,60.2252 +10.939908,177.6581 +10.917650,202.2915 +11.030747,89.8773 +10.740769,383.5936 +11.105587,21.7494 +10.986045,143.7817 +11.097615,35.4371 +10.969337,165.5928 +11.092201,45.1908 +10.923801,214.6006 +10.995684,146.0849 +10.984391,161.2434 +11.013015,138.5008 +11.127338,25.5261 +11.133054,20.5602 +11.078239,82.1077 +10.983188,177.8360 +11.089504,76.9171 +11.049746,118.1177 +11.046034,122.3164 +11.015471,154.3124 +11.124365,45.9734 +11.102061,69.0276 +10.803788,371.4304 +11.107549,68.2806 +11.112680,67.3287 +11.074645,109.1032 +11.117568,67.2535 +11.134931,51.4894 +11.080821,106.2365 +10.773899,414.4134 +11.137393,54.7973 +11.160349,32.5471 +11.151518,44.8562 +10.903548,293.8088 +11.175831,24.1468 +11.070500,135.2038 +11.183749,22.6962 +11.054788,157.3723 +11.153615,59.9691 +10.962222,255.6979 +11.196377,22.4274 +10.875501,349.9996 +11.170339,56.1808 +10.611636,615.9674 +11.192897,39.3438 +11.212162,22.3489 +11.184823,51.2680 +11.021433,216.1769 +11.061808,180.4382 +11.022935,221.0821 +11.031399,213.7855 +11.011620,234.9834 +11.171089,76.2367 +11.186422,65.7596 +11.236093,20.0404 +11.119942,138.9271 +11.045242,214.9872 +11.152866,110.4749 +11.113966,154.1004 +11.038317,232.2384 +11.232242,43.1250 +11.206447,70.1623 +11.205706,71.5829 +11.237612,41.3391 +11.141770,140.2976 +11.247327,36.1631 +11.263343,22.5217 +11.252183,34.5763 +11.218806,74.4172 +11.180015,117.2228 +11.145636,152.3892 +11.225502,73.2622 +11.040354,263.8601 +11.192192,115.6546 +11.138403,170.1953 +11.278953,34.6714 +11.199980,115.1443 +11.093361,222.4299 +11.297240,22.7194 +11.256135,68.4513 +10.933659,391.6874 +11.245186,81.1217 +11.064821,263.3960 +11.258871,74.5271 +11.298026,36.3300 +11.226521,110.0696 +11.213586,126.3699 +11.319962,21.9457 +11.244019,99.7582 +11.197358,150.7605 +11.276611,75.1981 +11.234512,123.5922 +11.339958,18.8368 +11.315792,44.6253 +11.188314,173.0279 +11.275369,88.2990 +11.343779,21.7230 +11.270565,101.0261 +11.168351,204.1002 +11.313626,59.8624 +11.285866,92.8470 +11.358106,21.2952 +11.358797,21.2529 +11.341908,41.2452 +11.365503,21.7760 +11.304216,86.2312 +11.246604,144.4998 +11.175220,217.2342 +11.282070,110.9829 +11.096112,300.8180 +11.325348,73.5183 +11.378715,20.8608 +11.379403,20.8735 +11.380050,22.4431 +11.383155,22.6948 +11.166423,242.7260 +11.217922,196.9821 +11.333399,82.6708 +11.187059,233.2410 +11.120625,300.4841 +11.402495,20.4119 +11.109611,316.1764 +11.315126,114.8432 +11.283491,148.8105 +11.293224,139.8143 +11.336592,100.4126 +11.328219,111.1041 +11.396932,48.2433 +11.348120,99.1620 +11.307848,141.2572 +11.361343,88.9670 +10.966468,485.0317 +11.373490,83.5523 +11.437006,23.2892 +11.372453,89.2037 +11.260230,201.7580 +11.242248,223.8855 +11.445176,22.8629 +11.405852,62.7732 +11.298766,170.4541 +11.450311,23.1501 +11.414906,61.3518 +11.286761,190.6331 +11.227605,251.0267 +11.392461,86.7037 +11.167865,314.9941 +11.468040,17.6646 +11.468626,17.6719 +11.371593,116.0399 +11.469221,19.9550 +11.393054,98.1719 +11.277290,215.6734 +11.161025,335.6062 +11.466134,31.1424 +11.129829,371.6579 +11.421110,82.4274 +11.409151,97.6600 +11.324588,184.1029 +11.422909,90.2510 +11.416072,97.8679 +11.451501,64.9688 +11.399577,119.8678 +11.477395,44.0480 +11.476258,46.2405 +11.457045,68.6160 +11.492965,35.6265 +11.501488,29.0544 +11.433040,101.2389 +11.473462,62.3495 +11.439324,100.4550 +11.308600,231.7526 +11.491227,52.0391 +11.398867,145.9946 +11.508692,36.8583 +11.169784,377.1040 +11.485706,65.8232 +11.360419,191.9155 +11.525662,27.5265 +11.460296,96.1368 +11.425789,131.4522 +11.391106,171.8434 +11.496632,70.5122 +11.351811,215.9358 +11.519446,49.8152 +11.535813,37.1648 +11.546890,27.9857 +11.556434,20.7464 +11.390448,188.3162 +11.486299,97.1765 +11.449108,135.5917 +11.497278,87.9873 +11.521444,68.1474 +11.540353,50.1891 +11.544863,46.8009 +11.447283,145.0082 +11.543267,53.3416 +11.539780,58.6487 +11.400278,199.2618 +11.506812,96.8863 +11.584700,20.0477 +11.479165,126.2209 +11.268068,340.5427 +11.530544,83.1453 +11.513940,100.7731 +11.567748,49.8209 +11.461658,156.6957 +11.578766,42.4612 +11.603699,18.1419 +11.363669,260.1757 +11.608612,18.8023 +11.596610,32.7052 +11.326309,307.2667 +11.583477,51.5080 +11.489177,148.4228 +11.621842,16.8400 +11.557243,86.2684 +11.591665,52.8169 +11.599540,46.0747 +11.478632,171.4904 +11.633577,17.1769 +11.528592,129.1296 +11.334357,324.1424 +11.589592,71.9017 +11.487634,174.7730 +11.592293,74.7810 +11.650124,17.5298 +11.432303,236.2522 +11.503539,166.1740 +11.650755,19.7636 +11.552336,121.0344 +11.604749,71.6631 +11.482860,196.3616 +11.551530,131.2514 +11.629316,57.3911 +11.562950,127.3145 +11.673371,17.7094 +11.569262,126.0046 +11.668564,28.2689 +11.598430,99.0462 +11.662409,38.5256 +11.387281,314.6440 +11.572979,129.7323 +11.605387,100.8226 +11.686709,20.5920 +11.657723,53.1007 +11.634986,79.3078 +11.658501,57.8006 +11.585266,132.9609 +11.429970,290.1994 +11.682782,41.9777 +11.706211,19.3794 +11.567145,159.6348 +11.638683,88.8617 +11.667075,64.3857 +11.696834,37.3743 +11.697477,37.8907 +11.691082,44.9933 +11.695268,45.4933 +11.614715,126.6229 +11.669715,73.6847 +11.702712,43.2767 +11.644483,106.3751 +11.690266,62.8249 +11.534280,221.2418 +11.617570,138.5893 +11.710825,47.3361 +11.740762,20.3246 +11.741339,21.9794 +11.676413,88.6553 +11.745990,21.7787 +11.724761,46.4888 +11.553189,221.0759 +11.726781,50.8017 +11.420302,359.9215 +11.613690,167.3856 +11.707302,74.6094 +11.731462,51.1367 +11.714295,72.5889 +11.513161,274.9269 +11.771251,18.4659 +11.667655,127.6815 +11.577182,218.7479 +11.643513,153.9452 +11.701926,97.4760 +11.522500,279.8200 +11.574876,228.0747 +11.767770,38.2229 +11.725592,81.9146 +11.755522,53.5060 +11.670520,142.2404 +11.795337,17.9623 +11.795931,20.8692 +11.797459,19.9231 +11.720171,99.8481 +11.782600,38.0982 +11.590544,233.5890 +11.735369,90.4343 +11.805994,20.9434 +11.758162,72.3453 +11.812761,18.2914 +11.679222,154.0187 +11.813301,20.5962 +11.816801,17.9409 +11.817383,19.8814 +11.820020,17.8725 +11.661495,179.9324 +11.637601,210.1010 +11.807507,40.8713 +11.461989,388.7828 +11.774266,77.2760 +11.837266,17.5842 +11.837894,19.5185 +11.743400,114.7223 +11.734209,125.2211 +11.802321,62.1647 +11.736077,129.9020 +11.727546,141.7036 +11.780225,91.4435 +11.700936,172.2067 +11.645616,228.1113 +11.824134,51.2088 +11.854851,21.6944 +11.716303,161.3430 +11.841429,41.2734 +11.850773,32.4810 +11.864487,20.3834 +11.833898,53.4343 +11.869251,19.1393 +11.833242,58.6627 +11.873143,19.3690 +11.826938,69.0926 +11.859432,38.8705 +11.750860,149.8858 +11.882704,19.8173 +11.848379,55.5996 +11.516471,388.7722 +11.887333,19.5739 +11.820699,91.5560 +11.756160,158.1155 +11.830508,85.5079 +11.847703,70.1536 +11.788089,130.3264 +11.825804,97.0863 +11.876546,47.0028 +11.621228,307.1746 +11.851543,77.6807 +11.718228,211.8012 +11.912256,20.6079 +11.069288,865.5383 +11.545551,391.7558 +11.834743,105.3762 +11.809029,132.2214 +11.905244,36.8459 +11.873729,72.2252 +11.892513,55.2942 +11.884871,66.0487 +11.799403,152.9842 +11.932865,20.8919 +11.802952,154.0670 +11.623846,336.5245 +11.877647,83.3661 +11.865980,96.4490 +11.922892,40.1775 +11.945955,19.2741 +11.627416,341.8040 +11.950921,20.1640 +11.957020,19.2270 +11.786885,189.9925 +11.900747,77.4478 +11.781912,200.9273 +11.947809,36.0142 +11.929225,55.8012 +11.753092,234.0867 +11.765069,225.0799 +11.896032,94.8833 +11.971086,22.9649 +11.976878,19.1916 +11.857413,142.1282 +11.916017,87.7409 +11.941253,63.8342 +11.883255,122.4272 +11.875343,130.9341 +11.858123,148.7832 +11.930031,78.6191 +11.990916,19.4315 +11.969221,44.8161 +11.963071,52.2668 +11.999543,17.4437 +11.952389,67.9962 +11.618354,402.6218 +12.003760,17.8547 +11.960371,67.7678 +11.928404,100.3382 +11.906908,123.7062 +12.010349,24.5724 +11.888392,149.3934 +11.902522,136.2177 +12.020386,19.1153 +12.020977,20.0142 +11.990150,54.3190 +12.006907,40.4998 +11.940121,108.4585 +11.923550,129.2931 +12.034923,18.4806 +11.903980,152.7027 +11.763319,295.9340 +11.777584,282.5558 +12.028140,33.1263 +11.789718,273.1706 +12.021615,43.5703 +12.016987,48.8661 +11.898303,172.4831 +11.962430,111.5611 +12.056684,18.4083 +11.978196,101.8993 +11.987180,94.3857 +11.871670,212.6040 +12.038741,47.1858 +12.040993,46.3184 +11.831054,259.6078 +12.073992,18.1730 +11.982841,111.9087 +12.080096,16.4931 +11.891906,206.7134 +12.037787,64.7807 +11.942093,164.1891 +11.996071,111.0629 +12.090663,17.0737 +11.953759,157.8959 +12.060141,55.7142 +12.081567,35.1125 +12.052845,64.9077 +12.030615,91.1767 +11.976248,147.4488 +11.761088,363.1961 +12.106283,19.4782 +12.053405,75.5692 +12.061268,72.7746 +12.098620,35.9345 +12.087312,48.5619 +12.014038,125.1643 +12.005684,136.3805 +11.937309,208.2896 +11.994052,152.2034 +12.047409,101.3116 +12.006279,143.4818 +12.135875,17.2480 +12.039502,117.1346 +12.075093,86.7831 +12.121793,43.3521 +11.983824,182.1413 +12.015338,151.5190 +12.115856,52.0739 +12.092166,76.4509 +12.128975,42.5447 +12.148721,24.1954 +12.156638,20.8445 +12.161877,18.4939 +11.934827,246.1281 +12.065187,117.4956 +12.085928,98.5461 +12.165966,24.4425 +12.059254,133.3251 +12.153124,40.3534 +12.107737,87.8423 +12.134043,63.5482 +12.180956,17.5661 +12.096591,104.8008 +12.182683,19.5723 +12.184475,19.9495 +12.094751,115.1985 +12.142065,68.9129 +11.985028,226.7516 +12.166858,48.8421 +12.180372,35.8426 +12.198523,20.4685 +12.111656,108.8376 +12.149761,71.5852 +12.202256,20.4819 +12.116680,108.5556 +12.139203,91.5673 +12.209950,22.9174 +12.165146,69.5437 +12.062890,175.0486 +12.216216,23.1185 +12.197592,42.3274 +12.201393,40.6496 +12.220495,22.7163 +12.177484,68.3399 +12.117753,131.3644 +12.167932,82.6494 +12.218993,32.5811 +12.215702,40.2885 +12.145600,111.9268 +12.048581,209.7701 +12.107135,152.6849 +12.242043,19.5642 +12.243212,20.9212 +12.245832,20.7615 +12.221348,49.4818 +12.134563,137.6009 +12.008651,265.2385 +12.123698,152.2577 +12.257528,20.2932 +12.065855,215.6098 +12.264134,19.3560 +12.193479,91.3625 +12.230771,55.7407 +12.005088,284.5666 +11.918416,372.6646 +12.272165,19.4982 +12.255992,39.8822 +12.258352,41.9704 +12.124285,178.1675 +12.281466,21.9825 +12.211780,94.8373 +12.251575,55.6378 +12.283491,26.0441 +11.917858,393.3548 +12.291665,20.1861 +12.084275,231.7834 +12.239921,78.6494 +12.259821,61.0436 +12.300323,21.9952 +12.044471,280.9607 +12.210979,118.9679 +12.195581,136.0169 +12.070788,261.6796 +12.270831,62.2758 +12.125762,211.3562 +12.318572,20.0188 +12.222740,117.7259 +12.325433,17.6820 +12.316060,30.4021 +12.277822,69.2560 +12.171521,180.2268 +12.337119,18.3169 +12.273890,82.6284 +12.311214,46.1767 +12.320866,39.4767 +12.295875,66.2841 +12.275957,86.8633 +12.346463,17.6622 +12.347079,18.3909 +12.351749,18.8386 +12.355437,15.7896 +11.961014,415.8997 +12.333108,45.2124 +12.311852,69.2474 +12.286513,95.6032 +12.204425,178.3621 +12.331599,52.1094 +12.237939,150.0005 +12.357391,34.4577 +12.192580,200.0565 +12.234691,160.3759 +11.965230,434.1743 +12.381100,19.8930 +12.306619,97.6792 +12.239335,166.7914 +11.914277,494.0369 +12.370589,38.3457 +12.356520,54.4610 +12.249119,164.8462 +12.392638,22.4553 +12.365471,54.3189 +12.399406,20.9494 +12.400994,23.4481 +12.404300,22.8093 +12.343116,87.8510 +12.302454,129.9495 +11.781077,652.3293 +12.284843,149.9292 +12.382117,55.7540 +12.419791,19.2857 +12.332468,110.3049 +12.360344,84.2909 +12.371228,75.7533 +12.190410,257.5995 +12.430968,19.3899 +12.261609,191.7441 +12.382789,73.8826 +12.172918,284.8157 +12.410982,51.9848 +12.364126,99.7763 +12.395068,72.7104 +12.362160,106.2361 +12.307214,161.8595 +12.453354,18.3651 +12.427110,47.7512 +12.168618,309.2285 +12.102568,378.8559 +12.289656,192.3499 +12.338592,146.2301 +12.266595,221.2304 +12.232869,255.8544 +12.387941,101.6977 +12.446982,45.7485 +12.444636,50.4705 +12.383710,112.9595 +12.481425,17.9957 +12.450359,52.2186 +12.406128,99.1128 +12.448010,58.8600 +12.437872,72.7141 +12.146257,368.4134 +12.362821,152.5047 +12.462968,55.2911 +12.469075,50.0682 +12.502579,20.3603 +12.505241,18.4514 +12.506872,20.4210 +12.424444,106.3516 +12.439078,93.1837 +12.514671,18.1733 +12.488724,48.7331 +12.250582,288.2926 +12.432404,108.4776 +12.225238,317.4020 +12.523694,19.9734 +12.434773,110.6960 +12.291082,256.5303 +12.433408,115.1737 +12.378321,171.8380 +12.028743,526.5171 +12.537458,19.8504 +12.340467,218.8394 +12.492732,68.5956 +12.518260,43.7131 +12.457735,106.7783 +12.532263,35.9381 +12.471720,97.2895 +12.489640,81.7683 +12.530796,45.9511 +12.557310,20.2442 +12.442774,139.4718 +12.456672,126.9952 +12.564514,20.5301 +12.522940,64.7362 +12.543668,45.9600 +12.547613,43.6206 +12.519144,73.3577 +12.571409,21.7903 +12.577563,18.0272 +12.582247,17.3783 +12.309537,294.6012 +12.587677,18.3332 +12.303449,305.4804 +12.474862,134.6386 +12.589629,20.9357 +12.391850,220.3851 +12.538876,74.3694 +12.568202,46.0598 +12.599626,15.3374 +12.415094,200.4416 +12.561329,58.0327 +12.550161,71.9244 +12.608930,13.7580 +12.612236,13.2122 +12.496670,130.2351 +12.499422,132.6870 +12.542641,90.0718 +12.463903,171.3128 +12.555262,81.0219 +12.540883,96.4937 +12.619363,19.6063 +12.625449,17.7566 +12.545470,99.7807 +12.467779,181.7664 +12.632714,20.2930 +12.477848,176.9122 +12.614964,41.4058 +12.585046,72.5668 +12.495107,163.1430 +12.595592,66.1328 +12.527294,135.9216 +12.569010,98.5144 +12.532846,135.5116 +12.649547,20.0593 +12.653008,19.7509 +12.615537,60.7617 +12.626906,51.0594 +12.591235,88.9068 +12.484823,195.9455 +12.622689,61.7630 +12.636285,48.7352 +12.638970,47.6638 +12.576748,113.6064 +12.614262,77.5643 +12.622086,72.9839 +12.658251,41.6673 +12.487826,213.2916 +12.408936,293.4626 +12.420356,283.9112 +12.686635,20.0377 +12.685021,29.3837 +12.482007,233.0144 +12.593200,122.4489 +12.548583,168.1345 +12.657614,60.9750 +12.606012,118.1765 +12.676300,48.5399 +12.592503,133.2151 +12.510588,216.9260 +12.704268,28.0936 +12.329948,404.4073 +12.715023,20.0822 +12.691828,43.9991 +12.669607,71.1100 +12.654762,86.5727 +12.684454,58.3999 +12.632110,116.4608 +12.667526,81.6362 +12.610566,139.2203 +12.695072,55.9078 +12.637378,119.4792 +12.609501,149.2175 +12.740718,18.5729 +12.690356,69.9466 +12.741336,19.9935 +12.699920,64.8688 +12.604139,163.1008 +12.322320,446.9025 +12.668358,102.9769 +12.742854,29.6525 +12.727515,48.2903 +12.724841,53.4891 +12.656371,123.2682 +12.749788,34.3986 +12.559307,227.6060 +12.583669,207.0749 +12.750981,44.5086 +12.714406,83.7092 +12.764790,33.9483 +12.515327,285.2944 +12.761330,40.9569 +12.613246,191.1085 +12.786914,20.8608 +12.790745,20.3216 +12.413967,398.3969 +12.795491,24.3253 +12.735106,86.9456 +12.635217,190.6590 +12.772508,53.9802 +12.663216,163.8966 +12.771336,57.3122 +12.767241,62.3502 +12.718590,112.0226 +12.732363,103.9995 +12.645252,192.8285 +12.778331,63.8730 +12.706673,136.0678 +12.760304,85.9652 +12.802288,44.5412 +12.680770,166.7203 +12.798116,50.4800 +12.804355,45.0014 +12.661725,189.8752 +12.468397,387.0957 +12.807776,49.6068 +12.677967,181.6920 +12.725719,136.2962 +12.842205,22.6733 +12.715651,149.7900 +12.825878,44.0259 +12.702399,169.1001 +12.784188,89.3246 +12.672760,201.8696 +12.826490,49.1826 +12.716718,164.9852 +12.811068,72.2091 +12.779640,104.8574 +12.865442,20.2525 +12.869905,19.7067 +12.561975,331.1440 +12.680143,213.3580 +12.849358,45.2352 +12.846270,48.7766 +12.643207,252.8190 +12.864879,31.7768 +12.881705,17.9361 +12.749163,154.2414 +12.889612,14.4217 +12.735828,172.9267 +12.827114,84.0346 +12.847491,64.2229 +12.798739,115.6259 +12.756858,158.1720 +12.830613,87.2673 +12.842742,79.8680 +12.848597,74.9063 +12.874631,50.8778 +12.908755,18.8609 +12.408315,521.0035 +12.896027,36.2277 +12.812365,123.1075 +12.829593,107.6852 +12.838081,101.1097 +12.922612,19.7259 +12.759292,187.0670 +12.929320,18.6958 +12.734356,216.6354 +12.884500,68.0083 +12.846830,109.1144 +12.894593,62.4235 +12.873513,84.3820 +12.911715,46.8701 +12.800622,161.4235 +12.376915,586.7629 +12.851602,115.2823 +12.932256,40.8993 +12.917882,55.9033 +12.923504,50.9767 +12.828649,146.7536 +12.893501,87.7836 +12.896657,86.5235 +12.963679,20.6815 +12.899643,88.4295 +12.962047,29.6432 +12.973157,21.5658 +12.948017,47.8497 +12.973786,22.8588 +12.937279,63.7485 +12.981287,20.3202 +12.904035,98.6011 +12.952510,50.7124 +12.935474,70.7068 +12.927617,79.3496 +12.914366,96.2059 +12.758720,254.5624 +12.994723,19.3858 +12.984362,34.4259 +13.001029,18.3428 +12.958586,62.4370 +12.966885,57.0413 +12.857384,167.3684 +12.875673,152.3401 +12.957896,73.1383 +12.983183,48.5270 +13.014110,19.7303 +13.018789,18.1453 +13.019372,20.4347 +12.855494,189.8229 +12.996646,49.2989 +12.893120,153.6846 +12.903406,145.4271 +12.836364,213.2283 +12.701119,351.3930 +13.036935,17.7045 +13.039808,19.6531 +13.006968,53.1429 +12.950993,109.7554 +12.724190,339.2410 +13.010573,53.9266 +12.775807,295.6308 +13.033842,38.4151 +12.991691,81.2129 +12.942339,133.8864 +12.957018,123.7077 +13.060112,23.5913 +12.748572,338.9999 +12.862016,226.3460 +12.915031,175.0270 +13.031711,59.5250 +13.021024,74.7479 +13.013283,83.7584 +13.063432,35.9382 +12.939192,162.7147 +13.060749,44.9815 +12.885696,222.4461 +13.091236,18.1316 +13.045946,67.0136 +13.052514,63.5514 +12.911150,205.8144 +13.001608,116.9834 +13.006181,114.7760 +13.023927,98.6530 +12.819817,308.9789 +12.975404,153.9989 +13.088363,42.3393 +13.112961,20.4220 +13.059462,75.5252 +13.116066,22.0612 +12.946360,192.5643 +13.031036,109.6323 +13.003223,139.7734 +13.072258,73.2780 +13.049593,97.2031 +13.045318,105.3886 +12.955946,195.9669 +13.064501,88.5032 +12.769223,387.4926 +13.080727,77.6302 +13.024753,135.7975 +13.095773,66.8188 +13.133384,31.0780 +13.116965,49.2190 +13.146797,20.6911 +13.122581,53.0350 +13.002637,173.9320 +13.028014,151.2640 +13.120958,59.1053 +13.097043,84.4160 +12.925510,258.1531 +12.859660,326.9423 +13.150708,36.7021 +13.108143,80.7558 +13.072905,120.8879 +13.071439,126.3594 +13.179280,20.0941 +13.151914,50.6771 +13.099371,104.4550 +13.140669,64.8053 +13.138128,67.9556 +13.101908,105.6629 +13.162594,46.9512 +13.142997,68.0457 +13.090059,123.8669 +13.197800,17.9608 +13.156717,62.3962 +12.822053,400.6370 +13.205476,17.7996 +13.206085,17.7639 +12.995868,231.8190 +12.895047,334.5702 +13.134989,97.4282 +13.138926,94.0532 +13.215761,18.3855 +13.183664,55.1821 +13.222691,16.6883 +13.164463,79.3672 +13.223276,21.7090 +13.175617,71.0425 +13.223850,23.7707 +13.199375,54.7284 +13.167490,87.3646 +13.193794,61.7950 +13.048834,209.3396 +13.130704,128.9874 +13.238847,21.6071 +13.203828,59.8121 +13.239380,26.2994 +13.188899,77.5595 +13.158358,111.2284 +13.181460,91.8626 +13.118592,155.2913 +13.076226,199.7786 +12.974482,303.2145 +13.232418,46.7650 +13.211044,68.8708 +13.186603,95.9629 +13.166185,118.1604 +13.054641,231.7389 +12.883279,406.1099 +13.105732,184.6646 +13.209546,81.4943 +13.273324,20.1437 +13.255590,42.9784 +13.176570,122.8564 +13.128797,174.7979 +13.219114,85.4078 +13.213927,92.2691 +13.286381,23.7623 +13.083705,227.6865 +12.988073,324.2269 +13.282567,32.9294 +13.276006,41.0959 +13.153005,167.7555 +13.180065,145.0505 +13.145537,181.8459 +13.109369,218.8177 +12.871500,457.4850 +13.315498,17.0543 +13.260455,74.8042 +13.317104,19.4325 +13.160552,176.8762 +13.258175,79.9344 +13.312301,28.9846 +13.265681,79.3687 +13.328188,19.6460 +13.279184,72.7145 +13.304523,48.1297 +13.207572,145.8728 +13.244987,109.0842 +13.234148,124.2263 +13.266460,95.9790 +13.335261,27.9583 +13.129404,239.4442 +13.243831,126.1038 +13.284347,86.2657 +13.187411,185.0037 +13.263641,110.3849 +13.227688,149.8364 +13.273885,106.2252 +13.362440,18.9475 +13.277697,107.9321 +13.368850,17.3977 +13.269587,117.9568 +13.290397,103.1050 +13.310144,84.4080 +13.354072,41.3734 +13.328987,67.3563 +13.306197,93.9812 +13.254105,147.7022 +13.385631,16.8028 +13.386249,17.9481 +13.370613,39.8179 +13.303596,107.6846 +13.352654,62.3021 +13.377526,39.2324 +13.338110,83.3687 +13.332553,89.7640 +13.293469,129.7252 +13.311393,115.3315 +13.254856,172.4421 +13.363220,64.6776 +13.411282,20.5497 +13.380111,54.3349 +13.372416,63.2431 +13.279916,158.8669 +13.291041,149.3612 +13.396344,46.0794 +13.327384,116.7176 +13.404198,44.8790 +13.421480,28.7070 +13.400179,51.7238 +13.410433,44.8812 +13.337429,118.8200 +13.438785,18.0864 +13.440403,19.1836 +13.423196,41.4702 +13.414958,50.6091 +13.351900,118.8558 +13.393504,78.5549 +13.427299,46.0361 +13.046805,428.3357 +13.459588,16.3512 +13.325117,155.1037 +13.247622,235.2861 +13.358376,127.9006 +13.470757,17.0868 +13.456250,35.5363 +13.449078,45.2521 +13.401808,93.1709 +13.259692,237.2076 +13.464667,33.4206 +13.381389,120.5797 +13.345051,159.3813 +13.320762,184.7208 +13.487845,19.0308 +13.491788,20.4841 +13.456872,56.6770 +13.494332,20.7979 +13.387545,128.1800 +13.426726,92.2459 +13.473337,47.4260 +13.394553,128.5027 +13.299428,225.3350 +13.422319,104.5417 +13.232980,296.2877 +13.246661,284.9668 +13.427899,105.0575 +13.298570,237.9606 +13.434447,102.8881 +13.442424,96.2318 +13.520764,26.1180 +13.494980,52.8905 +13.451905,98.9803 +13.369936,182.0395 +13.395446,159.3975 +13.513550,42.4386 +13.501970,57.1225 +13.515726,45.3621 +13.229619,337.1808 +13.550886,16.5218 +13.444103,126.6553 +13.202592,371.0621 +13.504433,70.3828 +13.518973,56.4435 +13.087574,491.6822 +13.341287,238.7331 +13.506877,75.8360 +13.566801,17.2964 +13.567409,22.4319 +13.435660,154.9258 +13.455315,135.9424 +13.465568,129.6457 +13.561089,35.2961 +13.555990,41.6379 +13.472060,129.3895 +13.546883,56.3126 +13.582714,21.2353 +13.551977,52.6012 +13.289390,318.1467 +13.590587,17.5939 +13.531629,81.0703 +13.574817,40.5460 +13.512273,103.9992 +13.607538,14.0269 +13.416759,206.3594 +13.608182,15.7665 +13.536532,89.0401 +13.353446,276.7395 +13.575418,58.6221 +13.547872,91.5385 +13.496901,144.2822 +13.621566,21.6073 +13.526862,117.2947 +13.480221,166.5376 +13.475142,174.5304 +13.591259,60.7314 +13.475941,177.5297 +13.603197,53.6754 +13.559093,99.4586 +13.580021,80.9280 +13.523057,139.5271 +13.347836,317.3562 +13.538657,128.2638 +13.573655,93.8345 +13.537337,132.4455 +13.630187,44.5448 +13.402435,273.3394 +13.515131,161.5268 +13.374027,305.9883 +13.570760,111.8532 +13.482909,203.7730 +13.623120,66.9218 +13.644157,47.1271 +13.579257,112.6327 +13.595215,97.2705 +13.674732,18.4067 +13.450189,248.1384 +13.660950,42.9354 +13.639412,65.0858 +13.604579,100.5661 +13.649673,56.1433 +13.625573,86.0191 +13.666922,46.5375 +13.646760,68.6528 +13.336537,383.8868 +13.643174,77.8530 +13.662585,59.1212 +13.690043,32.9335 +13.603951,126.8499 +13.711593,21.6973 +13.623949,110.0104 +13.597629,138.0246 +13.641184,98.7232 +13.720425,20.0270 +13.691891,50.1993 +13.692486,50.2264 +13.721028,24.1417 +13.675775,71.9343 +13.680017,70.8846 +13.634041,118.1981 +13.615365,137.6909 +13.554845,203.6014 +13.733292,26.5854 +13.740479,19.9374 +13.658553,104.2293 +13.612700,154.2972 +13.601451,166.9693 +13.665193,103.8117 +13.505484,266.7113 +13.750902,21.9475 +13.703887,70.2511 +13.742714,33.8619 +13.589842,190.2235 +13.705818,75.7087 +13.762783,19.8802 +13.691286,97.2116 +13.758447,30.6149 +13.730802,61.2345 +13.713461,82.4248 +13.733961,62.6721 +13.780067,17.6748 +13.676658,121.6975 +13.752241,49.2518 +13.788498,17.0344 +13.772197,34.6116 +13.759878,47.7252 +13.789064,19.7672 +13.682614,129.6906 +13.596387,219.4583 +13.769006,47.7166 +13.795887,21.7207 +13.774139,45.6812 +13.801494,24.2103 +13.431833,394.3833 +13.532957,293.7837 +13.782665,49.6937 +13.772851,60.1471 +13.721707,112.1935 +13.616273,222.9088 +13.776577,64.4680 +13.745171,96.9636 +13.792038,51.2055 +13.819821,27.5216 +13.760418,90.3152 +13.735655,115.6950 +13.529269,325.1857 +13.722977,133.1789 +13.766999,92.0501 +13.698328,162.3641 +13.798357,66.6884 +13.781528,84.2744 +13.807604,59.8416 +13.832999,37.0737 +13.653472,219.1179 +13.753057,121.4584 +13.797742,78.4770 +13.847344,30.9686 +13.651991,228.1099 +13.850734,32.5214 +13.815846,68.6532 +13.808832,80.7095 +13.872591,17.7127 +13.686683,205.5160 +13.524764,371.5007 +13.739908,157.1487 +13.656873,242.1298 +13.825705,76.4217 +13.839183,63.6109 +13.884501,19.2142 +13.768421,136.2017 +13.890304,18.6824 +13.498089,419.5768 +13.832359,86.6107 +13.865803,53.7745 +13.486277,436.5017 +13.715414,209.5989 +13.833902,92.7862 +13.704498,225.3184 +13.897058,36.8526 +13.870074,65.5735 +13.667491,268.7386 +13.859050,81.8888 +13.851350,91.8919 +13.876221,68.0298 +13.856157,88.7899 +13.892200,53.8947 +13.899004,52.4071 +13.860693,91.6221 +13.903716,49.3972 +13.935648,18.1257 +13.742091,214.6610 +13.940940,18.8215 +13.796634,163.7685 +13.805534,160.9040 +13.919579,48.3887 +13.883257,88.7565 +13.889543,83.0730 +13.841046,132.5570 +13.896265,78.6610 +13.956753,19.5133 +13.943244,36.2579 +13.854456,129.3123 +13.917668,68.6962 +13.584098,403.0078 +13.865046,123.4035 +13.929818,61.0606 +13.933912,58.2444 +13.817608,175.1429 +13.812305,183.0350 +13.826217,173.8564 +13.908988,93.3652 +13.936230,68.0349 +13.959762,47.4236 +13.816723,194.5199 +13.973604,38.4686 +13.944948,67.9377 +13.972015,41.3993 +13.987107,31.4232 +13.951413,72.0375 +13.843245,181.3015 +13.669783,355.3288 +13.953775,72.7276 +13.926689,101.5849 +14.011246,17.8132 +13.902128,130.7932 +13.976268,58.9400 +13.979503,57.9868 +13.944251,95.2612 +14.004266,35.8198 +14.023452,19.5065 +14.025113,20.9926 +13.806809,241.4871 +13.986365,64.2265 +13.974927,77.1428 +13.995341,58.9758 +13.952316,103.7180 +14.039514,17.2915 +13.705147,356.6353 +13.826742,236.4386 +13.983769,81.1428 +13.922780,145.5457 +14.046106,23.8247 +13.967968,105.3189 +13.972617,101.2786 +14.061783,14.9573 +13.988451,89.8389 +13.925014,155.9606 +14.063182,18.7095 +14.032922,49.8036 +14.048297,39.9918 +13.842136,246.9398 +14.002354,87.3273 +13.902795,191.3593 +14.012887,84.0191 +14.076742,20.7194 +14.068327,30.0891 +14.000074,99.0204 +14.056806,50.4094 +14.073288,34.2919 +14.007188,102.2837 +14.088290,22.2110 +14.029060,84.8744 +14.042959,73.2314 +14.094155,22.7406 +13.874517,243.8358 +14.082727,37.8054 +14.098417,22.8029 +13.918971,203.8602 +14.013415,112.3005 +13.990880,135.3329 +14.107216,20.2899 +14.012074,118.7196 +13.867447,263.8574 +14.113935,19.9679 +14.035209,99.6928 +14.116191,20.9038 +13.966439,172.0921 +14.028275,115.7989 +14.054318,90.3817 +14.126214,19.6429 +14.069932,78.5509 +14.107581,42.0310 +14.130795,19.4044 +14.131305,21.2772 +14.134903,19.8099 +13.992753,163.7918 +14.138533,19.6487 +14.064913,97.3594 +14.040087,123.9211 +14.118353,46.2181 +13.953114,214.9940 +14.137096,32.0341 +14.026504,143.2347 +14.154714,15.6353 +14.120534,54.8883 +14.050593,126.0588 +14.110503,70.3750 +14.145858,35.7172 +14.109473,73.0168 +14.089076,98.1015 +14.052071,136.5806 +13.946096,246.2988 +13.904624,288.6048 +14.096907,98.0526 +14.158182,45.1504 +14.144701,60.0376 +14.097462,108.9191 +14.056036,153.4789 +13.992157,218.7290 +14.149613,65.6870 +14.122833,93.0453 +14.175423,42.4658 +14.127507,92.2906 +14.078291,142.2343 +14.099096,121.9974 +14.209516,15.1526 +14.210887,17.9195 +14.150201,83.0933 +14.148484,86.0569 +14.169131,66.1821 +14.152584,83.3399 +14.187179,51.2692 +14.176653,63.5619 +14.224671,17.7223 +14.081892,162.3057 +14.037491,208.5527 +14.188653,60.1148 +14.233295,17.3750 +14.164572,92.7598 +14.133904,124.4303 +14.203334,55.8782 +14.162273,102.8344 +14.248769,17.0649 +14.194961,72.5661 +14.156546,112.4377 +14.168109,103.8671 +14.125717,147.4361 +14.116897,158.2519 +14.220527,57.9056 +14.228808,50.5470 +14.221094,63.0848 +14.182491,105.9629 +14.181576,107.8805 +14.080976,210.0646 +14.273154,20.1395 +14.219799,75.6106 +14.265109,32.4284 +14.170350,128.5945 +14.279356,20.4709 +14.238450,65.6646 +14.235925,69.1022 +14.250671,54.9360 +14.024547,281.6048 +14.267528,44.3119 +14.293295,19.1693 +14.242394,72.4162 +13.693140,625.1378 +14.258336,61.8563 +14.295411,25.9803 +14.268984,56.4924 +14.275150,51.1775 +13.747710,585.0017 +14.244199,89.1834 +14.215302,118.8537 +14.089683,245.1035 +14.164009,171.8103 +14.240216,100.1822 +14.235315,105.8391 +14.169740,176.8893 +14.306153,41.5305 +13.880102,468.5082 +14.332713,18.0488 +14.246045,106.0877 +14.204740,148.5233 +14.291042,63.6147 +14.314811,41.5130 +14.341155,17.6037 +14.334787,29.5293 +14.121222,244.9742 +14.321392,46.4425 +14.284180,85.2364 +14.305608,64.7222 +14.234543,139.3641 +14.265836,108.8102 +14.217890,159.3742 +14.347685,30.4901 +14.334157,50.4448 +13.960404,425.1718 +14.367836,20.4125 +14.289458,99.8880 +13.878314,511.8457 +14.348612,45.3723 +14.298946,97.8454 +14.346630,50.7551 +14.326329,74.1968 +14.370332,31.1288 +14.335821,67.9796 +14.385577,18.8347 +14.259213,150.0761 +14.358760,51.3587 +14.354658,56.5016 +14.390161,25.6381 +14.193230,224.6090 +14.350763,68.8639 +14.377265,45.9519 +14.353264,71.4200 +14.366197,59.0934 +14.215879,211.9058 +14.318279,111.9817 +14.404413,30.8314 +14.304115,132.5378 +14.388249,50.1358 +14.325478,114.4455 +14.271978,170.2236 +14.427786,16.7295 +14.400527,46.8399 +14.299828,148.1109 +14.144075,306.8218 +14.435245,19.6359 +14.423218,32.6793 +14.320193,137.2157 +14.278433,182.2061 +14.374647,87.2962 +14.403801,58.6711 +14.396793,67.7358 +14.424685,40.4380 +14.340400,128.5567 +14.257333,213.6512 +14.454882,19.1202 +14.455899,18.8513 +14.288455,192.9784 +14.356326,125.9816 +14.425291,57.5544 +14.430262,55.5747 +14.352134,134.5649 +14.397386,91.0283 +14.444517,46.6590 +14.474003,18.2984 +14.474752,19.5001 +14.461944,35.6622 +14.481435,17.5229 +14.401462,99.8057 +14.460640,41.7135 +14.436654,70.9732 +14.369417,139.3977 +14.492303,17.2995 +14.417840,93.6282 +14.415800,96.7319 +14.364318,149.2256 +14.497607,18.2279 +14.457410,63.2247 +14.393985,127.4379 +14.486700,36.8030 +14.508816,17.5867 +14.509604,21.3402 +14.468957,62.9238 +14.462473,70.4320 +14.447940,87.1246 +14.447368,89.1044 +14.439924,99.5776 +14.389348,150.9854 +14.464530,77.8826 +14.488415,58.2345 +14.494253,53.1709 +14.373908,179.0368 +14.536474,17.1977 +14.450898,104.8527 +14.482847,74.4157 +14.507629,50.3653 +14.513544,46.1052 +14.312465,248.9229 +14.546651,15.7223 +14.547425,18.2651 +14.206382,360.6750 +14.482308,87.5786 +14.333383,239.4963 +14.410120,168.0149 +14.438386,142.3900 +14.511469,71.8069 +14.465124,119.9332 +14.567059,19.5450 +14.409291,181.5705 +14.180879,411.8983 +14.526404,69.8258 +14.562375,35.0359 +14.297539,303.9491 +14.569888,32.4230 +14.532906,71.4860 +14.531882,74.7191 +14.590862,20.2706 +14.502355,110.5882 +14.419628,194.9810 +14.565691,52.2372 +14.559651,58.8136 +14.601489,18.5356 +14.073897,547.4969 +14.557995,66.3230 +14.578136,46.9266 +14.557263,71.3403 +14.520636,109.1296 +14.611134,21.0599 +14.378176,256.5535 +14.606602,30.5329 +14.539503,99.2678 +14.491177,148.1293 +14.553672,86.8974 +14.561389,80.0394 +14.311842,333.6320 +14.540334,105.6890 +14.305028,341.5232 +14.628605,19.5923 +14.470986,179.1884 +14.634731,18.9060 +14.501269,155.5812 +14.515836,144.1260 +14.586605,73.9834 +14.192396,470.0055 +14.646024,19.0351 +14.604393,64.1309 +14.498959,170.5024 +14.411161,261.2563 +14.612944,60.4430 +14.656851,20.5554 +14.442203,235.7835 +14.629767,51.1621 +14.639307,44.2695 +14.018531,666.7700 +14.665061,23.1476 +14.648198,41.9516 +14.672418,19.7709 +14.592779,100.0355 +14.614610,81.3873 +14.646552,51.3195 +14.596231,104.1870 +14.620025,81.3452 +14.640571,64.2201 +14.625063,80.2644 +14.530945,178.2527 +14.659963,50.3822 +14.669462,42.4767 +14.618465,95.8959 +14.685302,30.5584 +14.384603,334.8655 +14.638772,82.0106 +14.704793,16.5529 +14.705329,18.0681 +14.485838,238.6370 +14.542413,186.3885 +14.632195,98.0357 +14.580777,152.6999 +14.668526,67.6208 +14.572881,164.3442 +14.688209,53.0396 +14.709199,32.8991 +14.641430,101.5514 +14.624319,120.5759 +14.621394,125.2403 +14.728803,19.9142 +14.697872,53.6598 +14.733478,18.8842 +14.683578,69.6718 +14.512533,244.5180 +14.710346,48.0617 +14.723399,35.6925 +14.535066,224.7422 +14.662403,103.2313 +14.715862,52.6424 +14.597412,171.6426 +14.748718,21.1185 +14.724476,46.3161 +14.751533,21.9912 +14.521424,252.9781 +14.585058,194.6543 +14.714362,65.9698 +14.677408,106.6014 +14.637136,148.2197 +14.602312,185.2763 +14.770793,18.8378 +14.680930,110.3178 +14.720784,74.1225 +14.752364,43.3784 +14.768506,28.1895 +14.757052,42.9246 +14.784010,16.4716 +14.759093,45.5677 +14.742099,63.5744 +14.719469,87.2195 +14.773525,34.5354 +14.660589,150.5287 +14.645476,166.6892 +14.779714,37.2626 +14.742982,76.3954 +14.677987,143.4930 +14.791249,33.6607 +14.811119,15.9161 +14.759809,68.2692 +14.794907,33.9901 +14.787590,45.1126 +14.774403,60.0843 +14.799978,37.7688 +14.741250,97.6522 +14.821482,18.3947 +14.721347,119.8603 +14.650175,193.5934 +14.744896,103.9297 +14.690151,159.4322 +14.832704,17.8903 +14.700419,154.4895 +14.837748,18.0256 +14.769838,87.8779 +14.785357,73.9191 +14.843769,17.9774 +14.711940,155.1422 +14.824911,43.9813 +14.854910,16.1204 +14.730232,144.7208 +14.806690,69.8176 +14.765636,111.8761 +14.692190,186.0133 +14.834488,46.6297 +14.816978,69.1320 +14.839877,46.9413 +14.523504,368.4620 +14.849584,43.0566 +14.789632,103.5093 +14.874954,19.8200 +14.796697,100.3787 +14.850595,47.7924 +14.881119,19.0762 +14.841208,60.7636 +14.583277,320.4112 +14.692815,215.1173 +14.736148,174.1164 +14.808062,103.6685 +14.758409,154.1200 +14.819379,94.5729 +14.695999,222.1490 +14.886111,33.0158 +14.838904,83.7674 +14.877513,49.9507 +14.868894,60.1857 +14.891967,39.0282 +14.828079,105.2160 +14.848827,88.1730 +14.552946,384.6821 +14.812166,127.0517 +14.919128,20.7446 +14.878204,64.7670 +14.903689,41.3953 +14.795744,153.6807 +14.894775,59.3907 +14.933297,22.6298 +14.701372,256.0102 +14.673388,286.8661 +14.780333,184.8231 +14.907934,58.2974 +14.555752,412.1076 +14.912531,56.6659 +14.746636,223.3769 +14.954166,18.3070 +14.828899,148.5634 +14.737227,241.0074 +14.945086,34.3447 +14.942972,39.6037 +14.911731,72.9083 +14.857717,128.1264 +14.876508,109.9450 +14.653638,334.0495 +14.901973,87.9528 +14.939873,54.7860 +14.800483,195.7060 +14.910265,88.0443 +14.898388,101.6588 +14.960255,42.4118 +14.966232,37.2011 +14.982577,21.8323 +14.985845,19.1799 +14.922672,86.7990 +14.937629,72.8719 +14.984641,28.2566 +14.827036,191.0063 +14.955928,62.7764 +14.804662,214.8677 +15.005026,15.7798 +14.930997,94.1732 +14.998311,28.6660 +14.967861,62.0899 +14.897076,133.4247 +14.805675,228.3957 +15.004411,30.1790 +15.018044,17.0831 +14.855775,183.0294 +14.893142,149.3300 +14.892642,152.2096 +14.979432,66.1831 +14.978235,71.2374 +14.977463,72.5363 +14.861748,189.3055 +14.969198,84.9677 +14.970014,85.4775 +15.034591,22.3531 +15.002668,58.8748 +14.986455,75.6788 +14.949427,114.3374 +14.753251,314.1654 +15.000048,68.5010 +15.038806,32.3206 +15.018705,54.0431 +14.996190,77.6967 +15.029952,47.1480 +15.045617,32.7600 +15.061544,20.7471 +15.051055,35.5363 +14.972475,114.6036 +15.003434,84.9115 +14.937002,154.3517 +15.056945,34.9825 +14.927465,166.2013 +14.939219,155.0024 +14.617930,477.8701 +15.077101,20.3609 +14.900197,200.8608 +14.929081,172.8568 +15.010502,91.9840 +15.086592,19.2200 +15.034071,73.1485 +15.087079,24.5040 +15.095801,16.3530 +14.886820,226.9606 +14.918149,196.7648 +15.063765,55.1055 +15.019530,100.5393 +15.088347,33.6185 +15.107221,18.6550 +15.111585,15.1876 +15.112155,15.1385 +15.030502,103.0184 +15.118871,15.5708 +14.965157,171.0917 +14.989927,149.3105 +14.957383,185.8742 +15.105813,38.6031 +15.101059,43.9830 +15.068550,77.3676 +15.044853,104.5254 +15.091355,61.8594 +15.054166,100.5814 +15.139239,17.8462 +15.094223,64.5766 +15.126773,37.1397 +14.871032,293.5029 +15.113782,54.6382 +15.097463,71.7575 +15.153216,17.6683 +15.082292,91.2231 +15.073888,101.1553 +15.055492,121.9773 +15.050001,130.2899 +15.145919,35.0786 +15.062134,123.1612 +15.168421,17.4596 +15.102487,85.4608 +15.078378,110.5697 +15.143258,50.8640 +15.136251,58.5072 +15.125877,69.5240 +15.145042,55.0173 +15.127294,76.0568 +15.185297,22.1389 +15.170885,39.1683 +15.049473,161.7612 +15.157087,54.8728 +15.009472,203.0545 +14.859277,358.3785 +15.187949,31.2540 +14.987688,232.9403 +15.121966,99.4972 +15.035128,190.3131 +15.134443,91.5396 +15.207437,20.3503 +14.913953,316.3838 +15.200061,33.8144 +14.769056,466.4990 +15.026978,212.8203 +15.173517,68.2344 +15.120071,123.1044 +15.225984,20.0122 +15.227789,19.9357 +15.195402,53.4216 +15.211236,40.5027 +15.020807,231.7713 +15.219204,36.8877 +15.091929,164.7273 +15.241752,17.9164 +15.185882,77.6716 +15.247726,16.3779 +15.025171,242.1163 +15.203352,65.6768 +15.177471,93.0477 +15.042474,229.9719 +15.217657,56.4707 +15.256657,18.2286 +15.221465,57.1671 +15.149379,130.8345 +15.263555,17.2387 +15.264105,18.8285 +15.220630,65.7944 +15.071128,217.1968 +15.144417,145.0704 +15.180292,110.8368 +15.101939,194.4777 +14.994660,302.5498 +15.245997,52.7627 +15.256093,43.8588 +15.243176,59.2327 +15.194760,111.7442 +15.210055,97.3598 +15.072750,237.8984 +15.180999,138.1535 +15.067417,252.9297 +15.175044,146.4353 +15.274887,47.8865 +15.114915,211.6345 +15.296418,31.1794 +15.310649,18.6592 +15.251740,78.7136 +15.278633,56.3004 +15.270519,65.9043 +15.133521,205.1730 +15.267289,72.7942 +15.269030,74.0797 +15.093668,252.0811 +15.169222,177.2442 +15.252579,96.5104 +14.867083,483.5624 +15.154749,197.2284 +15.338696,16.9400 +15.336425,21.3491 +15.322775,36.3927 +15.248825,112.1787 +15.327598,34.9044 +15.282935,80.3463 +15.194123,170.3138 +15.158801,209.8503 +15.345750,24.2786 +15.288326,83.5881 +15.355637,19.2182 +15.188948,191.5567 +15.340084,41.4154 +15.320349,63.2579 +15.297211,87.2883 +15.280215,105.2353 +15.350647,37.0761 +15.346467,44.1389 +15.289489,102.8690 +15.326551,70.2606 +15.371915,26.8337 +15.299953,100.4821 +15.259670,142.2925 +15.274129,131.6394 +15.225442,181.1994 +15.272447,135.2989 +15.370030,38.2953 +15.390607,21.6895 +15.363282,51.1805 +15.398750,16.8141 +15.012898,404.9616 +15.400436,21.2786 +15.385451,41.0621 +15.280795,146.2363 +15.359168,69.6516 +15.334935,95.5083 +15.343111,89.1999 +15.361005,72.8214 +15.351978,82.5360 +15.349104,87.0633 +15.415567,22.6291 +15.211961,227.6652 +15.302410,141.1812 +15.396813,47.3080 +15.426515,20.1418 +15.233877,216.5150 +15.392359,60.6016 +15.374856,78.6815 +15.406642,48.5541 +15.163914,292.7674 +15.298761,161.0642 +15.291129,170.1050 +15.444122,19.1943 +15.421716,43.6088 +15.362504,107.1984 +15.235555,234.6587 +15.450394,21.2333 +15.401964,73.6240 +15.412298,64.2838 +15.164536,315.0034 +15.408326,72.3656 +15.239799,241.8842 +15.212528,270.0206 +15.357775,128.1712 +15.469704,16.7727 +15.384501,103.3395 +15.470215,18.6227 +15.475589,15.9844 +15.414464,82.4924 +15.438197,61.5366 +15.443593,57.2675 +15.433828,69.0662 +15.319154,184.5034 +15.461236,44.4303 +15.428821,77.7149 +15.491574,17.1187 +15.329309,186.1102 +15.480693,35.9682 +15.479540,38.1715 +15.306505,213.3503 +15.383608,138.7198 +15.471628,51.2329 +15.502895,21.8434 +15.368652,159.6004 +15.230338,298.5016 +15.364439,168.0655 +15.515421,18.8369 +15.455198,80.6173 +15.465326,71.6187 +15.381500,158.7933 +15.496958,44.1453 +15.430444,115.1435 +15.434515,112.7886 +15.456683,92.9692 +15.517713,32.6538 +15.330454,222.0300 +15.506537,46.5834 +15.536946,19.3601 +15.522329,37.5375 +15.500861,59.7103 +15.485948,76.9503 +15.380506,183.0877 +15.519857,48.8669 +15.405770,165.0439 +15.550367,21.1437 +15.486477,86.7866 +15.452962,122.6236 +15.436169,141.1156 +15.532505,45.2894 +15.522862,57.8532 +15.487841,96.0467 +15.476583,107.8716 +15.553121,32.8194 +15.453539,134.7459 +15.568725,20.1340 +15.570815,18.6036 +15.482549,110.4775 +15.432312,165.0223 +15.463318,134.7258 +15.552485,47.7206 +15.499735,104.4857 +15.575586,29.3613 +15.503658,104.4087 +15.488839,120.6687 +15.547305,63.3908 +15.556307,56.3353 +15.427033,189.9437 +15.580716,37.8599 +15.541104,80.1669 +15.577285,45.9147 +15.549653,75.4292 +15.583889,43.6174 +15.508694,120.3890 +15.562899,67.9989 +15.573265,60.0607 +15.387724,248.8260 +15.612643,25.1149 +15.321482,318.2451 +15.459826,183.9933 +15.588860,57.1657 +15.629084,17.8583 +15.616977,31.1079 +15.610697,38.7761 +15.604949,48.3609 +15.528841,128.0170 +15.589420,68.5112 +15.559867,100.5457 +15.534259,126.9320 +15.407747,255.1002 +15.604222,61.5288 +15.307416,361.0164 +15.639728,30.1537 +15.625084,46.6351 +15.643820,31.7545 +15.618577,59.7187 +15.661192,19.1697 +15.630899,51.7953 +15.600207,84.3167 +15.588286,97.3529 +15.646027,41.0445 +15.528253,159.6065 +15.505667,183.4766 +15.577796,115.8217 +15.678297,18.2973 +15.439627,260.2993 +15.597335,104.0572 +15.598045,106.7513 +15.535816,169.5098 +15.286425,422.1956 +15.524739,186.1316 +15.665752,46.1361 +15.675576,38.5762 +15.671720,44.4127 +15.608068,109.8971 +15.684525,37.1207 +15.704797,17.3482 +15.656859,70.7154 +15.708622,19.6755 +15.662849,67.3647 +15.593028,138.8271 +15.571512,162.5120 +15.689145,46.9816 +15.687861,49.0521 +15.633327,104.9535 +15.721646,17.2014 +15.722146,18.5161 +15.636551,106.9464 +15.585942,162.0186 +15.657932,90.5821 +15.584456,166.6458 +15.648086,104.0476 +15.682695,70.3407 +15.685640,70.6475 +15.696595,61.0181 +15.545589,213.0175 +15.743498,17.2544 +15.747962,17.0268 +15.748515,18.8956 +15.711889,56.1198 +15.751103,20.7325 +15.756289,17.4420 +15.446658,331.6042 +15.516662,263.0115 +15.669883,110.4048 +15.710872,70.3669 +15.668433,113.5937 +15.481685,301.5566 +15.764989,18.7856 +15.736914,51.9096 +15.771836,18.0117 +15.417862,376.7723 +15.731856,63.4646 +15.621272,176.4681 +15.716134,83.7973 +15.701394,101.0622 +15.653311,149.8916 +15.717967,85.8298 +15.757614,50.2780 +15.788824,20.3425 +15.730214,81.4192 +15.794636,21.0304 +15.779675,37.3897 +15.760753,57.8421 +15.778263,41.4971 +15.780289,40.9337 +15.699928,123.9397 +15.646944,178.7932 +15.687072,140.8405 +15.767412,63.3176 +15.768010,64.2363 +15.680363,155.3095 +15.738281,98.0275 +15.758608,79.9949 +15.802457,39.2348 +15.827914,16.3358 +15.740663,108.2733 +15.823869,25.6326 +15.728298,124.1565 +15.795322,59.9297 +15.783776,72.8201 +15.817066,40.1049 +15.714153,146.0165 +15.540295,320.5067 +15.818597,46.0702 +15.848937,17.5669 +15.782028,87.9013 +15.734025,139.0932 +15.783242,93.5219 +15.773732,104.2508 +15.825738,52.8260 +15.563596,319.3431 +15.841693,41.7719 +15.815667,68.8966 +15.856597,30.8656 +15.869931,18.5777 +15.864668,29.6014 +15.789849,104.9110 +15.876766,19.0431 +15.660414,236.6986 +15.753037,144.8360 +15.623201,274.9362 +15.819761,82.6698 +15.887464,15.5396 +15.809168,95.6455 +15.860803,45.0388 +15.860171,46.7734 +15.894271,14.8865 +15.560572,351.1232 +15.873119,40.9313 +15.736128,181.2559 +15.852456,65.5430 +15.830731,90.9360 +15.836310,86.8025 +15.838604,85.5790 +15.781240,149.4526 +15.888510,43.0157 +15.894761,37.4085 +15.917385,17.7329 +15.866505,71.7284 +15.909158,30.5774 +15.803204,141.6213 +15.882940,62.9479 +15.857172,89.2553 +15.906946,40.5562 +15.627508,320.6695 +15.905842,45.6027 +15.903005,51.0624 +15.938235,17.9090 +15.921668,38.8275 +15.932170,29.9311 +15.799933,162.7102 +15.738849,225.2099 +15.855253,111.1351 +15.945889,21.9431 +15.951446,19.0301 +15.637759,336.1945 +15.897874,76.6484 +15.904815,70.5306 +15.849503,128.2019 +15.962645,19.0840 +15.914052,69.9529 +15.884565,100.0610 +15.811635,176.0378 +15.956145,37.9875 +15.883466,113.1377 +15.609509,388.8305 +15.835674,163.6564 +15.977706,22.2747 +15.911697,89.0539 +15.967833,37.6167 +15.923114,82.9514 +15.898138,109.7886 +15.973955,38.2142 +15.924184,88.5420 +15.994133,20.6959 +15.897113,119.4652 +15.996604,20.8125 +15.946428,75.3629 +15.974523,48.8716 +15.966389,59.8115 +15.895809,130.9400 +15.918000,109.9310 +15.944826,83.6580 +16.012170,19.8629 +16.012727,21.7157 +16.005450,31.7852 +15.984627,53.7488 +15.999982,39.2652 +15.807894,235.4701 +15.832247,212.1037 +16.021792,24.1664 +15.844251,203.7758 +15.947503,101.8423 +16.032034,19.1347 +16.014831,39.4363 +16.037237,17.7328 +16.000752,55.0651 +15.987674,72.4123 +15.649474,411.5425 +16.038377,25.6584 +15.984006,82.7144 +15.954069,113.2506 +15.930694,137.7030 +16.055818,17.0526 +16.016579,57.4724 +15.962102,115.2286 +15.999331,81.3324 +15.975347,106.3616 +16.027932,57.4242 +15.752135,339.5476 +16.054268,37.9827 +15.877984,216.5443 +15.803798,291.3356 +15.821224,274.9685 +15.902432,195.9523 +15.981730,119.8529 +16.080665,21.9440 +16.068398,36.2307 +15.693618,414.2231 +16.091684,18.9385 +16.092252,19.9746 +15.998341,116.4249 +16.045959,70.0872 +16.061018,59.1801 +15.931527,189.5698 +15.970477,152.9779 +16.048028,77.1675 +16.104630,22.7732 +16.110624,17.3298 +16.112227,19.6783 +16.051170,81.2997 +16.034444,101.4197 +16.054971,83.7401 +16.095134,45.2003 +16.026750,115.1010 +16.085358,57.7028 +16.102610,44.1324 +15.935119,212.4058 +16.067320,81.3653 +15.960496,191.1858 +16.135865,18.5505 +15.878565,280.4202 +16.116048,44.8190 +16.081710,81.1649 +16.023396,140.1427 +16.098385,68.2570 +15.939737,228.2535 +16.151683,17.9124 +16.077332,93.1086 +16.131907,40.2762 +16.158987,16.8252 +16.127404,49.4225 +16.141852,39.2733 +16.163539,21.2324 +16.006066,179.7057 +16.120199,68.5560 +16.043365,150.1341 +16.064036,130.2635 +16.017418,177.4079 +16.121098,74.7403 +16.123457,73.1898 +16.175813,22.1992 +15.705327,496.4473 +16.072872,130.1515 +16.096194,108.1279 +15.727576,479.9182 +16.044352,166.3419 +16.127955,86.0971 +16.101584,113.9256 +16.154417,62.4915 +16.172184,46.6437 +16.074053,146.2864 +16.114767,108.5273 +16.162876,61.6111 +16.039248,186.7179 +16.210695,17.1486 +16.188756,39.9719 +16.214053,18.7206 +16.176828,57.6756 +16.167992,71.5774 +15.948178,293.5056 +16.169597,73.5574 +16.132471,114.4351 +16.181128,66.8574 +16.194301,55.4984 +16.060087,190.6722 +16.239570,16.6444 +16.185772,71.4038 +16.094529,163.4275 +16.225967,36.9139 +16.198014,65.8101 +16.232775,32.1397 +16.207495,58.5417 +15.797742,469.1534 +16.227845,41.4991 +16.220341,51.6306 +16.107843,164.7711 +16.216909,60.1806 +16.218829,60.8392 +16.224489,56.4235 +16.170442,112.8153 +16.196647,89.4050 +16.249800,39.0182 +16.271972,19.3326 +16.160867,133.3265 +16.184773,110.3992 +16.066721,231.8304 +16.143062,156.2562 +16.007928,294.6777 +16.228729,75.2327 +16.140336,167.0302 +16.288820,19.3729 +16.193500,122.0864 +16.272615,43.6772 +16.215511,102.2514 +16.257958,62.3306 +16.263825,57.6744 +16.302607,19.4402 +16.204323,120.6311 +16.266038,59.5480 +16.125196,202.8493 +15.964060,367.2983 +16.315588,17.0514 +16.138712,195.4844 +16.316294,19.0638 +16.247986,93.1520 +16.324955,16.6859 +16.283258,60.0855 +16.203025,143.2286 +16.262882,85.3761 +16.332640,17.9246 +16.028485,323.2485 +16.246907,106.5866 +16.269345,85.0455 +16.201775,155.6986 +16.341139,17.3421 +16.243155,116.1211 +16.307367,53.3190 +16.341641,19.9691 +16.346254,18.2206 +16.298553,69.2779 +16.234504,135.7771 +16.279669,92.2794 +16.166644,209.2604 +16.223295,153.5896 +16.049346,328.1162 +16.325587,53.4009 +16.194827,186.9024 +16.364476,19.8030 +16.320289,66.3665 +16.241685,148.3534 +16.371950,18.6843 +16.146744,249.2040 +16.357474,39.7997 +16.148687,250.0483 +16.361612,39.7474 +16.384280,17.6560 +16.386657,18.0596 +16.343345,61.9466 +16.317763,92.6595 +16.264916,147.7990 +16.250760,163.4812 +16.266897,149.4788 +16.376886,41.2117 +16.294195,125.8518 +16.405293,15.5467 +16.350566,72.6867 +16.299319,124.9998 +16.390636,37.0805 +16.375905,55.8442 +16.416377,15.9165 +16.360687,75.0919 +16.322048,116.0905 +16.321500,117.4819 +16.334197,107.5972 +16.390039,56.3376 +16.404717,43.3652 +16.295173,154.1354 +16.431750,18.4313 +16.432294,20.1321 +16.308194,147.2987 +16.328047,128.8085 +16.418099,40.5792 +16.353495,106.4751 +16.257177,206.8607 +16.256216,208.9823 +16.398736,68.9665 +16.280913,188.9682 +16.291306,179.8685 +16.026202,447.3340 +16.303963,170.5135 +16.455493,19.6055 +16.378989,101.7045 +16.370284,112.1438 +16.358482,124.7222 +16.464039,20.0698 +16.354391,133.7237 +16.435780,53.8610 +16.367832,122.3887 +16.424320,66.8524 +16.471176,20.6444 +16.475100,18.6335 +16.448084,51.8181 +16.446378,57.5355 +16.488116,16.3605 +16.377463,128.0614 +16.427717,80.2965 +16.469882,38.7820 +16.412716,98.2708 +16.456856,55.0925 +16.410424,104.8148 +16.195839,322.8551 +16.423254,98.9732 +16.499903,25.5970 +16.491821,35.4100 +16.397275,131.3792 +16.441795,88.2443 +16.503914,26.7366 +16.420840,111.8952 +16.518695,16.8232 +16.522228,16.5892 +16.489642,54.6984 +16.395949,150.4310 +16.335359,212.4032 +16.359277,189.2441 +16.510988,40.0075 +16.277092,275.9397 +16.480695,73.0007 +16.491173,65.5058 +16.508015,52.9097 +16.515240,48.5181 +16.530652,36.2152 +16.414243,155.6028 +16.473537,97.5404 +16.467705,107.8246 +16.348259,227.8572 +16.438139,138.5441 +16.525501,54.0135 +16.535519,44.8042 +16.553033,28.7661 +16.547763,38.7191 +16.550996,36.5316 +16.563759,26.1211 +16.490222,103.2047 +16.538818,57.1711 +16.351735,248.4053 +16.483206,118.6466 +16.452427,149.9891 +16.580325,25.9194 +16.527232,79.6120 +16.560926,46.9147 +16.508665,100.0645 +16.438983,174.4869 +16.595990,18.1299 +16.459971,158.4254 +16.493735,128.5033 +16.465200,157.9868 +16.544342,79.6149 +16.474477,153.6645 +16.286053,343.0099 +16.581800,50.4319 +16.546381,88.1168 +16.606845,29.3734 +16.606245,31.7213 +16.622239,16.2602 +16.601853,38.3241 +16.623188,19.7367 +16.566868,80.9874 +16.505526,143.5074 +16.608731,41.2961 +16.576118,75.2055 +16.147525,504.6264 +16.637967,18.4460 +16.638500,18.6761 +16.530041,129.9174 +16.458679,204.3576 +16.571079,95.2630 +16.579516,87.3610 +16.647857,21.2754 +16.504478,166.6807 +16.656415,18.1138 +16.576684,98.4374 +16.657178,19.6545 +16.482429,196.2699 +16.650028,32.2365 +16.618398,64.3742 +16.556680,128.8223 +16.649034,39.4818 +16.575530,113.7699 +16.593428,97.0591 +16.613472,78.8225 +16.651325,44.3444 +16.401937,297.0030 +16.450182,249.3530 +16.484110,218.4385 +16.628143,79.5747 +16.674530,33.7771 +16.401360,307.5649 +16.381730,329.9345 +16.553696,161.8376 +16.600141,116.8451 +16.671160,46.4181 +16.702550,17.7186 +16.589882,133.7767 +16.640178,86.1227 +16.607842,119.2964 +16.689301,38.6685 +16.548522,182.0271 +16.586483,145.5901 +16.569846,165.7998 +16.669134,67.9541 +16.652153,86.3920 +16.723660,17.3885 +16.629065,112.5183 +16.727140,17.9565 +16.676833,71.3612 +16.511950,240.7016 +16.735647,20.0370 +16.716987,41.5105 +16.663037,97.2057 +16.587529,174.2647 +16.690488,72.5199 +16.682265,81.5782 +16.732074,35.6293 +16.532737,237.1068 +16.614121,156.3098 +16.707719,66.3359 +16.738547,38.9652 +16.698941,82.5098 +16.666878,115.5381 +16.741584,41.8423 +16.741049,45.0630 +16.726302,60.5664 +16.659959,130.0049 +16.708308,82.4505 +16.602417,189.1677 +16.774056,19.7406 +16.755685,42.7007 +16.420048,380.8557 +16.632233,169.4859 +16.711666,92.9626 +16.748196,57.0291 +16.642925,165.3152 +16.793798,15.3750 +16.786870,30.0524 +16.699536,118.7086 +16.634499,185.1560 +16.804629,16.4721 +16.770432,51.8462 +16.752653,72.6341 +16.761795,64.2270 +16.805226,23.4216 +16.528655,305.7120 +16.760244,76.7260 +16.777513,61.4388 +16.708926,131.2657 +16.675123,166.0888 +16.769844,72.3825 +16.449309,399.1725 +16.623958,225.1444 +16.790759,60.1372 +16.682773,169.5695 +16.834369,20.4648 +16.818247,37.2946 +16.695670,163.4364 +16.836972,23.5728 +16.821103,41.2915 +16.720270,144.2738 +16.825288,41.0590 +16.737089,131.9922 +16.828649,41.2890 +16.801720,70.9242 +16.685503,188.3537 +16.855542,20.0043 +16.688517,187.6602 +16.859108,20.7361 +16.808242,74.0638 +16.745097,139.8881 +16.727971,158.8089 +16.791586,98.1921 +16.767705,122.7973 +16.715535,175.5369 +16.852344,41.9345 +16.763009,134.3044 +16.860546,37.3587 +16.789965,112.9862 +16.786114,117.4129 +16.783427,121.1362 +16.841213,66.1417 +16.891073,17.2902 +16.819656,92.0830 +16.763845,149.3814 +16.848483,66.0142 +16.758499,159.3360 +16.894279,28.5136 +16.866348,58.7946 +16.822280,103.9437 +16.873858,55.3173 +16.800905,129.2179 +16.666343,268.6013 +16.809174,127.1333 +16.798387,140.7861 +16.911741,29.6977 +16.862395,79.7509 +16.922794,22.1411 +16.781452,164.8764 +16.897314,54.3872 +16.869939,82.7615 +16.890503,63.7121 +16.864545,90.3099 +16.854834,103.0801 +16.939175,20.0690 +16.678700,281.9304 +16.730551,233.0514 +16.904565,60.9364 +16.879845,87.1871 +16.954217,16.0719 +16.886781,86.2178 +16.941440,34.4876 +16.930124,46.9592 +16.875547,102.7103 +16.816924,163.7229 +16.636220,347.5918 +16.925144,59.9450 +16.970291,16.4378 +16.973000,19.5433 +16.934945,61.3294 +16.907355,90.2348 +16.957916,41.8086 +16.936308,64.3686 +16.897905,105.5374 +16.331359,673.6829 +16.869082,136.8812 +16.986730,22.2513 +16.992545,18.9852 +16.951703,62.3252 +16.876178,141.1239 +16.850898,168.1441 +16.840193,179.6091 +16.842228,178.3839 +16.952702,72.6843 +16.926225,101.1134 +16.942148,86.2755 +17.014029,17.1310 +16.914498,120.4292 +16.838953,196.8651 +16.826023,210.6767 +16.997591,45.6530 +16.929177,116.3467 +16.889779,161.6502 +16.978259,73.7216 +16.882307,170.2440 +17.034930,18.9074 +16.985090,70.9984 +17.008982,49.9637 +16.996276,64.5367 +16.903528,158.6793 +16.913227,152.4021 +16.872645,194.4933 +16.884986,183.0406 +17.028425,40.4067 +17.027339,44.0592 +16.977084,97.0654 +16.963603,112.2198 +16.902953,176.3549 +17.017303,63.7191 +16.999725,82.9944 +16.908364,174.9503 +16.849103,235.2207 +17.065630,19.6971 +17.071400,19.3452 +17.020613,71.0226 +17.051981,44.8631 +16.975929,121.4404 +17.000678,98.0362 +17.068028,36.4978 +16.917836,187.2768 +17.062208,43.4958 +16.965502,141.2710 +16.959245,149.1432 +17.091637,20.7099 +17.079309,34.2108 +17.053838,64.1003 +17.052551,66.9901 +16.967033,153.4997 +17.005043,119.5630 +17.025387,100.7023 +16.946329,182.1899 +17.081024,48.3434 +17.090746,42.7417 +16.692295,443.8911 +17.098715,41.4101 +16.980647,160.2650 +16.944936,196.9123 +17.108389,36.8929 +17.074151,74.5415 +16.960631,188.7877 +17.011531,139.2928 +17.096846,54.8067 +17.136187,18.8149 +17.003444,152.1714 +17.058947,100.2098 +16.983813,179.2838 +17.043246,121.2371 +17.150825,18.6626 +17.126091,44.8510 +17.060814,110.6931 +17.075824,98.0319 +17.036701,139.4941 +17.106775,70.5282 +17.084325,96.1486 +17.141849,39.5969 +17.163098,21.1200 +17.117940,66.9147 +17.145283,42.7245 +17.120534,68.6978 +17.051431,138.3639 +17.019043,171.9255 +17.128521,65.8682 +17.140126,55.9440 +17.184219,14.4214 +17.148694,53.5197 +17.097370,108.3634 +17.113521,92.8447 +17.045525,161.4439 +17.181447,27.9145 +17.159158,50.9209 +17.198641,17.7086 +17.105705,111.9059 +17.085328,137.6835 +17.056090,168.8299 +17.140914,86.4946 +17.031162,197.4593 +17.177304,53.8881 +17.171508,62.0586 +17.155003,80.1704 +17.180474,56.5993 +17.170943,68.7726 +17.205734,35.1891 +17.223014,18.4463 +17.019803,224.9415 +17.189232,57.4003 +17.164484,84.2522 +17.105114,145.5909 +17.149420,101.9144 +16.782417,472.5160 +17.206970,52.1252 +17.068832,191.1381 +17.202214,59.1103 +17.206366,59.0299 +17.124608,141.3096 +17.104527,162.3768 +17.035819,232.4409 +17.216351,53.7121 +17.083316,189.0460 +17.228622,45.5883 +17.231193,46.1966 +17.237075,41.1640 +17.210080,72.8554 +17.265398,18.0420 +17.265918,18.0552 +17.112348,174.0987 +17.241462,46.3776 +17.224922,64.5868 +17.250706,41.6156 +17.196071,96.8457 +17.119543,173.9436 +17.209363,85.1150 +17.248737,50.6673 +17.282936,17.3603 +17.283441,17.3803 +17.283975,20.8620 +17.184856,123.1803 +17.259971,49.3392 +17.129368,180.4612 +17.292322,18.0357 +16.954856,358.5508 +17.240924,73.6579 +17.300298,20.5131 +17.233567,88.4397 +17.300822,22.8545 +17.151653,173.0609 +17.286448,41.0934 +17.082721,248.0677 +17.289510,42.2884 +17.278240,54.1766 +17.299405,36.8803 +17.304838,33.8124 +17.246634,94.1122 +17.169488,172.6616 +16.717579,626.6790 +17.327542,18.7199 +17.239717,110.6968 +17.308037,43.7233 +17.259096,94.4080 +17.309831,45.3346 +17.217612,139.2204 +17.272363,85.5437 +17.331799,31.0485 +17.261326,102.3389 +17.173857,194.1631 +17.190969,178.2103 +17.287840,83.3156 +17.155616,216.5500 +17.322008,54.1952 +17.244746,133.4023 +17.268261,110.9802 +17.067140,317.2500 +17.338651,46.4639 +17.188009,199.9477 +17.356833,32.3569 +17.351762,38.3598 +17.005964,387.3843 +17.324715,69.8687 +17.133497,264.1766 +17.372167,26.1869 +17.355166,46.2564 +17.353505,51.4181 +17.387958,17.4614 +17.357908,48.7112 +17.371157,37.5497 +17.369180,41.7152 +17.274211,137.4982 +17.376204,40.0777 +17.189796,228.6608 +17.293488,125.9294 +17.251335,172.3015 +17.401424,23.2184 +17.404924,20.2268 +17.405420,20.2843 +17.342151,85.9702 +17.344259,85.4623 +17.310359,121.1456 +17.410897,21.8817 +17.362849,73.4226 +17.235174,203.5613 +17.294479,147.0988 +17.378149,65.0491 +17.428122,15.6751 +17.398355,48.2196 +17.320812,127.5858 +17.309312,140.0065 +17.292918,158.6224 +17.277391,179.0265 +17.429723,29.3529 +17.368021,94.1750 +17.227409,238.6111 +17.314585,153.2472 +17.176196,292.8530 +17.363666,106.7813 +17.419418,55.8010 +17.254934,221.2715 +17.384391,92.8007 +17.462197,17.4098 +17.393350,90.1306 +17.194390,289.6130 +17.389191,95.9742 +17.346263,140.4426 +17.390123,98.1859 +17.475220,17.0401 +17.467833,25.7633 +17.432780,62.3693 +17.266905,231.4723 +17.449320,49.6730 +17.394585,105.7388 +17.483481,19.2183 +17.379243,125.0215 +17.332417,178.2814 +17.484004,27.4853 +17.438737,78.1169 +17.441579,76.2510 +17.498378,20.2666 +17.313408,206.4052 +17.270064,251.4191 +17.425152,101.6975 +17.498993,28.6821 +17.448399,80.3396 +17.385117,145.5680 +17.500325,33.5388 +17.425705,109.7318 +17.516855,20.2361 +17.469050,68.6168 +17.431506,107.1997 +17.470448,71.8915 +17.443798,99.8221 +17.495151,50.1510 +17.488309,59.7927 +17.408708,142.3203 +17.330789,222.0268 +17.533865,19.5794 +17.336287,222.2471 +17.350415,208.7876 +17.424643,135.3830 +17.406620,155.8101 +17.504265,59.7314 +17.548103,18.3085 +17.521484,45.8650 +17.397675,172.9154 +17.466022,108.1387 +17.558535,17.5311 +17.477192,104.1171 +17.535438,46.3854 +17.436273,146.0465 +17.517831,66.3394 +17.526851,58.7951 +17.567351,19.0048 +17.486707,104.3691 +17.551030,41.1001 +17.479608,113.3107 +17.576067,18.0094 +17.563998,33.2487 +17.543621,54.1508 +17.566413,35.5441 +17.537092,66.2088 +17.511490,94.6572 +17.502701,104.0893 +17.545303,65.2802 +17.591077,20.6773 +17.538706,76.1748 +17.581311,34.3390 +17.537668,79.2898 +17.597248,21.0792 +17.528739,93.6569 +17.423638,200.0068 +17.592920,31.6151 +17.611756,18.7482 +17.530686,101.9865 +17.416283,219.0978 +17.586356,52.7488 +17.553445,86.2372 +17.622397,17.8104 +17.597773,46.0182 +17.542341,104.0200 +17.493597,154.5148 +17.594077,55.3510 +17.615651,34.6867 +17.632673,18.8220 +17.485166,169.9213 +17.459077,200.5055 +17.624536,36.6714 +17.411711,250.7952 +17.618328,44.8037 +17.610584,54.5743 +17.574162,92.4070 +17.518646,150.4862 +17.519814,150.5046 +17.340747,333.7778 +17.443199,233.7324 +17.446576,232.0905 +17.648113,36.1476 +17.639106,46.1548 +17.592131,94.9809 +17.570591,118.3018 +17.601958,88.9039 +17.476207,215.9475 +17.646362,47.9621 +17.676932,19.3398 +17.678667,19.8366 +17.684262,18.3057 +17.655089,50.0671 +17.665159,45.7665 +17.694325,17.3549 +17.527677,185.9790 +17.696273,18.5427 +17.614882,100.8083 +17.649429,67.6988 +17.702568,17.7453 +17.643792,80.8293 +17.584171,141.7683 +17.659583,66.9870 +17.560027,169.6730 +17.714817,19.4705 +17.552817,184.9644 +17.666570,74.1134 +17.581824,159.4305 +17.685262,57.5473 +17.635381,108.3973 +17.606148,140.5265 +17.616959,131.0115 +17.323677,425.3464 +17.729701,20.4225 +17.734289,18.6118 +17.698505,57.1555 +17.692155,66.8292 +17.717129,44.4927 +17.688894,74.0373 +17.746676,17.1220 +17.742811,24.6385 +17.725941,42.5517 +17.418458,353.2945 +17.755661,16.6649 +17.603302,173.0504 +17.640209,137.8582 +17.740684,42.6488 +17.741256,42.7223 +17.606791,179.2253 +17.582320,206.2064 +17.743780,107.2393 +17.650338,203.1654 +17.750125,104.8111 +17.758985,99.4831 +17.456418,403.3192 +17.623646,237.8054 +17.762933,99.1715 +17.639683,226.4306 +17.710927,155.7466 +17.851022,19.4900 +17.749025,126.0026 +17.763799,111.8909 +17.630505,246.4272 +17.690863,186.5389 +17.670320,208.0409 +17.669133,210.0658 +17.720315,162.5277 +17.858470,26.3090 +17.737783,148.5505 +17.713657,173.9963 +17.761623,127.0173 +17.585647,307.1569 +17.853505,43.2188 +17.451541,447.6622 +17.747972,151.7354 +17.776354,124.8790 +17.778068,124.5963 +17.882843,20.5225 +17.861452,46.6596 +17.662507,246.2257 +17.772327,137.6475 +17.892805,17.7340 +17.492261,421.5159 +17.661209,255.2963 +17.711681,206.0140 +17.705157,216.5053 +17.870513,51.7212 +17.783334,140.1292 +17.862105,64.6714 +17.913778,15.6982 +17.768494,161.5792 +17.886334,44.3029 +17.771753,163.2004 +17.876933,61.2827 +17.879200,61.4348 +17.908734,34.5944 +17.715692,228.3628 +17.788528,156.6848 +17.859739,86.4610 +17.909976,37.2760 +17.651496,298.0743 +17.938217,16.2199 +17.866115,88.9750 +17.559204,400.1804 +17.917696,42.2103 +17.896725,67.9020 +17.923464,41.6893 +17.926778,39.3334 +17.934955,33.2321 +17.877403,91.4929 +17.783979,186.9644 +17.910540,61.3853 +17.687113,286.9000 +17.959386,16.1230 +17.940636,37.1429 +17.947253,33.3340 +17.964628,16.6281 +17.930638,53.8547 +17.946201,40.1524 +17.887654,99.6005 +17.884780,107.7555 +17.977780,17.1183 +17.966112,32.5865 +17.971927,28.3518 +17.929477,71.3688 +17.984494,16.9296 +17.965155,39.0726 +17.968188,38.8103 +17.663133,347.1480 +17.875691,136.2044 +17.899709,112.7924 +17.724623,292.1071 +17.901234,116.1265 +17.986355,35.2351 +17.975510,46.8713 +17.943329,85.4472 +17.998700,30.8703 +17.970945,59.4579 +17.674526,356.6529 +17.955091,80.2241 +17.930074,107.4905 +17.945214,92.9084 +17.987256,51.7107 +17.562431,478.7439 +17.888642,156.5355 +17.903367,142.7989 +17.968897,77.7647 +18.028778,18.8910 +17.767450,285.1894 +18.016731,37.4431 +17.899204,155.4392 +17.916506,138.6115 +18.001425,57.4606 +17.752902,308.1359 +17.949572,112.5451 +18.045178,17.5174 +18.017362,48.0186 +17.908113,157.9707 +18.046167,20.8829 +17.981257,89.2815 +18.054644,17.0399 +18.058886,16.9340 +18.031180,47.7487 +17.726571,353.1311 +18.062118,19.2476 +17.980589,104.5548 +17.974013,112.3207 +17.994900,95.0737 +18.061039,30.9388 +17.854937,240.0199 +18.037565,58.2734 +18.052641,43.7128 +18.012502,84.6531 +18.078930,19.7986 +18.070540,34.3303 +18.067051,40.0414 +18.011896,95.9876 +17.510700,597.7415 +17.902665,206.7124 +18.004228,105.7439 +18.095840,18.5493 +18.055118,60.6930 +18.086336,34.0439 +17.921663,200.3038 +18.046663,76.4631 +18.029572,96.2184 +17.866675,261.1724 +17.992536,136.5246 +18.089974,41.5264 +18.071685,62.7313 +18.075821,59.7786 +18.000279,137.8173 +18.121968,17.6992 +18.123127,18.3327 +18.022382,123.0434 +17.786018,361.2205 +18.030404,117.3908 +18.097156,52.5293 +18.134418,18.8824 +18.065381,89.9543 +18.096354,60.8181 +18.139669,18.4404 +18.062697,98.0062 +17.875029,286.5848 +18.085145,76.9382 +18.094958,69.0667 +18.129062,36.4053 +18.153301,16.0352 +18.107885,63.1702 +18.000847,170.9808 +18.079703,93.4763 +18.155337,19.0035 +18.109973,67.1670 +18.147796,33.7691 +17.922235,262.9492 +18.131502,56.4073 +18.098729,89.7118 +18.066085,123.7051 +18.174341,17.5318 +18.035316,162.4534 +18.104872,93.6221 +18.115813,86.1104 +18.006999,196.1427 +18.107093,97.0166 +18.120381,87.3195 +18.157174,52.5531 +18.041176,169.0781 +18.149687,62.2039 +18.158110,54.7987 +18.047669,169.3931 +18.171829,47.9327 +18.160704,59.7297 +18.162084,61.2887 +18.185186,38.6893 +18.010282,214.2903 +18.207702,19.0937 +18.173181,54.1767 +18.125791,102.2108 +18.038123,194.7505 +18.189791,44.2427 +17.878362,357.7024 +18.109379,129.5173 +18.187910,52.5191 +18.223374,17.6933 +18.197771,48.9429 +18.145427,102.0873 +18.147239,102.3331 +18.234035,18.9071 +18.171056,82.6101 +18.108442,147.1430 +18.238897,18.9170 +18.038968,222.7238 +18.161615,102.1970 +18.127848,136.8743 +18.232875,34.6056 +18.054175,215.3705 +18.211892,58.4393 +18.255586,16.2091 +18.181567,93.0982 +18.224573,50.6242 +18.212910,66.4547 +18.236065,48.2975 +18.191874,93.4563 +18.228003,58.3967 +18.169337,121.3418 +18.240430,50.7683 +18.253668,38.4568 +18.247515,49.7895 +18.220435,79.0413 +18.264724,35.4789 +18.284364,17.7785 +18.081367,222.9151 +18.267482,37.8640 +18.135601,170.9961 +18.209728,99.1723 +18.201925,109.2173 +18.274666,38.8523 +18.188442,126.2787 +18.141461,176.2304 +18.279367,39.7313 +18.275198,45.2242 +18.219763,102.6008 +18.203143,121.7046 +18.249574,76.4931 +17.944055,384.4302 +18.285332,45.1243 +18.314722,17.2745 +17.954438,381.4225 +18.177141,163.5336 +18.308901,32.4750 +18.164026,179.9099 +18.286401,59.2028 +18.328487,17.6431 +18.204111,145.3755 +18.291200,60.5164 +18.091978,260.6128 +18.335861,17.5179 +18.252943,103.7838 +18.021591,337.5835 +18.304283,56.5477 +18.313519,51.8360 +18.324849,41.3967 +18.263813,103.6162 +18.319099,50.0587 +18.227358,143.4071 +18.340676,30.6696 +18.356728,18.9529 +18.330457,50.3545 +18.353380,29.0163 +18.210256,175.0340 +18.305347,81.3296 +18.326068,61.8241 +18.349487,41.6166 +17.959907,431.7170 +18.331998,64.4340 +18.302143,95.7772 +18.320423,81.2897 +18.366247,36.2740 +18.385291,19.2747 +18.345605,60.3250 +18.386677,20.3129 +18.217064,191.2828 +18.114390,296.6862 +18.343937,68.1308 +18.198495,214.3134 +18.322364,93.7981 +18.269547,150.3807 +18.391105,29.4273 +18.246715,174.3260 +18.404567,16.9993 +18.397922,28.5633 +18.270332,156.6773 +18.297306,133.9978 +18.257815,174.0459 +18.359176,73.6272 +18.300204,133.7997 +18.261693,173.5845 +18.375682,61.5855 +18.420533,17.4973 +18.426486,16.1799 +18.387893,57.4934 +18.306598,139.3298 +18.411077,39.2291 +18.380813,70.2467 +18.292126,161.3802 +18.299477,154.6587 +18.391625,64.3508 +18.165468,293.1461 +18.445387,14.3148 +18.445929,15.4134 +18.450308,15.6110 +18.241068,228.7900 +18.412069,59.4247 +18.351718,122.3039 +18.432804,43.2899 +18.459703,18.2196 +18.416163,63.6619 +18.371347,109.1860 +18.453507,30.2052 +18.352592,132.7472 +18.226796,260.9071 +18.401714,86.8387 +18.435278,54.9468 +18.346131,146.3806 +18.412809,83.7575 +18.419928,78.7799 +18.382397,117.7036 +18.402522,99.8454 +18.360831,142.2069 +18.421042,85.6473 +18.471495,35.9054 +18.421567,86.8787 +18.138098,373.4392 +18.396433,116.9774 +18.496568,18.3624 +18.370766,145.9850 +18.469860,48.0196 +18.442667,77.9565 +18.458615,62.5056 +18.465920,55.7381 +18.506691,18.3247 +18.480533,45.4031 +18.434005,96.3266 +18.461344,69.9900 +18.451060,80.9038 +18.454137,81.8818 +18.520624,15.8670 +18.488554,49.6325 +18.521121,18.1867 +18.290681,253.3783 +18.369159,177.3953 +18.521659,25.6833 +18.503039,48.6604 +18.536020,16.3790 +18.507401,46.3982 +18.536492,18.4837 +18.408347,147.2748 +18.508447,48.9073 +18.513411,46.6122 +18.431862,129.0412 +18.544060,17.3511 +18.437269,128.7619 +18.427010,140.1599 +18.367430,203.6591 +18.341377,231.0673 +18.500102,73.6232 +18.311143,263.3642 +18.554977,20.2522 +18.539309,39.0240 +18.560024,20.3748 +18.487704,94.1800 +18.431304,153.2992 +18.223876,363.7331 +18.485341,102.9467 +18.483713,105.0978 +18.571091,18.2234 +18.511538,80.3004 +18.476096,116.5107 +18.405931,188.2712 +18.578334,18.6695 +18.474023,127.2962 +18.406991,195.2891 +18.525938,79.2043 +18.514932,92.1634 +18.502369,107.4285 +18.531335,79.0561 +18.438032,173.0652 +18.547343,67.7409 +18.530332,86.1834 +18.588289,31.6028 +18.605143,16.3398 +18.551701,72.0003 +18.609798,16.3429 +18.490226,138.1666 +18.588812,40.6899 +18.615085,15.1645 +18.567172,65.7955 +18.616517,17.3344 +18.587610,47.7100 +18.573726,64.1187 +18.365356,276.2347 +18.626142,17.6405 +18.628394,18.2924 +18.560904,87.2033 +18.271796,379.6838 +18.589316,63.1074 +18.531965,121.3763 +18.629503,27.2755 +18.601321,58.2752 +18.641592,20.3099 +18.630250,33.4255 +18.566032,102.4785 +18.637846,32.0579 +18.572446,100.5064 +18.555623,118.5710 +18.597005,78.1611 +18.498709,177.0673 +18.656779,20.5788 +18.659597,19.7523 +18.646687,37.6175 +18.621484,63.4202 +18.591839,95.1942 +18.592607,95.7572 +18.581885,106.9913 +18.561412,130.6091 +18.552400,141.6810 +18.611098,84.9387 +18.538188,162.0858 +18.653342,49.6380 +18.661903,42.0942 +18.688366,17.5823 +18.623702,84.2337 +18.607096,102.3411 +18.575230,134.7821 +18.317692,396.1275 +18.517881,197.6997 +18.668512,47.8128 +18.492513,228.4500 +18.580400,142.0701 +18.669905,53.3392 +18.516752,209.9630 +18.648108,79.4440 +18.687035,42.9531 +18.635321,97.2212 +18.710014,26.6023 +18.688878,48.9286 +18.619893,118.4571 +18.720964,18.1530 +18.574508,169.2540 +18.713820,31.3826 +18.643784,102.7272 +18.672954,75.5587 +18.692022,57.0348 +18.709438,43.6577 +18.675167,78.4541 +18.610392,145.5278 +18.652424,104.5721 +18.700275,59.9068 +18.743763,18.3079 +18.694082,71.8414 +18.703999,63.6006 +18.684905,83.2077 +18.707937,61.8676 +18.753097,18.3093 +18.753622,22.5138 +18.729989,47.0710 +18.633852,144.0727 +18.760183,18.5363 +18.765925,15.8839 +18.553800,232.8561 +18.546563,240.6124 +18.663677,124.2444 +18.651481,138.9149 +18.705949,86.6621 +18.745204,47.9101 +18.776137,17.5060 +18.727554,67.3506 +18.594203,204.7487 +18.736617,65.6202 +18.726716,76.0649 +18.684305,123.6575 +18.722472,87.1816 +18.737807,72.4549 +18.677359,133.4709 +18.739118,72.4680 +18.584605,229.5130 +18.702982,113.6466 +18.802238,16.0130 +18.525017,297.0746 +18.792613,30.7303 +18.787922,35.9940 +18.746512,77.9569 +18.793115,33.8135 +18.807964,21.6657 +18.749058,84.0025 +18.732544,101.0726 +18.810831,25.7383 +18.822092,15.9908 +18.823917,17.6255 +18.738351,104.4591 +18.786658,59.8431 +18.778720,68.3904 +18.781810,68.2144 +18.675778,177.8198 +18.838084,16.8153 +18.790397,65.2122 +18.841545,15.4643 +18.809654,51.5203 +18.842811,19.2173 +18.767600,97.9993 +18.833062,33.8334 +18.850025,18.7778 +18.762072,107.4715 +18.793644,78.5306 +18.777926,97.4398 +18.857010,19.6926 +18.836570,43.6973 +18.777061,105.5258 +18.787177,95.9596 +18.833617,52.3394 +18.679350,207.6245 +18.872176,17.6330 +18.477924,415.9686 +18.847112,47.9635 +18.854900,41.7244 +18.846502,51.5299 +18.814119,86.1976 +18.715581,186.0943 +18.674195,230.0656 +18.886976,18.3428 +18.802782,104.9782 +18.823344,87.3931 +18.811587,100.4299 +18.868804,45.4039 +18.883138,33.8691 +18.794905,123.6277 +18.880269,42.9285 +18.876703,48.2428 +18.755921,169.7521 +18.716326,210.1068 +18.816629,112.8466 +18.853599,77.0659 +18.455977,475.6723 +18.869544,66.3685 +18.889810,49.1993 +18.855610,83.9146 +18.875367,68.8740 +18.748513,196.6066 +18.929477,17.5183 +18.829631,118.7708 +18.896626,52.8683 +18.826930,126.4104 +18.798953,155.1100 +18.898033,57.3165 +18.939010,19.1199 +18.944242,17.7536 +18.926433,38.8492 +18.882588,83.0408 +18.885958,80.2700 +18.865600,100.9377 +18.866896,100.5856 +18.893893,75.6706 +18.918534,54.9076 +18.961996,12.0037 +18.949495,29.2564 +18.557355,421.9248 +18.946996,33.4884 +18.602281,380.2388 +18.939526,46.5700 +18.914209,74.5771 +18.862031,129.8921 +18.910738,82.5767 +18.769805,226.5307 +18.930665,66.3355 +18.978753,18.7564 +18.979281,20.9998 +18.632969,368.3436 +18.905320,98.8982 +18.955351,49.5929 +18.953341,52.7531 +18.965283,42.3006 +18.771407,237.5008 +18.986097,26.3658 +18.861176,154.3029 +19.000282,15.6970 +18.924947,93.8860 +18.958133,61.7740 +18.768123,252.4199 +18.818252,203.5562 +18.967483,58.3648 +18.982521,45.3683 +18.904262,126.6374 +18.965629,65.9986 +19.015480,16.6068 +19.015980,19.1885 +18.925674,110.0047 +19.018834,20.1098 +18.824470,216.8721 +18.810263,233.7264 +19.008910,37.7138 +18.991924,55.2535 +18.723246,324.6785 +18.988788,59.9334 +18.966539,84.4642 +19.004945,47.9112 +19.035680,17.8153 +18.696038,362.8865 +19.019908,41.0766 +18.996337,66.1398 +18.993316,73.4098 +19.031629,36.3226 +19.032088,37.4810 +19.027890,42.5718 +19.030900,43.1616 +19.021809,54.9093 +18.912018,166.6217 +18.907762,172.3365 +19.007585,76.3990 +19.025849,59.9177 +18.980486,107.3885 +18.895077,194.3744 +19.047178,42.7886 +18.948403,146.0659 +19.035170,59.9976 +19.012464,87.6885 +19.006095,95.5042 +19.083985,18.8922 +19.052857,50.8768 +19.038945,68.3616 +19.046625,61.8787 +18.901677,208.6515 +19.074063,37.7900 +18.997510,115.9938 +19.047925,66.1249 +19.053496,63.6449 +18.954064,164.1737 +19.069570,50.9987 +19.100154,23.2947 +19.087875,38.1475 +19.067952,59.2283 +19.062479,66.0273 +19.117142,14.3382 +19.118238,16.0617 +19.001313,136.7094 +18.900317,238.2365 +19.102878,36.6687 +19.123449,17.5011 +19.108505,35.7810 +19.111854,36.1544 +19.078641,69.9036 +19.048722,101.2405 +19.095169,59.0065 +19.076720,80.6950 +19.094470,67.1917 +18.756997,408.3127 +19.113505,52.3001 +19.051004,115.4508 +18.479826,687.1582 +19.066727,103.4759 +19.020544,150.3746 +19.101601,70.3150 +19.154176,20.0739 +19.140952,36.2873 +19.126024,52.9045 +19.089968,90.4667 +19.165311,16.6435 +19.165806,18.3985 +19.149964,36.2067 +18.917008,270.1051 +19.110329,80.6591 +19.089452,103.1203 +19.085767,110.1868 +19.170204,27.4995 +19.060986,138.7795 +19.041343,159.2615 +19.144287,59.1981 +18.973443,232.3110 +19.107308,102.4340 +19.171917,39.7295 +18.966228,249.7680 +19.070464,146.1429 +19.184206,33.7300 +19.120570,98.1757 +19.004219,215.9987 +19.178930,43.5279 +19.180436,44.8328 +19.181955,45.4687 +19.211648,19.3162 +19.215997,17.1480 +19.166456,69.8447 +19.148546,88.6124 +19.134301,103.5189 +19.138555,100.3127 +19.195955,44.0792 +19.174252,68.2887 +19.199766,43.3152 +19.192573,51.7912 +19.230965,18.4020 +19.233146,18.6780 +19.138024,114.3070 +19.148010,110.5280 +19.217937,41.4364 +19.240035,20.3338 +19.209743,53.0303 +19.227425,36.7948 +19.203486,62.3238 +19.103734,162.6558 +18.923198,344.1273 +19.252331,18.3345 +19.186171,87.2935 +19.258539,15.4344 +19.190989,87.7435 +18.997002,284.1449 +19.187114,94.9948 +19.242541,41.8198 +19.131482,154.7305 +19.220219,66.9646 +19.273466,15.6347 +19.205755,88.2861 +19.264221,30.6305 +19.114051,182.3786 +19.243082,57.0040 +19.284362,16.2362 +19.236302,65.2068 +19.127182,178.2791 +18.974001,332.3747 +19.249368,57.6172 +19.058925,251.3842 +19.294043,18.2979 +19.244365,69.6224 +19.139548,176.6913 +19.216608,102.0900 +18.945121,375.6517 +18.931650,390.5070 +19.166986,157.1614 +19.157416,167.6383 +19.128507,199.2912 +19.312342,16.0011 +19.170920,158.6091 +19.278734,55.3142 +19.262774,72.0188 +19.218747,119.0418 +19.259376,79.1022 +19.265811,76.6772 +19.316240,27.1696 +19.301509,42.9740 +19.043991,304.8811 +19.237820,116.1533 +18.935914,419.2075 +19.225270,131.3409 +19.177240,182.8544 +19.328344,33.0619 +19.342489,19.4583 +19.296431,66.2989 +19.286213,78.5436 +19.282110,85.2961 +19.348873,19.3710 +19.300599,73.0980 +19.360096,15.0517 +19.306377,69.5839 +19.197705,183.7501 +19.260371,121.8840 +19.300087,83.4247 +19.273975,111.8570 +19.338479,49.5010 +19.361949,29.4319 +19.238868,155.4393 +19.222459,172.8741 +19.334794,61.9443 +19.343411,56.2200 +19.310311,92.6917 +19.361407,42.3144 +19.270667,133.6086 +19.320774,88.4579 +19.355123,56.6009 +19.266391,146.1404 +19.353976,59.4524 +19.327799,87.9808 +19.294852,123.1763 +19.362731,55.8071 +19.080099,341.3728 +19.364758,58.9921 +19.385833,41.1831 +19.337790,89.7194 +19.411725,17.8249 +19.251825,181.3064 +19.375149,59.7745 +19.324149,111.6886 +19.418539,17.9081 +19.200606,237.6289 +19.267327,174.2515 +19.289102,153.3659 +19.427017,17.2217 +19.413429,32.4227 +19.381456,69.1223 +19.403722,48.4777 +19.367407,87.7388 +19.325056,135.0448 +19.418030,42.9653 +19.287185,175.0093 +19.421473,41.3856 +19.368245,97.7521 +19.450580,15.8848 +19.281148,187.3217 +19.382256,87.4133 +19.395334,76.9004 +19.427511,48.0827 +19.403004,74.9638 +19.396739,83.6947 +19.465998,15.5494 +19.356613,126.8223 +19.466466,17.8300 +19.313989,170.8424 +19.344484,142.0876 +19.436448,51.6747 +19.237159,252.7716 +19.444240,49.2565 +19.433133,63.3144 +19.394309,102.6272 +19.435838,63.7476 +19.460996,41.5986 +18.969565,533.5944 +19.445853,57.9021 +19.477969,26.9923 +19.468471,38.3748 +19.391381,120.0616 +19.329530,182.6842 +19.496449,18.5698 +19.484833,32.3013 +19.306986,210.8849 +19.481549,41.2945 +19.460102,63.9869 +19.383513,141.3487 +19.502596,25.7637 +19.387981,141.7219 +19.517135,15.0606 +19.305462,227.2862 +19.484297,51.6318 +19.429551,109.6566 +19.441579,99.9511 +19.404277,137.8279 +19.504962,38.7998 +19.528361,17.9227 +19.503756,48.0892 +19.462860,89.8996 +19.488124,65.7787 +19.535930,19.6819 +19.455147,103.4181 +19.318699,240.8876 +19.539209,20.9613 +19.475594,88.9831 +19.438235,127.1544 +19.409233,160.3709 +19.486573,84.2541 +19.412533,159.0846 +19.469670,105.4679 +19.462195,115.0605 +19.322158,256.0845 +19.493498,90.2085 +19.546285,37.9813 +19.569605,15.2331 +19.532197,54.0762 +19.442469,149.4424 +19.542106,51.8753 +19.524863,69.8524 +19.552761,42.7328 +19.161663,434.7277 +19.415781,185.0777 +19.584839,16.5574 +19.586274,18.4005 +19.503160,104.6482 +19.515020,95.7109 +19.375962,238.7521 +19.543763,72.2262 +19.601398,15.3709 +19.559588,58.0761 +19.506847,111.5785 +19.489932,131.5501 +19.583707,39.1269 +19.607810,16.9495 +19.614715,15.2061 +19.551847,79.5849 +19.472236,160.0024 +19.480435,152.7216 +19.564579,71.6557 +19.511444,125.8123 +19.334050,304.8079 +19.560171,81.1018 +19.604675,37.1418 +19.600860,41.5025 +19.555613,92.7328 +19.483437,165.6044 +19.629922,21.5508 +19.632240,19.8780 +19.633158,22.6895 +19.636236,21.4386 +19.565391,94.3254 +19.641274,20.7162 +19.512215,152.6406 +19.529704,135.7034 +19.595495,70.7474 +19.651474,15.3240 +19.652119,16.2811 +19.655848,16.0361 +19.591913,82.3337 +19.578244,97.3715 +19.615990,61.8181 +19.399632,279.9652 +19.664857,16.9235 +19.624760,59.6655 +19.618426,66.8808 +19.671885,16.6454 +19.666243,25.7948 +19.677810,14.7677 +19.452202,241.4021 +19.577257,120.3967 +19.373698,324.7742 +19.499587,199.4999 +19.642363,57.3191 +19.571619,130.9851 +19.688532,17.9139 +19.679598,32.5318 +19.570828,142.5230 +19.617665,96.7291 +19.532749,184.7733 +19.702605,15.7221 +19.665409,54.0244 +19.668401,53.7898 +19.558566,166.6509 +19.524090,203.2754 +19.713352,16.5036 +19.496937,235.9278 +19.423751,309.8430 +19.698474,39.4579 +19.675616,62.8898 +19.699088,40.0053 +19.541531,200.9708 +19.553903,189.6464 +19.727366,18.7926 +19.729857,18.6254 +19.732866,17.9333 +19.638859,116.1233 +19.621483,134.0286 +19.725218,34.6613 +19.719434,40.9699 +19.594716,166.6700 +19.575139,190.2492 +19.593982,171.9780 +19.699684,67.6288 +19.649043,119.8056 +19.754983,16.1228 +19.759881,15.2292 +19.517873,260.6548 +19.657675,122.7389 +19.522844,258.6878 +19.610732,172.7155 +19.718328,67.7566 +19.722191,64.4807 +19.648347,140.6058 +19.622835,166.6905 +19.637257,157.0783 +19.781533,15.0760 +19.767314,32.4776 +19.641819,159.0330 +19.684427,119.6440 +19.714395,91.8323 +19.666799,140.2068 +19.685308,123.0072 +19.596392,216.9668 +19.693605,120.4734 +19.765961,50.7382 +19.681781,137.5498 +19.786086,34.0477 +19.706447,116.2637 +19.783448,40.9026 +19.789527,37.9775 +19.616770,211.9807 +19.786673,44.9020 +19.584267,248.7107 +19.800853,34.8412 +19.796610,39.6049 +19.820135,16.9969 +19.799792,38.6478 +19.737932,105.5258 +19.788954,55.1687 +19.748483,99.4431 +19.827506,21.1156 +19.771107,80.9121 +19.631433,222.9280 +19.755513,99.3537 +19.750800,104.6102 +19.697654,158.9830 +19.742504,118.2838 +19.843460,17.7892 +19.794337,68.2304 +19.844124,19.9713 +19.659718,206.5490 +19.847927,19.9718 +19.739094,132.8033 +19.854362,18.0078 +19.733595,142.2958 +19.778528,98.2850 +19.860788,17.2143 +19.861251,17.2554 +19.822712,59.4382 +19.866267,17.2559 +19.837133,48.2424 +19.674247,212.0121 +19.661991,225.4206 +19.871898,16.1111 +19.872371,19.6285 +19.824352,70.1711 +19.856638,38.5177 +19.765389,130.5507 +19.883524,16.1668 +19.819332,83.5258 +19.835695,69.2675 +19.760405,145.3027 +19.816700,89.6062 +19.894525,17.0614 +19.814079,99.6677 +19.899692,16.1711 +19.836216,81.9825 +19.738507,181.5208 +19.867900,52.6682 +19.902859,18.4717 +19.832979,93.8093 +19.717523,210.9791 +19.911587,17.5245 +19.864096,67.4142 +19.743551,189.3229 +19.768850,165.6571 +19.813360,123.7928 +19.913748,27.2857 +19.692039,251.6843 +19.931511,14.8007 +19.746160,203.3560 +19.828752,123.1894 +19.831576,121.8917 +19.932875,22.2070 +19.875892,80.2997 +19.918200,38.9836 +19.943724,17.1244 +19.946313,16.8096 +19.949517,17.2603 +19.434924,534.2507 +19.895157,79.2756 +19.780415,194.6688 +19.905709,70.1974 +19.926789,50.0406 +19.929113,48.2547 +19.882151,97.9635 +19.904963,78.1605 +19.808316,175.8614 +19.892001,94.6041 +19.957185,32.3966 +19.920029,71.1783 +19.920569,72.9844 +19.878507,116.1408 +19.977368,18.5461 +19.852020,146.9925 +19.983125,16.6965 +19.775111,226.3521 +19.804072,201.4704 +19.969176,38.2133 +19.876814,131.8417 +19.937154,72.4086 +19.991208,19.3004 +19.994649,19.9002 +19.712131,303.9086 +19.878004,139.9894 +19.984179,34.6327 +19.806228,217.2596 +19.934508,89.5438 +19.862568,164.5442 +19.999014,28.8600 +19.993555,35.7163 +19.999822,32.0944 +19.955083,80.1020 +19.854868,181.1222 +19.995916,42.4589 +19.906308,135.6476 +19.963124,80.7778 +19.887413,160.1927 +19.692579,356.0630 +19.848622,200.5435 +20.001464,48.6517 +20.031918,18.8417 +19.895941,159.4505 +19.928504,127.8755 +19.974434,83.0806 +20.041956,16.5871 +19.975085,86.6933 +19.953469,111.8376 +19.941035,124.8293 +20.049166,17.8832 +19.975907,95.3855 +19.986606,86.4057 +19.976831,98.5923 +19.951942,124.1116 +20.018812,57.8562 +20.061780,17.3912 +19.960849,119.0431 +20.065865,16.3877 +19.915864,169.0501 +19.989583,99.7466 +20.058545,32.3785 +20.050117,43.1155 +19.966779,127.4133 +20.079894,16.5251 +19.761387,337.0441 +19.838442,260.5794 +20.014550,87.9783 +20.071294,33.3821 +20.076670,29.2598 +20.089331,17.7617 +20.057516,54.1907 +19.885376,227.3118 +19.888010,225.5003 +20.008657,105.3504 +20.096420,21.5084 +19.956193,163.6339 +20.023489,97.3990 +20.055393,68.6713 +20.094193,30.6064 +20.067051,58.7682 +19.807007,319.6530 +19.855411,273.8420 +20.027113,106.3582 +20.027875,111.1405 +20.010510,129.0079 +20.035992,104.0584 +19.980115,163.1063 +20.009564,134.9371 +20.029272,118.0738 +20.113512,35.6413 +20.007390,142.5067 +20.098433,52.1625 +20.073013,80.5720 +20.139016,15.0637 +20.139518,19.2079 +19.921332,240.0631 +20.038376,125.9294 +20.016041,150.7756 +20.105931,61.4241 +20.133473,36.3634 +20.035186,135.3979 +20.124800,46.5960 +20.102529,72.2844 +20.153586,22.1919 +20.161396,18.5605 +20.144502,35.9602 +20.107093,76.5320 +20.129254,55.5070 +20.111707,73.7597 +20.075424,112.8064 +20.082254,107.7201 +20.166817,24.9627 +20.120889,74.6026 +20.140052,56.5552 +20.154081,44.8180 +20.180463,18.9759 +20.149154,54.8683 +20.048643,158.2748 +20.050761,156.6925 +20.079172,129.0547 +20.143223,68.6921 +20.076055,137.9521 +20.124065,90.8625 +20.104677,113.4002 +20.099022,122.3993 +20.204023,17.9072 +20.084915,137.9641 +19.886260,337.1496 +20.150596,76.0139 +20.184762,44.1359 +20.189975,39.5989 +20.211916,20.1300 +20.214929,20.3534 +20.090924,145.9405 +20.056381,181.9864 +20.112689,128.4071 +20.222881,19.9395 +20.167356,77.0408 +20.214008,31.6767 +20.208228,40.1819 +20.169837,79.1824 +20.093234,158.1152 +20.149898,105.1318 +20.191781,67.3216 +20.114009,147.6731 +20.218078,44.4146 +20.223411,40.3503 +20.171397,97.5823 +20.185468,84.1089 +20.164307,105.8354 +20.174815,96.3232 +20.126661,147.2875 +20.259104,17.3359 +20.261683,15.8247 +20.158727,123.8520 +20.047607,236.2159 +20.242821,45.7981 +20.117929,171.7146 +20.232047,58.4695 +20.221422,70.0586 +20.276441,16.4403 +20.195493,99.4553 +20.273950,22.7155 +20.017994,281.6935 +20.207455,95.9712 +20.183626,120.5166 +20.229576,75.1299 +20.271139,36.7233 +20.291482,18.3343 +20.292882,18.3360 +20.277509,37.4974 +20.065308,251.1112 +20.238368,81.5658 +20.249021,71.5041 +20.304144,17.1961 +20.262494,63.4546 +20.289645,38.1180 +20.198900,129.6797 +20.303427,31.4555 +20.170585,164.8076 +20.299689,37.0709 +20.244398,93.9903 +20.245686,94.1005 +20.290518,52.4012 +20.147346,196.3509 +20.226611,118.1793 +20.315007,33.3701 +20.270143,79.6226 +20.334884,15.3932 +20.283824,67.8076 +20.335394,18.8568 +20.235283,123.2545 +20.268980,90.7798 +20.005543,354.7393 +20.311219,52.9880 +20.125820,239.1517 +20.263763,102.5320 +20.304707,64.3660 +20.338389,33.4778 +20.196608,175.9401 +20.307863,67.2557 +20.328581,49.0534 +20.175779,202.9232 +20.327765,53.6602 +20.321341,61.3702 +20.336761,47.6882 +20.358538,28.5087 +20.364208,24.3219 +20.375120,15.8231 +20.179957,212.3807 +20.342920,52.5165 +20.188232,207.7492 +20.288620,108.8777 +20.282580,118.9106 +20.354252,47.7683 +20.366296,37.4117 +20.387048,17.5290 +20.309817,97.9138 +20.395438,15.0177 +20.395982,15.9235 +20.369074,45.2103 +20.382713,32.6467 +20.372549,45.3110 +20.294949,123.6533 +20.388531,32.5708 +20.325950,96.8059 +20.407732,17.2809 +20.410456,19.0078 +20.348378,81.5935 +20.411906,19.6409 +20.415360,19.3841 +20.392339,47.3437 +20.296666,144.0919 +20.343698,98.1412 +20.390945,52.3897 +20.221932,224.0330 +20.429465,17.7652 +20.414285,34.3146 +20.320526,130.4471 +20.429972,24.8621 +20.255031,200.3414 +20.377635,80.3858 +20.359761,99.6785 +20.404578,57.1240 +20.445966,17.4006 +20.364973,100.0985 +20.378703,90.7971 +20.403708,66.3590 +20.422757,52.2981 +20.440759,35.2411 +20.461703,15.7859 +20.236866,241.9096 +20.119828,362.8326 +20.447231,36.4893 +20.443335,42.2879 +20.350278,136.5716 +20.251350,238.2650 +20.475057,15.0978 +20.349767,145.4012 +20.351632,144.0858 +20.458022,39.4146 +20.206919,292.2783 +20.483722,18.3757 +20.248410,254.7085 +20.489616,15.8832 +20.199440,307.5007 +20.490156,17.3665 +20.459441,50.5445 +20.476002,38.6736 +20.469501,45.7812 +20.485624,32.9892 +20.478777,41.3839 +20.505500,15.3921 +20.465072,57.3744 +20.421103,104.7073 +20.431548,95.0019 +20.509986,18.2614 +20.514676,16.3259 +20.477490,56.4970 +20.454836,82.4025 +20.486850,51.3804 +20.401492,137.9428 +20.463367,80.1630 +20.499198,46.0309 +20.531003,15.5049 +20.397499,154.0202 +20.502099,50.7881 +20.434745,118.6404 +20.537239,16.7131 +20.482661,76.1547 +20.470068,90.9921 +20.316420,247.1913 +20.319935,244.2267 +20.241097,324.8280 +20.520162,46.7649 +20.344791,225.4574 +20.553387,18.0609 +20.450974,123.1148 +20.561061,16.0740 +20.043903,534.5798 +20.552888,29.8276 +20.525811,57.4819 +20.546509,37.9394 +20.418603,166.4740 +20.228900,358.5320 +20.381426,210.7563 +20.522448,70.3419 +20.448600,146.9252 +20.564163,32.6148 +20.582717,16.7948 +20.551520,50.2015 +20.503120,103.1301 +20.583295,23.5663 +20.518614,91.3424 +20.360283,252.4037 +20.596778,17.2003 +20.565926,48.8303 +20.402021,217.1476 +20.558817,61.9721 +20.587433,35.5663 +20.574090,51.5371 +20.528249,100.6346 +20.609958,20.1265 +20.506942,123.8509 +20.538232,95.2340 +20.595527,41.3055 +20.024053,613.7050 +20.497438,141.0498 +20.563612,76.9070 +20.606251,35.1613 +20.566928,77.9981 +20.628884,16.5453 +20.571449,76.8478 +20.633467,18.9380 +20.495169,159.1057 +20.620791,34.3262 +20.592791,62.8834 +20.495719,160.9509 +20.601723,57.0660 +20.455373,205.8827 +20.644927,17.2119 +20.645431,18.8240 +20.612688,56.2700 +20.417861,251.5973 +20.526551,143.6981 +20.515283,155.7287 +20.577137,95.7310 +20.520894,153.6790 +20.637759,38.4067 +20.614758,65.0816 +20.606862,74.1279 +20.640520,43.8097 +20.652406,32.4384 +20.441840,243.5327 +20.669459,18.1886 +20.655675,38.0664 +20.613980,80.3351 +20.339788,355.0443 +20.543531,152.3926 +20.671013,29.2312 +20.684331,16.4160 +20.570250,131.9694 +20.619171,83.7260 +20.684846,20.0397 +20.533988,174.7088 +20.584449,124.9745 +20.638489,73.0120 +20.662140,53.2210 +20.658790,57.2605 +20.599512,118.5800 +20.700749,19.9942 +20.269578,452.5631 +20.507523,214.8985 +20.687648,36.3968 +20.693743,30.5315 +20.708698,16.8459 +20.685374,43.7972 +20.553953,175.9281 +20.679840,50.3795 +20.623001,107.7584 +20.578483,153.4605 +20.720744,11.4653 +20.664256,69.0400 +20.625629,107.9799 +20.724046,10.5582 +20.702897,32.7934 +20.661257,76.8807 +20.694833,45.9385 +20.716052,26.5143 +20.655118,91.9199 +20.731945,15.6281 +20.545230,202.8583 +20.585078,163.5517 +20.674574,74.6388 +20.694316,56.7704 +20.715363,37.2073 +20.704886,49.3381 +20.738138,19.6504 +20.425015,335.8684 +20.539436,222.6238 +20.700245,62.8785 +20.730760,39.4856 +20.735691,35.1905 +20.636833,135.3353 +20.732210,44.6403 +20.734605,46.0357 +20.749214,32.0494 +20.733609,50.6857 +20.654276,130.6868 +20.371868,413.7159 +20.754225,34.5359 +20.718094,73.3049 +20.752571,41.2777 +20.733296,63.0498 +20.780642,16.3409 +20.702220,97.6993 +20.592183,208.2988 +20.784296,16.7463 +20.762061,44.3980 +20.680991,127.0021 +20.770247,39.0648 +20.740773,69.2557 +20.676166,137.6841 +20.630086,184.9834 +20.751088,65.8302 +20.796984,21.3311 +20.695925,124.3061 +20.748631,75.3812 +20.770883,54.7364 +20.742568,86.6549 +20.722142,110.4612 +20.788762,45.3422 +20.670251,166.5237 +20.656671,183.3170 +20.641413,199.7833 +20.648298,193.9074 +20.824013,23.8574 +20.729882,119.8628 +20.796347,54.9751 +20.791400,61.9283 +20.668959,186.0127 +20.725544,130.5988 +20.793850,65.3955 +20.724275,136.2019 +20.818316,43.5266 +20.781264,82.0281 +20.384450,481.9277 +20.815070,53.9208 +20.839989,33.1531 +20.801044,74.0108 +20.784964,93.2045 +20.806460,72.6685 +20.863294,17.0569 +20.747574,135.8742 +20.807994,81.2020 +20.760885,129.0320 +20.873143,18.1969 +20.868992,27.7395 +20.813852,83.6548 +20.879130,19.1655 +20.856144,42.7647 +20.810029,89.4900 +20.842206,57.9492 +20.866379,39.4133 +20.439684,467.3920 +20.776851,136.2775 +20.853329,62.1474 +20.832604,84.2598 +20.825621,92.3004 +20.851323,67.6037 +20.897508,22.9798 +20.860478,61.3229 +20.730220,194.6460 +20.785585,140.7769 +20.748089,180.9905 +20.898296,31.9975 +20.854973,77.9259 +20.916865,19.0921 +20.917922,19.4775 +20.880352,57.6472 +20.875056,64.6636 +20.905794,36.8589 +20.924868,20.0123 +20.899520,50.8600 +20.889918,61.4463 +20.920489,33.6613 +20.820233,134.4619 +20.935959,19.4918 +20.929081,31.4043 +20.926363,35.6593 +20.841198,123.9530 +20.932900,33.5004 +20.763125,205.8836 +20.954151,16.0598 +20.930295,40.9315 +20.954695,17.4854 +20.722422,253.3770 +20.836775,140.8754 +20.883450,97.3207 +20.942654,39.1387 +20.944881,37.8445 +20.907077,78.4884 +20.859246,127.7860 +20.970212,18.3083 +20.747040,243.6751 +20.975800,18.0552 +20.889198,107.1052 +20.980771,16.7749 +20.966401,34.2996 +20.987033,15.6919 +20.985566,19.2926 +20.988521,18.1270 +20.816919,192.7515 +20.757790,254.7625 +20.993857,19.5240 +20.809313,206.9699 +20.878170,139.6501 +21.004860,16.1481 +20.800483,221.2562 +21.006649,16.6582 +20.711502,314.7311 +20.891341,138.3541 +20.981794,51.0980 +20.937401,97.5878 +21.021009,17.1167 +20.900157,140.0497 +21.009672,31.1468 +21.026234,17.3001 +20.972182,72.3455 +21.000702,44.3802 +21.012553,38.4967 +21.032893,19.9807 +21.038127,19.6187 +20.847872,210.7082 +20.939720,121.5045 +20.915477,146.7149 +20.969010,94.0976 +20.729172,336.4600 +20.938000,128.9425 +20.977652,91.4575 +20.962024,107.9338 +21.051051,19.6369 +21.045083,32.1770 +21.043535,34.7428 +20.951365,127.4561 +21.034990,44.3695 +21.061226,18.6729 +21.021740,62.0696 +20.799921,285.2702 +20.921802,163.9017 +20.849746,236.5012 +21.017821,70.9868 +20.971227,118.3867 +21.052874,40.6377 +20.913130,182.0066 +21.016284,81.8869 +21.078822,22.4292 +21.044528,62.0746 +20.861844,245.2986 +21.023309,86.1297 +21.013382,98.5563 +21.066943,46.5480 +21.098172,18.1896 +20.829224,290.1581 +21.040207,82.0469 +20.896733,231.0249 +21.085704,42.6319 +21.086248,42.6461 +21.083811,45.8969 +20.997547,135.5093 +20.965152,169.3479 +20.990716,145.0841 +21.085192,53.9020 +21.122255,17.5275 +21.029697,113.1124 +20.630794,512.5260 +20.955451,188.3917 +21.058581,87.9249 +21.002727,146.3223 +20.996304,155.9328 +20.950382,202.5090 +21.079361,76.3610 +21.116362,42.3928 +21.111939,48.7244 +21.142810,18.5721 +21.149050,17.2114 +21.119383,47.4628 +21.109439,59.7553 +20.672868,499.3119 +20.918928,254.5995 +21.155723,18.4361 +21.128337,50.3273 +21.089615,89.6701 +21.062193,118.2804 +21.139095,43.0156 +21.166847,20.9925 +21.172181,16.7502 +21.040820,150.4392 +21.070689,123.0071 +20.982726,213.2564 +21.106604,90.1734 +20.709425,489.7342 +20.772170,427.8109 +21.182112,20.2433 +21.127759,77.1802 +21.169196,38.2975 +21.107143,106.2026 +21.146507,68.2771 +21.166262,49.5847 +21.180475,38.3242 +21.077261,142.1566 +21.202356,17.7062 +21.152238,74.4089 +21.135801,92.1263 +21.088809,139.9644 +21.178666,54.1827 +21.134501,101.1161 +21.173528,62.6966 +21.063108,174.2575 +21.143321,94.6293 +21.113492,129.0039 +21.187841,56.2067 +21.101252,143.3659 +21.069958,178.8852 +21.093513,157.5999 +21.232850,19.0431 +21.079900,173.0202 +21.129709,123.9354 +21.195984,61.5398 +21.199161,61.6198 +21.215848,46.3712 +21.244619,18.9635 +20.834106,432.9005 +21.248845,18.6679 +21.237367,34.8795 +21.218800,55.0783 +21.257525,17.5588 +21.199983,75.8565 +21.193698,83.2017 +21.161383,117.1313 +21.174160,108.0491 +21.267007,15.9115 +21.242497,45.2134 +21.204940,85.3425 +21.236225,58.4023 +21.214785,82.7245 +21.263584,35.8083 +21.158756,143.7397 +21.228774,75.0020 +21.196779,111.1579 +21.237951,70.9888 +21.069110,241.8636 +21.065633,246.7048 +21.282210,33.6656 +21.152892,165.4135 +21.244048,74.8193 +21.160665,158.7566 +21.251894,73.4054 +21.273879,52.0077 +21.139784,187.5536 +21.179287,151.4928 +21.282920,50.3984 +21.226648,107.7778 +21.251114,84.1667 +21.252921,83.1529 +21.308941,31.2497 +21.325888,17.1039 +21.057747,287.3119 +21.299393,47.5684 +21.330780,19.1514 +21.276901,75.0295 +21.333319,19.3100 +21.275085,81.3065 +21.294629,62.6558 +20.898910,459.6760 +21.220063,141.3468 +21.342993,19.0318 +21.345060,18.2446 +21.315877,50.1638 +21.351931,17.8791 +21.356392,17.3280 +21.213347,164.0086 +21.267514,110.7991 +21.318306,60.5933 +21.362026,17.4637 +21.095138,286.6792 +21.357286,27.9344 +21.253645,135.8732 +21.278515,114.0643 +21.334427,58.8418 +21.377357,17.1468 +21.378314,19.2604 +21.378901,19.2034 +21.379490,20.3282 +21.262220,141.2163 +21.188933,215.1121 +21.235619,169.2952 +21.275840,132.4848 +21.078279,332.0819 +21.363306,47.6340 +21.128896,286.7892 +21.397575,18.6285 +21.398105,18.6029 +21.312339,105.7926 +21.399820,21.3028 +21.219418,203.9666 +21.358587,68.5836 +21.408326,20.3525 +21.366041,64.8592 +21.415686,17.0407 +21.416205,17.0767 +21.385222,49.4141 +21.416709,19.1358 +21.389520,47.7706 +21.297510,142.0239 +21.369811,71.1524 +21.423386,19.0163 +21.191260,254.6043 +21.428679,17.6851 +21.403438,47.6891 +21.434637,17.0513 +21.327338,124.9483 +21.349933,104.4485 +21.404915,50.5912 +21.361411,98.6268 +21.303806,156.8678 +21.335282,126.2032 +21.394505,72.1758 +21.421124,48.8751 +21.451128,19.6666 +21.451689,21.2618 +21.272248,203.9885 +21.392581,84.6733 +21.410362,69.9245 +21.440965,40.2030 +21.318869,165.6131 +21.418133,67.4779 +21.373722,114.0787 +21.470000,19.9254 +21.452288,40.8908 +21.433283,62.3876 +21.437292,58.9562 +21.445865,51.8006 +21.319423,180.2813 +20.960487,542.9302 +21.143844,360.1526 +21.207495,297.0472 +21.410941,96.6064 +21.446366,63.6742 +21.381818,131.1813 +21.493179,20.3931 +21.496249,18.4104 +21.470796,46.4439 +21.432728,86.2283 +21.427172,94.9932 +21.472952,51.9520 +21.507548,17.8958 +21.476238,50.4904 +21.442403,85.6225 +21.513001,17.6335 +21.325300,207.4860 +21.340192,194.0904 +21.393270,144.8747 +21.504543,34.4019 +21.528027,16.7201 +21.336075,210.1028 +21.530636,17.0860 +21.404046,144.7963 +21.461486,92.5175 +21.430902,123.6400 +21.480288,76.0755 +21.522166,34.8839 +21.307937,252.2560 +21.544748,18.4762 +21.227928,336.8417 +21.547723,18.4433 +21.534284,37.1091 +21.524905,47.0467 +21.460039,114.6957 +21.484484,96.5157 +21.517241,64.8087 +21.435846,148.3833 +21.526729,58.0437 +21.290284,295.0657 +21.538946,47.9863 +21.557050,34.2441 +21.571394,23.3955 +21.310975,285.6532 +21.548843,49.0033 +21.477255,122.2747 +21.466682,134.4641 +21.439535,162.1807 +21.556365,48.3569 +21.518957,87.1096 +21.525445,82.1467 +21.554542,53.6340 +21.514661,96.2151 +21.563225,50.4379 +21.597848,16.3866 +21.554005,65.7716 +21.503997,116.3498 +21.581000,39.9100 +21.591296,34.2043 +21.260782,365.3398 +21.607593,19.3733 +21.352630,277.9541 +21.614235,18.7165 +21.513573,121.5371 +21.606067,30.1058 +21.487801,153.2472 +21.585350,56.1844 +21.497667,144.6837 +21.560194,82.7168 +21.584774,60.9057 +21.489926,157.3604 +21.630586,18.6373 +21.538145,112.2789 +21.608177,44.0015 +21.636174,18.2059 +21.302497,355.6708 +21.641049,17.6368 +21.641536,17.6683 +21.601147,59.4013 +21.596630,69.1118 +21.510041,157.1282 +21.650425,18.9505 +21.571953,98.6846 +21.485612,189.7246 +21.601717,74.1694 +21.532787,143.9522 +21.620348,57.7208 +21.658169,21.1800 +21.626123,59.6040 +21.669378,17.7482 +21.647288,41.2791 +21.625501,69.6229 +21.586933,108.9570 +21.632953,63.5476 +21.582051,116.9387 +21.594791,106.0992 +21.645681,57.3708 +21.566167,137.9424 +21.687128,19.0240 +21.688568,21.9860 +21.660549,51.5715 +21.695125,19.2652 +21.675337,39.7918 +21.620911,94.7879 +21.613664,105.6795 +21.675887,45.1307 +21.455507,269.2990 +21.584230,141.1156 +21.685728,41.0360 +21.649224,80.6350 +21.712122,19.5302 +21.626967,107.3262 +21.546179,191.6291 +21.642352,97.4928 +21.503418,236.9787 +21.706153,35.7220 +21.460675,283.4695 +21.731653,15.9996 +21.679350,69.1074 +21.710563,38.8808 +21.704111,49.6552 +21.499705,257.2338 +21.619777,137.7913 +21.695891,63.0247 +21.667170,94.4626 +21.676741,86.0160 +21.564771,198.7444 +21.747654,18.6415 +21.729860,42.9436 +21.756940,17.3698 +21.574737,201.1315 +21.678070,102.3424 +21.715130,65.8960 +21.654381,128.0363 +21.658687,124.4085 +21.734295,49.9349 +21.714391,76.1151 +21.635112,157.0068 +21.774311,21.4761 +21.700891,95.3923 +21.495672,304.0970 +21.761633,38.6784 +21.703053,100.6943 +21.610877,195.0850 +21.744146,62.9037 +21.749445,58.3717 +21.287712,522.4054 +21.739846,71.1192 +21.757570,55.4469 +21.781027,33.7433 +21.796285,20.1568 +21.740398,80.9645 +21.784231,38.4434 +21.737809,85.3929 +21.599531,226.7582 +21.810119,18.2647 +21.696501,133.4121 +21.810966,19.9016 +21.604723,227.3622 +21.790507,45.7441 +21.670639,166.3422 +21.741876,98.4477 +21.803748,39.2127 +21.665743,178.1583 +21.775869,71.3168 +21.829914,18.5107 +21.454382,397.2279 +21.346963,505.9529 +21.772805,82.4058 +21.813018,46.3859 +21.842962,17.1427 +21.822675,39.7837 +21.843902,20.1621 +21.758917,106.2093 +21.715700,154.2707 +21.851612,18.8707 +21.748458,123.2215 +21.800313,72.6856 +21.807818,69.4149 +21.823203,54.5600 +21.859405,18.9060 +21.860106,18.7871 +21.782419,99.7972 +21.724807,159.6231 +21.642912,242.3115 +21.652180,234.6811 +21.848426,43.5948 +21.871681,22.0088 +21.877234,18.6124 +21.698990,202.2103 +21.780414,122.4612 +21.792120,113.1240 +21.814771,91.0996 +21.892022,15.2846 +21.832086,78.6323 +21.805963,108.4151 +21.807050,108.6317 +21.762758,157.7574 +21.886862,35.8528 +21.893692,30.9745 +21.821363,104.2461 +21.799770,128.6953 +21.725347,205.9051 +21.864065,67.7801 +21.659205,274.4563 +21.885225,50.7616 +21.766296,171.2503 +21.922716,19.3599 +21.855212,88.5287 +21.907308,40.0220 +21.915683,33.1113 +21.870483,79.2569 +21.905871,45.5560 +21.901202,51.6441 +21.840325,115.1260 +21.869972,86.4999 +21.877764,80.6850 +21.928466,32.6176 +21.935987,30.4027 +21.914379,54.7658 +21.882217,87.7159 +21.721019,251.8301 +21.719345,256.3919 +21.902876,74.4867 +21.937548,40.4587 +21.726765,253.8886 +21.862461,120.8373 +21.753767,233.0719 +21.828385,162.1882 +21.933662,57.4999 +21.826290,169.4184 +21.481169,515.1273 +21.847187,149.9196 +21.873000,127.0365 +21.925610,77.1600 +21.975738,28.1144 +21.990574,15.9305 +21.991163,17.0467 +21.969934,41.3200 +21.949741,66.4972 +21.931253,85.5677 +21.133058,886.5061 +21.956473,63.9157 +21.852917,168.7698 +22.006506,16.8261 +21.983299,42.6645 +22.011255,16.6991 +21.948796,83.6777 +21.997108,36.7496 +22.016240,18.4948 +21.951428,83.9309 +21.952847,86.0371 +21.795788,244.0688 +22.023333,18.5212 +21.955453,89.1825 +22.000037,45.3570 +22.020390,29.8618 +21.996298,54.5126 +22.032475,19.5660 +22.035361,21.3289 +21.836982,222.3974 +21.986840,74.5491 +21.763517,300.1642 +22.033858,31.5957 +22.050253,15.5761 +22.025965,41.1431 +21.878894,188.7095 +22.050811,17.3712 +22.003854,68.1961 +22.059381,15.1229 +21.958450,119.9067 +21.980655,99.0471 +22.063682,17.6401 +21.895848,187.9676 +22.065455,19.1916 +22.065830,21.3696 +21.961085,126.7198 +21.830868,259.5474 +21.942077,149.2616 +21.920517,174.5109 +22.052042,43.6522 +21.966391,130.3672 +22.083816,17.8614 +22.087200,17.6904 +21.836253,272.6826 +22.078358,32.3010 +22.084647,28.3743 +21.943742,171.2852 +21.905245,212.7134 +21.947331,171.7763 +21.924667,196.2427 +22.008211,115.5565 +22.081323,43.1807 +21.910719,219.3391 +22.091341,39.5453 +22.095029,37.1144 +22.067108,67.3308 +22.067604,68.1563 +22.045395,91.8190 +22.101679,37.7813 +22.095695,49.1882 +22.038885,106.5745 +22.021687,124.6274 +22.079703,70.9990 +21.865127,286.1581 +22.134440,17.3911 +21.931847,223.0722 +22.090417,66.6890 +22.056691,101.9437 +21.972850,191.3620 +21.783097,382.1300 +22.002771,167.8463 +22.124505,47.6223 +22.150703,22.1109 +21.878312,297.0169 +22.130887,45.8287 +22.034735,143.9384 +22.027955,151.7712 +22.164213,18.0527 +22.145460,40.6077 +22.170619,18.3534 +22.135762,54.6608 +22.044636,146.5151 +22.176717,18.3735 +21.884431,313.0376 +22.123768,76.6203 +22.182267,18.7240 +22.172128,32.3890 +22.190423,17.6542 +22.175330,33.7620 +22.178675,31.9674 +22.154920,57.8139 +22.130060,86.6031 +22.115028,102.6199 +22.096759,122.3453 +22.165228,55.7623 +22.204518,19.3216 +22.019565,208.5575 +22.104892,125.0883 +22.132144,103.2160 +22.151832,85.1729 +21.969146,268.4674 +21.995709,242.9701 +22.146316,95.7724 +22.195091,47.9887 +22.137215,111.1440 +22.220991,28.2617 +22.191153,65.9420 +22.120911,137.1011 +22.041855,216.9398 +22.212735,47.2787 +22.113023,149.2609 +22.172815,92.9940 +22.087806,181.3781 +22.243081,29.4860 +22.068184,205.3371 +22.119109,155.0182 +22.108936,166.6038 +22.157106,122.6587 +22.110660,169.7021 +22.208079,74.7575 +22.242089,43.3538 +22.223840,63.9935 +22.257097,32.3888 +22.216664,76.6622 +22.273522,21.0287 +22.179728,116.8617 +22.279766,18.4736 +22.039858,264.1401 +22.258796,47.3608 +22.200390,106.5853 +22.228123,80.1557 +22.074505,234.4086 +22.248360,61.2034 +22.272568,38.8957 +22.016821,298.1306 +22.287835,29.5384 +21.978007,343.4331 +22.285444,36.5936 +22.303999,20.4850 +22.260014,68.4334 +22.219106,111.3225 +22.282838,48.2535 +22.298241,35.3284 +22.237006,98.9494 +22.237614,100.6897 +22.311465,29.1512 +22.321441,19.7639 +22.258013,88.7053 +22.210643,138.1284 +22.061390,288.2007 +22.280363,74.3449 +22.072051,284.4367 +21.816442,541.0571 +22.324485,35.1854 +22.117959,242.7241 +22.249254,112.0517 +22.158637,205.9022 +22.349593,17.0428 +22.188974,182.3080 +22.346731,27.8625 +22.306976,68.6393 +22.289487,86.9911 +22.359671,19.1866 +22.200992,181.8396 +22.269185,115.3034 +22.275541,109.7184 +22.265810,121.0412 +22.217649,172.3766 +22.371283,21.6678 +22.235362,158.1439 +22.374595,21.6945 +22.348773,48.5064 +22.357501,40.5175 +22.331092,71.4039 +22.317374,85.6292 +22.308914,94.6080 +22.238680,166.1787 +22.338305,70.4988 +22.306158,103.1510 +22.139461,271.8233 +22.390026,21.8503 +22.393506,21.2782 +22.340618,75.0977 +22.209093,212.0233 +22.375616,46.3209 +22.403523,19.4374 +22.382833,43.7567 +22.356488,71.4413 +22.408805,20.9818 +22.366637,66.5072 +22.364540,74.3106 +22.341206,98.6807 +22.402497,38.5198 +22.151286,291.1744 +22.409310,37.2712 +22.144884,302.3816 +22.392951,59.7348 +22.330429,123.5528 +22.322039,132.8773 +22.398019,60.1157 +22.186069,272.7239 +22.361306,100.2191 +22.314953,151.5860 +22.396290,71.3283 +22.411878,56.6136 +22.453983,18.6299 +22.293327,182.4175 +22.441019,35.9760 +22.360684,118.9539 +22.294552,187.8942 +22.421117,62.3076 +22.378859,108.0315 +22.422962,64.7208 +22.466541,22.4794 +22.472614,19.6487 +22.447267,46.5650 +22.376479,119.8885 +22.433145,67.0454 +22.328449,172.8090 +22.426591,77.7262 +22.309565,195.3207 +22.442462,65.9776 +22.403005,106.8431 +22.274128,236.6832 +22.385261,127.4279 +22.476996,37.8257 +22.438852,78.3008 +21.977363,542.7399 +22.421938,99.5563 +22.504318,19.9326 +22.414786,114.1114 +22.429787,101.6474 +22.512690,21.2033 +22.458794,76.5849 +22.296591,241.3979 +22.461527,81.3066 +22.397281,146.1343 +22.468492,75.5704 +22.483426,61.7114 +22.427931,121.4264 +22.492264,62.6267 +22.482447,74.3960 +22.454917,103.7184 +22.486892,73.7820 +22.446582,115.1991 +22.467619,95.9138 +22.528899,36.8919 +22.545139,21.9198 +22.504886,64.5727 +22.354709,216.1361 +22.521495,51.2535 +22.514822,63.7764 +22.560675,19.8003 +22.487684,94.9465 +22.524252,59.0517 +22.565791,19.3842 +22.544064,45.0538 +22.535380,54.3209 +22.386852,204.0151 +22.572750,19.6148 +22.489021,106.5819 +22.578600,20.0931 +22.554892,44.4247 +22.580476,19.4636 +22.517154,88.6362 +22.404860,202.6707 +22.589119,20.3464 +22.501259,111.7141 +22.509849,103.6707 +22.452688,161.8351 +22.493833,121.3130 +22.595604,21.3240 +22.599317,24.4509 +22.496368,128.2151 +22.582631,45.3296 +22.549358,81.3149 +22.569460,62.9465 +22.542834,90.8765 +22.308280,326.3982 +22.558637,78.6932 +22.510812,128.2195 +22.262285,379.6438 +22.197470,447.3304 +22.563534,82.1127 +22.567060,82.9881 +22.633712,17.9693 +22.570846,82.3998 +22.590868,63.8148 +22.508440,150.2064 +22.615147,46.2711 +22.556844,106.8415 +22.644801,19.6028 +22.605792,60.2368 +22.650049,18.2342 +22.598694,73.0586 +22.634680,40.7238 +22.384490,291.9274 +22.639033,38.9981 +22.658647,20.2243 +22.533894,147.8070 +22.500192,185.1622 +22.439889,247.5284 +22.520104,168.2718 +22.458136,234.0855 +22.411285,281.4843 +22.675405,17.9368 +22.229981,464.9897 +22.585177,111.7499 +22.632408,65.7850 +22.681702,18.8182 +22.589702,114.5064 +22.685355,19.6933 +22.645648,67.0901 +22.692223,21.3455 +22.692770,24.0782 +22.624585,93.9858 +22.531437,187.9747 +22.609466,112.1471 +22.678032,44.8300 +22.651682,72.0914 +22.592366,135.8418 +22.475745,254.8887 +22.716850,18.0391 +22.718572,16.8968 +22.415716,322.3761 +22.719413,19.3235 +22.664405,77.4241 +22.630674,112.0024 +22.614524,131.3291 +22.653247,96.5755 +22.712740,37.8526 +22.688377,63.6474 +22.734890,17.7308 +22.735470,22.1290 +22.678873,79.3392 +22.607532,151.7930 +22.738093,22.6768 +22.671754,89.7091 +22.654684,112.1068 +22.728209,44.2519 +22.661419,111.6005 +22.599941,175.1513 +22.637331,138.5021 +22.757600,19.2847 +22.758213,19.2611 +22.698194,80.3258 +22.721615,61.6325 +22.741830,42.8485 +22.668284,121.0431 +22.666030,124.6999 +22.641929,150.6425 +22.479639,313.5872 +22.694973,102.3436 +22.738737,60.1691 +22.759326,40.4468 +22.700521,103.4192 +22.696927,110.7340 +22.778521,30.7903 +22.705050,105.8082 +22.792573,19.5872 +22.730635,85.4956 +22.561782,255.0734 +22.612974,207.1596 +22.333571,490.1143 +22.773021,54.0880 +22.713570,116.1702 +22.775093,56.6210 +22.752026,80.6933 +22.816132,17.3896 +22.793228,43.5047 +22.676418,164.3261 +22.583304,259.0428 +22.745854,97.6860 +22.775834,70.5058 +22.810859,36.6847 +22.789328,60.4254 +22.797318,55.9791 +22.798907,54.9437 +22.693342,164.2968 +22.840746,17.4892 +22.722863,136.0581 +22.784680,75.6290 +22.687418,175.8877 +22.846341,19.0513 +22.776886,89.9176 +22.749824,120.5058 +22.761464,112.5684 +22.627962,248.7683 +22.335957,542.5685 +22.816857,62.7132 +22.863307,18.9905 +22.807664,76.6326 +22.777475,108.9480 +22.833523,54.4623 +22.870331,20.0306 +22.623770,271.6722 +22.760772,137.0762 +22.847545,51.6024 +22.886424,17.0155 +22.820135,83.6966 +22.766792,137.4826 +22.772462,134.0032 +22.823687,83.3532 +22.752622,159.3499 +22.874034,38.4863 +22.704210,209.4133 +22.842348,74.9477 +22.613521,304.9976 +22.836734,84.3276 +22.857641,64.6683 +22.907041,18.0625 +22.911973,16.7991 +22.912521,17.7401 +22.858236,72.7861 +22.790730,144.3754 +22.853852,83.0413 +22.918519,19.2883 +22.537989,406.9012 +22.878527,66.9773 +22.879572,66.9023 +22.906466,40.8303 +22.897850,54.0808 +22.783248,169.8638 +22.799774,153.9029 +22.921062,34.2573 +22.809312,146.8311 +22.616929,344.3658 +22.849754,112.6266 +22.742678,222.7374 +22.860310,108.0957 +22.930262,38.6920 +22.931023,38.9115 +22.882299,91.1864 +22.803942,173.5487 +22.750594,227.9167 +22.723775,255.2919 +22.961296,19.1841 +22.865394,119.8228 +22.890362,98.7835 +22.946475,44.6415 +22.663687,328.1381 +22.962382,31.7113 +22.887986,110.1110 +22.977492,21.1833 +22.953678,48.2174 +22.917297,85.3838 +22.922310,82.7854 +22.985218,21.3974 +22.956144,54.5584 +22.832720,179.3595 +22.968407,45.3608 +22.829742,186.2965 +22.998098,19.2404 +22.936894,81.4098 +22.866805,155.3917 +22.955321,69.9927 +22.965417,60.6401 +22.968955,58.5809 +22.827110,202.6750 +23.010704,21.2614 +22.904275,132.9526 +22.947297,90.8212 +22.994095,45.2838 +22.969936,72.3729 +22.903832,140.6206 +22.895444,149.5797 +23.006617,42.0397 +23.002682,48.4084 +22.884297,167.9206 +22.925105,130.4258 +22.953113,103.0287 +23.037229,22.0113 +22.980481,82.1159 +22.928773,137.2199 +22.991826,74.8131 +23.027537,41.0431 +23.012081,58.6244 +23.055532,17.3530 +23.005096,69.1660 +23.056143,19.1850 +22.991117,91.3219 +22.543416,542.0217 +22.858922,228.2296 +23.045025,45.6335 +22.913624,179.1617 +22.989148,105.1954 +23.017340,79.0482 +22.973486,125.5055 +23.059241,40.8974 +22.876732,230.1069 +22.812161,295.5623 +23.001897,110.3537 +23.013768,99.9824 +22.903440,210.9709 +23.062598,53.4420 +22.831716,288.9431 +23.031966,89.8490 +23.029786,92.6198 +23.075329,52.3416 +23.048658,80.6050 +22.853298,276.5648 +23.098993,31.7487 +23.094344,37.9328 +22.935107,202.1662 +22.944892,194.1796 +22.937809,201.8593 +23.022198,121.8028 +22.978512,166.1267 +23.070706,74.9576 +23.087153,59.1653 +23.113752,34.2053 +23.116042,35.8464 +23.026058,128.7626 +23.120660,41.2266 +23.090659,73.3587 +23.106840,57.8026 +23.082440,84.8539 +23.122407,46.0965 +23.145665,24.0958 +23.085439,88.5554 +22.899148,277.1331 +22.998677,178.7354 +23.130743,50.6019 +23.137274,45.7841 +23.100139,84.0203 +23.161888,22.8854 +23.038120,147.2711 +23.167296,22.0401 +22.979068,213.7780 +23.107725,88.6367 +23.176282,20.8309 +22.951932,246.4516 +23.074263,124.6987 +23.112251,87.2604 +23.025314,175.7975 +23.183059,19.9824 +23.185392,19.8568 +23.039379,170.2479 +23.184775,26.4754 +23.192847,20.8335 +23.016040,200.5681 +23.051091,167.1293 +23.164019,56.8465 +23.132278,90.5105 +23.173996,50.5328 +23.052219,175.0496 +23.068581,159.4134 +23.189337,42.8781 +23.216609,16.9692 +23.096389,138.5545 +23.181346,58.8157 +23.164644,76.3567 +23.129264,112.5036 +23.213682,30.2473 +23.127672,119.7273 +23.198963,50.3450 +22.945505,304.4069 +23.092787,161.3594 +23.146319,110.6819 +23.042310,215.7943 +23.144640,118.3365 +23.139669,124.5944 +23.243930,22.2344 +23.224530,46.6953 +23.114412,157.7987 +23.211251,62.2590 +23.066640,208.3840 +23.262977,15.2436 +23.241769,37.0698 +23.264264,17.4679 +23.184161,101.3190 +23.177413,108.8823 +23.209628,77.3048 +23.227269,64.8726 +23.254147,39.1162 +23.198385,96.5518 +23.240162,57.9275 +23.266166,33.5686 +23.197114,108.1363 +23.196362,111.0155 +23.144002,165.0361 +23.275025,37.3438 +23.065994,247.5593 +23.205249,109.0247 +23.222790,97.5617 +23.278222,42.9318 +23.247401,76.9892 +23.286296,43.3008 +23.272212,58.0769 +23.154821,176.2693 +23.312370,19.5717 +23.203043,129.5671 +23.281733,56.1398 +23.072886,266.1735 +23.271227,74.2689 +23.018305,328.5982 +22.843541,504.1503 +23.218222,130.2670 +23.298091,51.2180 +23.258106,93.4124 +23.329599,23.8231 +23.201113,153.2735 +23.249913,108.7214 +23.233579,126.4013 +23.337875,23.5510 +23.199513,167.5642 +23.286934,82.9137 +23.309039,61.6049 +23.347693,23.5298 +23.349311,24.0478 +23.320353,56.2405 +23.147958,231.5581 +23.331943,48.2476 +23.314275,66.5391 +23.321155,60.2659 +23.257003,128.2694 +23.331092,54.7745 +23.367078,21.2406 +23.371223,19.1949 +23.330290,61.9188 +23.376595,19.6298 +23.220867,178.5236 +23.369848,31.3451 +23.339061,63.2334 +23.044454,358.8396 +23.139073,267.3246 +23.294937,116.2317 +23.129864,282.8555 +23.353423,60.7486 +23.345497,75.1413 +23.227995,193.2389 +23.385867,36.1784 +23.390419,32.8440 +23.406398,18.2719 +23.381422,47.4328 +23.411170,18.2624 +23.380815,51.5166 +23.249309,184.0923 +23.370645,68.3014 +23.169762,270.0609 +23.359982,82.4891 +23.358636,86.8595 +23.232216,214.3097 +23.388320,60.9000 +23.403295,49.3848 +23.121816,332.7011 +23.361427,95.3067 +23.439825,18.7416 +23.292143,170.7528 +23.168505,295.0268 +23.445496,19.3953 +23.348491,119.2643 +23.380192,88.3134 +23.423264,49.1779 +23.392210,83.5586 +23.412721,63.7923 +23.456735,20.3988 +23.433402,47.5822 +23.385273,96.2493 +23.462897,19.1897 +23.351520,133.8299 +23.241001,246.1402 +23.472443,19.6315 +23.278840,214.0366 +23.373359,120.4305 +23.313555,181.2677 +23.234944,263.2892 +23.480986,19.6481 +23.414172,88.0309 +23.464893,41.4841 +23.475770,31.4390 +23.401195,107.6492 +23.493791,18.6023 +23.428856,87.8795 +23.458568,59.5897 +23.454518,64.6187 +23.468506,53.6666 +23.438948,86.6479 +23.481524,47.9629 +23.396226,135.8133 +23.485351,47.4935 +23.399391,134.8606 +23.477135,60.3597 +23.516737,21.3334 +23.285480,256.6191 +23.332611,210.1509 +23.494824,50.5209 +23.452681,96.6925 +23.293265,258.0483 +23.492076,60.7584 +23.537495,18.7252 +23.446527,110.6442 +23.502204,56.0276 +23.422047,138.0382 +23.151889,412.1912 +23.545346,19.6887 +23.424671,141.5451 +23.549375,18.8453 +23.522174,46.6507 +23.542101,32.2942 +23.557172,18.3109 +23.519138,57.4420 +23.324392,255.8917 +23.525597,56.1084 +23.534253,49.8766 +23.307379,280.2222 +23.482088,108.5059 +23.379518,211.8435 +23.421235,171.2033 +23.507210,88.8230 +23.429434,167.8264 +23.580284,18.4752 +23.518159,82.4233 +23.560086,46.0097 +23.500635,108.2787 +23.420639,189.2966 +23.492877,119.6483 +23.532846,80.2947 +23.449221,165.9331 +23.346905,269.0059 +23.556222,67.5779 +23.564082,60.4951 +23.606097,21.4107 +23.608915,20.4579 +23.568826,63.4914 +23.538071,95.7985 +23.575484,60.7612 +23.463533,176.8056 +23.587603,53.3371 +23.506378,135.5558 +23.512395,135.1376 +23.565035,83.1269 +23.467757,181.8980 +23.629374,21.0490 +23.633871,21.0797 +23.596035,61.1932 +23.273511,384.4492 +23.584131,78.5830 +23.612527,50.7649 +23.600583,64.6859 +23.432333,233.8582 +23.615913,53.9188 +23.627509,42.9631 +23.623800,47.3384 +23.558233,119.9299 +23.354387,324.6255 +23.636247,43.7788 +23.551314,133.7537 +23.402296,283.3782 +23.609937,77.2934 +23.641935,49.6334 +23.552835,139.8478 +23.597261,96.5038 +23.299735,398.1462 +23.647534,52.5032 +23.508845,191.9882 +23.685069,21.1136 +23.615155,91.8431 +23.640941,71.6680 +23.566217,147.5645 +23.581707,133.3101 +23.487142,230.8395 +23.624578,94.1057 +23.657962,62.1245 +23.680027,42.4887 +23.574396,150.9502 +23.687231,40.8499 +23.692684,39.2674 +23.640340,92.4427 +23.590595,143.7972 +23.670473,65.0520 +23.657229,82.0095 +23.498235,243.2435 +23.592440,150.8617 +23.717983,28.4839 +23.576581,172.4961 +23.720087,29.6755 +23.591362,161.4183 +23.713783,39.5921 +23.662715,94.5255 +23.718684,40.9050 +23.666192,96.4172 +23.700038,63.5660 +23.746468,22.0364 +23.706184,63.4181 +23.732784,37.4677 +23.697882,75.4224 +23.678164,97.1093 +23.715018,60.9795 +23.650424,131.9377 +23.598761,184.5672 +23.768505,17.5308 +23.568221,219.5642 +23.731953,57.8272 +23.442473,347.9365 +23.753375,39.9817 +23.476514,320.0285 +23.712611,87.2227 +23.669833,130.8604 +23.786037,18.4818 +23.763605,44.6534 +23.728082,82.0764 +23.725347,85.4592 +23.679014,133.3949 +23.759591,57.7777 +23.663293,154.7103 +23.804520,17.8070 +23.743303,79.6124 +23.773306,52.1861 +23.665270,161.0816 +23.613142,213.8283 +23.648163,183.8886 +23.775998,56.9669 +23.542763,292.9424 +23.793358,43.1062 +23.762611,76.6450 +23.769604,71.0761 +23.796544,46.1164 +23.826353,18.4803 +23.654952,193.2920 +23.832053,18.5645 +23.707000,144.4642 +23.700834,153.1794 +23.839257,18.3451 +23.735526,123.1092 +23.840681,19.2298 +23.808259,56.6603 +23.783329,82.2067 +23.632319,234.8741 +23.848245,20.8685 +23.787786,83.3768 +23.842661,31.7065 +23.685675,192.7157 +23.832966,46.4600 +23.770253,110.6577 +23.854014,28.4976 +23.790410,96.4117 +23.869114,19.7992 +23.825493,68.7407 +23.734393,160.4378 +23.850619,44.9360 +23.851465,44.7154 +23.822328,76.0576 +23.859912,39.5530 +23.817369,85.9868 +23.812410,97.2229 +23.865537,46.5555 +23.810808,102.6195 +23.749078,167.5373 +23.895563,21.8767 +23.775275,145.2949 +23.741479,179.9778 +23.871164,54.4990 +23.789781,138.3979 +23.532041,396.7739 +23.864921,69.2679 +23.916617,18.1295 +23.917441,19.9293 +23.782363,155.6451 +23.722516,219.5592 +23.909634,34.3929 +23.880912,63.6507 +23.818004,127.2053 +23.799835,148.2507 +23.671140,277.5587 +23.867194,84.8348 +23.934190,18.8577 +23.934747,20.3396 +23.649656,308.0189 +23.749764,211.2590 +23.836465,128.3139 +23.810160,155.1985 +23.898387,69.4396 +23.948088,20.2857 +23.899466,69.4948 +23.953049,20.7033 +23.826971,148.0142 +23.874369,101.5966 +23.844834,134.8442 +23.878392,104.8792 +23.903357,81.7647 +23.961024,25.8656 +23.937372,50.7692 +23.948700,43.3647 +23.973753,20.1314 +23.938009,59.2791 +23.886823,111.7775 +23.894832,106.6079 +23.693766,308.8224 +23.985123,19.5944 +23.894235,112.5894 +23.974986,35.4161 +23.888915,122.5422 +23.305252,707.0908 +23.993886,20.0361 +23.997289,22.1069 +23.879427,140.9463 +23.822916,200.7328 +23.964780,61.0229 +23.983273,46.2080 +23.992066,41.8947 +23.942077,92.8125 +23.835707,200.8966 +23.529488,508.5165 +23.913428,126.3513 +23.857603,182.9684 +24.023650,20.8307 +23.957676,90.9389 +23.986890,62.6331 +23.896182,154.2736 +24.033961,19.0019 +23.968374,87.3508 +23.928180,128.8184 +24.036605,21.7257 +23.975966,85.9841 +23.912094,152.3720 +23.757241,308.8679 +24.012343,59.5893 +23.945211,127.5019 +24.019397,55.5642 +24.052965,22.7298 +23.955088,121.4236 +23.979680,98.5598 +24.057000,25.3451 +24.025804,57.5159 +23.965359,120.2430 +24.029482,62.3821 +24.049524,43.1872 +24.071935,22.1688 +24.074962,20.9478 +24.048616,51.1683 +24.050456,50.2057 +23.998602,103.2071 +23.752782,349.9000 +23.967827,139.6247 +23.928816,179.4375 +23.882513,231.5383 +23.920571,194.7092 +23.921525,194.6482 +24.075695,41.3301 +24.066111,52.0486 +24.061951,61.7440 +24.001441,122.8793 +24.040572,84.6898 +24.010404,119.4927 +24.058331,72.1750 +24.101810,30.6187 +24.102683,34.5613 +23.800695,338.8748 +24.044482,96.2982 +24.107453,37.6941 +23.858636,288.0381 +24.064467,82.7991 +24.002590,146.1196 +24.129898,19.6047 +24.039781,114.0792 +24.115281,40.3889 +24.034890,126.1373 +23.952029,210.4285 +24.118161,47.5468 +24.083321,83.4073 +24.094105,74.7180 +23.944564,225.4665 +24.132430,38.9689 +24.130507,42.3963 +24.072714,105.1314 +24.011459,167.0480 +24.092713,89.2483 +24.165709,17.6616 +24.124321,62.0782 +24.125263,61.7823 +24.013923,178.8893 +23.968962,225.9942 +24.085603,111.0340 +23.944028,253.3705 +24.140781,59.8673 +24.117027,84.3535 +24.181962,20.0166 +24.148710,54.4981 +24.161029,48.8089 +24.183371,27.2887 +24.116174,95.8912 +24.194957,20.3216 +24.078241,139.3499 +24.171399,48.5971 +23.691569,529.8028 +24.099786,123.3301 +24.091866,133.7398 +23.988142,239.7539 +24.170031,62.1735 +24.095911,137.3269 +24.215280,19.8989 +24.200650,36.5696 +24.100663,137.3196 +24.178508,63.7346 +24.139571,104.0422 +24.153861,90.6447 +24.187047,62.9755 +24.006826,246.4950 +24.055726,200.8202 +24.197400,63.8828 +24.186401,75.4762 +24.212067,50.8831 +24.038006,227.5787 +24.201979,66.9337 +24.250024,21.4188 +24.123697,148.5366 +24.108254,169.4253 +24.217592,61.1632 +24.221374,57.9941 +24.020375,262.1687 +24.076513,209.8867 +24.209839,77.4124 +24.201381,86.6283 +24.219998,68.6439 +24.244507,46.9181 +24.261283,33.7555 +24.277681,19.1639 +24.242244,56.5642 +24.235180,68.2023 +24.146675,157.3093 +24.262951,45.3358 +24.268914,41.4005 +24.177847,134.3874 +24.237984,75.0054 +24.243614,71.1323 +24.166730,148.8760 +24.303383,17.6820 +24.192813,129.6431 +23.739239,584.0329 +24.303986,22.9666 +24.256547,71.0883 +24.288643,42.3789 +24.278756,53.5226 +24.149504,184.7997 +24.225606,109.5049 +24.145148,192.8073 +24.261878,77.2541 +24.223117,121.7063 +24.321066,24.8572 +24.286401,62.5860 +24.327637,21.9120 +24.288011,65.5162 +24.332280,21.8177 +24.331023,24.3436 +24.314747,46.8729 +24.295040,67.3609 +24.339133,24.0932 +24.291426,72.8050 +24.334304,34.6785 +24.348988,20.5284 +24.308288,62.3268 +24.310316,61.5977 +24.353528,20.6171 +24.279369,98.3091 +24.296845,81.4391 +24.203210,178.4320 +24.196639,187.9074 +24.298809,87.2788 +24.323273,63.8986 +24.272234,120.6133 +24.253322,140.6840 +24.335113,60.3960 +24.172905,223.4168 +24.381643,19.0254 +24.369517,35.2478 +24.114052,292.4819 +24.363227,44.9794 +24.312236,97.0367 +24.371915,43.0391 +24.387173,28.8123 +24.210661,206.2099 +24.315607,102.0343 +24.354098,68.8578 +24.394008,30.8321 +24.386089,41.6989 +24.364232,64.5444 +24.233240,200.4714 +24.282544,151.9223 +24.004718,430.5465 +24.395510,43.2216 +24.396323,46.4692 +24.265586,179.5078 +24.287253,158.6220 +24.404766,42.0669 +23.925664,522.9823 +24.368984,81.8047 +24.326953,126.0784 +24.400669,54.4610 +24.434468,21.4121 +24.232206,229.1749 +24.406536,55.6670 +24.408208,55.5212 +24.082346,383.6163 +24.162460,306.3569 +24.362402,108.0804 +24.370616,102.8650 +24.392849,82.2784 +24.155671,323.4226 +24.435266,44.7407 +24.168824,314.5127 +24.445876,38.0652 +24.345925,139.0978 +24.417642,71.1450 +24.470484,18.9370 +24.349549,146.4015 +24.462204,34.4882 +24.438732,59.9238 +24.433713,65.5733 +24.483942,17.0439 +24.453033,49.8495 +24.416873,88.6292 +24.446834,61.8896 +24.465964,44.1758 +24.409273,103.4095 +24.271444,242.8353 +24.495952,20.0068 +24.475128,44.9543 +24.480009,42.8193 +24.505503,20.1658 +24.227897,303.1543 +24.361622,171.1303 +24.483337,50.1910 +24.479095,56.9819 +24.422957,114.7842 +24.488788,49.8184 +24.512684,31.6820 +24.137245,408.7526 +24.415987,131.0060 +24.473482,75.9829 +24.510141,41.7618 +24.461382,93.1314 +24.520084,35.6072 +24.536078,20.6297 +24.514281,47.2328 +24.322457,240.3527 +24.544367,20.1414 +24.147267,420.7036 +24.463730,105.3201 +24.450789,121.5561 +24.414955,158.0457 +24.428777,147.6505 +24.485024,92.0096 +24.455131,125.9649 +24.564509,17.5262 +24.561514,26.9852 +24.556709,34.8729 +24.237221,354.9813 +24.546994,46.9894 +24.577035,19.3720 +24.377679,219.7574 +24.537743,61.3419 +24.562811,40.3756 +24.576429,27.7837 +24.500987,107.2214 +24.588501,21.9001 +24.455881,159.1027 +24.522829,93.8326 +24.551904,68.8162 +24.378286,243.1553 +24.312990,309.1000 +24.499287,123.6826 +24.344825,281.2763 +24.532753,94.2433 +24.355368,272.2246 +24.608210,22.9122 +24.569051,65.4954 +24.620721,17.2127 +24.508725,130.6962 +24.533530,106.5515 +24.599085,45.7216 +24.468817,179.0922 +24.597438,51.3069 +24.567972,82.6930 +24.634548,19.5228 +24.637935,19.0035 +24.639422,18.0616 +24.384547,276.2022 +24.573002,89.7310 +24.442793,221.6894 +24.603188,62.9412 +24.531052,139.2972 +24.525670,146.3168 +24.627593,45.3752 +24.581098,92.7535 +24.656939,17.8179 +24.657485,19.5996 +24.591583,89.2572 +24.593984,89.3537 +24.631123,53.1754 +24.640082,48.1272 +24.337957,351.8210 +24.596408,97.0480 +24.424841,270.7064 +24.555693,143.6838 +24.489422,211.6001 +24.445095,257.9782 +24.502883,202.4297 +24.545999,161.2811 +24.660750,48.1548 +24.626997,83.1006 +24.688211,23.1692 +24.693457,22.9147 +24.549466,169.6046 +24.699377,21.3888 +24.674758,51.9294 +24.683339,46.2349 +24.672970,57.3996 +24.582037,149.8111 +24.673852,60.2461 +24.592203,142.4582 +24.684300,52.0882 +24.719072,20.6041 +24.572347,169.6868 +24.705315,39.9968 +24.610403,136.1429 +24.604214,142.9180 +24.448648,301.2296 +24.614985,197.1027 +24.664484,151.4935 +24.662734,157.4129 +24.515960,305.9632 +24.680841,142.1103 +24.622091,203.2032 +24.671988,155.0254 +24.701024,127.4071 +24.707282,122.2940 +24.749878,81.9924 +24.731849,106.1076 +24.710099,128.5359 +24.644808,194.6578 +24.825296,18.4882 +24.427789,419.5600 +24.648746,199.5356 +24.616665,233.6403 +24.622971,227.9269 +24.745313,106.1903 +24.820149,35.3095 +24.689779,166.2311 +24.837958,19.3310 +24.720767,139.1610 +24.843785,19.5334 +24.847350,19.9271 +24.821924,45.9106 +24.734100,134.8678 +24.666131,203.6115 +24.374146,499.4332 +24.855459,18.6911 +24.621442,256.2308 +24.828432,50.2896 +24.747133,137.7099 +24.729575,156.6213 +24.716373,171.5284 +24.867279,22.4301 +24.827015,64.3688 +24.873580,21.8014 +24.746547,149.4336 +24.496693,405.7806 +24.856011,47.0466 +24.554515,349.4004 +24.654072,250.9719 +24.851504,56.5029 +24.730371,180.7048 +24.703075,209.4026 +24.812090,101.4863 +24.886199,30.9838 +24.903916,15.3048 +24.626102,298.3703 +24.647911,277.8133 +24.877674,50.4273 +24.848297,83.6343 +24.498657,434.1597 +24.905045,29.6516 +24.822953,113.0938 +24.919222,20.8234 +24.863320,77.3339 +24.874152,69.4708 +24.859929,85.7890 +24.928102,20.0825 +24.695549,255.2365 +24.839467,113.5268 +24.711381,245.3761 +24.902475,55.5337 +24.829577,130.2213 +24.940655,19.7803 +24.917184,48.7354 +24.677085,290.1558 +24.857290,111.1369 +24.950787,19.3538 +24.736389,239.6405 +24.940047,36.7236 +24.956758,20.8099 +24.934698,44.5344 +24.734663,245.4494 +24.965921,18.2165 +24.908008,76.5193 +24.911077,73.7203 +24.670350,318.2886 +24.970142,20.3616 +24.912479,78.5834 +24.903059,88.8082 +24.976772,17.4304 +24.943624,55.0602 +24.726689,272.9141 +24.850306,150.1980 +24.924473,77.0621 +24.931932,73.7307 +24.895982,110.2602 +24.979233,29.1672 +24.968429,43.3713 +24.887903,124.7041 +24.913577,102.9758 +24.891385,126.7649 +24.867836,150.9902 +24.895383,125.3644 +24.869744,152.5541 +25.005664,18.5368 +24.739677,291.5409 +24.999605,33.0409 +25.016554,16.7266 +24.650666,385.4766 +24.988640,49.9792 +24.980113,59.5153 +24.945720,96.4244 +24.984528,60.6307 +24.925725,125.2278 +25.018827,32.9658 +24.932818,123.7534 +25.022299,35.4277 +24.936047,122.7370 +24.991063,68.6487 +24.994203,67.7748 +25.024202,38.7617 +24.868969,197.1726 +25.039629,33.2577 +24.952995,121.9762 +24.831872,245.3402 +25.000505,78.9121 +24.959799,120.3723 +25.020748,60.3382 +25.011801,69.6697 +24.998685,83.0804 +24.884845,201.9689 +24.967243,123.1551 +25.032647,59.2687 +25.074973,18.2829 +24.838636,256.5248 +25.050954,46.1183 +24.850899,246.7120 +25.006243,91.9513 +25.045160,56.9972 +24.815979,289.2722 +24.984798,123.3322 +25.036143,72.8761 +25.057728,51.9674 +25.090399,21.4145 +25.080172,35.0440 +25.081471,36.2385 +25.081766,38.4021 +25.059713,63.3097 +25.042145,81.6466 +25.109021,17.6812 +24.976032,152.4783 +25.109696,19.8022 +25.051794,83.7828 +25.018151,118.4887 +24.889710,247.6961 +25.038621,102.2478 +25.077215,65.3848 +25.031219,112.1720 +25.123793,20.4934 +24.960436,184.7035 +24.984138,164.4691 +25.098195,53.4883 +25.097074,55.3689 +24.708906,448.9338 +25.111815,46.8101 +24.878723,283.1948 +25.079418,85.2944 +24.990504,175.0304 +25.081087,85.7064 +25.102158,67.3258 +25.152444,18.7199 +25.091917,83.8418 +25.086816,91.6094 +25.148608,31.4323 +25.164714,18.3958 +25.165536,18.1438 +25.058786,127.0832 +25.143393,43.8824 +24.538608,653.3557 +25.157841,35.3288 +25.066142,128.7845 +25.175760,20.0910 +25.183111,18.3493 +25.183680,18.3452 +25.128511,74.5634 +25.061979,141.8512 +25.105252,101.0277 +25.169486,41.2825 +25.136640,74.7014 +25.129499,82.8172 +25.161919,51.0062 +25.062965,152.3281 +25.056573,161.9590 +25.201461,17.6895 +25.202027,17.7124 +24.977570,247.3298 +25.206281,19.2119 +25.140870,87.5245 +25.097612,132.9662 +25.194928,36.7246 +25.218533,16.6293 +25.219151,16.5532 +25.135578,104.4805 +25.219740,21.0703 +24.742035,502.7578 +25.033282,213.2389 +25.228396,19.2824 +25.115217,134.8894 +25.158626,93.5106 +25.235163,17.5713 +25.108131,146.3076 +25.235706,20.0019 +25.151684,108.2619 +25.145141,115.7533 +25.126703,136.0428 +25.095163,172.8929 +25.210770,59.2624 +25.247679,23.1195 +24.991869,282.5406 +24.958010,317.5535 +25.137407,139.5739 +25.093258,186.5997 +25.203832,77.2726 +25.230580,54.3899 +25.259948,26.1876 +25.268057,18.6317 +25.008401,283.1039 +25.270800,21.2987 +25.012608,281.3584 +25.166795,129.0775 +25.123024,177.0385 +25.187276,114.0202 +25.225494,77.0494 +25.240811,63.4780 +25.252736,55.3812 +25.291506,17.1792 +25.144287,165.8996 +25.293968,19.3355 +25.185870,131.1866 +25.203076,114.5385 +25.281105,39.6233 +25.244794,80.1251 +25.308118,17.3346 +25.286690,40.0949 +25.308687,19.3435 +25.275564,53.4078 +25.180041,151.6846 +25.212318,120.5907 +25.250108,84.1551 +25.317058,20.7383 +25.274410,64.8382 +25.072889,271.9164 +25.328031,17.8862 +25.302544,46.8339 +25.215294,134.8547 +25.001536,351.7388 +25.317616,37.4978 +25.276982,79.7048 +25.195852,162.0233 +25.310188,50.9356 +25.286136,78.1924 +25.295873,69.3620 +25.345919,22.0553 +25.211343,157.3258 +25.353276,20.6225 +25.304290,70.5965 +25.191965,183.9191 +25.300063,78.5615 +25.255709,125.0603 +25.142601,239.1328 +25.240060,143.9612 +25.328973,56.3825 +25.332909,54.9375 +25.246522,143.4359 +25.331727,61.5256 +25.212926,184.9961 +25.334264,66.5461 +25.381734,19.6648 +25.292100,109.9357 +25.320729,87.1059 +25.344806,64.8380 +25.373900,36.6281 +25.356688,58.6835 +25.301297,114.8354 +25.368669,48.6782 +24.948186,470.9796 +25.401400,18.3713 +25.231654,190.8972 +25.324920,100.8423 +25.262747,163.5631 +25.384022,47.8638 +25.224901,208.8696 +25.279859,154.8708 +25.402036,33.8488 +25.419167,17.3402 +25.313304,125.2117 +25.378626,61.4710 +25.422552,18.3917 +25.375885,70.4705 +25.410529,37.1531 +25.380770,71.7675 +25.171165,284.3477 +25.400811,57.7696 +25.385357,74.2746 +25.349379,110.9249 +25.416134,47.2226 +25.409646,57.1523 +25.254440,213.7518 +25.270034,203.7298 +25.284971,189.5947 +25.407837,68.1105 +25.458582,19.3153 +25.374888,106.1908 +25.425763,56.6031 +25.339250,144.1007 +25.440098,44.6225 +25.459632,29.9185 +25.435886,54.4363 +25.417349,78.0453 +25.361125,135.6545 +25.415373,82.4053 +25.468192,31.7006 +25.426311,78.0922 +25.477899,27.3473 +25.436508,69.7544 +25.350149,159.3682 +25.490324,22.8657 +25.389959,124.9190 +25.495396,21.8205 +25.463357,56.2938 +25.433771,87.7283 +25.475948,47.0761 +25.504405,21.3902 +25.431887,94.6675 +25.483351,45.7566 +25.365236,164.6796 +25.357877,174.6724 +25.514879,19.4102 +25.393254,144.0248 +25.325454,214.4826 +25.523026,18.2356 +25.419773,124.6837 +25.355114,192.5362 +25.367975,181.7003 +25.260895,292.6324 +25.481080,73.3817 +25.529109,26.1607 +25.537279,20.3144 +25.539938,21.5275 +25.120169,442.6086 +25.460306,106.8849 +25.452539,115.6580 +25.387848,181.9946 +25.326786,244.8257 +25.252138,321.8573 +25.534290,41.9085 +25.561466,17.5818 +25.438517,143.5297 +25.434731,148.5860 +25.509519,78.0041 +25.440945,147.5868 +25.446356,143.1850 +25.397923,196.3694 +25.517217,77.6842 +25.525796,70.0502 +25.466799,132.5510 +25.582047,18.8100 +25.499894,104.3847 +25.587524,18.2423 +25.562779,45.4878 +25.555271,54.5630 +25.484722,127.4671 +25.496780,117.1414 +25.541263,73.8561 +25.519652,96.5336 +25.497779,120.9036 +25.547652,74.3634 +25.567192,56.2722 +25.604280,20.4542 +25.599351,31.4659 +25.521501,113.2755 +25.482367,153.6726 +25.474567,162.8382 +25.618684,19.6256 +25.622016,20.0546 +25.605767,38.4447 +25.544458,102.9237 +25.600858,47.5319 +25.630818,20.6210 +25.557595,94.5877 +25.595848,56.9529 +25.473764,184.1730 +25.588533,70.4364 +25.532550,127.4906 +25.634777,30.8339 +25.178427,488.4361 +25.613923,53.8184 +25.615120,54.9834 +25.652184,18.5595 +25.529917,145.7276 +25.364329,314.4431 +25.637407,44.0974 +25.636042,46.6046 +25.571612,113.8034 +25.665612,20.7393 +25.651440,35.6598 +25.608268,82.7024 +25.549676,142.3599 +25.675646,18.5169 +25.193171,504.0077 +25.644213,55.7910 +25.657939,44.8920 +25.553529,151.0479 +25.642072,63.8810 +25.648391,61.5047 +25.624735,88.3011 +25.697179,18.9283 +25.623465,95.9892 +25.337797,382.2678 +25.687101,36.1138 +25.589543,135.7031 +25.681506,45.4934 +25.686353,46.3146 +25.667743,69.0197 +25.568198,169.0722 +25.612190,125.6923 +25.666864,74.1962 +25.505247,236.6674 +25.694164,51.5204 +25.719456,28.9968 +25.513190,238.8005 +25.526555,226.0183 +25.713037,40.1199 +25.716109,39.7743 +25.455515,304.9285 +25.594903,166.7862 +25.709898,52.6345 +25.583318,182.6202 +25.670105,96.8406 +25.609835,158.9804 +25.751992,18.1992 +25.755884,20.1502 +25.760444,16.2379 +25.737883,42.5102 +25.447684,336.7975 +25.569844,215.2865 +25.732669,55.0754 +25.720066,68.6075 +25.506264,283.2288 +25.702832,90.5724 +25.682647,112.9243 +25.647383,149.1590 +25.780396,19.7788 +25.745685,56.1197 +25.705954,98.5992 +25.658970,146.1726 +25.741061,67.5622 +25.704578,105.9528 +25.554463,257.1401 +25.793406,18.9958 +25.752575,62.7675 +25.776036,41.3990 +25.753158,65.4929 +25.801806,18.3528 +25.685417,144.6164 +25.489552,342.4094 +25.723216,110.5917 +25.692037,142.3726 +25.762533,73.0406 +25.804555,34.0789 +25.795573,45.2781 +25.736763,105.5399 +25.800176,43.6849 +25.573996,273.4171 +25.737271,112.7064 +25.811604,42.2280 +25.770192,85.4599 +25.784483,74.7462 +25.678773,181.4662 +25.805144,56.1514 +25.616187,246.0214 +25.843862,19.1755 +25.849979,18.1931 +25.652801,218.5506 +25.727000,148.2066 +25.761690,114.1295 +25.690971,185.8753 +25.847414,32.8171 +25.863038,17.8530 +25.838635,43.8535 +25.741915,143.7623 +25.842304,47.5110 +25.810532,81.4768 +25.766947,127.7780 +25.725247,171.3332 +25.880233,16.9484 +25.660042,239.3288 +25.855653,47.2601 +25.835575,72.0254 +25.700005,209.5277 +25.875208,34.9424 +25.831962,79.9829 +25.785131,129.0301 +25.834411,82.7089 +25.833809,85.4661 +25.776684,145.8311 +25.861297,63.6418 +25.808625,117.7021 +25.876848,53.6144 +25.871353,61.7151 +25.830034,103.6197 +25.894726,40.5512 +25.815344,122.6648 +25.576200,363.8980 +25.859230,84.0314 +25.926328,18.0710 +25.579049,367.6596 +25.787745,159.9101 +25.670744,279.1691 +25.882489,68.3876 +25.889816,63.1938 +25.594294,360.5225 +25.765939,194.4346 +25.899372,63.0228 +25.917122,46.4470 +25.880892,84.2438 +25.935278,33.6869 +25.933655,36.2939 +25.896581,75.2960 +25.885679,88.3364 +25.924940,50.0136 +25.933069,48.1569 +25.963570,18.2934 +25.944400,41.3418 +25.914163,72.1067 +25.950878,39.2682 +25.892010,99.9123 +25.907602,85.3403 +25.789494,204.0842 +25.943263,53.5138 +25.940099,57.4078 +25.974954,28.6577 +25.946710,59.5877 +25.947656,60.1298 +25.910151,98.2316 +25.796543,212.4581 +25.840852,172.5328 +25.960375,53.9527 +25.922517,93.0685 +25.953011,65.4835 +25.862209,161.0122 +25.868173,157.5113 +25.911946,117.1546 +25.993579,36.3519 +25.954817,79.4191 +25.909534,125.5150 +26.018496,17.2548 +26.003613,34.6197 +26.023223,17.6020 +25.968966,74.6104 +25.897182,152.2653 +25.974017,76.0570 +25.820160,232.3452 +25.962396,91.0231 +25.971878,83.2681 +26.038234,17.7853 +25.930463,128.7748 +26.043577,17.7704 +25.986271,79.9302 +25.768816,297.9371 +26.049449,19.1734 +25.812402,257.2673 +26.006299,68.2302 +25.875821,199.6517 +26.050075,27.0917 +25.969950,109.8483 +25.992943,87.4536 +25.981864,102.0145 +26.066202,18.2412 +26.066755,19.8977 +25.853833,234.4553 +25.996778,93.0331 +25.817436,275.7708 +25.788675,306.4729 +25.860241,239.0344 +26.029102,70.7271 +26.007787,93.4508 +26.083880,18.1157 +25.117711,985.7595 +26.025685,79.7344 +26.089812,19.6251 +26.035752,77.3975 +26.035050,80.9098 +25.997508,119.3737 +25.981227,136.7308 +26.099830,18.6903 +25.938009,187.3520 +26.086653,39.3029 +26.069671,56.8692 +25.965137,162.2392 +26.079799,50.8775 +26.099277,31.9162 +25.991924,142.2337 +26.053420,82.8708 +26.101239,40.2998 +25.985743,156.3520 +26.029932,117.5012 +26.080397,68.1853 +26.088289,60.9432 +26.109439,42.4803 +26.056020,96.4440 +26.040826,113.8089 +26.103471,52.7235 +26.142096,16.4802 +26.116883,45.0564 +26.101996,60.4715 +25.818652,345.9312 +26.147434,17.8087 +25.902914,268.5749 +25.638312,533.8186 +26.115961,56.8997 +26.118522,54.9203 +26.125362,50.8282 +26.113150,63.8699 +26.161940,18.6302 +26.162469,18.6561 +26.126541,56.2936 +26.130678,55.7705 +26.117959,70.4075 +26.149234,41.8727 +25.949914,244.6496 +26.148584,46.5551 +26.074530,121.8034 +26.181126,16.0554 +26.141540,58.3034 +26.172131,31.9095 +26.151920,53.3507 +25.919276,287.8481 +26.093207,118.0252 +26.158577,53.1810 +26.165244,48.8138 +26.059239,156.2014 +26.204042,14.6015 +25.748453,471.8265 +26.068623,155.6892 +26.134158,90.6644 +26.177021,49.5061 +26.211234,15.8576 +26.211759,17.5474 +26.176192,55.1319 +26.055148,179.0911 +26.196334,39.8591 +26.218645,19.4490 +26.009002,231.1556 +26.136292,106.8933 +26.061349,184.2504 +26.220281,25.9828 +26.164585,82.2169 +26.095149,153.2861 +26.215442,34.7297 +26.105421,145.3677 +26.191107,63.4137 +26.205272,50.9542 +26.214059,46.4442 +26.207125,53.9727 +26.188368,73.3333 +26.246803,19.4813 +26.229308,38.3575 +26.013386,256.0830 +26.231325,39.0471 +26.194565,79.8020 +26.014329,260.8655 +26.172862,103.6165 +26.152465,126.3301 +26.173443,107.3694 +26.125957,157.3000 +26.240159,48.4373 +26.131194,158.1969 +26.226528,63.6334 +26.182835,108.1951 +26.084444,208.5547 +26.246265,51.9835 +26.250790,48.8021 +26.280813,19.3509 +26.238095,67.2298 +26.254522,51.9664 +26.243186,68.1090 +26.127377,184.4692 +26.199845,113.4719 +26.260504,53.7925 +26.298249,17.2972 +26.299593,17.0055 +26.075473,242.3700 +26.171490,149.6865 +26.283258,38.4443 +26.305326,18.4480 +26.266285,60.0057 +26.248436,79.6087 +26.278796,50.8064 +26.270373,62.1219 +26.290163,45.0278 +26.077167,261.2866 +26.261100,78.1098 +26.250172,91.8243 +26.326292,18.0002 +26.236194,109.0545 +26.315547,33.9067 +26.306490,44.3177 +26.332496,18.8553 +26.328046,27.3852 +25.990147,367.2762 +26.321703,36.5751 +26.317845,43.4183 +26.156196,205.5743 +26.186450,175.8369 +26.261702,104.7259 +26.344293,22.6179 +26.321178,46.4969 +26.349455,18.7809 +26.267666,103.1159 +26.316600,57.3052 +26.355432,19.2818 +26.358279,20.2009 +26.256227,122.9434 +26.313318,70.3712 +26.300165,84.0267 +26.366429,18.2937 +26.293001,97.0130 +26.227092,165.5785 +26.339211,53.8958 +26.288597,106.0301 +26.234240,160.9889 +26.373906,22.3959 +26.224313,174.2638 +26.383690,18.5554 +26.370783,32.2605 +26.384723,19.6212 +26.338455,68.9023 +26.390015,17.8513 +26.154636,256.7950 +26.323775,89.5723 +26.311296,104.9717 +26.197182,220.5199 +26.362288,55.9415 +26.311848,108.2473 +26.374715,47.9864 +26.402247,21.0037 +26.407359,18.3689 +26.245600,181.1471 +26.384193,47.3285 +26.345250,87.8675 +26.335192,100.1238 +26.329604,107.1288 +26.367676,73.3749 +26.052506,390.1051 +26.275196,168.0294 +26.357425,87.2642 +26.180571,266.8573 +26.407868,42.3965 +26.378481,75.5723 +26.274368,180.6047 +26.379171,79.3359 +26.404346,55.6108 +26.423251,38.6083 +26.441051,21.3659 +26.435317,29.7082 +26.431522,34.6563 +26.426748,40.1925 +26.394628,77.5543 +26.341998,132.8791 +26.458508,17.3117 +26.393107,83.4026 +26.314298,162.9368 +26.443226,35.5473 +26.195140,289.3548 +26.366912,119.8229 +26.465026,22.3444 +26.447430,44.0023 +26.420096,73.2736 +26.418230,76.4547 +26.475821,20.9248 +26.361264,136.8462 +26.450265,49.2226 +26.484496,16.9556 +26.466942,36.4460 +26.462418,44.4014 +26.269470,240.4058 +26.494686,17.7004 +26.486735,28.6733 +26.478774,37.2689 +26.015587,501.2902 +26.008385,513.4306 +26.403045,119.3841 +26.034238,489.1328 +26.416269,108.4044 +26.496747,31.6025 +26.512387,19.5621 +26.444690,91.1405 +26.499489,38.7149 +26.398578,140.8162 +26.351352,189.8326 +26.392672,149.8386 +26.291032,254.1187 +26.436733,109.6626 +26.503389,44.1523 +26.466179,84.8250 +26.528350,23.5599 +26.395229,160.0607 +26.433118,122.9320 +26.506820,51.5124 +26.361772,197.8461 +26.224823,335.6586 +26.541186,24.2990 +26.523372,44.7193 +26.501453,68.0307 +26.413348,156.7108 +26.521816,50.6571 +26.276479,300.1571 +26.422702,155.5242 +26.539395,40.9077 +26.551006,31.6866 +26.396303,190.0371 +26.411432,177.8216 +26.487371,105.8625 +26.350808,244.0538 +26.289392,306.3594 +26.522430,76.4653 +26.368237,231.3701 +26.559619,40.5881 +26.491433,109.7501 +26.509877,94.8780 +26.589255,18.0454 +26.538205,72.7335 +26.524674,89.1634 +26.598896,16.4178 +26.569484,47.0615 +26.599608,17.5090 +26.442613,176.3729 +26.498111,122.2640 +26.604756,18.4459 +26.417703,207.3934 +26.477236,152.0615 +26.610939,19.2122 +26.461861,170.4648 +26.546397,89.1200 +26.454974,182.3875 +26.516878,121.7895 +26.535832,103.5850 +26.582693,59.0230 +26.607301,39.0160 +26.565486,81.3920 +26.616547,32.4922 +26.547542,102.4933 +26.542511,111.8264 +26.545152,111.7567 +26.531950,125.5554 +26.493371,164.7627 +26.632326,29.0708 +26.580304,85.7136 +26.601184,65.7508 +26.625097,42.6969 +26.515410,157.6679 +26.516044,158.5430 +26.459957,216.5392 +26.555291,122.2607 +26.661398,20.5327 +26.646880,38.5813 +26.657507,30.3443 +26.474878,214.3344 +26.476511,213.7273 +26.673079,19.9827 +26.594863,99.1347 +26.576638,120.5603 +26.630153,69.9289 +26.617119,83.7464 +26.685462,18.4912 +26.556051,148.6148 +26.637362,71.9121 +26.629298,81.4965 +26.613838,97.8827 +26.558334,155.8700 +26.560483,155.0997 +26.618986,100.0944 +26.425729,294.4499 +26.693063,28.2271 +26.572474,150.4163 +26.704667,18.7961 +26.709276,17.6094 +26.674589,53.4985 +26.700866,33.1766 +26.666019,68.7144 +26.654339,81.3157 +26.635518,101.8651 +26.586341,154.0371 +26.722892,18.0773 +26.639418,102.2348 +26.595752,147.2170 +26.728089,18.6859 +26.454055,294.2355 +26.700083,53.9745 +26.740971,13.6781 +26.650036,105.6804 +26.646319,113.9970 +26.703955,57.6452 +26.681932,81.1358 +26.676498,87.4971 +26.656910,110.5748 +26.666937,101.8896 +26.638669,133.4536 +26.754650,19.4308 +26.578228,199.9492 +26.714205,65.5297 +26.742970,37.7971 +26.755718,28.4842 +26.697199,89.0203 +26.719082,67.9222 +26.658135,129.4640 +26.711722,78.8847 +26.740379,50.7831 +26.689214,106.4875 +26.721291,76.0430 +26.715584,82.4279 +26.761602,41.4442 +26.784203,19.3658 +26.690240,115.1721 +26.748291,58.8740 +26.710796,97.4840 +26.735656,75.4674 +26.734044,77.6589 +26.780768,31.8888 +26.774082,41.7600 +26.772123,46.3618 +26.720180,100.2278 +26.787005,34.7239 +26.803047,20.0348 +26.778178,47.7554 +26.551912,277.3780 +26.763996,66.2257 +26.726886,104.1258 +26.791163,45.1379 +26.667796,169.5088 +26.723464,114.7609 +26.760317,80.9410 +26.795703,46.3054 +26.825935,19.5022 +26.768828,77.3446 +26.472184,377.1454 +26.593234,258.4290 +26.741653,111.0527 +26.836302,17.2229 +26.811124,49.0536 +26.829290,32.2465 +26.823083,39.5944 +26.815843,49.0234 +26.820409,47.6275 +26.849331,20.3241 +26.787600,83.1449 +26.831013,43.1018 +26.797335,78.0399 +26.623204,254.7208 +26.693999,185.5136 +26.812658,69.6262 +26.838226,45.5602 +26.842009,43.3536 +26.807166,82.7950 +26.818486,72.0323 +26.870746,22.8462 +26.877926,16.2423 +26.763069,132.3472 +26.737384,163.7022 +26.846173,55.5254 +26.568092,334.2193 +26.853526,53.9975 +26.734734,174.2892 +26.889963,20.7737 +26.894169,18.5916 +26.641717,273.3705 +26.864867,51.9920 +26.874116,45.4809 +26.677553,245.9960 +26.830223,94.7861 +26.687853,238.1160 +26.879514,49.3369 +26.890519,38.8288 +26.746776,183.1637 +26.862679,70.5019 +26.845438,89.2697 +26.754059,181.7389 +26.907525,31.8302 +26.851664,88.2335 +26.923550,18.3365 +26.882285,60.2002 +26.929349,16.4956 +26.570060,377.4326 +26.861539,92.0826 +26.811704,142.8152 +26.909024,46.4070 +26.649040,309.5847 +26.925010,38.5558 +26.945846,18.2960 +26.901700,63.7466 +26.885364,84.6607 +26.893593,77.5612 +26.805413,168.0986 +26.875376,101.3569 +26.620376,357.0074 +26.600208,378.1622 +26.941888,37.3426 +26.901088,80.3434 +26.919598,62.6670 +26.808281,178.0425 +26.942487,45.2214 +26.963567,24.6453 +26.970026,20.3164 +26.934709,58.7382 +26.868037,127.2681 +26.860179,137.4024 +26.798013,200.5912 +26.779736,221.3674 +26.869656,132.4525 +26.883787,119.0456 +26.939899,66.7750 +26.912778,96.0831 +26.767487,242.5092 +26.982266,30.7661 +26.958626,59.6291 +26.910738,110.2327 +26.973512,48.0236 +26.977385,45.1184 +26.939356,84.6465 +26.786221,240.0978 +27.013033,16.3229 +26.615315,415.8444 +26.895418,139.0451 +26.841259,195.8159 +26.933182,105.2560 +26.790607,248.6572 +26.803570,238.3469 +27.002833,46.4328 +27.029357,20.6972 +26.955433,96.6425 +27.002109,50.7873 +27.034464,22.1272 +27.022505,35.2167 +26.988213,73.2519 +27.008862,53.9603 +27.041918,21.8212 +26.852707,212.2854 +26.995307,72.0756 +27.009997,58.1562 +27.021537,50.7719 +27.020971,53.5233 +26.979232,97.2703 +27.057722,19.4489 +26.993448,88.4945 +27.050056,33.0266 +26.987710,96.0204 +27.068154,17.1057 +26.986325,102.1329 +27.072310,19.0108 +26.965448,129.0963 +27.018256,76.8372 +26.998605,99.6863 +26.928852,174.3290 +27.056592,47.6167 +27.067383,37.5246 +26.925970,179.4950 +27.049268,56.8572 +27.088458,19.0654 +27.061467,49.1310 +27.083731,29.7864 +26.821730,292.6411 +26.947494,170.3247 +27.039266,79.8189 +27.085261,38.8502 +26.981432,143.5283 +27.077173,48.8656 +26.978371,148.3052 +27.110599,18.4007 +27.063741,67.9800 +26.929941,204.6765 +27.103182,32.0815 +27.081944,57.3177 +27.105466,34.5014 +27.124112,20.5109 +26.837306,310.7794 +26.997582,155.0514 +27.131722,21.4850 +27.119086,38.1025 +26.916860,241.8730 +27.139263,19.9653 +27.094545,65.9055 +27.139969,21.9340 +27.126677,39.1069 +27.038439,128.4452 +27.134618,33.5536 +27.052897,115.8653 +27.104909,67.8133 +27.098293,75.3832 +27.106126,71.5590 +26.964143,215.5286 +26.990343,190.1248 +27.126039,55.4239 +27.104210,77.8947 +27.095094,91.8059 +27.160452,27.2746 +27.001104,192.3266 +27.153208,40.8019 +27.177686,17.1201 +27.006675,189.4770 +27.124962,75.7517 +26.935799,266.8690 +26.915089,288.9701 +27.024004,183.9029 +27.159229,49.9804 +27.076503,134.2318 +27.064994,147.0421 +27.194807,19.7049 +26.902312,312.7687 +27.052077,165.2799 +27.181464,38.9367 +27.204060,17.3710 +27.166885,59.2082 +27.179673,49.4547 +27.074496,156.3282 +27.168764,65.0444 +27.144625,90.0452 +27.182106,57.5890 +27.152635,88.5720 +27.202669,39.4269 +27.161904,81.1111 +27.037076,209.4270 +27.135265,112.5827 +27.233810,18.3663 +26.976734,277.5651 +27.212037,44.0209 +26.953624,307.1837 +27.186901,74.6639 +27.117819,144.3460 +26.971156,292.7892 +27.172723,92.2288 +27.252178,18.4323 +27.230825,44.0216 +27.241208,35.0063 +27.091322,186.1933 +27.234671,43.4791 +27.187728,91.0369 +27.158734,122.3628 +27.229129,55.2324 +27.239696,45.5212 +27.113519,173.8244 +27.217358,70.5105 +27.193432,100.0844 +27.107525,186.5518 +27.215082,79.8478 +27.274848,20.8911 +27.210736,87.1352 +27.026319,276.7681 +27.148086,156.0462 +27.256059,50.5029 +27.263946,43.5603 +27.247849,63.1183 +27.278766,33.3954 +27.293518,20.4659 +27.165785,153.7951 +27.196153,123.9904 +27.031160,289.7484 +27.209211,116.9252 +27.284362,42.3034 +27.278152,50.5272 +27.242097,88.7672 +27.295741,36.7804 +27.310969,22.3902 +27.083084,254.2447 +27.114373,223.5396 +27.262167,76.2850 +27.304134,35.1860 +27.261567,82.7666 +27.326137,22.5781 +27.157189,192.0233 +27.328680,21.6799 +27.260808,93.5233 +27.326666,28.1276 +27.337330,17.9169 +27.294931,61.0725 +27.287870,69.0584 +27.243016,115.8772 +27.220402,140.6857 +27.129000,233.6262 +27.276215,88.6120 +27.332522,33.3607 +27.349214,18.4164 +27.354333,15.8969 +27.294078,78.2590 +27.356005,17.3472 +27.173677,203.4549 +27.339321,39.1833 +27.246504,132.6085 +27.364828,16.3709 +27.207908,176.1777 +27.370231,14.7984 +27.372338,15.7974 +27.226095,167.4187 +27.313985,80.8932 +27.307507,89.7851 +27.319581,78.2132 +27.358894,40.3665 +27.320910,82.3265 +27.377133,26.6676 +27.350361,55.1202 +27.194011,213.4610 +27.333360,77.8495 +27.312162,100.5359 +27.254301,159.0365 +27.355248,63.2045 +27.373353,46.0242 +27.303089,117.1988 +27.348717,77.9673 +27.337913,89.8608 +27.384087,44.4545 +27.062824,368.4922 +27.281099,152.3796 +27.397795,37.3903 +27.419378,21.2897 +27.381200,59.9693 +27.403802,37.9307 +27.365884,78.2080 +27.378505,68.7078 +27.285218,162.7064 +27.168173,280.8477 +27.393515,58.9223 +27.330865,122.4941 +27.403237,51.2279 +27.420289,37.6555 +27.441171,17.2879 +27.441733,18.4016 +27.344334,119.3151 +27.379113,87.7904 +27.214513,254.1050 +27.287344,182.4077 +27.413339,57.1652 +27.454466,19.1289 +27.435187,39.8502 +27.458460,17.5390 +27.427776,50.5784 +27.463650,17.4412 +27.469753,15.3556 +27.447925,38.5966 +27.470505,16.5801 +27.277516,210.9689 +27.407473,83.0607 +27.418453,73.0758 +27.476000,20.1978 +27.428542,68.3968 +27.444093,53.7366 +27.221432,279.4909 +27.485110,18.7214 +27.200715,304.2971 +27.426686,79.0790 +27.447214,60.7595 +27.354795,156.7811 +27.466905,46.0372 +27.460136,53.7708 +26.954521,559.9142 +27.180469,339.1843 +27.500924,22.4030 +27.405482,118.3423 +27.503833,20.4094 +27.362627,162.9817 +27.491530,37.6059 +27.264953,264.9446 +27.490535,40.7655 +27.397293,137.8253 +27.270611,265.9099 +27.306563,231.6822 +27.481092,58.6068 +27.523825,17.6931 +27.529137,15.0274 +27.497831,47.9015 +27.411211,138.6037 +27.431317,119.4691 +27.505013,48.3165 +27.529899,27.5675 +27.473596,86.4593 +27.361088,200.3991 +27.544166,18.1703 +27.512943,50.9167 +27.507975,58.0245 +27.514436,54.2698 +27.513908,58.9202 +27.531301,43.0256 +27.519655,55.6506 +27.557467,18.8064 +27.541520,35.3611 +27.496940,81.8393 +27.356929,222.4182 +27.539700,40.4484 +27.320145,264.4418 +27.505766,83.7129 +27.468619,121.5506 +27.388137,205.1653 +27.578780,16.4786 +27.338453,257.9748 +27.545733,51.4699 +27.475038,123.2987 +27.496199,107.2765 +27.524243,80.1522 +27.535120,70.3733 +27.525610,82.5066 +27.590171,20.8312 +27.457946,154.1334 +27.593303,22.8908 +27.367631,249.3796 +27.453361,164.7778 +27.536523,84.5433 +27.580150,42.7257 +27.595260,28.1983 +27.487087,140.2127 +27.488486,140.6046 +27.563861,66.0157 +27.412699,217.9728 +27.612080,20.4553 +27.618139,17.7129 +27.523328,116.9787 +27.440669,200.6875 +27.297872,344.4550 +27.630673,14.2544 +27.385030,262.7713 +27.579348,70.4929 +27.584588,66.7190 +27.635854,17.0823 +27.550787,107.4144 +27.632536,26.6518 +27.644928,16.3903 +27.608118,54.1957 +27.562337,105.0301 +27.449021,220.3341 +27.576882,93.2394 +27.399262,272.9484 +27.647802,29.1096 +27.561488,116.4451 +27.621067,57.6226 +27.568707,113.4270 +27.649842,33.9195 +27.597205,87.2728 +27.611004,75.8031 +27.553331,136.7786 +27.651308,39.5209 +27.574328,117.4678 +27.659189,36.7707 +27.678690,17.8958 +27.452438,244.7719 +27.629092,70.4093 +27.640308,62.4420 +27.478355,232.1904 +27.511577,201.3423 +27.695961,17.7257 +27.538246,176.6857 +27.642329,74.2850 +27.641358,80.6514 +27.686808,35.9909 +27.596429,127.0872 +27.622876,103.1953 +27.598338,128.2480 +27.661319,69.5137 +27.604396,127.1417 +27.713688,18.7608 +27.690110,47.2507 +27.572829,165.3119 +27.677935,60.7569 +27.672211,69.0501 +27.589480,153.5008 +27.726073,17.4326 +27.682135,63.5292 +27.726587,20.0290 +27.667368,83.9483 +27.486523,267.5905 +27.605494,149.4754 +27.575307,180.2008 +27.716614,42.6686 +27.723517,38.1407 +27.576275,186.2923 +27.652937,110.9106 +27.710548,55.3021 +27.683762,85.1993 +27.617013,153.5105 +27.722010,49.8017 +27.394879,379.0732 +27.714933,60.8535 +27.684479,95.9917 +27.702751,79.6861 +27.730834,52.8379 +27.696587,88.0457 +27.765851,24.6012 +27.623459,167.5877 +27.603476,189.6764 +27.754971,39.2882 +27.755509,39.4456 +27.780471,22.0980 +27.745665,58.1624 +27.658203,146.5155 +27.697211,112.4297 +27.433479,377.1166 +27.790453,21.5859 +27.768963,46.2887 +27.732450,85.1717 +27.771813,46.3536 +27.560057,258.8101 +27.775788,43.6469 +27.738693,85.6568 +27.549815,277.5999 +27.783673,46.1451 +27.629878,200.5876 +27.712921,119.0022 +27.742982,92.3986 +27.804719,31.3158 +27.802571,34.3067 +27.690829,147.6946 +27.743506,99.7185 +27.669356,174.7731 +27.731539,117.9208 +27.751318,99.4566 +27.738142,116.1600 +27.759284,95.5873 +27.770525,86.8955 +27.791048,67.4723 +27.829819,30.1573 +27.843226,20.5829 +27.670123,195.7685 +27.817623,49.4881 +27.737362,134.6561 +27.761659,111.3595 +27.854303,20.0206 +27.699502,177.3753 +27.763848,113.5592 +27.746617,132.5738 +27.836879,44.7846 +27.824350,58.9327 +27.865892,18.6569 +27.819436,70.6799 +27.793154,97.8159 +27.741262,151.7471 +27.818868,76.2049 +27.867112,33.4395 +27.831924,69.3992 +27.782438,121.3839 +27.863810,40.9305 +27.812040,97.5476 +27.838525,72.1508 +27.890118,21.9575 +27.874325,41.4817 +27.883284,34.2099 +27.900552,17.8580 +27.879191,43.3339 +27.810597,113.8686 +27.616195,309.5314 +27.794955,132.1543 +27.910677,17.1807 +27.815253,115.0016 +27.794260,136.7451 +27.850775,84.4636 +27.844131,91.9397 +27.890971,50.1885 +27.858522,83.2218 +27.872019,70.7602 +27.566000,377.9609 +27.662315,286.0224 +27.876879,73.1555 +27.895075,57.6217 +27.762568,194.3211 +27.909589,48.5432 +27.627301,332.6099 +27.941161,19.2961 +27.925728,36.0385 +27.918412,47.5876 +27.835381,134.2342 +27.784634,185.5235 +27.827417,146.5832 +27.873019,101.8153 +27.849461,126.4249 +27.722800,255.3031 +27.836036,143.5865 +27.809642,170.8820 +27.903823,80.2779 +27.857421,133.5751 +27.893011,100.5544 +27.958133,35.8545 +27.859978,134.2634 +27.927859,67.2433 +27.904741,92.5828 +27.935240,63.4946 +27.961767,38.7392 +27.901324,102.9621 +27.773953,232.2912 +27.881664,127.3724 +27.993566,15.9681 +27.993989,16.0788 +27.995103,18.6115 +27.979624,34.8245 +27.915807,100.2212 +27.948338,71.3443 +27.974836,45.9658 +27.943962,77.9377 +28.009038,15.9672 +28.009535,16.0360 +27.912076,115.8134 +28.010068,19.8311 +27.877409,153.9270 +27.917495,116.5149 +27.978104,58.0207 +28.000507,38.4773 +27.950035,90.3827 +27.959912,81.1478 +27.884550,158.9741 +28.013715,34.4081 +27.927110,121.5956 +27.754114,299.5003 +27.970159,84.2395 +27.994242,62.3515 +27.922527,136.5519 +28.043525,16.1319 +28.004288,62.9043 +27.997325,71.2505 +28.019684,49.5003 +28.014449,55.3129 +28.031337,40.3049 +27.980525,92.3912 +27.960458,113.4301 +27.936071,141.5830 +27.952698,128.3462 +28.036126,47.0928 +27.990998,93.0551 +28.067193,20.9039 +28.068577,20.7522 +27.969616,120.3114 +28.040419,53.8349 +28.025572,71.5951 +28.038986,59.1546 +28.027891,71.7913 +27.924467,176.7709 +28.054399,48.8623 +28.083220,21.2360 +27.942780,164.5995 +28.025007,84.0223 +28.020803,92.6141 +28.073890,40.5634 +28.097169,23.0896 +27.854873,266.8779 +28.029900,92.5995 +28.056594,66.4957 +28.041060,82.8141 +28.107381,18.5378 +28.089330,39.2799 +28.113418,16.7607 +28.069185,62.4008 +28.048707,87.2497 +28.084054,52.4058 +28.053616,84.2116 +28.120259,18.9236 +27.931006,210.5458 +28.071643,71.0429 +27.998735,146.0535 +28.094255,51.5659 +28.089929,58.7640 +27.676913,475.7914 +28.135958,17.2695 +28.077655,76.5913 +27.803829,351.0282 +28.136461,19.8413 +27.956890,204.7850 +28.059080,103.4254 +28.098141,65.3655 +28.103263,65.0782 +28.034011,136.6687 +28.059658,113.8462 +28.109030,68.5208 +28.123091,55.3588 +27.941745,241.9557 +28.122501,61.9928 +28.152706,32.3685 +28.114454,73.0906 +28.101239,89.4171 +28.148694,44.5127 +28.123876,70.0559 +28.081046,117.8486 +27.930256,269.1816 +28.021901,178.5622 +28.137829,63.4013 +28.139184,66.6358 +27.984102,223.5433 +28.142687,66.1099 +28.145822,63.6844 +28.168342,46.2025 +28.006246,209.2140 +28.088098,128.1511 +28.198895,20.0541 +28.154248,68.6307 +28.104457,120.1381 +28.099683,125.4279 +28.163508,65.2077 +28.170681,59.2545 +28.130179,100.9734 +28.069763,162.5145 +28.048125,186.1364 +28.162506,74.4253 +28.016030,226.0563 +28.178451,64.4526 +28.153229,90.8188 +28.185075,63.0646 +28.173506,75.5826 +28.216250,36.2194 +27.818168,436.6150 +27.830467,425.5627 +28.218951,37.6395 +28.214545,42.8526 +28.141553,121.2462 +28.190657,74.1101 +28.229936,35.7402 +27.975887,293.3914 +28.222879,49.2699 +28.131587,142.5535 +28.121752,154.5235 +28.187546,91.9535 +28.193208,86.8580 +28.128611,153.0485 +27.974001,312.4229 +27.966001,321.5888 +28.231155,57.8418 +28.156304,134.2976 +28.256591,35.0206 +28.232279,60.5418 +28.276277,19.0489 +28.279500,18.1766 +28.224596,73.9050 +28.265677,36.5680 +28.286425,18.2452 +28.236933,68.6448 +28.205821,102.8790 +28.154858,154.5412 +28.209507,101.9106 +28.242087,71.0747 +28.262801,51.8802 +28.254784,61.3751 +28.207647,111.4498 +28.302246,17.4214 +28.199438,123.4913 +28.295327,28.7562 +28.281660,46.5450 +28.144790,184.6307 +28.183701,147.0375 +28.184495,150.9547 +28.319098,17.0129 +28.208797,131.4113 +28.304671,37.0216 +28.242905,102.5170 +28.252470,93.9152 +28.249089,99.0347 +28.305579,43.8496 +28.288998,62.8467 +28.311419,44.1971 +28.340210,17.0622 +28.322931,41.6592 +28.290602,75.4904 +28.316160,51.5298 +28.292822,75.5878 +28.200464,168.4836 +28.234262,135.7961 +28.336112,35.0484 +28.297678,73.9186 +28.215461,157.0323 +28.269281,106.4302 +28.329422,50.3620 +28.308701,71.5984 +28.257399,124.5742 +28.351846,31.3223 +28.335450,49.9127 +28.349429,36.8667 +28.280067,107.1875 +28.256030,133.6715 +28.368410,24.0302 +27.691797,702.7128 +28.072918,322.8550 +28.379785,16.5406 +28.380301,18.5585 +28.381974,19.1025 +28.366094,35.9739 +28.287591,117.8282 +28.341694,65.9211 +28.225112,184.9784 +28.375711,35.5237 +28.396327,18.0457 +28.398860,17.6226 +28.201231,217.2755 +28.228717,191.9674 +28.348125,76.1554 +28.125920,299.8405 +28.274143,152.2813 +28.177552,252.2172 +28.328207,102.9971 +28.414374,18.7813 +28.389703,44.2326 +28.244048,194.4388 +28.346387,93.7494 +28.193932,248.1838 +28.319669,125.1412 +28.330740,116.1837 +28.314682,132.7698 +28.355617,93.8099 +28.402069,48.5852 +28.395774,55.6645 +28.309400,146.4087 +28.438488,18.0564 +28.313163,147.0161 +28.298503,164.3837 +28.272151,194.4629 +28.364592,102.6825 +28.345423,122.9488 +28.161676,307.7532 +28.291613,182.5279 +28.456546,19.7533 +28.357273,120.6194 +28.460180,18.9366 +28.248141,233.8436 +28.433937,49.3956 +28.387255,97.9776 +28.385364,100.4457 +28.394511,96.7110 +28.407616,84.4290 +28.372493,120.4016 +28.433156,61.1891 +28.444811,50.3090 +28.481985,16.7756 +28.324084,178.4889 +28.368949,136.6270 +28.477893,28.7495 +28.474142,34.4891 +28.476301,33.1144 +28.371597,142.7428 +28.386297,128.8290 +28.425761,93.8245 +28.429771,90.5360 +28.426425,95.9905 +28.371161,152.4247 +28.424281,99.9476 +28.509416,18.4714 +28.479118,53.4586 +28.514341,19.5139 +28.401078,135.5831 +28.492046,45.5059 +28.466615,73.4104 +28.442117,100.5234 +28.494346,49.6150 +28.485811,61.5555 +28.447453,101.3470 +28.462887,86.7385 +28.498762,55.3304 +28.485234,70.3881 +28.495121,64.0433 +28.491223,69.5938 +28.527889,36.7909 +28.547368,18.2088 +28.367691,199.0033 +28.392442,176.3780 +28.506644,62.7403 +28.554094,18.2011 +28.524230,52.1945 +28.559165,18.1467 +28.469430,110.2648 +28.483334,97.1818 +28.520308,64.2414 +28.540027,45.8548 +28.519587,68.6587 +28.568821,20.0033 +28.543962,47.8013 +28.468373,125.0635 +28.537553,58.0550 +28.405420,194.0099 +28.455811,144.3747 +28.584550,16.2180 +28.505577,97.4714 +28.565578,40.0633 +28.542642,63.9972 +28.533856,74.7110 +28.449428,161.0901 +28.588825,25.3364 +28.440137,178.0550 +28.569385,50.6742 +28.416484,206.2841 +28.560818,64.8863 +28.450655,175.5927 +28.566696,60.1410 +28.610520,16.9373 +28.600769,32.7817 +28.618193,20.3763 +28.383169,259.8394 +28.420686,223.1745 +28.548801,95.5746 +28.418508,226.4143 +28.532578,113.8881 +28.593437,54.8015 +28.579696,72.9393 +28.555623,98.0253 +28.564681,91.0153 +28.614162,44.7474 +28.411236,248.1622 +28.638571,21.8041 +28.264768,396.1314 +28.492896,170.3200 +28.572296,92.9853 +28.626249,40.6762 +28.585883,82.7478 +28.652637,19.2706 +28.606640,68.1604 +28.658911,16.8170 +28.659399,17.6042 +28.576425,102.9531 +28.620061,61.4709 +28.605643,78.4306 +28.467275,219.2248 +28.600187,89.1915 +28.675729,15.4706 +28.644377,49.3439 +28.608568,86.1054 +28.588247,110.1921 +28.681533,18.0062 +28.410091,293.4307 +28.643010,61.2919 +28.653649,51.7880 +28.431205,277.6099 +28.646467,63.1853 +28.515127,195.1665 +28.679379,35.9815 +28.446925,269.0250 +28.698440,18.5147 +28.703523,16.4259 +28.666926,57.2829 +28.603050,125.7858 +28.684074,45.5281 +28.591764,140.2278 +28.691201,41.6226 +28.648240,85.8706 +28.370059,364.6797 +28.633552,101.9208 +28.719951,21.3176 +28.677005,68.2805 +28.625705,120.1142 +28.694675,53.5508 +28.536662,212.5110 +28.668632,81.1353 +28.577314,175.3655 +28.580517,172.7284 +28.734112,20.6623 +28.626838,131.3974 +28.715951,43.2691 +28.595609,166.6934 +28.745286,19.1686 +28.663217,104.2642 +28.689379,79.0754 +28.699540,69.4932 +28.627458,145.5082 +28.704303,70.0668 +28.716956,59.5832 +28.671909,105.2665 +28.599431,180.4785 +28.622769,159.9431 +28.767483,18.3408 +28.759221,31.0423 +28.772968,18.6466 +28.665283,126.8869 +28.749768,43.5880 +28.709654,87.6351 +28.522417,276.9079 +28.710295,92.4689 +28.749174,54.4112 +28.764456,40.4233 +28.715362,90.3034 +28.790264,17.9752 +28.731994,78.7347 +28.752680,59.6571 +28.748227,66.1289 +28.758237,60.7498 +28.660900,158.8406 +28.705439,116.1890 +28.745820,80.3368 +28.734739,92.6131 +28.735474,93.4562 +28.808240,21.4273 +28.810730,21.1871 +28.774371,59.0303 +28.797290,39.5356 +28.508632,329.0244 +28.762304,75.8995 +28.818988,21.0177 +28.799326,44.5363 +28.826158,18.2614 +28.549627,299.5438 +28.782713,67.8564 +28.753246,98.7431 +28.693722,159.0283 +28.836827,18.1942 +28.821630,36.2644 +28.843863,16.0385 +28.523587,340.7498 +28.655698,209.2191 +28.502574,363.6087 +28.769034,100.4634 +28.792171,78.9869 +28.793357,80.5277 +28.724210,150.7697 +28.791615,83.9513 +28.850571,28.4248 +28.864338,15.1807 +28.829669,51.2542 +28.864918,19.5642 +28.869499,17.3403 +28.768456,122.9551 +28.803587,90.1951 +28.814357,80.2521 +28.660376,235.5023 +28.878996,18.9202 +28.779911,119.6764 +28.866184,34.5490 +28.851990,50.4781 +28.844421,60.9435 +28.819743,91.8453 +28.838205,75.5735 +28.875568,39.6628 +28.686501,229.8384 +28.776540,140.9902 +28.732825,189.8119 +28.828931,94.3695 +28.833403,92.4969 +28.880924,46.9290 +28.886840,47.7049 +28.857895,77.8210 +28.840007,96.8374 +28.674802,264.6003 +28.754775,186.7325 +28.451439,492.5925 +28.871159,74.6665 +28.893783,52.6706 +28.728837,222.5077 +28.917531,39.7065 +28.729604,229.4448 +28.939403,20.2047 +28.785824,176.0252 +28.941509,22.6946 +28.891412,73.9800 +28.708816,258.6801 +28.915232,53.6845 +28.911591,60.5968 +28.884483,88.6375 +28.874981,102.7445 +28.934546,43.7159 +28.935717,43.2048 +28.961851,17.9279 +28.967497,17.1774 +28.894610,92.0707 +28.973122,16.3247 +28.916341,76.3523 +28.977727,17.3762 +28.964205,32.2384 +28.805666,195.6499 +28.827354,175.3847 +28.972188,32.2734 +28.944033,64.6263 +28.895879,113.5991 +28.873886,136.3085 +28.905366,105.5822 +28.946455,67.9872 +28.995104,21.5283 +29.001318,18.7339 +28.913780,107.2006 +28.741269,280.2559 +28.899588,126.2824 +29.008660,17.7418 +28.979780,49.7329 +28.852751,177.3580 +28.989448,43.2486 +29.014443,19.1336 +28.644923,391.7300 +29.020053,17.3056 +28.879519,160.7247 +29.020982,20.1854 +28.923302,121.7640 +28.927854,118.6513 +28.957239,92.9228 +29.004464,46.6800 +28.777176,275.9075 +28.992695,63.3923 +28.902469,154.8387 +29.026403,32.2579 +28.959609,99.5961 +28.897918,164.2373 +28.945826,117.1567 +29.045067,19.3392 +29.050162,16.9084 +28.855022,216.6498 +29.058662,15.3625 +28.951346,124.0579 +28.936845,140.7005 +28.968918,111.0473 +28.978263,102.4500 +28.922638,158.6924 +29.016633,67.0309 +29.071673,16.6376 +29.057309,33.6035 +29.074025,18.9823 +28.900734,194.6793 +29.037359,61.9376 +29.079966,19.8674 +29.010949,92.0879 +29.025872,77.7501 +29.046507,60.6102 +28.984675,125.1968 +29.090914,19.8441 +28.986682,127.4652 +29.095415,22.5516 +29.010195,109.4453 +28.643861,477.7405 +29.059206,64.0501 +29.093009,30.7942 +29.064407,60.5033 +29.081331,47.3421 +29.110759,19.1418 +29.075405,55.7829 +29.080714,52.4096 +28.804881,332.3570 +29.033578,106.2541 +29.021526,119.6081 +29.032698,109.8362 +29.123257,20.5376 +29.009479,135.1718 +29.107118,42.3566 +29.133125,17.5435 +29.083665,70.9749 +29.002740,153.0989 +28.812338,345.0498 +29.053084,108.6299 +29.099834,63.3806 +29.036654,127.2631 +28.996444,173.2740 +29.121603,51.5606 +29.056088,121.2444 +29.129902,49.3776 +28.802765,377.0993 +29.088312,93.6050 +29.163216,19.2912 +29.143796,43.0609 +29.149476,39.9196 +29.124912,66.7026 +29.173165,21.7820 +28.965393,230.1187 +29.177334,18.7466 +28.831918,367.3544 +29.142535,59.5936 +29.067072,135.8900 +29.137239,67.4005 +29.131189,77.2977 +29.041168,170.6835 +29.195513,16.8993 +29.139833,74.8304 +29.051144,164.4195 +29.123804,95.5894 +28.959050,262.8123 +29.103038,119.4090 +29.181918,42.9980 +29.030110,196.1159 +29.191616,37.1973 +29.169720,60.7645 +29.194948,39.5972 +29.196081,39.3983 +29.161716,74.8242 +29.103623,135.9543 +29.208488,33.3900 +29.224917,17.5975 +29.179866,67.6146 +29.040245,210.3624 +29.199273,52.3337 +29.235481,17.0561 +29.155840,98.2392 +29.117967,137.7964 +28.925901,331.5841 +29.221864,39.0944 +29.128674,134.8916 +29.109873,154.2874 +29.157389,109.9576 +28.859903,407.9928 +29.154641,116.1430 +29.228814,44.6768 +29.214664,60.6177 +29.241879,37.3077 +29.150670,129.3142 +29.099298,181.8924 +29.202963,79.8424 +29.215565,70.4965 +29.267348,20.7484 +29.114148,178.3275 +29.144652,148.8426 +29.163918,130.2278 +29.275283,19.7487 +29.234546,64.6635 +29.267897,33.6688 +29.189397,114.7515 +29.257486,50.6162 +29.251608,59.6119 +29.252538,59.4225 +29.270785,44.1619 +29.239578,76.5653 +28.837657,481.5883 +29.263567,56.4197 +29.062984,257.9027 +29.179282,146.9249 +29.236541,91.2714 +29.279987,49.6583 +29.311221,19.7272 +29.282806,48.8432 +29.273492,61.6717 +29.286063,50.1422 +29.242516,95.5628 +29.219395,123.2883 +29.288097,56.3362 +29.301567,44.6331 +29.330949,18.0804 +29.254080,96.2458 +29.295033,56.7908 +29.255765,97.7592 +29.212413,143.0326 +29.202130,154.4892 +28.849172,510.9860 +29.204640,159.7287 +29.349031,16.1735 +29.316144,49.6409 +29.320887,46.7160 +29.304149,68.7072 +29.141135,234.6547 +29.119642,257.0364 +29.281192,97.3897 +29.360160,19.3189 +29.346201,37.9938 +29.364370,20.3825 +29.365206,20.0845 +29.365786,21.3819 +29.351824,37.9666 +29.299210,94.7583 +29.186858,208.9353 +29.378583,18.8486 +29.308103,90.8880 +29.319988,79.6299 +29.384196,16.6302 +29.292477,112.1099 +29.385291,19.8868 +29.389792,17.2046 +29.319247,93.2522 +29.331651,81.7043 +29.400827,15.1898 +29.182508,236.5953 +29.293496,128.5619 +29.329646,93.0338 +29.222448,203.0442 +29.336206,94.7608 +28.978923,452.8463 +29.395795,36.9656 +29.294147,140.5241 +29.062156,377.2208 +29.404588,37.4577 +29.226227,216.5360 +29.338080,105.4485 +29.260959,186.4841 +29.384754,64.7166 +29.327813,122.3918 +29.326208,125.1739 +29.279188,175.9635 +29.405179,53.1020 +29.442047,18.5939 +29.029514,431.7124 +29.372858,91.1256 +29.314948,151.3624 +29.311962,158.9684 +29.416018,55.6837 +29.430968,43.4797 +29.406998,68.7435 +29.458282,20.0695 +29.460641,19.7432 +29.461227,24.1923 +29.350327,138.5368 +29.451383,39.8461 +29.375792,116.2222 +29.399619,94.0539 +29.475742,18.7666 +29.398992,96.8430 +29.419105,79.7935 +29.478352,22.8522 +29.485421,21.3960 +29.431770,75.7139 +29.488865,20.1928 +29.439378,71.0417 +29.264162,246.7942 +29.450206,61.7407 +29.449471,63.2044 +29.387169,129.6185 +29.480386,39.4841 +29.356620,163.8416 +29.342684,180.5923 +29.353525,170.3419 +29.077547,447.1090 +29.507485,19.5988 +29.493674,38.7043 +29.412500,120.4770 +29.355447,181.2620 +29.247482,292.1209 +29.523277,17.1907 +29.524657,17.5896 +29.474449,69.0410 +29.230485,314.0616 +29.250609,297.6658 +29.422059,129.1688 +29.455153,97.7782 +29.520463,33.6762 +29.466313,93.0552 +29.542248,17.8851 +29.540469,22.3126 +29.397432,167.7760 +29.495837,71.0085 +29.463985,105.2471 +29.211853,361.7393 +29.443529,130.8448 +29.442765,132.5514 +29.367604,208.4054 +29.559370,18.1116 +29.565210,17.6900 +29.491230,92.7196 +29.523868,60.8848 +29.425493,164.2555 +29.543491,47.7615 +29.344434,249.0089 +29.544548,52.0498 +29.510957,88.5754 +29.539604,60.5319 +29.527085,73.7225 +29.569233,35.0395 +29.501205,106.3736 +29.552932,56.1953 +29.335165,277.2445 +29.470931,142.5254 +29.566846,47.1593 +29.510421,104.1095 +29.498899,118.7532 +29.532978,86.1210 +29.494510,127.0221 +29.548276,75.3609 +29.607580,19.1265 +29.506818,123.4756 +29.376680,255.1609 +29.379480,253.3546 +29.516789,118.4488 +29.591254,48.0809 +29.596599,45.0016 +29.599534,44.1496 +29.626708,17.6915 +29.631842,15.9924 +29.471703,177.6704 +29.619100,36.8173 +29.630294,28.3445 +29.614006,45.1543 +29.600137,59.8253 +29.573593,87.1029 +29.532379,132.1238 +29.589750,75.7644 +29.639336,26.7431 +29.647835,19.8966 +29.582901,86.2798 +29.519871,152.8528 +29.574375,99.3642 +29.658640,16.9284 +29.447444,229.6960 +29.643685,36.2222 +29.393970,286.9295 +29.584754,100.5111 +29.623638,64.5074 +29.593444,99.2671 +29.644400,49.8630 +29.509059,186.2101 +29.649375,48.4210 +29.666080,32.8528 +29.432762,266.9304 +29.679908,22.2817 +29.536710,169.3311 +29.688146,18.6775 +29.635238,73.0948 +29.613457,99.5279 +29.576011,138.8681 +29.655919,61.0287 +29.667733,50.8608 +29.617653,103.8657 +29.612410,112.1871 +29.672725,54.8748 +29.604274,123.8694 +29.712986,17.9012 +29.492015,242.5017 +29.680901,55.0382 +29.434672,302.5203 +29.721520,17.2885 +29.562783,179.1285 +29.698934,44.9235 +29.575317,172.1689 +29.730889,20.3553 +29.706825,45.1503 +29.718595,37.0123 +29.554140,202.0343 +29.641602,117.5905 +29.551229,208.6739 +29.422681,338.9422 +29.685266,79.1034 +29.708334,57.0618 +29.577483,191.6225 +29.735940,34.6478 +29.738810,32.4216 +29.702191,70.1634 +29.759193,16.9595 +29.759904,18.3260 +29.669182,112.4263 +29.706043,76.4717 +29.765397,18.1240 +29.600809,186.0931 +29.770589,19.6678 +29.699693,93.1370 +29.751245,42.6615 +29.583951,212.4085 +29.776154,20.8689 +29.660697,139.9488 +29.609128,193.9007 +29.632835,171.7314 +29.755608,50.1333 +29.786903,19.8650 +29.764371,46.2764 +29.695270,116.5130 +29.769106,44.3570 +29.714880,99.5371 +29.716948,98.5153 +29.761624,55.5204 +29.800647,18.8187 +29.778232,46.2946 +29.511948,313.3694 +29.694264,134.0875 +29.813465,17.3406 +29.734518,96.7871 +29.659963,174.3887 +29.819467,17.0709 +29.727601,111.0275 +29.783522,57.2169 +29.413356,430.7772 +29.512677,336.1511 +29.811784,38.0521 +29.810648,39.7983 +29.665515,187.5207 +29.797024,58.4369 +29.751976,106.1972 +29.792831,66.0639 +29.692713,170.5027 +29.614531,250.2948 +29.781609,86.7369 +29.675569,193.8866 +29.825319,46.9584 +29.741913,131.5226 +29.796360,77.6560 +29.840740,34.3183 +29.836540,39.7763 +29.844134,34.1791 +29.863216,18.4679 +29.868347,15.9015 +29.805742,80.7154 +29.806769,82.1428 +29.771232,119.1163 +29.828353,62.5595 +29.664504,229.0968 +29.756175,139.1291 +29.838629,60.4301 +29.673741,226.6340 +29.864827,36.7049 +29.884250,19.9899 +29.886459,18.4446 +29.869457,38.4118 +29.855462,55.0439 +29.858175,53.2464 +29.893602,21.8442 +29.899061,16.9126 +29.876317,40.6413 +29.804568,112.9700 +29.830807,88.3678 +29.724599,197.8400 +29.904904,18.5938 +29.907870,17.9848 +29.881685,51.8883 +29.782516,153.0564 +29.814418,121.9321 +29.824527,113.1217 +29.890914,48.0615 +29.659161,286.0197 +29.790258,155.6502 +29.890350,57.6036 +29.895306,54.1170 +29.933575,16.4559 +29.831306,122.9300 +29.872278,83.8172 +29.677141,282.1580 +29.817146,147.6521 +29.949424,16.9257 +29.873437,93.4858 +29.875059,93.4025 +29.911422,58.0453 +29.849838,122.8767 +29.772355,202.9553 +29.803030,173.0979 +29.621534,359.7484 +29.964800,18.1419 +29.743859,240.2063 +29.925856,58.8397 +29.853037,135.7051 +29.915974,74.2515 +29.915448,75.3935 +29.737194,256.7891 +29.950032,45.9803 +29.917539,79.9023 +29.982943,18.3246 +29.919176,85.7791 +29.976129,30.7240 +29.956096,53.4298 +29.954237,56.3992 +29.935574,76.0556 +29.972715,41.8159 +29.997442,18.2234 +29.560134,456.9267 +29.984066,37.8303 +29.834353,192.0019 +29.966350,61.7860 +30.009527,19.9127 +29.910507,119.6034 +29.815465,218.3241 +29.938977,96.2991 +29.945182,91.6381 +29.996013,45.2463 +30.026356,15.4786 +29.966923,77.8743 +29.697797,350.2371 +29.945909,102.8655 +30.014532,36.3441 +29.993984,59.0747 +29.990842,64.1726 +29.936351,120.2851 +30.041260,15.8957 +30.041836,20.2991 +29.975312,87.5594 +29.848829,216.7260 +30.029441,37.1716 +30.048035,19.3915 +29.959300,114.8993 +29.916959,158.4674 +29.888913,187.3521 +29.923499,153.4317 +30.056638,25.6846 +30.017062,65.8940 +29.981283,102.4796 +29.874017,214.5586 +29.728144,362.0497 +30.030111,60.6476 +30.048776,45.5678 +30.033790,63.6216 +30.010637,87.7906 +30.082323,17.1414 +30.062136,39.0684 +29.850447,251.5067 +30.057157,49.5460 +30.090195,17.0336 +29.793908,314.6965 +30.090760,19.2034 +30.044799,70.3607 +30.074201,44.2329 +30.098428,21.0008 +29.968463,151.6187 +30.028138,92.6492 +30.075428,50.7640 +29.990227,137.8445 +29.901534,227.6291 +30.067428,64.4880 +30.062873,70.8370 +30.004956,130.1352 +29.922440,215.4299 +29.858896,281.3223 +30.107230,36.0086 +29.947955,199.5848 +30.115161,32.9872 +30.133711,15.2427 +30.135092,16.2544 +30.101955,50.4196 +30.088577,68.7351 +30.036822,121.0761 +30.094345,67.2425 +30.055016,107.2321 +30.143240,22.0108 +30.050878,114.9019 +30.099466,69.3046 +30.053060,116.4742 +30.083764,88.6555 +30.006854,166.5708 +30.151348,22.6365 +30.035277,140.9958 +30.119430,59.9691 +30.162249,18.0203 +30.165781,17.3959 +30.021898,161.8482 +30.131917,54.4973 +29.904241,287.4215 +29.900376,292.0754 +30.101206,94.6758 +30.120788,76.2739 +29.747488,451.6462 +29.988744,211.2025 +29.984697,215.9101 +30.137871,68.1608 +30.140220,70.1099 +30.183747,29.1194 +29.878314,337.5241 +30.168772,50.1998 +30.126193,93.3798 +30.011630,210.0827 +30.186415,37.8719 +30.066614,158.4621 +30.106704,119.4715 +30.210332,17.5101 +30.215839,16.7049 +30.161588,73.5051 +30.129164,107.7947 +30.165252,73.5942 +30.192452,47.8400 +30.065564,178.7439 +30.157313,88.1465 +30.227843,18.2459 +30.147541,103.4486 +30.235094,16.5226 +29.937650,317.0603 +30.109964,148.5573 +30.152376,106.7156 +30.076932,183.4175 +30.199947,63.5784 +29.969468,295.2929 +30.200608,66.4334 +30.179400,93.0486 +30.244310,29.1978 +30.246090,29.8118 +30.219574,58.0913 +30.173426,106.0788 +30.001269,278.8260 +30.172421,109.0968 +30.218972,63.2179 +30.199135,86.9635 +30.221714,66.0344 +30.267042,25.2745 +30.015667,279.1724 +30.169535,126.3660 +30.097413,202.1915 +30.225077,75.1192 +30.236959,63.9139 +30.183178,119.5099 +30.258523,46.7701 +30.281518,28.0583 +30.292318,19.9191 +30.286100,34.1788 +30.264762,57.6257 +30.254711,68.2756 +30.238847,88.6480 +30.128072,200.0127 +30.157899,172.3038 +30.224288,108.0703 +30.282191,51.9318 +30.300874,36.5582 +30.197063,141.9038 +30.176274,164.0284 +30.320280,20.5809 +30.120083,224.8093 +30.327497,17.9261 +30.191664,157.0054 +30.295902,54.0644 +30.245461,106.5331 +30.263527,92.1168 +30.338968,17.2761 +30.300197,57.0261 +30.302689,57.4691 +30.195882,167.7884 +30.251618,112.8450 +30.148955,220.9811 +30.312239,58.7016 +30.240293,131.7758 +30.340863,31.9710 +30.180271,196.2354 +30.280096,98.3796 +30.287750,93.7075 +30.294840,87.2724 +30.330204,56.3389 +30.148150,239.5456 +30.232545,159.4679 +30.272450,124.0168 +30.212867,185.4530 +30.378477,21.2780 +30.360159,44.8947 +30.348670,57.3442 +30.363672,42.9402 +30.309578,97.6439 +30.387697,20.3930 +30.250990,159.8977 +30.370941,43.9995 +30.259093,158.6544 +30.356245,64.8472 +30.279506,142.8916 +30.405055,19.4545 +30.349968,75.9230 +30.275903,151.0269 +30.206034,224.3508 +30.277666,158.9124 +30.406613,31.7950 +30.332360,106.6484 +30.376508,64.1606 +30.399756,45.2223 +30.076266,370.3625 +30.406016,41.4499 +30.408091,42.4247 +30.345424,106.1777 +30.414942,39.1904 +30.425892,31.0600 +30.299606,158.5948 +30.386544,74.2253 +30.392015,73.2342 +30.436580,29.4579 +30.422399,49.0944 +30.454134,18.3571 +30.337434,137.0755 +30.456953,18.9724 +30.396468,86.2041 +30.421094,62.8038 +30.328086,156.8053 +30.322389,163.3609 +30.305295,184.0479 +30.446630,43.6779 +30.108605,383.3851 +30.369937,122.8529 +30.424511,72.5159 +30.444979,55.3364 +30.381459,119.8215 +30.118435,383.3988 +30.322988,179.4099 +30.482674,24.6857 +30.451603,56.5105 +30.489344,19.3317 +30.458202,51.8116 +30.398322,116.9501 +30.173986,342.3917 +30.465250,51.8024 +30.438410,81.1086 +30.501281,19.5386 +30.485751,38.7131 +30.226177,299.5625 +30.334124,195.6367 +30.474511,56.5098 +30.475927,61.2772 +30.344894,193.3070 +30.372070,166.8081 +30.382114,157.4555 +30.440669,102.7338 +30.357224,188.1454 +30.355645,190.3656 +30.531021,17.1951 +30.502399,52.7263 +30.273509,282.4373 +30.407223,151.9049 +30.520821,39.1463 +30.410889,150.3974 +30.529762,32.1403 +30.543404,19.1341 +30.500317,68.3623 +30.510014,60.8889 +30.260350,312.2572 +30.517054,58.8402 +30.555127,22.8991 +30.484893,94.2386 +30.351995,230.4436 +30.492791,93.2989 +30.450516,139.4754 +30.548217,42.8204 +30.519519,72.1081 +30.575895,18.0221 +30.546012,51.4404 +30.340303,259.2264 +30.538879,61.3517 +30.538202,63.1515 +30.497028,108.8546 +30.555947,53.1595 +30.447467,165.6981 +30.430386,183.6059 +30.561904,53.0390 +30.597453,18.4217 +30.426931,192.3806 +30.524465,96.9493 +30.466039,156.7383 +30.082957,540.4813 +30.609108,19.3218 +30.490309,138.7300 +30.578028,54.3799 +30.601355,36.2381 +30.501835,138.6573 +30.483899,157.1915 +30.605884,36.0070 +30.568681,76.1091 +30.508114,137.4779 +30.507361,139.8909 +30.629040,19.2307 +30.632409,19.1676 +30.471496,184.1291 +30.364464,295.2832 +30.640493,20.0782 +30.570905,91.6447 +30.561288,103.3561 +30.644791,21.2324 +30.586091,82.2502 +30.525740,143.6137 +30.417748,255.9238 +30.516378,158.6674 +30.655627,22.0734 +30.614944,65.4927 +30.562540,121.0945 +30.508676,176.1135 +30.623439,63.7425 +30.591628,98.8312 +30.460770,230.4608 +30.439010,256.0466 +30.621416,74.7394 +30.600232,96.9523 +30.680438,18.9803 +30.582440,117.7323 +30.683635,21.5786 +30.579133,128.8442 +30.572609,137.1737 +30.545371,165.1977 +30.619312,92.9476 +30.472492,241.3500 +30.648273,66.7571 +30.700173,19.2287 +30.559968,160.4501 +30.613166,108.5028 +30.615876,109.4888 +30.641092,85.5322 +30.372835,357.1444 +30.713843,17.8667 +30.715031,19.0250 +30.589993,147.8495 +30.599531,139.0930 +30.659749,85.1378 +30.726625,20.6978 +30.662551,87.5429 +30.669355,82.9409 +30.675047,78.2553 +30.666025,88.6527 +30.651577,103.6886 +30.737843,20.8759 +30.593918,167.9927 +30.744888,17.5942 +30.537205,229.7190 +30.747325,20.4259 +30.559129,210.0345 +30.673673,100.0455 +30.660574,114.1153 +30.734057,41.6262 +30.697186,81.9100 +30.645594,134.2556 +30.761912,18.4827 +30.762483,23.2551 +30.766926,19.7414 +30.699419,88.0683 +30.721670,70.0471 +30.628431,164.8589 +30.491992,305.6518 +30.684791,114.1912 +30.664645,135.2761 +30.687183,114.8734 +30.647253,155.7253 +30.696156,107.4417 +30.707978,99.8813 +30.767752,41.0483 +30.791718,17.9658 +30.709783,102.9321 +30.729981,87.4844 +30.802979,15.8045 +30.807860,14.2140 +30.719403,103.9749 +30.705215,120.7684 +30.812717,15.7592 +30.758720,72.6654 +30.793291,46.0783 +30.637594,202.7106 +30.822075,18.8155 +30.798983,42.9850 +30.769164,79.6592 +30.750094,99.5062 +30.779097,71.0644 +30.731711,119.0857 +30.622778,228.9132 +30.797645,59.7380 +30.818785,41.2479 +30.808801,52.4320 +30.720419,143.9445 +30.799922,65.4638 +30.785739,80.2893 +30.515273,353.4432 +30.591039,278.9021 +30.695058,176.9469 +30.779850,96.9764 +30.850162,29.4695 +30.754679,125.8642 +30.839371,46.8629 +30.864365,22.7233 +30.817466,70.6395 +30.780396,111.6728 +30.787489,108.9485 +30.861234,36.6241 +30.866030,32.7169 +30.613993,287.9492 +30.809685,96.1069 +30.710570,196.0696 +30.825984,83.2420 +30.892070,18.0219 +30.691232,224.2585 +30.668342,249.6342 +30.879632,40.4679 +30.712261,209.1678 +30.888107,37.4616 +30.857385,69.7256 +30.786668,140.8320 +30.848825,80.3118 +30.906640,27.3710 +30.869942,65.1149 +30.920102,15.7931 +30.901943,36.9907 +30.539571,402.0475 +30.909228,33.3800 +30.831387,112.4741 +30.898748,46.0289 +30.929138,19.0279 +30.934013,17.6851 +30.851693,103.0861 +30.876827,80.7110 +30.938935,19.7004 +30.941619,19.6537 +30.860034,102.6872 +30.905792,60.0436 +30.752297,214.4920 +30.951699,17.4592 +30.840306,132.3201 +30.954780,18.8940 +30.755267,223.2519 +30.961274,18.6575 +30.802057,179.8266 +30.921431,62.9240 +30.872006,115.4058 +30.738625,249.4520 +30.773720,215.7315 +30.972627,18.2996 +30.775685,223.5507 +30.850798,150.2629 +30.774690,229.1832 +30.803599,201.3067 +30.957540,49.3861 +30.944777,62.9027 +30.910093,98.2933 +30.942609,68.1753 +30.973675,42.2624 +30.887089,132.0022 +30.965837,56.1079 +30.962722,61.9877 +30.979932,45.4143 +30.897859,128.3087 +30.823379,205.8657 +30.935896,94.1567 +30.990928,41.1445 +30.988078,46.1689 +31.006927,28.9495 +31.019093,18.7088 +31.024710,16.3232 +30.896438,145.9830 +30.984355,59.8622 +31.029246,18.5968 +30.981885,66.5539 +30.690461,359.3924 +30.978520,72.7901 +30.849602,205.2835 +30.828477,228.7086 +31.041035,16.8011 +31.042422,18.5750 +30.753303,312.2926 +31.003875,62.5644 +31.015938,53.4049 +30.935058,135.3342 +30.840892,234.9384 +31.044219,32.9284 +31.051311,26.7360 +31.026169,55.0481 +30.886235,197.9350 +30.915492,170.1968 +30.927500,160.2056 +31.008388,82.3609 +31.030054,63.3506 +31.021946,75.1600 +31.057837,40.4830 +31.047844,56.3473 +31.010787,94.3615 +31.025347,81.5114 +30.966790,145.6049 +31.065597,50.0513 +31.093406,22.8622 +31.034248,85.9078 +31.037802,83.9967 +31.085690,39.0464 +31.077148,48.3822 +31.078048,50.4545 +30.999236,130.0761 +31.032073,98.1538 +30.868717,265.1045 +31.048440,87.0452 +30.641892,495.0649 +31.066440,74.1324 +31.090750,51.0990 +30.943862,201.8635 +30.948167,198.3711 +31.035877,113.6749 +31.121800,31.6525 +30.989453,165.1709 +31.115649,39.5829 +31.141850,17.1493 +31.081218,84.8577 +30.917978,248.9392 +31.124737,42.7587 +31.112396,55.9784 +31.075831,93.2862 +30.927111,247.0928 +31.125532,51.5254 +31.145727,32.4026 +31.070394,112.0236 +31.087707,96.5126 +31.106860,78.7854 +30.880544,309.8500 +31.060999,133.0899 +31.130228,64.4385 +31.154624,42.2303 +31.128504,69.0789 +31.133823,67.5044 +30.841969,359.9120 +30.865387,337.8040 +31.182418,22.3714 +31.185647,20.8859 +31.169119,41.2065 +31.167496,43.4493 +31.190395,21.6445 +31.196856,20.6784 +31.166077,53.0668 +31.084171,137.0642 +31.129313,96.5967 +31.197584,29.3523 +31.210326,17.1778 +31.097107,131.3045 +31.210947,18.1078 +31.155233,75.7558 +31.120157,115.7135 +31.105150,131.6772 +30.925569,314.4032 +31.116270,125.2401 +31.069344,175.0285 +30.958637,287.9396 +31.219145,30.1789 +31.194668,58.0479 +30.677701,575.8622 +31.149553,104.6172 +31.135487,120.1640 +31.217535,41.2837 +31.194089,65.8374 +31.244374,17.0077 +31.249325,17.0511 +31.203192,66.3194 +30.725366,545.7786 +31.255652,16.8570 +31.201328,72.8645 +31.104192,175.4748 +31.140574,140.4321 +31.221237,61.3146 +30.987413,300.9079 +31.271145,17.7898 +31.236828,55.2521 +31.201882,90.8324 +31.057187,239.0792 +31.177059,121.9772 +31.246578,53.2329 +30.969160,332.3757 +31.253565,50.5941 +31.288936,17.0753 +31.272510,39.1316 +31.228413,84.0654 +31.282552,32.5377 +31.235872,82.7982 +31.266377,54.6705 +31.227505,94.3465 +31.225911,97.1868 +31.301537,25.4261 +31.206534,123.9794 +31.259928,73.4446 +31.315092,18.8922 +31.230990,104.9953 +31.226937,110.9955 +31.184221,156.5436 +31.299037,43.5091 +31.001061,344.0886 +31.212041,135.9841 +31.281006,68.6759 +31.004907,345.3537 +31.049854,303.9330 +31.258820,95.7977 +31.269513,86.5729 +31.304160,54.7480 +31.342547,20.4012 +31.239974,129.3956 +31.350262,19.7036 +31.241511,129.7338 +31.166919,210.8571 +31.288322,90.2260 +31.229056,150.1041 +31.159001,220.7596 +31.321049,62.0735 +31.333985,51.5524 +31.153454,232.7260 +31.323099,63.7296 +31.252717,139.7507 +31.306013,87.9441 +31.337934,58.0900 +31.335986,61.8160 +31.340766,59.1245 +31.146539,254.6262 +31.311643,92.7632 +31.378549,29.4168 +31.369370,41.5898 +31.393958,18.2354 +31.396025,16.8291 +31.279669,137.6834 +31.261382,157.3952 +31.404407,17.0338 +31.168376,257.1331 +31.345151,80.9699 +31.410961,16.5926 +31.412194,16.0064 +31.412855,16.9313 +31.321853,115.2920 +31.377777,60.3939 +31.348026,90.8017 +31.386181,53.7304 +31.428202,16.4555 +31.098323,347.4840 +31.333374,113.5085 +31.369966,82.3923 +31.312480,145.6757 +31.418779,41.5393 +31.330515,131.0865 +31.274195,188.2403 +31.349683,113.6382 +31.444658,24.3403 +31.392468,78.4005 +31.417353,54.8545 +31.426122,46.8206 +31.385538,91.9874 +31.354618,123.4559 +31.371246,107.4046 +31.458156,21.7599 +31.386830,97.8398 +31.437146,49.1117 +31.399891,86.9570 +31.407967,81.9959 +31.358909,132.3952 +31.353788,141.8181 +31.477527,18.6168 +31.254171,242.8275 +31.178131,319.4533 +31.478076,20.7539 +31.379761,122.6290 +31.174205,329.9369 +31.401167,108.9773 +31.446884,65.8482 +31.326964,186.7865 +31.495607,19.4804 +31.429787,86.8980 +31.362950,156.3623 +31.292716,227.1888 +31.439912,82.4892 +31.502391,21.0419 +31.460319,69.2036 +31.356087,174.1727 +31.318672,212.6021 +31.054887,479.6000 +31.516686,20.1441 +31.204791,333.7376 +31.299811,241.4030 +31.498830,43.9037 +31.479917,64.0511 +31.491305,56.0669 +31.512733,35.8985 +31.530261,21.4483 +31.519313,35.5338 +31.510145,45.4900 +31.478651,81.4604 +31.438829,124.0065 +31.292081,271.8514 +31.379161,185.6812 +31.461603,105.1354 +31.497585,71.7407 +31.472944,98.3748 +31.554848,18.7285 +31.548633,29.7640 +31.472209,106.8541 +31.523434,58.9429 +31.486849,96.1475 +31.534488,51.4718 +31.513752,76.3058 +31.486259,104.9066 +31.547373,44.8834 +31.469000,125.0647 +31.555636,42.3633 +31.579064,20.7198 +31.421442,179.7514 +31.462436,141.9554 +31.383123,223.9087 +31.543970,66.8259 +31.425510,185.9212 +31.538530,74.2477 +31.296267,318.0634 +31.438172,177.2440 +31.571320,46.7648 +31.582378,41.3008 +31.578398,48.7439 +31.566740,61.3110 +31.452361,182.8338 +31.560113,76.6474 +31.562837,74.5976 +31.590059,48.2643 +31.470870,170.1090 +31.563934,79.4944 +31.627144,17.5205 +31.628052,18.5896 +31.614332,38.6774 +31.136958,516.6994 +31.504143,150.0815 +31.610797,47.5945 +31.640980,17.9320 +31.529524,131.4666 +31.445808,217.5808 +31.644665,19.5460 +31.463323,202.5679 +31.592258,74.2349 +31.604392,66.4989 +31.638324,33.1531 +31.653010,22.2980 +31.658392,17.9944 +31.658913,18.0199 +31.536831,143.0000 +31.660992,20.7096 +31.611433,71.8010 +31.615417,71.8181 +31.541216,147.4605 +31.489964,200.4823 +31.007681,684.0993 +31.607033,85.6804 +31.531275,162.8198 +31.666494,30.9313 +31.679832,19.8084 +31.654226,46.7580 +31.670892,34.0738 +31.601195,104.3096 +31.582998,124.7275 +31.676934,34.9534 +31.635196,78.6002 +31.497000,217.3620 +31.594066,121.5924 +31.697426,20.2342 +31.704967,20.8167 +31.664213,62.3204 +31.542736,184.7226 +31.705505,22.7535 +31.599785,133.5691 +31.692714,41.5529 +31.636761,98.1045 +31.714363,21.7568 +31.711888,25.0240 +31.573578,167.0593 +31.725785,16.6849 +31.665892,77.6207 +31.699642,49.6383 +31.713797,36.2626 +31.496144,254.8248 +31.683235,69.0075 +31.427555,327.8263 +31.707726,50.0996 +31.671478,86.9532 +31.717662,41.8641 +31.618086,143.6939 +31.637435,128.3412 +31.519905,247.5301 +31.688677,84.0173 +31.591167,184.9182 +31.612779,164.3326 +31.397803,383.5511 +31.761781,20.2249 +31.694096,91.2905 +31.752243,35.7037 +31.522403,267.0815 +31.750970,39.7653 +31.653658,138.6530 +31.740639,54.9675 +31.776086,20.5955 +31.758432,40.0291 +31.742471,57.5569 +31.623680,177.8936 +31.676388,127.1789 +31.772696,37.2570 +31.795607,16.7559 +31.569327,244.5326 +31.681703,132.9870 +31.759527,56.2663 +31.727460,89.7867 +31.800029,19.1550 +31.643430,179.0490 +31.792312,32.4603 +31.734867,92.7166 +31.812364,15.8218 +31.813861,18.2983 +31.691781,206.8955 +31.484671,414.9464 +31.690448,211.9756 +31.734269,170.6052 +31.551710,353.8543 +31.827585,79.9286 +31.832160,79.5648 +31.767437,145.8793 +31.803568,114.4591 +31.598001,320.5767 +31.902425,18.4975 +31.736121,186.1281 +31.789485,135.6448 +31.790737,136.5988 +31.801575,127.2978 +31.777113,153.1134 +31.913317,20.3538 +31.918029,18.7110 +31.920923,17.6903 +31.817248,128.1985 +31.899619,47.3264 +31.905566,43.2423 +31.715660,234.3566 +31.743514,208.2942 +31.936741,15.6896 +31.904876,49.1651 +31.938614,17.7254 +31.925132,36.6993 +31.564843,398.6817 +31.585961,381.3856 +31.785387,184.2830 +31.796682,175.6660 +31.928874,45.7949 +31.757827,217.4779 +31.687236,289.4419 +31.945447,33.3504 +31.675309,308.7185 +31.918578,68.3719 +31.765778,222.2519 +31.967347,21.5368 +31.946947,45.9836 +31.646643,346.8676 +31.663390,333.5924 +31.750061,248.4190 +31.927336,72.7304 +31.930228,70.6553 +31.922251,81.9091 +31.787948,219.3218 +31.952432,55.4928 +31.961832,47.9000 +31.992932,19.5007 +31.976679,42.1517 +31.950018,69.7470 +31.972350,48.0512 +31.822480,198.9833 +32.004161,19.8056 +31.933672,90.8665 +31.996983,33.2955 +31.726535,304.7319 +31.798462,235.3388 +31.974670,60.6401 +31.993512,43.2755 +31.954042,86.6479 +31.984030,57.2409 +32.024540,18.4554 +31.978799,65.8709 +31.963526,84.1292 +32.000068,49.0754 +31.733356,318.2424 +31.956341,97.1164 +31.749282,306.0387 +31.907515,148.7322 +32.040691,18.9325 +31.951809,110.8520 +32.036788,29.7774 +31.814691,254.7990 +32.023968,47.2151 +32.035311,38.2810 +31.898680,178.9568 +31.824774,253.8601 +31.515089,564.3715 +32.059625,24.3323 +31.700985,385.0270 +32.018832,68.5319 +32.049145,39.0818 +32.044671,46.7482 +31.988030,103.9997 +31.969672,123.3891 +32.069492,26.2317 +32.031268,70.6427 +31.736914,366.7848 +31.948809,157.1743 +32.007271,100.4573 +32.091421,16.8701 +32.092031,16.8745 +32.009733,100.7458 +31.975306,136.5551 +32.000884,115.2082 +32.021464,97.0842 +32.071185,49.9806 +32.103699,18.0688 +32.105985,19.6938 +32.020402,106.2614 +32.053459,77.7939 +32.088228,44.8202 +31.809954,324.8950 +32.042996,92.6321 +32.030280,107.4369 +32.073594,65.5232 +32.121769,19.6417 +32.107730,36.9850 +32.078635,68.3710 +31.998481,149.5297 +31.911726,239.3276 +31.728260,427.6105 +32.055321,103.1136 +32.056248,105.3492 +32.062663,102.5016 +32.111862,55.5991 +32.019766,148.3339 +32.051599,117.5382 +32.121167,51.1742 +32.151055,25.3942 +32.155872,23.1278 +31.755383,428.1882 +31.986952,198.0167 +32.165165,21.4000 +31.815794,373.3913 +32.158437,31.6521 +32.134850,56.6052 +31.781356,411.1047 +32.137718,55.3830 +32.141412,54.6899 +32.176450,20.2048 +32.168101,33.9505 +32.147007,55.5944 +32.183572,20.6939 +32.139118,66.3160 +32.133049,75.2264 +32.189187,19.6686 +31.988885,222.9843 +32.033802,178.6931 +31.819185,395.7715 +32.161599,54.0626 +32.202603,16.8954 +32.079461,141.6137 +32.047656,176.7626 +32.208277,18.4428 +32.041272,190.3807 +32.012433,220.5692 +32.131254,102.5035 +32.118550,116.1551 +32.135629,105.5262 +32.144716,98.8290 +32.108292,137.4404 +32.126665,119.7775 +31.782007,469.6406 +32.095725,157.6319 +32.190090,65.2644 +32.186566,74.3069 +32.233004,28.7671 +32.083958,180.9981 +32.116094,149.9541 +32.148012,118.6515 +32.205436,63.2864 +32.251649,18.7532 +32.221077,52.5943 +32.108907,167.7633 +32.212497,65.8740 +32.260874,19.2649 +32.101912,182.3436 +32.226721,62.1079 +32.241157,49.4246 +32.007926,283.2773 +32.086013,206.6141 +32.167463,126.4497 +32.169138,127.9270 +32.204268,95.6665 +32.284257,19.0948 +32.179001,129.8581 +32.233758,75.9353 +32.243547,69.0956 +32.280140,34.6503 +32.246445,70.1189 +32.215663,102.7421 +32.191456,129.7199 +32.193102,129.0470 +32.224420,100.9651 +32.066567,259.3938 +32.312643,19.6133 +32.214958,119.4428 +32.266665,68.5142 +32.208857,127.9414 +32.273672,64.4001 +32.303353,39.4233 +32.202052,142.7231 +32.297066,50.2969 +32.325386,22.6368 +32.309695,43.7855 +32.087365,266.6947 +32.332258,22.4175 +32.278372,78.6593 +32.077638,284.0141 +32.344777,18.4974 +32.299936,65.1858 +32.093062,273.1082 +32.342777,26.0087 +32.353482,16.0536 +32.291204,80.1121 +32.354061,19.9351 +32.290583,86.2606 +32.219499,158.9544 +32.196656,184.9771 +32.336800,48.2709 +32.276671,109.3845 +32.368787,17.8975 +32.231654,156.6732 +32.261772,130.1318 +32.376844,17.0594 +32.266049,130.2538 +32.381634,18.5910 +32.184970,215.7921 +32.270404,130.8714 +32.322150,80.1625 +32.192462,214.7927 +32.125680,283.1020 +32.335181,74.1447 +32.316565,96.4194 +32.347364,66.3322 +32.234706,182.1419 +32.314792,102.8950 +32.400763,18.4595 +32.386685,33.6581 +32.292628,131.8814 +32.385072,42.3051 +32.393905,36.2583 +32.338074,95.6654 +32.361653,72.6004 +32.255356,182.2800 +32.365123,74.5257 +32.424512,17.2277 +32.366171,76.5584 +32.396304,47.0038 +32.401276,47.3946 +32.369536,79.7352 +32.363275,86.9362 +32.433741,18.0711 +32.318407,138.3451 +32.416849,40.4123 +32.439649,18.2710 +32.412985,48.4354 +32.172342,290.0561 +32.402313,61.8395 +32.371318,95.9517 +32.409327,59.2526 +32.321178,149.3389 +32.348024,123.7072 +32.456754,17.3440 +32.196103,279.3484 +32.391905,85.1641 +32.461422,16.7153 +32.407255,74.9001 +32.417688,66.7182 +32.354676,133.4676 +32.434255,54.8300 +32.474099,15.5312 +32.450212,40.7025 +32.325962,170.6873 +32.449273,48.4389 +32.253358,246.3384 +32.388328,112.1012 +32.268723,236.6602 +32.427380,78.5847 +32.489631,20.3627 +32.408783,104.0060 +32.110480,405.3880 +32.334402,184.2936 +32.462399,56.8999 +32.288830,232.2416 +32.441741,80.6277 +32.505384,18.1030 +32.505966,21.4048 +32.437637,91.5207 +32.478138,52.0578 +32.451813,80.3127 +32.448672,84.3613 +32.500431,35.6354 +32.518697,18.2243 +32.373998,167.9717 +32.457921,86.8693 +32.471732,74.2664 +32.477070,71.7052 +32.245734,304.1055 +32.515870,35.1069 +32.536922,17.4402 +32.509995,46.1431 +32.512790,47.4103 +32.527372,33.5838 +32.413698,151.9863 +32.522370,45.8042 +32.430165,139.3792 +32.521073,50.3308 +32.499697,72.3036 +32.468581,105.6612 +32.357033,219.8905 +32.560957,18.0557 +32.565685,17.9273 +32.400226,184.0141 +32.532127,53.1950 +32.546000,40.9036 +32.443309,146.9747 +32.574244,16.6468 +32.529159,66.2821 +32.467270,128.9139 +32.293914,304.6068 +32.584242,19.4460 +32.496651,111.2762 +32.569545,40.0614 +32.554363,56.9809 +32.571405,42.6379 +32.523489,91.8073 +32.579013,39.5598 +32.490916,128.2248 +32.386057,235.0388 +32.586904,35.7581 +32.378455,249.2257 +32.530197,100.3106 +32.603689,30.3424 +32.442730,193.9768 +32.621097,16.8216 +32.475453,164.7673 +32.590285,50.5196 +32.419223,223.1231 +32.519300,124.8123 +32.488145,156.8419 +32.544792,106.0079 +32.607928,44.0623 +32.634033,18.8411 +32.636708,20.0985 +32.595442,61.8571 +32.637920,21.0050 +32.583614,77.2509 +32.211871,450.1159 +32.611345,53.4879 +32.572002,93.3999 +32.590892,77.9207 +32.548776,122.1811 +32.650801,20.6840 +32.656808,17.3455 +32.615297,59.7194 +32.657301,18.9964 +32.596185,82.6335 +32.536067,147.4189 +32.541971,142.0999 +32.533035,153.6025 +32.497713,190.3591 +32.598521,91.1707 +32.568175,125.0474 +32.678820,17.1761 +32.420345,279.7059 +32.576924,124.4037 +32.484407,220.1101 +32.644989,60.4745 +32.668814,38.0305 +32.550978,159.5989 +32.627682,83.5194 +32.675018,41.0676 +32.700051,17.7700 +32.652875,67.9490 +32.688073,33.4330 +32.642347,80.1628 +32.704518,18.7741 +32.705464,23.6804 +32.674154,58.4729 +32.716086,18.6514 +32.664834,70.7598 +32.717822,18.6961 +32.720825,18.1711 +32.609608,130.0164 +32.701329,41.6149 +32.482157,262.8594 +32.676298,72.3994 +32.549840,199.3675 +32.585323,164.4390 +32.619142,131.1901 +32.738997,15.7048 +32.693224,65.8229 +32.742945,17.2433 +32.710578,50.2202 +32.689694,73.0750 +32.264957,499.0148 +32.734739,31.3316 +32.457263,313.2323 +32.754703,17.4775 +32.745017,33.4056 +32.736520,42.8421 +32.711202,70.2695 +32.671486,112.3906 +32.670958,114.8862 +32.739625,49.6055 +32.770496,19.7108 +32.748699,43.0892 +32.721507,74.4899 +32.778425,19.1273 +32.779363,19.9256 +32.760799,42.4329 +32.308860,496.4568 +32.735595,70.2627 +32.763973,42.6777 +32.695997,115.8140 +32.772182,40.2160 +32.640806,172.3530 +32.683487,130.9722 +32.489086,326.0259 +32.797553,18.4895 +32.723293,98.9806 +32.806652,18.0242 +32.790208,38.1082 +32.785846,43.1969 +32.759048,70.5684 +32.686638,145.2071 +32.749763,83.3856 +32.614044,223.1722 +32.791789,46.5386 +32.799290,42.2419 +32.706845,135.6359 +32.661988,182.1342 +32.828317,16.8735 +32.831846,16.5378 +32.833150,17.0852 +32.762770,88.7734 +32.829044,24.9089 +32.732629,125.3064 +32.760189,100.4955 +32.630509,231.7236 +32.556139,306.8631 +32.684071,180.4675 +32.848385,17.4683 +32.644113,223.8274 +32.853954,19.2975 +32.640221,238.1628 +32.766072,113.1671 +32.658926,220.8645 +32.838329,44.0779 +32.789232,94.4179 +32.783878,105.8932 +32.803233,87.1289 +32.622664,268.5097 +32.842483,49.5828 +32.837217,58.1113 +32.822275,74.1069 +32.618574,278.3572 +32.882408,18.1894 +32.851545,52.6348 +32.850236,55.1245 +32.865854,41.7696 +32.873253,37.2462 +32.811812,99.9655 +32.824678,88.8005 +32.795998,119.4861 +32.651991,264.2775 +32.781474,137.5671 +32.845192,74.6027 +32.904181,17.5226 +32.470518,454.7733 +32.907625,18.7550 +32.829617,100.1958 +32.891174,40.0626 +32.896383,40.9841 +32.900599,37.4358 +32.665403,273.2665 +32.925292,14.8729 +32.867942,74.1731 +32.929814,15.8206 +32.905362,41.6408 +32.722512,229.1448 +32.889773,63.1045 +32.813160,140.6891 +32.864540,89.8551 +32.919042,43.8894 +32.892067,71.5348 +32.812399,151.7230 +32.750333,214.3906 +32.879240,86.3139 +32.937368,31.7005 +32.860686,111.0149 +32.952878,19.6234 +32.913479,64.1533 +32.729146,249.2640 +32.953850,30.4672 +32.938671,46.5243 +32.921705,64.4848 +32.814461,172.4385 +32.805318,184.3597 +32.938036,54.7317 +32.911779,81.5537 +32.978411,17.2926 +31.828187,1172.4714 +32.951658,50.7746 +32.985196,19.6473 +32.857936,147.7210 +32.805859,203.3397 +32.844123,165.9552 +32.993334,17.5119 +32.964724,47.6084 +32.879791,134.0244 +33.000660,17.0375 +32.926381,92.6482 +32.962933,58.4921 +32.464154,560.2016 +32.863003,162.6866 +32.896933,132.0435 +32.883651,146.1575 +32.969070,63.4149 +32.954396,79.5419 +32.995705,40.4672 +32.986901,49.9061 +32.972503,67.5551 +32.862233,181.4279 +32.942116,103.0626 +33.013817,34.9163 +32.964122,88.1859 +32.890363,165.1378 +32.963602,92.7245 +32.931238,129.4922 +32.986190,75.1936 +33.043662,18.2541 +32.977634,86.2506 +32.910501,155.3920 +32.989679,78.5951 +32.947004,123.3361 +33.017698,54.2856 +33.045181,28.7518 +32.816044,258.5057 +33.055502,22.4199 +33.009201,71.2078 +32.971702,110.8733 +32.919796,166.2097 +33.036173,51.1342 +33.002433,86.0722 +32.945636,144.4590 +33.048735,46.2867 +33.036808,60.1873 +33.080410,20.5916 +33.086007,15.5035 +33.010847,94.1568 +33.052309,53.2805 +33.012334,94.7536 +33.060731,46.9793 +32.915485,195.1588 +32.940166,173.0125 +33.061385,53.9037 +32.965555,151.4703 +33.101002,17.9866 +32.984318,137.6550 +33.105005,18.4171 +33.028977,95.8997 +33.029809,99.1260 +33.025691,103.8293 +33.061917,69.2309 +33.087308,49.4296 +33.110645,28.0588 +33.065894,75.9445 +33.095022,47.4889 +33.121975,22.2833 +33.010079,139.0757 +33.128936,20.7477 +33.113180,37.9031 +32.916270,239.0668 +33.071985,85.6106 +33.068275,90.1766 +33.142512,16.9868 +33.096997,64.1923 +32.749209,412.5736 +33.149156,16.5648 +33.105591,60.8684 +33.107712,59.6344 +33.149685,19.2994 +33.115290,56.7633 +32.660866,515.6980 +32.878385,298.6720 +33.159500,19.0957 +33.138705,42.7142 +33.101512,82.3801 +33.090096,94.2757 +33.165722,19.1234 +33.117026,69.0806 +33.073934,112.7498 +33.019030,170.0654 +33.024357,168.8670 +33.176565,18.5020 +33.074550,121.7160 +33.161190,36.1915 +33.177058,23.4129 +33.183893,19.0824 +33.168985,35.1756 +33.161784,45.9047 +33.063886,145.4446 +33.166461,43.9991 +33.196267,16.3272 +33.118990,94.9792 +33.056328,159.0633 +33.200472,16.9340 +32.841533,378.4367 +33.021426,201.9818 +32.815113,414.0860 +33.212596,17.4471 +32.895330,338.1828 +33.178597,56.5423 +33.124878,112.4900 +33.088507,151.3406 +33.158453,84.1817 +33.186108,58.1843 +33.181420,63.6211 +33.229200,17.3261 +33.230044,21.1856 +33.233515,19.8895 +33.210461,44.9477 +33.172054,84.4088 +33.217407,44.7972 +33.136740,127.1298 +33.186684,77.9963 +33.167348,98.0874 +33.184373,84.4866 +33.197382,72.0232 +33.184846,85.9067 +33.253406,18.3464 +33.242636,33.8496 +33.262206,18.6743 +33.107088,177.0127 +33.004844,280.3893 +33.202977,83.1977 +33.005658,281.0447 +33.144259,143.0051 +33.244293,44.4585 +33.269406,20.1348 +33.195069,96.4190 +33.256464,38.3624 +33.189097,107.2664 +33.032486,266.5690 +33.077923,224.3109 +33.265436,39.6817 +33.209331,96.3647 +33.268860,41.1708 +33.235141,76.7183 +33.276487,36.3542 +33.040060,274.6216 +33.219971,99.4009 +33.151084,169.5282 +33.302235,20.6564 +33.289542,34.0677 +33.213970,114.5450 +33.157597,173.3386 +33.129521,202.1503 +33.215392,116.8752 +33.131149,202.3333 +32.992769,342.6530 +33.291489,44.6968 +33.323611,16.4466 +33.285235,58.8498 +33.305697,40.8947 +33.237369,109.8350 +33.141839,207.5893 +33.319373,33.8718 +33.336186,17.7813 +33.204162,150.6219 +33.286175,71.4219 +33.239849,121.2386 +33.251231,110.3661 +33.344086,18.7195 +33.347206,18.5600 +33.311861,55.3390 +33.353246,17.7079 +33.271753,99.9096 +33.033939,340.6381 +33.331673,44.6333 +33.312842,64.0186 +33.361088,16.3475 +33.270754,108.8105 +33.361598,20.4443 +33.332268,51.3532 +33.305119,80.8861 +33.155338,233.4627 +33.264682,126.0741 +33.314683,77.6780 +33.340059,56.6284 +33.349430,47.8398 +33.207690,194.7300 +33.357598,45.7239 +33.287265,117.8994 +33.286704,121.2146 +33.245043,164.3892 +33.294828,116.0985 +33.263871,148.8178 +33.328517,85.3139 +33.353969,63.5676 +33.335423,82.9577 +33.407919,12.0067 +33.346593,74.6993 +33.365767,57.8880 +33.284102,140.6465 +33.123424,302.5694 +33.193225,233.3439 +33.412689,15.5106 +33.410927,22.0711 +33.392362,41.9271 +33.417538,17.7459 +33.246528,193.1075 +33.418382,25.6575 +33.397271,47.4465 +33.413831,31.5561 +33.383622,63.7753 +33.296365,153.0563 +33.403324,46.6018 +33.299056,154.2486 +33.432999,21.0643 +33.423656,32.8698 +33.439636,18.8651 +33.223410,236.4427 +33.370955,92.3367 +33.377437,88.8298 +33.405167,62.3179 +33.386006,83.6286 +33.070341,402.5015 +33.371664,101.9331 +32.560202,914.6052 +33.367201,111.4109 +33.463293,16.9202 +33.330937,150.3227 +33.453306,32.5761 +33.379566,107.2154 +33.376862,112.7076 +33.362807,134.5004 +33.424750,73.7039 +33.454065,45.1380 +33.478613,21.1300 +33.428201,73.5626 +33.382044,120.6088 +33.374579,131.9188 +33.486783,21.1844 +33.255410,255.9175 +33.497308,15.7295 +33.445388,68.8352 +33.501764,17.1399 +33.447399,72.9206 +33.467486,53.5027 +33.473598,49.9875 +33.434291,91.9237 +33.449422,79.5250 +33.514225,15.2984 +33.498455,34.9157 +33.458503,75.3744 +33.459854,76.0207 +33.354785,185.3268 +33.456527,87.4398 +33.409434,135.8895 +33.480214,65.6031 +33.485883,63.2544 +33.402422,148.1983 +33.533372,17.7388 +33.502654,49.0682 +33.533878,19.6390 +33.426571,131.1096 +33.396688,161.8671 +33.528948,31.0735 +33.435285,127.9806 +33.469636,96.1886 +33.280881,285.7346 +33.499744,68.1158 +33.288753,281.2324 +33.388802,183.5031 +33.499204,75.6462 +33.526215,50.0288 +33.545324,36.6874 +33.550621,31.8798 +33.535875,48.6644 +33.563266,21.8768 +33.376307,209.4637 +33.425994,163.5313 +33.543968,49.3163 +33.520990,72.9791 +33.082577,511.9265 +33.565825,32.5952 +33.513039,85.8992 +33.582013,17.4408 +33.582501,19.6334 +33.540113,67.9182 +33.489572,119.6745 +33.310032,299.7808 +33.421293,189.7604 +33.333484,280.3960 +33.545818,69.0093 +33.598422,16.9527 +33.598939,18.3335 +33.481261,136.6381 +33.572306,50.5529 +33.576246,47.2145 +33.569987,56.9916 +33.444040,188.4029 +33.466269,166.9079 +33.574852,59.1027 +33.551723,84.5285 +33.585772,52.5988 +33.584541,54.8842 +33.567861,73.7186 +33.551112,92.4229 +33.626979,18.9404 +33.419928,229.1788 +33.553518,97.9042 +33.549139,103.4088 +33.320613,332.6030 +33.608033,45.8014 +33.511328,145.3128 +33.529524,130.1613 +33.566617,97.2047 +33.614828,51.4232 +33.649108,20.2981 +33.651423,18.4854 +33.599455,74.0435 +33.557681,116.6281 +33.643536,32.8895 +33.593970,82.9776 +33.593286,87.4854 +33.669407,15.1361 +33.609248,76.9452 +33.520321,166.6481 +33.669909,18.0923 +33.639426,49.2906 +33.636252,55.7980 +33.653217,42.2040 +33.449927,247.8040 +33.656643,44.7440 +33.507968,193.9109 +33.684544,19.6819 +33.688718,17.9715 +33.633178,76.8114 +33.638372,72.3742 +33.633956,77.8579 +33.472844,239.6252 +33.523587,191.5676 +33.663824,52.1511 +33.680772,36.3284 +33.701388,17.0387 +33.706691,15.8107 +33.518906,204.2257 +33.711815,13.8590 +33.673499,56.8460 +33.390757,342.0726 +33.676427,56.9898 +33.641581,92.4494 +33.659686,77.2155 +33.602136,137.1001 +33.725675,17.4976 +33.611055,135.7976 +33.622860,125.9764 +33.717101,36.0257 +33.695423,60.5626 +33.710747,45.9477 +33.632444,126.4932 +33.701880,57.5315 +33.709990,51.0021 +33.652549,111.5002 +33.617274,148.0541 +33.645921,120.7539 +33.558566,210.6256 +33.666254,106.0425 +33.613881,162.2143 +33.697732,80.1324 +33.589527,189.5643 +33.617900,161.9135 +33.722503,58.3616 +33.746853,36.9050 +33.322893,463.1122 +33.653835,134.3341 +33.730346,62.8567 +33.766676,27.0832 +33.594505,203.3027 +33.759412,40.6808 +33.733417,67.7382 +33.723132,79.5336 +33.756696,47.8049 +33.755986,49.1159 +33.609814,196.7718 +33.760993,46.8595 +33.793204,17.8485 +33.686194,126.3493 +33.739237,76.0689 +33.800094,17.0011 +33.676949,141.6698 +33.688003,131.7122 +33.801157,24.1116 +33.615376,210.7258 +33.585144,242.0860 +33.776097,53.8041 +33.444718,385.8907 +33.815307,15.8597 +33.758938,75.3564 +33.786006,49.8441 +33.623462,215.2057 +33.829902,14.3614 +33.831167,18.1966 +33.734031,116.4763 +33.704227,147.5517 +33.674311,179.6101 +33.835852,19.7176 +33.806587,51.8617 +33.779092,82.0932 +33.560022,304.7335 +33.506498,360.1382 +33.844265,22.8932 +33.827231,42.3500 +33.853922,17.5432 +33.812544,61.1158 +33.692051,185.0803 +33.825270,53.5808 +33.764050,115.6350 +33.864757,19.5517 +33.858450,27.7490 +33.850508,36.5256 +33.748838,138.9373 +33.855571,37.5580 +33.732830,161.0829 +33.777866,118.3242 +33.849365,48.5397 +33.866637,34.6769 +33.715156,188.0779 +33.884310,20.0104 +33.811054,97.3611 +33.736903,172.2983 +33.877133,32.6597 +33.743174,170.7721 +33.818620,96.8460 +33.873661,43.6886 +33.797809,120.2665 +33.765329,155.7212 +33.715976,206.3782 +33.819716,104.9561 +33.908416,18.0200 +33.834295,95.2712 +33.861187,71.0507 +33.871467,64.7505 +33.887776,50.8672 +33.904322,37.6281 +33.826103,116.6485 +33.893915,50.3847 +33.897906,47.6789 +33.817096,129.3582 +33.929568,19.9565 +33.917351,36.4994 +33.718428,238.4973 +33.867160,91.5683 +33.772297,187.2782 +33.909202,55.9149 +33.686970,278.7499 +33.922377,44.0720 +33.903234,63.8040 +33.924674,42.9422 +33.932238,37.9874 +33.886200,87.9417 +33.953851,22.2331 +33.956926,21.1119 +33.793760,187.1091 +33.879686,102.5655 +33.936219,46.5351 +33.946455,36.9173 +33.869582,114.3876 +33.958729,30.2372 +33.913947,75.8006 +33.878852,111.6163 +33.944300,48.7084 +33.769192,226.0371 +33.805103,193.7042 +33.967040,34.7466 +33.779815,222.5658 +33.945586,58.6058 +33.788171,219.2217 +33.921051,87.1921 +33.918077,90.7545 +33.993010,17.2116 +33.998809,15.7062 +33.982755,32.4121 +33.970227,49.6451 +33.967617,52.8412 +33.804502,221.0169 +33.995230,31.2217 +33.915467,112.4764 +33.838669,191.3210 +34.015168,19.4248 +33.965118,70.0849 +33.926437,113.2851 +33.949525,91.2202 +33.909794,131.7890 +34.014516,29.0362 +33.989749,57.6508 +33.966450,82.2448 +33.887035,163.2377 +33.983971,70.3321 +33.901316,154.2475 +34.010223,46.8752 +34.004193,53.9866 +34.007394,53.7995 +34.029991,32.3259 +34.054304,13.6299 +34.035205,34.8785 +34.020459,50.8825 +33.982253,89.9302 +33.976086,98.0291 +34.039724,36.9469 +33.807853,270.0240 +34.026453,55.0541 +33.988967,96.3259 +34.067935,19.4137 +34.074116,16.1007 +34.041584,49.7061 +33.830610,263.6031 +34.061194,34.2825 +33.712470,383.6547 +34.027945,70.0673 +33.893130,206.0548 +34.085294,16.0636 +34.002382,104.6709 +33.783760,325.0536 +34.019873,90.3283 +33.753129,360.6563 +33.851779,264.5530 +34.025521,93.5712 +34.071342,48.6549 +33.780865,341.5031 +33.941951,184.7105 +34.008245,119.0520 +34.057099,70.9776 +34.099186,29.5055 +34.034594,97.6066 +34.116334,16.8629 +33.990470,146.8347 +34.122369,15.6701 +34.090218,51.0225 +34.126662,17.1751 +34.110203,37.1465 +34.132202,16.0720 +34.047401,102.7749 +34.095478,55.5801 +34.062318,91.7613 +34.058181,98.4159 +33.938645,219.4506 +34.141242,17.6388 +33.974143,188.4054 +34.087351,78.8394 +34.070085,96.6539 +34.147350,20.1680 +34.138041,33.5487 +34.154080,19.8030 +34.156598,18.8690 +34.108814,68.8050 +34.091291,87.1523 +34.127298,52.5428 +34.094214,86.7422 +34.162549,19.2981 +34.166191,16.5363 +34.166740,20.2627 +33.474809,712.8946 +34.171590,18.2233 +34.076672,113.6579 +33.980870,213.4695 +34.096125,99.5637 +34.148275,48.3475 +34.151059,49.5569 +34.113787,89.3721 +34.040747,165.1999 +34.173884,35.2910 +34.107054,105.1689 +34.194341,18.8817 +34.182729,33.2060 +34.098013,119.1963 +34.180957,36.8414 +34.043554,178.6431 +34.128692,96.7984 +34.212224,14.0155 +34.178444,49.4975 +34.050274,178.6651 +33.942752,287.1473 +34.213223,21.5797 +34.167519,72.1646 +34.158881,81.3789 +34.203161,38.0900 +34.217800,25.1239 +33.959576,287.0053 +34.077879,170.2927 +34.008832,240.5448 +34.215936,35.1416 +34.048696,205.1041 +34.177620,77.9808 +34.239685,17.6906 +34.240262,17.6785 +34.143838,118.8859 +34.072184,191.9739 +33.965720,302.3653 +34.226241,44.3758 +34.150177,121.5706 +34.225492,47.2471 +34.133198,141.1504 +33.896191,379.7636 +34.195690,81.2526 +34.241252,38.2617 +34.081509,200.5034 +33.802667,484.3454 +34.271748,16.0298 +34.196624,93.9708 +34.242925,49.2810 +34.137305,158.8493 +34.190331,108.7976 +34.253801,47.2769 +34.187704,113.9859 +34.179841,123.1994 +34.272740,31.6930 +34.287779,20.2063 +34.290597,19.1382 +34.187004,128.1431 +34.249378,67.1886 +33.983373,334.1087 +34.119093,200.5794 +34.248172,75.1385 +34.209176,114.7624 +34.128078,196.6683 +34.307987,18.8981 +34.246582,82.7858 +34.301691,32.3950 +34.227943,107.9352 +34.251078,86.0394 +34.001788,335.8983 +34.268087,70.1646 +34.304434,36.6649 +34.323312,19.1984 +34.189815,157.9718 +34.275956,73.3246 +34.279515,70.4031 +34.200618,155.9076 +34.341100,15.9838 +34.299129,58.8394 +34.217211,141.7344 +34.309736,53.4385 +34.317483,47.1619 +34.347788,18.2133 +34.292207,80.7868 +34.257377,117.0626 +34.234805,140.4959 +34.287014,89.0200 +34.337687,43.3124 +34.228940,154.9620 +34.363175,21.2142 +34.316568,68.6872 +34.119998,265.8407 +34.366003,25.4111 +34.372996,20.4200 +34.274350,120.6695 +34.175468,221.3284 +34.329369,69.0097 +34.255602,144.0829 +34.315148,87.6606 +34.375302,30.0483 +34.262726,145.4622 +34.282013,126.9388 +34.393417,17.7872 +34.396797,17.1962 +34.357970,59.1604 +34.324747,94.4874 +34.264159,155.6964 +34.349282,72.1973 +34.335880,86.9627 +34.181849,246.3091 +34.357085,71.7230 +34.413995,16.6614 +34.395020,38.9669 +34.417131,17.4355 +34.296165,144.3011 +34.374441,66.6682 +34.349919,91.8349 +34.385256,57.3279 +34.433988,13.9012 +34.385840,63.1606 +34.391415,58.3651 +34.434568,15.7719 +34.101359,354.6705 +34.257941,198.6070 +34.055564,402.2827 +34.440467,18.6753 +34.384390,78.5587 +34.376035,89.1020 +34.447891,18.0038 +34.399686,67.5336 +34.229901,240.8484 +34.419856,54.5780 +34.441755,33.4788 +34.456031,20.6502 +34.276944,201.9055 +34.459143,23.9620 +34.270617,212.9968 +34.430658,54.2912 +34.222198,264.9288 +34.342512,148.8829 +34.428809,63.1213 +34.450341,43.3501 +34.457848,36.6220 +34.449781,45.8711 +34.334087,165.5819 +34.483107,17.0904 +34.301079,204.7585 +34.442585,63.7707 +34.491932,16.4683 +34.205948,303.6597 +34.303042,207.7446 +34.467221,45.3511 +34.381001,134.7102 +34.499670,16.5102 +34.398380,119.0672 +34.500198,18.0147 +34.470751,50.3032 +34.491396,32.3041 +34.411205,115.2846 +34.509609,18.6311 +34.510787,18.3517 +34.478850,52.9441 +34.515713,17.7437 +34.516181,18.7460 +34.408189,128.8778 +34.465896,72.6562 +34.521055,18.6148 +34.526491,18.2815 +34.512573,33.6352 +34.419236,131.5272 +34.493692,59.1587 +34.462950,93.0320 +34.475235,82.2949 +34.465139,93.5261 +34.383903,178.3917 +34.544774,19.7654 +34.508401,59.0504 +34.529140,39.7793 +34.421480,150.2353 +34.483615,88.6779 +34.528241,45.5672 +34.358947,218.2803 +34.356526,222.6210 +34.422844,157.6320 +34.337119,243.9012 +34.338253,244.1430 +34.474436,111.5545 +34.567452,19.0311 +34.487128,102.3499 +34.428159,162.3436 +34.323940,269.0194 +34.537068,59.5069 +34.539671,58.0253 +34.550764,47.4590 +34.558666,42.4152 +34.505839,96.6066 +34.585991,17.3444 +34.586484,19.2164 +34.589479,17.1063 +34.557532,50.6491 +34.590504,23.7450 +34.517448,98.3504 +34.571716,44.7914 +34.597697,19.5719 +34.523701,95.9698 +34.605702,17.4048 +34.577229,46.9323 +34.534928,89.7937 +34.606586,18.9290 +34.568921,58.3313 +33.978039,654.4194 +34.441110,192.2409 +34.402810,231.3545 +34.476682,159.6892 +34.582397,55.0354 +34.619672,20.6675 +34.484950,156.1933 +34.456549,185.2478 +34.623108,23.1821 +34.319673,328.5051 +34.564540,88.6971 +34.632460,21.9717 +34.326886,328.8874 +34.634165,22.8837 +34.580477,77.9824 +34.518214,141.8184 +34.617270,43.9120 +34.641145,21.6675 +34.648180,18.0339 +34.405351,262.1030 +34.555983,113.8688 +34.654433,17.7840 +34.657050,15.9527 +34.601083,73.3652 +34.449002,231.5087 +34.546210,136.6803 +34.637434,47.3889 +34.614250,71.1332 +34.608182,78.2128 +34.669853,17.1615 +34.673004,17.2491 +34.660033,32.6001 +34.581021,116.8997 +34.682891,16.5253 +34.552852,148.1746 +34.662813,40.5555 +34.579148,125.1766 +34.641799,64.3629 +34.646292,60.8867 +34.672218,35.7331 +34.573809,137.9931 +34.633352,79.4376 +34.690254,26.4850 +34.364646,356.6258 +34.687016,35.3553 +34.538554,186.2935 +34.655775,70.3656 +34.616508,110.2326 +34.666215,62.8398 +34.636372,96.4941 +34.703370,31.4161 +34.716740,20.3569 +34.721273,18.8402 +34.661183,84.0700 +34.495653,250.7432 +34.680512,66.8367 +34.624723,123.8071 +34.494471,254.6877 +34.712791,40.9508 +34.598224,156.3438 +34.674449,84.3988 +34.653239,107.7429 +34.707180,55.1262 +34.726141,39.2610 +34.531796,234.5850 +34.706163,61.5896 +34.592960,176.4797 +34.640340,131.5715 +34.686396,89.0953 +34.667456,109.6683 +34.760983,17.9651 +34.724848,56.0599 +34.748531,34.2382 +34.746398,39.2262 +34.506357,280.0878 +34.699418,93.2279 +34.572295,220.9678 +34.624162,169.6924 +34.737098,59.2993 +34.707952,91.6777 +34.729056,71.7332 +34.762307,42.8588 +34.732868,72.9296 +34.753743,53.1055 +34.785625,26.0998 +34.596576,216.9452 +34.769441,45.3825 +34.740114,75.3631 +34.603337,215.3275 +34.722372,99.7982 +34.775492,49.2867 +34.758849,69.3623 +34.811727,21.9281 +34.408953,426.9665 +34.799631,37.9456 +34.658460,179.7213 +34.701027,139.2590 +34.745254,95.6365 +34.692634,150.1028 +34.792647,50.8985 +34.684823,162.7545 +34.793855,55.8763 +34.805799,48.9150 +34.833656,22.4008 +34.625516,231.1067 +34.805167,52.0127 +34.837578,20.4400 +34.765403,95.0309 +34.814824,47.4676 +34.806849,57.1068 +34.786446,80.0780 +34.849733,19.2984 +34.780909,91.4334 +34.854714,18.1745 +34.615800,259.2094 +34.856624,18.9901 +34.842738,37.9371 +34.697922,183.3921 +34.711804,170.3508 +34.824781,59.7583 +34.838183,49.1491 +34.872343,17.4124 +34.754569,137.1002 +34.843546,52.5876 +34.782771,114.1664 +34.749160,151.5794 +34.840287,61.4378 +34.602446,300.1712 +34.771913,131.2658 +34.869032,37.5593 +34.800790,108.3080 +34.747350,165.8149 +34.875010,39.6914 +34.896135,20.2781 +34.793263,125.6833 +34.835921,85.3379 +34.900740,21.3867 +34.815479,109.4091 +34.704326,222.6346 +34.906593,21.8589 +34.866525,64.1663 +34.880677,50.6509 +34.856058,77.5490 +34.726742,207.7572 +34.862293,76.2937 +34.158097,782.1230 +34.921260,19.7617 +34.863957,79.2735 +34.918948,29.3406 +34.881315,67.5866 +34.766382,183.7226 +34.901726,53.3890 +34.887333,68.6651 +34.938588,19.6710 +34.685384,273.9358 +34.916414,43.4897 +34.796398,168.7074 +34.913167,53.0946 +34.948289,18.8761 +34.872890,95.6489 +34.847579,122.8471 +34.928453,45.5150 +34.828212,146.7164 +34.958260,17.8454 +34.959321,20.4576 +34.767753,212.8689 +34.884540,98.0875 +34.966262,19.1310 +34.950106,38.2835 +34.822172,168.0724 +34.948903,45.1765 +34.934501,60.5293 +34.940221,61.7481 +34.840892,163.9011 +34.777125,229.8074 +34.943232,64.6317 +34.955117,57.0481 +34.959905,53.2786 +34.973969,41.4501 +34.976107,44.1272 +34.941022,82.0474 +34.891670,134.2321 +34.858019,168.8030 +34.857180,171.0205 +34.931329,101.2494 +34.903180,129.9750 +34.562296,471.6570 +34.924889,110.0628 +35.001971,38.1427 +35.015420,25.2664 +34.985395,56.1481 +34.980624,66.2408 +34.990245,57.1995 +34.982629,65.4137 +34.922128,126.5283 +34.970427,83.3655 +34.930692,124.1083 +34.902618,153.0490 +35.025904,35.8526 +34.926962,135.6897 +35.012166,51.5676 +35.033954,34.2956 +34.860435,209.2719 +34.778949,292.7490 +35.020235,54.1558 +35.033156,42.2835 +35.006934,69.8888 +35.032579,46.6641 +35.062653,17.8451 +35.041544,44.9490 +35.007865,80.4353 +34.533458,558.9092 +35.040688,54.3627 +35.026823,68.7471 +34.889757,207.4256 +34.734788,363.9503 +35.063735,35.7588 +35.054802,45.6479 +34.955999,150.5692 +35.028202,79.2976 +35.086495,22.1730 +34.875615,237.4587 +35.071699,43.5694 +35.004794,111.1574 +34.979780,137.4499 +35.080499,41.0028 +35.048658,73.4475 +34.988390,135.7703 +35.074392,53.1067 +35.075440,56.2145 +35.088302,44.6778 +35.113075,20.4152 +35.097183,39.3839 +35.047446,90.1960 +35.069708,69.4761 +34.627254,516.0185 +35.107501,37.0409 +34.974930,170.5586 +34.965107,181.1421 +35.131656,17.8029 +35.132980,19.1434 +35.068251,90.5987 +35.079245,80.3613 +34.967167,193.8103 +35.092368,69.9799 +35.095052,69.9935 +35.121503,45.0149 +35.048043,119.7248 +35.149460,19.3391 +35.122106,48.7318 +34.995031,180.8041 +35.127499,52.0981 +35.133491,47.0038 +34.813522,367.7159 +35.162349,19.9932 +35.165046,18.5048 +35.124162,59.8976 +35.144543,42.2366 +35.034953,152.3707 +35.099495,88.8705 +35.115953,72.7522 +35.166519,24.7588 +35.095571,96.0507 +35.023071,169.0251 +35.053794,139.9929 +35.145489,50.1061 +35.055668,140.4596 +34.994081,202.4907 +35.152125,48.9171 +35.191278,10.6951 +35.143273,59.2627 +34.882156,322.1105 +35.193787,13.3692 +35.179599,27.9962 +35.180496,27.4413 +35.160978,50.0743 +35.098739,112.6118 +35.170839,42.2088 +35.201974,11.4628 +35.117231,97.0661 +35.167769,48.9317 +35.207596,9.6153 +35.175837,41.6614 +35.187324,30.7685 +35.159607,60.2587 +35.115269,105.5789 +35.186780,34.6201 +35.196128,25.6842 +35.196572,26.6468 +35.106570,117.9223 +35.137643,88.3794 +35.202537,25.0642 +35.191622,36.5079 +35.181238,47.4433 +34.896939,333.9636 +35.195596,35.9159 +35.214297,18.6036 +35.211053,22.2426 +35.204267,30.5436 +35.211351,25.0519 +35.227601,9.2049 +35.223220,15.5323 +35.230903,8.1703 +35.213437,26.1308 +35.061758,181.0636 +35.207938,35.8295 +35.234811,9.5007 +35.221813,22.8245 +35.219866,25.5384 +35.188366,57.3502 +35.146250,101.6700 +35.238752,9.4563 +35.207157,41.3539 +35.239073,9.9559 +35.158851,91.2606 +35.217212,35.3857 +35.242822,10.0886 +35.239568,13.9723 +35.220849,34.0635 +34.968540,288.1649 +35.233296,23.8392 +35.224493,34.1688 +35.232902,26.1382 +34.818665,442.2537 +34.914702,346.9940 +35.201043,61.0134 +35.244312,21.1182 +35.258662,7.6412 +35.236807,30.0070 +35.260920,7.8186 +35.249030,20.0318 +35.252911,17.5158 +35.040115,231.6537 +35.218093,54.7255 +35.182343,91.4027 +35.268739,7.5667 +35.248209,29.0666 +35.226023,52.6436 +35.192097,87.2963 +35.228130,51.7222 +34.909100,372.2130 +35.257136,25.2380 +35.273746,9.4452 +35.276306,9.7523 +35.188706,97.6810 +35.272819,14.9492 +35.213049,76.5259 +35.259040,31.0527 +35.247921,43.1282 +35.244638,47.7883 +35.013185,279.7634 +35.221401,72.8454 +35.286059,8.6883 +35.286387,11.1650 +35.287769,10.1126 +35.217499,81.0013 +35.261697,39.3829 +35.168800,132.8607 +35.245405,56.8693 +35.236404,66.4866 +35.254913,49.3947 +35.294748,10.0195 +35.243768,61.9414 +35.297553,8.5555 +35.298501,9.4714 +35.136569,174.1859 +35.302891,8.2138 +35.076823,235.9470 +35.305710,8.3093 +35.277276,37.7390 +35.290094,26.0029 +35.262057,55.8438 +35.265431,52.9933 +35.271769,49.0872 +35.297882,23.4804 +35.256706,66.3071 +35.283192,40.3363 +35.304308,21.0338 +35.306109,20.0713 +35.245716,81.1305 +35.292427,34.9704 +35.183552,145.2978 +35.270427,60.0919 +35.266814,64.2414 +35.253541,78.7967 +35.046865,287.2644 +35.325342,9.6289 +35.323013,13.6481 +35.312771,25.0087 +35.139185,199.5302 +35.281314,58.1088 +35.330520,10.0328 +35.301080,40.8070 +35.302275,40.7867 +35.326180,18.5121 +35.184060,161.0082 +35.282374,63.1579 +35.337780,10.0977 +35.336662,11.8040 +35.248511,100.2691 +35.321363,28.6432 +35.301661,49.9813 +35.279394,73.3213 +35.100450,252.6334 +35.344693,9.7667 +35.294246,61.4446 +35.340553,16.2385 +35.304768,52.5039 +35.350006,9.8568 +35.339423,21.9867 +35.318425,43.2926 +35.307972,55.3026 +35.348466,15.5379 +35.269062,95.2912 +35.314019,52.3336 +35.348781,18.5344 +35.338716,29.0333 +35.345068,24.3369 +35.291049,79.1884 +35.353084,18.3332 +35.266304,108.1641 +35.361718,13.3141 +35.320856,54.4494 +35.334972,40.8498 +35.323529,53.9993 +35.345532,32.3058 +34.933608,445.6206 +35.311105,68.7038 +35.357272,23.6868 +35.359864,23.5952 +35.216701,167.4928 +35.370238,14.8661 +35.363276,24.0415 +35.334130,53.7518 +35.375822,12.3871 +35.316097,73.6720 +35.328850,61.5983 +35.326847,64.7029 +35.375032,17.0828 +35.292948,100.8474 +35.371418,24.1009 +35.387318,9.1015 +35.250112,147.7120 +35.366353,32.5181 +35.356792,42.4318 +35.347878,52.7324 +35.392116,9.3027 +35.278667,123.7770 +35.327398,77.0771 +35.352715,52.2735 +35.289575,115.8987 +35.396420,9.5810 +35.231513,177.0870 +35.400611,8.2944 +35.377528,32.3952 +35.383459,27.3898 +35.108669,304.5269 +35.391551,22.1565 +35.390449,24.5152 +35.331056,84.4411 +35.279853,136.8103 +35.369406,48.0865 +35.408600,9.4533 +35.408906,10.3337 +35.361411,58.5160 +35.375306,45.0730 +35.404475,18.3287 +35.343062,80.0172 +35.413197,11.2463 +35.367750,56.9929 +35.228682,196.8290 +35.252598,173.7751 +35.341888,87.0737 +35.379810,49.8071 +35.399224,30.7338 +35.414964,15.4152 +35.379229,53.1293 +35.384195,49.2354 +35.422805,11.1934 +35.364354,70.6649 +35.424743,10.6235 +35.355692,80.2400 +35.428962,9.2793 +35.367316,71.5183 +35.429617,10.8766 +35.310755,130.5511 +35.432359,10.0862 +35.417493,25.7942 +35.435019,9.1693 +35.397825,47.1558 +35.364005,82.6797 +35.385105,62.1878 +35.406001,41.9592 +35.438242,10.4510 +35.419927,29.4588 +35.315016,136.5231 +35.442446,9.3845 +35.413708,40.4093 +35.402445,52.3327 +35.444981,10.5048 +35.415498,42.0388 +35.416664,42.1176 +35.377839,81.4955 +35.451539,8.0738 +35.354460,105.6568 +35.419240,41.3485 +35.451831,9.2119 +35.454118,8.6336 +35.317901,145.5007 +35.388209,77.4066 +35.438835,27.8842 +35.457537,10.2418 +35.374469,93.8570 +35.443287,25.8086 +35.405474,65.0914 +35.423080,48.6539 +35.404989,67.2824 +35.462752,9.8219 +35.429958,46.6932 +35.467779,9.1496 +35.468326,9.5218 +35.351643,127.3029 +35.461043,18.2432 +35.430380,49.8000 +35.398872,81.8939 +35.446685,35.4518 +35.387882,95.2701 +35.410850,72.6564 +35.425512,59.6502 +35.476652,8.7929 +35.476930,9.7002 +35.380959,105.9736 +35.472272,17.0978 +35.480766,9.4348 +35.433998,58.2240 +35.472574,19.9330 +35.483153,9.6631 +35.441307,51.9973 +35.393796,100.2798 +35.485162,9.7310 +35.486933,9.3783 +35.460118,38.0104 +35.489371,9.4220 +35.447961,52.6044 +35.459614,41.2287 +35.460589,40.8180 +35.444189,59.2707 +35.332338,171.4932 +35.448693,55.6308 +35.470566,35.4401 +35.465617,40.7678 +35.449386,57.2948 +35.440494,67.6754 +35.500566,8.2622 +35.501408,9.0785 +35.459334,53.3539 +35.498793,15.2134 +35.493304,21.2377 +35.485445,29.9034 +35.483506,32.6843 +35.508828,8.9605 +35.492223,26.2405 +35.389769,129.8337 +35.512689,8.4107 +35.463402,60.6465 +35.494077,30.6621 +35.433431,92.2345 +35.517789,8.1656 +35.508170,18.2205 +35.409924,118.2376 +35.458782,70.1261 +35.455486,74.1841 +35.494894,37.1584 +35.486630,46.2149 +35.515349,17.8397 +35.401419,133.8745 +35.519604,15.9818 +35.479287,58.9302 +35.418054,120.8397 +35.471734,67.9404 +35.500843,39.1553 +35.435367,104.9978 +35.532846,9.4726 +35.535294,8.0433 +35.492816,50.8729 +35.535586,8.9675 +35.533189,14.2642 +35.426373,121.3877 +35.506385,41.9144 +35.490202,59.8585 +35.524049,26.8012 +35.424443,126.7698 +35.514007,37.8551 +35.526391,26.0671 +35.482137,71.5435 +35.454778,100.1417 +35.548300,8.3986 +35.447293,110.1890 +35.551214,7.6223 +35.503832,56.4246 +35.504324,56.4900 +35.532053,30.7988 +35.538217,24.9474 +35.551863,12.4074 +35.492507,72.5617 +35.525955,40.1599 +35.558836,8.2954 +35.506682,62.3896 +35.528162,42.0107 +35.498128,73.9873 +35.564271,8.1264 +35.553681,19.7481 +35.466719,107.0133 +35.547454,27.4452 +35.435932,139.3763 +35.518464,57.4953 +35.547761,29.3140 +35.395520,184.1497 +35.477848,102.1299 +35.572116,8.4527 +35.572397,9.3789 +35.573430,9.4845 +35.543337,41.0187 +35.529671,56.2083 +35.557483,29.4722 +35.469097,118.1688 +35.560257,29.3898 +35.503460,86.6319 +35.506007,85.1431 +35.562852,30.8407 +35.543690,50.3174 +35.528909,65.4245 +35.560815,34.9796 +35.525666,71.0921 +35.521100,76.5196 +35.550851,49.0508 +35.544554,55.7432 +35.569072,31.9658 +35.550061,51.5669 +35.556699,47.4530 +35.582915,21.7573 +35.563165,42.6446 +35.575309,30.8819 +35.539998,66.6269 +35.567132,41.4935 +35.514543,94.3765 +35.600297,9.5979 +35.604152,7.9554 +35.591150,21.6644 +35.573733,39.4124 +35.577076,37.2902 +35.510487,105.3971 +35.590092,26.7603 +35.478946,138.7094 +35.609896,9.5405 +35.570173,49.5732 +35.612108,8.9886 +35.579670,41.9835 +35.480180,143.5607 +35.420380,205.2396 +35.594333,31.5795 +35.601038,25.8350 +35.579979,47.5706 +35.606626,21.7300 +35.593693,35.5618 +35.621097,8.7647 +35.608626,23.4147 +35.623742,9.1823 +35.554920,78.3030 +35.613146,20.9395 +35.605810,30.3848 +35.616853,20.8539 +35.595795,42.3802 +35.619437,20.4920 +35.606191,34.9621 +35.596758,45.3102 +35.566116,76.7078 +35.581777,61.4516 +35.524739,119.3973 +35.636196,9.4087 +35.580569,67.2795 +35.585880,62.8513 +35.538894,110.5841 +35.629255,22.2012 +35.638176,13.8627 +35.597620,54.7303 +35.539675,113.2242 +35.608919,45.1435 +35.633223,22.9537 +35.647849,9.1435 +35.589647,69.4423 +35.594008,65.8274 +35.619747,40.3731 +35.621654,41.5091 +35.540365,123.0922 +35.601628,62.3520 +35.632042,32.3613 +35.645605,19.3683 +35.656993,9.1739 +35.586955,82.1606 +35.651457,17.9853 +35.614367,57.1480 +35.652039,19.8021 +35.654063,18.0750 +35.587266,86.1954 +35.641154,34.0399 +35.542319,134.3187 +35.628356,48.7552 +35.649479,29.6267 +35.629862,49.9414 +35.671515,8.5648 +35.671841,9.4512 +35.627550,54.3683 +35.664974,18.2912 +35.604673,79.4830 +35.615884,68.5602 +35.676638,9.7804 +35.625620,61.2173 +35.496312,193.1195 +35.617656,72.4753 +35.663981,26.4858 +35.663458,28.3839 +35.644137,49.2830 +35.672139,22.2858 +35.664403,30.6238 +35.669443,27.1650 +35.574900,122.1183 +35.690132,9.1156 +35.680080,20.1215 +35.639929,61.1345 +35.632924,69.0378 +35.666168,37.1005 +35.659090,44.7628 +35.565070,141.0762 +35.673462,33.1016 +35.584357,124.3470 +35.656178,55.3553 +35.612815,99.1150 +35.634086,78.7427 +35.648731,66.1046 +35.690467,24.7219 +35.516191,199.5256 +35.679106,39.3585 +35.652351,66.9035 +35.643229,77.2420 +35.693420,27.8313 +35.712829,8.8615 +35.625913,96.4019 +35.699248,24.4214 +35.711533,13.5280 +35.700202,26.7145 +35.575960,152.4090 +35.701963,28.2200 +35.686837,44.2013 +35.708705,22.8654 +35.696608,35.2858 +35.652900,79.5934 +35.701064,33.6998 +35.686419,49.1574 +35.726917,9.5973 +35.728369,9.0912 +35.703269,34.7475 +35.722316,17.2104 +35.706564,34.4696 +35.689432,52.9148 +35.721691,21.0834 +35.715189,29.3851 +35.683265,62.4696 +35.703854,43.0838 +35.637708,109.6172 +35.739527,8.8763 +35.552459,197.1509 +35.720471,30.5614 +35.732494,19.0959 +35.742347,9.6989 +35.706146,48.4662 +35.721252,34.7510 +35.659836,96.6089 +35.679804,77.1790 +35.749610,8.7087 +35.684445,75.5661 +35.663163,97.2372 +35.738017,23.6558 +35.719255,45.5076 +35.754613,10.5597 +35.730183,36.6572 +35.736515,31.1281 +35.642824,125.3318 +35.731571,36.9151 +35.748404,22.0557 +35.681293,89.7848 +35.695028,78.8899 +35.711931,62.6808 +35.642069,133.1209 +35.681919,93.5653 +35.675194,103.6968 +35.715717,63.4314 +35.766841,12.6818 +35.697018,83.1163 +35.768156,12.2776 +35.735577,45.5607 +35.737461,46.1143 +35.731039,52.8053 +35.774612,9.9716 +35.758319,26.9544 +35.599902,185.6725 +35.746938,40.5287 +35.778891,9.0263 +35.770461,18.8804 +35.779149,12.1474 +35.761673,32.2467 +35.756445,37.8829 +35.760401,34.5786 +35.785274,10.9325 +35.734765,63.0121 +35.756984,42.3855 +35.747325,52.5599 +35.787467,12.7257 +35.660121,142.2612 +35.669116,134.6574 +35.783576,20.7608 +35.785575,19.3277 +35.796207,9.6389 +35.765173,42.2836 +35.752047,55.7381 +35.745735,63.7395 +35.718465,91.5684 +35.780135,32.0120 +35.684156,129.6952 +35.780434,33.9558 +35.784584,30.3413 +35.791297,24.0833 +35.807457,9.1511 +35.742775,75.9886 +35.767644,51.5523 +35.793920,25.9700 +35.725062,96.6182 +35.813852,8.1027 +35.810034,14.4964 +35.723670,101.2023 +35.714837,110.4192 +35.691842,133.8030 +35.756004,71.4130 +35.818764,8.9534 +35.794328,35.2689 +35.821681,8.6495 +35.768487,62.5589 +35.821955,9.5740 +35.779523,53.8282 +35.824531,9.1295 +35.827417,8.4438 +35.815381,20.9774 +35.760011,76.8242 +35.827718,9.5077 +35.775190,65.1208 +35.677112,163.6078 +35.751590,89.4061 +35.805846,35.7001 +35.833352,8.5049 +35.833661,9.0141 +35.787918,56.7150 +35.835862,9.0747 +35.816609,29.1217 +35.825646,20.6722 +35.830331,18.4394 +35.814926,34.3950 +35.819196,30.4879 +35.819891,31.3863 +35.802382,49.9836 +35.771079,82.4978 +35.844634,9.2551 +35.781138,75.7072 +35.814390,42.7778 +35.797777,59.6880 +35.848770,9.3149 +35.775484,83.3858 +35.851278,9.5031 +35.626874,235.5520 +35.764763,98.9096 +35.744575,119.6974 +35.731895,132.8273 +35.799370,65.9615 +35.849685,19.3105 +35.840311,29.1975 +35.852366,17.6810 +35.773918,97.4962 +35.842675,30.1824 +35.864722,8.9862 +35.840720,33.3114 +35.845731,28.8514 +35.800193,76.7686 +35.858086,19.6578 +35.871415,9.3178 +35.841547,39.6877 +35.799886,82.2062 +35.836836,45.5582 +35.783845,98.8561 +35.831046,53.7758 +35.804337,81.7791 +35.862426,24.2163 +35.876962,10.2445 +35.809476,80.6953 +35.881235,9.2390 +35.829598,61.3241 +35.741034,150.3116 +35.825256,68.3253 +35.872858,21.3758 +35.807785,87.2161 +35.841857,53.5548 +35.853889,42.7455 +35.794980,103.2703 +35.853577,45.0895 +35.880733,18.2347 +35.890171,9.1035 +35.890475,9.6834 +35.694425,207.2030 +35.856846,46.3995 +35.804903,99.4970 +35.868996,36.1935 +35.898251,8.5029 +35.874032,33.4036 +35.898968,8.9420 +35.886643,22.6078 +35.901629,9.1055 +35.860781,51.5512 +35.877744,35.9294 +35.869509,45.7155 +35.907910,8.9701 +35.865332,53.1714 +35.803774,115.1728 +35.846319,72.9311 +35.895002,25.7220 +35.893582,27.7652 +35.905190,18.0352 +35.894235,29.8123 +35.903246,21.9713 +35.916881,9.0887 +35.891346,36.8192 +35.844937,84.4103 +35.840997,88.8035 +35.923226,8.1434 +35.886117,46.0398 +35.824873,109.7235 +35.909251,25.7986 +35.789343,147.3190 +35.887207,49.8124 +35.906754,30.5751 +35.928166,10.0787 +35.874583,63.9568 +35.812148,128.3154 +35.931369,10.2604 +35.900158,43.2269 +35.904401,39.2595 +35.870048,74.4391 +35.884823,61.2839 +35.936663,9.7267 +35.937020,9.6506 +35.857466,89.8676 +35.907436,40.2643 +35.925970,22.6960 +35.940464,9.8432 +35.918504,33.1555 +35.932157,20.9899 +35.934597,20.2354 +35.925217,30.6936 +35.946107,10.2901 +35.882395,74.6563 +35.947334,10.0186 +35.924047,34.1059 +35.938540,21.0653 +35.837226,122.9246 +35.929801,32.0531 +35.918947,43.9607 +35.954833,9.7534 +35.955911,8.9922 +35.956398,8.8196 +35.946390,21.0713 +35.959606,9.4764 +35.921348,48.2638 +35.898667,71.8343 +35.944487,27.5267 +35.882702,89.7749 +35.964587,8.4306 +35.964904,8.4264 +35.965218,10.1069 +35.967462,9.2222 +35.946671,31.0944 +35.948667,30.0170 +35.973018,7.6091 +35.938245,43.1266 +35.896635,85.0715 +35.973331,8.9233 +35.912333,71.7411 +35.751033,234.6238 +35.958154,28.1806 +35.972477,16.3468 +35.980627,8.4958 +35.899275,90.1821 +35.831529,159.4481 +35.890922,100.7688 +35.962909,30.4374 +35.951660,43.3785 +35.976684,19.7657 +35.953147,43.6592 +35.970502,26.8510 +35.988824,8.8257 +35.989124,8.8155 +35.982255,18.1833 +35.975325,25.6673 +35.978684,23.0717 +35.993346,9.2952 +35.986335,18.8777 +35.857169,149.1936 +35.977766,28.9982 +35.991692,16.8186 +35.929348,81.0034 +35.863673,147.3579 +35.981707,31.4785 +35.935050,78.4570 +35.961854,52.8260 +35.937330,79.3597 +35.997650,19.6744 +35.943386,74.2449 +35.910735,107.2745 +35.957052,61.7969 +36.000438,20.8019 +36.006765,15.0016 +36.013186,8.8721 +36.002642,19.7553 +35.882092,142.6391 +36.008511,17.0243 +35.972015,54.4262 +35.915225,111.7055 +35.957353,71.4457 +35.836359,193.8034 +35.864273,167.3738 +35.981372,50.8394 +35.943661,89.7163 +35.947701,86.3223 +35.849321,185.2850 +35.858871,177.5119 +35.913674,123.0238 +36.005213,32.4354 +36.028799,10.3859 +35.941630,99.8529 +36.018849,23.5299 +35.895413,147.3049 +36.034024,9.3418 +35.989458,55.0418 +36.036383,9.9257 +36.001757,46.2698 +36.026931,21.7670 +35.995039,54.7752 +36.041484,9.3144 +36.042379,9.1544 +35.985657,67.1667 +36.022059,31.1700 +36.032212,21.3377 +36.036698,17.7582 +36.042718,14.3162 +36.031647,26.5725 +35.873709,185.4056 +36.016690,43.6987 +36.051534,9.4429 +36.013508,48.3436 +36.043366,19.4211 +36.000993,62.4706 +35.960151,104.3262 +36.058220,8.3484 +36.050799,17.1668 +35.969083,101.1596 +36.048027,22.8749 +36.061852,9.4039 +36.039185,32.9589 +36.021767,51.9228 +36.011031,64.1898 +36.066569,9.7641 +35.950307,126.6616 +36.037649,41.4273 +36.048699,30.6640 +36.070243,10.3203 +36.059115,22.8957 +35.920724,162.1219 +36.046309,37.0978 +36.006363,77.8386 +36.073690,11.3090 +36.030162,56.7686 +36.052825,34.6639 +36.079077,8.8639 +36.053229,35.2419 +36.079363,9.6551 +36.060978,29.5093 +36.082011,8.7808 +36.082847,9.3536 +35.969612,124.1552 +36.017631,76.8893 +36.010351,84.8945 +36.033377,64.0154 +36.064478,34.4583 +36.090487,8.7536 +36.022398,78.4197 +36.060389,41.9071 +36.049814,53.8252 +35.990978,113.8778 +36.076969,29.7570 +36.063464,43.8799 +36.054457,54.6141 +36.034607,74.7825 +36.087489,23.1308 +36.097393,13.6532 +35.919250,192.1329 +36.104856,9.3946 +36.021241,94.1212 +36.098936,16.8908 +35.996450,120.1486 +36.017325,100.0298 +35.997353,120.3310 +36.057035,60.9551 +36.070902,51.0747 +36.100818,22.2899 +36.085000,38.8132 +35.984075,140.0457 +36.115828,8.6956 +36.018010,107.4185 +36.025536,101.6074 +36.067966,60.2550 +36.111047,19.3107 +36.116599,14.6824 +36.106727,26.0484 +36.086932,46.2984 +36.125428,8.8770 +36.107344,28.4922 +36.110620,26.5072 +36.117685,19.7381 +35.996807,140.9210 +36.099241,41.0485 +36.132776,8.0256 +36.133230,8.7367 +36.094521,48.7657 +36.024732,120.2232 +36.124121,22.4430 +36.071256,75.7037 +36.014681,133.1093 +36.109071,39.3329 +36.127143,21.6659 +36.140802,9.8367 +36.141968,10.1709 +36.080564,73.7145 +36.144956,9.8981 +36.123108,32.0532 +36.128221,28.1835 +36.088471,69.8602 +36.123814,34.9522 +36.044500,114.9080 +36.121978,37.7739 +36.140290,21.6384 +36.124524,37.6985 +35.997940,164.5931 +36.093768,71.6211 +36.076334,89.4040 +36.090792,75.3729 +36.137423,31.5794 +36.109389,60.3296 +36.103640,67.7690 +36.148405,23.8978 +36.137128,35.7172 +36.134306,40.0225 +36.155162,20.5232 +36.150639,26.5853 +36.111383,67.8689 +36.165389,14.7202 +36.115362,65.2535 +36.131282,50.6544 +36.169003,13.7488 +36.174329,10.6526 +36.075222,110.0441 +36.117990,67.6610 +36.072145,114.7060 +36.159752,28.0212 +36.169720,20.5509 +36.165738,25.2616 +36.146564,45.0082 +36.181937,9.9824 +36.154279,38.3861 +36.179253,15.0565 +36.185266,10.2426 +36.130358,66.3874 +36.026441,171.5757 +36.148810,49.8081 +36.159409,42.0463 +36.154854,46.9437 +36.172846,29.2626 +36.161929,41.2114 +36.083408,121.7141 +36.137728,67.7897 +36.196746,10.1010 +36.156405,51.2190 +36.117355,92.3664 +36.191000,19.0235 +36.180616,30.0739 +36.158766,53.1044 +36.194310,19.2076 +36.198618,15.8819 +36.186851,28.6371 +36.195509,20.8926 +36.143287,75.0899 +36.146960,71.8180 +36.209722,9.3530 +36.114251,105.5741 +36.210024,10.6598 +36.191920,31.6108 +36.198017,26.1867 +36.182752,42.0003 +36.171409,53.8027 +36.092201,133.4967 +36.215489,12.9908 +36.218378,10.3841 +36.218779,10.2451 +36.219076,10.2194 +36.180110,49.8702 +36.205122,25.8605 +36.191573,39.7178 +36.202109,31.2821 +36.223531,10.1319 +36.162222,71.9187 +36.172303,62.1269 +36.210691,27.2935 +36.228762,9.4901 +36.229024,9.4864 +36.229296,9.6242 +36.207625,33.1959 +36.229981,11.1355 +36.216403,25.0249 +36.095246,148.0144 +36.185652,58.3469 +36.213518,30.7569 +36.233391,11.7371 +36.224753,20.8399 +36.237985,10.1081 +36.238253,10.1094 +36.238511,10.1500 +36.220685,28.8945 +36.238920,11.4344 +36.184982,67.4136 +36.206848,45.8794 +36.211871,41.4836 +36.243261,10.9350 +36.084202,172.5023 +36.053550,203.4781 +36.152139,105.3040 +36.087941,170.7289 +36.175686,84.7175 +36.252396,8.3404 +36.234142,27.1156 +36.234430,28.3784 +36.225213,39.1856 +36.201455,64.7745 +36.243999,22.7162 +36.158332,109.0330 +36.260404,8.5567 +36.260737,8.5282 +36.147791,122.0347 +36.231291,40.0927 +36.062788,210.4887 +36.254197,20.0527 +36.162533,112.0178 +36.253355,22.5246 +36.256705,20.7333 +36.102297,175.9238 +36.268961,10.0477 +36.269266,10.0308 +36.177225,102.5994 +36.245594,36.2926 +36.225698,57.2345 +36.249580,33.8660 +36.273277,10.4757 +36.275880,9.8957 +36.252728,34.0036 +36.245129,44.2359 +36.203141,86.5512 +36.219826,70.1735 +36.190271,100.0688 +36.274551,18.5985 +36.228480,65.8375 +36.089019,206.0160 +36.257028,39.9748 +36.281887,15.6271 +36.283753,14.0680 +36.248093,52.4060 +36.258671,42.1796 +36.241428,59.8236 +36.282933,20.1474 +36.278221,25.4349 +36.262809,41.5572 +36.241117,65.0364 +36.297514,9.0376 +36.283446,24.1654 +36.297821,10.1357 +36.187774,121.5982 +36.224205,86.7098 +36.286732,25.5811 +36.266230,46.5053 +36.289693,24.4619 +36.257444,57.5816 +36.306153,9.1622 +36.248363,68.8179 +36.306552,10.9336 +36.309372,9.2674 +36.310915,9.2049 +36.303656,16.7626 +36.295035,28.0017 +36.307612,16.3526 +36.293150,31.1774 +36.230983,93.7683 +36.290340,36.0491 +36.261258,66.2104 +36.201798,126.8814 +36.320419,8.5881 +36.312736,18.9539 +36.279825,52.1685 +36.301252,32.3268 +36.279297,55.4189 +36.315026,20.1302 +36.192665,143.2988 +36.328680,8.6429 +36.233664,104.3301 +36.269826,69.4960 +36.214501,125.3352 +36.331691,8.4128 +36.331994,9.5419 +36.244275,98.8323 +36.303081,40.5356 +36.294318,51.3699 +36.318640,27.8430 +36.317181,30.3186 +36.250355,98.6416 +36.300500,48.9380 +36.264399,86.2508 +36.274250,77.7833 +36.327469,25.0684 +36.315316,38.2135 +36.346484,8.2521 +36.317486,39.2578 +36.240821,118.8492 +36.326390,33.5886 +36.335156,25.8285 +36.343617,18.0455 +36.324752,37.2844 +36.347500,16.1359 +36.333579,30.6746 +36.356745,8.6136 +36.329008,37.6989 +36.352034,16.6233 +36.271384,98.1456 +36.360985,8.8876 +36.135837,234.8671 +36.324328,48.8329 +36.341536,32.1429 +36.354736,19.2696 +36.349438,24.8749 +36.366707,8.3914 +36.205519,171.5932 +36.369531,7.8858 +36.369873,8.4794 +36.373162,8.4583 +36.166166,216.0431 +36.248661,134.3502 +36.339836,43.5725 +36.312313,72.5900 +36.323038,62.1672 +36.370704,15.0043 +36.377112,9.4353 +36.314155,73.3461 +36.362037,27.0425 +36.374314,15.4676 +36.334716,56.3357 +36.359979,31.8489 +36.365359,27.8650 +36.348998,45.0633 +36.304367,90.6709 +36.350650,46.1644 +36.378353,19.4759 +36.320120,78.3839 +36.345689,54.1464 +36.377417,24.1563 +36.393224,8.8158 +36.266716,135.9556 +36.385709,17.3955 +36.387502,17.3353 +36.396815,9.6369 +36.391828,16.1715 +36.285776,123.4977 +36.300851,108.8065 +36.383012,27.2936 +36.290000,121.4646 +36.401574,11.4453 +36.402041,11.2568 +36.352538,62.2347 +36.406452,9.4417 +36.404838,11.3663 +36.335965,81.2037 +36.368658,49.3728 +36.374006,44.3491 +36.398505,22.1464 +36.397830,23.1235 +36.353530,68.8358 +36.381620,41.0467 +36.413298,10.6603 +36.297004,128.3735 +36.363637,63.5755 +36.323965,104.1558 +36.382209,46.2425 +36.267366,162.8028 +36.340104,90.6251 +36.410306,21.2650 +36.422366,9.6541 +36.394061,39.2439 +36.425378,9.2630 +36.359671,76.3820 +36.427213,9.2604 +36.402672,36.0092 +36.343108,95.8479 +36.417169,22.5780 +36.430169,9.8930 +36.411465,29.5419 +36.277438,165.6819 +36.385205,59.0438 +36.384904,59.6340 +36.389080,56.1091 +36.436053,9.7263 +36.399836,48.0081 +36.438682,9.4415 +36.438956,9.4322 +36.279009,171.2161 +36.408000,44.4492 +36.409275,43.8157 +36.339322,114.1509 +36.443121,11.0320 +36.422667,32.1614 +36.414773,41.3126 +36.289365,167.7674 +36.391052,67.0529 +36.447844,10.6519 +36.428452,30.6708 +36.430729,30.5925 +36.395039,66.5953 +36.452450,9.4682 +36.403105,59.3117 +36.409658,53.9605 +36.456086,10.0406 +36.444250,23.2630 +36.337994,129.8385 +36.434641,34.4232 +36.444538,25.1032 +36.461634,8.2934 +36.461919,9.3755 +36.450226,21.4270 +36.453091,18.9652 +36.418031,56.7311 +36.445189,30.1050 +36.337324,138.7722 +36.467513,9.9227 +36.413020,65.9280 +36.383409,96.1812 +36.361663,118.2083 +36.471295,9.2479 +36.428122,53.9574 +36.432021,50.9261 +36.440062,44.0641 +36.475295,9.6585 +36.386548,99.7580 +36.458106,28.8368 +36.415894,73.3340 +36.480543,8.9858 +36.457133,33.9582 +36.484127,9.1377 +36.484954,8.8913 +36.486307,7.9993 +36.431572,63.0805 +36.453474,43.9089 +36.416205,81.6611 +36.459124,39.6443 +36.491092,9.0105 +36.479872,21.7597 +36.493265,8.8945 +36.493846,8.5948 +36.494306,8.7423 +36.439747,64.2005 +36.462417,42.5108 +36.364254,142.1705 +36.497383,10.1461 +36.445780,63.9767 +36.479591,30.5002 +36.469065,42.3430 +36.474763,37.0776 +36.420652,92.4339 +36.423959,90.6856 +36.373680,142.7845 +36.458497,58.4651 +36.500103,17.8254 +36.454153,65.5528 +36.510092,10.7307 +36.467833,55.4095 +36.389782,133.9478 +36.506425,17.7227 +36.454829,70.0700 +36.420953,105.7302 +36.489229,37.7328 +36.477436,49.9767 +36.463619,64.1450 +36.519707,9.0576 +36.523243,8.3439 +36.436473,95.7165 +36.375099,158.2384 +36.472057,62.1511 +36.448389,86.9115 +36.469642,65.9516 +36.503948,32.3652 +36.527413,9.7671 +36.504928,33.3725 +36.509757,28.8547 +36.482948,57.4479 +36.524148,16.8722 +36.531588,10.3170 +36.513086,30.3099 +36.502441,42.0677 +36.486943,58.3964 +36.482080,63.6750 +36.478948,67.2995 +36.418356,130.1095 +36.503049,45.7126 +36.517929,31.4585 +36.537181,12.6385 +36.511841,40.1560 +36.527764,25.3620 +36.494653,59.0104 +36.489529,65.5670 +36.441007,114.6089 +36.535594,21.9699 +36.534208,24.5901 +36.433306,126.5743 +36.551997,9.9615 +36.541021,23.0315 +36.498768,66.1843 +36.538612,27.4615 +36.461323,105.1468 +36.545755,21.2917 +36.526962,41.7331 +36.553127,17.2044 +36.549820,21.2566 +36.533338,38.3035 +36.526684,46.4033 +36.548762,24.7819 +36.538301,36.8998 +36.543396,33.8812 +36.466127,112.4454 +36.555617,23.3827 +36.544509,34.9590 +36.520823,59.0433 +36.532190,49.0272 +36.476097,106.0290 +36.573088,9.5689 +36.536314,49.0561 +36.471653,114.1506 +36.555097,31.3761 +36.502160,85.3941 +36.581218,8.1593 +36.564053,25.8602 +36.559880,31.5894 +36.524900,66.8768 +36.514645,79.0634 +36.570332,25.2535 +36.579468,16.7208 +36.553664,43.0902 +36.587589,9.9856 +36.579867,19.5886 +36.564953,35.3232 +36.545340,56.2464 +36.501632,100.8313 +36.579000,23.8853 +36.573544,29.6470 +36.596190,8.3932 +36.582657,23.6951 +36.511408,96.4158 +36.582126,26.5591 +36.585371,23.6223 +36.528765,81.3095 +36.558799,52.8983 +36.604583,8.6235 +36.469928,143.8172 +36.589914,26.0380 +36.516962,99.9641 +36.567047,50.2742 +36.597576,20.4064 +36.601587,18.0228 +36.602886,17.9320 +36.595586,26.7300 +36.575202,47.4157 +36.596755,27.2580 +36.549388,75.2492 +36.591777,33.1484 +36.606353,19.3856 +36.615952,10.4655 +36.541905,87.1608 +36.619610,9.7639 +36.610075,21.1982 +36.608686,23.6858 +36.593709,39.7783 +36.613207,20.8124 +36.625739,9.0962 +36.616927,18.5270 +36.548466,88.8817 +36.603192,34.9072 +36.307958,331.2036 +36.617982,22.0413 +36.631273,10.1100 +36.632372,10.2684 +36.624013,19.0374 +36.624926,20.2130 +36.622316,23.8391 +36.589378,57.4757 +36.523730,123.7094 +36.516465,131.6287 +36.568696,81.7581 +36.602464,48.3116 +36.577278,74.0035 +36.641384,10.5298 +36.643051,11.2589 +36.626418,28.8226 +36.613746,42.4743 +36.634836,23.3360 +36.599456,59.1273 +36.497866,161.2059 +36.650776,8.7339 +36.571642,90.9956 +36.571077,92.0382 +36.651282,12.9322 +36.633487,32.3243 +36.617322,50.1086 +36.600277,67.5810 +36.642641,26.0920 +36.448124,221.8822 +36.646854,24.2022 +36.645139,26.7064 +36.620818,52.3735 +36.665812,8.8780 +36.622618,52.3664 +36.608993,68.7586 +36.611697,67.5108 +36.650454,29.3943 +36.655241,25.6228 +36.659072,22.6389 +36.629375,53.3784 +36.561959,121.3654 +36.507530,176.3382 +36.674985,9.1716 +36.640024,46.5550 +36.646156,41.2718 +36.557564,130.3949 +36.639162,49.7439 +36.659510,30.0158 +36.667431,24.1231 +36.566470,125.5582 +36.535301,157.5503 +36.671057,23.7503 +36.651914,44.1235 +36.679849,19.3576 +36.566074,133.5354 +36.658172,42.1749 +36.674691,27.7281 +36.647440,56.0614 +36.540396,163.5155 +36.656221,48.3834 +36.673192,32.8882 +36.670006,37.1512 +36.663116,44.3555 +36.699610,9.1327 +36.692852,17.9490 +36.637348,74.6573 +36.591470,120.9322 +36.683868,30.5451 +36.696038,18.6619 +36.694808,20.5005 +36.706081,10.2649 +36.692029,26.2051 +36.667858,50.6429 +36.629066,90.1804 +36.638099,82.3465 +36.699207,21.5670 +36.677752,43.4100 +36.624638,98.8708 +36.714414,9.3767 +36.714700,9.3615 +36.716346,9.8583 +36.671846,54.7944 +36.703912,24.6404 +36.700348,29.0100 +36.654310,75.3577 +36.689526,40.6044 +36.720446,9.9581 +36.723509,8.7823 +36.723791,8.8075 +36.578573,154.5299 +36.724062,9.7759 +36.664215,70.6400 +36.726641,9.5450 +36.704604,32.1948 +36.719247,18.8277 +36.729358,9.6850 +36.732292,8.2630 +36.707472,34.9930 +36.734855,8.4763 +36.720775,23.9722 +36.702419,42.7480 +36.730405,15.4154 +36.738075,8.5496 +36.679209,68.6861 +36.740555,8.3724 +36.688906,62.2059 +36.607825,144.0689 +36.712403,41.6571 +36.703502,51.3776 +36.746625,8.7112 +36.710801,45.9185 +36.718234,39.1773 +36.586473,171.3403 +36.707158,51.4462 +36.729669,29.8276 +36.736800,24.8227 +36.585804,176.4113 +36.754061,8.4514 +36.755337,9.5821 +36.683325,83.0962 +36.691555,76.4238 +36.684157,84.5600 +36.718502,50.9956 +36.747895,22.0511 +36.751113,20.3977 +36.762216,10.6817 +36.546248,227.8612 +36.682754,91.8285 +36.712006,64.1840 +36.745821,30.9967 +36.756720,20.9728 +36.757412,20.9802 +36.733839,45.3466 +36.769947,10.0025 +36.732599,49.0267 +36.748928,33.5954 +36.743332,40.7062 +36.776190,8.1449 +36.728553,56.7346 +36.764920,21.3651 +36.767979,20.9374 +36.768717,20.6149 +36.754880,35.2234 +36.771511,19.4870 +36.784039,8.4167 +36.772898,20.7999 +36.784336,9.6703 +36.680865,115.1961 +36.757814,38.9242 +36.687428,109.9198 +36.766422,31.4479 +36.779186,19.3116 +36.687960,112.6937 +36.777694,24.0909 +36.792456,10.0431 +36.745168,59.7933 +36.785288,20.4484 +36.776818,29.5931 +36.662638,144.2583 +36.786285,21.4538 +36.668733,139.9736 +36.759497,51.4107 +36.796061,15.6668 +36.744747,68.2042 +36.733103,81.7408 +36.805737,9.4980 +36.774110,42.9660 +36.635454,182.0202 +36.761623,56.5279 +36.762513,56.8159 +36.789333,30.5583 +36.782524,37.7513 +36.797870,24.9344 +36.814844,8.2561 +36.815235,8.9102 +36.658584,165.8930 +36.774583,51.4636 +36.726205,100.9617 +36.802499,26.1221 +36.820276,8.9030 +36.807740,23.8283 +36.634020,198.7561 +36.824477,9.8050 +36.790104,46.8450 +36.742465,94.8763 +36.801785,35.8690 +36.811728,26.7944 +36.781626,57.3895 +36.715309,125.3504 +36.832777,8.8346 +36.769498,72.6480 +36.788917,56.2317 +36.828622,17.2223 +36.800654,45.4814 +36.829179,17.9447 +36.826047,21.6459 +36.778392,69.9994 +36.838523,10.6486 +36.818151,32.0633 +36.810908,40.7158 +36.751894,101.3644 +36.736187,119.1289 +36.845845,10.1392 +36.847124,9.1497 +36.823101,35.1132 +36.850215,8.9068 +36.827167,33.0799 +36.686580,174.5007 +36.808708,53.2463 +36.794006,68.2613 +36.806917,55.7517 +36.855984,8.0474 +36.856274,9.0480 +36.790998,77.3795 +36.845149,23.5586 +36.817475,52.2445 +36.708744,161.7940 +36.847693,24.1215 +36.864032,8.9266 +36.779950,93.6972 +36.793699,80.4478 +36.721163,154.7523 +36.819329,57.2147 +36.798498,80.5287 +36.851624,28.1414 +36.758605,122.0691 +36.846136,35.4838 +36.812952,69.0459 +36.836949,45.9282 +36.848392,36.2873 +36.872959,12.0011 +36.822805,62.8320 +36.875916,10.2161 +36.817076,70.3679 +36.859122,30.1696 +36.806412,83.3265 +36.824146,66.3640 +36.881998,9.3074 +36.882878,9.6736 +36.862669,31.4414 +36.839016,56.3889 +36.887445,9.2014 +36.862268,34.9339 +36.860248,39.1552 +36.861081,38.6786 +36.891306,9.1054 +36.849173,52.2884 +36.865323,39.3341 +36.879766,25.5493 +36.855316,50.5036 +36.797348,110.1319 +36.885638,22.1718 +36.899403,8.7152 +36.889739,21.5344 +36.892552,19.1342 +36.879027,33.0958 +36.876544,36.1424 +36.842146,71.7631 +36.905316,10.6519 +36.681712,236.5623 +36.841612,77.3650 +36.648094,271.5033 +36.834282,86.8478 +36.908119,13.8459 +36.913910,9.1454 +36.900412,23.0431 +36.804962,120.2969 +36.894111,31.9420 +36.880674,46.2204 +36.730131,197.8505 +36.897203,31.6659 +36.874147,56.0651 +36.871815,59.5439 +36.884680,49.3361 +36.873647,60.9157 +36.861954,73.1032 +36.915968,20.4853 +36.928869,8.8865 +36.907481,30.8187 +36.870538,68.4106 +36.896647,44.1556 +36.796739,146.3042 +36.911274,32.9285 +36.927982,16.6874 +36.889292,55.8007 +36.881620,63.9006 +36.868378,83.0591 +36.937756,15.1338 +36.923456,30.4681 +36.912687,43.5630 +36.919598,36.9551 +36.907810,49.0494 +36.943044,14.4689 +36.921965,37.8580 +36.904658,58.2117 +36.840659,123.0143 +36.895405,71.7608 +36.956251,11.2404 +36.925259,42.9322 +36.837342,131.3129 +36.956553,12.6656 +36.945094,26.5713 +36.901461,70.6269 +36.921131,51.4795 +36.886132,88.5896 +36.935058,40.2465 +36.931359,47.2141 +36.923056,55.9023 +36.911687,67.8869 +36.971665,9.0753 +36.963674,17.4591 +36.951439,30.0106 +36.890511,92.5144 +36.926895,57.0771 +36.918275,66.7278 +36.739044,247.2899 +36.978574,8.8004 +36.945521,42.5149 +36.972611,16.9829 +36.967492,23.5294 +36.979574,13.0552 +36.940803,52.6248 +36.936454,57.7451 +36.986334,8.1915 +36.930212,66.4655 +36.952891,45.1053 +36.981134,18.9306 +36.819891,180.8459 +36.972089,29.2376 +36.992630,8.9931 +36.968655,36.1087 +36.989594,15.4516 +36.944670,60.7874 +36.868708,137.4434 +36.988037,19.3035 +36.884961,123.1050 +36.934564,74.2172 +36.831568,179.3252 +36.983026,28.3899 +36.938300,74.7861 +36.991021,23.2941 +37.006152,8.5890 +36.994199,21.8090 +36.944203,73.7606 +36.967167,51.5383 +36.983973,35.8412 +36.957513,63.2132 +36.974722,47.6467 +37.014316,9.0593 +37.014741,9.6535 +37.001623,24.7792 +36.956860,70.2323 +37.013086,16.9656 +37.008066,22.3147 +36.938949,91.8207 +37.011416,21.2631 +36.969220,65.0623 +37.001327,33.5936 +37.026403,8.8943 +37.027093,9.6832 +36.993428,45.3226 +37.007341,31.6938 +37.000738,39.0102 +36.978959,61.3807 +36.968192,74.9632 +37.034282,9.2166 +36.962870,81.8531 +36.975305,69.7332 +37.019814,26.5156 +37.038751,8.7270 +36.953924,94.2150 +37.017964,32.6370 +36.997997,78.6107 +36.837654,240.3805 +37.030382,48.3360 +37.004764,75.2047 +36.869720,210.5443 +37.035298,45.2484 +37.023376,59.2643 +36.996678,86.6560 +36.853259,230.7964 +37.076609,9.2645 +37.030053,57.5117 +36.959824,128.7670 +37.005046,84.8029 +37.024395,66.3368 +37.020726,70.5376 +36.994526,98.3325 +37.047479,46.5506 +37.030770,63.7480 +36.985003,110.0278 +37.044724,51.1584 +37.087565,10.0115 +37.016009,81.8872 +37.088592,10.0562 +37.078718,22.6032 +37.045039,56.9905 +37.008782,94.1656 +37.048140,55.2567 +37.034921,70.0889 +37.043499,62.5992 +37.097577,8.8260 +37.089850,17.2708 +37.083335,26.5006 +37.032679,79.5449 +37.043155,70.2317 +37.082641,32.0198 +37.085873,29.4164 +36.934017,181.6774 +37.091265,24.8362 +37.098649,19.4739 +36.987375,131.2380 +37.097897,21.6984 +36.981450,139.0031 +37.000065,123.0270 +37.114661,8.7156 +37.046331,77.3627 +37.109836,14.3578 +37.039035,86.7499 +37.036776,90.1267 +37.084056,43.4924 +37.112225,15.8207 +37.039749,89.8538 +37.005458,125.6728 +37.106099,26.0182 +37.123092,9.9482 +37.125785,9.8781 +37.103397,32.5472 +37.094519,41.9264 +36.858215,281.0255 +37.116101,23.4194 +37.080547,60.1573 +37.010894,130.4273 +36.926053,216.4149 +37.101322,41.4455 +37.078035,65.0639 +37.080265,64.3095 +37.123694,23.0932 +37.124194,23.3358 +37.106403,41.4825 +37.094030,54.7590 +36.912123,238.0337 +37.022370,128.5242 +37.040340,111.0070 +37.120454,32.8702 +37.050601,103.2538 +37.095883,59.9480 +37.146787,10.8096 +37.119595,38.8189 +37.150158,9.3793 +37.105010,56.6320 +37.132118,29.8233 +37.147531,14.9616 +36.905820,257.1873 +37.118614,44.7854 +37.155831,9.4169 +37.141322,27.3848 +37.102030,67.1897 +37.147886,21.8933 +37.018706,151.5254 +37.161941,9.2920 +36.899760,271.7638 +37.079970,92.9807 +37.135945,38.5951 +37.113387,61.8296 +37.123377,53.9720 +36.918977,258.6645 +37.163008,16.5159 +37.133041,46.8356 +37.142469,37.9894 +37.139241,41.5197 +37.092859,89.8518 +37.171234,12.4550 +37.128046,56.8054 +37.095031,90.6545 +37.169220,17.1888 +37.177349,9.6866 +37.163399,25.5582 +37.139521,49.7203 +37.179524,11.3940 +37.158415,33.8740 +37.161643,31.3375 +37.182711,10.5728 +37.184852,9.8500 +37.168707,27.4871 +37.102948,93.6175 +37.127549,69.5788 +37.188958,10.6193 +37.090733,109.1317 +37.107121,93.0817 +37.144575,58.1155 +36.980741,222.3419 +37.115695,87.8830 +37.186409,17.4913 +37.196566,9.0574 +37.183690,23.7576 +37.157598,51.6289 +37.192981,17.4046 +37.115290,96.0227 +37.165249,46.4750 +37.192289,21.1092 +37.180761,33.8909 +37.175217,40.7335 +37.207448,9.9757 +37.140704,77.8645 +37.193284,25.7252 +37.187036,33.5185 +37.211724,9.1480 +37.185686,37.0808 +37.118123,105.0231 +37.135664,88.1742 +37.200203,25.4714 +37.179877,46.8210 +37.217424,9.8124 +37.218569,9.8541 +37.180458,48.4511 +37.194703,35.9955 +37.196195,35.4001 +37.203578,28.3749 +37.199865,34.6496 +37.169780,65.7139 +37.203901,32.2718 +37.203083,35.1304 +37.159537,79.1789 +37.211313,28.1287 +37.215951,23.8433 +37.214652,27.1331 +37.220872,22.0802 +37.143100,100.4711 +37.234515,9.8381 +37.210386,36.5328 +37.205624,41.6361 +37.131131,118.8980 +37.223839,27.4233 +37.172951,78.8251 +37.153855,99.4446 +37.150894,103.0390 +37.235495,19.1118 +37.231954,24.6961 +37.246919,11.7353 +37.190919,68.0383 +37.199578,61.1900 +37.213399,48.3188 +37.236173,25.8602 +37.126904,135.9962 +37.223146,41.3621 +37.243571,21.8066 +37.227237,39.1684 +37.247260,20.0622 +37.220555,47.8297 +37.170231,99.4473 +37.253301,17.0030 +37.228910,43.7862 +37.209227,65.1038 +37.244353,31.5540 +37.256650,19.8617 +37.129603,148.3780 +37.262034,16.3991 +37.258958,20.1723 +37.262900,17.1155 +37.174540,107.3795 +37.241786,43.1734 +37.260768,24.4968 +37.270304,15.7702 +37.226699,59.7043 +37.151347,135.3995 +37.258655,29.7497 +37.261718,28.5338 +37.264509,26.2614 +37.281921,9.9154 +37.278433,16.0164 +37.274331,22.0106 +37.136446,160.2308 +37.272697,24.4139 +37.171525,127.2910 +37.268386,31.4080 +37.238214,62.3361 +37.162493,138.4988 +37.288405,14.4888 +37.296343,8.4725 +37.239795,67.2638 +37.189242,118.4486 +37.276513,31.7767 +37.239443,69.2839 +37.286075,23.0907 +37.197128,112.4205 +37.291837,20.2516 +37.142768,170.2619 +37.304816,10.1818 +37.300551,14.7726 +37.153325,163.4237 +37.265379,51.7202 +37.250030,69.3238 +37.242953,77.2974 +37.280017,40.5900 +37.297111,25.1646 +37.286748,36.8737 +37.148789,175.6374 +37.315324,9.8723 +37.307691,20.4936 +37.279130,49.4758 +37.299794,30.3045 +37.266406,63.9850 +37.314998,16.1738 +37.322276,10.4284 +37.285265,48.1866 +37.323622,10.6326 +37.316749,18.8352 +37.308290,29.1564 +37.202691,135.5820 +37.313031,26.1780 +37.308727,32.5213 +37.300992,40.9414 +37.277982,64.5557 +37.290253,53.1214 +37.320251,24.5832 +37.309549,35.6081 +37.177643,168.0354 +37.228424,118.4842 +37.338273,10.5531 +37.251262,98.3247 +37.330391,21.4822 +37.238717,113.4573 +37.269679,83.8455 +37.286404,67.8680 +37.230699,124.1219 +37.284960,70.5201 +37.346909,9.0683 +37.339209,18.4869 +37.298816,60.3518 +37.351874,7.9583 +37.345679,16.7108 +37.352175,10.5374 +37.330099,33.0743 +37.324427,41.2031 +37.341934,24.2443 +37.307060,61.1860 +37.225675,142.9086 +37.319354,49.5637 +37.359833,9.5408 +37.362390,8.9128 +37.348827,24.8407 +37.267323,108.1154 +37.354272,21.6866 +37.302894,74.0779 +37.337447,40.3033 +37.275908,102.4318 +37.357696,22.4935 +37.328607,51.9860 +37.344835,36.2526 +37.368918,13.6860 +37.296677,87.2833 +37.375439,8.9864 +37.345158,40.5101 +37.362712,23.2880 +37.365631,22.1635 +37.355977,32.3951 +37.366179,22.5174 +37.380190,10.1469 +37.254607,137.2974 +37.335585,56.7832 +37.385668,8.5099 +37.333453,61.9218 +37.353525,43.2512 +37.373668,24.6815 +37.349587,49.1912 +37.341249,58.2694 +37.222767,178.5242 +37.368585,34.5805 +37.394179,9.3849 +37.331172,73.9915 +37.369374,36.6139 +37.312089,94.2328 +37.317099,91.6018 +37.388373,20.6670 +37.388696,20.7011 +37.328185,84.4352 +37.231596,181.3160 +37.368246,46.3713 +37.375959,39.2628 +37.396777,19.0634 +37.384426,31.8186 +37.354821,62.8169 +37.403166,15.9707 +37.320607,99.1411 +37.386001,34.8841 +37.355480,67.9291 +37.376973,47.3201 +37.294450,130.4424 +37.387795,37.9918 +37.395375,31.3786 +37.401292,26.6223 +37.380593,47.8117 +37.325197,103.7491 +37.399519,30.8667 +37.423410,8.5583 +37.382605,50.1451 +37.424293,9.9989 +37.359168,76.5837 +37.363174,73.1464 +37.332705,104.9257 +37.420885,17.1592 +37.415222,24.0633 +37.253934,185.9546 +37.391905,48.5226 +37.431969,9.6680 +37.378340,64.9328 +37.377751,67.0836 +37.251777,193.7021 +37.437631,8.1620 +37.409398,39.3441 +37.219010,230.2905 +37.432750,17.3713 +37.290771,159.8971 +37.417639,33.9051 +37.398350,55.7410 +37.412912,42.4867 +37.343375,112.3515 +37.414618,42.7395 +37.424893,33.7070 +37.428405,31.6665 +37.441637,19.0411 +37.430386,32.4587 +37.434293,29.9036 +37.436321,28.6922 +37.451544,14.3899 +37.381088,85.1561 +37.445794,21.0342 +37.450122,18.1208 +37.448743,20.4476 +37.454091,16.4206 +37.462845,9.0247 +37.408702,65.2158 +37.412621,63.0989 +37.409040,67.0814 +37.444835,32.8947 +37.403564,74.5599 +37.419749,60.3749 +37.443274,37.2349 +37.405988,75.3136 +37.455727,26.6914 +37.473918,10.1666 +37.466828,18.6964 +37.460679,26.7495 +37.466244,21.8202 +37.383961,107.4043 +37.468244,23.5147 +37.458601,33.8998 +37.406322,86.9825 +37.435753,60.2550 +37.440428,56.1599 +37.439889,57.1389 +37.476122,22.1278 +37.477730,23.1574 +37.425787,77.8375 +37.478125,26.2247 +37.480509,24.1444 +37.482419,24.1341 +37.475720,31.3385 +37.439286,68.1903 +37.469191,38.8076 +37.500888,10.1565 +37.465014,46.7153 +37.470512,41.4827 +37.484085,28.6798 +37.309166,205.2996 +37.427915,86.9551 +37.487429,27.7438 +37.342538,173.9140 +37.392368,125.5129 +37.491759,26.6238 +37.455399,64.9077 +37.438045,83.1871 +37.503625,17.9101 +37.415841,106.3769 +37.514870,10.1482 +37.504350,21.1471 +37.507477,19.5046 +37.485525,41.9444 +37.405164,122.7183 +37.521536,8.8252 +37.445479,85.6525 +37.507059,25.3889 +37.419137,113.8090 +37.480124,53.8068 +37.515173,19.9908 +37.492501,44.2276 +37.465935,72.4790 +37.457358,81.4457 +37.493305,47.9245 +37.517882,23.8201 +37.511045,30.9381 +37.511729,31.8969 +37.416245,127.8128 +37.535164,10.1824 +37.527883,19.3208 +37.532448,15.0422 +37.390338,157.8584 +37.428947,119.7464 +37.464197,86.4622 +37.541230,10.5758 +37.521233,30.9718 +37.491365,61.1204 +37.538414,16.0331 +37.532946,22.1270 +37.527470,28.8021 +37.471871,85.6495 +37.398779,159.4741 +37.531132,27.6982 +37.518383,42.2651 +37.504654,56.8726 +37.481302,80.8644 +37.545347,18.7622 +37.496008,68.7271 +37.550660,15.1473 +37.558831,8.9260 +37.511995,56.4793 +37.543627,26.5529 +37.530361,40.1427 +37.547491,24.0764 +37.557521,14.6317 +37.512765,62.3394 +37.548197,28.3434 +37.558254,19.5053 +37.516452,62.4169 +37.565807,14.5411 +37.371303,209.6572 +37.506553,74.8183 +37.538804,43.8341 +37.460072,123.4947 +37.514466,69.4905 +37.488065,97.6418 +37.552486,33.8745 +37.450669,137.7054 +37.541702,47.4638 +37.496588,93.0803 +37.580349,9.8980 +37.562167,30.2704 +37.547204,46.5826 +37.561527,32.8234 +37.572153,23.8268 +37.334255,262.6561 +37.554448,42.8575 +37.570180,27.5442 +37.560649,38.1729 +37.552205,48.0533 +37.525497,75.1904 +37.594351,8.4950 +37.571568,33.9453 +37.555074,50.7533 +37.541983,65.1079 +37.583957,23.7647 +37.590247,18.7788 +37.522218,87.1362 +37.578870,31.4458 +37.520307,90.2974 +37.597306,15.7013 +37.595980,17.4670 +37.564736,50.6795 +37.607092,9.7581 +37.568475,49.0313 +37.426754,191.0569 +37.586361,31.8600 +37.593787,25.5552 +37.536729,82.9065 +37.602846,18.7369 +37.596912,25.0740 +37.613008,9.8888 +37.615416,10.1016 +37.583568,42.2556 +37.570505,56.0898 +37.588375,38.9879 +37.575105,54.3489 +37.582639,47.4235 +37.497028,133.3659 +37.526982,103.7415 +37.600259,31.5532 +37.551806,81.7790 +37.605514,28.4593 +37.625824,9.0607 +37.621986,14.2118 +37.507999,129.9536 +37.498251,140.3422 +37.576540,63.1541 +37.556273,84.3375 +37.616851,25.5933 +37.610605,32.4749 +37.633973,9.5095 +37.605827,38.6551 +37.636198,9.9464 +37.617811,28.9109 +37.637953,10.1296 +37.626595,21.9552 +37.642444,8.5493 +37.609027,42.8754 +37.643483,9.2501 +37.631812,23.9325 +37.544058,111.9653 +37.585707,70.5798 +37.625518,31.0459 +37.646723,10.1406 +37.589669,68.9263 +37.525019,134.6460 +37.629455,30.7899 +37.650994,9.6564 +37.652734,10.4165 +37.449301,214.2005 +37.589167,74.6113 +37.619636,45.5483 +37.617507,49.5464 +37.627363,40.3075 +37.646145,21.8300 +37.638593,29.9183 +37.610316,58.5790 +37.577759,92.5267 +37.619343,52.7180 +37.621584,51.9537 +37.660651,13.2192 +37.658596,18.4241 +37.607722,69.9309 +37.656287,21.7567 +37.581372,97.0906 +37.670287,10.3079 +37.630063,51.1622 +37.622897,58.7697 +37.643081,40.2804 +37.665185,19.2353 +37.656564,29.5235 +37.634885,52.3124 +37.678463,12.4566 +37.656024,35.2263 +37.600688,90.8643 +37.548694,143.2771 +37.567757,124.6143 +37.648083,46.3524 +37.686088,9.3289 +37.630395,66.0477 +37.597725,99.9606 +37.667976,31.8092 +37.690920,9.1489 +37.673871,26.5115 +37.677020,25.8677 +37.681225,22.0304 +37.694436,9.3153 +37.695418,9.3545 +37.687198,19.5598 +37.668512,38.7385 +37.644483,63.2110 +37.699785,8.6479 +37.580961,127.8471 +37.692372,18.6899 +37.702889,8.4711 +37.703256,8.7745 +37.672062,42.7175 +37.683361,31.9632 +37.613448,103.4960 +37.633586,85.0792 +37.711062,8.6139 +37.663778,56.2052 +37.533931,186.4973 +37.711360,9.6384 +37.660245,61.5718 +37.714780,8.8552 +37.667671,56.5913 +37.715325,9.7985 +37.609355,117.6606 +37.708434,19.4559 +37.651903,77.1749 +37.678044,51.4435 +37.640611,90.8606 +37.681667,50.6142 +37.723635,9.1035 +37.691971,41.6783 +37.720429,15.6681 +37.727890,8.8802 +37.656864,80.3003 +37.667054,72.6278 +37.712031,27.9348 +37.731472,8.7549 +37.598822,141.8853 +37.703752,39.9587 +37.724263,19.7298 +37.721817,22.6915 +37.716944,27.8995 +37.680595,65.2060 +37.737165,10.8398 +37.739682,8.9641 +37.696443,52.5572 +37.739966,9.7438 +37.740708,12.0758 +37.743993,9.4477 +37.707695,48.2857 +37.706758,50.0148 +37.707251,49.8511 +37.720999,37.0622 +37.732739,25.7502 +37.729488,29.3896 +37.708808,51.4539 +37.740227,21.7562 +37.753441,9.0770 +37.718665,45.5106 +37.755981,8.4812 +37.648551,117.3876 +37.756773,9.4546 +37.748005,19.7778 +37.564110,205.0518 +37.655745,113.7917 +37.704773,65.1837 +37.592438,178.1416 +37.639695,132.9007 +37.677654,95.4359 +37.764177,10.1744 +37.764462,11.2218 +37.700383,76.2277 +37.765939,11.3922 +37.733650,45.1098 +37.700069,79.3174 +37.767783,12.5347 +37.659666,123.1737 +37.732282,50.8851 +37.744509,39.4370 +37.668895,117.0198 +37.761984,24.2272 +37.719984,68.8673 +37.749711,39.5448 +37.673538,117.3492 +37.725124,67.1590 +37.777331,15.8353 +37.757103,36.7249 +37.727016,67.2307 +37.785916,9.2594 +37.729078,68.2962 +37.691250,107.6037 +37.769162,30.1149 +37.744844,54.9032 +37.776611,23.9298 +37.684420,118.7067 +37.691553,112.1039 +37.743711,62.2574 +37.752784,53.6877 +37.774351,33.8598 +37.749000,60.7602 +37.758490,52.1363 +37.770580,40.3751 +37.760263,51.2091 +37.697686,116.7321 +37.798855,16.3052 +37.766228,49.4060 +37.806472,9.5368 +37.769957,46.3370 +37.663151,155.3194 +37.783947,35.1258 +37.799748,20.2791 +37.803128,18.1555 +37.792284,31.1133 +37.762519,62.2176 +37.811472,14.0136 +37.793828,32.1513 +37.736771,92.3299 +37.663502,166.0183 +37.748647,81.6573 +37.779387,52.4119 +37.818471,14.6562 +37.808212,26.0465 +37.825980,8.9274 +37.810956,25.4415 +37.786212,50.8688 +37.789256,48.1196 +37.829101,9.5573 +37.782840,57.3257 +37.821284,20.1999 +37.833128,9.0062 +37.788852,54.7401 +37.836398,8.4471 +37.719677,125.4778 +37.815635,31.0491 +37.840166,7.9734 +37.825486,23.1056 +37.824737,26.2507 +37.834259,17.8752 +37.800541,52.3459 +37.830305,23.1141 +37.758879,96.7733 +37.838659,17.4980 +37.816010,40.4785 +37.814419,43.3766 +37.810627,49.1314 +37.852134,7.9091 +37.844845,18.0832 +37.855652,7.8720 +37.846684,17.4566 +37.843592,20.9307 +37.842134,24.3384 +37.823397,43.5641 +37.618222,249.3738 +37.859759,8.1551 +37.783167,85.0636 +37.860044,8.9803 +37.820027,51.9501 +37.793167,79.2262 +37.862929,10.0455 +37.794247,79.9274 +37.848140,26.7952 +37.772596,103.1491 +37.803657,72.4637 +37.780318,97.9952 +37.856489,23.0237 +37.819073,60.9769 +37.745802,135.7018 +37.773090,108.8272 +37.852888,31.1127 +37.874175,11.0886 +37.869025,18.2576 +37.758062,129.9683 +37.778760,110.4407 +37.857796,31.7290 +37.874936,15.5070 +37.841484,49.9831 +37.805969,86.3371 +37.867596,26.8694 +37.853419,41.8132 +37.834908,61.8033 +37.829521,69.9524 +37.866962,32.9598 +37.769538,131.0634 +37.868231,32.8221 +37.871978,29.6458 +37.848592,54.8745 +37.866473,38.2755 +37.888031,17.7007 +37.881918,26.1455 +37.837081,72.1270 +37.894466,15.1393 +37.885264,26.3929 +37.881504,31.3859 +37.775685,137.6082 +37.850988,62.6055 +37.864523,49.7635 +37.736097,180.9541 +37.878314,39.0685 +37.909209,9.8564 +37.867914,51.4333 +37.880050,40.8855 +37.815160,106.0542 +37.872975,48.8648 +37.901624,21.3841 +37.895233,29.4275 +37.795176,130.1078 +37.892306,34.2742 +37.913594,14.1797 +37.876121,52.5479 +37.630724,298.7794 +37.920936,9.0341 +37.921215,9.0584 +37.903467,27.5542 +37.889525,44.3173 +37.914287,20.4009 +37.797375,137.7175 +37.889201,46.6880 +37.926581,10.7801 +37.927774,9.9194 +37.917052,22.2869 +37.799277,141.1096 +37.863525,77.7591 +37.904749,37.7568 +37.917383,26.0665 +37.900601,43.7506 +37.924661,21.6521 +37.899473,47.2926 +37.901054,47.7214 +37.912890,37.8281 +37.931022,20.5739 +37.845155,107.5933 +37.890443,62.6142 +37.884001,70.4213 +37.908064,46.6623 +37.934689,21.5733 +37.872394,84.2501 +37.948776,9.9188 +37.942506,16.9155 +37.929504,30.2320 +37.937694,23.2669 +37.930274,32.3478 +37.899922,63.3688 +37.946314,17.8670 +37.940387,24.4952 +37.911657,54.8578 +37.951597,15.3648 +37.856157,111.4533 +37.913293,55.4115 +37.960962,9.5253 +37.944353,28.6476 +37.919348,53.9847 +37.831800,141.9604 +37.935093,40.2407 +37.967611,9.0213 +37.905732,72.6680 +37.933843,45.0455 +37.953058,26.1139 +37.937362,43.2347 +37.962622,18.2515 +37.973001,9.4462 +37.921840,62.9603 +37.976633,8.5868 +37.896711,88.8049 +37.809761,176.2853 +37.941284,47.5757 +37.980597,8.6660 +37.864141,125.6954 +37.943450,49.5378 +37.879513,114.2929 +37.887283,107.0979 +37.958695,36.1414 +37.875746,120.8802 +37.946767,50.8162 +37.988861,9.0519 +37.954422,44.9519 +37.935890,64.5777 +37.993806,8.4765 +37.992988,9.9285 +37.973333,32.1902 +37.978889,27.0268 +37.928670,77.6131 +37.966962,40.4727 +37.997583,10.2309 +37.939339,68.8625 +37.964181,46.1545 +37.982447,28.3666 +37.923009,88.0978 +38.002283,9.5005 +37.816294,197.5149 +37.919065,95.0128 +37.984801,30.8092 +38.000468,15.4443 +37.966516,50.6917 +37.985220,32.9735 +37.980874,38.0560 +38.010814,9.4651 +37.790888,230.4219 +37.909606,112.0482 +38.013810,8.8908 +38.015611,9.4573 +37.973761,52.4906 +37.979172,49.0928 +37.994381,34.7568 +38.008202,21.2683 +37.925284,105.8119 +37.963291,68.1037 +38.005524,27.1129 +37.989263,43.6639 +38.026252,9.1323 +37.997913,38.7883 +37.950719,86.7226 +38.014079,24.8526 +38.002917,37.2137 +37.929971,110.4375 +37.978400,63.8232 +37.837376,205.1414 +37.954726,88.5916 +37.959422,84.4278 +38.022701,22.6041 +37.975334,70.4418 +38.036702,10.2258 +38.018194,31.2502 +38.010336,39.6749 +38.018931,31.4133 +38.011107,40.0151 +37.964883,88.2400 +38.005916,47.5170 +38.035384,18.3586 +38.032928,22.8091 +38.021654,35.7032 +38.006283,51.7769 +38.049445,10.2215 +38.011784,49.5769 +37.985517,76.5161 +38.015913,46.7021 +38.037442,25.9817 +38.029139,34.9649 +38.057358,8.3950 +38.025069,41.1166 +38.042224,24.6993 +38.059667,9.9394 +37.956644,114.5342 +38.032637,39.7937 +38.038932,34.3248 +38.065753,8.4880 +38.040131,34.7167 +37.959736,116.2615 +38.053124,24.4604 +38.058061,20.4917 +38.007815,71.2903 +38.071179,8.9090 +38.063424,19.2612 +38.055737,27.3005 +37.996627,87.0183 +38.053434,31.3913 +38.029471,56.7799 +38.031396,56.2077 +38.061362,27.3826 +38.066186,22.8693 +37.891468,199.0156 +38.082686,9.2703 +38.073257,20.0017 +37.994837,99.1100 +37.989837,104.4100 +38.086251,9.7763 +38.080089,16.3189 +38.043851,53.1359 +38.087604,11.7016 +38.017208,83.0392 +37.956263,145.0608 +38.091957,10.0508 +38.074849,27.4755 +38.083645,21.4455 +38.074242,31.1418 +37.968705,137.0552 +38.020280,86.7965 +38.072431,35.1906 +38.069607,39.5621 +38.078553,30.9187 +38.007435,103.3605 +38.102325,9.0326 +38.096987,16.1578 +38.062033,52.7516 +38.028265,87.0345 +38.090484,26.1286 +38.110796,7.2811 +38.040409,78.2084 +38.113145,7.5275 +38.043319,79.8202 +37.999375,124.6066 +37.970487,154.3015 +38.064104,61.8757 +38.118077,8.5409 +38.066924,61.3077 +38.046928,82.4646 +38.093259,37.5696 +38.123139,9.5600 +38.031096,101.9175 +38.051122,83.4786 +38.050012,84.9102 +38.107622,28.8564 +38.107077,30.1153 +38.109169,30.2333 +38.083038,57.1297 +38.093947,46.7143 +38.118618,22.3906 +38.132700,8.7014 +38.133014,9.6316 +37.986047,156.8742 +38.096408,48.1631 +38.101324,43.6680 +38.129393,16.4510 +38.130829,17.4626 +38.124789,24.0376 +38.079105,70.8363 +38.123982,26.4916 +38.142921,9.7852 +38.050344,103.0174 +38.137193,16.4881 +38.111358,44.1382 +38.045306,110.9105 +38.089056,68.4156 +38.148827,10.2475 +38.116613,43.7400 +37.952749,208.1089 +38.021310,142.0278 +38.105384,58.3680 +38.134922,29.3200 +38.100248,65.0492 +38.157472,8.9470 +38.134602,32.3439 +38.150474,17.3965 +38.145845,23.9429 +38.109472,61.1078 +38.062615,109.1480 +38.075998,96.8946 +38.153362,20.0932 +38.077585,97.0674 +38.139403,37.8842 +38.084825,93.2654 +38.152707,26.0450 +38.042518,136.9971 +38.128232,52.7516 +38.053743,129.2738 +38.166419,17.1609 +38.125980,59.2886 +38.167871,17.9436 +38.094248,95.5884 +38.166946,23.2589 +38.105091,85.3942 +38.160353,30.5482 +38.164243,27.0277 +38.136479,56.0558 +38.173456,20.9777 +38.045776,148.8589 +38.174652,20.6290 +38.172893,24.3412 +38.120673,76.7476 +38.141009,56.5073 +38.153681,45.4716 +38.126619,73.9607 +38.180984,19.6869 +38.159075,42.2288 +38.105761,96.6361 +38.163338,40.8525 +38.177288,27.2131 +38.148292,56.3756 +38.144992,60.3270 +38.160858,45.9378 +38.190486,16.5138 +38.140662,67.0787 +38.183581,25.3142 +38.185269,24.3790 +38.192536,17.7558 +38.142646,69.0186 +38.170580,41.6108 +38.191271,21.3559 +38.088745,125.0870 +38.114785,100.1044 +38.189837,26.1173 +38.099306,116.7453 +38.102008,115.8372 +38.178091,40.7597 +38.171764,47.2576 +38.140168,79.8241 +38.179515,40.7151 +38.155496,65.6017 +38.149942,72.2198 +38.190902,31.5133 +38.183018,40.7984 +38.163753,61.3776 +38.178753,46.4896 +38.144572,82.0824 +38.165297,61.4706 +38.169788,57.8532 +38.156217,72.6201 +38.185815,43.3018 +38.141402,88.4514 +38.096028,134.4075 +38.115300,115.6174 +38.190206,41.1258 diff --git a/src/cli/groups/add.py b/src/cli/groups/add.py index cac00605..d3170b13 100644 --- a/src/cli/groups/add.py +++ b/src/cli/groups/add.py @@ -22,12 +22,12 @@ help='Engine used to load the model (ovgenai, openvino, optimum)') @click.option('--model-type', '--mt', type=click.Choice([ - 'llm', 'vlm', 'whisper', 'qwen3_asr', 'kokoro', + 'llm', 'vlm', 'cb_llm', 'cb_vlm', 'whisper', 'qwen3_asr', 'kokoro', 'qwen3_tts_custom_voice', 'qwen3_tts_voice_design', 'qwen3_tts_voice_clone', 'emb', 'rerank', ]), required=True, - help='Model type (llm, vlm, whisper, qwen3_asr, kokoro, qwen3_tts_custom_voice, qwen3_tts_voice_design, qwen3_tts_voice_clone, emb, rerank)') + help='Model type (llm, vlm, cb_llm, cb_vlm, whisper, qwen3_asr, kokoro, qwen3_tts_custom_voice, qwen3_tts_voice_design, qwen3_tts_voice_clone, emb, rerank)') @click.option('--device', '--d', required=True, help='Device(s) to load the model on.') diff --git a/src/engine/ov_genai/continuous_batch_llm.py b/src/engine/ov_genai/continuous_batch_llm.py deleted file mode 100644 index ad493387..00000000 --- a/src/engine/ov_genai/continuous_batch_llm.py +++ /dev/null @@ -1,269 +0,0 @@ -import gc -import time -from typing import List, Dict, Optional - -import openvino as ov -from transformers import AutoTokenizer, BatchEncoding -from openvino_genai import ( - GenerationConfig, - ContinuousBatchingPipeline, - SchedulerConfig, -) - -from pydantic import BaseModel, Field - -class ContinuousBatchConfig(BaseModel): - max_num_batched_tokens: int = Field(default=2048, description="Maximum number of tokens to batch together") - max_num_seqs: int = Field(default=48, description="Maximum number of sequences (batch size)") - cache_size: int = Field(default=6, description="KV cache size in GB") - dynamic_split_fuse: bool = Field(default=True, description="Split prompt/generate phases") - enable_prefix_caching: bool = Field(default=True, description="Enable KV-block caching") - use_cache_eviction: bool = Field(default=False, description="Use cache eviction") - -class OVGenAI_ContinuousBatchText: - def __init__(self, model_dir: str, device: str, batch_config: ContinuousBatchConfig): - """ - Initialize the continuous batch text generation class. - - Args: - model_dir (str): Path to the OpenVINO model directory - device (str): Device to run inference on (default: "GPU.1") - batch_config (ContinuousBatchConfig): Configuration for batching parameters - """ - self.model_dir = model_dir - self.device = device - self.batch_config = batch_config - self.pipeline = None - self.encoder_tokenizer = None - - def load_model(self): - """Load the model and initialize the continuous batching pipeline.""" - # Initialize HuggingFace AutoTokenizer with chat template - self.encoder_tokenizer = AutoTokenizer.from_pretrained( - self.model_dir, - use_fast=True, - ) - - # Configure scheduler using the Pydantic model values - # SchedulerConfig does not take kwargs, so we need to set the values manually. Ugh. - scheduler_config = SchedulerConfig() - scheduler_config.max_num_batched_tokens = self.batch_config.max_num_batched_tokens - scheduler_config.max_num_seqs = self.batch_config.max_num_seqs - scheduler_config.cache_size = self.batch_config.cache_size - scheduler_config.dynamic_split_fuse = self.batch_config.dynamic_split_fuse - scheduler_config.enable_prefix_caching = self.batch_config.enable_prefix_caching - scheduler_config.use_cache_eviction = self.batch_config.use_cache_eviction - - # Initialize continuous batching pipeline - self.pipeline = ContinuousBatchingPipeline( - self.model_dir, - device=self.device, - scheduler_config=scheduler_config, - ) - - def unload_model(self): - """Unload the model and clear memory using garbage collection.""" - if self.pipeline: - del self.pipeline - self.pipeline = None - if self.encoder_tokenizer: - del self.encoder_tokenizer - self.encoder_tokenizer = None - gc.collect() - - def prepare_inputs(self, messages: List[Dict[str, str]]) -> ov.Tensor: - """ - Convert a chat-style messages list into an ov.Tensor - that can be consumed by ContinuousBatchingPipeline. - - Uses HuggingFace AutoTokenizer's apply_chat_template. - - Args: - messages (List[Dict[str,str]]): conversation turns, - e.g. [{"role": "user", "content": "Hello"}] - - Returns: - ov.Tensor: encoded prompt token IDs - """ - - prompt_token_ids = self.encoder_tokenizer.apply_chat_template( - messages, - add_generation_prompt=True, # ensures <|assistant|> token is added - skip_special_tokens=True, - return_tensors="np", # returns numpy.ndarray - ) - if isinstance(prompt_token_ids, BatchEncoding): - prompt_token_ids = prompt_token_ids['input_ids'] - return ov.Tensor(prompt_token_ids) - - def generate(self, prompts: List[List[Dict[str, str]]], generation_config: GenerationConfig): - """ - Generate responses for a batch of prompts. - - Args: - prompts: List of chat-format message lists - generation_config: Generation configuration - - Returns: - List of generation results - """ - - # Prepare tokenized inputs as ov.Tensors - encoded_prompts = [self.prepare_inputs(m) for m in prompts] - - # Duplicate configs for batch - generation_configs = [generation_config] * len(encoded_prompts) - - # Run generation - results = self.pipeline.generate(encoded_prompts, generation_configs) - return results - - def collect_metrics(self, results, prompts, start_time, end_time): - """ - Collect and display performance metrics from generation results. - - Args: - results: Generation results from pipeline.generate() - prompts: Original prompts for reference - start_time: Generation start time - end_time: Generation end time - """ - - total_tokens_generated = 0 - total_ttft = 0 - total_tpot = 0 - total_throughput = 0 - total_generate_duration = 0 - - print("Per-Prompt Performance Metrics:") - print("=" * 80) - - for i, result in enumerate(results): - perf_metrics = result.perf_metrics - - # Extract metrics - load_time = perf_metrics.get_load_time() - ttft = perf_metrics.get_ttft().mean - tpot = perf_metrics.get_tpot().mean - throughput = perf_metrics.get_throughput().mean - generate_duration = perf_metrics.get_generate_duration().mean - num_input_tokens = perf_metrics.get_num_input_tokens() - num_generated_tokens = perf_metrics.get_num_generated_tokens() - - # Aggregate - total_tokens_generated += num_generated_tokens - total_ttft += ttft - total_tpot += tpot - total_throughput += throughput - total_generate_duration += generate_duration - - # Note: result.m_generation_ids contains token IDs, not decoded text - decoded_output = self.encoder_tokenizer.decode( - result.m_generation_ids[0], - skip_special_tokens=True, - ) - - print(f"Prompt {i+1}: {prompts[i][0]['content'][:50]}...") - print(f" Load time: {load_time / 1000:.2f} s") - print(f" TTFT: {ttft / 1000:.2f} s") - print(f" TPOT: {tpot:.2f} ms/token") - print(f" Throughput: {throughput:.2f} tokens/s") - print(f" Generate duration: {generate_duration / 1000:.2f} s") - print(f" Input tokens: {num_input_tokens}") - print(f" Generated tokens: {num_generated_tokens}") - print(f" Response: {decoded_output[:200]}...") - print("-" * 80) - - # ------------------------------------------------------------------- - # Aggregate metrics - # ------------------------------------------------------------------- - num_prompts = len(results) - print("\nAggregate Performance Metrics:") - print("=" * 50) - print(f"Total processing time: {end_time - start_time:.2f} seconds") - print(f"Average time per prompt: {(end_time - start_time) / num_prompts:.2f} seconds") - print(f"Total tokens generated: {total_tokens_generated}") - print(f"Average TTFT: {total_ttft / num_prompts / 1000:.2f} s") - print(f"Average TPOT: {total_tpot / num_prompts:.2f} ms/token") - print(f"Average throughput: {total_throughput / num_prompts:.2f} tokens/s") - print(f"Average generate duration: {total_generate_duration / num_prompts / 1000:.2f} s") - print(f"Overall throughput: {total_tokens_generated / (end_time - start_time):.2f} tokens/s") - - # ------------------------------------------------------------------- - # Pipeline metrics - # ------------------------------------------------------------------- - metrics = self.pipeline.get_metrics() - print("\nPipeline System Metrics:") - print("=" * 50) - print(f"Requests processed: {metrics.requests}") - print(f"Scheduled requests: {metrics.scheduled_requests}") - print(f"Cache usage: {metrics.cache_usage:.2f}%") - print(f"Max cache usage: {metrics.max_cache_usage:.2f}%") - print(f"Average cache usage: {metrics.avg_cache_usage:.2f}%") - -def main(): - """Main entry point for the continuous batch text generation example.""" - # ------------------------------------------------------------------- - # Model directory (OpenVINO-IR export of quantized Llama 3.2 model) - # ------------------------------------------------------------------- - model_dir = "/mnt/Ironwolf-4TB/Models/OpenVINO/Qwen/Qwen3-1.7B-int8_asym-ov" - - # Create batch configuration - batch_config = ContinuousBatchConfig() - - # Initialize the continuous batch text generator - generator = OVGenAI_ContinuousBatchText( - model_dir=model_dir, - device="GPU.1", - batch_config=batch_config - ) - - # Load the model - generator.load_model() - - # ------------------------------------------------------------------- - # Generation config (applies per-prompt) - # ------------------------------------------------------------------- - generation_config = GenerationConfig( - max_new_tokens=1024, - temperature=0.7, - top_p=0.9, - do_sample=True, - ) - - # ------------------------------------------------------------------- - # Example prompts rewritten into chat-format messages - # ------------------------------------------------------------------- - prompts = [ - [{"role": "user", "content": "You're the fastest Llama this side of the equator"}], - [{"role": "user", "content": "What is the capital of France?"}], - [{"role": "user", "content": "Explain machine learning in simple terms"}], - [{"role": "user", "content": "Write a short story about a robot"}], - [{"role": "user", "content": "What is the capital of France?"}], - [{"role": "user", "content": "Explain machine learning in simple terms"}], - [{"role": "user", "content": "Write a short story about a robot"}], - [{"role": "user", "content": "What is the capital of France?"}], - [{"role": "user", "content": "Explain machine learning in simple terms"}], - [{"role": "user", "content": "Write a short story about a robot"}]] - - print("Starting continuous batching example with AutoTokenizer...") - print(f"Number of prompts: {len(prompts)}") - print("-" * 50) - - # ------------------------------------------------------------------- - # Run generation - # ------------------------------------------------------------------- - start_time = time.time() - results = generator.generate(prompts, generation_config) - end_time = time.time() - - # ------------------------------------------------------------------- - # Collect and display metrics - # ------------------------------------------------------------------- - generator.collect_metrics(results, prompts, start_time, end_time) - - # Unload the model - generator.unload_model() - -if __name__ == "__main__": - main() diff --git a/src/engine/ov_genai/continuous_batching/bench_results.sqlite b/src/engine/ov_genai/continuous_batching/bench_results.sqlite new file mode 100644 index 00000000..bb186971 Binary files /dev/null and b/src/engine/ov_genai/continuous_batching/bench_results.sqlite differ diff --git a/src/engine/ov_genai/continuous_batching/cb_adapter_llm.py b/src/engine/ov_genai/continuous_batching/cb_adapter_llm.py new file mode 100644 index 00000000..826a2a8d --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/cb_adapter_llm.py @@ -0,0 +1,127 @@ +""" +TODO (required before this lands): +- Add `cb_config: ContinuousBatchSchedulerConfig` to ModelLoadConfig. + This adapter reads scheduler settings via `loader.cb_config`. +""" + +from __future__ import annotations + +import gc +import logging +from typing import Any, Dict, List, Optional + +import openvino as ov +from openvino_genai import ( + ContinuousBatchingPipeline, + GenerationConfig, + SchedulerConfig, +) +from transformers import AutoTokenizer, BatchEncoding + +from src.server.models.ov_genai import ( + ContinuousBatchSchedulerConfig, +) +from src.server.model_registry import ModelRegistry +from src.server.models.ov_genai import OVGenAI_GenConfig +from src.server.models.registration import ModelLoadConfig +from src.server.utils.chat import flatten_messages + +logger = logging.getLogger(__name__) + + +class ArcCBLLM: + """OpenArc adapter for OpenVINO GenAI continuous batching text models.""" + + def __init__(self, load_config: ModelLoadConfig): + self.load_config = load_config + self.model: ContinuousBatchingPipeline | None = None + self.encoder_tokenizer: AutoTokenizer | None = None + + def load_model(self, loader: ModelLoadConfig) -> None: + """Load a ContinuousBatchingPipeline using the registry load contract.""" + + logger.info("%s loading continuous batching pipeline...", loader.model_name) + logger.info("%s on %s with %s", loader.model_type, loader.device, loader.runtime_config) + + # scheduler_config only works in a setattr loop we need to convert from pydantic + scheduler = self._build_scheduler_config(loader.cb_config) + + self.model = ContinuousBatchingPipeline( + loader.model_path, + scheduler_config=scheduler, + device=loader.device, + properties=loader.runtime_config or {}, + tokenizer_properties={}, + vision_encoder_properties={}, + ) + self.encoder_tokenizer = AutoTokenizer.from_pretrained(loader.model_path) + + logger.info("%s loaded successfully", loader.model_name) + + async def unload_model(self, registry: ModelRegistry, model_name: str) -> bool: + """Unregister the model and release pipeline resources.""" + + removed = await registry.register_unload(model_name) + self.model = None + self.encoder_tokenizer = None + gc.collect() + logger.info("[%s] unloaded successfully", self.load_config.model_name) + return removed + + def prepare_inputs( + self, + messages: List[Dict[str, Any]], + tools: Optional[List[Dict[str, Any]]] = None, + ) -> ov.Tensor: + """Convert chat messages into an input_ids tensor using the cached AutoTokenizer.""" + prompt_token_ids = self.encoder_tokenizer.apply_chat_template( + flatten_messages(messages), + tools=tools, + add_generation_prompt=True, + skip_special_tokens=True, + return_tensors="np", + ) + # Recent transformers returns a BatchEncoding from apply_chat_template + # when return_dict defaults to True; unwrap to the raw input_ids array. + if isinstance(prompt_token_ids, BatchEncoding): + prompt_token_ids = prompt_token_ids["input_ids"] + return ov.Tensor(prompt_token_ids) + + def add_request(self, request_id: int, gen_config: OVGenAI_GenConfig): + """Add one LLM request through the input_ids ContinuousBatchingPipeline overload.""" + request_input = self.prepare_inputs(gen_config.messages, gen_config.tools) + generation_config = self.create_generation_config(gen_config) + return self.model.add_request(request_id, request_input, generation_config) + + def create_generation_config(self, config: OVGenAI_GenConfig) -> GenerationConfig: + generation_config = self.model.get_config() + generation_config.max_new_tokens = config.max_tokens + generation_config.temperature = config.temperature + generation_config.top_k = config.top_k + generation_config.top_p = config.top_p + generation_config.repetition_penalty = config.repetition_penalty + generation_config.rng_seed = config.seed + generation_config.frequency_penalty = config.frequency_penalty + generation_config.presence_penalty = config.presence_penalty + return generation_config + + def collect_metrics(self) -> Dict[str, Any]: + """Collect ContinuousBatchingPipeline metrics.""" + metrics = self.model.get_metrics() + return { + "requests": metrics.requests, + "scheduled_requests": metrics.scheduled_requests, + "cache_usage": metrics.cache_usage, + "max_cache_usage": metrics.max_cache_usage, + "avg_cache_usage": metrics.avg_cache_usage, + "kv_cache_size_in_bytes": metrics.kv_cache_size_in_bytes, + } + + def _build_scheduler_config( + self, + config: ContinuousBatchSchedulerConfig, + ) -> SchedulerConfig: + scheduler = SchedulerConfig() + for field, value in config.model_dump().items(): + setattr(scheduler, field, value) + return scheduler \ No newline at end of file diff --git a/src/engine/ov_genai/continuous_batching/cb_adapter_vlm.py b/src/engine/ov_genai/continuous_batching/cb_adapter_vlm.py new file mode 100644 index 00000000..b8f293bd --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/cb_adapter_vlm.py @@ -0,0 +1,108 @@ +from __future__ import annotations + +import base64 +from io import BytesIO +from typing import Any, Dict, List, Optional, Tuple + +import numpy as np +import openvino as ov +from PIL import Image + +from src.engine.ov_genai.continuous_batching.cb_adapter_llm import ArcCBLLM +from src.server.models.ov_genai import OVGenAI_GenConfig, VLM_VISION_TOKENS +from src.server.models.registration import ModelLoadConfig +from src.server.utils.chat import flatten_message_content + + +class ArcCBVLM(ArcCBLLM): + """OpenArc adapter for OpenVINO GenAI continuous batching multimodal models.""" + + def __init__(self, load_config: ModelLoadConfig): + super().__init__(load_config) + self.vision_token = None + + def load_model(self, loader: ModelLoadConfig) -> None: + """Load the shared ContinuousBatchingPipeline and cache VLM token metadata.""" + + super().load_model(loader) + self.vision_token = VLM_VISION_TOKENS.get(loader.vlm_type) + if self.vision_token is None: + raise ValueError( + f"Unknown VLM type: {loader.vlm_type}. Supported: {list(VLM_VISION_TOKENS.keys())}" + ) + + def _vision_token_for_index(self, index: int) -> str: + token_template = self.vision_token if self.vision_token is not None else "" + if "{i}" in token_template: + return token_template.replace("{i}", str(index)) + return token_template + + def prepare_inputs( + self, + messages: List[Dict[str, Any]], + tools: Optional[List[Dict[str, Any]]] = None, + ) -> Tuple[str, List[ov.Tensor]]: + """Convert OpenAI-style multimodal chat messages to a prompt and image tensors.""" + + if self.encoder_tokenizer is None: + raise RuntimeError("AutoTokenizer is not loaded") + + images: List[Image.Image] = [] + text_messages: List[Dict[str, Any]] = [] + + for message in messages: + if isinstance(message.get("content", ""), list): + text_parts: List[str] = [] + + for content_item in message["content"]: + if ( + isinstance(content_item, dict) + and content_item.get("type") == "image_url" + ): + image_url = content_item.get("image_url", {}) + if ( + isinstance(image_url, dict) + and isinstance(image_url.get("url", ""), str) + and image_url["url"].startswith("data:image/") + ): + base64_data = image_url["url"].split(",", 1) + if len(base64_data) > 1: + image_data = base64.b64decode(base64_data[1]) + image = Image.open(BytesIO(image_data)).convert("RGB") + images.append(image) + token = self._vision_token_for_index(len(images) - 1) + text_parts.append(f" {token} ") + elif ( + isinstance(content_item, dict) + and content_item.get("type") == "text" + ): + text_parts.append(content_item.get("text", "")) + + text_message = message.copy() + text_message["content"] = flatten_message_content( + " ".join(text_parts) if text_parts else "" + ) + text_messages.append(text_message) + else: + text_messages.append( + {**message, "content": flatten_message_content(message.get("content"))} + ) + + prompt = self.encoder_tokenizer.apply_chat_template( + text_messages, + tokenize=False, + tools=tools, + add_generation_prompt=True, + ) + ov_images = [ov.Tensor(np.array(image, dtype=np.uint8)) for image in images] + return prompt, ov_images + + def add_request(self, request_id: int, gen_config: OVGenAI_GenConfig): + """Add one VLM request through the prompt/images ContinuousBatchingPipeline overload.""" + + if self.model is None: + raise RuntimeError("Continuous batching pipeline is not loaded") + + prompt, images = self.prepare_inputs(gen_config.messages, gen_config.tools) + generation_config = self.create_generation_config(gen_config) + return self.model.add_request(request_id, prompt, images, generation_config) diff --git a/src/engine/ov_genai/continuous_batching/cb_docs.md b/src/engine/ov_genai/continuous_batching/cb_docs.md new file mode 100644 index 00000000..4f1e167e --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/cb_docs.md @@ -0,0 +1,330 @@ +# ContinuousBatchingPipeline Docs + +## Constructor Overload Example (L661 vs L664) + +`ContinuousBatchingPipeline` has two useful Python init styles: + +1. Internal tokenizer construction + explicit property maps (`L661`) +2. Injected tokenizer object + generic kwargs (`L664`) + +```python +from __future__ import annotations + +import openvino_genai as genai + +MODEL_DIR = "/path/to/openvino/model_dir" +DEVICE = "GPU.0" + +scheduler = genai.SchedulerConfig() +scheduler.max_num_batched_tokens = 2048 +scheduler.max_num_seqs = 8 +scheduler.cache_size = 4 +scheduler.dynamic_split_fuse = True +scheduler.enable_prefix_caching = True + +# L661-style: tokenizer is created internally from MODEL_DIR +pipe_internal_tok = genai.ContinuousBatchingPipeline( + MODEL_DIR, + scheduler_config=scheduler, + device=DEVICE, + properties={"PERFORMANCE_HINT": "THROUGHPUT"}, + tokenizer_properties={}, + vision_encoder_properties={}, +) + +# L664-style: pass a prebuilt tokenizer explicitly +tokenizer = genai.Tokenizer(MODEL_DIR) +pipe_injected_tok = genai.ContinuousBatchingPipeline( + MODEL_DIR, + tokenizer=tokenizer, + scheduler_config=scheduler, + device=DEVICE, + PERFORMANCE_HINT="THROUGHPUT", +) + +cfg = genai.GenerationConfig() +cfg.max_new_tokens = 64 +cfg.do_sample = False + +handle = pipe_internal_tok.add_request(1, "Explain continuous batching in one sentence.", cfg) +generated_ids: list[int] = [] + +while pipe_internal_tok.has_non_finished_requests(): + pipe_internal_tok.step() + if handle.can_read(): + for output in handle.read().values(): + generated_ids.extend(output.generated_ids) + +text = pipe_internal_tok.get_tokenizer().decode(generated_ids) +print(text) +``` + +### Practical Choice + +- Use `L661` when you want OpenVINO GenAI to manage tokenizer construction from model assets. +- Use `L664` when you want direct control over tokenizer setup before pipeline creation. + +## Installed Library API Surface + +This section reflects the installed `openvino_genai` package inspected in the +OpenArc environment: `2026.2.0.0-3089-0a10767a25d`. Prefer this local package +surface over older online examples when implementing adapters. + +### ContinuousBatchingPipeline + +Constructor overloads: + +```python +genai.ContinuousBatchingPipeline( + models_path, + scheduler_config, + device, + properties={}, + tokenizer_properties={}, + vision_encoder_properties={}, +) + +genai.ContinuousBatchingPipeline( + models_path, + tokenizer, + scheduler_config, + device, + **kwargs, +) +``` + +OpenArc should use the first overload for the current adapter work: + +```python +pipeline = genai.ContinuousBatchingPipeline( + MODEL_DIR, + scheduler_config=scheduler, + device=DEVICE, + properties=runtime_config, + tokenizer_properties={}, + vision_encoder_properties={}, +) +``` + +Request submission overloads: + +```python +pipeline.add_request(request_id, input_ids: ov.Tensor, generation_config) +pipeline.add_request(request_id, prompt: str, generation_config) +pipeline.add_request(request_id, prompt: str, images: Sequence[ov.Tensor], generation_config) +pipeline.add_request( + request_id, + prompt: str, + images: Sequence[ov.Tensor], + videos: Sequence[ov.Tensor], + generation_config, + **kwargs, +) +``` + +Scheduler loop methods: + +```python +pipeline.step() +pipeline.has_non_finished_requests() +pipeline.get_tokenizer() +pipeline.get_metrics() +pipeline.get_config() +``` + +### GenerationHandle + +`add_request(...)` returns a `GenerationHandle`. The handle owns request-local +read and control state. + +```python +handle.can_read() -> bool +handle.read() -> dict[int, genai.GenerationOutput] +handle.read_all() -> list[genai.GenerationOutput] +handle.get_status() -> genai.GenerationStatus +handle.cancel() -> None +handle.stop(finish_reason: genai.GenerationFinishReason = ...) -> None +``` + +`GenerationOutput` exposes: + +```python +output.generated_ids -> list[int] +output.finish_reason -> genai.GenerationFinishReason +``` + +### GenerationStatus + +Request handle status values: + +```python +genai.GenerationStatus.RUNNING +genai.GenerationStatus.FINISHED +genai.GenerationStatus.IGNORED +genai.GenerationStatus.CANCEL +genai.GenerationStatus.STOP +``` + +Meaning: + +- `RUNNING`: request is still active. +- `FINISHED`: request reached normal terminal completion. +- `IGNORED`: request ran into an out-of-memory condition and could not continue. +- `CANCEL`: request was cancelled; the last prompt and generated tokens are dropped from history. +- `STOP`: request was stopped; history keeps the prompt and generated tokens. + +### GenerationFinishReason + +Generation output finish reasons: + +```python +genai.GenerationFinishReason.NONE +genai.GenerationFinishReason.STOP +genai.GenerationFinishReason.LENGTH +genai.GenerationFinishReason.TOOL_CALL +``` + +These are reported by `GenerationOutput.finish_reason`. A value other than +`NONE` indicates a terminal reason for that generation output. + +### SchedulerConfig + +Top-level continuous batching scheduler options: + +```python +scheduler = genai.SchedulerConfig() +scheduler.max_num_batched_tokens = 2048 +scheduler.max_num_seqs = 16 +scheduler.cache_size = 8 +scheduler.num_kv_blocks = 0 +scheduler.dynamic_split_fuse = True +scheduler.enable_prefix_caching = True +scheduler.use_cache_eviction = False +scheduler.cache_eviction_config = eviction_config +scheduler.use_sparse_attention = False +scheduler.sparse_attention_config = sparse_attention_config +``` + +Available fields: + +- `max_num_batched_tokens`: maximum total tokens scheduled in a batch. +- `max_num_seqs`: maximum scheduled sequences. +- `cache_size`: KV cache size in GB. +- `num_kv_blocks`: total KV blocks available to the scheduler. +- `dynamic_split_fuse`: split prompt and generation scheduling phases. +- `enable_prefix_caching`: keep prior KV blocks available for reuse. +- `use_cache_eviction`: enable token cache eviction during generation. +- `cache_eviction_config`: `CacheEvictionConfig`. +- `use_sparse_attention`: enable sparse attention during prefill. +- `sparse_attention_config`: `SparseAttentionConfig`. + +The installed Python binding docstring mentions `block_size`, but it is not +exposed as an assignable Python property in the inspected package. + +### CacheEvictionConfig + +Constructor: + +```python +eviction_config = genai.CacheEvictionConfig( + start_size, + recent_size, + max_cache_size, + aggregation_mode, + apply_rotation=False, + snapkv_window_size=8, + kvcrush_config=None, +) +``` + +Parameters: + +- `start_size`: tokens at the beginning of each sequence's KV cache to retain. +- `recent_size`: tokens at the end of each sequence's KV cache to retain. +- `max_cache_size`: maximum per-sequence tokens kept in KV cache. +- `aggregation_mode`: `AggregationMode`. +- `apply_rotation`: apply RoPE-based cache rotation after eviction. +- `snapkv_window_size`: window size for SnapKV-style importance score aggregation. +- `kvcrush_config`: optional KVCrush configuration from the lower-level binding. + +Instance helpers: + +```python +eviction_config.get_start_size() +eviction_config.get_recent_size() +eviction_config.get_max_cache_size() +eviction_config.get_evictable_size() +eviction_config.to_string() +``` + +### AggregationMode + +Cache eviction aggregation modes: + +```python +genai.AggregationMode.SUM +genai.AggregationMode.NORM_SUM +genai.AggregationMode.ADAPTIVE_RKV +``` + +Meaning: + +- `SUM`: sum token importance scores after each generation step. +- `NORM_SUM`: sum scores normalized by token lifetime in cache. +- `ADAPTIVE_RKV`: use the Adaptive R-KV cache eviction algorithm. + +### SparseAttentionConfig + +Constructor: + +```python +sparse_attention_config = genai.SparseAttentionConfig( + mode=genai.SparseAttentionMode.TRISHAPE, + num_last_dense_tokens_in_prefill=100, + num_retained_start_tokens_in_cache=128, + num_retained_recent_tokens_in_cache=1920, + xattention_threshold=0.8, + xattention_block_size=64, + xattention_stride=8, +) +``` + +Parameters: + +- `mode`: sparse attention mode. +- `num_last_dense_tokens_in_prefill`: final prompt tokens that still use dense attention. +- `num_retained_start_tokens_in_cache`: start-cache tokens retained for TRISHAPE. +- `num_retained_recent_tokens_in_cache`: recent-cache tokens retained for TRISHAPE. +- `xattention_threshold`: XAttention importance threshold. +- `xattention_block_size`: XAttention sparse block size. +- `xattention_stride`: XAttention importance-score sampling stride. + +### SparseAttentionMode + +Sparse attention modes: + +```python +genai.SparseAttentionMode.TRISHAPE +genai.SparseAttentionMode.XATTENTION +``` + +Meaning: + +- `TRISHAPE`: sparse prefill attention retaining configured start/recent cache regions. +- `XATTENTION`: block-sparse prefill attention using importance-score thresholding. + +### PipelineMetrics + +`pipeline.get_metrics()` returns process-level scheduler/cache counters. The +examples currently use: + +```python +metrics.requests +metrics.scheduled_requests +metrics.cache_usage +metrics.max_cache_usage +metrics.avg_cache_usage +``` + +In the current handle-driven `add_request + step` path, per-request token timing +and throughput should be collected by OpenArc while draining handles. diff --git a/src/engine/ov_genai/continuous_batching/cb_plan.md b/src/engine/ov_genai/continuous_batching/cb_plan.md new file mode 100644 index 00000000..16481e70 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/cb_plan.md @@ -0,0 +1,3 @@ + + +Ok, today we are building a con \ No newline at end of file diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/add_request_example.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/add_request_example.py new file mode 100644 index 00000000..06d274eb --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/add_request_example.py @@ -0,0 +1,181 @@ +from __future__ import annotations + +import argparse +from collections.abc import Sequence +from dataclasses import dataclass + +import openvino as ov +import openvino_genai as genai + + +@dataclass +class RequestSpec: + """Describes a submitted request so outputs can be labeled consistently.""" + + request_id: int + label: str + + +def build_pipeline(model_dir: str, device: str) -> genai.ContinuousBatchingPipeline: + """Create a continuous batching pipeline with a small, example-friendly scheduler.""" + + scheduler = genai.SchedulerConfig() + scheduler.max_num_batched_tokens = 2048 + scheduler.max_num_seqs = 16 + scheduler.cache_size = 4 + scheduler.dynamic_split_fuse = True + scheduler.enable_prefix_caching = True + + return genai.ContinuousBatchingPipeline( + model_dir, + device=device, + scheduler_config=scheduler, + ) + + +def build_generation_config(max_new_tokens: int = 48) -> genai.GenerationConfig: + """Create a deterministic generation config used by all demo requests.""" + + cfg = genai.GenerationConfig() + cfg.max_new_tokens = max_new_tokens + cfg.do_sample = False + return cfg + + +def drain_requests( + pipeline: genai.ContinuousBatchingPipeline, + handles: dict[int, genai.GenerationHandle], +) -> dict[int, list[int]]: + """Run pipeline steps until completion and collect generated token IDs per request.""" + + generated_ids: dict[int, list[int]] = {req_id: [] for req_id in handles} + + while pipeline.has_non_finished_requests(): + pipeline.step() + for req_id, handle in handles.items(): + if not handle.can_read(): + continue + for output in handle.read().values(): + generated_ids[req_id].extend(output.generated_ids) + + return generated_ids + + +def add_text_request( + pipeline: genai.ContinuousBatchingPipeline, + request_id: int, + prompt: str, + cfg: genai.GenerationConfig, +) -> genai.GenerationHandle: + """Submit a request through the prompt-string add_request overload.""" + + # add_request(request_id, prompt: str, generation_config) + return pipeline.add_request(request_id, prompt, cfg) + + +def add_input_ids_request( + pipeline: genai.ContinuousBatchingPipeline, + request_id: int, + prompt: str, + cfg: genai.GenerationConfig, +) -> genai.GenerationHandle: + """Tokenize text first, then submit through the input_ids add_request overload.""" + + # add_request(request_id, input_ids: ov.Tensor, generation_config) + tokenizer = pipeline.get_tokenizer() + tokenized = tokenizer.encode(prompt) + return pipeline.add_request(request_id, tokenized.input_ids, cfg) + + +def add_multimodal_request( + pipeline: genai.ContinuousBatchingPipeline, + request_id: int, + prompt: str, + image_tensors: Sequence[ov.Tensor], + cfg: genai.GenerationConfig, +) -> genai.GenerationHandle: + """Submit a prompt+images request for VLM-capable continuous batching pipelines.""" + + # add_request(request_id, prompt: str, images: Sequence[ov.Tensor], generation_config) + # This overload is for ContinuousBatchingPipeline with a VLM-capable model. + return pipeline.add_request(request_id, prompt, list(image_tensors), cfg) + + +def make_demo_image() -> ov.Tensor: + """Create a tiny synthetic image tensor used to exercise the multimodal overload.""" + + # Small synthetic RGB image (HWC, uint8) for API demonstration. + return ov.Tensor(ov.Type.u8, ov.Shape([32, 32, 3])) + + +def print_decoded_outputs( + pipeline: genai.ContinuousBatchingPipeline, + requests: list[RequestSpec], + generated_by_request: dict[int, list[int]], +) -> None: + """Decode generated token IDs and print labeled text for each submitted request.""" + + tokenizer = pipeline.get_tokenizer() + + for req in requests: + token_ids = generated_by_request[req.request_id] + decoded = tokenizer.decode(token_ids) if token_ids else "" + print(f"[{req.label}] request_id={req.request_id}") + print(decoded.strip() or "") + print() + + +def main() -> None: + """Parse CLI args, submit demo requests, and print decoded generation outputs.""" + + parser = argparse.ArgumentParser( + description="Demonstrate ContinuousBatchingPipeline.add_request overloads." + ) + parser.add_argument("model_dir", help="Path to OpenVINO model directory") + parser.add_argument("--device", default="CPU", help="OpenVINO device") + parser.add_argument( + "--include-multimodal", + action="store_true", + help="Also submit the multimodal add_request overload (requires a VLM model)", + ) + args = parser.parse_args() + + pipeline = build_pipeline(args.model_dir, args.device) + cfg = build_generation_config() + + requests: list[RequestSpec] = [ + RequestSpec(1, "text prompt overload"), + RequestSpec(2, "input_ids overload"), + ] + + handles: dict[int, genai.GenerationHandle] = {} + handles[1] = add_text_request( + pipeline, + request_id=1, + prompt="Write one short sentence about continuous batching.", + cfg=cfg, + ) + handles[2] = add_input_ids_request( + pipeline, + request_id=2, + prompt="Write one short sentence about tokenization.", + cfg=cfg, + ) + + if args.include_multimodal: + requests.append(RequestSpec(3, "multimodal prompt+images overload")) + demo_image = make_demo_image() + handles[3] = add_multimodal_request( + pipeline, + request_id=3, + prompt="Describe the image in one short sentence.", + image_tensors=[demo_image], + cfg=cfg, + ) + + generated_by_request = drain_requests(pipeline, handles) + print_decoded_outputs(pipeline, requests, generated_by_request) + + +if __name__ == "__main__": + main() diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/batch_metrics_streaming.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/batch_metrics_streaming.py new file mode 100644 index 00000000..56166356 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/batch_metrics_streaming.py @@ -0,0 +1,495 @@ +""" +Per-request streaming metrics for OpenVINO GenAI's ContinuousBatchingPipeline. + +All prompts are submitted at t=0. Each gets a live tqdm bar that updates as +tokens arrive during decode, so you can watch the batch progress in real time +and see which requests finish early. Per-request metrics print after all bars +close. + +Requires: pip install tqdm +""" + +import time +from dataclasses import dataclass + +import openvino_genai as ov_genai +from openvino_genai.py_openvino_genai import GenerationHandle +from tqdm import tqdm + + +# --------------------------------------------------------------------------- # +# Configuration # +# --------------------------------------------------------------------------- # + +MODEL_PATH = ( + "/mnt/Ironwolf-4TB/Models/OpenVINO/Deepseek/" + "DeepSeek-R1-0528-Qwen3-8B-OpenVINO/" + "DeepSeek-R1-0528-Qwen3-8B-int4_asym-ov/" +) +DEVICE = "GPU.0" +MAX_NEW_TOKENS = 8192 + +PROMPTS = [ + # ~80 tokens — short reasoning + "A bat and a ball cost $1.10 in total. The bat costs $1.00 more than the " + "ball. How much does the ball cost? Show your reasoning step by step and " + "double-check the final answer by plugging it back into the original " + "constraints.", + + # ~120 tokens — code explanation + "Explain what the following Python expression evaluates to and why: " + "`sorted([{'a': 3}, {'a': 1}, {'a': 2}], key=lambda d: d['a'])[-1]['a']`. " + "Walk through the evaluation order: first the lambda key function, then " + "how sorted applies it, then the list indexing, then the dict lookup. " + "Mention what would happen if one of the dicts were missing the 'a' key.", + + # ~150 tokens — technical comparison + "Compare and contrast continuous batching and static batching for LLM " + "inference. Cover the following points: how each handles requests " + "arriving at different times, the impact on time-to-first-token for a " + "request arriving mid-batch, GPU utilization under bursty traffic, " + "memory management implications (particularly KV cache), and the " + "implementation complexity tradeoff. Conclude with a recommendation for " + "a production serving system handling ~100 concurrent users with highly " + "variable prompt lengths.", + + # ~200 tokens — math problem with setup + "A factory produces widgets on three machines, A, B, and C. Machine A " + "produces 40% of the widgets, B produces 35%, and C produces 25%. The " + "defect rates are 2% for A, 3% for B, and 5% for C. A widget is selected " + "at random from the day's production and found to be defective. What is " + "the probability that it came from machine C? Use Bayes' theorem, show " + "the full computation including the law of total probability for the " + "denominator, and express the final answer as both a fraction and a " + "percentage rounded to two decimal places. Also compute the corresponding " + "probabilities for machines A and B so the three sum to 1, as a sanity " + "check on the arithmetic.", + + # ~250 tokens — algorithm design + "Design an algorithm to find the k-th smallest element in the union of " + "two sorted arrays of sizes m and n, without merging them. Your solution " + "should run in O(log(min(m, n))) time. Walk through the intuition first: " + "why this is essentially a binary search over partition points rather " + "than over values. Then describe the invariants your algorithm " + "maintains at each step, specifically what it means for a partition of " + "the two arrays to be 'correct' for the k-th element. Provide pseudocode " + "with clear variable names. Discuss the edge cases your code must " + "handle: k = 1, k = m + n, one array being empty, and the case where " + "all elements of one array are smaller than all elements of the other. " + "Finally, sketch how you would test the implementation with a small " + "example, choosing arrays and a k value that exercises a non-trivial " + "partition.", + + # ~300 tokens — code review + "Review this Python function for correctness, efficiency, and style. " + "Identify any bugs, suggest improvements, and rewrite it in a cleaner " + "form.\n\n" + "```python\n" + "def find_duplicates(lst):\n" + " duplicates = []\n" + " for i in range(len(lst)):\n" + " for j in range(len(lst)):\n" + " if i != j and lst[i] == lst[j]:\n" + " if lst[i] not in duplicates:\n" + " duplicates.append(lst[i])\n" + " return duplicates\n" + "```\n\n" + "In your review, address: (1) the time complexity of the current " + "implementation and what it should be, (2) whether the function handles " + "unhashable elements correctly and whether it needs to, (3) whether " + "order of the output matters and how the current code handles it, (4) " + "what happens with inputs like an empty list, a list with no " + "duplicates, or a list where every element is the same. Then provide " + "a rewritten version using collections.Counter, and a second version " + "using a set-based single-pass approach. Compare the two rewrites and " + "explain when you'd prefer each.", + + # ~350 tokens — systems debugging + "You are debugging a production issue where a Python web service's " + "p99 latency has jumped from 50ms to 800ms over the past week, while " + "p50 latency is unchanged at around 15ms and CPU utilization across " + "the fleet has actually decreased slightly. Request volume is flat. " + "The service is a relatively simple HTTP API backed by PostgreSQL " + "and a Redis cache, deployed across 12 instances behind a load " + "balancer. No code has been deployed in two weeks. Walk through your " + "investigation methodology. What hypotheses would you generate from " + "this symptom pattern, and in what order would you test them? " + "Specifically address: why p50 being stable but p99 spiking is " + "informative, what the CPU utilization clue tells you about whether " + "the bottleneck is compute-bound, which observability signals you " + "would pull first (database metrics, GC pauses, network latency, " + "lock contention, downstream service latencies), and how you would " + "rule each candidate cause in or out. Conclude with what a runbook " + "entry for this incident pattern should contain for the next on-call " + "engineer who sees similar symptoms.", + + # ~400 tokens — physics explanation + "Explain why the sky is blue, going deeper than the usual 'Rayleigh " + "scattering' one-liner. Build the explanation in layers. First, " + "describe what scattering means physically: an incoming " + "electromagnetic wave drives bound electrons in air molecules into " + "oscillation, and those oscillating charges re-radiate. Second, " + "derive (or at least motivate) the inverse-fourth-power wavelength " + "dependence of Rayleigh scattering — why short wavelengths are " + "scattered so much more strongly than long ones. Third, address the " + "follow-up question this immediately raises: if violet is scattered " + "even more strongly than blue, why doesn't the sky look violet? " + "Cover both the solar spectrum (less violet emission than blue) and " + "the response of human cone cells. Fourth, explain why sunsets are " + "red using the same framework — the geometry of light traveling " + "through more atmosphere at low sun angles. Finally, describe what " + "the sky looks like on Mars and why it differs (hint: it's not just " + "the thinner atmosphere; the dominant scatterers are different in " + "kind, not just in density). Throughout, keep the explanation " + "accessible to someone with high-school physics but don't shy away " + "from quantitative claims when they sharpen the picture.", + + # ~450 tokens — open-ended analysis + "Analyze the tradeoffs between monolithic and microservices " + "architectures for a hypothetical mid-stage startup: roughly 50 " + "engineers, $20M ARR, growing 80% year-over-year, currently running " + "a single Ruby on Rails monolith that has become difficult to deploy " + "(deploys take 45 minutes, deploy failures are common, and engineers " + "frequently step on each other's changes). The CTO is considering a " + "migration to microservices and has asked you to write a memo. Cover " + "the following in your memo. First, identify what problems " + "microservices actually solve and which of the company's current " + "pain points would and would not be addressed by such a migration. " + "Second, identify the new problems that microservices would " + "introduce — distributed tracing complexity, network reliability " + "concerns, data consistency across services, increased operational " + "burden, the difficulty of refactoring across service boundaries — " + "and how much of an organization at this size and growth rate would " + "need to invest to handle them well. Third, present an alternative " + "intermediate path: keeping the monolith but adopting modular " + "boundaries, trunk-based development with feature flags, parallel " + "test execution, and better deploy tooling. Make a recommendation " + "with explicit reasoning about which approach you would advocate " + "for given the company's stage, and explicitly name the conditions " + "that would change your recommendation. Be concrete: cite specific " + "patterns and tools where relevant. The memo should be persuasive " + "but balanced — assume the CTO is technically sophisticated and " + "will push back on glib answers.", + + # ~500 tokens — creative writing with constraints + "Write the opening chapter of a literary science fiction novel set " + "in a generation ship 200 years into its 800-year voyage. The " + "chapter should be approximately 1200 words and should accomplish " + "the following: introduce the protagonist, a botanist in her " + "mid-thirties named Inez who has lived her entire life aboard the " + "ship; establish through small concrete details rather than " + "exposition that the original mission's purpose has become " + "ambiguous to the current generation; show without telling that the " + "ship's biosphere is subtly failing in ways the leadership is not " + "openly discussing; introduce a secondary character through " + "Inez's eyes who will serve as her antagonist later in the book, " + "but make the initial impression sympathetic rather than ominous; " + "and end on a moment of small but unsettling discovery — something " + "Inez notices in the agricultural deck that she cannot immediately " + "explain. Stylistically, the prose should be quiet and observational, " + "favor concrete sensory detail over abstract reflection, and avoid " + "any infodump about how the ship works or how Inez came to be there. " + "The reader should feel slightly disoriented at the start and slowly " + "orient themselves through context. Resist the temptation to " + "explicitly state the chapter's themes; let them emerge from " + "juxtaposition and detail. Avoid sci-fi cliches like blinking " + "consoles, dramatic alarms, or characters monologuing about Earth. " + "Names of plants, equipment, and ship locations should feel " + "lived-in rather than designed for the reader's benefit — they're " + "things Inez has known her whole life and would not pause to " + "explain to herself. The point of view is close third, present " + "tense.", + + # ~550 tokens — multi-step technical task + "I want to set up a local development environment for fine-tuning " + "open-weights language models on a single workstation with one " + "consumer GPU (24GB VRAM). Walk me through the full setup, " + "explaining the reasoning behind each choice rather than just " + "listing commands. Specifically, address the following in order. " + "First, the choice of base framework: compare using " + "transformers + peft + trl directly versus using a higher-level " + "wrapper like Axolotl or unsloth, and recommend one for a user " + "who wants to understand what's happening but doesn't want to " + "reinvent training loops. Second, the choice of fine-tuning " + "technique: full fine-tuning is off the table at this VRAM " + "budget for any model above ~3B parameters, so we're choosing " + "among LoRA, QLoRA, and DoRA — explain the practical tradeoffs " + "and recommend a default. Third, the environment setup itself: " + "Python version, virtual environment tool, the specific torch " + "build that matches the user's CUDA version, and a strategy for " + "pinning versions so the environment is reproducible six months " + "from now. Fourth, a minimal end-to-end smoke test: fine-tune a " + "1B-parameter base model on a small instruction-following " + "dataset (say, a 1000-row subset of something publicly " + "available) for a single epoch, with the goal of confirming the " + "pipeline works rather than producing a good model. Specify " + "exact hyperparameters and explain why each was chosen for a " + "smoke test rather than a real training run. Fifth, how to " + "evaluate whether the smoke test succeeded — what should the " + "loss curve look like, what should generations look like before " + "and after, what are the common failure modes (NaN losses, " + "OOM on the first backward pass, the model producing only the " + "EOS token) and how to diagnose each. Sixth, what to read or " + "study next to go from 'I ran a smoke test' to 'I can " + "intelligently fine-tune for a real use case'. Throughout, " + "prefer concrete defaults over open-ended choices — the reader " + "is a competent engineer but new to fine-tuning.", + + # ~600 tokens — philosophical / interpretive + "There's a recurring debate in the philosophy of mind about " + "whether large language models can be said to 'understand' " + "anything, or whether they only perform sophisticated pattern " + "matching that mimics understanding without instantiating it. " + "Steelman both sides of this debate as carefully as you can, " + "then offer your own analysis of where you think the debate " + "actually turns. Specifically, do the following. First, present " + "the strongest version of the position that LLMs do not " + "understand: include the Chinese Room argument, the symbol " + "grounding problem, and the more recent observation that " + "next-token prediction is in principle a purely syntactic " + "operation. Don't strawman these — present them as their best " + "proponents would. Second, present the strongest version of the " + "opposing view: that the dichotomy between 'real understanding' " + "and 'mere pattern matching' may not survive scrutiny, that " + "human cognition is also implemented in physical substrate " + "performing what could be described as pattern matching at " + "different levels, and that 'understanding' may be better " + "thought of as a graded functional property than a binary " + "metaphysical one. Cover the relevant empirical observations " + "about LLM behavior — both the failure cases that suggest " + "shallow processing and the success cases that suggest " + "something more is going on. Third, identify what you think " + "the debate actually turns on. Is it a substantive empirical " + "disagreement about what's happening inside these systems? Is " + "it a conceptual disagreement about what 'understanding' even " + "means? Is it a disagreement about which intuitions to trust " + "when our pre-theoretic concept of understanding is applied to " + "an entity quite different from a human? Be willing to take a " + "position, but be honest about the parts of your position that " + "feel less than fully resolved. Finally, propose an experiment " + "or observation that, if its result came out one way versus " + "another, would actually move you on this question — and if no " + "such experiment exists, explain why and what that tells us " + "about the nature of the debate. The response should treat the " + "reader as a thoughtful interlocutor capable of holding " + "multiple views in mind simultaneously, not as someone who " + "needs to be convinced of a predetermined conclusion.", + + +] + + +# --------------------------------------------------------------------------- # +# Metrics data # +# --------------------------------------------------------------------------- # + +@dataclass +class SequenceTiming: + first_token_time: float | None = None + last_token_time: float | None = None + num_output_tokens: int = 0 + + def record(self, token_count: int) -> None: + if token_count == 0: + return + now = time.perf_counter() + if self.first_token_time is None: + self.first_token_time = now + self.last_token_time = now + self.num_output_tokens += token_count + + @property + def has_tokens(self) -> bool: + return self.first_token_time is not None and self.last_token_time is not None + + +@dataclass +class GenerationMetrics: + input_tokens: int + new_tokens: int + ttft_ms: float + tpot_ms: float + prefill_throughput: float + decode_throughput: float + + @property + def total_tokens(self) -> int: + return self.input_tokens + self.new_tokens + + def format(self, request_id: int) -> str: + return ( + f"Request {request_id}: " + f"ttft={self.ttft_ms:.1f}ms " + f"tpot={self.tpot_ms:.1f}ms/tok " + f"prefill={self.prefill_throughput:.1f}tok/s " + f"decode={self.decode_throughput:.1f}tok/s " + f"in={self.input_tokens} new={self.new_tokens} total={self.total_tokens}" + ) + + +# --------------------------------------------------------------------------- # +# Per-request tracker (now with a live progress bar) # +# --------------------------------------------------------------------------- # + +class RequestTracker: + """Wraps a GenerationHandle, polls tokens, and renders a live tqdm bar.""" + + def __init__( + self, + handle: GenerationHandle, + input_len: int, + max_new_tokens: int, + position: int, + ): + self.handle = handle + self.input_len = input_len + self.max_new_tokens = max_new_tokens + self.start_time = time.perf_counter() + self.sequences: dict[int, SequenceTiming] = {} + self.active = True + self.bar = tqdm( + total=max_new_tokens, + desc=f"req {position:>2} (in={input_len:>4})", + position=position, + leave=True, + unit="tok", + dynamic_ncols=True, + bar_format=( + "{desc} [{bar}] {n_fmt}/{total_fmt} " + "{rate_fmt} elapsed={elapsed}" + ), + ) + + def can_read(self) -> bool: + return self.handle.can_read() + + def is_finished(self) -> bool: + return self.handle.get_status() == ov_genai.GenerationStatus.FINISHED + + def poll(self) -> None: + """Pull newly-generated tokens off the handle, update timing + bar.""" + delta_total = 0 + for seq_id, output in self.handle.read().items(): + seq = self.sequences.setdefault(seq_id, SequenceTiming()) + token_count = len(output.generated_ids) + seq.record(token_count) + delta_total += token_count + if delta_total > 0: + self.bar.update(delta_total) + + def close_bar(self) -> None: + self.bar.refresh() + self.bar.close() + + def compute_metrics(self) -> GenerationMetrics: + completed = [s for s in self.sequences.values() if s.has_tokens] + if not completed: + return GenerationMetrics(self.input_len, 0, 0.0, 0.0, 0.0, 0.0) + + first_token_time = min(s.first_token_time for s in completed) + last_token_time = max(s.last_token_time for s in completed) + new_tokens = sum(s.num_output_tokens for s in completed) + + ttft_s = first_token_time - self.start_time + decode_s = last_token_time - first_token_time + decode_tokens = max(0, new_tokens - 1) + + return GenerationMetrics( + input_tokens=self.input_len, + new_tokens=new_tokens, + ttft_ms=ttft_s * 1000.0, + tpot_ms=(decode_s * 1000.0 / decode_tokens) if decode_tokens else 0.0, + prefill_throughput=(self.input_len / ttft_s) if ttft_s > 0 else 0.0, + decode_throughput=(decode_tokens / decode_s) if decode_s > 0 else 0.0, + ) + + +# --------------------------------------------------------------------------- # +# Pipeline setup # +# --------------------------------------------------------------------------- # + +def build_scheduler_config() -> ov_genai.SchedulerConfig: + config = ov_genai.SchedulerConfig() + config.max_num_batched_tokens = 3072 + config.max_num_seqs = 16 + config.cache_size = 12 + config.dynamic_split_fuse = True + config.enable_prefix_caching = True + return config + + +def build_generation_config(max_new_tokens: int = MAX_NEW_TOKENS) -> ov_genai.GenerationConfig: + config = ov_genai.GenerationConfig() + config.max_new_tokens = max_new_tokens + config.do_sample = False + return config + + +def count_tokens(tokenizer: ov_genai.Tokenizer, prompt: str) -> int: + return int(tokenizer.encode(prompt).input_ids.shape[-1]) + + +# --------------------------------------------------------------------------- # +# Batch execution # +# --------------------------------------------------------------------------- # + +def submit_prompts( + pipe: ov_genai.ContinuousBatchingPipeline, + prompts: list[str], + generation_config: ov_genai.GenerationConfig, +) -> list[RequestTracker]: + tokenizer = pipe.get_tokenizer() + trackers = [] + for req_id, prompt in enumerate(prompts): + handle = pipe.add_request(req_id, prompt, generation_config) + trackers.append( + RequestTracker( + handle=handle, + input_len=count_tokens(tokenizer, prompt), + max_new_tokens=generation_config.max_new_tokens, + position=req_id, + ) + ) + return trackers + + +def drive_pipeline( + pipe: ov_genai.ContinuousBatchingPipeline, + trackers: list[RequestTracker], +) -> None: + """Step the pipeline until every request finishes, polling each tick.""" + while pipe.has_non_finished_requests(): + pipe.step() + for tracker in trackers: + if not tracker.active: + continue + if tracker.can_read(): + tracker.poll() + if tracker.is_finished(): + tracker.active = False + for tracker in trackers: + tracker.close_bar() + + +# --------------------------------------------------------------------------- # +# Entry point # +# --------------------------------------------------------------------------- # + +def main() -> None: + pipe = ov_genai.ContinuousBatchingPipeline( + MODEL_PATH, + device=DEVICE, + scheduler_config=build_scheduler_config(), + ) + + trackers = submit_prompts(pipe, PROMPTS, build_generation_config()) + drive_pipeline(pipe, trackers) + + # Bars are closed; safe to print metrics below them. + print("\n") + for i, tracker in enumerate(trackers): + print(tracker.compute_metrics().format(i)) + + +if __name__ == "__main__": + main() diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/batch_size_1_depth.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/batch_size_1_depth.py new file mode 100644 index 00000000..b64bfb01 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/batch_size_1_depth.py @@ -0,0 +1,404 @@ +from __future__ import annotations + +import argparse +import random +import statistics +import time +from dataclasses import dataclass +from pathlib import Path + +import openvino_genai as genai +from rich import box +from rich.console import Console +from rich.table import Table + + +REPO_ROOT = Path(__file__).resolve().parents[5] +DEFAULT_TEXT_PATH = REPO_ROOT / "benchmark" / "sonnet.txt" +console = Console(width=180) + + +TERMINAL_STATUSES = { + genai.GenerationStatus.FINISHED, + genai.GenerationStatus.IGNORED, + genai.GenerationStatus.CANCEL, + genai.GenerationStatus.STOP, +} + + +@dataclass +class RunMetrics: + run: int + depth_tokens: int + prompt_tokens: int + max_new_tokens: int + input_tokens: int + output_tokens: int + ttft_s: float + tpot_ms: float + prefill_tps: float + decode_tps: float + decode_duration_s: float + total_s: float + cache_usage: float + max_cache_usage: float + avg_cache_usage: float + kv_cache_gib: float + status: str + output_text: str + + +def positive_int(value: str) -> int: + parsed = int(value) + if parsed <= 0: + raise argparse.ArgumentTypeError("must be > 0") + return parsed + + +def non_negative_int(value: str) -> int: + parsed = int(value) + if parsed < 0: + raise argparse.ArgumentTypeError("must be >= 0") + return parsed + + +def parse_property(value: str) -> tuple[str, str]: + key, sep, prop_value = value.partition("=") + if not sep or not key: + raise argparse.ArgumentTypeError("properties must be KEY=VALUE") + return key, prop_value + + +def count_tokens(tokenizer: genai.Tokenizer, prompt: str) -> int: + input_ids = tokenizer.encode(prompt).input_ids + if hasattr(input_ids, "shape"): + return int(input_ids.shape[-1]) + if input_ids and hasattr(input_ids[0], "__len__"): + return len(input_ids[0]) + return len(input_ids) + + +def load_text_lines(path: Path) -> list[str]: + lines = [line.strip() for line in path.read_text(encoding="utf-8").splitlines()] + lines = [line for line in lines if line] + if not lines: + raise ValueError(f"Text dataset is empty: {path}") + return lines + + +def build_synthetic_prompt( + tokenizer: genai.Tokenizer, + text_lines: list[str], + prompt_tokens: int, + depth_tokens: int, + seed: int, +) -> tuple[str, int]: + """Concatenate small text snippets until the prompt reaches the target token count.""" + + total_tokens = depth_tokens + prompt_tokens + rng = random.Random(seed) + sampled_lines = text_lines[:] + rng.shuffle(sampled_lines) + + prompt_parts = [ + "Use the following synthetic context as source material, then continue it briefly.\n\n" + ] + prompt = "".join(prompt_parts) + line_idx = 0 + current_tokens = count_tokens(tokenizer, prompt) + + while current_tokens < total_tokens: + next_line = sampled_lines[line_idx % len(sampled_lines)] + "\n" + prompt_parts.append(next_line) + prompt += next_line + line_idx += 1 + current_tokens = count_tokens(tokenizer, prompt) + + return prompt, current_tokens + + +def build_scheduler_config(args: argparse.Namespace) -> genai.SchedulerConfig: + """Build a continuous batching scheduler that is intentionally batch size 1.""" + + config = genai.SchedulerConfig() + config.max_num_batched_tokens = args.max_num_batched_tokens + config.max_num_seqs = 1 + config.cache_size = args.cache_size + config.dynamic_split_fuse = args.dynamic_split_fuse + config.enable_prefix_caching = args.enable_prefix_caching + return config + + +def build_generation_config(args: argparse.Namespace) -> genai.GenerationConfig: + config = genai.GenerationConfig() + config.max_new_tokens = args.max_new_tokens + config.ignore_eos = args.ignore_eos + config.do_sample = False + return config + + +def build_pipeline(args: argparse.Namespace) -> genai.ContinuousBatchingPipeline: + return genai.ContinuousBatchingPipeline( + args.model_dir, + device=args.device, + scheduler_config=build_scheduler_config(args), + properties=dict(args.property), + tokenizer_properties={}, + vision_encoder_properties={}, + ) + + +def get_cache_metrics(pipeline: genai.ContinuousBatchingPipeline) -> tuple[float, float, float, float]: + metrics = pipeline.get_metrics() + kv_cache_bytes = float(getattr(metrics, "kv_cache_size_in_bytes", 0.0)) + return ( + float(getattr(metrics, "cache_usage", 0.0)), + float(getattr(metrics, "max_cache_usage", 0.0)), + float(getattr(metrics, "avg_cache_usage", 0.0)), + kv_cache_bytes / (1024.0**3), + ) + + +def run_once( + pipeline: genai.ContinuousBatchingPipeline, + tokenizer: genai.Tokenizer, + generation_config: genai.GenerationConfig, + prompt: str, + input_tokens: int, + run: int, + args: argparse.Namespace, +) -> RunMetrics: + start_s = time.perf_counter() + handle = pipeline.add_request(run, prompt, generation_config) + + output_tokens = 0 + output_token_ids: list[int] = [] + first_token_s: float | None = None + last_token_s: float | None = None + status = genai.GenerationStatus.RUNNING + + while True: + pipeline.step() + now_s = time.perf_counter() + + if handle.can_read(): + for output in handle.read().values(): + generated_ids = output.generated_ids + new_tokens = len(generated_ids) if generated_ids is not None else 0 + if new_tokens: + if first_token_s is None: + first_token_s = now_s + last_token_s = now_s + output_tokens += new_tokens + output_token_ids.extend(generated_ids) + + status = handle.get_status() + if status in TERMINAL_STATUSES: + break + + end_s = time.perf_counter() + cache_usage, max_cache_usage, avg_cache_usage, kv_cache_gib = get_cache_metrics(pipeline) + if first_token_s is None: + first_token_s = end_s + if last_token_s is None: + last_token_s = first_token_s + + ttft_s = first_token_s - start_s + decode_duration_s = max(last_token_s - first_token_s, 0.0) + decode_tokens = max(output_tokens - 1, 0) + output_text = tokenizer.decode(output_token_ids).strip() if output_token_ids else "" + + return RunMetrics( + run=run, + depth_tokens=args.depth, + prompt_tokens=args.prompt_tokens, + max_new_tokens=args.max_new_tokens, + input_tokens=input_tokens, + output_tokens=output_tokens, + ttft_s=ttft_s, + tpot_ms=(decode_duration_s * 1000.0 / decode_tokens) if decode_tokens else 0.0, + prefill_tps=(input_tokens / ttft_s) if ttft_s > 0 else 0.0, + decode_tps=(decode_tokens / decode_duration_s) if decode_duration_s > 0 else 0.0, + decode_duration_s=decode_duration_s, + total_s=end_s - start_s, + cache_usage=cache_usage, + max_cache_usage=max_cache_usage, + avg_cache_usage=avg_cache_usage, + kv_cache_gib=kv_cache_gib, + status=status.name, + output_text=output_text, + ) + + +def average_metrics(runs: list[RunMetrics]) -> RunMetrics: + def mean(name: str) -> float: + return statistics.fmean(getattr(run, name) for run in runs) + + return RunMetrics( + run=0, + depth_tokens=runs[0].depth_tokens, + prompt_tokens=runs[0].prompt_tokens, + max_new_tokens=runs[0].max_new_tokens, + input_tokens=round(mean("input_tokens")), + output_tokens=round(mean("output_tokens")), + ttft_s=mean("ttft_s"), + tpot_ms=mean("tpot_ms"), + prefill_tps=mean("prefill_tps"), + decode_tps=mean("decode_tps"), + decode_duration_s=mean("decode_duration_s"), + total_s=mean("total_s"), + cache_usage=mean("cache_usage"), + max_cache_usage=mean("max_cache_usage"), + avg_cache_usage=mean("avg_cache_usage"), + kv_cache_gib=mean("kv_cache_gib"), + status="", + output_text="", + ) + + +def metric_rows(label: str, metrics: RunMetrics) -> list[tuple[str, str]]: + prefix = f"{label} " + return [ + (prefix + "d/p/n", f"{metrics.depth_tokens}/{metrics.prompt_tokens}/{metrics.max_new_tokens}"), + (prefix + "input tokens", str(metrics.input_tokens)), + (prefix + "output tokens", str(metrics.output_tokens)), + (prefix + "ttft", f"{metrics.ttft_s:.4f} s"), + (prefix + "tpot", f"{metrics.tpot_ms:.2f} ms/token"), + (prefix + "prefill", f"{metrics.prefill_tps:.1f} tokens/s"), + (prefix + "decode", f"{metrics.decode_tps:.1f} tokens/s"), + (prefix + "decode time", f"{metrics.decode_duration_s:.4f} s"), + (prefix + "total time", f"{metrics.total_s:.4f} s"), + (prefix + "cache usage", f"{metrics.cache_usage:.2f}%"), + (prefix + "max cache usage", f"{metrics.max_cache_usage:.2f}%"), + (prefix + "avg cache usage", f"{metrics.avg_cache_usage:.2f}%"), + (prefix + "kv cache", f"{metrics.kv_cache_gib:.2f} GiB"), + (prefix + "status", metrics.status or "-"), + ] + + +def print_metrics_table(runs: list[RunMetrics]) -> None: + table = Table(title="Batch Size 1 Depth Evaluation", box=box.SIMPLE_HEAVY, show_lines=False) + table.add_column("metric", style="cyan", no_wrap=True) + table.add_column("value", justify="right", no_wrap=True) + + rows: list[tuple[str, str]] = [] + for metrics in runs: + if rows: + rows.append(("", "")) + rows.extend(metric_rows(f"run {metrics.run}", metrics)) + + if len(runs) > 1: + rows.append(("", "")) + rows.extend(metric_rows("avg", average_metrics(runs))) + + for metric, value in rows: + table.add_row(metric, value) + console.print(table) + + +def print_outputs_table(runs: list[RunMetrics]) -> None: + table = Table(title="Generated Output", box=box.SIMPLE_HEAVY, show_lines=True) + table.add_column("run", style="cyan", justify="right", no_wrap=True) + table.add_column("output", overflow="fold") + + for metrics in runs: + table.add_row(str(metrics.run), metrics.output_text or "") + console.print(table) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description=( + "Evaluate OpenVINO GenAI ContinuousBatchingPipeline at batch size 1 " + "with configurable synthetic context depth." + ) + ) + parser.add_argument("model_dir", help="Path to an OpenVINO GenAI model directory") + parser.add_argument("--device", default="GPU.0", help="OpenVINO device string") + parser.add_argument( + "--text-path", + type=Path, + default=DEFAULT_TEXT_PATH, + help="Small text dataset to concatenate into synthetic prompts", + ) + parser.add_argument( + "--depth", + "-d", + type=non_negative_int, + default=0, + help="Synthetic prior context tokens prepended before the p-token segment", + ) + parser.add_argument( + "--prompt-tokens", + "--p", + type=positive_int, + default=1, + help="Measured prompt segment length after depth tokens", + ) + parser.add_argument( + "--max-new-tokens", + "--n", + type=positive_int, + default=128, + help="Maximum generated tokens", + ) + parser.add_argument("--runs", "-r", type=positive_int, default=1, help="Repeated runs") + parser.add_argument("--seed", type=int, default=0, help="Base RNG seed for shuffled text lines") + + parser.add_argument("--max-num-batched-tokens", type=positive_int, default=2048) + parser.add_argument("--cache-size", type=positive_int, default=14, help="KV cache size in GB") + parser.add_argument("--dynamic-split-fuse", action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("--enable-prefix-caching", action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("--ignore-eos", action=argparse.BooleanOptionalAction, default=True) + parser.add_argument( + "--property", + action="append", + default=["KV_CACHE_PRECISION"], + type=parse_property, + metavar="KEY=VALUE", + help="OpenVINO runtime property passed to ContinuousBatchingPipeline properties", + ) + return parser.parse_args() + + +def main() -> None: + args = parse_args() + + print("Batch size: 1") + print(f"Model: {args.model_dir}") + print(f"Device: {args.device}") + print(f"Text: {args.text_path}") + print(f"d/p/n: {args.depth}/{args.prompt_tokens}/{args.max_new_tokens}") + print(f"Runs: {args.runs}\n") + + pipeline = build_pipeline(args) + generation_config = build_generation_config(args) + tokenizer = pipeline.get_tokenizer() + text_lines = load_text_lines(args.text_path) + + metrics = [] + for run in range(1, args.runs + 1): + prompt, input_tokens = build_synthetic_prompt( + tokenizer=tokenizer, + text_lines=text_lines, + prompt_tokens=args.prompt_tokens, + depth_tokens=args.depth, + seed=args.seed + run - 1, + ) + result = run_once( + pipeline=pipeline, + tokenizer=tokenizer, + generation_config=generation_config, + prompt=prompt, + input_tokens=input_tokens, + run=run, + args=args, + ) + metrics.append(result) + + print_metrics_table(metrics) + print_outputs_table(metrics) + + +if __name__ == "__main__": + main() diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/cb_tokenizer_notes.md b/src/engine/ov_genai/continuous_batching/examples_and_tests/cb_tokenizer_notes.md new file mode 100644 index 00000000..db39272c --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/cb_tokenizer_notes.md @@ -0,0 +1,33 @@ + +Tokenization strategy notes for OpenVINO GenAI ContinuousBatchingPipeline. + +Key behavior to keep in mind for text-only LLMs: + +1) Chat templating source precedence (later entries override earlier ones): + - tokenizer_config.json["chat_template"] + - processor_config.json["chat_template"] + - chat_template.json["chat_template"] + - openvino.Model rt_info["chat_template"] (embedded in tokenizer IR metadata) + - If unsupported by GenAI, a simplified supported template is substituted. + +2) In OpenVINO GenAI, the resolved chat template can come from model/tokenizer + metadata (including tokenizer IR metadata), rather than directly loading + chat_template.jinja at runtime. + +3) ContinuousBatchingPipeline tokenization path: + - Passing prompt: str -> template is applied, then prompt text is tokenized + internally by openvino_genai.Tokenizer. + - Passing input_ids: ov.Tensor -> tokenization is bypassed entirely. + +4) Consequence for experiments: + - Prompt-side token counts and shape are template-dependent. + - input_ids-side benchmarks isolate generation/scheduling by removing runtime + prompt tokenization variance. + +References: + - openvino_genai/py_openvino_genai.pyi: + - ContinuousBatchingPipeline overloads (`prompt` vs `input_ids`) + - Tokenizer template precedence note + +--- + diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/cb_vs_llmpipe.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/cb_vs_llmpipe.py new file mode 100644 index 00000000..c0bac601 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/cb_vs_llmpipe.py @@ -0,0 +1,167 @@ +from __future__ import annotations + +import time + +import openvino_genai as genai + +MODEL_DIR = "/mnt/Ironwolf-4TB/Models/OpenVINO/Qwen/Qwen3-4B-Thinking-2507-Esper3.1-int4_asym-awq-ov/" +DEVICE = "GPU.0" +PROMPT = ( + "Explain in two paragraphs how continuous batching changes latency and throughput " + "trade-offs for autoregressive decoding." +) +MAX_NEW_TOKENS = 256 +RUNS = 10 + + +def _safe_div(numerator: float, denominator: float) -> float: + return numerator / denominator if denominator > 0 else 0.0 + + +def _token_count(tokenizer: genai.Tokenizer, prompt: str) -> int: + encoded = tokenizer.encode(prompt).input_ids + if hasattr(encoded, "shape"): + return int(encoded.shape[-1]) + if encoded and hasattr(encoded[0], "__len__"): + return len(encoded[0]) + return len(encoded) + + +def _make_generation_config() -> genai.GenerationConfig: + cfg = genai.GenerationConfig() + cfg.max_new_tokens = MAX_NEW_TOKENS + cfg.do_sample = False + return cfg + + +def run_llm_once() -> dict[str, float]: + pipe = genai.LLMPipeline(MODEL_DIR, DEVICE) + cfg = _make_generation_config() + tokenized = pipe.get_tokenizer().encode(PROMPT) + input_ids = tokenized.input_ids + input_tokens = int(input_ids.shape[-1]) if hasattr(input_ids, "shape") else len(input_ids) + + t0 = time.perf_counter() + result = pipe.generate(input_ids, cfg) + t1 = time.perf_counter() + + metrics = result.perf_metrics + ttft_s = metrics.get_ttft().mean / 1000.0 + decode_s = metrics.get_generate_duration().mean / 1000.0 + output_tokens = int(metrics.get_num_generated_tokens()) + + return { + "input_tokens": float(input_tokens), + "output_tokens": float(output_tokens), + "ttft_s": ttft_s, + "prefill_tps": _safe_div(float(input_tokens), ttft_s), + "decode_s": decode_s, + "decode_tps": _safe_div(float(output_tokens), decode_s), + "total_s": t1 - t0, + } + + +def run_cb_once() -> dict[str, float]: + scheduler = genai.SchedulerConfig() + scheduler.max_num_batched_tokens = 2048 + scheduler.max_num_seqs = 1 + scheduler.cache_size = 4 + scheduler.dynamic_split_fuse = True + scheduler.enable_prefix_caching = True + + pipe = genai.ContinuousBatchingPipeline( + MODEL_DIR, + device=DEVICE, + scheduler_config=scheduler, + ) + + cfg = _make_generation_config() + input_tokens = _token_count(pipe.get_tokenizer(), PROMPT) + + t0 = time.perf_counter() + handle = pipe.add_request(1, PROMPT, cfg) + + output_tokens = 0 + first_token_ts = None + + while True: + pipe.step() + + if handle.can_read(): + for output in handle.read().values(): + new_tokens = len(output.generated_ids) + if new_tokens > 0 and first_token_ts is None: + first_token_ts = time.perf_counter() + output_tokens += new_tokens + + status = handle.get_status() + if status in ( + genai.GenerationStatus.FINISHED, + genai.GenerationStatus.IGNORED, + genai.GenerationStatus.CANCEL, + genai.GenerationStatus.STOP, + ): + break + + t1 = time.perf_counter() + + if first_token_ts is None: + first_token_ts = t1 + + ttft_s = first_token_ts - t0 + decode_s = max(t1 - first_token_ts, 0.0) + + return { + "input_tokens": float(input_tokens), + "output_tokens": float(output_tokens), + "ttft_s": ttft_s, + "prefill_tps": _safe_div(float(input_tokens), ttft_s), + "decode_s": decode_s, + "decode_tps": _safe_div(float(output_tokens), decode_s), + "total_s": t1 - t0, + } + + +def print_stats(name: str, stats: dict[str, float]) -> None: + print(name) + print(f" input_tokens: {int(stats['input_tokens'])}") + print(f" output_tokens: {int(stats['output_tokens'])}") + print(f" ttft_s: {stats['ttft_s']:.6f}") + print(f" prefill_tps: {stats['prefill_tps']:.2f}") + print(f" decode_s: {stats['decode_s']:.6f}") + print(f" decode_tps: {stats['decode_tps']:.2f}") + print(f" total_s: {stats['total_s']:.6f}") + + +def average_stats(stats_list: list[dict[str, float]]) -> dict[str, float]: + keys = stats_list[0].keys() + return { + key: sum(stats[key] for stats in stats_list) / len(stats_list) + for key in keys + } + + +def main() -> None: + llm_runs: list[dict[str, float]] = [] + cb_runs: list[dict[str, float]] = [] + + for i in range(1, RUNS + 1): + print(f"Run {i}/{RUNS}: LLMPipeline") + llm_runs.append(run_llm_once()) + + for i in range(1, RUNS + 1): + print(f"Run {i}/{RUNS}: ContinuousBatchingPipeline") + cb_runs.append(run_cb_once()) + + llm = average_stats(llm_runs) + cb = average_stats(cb_runs) + + print_stats(f"LLMPipeline (avg of {RUNS})", llm) + print_stats(f"ContinuousBatchingPipeline (avg of {RUNS})", cb) + + print("Ratios (CB / LLM)") + print(f" prefill_tps_ratio: {_safe_div(cb['prefill_tps'], llm['prefill_tps']):.3f}x") + print(f" decode_tps_ratio: {_safe_div(cb['decode_tps'], llm['decode_tps']):.3f}x") + + +main() diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/cb_vs_vlmpipeline.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/cb_vs_vlmpipeline.py new file mode 100644 index 00000000..375eefa8 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/cb_vs_vlmpipeline.py @@ -0,0 +1,162 @@ +from __future__ import annotations + +import time + +import openvino_genai as genai + +MODEL_DIR = "/mnt/Ironwolf-4TB/Models/OpenVINO/Gemma/gemma-3-4b-it-int4_asym-ov/" +DEVICE = "GPU.0" +PROMPT = ( + "Explain in two paragraphs how continuous batching changes latency and throughput " + "trade-offs for autoregressive decoding." +) +MAX_NEW_TOKENS = 256 +RUNS = 10 + + +def _safe_div(numerator: float, denominator: float) -> float: + return numerator / denominator if denominator > 0 else 0.0 + + +def _token_count(tokenizer: genai.Tokenizer, prompt: str) -> int: + encoded = tokenizer.encode(prompt).input_ids + if hasattr(encoded, "shape"): + return int(encoded.shape[-1]) + if encoded and hasattr(encoded[0], "__len__"): + return len(encoded[0]) + return len(encoded) + + +def _make_generation_config() -> genai.GenerationConfig: + cfg = genai.GenerationConfig() + cfg.max_new_tokens = MAX_NEW_TOKENS + cfg.do_sample = False + return cfg + + +def run_vlm_once() -> dict[str, float]: + pipe = genai.VLMPipeline(MODEL_DIR, DEVICE) + cfg = _make_generation_config() + input_tokens = _token_count(pipe.get_tokenizer(), PROMPT) + + t0 = time.perf_counter() + result = pipe.generate(prompt=PROMPT, generation_config=cfg) + t1 = time.perf_counter() + + metrics = result.perf_metrics + ttft_s = metrics.get_ttft().mean / 1000.0 + decode_s = metrics.get_generate_duration().mean / 1000.0 + output_tokens = int(metrics.get_num_generated_tokens()) + + return { + "input_tokens": float(input_tokens), + "output_tokens": float(output_tokens), + "ttft_s": ttft_s, + "prefill_tps": _safe_div(float(input_tokens), ttft_s), + "decode_s": decode_s, + "decode_tps": _safe_div(float(output_tokens), decode_s), + "total_s": t1 - t0, + } + + +def run_cb_once() -> dict[str, float]: + scheduler = genai.SchedulerConfig() + scheduler.max_num_batched_tokens = 2048 + scheduler.max_num_seqs = 1 + scheduler.cache_size = 4 + scheduler.dynamic_split_fuse = True + scheduler.enable_prefix_caching = True + + pipe = genai.ContinuousBatchingPipeline( + MODEL_DIR, + device=DEVICE, + scheduler_config=scheduler, + ) + + cfg = _make_generation_config() + input_tokens = _token_count(pipe.get_tokenizer(), PROMPT) + + t0 = time.perf_counter() + handle = pipe.add_request(1, PROMPT, cfg) + + output_tokens = 0 + first_token_ts = None + + while True: + pipe.step() + + if handle.can_read(): + for output in handle.read().values(): + new_tokens = len(output.generated_ids) + if new_tokens > 0 and first_token_ts is None: + first_token_ts = time.perf_counter() + output_tokens += new_tokens + + status = handle.get_status() + if status in ( + genai.GenerationStatus.FINISHED, + genai.GenerationStatus.IGNORED, + genai.GenerationStatus.CANCEL, + genai.GenerationStatus.STOP, + ): + break + + t1 = time.perf_counter() + + if first_token_ts is None: + first_token_ts = t1 + + ttft_s = first_token_ts - t0 + decode_s = max(t1 - first_token_ts, 0.0) + + return { + "input_tokens": float(input_tokens), + "output_tokens": float(output_tokens), + "ttft_s": ttft_s, + "prefill_tps": _safe_div(float(input_tokens), ttft_s), + "decode_s": decode_s, + "decode_tps": _safe_div(float(output_tokens), decode_s), + "total_s": t1 - t0, + } + + +def average_stats(stats_list: list[dict[str, float]]) -> dict[str, float]: + keys = stats_list[0].keys() + return {key: sum(stats[key] for stats in stats_list) / len(stats_list) for key in keys} + + +def print_stats(name: str, stats: dict[str, float]) -> None: + print(name) + print(f" input_tokens: {int(stats['input_tokens'])}") + print(f" output_tokens: {int(stats['output_tokens'])}") + print(f" ttft_s: {stats['ttft_s']:.6f}") + print(f" prefill_tps: {stats['prefill_tps']:.2f}") + print(f" decode_s: {stats['decode_s']:.6f}") + print(f" decode_tps: {stats['decode_tps']:.2f}") + print(f" total_s: {stats['total_s']:.6f}") + + +def main() -> None: + vlm_runs: list[dict[str, float]] = [] + cb_runs: list[dict[str, float]] = [] + + for i in range(1, RUNS + 1): + print(f"Run {i}/{RUNS}: VLMPipeline") + vlm_runs.append(run_vlm_once()) + + for i in range(1, RUNS + 1): + print(f"Run {i}/{RUNS}: ContinuousBatchingPipeline") + cb_runs.append(run_cb_once()) + + vlm_avg = average_stats(vlm_runs) + cb_avg = average_stats(cb_runs) + + print_stats(f"VLMPipeline (avg of {RUNS})", vlm_avg) + print_stats(f"ContinuousBatchingPipeline (avg of {RUNS})", cb_avg) + + print("Ratios (CB / VLM)") + print(f" prefill_tps_ratio: {_safe_div(cb_avg['prefill_tps'], vlm_avg['prefill_tps']):.3f}x") + print(f" decode_tps_ratio: {_safe_div(cb_avg['decode_tps'], vlm_avg['decode_tps']):.3f}x") + + +main() diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/per_request_metrics.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/per_request_metrics.py new file mode 100644 index 00000000..3ffe503a --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/per_request_metrics.py @@ -0,0 +1,413 @@ +""" +Per-request metrics for OpenVINO GenAI's ContinuousBatchingPipeline. + +Each prompt submitted to the pipeline gets its own RequestTracker, which +records first/last token times for every sequence the request produces. +That gives us isolated TTFT, TPOT, and throughput numbers per inference +even when requests are batched together. +""" + +import time +from dataclasses import dataclass, field + +import openvino_genai as ov_genai +from openvino_genai.py_openvino_genai import GenerationHandle + + +# --------------------------------------------------------------------------- # +# Configuration # +# --------------------------------------------------------------------------- # + +MODEL_PATH = ( +"/mnt/Ironwolf-4TB/Models/OpenVINO/Mistral/Rocinante-12B-v1.1-int4_sym-awq-se-ov/" +) +DEVICE = "GPU.0" + +PROMPTS = [ + # ~80 tokens — short reasoning + "A bat and a ball cost $1.10 in total. The bat costs $1.00 more than the " + "ball. How much does the ball cost? Show your reasoning step by step and " + "double-check the final answer by plugging it back into the original " + "constraints.", + + # ~120 tokens — code explanation + "Explain what the following Python expression evaluates to and why: " + "`sorted([{'a': 3}, {'a': 1}, {'a': 2}], key=lambda d: d['a'])[-1]['a']`. " + "Walk through the evaluation order: first the lambda key function, then " + "how sorted applies it, then the list indexing, then the dict lookup. " + "Mention what would happen if one of the dicts were missing the 'a' key.", + + # ~150 tokens — technical comparison + "Compare and contrast continuous batching and static batching for LLM " + "inference. Cover the following points: how each handles requests " + "arriving at different times, the impact on time-to-first-token for a " + "request arriving mid-batch, GPU utilization under bursty traffic, " + "memory management implications (particularly KV cache), and the " + "implementation complexity tradeoff. Conclude with a recommendation for " + "a production serving system handling ~100 concurrent users with highly " + "variable prompt lengths.", + + # ~200 tokens — math problem with setup + "A factory produces widgets on three machines, A, B, and C. Machine A " + "produces 40% of the widgets, B produces 35%, and C produces 25%. The " + "defect rates are 2% for A, 3% for B, and 5% for C. A widget is selected " + "at random from the day's production and found to be defective. What is " + "the probability that it came from machine C? Use Bayes' theorem, show " + "the full computation including the law of total probability for the " + "denominator, and express the final answer as both a fraction and a " + "percentage rounded to two decimal places. Also compute the corresponding " + "probabilities for machines A and B so the three sum to 1, as a sanity " + "check on the arithmetic.", + + # ~250 tokens — algorithm design + "Design an algorithm to find the k-th smallest element in the union of " + "two sorted arrays of sizes m and n, without merging them. Your solution " + "should run in O(log(min(m, n))) time. Walk through the intuition first: " + "why this is essentially a binary search over partition points rather " + "than over values. Then describe the invariants your algorithm " + "maintains at each step, specifically what it means for a partition of " + "the two arrays to be 'correct' for the k-th element. Provide pseudocode " + "with clear variable names. Discuss the edge cases your code must " + "handle: k = 1, k = m + n, one array being empty, and the case where " + "all elements of one array are smaller than all elements of the other. " + "Finally, sketch how you would test the implementation with a small " + "example, choosing arrays and a k value that exercises a non-trivial " + "partition.", + + # ~300 tokens — code review + "Review this Python function for correctness, efficiency, and style. " + "Identify any bugs, suggest improvements, and rewrite it in a cleaner " + "form.\n\n" + "```python\n" + "def find_duplicates(lst):\n" + " duplicates = []\n" + " for i in range(len(lst)):\n" + " for j in range(len(lst)):\n" + " if i != j and lst[i] == lst[j]:\n" + " if lst[i] not in duplicates:\n" + " duplicates.append(lst[i])\n" + " return duplicates\n" + "```\n\n" + "In your review, address: (1) the time complexity of the current " + "implementation and what it should be, (2) whether the function handles " + "unhashable elements correctly and whether it needs to, (3) whether " + "order of the output matters and how the current code handles it, (4) " + "what happens with inputs like an empty list, a list with no " + "duplicates, or a list where every element is the same. Then provide " + "a rewritten version using collections.Counter, and a second version " + "using a set-based single-pass approach. Compare the two rewrites and " + "explain when you'd prefer each.", + + # ~350 tokens — systems debugging + "You are debugging a production issue where a Python web service's " + "p99 latency has jumped from 50ms to 800ms over the past week, while " + "p50 latency is unchanged at around 15ms and CPU utilization across " + "the fleet has actually decreased slightly. Request volume is flat. " + "The service is a relatively simple HTTP API backed by PostgreSQL " + "and a Redis cache, deployed across 12 instances behind a load " + "balancer. No code has been deployed in two weeks. Walk through your " + "investigation methodology. What hypotheses would you generate from " + "this symptom pattern, and in what order would you test them? " + "Specifically address: why p50 being stable but p99 spiking is " + "informative, what the CPU utilization clue tells you about whether " + "the bottleneck is compute-bound, which observability signals you " + "would pull first (database metrics, GC pauses, network latency, " + "lock contention, downstream service latencies), and how you would " + "rule each candidate cause in or out. Conclude with what a runbook " + "entry for this incident pattern should contain for the next on-call " + "engineer who sees similar symptoms.", + + # ~400 tokens — physics explanation + "Explain why the sky is blue, going deeper than the usual 'Rayleigh " + "scattering' one-liner. Build the explanation in layers. First, " + "describe what scattering means physically: an incoming " + "electromagnetic wave drives bound electrons in air molecules into " + "oscillation, and those oscillating charges re-radiate. Second, " + "derive (or at least motivate) the inverse-fourth-power wavelength " + "dependence of Rayleigh scattering — why short wavelengths are " + "scattered so much more strongly than long ones. Third, address the " + "follow-up question this immediately raises: if violet is scattered " + "even more strongly than blue, why doesn't the sky look violet? " + "Cover both the solar spectrum (less violet emission than blue) and " + "the response of human cone cells. Fourth, explain why sunsets are " + "red using the same framework — the geometry of light traveling " + "through more atmosphere at low sun angles. Finally, describe what " + "the sky looks like on Mars and why it differs (hint: it's not just " + "the thinner atmosphere; the dominant scatterers are different in " + "kind, not just in density). Throughout, keep the explanation " + "accessible to someone with high-school physics but don't shy away " + "from quantitative claims when they sharpen the picture.", + + # ~450 tokens — open-ended analysis + "Analyze the tradeoffs between monolithic and microservices " + "architectures for a hypothetical mid-stage startup: roughly 50 " + "engineers, $20M ARR, growing 80% year-over-year, currently running " + "a single Ruby on Rails monolith that has become difficult to deploy " + "(deploys take 45 minutes, deploy failures are common, and engineers " + "frequently step on each other's changes). The CTO is considering a " + "migration to microservices and has asked you to write a memo. Cover " + "the following in your memo. First, identify what problems " + "microservices actually solve and which of the company's current " + "pain points would and would not be addressed by such a migration. " + "Second, identify the new problems that microservices would " + "introduce — distributed tracing complexity, network reliability " + "concerns, data consistency across services, increased operational " + "burden, the difficulty of refactoring across service boundaries — " + "and how much of an organization at this size and growth rate would " + "need to invest to handle them well. Third, present an alternative " + "intermediate path: keeping the monolith but adopting modular " + "boundaries, trunk-based development with feature flags, parallel " + "test execution, and better deploy tooling. Make a recommendation " + "with explicit reasoning about which approach you would advocate " + "for given the company's stage, and explicitly name the conditions " + "that would change your recommendation. Be concrete: cite specific " + "patterns and tools where relevant. The memo should be persuasive " + "but balanced — assume the CTO is technically sophisticated and " + "will push back on glib answers.", + + # ~500 tokens — creative writing with constraints + "Write the opening chapter of a literary science fiction novel set " + "in a generation ship 200 years into its 800-year voyage. The " + "chapter should be approximately 1200 words and should accomplish " + "the following: introduce the protagonist, a botanist in her " + "mid-thirties named Inez who has lived her entire life aboard the " + "ship; establish through small concrete details rather than " + "exposition that the original mission's purpose has become " + "ambiguous to the current generation; show without telling that the " + "ship's biosphere is subtly failing in ways the leadership is not " + "openly discussing; introduce a secondary character through " + "Inez's eyes who will serve as her antagonist later in the book, " + "but make the initial impression sympathetic rather than ominous; " + "and end on a moment of small but unsettling discovery — something " + "Inez notices in the agricultural deck that she cannot immediately " + "explain. Stylistically, the prose should be quiet and observational, " + "favor concrete sensory detail over abstract reflection, and avoid " + "any infodump about how the ship works or how Inez came to be there. " + "The reader should feel slightly disoriented at the start and slowly " + "orient themselves through context. Resist the temptation to " + "explicitly state the chapter's themes; let them emerge from " + "juxtaposition and detail. Avoid sci-fi cliches like blinking " + "consoles, dramatic alarms, or characters monologuing about Earth. " + "Names of plants, equipment, and ship locations should feel " + "lived-in rather than designed for the reader's benefit — they're " + "things Inez has known her whole life and would not pause to " + "explain to herself. The point of view is close third, present " + "tense.", + + # ~550 tokens — multi-step technical task + "I want to set up a local development environment for fine-tuning " + "open-weights language models on a single workstation with one " + "consumer GPU (24GB VRAM). Walk me through the full setup, " + "explaining the reasoning behind each choice rather than just " + "listing commands. Specifically, address the following in order. " + "First, the choice of base framework: compare using " + "transformers + peft + trl directly versus using a higher-level " + "wrapper like Axolotl or unsloth, and recommend one for a user " + "who wants to understand what's happening but doesn't want to " + "reinvent training loops. Second, the choice of fine-tuning " + "technique: full fine-tuning is off the table at this VRAM " + "budget for any model above ~3B parameters, so we're choosing " + "among LoRA, QLoRA, and DoRA — explain the practical tradeoffs " + "and recommend a default. Third, the environment setup itself: " + "Python version, virtual environment tool, the specific torch " + "build that matches the user's CUDA version, and a strategy for " + "pinning versions so the environment is reproducible six months " + "from now. Fourth, a minimal end-to-end smoke test: fine-tune a " + "1B-parameter base model on a small instruction-following " + "dataset (say, a 1000-row subset of something publicly " + "available) for a single epoch, with the goal of confirming the " + "pipeline works rather than producing a good model. Specify " + "exact hyperparameters and explain why each was chosen for a " + "smoke test rather than a real training run. Fifth, how to " + "evaluate whether the smoke test succeeded — what should the " + "loss curve look like, what should generations look like before " + "and after, what are the common failure modes (NaN losses, " + "OOM on the first backward pass, the model producing only the " + "EOS token) and how to diagnose each. Sixth, what to read or " + "study next to go from 'I ran a smoke test' to 'I can " + "intelligently fine-tune for a real use case'. Throughout, " + "prefer concrete defaults over open-ended choices — the reader " + "is a competent engineer but new to fine-tuning.", + +] + + +# --------------------------------------------------------------------------- # +# Metrics data # +# --------------------------------------------------------------------------- # + +@dataclass +class SequenceTiming: + """Timing for one sequence within a request (a request may emit several).""" + first_token_time: float | None = None + last_token_time: float | None = None + num_output_tokens: int = 0 + + def record(self, token_count: int) -> None: + if token_count == 0: + return + now = time.perf_counter() + if self.first_token_time is None: + self.first_token_time = now + self.last_token_time = now + self.num_output_tokens += token_count + + @property + def has_tokens(self) -> bool: + return self.first_token_time is not None and self.last_token_time is not None + + +@dataclass +class GenerationMetrics: + """Computed metrics for a single request.""" + input_tokens: int + new_tokens: int + ttft_ms: float + tpot_ms: float + prefill_throughput: float # tokens/s + decode_throughput: float # tokens/s + + @property + def total_tokens(self) -> int: + return self.input_tokens + self.new_tokens + + def format(self, request_id: int) -> str: + return ( + f"Request {request_id}: " + f"ttft={self.ttft_ms:.1f}ms " + f"tpot={self.tpot_ms:.1f}ms/tok " + f"prefill={self.prefill_throughput:.1f}tok/s " + f"decode={self.decode_throughput:.1f}tok/s " + f"in={self.input_tokens} new={self.new_tokens} total={self.total_tokens}" + ) + + +# --------------------------------------------------------------------------- # +# Per-request tracker # +# --------------------------------------------------------------------------- # + +class RequestTracker: + """Wraps a single GenerationHandle and computes its metrics.""" + + def __init__(self, handle: GenerationHandle, input_len: int): + self.handle = handle + self.input_len = input_len + self.start_time = time.perf_counter() + self.sequences: dict[int, SequenceTiming] = {} + self.active = True + + def can_read(self) -> bool: + return self.handle.can_read() + + def is_finished(self) -> bool: + return self.handle.get_status() == ov_genai.GenerationStatus.FINISHED + + def poll(self) -> None: + """Pull any newly-generated tokens off the handle and record timing.""" + for seq_id, output in self.handle.read().items(): + seq = self.sequences.setdefault(seq_id, SequenceTiming()) + seq.record(len(output.generated_ids)) + + def compute_metrics(self) -> GenerationMetrics: + completed = [s for s in self.sequences.values() if s.has_tokens] + if not completed: + return GenerationMetrics(self.input_len, 0, 0.0, 0.0, 0.0, 0.0) + + # Across sequences: earliest first-token wins for TTFT, + # latest last-token defines the decode window. + first_token_time = min(s.first_token_time for s in completed) + last_token_time = max(s.last_token_time for s in completed) + new_tokens = sum(s.num_output_tokens for s in completed) + + ttft_s = first_token_time - self.start_time + decode_s = last_token_time - first_token_time + decode_tokens = max(0, new_tokens - 1) # first token counted in TTFT + + return GenerationMetrics( + input_tokens=self.input_len, + new_tokens=new_tokens, + ttft_ms=ttft_s * 1000.0, + tpot_ms=(decode_s * 1000.0 / decode_tokens) if decode_tokens else 0.0, + prefill_throughput=(self.input_len / ttft_s) if ttft_s > 0 else 0.0, + decode_throughput=(decode_tokens / decode_s) if decode_s > 0 else 0.0, + ) + + +# --------------------------------------------------------------------------- # +# Pipeline setup # +# --------------------------------------------------------------------------- # + +def build_scheduler_config() -> ov_genai.SchedulerConfig: + config = ov_genai.SchedulerConfig() + config.max_num_batched_tokens = 3072 + config.max_num_seqs = 16 + config.cache_size = 22 + config.dynamic_split_fuse = True + config.enable_prefix_caching = True + return config + + +def build_generation_config(max_new_tokens: int = 5096) -> ov_genai.GenerationConfig: + config = ov_genai.GenerationConfig() + config.max_new_tokens = max_new_tokens + config.do_sample = False + return config + + +def count_tokens(tokenizer: ov_genai.Tokenizer, prompt: str) -> int: + return int(tokenizer.encode(prompt).input_ids.shape[-1]) + + +# --------------------------------------------------------------------------- # +# Batch execution # +# --------------------------------------------------------------------------- # + +def submit_prompts( + pipe: ov_genai.ContinuousBatchingPipeline, + prompts: list[str], + generation_config: ov_genai.GenerationConfig, +) -> list[RequestTracker]: + tokenizer = pipe.get_tokenizer() + trackers = [] + for req_id, prompt in enumerate(prompts): + handle = pipe.add_request(req_id, prompt, generation_config) + trackers.append(RequestTracker(handle, count_tokens(tokenizer, prompt))) + return trackers + + +def drive_pipeline( + pipe: ov_genai.ContinuousBatchingPipeline, + trackers: list[RequestTracker], +) -> None: + """Step the pipeline until every request is finished, polling each tick.""" + while pipe.has_non_finished_requests(): + pipe.step() + for tracker in trackers: + if not tracker.active: + continue + if tracker.can_read(): + tracker.poll() + if tracker.is_finished(): + tracker.active = False + + +# --------------------------------------------------------------------------- # +# Entry point # +# --------------------------------------------------------------------------- # + +def main() -> None: + pipe = ov_genai.ContinuousBatchingPipeline( + MODEL_PATH, + device=DEVICE, + scheduler_config=build_scheduler_config(), + ) + + trackers = submit_prompts(pipe, PROMPTS, build_generation_config()) + drive_pipeline(pipe, trackers) + + for i, tracker in enumerate(trackers): + print(tracker.compute_metrics().format(i)) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/rotating_requests_example.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/rotating_requests_example.py new file mode 100644 index 00000000..5a445ebd --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/rotating_requests_example.py @@ -0,0 +1,326 @@ +from __future__ import annotations + +import argparse +import random +from collections import deque +from dataclasses import dataclass, field + +import openvino_genai as genai + + +@dataclass +class IncomingRequest: + """Represents a mock external request waiting to be admitted into the pipeline.""" + + request_id: int + arrival_step: int + prompt: str + use_input_ids: bool + target_input_tokens: int + actual_input_tokens: int + +@dataclass +class ActiveRequest: + """Tracks an in-flight generation request and the tokens produced so far.""" + + request_id: int + prompt: str + submitted_step: int + via_input_ids: bool + handle: genai.GenerationHandle + generated_ids: list[int] = field(default_factory=list) + finished_step: int | None = None + finish_reason: genai.GenerationFinishReason | None = None + + +def build_pipeline(model_dir: str, device: str) -> genai.ContinuousBatchingPipeline: + """Create a continuous batching pipeline configured for the demo workload.""" + + scheduler = genai.SchedulerConfig() + scheduler.max_num_batched_tokens = 2048 + scheduler.max_num_seqs = 8 + scheduler.cache_size = 4 + scheduler.dynamic_split_fuse = True + scheduler.enable_prefix_caching = True + + return genai.ContinuousBatchingPipeline( + model_dir, + device=device, + scheduler_config=scheduler, + ) + + +def build_generation_config(max_new_tokens: int) -> genai.GenerationConfig: + """Return a deterministic generation config for reproducible behavior.""" + + cfg = genai.GenerationConfig() + cfg.max_new_tokens = max_new_tokens + cfg.do_sample = False + return cfg + + +def sample_poisson(rng: random.Random, lam: float) -> int: + """Sample an integer from a Poisson distribution using Knuth's algorithm.""" + + if lam <= 0.0: + return 0 + + threshold = pow(2.718281828459045, -lam) + k = 0 + product = 1.0 + while product > threshold: + k += 1 + product *= rng.random() + return k - 1 + + +def count_tokens(tokenizer: genai.Tokenizer, prompt: str) -> int: + """Count input tokens for a prompt with the pipeline tokenizer.""" + + return int(tokenizer.encode(prompt).input_ids.shape[-1]) + + +def build_prompt_for_target_tokens( + tokenizer: genai.Tokenizer, + request_id: int, + target_tokens: int, +) -> tuple[str, int]: + """Build a prompt that reaches roughly the requested input token budget.""" + + base_prompt = ( + f"Request {request_id}: Give one concise sentence about continuous batching fairness " + f"and throughput trade-offs. Context: " + ) + current_prompt = base_prompt + current_tokens = count_tokens(tokenizer, current_prompt) + if current_tokens >= target_tokens: + return current_prompt, current_tokens + + filler_words = ( + "latency throughput fairness queueing prefill decode batching scheduler " + "cache memory arbitration tail performance admission policy service-level " + ).split() + idx = 0 + while current_tokens < target_tokens: + current_prompt += filler_words[idx % len(filler_words)] + " " + current_tokens = count_tokens(tokenizer, current_prompt) + idx += 1 + + return current_prompt, current_tokens + + +def make_mock_incoming_requests( + tokenizer: genai.Tokenizer, + total_requests: int, + seed: int, + input_tokens_min: int, + input_tokens_max: int, + poisson_lambda: float, +) -> deque[IncomingRequest]: + """Create staggered incoming traffic with bounded Poisson burstiness in input size.""" + + rng = random.Random(seed) + arrivals: list[IncomingRequest] = [] + step_cursor = 0 + + for request_id in range(1, total_requests + 1): + step_cursor += rng.randint(0, 2) + use_input_ids = request_id % 2 == 0 + poisson_draw = sample_poisson(rng, poisson_lambda) + target_input_tokens = max(input_tokens_min, min(input_tokens_max, poisson_draw)) + prompt, actual_input_tokens = build_prompt_for_target_tokens( + tokenizer=tokenizer, + request_id=request_id, + target_tokens=target_input_tokens, + ) + arrivals.append( + IncomingRequest( + request_id=request_id, + arrival_step=step_cursor, + prompt=prompt, + use_input_ids=use_input_ids, + target_input_tokens=target_input_tokens, + actual_input_tokens=actual_input_tokens, + ) + ) + + return deque(arrivals) + + +def submit_request( + pipeline: genai.ContinuousBatchingPipeline, + cfg: genai.GenerationConfig, + incoming: IncomingRequest, + current_step: int, +) -> ActiveRequest: + """Submit one incoming request through either prompt or input_ids add_request overload.""" + + if incoming.use_input_ids: + tokenized = pipeline.get_tokenizer().encode(incoming.prompt) + handle = pipeline.add_request(incoming.request_id, tokenized.input_ids, cfg) + else: + handle = pipeline.add_request(incoming.request_id, incoming.prompt, cfg) + + return ActiveRequest( + request_id=incoming.request_id, + prompt=incoming.prompt, + submitted_step=current_step, + via_input_ids=incoming.use_input_ids, + handle=handle, + ) + + +def poll_active_requests( + active: dict[int, ActiveRequest], + current_step: int, +) -> list[ActiveRequest]: + """Read newly generated chunks from each handle and return requests that reached terminal state.""" + + finished: list[ActiveRequest] = [] + + for req in active.values(): + if req.handle.can_read(): + for output in req.handle.read().values(): + req.generated_ids.extend(output.generated_ids) + if output.finish_reason != genai.GenerationFinishReason.NONE: + req.finish_reason = output.finish_reason + + status = req.handle.get_status() + if status in ( + genai.GenerationStatus.FINISHED, + genai.GenerationStatus.IGNORED, + genai.GenerationStatus.CANCEL, + genai.GenerationStatus.STOP, + ): + req.finished_step = current_step + if req.finish_reason is None: + req.finish_reason = genai.GenerationFinishReason.NONE + finished.append(req) + + return finished + + +def run_rotating_demo( + pipeline: genai.ContinuousBatchingPipeline, + cfg: genai.GenerationConfig, + incoming_queue: deque[IncomingRequest], + max_inflight: int, +) -> list[ActiveRequest]: + """Simulate a rotating active set by admitting arrivals and retiring completed requests.""" + + active: dict[int, ActiveRequest] = {} + completed: list[ActiveRequest] = [] + step_idx = 0 + + while incoming_queue or active: + while incoming_queue and incoming_queue[0].arrival_step <= step_idx and len(active) < max_inflight: + incoming = incoming_queue.popleft() + req = submit_request(pipeline, cfg, incoming, current_step=step_idx) + active[req.request_id] = req + path = "input_ids" if req.via_input_ids else "prompt" + print( + f"[step {step_idx:04d}] admitted request={req.request_id:03d} " + f"via={path} input_tokens={incoming.actual_input_tokens:03d} " + f"target={incoming.target_input_tokens:03d} active={len(active):02d}/{max_inflight}" + ) + + if active: + pipeline.step() + + finished_now = poll_active_requests(active, current_step=step_idx) + for req in finished_now: + active.pop(req.request_id, None) + completed.append(req) + latency_steps = (req.finished_step - req.submitted_step) if req.finished_step is not None else -1 + print( + f"[step {step_idx:04d}] finished request={req.request_id:03d} " + f"tokens={len(req.generated_ids):03d} latency_steps={latency_steps:03d} " + f"reason={req.finish_reason.name if req.finish_reason else 'UNKNOWN'} " + f"active={len(active):02d}/{max_inflight}" + ) + + step_idx += 1 + + return completed + + +def print_summary(pipeline: genai.ContinuousBatchingPipeline, completed: list[ActiveRequest]) -> None: + """Print final per-request summaries and decode a short text sample for inspection.""" + + tokenizer = pipeline.get_tokenizer() + + print("\n=== Completed Requests ===") + for req in sorted(completed, key=lambda item: item.request_id): + sample = tokenizer.decode(req.generated_ids[:64]).strip() if req.generated_ids else "" + path = "input_ids" if req.via_input_ids else "prompt" + print( + f"request={req.request_id:03d} via={path} out_tokens={len(req.generated_ids):03d} " + f"finish_reason={req.finish_reason.name if req.finish_reason else 'UNKNOWN'}" + ) + print(f"sample: {sample or ''}") + + +def main() -> None: + """CLI entrypoint for the rotating-request tracking example.""" + + parser = argparse.ArgumentParser( + description=( + "Demonstrate tracking a rotating set of mock incoming requests with " + "ContinuousBatchingPipeline + GenerationHandle." + ) + ) + parser.add_argument("model_dir", help="Path to OpenVINO model directory") + parser.add_argument("--device", default="GPU.0", help="OpenVINO device") + parser.add_argument("--total-requests", type=int, default=12, help="Number of mock requests") + parser.add_argument("--max-inflight", type=int, default=4, help="Active request capacity") + parser.add_argument("--max-new-tokens", type=int, default=48, help="Generation length per request") + parser.add_argument("--seed", type=int, default=7, help="Seed for mock request arrivals") + parser.add_argument( + "--input-tokens-min", + type=int, + default=256, + help="Lower bound for sampled input token size per request", + ) + parser.add_argument( + "--input-tokens-max", + type=int, + default=2048, + help="Upper bound for sampled input token size per request", + ) + parser.add_argument( + "--poisson-lambda", + type=float, + default=96.0, + help="Poisson lambda used to sample bursty input token sizes", + ) + args = parser.parse_args() + + if args.input_tokens_min <= 0: + raise ValueError("--input-tokens-min must be > 0") + if args.input_tokens_max < args.input_tokens_min: + raise ValueError("--input-tokens-max must be >= --input-tokens-min") + if args.poisson_lambda <= 0.0: + raise ValueError("--poisson-lambda must be > 0") + + pipeline = build_pipeline(args.model_dir, args.device) + cfg = build_generation_config(args.max_new_tokens) + incoming = make_mock_incoming_requests( + tokenizer=pipeline.get_tokenizer(), + total_requests=args.total_requests, + seed=args.seed, + input_tokens_min=args.input_tokens_min, + input_tokens_max=args.input_tokens_max, + poisson_lambda=args.poisson_lambda, + ) + + completed = run_rotating_demo( + pipeline=pipeline, + cfg=cfg, + incoming_queue=incoming, + max_inflight=args.max_inflight, + ) + print_summary(pipeline, completed) + + +if __name__ == "__main__": + main() diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/test_calls_to_step.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_calls_to_step.py new file mode 100644 index 00000000..00595a37 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_calls_to_step.py @@ -0,0 +1,361 @@ +""" +Continuous-batching behavior probe — OpenVINO GenAI 2026.2 + +Run this on the machine with the Intel GPU: + + python cb_probe.py + +It does NOT touch the OpenArc server. It isolates the two questions that +decide how the CB engine loop should be threaded. + + EXPERIMENT 1 - Does ContinuousBatchingPipeline.step() release the GIL? + A monitor thread runs a tight pure-Python loop and counts how many + iterations it completes per second. We measure that rate with the + pipeline idle (baseline), then again while the main thread drives + step() in a loop. If step() releases the GIL during the forward + pass, the monitor keeps running near baseline rate. If step() holds + the GIL, the monitor is starved and the rate collapses. + + EXPERIMENT 2 - Does an asyncio loop stay responsive when step() is driven + through a single-worker ThreadPoolExecutor? + An engine-loop coroutine runs step() via loop.run_in_executor() on a + max_workers=1 pool. A heartbeat coroutine that wants to wake every + 10 ms records its jitter. Low jitter => the recommended architecture + keeps the event loop free. A third coroutine injects new requests + mid-generation to confirm add_request() works on a live pipeline. + +Tune the CONFIG block for your hardware. Verdicts print at the end. +""" + +from __future__ import annotations + +import asyncio +import threading +import time +from concurrent.futures import ThreadPoolExecutor +from dataclasses import dataclass + +import openvino_genai as genai + + +# --------------------------------------------------------------------------- # +# CONFIG # +# --------------------------------------------------------------------------- # + +MODEL_PATH = "/mnt/Ironwolf-4TB/Models/OpenVINO/Anubis-Mini-8B-v1-int4_asym-ov/" +DEVICE = "GPU.0" + +# SchedulerConfig - tune cache_size (GB) to fit your VRAM. +SCHED_MAX_NUM_BATCHED_TOKENS = 2048 +SCHED_MAX_NUM_SEQS = 16 +SCHED_CACHE_SIZE_GB = 8 +SCHED_DYNAMIC_SPLIT_FUSE = True +SCHED_ENABLE_PREFIX_CACHING = True + +MAX_NEW_TOKENS = 192 # enough steps to measure, short enough to stay quick +BASELINE_SECONDS = 3.0 # how long to measure the idle monitor baseline +HEARTBEAT_TARGET_MS = 10.0 # experiment 2 heartbeat period + +PROMPTS = [ + "Explain how continuous batching differs from static batching for LLM serving.", + "Write a short paragraph about the history of the printing press.", + "Describe, step by step, how a CPU executes a single instruction.", + "Summarize the causes of the 2008 financial crisis in plain language.", +] + +# Injected mid-run in experiment 2 to test add_request() on a live pipeline. +INJECT_PROMPTS = [ + "List five considerations when choosing a database index.", + "Explain what a KV cache is and why it matters for transformer inference.", +] + +TERMINAL_STATUSES = { + genai.GenerationStatus.FINISHED, + genai.GenerationStatus.IGNORED, + genai.GenerationStatus.CANCEL, + genai.GenerationStatus.STOP, +} + + +# --------------------------------------------------------------------------- # +# Pipeline setup # +# --------------------------------------------------------------------------- # + +def build_pipeline() -> genai.ContinuousBatchingPipeline: + scheduler = genai.SchedulerConfig() + scheduler.max_num_batched_tokens = SCHED_MAX_NUM_BATCHED_TOKENS + scheduler.max_num_seqs = SCHED_MAX_NUM_SEQS + scheduler.cache_size = SCHED_CACHE_SIZE_GB + scheduler.dynamic_split_fuse = SCHED_DYNAMIC_SPLIT_FUSE + scheduler.enable_prefix_caching = SCHED_ENABLE_PREFIX_CACHING + + print(f"[setup] loading {MODEL_PATH} on {DEVICE} ...") + t0 = time.perf_counter() + pipe = genai.ContinuousBatchingPipeline( + MODEL_PATH, + device=DEVICE, + scheduler_config=scheduler, + ) + print(f"[setup] pipeline ready in {time.perf_counter() - t0:.1f}s") + return pipe + + +def build_generation_config() -> genai.GenerationConfig: + cfg = genai.GenerationConfig() + cfg.max_new_tokens = MAX_NEW_TOKENS + cfg.do_sample = False + return cfg + + +def drain_handles( + handles: dict[int, genai.GenerationHandle], + token_counts: dict[int, int], +) -> list[int]: + """Read newly generated tokens from each handle; return finished ids. + + Note the terminal check covers IGNORED/CANCEL/STOP, not just FINISHED - + an OOM-IGNORED request must be retired too, or the loop never drops it. + """ + finished: list[int] = [] + for rid, handle in handles.items(): + if handle.can_read(): + for output in handle.read().values(): + token_counts[rid] = token_counts.get(rid, 0) + len(output.generated_ids) + if handle.get_status() in TERMINAL_STATUSES: + finished.append(rid) + return finished + + +# --------------------------------------------------------------------------- # +# Experiment 1 - GIL release probe # +# --------------------------------------------------------------------------- # + +@dataclass +class MonitorResult: + iterations: int = 0 + seconds: float = 0.0 + max_stall_ms: float = 0.0 + stalls_over_1ms: int = 0 + + @property + def iters_per_sec(self) -> float: + return self.iterations / self.seconds if self.seconds > 0 else 0.0 + + +def _run_monitor(stop: threading.Event, result: MonitorResult) -> None: + """Tight pure-Python loop. It only fails to make progress when it + cannot acquire the GIL, so its iteration rate is a direct proxy for + 'how much of the time was the GIL available to other threads'.""" + iterations = 0 + max_stall = 0.0 + stalls = 0 + start = time.perf_counter() + prev = start + while not stop.is_set(): + now = time.perf_counter() + delta = now - prev + prev = now + iterations += 1 + if delta > max_stall: + max_stall = delta + if delta > 0.001: + stalls += 1 + result.iterations = iterations + result.seconds = time.perf_counter() - start + result.max_stall_ms = max_stall * 1000.0 + result.stalls_over_1ms = stalls + + +def probe_gil(pipe: genai.ContinuousBatchingPipeline, cfg: genai.GenerationConfig) -> None: + print("\n" + "=" * 72) + print("EXPERIMENT 1 - does step() release the GIL?") + print("=" * 72) + + # Baseline: monitor alone. The main thread is in time.sleep(), which + # releases the GIL, so this is the monitor's uncontended rate. + baseline = MonitorResult() + stop = threading.Event() + mon = threading.Thread(target=_run_monitor, args=(stop, baseline), daemon=True) + mon.start() + time.sleep(BASELINE_SECONDS) + stop.set() + mon.join() + print(f"[baseline] monitor idle: {baseline.iters_per_sec:,.0f} iters/s, " + f"max stall {baseline.max_stall_ms:.2f} ms") + + # Submit requests. + handles: dict[int, genai.GenerationHandle] = {} + for rid, prompt in enumerate(PROMPTS): + handles[rid] = pipe.add_request(rid, prompt, cfg) + token_counts: dict[int, int] = {} + + # Stepping phase: monitor runs while the MAIN thread drives step(). + stepping = MonitorResult() + stop = threading.Event() + mon = threading.Thread(target=_run_monitor, args=(stop, stepping), daemon=True) + mon.start() + + step_times: list[float] = [] + phase_start = time.perf_counter() + while pipe.has_non_finished_requests(): + t0 = time.perf_counter() + pipe.step() + step_times.append((time.perf_counter() - t0) * 1000.0) + for rid in drain_handles(handles, token_counts): + handles.pop(rid, None) + phase_seconds = time.perf_counter() - phase_start + + stop.set() + mon.join() + + n_steps = len(step_times) + avg_step = sum(step_times) / n_steps if n_steps else 0.0 + max_step = max(step_times) if step_times else 0.0 + print(f"[stepping] {n_steps} steps in {phase_seconds:.1f}s " + f"(avg {avg_step:.1f} ms, max {max_step:.1f} ms)") + print(f"[stepping] monitor while stepping: {stepping.iters_per_sec:,.0f} iters/s, " + f"max stall {stepping.max_stall_ms:.2f} ms") + print(f"[stepping] tokens generated: {sum(token_counts.values())}") + + ratio = (stepping.iters_per_sec / baseline.iters_per_sec + if baseline.iters_per_sec > 0 else 0.0) + print(f"\n[result] monitor kept {ratio * 100:.1f}% of its baseline rate " + f"while step() ran.") + print(f"[result] worst monitor stall while stepping: {stepping.max_stall_ms:.1f} ms " + f"(slowest single step: {max_step:.1f} ms)") + if ratio > 0.6: + print("[verdict] step() RELEASES the GIL during the forward pass.") + print(" -> run_in_executor / a worker thread genuinely frees the") + print(" asyncio event loop. The recommended design holds.") + elif ratio < 0.2: + print("[verdict] step() HOLDS the GIL.") + print(" -> a worker thread will NOT free the event loop; the CB") + print(" engine loop would need a separate process.") + else: + print("[verdict] AMBIGUOUS - partial GIL release. Compare worst stall to") + print(" slowest step above and re-run with a larger MAX_NEW_TOKENS.") + + +# --------------------------------------------------------------------------- # +# Experiment 2 - asyncio responsiveness with a single-worker executor # +# --------------------------------------------------------------------------- # + +async def _engine_loop( + pipe: genai.ContinuousBatchingPipeline, + executor: ThreadPoolExecutor, + handles: dict[int, genai.GenerationHandle], + token_counts: dict[int, int], + done: asyncio.Event, +) -> None: + loop = asyncio.get_running_loop() + + def step_and_drain() -> list[int]: + pipe.step() + return drain_handles(handles, token_counts) + + while pipe.has_non_finished_requests(): + finished = await loop.run_in_executor(executor, step_and_drain) + for rid in finished: + handles.pop(rid, None) + done.set() + + +async def _heartbeat(done: asyncio.Event, jitter_ms: list[float]) -> None: + target = HEARTBEAT_TARGET_MS / 1000.0 + while not done.is_set(): + t0 = time.perf_counter() + await asyncio.sleep(target) + jitter_ms.append((time.perf_counter() - t0 - target) * 1000.0) + + +async def _injector( + pipe: genai.ContinuousBatchingPipeline, + cfg: genai.GenerationConfig, + executor: ThreadPoolExecutor, + handles: dict[int, genai.GenerationHandle], + start_rid: int, +) -> None: + # Assumes generation outlasts the inject schedule (true for the default + # MAX_NEW_TOKENS on an 8B model). Adds are routed through the same + # single-worker executor so every pipeline call stays on one thread. + loop = asyncio.get_running_loop() + for offset, prompt in enumerate(INJECT_PROMPTS): + await asyncio.sleep(1.0) + rid = start_rid + offset + handle = await loop.run_in_executor(executor, pipe.add_request, rid, prompt, cfg) + handles[rid] = handle + print(f"[inject] added request {rid} mid-run") + + +async def probe_asyncio(pipe: genai.ContinuousBatchingPipeline, cfg: genai.GenerationConfig) -> None: + print("\n" + "=" * 72) + print("EXPERIMENT 2 - asyncio responsiveness with single-worker executor") + print("=" * 72) + + executor = ThreadPoolExecutor(max_workers=1, thread_name_prefix="cb-engine") + loop = asyncio.get_running_loop() + handles: dict[int, genai.GenerationHandle] = {} + token_counts: dict[int, int] = {} + + # Disjoint id range from experiment 1 to avoid any duplicate-id surprises. + for offset, prompt in enumerate(PROMPTS): + rid = 1000 + offset + handles[rid] = await loop.run_in_executor(executor, pipe.add_request, rid, prompt, cfg) + + done = asyncio.Event() + jitter_ms: list[float] = [] + + t0 = time.perf_counter() + await asyncio.gather( + _engine_loop(pipe, executor, handles, token_counts, done), + _heartbeat(done, jitter_ms), + _injector(pipe, cfg, executor, handles, start_rid=2000), + ) + wall = time.perf_counter() - t0 + executor.shutdown(wait=True) + + jitter_ms.sort() + n = len(jitter_ms) + if n: + p50 = jitter_ms[n // 2] + p99 = jitter_ms[min(n - 1, int(n * 0.99))] + worst = jitter_ms[-1] + else: + p50 = p99 = worst = 0.0 + + print(f"[run] completed in {wall:.1f}s, " + f"{sum(token_counts.values())} tokens over {len(token_counts)} requests") + print(f"[heartbeat] {n} beats, target {HEARTBEAT_TARGET_MS:.0f} ms, jitter over " + f"target: p50 {p50:.1f} ms, p99 {p99:.1f} ms, worst {worst:.1f} ms") + + if worst < 25.0: + print("[verdict] event loop stayed RESPONSIVE while generation ran.") + print(" a single-worker ThreadPoolExecutor is a sound base for") + print(" the CB engine loop.") + else: + print("[verdict] event loop saw STALLS - worst heartbeat jitter is high.") + print(" if experiment 1 said the GIL is released, suspect the") + print(" executor handoff or per-step Python work; if the GIL is") + print(" held, that is the cause and a thread will not fix it.") + + +# --------------------------------------------------------------------------- # +# Entry point # +# --------------------------------------------------------------------------- # + +def main() -> None: + pipe = build_pipeline() + cfg = build_generation_config() + + probe_gil(pipe, cfg) + asyncio.run(probe_asyncio(pipe, cfg)) + + print("\n" + "=" * 72) + print("Done. Experiment 1's verdict is the load-bearing one: it decides") + print("whether the CB engine loop can live in a thread (recommended) or") + print("must run in a separate process.") + print("=" * 72) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/test_event_loop.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_event_loop.py new file mode 100644 index 00000000..5b8d5507 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_event_loop.py @@ -0,0 +1,392 @@ +""" +Out-of-process CB engine - proof and blueprint. + +cb_server_block_test.py showed an in-process CB engine freezes the whole +server: a do-nothing /ping went from ~1 ms to ~389 ms while a batch ran, +because step() holds the GIL. + +This script runs the SAME load test, but the CB engine lives in its own +process, spawned (not forked). The FastAPI event loop never calls step() - +it only puts small messages on a multiprocessing.Queue and reads results +back through a thread that blocks on IPC (which releases the GIL while +waiting). /ping should stay flat at ~1 ms even while a batch is in flight. + +It is also the blueprint for the OpenArc integration: + - engine_process() == the CB engine loop (runs in the child) + - the FastAPI server side == what queue_worker_cb becomes (the bridge) + +Process layout: + this script (client) --spawns--> FastAPI server --spawns--> engine +The client/server split only isolates the client's measurements. +The server/engine split is the actual fix. + +Run on the GPU box: + pip install fastapi uvicorn httpx + python cb_server_oop_test.py +""" + +from __future__ import annotations + +import asyncio +import itertools +import multiprocessing as mp +import os +import queue +import subprocess +import sys +import threading +import time +from contextlib import asynccontextmanager + +import httpx +import uvicorn +from fastapi import FastAPI + + +# --------------------------------------------------------------------------- # +# CONFIG # +# --------------------------------------------------------------------------- # + +MODEL_PATH = "/mnt/Ironwolf-4TB/Models/OpenVINO/Anubis-Mini-8B-v1-int4_asym-ov/" +DEVICE = "GPU.0" +HOST = "127.0.0.1" +PORT = 8138 + +SCHEDULER = { + "max_num_batched_tokens": 2048, + "max_num_seqs": 16, + "cache_size": 8, # tune to your VRAM + "dynamic_split_fuse": True, + "enable_prefix_caching": True, +} + +MAX_NEW_TOKENS = 256 +BATCH_SIZE = 6 +BASELINE_PINGS = 60 +SLOW_PING_MS = 50.0 + +PROMPTS = [ + "Explain how continuous batching differs from static batching for LLM serving.", + "Write a short paragraph about the history of the printing press.", + "Describe, step by step, how a CPU executes a single instruction.", + "Summarize the causes of the 2008 financial crisis in plain language.", + "List five considerations when choosing a database index, with reasons.", + "Explain what a KV cache is and why it matters for transformer inference.", +] + + +# =========================================================================== # +# ENGINE PROCESS - runs in its own interpreter, spawned by the server. # +# Everything below in this section executes in the CHILD. # +# =========================================================================== # + +def _build_pipeline(model_path, device, scheduler): + import openvino_genai as genai + + sc = genai.SchedulerConfig() + for key, value in scheduler.items(): + setattr(sc, key, value) + return genai.ContinuousBatchingPipeline(model_path, device=device, scheduler_config=sc) + + +def _handle_request(msg, pipe, handles, genai) -> bool: + """Apply one inbound message. Returns False on shutdown.""" + kind = msg["type"] + if kind == "shutdown": + return False + if kind == "cancel": + handle = handles.get(msg["rid"]) + if handle is not None: + handle.cancel() + elif kind == "submit": + # In the real server, send the whole gen-config as a dict and + # rebuild it here. The test only varies max_new_tokens. + cfg = genai.GenerationConfig() + cfg.max_new_tokens = msg["max_new_tokens"] + cfg.do_sample = False + handles[msg["rid"]] = pipe.add_request(msg["rid"], msg["prompt"], cfg) + return True + + +def engine_process(model_path, device, scheduler, req_q, res_q) -> None: + """The CB engine loop. Pure synchronous code, its own GIL, no asyncio.""" + import openvino_genai as genai + + terminal = { + genai.GenerationStatus.FINISHED, + genai.GenerationStatus.IGNORED, + genai.GenerationStatus.CANCEL, + genai.GenerationStatus.STOP, + } + + try: + print(f"[engine] loading {model_path} on {device} ...", flush=True) + t0 = time.perf_counter() + pipe = _build_pipeline(model_path, device, scheduler) + print(f"[engine] pipeline ready in {time.perf_counter() - t0:.1f}s", flush=True) + except Exception as exc: # noqa: BLE001 - report any load failure to the parent + res_q.put({"type": "load_error", "error": repr(exc)}) + return + + res_q.put({"type": "ready"}) + + handles: dict[int, "genai.GenerationHandle"] = {} + running = True + try: + while running: + # Idle: block on the request queue. Zero CPU spin, instant wake. + if not handles: + running = _handle_request(req_q.get(), pipe, handles, genai) + if not running: + break + # Drain any other queued messages without blocking. + while True: + try: + msg = req_q.get_nowait() + except queue.Empty: + break + if not _handle_request(msg, pipe, handles, genai): + running = False + break + if not running or not handles: + continue + + # One inference step across every in-flight request. + pipe.step() + + # Hand finished/streaming tokens back to the parent. + for rid in list(handles.keys()): + handle = handles[rid] + if handle.can_read(): + token_ids: list[int] = [] + for output in handle.read().values(): + token_ids.extend(output.generated_ids) + if token_ids: + res_q.put({"type": "tokens", "rid": rid, "token_ids": token_ids}) + status = handle.get_status() + if status in terminal: + res_q.put({"type": "done", "rid": rid, "status": status.name}) + del handles[rid] + except Exception as exc: # noqa: BLE001 + res_q.put({"type": "engine_error", "error": repr(exc)}) + finally: + for handle in handles.values(): + try: + handle.cancel() + except Exception: # noqa: BLE001 + pass + print("[engine] stopped", flush=True) + + +# =========================================================================== # +# FASTAPI SERVER - the parent. This is the "bridge" queue_worker_cb becomes. # +# =========================================================================== # + +_req_q: mp.Queue | None = None +_res_q: mp.Queue | None = None +_proc: mp.Process | None = None +_reader: threading.Thread | None = None + +_futures: dict[int, asyncio.Future] = {} +_token_counts: dict[int, int] = {} +_rid_counter = itertools.count() + + +def _dispatch_result(msg: dict) -> None: + """Runs on the event loop (via call_soon_threadsafe). Routes one result.""" + kind = msg.get("type") + rid = msg.get("rid") + if kind == "tokens": + _token_counts[rid] = _token_counts.get(rid, 0) + len(msg["token_ids"]) + elif kind == "done": + fut = _futures.pop(rid, None) + if fut is not None and not fut.done(): + if msg["status"] == "IGNORED": + fut.set_exception(RuntimeError("request IGNORED - KV cache OOM")) + else: + fut.set_result(_token_counts.pop(rid, 0)) + elif kind == "engine_error": + print(f"[server] ENGINE ERROR: {msg['error']}", flush=True) + + +def _result_reader(loop: asyncio.AbstractEventLoop, res_q: mp.Queue) -> None: + """Dedicated thread: blocks on res_q.get() (releases the GIL while waiting, + so it does NOT starve the event loop) and forwards each result.""" + while True: + msg = res_q.get() + if msg.get("type") == "_stop": + break + loop.call_soon_threadsafe(_dispatch_result, msg) + + +@asynccontextmanager +async def _lifespan(app: FastAPI): + global _req_q, _res_q, _proc, _reader + ctx = mp.get_context("spawn") # spawn, NOT fork - GPU state must not be forked + _req_q = ctx.Queue() + _res_q = ctx.Queue() + _proc = ctx.Process( + target=engine_process, + args=(MODEL_PATH, DEVICE, SCHEDULER, _req_q, _res_q), + daemon=True, + ) + _proc.start() + + loop = asyncio.get_running_loop() + # First message from the child is the load result; wait for it off-loop. + first = await loop.run_in_executor(None, _res_q.get) + if first["type"] == "load_error": + raise RuntimeError(f"engine failed to load: {first['error']}") + + _reader = threading.Thread(target=_result_reader, args=(loop, _res_q), daemon=True) + _reader.start() + print(f"[server] listening on http://{HOST}:{PORT}", flush=True) + yield + + _req_q.put({"type": "shutdown"}) + _proc.join(timeout=10) + if _proc.is_alive(): + _proc.terminate() + _res_q.put({"type": "_stop"}) + if _reader is not None: + _reader.join(timeout=2) + + +app = FastAPI(lifespan=_lifespan) + + +@app.get("/ping") +async def ping(): + """Does nothing. If this is slow, the event loop was blocked.""" + return {"t": time.perf_counter()} + + +@app.post("/generate") +async def generate(idx: int = 0): + loop = asyncio.get_running_loop() + rid = next(_rid_counter) + fut: asyncio.Future = loop.create_future() + _futures[rid] = fut + # queue.put is fast and does not block the event loop. + _req_q.put({ + "type": "submit", + "rid": rid, + "prompt": PROMPTS[idx % len(PROMPTS)], + "max_new_tokens": MAX_NEW_TOKENS, + }) + tokens = await fut + return {"rid": rid, "tokens": tokens} + + +def run_server() -> None: + config = uvicorn.Config(app, host=HOST, port=PORT, log_level="warning") + uvicorn.Server(config).run() + + +# =========================================================================== # +# CLIENT - load test (identical to cb_server_block_test.py for comparison) # +# =========================================================================== # + +def _stats(latencies_ms: list[float]) -> tuple[float, float, float, int]: + if not latencies_ms: + return 0.0, 0.0, 0.0, 0 + s = sorted(latencies_ms) + n = len(s) + return s[n // 2], s[min(n - 1, int(n * 0.99))], s[-1], n + + +async def _measure_pings(client: httpx.AsyncClient, n: int) -> list[float]: + out: list[float] = [] + for _ in range(n): + t0 = time.perf_counter() + await client.get("/ping") + out.append((time.perf_counter() - t0) * 1000.0) + return out + + +async def _measure_pings_until(client: httpx.AsyncClient, until: asyncio.Future) -> list[float]: + out: list[float] = [] + while not until.done(): + t0 = time.perf_counter() + try: + await client.get("/ping") + except Exception: # noqa: BLE001 + break + out.append((time.perf_counter() - t0) * 1000.0) + return out + + +async def load_test(base_url: str) -> None: + async with httpx.AsyncClient(base_url=base_url, timeout=120.0) as client: + print("[test] measuring baseline /ping latency (server idle) ...") + baseline = await _measure_pings(client, BASELINE_PINGS) + + print(f"[test] firing {BATCH_SIZE} /generate requests, pinging during the batch ...") + gen_task = asyncio.ensure_future( + asyncio.gather(*[client.post("/generate", params={"idx": i}) for i in range(BATCH_SIZE)]) + ) + during = await _measure_pings_until(client, gen_task) + gen_results = await gen_task + + b_p50, b_p99, b_max, b_n = _stats(baseline) + d_p50, d_p99, d_max, d_n = _stats(during) + slow = sum(1 for x in during if x > SLOW_PING_MS) + total_tokens = sum(r.json()["tokens"] for r in gen_results) + + print("\n" + "=" * 72) + print("RESULT - engine OUT OF PROCESS") + print("=" * 72) + print(f"batch: {BATCH_SIZE} requests, {total_tokens} tokens generated") + print(f"/ping server IDLE : p50={b_p50:6.1f}ms p99={b_p99:7.1f}ms " + f"max={b_max:7.1f}ms ({b_n} pings)") + print(f"/ping BATCH IN FLIGHT : p50={d_p50:6.1f}ms p99={d_p99:7.1f}ms " + f"max={d_max:7.1f}ms ({d_n} pings)") + print(f" : {slow} of {d_n} pings delayed past {SLOW_PING_MS:.0f}ms") + + stayed_responsive = d_max < 25.0 or d_max < 3.0 * max(b_max, 1.0) + print() + if stayed_responsive: + print("[verdict] FIXED. /ping stayed responsive while a batch ran - the") + print(" event loop is free because step() runs in another") + print(" process. Compare this max to the in-process test.") + else: + print("[verdict] /ping is still slow. Check the engine really ran in the") + print(" child process and that nothing heavy is on the loop.") + print("=" * 72) + + +def run_test() -> None: + base_url = f"http://{HOST}:{PORT}" + proc = subprocess.Popen([sys.executable, os.path.abspath(__file__), "--serve"]) + try: + print("[test] waiting for server (engine spawn + model load, ~10-30s) ...") + deadline = time.time() + 240.0 + with httpx.Client() as probe: + while True: + try: + if probe.get(base_url + "/ping", timeout=2.0).status_code == 200: + break + except Exception: # noqa: BLE001 + pass + if time.time() > deadline: + raise RuntimeError("server did not become ready in time") + time.sleep(1.0) + print("[test] server ready.\n") + asyncio.run(load_test(base_url)) + finally: + proc.terminate() + try: + proc.wait(timeout=10) + except subprocess.TimeoutExpired: + proc.kill() + + +# --------------------------------------------------------------------------- # +# Entry point # +# --------------------------------------------------------------------------- # + +if __name__ == "__main__": + if "--serve" in sys.argv: + run_server() + else: + run_test() \ No newline at end of file diff --git a/src/engine/ov_genai/continuous_batch_vlm.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_properties.py similarity index 100% rename from src/engine/ov_genai/continuous_batch_vlm.py rename to src/engine/ov_genai/continuous_batching/examples_and_tests/test_properties.py diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/test_server_block.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_server_block.py new file mode 100644 index 00000000..c3aad145 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_server_block.py @@ -0,0 +1,302 @@ +""" +Does an in-process CB engine block the rest of the server? + +This stands up a REAL FastAPI + uvicorn server whose CB engine loop runs +the *recommended* in-process design - step() driven through a +ThreadPoolExecutor(max_workers=1) on the server's event loop. Then a +separate client process measures the latency of a do-nothing /ping +endpoint, first while the server is idle, then while a generation batch +is in flight. + +If /ping - which does nothing but return a timestamp - slows from ~1 ms +to hundreds of ms while a batch runs, that is every other request and +every SSE stream on the server stalling for the duration of each step(). + +Run on the machine with the GPU: + + pip install fastapi uvicorn httpx # if not already present + python cb_server_block_test.py + +The script spawns its own server subprocess; you do not start one +manually. NOTE: the subprocess split here is only to isolate the client's +measurements from the server - the *engine* still runs in-process to the +server. That in-process engine is exactly the design under test. +""" + +from __future__ import annotations + +import asyncio +import itertools +import os +import subprocess +import sys +import time +from concurrent.futures import ThreadPoolExecutor +from contextlib import asynccontextmanager + +import httpx +import openvino_genai as genai +import uvicorn +from fastapi import FastAPI + + +# --------------------------------------------------------------------------- # +# CONFIG # +# --------------------------------------------------------------------------- # + +MODEL_PATH = "/mnt/Ironwolf-4TB/Models/OpenVINO/Anubis-Mini-8B-v1-int4_asym-ov/" +DEVICE = "GPU.0" +HOST = "127.0.0.1" +PORT = 8137 + +SCHED_MAX_NUM_BATCHED_TOKENS = 2048 +SCHED_MAX_NUM_SEQS = 16 +SCHED_CACHE_SIZE_GB = 8 # tune to your VRAM +SCHED_DYNAMIC_SPLIT_FUSE = True +SCHED_ENABLE_PREFIX_CACHING = True + +MAX_NEW_TOKENS = 256 # long enough that many pings land during the batch +BATCH_SIZE = 6 # /generate requests fired at once +BASELINE_PINGS = 60 # pings measured while the server is idle +SLOW_PING_MS = 50.0 # a /ping over this is "delayed" + +PROMPTS = [ + "Explain how continuous batching differs from static batching for LLM serving.", + "Write a short paragraph about the history of the printing press.", + "Describe, step by step, how a CPU executes a single instruction.", + "Summarize the causes of the 2008 financial crisis in plain language.", + "List five considerations when choosing a database index, with reasons.", + "Explain what a KV cache is and why it matters for transformer inference.", +] + +TERMINAL_STATUSES = { + genai.GenerationStatus.FINISHED, + genai.GenerationStatus.IGNORED, + genai.GenerationStatus.CANCEL, + genai.GenerationStatus.STOP, +} + + +# --------------------------------------------------------------------------- # +# SERVER SIDE - FastAPI app with an in-process CB engine # +# --------------------------------------------------------------------------- # + +_pipe: genai.ContinuousBatchingPipeline | None = None +_cfg: genai.GenerationConfig | None = None +_engine_executor = ThreadPoolExecutor(max_workers=1, thread_name_prefix="cb-engine") + +_handles: dict[int, genai.GenerationHandle] = {} +_futures: dict[int, asyncio.Future] = {} +_token_counts: dict[int, int] = {} +_wake = asyncio.Event() +_rid_counter = itertools.count() + + +def _build_pipeline() -> genai.ContinuousBatchingPipeline: + scheduler = genai.SchedulerConfig() + scheduler.max_num_batched_tokens = SCHED_MAX_NUM_BATCHED_TOKENS + scheduler.max_num_seqs = SCHED_MAX_NUM_SEQS + scheduler.cache_size = SCHED_CACHE_SIZE_GB + scheduler.dynamic_split_fuse = SCHED_DYNAMIC_SPLIT_FUSE + scheduler.enable_prefix_caching = SCHED_ENABLE_PREFIX_CACHING + + print(f"[server] loading {MODEL_PATH} on {DEVICE} ...", flush=True) + t0 = time.perf_counter() + pipe = genai.ContinuousBatchingPipeline( + MODEL_PATH, device=DEVICE, scheduler_config=scheduler + ) + print(f"[server] pipeline ready in {time.perf_counter() - t0:.1f}s", flush=True) + return pipe + + +def _build_generation_config() -> genai.GenerationConfig: + cfg = genai.GenerationConfig() + cfg.max_new_tokens = MAX_NEW_TOKENS + cfg.do_sample = False + return cfg + + +def _step_and_drain() -> list[int]: + """Runs on the single-worker executor thread. step() then drain.""" + _pipe.step() + finished: list[int] = [] + for rid, handle in _handles.items(): + if handle.can_read(): + for output in handle.read().values(): + _token_counts[rid] = _token_counts.get(rid, 0) + len(output.generated_ids) + if handle.get_status() in TERMINAL_STATUSES: + finished.append(rid) + return finished + + +async def _engine_loop() -> None: + """The recommended in-process design: step() via run_in_executor on a + single-worker pool, so the call is off the event loop thread.""" + loop = asyncio.get_running_loop() + try: + while True: + if not _handles: + _wake.clear() + await _wake.wait() + finished = await loop.run_in_executor(_engine_executor, _step_and_drain) + for rid in finished: + _handles.pop(rid, None) + fut = _futures.pop(rid, None) + if fut is not None and not fut.done(): + fut.set_result(_token_counts.get(rid, 0)) + except asyncio.CancelledError: + pass + + +@asynccontextmanager +async def _lifespan(app: FastAPI): + global _pipe, _cfg + _pipe = _build_pipeline() + _cfg = _build_generation_config() + engine_task = asyncio.create_task(_engine_loop()) + print(f"[server] listening on http://{HOST}:{PORT}", flush=True) + yield + engine_task.cancel() + _engine_executor.shutdown(wait=False) + + +app = FastAPI(lifespan=_lifespan) + + +@app.get("/ping") +async def ping(): + """Does nothing. If this is slow, the event loop was blocked.""" + return {"t": time.perf_counter()} + + +@app.post("/generate") +async def generate(idx: int = 0): + """Submit one request to the CB engine and wait for it to finish.""" + loop = asyncio.get_running_loop() + rid = next(_rid_counter) + fut: asyncio.Future = loop.create_future() + _futures[rid] = fut + prompt = PROMPTS[idx % len(PROMPTS)] + handle = await loop.run_in_executor(_engine_executor, _pipe.add_request, rid, prompt, _cfg) + _handles[rid] = handle + _wake.set() + tokens = await fut + return {"rid": rid, "tokens": tokens} + + +def run_server() -> None: + config = uvicorn.Config(app, host=HOST, port=PORT, log_level="warning") + uvicorn.Server(config).run() + + +# --------------------------------------------------------------------------- # +# CLIENT SIDE - load test # +# --------------------------------------------------------------------------- # + +def _stats(latencies_ms: list[float]) -> tuple[float, float, float, int]: + if not latencies_ms: + return 0.0, 0.0, 0.0, 0 + s = sorted(latencies_ms) + n = len(s) + return s[n // 2], s[min(n - 1, int(n * 0.99))], s[-1], n + + +async def _measure_pings(client: httpx.AsyncClient, n: int) -> list[float]: + out: list[float] = [] + for _ in range(n): + t0 = time.perf_counter() + await client.get("/ping") + out.append((time.perf_counter() - t0) * 1000.0) + return out + + +async def _measure_pings_until(client: httpx.AsyncClient, until: asyncio.Future) -> list[float]: + out: list[float] = [] + while not until.done(): + t0 = time.perf_counter() + try: + await client.get("/ping") + except Exception: + break + out.append((time.perf_counter() - t0) * 1000.0) + return out + + +async def load_test(base_url: str) -> None: + async with httpx.AsyncClient(base_url=base_url, timeout=120.0) as client: + # 1. Baseline: /ping latency with the server idle. + print("[test] measuring baseline /ping latency (server idle) ...") + baseline = await _measure_pings(client, BASELINE_PINGS) + + # 2. Fire a batch of /generate, ping continuously while it runs. + print(f"[test] firing {BATCH_SIZE} /generate requests, pinging during the batch ...") + gen_task = asyncio.ensure_future( + asyncio.gather(*[client.post("/generate", params={"idx": i}) for i in range(BATCH_SIZE)]) + ) + during = await _measure_pings_until(client, gen_task) + gen_results = await gen_task + + b_p50, b_p99, b_max, b_n = _stats(baseline) + d_p50, d_p99, d_max, d_n = _stats(during) + slow = sum(1 for x in during if x > SLOW_PING_MS) + total_tokens = sum(r.json()["tokens"] for r in gen_results) + + print("\n" + "=" * 72) + print("RESULT") + print("=" * 72) + print(f"batch: {BATCH_SIZE} requests, {total_tokens} tokens generated") + print(f"/ping server IDLE : p50={b_p50:6.1f}ms p99={b_p99:7.1f}ms " + f"max={b_max:7.1f}ms ({b_n} pings)") + print(f"/ping BATCH IN FLIGHT : p50={d_p50:6.1f}ms p99={d_p99:7.1f}ms " + f"max={d_max:7.1f}ms ({d_n} pings)") + print(f" : {slow} of {d_n} pings delayed past {SLOW_PING_MS:.0f}ms") + + blocked = d_max > 25.0 and (b_max == 0.0 or d_max > 10.0 * b_max) + print() + if blocked: + print("[verdict] CONFIRMED. A do-nothing /ping endpoint went from " + f"~{b_p50:.1f}ms idle to {d_max:.0f}ms while a batch ran.") + print(" The in-process engine blocks the event loop: every other") + print(" request and SSE stream stalls for the duration of each") + print(" step(). The CB engine must run out-of-process.") + else: + print("[verdict] NOT reproduced - /ping stayed fast during the batch.") + print(" Re-check that the engine actually ran in-process here.") + print("=" * 72) + + +def run_test() -> None: + base_url = f"http://{HOST}:{PORT}" + proc = subprocess.Popen([sys.executable, os.path.abspath(__file__), "--serve"]) + try: + print("[test] waiting for server (model load can take ~10-30s) ...") + deadline = time.time() + 240.0 + with httpx.Client() as probe: + while True: + try: + if probe.get(base_url + "/ping", timeout=2.0).status_code == 200: + break + except Exception: + pass + if time.time() > deadline: + raise RuntimeError("server did not become ready in time") + time.sleep(1.0) + print("[test] server ready.\n") + asyncio.run(load_test(base_url)) + finally: + proc.terminate() + try: + proc.wait(timeout=10) + except subprocess.TimeoutExpired: + proc.kill() + + +# --------------------------------------------------------------------------- # +# Entry point # +# --------------------------------------------------------------------------- # + +if __name__ == "__main__": + if "--serve" in sys.argv: + run_server() + else: + run_test() \ No newline at end of file diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/test_token_eviction.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_token_eviction.py new file mode 100644 index 00000000..0cb6441e --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_token_eviction.py @@ -0,0 +1,371 @@ +from __future__ import annotations + +import argparse +import gc +import random +import time +from dataclasses import dataclass, field +from pathlib import Path + +import openvino_genai as genai + + +REPO_ROOT = Path(__file__).resolve().parents[5] + + +@dataclass +class RequestState: + request_id: int + prompt: str + input_tokens: int + handle: genai.GenerationHandle + generated_ids: list[int] = field(default_factory=list) + first_token_s: float | None = None + finish_s: float | None = None + status: genai.GenerationStatus = genai.GenerationStatus.RUNNING + finish_reason: genai.GenerationFinishReason = genai.GenerationFinishReason.NONE + + +@dataclass +class ScenarioResult: + label: str + duration_s: float + total_input_tokens: int + total_output_tokens: int + finished: int + ignored: int + cancelled: int + stopped: int + cache_usage: float + max_cache_usage: float + avg_cache_usage: float + requests_processed: int + scheduled_requests: int + samples: list[str] + + @property + def output_tokens_per_s(self) -> float: + if self.duration_s <= 0: + return 0.0 + return self.total_output_tokens / self.duration_s + + +def resolve_sonnet_path(path_arg: str | None) -> Path: + if path_arg: + path = Path(path_arg) + if not path.exists(): + raise FileNotFoundError(path) + return path + + candidates = [ + REPO_ROOT / "benchmark" / "sonnets.txt", + REPO_ROOT / "benchmark" / "sonnet.txt", + ] + for path in candidates: + if path.exists(): + return path + raise FileNotFoundError("Could not find benchmark/sonnets.txt or benchmark/sonnet.txt") + + +def count_tokens(tokenizer: genai.Tokenizer, prompt: str) -> int: + encoded = tokenizer.encode(prompt) + input_ids = encoded.input_ids + if hasattr(input_ids, "shape"): + return int(input_ids.shape[-1]) + return len(input_ids) + + +def build_sonnet_prompts( + tokenizer: genai.Tokenizer, + sonnet_path: Path, + num_requests: int, + input_tokens: int, + shared_prefix_tokens: int, + seed: int, +) -> list[str]: + rng = random.Random(seed) + lines = sonnet_path.read_text(encoding="utf-8").splitlines() + lines = [line + "\n" for line in lines if line.strip()] + if not lines: + raise ValueError(f"Sonnet file is empty: {sonnet_path}") + + header = "Continue from these Shakespeare sonnet lines while preserving the style:\n" + header_tokens = count_tokens(tokenizer, header) + line_token_counts = [max(1, count_tokens(tokenizer, line)) for line in lines] + avg_line_tokens = max(1.0, sum(line_token_counts) / len(line_token_counts)) + + prefix_line_count = max(1, round(max(0, shared_prefix_tokens - header_tokens) / avg_line_tokens)) + total_line_count = max(prefix_line_count + 1, round(max(1, input_tokens - header_tokens) / avg_line_tokens)) + shared_prefix = lines[:prefix_line_count] + extra_count = max(1, total_line_count - prefix_line_count) + + prompts = [] + for request_idx in range(num_requests): + sampled = rng.choices(lines, k=extra_count) + prompts.append( + header + + f"Request {request_idx}: finish the passage with a distinct final couplet.\n" + + "".join(shared_prefix + sampled) + ) + return prompts + + +def build_generation_config(output_tokens: int) -> genai.GenerationConfig: + config = genai.GenerationConfig() + config.max_new_tokens = output_tokens + config.ignore_eos = True + config.do_sample = False + return config + + +def build_scheduler_config(args: argparse.Namespace, use_cache_eviction: bool) -> genai.SchedulerConfig: + config = genai.SchedulerConfig() + config.max_num_batched_tokens = args.max_num_batched_tokens + config.max_num_seqs = args.max_num_seqs + config.cache_size = args.cache_size + if args.num_kv_blocks is not None: + config.num_kv_blocks = args.num_kv_blocks + config.dynamic_split_fuse = args.dynamic_split_fuse + config.enable_prefix_caching = args.enable_prefix_caching + config.use_cache_eviction = use_cache_eviction + + if use_cache_eviction: + aggregation_mode = getattr(genai.AggregationMode, args.aggregation_mode) + config.cache_eviction_config = genai.CacheEvictionConfig( + args.eviction_start_size, + args.eviction_recent_size, + args.eviction_max_cache_size, + aggregation_mode, + args.apply_rotation, + args.snapkv_window_size, + ) + + return config + + +def build_pipeline(args: argparse.Namespace, use_cache_eviction: bool) -> genai.ContinuousBatchingPipeline: + return genai.ContinuousBatchingPipeline( + args.model_dir, + scheduler_config=build_scheduler_config(args, use_cache_eviction), + device=args.device, + properties=dict(args.property), + tokenizer_properties={}, + vision_encoder_properties={}, + ) + + +def submit_requests( + pipeline: genai.ContinuousBatchingPipeline, + prompts: list[str], + generation_config: genai.GenerationConfig, +) -> dict[int, RequestState]: + tokenizer = pipeline.get_tokenizer() + active: dict[int, RequestState] = {} + for request_id, prompt in enumerate(prompts): + handle = pipeline.add_request(request_id, prompt, generation_config) + active[request_id] = RequestState( + request_id=request_id, + prompt=prompt, + input_tokens=count_tokens(tokenizer, prompt), + handle=handle, + ) + return active + + +def run_scenario( + label: str, + args: argparse.Namespace, + prompts: list[str], + generation_config: genai.GenerationConfig, + use_cache_eviction: bool, +) -> ScenarioResult: + print(f"\n=== {label} ===") + pipeline = build_pipeline(args, use_cache_eviction=use_cache_eviction) + tokenizer = pipeline.get_tokenizer() + requests = submit_requests(pipeline, prompts, generation_config) + + start_s = time.perf_counter() + while pipeline.has_non_finished_requests(): + pipeline.step() + now_s = time.perf_counter() + for state in requests.values(): + if state.handle.can_read(): + for output in state.handle.read().values(): + if output.generated_ids: + if state.first_token_s is None: + state.first_token_s = now_s + state.generated_ids.extend(output.generated_ids) + if output.finish_reason != genai.GenerationFinishReason.NONE: + state.finish_reason = output.finish_reason + + status = state.handle.get_status() + if status != genai.GenerationStatus.RUNNING and state.status == genai.GenerationStatus.RUNNING: + state.status = status + state.finish_s = now_s + + # Drain anything that became readable on the terminal step. + end_s = time.perf_counter() + for state in requests.values(): + if state.handle.can_read(): + for output in state.handle.read().values(): + if output.generated_ids: + if state.first_token_s is None: + state.first_token_s = end_s + state.generated_ids.extend(output.generated_ids) + if output.finish_reason != genai.GenerationFinishReason.NONE: + state.finish_reason = output.finish_reason + state.status = state.handle.get_status() + if state.finish_s is None and state.status != genai.GenerationStatus.RUNNING: + state.finish_s = end_s + + metrics = pipeline.get_metrics() + samples = [ + tokenizer.decode(state.generated_ids[:120]).strip() + for state in list(requests.values())[: args.samples] + if state.generated_ids + ] + + result = ScenarioResult( + label=label, + duration_s=end_s - start_s, + total_input_tokens=sum(state.input_tokens for state in requests.values()), + total_output_tokens=sum(len(state.generated_ids) for state in requests.values()), + finished=sum(state.status == genai.GenerationStatus.FINISHED for state in requests.values()), + ignored=sum(state.status == genai.GenerationStatus.IGNORED for state in requests.values()), + cancelled=sum(state.status == genai.GenerationStatus.CANCEL for state in requests.values()), + stopped=sum(state.status == genai.GenerationStatus.STOP for state in requests.values()), + cache_usage=float(metrics.cache_usage), + max_cache_usage=float(metrics.max_cache_usage), + avg_cache_usage=float(metrics.avg_cache_usage), + requests_processed=int(metrics.requests), + scheduled_requests=int(metrics.scheduled_requests), + samples=samples, + ) + print_result(result) + del pipeline + gc.collect() + return result + + +def print_result(result: ScenarioResult) -> None: + print(f"Duration: {result.duration_s:.2f} s") + print(f"Finished requests: {result.finished}") + print(f"Ignored requests: {result.ignored}") + print(f"Cancelled requests: {result.cancelled}") + print(f"Stopped requests: {result.stopped}") + print(f"Input tokens: {result.total_input_tokens}") + print(f"Output tokens: {result.total_output_tokens}") + print(f"Output throughput: {result.output_tokens_per_s:.2f} tok/s") + print(f"Pipeline requests: {result.requests_processed}") + print(f"Scheduled requests: {result.scheduled_requests}") + print(f"Cache usage: {result.cache_usage:.2f}%") + print(f"Max cache usage: {result.max_cache_usage:.2f}%") + print(f"Avg cache usage: {result.avg_cache_usage:.2f}%") + + +def print_comparison(no_eviction: ScenarioResult, eviction: ScenarioResult) -> None: + print("\n=== Cache Eviction Utility ===") + print(f"Finished delta: {eviction.finished - no_eviction.finished:+d}") + print(f"Ignored delta: {eviction.ignored - no_eviction.ignored:+d}") + print(f"Output token delta: {eviction.total_output_tokens - no_eviction.total_output_tokens:+d}") + print(f"Throughput delta: {eviction.output_tokens_per_s - no_eviction.output_tokens_per_s:+.2f} tok/s") + print(f"Max cache usage delta:{eviction.max_cache_usage - no_eviction.max_cache_usage:+.2f}%") + + if eviction.samples: + print("\nSample decoded output with cache eviction:") + print(eviction.samples[0][:800] or "") + + +def parse_property(value: str) -> tuple[str, str]: + key, sep, prop_value = value.partition("=") + if not sep or not key: + raise argparse.ArgumentTypeError("properties must be KEY=VALUE") + return key, prop_value + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description=( + "Compare continuous batching with and without KV token cache eviction " + "using sonnet prompts under the same constrained cache budget." + ) + ) + parser.add_argument("model_dir", help="Path to an OpenVINO GenAI model directory") + parser.add_argument("--device", default="CPU", help="OpenVINO device string") + parser.add_argument("--sonnet-path", default=None, help="Path to sonnets.txt/sonnet.txt") + parser.add_argument("--num-requests", type=int, default=16) + parser.add_argument("--input-tokens", type=int, default=900) + parser.add_argument("--shared-prefix-tokens", type=int, default=512) + parser.add_argument("--output-tokens", type=int, default=512) + parser.add_argument("--seed", type=int, default=0) + parser.add_argument("--samples", type=int, default=1) + + parser.add_argument("--max-num-batched-tokens", type=int, default=2048) + parser.add_argument("--max-num-seqs", type=int, default=8) + parser.add_argument("--cache-size", type=int, default=1, help="KV cache size in GB") + parser.add_argument("--num-kv-blocks", type=int, default=None) + parser.add_argument("--dynamic-split-fuse", action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("--enable-prefix-caching", action=argparse.BooleanOptionalAction, default=True) + + parser.add_argument("--eviction-start-size", type=int, default=128) + parser.add_argument("--eviction-recent-size", type=int, default=384) + parser.add_argument("--eviction-max-cache-size", type=int, default=1024) + parser.add_argument( + "--aggregation-mode", + choices=sorted(genai.AggregationMode.__members__), + default="NORM_SUM", + ) + parser.add_argument("--apply-rotation", action="store_true") + parser.add_argument("--snapkv-window-size", type=int, default=8) + + parser.add_argument( + "--property", + action="append", + default=[], + type=parse_property, + metavar="KEY=VALUE", + help="OpenVINO runtime property passed to ContinuousBatchingPipeline properties", + ) + return parser.parse_args() + + +def main() -> None: + args = parse_args() + args.property = dict(args.property) + + sonnet_path = resolve_sonnet_path(args.sonnet_path) + tokenizer = genai.Tokenizer(args.model_dir) + prompts = build_sonnet_prompts( + tokenizer=tokenizer, + sonnet_path=sonnet_path, + num_requests=args.num_requests, + input_tokens=args.input_tokens, + shared_prefix_tokens=args.shared_prefix_tokens, + seed=args.seed, + ) + generation_config = build_generation_config(args.output_tokens) + + print(f"Model: {args.model_dir}") + print(f"Device: {args.device}") + print(f"Sonnet file: {sonnet_path}") + print(f"Requests: {len(prompts)}") + + no_eviction = run_scenario( + label="cache eviction OFF", + args=args, + prompts=prompts, + generation_config=generation_config, + use_cache_eviction=False, + ) + eviction = run_scenario( + label="cache eviction ON", + args=args, + prompts=prompts, + generation_config=generation_config, + use_cache_eviction=True, + ) + print_comparison(no_eviction, eviction) + + +if __name__ == "__main__": + main() diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/test_tokenizer_properties.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_tokenizer_properties.py new file mode 100644 index 00000000..99cf3411 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_tokenizer_properties.py @@ -0,0 +1,317 @@ +from __future__ import annotations + +import argparse +import json +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +import openvino as ov +import openvino_genai as genai + + +DEFAULT_MODEL_DIR = ( + "/mnt/Ironwolf-4TB/Models/OpenVINO/Llama/" + "Hermes-3-Llama-3.2-3B-int4_sym-awq-se-ov/" +) + + +@dataclass +class PropertyCandidate: + name: str + props: dict[str, Any] + category: str = "valid" + + +@dataclass +class ProbeResult: + name: str + ok: bool + elapsed_ms: float + error: str | None + + +def _mk_candidates() -> list[PropertyCandidate]: + """Build tokenizer property candidates with type-safe OV helpers.""" + candidates: list[PropertyCandidate] = [] + + def add(name: str, kv: tuple[str, Any], category: str = "valid") -> None: + k, v = kv + candidates.append(PropertyCandidate(name=name, props={k: v}, category=category)) + + add("PERF_COUNT=True", ov.properties.enable_profiling(True)) + add("INFERENCE_NUM_THREADS=4", ov.properties.inference_num_threads(4)) + add("NUM_STREAMS=1", ov.properties.num_streams(ov.properties.streams.Num(1))) + add( + "PERFORMANCE_HINT=LATENCY", + ov.properties.hint.performance_mode(ov.properties.hint.PerformanceMode.LATENCY), + ) + add( + "EXECUTION_MODE_HINT=PERFORMANCE", + ov.properties.hint.execution_mode(ov.properties.hint.ExecutionMode.PERFORMANCE), + ) + add("PERFORMANCE_HINT_NUM_REQUESTS=1", ov.properties.hint.num_requests(1)) + add("ENABLE_CPU_PINNING=True", ov.properties.hint.enable_cpu_pinning(True)) + add( + "ENABLE_CPU_RESERVATION=False", + ov.properties.hint.enable_cpu_reservation(False), + ) + add( + "ENABLE_HYPER_THREADING=True", + ov.properties.hint.enable_hyper_threading(True), + ) + add( + "SCHEDULING_CORE_TYPE=ANY_CORE", + ov.properties.hint.scheduling_core_type( + ov.properties.hint.SchedulingCoreType.ANY_CORE + ), + ) + add( + "MODEL_DISTRIBUTION_POLICY={PIPELINE_PARALLEL}", + ov.properties.hint.model_distribution_policy( + {ov.properties.hint.ModelDistributionPolicy.PIPELINE_PARALLEL} + ), + ) + add( + "CPU_DENORMALS_OPTIMIZATION=True", + ov.properties.intel_cpu.denormals_optimization(True), + ) + add( + "TBB_PARTITIONER=AUTO", + ov.properties.intel_cpu.tbb_partitioner(ov.properties.intel_cpu.TbbPartitioner.AUTO), + ) + add( + "DYNAMIC_QUANTIZATION_GROUP_SIZE=64", + ov.properties.hint.dynamic_quantization_group_size(64), + ) + add("LOG_LEVEL=WARNING", ov.properties.log.level(ov.properties.log.Level.WARNING)) + add("CACHE_MODE=OPTIMIZE_SPEED", ov.properties.cache_mode(ov.properties.CacheMode.OPTIMIZE_SPEED)) + add("CACHE_DIR=/tmp/ov_tokenizer_cache", ov.properties.cache_dir("/tmp/ov_tokenizer_cache")) + + # Unknown key probe. + candidates.append( + PropertyCandidate( + name="INVALID_KEY=BLAH", + props={"BLAH_NOT_A_REAL_OV_PROPERTY": 1}, + category="invalid_key", + ) + ) + + # Explicitly wrong value probes for known keys. + candidates.append( + PropertyCandidate( + name="PERFORMANCE_HINT=NOT_A_MODE", + props={"PERFORMANCE_HINT": "NOT_A_MODE"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="EXECUTION_MODE_HINT=NOPE", + props={"EXECUTION_MODE_HINT": "NOPE"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="NUM_STREAMS=banana", + props={"NUM_STREAMS": "banana"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="INFERENCE_NUM_THREADS=banana", + props={"INFERENCE_NUM_THREADS": "banana"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="ENABLE_CPU_PINNING=banana", + props={"ENABLE_CPU_PINNING": "banana"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="MODEL_DISTRIBUTION_POLICY=PIPELINE_PARALLEL(str)", + props={"MODEL_DISTRIBUTION_POLICY": "PIPELINE_PARALLEL"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="TBB_PARTITIONER=INVALID", + props={"TBB_PARTITIONER": "INVALID"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="LOG_LEVEL=LOUD", + props={"LOG_LEVEL": "LOUD"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="CACHE_MODE=FASTEST", + props={"CACHE_MODE": "FASTEST"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="DYNAMIC_QUANTIZATION_GROUP_SIZE=zero", + props={"DYNAMIC_QUANTIZATION_GROUP_SIZE": "zero"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="CPU_DENORMALS_OPTIMIZATION=banana", + props={"CPU_DENORMALS_OPTIMIZATION": "banana"}, + category="invalid_value", + ) + ) + return candidates + + +def _probe_tokenizer(model_dir: str, candidate: PropertyCandidate) -> ProbeResult: + t0 = time.perf_counter() + try: + tok = genai.Tokenizer(model_dir, properties=candidate.props) + encoded = tok.encode("Tokenizer property probe.") + _ = int(encoded.input_ids.shape[-1]) + return ProbeResult( + name=candidate.name, + ok=True, + elapsed_ms=(time.perf_counter() - t0) * 1000, + error=None, + ) + except Exception as exc: + return ProbeResult( + name=candidate.name, + ok=False, + elapsed_ms=(time.perf_counter() - t0) * 1000, + error=f"{type(exc).__name__}: {exc}", + ) + + +def _probe_cb_init( + model_dir: str, + device: str, + candidate: PropertyCandidate, +) -> ProbeResult: + t0 = time.perf_counter() + scheduler = genai.SchedulerConfig() + scheduler.max_num_batched_tokens = 128 + scheduler.max_num_seqs = 1 + scheduler.cache_size = 1 + scheduler.dynamic_split_fuse = True + scheduler.enable_prefix_caching = False + try: + pipe = genai.ContinuousBatchingPipeline( + model_dir, + scheduler_config=scheduler, + device=device, + tokenizer_properties=candidate.props, + ) + _ = pipe.get_tokenizer().encode("CB tokenizer_properties probe.") + return ProbeResult( + name=candidate.name, + ok=True, + elapsed_ms=(time.perf_counter() - t0) * 1000, + error=None, + ) + except Exception as exc: + return ProbeResult( + name=candidate.name, + ok=False, + elapsed_ms=(time.perf_counter() - t0) * 1000, + error=f"{type(exc).__name__}: {exc}", + ) + + +def _print_results(title: str, results: list[ProbeResult]) -> None: + print(f"\n=== {title} ===") + for r in results: + status = "OK" if r.ok else "FAIL" + line = f"[{status}] {r.name} ({r.elapsed_ms:.1f} ms)" + if r.error: + line += f"\n {r.error}" + print(line) + ok_count = sum(1 for r in results if r.ok) + print(f"\nSummary: {ok_count}/{len(results)} passed") + + +def _print_validation_breakdown( + title: str, candidates: list[PropertyCandidate], results: list[ProbeResult] +) -> None: + by_name = {r.name: r for r in results} + buckets: dict[str, tuple[int, int]] = {} + for c in candidates: + total, passed = buckets.get(c.category, (0, 0)) + total += 1 + if by_name.get(c.name) and by_name[c.name].ok: + passed += 1 + buckets[c.category] = (total, passed) + + print(f"\n=== {title} Validation Breakdown ===") + for category in sorted(buckets.keys()): + total, passed = buckets[category] + print(f"{category}: {passed}/{total} accepted") + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Probe which OV properties are accepted in tokenizer_properties." + ) + parser.add_argument("--model-dir", default=DEFAULT_MODEL_DIR) + parser.add_argument("--device", default="CPU") + parser.add_argument( + "--cb-sample-count", + type=int, + default=4, + help="How many candidates to probe through ContinuousBatchingPipeline init.", + ) + parser.add_argument( + "--output-json", + type=Path, + default=None, + help="Optional path to write raw results as JSON.", + ) + args = parser.parse_args() + + candidates = _mk_candidates() + tokenizer_results = [_probe_tokenizer(args.model_dir, c) for c in candidates] + _print_results("Tokenizer(model_dir, properties=...)", tokenizer_results) + _print_validation_breakdown("Tokenizer", candidates, tokenizer_results) + + cb_candidates = candidates[: max(0, args.cb_sample_count)] + cb_results = [ + _probe_cb_init(args.model_dir, args.device, c) + for c in cb_candidates + ] + _print_results( + f"ContinuousBatchingPipeline(..., tokenizer_properties=...) on {args.device}", + cb_results, + ) + _print_validation_breakdown("CB tokenizer_properties", cb_candidates, cb_results) + + if args.output_json: + payload = { + "model_dir": args.model_dir, + "device": args.device, + "tokenizer_results": [r.__dict__ for r in tokenizer_results], + "cb_results": [r.__dict__ for r in cb_results], + } + args.output_json.parent.mkdir(parents=True, exist_ok=True) + args.output_json.write_text(json.dumps(payload, indent=2), encoding="utf-8") + print(f"\nWrote JSON report to: {args.output_json}") + + +if __name__ == "__main__": + main() diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/test_vision_encoder_properties.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_vision_encoder_properties.py new file mode 100644 index 00000000..0e40849f --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_vision_encoder_properties.py @@ -0,0 +1,374 @@ +from __future__ import annotations + +import argparse +import json +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +import openvino as ov +import openvino_genai as genai + + +DEFAULT_MODEL_DIR = "/mnt/Ironwolf-4TB/Models/OpenVINO/Gemma/gemma-3-4b-it-int4_asym-ov/" + + +@dataclass +class PropertyCandidate: + name: str + props: dict[str, Any] + category: str = "valid" + + +@dataclass +class ProbeResult: + device: str + name: str + field: str + phase: str + ok: bool + elapsed_ms: float + error: str | None + + +def _mk_candidates() -> list[PropertyCandidate]: + candidates: list[PropertyCandidate] = [] + + def add(name: str, kv: tuple[str, Any], category: str = "valid") -> None: + k, v = kv + candidates.append(PropertyCandidate(name=name, props={k: v}, category=category)) + + # Valid-ish property probes (typed OV constructors). + add("PERF_COUNT=True", ov.properties.enable_profiling(True)) + add("INFERENCE_NUM_THREADS=4", ov.properties.inference_num_threads(4)) + add("NUM_STREAMS=1", ov.properties.num_streams(ov.properties.streams.Num(1))) + add( + "PERFORMANCE_HINT=LATENCY", + ov.properties.hint.performance_mode(ov.properties.hint.PerformanceMode.LATENCY), + ) + add( + "EXECUTION_MODE_HINT=PERFORMANCE", + ov.properties.hint.execution_mode(ov.properties.hint.ExecutionMode.PERFORMANCE), + ) + add("PERFORMANCE_HINT_NUM_REQUESTS=1", ov.properties.hint.num_requests(1)) + add("ENABLE_CPU_PINNING=True", ov.properties.hint.enable_cpu_pinning(True)) + add( + "MODEL_DISTRIBUTION_POLICY={PIPELINE_PARALLEL}", + ov.properties.hint.model_distribution_policy( + {ov.properties.hint.ModelDistributionPolicy.PIPELINE_PARALLEL} + ), + ) + add("LOG_LEVEL=WARNING", ov.properties.log.level(ov.properties.log.Level.WARNING)) + add("CACHE_MODE=OPTIMIZE_SPEED", ov.properties.cache_mode(ov.properties.CacheMode.OPTIMIZE_SPEED)) + add("CACHE_DIR=/tmp/ov_vision_encoder_cache", ov.properties.cache_dir("/tmp/ov_vision_encoder_cache")) + add( + "GPU_ENABLE_LOOP_UNROLLING=False", + ov.properties.intel_gpu.enable_loop_unrolling(False), + ) + add( + "GPU_DISABLE_WINOGRAD_CONVOLUTION=True", + ov.properties.intel_gpu.disable_winograd_convolution(True), + ) + + # Invalid key/value probes. + candidates.append( + PropertyCandidate( + name="INVALID_KEY=BLAH", + props={"BLAH_NOT_A_REAL_OV_PROPERTY": 1}, + category="invalid_key", + ) + ) + candidates.append( + PropertyCandidate( + name="PERFORMANCE_HINT=NOT_A_MODE", + props={"PERFORMANCE_HINT": "NOT_A_MODE"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="EXECUTION_MODE_HINT=NOPE", + props={"EXECUTION_MODE_HINT": "NOPE"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="ENABLE_CPU_PINNING=banana", + props={"ENABLE_CPU_PINNING": "banana"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="NUM_STREAMS=banana", + props={"NUM_STREAMS": "banana"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="INFERENCE_NUM_THREADS=banana", + props={"INFERENCE_NUM_THREADS": "banana"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="MODEL_DISTRIBUTION_POLICY=PIPELINE_PARALLEL(str)", + props={"MODEL_DISTRIBUTION_POLICY": "PIPELINE_PARALLEL"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="LOG_LEVEL=LOUD", + props={"LOG_LEVEL": "LOUD"}, + category="invalid_value", + ) + ) + candidates.append( + PropertyCandidate( + name="CACHE_MODE=FASTEST", + props={"CACHE_MODE": "FASTEST"}, + category="invalid_value", + ) + ) + return candidates + + +def _mk_scheduler() -> genai.SchedulerConfig: + scheduler = genai.SchedulerConfig() + scheduler.max_num_batched_tokens = 64 + scheduler.max_num_seqs = 1 + scheduler.cache_size = 1 + scheduler.dynamic_split_fuse = True + scheduler.enable_prefix_caching = False + return scheduler + + +def _probe_init_for_field( + model_dir: str, device: str, candidate: PropertyCandidate, field: str +) -> ProbeResult: + t0 = time.perf_counter() + try: + kwargs = {field: candidate.props} + _ = genai.ContinuousBatchingPipeline( + model_dir, + scheduler_config=_mk_scheduler(), + device=device, + **kwargs, + ) + return ProbeResult( + device=device, + name=candidate.name, + field=field, + phase="init", + ok=True, + elapsed_ms=(time.perf_counter() - t0) * 1000, + error=None, + ) + except Exception as exc: + return ProbeResult( + device=device, + name=candidate.name, + field=field, + phase="init", + ok=False, + elapsed_ms=(time.perf_counter() - t0) * 1000, + error=f"{type(exc).__name__}: {exc}", + ) + + +def _probe_runtime_vision_for_field( + model_dir: str, device: str, candidate: PropertyCandidate, field: str +) -> ProbeResult: + t0 = time.perf_counter() + try: + kwargs = {field: candidate.props} + pipe = genai.ContinuousBatchingPipeline( + model_dir, + scheduler_config=_mk_scheduler(), + device=device, + **kwargs, + ) + cfg = genai.GenerationConfig() + cfg.max_new_tokens = 1 + cfg.do_sample = False + img = ov.Tensor(ov.Type.u8, ov.Shape([32, 32, 3])) + handle = pipe.add_request(1, "Describe image in one word.", [img], cfg) + steps = 0 + while pipe.has_non_finished_requests() and steps < 8: + pipe.step() + if handle.can_read(): + _ = handle.read() + steps += 1 + _ = handle.get_status() + return ProbeResult( + device=device, + name=candidate.name, + field=field, + phase="runtime_vision", + ok=True, + elapsed_ms=(time.perf_counter() - t0) * 1000, + error=None, + ) + except Exception as exc: + return ProbeResult( + device=device, + name=candidate.name, + field=field, + phase="runtime_vision", + ok=False, + elapsed_ms=(time.perf_counter() - t0) * 1000, + error=f"{type(exc).__name__}: {exc}", + ) + + +def _probe_runtime_text_for_field( + model_dir: str, device: str, candidate: PropertyCandidate, field: str +) -> ProbeResult: + t0 = time.perf_counter() + try: + kwargs = {field: candidate.props} + pipe = genai.ContinuousBatchingPipeline( + model_dir, + scheduler_config=_mk_scheduler(), + device=device, + **kwargs, + ) + cfg = genai.GenerationConfig() + cfg.max_new_tokens = 1 + cfg.do_sample = False + handle = pipe.add_request(1, "One word.", cfg) + steps = 0 + while pipe.has_non_finished_requests() and steps < 8: + pipe.step() + if handle.can_read(): + _ = handle.read() + steps += 1 + _ = handle.get_status() + return ProbeResult( + device=device, + name=candidate.name, + field=field, + phase="runtime_text", + ok=True, + elapsed_ms=(time.perf_counter() - t0) * 1000, + error=None, + ) + except Exception as exc: + return ProbeResult( + device=device, + name=candidate.name, + field=field, + phase="runtime_text", + ok=False, + elapsed_ms=(time.perf_counter() - t0) * 1000, + error=f"{type(exc).__name__}: {exc}", + ) + + +def _print_results(title: str, results: list[ProbeResult]) -> None: + print(f"\n=== {title} ===") + for r in results: + status = "OK" if r.ok else "FAIL" + line = ( + f"[{status}] {r.device} {r.field} {r.phase} " + f"{r.name} ({r.elapsed_ms:.1f} ms)" + ) + if r.error: + line += f"\n {r.error}" + print(line) + ok_count = sum(1 for r in results if r.ok) + print(f"\nSummary: {ok_count}/{len(results)} passed") + + +def _print_validation_breakdown( + title: str, candidates: list[PropertyCandidate], init_results: list[ProbeResult] +) -> None: + by_name = {r.name: r for r in init_results} + buckets: dict[str, tuple[int, int]] = {} + for c in candidates: + total, passed = buckets.get(c.category, (0, 0)) + total += 1 + if by_name.get(c.name) and by_name[c.name].ok: + passed += 1 + buckets[c.category] = (total, passed) + + print(f"\n=== {title} Validation Breakdown (init) ===") + for category in sorted(buckets.keys()): + total, passed = buckets[category] + print(f"{category}: {passed}/{total} accepted") + + +def main() -> None: + parser = argparse.ArgumentParser( + description=( + "Probe which properties are validated in vision_encoder_properties " + "and properties." + ) + ) + parser.add_argument("--model-dir", default=DEFAULT_MODEL_DIR) + parser.add_argument( + "--devices", + nargs="+", + default=["CPU", "GPU"], + help="Devices to probe, e.g. CPU GPU", + ) + parser.add_argument( + "--runtime-cases", + type=int, + default=3, + help="Number of accepted init candidates to additionally probe via image request runtime.", + ) + parser.add_argument("--output-json", type=Path, default=None) + args = parser.parse_args() + + candidates = _mk_candidates() + + all_init_results: list[ProbeResult] = [] + all_runtime_results: list[ProbeResult] = [] + + for device in args.devices: + for field in ("vision_encoder_properties", "properties"): + init_results = [ + _probe_init_for_field(args.model_dir, device, c, field) + for c in candidates + ] + _print_results(f"{device} {field} init probes", init_results) + _print_validation_breakdown(f"{device} {field}", candidates, init_results) + all_init_results.extend(init_results) + + accepted_init = [ + c for c in candidates if any(r.name == c.name and r.ok for r in init_results) + ] + runtime_candidates = accepted_init[: max(0, args.runtime_cases)] + if field == "vision_encoder_properties": + runtime_results = [ + _probe_runtime_vision_for_field(args.model_dir, device, c, field) + for c in runtime_candidates + ] + else: + runtime_results = [ + _probe_runtime_text_for_field(args.model_dir, device, c, field) + for c in runtime_candidates + ] + _print_results(f"{device} {field} runtime probes", runtime_results) + all_runtime_results.extend(runtime_results) + + if args.output_json: + payload = { + "model_dir": args.model_dir, + "devices": args.devices, + "init_results": [r.__dict__ for r in all_init_results], + "runtime_results": [r.__dict__ for r in all_runtime_results], + } + args.output_json.parent.mkdir(parents=True, exist_ok=True) + args.output_json.write_text(json.dumps(payload, indent=2), encoding="utf-8") + print(f"\nWrote JSON report to: {args.output_json}") + + +if __name__ == "__main__": + main() diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/test_zmq_block.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_zmq_block.py new file mode 100644 index 00000000..cb39ad9a --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_zmq_block.py @@ -0,0 +1,561 @@ +""" +Process isolation A/B test - in-process vs out-of-process CB engine. + +This is cb_server_block_test.py and cb_server_zmq_test.py merged into one +harness. It runs the SAME FastAPI load test twice: + + mode "inprocess" - CB engine runs on the server's event loop, step() + driven through a ThreadPoolExecutor(max_workers=1). + This is the design that blocks. + mode "zmq" - CB engine runs in a separate spawned process; the + server talks to it over ZeroMQ. step() never touches + the event loop. + +Both modes expose identical /ping and /generate endpoints and run the +identical client load test, so the only variable is WHERE step() executes. +A do-nothing /ping is the canary: if it slows while a batch is in flight, +the event loop was blocked. + +Process layout per mode: + driver --spawns--> FastAPI server (--spawns--> ZMQ engine, zmq mode only) +The two modes run sequentially, so only one holds GPU.0 at a time. + +Targets Python 3.12. Run on the GPU box: + pip install pyzmq msgspec fastapi uvicorn httpx + python cb_isolation_ab_test.py +""" + +from __future__ import annotations + +import asyncio +import itertools +import multiprocessing as mp +import os +import subprocess +import sys +import time +from concurrent.futures import ThreadPoolExecutor +from contextlib import asynccontextmanager + +import httpx +import msgspec +import openvino_genai as genai +import uvicorn +import zmq +import zmq.asyncio +from fastapi import FastAPI + + +# --------------------------------------------------------------------------- # +# CONFIG # +# --------------------------------------------------------------------------- # + +MODEL_PATH = "/mnt/Ironwolf-4TB/Models/OpenVINO/Anubis-Mini-8B-v1-int4_asym-ov/" +DEVICE = "GPU.0" +HOST = "127.0.0.1" +PORT_INPROC = 8140 +PORT_ZMQ = 8141 + +SCHEDULER = { + "max_num_batched_tokens": 2048, + "max_num_seqs": 16, + "cache_size": 8, # tune to your VRAM + "dynamic_split_fuse": True, + "enable_prefix_caching": True, +} + +MAX_NEW_TOKENS = 256 +BATCH_SIZE = 6 +BASELINE_PINGS = 60 +SLOW_PING_MS = 50.0 +ZMQ_LINGER_MS = 1000 +GPU_RELEASE_GAP_S = 5.0 # wait between modes so VRAM frees + +PROMPTS = [ + "Explain how continuous batching differs from static batching for LLM serving.", + "Write a short paragraph about the history of the printing press.", + "Describe, step by step, how a CPU executes a single instruction.", + "Summarize the causes of the 2008 financial crisis in plain language.", + "List five considerations when choosing a database index, with reasons.", + "Explain what a KV cache is and why it matters for transformer inference.", +] + +TERMINAL = { + genai.GenerationStatus.FINISHED, + genai.GenerationStatus.IGNORED, + genai.GenerationStatus.CANCEL, + genai.GenerationStatus.STOP, +} + + +# --------------------------------------------------------------------------- # +# SHARED - pipeline build + per-request future bookkeeping # +# --------------------------------------------------------------------------- # + +def _build_pipeline(model_path, device, scheduler): + sc = genai.SchedulerConfig() + for key, value in scheduler.items(): + setattr(sc, key, value) + return genai.ContinuousBatchingPipeline(model_path, device=device, scheduler_config=sc) + + +_futures: dict[int, asyncio.Future] = {} +_token_counts: dict[int, int] = {} +_rid_counter = itertools.count() + + +def _resolve(rid: int, status_name: str) -> None: + """Settle one request's future. Used by both backends.""" + fut = _futures.pop(rid, None) + if fut is not None and not fut.done(): + if status_name == "IGNORED": + fut.set_exception(RuntimeError("request IGNORED - KV cache OOM")) + else: + fut.set_result(_token_counts.pop(rid, 0)) + + +# =========================================================================== # +# ZMQ ENGINE PROCESS - used by the "zmq" mode. Runs in its own interpreter. # +# =========================================================================== # + +def _handle_request(msg, pipe, handles) -> bool: + """Apply one inbound message in the engine process. False on shutdown.""" + kind = msg["type"] + if kind == "shutdown": + return False + if kind == "cancel": + handle = handles.get(msg["rid"]) + if handle is not None: + handle.cancel() + elif kind == "submit": + cfg = genai.GenerationConfig() + cfg.max_new_tokens = msg["max_new_tokens"] + cfg.do_sample = False + handles[msg["rid"]] = pipe.add_request(msg["rid"], msg["prompt"], cfg) + return True + + +def engine_process(model_path, device, scheduler, req_endpoint, res_endpoint) -> None: + """The CB engine loop for zmq mode. Pure synchronous code, its own GIL.""" + ctx = zmq.Context() + req_sock = ctx.socket(zmq.PULL) + req_sock.connect(req_endpoint) + res_sock = ctx.socket(zmq.PUSH) + res_sock.setsockopt(zmq.LINGER, ZMQ_LINGER_MS) + res_sock.connect(res_endpoint) + + encoder = msgspec.msgpack.Encoder() + decoder = msgspec.msgpack.Decoder() + + def send(msg: dict) -> None: + res_sock.send(encoder.encode(msg)) + + try: + print(f"[engine] loading {model_path} on {device} ...", flush=True) + t0 = time.perf_counter() + pipe = _build_pipeline(model_path, device, scheduler) + print(f"[engine] pipeline ready in {time.perf_counter() - t0:.1f}s", flush=True) + except Exception as exc: # noqa: BLE001 + send({"type": "load_error", "error": repr(exc)}) + res_sock.close() + req_sock.close() + ctx.term() + return + + send({"type": "ready"}) + + handles: dict[int, "genai.GenerationHandle"] = {} + running = True + try: + while running: + if not handles: + running = _handle_request(decoder.decode(req_sock.recv()), pipe, handles) + if not running: + break + while True: + try: + raw = req_sock.recv(zmq.NOBLOCK) + except zmq.Again: + break + if not _handle_request(decoder.decode(raw), pipe, handles): + running = False + break + if not running or not handles: + continue + + pipe.step() + + for rid in list(handles.keys()): + handle = handles[rid] + if handle.can_read(): + token_ids: list[int] = [] + for output in handle.read().values(): + token_ids.extend(output.generated_ids) + if token_ids: + send({"type": "tokens", "rid": rid, "token_ids": token_ids}) + status = handle.get_status() + if status in TERMINAL: + send({"type": "done", "rid": rid, "status": status.name}) + del handles[rid] + except Exception as exc: # noqa: BLE001 + send({"type": "engine_error", "error": repr(exc)}) + finally: + for handle in handles.values(): + try: + handle.cancel() + except Exception: # noqa: BLE001 + pass + res_sock.close() + req_sock.close() + ctx.term() + print("[engine] stopped", flush=True) + + +# =========================================================================== # +# BACKEND A - in-process engine (the design under test as "blocking") # +# =========================================================================== # + +class InProcessBackend: + """CB engine on the server's event loop. step() via a 1-worker executor.""" + + def __init__(self) -> None: + self.pipe = None + self.cfg = None + self.executor = ThreadPoolExecutor(max_workers=1, thread_name_prefix="cb-engine") + self.handles: dict[int, "genai.GenerationHandle"] = {} + self.wake = asyncio.Event() + self.loop_task: asyncio.Task | None = None + + async def start(self) -> None: + loop = asyncio.get_running_loop() + self.pipe = await loop.run_in_executor( + self.executor, _build_pipeline, MODEL_PATH, DEVICE, SCHEDULER + ) + self.cfg = genai.GenerationConfig() + self.cfg.max_new_tokens = MAX_NEW_TOKENS + self.cfg.do_sample = False + self.loop_task = asyncio.create_task(self._engine_loop()) + + def _step_and_drain(self) -> list[tuple[int, str]]: + self.pipe.step() + finished: list[tuple[int, str]] = [] + for rid, handle in self.handles.items(): + if handle.can_read(): + for output in handle.read().values(): + _token_counts[rid] = _token_counts.get(rid, 0) + len(output.generated_ids) + status = handle.get_status() + if status in TERMINAL: + finished.append((rid, status.name)) + return finished + + async def _engine_loop(self) -> None: + loop = asyncio.get_running_loop() + try: + while True: + if not self.handles: + self.wake.clear() + await self.wake.wait() + finished = await loop.run_in_executor(self.executor, self._step_and_drain) + for rid, status_name in finished: + self.handles.pop(rid, None) + _resolve(rid, status_name) + except asyncio.CancelledError: + pass + + async def submit(self, rid: int, prompt: str, max_new_tokens: int) -> None: + loop = asyncio.get_running_loop() + handle = await loop.run_in_executor( + self.executor, self.pipe.add_request, rid, prompt, self.cfg + ) + self.handles[rid] = handle + self.wake.set() + + async def stop(self) -> None: + if self.loop_task is not None: + self.loop_task.cancel() + await asyncio.gather(self.loop_task, return_exceptions=True) + self.executor.shutdown(wait=False) + + +# =========================================================================== # +# BACKEND B - out-of-process engine over ZeroMQ # +# =========================================================================== # + +def _dispatch_result(msg: dict) -> None: + kind = msg.get("type") + rid = msg.get("rid") + if kind == "tokens": + _token_counts[rid] = _token_counts.get(rid, 0) + len(msg["token_ids"]) + elif kind == "done": + _resolve(rid, msg["status"]) + elif kind == "engine_error": + print(f"[server] ENGINE ERROR: {msg['error']}", flush=True) + + +class ZmqBackend: + """CB engine in a spawned child process, reached over ZeroMQ.""" + + def __init__(self) -> None: + self.ctx: zmq.asyncio.Context | None = None + self.req_sock: zmq.asyncio.Socket | None = None + self.res_sock: zmq.asyncio.Socket | None = None + self.outbox: asyncio.Queue | None = None + self.proc: mp.Process | None = None + self.tasks: list[asyncio.Task] = [] + self.endpoints: tuple[str, str] = ("", "") + self.encoder = msgspec.msgpack.Encoder() + self.decoder = msgspec.msgpack.Decoder() + + async def start(self) -> None: + req_ep = f"ipc:///tmp/openarc_cb_req_{os.getpid()}.ipc" + res_ep = f"ipc:///tmp/openarc_cb_res_{os.getpid()}.ipc" + self.endpoints = (req_ep, res_ep) + + self.ctx = zmq.asyncio.Context() + self.req_sock = self.ctx.socket(zmq.PUSH) + self.req_sock.setsockopt(zmq.LINGER, ZMQ_LINGER_MS) + self.req_sock.bind(req_ep) + self.res_sock = self.ctx.socket(zmq.PULL) + self.res_sock.setsockopt(zmq.LINGER, ZMQ_LINGER_MS) + self.res_sock.bind(res_ep) + self.outbox = asyncio.Queue() + + mpctx = mp.get_context("spawn") # spawn, NOT fork - GPU state + self.proc = mpctx.Process( + target=engine_process, + args=(MODEL_PATH, DEVICE, SCHEDULER, req_ep, res_ep), + daemon=True, + ) + self.proc.start() + + first = self.decoder.decode(await self.res_sock.recv()) + if first["type"] == "load_error": + raise RuntimeError(f"engine failed to load: {first['error']}") + + self.tasks = [ + asyncio.create_task(self._request_sender()), + asyncio.create_task(self._result_handler()), + ] + + async def _request_sender(self) -> None: + while True: + msg = await self.outbox.get() + try: + await self.req_sock.send(self.encoder.encode(msg)) + finally: + self.outbox.task_done() + + async def _result_handler(self) -> None: + while True: + raw = await self.res_sock.recv() + _dispatch_result(self.decoder.decode(raw)) + + async def submit(self, rid: int, prompt: str, max_new_tokens: int) -> None: + await self.outbox.put({ + "type": "submit", "rid": rid, "prompt": prompt, "max_new_tokens": max_new_tokens, + }) + + async def stop(self) -> None: + await self.outbox.put({"type": "shutdown"}) + await self.outbox.join() + self.proc.join(timeout=10) + if self.proc.is_alive(): + self.proc.terminate() + for task in self.tasks: + task.cancel() + await asyncio.gather(*self.tasks, return_exceptions=True) + self.req_sock.close() + self.res_sock.close() + self.ctx.term() + for endpoint in self.endpoints: + try: + os.unlink(endpoint.removeprefix("ipc://")) + except OSError: + pass + + +# =========================================================================== # +# FASTAPI SERVER - mode-agnostic endpoints over whichever backend is selected # +# =========================================================================== # + +MODE = "inprocess" +_backend: InProcessBackend | ZmqBackend | None = None + + +@asynccontextmanager +async def _lifespan(app: FastAPI): + global _backend + _backend = InProcessBackend() if MODE == "inprocess" else ZmqBackend() + await _backend.start() + print(f"[server] mode={MODE} ready", flush=True) + yield + await _backend.stop() + + +app = FastAPI(lifespan=_lifespan) + + +@app.get("/ping") +async def ping(): + """Does nothing. If this is slow, the event loop was blocked.""" + return {"t": time.perf_counter()} + + +@app.post("/generate") +async def generate(idx: int = 0): + loop = asyncio.get_running_loop() + rid = next(_rid_counter) + fut: asyncio.Future = loop.create_future() + _futures[rid] = fut + await _backend.submit(rid, PROMPTS[idx % len(PROMPTS)], MAX_NEW_TOKENS) + tokens = await fut + return {"rid": rid, "tokens": tokens} + + +def run_server(mode: str, port: int) -> None: + global MODE + MODE = mode + config = uvicorn.Config(app, host=HOST, port=port, log_level="warning") + uvicorn.Server(config).run() + + +# =========================================================================== # +# CLIENT - load test (returns stats so the driver can compare modes) # +# =========================================================================== # + +def _stats(latencies_ms: list[float]) -> tuple[float, float, float, int]: + if not latencies_ms: + return 0.0, 0.0, 0.0, 0 + s = sorted(latencies_ms) + n = len(s) + return s[n // 2], s[min(n - 1, int(n * 0.99))], s[-1], n + + +async def _measure_pings(client: httpx.AsyncClient, n: int) -> list[float]: + out: list[float] = [] + for _ in range(n): + t0 = time.perf_counter() + await client.get("/ping") + out.append((time.perf_counter() - t0) * 1000.0) + return out + + +async def _measure_pings_until(client: httpx.AsyncClient, until: asyncio.Future) -> list[float]: + out: list[float] = [] + while not until.done(): + t0 = time.perf_counter() + try: + await client.get("/ping") + except Exception: # noqa: BLE001 + break + out.append((time.perf_counter() - t0) * 1000.0) + return out + + +async def load_test(base_url: str) -> dict: + async with httpx.AsyncClient(base_url=base_url, timeout=120.0) as client: + print("[test] baseline /ping (server idle) ...") + baseline = await _measure_pings(client, BASELINE_PINGS) + + print(f"[test] firing {BATCH_SIZE} /generate, pinging during the batch ...") + gen_task = asyncio.ensure_future( + asyncio.gather(*[client.post("/generate", params={"idx": i}) for i in range(BATCH_SIZE)]) + ) + during = await _measure_pings_until(client, gen_task) + gen_results = await gen_task + + b_p50, b_p99, b_max, _ = _stats(baseline) + d_p50, d_p99, d_max, d_n = _stats(during) + return { + "idle_p50": b_p50, "idle_p99": b_p99, "idle_max": b_max, + "batch_p50": d_p50, "batch_p99": d_p99, "batch_max": d_max, "batch_n": d_n, + "slow": sum(1 for x in during if x > SLOW_PING_MS), + "tokens": sum(r.json().get("tokens", 0) for r in gen_results), + } + + +# --------------------------------------------------------------------------- # +# DRIVER - run both modes, print the side-by-side comparison # +# --------------------------------------------------------------------------- # + +def _run_one_mode(mode: str, port: int) -> dict: + base_url = f"http://{HOST}:{port}" + print(f"\n[driver] starting server in mode={mode} ...") + proc = subprocess.Popen([sys.executable, os.path.abspath(__file__), "--serve", mode, str(port)]) + try: + deadline = time.time() + 240.0 + with httpx.Client() as probe: + while True: + try: + if probe.get(base_url + "/ping", timeout=2.0).status_code == 200: + break + except Exception: # noqa: BLE001 + pass + if time.time() > deadline: + raise RuntimeError(f"server (mode={mode}) did not become ready") + time.sleep(1.0) + print(f"[driver] mode={mode} server ready, running load test ...") + return asyncio.run(load_test(base_url)) + finally: + proc.terminate() + try: + proc.wait(timeout=15) + except subprocess.TimeoutExpired: + proc.kill() + + +def _fmt(value: float) -> str: + return f"{value:8.1f}ms" + + +def _print_comparison(inproc: dict, zmqd: dict) -> None: + rows = [ + ("/ping idle max", "idle_max"), + ("/ping in-batch p50", "batch_p50"), + ("/ping in-batch p99", "batch_p99"), + ("/ping in-batch max", "batch_max"), + ] + print("\n" + "=" * 72) + print("COMPARISON - process isolation during step()") + print("=" * 72) + print(f"{'':22} {'IN-PROCESS':>14} {'OUT-OF-PROCESS (ZMQ)':>22}") + for label, key in rows: + print(f"{label:22} {_fmt(inproc[key]):>14} {_fmt(zmqd[key]):>22}") + print(f"{'pings delayed >'+str(int(SLOW_PING_MS))+'ms':22} " + f"{str(inproc['slow'])+'/'+str(inproc['batch_n']):>14} " + f"{str(zmqd['slow'])+'/'+str(zmqd['batch_n']):>22}") + print("-" * 72) + + inproc_blocked = inproc["batch_max"] > 25.0 and inproc["batch_max"] > 5.0 * max(inproc["idle_max"], 1.0) + zmq_clean = zmqd["batch_max"] < 25.0 or zmqd["batch_max"] < 3.0 * max(zmqd["idle_max"], 1.0) + if inproc_blocked and zmq_clean: + print("[verdict] CONFIRMED. In-process, a do-nothing /ping spiked to " + f"{inproc['batch_max']:.0f}ms while a batch ran -") + print(" the event loop was blocked by step(). Out-of-process over") + print(f" ZMQ, /ping stayed at {zmqd['batch_max']:.0f}ms max. Process") + print(" isolation keeps FastAPI free during step(): the engine's") + print(" GIL is a different GIL.") + else: + print("[verdict] inconclusive - inspect the numbers above. Expected the") + print(" in-process max to be large and the ZMQ max to stay small.") + print("=" * 72) + + +def run_test() -> None: + inproc = _run_one_mode("inprocess", PORT_INPROC) + print(f"\n[driver] waiting {GPU_RELEASE_GAP_S:.0f}s for GPU memory to free ...") + time.sleep(GPU_RELEASE_GAP_S) + zmqd = _run_one_mode("zmq", PORT_ZMQ) + _print_comparison(inproc, zmqd) + + +# --------------------------------------------------------------------------- # +# Entry point # +# --------------------------------------------------------------------------- # + +if __name__ == "__main__": + if "--serve" in sys.argv: + i = sys.argv.index("--serve") + run_server(sys.argv[i + 1], int(sys.argv[i + 2])) + else: + run_test() \ No newline at end of file diff --git a/src/engine/ov_genai/continuous_batching/examples_and_tests/test_zmq_hammer.py b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_zmq_hammer.py new file mode 100644 index 00000000..789f3172 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/examples_and_tests/test_zmq_hammer.py @@ -0,0 +1,657 @@ +""" +Concurrent-load hammer test - in-process vs out-of-process CB engine. + +The earlier A/B test pinged sequentially, one request at a time. That +undersamples blocking: a ping issued in the gap between two step() calls +completes fast and never witnesses the freeze. This version fixes that - +it holds CONCURRENT_PINGERS (default 48) ping clients hammering /ping +continuously, so whenever the event loop freezes there are always dozens +of requests caught mid-flight. The slow ones cannot hide. + +Each mode runs three phases against this sustained concurrent load: + baseline - hammer only, no generation (the concurrent-load floor) + batch - BATCH_SIZE /generate requests fired, hammer continues + cooldown - hammer only, after the batch finishes + +Every /ping is recorded as (time_since_start, latency_ms). After both +modes run, the script writes: + cb_hammer_results.png - latency timeline (per mode) + CDF (overlaid) + cb_hammer_inprocess.csv - raw samples, in-process mode + cb_hammer_zmq.csv - raw samples, zmq mode + +Targets Python 3.12. Run on the GPU box: + pip install pyzmq msgspec fastapi uvicorn httpx matplotlib + python cb_hammer_test.py +""" + +from __future__ import annotations + +import asyncio +import itertools +import multiprocessing as mp +import os +import subprocess +import sys +import time +from concurrent.futures import ThreadPoolExecutor +from contextlib import asynccontextmanager + +import httpx +import msgspec +import openvino_genai as genai +import uvicorn +import zmq +import zmq.asyncio +from fastapi import FastAPI + + +# --------------------------------------------------------------------------- # +# CONFIG # +# --------------------------------------------------------------------------- # + +MODEL_PATH = "/mnt/Ironwolf-4TB/Models/OpenVINO/Anubis-Mini-8B-v1-int4_asym-ov/" +DEVICE = "CPU" +HOST = "127.0.0.1" +PORT_INPROC = 8142 +PORT_ZMQ = 8143 + +SCHEDULER = { + "max_num_batched_tokens": 2048, + "max_num_seqs": 16, + "cache_size": 8, # tune to your VRAM + "dynamic_split_fuse": True, + "enable_prefix_caching": True, +} + +MAX_NEW_TOKENS = 256 +BATCH_SIZE = 6 +CONCURRENT_PINGERS = 48 # sustained concurrent /ping clients +BASELINE_SECONDS = 5.0 # hammer-only phase before the batch +COOLDOWN_SECONDS = 3.0 # hammer-only phase after the batch +CLIENT_TIMEOUT_S = 60.0 # high, so a blocked ping is recorded not dropped +ZMQ_LINGER_MS = 1000 +GPU_RELEASE_GAP_S = 5.0 + +PROMPTS = [ + "Explain how continuous batching differs from static batching for LLM serving.", + "Write a short paragraph about the history of the printing press.", + "Describe, step by step, how a CPU executes a single instruction.", + "Summarize the causes of the 2008 financial crisis in plain language.", + "List five considerations when choosing a database index, with reasons.", + "Explain what a KV cache is and why it matters for transformer inference.", +] + +TERMINAL = { + genai.GenerationStatus.FINISHED, + genai.GenerationStatus.IGNORED, + genai.GenerationStatus.CANCEL, + genai.GenerationStatus.STOP, +} + +OUT_PNG = os.path.join(os.getcwd(), "cb_hammer_results.png") +OUT_CSV = { + "inprocess": os.path.join(os.getcwd(), "cb_hammer_inprocess.csv"), + "zmq": os.path.join(os.getcwd(), "cb_hammer_zmq.csv"), +} + + +# --------------------------------------------------------------------------- # +# SHARED - pipeline build + per-request future bookkeeping # +# --------------------------------------------------------------------------- # + +def _build_pipeline(model_path, device, scheduler): + sc = genai.SchedulerConfig() + for key, value in scheduler.items(): + setattr(sc, key, value) + return genai.ContinuousBatchingPipeline(model_path, device=device, scheduler_config=sc) + + +_futures: dict[int, asyncio.Future] = {} +_token_counts: dict[int, int] = {} +_rid_counter = itertools.count() + + +def _resolve(rid: int, status_name: str) -> None: + fut = _futures.pop(rid, None) + if fut is not None and not fut.done(): + if status_name == "IGNORED": + fut.set_exception(RuntimeError("request IGNORED - KV cache OOM")) + else: + fut.set_result(_token_counts.pop(rid, 0)) + + +# =========================================================================== # +# ZMQ ENGINE PROCESS # +# =========================================================================== # + +def _handle_request(msg, pipe, handles) -> bool: + kind = msg["type"] + if kind == "shutdown": + return False + if kind == "cancel": + handle = handles.get(msg["rid"]) + if handle is not None: + handle.cancel() + elif kind == "submit": + cfg = genai.GenerationConfig() + cfg.max_new_tokens = msg["max_new_tokens"] + cfg.do_sample = False + handles[msg["rid"]] = pipe.add_request(msg["rid"], msg["prompt"], cfg) + return True + + +def engine_process(model_path, device, scheduler, req_endpoint, res_endpoint) -> None: + ctx = zmq.Context() + req_sock = ctx.socket(zmq.PULL) + req_sock.connect(req_endpoint) + res_sock = ctx.socket(zmq.PUSH) + res_sock.setsockopt(zmq.LINGER, ZMQ_LINGER_MS) + res_sock.connect(res_endpoint) + + encoder = msgspec.msgpack.Encoder() + decoder = msgspec.msgpack.Decoder() + + def send(msg: dict) -> None: + res_sock.send(encoder.encode(msg)) + + try: + print(f"[engine] loading {model_path} on {device} ...", flush=True) + t0 = time.perf_counter() + pipe = _build_pipeline(model_path, device, scheduler) + print(f"[engine] pipeline ready in {time.perf_counter() - t0:.1f}s", flush=True) + except Exception as exc: # noqa: BLE001 + send({"type": "load_error", "error": repr(exc)}) + res_sock.close() + req_sock.close() + ctx.term() + return + + send({"type": "ready"}) + + handles: dict[int, "genai.GenerationHandle"] = {} + running = True + try: + while running: + if not handles: + running = _handle_request(decoder.decode(req_sock.recv()), pipe, handles) + if not running: + break + while True: + try: + raw = req_sock.recv(zmq.NOBLOCK) + except zmq.Again: + break + if not _handle_request(decoder.decode(raw), pipe, handles): + running = False + break + if not running or not handles: + continue + + pipe.step() + + for rid in list(handles.keys()): + handle = handles[rid] + if handle.can_read(): + token_ids: list[int] = [] + for output in handle.read().values(): + token_ids.extend(output.generated_ids) + if token_ids: + send({"type": "tokens", "rid": rid, "token_ids": token_ids}) + status = handle.get_status() + if status in TERMINAL: + send({"type": "done", "rid": rid, "status": status.name}) + del handles[rid] + except Exception as exc: # noqa: BLE001 + send({"type": "engine_error", "error": repr(exc)}) + finally: + for handle in handles.values(): + try: + handle.cancel() + except Exception: # noqa: BLE001 + pass + res_sock.close() + req_sock.close() + ctx.term() + print("[engine] stopped", flush=True) + + +# =========================================================================== # +# BACKEND A - in-process engine # +# =========================================================================== # + +class InProcessBackend: + def __init__(self) -> None: + self.pipe = None + self.cfg = None + self.executor = ThreadPoolExecutor(max_workers=1, thread_name_prefix="cb-engine") + self.handles: dict[int, "genai.GenerationHandle"] = {} + self.wake = asyncio.Event() + self.loop_task: asyncio.Task | None = None + + async def start(self) -> None: + loop = asyncio.get_running_loop() + self.pipe = await loop.run_in_executor( + self.executor, _build_pipeline, MODEL_PATH, DEVICE, SCHEDULER + ) + self.cfg = genai.GenerationConfig() + self.cfg.max_new_tokens = MAX_NEW_TOKENS + self.cfg.do_sample = False + self.loop_task = asyncio.create_task(self._engine_loop()) + + def _step_and_drain(self) -> list[tuple[int, str]]: + self.pipe.step() + finished: list[tuple[int, str]] = [] + for rid, handle in self.handles.items(): + if handle.can_read(): + for output in handle.read().values(): + _token_counts[rid] = _token_counts.get(rid, 0) + len(output.generated_ids) + status = handle.get_status() + if status in TERMINAL: + finished.append((rid, status.name)) + return finished + + async def _engine_loop(self) -> None: + loop = asyncio.get_running_loop() + try: + while True: + if not self.handles: + self.wake.clear() + await self.wake.wait() + finished = await loop.run_in_executor(self.executor, self._step_and_drain) + for rid, status_name in finished: + self.handles.pop(rid, None) + _resolve(rid, status_name) + except asyncio.CancelledError: + pass + + async def submit(self, rid: int, prompt: str, max_new_tokens: int) -> None: + loop = asyncio.get_running_loop() + handle = await loop.run_in_executor( + self.executor, self.pipe.add_request, rid, prompt, self.cfg + ) + self.handles[rid] = handle + self.wake.set() + + async def stop(self) -> None: + if self.loop_task is not None: + self.loop_task.cancel() + await asyncio.gather(self.loop_task, return_exceptions=True) + self.executor.shutdown(wait=False) + + +# =========================================================================== # +# BACKEND B - out-of-process engine over ZeroMQ # +# =========================================================================== # + +def _dispatch_result(msg: dict) -> None: + kind = msg.get("type") + rid = msg.get("rid") + if kind == "tokens": + _token_counts[rid] = _token_counts.get(rid, 0) + len(msg["token_ids"]) + elif kind == "done": + _resolve(rid, msg["status"]) + elif kind == "engine_error": + print(f"[server] ENGINE ERROR: {msg['error']}", flush=True) + + +class ZmqBackend: + def __init__(self) -> None: + self.ctx: zmq.asyncio.Context | None = None + self.req_sock: zmq.asyncio.Socket | None = None + self.res_sock: zmq.asyncio.Socket | None = None + self.outbox: asyncio.Queue | None = None + self.proc: mp.Process | None = None + self.tasks: list[asyncio.Task] = [] + self.endpoints: tuple[str, str] = ("", "") + self.encoder = msgspec.msgpack.Encoder() + self.decoder = msgspec.msgpack.Decoder() + + async def start(self) -> None: + req_ep = f"ipc:///tmp/openarc_cb_req_{os.getpid()}.ipc" + res_ep = f"ipc:///tmp/openarc_cb_res_{os.getpid()}.ipc" + self.endpoints = (req_ep, res_ep) + + self.ctx = zmq.asyncio.Context() + self.req_sock = self.ctx.socket(zmq.PUSH) + self.req_sock.setsockopt(zmq.LINGER, ZMQ_LINGER_MS) + self.req_sock.bind(req_ep) + self.res_sock = self.ctx.socket(zmq.PULL) + self.res_sock.setsockopt(zmq.LINGER, ZMQ_LINGER_MS) + self.res_sock.bind(res_ep) + self.outbox = asyncio.Queue() + + mpctx = mp.get_context("spawn") + self.proc = mpctx.Process( + target=engine_process, + args=(MODEL_PATH, DEVICE, SCHEDULER, req_ep, res_ep), + daemon=True, + ) + self.proc.start() + + first = self.decoder.decode(await self.res_sock.recv()) + if first["type"] == "load_error": + raise RuntimeError(f"engine failed to load: {first['error']}") + + self.tasks = [ + asyncio.create_task(self._request_sender()), + asyncio.create_task(self._result_handler()), + ] + + async def _request_sender(self) -> None: + while True: + msg = await self.outbox.get() + try: + await self.req_sock.send(self.encoder.encode(msg)) + finally: + self.outbox.task_done() + + async def _result_handler(self) -> None: + while True: + raw = await self.res_sock.recv() + _dispatch_result(self.decoder.decode(raw)) + + async def submit(self, rid: int, prompt: str, max_new_tokens: int) -> None: + await self.outbox.put({ + "type": "submit", "rid": rid, "prompt": prompt, "max_new_tokens": max_new_tokens, + }) + + async def stop(self) -> None: + await self.outbox.put({"type": "shutdown"}) + await self.outbox.join() + self.proc.join(timeout=10) + if self.proc.is_alive(): + self.proc.terminate() + for task in self.tasks: + task.cancel() + await asyncio.gather(*self.tasks, return_exceptions=True) + self.req_sock.close() + self.res_sock.close() + self.ctx.term() + for endpoint in self.endpoints: + try: + os.unlink(endpoint.removeprefix("ipc://")) + except OSError: + pass + + +# =========================================================================== # +# FASTAPI SERVER # +# =========================================================================== # + +MODE = "inprocess" +_backend: InProcessBackend | ZmqBackend | None = None + + +@asynccontextmanager +async def _lifespan(app: FastAPI): + global _backend + _backend = InProcessBackend() if MODE == "inprocess" else ZmqBackend() + await _backend.start() + print(f"[server] mode={MODE} ready", flush=True) + yield + await _backend.stop() + + +app = FastAPI(lifespan=_lifespan) + + +@app.get("/ping") +async def ping(): + return {"t": time.perf_counter()} + + +@app.post("/generate") +async def generate(idx: int = 0): + loop = asyncio.get_running_loop() + rid = next(_rid_counter) + fut: asyncio.Future = loop.create_future() + _futures[rid] = fut + await _backend.submit(rid, PROMPTS[idx % len(PROMPTS)], MAX_NEW_TOKENS) + tokens = await fut + return {"rid": rid, "tokens": tokens} + + +def run_server(mode: str, port: int) -> None: + global MODE + MODE = mode + config = uvicorn.Config(app, host=HOST, port=port, log_level="warning") + uvicorn.Server(config).run() + + +# =========================================================================== # +# CLIENT - concurrent hammer load # +# =========================================================================== # + +async def hammer_load_test(base_url: str) -> dict: + """CONCURRENT_PINGERS clients hammer /ping continuously; a batch is fired + partway through. Returns every (t_since_start, latency_ms) sample.""" + samples: list[tuple[float, float]] = [] + stop = asyncio.Event() + limits = httpx.Limits( + max_connections=CONCURRENT_PINGERS + BATCH_SIZE + 16, + max_keepalive_connections=CONCURRENT_PINGERS + BATCH_SIZE + 16, + ) + + async with httpx.AsyncClient(base_url=base_url, timeout=CLIENT_TIMEOUT_S, limits=limits) as client: + t_origin = time.perf_counter() + + async def pinger() -> None: + while not stop.is_set(): + t0 = time.perf_counter() + try: + await client.get("/ping") + except Exception: # noqa: BLE001 + continue + t1 = time.perf_counter() + samples.append((t0 - t_origin, (t1 - t0) * 1000.0)) + + pingers = [asyncio.create_task(pinger()) for _ in range(CONCURRENT_PINGERS)] + + # Phase 1: baseline - hammer only. + print(f"[test] phase 1: {CONCURRENT_PINGERS} pingers, no batch ({BASELINE_SECONDS:.0f}s) ...") + await asyncio.sleep(BASELINE_SECONDS) + + # Phase 2: batch in flight - hammer continues. + print(f"[test] phase 2: firing {BATCH_SIZE} /generate, hammer continues ...") + batch_start = time.perf_counter() - t_origin + gen_task = asyncio.gather(*[client.post("/generate", params={"idx": i}) for i in range(BATCH_SIZE)]) + gen_results = await gen_task + batch_end = time.perf_counter() - t_origin + + # Phase 3: cooldown - hammer only. + print(f"[test] phase 3: cooldown ({COOLDOWN_SECONDS:.0f}s) ...") + await asyncio.sleep(COOLDOWN_SECONDS) + + stop.set() + await asyncio.gather(*pingers, return_exceptions=True) + + return { + "samples": samples, + "batch_start": batch_start, + "batch_end": batch_end, + "tokens": sum(r.json().get("tokens", 0) for r in gen_results), + } + + +# --------------------------------------------------------------------------- # +# OUTPUT - CSV, summary table, graphs # +# --------------------------------------------------------------------------- # + +def _dump_csv(path: str, data: dict) -> None: + with open(path, "w") as f: + f.write("t_seconds,latency_ms\n") + for t, lat in data["samples"]: + f.write(f"{t:.6f},{lat:.4f}\n") + print(f"[driver] raw samples written to {path}") + + +def _phase_pcts(data: dict) -> tuple[tuple, tuple]: + import numpy as np + + if not data["samples"]: + return (0.0, 0.0, 0.0, 0), (0.0, 0.0, 0.0, 0) + arr = np.array(data["samples"]) + t, lat = arr[:, 0], arr[:, 1] + base = lat[t < data["batch_start"]] + batch = lat[(t >= data["batch_start"]) & (t <= data["batch_end"])] + + def pct(a): + if len(a) == 0: + return (0.0, 0.0, 0.0, 0) + return (float(np.percentile(a, 50)), float(np.percentile(a, 99)), float(a.max()), len(a)) + + return pct(base), pct(batch) + + +def print_summary(inproc: dict, zmqd: dict) -> None: + in_base, in_batch = _phase_pcts(inproc) + zq_base, zq_batch = _phase_pcts(zmqd) + print("\n" + "=" * 78) + print(f"SUMMARY - /ping under {CONCURRENT_PINGERS} concurrent clients") + print("=" * 78) + print(f"{'':26}{'IN-PROCESS':>24}{'OUT-OF-PROCESS (ZMQ)':>26}") + fmt = lambda p: f"p50={p[0]:7.1f} p99={p[1]:8.1f} max={p[2]:8.1f}" + print(f"{'baseline (no batch)':26}{fmt(in_base):>24}{fmt(zq_base):>26}") + print(f"{'during batch':26}{fmt(in_batch):>24}{fmt(zq_batch):>26}") + print(f"{'pings during batch':26}{in_batch[3]:>24}{zq_batch[3]:>26}") + print("-" * 78) + print("During-batch p50 is the honest number under concurrent load: a ping") + print("cannot slip through a between-step gap when 48 are always in flight.") + print("=" * 78) + + +def make_graphs(inproc: dict, zmqd: dict, png_path: str) -> None: + import matplotlib + import numpy as np + + matplotlib.use("Agg") + import matplotlib.pyplot as plt + + def as_arr(d): + return np.array(d["samples"]) if d["samples"] else np.zeros((0, 2)) + + a_in, a_zmq = as_arr(inproc), as_arr(zmqd) + all_lat = np.concatenate([ + a_in[:, 1] if len(a_in) else np.array([1.0]), + a_zmq[:, 1] if len(a_zmq) else np.array([1.0]), + ]) + ymin = max(0.2, float(all_lat.min()) * 0.7) + ymax = float(all_lat.max()) * 1.4 + + fig, axes = plt.subplots(3, 1, figsize=(13, 16)) + + def timeline(ax, data, title, p99_color): + arr = as_arr(data) + if len(arr): + t, lat = arr[:, 0], arr[:, 1] + # subsample raw points so the scatter stays legible + if len(t) > 20000: + idx = np.random.default_rng(0).choice(len(t), 20000, replace=False) + ax.scatter(t[idx], lat[idx], s=3, alpha=0.12, color="#999999", linewidths=0) + else: + ax.scatter(t, lat, s=3, alpha=0.12, color="#999999", linewidths=0) + # percentile lines, 100 ms bins + edges = np.arange(0.0, float(t.max()) + 0.1, 0.1) + centers, p50s, p99s = [], [], [] + for i in range(len(edges) - 1): + mask = (t >= edges[i]) & (t < edges[i + 1]) + if not mask.any(): + continue + centers.append((edges[i] + edges[i + 1]) / 2) + p50s.append(float(np.percentile(lat[mask], 50))) + p99s.append(float(np.percentile(lat[mask], 99))) + ax.plot(centers, p50s, color="#1f77b4", lw=1.6, label="p50 (100ms bins)") + ax.plot(centers, p99s, color=p99_color, lw=1.6, label="p99 (100ms bins)") + ax.axvspan(data["batch_start"], data["batch_end"], + color="#ffae42", alpha=0.18, label="batch in flight") + ax.set_yscale("log") + ax.set_ylim(ymin, ymax) + ax.set_title(title) + ax.set_xlabel("time since test start (s)") + ax.set_ylabel("/ping latency (ms)") + ax.legend(loc="upper left", fontsize=8) + ax.grid(True, which="both", alpha=0.2) + + timeline(axes[0], inproc, + f"IN-PROCESS engine - /ping under {CONCURRENT_PINGERS} concurrent clients", "#d62728") + timeline(axes[1], zmqd, + f"OUT-OF-PROCESS (ZMQ) engine - /ping under {CONCURRENT_PINGERS} concurrent clients", "#2ca02c") + + # CDF of the during-batch samples + ax = axes[2] + for data, label, color in [(inproc, "in-process", "#d62728"), + (zmqd, "zmq out-of-process", "#2ca02c")]: + arr = as_arr(data) + if not len(arr): + continue + t, lat = arr[:, 0], arr[:, 1] + mask = (t >= data["batch_start"]) & (t <= data["batch_end"]) + batch_lat = np.sort(lat[mask]) + if not len(batch_lat): + continue + y = np.arange(1, len(batch_lat) + 1) / len(batch_lat) + ax.plot(batch_lat, y, color=color, lw=2.2, label=f"{label} (n={len(batch_lat)})") + ax.set_xscale("log") + ax.set_title("/ping latency distribution DURING the batch window (CDF)") + ax.set_xlabel("/ping latency (ms)") + ax.set_ylabel("cumulative fraction of requests") + ax.legend(loc="lower right") + ax.grid(True, which="both", alpha=0.2) + + fig.tight_layout() + fig.savefig(png_path, dpi=120) + print(f"[driver] graphs written to {png_path}") + + +# --------------------------------------------------------------------------- # +# DRIVER # +# --------------------------------------------------------------------------- # + +def _run_one_mode(mode: str, port: int) -> dict: + base_url = f"http://{HOST}:{port}" + print(f"\n[driver] starting server in mode={mode} ...") + proc = subprocess.Popen([sys.executable, os.path.abspath(__file__), "--serve", mode, str(port)]) + try: + deadline = time.time() + 240.0 + with httpx.Client() as probe: + while True: + try: + if probe.get(base_url + "/ping", timeout=2.0).status_code == 200: + break + except Exception: # noqa: BLE001 + pass + if time.time() > deadline: + raise RuntimeError(f"server (mode={mode}) did not become ready") + time.sleep(1.0) + print(f"[driver] mode={mode} server ready, running hammer test ...") + return asyncio.run(hammer_load_test(base_url)) + finally: + proc.terminate() + try: + proc.wait(timeout=15) + except subprocess.TimeoutExpired: + proc.kill() + + +def run_test() -> None: + inproc = _run_one_mode("inprocess", PORT_INPROC) + print(f"\n[driver] waiting {GPU_RELEASE_GAP_S:.0f}s for GPU memory to free ...") + time.sleep(GPU_RELEASE_GAP_S) + zmqd = _run_one_mode("zmq", PORT_ZMQ) + + _dump_csv(OUT_CSV["inprocess"], inproc) + _dump_csv(OUT_CSV["zmq"], zmqd) + print_summary(inproc, zmqd) + make_graphs(inproc, zmqd, OUT_PNG) + + +# --------------------------------------------------------------------------- # +# Entry point # +# --------------------------------------------------------------------------- # + +if __name__ == "__main__": + if "--serve" in sys.argv: + i = sys.argv.index("--serve") + run_server(sys.argv[i + 1], int(sys.argv[i + 2])) + else: + run_test() \ No newline at end of file diff --git a/src/engine/ov_genai/continuous_batching/test_continuous_batching.py b/src/engine/ov_genai/continuous_batching/test_continuous_batching.py new file mode 100644 index 00000000..477d7a74 --- /dev/null +++ b/src/engine/ov_genai/continuous_batching/test_continuous_batching.py @@ -0,0 +1,724 @@ +import random +import time +import statistics +import sqlite3 +from datetime import datetime, timezone +from pathlib import Path +from openvino_genai import ( + GenerationConfig, + ContinuousBatchingPipeline, + SchedulerConfig, + Tokenizer, + GenerationFinishReason, +) + + +# ── parameters ───────────────────────────────────────────────────────────────── + +#MODEL_DIR = "" +MODEL_DIR = "/mnt/Ironwolf-4TB/Models/OpenVINO/Deepseek/DeepSeek-R1-0528-Qwen3-8B-OpenVINO/DeepSeek-R1-0528-Qwen3-8B-int8_asym-ov/" +DEVICE = "HETERO:GPU.0,GPU.1" +SONNET_PATH = "/home/echo/Projects/OpenArc/benchmark/sonnet.txt" + +NUM_REQUESTS = 72 # set of all requests to be processed in one step +SEED = 0 + +# Sonnet benchmark +INPUT_LEN = 550 # target input tokens per request +OUTPUT_LEN = 1024 # fixed output tokens per request (ignore_eos=True) +PREFIX_LEN = 200 # shared prefix tokens (same across all requests) + +# Scheduler +MAX_BATCHED_TOKENS = 2048 # max tokens processed in one scheduler step (prompt + decode combined) +MAX_SEQS = 16 # max sequences held in-flight simultaneously +CACHE_SIZE_GB = 10 # KV cache size allocated on device (GB) +DYNAMIC_SPLIT_FUSE = True # split long prefills across steps to keep decode latency smooth +ENABLE_PREFIX_CACHE = True # reuse KV blocks for shared prompt prefixes across requests +GRAPH_OUTPUT_DIR = Path(__file__).parent / "bench_graphs" +SQLITE_DB_PATH = Path(__file__).parent / "bench_results.sqlite" + +# ── pipeline init ─────────────────────────────────────────────────────────────── + +genai_tokenizer = Tokenizer(str(MODEL_DIR)) + +scheduler_config = SchedulerConfig() +scheduler_config.max_num_batched_tokens = MAX_BATCHED_TOKENS +scheduler_config.max_num_seqs = MAX_SEQS +scheduler_config.cache_size = CACHE_SIZE_GB +scheduler_config.dynamic_split_fuse = DYNAMIC_SPLIT_FUSE +scheduler_config.enable_prefix_caching = ENABLE_PREFIX_CACHE + +pipeline = ContinuousBatchingPipeline( + MODEL_DIR, + device=DEVICE, + scheduler_config=scheduler_config, + properties={ + "MODEL_DISTRIBUTION_POLICY": "PIPELINE_PARALLEL" + }, + tokenizer_properties={}, + vision_encoder_properties={} + +) + +# ── helpers ──────────────────────────────────────────────────────────────────── + +def _count_input_tokens(tokenizer, prompt: str) -> int: + try: + ids = tokenizer.encode(prompt).input_ids + if hasattr(ids, "shape"): + return int(ids.shape[-1]) + if ids and hasattr(ids[0], "__len__"): + return len(ids[0]) + return len(ids) + except Exception: + return 0 + + +# ── vLLMSonnetBench ──────────────────────────────────────────────────────────── + +class vLLMSonnetBench: + """ + Sonnet-style benchmark prompt generator, modelled on vLLM's SonnetDataset. + + Loads a plain-text file of poem lines (e.g. sonnet.txt from the vLLM repo). + Each request is assembled from: + - a fixed shared prefix block (first N lines, same for every request) — + intentionally exercises the prefix-cache path when prefix caching is on + - randomly sampled extra lines drawn with replacement to reach `input_len` + + Output length is fixed at `output_len` tokens and enforced via + `ignore_eos=True` so every request generates exactly that many tokens, + making throughput numbers directly comparable across runs. + """ + + HEADER = "Pick as many lines as you can from these poem lines:\n" + + def __init__( + self, + dataset_path: str | Path, + tokenizer: Tokenizer, + input_len: int = 550, + output_len: int = 150, + prefix_len: int = 200, + seed: int = 0, + ) -> None: + self.tokenizer = tokenizer + self.input_len = input_len + self.output_len = output_len + self.prefix_len = prefix_len + random.seed(seed) + + with open(dataset_path, encoding="utf-8") as f: + self.lines = f.readlines() + if not self.lines: + raise ValueError(f"Sonnet file is empty: {dataset_path}") + + # Average tokens per poem line (used to estimate how many lines to pick) + line_lens = [_count_input_tokens(tokenizer, ln) for ln in self.lines] + self.avg_len = sum(line_lens) / len(line_lens) + + header_len = _count_input_tokens(tokenizer, self.HEADER) + if input_len <= header_len: + raise ValueError( + f"input_len ({input_len}) must be greater than the header " + f"token count ({header_len})." + ) + + # How many lines the full prompt should contain + self._num_input_lines = max(1, round((input_len - header_len) / self.avg_len)) + # How many of those are the fixed shared prefix + self._num_prefix_lines = max(0, round((prefix_len - header_len) / self.avg_len)) + self._prefix_lines = self.lines[: self._num_prefix_lines] + + print( + f"[SonnetBench] avg line len: {self.avg_len:.1f} tok | " + f"prefix lines: {self._num_prefix_lines} | " + f"total lines/request: {self._num_input_lines} | " + f"target output: {output_len} tok" + ) + + def sample(self, num_requests: int) -> tuple[list[str], GenerationConfig]: + """ + Return `(prompts, generation_config)` ready to pass to the pipeline. + + The generation config fixes output length exactly (`ignore_eos=True`) + and disables sampling so results are deterministic given the seed. + """ + n_extra = max(0, self._num_input_lines - self._num_prefix_lines) + prompts = [] + for _ in range(num_requests): + extra = random.choices(self.lines, k=n_extra) + body = "".join(self._prefix_lines + extra) + prompts.append(self.HEADER + body) + + gen_cfg = GenerationConfig( + max_new_tokens=self.output_len, + ignore_eos=True, # enforce fixed output length + do_sample=False, # greedy — removes sampling noise + ) + return prompts, gen_cfg + + +bench = vLLMSonnetBench( + dataset_path=SONNET_PATH, + tokenizer=genai_tokenizer, + input_len=INPUT_LEN, + output_len=OUTPUT_LEN, + prefix_len=PREFIX_LEN, + seed=SEED, +) +prompts, generation_config = bench.sample(NUM_REQUESTS) + + +def percentile(data: list[float], p: float) -> float: + if not data: + return 0.0 + s = sorted(data) + n = len(s) + idx = (n - 1) * p / 100.0 + lo = int(idx) + hi = min(lo + 1, n - 1) + return s[lo] + (s[hi] - s[lo]) * (idx - lo) + + +def _report_row(label: str, value: str, width: int = 50) -> str: + gap = width - len(label) - len(value) + return label + " " * max(gap, 1) + value + + +def _section(title: str, char: str, width: int = 50) -> str: + return title.center(width, char) + + +class vLLMBenchData: + """Owns request/step data collection and aggregate metric computation.""" + + def __init__(self, tokenizer: Tokenizer, prompts: list[str]) -> None: + self.tokenizer = tokenizer + self.prompts = prompts + self.num_prompts = len(prompts) + + self.arrival_time: dict[int, float] = {} + self.first_tok_time: dict[int, float] = {} + self.finish_time: dict[int, float] = {} + self.tok_timestamps: dict[int, list[float]] = {} + self.tok_count: dict[int, int] = {} + self.tok_ids: dict[int, list[int]] = {} + self.input_tok_count: dict[int, int] = {} + self.failed_ids: set[int] = set() + self.finished_ids: set[int] = set() + self.step_records: list[tuple[float, int, int]] = [] + + self.benchmark_start = 0.0 + self.benchmark_end = 0.0 + self.benchmark_duration = 0.0 + + for i, prompt in enumerate(prompts): + self.input_tok_count[i] = _count_input_tokens(tokenizer, prompt) + self.tok_timestamps[i] = [] + self.tok_count[i] = 0 + self.tok_ids[i] = [] + + def start(self) -> None: + self.benchmark_start = time.perf_counter() + + def stop(self) -> None: + self.benchmark_end = time.perf_counter() + self.benchmark_duration = self.benchmark_end - self.benchmark_start + + def mark_arrival(self, req_id: int) -> None: + self.arrival_time[req_id] = time.perf_counter() + + def consume_output(self, req_id: int, output, step_ts: float) -> int: + n_new = len(output.generated_ids) if output.generated_ids else 0 + if n_new > 0: + if req_id not in self.first_tok_time: + self.first_tok_time[req_id] = step_ts + self.tok_timestamps[req_id].extend([step_ts] * n_new) + self.tok_count[req_id] += n_new + self.tok_ids[req_id].extend(output.generated_ids) + + if output.finish_reason not in (GenerationFinishReason.NONE, None): + self.finished_ids.add(req_id) + self.finish_time[req_id] = step_ts + + return n_new + + def add_step(self, step_ts: float, concurrent_now: int, new_tokens: int) -> None: + self.step_records.append((step_ts, concurrent_now, new_tokens)) + + def aggregate(self) -> dict[str, object]: + ttfts: list[float] = [] + tpots: list[float] = [] + itls: list[float] = [] + + for i in range(self.num_prompts): + toks = self.tok_timestamps[i] + n = len(toks) + + if i in self.first_tok_time: + ttfts.append((self.first_tok_time[i] - self.arrival_time[i]) * 1000) + + if n > 1: + # TPOT: average step-to-step interval after the first token + tpots.append((toks[-1] - toks[0]) * 1000 / (n - 1)) + + # ITL: drop zero-duration pairs from the same scheduler step. + for j in range(1, n): + dt_ms = (toks[j] - toks[j - 1]) * 1000 + if dt_ms > 0: + itls.append(dt_ms) + + total_input_tokens = sum(self.input_tok_count.values()) + total_output_tokens = sum(self.tok_count.values()) + successful = self.num_prompts - len(self.failed_ids) + + req_throughput = successful / self.benchmark_duration + out_tok_throughput = total_output_tokens / self.benchmark_duration + tot_tok_throughput = ( + total_input_tokens + total_output_tokens + ) / self.benchmark_duration + + peak_concurrent = max((r[1] for r in self.step_records), default=0) + + all_tok_events = sorted(ts for tss in self.tok_timestamps.values() for ts in tss) + peak_out_tok_tp = 0.0 + if all_tok_events: + n_ev, j = len(all_tok_events), 0 + for k, t0 in enumerate(all_tok_events): + while j < n_ev and all_tok_events[j] - t0 <= 1.0: + j += 1 + peak_out_tok_tp = max(peak_out_tok_tp, float(j - k)) + + return { + "ttfts": ttfts, + "tpots": tpots, + "itls": itls, + "total_input_tokens": total_input_tokens, + "total_output_tokens": total_output_tokens, + "successful": successful, + "req_throughput": req_throughput, + "out_tok_throughput": out_tok_throughput, + "tot_tok_throughput": tot_tok_throughput, + "peak_concurrent": peak_concurrent, + "peak_out_tok_tp": peak_out_tok_tp, + "benchmark_duration": self.benchmark_duration, + } + + def latency_summary(self, summary: dict[str, object]) -> dict[str, float]: + ttfts = summary["ttfts"] + tpots = summary["tpots"] + itls = summary["itls"] + return { + "mean_ttft_ms": statistics.mean(ttfts) if ttfts else 0.0, + "median_ttft_ms": statistics.median(ttfts) if ttfts else 0.0, + "p99_ttft_ms": percentile(ttfts, 99), + "mean_tpot_ms": statistics.mean(tpots) if tpots else 0.0, + "median_tpot_ms": statistics.median(tpots) if tpots else 0.0, + "p99_tpot_ms": percentile(tpots, 99), + "mean_itl_ms": statistics.mean(itls) if itls else 0.0, + "median_itl_ms": statistics.median(itls) if itls else 0.0, + "p99_itl_ms": percentile(itls, 99), + } + + @staticmethod + def print_pipeline_metrics(metrics) -> None: + print("\nPipeline system metrics:") + print(f" Requests processed: {metrics.requests}") + print(f" Scheduled requests: {metrics.scheduled_requests}") + print(f" Cache usage: {metrics.cache_usage:.2f}%") + print(f" Max cache usage: {metrics.max_cache_usage:.2f}%") + print(f" Average cache usage: {metrics.avg_cache_usage:.2f}%") + + def save_graphs(self, summary: dict[str, object], out_dir: str | Path) -> None: + try: + import matplotlib.pyplot as plt + except Exception: + print("\nGraph generation skipped: matplotlib is not available.") + return + + out_path = Path(out_dir) + out_path.mkdir(parents=True, exist_ok=True) + + # 1) Throughput timeline (tokens/s per scheduler step) + x_sec: list[float] = [] + y_tok_s: list[float] = [] + prev_ts = self.benchmark_start + for step_ts, _concurrent, new_tokens in self.step_records: + dt = step_ts - prev_ts + prev_ts = step_ts + if dt <= 0: + continue + x_sec.append(step_ts - self.benchmark_start) + y_tok_s.append(new_tokens / dt) + + if x_sec and y_tok_s: + fig, ax = plt.subplots(figsize=(8, 4)) + ax.plot(x_sec, y_tok_s, linewidth=1.5) + ax.set_title("Output Throughput Timeline") + ax.set_xlabel("Time Since Start (s)") + ax.set_ylabel("Tokens/s") + ax.grid(True, alpha=0.3) + fig.tight_layout() + fig.savefig(out_path / "throughput_timeline.png", dpi=140) + plt.close(fig) + + # 2) TTFT histogram + ttfts = summary["ttfts"] + if ttfts: + fig, ax = plt.subplots(figsize=(7, 4)) + ax.hist(ttfts, bins=min(30, max(5, len(ttfts) // 2)), alpha=0.85) + ax.set_title("TTFT Distribution") + ax.set_xlabel("TTFT (ms)") + ax.set_ylabel("Count") + ax.grid(True, axis="y", alpha=0.3) + fig.tight_layout() + fig.savefig(out_path / "ttft_hist.png", dpi=140) + plt.close(fig) + + # 3) TPOT histogram + tpots = summary["tpots"] + if tpots: + fig, ax = plt.subplots(figsize=(7, 4)) + ax.hist(tpots, bins=min(30, max(5, len(tpots) // 2)), alpha=0.85) + ax.set_title("TPOT Distribution") + ax.set_xlabel("TPOT (ms)") + ax.set_ylabel("Count") + ax.grid(True, axis="y", alpha=0.3) + fig.tight_layout() + fig.savefig(out_path / "tpot_hist.png", dpi=140) + plt.close(fig) + + # 4) End-to-end latency scatter by request id + req_ids: list[int] = [] + e2e_ms: list[float] = [] + out_toks: list[int] = [] + for i in range(self.num_prompts): + if i in self.arrival_time and i in self.finish_time: + req_ids.append(i) + e2e_ms.append((self.finish_time[i] - self.arrival_time[i]) * 1000) + out_toks.append(self.tok_count[i]) + if req_ids: + fig, ax = plt.subplots(figsize=(8, 4)) + ax.scatter(req_ids, e2e_ms, s=20, alpha=0.8, c=out_toks, cmap="viridis") + ax.set_title("Request End-to-End Latency") + ax.set_xlabel("Request ID") + ax.set_ylabel("Latency (ms)") + ax.grid(True, alpha=0.25) + fig.tight_layout() + fig.savefig(out_path / "request_e2e_scatter.png", dpi=140) + plt.close(fig) + + print(f"\nSaved graphs to: {out_path}") + + def save_sqlite( + self, + summary: dict[str, object], + latency: dict[str, float], + metrics, + db_path: str | Path, + run_meta: dict[str, object], + ) -> int: + db = sqlite3.connect(str(db_path)) + cur = db.cursor() + + cur.execute( + """ + CREATE TABLE IF NOT EXISTS runs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + created_at_utc TEXT NOT NULL, + model_dir TEXT NOT NULL, + device TEXT NOT NULL, + num_prompts INTEGER NOT NULL, + input_len INTEGER NOT NULL, + output_len INTEGER NOT NULL, + prefix_len INTEGER NOT NULL, + max_batched_tokens INTEGER NOT NULL, + max_seqs INTEGER NOT NULL, + cache_size_gb REAL NOT NULL, + dynamic_split_fuse INTEGER NOT NULL, + enable_prefix_cache INTEGER NOT NULL, + benchmark_duration_s REAL NOT NULL, + successful_requests INTEGER NOT NULL, + failed_requests INTEGER NOT NULL, + total_input_tokens INTEGER NOT NULL, + total_output_tokens INTEGER NOT NULL, + req_throughput REAL NOT NULL, + out_tok_throughput REAL NOT NULL, + total_tok_throughput REAL NOT NULL, + peak_output_tok_throughput REAL NOT NULL, + peak_concurrent_requests REAL NOT NULL, + mean_ttft_ms REAL NOT NULL, + median_ttft_ms REAL NOT NULL, + p99_ttft_ms REAL NOT NULL, + mean_tpot_ms REAL NOT NULL, + median_tpot_ms REAL NOT NULL, + p99_tpot_ms REAL NOT NULL, + mean_itl_ms REAL NOT NULL, + median_itl_ms REAL NOT NULL, + p99_itl_ms REAL NOT NULL, + pipeline_requests INTEGER NOT NULL, + pipeline_scheduled_requests INTEGER NOT NULL, + pipeline_cache_usage REAL NOT NULL, + pipeline_max_cache_usage REAL NOT NULL, + pipeline_avg_cache_usage REAL NOT NULL + ) + """ + ) + cur.execute( + """ + CREATE TABLE IF NOT EXISTS request_metrics ( + run_id INTEGER NOT NULL, + request_id INTEGER NOT NULL, + input_tokens INTEGER NOT NULL, + output_tokens INTEGER NOT NULL, + arrival_s REAL, + first_token_s REAL, + finish_s REAL, + ttft_ms REAL, + tpot_ms REAL, + e2e_ms REAL, + status TEXT NOT NULL, + PRIMARY KEY (run_id, request_id), + FOREIGN KEY (run_id) REFERENCES runs(id) + ) + """ + ) + cur.execute( + """ + CREATE TABLE IF NOT EXISTS step_metrics ( + run_id INTEGER NOT NULL, + step_idx INTEGER NOT NULL, + t_rel_s REAL NOT NULL, + concurrent_requests INTEGER NOT NULL, + new_tokens INTEGER NOT NULL, + PRIMARY KEY (run_id, step_idx), + FOREIGN KEY (run_id) REFERENCES runs(id) + ) + """ + ) + + created_at_utc = datetime.now(timezone.utc).isoformat() + cur.execute( + """ + INSERT INTO runs ( + created_at_utc, model_dir, device, num_prompts, input_len, output_len, prefix_len, + max_batched_tokens, max_seqs, cache_size_gb, dynamic_split_fuse, enable_prefix_cache, + benchmark_duration_s, successful_requests, failed_requests, total_input_tokens, + total_output_tokens, req_throughput, out_tok_throughput, total_tok_throughput, + peak_output_tok_throughput, peak_concurrent_requests, mean_ttft_ms, median_ttft_ms, + p99_ttft_ms, mean_tpot_ms, median_tpot_ms, p99_tpot_ms, mean_itl_ms, median_itl_ms, + p99_itl_ms, pipeline_requests, pipeline_scheduled_requests, pipeline_cache_usage, + pipeline_max_cache_usage, pipeline_avg_cache_usage + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + created_at_utc, + str(run_meta["model_dir"]), + str(run_meta["device"]), + int(run_meta["num_prompts"]), + int(run_meta["input_len"]), + int(run_meta["output_len"]), + int(run_meta["prefix_len"]), + int(run_meta["max_batched_tokens"]), + int(run_meta["max_seqs"]), + float(run_meta["cache_size_gb"]), + int(bool(run_meta["dynamic_split_fuse"])), + int(bool(run_meta["enable_prefix_cache"])), + float(summary["benchmark_duration"]), + int(summary["successful"]), + int(self.num_prompts - summary["successful"]), + int(summary["total_input_tokens"]), + int(summary["total_output_tokens"]), + float(summary["req_throughput"]), + float(summary["out_tok_throughput"]), + float(summary["tot_tok_throughput"]), + float(summary["peak_out_tok_tp"]), + float(summary["peak_concurrent"]), + float(latency["mean_ttft_ms"]), + float(latency["median_ttft_ms"]), + float(latency["p99_ttft_ms"]), + float(latency["mean_tpot_ms"]), + float(latency["median_tpot_ms"]), + float(latency["p99_tpot_ms"]), + float(latency["mean_itl_ms"]), + float(latency["median_itl_ms"]), + float(latency["p99_itl_ms"]), + int(metrics.requests), + int(metrics.scheduled_requests), + float(metrics.cache_usage), + float(metrics.max_cache_usage), + float(metrics.avg_cache_usage), + ), + ) + run_id = int(cur.lastrowid) + + req_rows = [] + for i in range(self.num_prompts): + arrival = self.arrival_time.get(i) + first = self.first_tok_time.get(i) + finish = self.finish_time.get(i) + n = len(self.tok_timestamps[i]) + + ttft_ms = (first - arrival) * 1000 if arrival is not None and first is not None else None + tpot_ms = None + if n > 1: + tpot_ms = (self.tok_timestamps[i][-1] - self.tok_timestamps[i][0]) * 1000 / (n - 1) + e2e_ms = (finish - arrival) * 1000 if arrival is not None and finish is not None else None + + status = "finished" if i in self.finished_ids else "unfinished" + req_rows.append( + ( + run_id, + i, + int(self.input_tok_count[i]), + int(self.tok_count[i]), + arrival, + first, + finish, + ttft_ms, + tpot_ms, + e2e_ms, + status, + ) + ) + + cur.executemany( + """ + INSERT INTO request_metrics ( + run_id, request_id, input_tokens, output_tokens, arrival_s, first_token_s, finish_s, + ttft_ms, tpot_ms, e2e_ms, status + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + req_rows, + ) + + step_rows = [] + for step_idx, (step_ts, concurrent, new_tokens) in enumerate(self.step_records): + step_rows.append( + ( + run_id, + step_idx, + float(step_ts - self.benchmark_start), + int(concurrent), + int(new_tokens), + ) + ) + cur.executemany( + """ + INSERT INTO step_metrics ( + run_id, step_idx, t_rel_s, concurrent_requests, new_tokens + ) VALUES (?, ?, ?, ?, ?) + """, + step_rows, + ) + + db.commit() + db.close() + return run_id + + +# ── benchmark ────────────────────────────────────────────────────────────────── + +num_prompts = len(prompts) +print(f"Starting benchmark with {num_prompts} prompts…") +print("-" * 50) + +bench_data = vLLMBenchData(genai_tokenizer, prompts) +bench_data.start() + +# Submit every request before the step loop so the scheduler sees the full queue +handles = [] +for i, prompt in enumerate(prompts): + bench_data.mark_arrival(i) + handle = pipeline.add_request(i, prompt, generation_config) + handles.append(handle) + +# Step loop — read token-level output after each scheduler step +while pipeline.has_non_finished_requests(): + concurrent_now = num_prompts - len(bench_data.finished_ids) + pipeline.step() + step_ts = time.perf_counter() + step_new_toks = 0 + + for i, handle in enumerate(handles): + if i in bench_data.finished_ids or not handle.can_read(): + continue + + # read() returns {seq_idx: GenerationOutput} with the tokens from this step + for output in handle.read().values(): + step_new_toks += bench_data.consume_output(i, output, step_ts) + + bench_data.add_step(step_ts, concurrent_now, step_new_toks) + +bench_data.stop() +summary = bench_data.aggregate() +lat = bench_data.latency_summary(summary) + +# ── report ───────────────────────────────────────────────────────────────────── + +W = 50 + +def _row(label: str, value) -> None: + if isinstance(value, float): + vs = f"{value:.2f}" + else: + vs = str(value) + print(_report_row(label, vs, W)) + +print() +print(_section(" Serving Benchmark Result ", "=", W)) +_row("Successful requests:", summary["successful"]) +_row("Failed requests:", len(bench_data.failed_ids)) +_row("Benchmark duration (s):", summary["benchmark_duration"]) +_row("Total input tokens:", summary["total_input_tokens"]) +_row("Total generated tokens:", summary["total_output_tokens"]) +_row("Request throughput (req/s):", summary["req_throughput"]) +_row("Output token throughput (tok/s):", summary["out_tok_throughput"]) +_row("Peak output token throughput (tok/s):", summary["peak_out_tok_tp"]) +_row("Peak concurrent requests:", float(summary["peak_concurrent"])) +_row("Total token throughput (tok/s):", summary["tot_tok_throughput"]) +print(_section("Time to First Token", "-", W)) +_row("Mean TTFT (ms):", lat["mean_ttft_ms"]) +_row("Median TTFT (ms):", lat["median_ttft_ms"]) +_row("P99 TTFT (ms):", lat["p99_ttft_ms"]) +print(_section("Time per Output Token (excl. 1st token)", "-", W)) +_row("Mean TPOT (ms):", lat["mean_tpot_ms"]) +_row("Median TPOT (ms):", lat["median_tpot_ms"]) +_row("P99 TPOT (ms):", lat["p99_tpot_ms"]) +print(_section("Inter-token Latency", "-", W)) +_row("Mean ITL (ms):", lat["mean_itl_ms"]) +_row("Median ITL (ms):", lat["median_itl_ms"]) +_row("P99 ITL (ms):", lat["p99_itl_ms"]) +print("=" * W) + +# ── pipeline system metrics ──────────────────────────────────────────────────── + +metrics = pipeline.get_metrics() +bench_data.print_pipeline_metrics(metrics) +bench_data.save_graphs(summary, GRAPH_OUTPUT_DIR) +run_meta = { + "model_dir": MODEL_DIR, + "device": DEVICE, + "num_prompts": NUM_REQUESTS, + "input_len": INPUT_LEN, + "output_len": OUTPUT_LEN, + "prefix_len": PREFIX_LEN, + "max_batched_tokens": MAX_BATCHED_TOKENS, + "max_seqs": MAX_SEQS, + "cache_size_gb": CACHE_SIZE_GB, + "dynamic_split_fuse": DYNAMIC_SPLIT_FUSE, + "enable_prefix_cache": ENABLE_PREFIX_CACHE, +} +run_id = bench_data.save_sqlite(summary, lat, metrics, SQLITE_DB_PATH, run_meta) +print(f"Saved benchmark to SQLite: {SQLITE_DB_PATH} (run_id={run_id})") + +# ── sample outputs ───────────────────────────────────────────────────────────── + +print("\nSample outputs (first 5 requests):") +print("=" * W) +for i in range(min(5, num_prompts)): + text = genai_tokenizer.decode(bench_data.tok_ids[i]) + print(f"[{i}] prompt : {prompts[i][:80].strip()!r}") + print(f"[{i}] output : {text[:200].strip()!r}") + print("-" * W) diff --git a/src/server/model_registry.py b/src/server/model_registry.py index f6824dc3..47c5e32a 100644 --- a/src/server/model_registry.py +++ b/src/server/model_registry.py @@ -224,6 +224,8 @@ async def status(self) -> dict: MODEL_CLASS_REGISTRY = { (EngineType.OV_GENAI, ModelType.LLM): "src.engine.ov_genai.llm.OVGenAI_LLM", (EngineType.OV_GENAI, ModelType.VLM): "src.engine.ov_genai.vlm.OVGenAI_VLM", + (EngineType.OV_GENAI, ModelType.CB_LLM): "src.engine.ov_genai.continuous_batching.cb_adapter_llm.ArcCBLLM", + (EngineType.OV_GENAI, ModelType.CB_VLM): "src.engine.ov_genai.continuous_batching.cb_adapter_vlm.ArcCBVLM", (EngineType.OV_GENAI, ModelType.WHISPER): "src.engine.ov_genai.whisper.OVGenAI_Whisper", (EngineType.OPENVINO, ModelType.QWEN3_ASR): "src.engine.openvino.qwen3_asr.qwen3_asr.OVQwen3ASR", (EngineType.OPENVINO, ModelType.KOKORO): "src.engine.openvino.kokoro.OV_Kokoro", @@ -257,5 +259,3 @@ async def create_model_instance(load_config: ModelLoadConfig) -> Any: model_instance = model_class(load_config) await asyncio.to_thread(model_instance.load_model, load_config) return model_instance - - \ No newline at end of file diff --git a/src/server/models/ov_genai.py b/src/server/models/ov_genai.py index 24850c8a..e4c68fda 100644 --- a/src/server/models/ov_genai.py +++ b/src/server/models/ov_genai.py @@ -93,6 +93,16 @@ def text_messages(self) -> List[Dict[str, Any]]: class OVGenAI_WhisperGenConfig(BaseModel): audio_base64: str = Field(..., description="Base64 encoded audio") + +class ContinuousBatchSchedulerConfig(BaseModel): + max_num_batched_tokens: int = Field(default=2048, description="Maximum number of tokens to batch together") + max_num_seqs: int = Field(default=8, description="Maximum number of sequences (batch size)") + cache_size: int = Field(default=6, description="KV cache size in GB") + dynamic_split_fuse: bool = Field(default=True, description="Split prompt/generate phases") + enable_prefix_caching: bool = Field(default=True, description="Enable KV-block caching") + use_cache_eviction: bool = Field(default=False, description="Use cache eviction") + + VLM_VISION_TOKENS = { "internvl2": "", "llava15": "", @@ -107,4 +117,3 @@ class OVGenAI_WhisperGenConfig(BaseModel): "gemma4": "<|image><|image|>" } - diff --git a/src/server/models/registration.py b/src/server/models/registration.py index 513d2d6c..332342f3 100644 --- a/src/server/models/registration.py +++ b/src/server/models/registration.py @@ -3,7 +3,7 @@ from pydantic import BaseModel, Field, field_validator -from src.server.models.ov_genai import VLM_VISION_TOKENS +from src.server.models.ov_genai import ContinuousBatchSchedulerConfig, VLM_VISION_TOKENS class ModelStatus(str, Enum): @@ -26,6 +26,8 @@ class ModelType(str, Enum): Options: - llm: Text-to-text LLM models - vlm: Image-to-text VLM models + - cb_llm: Continuous batching text-to-text LLM models + - cb_vlm: Continuous batching image-to-text VLM models - whisper: Whisper ASR models - qwen3_asr: Qwen3 ASR models - kokoro: Kokoro TTS models @@ -37,6 +39,8 @@ class ModelType(str, Enum): LLM = "llm" VLM = "vlm" + CB_LLM = "cb_llm" + CB_VLM = "cb_vlm" WHISPER = "whisper" QWEN3_ASR = "qwen3_asr" KOKORO = "kokoro" @@ -87,6 +91,9 @@ class ModelLoadConfig(BaseModel): runtime_config: Dict[str, Any] = Field( default_factory=dict, description="Optional OpenVINO runtime properties.") + cb_config: ContinuousBatchSchedulerConfig = Field( + default_factory=ContinuousBatchSchedulerConfig, + description="Optional OpenVINO GenAI continuous batching scheduler properties.") draft_model_path: Optional[str] = Field( default=None, @@ -118,4 +125,3 @@ def validate_vlm_type(cls, v, info): class ModelUnloadConfig(BaseModel): model_name: str = Field(..., description="Name of the model to unload") -