• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<div height="0" hidden="true">
4
5<div id="issue3651_7">
6seg=1 {{{68.1999969f, 74.8000031f}, {68.4444427f, 74.8000031f}, {68.6888885f, 74.8039017f}, {68.9333344f, 74.8078003f}}}
7seg=2 {{{68.9333344f, 74.8078003f}, {69.422226f, 74.8155975f}, {69.9111099f, 74.8233948f}, {70.4000015f, 74.8000031f}}}
8seg=3 {{{70.4000015f, 74.8000031f}, {70.7796326f, 74.7818375f}, {71.1592636f, 74.7372665f}, {71.5388947f, 74.6926956f}}}
9seg=4 {{{71.5388947f, 74.6926956f}, {71.8925934f, 74.6511688f}, {72.2462997f, 74.609642f}, {72.5999985f, 74.5894699f}}}
10seg=5 {{{72.5999985f, 74.5894699f}, {73.1301117f, 74.5592346f}, {73.6602249f, 74.5564957f}, {74.1903381f, 74.5537567f}}}
11seg=6 {{{74.1903381f, 74.5537567f}, {74.3935623f, 74.5527115f}, {74.5967789f, 74.5516663f}, {74.8000031f, 74.5490646f}}}
12seg=7 {{{74.8000031f, 74.5490646f}, {75.0211792f, 74.5462341f}, {75.242363f, 74.5398636f}, {75.4635391f, 74.5335007f}}}
13seg=8 {{{75.4635391f, 74.5335007f}, {75.9756927f, 74.5187607f}, {76.4878464f, 74.5040207f}, {77, 74.5332108f}}}
14seg=9 {{{77, 74.5332108f}, {77.3702316f, 74.5543137f}, {77.7404709f, 74.610733f}, {78.1107025f, 74.66716f}}}
15seg=10 {{{78.1107025f, 74.66716f}, {78.4738007f, 74.722496f}, {78.8368988f, 74.777832f}, {79.1999969f, 74.7998505f}}}
16seg=11 {{{79.1999969f, 74.7998505f}, {79.689003f, 74.8295059f}, {80.1780014f, 74.819664f}, {80.6670074f, 74.8098221f}}}
17seg=12 {{{80.6670074f, 74.8098221f}, {80.9113388f, 74.8049088f}, {81.1556702f, 74.7999954f}, {81.4000015f, 74.8000031f}}}
18seg=13 {{{81.4000015f, 74.8000031f}, {81.6438522f, 74.8000107f}, {81.8877106f, 74.8010635f}, {82.1315613f, 74.8021164f}}}
19seg=14 {{{82.1315613f, 74.8021164f}, {82.6210403f, 74.8042297f}, {83.1105194f, 74.8063507f}, {83.5999985f, 74.8000031f}}}
20seg=15 {{{83.5999985f, 74.8000031f}, {83.9259109f, 74.7957764f}, {84.2518234f, 74.7840347f}, {84.5777359f, 74.7722931f}}}
21seg=16 {{{84.5777359f, 74.7722931f}, {84.9851608f, 74.7576141f}, {85.3925781f, 74.7429352f}, {85.8000031f, 74.7429352f}}}
22seg=17 {{{85.8000031f, 74.7429352f}, {86.2074203f, 74.7429352f}, {86.6148453f, 74.7576141f}, {87.0222626f, 74.7722931f}}}
23seg=18 {{{87.0222626f, 74.7722931f}, {87.348175f, 74.7840347f}, {87.6740875f, 74.7957764f}, {88, 74.8000031f}}}
24seg=19 {{{88, 74.8000031f}, {88.1576462f, 74.8020477f}, {88.3152924f, 74.8048859f}, {88.4729385f, 74.8077316f}}}
25seg=20 {{{88.4729385f, 74.8077316f}, {89.0486221f, 74.8181076f}, {89.6243134f, 74.8284836f}, {90.1999969f, 74.8000031f}}}
26seg=21 {{{90.1999969f, 74.8000031f}, {90.5620499f, 74.7820892f}, {90.9241028f, 74.7369537f}, {91.2861557f, 74.6918182f}}}
27seg=22 {{{91.2861557f, 74.6918182f}, {91.6574402f, 74.6455307f}, {92.028717f, 74.5992432f}, {92.4000015f, 74.5823135f}}}
28seg=23 {{{92.4000015f, 74.5823135f}, {92.9111481f, 74.5590057f}, {93.4223022f, 74.5721283f}, {93.9334488f, 74.5852509f}}}
29seg=24 {{{93.9334488f, 74.5852509f}, {94.155632f, 74.59095f}, {94.3778152f, 74.5966568f}, {94.5999985f, 74.5993652f}}}
30seg=25 {{{94.5999985f, 74.5993652f}, {94.8669891f, 74.602623f}, {95.1339798f, 74.6110153f}, {95.4009705f, 74.6194f}}}
31seg=26 {{{95.4009705f, 74.6194f}, {95.8673172f, 74.6340485f}, {96.3336563f, 74.6486969f}, {96.8000031f, 74.6360168f}}}
32seg=27 {{{96.8000031f, 74.6360168f}, {97.2396164f, 74.624054f}, {97.6792297f, 74.5860596f}, {98.1188431f, 74.5480652f}}}
33seg=28 {{{98.1188431f, 74.5480652f}, {98.4125595f, 74.5226822f}, {98.7062836f, 74.4972992f}, {99, 74.4796829f}}}
34seg=29 {{{99, 74.4796829f}, {99.7333298f, 74.4356995f}, {100.466667f, 74.3924866f}, {101.199997f, 74.3721085f}}}
35seg=30 {{{101.199997f, 74.3721085f}, {101.6632f, 74.3592453f}, {102.126396f, 74.3594589f}, {102.5896f, 74.3596725f}}}
36seg=31 {{{102.5896f, 74.3596725f}, {102.859734f, 74.3597946f}, {103.129868f, 74.3599167f}, {103.400002f, 74.3574448f}}}
37seg=32 {{{103.400002f, 74.3574448f}, {103.499123f, 74.3565369f}, {103.598244f, 74.3556519f}, {103.697365f, 74.3547668f}}}
38seg=33 {{{103.697365f, 74.3547668f}, {104.331573f, 74.3491211f}, {104.96579f, 74.3434753f}, {105.599998f, 74.3318787f}}}
39seg=34 {{{105.599998f, 74.3318787f}, {105.951164f, 74.3254547f}, {106.30233f, 74.3153458f}, {106.653496f, 74.3052368f}}}
40seg=35 {{{106.653496f, 74.3052368f}, {107.035667f, 74.2942352f}, {107.417831f, 74.2832336f}, {107.800003f, 74.2769852f}}}
41seg=36 {{{107.800003f, 74.2769852f}, {107.904305f, 74.2752838f}, {108.008606f, 74.2734833f}, {108.112907f, 74.2716827f}}}
42seg=37 {{{108.112907f, 74.2716827f}, {108.741936f, 74.2608261f}, {109.370972f, 74.2499771f}, {110, 74.2599411f}}}
43seg=38 {{{110, 74.2599411f}, {110.73333f, 74.2715607f}, {111.466667f, 74.3080215f}, {112.199997f, 74.3467178f}}}
44seg=39 {{{112.199997f, 74.3467178f}, {112.524193f, 74.3638306f}, {112.848389f, 74.3887024f}, {113.172585f, 74.4135742f}}}
45seg=40 {{{113.172585f, 74.4135742f}, {113.581726f, 74.4449615f}, {113.99086f, 74.4763565f}, {114.400002f, 74.4921417f}}}
46seg=41 {{{114.400002f, 74.4921417f}, {115.133331f, 74.5204391f}, {115.866669f, 74.5265198f}, {116.599998f, 74.5165176f}}}
47seg=42 {{{116.599998f, 74.5165176f}, {117.013039f, 74.5108871f}, {117.426071f, 74.4911652f}, {117.839111f, 74.4714432f}}}
48seg=43 {{{117.839111f, 74.4714432f}, {118.159409f, 74.4561462f}, {118.479706f, 74.4408493f}, {118.800003f, 74.4321289f}}}
49seg=44 {{{118.800003f, 74.4321289f}, {118.915619f, 74.428978f}, {119.031235f, 74.4256439f}, {119.146851f, 74.4223099f}}}
50seg=45 {{{119.146851f, 74.4223099f}, {119.764565f, 74.4045105f}, {120.382286f, 74.3867035f}, {121, 74.3966675f}}}
51seg=46 {{{121, 74.3966675f}, {121.552635f, 74.405571f}, {122.105278f, 74.4385529f}, {122.657913f, 74.4715347f}}}
52seg=47 {{{122.657913f, 74.4715347f}, {122.838608f, 74.4823227f}, {123.019302f, 74.4931107f}, {123.199997f, 74.5030518f}}}
53seg=48 {{{123.199997f, 74.5030518f}, {123.480431f, 74.5184784f}, {123.760864f, 74.5394821f}, {124.041298f, 74.5604858f}}}
54seg=49 {{{124.041298f, 74.5604858f}, {124.494202f, 74.5943985f}, {124.947098f, 74.6283112f}, {125.400002f, 74.6387558f}}}
55seg=50 {{{125.400002f, 74.6387558f}, {126.133331f, 74.6556625f}, {126.866669f, 74.6397476f}, {127.599998f, 74.6044846f}}}
56seg=51 {{{127.599998f, 74.6044846f}, {128.17691f, 74.5767441f}, {128.75383f, 74.5233994f}, {129.33075f, 74.4700623f}}}
57seg=52 {{{129.33075f, 74.4700623f}, {129.487167f, 74.4555969f}, {129.643585f, 74.4411316f}, {129.800003f, 74.4271774f}}}
58seg=53 {{{129.800003f, 74.4271774f}, {130.08493f, 74.4017639f}, {130.369843f, 74.3696442f}, {130.65477f, 74.3375244f}}}
59seg=54 {{{130.65477f, 74.3375244f}, {131.10318f, 74.2869797f}, {131.55159f, 74.2364349f}, {132, 74.2120285f}}}
60seg=55 {{{132, 74.2120285f}, {132.682098f, 74.1748962f}, {133.364182f, 74.1806335f}, {134.04628f, 74.1863708f}}}
61seg=56 {{{134.04628f, 74.1863708f}, {134.199997f, 74.1876526f}}}
62seg=57 {{{134.199997f, 74.1876526f}, {134.740479f, 74.1920013f}, {135.28096f, 74.2102814f}, {135.821426f, 74.2285538f}}}
63seg=58 {{{135.821426f, 74.2285538f}, {136.014282f, 74.2350769f}, {136.207138f, 74.2416f}, {136.399994f, 74.2474899f}}}
64seg=59 {{{136.399994f, 74.2474899f}, {136.723831f, 74.2573776f}, {137.047668f, 74.2692032f}, {137.371506f, 74.2810364f}}}
65seg=60 {{{137.371506f, 74.2810364f}, {137.781006f, 74.2959976f}, {138.190506f, 74.3109589f}, {138.600006f, 74.3219833f}}}
66seg=61 {{{138.600006f, 74.3219833f}, {138.775055f, 74.3266983f}, {138.950119f, 74.3321457f}, {139.125183f, 74.3375931f}}}
67seg=62 {{{139.125183f, 74.3375931f}, {139.683456f, 74.3549652f}, {140.24173f, 74.3723373f}, {140.800003f, 74.3659744f}}}
68seg=63 {{{140.800003f, 74.3659744f}, {141.173523f, 74.3617172f}, {141.547028f, 74.3401871f}, {141.920547f, 74.3186493f}}}
69seg=64 {{{141.920547f, 74.3186493f}, {142.280365f, 74.297905f}, {142.640182f, 74.2771606f}, {143, 74.2718658f}}}
70seg=65 {{{143, 74.2718658f}, {143.733337f, 74.2610703f}, {144.46666f, 74.2575989f}, {145.199997f, 74.3011856f}}}
71seg=66 {{{145.199997f, 74.3011856f}, {145.574966f, 74.3234711f}, {145.949936f, 74.3711548f}, {146.32489f, 74.4188385f}}}
72seg=67 {{{146.32489f, 74.4188385f}, {146.683258f, 74.4644165f}, {147.041626f, 74.5099869f}, {147.399994f, 74.5333862f}}}
73seg=68 {{{147.399994f, 74.5333862f}, {148.133331f, 74.5812607f}, {148.866669f, 74.6018982f}, {149.600006f, 74.5884552f}}}
74seg=69 {{{149.600006f, 74.5884552f}, {149.982086f, 74.5814514f}, {150.364182f, 74.5504913f}, {150.746277f, 74.5195313f}}}
75seg=70 {{{150.746277f, 74.5195313f}, {151.097519f, 74.491066f}, {151.448761f, 74.4626007f}, {151.800003f, 74.4527512f}}}
76seg=71 {{{151.800003f, 74.4527512f}, {152.343307f, 74.4375076f}, {152.886597f, 74.4468765f}, {153.429901f, 74.4562454f}}}
77seg=72 {{{153.429901f, 74.4562454f}, {153.619934f, 74.4595261f}, {153.809967f, 74.4627991f}, {154, 74.4650269f}}}
78seg=73 {{{154, 74.4650269f}, {154.295746f, 74.4684906f}, {154.591476f, 74.4761581f}, {154.887222f, 74.4838257f}}}
79seg=74 {{{154.887222f, 74.4838257f}, {155.324814f, 74.4951782f}, {155.762405f, 74.5065308f}, {156.199997f, 74.5042419f}}}
80seg=75 {{{156.199997f, 74.5042419f}, {156.559143f, 74.5023651f}, {156.918289f, 74.487793f}, {157.27742f, 74.4732208f}}}
81seg=76 {{{157.27742f, 74.4732208f}, {157.651611f, 74.4580307f}, {158.025803f, 74.4428406f}, {158.399994f, 74.4420166f}}}
82seg=77 {{{158.399994f, 74.4420166f}, {159.133331f, 74.4403992f}, {159.866669f, 74.448494f}, {160.600006f, 74.4945221f}}}
83seg=78 {{{160.600006f, 74.4945221f}, {160.952393f, 74.5166473f}, {161.304794f, 74.5602722f}, {161.657196f, 74.6038971f}}}
84seg=79 {{{161.657196f, 74.6038971f}, {162.038132f, 74.6510468f}, {162.419067f, 74.698204f}, {162.800003f, 74.7182007f}}}
85seg=80 {{{162.800003f, 74.7182007f}, {163.53334f, 74.7566986f}, {164.266663f, 74.7636337f}, {165, 74.7255325f}}}
86seg=81 {{{165, 74.7255325f}, {165.356293f, 74.7070236f}, {165.712585f, 74.65802f}, {166.068878f, 74.6090164f}}}
87seg=82 {{{166.068878f, 74.6090164f}, {166.445923f, 74.5571594f}, {166.822952f, 74.5053024f}, {167.199997f, 74.4895782f}}}
88seg=83 {{{167.199997f, 74.4895782f}, {167.933334f, 74.4590073f}, {168.666672f, 74.4903488f}, {169.399994f, 74.5420837f}}}
89seg=84 {{{169.399994f, 74.5420837f}, {169.752808f, 74.5669785f}, {170.105621f, 74.6176682f}, {170.458435f, 74.6683578f}}}
90seg=85 {{{170.458435f, 74.6683578f}, {170.838959f, 74.7230225f}, {171.219482f, 74.7776947f}, {171.600006f, 74.8000031f}}}
91seg=86 {{{171.600006f, 74.8000031f}, {172.333328f, 74.8429871f}, {173.066666f, 74.8376999f}, {173.800003f, 74.8000031f}}}
92seg=87 {{{173.800003f, 74.8000031f}, {174.500809f, 74.7639694f}, {175.201599f, 74.6750717f}, {175.902405f, 74.5861664f}}}
93seg=88 {{{175.902405f, 74.5861664f}, {176, 74.5737915f}}}
94seg=89 {{{176, 74.5737915f}, {176.306427f, 74.5349655f}, {176.612839f, 74.4810333f}, {176.919266f, 74.4270935f}}}
95seg=90 {{{176.919266f, 74.4270935f}, {177.346176f, 74.3519516f}, {177.773087f, 74.2768097f}, {178.199997f, 74.2425385f}}}
96seg=91 {{{178.199997f, 74.2425385f}, {178.933334f, 74.18367f}, {179.666672f, 74.1942673f}, {180.399994f, 74.2205505f}}}
97seg=92 {{{180.399994f, 74.2205505f}, {180.822174f, 74.2356796f}, {181.244354f, 74.2772751f}, {181.666534f, 74.3188705f}}}
98seg=93 {{{181.666534f, 74.3188705f}, {181.977692f, 74.3495255f}, {182.288849f, 74.3801804f}, {182.600006f, 74.400238f}}}
99seg=94 {{{182.600006f, 74.400238f}, {183.153549f, 74.435936f}, {183.707108f, 74.4587555f}, {184.260666f, 74.481575f}}}
100seg=95 {{{184.260666f, 74.481575f}, {184.440445f, 74.4889832f}, {184.620224f, 74.4963913f}, {184.800003f, 74.5042419f}}}
101seg=96 {{{184.800003f, 74.5042419f}, {185.53334f, 74.5362625f}, {186.266663f, 74.5669022f}, {187, 74.5923843f}}}
102seg=97 {{{187, 74.5923843f}, {187.218643f, 74.5999832f}, {187.437286f, 74.6105118f}, {187.65593f, 74.6210403f}}}
103seg=98 {{{187.65593f, 74.6210403f}, {188.170624f, 74.6458359f}, {188.685303f, 74.6706314f}, {189.199997f, 74.6571732f}}}
104seg=99 {{{189.199997f, 74.6571732f}, {189.560562f, 74.6477432f}, {189.921127f, 74.6077042f}, {190.281693f, 74.5676651f}}}
105seg=100 {{{190.281693f, 74.5676651f}, {190.654465f, 74.526268f}, {191.027237f, 74.4848709f}, {191.399994f, 74.4773026f}}}
106seg=101 {{{191.399994f, 74.4773026f}, {191.942627f, 74.4662857f}, {192.48526f, 74.5001678f}, {193.027893f, 74.5340576f}}}
107seg=102 {{{193.027893f, 74.5340576f}, {193.218597f, 74.5459671f}, {193.409302f, 74.5578766f}, {193.600006f, 74.5678329f}}}
108seg=103 {{{193.600006f, 74.5678329f}, {193.897125f, 74.5833511f}, {194.19426f, 74.6063919f}, {194.491394f, 74.6294403f}}}
109seg=104 {{{194.491394f, 74.6294403f}, {194.927597f, 74.663269f}, {195.3638f, 74.6970978f}, {195.800003f, 74.7071152f}}}
110seg=105 {{{195.800003f, 74.7071152f}, {196.363327f, 74.7200546f}, {196.926636f, 74.7021637f}, {197.48996f, 74.6842728f}}}
111seg=106 {{{197.48996f, 74.6842728f}, {197.659973f, 74.6788712f}, {197.829987f, 74.6734695f}, {198, 74.6689148f}}}
112seg=107 {{{198, 74.6689148f}, {198.539948f, 74.6544571f}, {199.07988f, 74.6331635f}, {199.619827f, 74.6118698f}}}
113seg=108 {{{199.619827f, 74.6118698f}, {199.813217f, 74.6042404f}, {200.006607f, 74.596611f}, {200.199997f, 74.5892944f}}}
114seg=109 {{{200.199997f, 74.5892944f}, {200.468765f, 74.5791321f}, {200.737534f, 74.5671921f}, {201.006287f, 74.5552597f}}}
115seg=110 {{{201.006287f, 74.5552597f}, {201.470856f, 74.5346298f}, {201.935425f, 74.5139999f}, {202.399994f, 74.5025177f}}}
116seg=111 {{{202.399994f, 74.5025177f}, {202.888885f, 74.4904327f}, {203.377777f, 74.4879456f}, {203.866669f, 74.4854507f}}}
117seg=112 {{{203.866669f, 74.4854507f}, {204.111115f, 74.4842072f}, {204.35556f, 74.4829636f}, {204.600006f, 74.4805222f}}}
118seg=113 {{{204.600006f, 74.4805222f}, {204.84462f, 74.4780731f}, {205.089233f, 74.476059f}, {205.333847f, 74.4740448f}}}
119seg=114 {{{205.333847f, 74.4740448f}, {205.822556f, 74.4700241f}, {206.311279f, 74.4659958f}, {206.800003f, 74.4585342f}}}
120seg=115 {{{206.800003f, 74.4585342f}, {207.53334f, 74.4473343f}, {208.266663f, 74.4324722f}, {209, 74.413353f}}}
121seg=116 {{{209, 74.413353f}, {209.350708f, 74.404213f}, {209.701416f, 74.3919983f}, {210.052124f, 74.3797836f}}}
122seg=117 {{{210.052124f, 74.3797836f}, {210.434753f, 74.3664627f}, {210.817368f, 74.3531418f}, {211.199997f, 74.3438034f}}}
123seg=118 {{{211.199997f, 74.3438034f}, {211.933334f, 74.3259048f}, {212.666672f, 74.3128586f}, {213.399994f, 74.305954f}}}
124seg=119 {{{213.399994f, 74.305954f}, {214.133331f, 74.2990494f}, {214.866669f, 74.2958145f}, {215.600006f, 74.3023758f}}}
125seg=120 {{{215.600006f, 74.3023758f}, {216.076187f, 74.3066406f}, {216.552383f, 74.317627f}, {217.02858f, 74.3286133f}}}
126seg=121 {{{217.02858f, 74.3286133f}, {217.285721f, 74.334549f}, {217.542862f, 74.340477f}, {217.800003f, 74.3453522f}}}
127seg=122 {{{217.800003f, 74.3453522f}, {218.041779f, 74.3499298f}, {218.283554f, 74.358696f}, {218.52533f, 74.3674622f}}}
128seg=123 {{{218.52533f, 74.3674622f}, {219.016891f, 74.3852844f}, {219.508438f, 74.4031067f}, {220, 74.3857574f}}}
129seg=124 {{{220, 74.3857574f}, {220.409988f, 74.3712845f}, {220.819977f, 74.3263474f}, {221.229965f, 74.2814102f}}}
130seg=125 {{{221.229965f, 74.2814102f}, {221.553314f, 74.2459717f}, {221.876648f, 74.2105331f}, {222.199997f, 74.190033f}}}
131seg=126 {{{222.199997f, 74.190033f}, {222.933334f, 74.1435471f}, {223.666672f, 74.1037674f}, {224.399994f, 74.1068344f}}}
132seg=127 {{{224.399994f, 74.1068344f}, {224.885803f, 74.1088638f}, {225.371613f, 74.1381073f}, {225.857422f, 74.1673508f}}}
133seg=128 {{{225.857422f, 74.1673508f}, {226.10495f, 74.182251f}, {226.352478f, 74.1971512f}, {226.600006f, 74.2084503f}}}
134seg=129 {{{226.600006f, 74.2084503f}, {226.839722f, 74.2193909f}, {227.079437f, 74.2324677f}, {227.319153f, 74.2455521f}}}
135seg=130 {{{227.319153f, 74.2455521f}, {227.812759f, 74.2724838f}, {228.306381f, 74.2994156f}, {228.800003f, 74.3076782f}}}
136seg=131 {{{228.800003f, 74.3076782f}, {229.309921f, 74.3162155f}, {229.819824f, 74.3054352f}, {230.329742f, 74.2946548f}}}
137seg=132 {{{230.329742f, 74.2946548f}, {230.553162f, 74.2899323f}, {230.776581f, 74.2852097f}, {231, 74.2821121f}}}
138seg=133 {{{231, 74.2821121f}, {231.290405f, 74.2780838f}, {231.580811f, 74.2724228f}, {231.871216f, 74.2667542f}}}
139seg=134 {{{231.871216f, 74.2667542f}, {232.314148f, 74.2581177f}, {232.757065f, 74.2494812f}, {233.199997f, 74.2466507f}}}
140seg=135 {{{233.199997f, 74.2466507f}, {233.343719f, 74.2457352f}, {233.487442f, 74.2448959f}, {233.631165f, 74.2442474f}}}
141seg=136 {{{233.631165f, 74.2442474f}, {234.220779f, 74.2415924f}, {234.810394f, 74.2421951f}, {235.399994f, 74.2539825f}}}
142seg=137 {{{235.399994f, 74.2539825f}, {235.845032f, 74.2628784f}, {236.29007f, 74.2817612f}, {236.735107f, 74.3006439f}}}
143seg=138 {{{236.735107f, 74.3006439f}, {237.023407f, 74.3128738f}, {237.311707f, 74.3251038f}, {237.600006f, 74.3346176f}}}
144seg=139 {{{237.600006f, 74.3346176f}, {238.333328f, 74.3588257f}, {239.066666f, 74.3803329f}, {239.800003f, 74.3992233f}}}
145seg=140 {{{239.800003f, 74.3992233f}, {240.082169f, 74.4064941f}, {240.364334f, 74.4108353f}, {240.6465f, 74.4151764f}}}
146seg=141 {{{240.6465f, 74.4151764f}, {241.097672f, 74.4221191f}, {241.548828f, 74.4290695f}, {242, 74.4479828f}}}
147seg=142 {{{242, 74.4479828f}, {242.416458f, 74.4654388f}, {242.832916f, 74.4942093f}, {243.249374f, 74.5229874f}}}
148seg=143 {{{243.249374f, 74.5229874f}, {243.566254f, 74.5448837f}, {243.883118f, 74.5667801f}, {244.199997f, 74.5836868f}}}
149seg=144 {{{244.199997f, 74.5836868f}, {244.933334f, 74.6228104f}, {245.666672f, 74.6546402f}, {246.399994f, 74.6827393f}}}
150seg=145 {{{246.399994f, 74.6827393f}, {247.133331f, 74.7108383f}, {247.866669f, 74.7327499f}, {248.600006f, 74.7522964f}}}
151seg=146 {{{248.600006f, 74.7522964f}, {248.714218f, 74.7553406f}}}
152seg=147 {{{248.714218f, 74.7553406f}, {249.40947f, 74.7739029f}, {250.104736f, 74.7924576f}, {250.800003f, 74.8000031f}}}
153seg=148 {{{250.800003f, 74.8000031f}, {251.288895f, 74.8053055f}, {251.777771f, 74.8035355f}, {252.266663f, 74.8017731f}}}
154seg=149 {{{252.266663f, 74.8017731f}, {252.511108f, 74.8008881f}, {252.755554f, 74.8000031f}, {253, 74.8000031f}}}
155seg=150 {{{253, 74.8000031f}, {68.1999969f, 74.8000031f}}}
156op union
157seg=151 {{{68.1999969f, 74.8000031f}, {68.4444427f, 74.8000031f}, {68.6888885f, 74.7961044f}, {68.9333344f, 74.7922058f}}}
158seg=152 {{{68.9333344f, 74.7922058f}, {69.422226f, 74.7844086f}, {69.9111099f, 74.7766113f}, {70.4000015f, 74.8000031f}}}
159seg=153 {{{70.4000015f, 74.8000031f}, {70.7796326f, 74.8181686f}, {71.1592636f, 74.8627396f}, {71.5388947f, 74.9073105f}}}
160seg=154 {{{71.5388947f, 74.9073105f}, {71.8925934f, 74.9488373f}, {72.2462997f, 74.9903641f}, {72.5999985f, 75.0105362f}}}
161seg=155 {{{72.5999985f, 75.0105362f}, {73.1301117f, 75.0407715f}, {73.6602249f, 75.0435104f}, {74.1903381f, 75.0462494f}}}
162seg=156 {{{74.1903381f, 75.0462494f}, {74.3935623f, 75.0472946f}, {74.5967789f, 75.0483398f}, {74.8000031f, 75.0509415f}}}
163seg=157 {{{74.8000031f, 75.0509415f}, {75.0211792f, 75.053772f}, {75.242363f, 75.0601425f}, {75.4635391f, 75.0665054f}}}
164seg=158 {{{75.4635391f, 75.0665054f}, {75.9756927f, 75.0812454f}, {76.4878464f, 75.0959854f}, {77, 75.0667953f}}}
165seg=159 {{{77, 75.0667953f}, {77.3702316f, 75.0456924f}, {77.7404709f, 74.9892731f}, {78.1107025f, 74.9328461f}}}
166seg=160 {{{78.1107025f, 74.9328461f}, {78.4738007f, 74.8775101f}, {78.8368988f, 74.8221741f}, {79.1999969f, 74.8001556f}}}
167seg=161 {{{79.1999969f, 74.8001556f}, {79.689003f, 74.7705002f}, {80.1780014f, 74.7803421f}, {80.6670074f, 74.790184f}}}
168seg=162 {{{80.6670074f, 74.790184f}, {80.9113388f, 74.7950974f}, {81.1556702f, 74.8000107f}, {81.4000015f, 74.8000031f}}}
169seg=163 {{{81.4000015f, 74.8000031f}, {81.6438522f, 74.7999954f}, {81.8877106f, 74.7989426f}, {82.1315613f, 74.7978897f}}}
170seg=164 {{{82.1315613f, 74.7978897f}, {82.6210403f, 74.7957764f}, {83.1105194f, 74.7936554f}, {83.5999985f, 74.8000031f}}}
171seg=165 {{{83.5999985f, 74.8000031f}, {83.9259109f, 74.8042297f}, {84.2518234f, 74.8159714f}, {84.5777359f, 74.827713f}}}
172seg=166 {{{84.5777359f, 74.827713f}, {84.9851608f, 74.842392f}, {85.3925781f, 74.8570709f}, {85.8000031f, 74.8570709f}}}
173seg=167 {{{85.8000031f, 74.8570709f}, {86.2074203f, 74.8570709f}, {86.6148453f, 74.842392f}, {87.0222626f, 74.827713f}}}
174seg=168 {{{87.0222626f, 74.827713f}, {87.348175f, 74.8159714f}, {87.6740875f, 74.8042297f}, {88, 74.8000031f}}}
175seg=169 {{{88, 74.8000031f}, {88.1576462f, 74.7979584f}, {88.3152924f, 74.7951202f}, {88.4729385f, 74.7922745f}}}
176seg=170 {{{88.4729385f, 74.7922745f}, {89.0486221f, 74.7818985f}, {89.6243134f, 74.7715225f}, {90.1999969f, 74.8000031f}}}
177seg=171 {{{90.1999969f, 74.8000031f}, {90.5620499f, 74.8179169f}, {90.9241028f, 74.8630524f}, {91.2861557f, 74.9081879f}}}
178seg=172 {{{91.2861557f, 74.9081879f}, {91.6574402f, 74.9544754f}, {92.028717f, 75.0007629f}, {92.4000015f, 75.0176926f}}}
179seg=173 {{{92.4000015f, 75.0176926f}, {92.9111481f, 75.0410004f}, {93.4223022f, 75.0278778f}, {93.9334488f, 75.0147552f}}}
180seg=174 {{{93.9334488f, 75.0147552f}, {94.155632f, 75.0090561f}, {94.3778152f, 75.0033493f}, {94.5999985f, 75.0006409f}}}
181seg=175 {{{94.5999985f, 75.0006409f}, {94.8669891f, 74.9973831f}, {95.1339798f, 74.9889908f}, {95.4009705f, 74.9806061f}}}
182seg=176 {{{95.4009705f, 74.9806061f}, {95.8673172f, 74.9659576f}, {96.3336563f, 74.9513092f}, {96.8000031f, 74.9639893f}}}
183seg=177 {{{96.8000031f, 74.9639893f}, {97.2396164f, 74.9759521f}, {97.6792297f, 75.0139465f}, {98.1188431f, 75.0519409f}}}
184seg=178 {{{98.1188431f, 75.0519409f}, {98.4125595f, 75.0773239f}, {98.7062836f, 75.1027069f}, {99, 75.1203232f}}}
185seg=179 {{{99, 75.1203232f}, {99.7333298f, 75.1643066f}, {100.466667f, 75.2075195f}, {101.199997f, 75.2278976f}}}
186seg=180 {{{101.199997f, 75.2278976f}, {101.6632f, 75.2407608f}, {102.126396f, 75.2405472f}, {102.5896f, 75.2403336f}}}
187seg=181 {{{102.5896f, 75.2403336f}, {102.859734f, 75.2402115f}, {103.129868f, 75.2400894f}, {103.400002f, 75.2425613f}}}
188seg=182 {{{103.400002f, 75.2425613f}, {103.499123f, 75.2434692f}, {103.598244f, 75.2443542f}, {103.697365f, 75.2452393f}}}
189seg=183 {{{103.697365f, 75.2452393f}, {104.331573f, 75.250885f}, {104.96579f, 75.2565308f}, {105.599998f, 75.2681274f}}}
190seg=184 {{{105.599998f, 75.2681274f}, {105.951164f, 75.2745514f}, {106.30233f, 75.2846603f}, {106.653496f, 75.2947693f}}}
191seg=185 {{{106.653496f, 75.2947693f}, {107.035667f, 75.3057709f}, {107.417831f, 75.3167725f}, {107.800003f, 75.3230209f}}}
192seg=186 {{{107.800003f, 75.3230209f}, {107.904305f, 75.3247223f}, {108.008606f, 75.3265228f}, {108.112907f, 75.3283234f}}}
193seg=187 {{{108.112907f, 75.3283234f}, {108.741936f, 75.33918f}, {109.370972f, 75.350029f}, {110, 75.340065f}}}
194seg=188 {{{110, 75.340065f}, {110.73333f, 75.3284454f}, {111.466667f, 75.2919846f}, {112.199997f, 75.2532883f}}}
195seg=189 {{{112.199997f, 75.2532883f}, {112.524193f, 75.2361755f}, {112.848389f, 75.2113037f}, {113.172585f, 75.1864319f}}}
196seg=190 {{{113.172585f, 75.1864319f}, {113.581726f, 75.1550446f}, {113.99086f, 75.1236496f}, {114.400002f, 75.1078644f}}}
197seg=191 {{{114.400002f, 75.1078644f}, {115.133331f, 75.079567f}, {115.866669f, 75.0734863f}, {116.599998f, 75.0834885f}}}
198seg=192 {{{116.599998f, 75.0834885f}, {117.013039f, 75.089119f}, {117.426071f, 75.1088409f}, {117.839111f, 75.1285629f}}}
199seg=193 {{{117.839111f, 75.1285629f}, {118.159409f, 75.1438599f}, {118.479706f, 75.1591568f}, {118.800003f, 75.1678772f}}}
200seg=194 {{{118.800003f, 75.1678772f}, {118.915619f, 75.1710281f}, {119.031235f, 75.1743622f}, {119.146851f, 75.1776962f}}}
201seg=195 {{{119.146851f, 75.1776962f}, {119.764565f, 75.1954956f}, {120.382286f, 75.2133026f}, {121, 75.2033386f}}}
202seg=196 {{{121, 75.2033386f}, {121.552635f, 75.1944351f}, {122.105278f, 75.1614532f}, {122.657913f, 75.1284714f}}}
203seg=197 {{{122.657913f, 75.1284714f}, {122.838608f, 75.1176834f}, {123.019302f, 75.1068954f}, {123.199997f, 75.0969543f}}}
204seg=198 {{{123.199997f, 75.0969543f}, {123.480431f, 75.0815277f}, {123.760864f, 75.060524f}, {124.041298f, 75.0395203f}}}
205seg=199 {{{124.041298f, 75.0395203f}, {124.494202f, 75.0056076f}, {124.947098f, 74.9716949f}, {125.400002f, 74.9612503f}}}
206seg=200 {{{125.400002f, 74.9612503f}, {126.133331f, 74.9443436f}, {126.866669f, 74.9602585f}, {127.599998f, 74.9955215f}}}
207seg=201 {{{127.599998f, 74.9955215f}, {128.17691f, 75.023262f}, {128.75383f, 75.0766068f}, {129.33075f, 75.1299438f}}}
208seg=202 {{{129.33075f, 75.1299438f}, {129.487167f, 75.1444092f}, {129.643585f, 75.1588745f}, {129.800003f, 75.1728287f}}}
209seg=203 {{{129.800003f, 75.1728287f}, {130.08493f, 75.1982422f}, {130.369843f, 75.2303619f}, {130.65477f, 75.2624817f}}}
210seg=204 {{{130.65477f, 75.2624817f}, {131.10318f, 75.3130264f}, {131.55159f, 75.3635712f}, {132, 75.3879776f}}}
211seg=205 {{{132, 75.3879776f}, {132.682098f, 75.4251099f}, {133.364182f, 75.4193726f}, {134.04628f, 75.4136353f}}}
212seg=206 {{{134.04628f, 75.4136353f}, {134.199997f, 75.4123535f}}}
213seg=207 {{{134.199997f, 75.4123535f}, {134.740479f, 75.4080048f}, {135.28096f, 75.3897247f}, {135.821426f, 75.3714523f}}}
214seg=208 {{{135.821426f, 75.3714523f}, {136.014282f, 75.3649292f}, {136.207138f, 75.3584061f}, {136.399994f, 75.3525162f}}}
215seg=209 {{{136.399994f, 75.3525162f}, {136.723831f, 75.3426285f}, {137.047668f, 75.3308029f}, {137.371506f, 75.3189697f}}}
216seg=210 {{{137.371506f, 75.3189697f}, {137.781006f, 75.3040085f}, {138.190506f, 75.2890472f}, {138.600006f, 75.2780228f}}}
217seg=211 {{{138.600006f, 75.2780228f}, {138.775055f, 75.2733078f}, {138.950119f, 75.2678604f}, {139.125183f, 75.262413f}}}
218seg=212 {{{139.125183f, 75.262413f}, {139.683456f, 75.2450409f}, {140.24173f, 75.2276688f}, {140.800003f, 75.2340317f}}}
219seg=213 {{{140.800003f, 75.2340317f}, {141.173523f, 75.2382889f}, {141.547028f, 75.259819f}, {141.920547f, 75.2813568f}}}
220seg=214 {{{141.920547f, 75.2813568f}, {142.280365f, 75.3021011f}, {142.640182f, 75.3228455f}, {143, 75.3281403f}}}
221seg=215 {{{143, 75.3281403f}, {143.733337f, 75.3389359f}, {144.46666f, 75.3424072f}, {145.199997f, 75.2988205f}}}
222seg=216 {{{145.199997f, 75.2988205f}, {145.574966f, 75.276535f}, {145.949936f, 75.2288513f}, {146.32489f, 75.1811676f}}}
223seg=217 {{{146.32489f, 75.1811676f}, {146.683258f, 75.1355896f}, {147.041626f, 75.0900192f}, {147.399994f, 75.0666199f}}}
224seg=218 {{{147.399994f, 75.0666199f}, {148.133331f, 75.0187454f}, {148.866669f, 74.9981079f}, {149.600006f, 75.0115509f}}}
225seg=219 {{{149.600006f, 75.0115509f}, {149.982086f, 75.0185547f}, {150.364182f, 75.0495148f}, {150.746277f, 75.0804749f}}}
226seg=220 {{{150.746277f, 75.0804749f}, {151.097519f, 75.1089401f}, {151.448761f, 75.1374054f}, {151.800003f, 75.1472549f}}}
227seg=221 {{{151.800003f, 75.1472549f}, {152.343307f, 75.1624985f}, {152.886597f, 75.1531296f}, {153.429901f, 75.1437607f}}}
228seg=222 {{{153.429901f, 75.1437607f}, {153.619934f, 75.14048f}, {153.809967f, 75.137207f}, {154, 75.1349792f}}}
229seg=223 {{{154, 75.1349792f}, {154.295746f, 75.1315155f}, {154.591476f, 75.123848f}, {154.887222f, 75.1161804f}}}
230seg=224 {{{154.887222f, 75.1161804f}, {155.324814f, 75.1048279f}, {155.762405f, 75.0934753f}, {156.199997f, 75.0957642f}}}
231seg=225 {{{156.199997f, 75.0957642f}, {156.559143f, 75.097641f}, {156.918289f, 75.1122131f}, {157.27742f, 75.1267853f}}}
232seg=226 {{{157.27742f, 75.1267853f}, {157.651611f, 75.1419754f}, {158.025803f, 75.1571655f}, {158.399994f, 75.1579895f}}}
233seg=227 {{{158.399994f, 75.1579895f}, {159.133331f, 75.1596069f}, {159.866669f, 75.1515121f}, {160.600006f, 75.105484f}}}
234seg=228 {{{160.600006f, 75.105484f}, {160.952393f, 75.0833588f}, {161.304794f, 75.0397339f}, {161.657196f, 74.996109f}}}
235seg=229 {{{161.657196f, 74.996109f}, {162.038132f, 74.9489594f}, {162.419067f, 74.9018021f}, {162.800003f, 74.8818054f}}}
236seg=230 {{{162.800003f, 74.8818054f}, {163.53334f, 74.8433075f}, {164.266663f, 74.8363724f}, {165, 74.8744736f}}}
237seg=231 {{{165, 74.8744736f}, {165.356293f, 74.8929825f}, {165.712585f, 74.9419861f}, {166.068878f, 74.9909897f}}}
238seg=232 {{{166.068878f, 74.9909897f}, {166.445923f, 75.0428467f}, {166.822952f, 75.0947037f}, {167.199997f, 75.1104279f}}}
239seg=233 {{{167.199997f, 75.1104279f}, {167.933334f, 75.1409988f}, {168.666672f, 75.1096573f}, {169.399994f, 75.0579224f}}}
240seg=234 {{{169.399994f, 75.0579224f}, {169.752808f, 75.0330276f}, {170.105621f, 74.982338f}, {170.458435f, 74.9316483f}}}
241seg=235 {{{170.458435f, 74.9316483f}, {170.838959f, 74.8769836f}, {171.219482f, 74.8223114f}, {171.600006f, 74.8000031f}}}
242seg=236 {{{171.600006f, 74.8000031f}, {172.333328f, 74.757019f}, {173.066666f, 74.7623062f}, {173.800003f, 74.8000031f}}}
243seg=237 {{{173.800003f, 74.8000031f}, {174.500809f, 74.8360367f}, {175.201599f, 74.9249344f}, {175.902405f, 75.0138397f}}}
244seg=238 {{{175.902405f, 75.0138397f}, {176, 75.0262146f}}}
245seg=239 {{{176, 75.0262146f}, {176.306427f, 75.0650406f}, {176.612839f, 75.1189728f}, {176.919266f, 75.1729126f}}}
246seg=240 {{{176.919266f, 75.1729126f}, {177.346176f, 75.2480545f}, {177.773087f, 75.3231964f}, {178.199997f, 75.3574677f}}}
247seg=241 {{{178.199997f, 75.3574677f}, {178.933334f, 75.4163361f}, {179.666672f, 75.4057388f}, {180.399994f, 75.3794556f}}}
248seg=242 {{{180.399994f, 75.3794556f}, {180.822174f, 75.3643265f}, {181.244354f, 75.322731f}, {181.666534f, 75.2811356f}}}
249seg=243 {{{181.666534f, 75.2811356f}, {181.977692f, 75.2504807f}, {182.288849f, 75.2198257f}, {182.600006f, 75.1997681f}}}
250seg=244 {{{182.600006f, 75.1997681f}, {183.153549f, 75.1640701f}, {183.707108f, 75.1412506f}, {184.260666f, 75.1184311f}}}
251seg=245 {{{184.260666f, 75.1184311f}, {184.440445f, 75.1110229f}, {184.620224f, 75.1036148f}, {184.800003f, 75.0957642f}}}
252seg=246 {{{184.800003f, 75.0957642f}, {185.53334f, 75.0637436f}, {186.266663f, 75.0331039f}, {187, 75.0076218f}}}
253seg=247 {{{187, 75.0076218f}, {187.218643f, 75.0000229f}, {187.437286f, 74.9894943f}, {187.65593f, 74.9789658f}}}
254seg=248 {{{187.65593f, 74.9789658f}, {188.170624f, 74.9541702f}, {188.685303f, 74.9293747f}, {189.199997f, 74.9428329f}}}
255seg=249 {{{189.199997f, 74.9428329f}, {189.560562f, 74.9522629f}, {189.921127f, 74.9923019f}, {190.281693f, 75.032341f}}}
256seg=250 {{{190.281693f, 75.032341f}, {190.654465f, 75.0737381f}, {191.027237f, 75.1151352f}, {191.399994f, 75.1227036f}}}
257seg=251 {{{191.399994f, 75.1227036f}, {191.942627f, 75.1337204f}, {192.48526f, 75.0998383f}, {193.027893f, 75.0659485f}}}
258seg=252 {{{193.027893f, 75.0659485f}, {193.218597f, 75.054039f}, {193.409302f, 75.0421295f}, {193.600006f, 75.0321732f}}}
259seg=253 {{{193.600006f, 75.0321732f}, {193.897125f, 75.016655f}, {194.19426f, 74.9936142f}, {194.491394f, 74.9705658f}}}
260seg=254 {{{194.491394f, 74.9705658f}, {194.927597f, 74.9367371f}, {195.3638f, 74.9029083f}, {195.800003f, 74.8928909f}}}
261seg=255 {{{195.800003f, 74.8928909f}, {196.363327f, 74.8799515f}, {196.926636f, 74.8978424f}, {197.48996f, 74.9157333f}}}
262seg=256 {{{197.48996f, 74.9157333f}, {197.659973f, 74.9211349f}, {197.829987f, 74.9265366f}, {198, 74.9310913f}}}
263seg=257 {{{198, 74.9310913f}, {198.539948f, 74.945549f}, {199.07988f, 74.9668427f}, {199.619827f, 74.9881363f}}}
264seg=258 {{{199.619827f, 74.9881363f}, {199.813217f, 74.9957657f}, {200.006607f, 75.0033951f}, {200.199997f, 75.0107117f}}}
265seg=259 {{{200.199997f, 75.0107117f}, {200.468765f, 75.020874f}, {200.737534f, 75.032814f}, {201.006287f, 75.0447464f}}}
266seg=260 {{{201.006287f, 75.0447464f}, {201.470856f, 75.0653763f}, {201.935425f, 75.0860062f}, {202.399994f, 75.0974884f}}}
267seg=261 {{{202.399994f, 75.0974884f}, {202.888885f, 75.1095734f}, {203.377777f, 75.1120605f}, {203.866669f, 75.1145554f}}}
268seg=262 {{{203.866669f, 75.1145554f}, {204.111115f, 75.115799f}, {204.35556f, 75.1170425f}, {204.600006f, 75.1194839f}}}
269seg=263 {{{204.600006f, 75.1194839f}, {204.84462f, 75.121933f}, {205.089233f, 75.1239471f}, {205.333847f, 75.1259613f}}}
270seg=264 {{{205.333847f, 75.1259613f}, {205.822556f, 75.129982f}, {206.311279f, 75.1340103f}, {206.800003f, 75.1414719f}}}
271seg=265 {{{206.800003f, 75.1414719f}, {207.53334f, 75.1526718f}, {208.266663f, 75.1675339f}, {209, 75.1866531f}}}
272seg=266 {{{209, 75.1866531f}, {209.350708f, 75.1957932f}, {209.701416f, 75.2080078f}, {210.052124f, 75.2202225f}}}
273seg=267 {{{210.052124f, 75.2202225f}, {210.434753f, 75.2335434f}, {210.817368f, 75.2468643f}, {211.199997f, 75.2562027f}}}
274seg=268 {{{211.199997f, 75.2562027f}, {211.933334f, 75.2741013f}, {212.666672f, 75.2871475f}, {213.399994f, 75.2940521f}}}
275seg=269 {{{213.399994f, 75.2940521f}, {214.133331f, 75.3009567f}, {214.866669f, 75.3041916f}, {215.600006f, 75.2976303f}}}
276seg=270 {{{215.600006f, 75.2976303f}, {216.076187f, 75.2933655f}, {216.552383f, 75.2823792f}, {217.02858f, 75.2713928f}}}
277seg=271 {{{217.02858f, 75.2713928f}, {217.285721f, 75.2654572f}, {217.542862f, 75.2595291f}, {217.800003f, 75.2546539f}}}
278seg=272 {{{217.800003f, 75.2546539f}, {218.041779f, 75.2500763f}, {218.283554f, 75.2413101f}, {218.52533f, 75.2325439f}}}
279seg=273 {{{218.52533f, 75.2325439f}, {219.016891f, 75.2147217f}, {219.508438f, 75.1968994f}, {220, 75.2142487f}}}
280seg=274 {{{220, 75.2142487f}, {220.409988f, 75.2287216f}, {220.819977f, 75.2736588f}, {221.229965f, 75.3185959f}}}
281seg=275 {{{221.229965f, 75.3185959f}, {221.553314f, 75.3540344f}, {221.876648f, 75.389473f}, {222.199997f, 75.4099731f}}}
282seg=276 {{{222.199997f, 75.4099731f}, {222.933334f, 75.456459f}, {223.666672f, 75.4962387f}, {224.399994f, 75.4931717f}}}
283seg=277 {{{224.399994f, 75.4931717f}, {224.885803f, 75.4911423f}, {225.371613f, 75.4618988f}, {225.857422f, 75.4326553f}}}
284seg=278 {{{225.857422f, 75.4326553f}, {226.10495f, 75.4177551f}, {226.352478f, 75.4028549f}, {226.600006f, 75.3915558f}}}
285seg=279 {{{226.600006f, 75.3915558f}, {226.839722f, 75.3806152f}, {227.079437f, 75.3675385f}, {227.319153f, 75.354454f}}}
286seg=280 {{{227.319153f, 75.354454f}, {227.812759f, 75.3275223f}, {228.306381f, 75.3005905f}, {228.800003f, 75.2923279f}}}
287seg=281 {{{228.800003f, 75.2923279f}, {229.309921f, 75.2837906f}, {229.819824f, 75.2945709f}, {230.329742f, 75.3053513f}}}
288seg=282 {{{230.329742f, 75.3053513f}, {230.553162f, 75.3100739f}, {230.776581f, 75.3147964f}, {231, 75.317894f}}}
289seg=283 {{{231, 75.317894f}, {231.290405f, 75.3219223f}, {231.580811f, 75.3275833f}, {231.871216f, 75.333252f}}}
290seg=284 {{{231.871216f, 75.333252f}, {232.314148f, 75.3418884f}, {232.757065f, 75.3505249f}, {233.199997f, 75.3533554f}}}
291seg=285 {{{233.199997f, 75.3533554f}, {233.933334f, 75.3580399f}, {234.666672f, 75.3606873f}, {235.399994f, 75.3460236f}}}
292seg=286 {{{235.399994f, 75.3460236f}, {235.845032f, 75.3371277f}, {236.29007f, 75.3182449f}, {236.735107f, 75.2993622f}}}
293seg=287 {{{236.735107f, 75.2993622f}, {237.023407f, 75.2871323f}, {237.311707f, 75.2749023f}, {237.600006f, 75.2653885f}}}
294seg=288 {{{237.600006f, 75.2653885f}, {238.333328f, 75.2411804f}, {239.066666f, 75.2196732f}, {239.800003f, 75.2007828f}}}
295seg=289 {{{239.800003f, 75.2007828f}, {240.082169f, 75.193512f}, {240.364334f, 75.1891708f}, {240.6465f, 75.1848297f}}}
296seg=290 {{{240.6465f, 75.1848297f}, {241.097672f, 75.177887f}, {241.548828f, 75.1709366f}, {242, 75.1520233f}}}
297seg=291 {{{242, 75.1520233f}, {242.416458f, 75.1345673f}, {242.832916f, 75.1057968f}, {243.249374f, 75.0770187f}}}
298seg=292 {{{243.249374f, 75.0770187f}, {243.566254f, 75.0551224f}, {243.883118f, 75.033226f}, {244.199997f, 75.0163193f}}}
299seg=293 {{{244.199997f, 75.0163193f}, {244.933334f, 74.9771957f}, {245.666672f, 74.9453659f}, {246.399994f, 74.9172668f}}}
300seg=294 {{{246.399994f, 74.9172668f}, {247.133331f, 74.8891678f}, {247.866669f, 74.8672562f}, {248.600006f, 74.8477097f}}}
301seg=295 {{{248.600006f, 74.8477097f}, {248.714218f, 74.8446655f}}}
302seg=296 {{{248.714218f, 74.8446655f}, {249.40947f, 74.8261032f}, {250.104736f, 74.8075485f}, {250.800003f, 74.8000031f}}}
303seg=297 {{{250.800003f, 74.8000031f}, {251.288895f, 74.7947006f}, {251.777771f, 74.7964706f}, {252.266663f, 74.798233f}}}
304seg=298 {{{252.266663f, 74.798233f}, {252.511108f, 74.799118f}, {252.755554f, 74.8000031f}, {253, 74.8000031f}}}
305seg=299 {{{253, 74.8000031f}, {68.1999969f, 74.8000031f}}}
306debugShowCubicIntersection wtTs[0]=1 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.9333344,74.8078003}} wnTs[0]=0 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}}
307debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
308debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}}
309debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
310SkOpSegment::addT insert t=0.988095214 segID=150 spanID=599
311debugShowCubicIntersection wtTs[0]=1 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{71.5388947,74.6926956}} wnTs[0]=0 {{{71.5388947,74.6926956}, {71.8925934,74.6511688}, {72.2462997,74.609642}, {72.5999985,74.5894699}}}
312debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
313debugShowCubicIntersection wtTs[0]=1 {{{71.5388947,74.6926956}, {71.8925934,74.6511688}, {72.2462997,74.609642}, {72.5999985,74.5894699}}} {{72.5999985,74.5894699}} wnTs[0]=0 {{{72.5999985,74.5894699}, {73.1301117,74.5592346}, {73.6602249,74.5564957}, {74.1903381,74.5537567}}}
314debugShowCubicIntersection wtTs[0]=1 {{{72.5999985,74.5894699}, {73.1301117,74.5592346}, {73.6602249,74.5564957}, {74.1903381,74.5537567}}} {{74.1903381,74.5537567}} wnTs[0]=0 {{{74.1903381,74.5537567}, {74.3935623,74.5527115}, {74.5967789,74.5516663}, {74.8000031,74.5490646}}}
315debugShowCubicIntersection wtTs[0]=1 {{{74.1903381,74.5537567}, {74.3935623,74.5527115}, {74.5967789,74.5516663}, {74.8000031,74.5490646}}} {{74.8000031,74.5490646}} wnTs[0]=0 {{{74.8000031,74.5490646}, {75.0211792,74.5462341}, {75.242363,74.5398636}, {75.4635391,74.5335007}}}
316debugShowCubicIntersection wtTs[0]=1 {{{74.8000031,74.5490646}, {75.0211792,74.5462341}, {75.242363,74.5398636}, {75.4635391,74.5335007}}} {{75.4635391,74.5335007}} wnTs[0]=0 {{{75.4635391,74.5335007}, {75.9756927,74.5187607}, {76.4878464,74.5040207}, {77,74.5332108}}}
317debugShowCubicIntersection wtTs[0]=1 {{{75.4635391,74.5335007}, {75.9756927,74.5187607}, {76.4878464,74.5040207}, {77,74.5332108}}} {{77,74.5332108}} wnTs[0]=0 {{{77,74.5332108}, {77.3702316,74.5543137}, {77.7404709,74.610733}, {78.1107025,74.66716}}}
318debugShowCubicIntersection wtTs[0]=1 {{{77,74.5332108}, {77.3702316,74.5543137}, {77.7404709,74.610733}, {78.1107025,74.66716}}} {{78.1107025,74.66716}} wnTs[0]=0 {{{78.1107025,74.66716}, {78.4738007,74.722496}, {78.8368988,74.777832}, {79.1999969,74.7998505}}}
319debugShowCubicIntersection wtTs[0]=1 {{{78.1107025,74.66716}, {78.4738007,74.722496}, {78.8368988,74.777832}, {79.1999969,74.7998505}}} {{79.1999969,74.7998505}} wnTs[0]=0 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}}
320debugShowCubicIntersection wtTs[0]=1 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{80.6670074,74.8098221}} wnTs[0]=0 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}}
321debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
322SkOpSegment::addT insert t=0.0017190524 segID=11 spanID=600
323SkOpSegment::addT insert t=0.940462545 segID=150 spanID=601
324debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}}
325debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
326SkOpSegment::addT insert t=0.99844881 segID=12 spanID=602
327SkOpSegment::addT insert t=0.928577558 segID=150 spanID=603
328SkOpSegment::addT insert t=0.928571405 segID=150 spanID=604
329debugShowCubicIntersection wtTs[0]=1 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{82.1315613,74.8021164}} wnTs[0]=0 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}}
330debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
331debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}}
332debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
333SkOpSegment::addT insert t=0.91666666 segID=150 spanID=605
334debugShowCubicIntersection wtTs[0]=1 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{84.5777359,74.7722931}} wnTs[0]=0 {{{84.5777359,74.7722931}, {84.9851608,74.7576141}, {85.3925781,74.7429352}, {85.8000031,74.7429352}}}
335debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
336debugShowCubicIntersection wtTs[0]=1 {{{84.5777359,74.7722931}, {84.9851608,74.7576141}, {85.3925781,74.7429352}, {85.8000031,74.7429352}}} {{85.8000031,74.7429352}} wnTs[0]=0 {{{85.8000031,74.7429352}, {86.2074203,74.7429352}, {86.6148453,74.7576141}, {87.0222626,74.7722931}}}
337debugShowCubicIntersection wtTs[0]=1 {{{85.8000031,74.7429352}, {86.2074203,74.7429352}, {86.6148453,74.7576141}, {87.0222626,74.7722931}}} {{87.0222626,74.7722931}} wnTs[0]=0 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}}
338debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}}
339debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
340SkOpSegment::addT insert t=0.892857128 segID=150 spanID=606
341debugShowCubicIntersection wtTs[0]=1 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88.4729385,74.8077316}} wnTs[0]=0 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}}
342debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
343debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}}
344debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
345SkOpSegment::addT insert t=0.880952383 segID=150 spanID=607
346debugShowCubicIntersection wtTs[0]=1 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{91.2861557,74.6918182}} wnTs[0]=0 {{{91.2861557,74.6918182}, {91.6574402,74.6455307}, {92.028717,74.5992432}, {92.4000015,74.5823135}}}
347debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
348debugShowCubicIntersection wtTs[0]=1 {{{91.2861557,74.6918182}, {91.6574402,74.6455307}, {92.028717,74.5992432}, {92.4000015,74.5823135}}} {{92.4000015,74.5823135}} wnTs[0]=0 {{{92.4000015,74.5823135}, {92.9111481,74.5590057}, {93.4223022,74.5721283}, {93.9334488,74.5852509}}}
349debugShowCubicIntersection wtTs[0]=1 {{{92.4000015,74.5823135}, {92.9111481,74.5590057}, {93.4223022,74.5721283}, {93.9334488,74.5852509}}} {{93.9334488,74.5852509}} wnTs[0]=0 {{{93.9334488,74.5852509}, {94.155632,74.59095}, {94.3778152,74.5966568}, {94.5999985,74.5993652}}}
350debugShowCubicIntersection wtTs[0]=1 {{{93.9334488,74.5852509}, {94.155632,74.59095}, {94.3778152,74.5966568}, {94.5999985,74.5993652}}} {{94.5999985,74.5993652}} wnTs[0]=0 {{{94.5999985,74.5993652}, {94.8669891,74.602623}, {95.1339798,74.6110153}, {95.4009705,74.6194}}}
351debugShowCubicIntersection wtTs[0]=1 {{{94.5999985,74.5993652}, {94.8669891,74.602623}, {95.1339798,74.6110153}, {95.4009705,74.6194}}} {{95.4009705,74.6194}} wnTs[0]=0 {{{95.4009705,74.6194}, {95.8673172,74.6340485}, {96.3336563,74.6486969}, {96.8000031,74.6360168}}}
352debugShowCubicIntersection wtTs[0]=1 {{{95.4009705,74.6194}, {95.8673172,74.6340485}, {96.3336563,74.6486969}, {96.8000031,74.6360168}}} {{96.8000031,74.6360168}} wnTs[0]=0 {{{96.8000031,74.6360168}, {97.2396164,74.624054}, {97.6792297,74.5860596}, {98.1188431,74.5480652}}}
353debugShowCubicIntersection wtTs[0]=1 {{{96.8000031,74.6360168}, {97.2396164,74.624054}, {97.6792297,74.5860596}, {98.1188431,74.5480652}}} {{98.1188431,74.5480652}} wnTs[0]=0 {{{98.1188431,74.5480652}, {98.4125595,74.5226822}, {98.7062836,74.4972992}, {99,74.4796829}}}
354debugShowCubicIntersection wtTs[0]=1 {{{98.1188431,74.5480652}, {98.4125595,74.5226822}, {98.7062836,74.4972992}, {99,74.4796829}}} {{99,74.4796829}} wnTs[0]=0 {{{99,74.4796829}, {99.7333298,74.4356995}, {100.466667,74.3924866}, {101.199997,74.3721085}}}
355debugShowCubicIntersection wtTs[0]=1 {{{99,74.4796829}, {99.7333298,74.4356995}, {100.466667,74.3924866}, {101.199997,74.3721085}}} {{101.199997,74.3721085}} wnTs[0]=0 {{{101.199997,74.3721085}, {101.6632,74.3592453}, {102.126396,74.3594589}, {102.5896,74.3596725}}}
356debugShowCubicIntersection wtTs[0]=1 {{{101.199997,74.3721085}, {101.6632,74.3592453}, {102.126396,74.3594589}, {102.5896,74.3596725}}} {{102.5896,74.3596725}} wnTs[0]=0 {{{102.5896,74.3596725}, {102.859734,74.3597946}, {103.129868,74.3599167}, {103.400002,74.3574448}}}
357debugShowCubicIntersection wtTs[0]=1 {{{102.5896,74.3596725}, {102.859734,74.3597946}, {103.129868,74.3599167}, {103.400002,74.3574448}}} {{103.400002,74.3574448}} wnTs[0]=0 {{{103.400002,74.3574448}, {103.499123,74.3565369}, {103.598244,74.3556519}, {103.697365,74.3547668}}}
358debugShowCubicIntersection wtTs[0]=1 {{{103.400002,74.3574448}, {103.499123,74.3565369}, {103.598244,74.3556519}, {103.697365,74.3547668}}} {{103.697365,74.3547668}} wnTs[0]=0 {{{103.697365,74.3547668}, {104.331573,74.3491211}, {104.96579,74.3434753}, {105.599998,74.3318787}}}
359debugShowCubicIntersection wtTs[0]=1 {{{103.697365,74.3547668}, {104.331573,74.3491211}, {104.96579,74.3434753}, {105.599998,74.3318787}}} {{105.599998,74.3318787}} wnTs[0]=0 {{{105.599998,74.3318787}, {105.951164,74.3254547}, {106.30233,74.3153458}, {106.653496,74.3052368}}}
360debugShowCubicIntersection wtTs[0]=1 {{{105.599998,74.3318787}, {105.951164,74.3254547}, {106.30233,74.3153458}, {106.653496,74.3052368}}} {{106.653496,74.3052368}} wnTs[0]=0 {{{106.653496,74.3052368}, {107.035667,74.2942352}, {107.417831,74.2832336}, {107.800003,74.2769852}}}
361debugShowCubicIntersection wtTs[0]=1 {{{106.653496,74.3052368}, {107.035667,74.2942352}, {107.417831,74.2832336}, {107.800003,74.2769852}}} {{107.800003,74.2769852}} wnTs[0]=0 {{{107.800003,74.2769852}, {107.904305,74.2752838}, {108.008606,74.2734833}, {108.112907,74.2716827}}}
362debugShowCubicIntersection wtTs[0]=1 {{{107.800003,74.2769852}, {107.904305,74.2752838}, {108.008606,74.2734833}, {108.112907,74.2716827}}} {{108.112907,74.2716827}} wnTs[0]=0 {{{108.112907,74.2716827}, {108.741936,74.2608261}, {109.370972,74.2499771}, {110,74.2599411}}}
363debugShowCubicIntersection wtTs[0]=1 {{{108.112907,74.2716827}, {108.741936,74.2608261}, {109.370972,74.2499771}, {110,74.2599411}}} {{110,74.2599411}} wnTs[0]=0 {{{110,74.2599411}, {110.73333,74.2715607}, {111.466667,74.3080215}, {112.199997,74.3467178}}}
364debugShowCubicIntersection wtTs[0]=1 {{{110,74.2599411}, {110.73333,74.2715607}, {111.466667,74.3080215}, {112.199997,74.3467178}}} {{112.199997,74.3467178}} wnTs[0]=0 {{{112.199997,74.3467178}, {112.524193,74.3638306}, {112.848389,74.3887024}, {113.172585,74.4135742}}}
365debugShowCubicIntersection wtTs[0]=1 {{{112.199997,74.3467178}, {112.524193,74.3638306}, {112.848389,74.3887024}, {113.172585,74.4135742}}} {{113.172585,74.4135742}} wnTs[0]=0 {{{113.172585,74.4135742}, {113.581726,74.4449615}, {113.99086,74.4763565}, {114.400002,74.4921417}}}
366debugShowCubicIntersection wtTs[0]=1 {{{113.172585,74.4135742}, {113.581726,74.4449615}, {113.99086,74.4763565}, {114.400002,74.4921417}}} {{114.400002,74.4921417}} wnTs[0]=0 {{{114.400002,74.4921417}, {115.133331,74.5204391}, {115.866669,74.5265198}, {116.599998,74.5165176}}}
367debugShowCubicIntersection wtTs[0]=1 {{{114.400002,74.4921417}, {115.133331,74.5204391}, {115.866669,74.5265198}, {116.599998,74.5165176}}} {{116.599998,74.5165176}} wnTs[0]=0 {{{116.599998,74.5165176}, {117.013039,74.5108871}, {117.426071,74.4911652}, {117.839111,74.4714432}}}
368debugShowCubicIntersection wtTs[0]=1 {{{116.599998,74.5165176}, {117.013039,74.5108871}, {117.426071,74.4911652}, {117.839111,74.4714432}}} {{117.839111,74.4714432}} wnTs[0]=0 {{{117.839111,74.4714432}, {118.159409,74.4561462}, {118.479706,74.4408493}, {118.800003,74.4321289}}}
369debugShowCubicIntersection wtTs[0]=1 {{{117.839111,74.4714432}, {118.159409,74.4561462}, {118.479706,74.4408493}, {118.800003,74.4321289}}} {{118.800003,74.4321289}} wnTs[0]=0 {{{118.800003,74.4321289}, {118.915619,74.428978}, {119.031235,74.4256439}, {119.146851,74.4223099}}}
370debugShowCubicIntersection wtTs[0]=1 {{{118.800003,74.4321289}, {118.915619,74.428978}, {119.031235,74.4256439}, {119.146851,74.4223099}}} {{119.146851,74.4223099}} wnTs[0]=0 {{{119.146851,74.4223099}, {119.764565,74.4045105}, {120.382286,74.3867035}, {121,74.3966675}}}
371debugShowCubicIntersection wtTs[0]=1 {{{119.146851,74.4223099}, {119.764565,74.4045105}, {120.382286,74.3867035}, {121,74.3966675}}} {{121,74.3966675}} wnTs[0]=0 {{{121,74.3966675}, {121.552635,74.405571}, {122.105278,74.4385529}, {122.657913,74.4715347}}}
372debugShowCubicIntersection wtTs[0]=1 {{{121,74.3966675}, {121.552635,74.405571}, {122.105278,74.4385529}, {122.657913,74.4715347}}} {{122.657913,74.4715347}} wnTs[0]=0 {{{122.657913,74.4715347}, {122.838608,74.4823227}, {123.019302,74.4931107}, {123.199997,74.5030518}}}
373debugShowCubicIntersection wtTs[0]=1 {{{122.657913,74.4715347}, {122.838608,74.4823227}, {123.019302,74.4931107}, {123.199997,74.5030518}}} {{123.199997,74.5030518}} wnTs[0]=0 {{{123.199997,74.5030518}, {123.480431,74.5184784}, {123.760864,74.5394821}, {124.041298,74.5604858}}}
374debugShowCubicIntersection wtTs[0]=1 {{{123.199997,74.5030518}, {123.480431,74.5184784}, {123.760864,74.5394821}, {124.041298,74.5604858}}} {{124.041298,74.5604858}} wnTs[0]=0 {{{124.041298,74.5604858}, {124.494202,74.5943985}, {124.947098,74.6283112}, {125.400002,74.6387558}}}
375debugShowCubicIntersection wtTs[0]=1 {{{124.041298,74.5604858}, {124.494202,74.5943985}, {124.947098,74.6283112}, {125.400002,74.6387558}}} {{125.400002,74.6387558}} wnTs[0]=0 {{{125.400002,74.6387558}, {126.133331,74.6556625}, {126.866669,74.6397476}, {127.599998,74.6044846}}}
376debugShowCubicIntersection wtTs[0]=1 {{{125.400002,74.6387558}, {126.133331,74.6556625}, {126.866669,74.6397476}, {127.599998,74.6044846}}} {{127.599998,74.6044846}} wnTs[0]=0 {{{127.599998,74.6044846}, {128.17691,74.5767441}, {128.75383,74.5233994}, {129.33075,74.4700623}}}
377debugShowCubicIntersection wtTs[0]=1 {{{127.599998,74.6044846}, {128.17691,74.5767441}, {128.75383,74.5233994}, {129.33075,74.4700623}}} {{129.33075,74.4700623}} wnTs[0]=0 {{{129.33075,74.4700623}, {129.487167,74.4555969}, {129.643585,74.4411316}, {129.800003,74.4271774}}}
378debugShowCubicIntersection wtTs[0]=1 {{{129.33075,74.4700623}, {129.487167,74.4555969}, {129.643585,74.4411316}, {129.800003,74.4271774}}} {{129.800003,74.4271774}} wnTs[0]=0 {{{129.800003,74.4271774}, {130.08493,74.4017639}, {130.369843,74.3696442}, {130.65477,74.3375244}}}
379debugShowCubicIntersection wtTs[0]=1 {{{129.800003,74.4271774}, {130.08493,74.4017639}, {130.369843,74.3696442}, {130.65477,74.3375244}}} {{130.65477,74.3375244}} wnTs[0]=0 {{{130.65477,74.3375244}, {131.10318,74.2869797}, {131.55159,74.2364349}, {132,74.2120285}}}
380debugShowCubicIntersection wtTs[0]=1 {{{130.65477,74.3375244}, {131.10318,74.2869797}, {131.55159,74.2364349}, {132,74.2120285}}} {{132,74.2120285}} wnTs[0]=0 {{{132,74.2120285}, {132.682098,74.1748962}, {133.364182,74.1806335}, {134.04628,74.1863708}}}
381debugShowCubicLineIntersection wtTs[0]=1 {{{132,74.2120285}, {132.682098,74.1748962}, {133.364182,74.1806335}, {134.04628,74.1863708}}} {{134.04628,74.1863708}} wnTs[0]=0 {{{134.04628,74.1863708}, {134.199997,74.1876526}}}
382debugShowCubicLineIntersection wtTs[0]=0 {{{134.199997,74.1876526}, {134.740479,74.1920013}, {135.28096,74.2102814}, {135.821426,74.2285538}}} {{134.199997,74.1876526}} wnTs[0]=1 {{{134.04628,74.1863708}, {134.199997,74.1876526}}}
383debugShowCubicIntersection wtTs[0]=1 {{{134.199997,74.1876526}, {134.740479,74.1920013}, {135.28096,74.2102814}, {135.821426,74.2285538}}} {{135.821426,74.2285538}} wnTs[0]=0 {{{135.821426,74.2285538}, {136.014282,74.2350769}, {136.207138,74.2416}, {136.399994,74.2474899}}}
384debugShowCubicIntersection wtTs[0]=1 {{{135.821426,74.2285538}, {136.014282,74.2350769}, {136.207138,74.2416}, {136.399994,74.2474899}}} {{136.399994,74.2474899}} wnTs[0]=0 {{{136.399994,74.2474899}, {136.723831,74.2573776}, {137.047668,74.2692032}, {137.371506,74.2810364}}}
385debugShowCubicIntersection wtTs[0]=1 {{{136.399994,74.2474899}, {136.723831,74.2573776}, {137.047668,74.2692032}, {137.371506,74.2810364}}} {{137.371506,74.2810364}} wnTs[0]=0 {{{137.371506,74.2810364}, {137.781006,74.2959976}, {138.190506,74.3109589}, {138.600006,74.3219833}}}
386debugShowCubicIntersection wtTs[0]=1 {{{137.371506,74.2810364}, {137.781006,74.2959976}, {138.190506,74.3109589}, {138.600006,74.3219833}}} {{138.600006,74.3219833}} wnTs[0]=0 {{{138.600006,74.3219833}, {138.775055,74.3266983}, {138.950119,74.3321457}, {139.125183,74.3375931}}}
387debugShowCubicIntersection wtTs[0]=1 {{{138.600006,74.3219833}, {138.775055,74.3266983}, {138.950119,74.3321457}, {139.125183,74.3375931}}} {{139.125183,74.3375931}} wnTs[0]=0 {{{139.125183,74.3375931}, {139.683456,74.3549652}, {140.24173,74.3723373}, {140.800003,74.3659744}}}
388debugShowCubicIntersection wtTs[0]=1 {{{139.125183,74.3375931}, {139.683456,74.3549652}, {140.24173,74.3723373}, {140.800003,74.3659744}}} {{140.800003,74.3659744}} wnTs[0]=0 {{{140.800003,74.3659744}, {141.173523,74.3617172}, {141.547028,74.3401871}, {141.920547,74.3186493}}}
389debugShowCubicIntersection wtTs[0]=1 {{{140.800003,74.3659744}, {141.173523,74.3617172}, {141.547028,74.3401871}, {141.920547,74.3186493}}} {{141.920547,74.3186493}} wnTs[0]=0 {{{141.920547,74.3186493}, {142.280365,74.297905}, {142.640182,74.2771606}, {143,74.2718658}}}
390debugShowCubicIntersection wtTs[0]=1 {{{141.920547,74.3186493}, {142.280365,74.297905}, {142.640182,74.2771606}, {143,74.2718658}}} {{143,74.2718658}} wnTs[0]=0 {{{143,74.2718658}, {143.733337,74.2610703}, {144.46666,74.2575989}, {145.199997,74.3011856}}}
391debugShowCubicIntersection wtTs[0]=1 {{{143,74.2718658}, {143.733337,74.2610703}, {144.46666,74.2575989}, {145.199997,74.3011856}}} {{145.199997,74.3011856}} wnTs[0]=0 {{{145.199997,74.3011856}, {145.574966,74.3234711}, {145.949936,74.3711548}, {146.32489,74.4188385}}}
392debugShowCubicIntersection wtTs[0]=1 {{{145.199997,74.3011856}, {145.574966,74.3234711}, {145.949936,74.3711548}, {146.32489,74.4188385}}} {{146.32489,74.4188385}} wnTs[0]=0 {{{146.32489,74.4188385}, {146.683258,74.4644165}, {147.041626,74.5099869}, {147.399994,74.5333862}}}
393debugShowCubicIntersection wtTs[0]=1 {{{146.32489,74.4188385}, {146.683258,74.4644165}, {147.041626,74.5099869}, {147.399994,74.5333862}}} {{147.399994,74.5333862}} wnTs[0]=0 {{{147.399994,74.5333862}, {148.133331,74.5812607}, {148.866669,74.6018982}, {149.600006,74.5884552}}}
394debugShowCubicIntersection wtTs[0]=1 {{{147.399994,74.5333862}, {148.133331,74.5812607}, {148.866669,74.6018982}, {149.600006,74.5884552}}} {{149.600006,74.5884552}} wnTs[0]=0 {{{149.600006,74.5884552}, {149.982086,74.5814514}, {150.364182,74.5504913}, {150.746277,74.5195313}}}
395debugShowCubicIntersection wtTs[0]=1 {{{149.600006,74.5884552}, {149.982086,74.5814514}, {150.364182,74.5504913}, {150.746277,74.5195313}}} {{150.746277,74.5195313}} wnTs[0]=0 {{{150.746277,74.5195313}, {151.097519,74.491066}, {151.448761,74.4626007}, {151.800003,74.4527512}}}
396debugShowCubicIntersection wtTs[0]=1 {{{150.746277,74.5195313}, {151.097519,74.491066}, {151.448761,74.4626007}, {151.800003,74.4527512}}} {{151.800003,74.4527512}} wnTs[0]=0 {{{151.800003,74.4527512}, {152.343307,74.4375076}, {152.886597,74.4468765}, {153.429901,74.4562454}}}
397debugShowCubicIntersection wtTs[0]=1 {{{151.800003,74.4527512}, {152.343307,74.4375076}, {152.886597,74.4468765}, {153.429901,74.4562454}}} {{153.429901,74.4562454}} wnTs[0]=0 {{{153.429901,74.4562454}, {153.619934,74.4595261}, {153.809967,74.4627991}, {154,74.4650269}}}
398debugShowCubicIntersection wtTs[0]=1 {{{153.429901,74.4562454}, {153.619934,74.4595261}, {153.809967,74.4627991}, {154,74.4650269}}} {{154,74.4650269}} wnTs[0]=0 {{{154,74.4650269}, {154.295746,74.4684906}, {154.591476,74.4761581}, {154.887222,74.4838257}}}
399debugShowCubicIntersection wtTs[0]=1 {{{154,74.4650269}, {154.295746,74.4684906}, {154.591476,74.4761581}, {154.887222,74.4838257}}} {{154.887222,74.4838257}} wnTs[0]=0 {{{154.887222,74.4838257}, {155.324814,74.4951782}, {155.762405,74.5065308}, {156.199997,74.5042419}}}
400debugShowCubicIntersection wtTs[0]=1 {{{154.887222,74.4838257}, {155.324814,74.4951782}, {155.762405,74.5065308}, {156.199997,74.5042419}}} {{156.199997,74.5042419}} wnTs[0]=0 {{{156.199997,74.5042419}, {156.559143,74.5023651}, {156.918289,74.487793}, {157.27742,74.4732208}}}
401debugShowCubicIntersection wtTs[0]=1 {{{156.199997,74.5042419}, {156.559143,74.5023651}, {156.918289,74.487793}, {157.27742,74.4732208}}} {{157.27742,74.4732208}} wnTs[0]=0 {{{157.27742,74.4732208}, {157.651611,74.4580307}, {158.025803,74.4428406}, {158.399994,74.4420166}}}
402debugShowCubicIntersection wtTs[0]=1 {{{157.27742,74.4732208}, {157.651611,74.4580307}, {158.025803,74.4428406}, {158.399994,74.4420166}}} {{158.399994,74.4420166}} wnTs[0]=0 {{{158.399994,74.4420166}, {159.133331,74.4403992}, {159.866669,74.448494}, {160.600006,74.4945221}}}
403debugShowCubicIntersection wtTs[0]=1 {{{158.399994,74.4420166}, {159.133331,74.4403992}, {159.866669,74.448494}, {160.600006,74.4945221}}} {{160.600006,74.4945221}} wnTs[0]=0 {{{160.600006,74.4945221}, {160.952393,74.5166473}, {161.304794,74.5602722}, {161.657196,74.6038971}}}
404debugShowCubicIntersection wtTs[0]=1 {{{160.600006,74.4945221}, {160.952393,74.5166473}, {161.304794,74.5602722}, {161.657196,74.6038971}}} {{161.657196,74.6038971}} wnTs[0]=0 {{{161.657196,74.6038971}, {162.038132,74.6510468}, {162.419067,74.698204}, {162.800003,74.7182007}}}
405debugShowCubicIntersection wtTs[0]=1 {{{161.657196,74.6038971}, {162.038132,74.6510468}, {162.419067,74.698204}, {162.800003,74.7182007}}} {{162.800003,74.7182007}} wnTs[0]=0 {{{162.800003,74.7182007}, {163.53334,74.7566986}, {164.266663,74.7636337}, {165,74.7255325}}}
406debugShowCubicIntersection wtTs[0]=1 {{{162.800003,74.7182007}, {163.53334,74.7566986}, {164.266663,74.7636337}, {165,74.7255325}}} {{165,74.7255325}} wnTs[0]=0 {{{165,74.7255325}, {165.356293,74.7070236}, {165.712585,74.65802}, {166.068878,74.6090164}}}
407debugShowCubicIntersection wtTs[0]=1 {{{165,74.7255325}, {165.356293,74.7070236}, {165.712585,74.65802}, {166.068878,74.6090164}}} {{166.068878,74.6090164}} wnTs[0]=0 {{{166.068878,74.6090164}, {166.445923,74.5571594}, {166.822952,74.5053024}, {167.199997,74.4895782}}}
408debugShowCubicIntersection wtTs[0]=1 {{{166.068878,74.6090164}, {166.445923,74.5571594}, {166.822952,74.5053024}, {167.199997,74.4895782}}} {{167.199997,74.4895782}} wnTs[0]=0 {{{167.199997,74.4895782}, {167.933334,74.4590073}, {168.666672,74.4903488}, {169.399994,74.5420837}}}
409debugShowCubicIntersection wtTs[0]=1 {{{167.199997,74.4895782}, {167.933334,74.4590073}, {168.666672,74.4903488}, {169.399994,74.5420837}}} {{169.399994,74.5420837}} wnTs[0]=0 {{{169.399994,74.5420837}, {169.752808,74.5669785}, {170.105621,74.6176682}, {170.458435,74.6683578}}}
410debugShowCubicIntersection wtTs[0]=1 {{{169.399994,74.5420837}, {169.752808,74.5669785}, {170.105621,74.6176682}, {170.458435,74.6683578}}} {{170.458435,74.6683578}} wnTs[0]=0 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}}
411debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}}
412debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
413SkOpSegment::addT insert t=0.44047615 segID=150 spanID=608
414debugShowCubicIntersection wtTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}}
415debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
416SkOpSegment::addT insert t=0.428571405 segID=150 spanID=609
417debugShowCubicLineIntersection wtTs[0]=1 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{175.902405,74.5861664}} wnTs[0]=0 {{{175.902405,74.5861664}, {176,74.5737915}}}
418debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
419debugShowCubicLineIntersection wtTs[0]=0 {{{176,74.5737915}, {176.306427,74.5349655}, {176.612839,74.4810333}, {176.919266,74.4270935}}} {{176,74.5737915}} wnTs[0]=1 {{{175.902405,74.5861664}, {176,74.5737915}}}
420debugShowCubicIntersection wtTs[0]=1 {{{176,74.5737915}, {176.306427,74.5349655}, {176.612839,74.4810333}, {176.919266,74.4270935}}} {{176.919266,74.4270935}} wnTs[0]=0 {{{176.919266,74.4270935}, {177.346176,74.3519516}, {177.773087,74.2768097}, {178.199997,74.2425385}}}
421debugShowCubicIntersection wtTs[0]=1 {{{176.919266,74.4270935}, {177.346176,74.3519516}, {177.773087,74.2768097}, {178.199997,74.2425385}}} {{178.199997,74.2425385}} wnTs[0]=0 {{{178.199997,74.2425385}, {178.933334,74.18367}, {179.666672,74.1942673}, {180.399994,74.2205505}}}
422debugShowCubicIntersection wtTs[0]=1 {{{178.199997,74.2425385}, {178.933334,74.18367}, {179.666672,74.1942673}, {180.399994,74.2205505}}} {{180.399994,74.2205505}} wnTs[0]=0 {{{180.399994,74.2205505}, {180.822174,74.2356796}, {181.244354,74.2772751}, {181.666534,74.3188705}}}
423debugShowCubicIntersection wtTs[0]=1 {{{180.399994,74.2205505}, {180.822174,74.2356796}, {181.244354,74.2772751}, {181.666534,74.3188705}}} {{181.666534,74.3188705}} wnTs[0]=0 {{{181.666534,74.3188705}, {181.977692,74.3495255}, {182.288849,74.3801804}, {182.600006,74.400238}}}
424debugShowCubicIntersection wtTs[0]=1 {{{181.666534,74.3188705}, {181.977692,74.3495255}, {182.288849,74.3801804}, {182.600006,74.400238}}} {{182.600006,74.400238}} wnTs[0]=0 {{{182.600006,74.400238}, {183.153549,74.435936}, {183.707108,74.4587555}, {184.260666,74.481575}}}
425debugShowCubicIntersection wtTs[0]=1 {{{182.600006,74.400238}, {183.153549,74.435936}, {183.707108,74.4587555}, {184.260666,74.481575}}} {{184.260666,74.481575}} wnTs[0]=0 {{{184.260666,74.481575}, {184.440445,74.4889832}, {184.620224,74.4963913}, {184.800003,74.5042419}}}
426debugShowCubicIntersection wtTs[0]=1 {{{184.260666,74.481575}, {184.440445,74.4889832}, {184.620224,74.4963913}, {184.800003,74.5042419}}} {{184.800003,74.5042419}} wnTs[0]=0 {{{184.800003,74.5042419}, {185.53334,74.5362625}, {186.266663,74.5669022}, {187,74.5923843}}}
427debugShowCubicIntersection wtTs[0]=1 {{{184.800003,74.5042419}, {185.53334,74.5362625}, {186.266663,74.5669022}, {187,74.5923843}}} {{187,74.5923843}} wnTs[0]=0 {{{187,74.5923843}, {187.218643,74.5999832}, {187.437286,74.6105118}, {187.65593,74.6210403}}}
428debugShowCubicIntersection wtTs[0]=1 {{{187,74.5923843}, {187.218643,74.5999832}, {187.437286,74.6105118}, {187.65593,74.6210403}}} {{187.65593,74.6210403}} wnTs[0]=0 {{{187.65593,74.6210403}, {188.170624,74.6458359}, {188.685303,74.6706314}, {189.199997,74.6571732}}}
429debugShowCubicIntersection wtTs[0]=1 {{{187.65593,74.6210403}, {188.170624,74.6458359}, {188.685303,74.6706314}, {189.199997,74.6571732}}} {{189.199997,74.6571732}} wnTs[0]=0 {{{189.199997,74.6571732}, {189.560562,74.6477432}, {189.921127,74.6077042}, {190.281693,74.5676651}}}
430debugShowCubicIntersection wtTs[0]=1 {{{189.199997,74.6571732}, {189.560562,74.6477432}, {189.921127,74.6077042}, {190.281693,74.5676651}}} {{190.281693,74.5676651}} wnTs[0]=0 {{{190.281693,74.5676651}, {190.654465,74.526268}, {191.027237,74.4848709}, {191.399994,74.4773026}}}
431debugShowCubicIntersection wtTs[0]=1 {{{190.281693,74.5676651}, {190.654465,74.526268}, {191.027237,74.4848709}, {191.399994,74.4773026}}} {{191.399994,74.4773026}} wnTs[0]=0 {{{191.399994,74.4773026}, {191.942627,74.4662857}, {192.48526,74.5001678}, {193.027893,74.5340576}}}
432debugShowCubicIntersection wtTs[0]=1 {{{191.399994,74.4773026}, {191.942627,74.4662857}, {192.48526,74.5001678}, {193.027893,74.5340576}}} {{193.027893,74.5340576}} wnTs[0]=0 {{{193.027893,74.5340576}, {193.218597,74.5459671}, {193.409302,74.5578766}, {193.600006,74.5678329}}}
433debugShowCubicIntersection wtTs[0]=1 {{{193.027893,74.5340576}, {193.218597,74.5459671}, {193.409302,74.5578766}, {193.600006,74.5678329}}} {{193.600006,74.5678329}} wnTs[0]=0 {{{193.600006,74.5678329}, {193.897125,74.5833511}, {194.19426,74.6063919}, {194.491394,74.6294403}}}
434debugShowCubicIntersection wtTs[0]=1 {{{193.600006,74.5678329}, {193.897125,74.5833511}, {194.19426,74.6063919}, {194.491394,74.6294403}}} {{194.491394,74.6294403}} wnTs[0]=0 {{{194.491394,74.6294403}, {194.927597,74.663269}, {195.3638,74.6970978}, {195.800003,74.7071152}}}
435debugShowCubicIntersection wtTs[0]=1 {{{194.491394,74.6294403}, {194.927597,74.663269}, {195.3638,74.6970978}, {195.800003,74.7071152}}} {{195.800003,74.7071152}} wnTs[0]=0 {{{195.800003,74.7071152}, {196.363327,74.7200546}, {196.926636,74.7021637}, {197.48996,74.6842728}}}
436debugShowCubicIntersection wtTs[0]=1 {{{195.800003,74.7071152}, {196.363327,74.7200546}, {196.926636,74.7021637}, {197.48996,74.6842728}}} {{197.48996,74.6842728}} wnTs[0]=0 {{{197.48996,74.6842728}, {197.659973,74.6788712}, {197.829987,74.6734695}, {198,74.6689148}}}
437debugShowCubicIntersection wtTs[0]=1 {{{197.48996,74.6842728}, {197.659973,74.6788712}, {197.829987,74.6734695}, {198,74.6689148}}} {{198,74.6689148}} wnTs[0]=0 {{{198,74.6689148}, {198.539948,74.6544571}, {199.07988,74.6331635}, {199.619827,74.6118698}}}
438debugShowCubicIntersection wtTs[0]=1 {{{198,74.6689148}, {198.539948,74.6544571}, {199.07988,74.6331635}, {199.619827,74.6118698}}} {{199.619827,74.6118698}} wnTs[0]=0 {{{199.619827,74.6118698}, {199.813217,74.6042404}, {200.006607,74.596611}, {200.199997,74.5892944}}}
439debugShowCubicIntersection wtTs[0]=1 {{{199.619827,74.6118698}, {199.813217,74.6042404}, {200.006607,74.596611}, {200.199997,74.5892944}}} {{200.199997,74.5892944}} wnTs[0]=0 {{{200.199997,74.5892944}, {200.468765,74.5791321}, {200.737534,74.5671921}, {201.006287,74.5552597}}}
440debugShowCubicIntersection wtTs[0]=1 {{{200.199997,74.5892944}, {200.468765,74.5791321}, {200.737534,74.5671921}, {201.006287,74.5552597}}} {{201.006287,74.5552597}} wnTs[0]=0 {{{201.006287,74.5552597}, {201.470856,74.5346298}, {201.935425,74.5139999}, {202.399994,74.5025177}}}
441debugShowCubicIntersection wtTs[0]=1 {{{201.006287,74.5552597}, {201.470856,74.5346298}, {201.935425,74.5139999}, {202.399994,74.5025177}}} {{202.399994,74.5025177}} wnTs[0]=0 {{{202.399994,74.5025177}, {202.888885,74.4904327}, {203.377777,74.4879456}, {203.866669,74.4854507}}}
442debugShowCubicIntersection wtTs[0]=1 {{{202.399994,74.5025177}, {202.888885,74.4904327}, {203.377777,74.4879456}, {203.866669,74.4854507}}} {{203.866669,74.4854507}} wnTs[0]=0 {{{203.866669,74.4854507}, {204.111115,74.4842072}, {204.35556,74.4829636}, {204.600006,74.4805222}}}
443debugShowCubicIntersection wtTs[0]=1 {{{203.866669,74.4854507}, {204.111115,74.4842072}, {204.35556,74.4829636}, {204.600006,74.4805222}}} {{204.600006,74.4805222}} wnTs[0]=0 {{{204.600006,74.4805222}, {204.84462,74.4780731}, {205.089233,74.476059}, {205.333847,74.4740448}}}
444debugShowCubicIntersection wtTs[0]=1 {{{204.600006,74.4805222}, {204.84462,74.4780731}, {205.089233,74.476059}, {205.333847,74.4740448}}} {{205.333847,74.4740448}} wnTs[0]=0 {{{205.333847,74.4740448}, {205.822556,74.4700241}, {206.311279,74.4659958}, {206.800003,74.4585342}}}
445debugShowCubicIntersection wtTs[0]=1 {{{205.333847,74.4740448}, {205.822556,74.4700241}, {206.311279,74.4659958}, {206.800003,74.4585342}}} {{206.800003,74.4585342}} wnTs[0]=0 {{{206.800003,74.4585342}, {207.53334,74.4473343}, {208.266663,74.4324722}, {209,74.413353}}}
446debugShowCubicIntersection wtTs[0]=1 {{{206.800003,74.4585342}, {207.53334,74.4473343}, {208.266663,74.4324722}, {209,74.413353}}} {{209,74.413353}} wnTs[0]=0 {{{209,74.413353}, {209.350708,74.404213}, {209.701416,74.3919983}, {210.052124,74.3797836}}}
447debugShowCubicIntersection wtTs[0]=1 {{{209,74.413353}, {209.350708,74.404213}, {209.701416,74.3919983}, {210.052124,74.3797836}}} {{210.052124,74.3797836}} wnTs[0]=0 {{{210.052124,74.3797836}, {210.434753,74.3664627}, {210.817368,74.3531418}, {211.199997,74.3438034}}}
448debugShowCubicIntersection wtTs[0]=1 {{{210.052124,74.3797836}, {210.434753,74.3664627}, {210.817368,74.3531418}, {211.199997,74.3438034}}} {{211.199997,74.3438034}} wnTs[0]=0 {{{211.199997,74.3438034}, {211.933334,74.3259048}, {212.666672,74.3128586}, {213.399994,74.305954}}}
449debugShowCubicIntersection wtTs[0]=1 {{{211.199997,74.3438034}, {211.933334,74.3259048}, {212.666672,74.3128586}, {213.399994,74.305954}}} {{213.399994,74.305954}} wnTs[0]=0 {{{213.399994,74.305954}, {214.133331,74.2990494}, {214.866669,74.2958145}, {215.600006,74.3023758}}}
450debugShowCubicIntersection wtTs[0]=1 {{{213.399994,74.305954}, {214.133331,74.2990494}, {214.866669,74.2958145}, {215.600006,74.3023758}}} {{215.600006,74.3023758}} wnTs[0]=0 {{{215.600006,74.3023758}, {216.076187,74.3066406}, {216.552383,74.317627}, {217.02858,74.3286133}}}
451debugShowCubicIntersection wtTs[0]=1 {{{215.600006,74.3023758}, {216.076187,74.3066406}, {216.552383,74.317627}, {217.02858,74.3286133}}} {{217.02858,74.3286133}} wnTs[0]=0 {{{217.02858,74.3286133}, {217.285721,74.334549}, {217.542862,74.340477}, {217.800003,74.3453522}}}
452debugShowCubicIntersection wtTs[0]=1 {{{217.02858,74.3286133}, {217.285721,74.334549}, {217.542862,74.340477}, {217.800003,74.3453522}}} {{217.800003,74.3453522}} wnTs[0]=0 {{{217.800003,74.3453522}, {218.041779,74.3499298}, {218.283554,74.358696}, {218.52533,74.3674622}}}
453debugShowCubicIntersection wtTs[0]=1 {{{217.800003,74.3453522}, {218.041779,74.3499298}, {218.283554,74.358696}, {218.52533,74.3674622}}} {{218.52533,74.3674622}} wnTs[0]=0 {{{218.52533,74.3674622}, {219.016891,74.3852844}, {219.508438,74.4031067}, {220,74.3857574}}}
454debugShowCubicIntersection wtTs[0]=1 {{{218.52533,74.3674622}, {219.016891,74.3852844}, {219.508438,74.4031067}, {220,74.3857574}}} {{220,74.3857574}} wnTs[0]=0 {{{220,74.3857574}, {220.409988,74.3712845}, {220.819977,74.3263474}, {221.229965,74.2814102}}}
455debugShowCubicIntersection wtTs[0]=1 {{{220,74.3857574}, {220.409988,74.3712845}, {220.819977,74.3263474}, {221.229965,74.2814102}}} {{221.229965,74.2814102}} wnTs[0]=0 {{{221.229965,74.2814102}, {221.553314,74.2459717}, {221.876648,74.2105331}, {222.199997,74.190033}}}
456debugShowCubicIntersection wtTs[0]=1 {{{221.229965,74.2814102}, {221.553314,74.2459717}, {221.876648,74.2105331}, {222.199997,74.190033}}} {{222.199997,74.190033}} wnTs[0]=0 {{{222.199997,74.190033}, {222.933334,74.1435471}, {223.666672,74.1037674}, {224.399994,74.1068344}}}
457debugShowCubicIntersection wtTs[0]=1 {{{222.199997,74.190033}, {222.933334,74.1435471}, {223.666672,74.1037674}, {224.399994,74.1068344}}} {{224.399994,74.1068344}} wnTs[0]=0 {{{224.399994,74.1068344}, {224.885803,74.1088638}, {225.371613,74.1381073}, {225.857422,74.1673508}}}
458debugShowCubicIntersection wtTs[0]=1 {{{224.399994,74.1068344}, {224.885803,74.1088638}, {225.371613,74.1381073}, {225.857422,74.1673508}}} {{225.857422,74.1673508}} wnTs[0]=0 {{{225.857422,74.1673508}, {226.10495,74.182251}, {226.352478,74.1971512}, {226.600006,74.2084503}}}
459debugShowCubicIntersection wtTs[0]=1 {{{225.857422,74.1673508}, {226.10495,74.182251}, {226.352478,74.1971512}, {226.600006,74.2084503}}} {{226.600006,74.2084503}} wnTs[0]=0 {{{226.600006,74.2084503}, {226.839722,74.2193909}, {227.079437,74.2324677}, {227.319153,74.2455521}}}
460debugShowCubicIntersection wtTs[0]=1 {{{226.600006,74.2084503}, {226.839722,74.2193909}, {227.079437,74.2324677}, {227.319153,74.2455521}}} {{227.319153,74.2455521}} wnTs[0]=0 {{{227.319153,74.2455521}, {227.812759,74.2724838}, {228.306381,74.2994156}, {228.800003,74.3076782}}}
461debugShowCubicIntersection wtTs[0]=1 {{{227.319153,74.2455521}, {227.812759,74.2724838}, {228.306381,74.2994156}, {228.800003,74.3076782}}} {{228.800003,74.3076782}} wnTs[0]=0 {{{228.800003,74.3076782}, {229.309921,74.3162155}, {229.819824,74.3054352}, {230.329742,74.2946548}}}
462debugShowCubicIntersection wtTs[0]=1 {{{228.800003,74.3076782}, {229.309921,74.3162155}, {229.819824,74.3054352}, {230.329742,74.2946548}}} {{230.329742,74.2946548}} wnTs[0]=0 {{{230.329742,74.2946548}, {230.553162,74.2899323}, {230.776581,74.2852097}, {231,74.2821121}}}
463debugShowCubicIntersection wtTs[0]=1 {{{230.329742,74.2946548}, {230.553162,74.2899323}, {230.776581,74.2852097}, {231,74.2821121}}} {{231,74.2821121}} wnTs[0]=0 {{{231,74.2821121}, {231.290405,74.2780838}, {231.580811,74.2724228}, {231.871216,74.2667542}}}
464debugShowCubicIntersection wtTs[0]=1 {{{231,74.2821121}, {231.290405,74.2780838}, {231.580811,74.2724228}, {231.871216,74.2667542}}} {{231.871216,74.2667542}} wnTs[0]=0 {{{231.871216,74.2667542}, {232.314148,74.2581177}, {232.757065,74.2494812}, {233.199997,74.2466507}}}
465debugShowCubicIntersection wtTs[0]=1 {{{231.871216,74.2667542}, {232.314148,74.2581177}, {232.757065,74.2494812}, {233.199997,74.2466507}}} {{233.199997,74.2466507}} wnTs[0]=0 {{{233.199997,74.2466507}, {233.343719,74.2457352}, {233.487442,74.2448959}, {233.631165,74.2442474}}}
466debugShowCubicIntersection wtTs[0]=1 {{{233.199997,74.2466507}, {233.343719,74.2457352}, {233.487442,74.2448959}, {233.631165,74.2442474}}} {{233.631165,74.2442474}} wnTs[0]=0 {{{233.631165,74.2442474}, {234.220779,74.2415924}, {234.810394,74.2421951}, {235.399994,74.2539825}}}
467debugShowCubicIntersection wtTs[0]=1 {{{233.631165,74.2442474}, {234.220779,74.2415924}, {234.810394,74.2421951}, {235.399994,74.2539825}}} {{235.399994,74.2539825}} wnTs[0]=0 {{{235.399994,74.2539825}, {235.845032,74.2628784}, {236.29007,74.2817612}, {236.735107,74.3006439}}}
468debugShowCubicIntersection wtTs[0]=1 {{{235.399994,74.2539825}, {235.845032,74.2628784}, {236.29007,74.2817612}, {236.735107,74.3006439}}} {{236.735107,74.3006439}} wnTs[0]=0 {{{236.735107,74.3006439}, {237.023407,74.3128738}, {237.311707,74.3251038}, {237.600006,74.3346176}}}
469debugShowCubicIntersection wtTs[0]=1 {{{236.735107,74.3006439}, {237.023407,74.3128738}, {237.311707,74.3251038}, {237.600006,74.3346176}}} {{237.600006,74.3346176}} wnTs[0]=0 {{{237.600006,74.3346176}, {238.333328,74.3588257}, {239.066666,74.3803329}, {239.800003,74.3992233}}}
470debugShowCubicIntersection wtTs[0]=1 {{{237.600006,74.3346176}, {238.333328,74.3588257}, {239.066666,74.3803329}, {239.800003,74.3992233}}} {{239.800003,74.3992233}} wnTs[0]=0 {{{239.800003,74.3992233}, {240.082169,74.4064941}, {240.364334,74.4108353}, {240.6465,74.4151764}}}
471debugShowCubicIntersection wtTs[0]=1 {{{239.800003,74.3992233}, {240.082169,74.4064941}, {240.364334,74.4108353}, {240.6465,74.4151764}}} {{240.6465,74.4151764}} wnTs[0]=0 {{{240.6465,74.4151764}, {241.097672,74.4221191}, {241.548828,74.4290695}, {242,74.4479828}}}
472debugShowCubicIntersection wtTs[0]=1 {{{240.6465,74.4151764}, {241.097672,74.4221191}, {241.548828,74.4290695}, {242,74.4479828}}} {{242,74.4479828}} wnTs[0]=0 {{{242,74.4479828}, {242.416458,74.4654388}, {242.832916,74.4942093}, {243.249374,74.5229874}}}
473debugShowCubicIntersection wtTs[0]=1 {{{242,74.4479828}, {242.416458,74.4654388}, {242.832916,74.4942093}, {243.249374,74.5229874}}} {{243.249374,74.5229874}} wnTs[0]=0 {{{243.249374,74.5229874}, {243.566254,74.5448837}, {243.883118,74.5667801}, {244.199997,74.5836868}}}
474debugShowCubicIntersection wtTs[0]=1 {{{243.249374,74.5229874}, {243.566254,74.5448837}, {243.883118,74.5667801}, {244.199997,74.5836868}}} {{244.199997,74.5836868}} wnTs[0]=0 {{{244.199997,74.5836868}, {244.933334,74.6228104}, {245.666672,74.6546402}, {246.399994,74.6827393}}}
475debugShowCubicIntersection wtTs[0]=1 {{{244.199997,74.5836868}, {244.933334,74.6228104}, {245.666672,74.6546402}, {246.399994,74.6827393}}} {{246.399994,74.6827393}} wnTs[0]=0 {{{246.399994,74.6827393}, {247.133331,74.7108383}, {247.866669,74.7327499}, {248.600006,74.7522964}}}
476debugShowCubicLineIntersection wtTs[0]=1 {{{246.399994,74.6827393}, {247.133331,74.7108383}, {247.866669,74.7327499}, {248.600006,74.7522964}}} {{248.600006,74.7522964}} wnTs[0]=0 {{{248.600006,74.7522964}, {248.714218,74.7553406}}}
477debugShowCubicLineIntersection wtTs[0]=0 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{248.714218,74.7553406}} wnTs[0]=1 {{{248.600006,74.7522964}, {248.714218,74.7553406}}}
478debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}}
479debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
480SkOpSegment::addT insert t=0.0119047452 segID=150 spanID=610
481debugShowCubicIntersection wtTs[0]=1 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{252.266663,74.8017731}} wnTs[0]=0 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}}
482debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
483debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
484debugShowCubicIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.1999969,74.8000031}} wnTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}}
485debugShowCubicIntersection no intersect {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
486debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
487debugShowCubicIntersection no intersect {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}}
488debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
489debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}}
490debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
491SkOpSegment::addT insert t=0.988095214 segID=299 spanID=611
492debugShowCubicIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
493debugShowCubicIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}}
494debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
495debugShowCubicIntersection no intersect {{{78.1107025,74.66716}, {78.4738007,74.722496}, {78.8368988,74.777832}, {79.1999969,74.7998505}}} {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
496debugShowCubicIntersection no intersect {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{{78.1107025,74.9328461}, {78.4738007,74.8775101}, {78.8368988,74.8221741}, {79.1999969,74.8001556}}}
497debugShowCubicIntersection wtTs[0]=0.00172605823 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{79.2025299,74.8000031}} wnTs[0]=0.00172606 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
498SkOpSegment::addT alias t=0.00172605823 segID=11 spanID=600
499SkOpSegment::addT insert t=0.00172605823 segID=161 spanID=612
500debugShowCubicIntersection no intersect {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
501debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
502SkOpSegment::addT insert t=0.940462545 segID=299 spanID=613
503debugShowCubicIntersection no intersect {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
504debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=1 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
505debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
506debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
507SkOpSegment::addT insert t=0.928577558 segID=299 spanID=614
508SkOpSegment::addT insert t=0.928571405 segID=299 spanID=615
509debugShowCubicIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=1 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
510debugShowCubicIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
511debugShowCubicIntersection no intersect {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
512debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
513debugShowCubicIntersection no intersect {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
514debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
515debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}}
516debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
517SkOpSegment::addT insert t=0.91666666 segID=299 spanID=616
518debugShowCubicIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
519debugShowCubicIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}}
520debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
521debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}}
522debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
523debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
524SkOpSegment::addT insert t=0.892857128 segID=299 spanID=617
525debugShowCubicIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}}
526debugShowCubicIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
527debugShowCubicIntersection no intersect {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
528debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
529debugShowCubicIntersection no intersect {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
530debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
531debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}}
532debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
533SkOpSegment::addT insert t=0.880952383 segID=299 spanID=618
534debugShowCubicIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
535debugShowCubicIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}}
536debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
537debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}}
538debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}}
539debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
540SkOpSegment::addT insert t=0.44047615 segID=299 spanID=619
541debugShowCubicIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}}
542debugShowCubicIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} wnTs[1]=1
543debugShowCubicIntersection wtTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}}
544debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
545SkOpSegment::addT insert t=0.428571405 segID=299 spanID=620
546debugShowCubicIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}}
547debugShowCubicIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}}
548debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
549debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}}
550debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
551debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
552SkOpSegment::addT insert t=0.0119047452 segID=299 spanID=621
553debugShowCubicIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}}
554debugShowCubicIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
555debugShowCubicIntersection no intersect {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}}
556debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
557debugShowCubicIntersection no intersect {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
558debugShowCubicIntersection wtTs[0]=1 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=1 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}}
559debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
560debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
561debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
562debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
563debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
564SkOpSegment::addT alias t=0.0017190524 segID=161 spanID=612
565debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
566SkOpSegment::addT insert t=0.99844881 segID=162 spanID=622
567debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
568debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
569debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
570debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
571debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
572debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
573debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
574debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
575debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
576debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
577debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
578debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
579debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
580debugShowLineIntersection wtTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}} {{253,74.8000031}} wtTs[1]=1 {{68.1999969,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=1
581debugShowCubicIntersection wtTs[0]=1 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}} {{68.9333344,74.7922058}} wnTs[0]=0 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
582debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
583debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}}
584debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
585debugShowCubicIntersection wtTs[0]=1 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}} {{71.5388947,74.9073105}} wnTs[0]=0 {{{71.5388947,74.9073105}, {71.8925934,74.9488373}, {72.2462997,74.9903641}, {72.5999985,75.0105362}}}
586debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
587debugShowCubicIntersection wtTs[0]=1 {{{71.5388947,74.9073105}, {71.8925934,74.9488373}, {72.2462997,74.9903641}, {72.5999985,75.0105362}}} {{72.5999985,75.0105362}} wnTs[0]=0 {{{72.5999985,75.0105362}, {73.1301117,75.0407715}, {73.6602249,75.0435104}, {74.1903381,75.0462494}}}
588debugShowCubicIntersection wtTs[0]=1 {{{72.5999985,75.0105362}, {73.1301117,75.0407715}, {73.6602249,75.0435104}, {74.1903381,75.0462494}}} {{74.1903381,75.0462494}} wnTs[0]=0 {{{74.1903381,75.0462494}, {74.3935623,75.0472946}, {74.5967789,75.0483398}, {74.8000031,75.0509415}}}
589debugShowCubicIntersection wtTs[0]=1 {{{74.1903381,75.0462494}, {74.3935623,75.0472946}, {74.5967789,75.0483398}, {74.8000031,75.0509415}}} {{74.8000031,75.0509415}} wnTs[0]=0 {{{74.8000031,75.0509415}, {75.0211792,75.053772}, {75.242363,75.0601425}, {75.4635391,75.0665054}}}
590debugShowCubicIntersection wtTs[0]=1 {{{74.8000031,75.0509415}, {75.0211792,75.053772}, {75.242363,75.0601425}, {75.4635391,75.0665054}}} {{75.4635391,75.0665054}} wnTs[0]=0 {{{75.4635391,75.0665054}, {75.9756927,75.0812454}, {76.4878464,75.0959854}, {77,75.0667953}}}
591debugShowCubicIntersection wtTs[0]=1 {{{75.4635391,75.0665054}, {75.9756927,75.0812454}, {76.4878464,75.0959854}, {77,75.0667953}}} {{77,75.0667953}} wnTs[0]=0 {{{77,75.0667953}, {77.3702316,75.0456924}, {77.7404709,74.9892731}, {78.1107025,74.9328461}}}
592debugShowCubicIntersection wtTs[0]=1 {{{77,75.0667953}, {77.3702316,75.0456924}, {77.7404709,74.9892731}, {78.1107025,74.9328461}}} {{78.1107025,74.9328461}} wnTs[0]=0 {{{78.1107025,74.9328461}, {78.4738007,74.8775101}, {78.8368988,74.8221741}, {79.1999969,74.8001556}}}
593debugShowCubicIntersection wtTs[0]=1 {{{78.1107025,74.9328461}, {78.4738007,74.8775101}, {78.8368988,74.8221741}, {79.1999969,74.8001556}}} {{79.1999969,74.8001556}} wnTs[0]=0 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
594debugShowCubicIntersection wtTs[0]=1 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}} {{80.6670074,74.790184}} wnTs[0]=0 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
595debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
596debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
597debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
598debugShowCubicIntersection wtTs[0]=1 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}} {{82.1315613,74.7978897}} wnTs[0]=0 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
599debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
600debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}}
601debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
602debugShowCubicIntersection wtTs[0]=1 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}} {{84.5777359,74.827713}} wnTs[0]=0 {{{84.5777359,74.827713}, {84.9851608,74.842392}, {85.3925781,74.8570709}, {85.8000031,74.8570709}}}
603debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
604debugShowCubicIntersection wtTs[0]=1 {{{84.5777359,74.827713}, {84.9851608,74.842392}, {85.3925781,74.8570709}, {85.8000031,74.8570709}}} {{85.8000031,74.8570709}} wnTs[0]=0 {{{85.8000031,74.8570709}, {86.2074203,74.8570709}, {86.6148453,74.842392}, {87.0222626,74.827713}}}
605debugShowCubicIntersection wtTs[0]=1 {{{85.8000031,74.8570709}, {86.2074203,74.8570709}, {86.6148453,74.842392}, {87.0222626,74.827713}}} {{87.0222626,74.827713}} wnTs[0]=0 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}}
606debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
607debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
608debugShowCubicIntersection wtTs[0]=1 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}} {{88.4729385,74.7922745}} wnTs[0]=0 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
609debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
610debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}}
611debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
612debugShowCubicIntersection wtTs[0]=1 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}} {{91.2861557,74.9081879}} wnTs[0]=0 {{{91.2861557,74.9081879}, {91.6574402,74.9544754}, {92.028717,75.0007629}, {92.4000015,75.0176926}}}
613debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
614debugShowCubicIntersection wtTs[0]=1 {{{91.2861557,74.9081879}, {91.6574402,74.9544754}, {92.028717,75.0007629}, {92.4000015,75.0176926}}} {{92.4000015,75.0176926}} wnTs[0]=0 {{{92.4000015,75.0176926}, {92.9111481,75.0410004}, {93.4223022,75.0278778}, {93.9334488,75.0147552}}}
615debugShowCubicIntersection wtTs[0]=1 {{{92.4000015,75.0176926}, {92.9111481,75.0410004}, {93.4223022,75.0278778}, {93.9334488,75.0147552}}} {{93.9334488,75.0147552}} wnTs[0]=0 {{{93.9334488,75.0147552}, {94.155632,75.0090561}, {94.3778152,75.0033493}, {94.5999985,75.0006409}}}
616debugShowCubicIntersection wtTs[0]=1 {{{93.9334488,75.0147552}, {94.155632,75.0090561}, {94.3778152,75.0033493}, {94.5999985,75.0006409}}} {{94.5999985,75.0006409}} wnTs[0]=0 {{{94.5999985,75.0006409}, {94.8669891,74.9973831}, {95.1339798,74.9889908}, {95.4009705,74.9806061}}}
617debugShowCubicIntersection wtTs[0]=1 {{{94.5999985,75.0006409}, {94.8669891,74.9973831}, {95.1339798,74.9889908}, {95.4009705,74.9806061}}} {{95.4009705,74.9806061}} wnTs[0]=0 {{{95.4009705,74.9806061}, {95.8673172,74.9659576}, {96.3336563,74.9513092}, {96.8000031,74.9639893}}}
618debugShowCubicIntersection wtTs[0]=1 {{{95.4009705,74.9806061}, {95.8673172,74.9659576}, {96.3336563,74.9513092}, {96.8000031,74.9639893}}} {{96.8000031,74.9639893}} wnTs[0]=0 {{{96.8000031,74.9639893}, {97.2396164,74.9759521}, {97.6792297,75.0139465}, {98.1188431,75.0519409}}}
619debugShowCubicIntersection wtTs[0]=1 {{{96.8000031,74.9639893}, {97.2396164,74.9759521}, {97.6792297,75.0139465}, {98.1188431,75.0519409}}} {{98.1188431,75.0519409}} wnTs[0]=0 {{{98.1188431,75.0519409}, {98.4125595,75.0773239}, {98.7062836,75.1027069}, {99,75.1203232}}}
620debugShowCubicIntersection wtTs[0]=1 {{{98.1188431,75.0519409}, {98.4125595,75.0773239}, {98.7062836,75.1027069}, {99,75.1203232}}} {{99,75.1203232}} wnTs[0]=0 {{{99,75.1203232}, {99.7333298,75.1643066}, {100.466667,75.2075195}, {101.199997,75.2278976}}}
621debugShowCubicIntersection wtTs[0]=1 {{{99,75.1203232}, {99.7333298,75.1643066}, {100.466667,75.2075195}, {101.199997,75.2278976}}} {{101.199997,75.2278976}} wnTs[0]=0 {{{101.199997,75.2278976}, {101.6632,75.2407608}, {102.126396,75.2405472}, {102.5896,75.2403336}}}
622debugShowCubicIntersection wtTs[0]=1 {{{101.199997,75.2278976}, {101.6632,75.2407608}, {102.126396,75.2405472}, {102.5896,75.2403336}}} {{102.5896,75.2403336}} wnTs[0]=0 {{{102.5896,75.2403336}, {102.859734,75.2402115}, {103.129868,75.2400894}, {103.400002,75.2425613}}}
623debugShowCubicIntersection wtTs[0]=1 {{{102.5896,75.2403336}, {102.859734,75.2402115}, {103.129868,75.2400894}, {103.400002,75.2425613}}} {{103.400002,75.2425613}} wnTs[0]=0 {{{103.400002,75.2425613}, {103.499123,75.2434692}, {103.598244,75.2443542}, {103.697365,75.2452393}}}
624debugShowCubicIntersection wtTs[0]=1 {{{103.400002,75.2425613}, {103.499123,75.2434692}, {103.598244,75.2443542}, {103.697365,75.2452393}}} {{103.697365,75.2452393}} wnTs[0]=0 {{{103.697365,75.2452393}, {104.331573,75.250885}, {104.96579,75.2565308}, {105.599998,75.2681274}}}
625debugShowCubicIntersection wtTs[0]=1 {{{103.697365,75.2452393}, {104.331573,75.250885}, {104.96579,75.2565308}, {105.599998,75.2681274}}} {{105.599998,75.2681274}} wnTs[0]=0 {{{105.599998,75.2681274}, {105.951164,75.2745514}, {106.30233,75.2846603}, {106.653496,75.2947693}}}
626debugShowCubicIntersection wtTs[0]=1 {{{105.599998,75.2681274}, {105.951164,75.2745514}, {106.30233,75.2846603}, {106.653496,75.2947693}}} {{106.653496,75.2947693}} wnTs[0]=0 {{{106.653496,75.2947693}, {107.035667,75.3057709}, {107.417831,75.3167725}, {107.800003,75.3230209}}}
627debugShowCubicIntersection wtTs[0]=1 {{{106.653496,75.2947693}, {107.035667,75.3057709}, {107.417831,75.3167725}, {107.800003,75.3230209}}} {{107.800003,75.3230209}} wnTs[0]=0 {{{107.800003,75.3230209}, {107.904305,75.3247223}, {108.008606,75.3265228}, {108.112907,75.3283234}}}
628debugShowCubicIntersection wtTs[0]=1 {{{107.800003,75.3230209}, {107.904305,75.3247223}, {108.008606,75.3265228}, {108.112907,75.3283234}}} {{108.112907,75.3283234}} wnTs[0]=0 {{{108.112907,75.3283234}, {108.741936,75.33918}, {109.370972,75.350029}, {110,75.340065}}}
629debugShowCubicIntersection wtTs[0]=1 {{{108.112907,75.3283234}, {108.741936,75.33918}, {109.370972,75.350029}, {110,75.340065}}} {{110,75.340065}} wnTs[0]=0 {{{110,75.340065}, {110.73333,75.3284454}, {111.466667,75.2919846}, {112.199997,75.2532883}}}
630debugShowCubicIntersection wtTs[0]=1 {{{110,75.340065}, {110.73333,75.3284454}, {111.466667,75.2919846}, {112.199997,75.2532883}}} {{112.199997,75.2532883}} wnTs[0]=0 {{{112.199997,75.2532883}, {112.524193,75.2361755}, {112.848389,75.2113037}, {113.172585,75.1864319}}}
631debugShowCubicIntersection wtTs[0]=1 {{{112.199997,75.2532883}, {112.524193,75.2361755}, {112.848389,75.2113037}, {113.172585,75.1864319}}} {{113.172585,75.1864319}} wnTs[0]=0 {{{113.172585,75.1864319}, {113.581726,75.1550446}, {113.99086,75.1236496}, {114.400002,75.1078644}}}
632debugShowCubicIntersection wtTs[0]=1 {{{113.172585,75.1864319}, {113.581726,75.1550446}, {113.99086,75.1236496}, {114.400002,75.1078644}}} {{114.400002,75.1078644}} wnTs[0]=0 {{{114.400002,75.1078644}, {115.133331,75.079567}, {115.866669,75.0734863}, {116.599998,75.0834885}}}
633debugShowCubicIntersection wtTs[0]=1 {{{114.400002,75.1078644}, {115.133331,75.079567}, {115.866669,75.0734863}, {116.599998,75.0834885}}} {{116.599998,75.0834885}} wnTs[0]=0 {{{116.599998,75.0834885}, {117.013039,75.089119}, {117.426071,75.1088409}, {117.839111,75.1285629}}}
634debugShowCubicIntersection wtTs[0]=1 {{{116.599998,75.0834885}, {117.013039,75.089119}, {117.426071,75.1088409}, {117.839111,75.1285629}}} {{117.839111,75.1285629}} wnTs[0]=0 {{{117.839111,75.1285629}, {118.159409,75.1438599}, {118.479706,75.1591568}, {118.800003,75.1678772}}}
635debugShowCubicIntersection wtTs[0]=1 {{{117.839111,75.1285629}, {118.159409,75.1438599}, {118.479706,75.1591568}, {118.800003,75.1678772}}} {{118.800003,75.1678772}} wnTs[0]=0 {{{118.800003,75.1678772}, {118.915619,75.1710281}, {119.031235,75.1743622}, {119.146851,75.1776962}}}
636debugShowCubicIntersection wtTs[0]=1 {{{118.800003,75.1678772}, {118.915619,75.1710281}, {119.031235,75.1743622}, {119.146851,75.1776962}}} {{119.146851,75.1776962}} wnTs[0]=0 {{{119.146851,75.1776962}, {119.764565,75.1954956}, {120.382286,75.2133026}, {121,75.2033386}}}
637debugShowCubicIntersection wtTs[0]=1 {{{119.146851,75.1776962}, {119.764565,75.1954956}, {120.382286,75.2133026}, {121,75.2033386}}} {{121,75.2033386}} wnTs[0]=0 {{{121,75.2033386}, {121.552635,75.1944351}, {122.105278,75.1614532}, {122.657913,75.1284714}}}
638debugShowCubicIntersection wtTs[0]=1 {{{121,75.2033386}, {121.552635,75.1944351}, {122.105278,75.1614532}, {122.657913,75.1284714}}} {{122.657913,75.1284714}} wnTs[0]=0 {{{122.657913,75.1284714}, {122.838608,75.1176834}, {123.019302,75.1068954}, {123.199997,75.0969543}}}
639debugShowCubicIntersection wtTs[0]=1 {{{122.657913,75.1284714}, {122.838608,75.1176834}, {123.019302,75.1068954}, {123.199997,75.0969543}}} {{123.199997,75.0969543}} wnTs[0]=0 {{{123.199997,75.0969543}, {123.480431,75.0815277}, {123.760864,75.060524}, {124.041298,75.0395203}}}
640debugShowCubicIntersection wtTs[0]=1 {{{123.199997,75.0969543}, {123.480431,75.0815277}, {123.760864,75.060524}, {124.041298,75.0395203}}} {{124.041298,75.0395203}} wnTs[0]=0 {{{124.041298,75.0395203}, {124.494202,75.0056076}, {124.947098,74.9716949}, {125.400002,74.9612503}}}
641debugShowCubicIntersection wtTs[0]=1 {{{124.041298,75.0395203}, {124.494202,75.0056076}, {124.947098,74.9716949}, {125.400002,74.9612503}}} {{125.400002,74.9612503}} wnTs[0]=0 {{{125.400002,74.9612503}, {126.133331,74.9443436}, {126.866669,74.9602585}, {127.599998,74.9955215}}}
642debugShowCubicIntersection wtTs[0]=1 {{{125.400002,74.9612503}, {126.133331,74.9443436}, {126.866669,74.9602585}, {127.599998,74.9955215}}} {{127.599998,74.9955215}} wnTs[0]=0 {{{127.599998,74.9955215}, {128.17691,75.023262}, {128.75383,75.0766068}, {129.33075,75.1299438}}}
643debugShowCubicIntersection wtTs[0]=1 {{{127.599998,74.9955215}, {128.17691,75.023262}, {128.75383,75.0766068}, {129.33075,75.1299438}}} {{129.33075,75.1299438}} wnTs[0]=0 {{{129.33075,75.1299438}, {129.487167,75.1444092}, {129.643585,75.1588745}, {129.800003,75.1728287}}}
644debugShowCubicIntersection wtTs[0]=1 {{{129.33075,75.1299438}, {129.487167,75.1444092}, {129.643585,75.1588745}, {129.800003,75.1728287}}} {{129.800003,75.1728287}} wnTs[0]=0 {{{129.800003,75.1728287}, {130.08493,75.1982422}, {130.369843,75.2303619}, {130.65477,75.2624817}}}
645debugShowCubicIntersection wtTs[0]=1 {{{129.800003,75.1728287}, {130.08493,75.1982422}, {130.369843,75.2303619}, {130.65477,75.2624817}}} {{130.65477,75.2624817}} wnTs[0]=0 {{{130.65477,75.2624817}, {131.10318,75.3130264}, {131.55159,75.3635712}, {132,75.3879776}}}
646debugShowCubicIntersection wtTs[0]=1 {{{130.65477,75.2624817}, {131.10318,75.3130264}, {131.55159,75.3635712}, {132,75.3879776}}} {{132,75.3879776}} wnTs[0]=0 {{{132,75.3879776}, {132.682098,75.4251099}, {133.364182,75.4193726}, {134.04628,75.4136353}}}
647debugShowCubicLineIntersection wtTs[0]=1 {{{132,75.3879776}, {132.682098,75.4251099}, {133.364182,75.4193726}, {134.04628,75.4136353}}} {{134.04628,75.4136353}} wnTs[0]=0 {{{134.04628,75.4136353}, {134.199997,75.4123535}}}
648debugShowCubicLineIntersection wtTs[0]=0 {{{134.199997,75.4123535}, {134.740479,75.4080048}, {135.28096,75.3897247}, {135.821426,75.3714523}}} {{134.199997,75.4123535}} wnTs[0]=1 {{{134.04628,75.4136353}, {134.199997,75.4123535}}}
649debugShowCubicIntersection wtTs[0]=1 {{{134.199997,75.4123535}, {134.740479,75.4080048}, {135.28096,75.3897247}, {135.821426,75.3714523}}} {{135.821426,75.3714523}} wnTs[0]=0 {{{135.821426,75.3714523}, {136.014282,75.3649292}, {136.207138,75.3584061}, {136.399994,75.3525162}}}
650debugShowCubicIntersection wtTs[0]=1 {{{135.821426,75.3714523}, {136.014282,75.3649292}, {136.207138,75.3584061}, {136.399994,75.3525162}}} {{136.399994,75.3525162}} wnTs[0]=0 {{{136.399994,75.3525162}, {136.723831,75.3426285}, {137.047668,75.3308029}, {137.371506,75.3189697}}}
651debugShowCubicIntersection wtTs[0]=1 {{{136.399994,75.3525162}, {136.723831,75.3426285}, {137.047668,75.3308029}, {137.371506,75.3189697}}} {{137.371506,75.3189697}} wnTs[0]=0 {{{137.371506,75.3189697}, {137.781006,75.3040085}, {138.190506,75.2890472}, {138.600006,75.2780228}}}
652debugShowCubicIntersection wtTs[0]=1 {{{137.371506,75.3189697}, {137.781006,75.3040085}, {138.190506,75.2890472}, {138.600006,75.2780228}}} {{138.600006,75.2780228}} wnTs[0]=0 {{{138.600006,75.2780228}, {138.775055,75.2733078}, {138.950119,75.2678604}, {139.125183,75.262413}}}
653debugShowCubicIntersection wtTs[0]=1 {{{138.600006,75.2780228}, {138.775055,75.2733078}, {138.950119,75.2678604}, {139.125183,75.262413}}} {{139.125183,75.262413}} wnTs[0]=0 {{{139.125183,75.262413}, {139.683456,75.2450409}, {140.24173,75.2276688}, {140.800003,75.2340317}}}
654debugShowCubicIntersection wtTs[0]=1 {{{139.125183,75.262413}, {139.683456,75.2450409}, {140.24173,75.2276688}, {140.800003,75.2340317}}} {{140.800003,75.2340317}} wnTs[0]=0 {{{140.800003,75.2340317}, {141.173523,75.2382889}, {141.547028,75.259819}, {141.920547,75.2813568}}}
655debugShowCubicIntersection wtTs[0]=1 {{{140.800003,75.2340317}, {141.173523,75.2382889}, {141.547028,75.259819}, {141.920547,75.2813568}}} {{141.920547,75.2813568}} wnTs[0]=0 {{{141.920547,75.2813568}, {142.280365,75.3021011}, {142.640182,75.3228455}, {143,75.3281403}}}
656debugShowCubicIntersection wtTs[0]=1 {{{141.920547,75.2813568}, {142.280365,75.3021011}, {142.640182,75.3228455}, {143,75.3281403}}} {{143,75.3281403}} wnTs[0]=0 {{{143,75.3281403}, {143.733337,75.3389359}, {144.46666,75.3424072}, {145.199997,75.2988205}}}
657debugShowCubicIntersection wtTs[0]=1 {{{143,75.3281403}, {143.733337,75.3389359}, {144.46666,75.3424072}, {145.199997,75.2988205}}} {{145.199997,75.2988205}} wnTs[0]=0 {{{145.199997,75.2988205}, {145.574966,75.276535}, {145.949936,75.2288513}, {146.32489,75.1811676}}}
658debugShowCubicIntersection wtTs[0]=1 {{{145.199997,75.2988205}, {145.574966,75.276535}, {145.949936,75.2288513}, {146.32489,75.1811676}}} {{146.32489,75.1811676}} wnTs[0]=0 {{{146.32489,75.1811676}, {146.683258,75.1355896}, {147.041626,75.0900192}, {147.399994,75.0666199}}}
659debugShowCubicIntersection wtTs[0]=1 {{{146.32489,75.1811676}, {146.683258,75.1355896}, {147.041626,75.0900192}, {147.399994,75.0666199}}} {{147.399994,75.0666199}} wnTs[0]=0 {{{147.399994,75.0666199}, {148.133331,75.0187454}, {148.866669,74.9981079}, {149.600006,75.0115509}}}
660debugShowCubicIntersection wtTs[0]=1 {{{147.399994,75.0666199}, {148.133331,75.0187454}, {148.866669,74.9981079}, {149.600006,75.0115509}}} {{149.600006,75.0115509}} wnTs[0]=0 {{{149.600006,75.0115509}, {149.982086,75.0185547}, {150.364182,75.0495148}, {150.746277,75.0804749}}}
661debugShowCubicIntersection wtTs[0]=1 {{{149.600006,75.0115509}, {149.982086,75.0185547}, {150.364182,75.0495148}, {150.746277,75.0804749}}} {{150.746277,75.0804749}} wnTs[0]=0 {{{150.746277,75.0804749}, {151.097519,75.1089401}, {151.448761,75.1374054}, {151.800003,75.1472549}}}
662debugShowCubicIntersection wtTs[0]=1 {{{150.746277,75.0804749}, {151.097519,75.1089401}, {151.448761,75.1374054}, {151.800003,75.1472549}}} {{151.800003,75.1472549}} wnTs[0]=0 {{{151.800003,75.1472549}, {152.343307,75.1624985}, {152.886597,75.1531296}, {153.429901,75.1437607}}}
663debugShowCubicIntersection wtTs[0]=1 {{{151.800003,75.1472549}, {152.343307,75.1624985}, {152.886597,75.1531296}, {153.429901,75.1437607}}} {{153.429901,75.1437607}} wnTs[0]=0 {{{153.429901,75.1437607}, {153.619934,75.14048}, {153.809967,75.137207}, {154,75.1349792}}}
664debugShowCubicIntersection wtTs[0]=1 {{{153.429901,75.1437607}, {153.619934,75.14048}, {153.809967,75.137207}, {154,75.1349792}}} {{154,75.1349792}} wnTs[0]=0 {{{154,75.1349792}, {154.295746,75.1315155}, {154.591476,75.123848}, {154.887222,75.1161804}}}
665debugShowCubicIntersection wtTs[0]=1 {{{154,75.1349792}, {154.295746,75.1315155}, {154.591476,75.123848}, {154.887222,75.1161804}}} {{154.887222,75.1161804}} wnTs[0]=0 {{{154.887222,75.1161804}, {155.324814,75.1048279}, {155.762405,75.0934753}, {156.199997,75.0957642}}}
666debugShowCubicIntersection wtTs[0]=1 {{{154.887222,75.1161804}, {155.324814,75.1048279}, {155.762405,75.0934753}, {156.199997,75.0957642}}} {{156.199997,75.0957642}} wnTs[0]=0 {{{156.199997,75.0957642}, {156.559143,75.097641}, {156.918289,75.1122131}, {157.27742,75.1267853}}}
667debugShowCubicIntersection wtTs[0]=1 {{{156.199997,75.0957642}, {156.559143,75.097641}, {156.918289,75.1122131}, {157.27742,75.1267853}}} {{157.27742,75.1267853}} wnTs[0]=0 {{{157.27742,75.1267853}, {157.651611,75.1419754}, {158.025803,75.1571655}, {158.399994,75.1579895}}}
668debugShowCubicIntersection wtTs[0]=1 {{{157.27742,75.1267853}, {157.651611,75.1419754}, {158.025803,75.1571655}, {158.399994,75.1579895}}} {{158.399994,75.1579895}} wnTs[0]=0 {{{158.399994,75.1579895}, {159.133331,75.1596069}, {159.866669,75.1515121}, {160.600006,75.105484}}}
669debugShowCubicIntersection wtTs[0]=1 {{{158.399994,75.1579895}, {159.133331,75.1596069}, {159.866669,75.1515121}, {160.600006,75.105484}}} {{160.600006,75.105484}} wnTs[0]=0 {{{160.600006,75.105484}, {160.952393,75.0833588}, {161.304794,75.0397339}, {161.657196,74.996109}}}
670debugShowCubicIntersection wtTs[0]=1 {{{160.600006,75.105484}, {160.952393,75.0833588}, {161.304794,75.0397339}, {161.657196,74.996109}}} {{161.657196,74.996109}} wnTs[0]=0 {{{161.657196,74.996109}, {162.038132,74.9489594}, {162.419067,74.9018021}, {162.800003,74.8818054}}}
671debugShowCubicIntersection wtTs[0]=1 {{{161.657196,74.996109}, {162.038132,74.9489594}, {162.419067,74.9018021}, {162.800003,74.8818054}}} {{162.800003,74.8818054}} wnTs[0]=0 {{{162.800003,74.8818054}, {163.53334,74.8433075}, {164.266663,74.8363724}, {165,74.8744736}}}
672debugShowCubicIntersection wtTs[0]=1 {{{162.800003,74.8818054}, {163.53334,74.8433075}, {164.266663,74.8363724}, {165,74.8744736}}} {{165,74.8744736}} wnTs[0]=0 {{{165,74.8744736}, {165.356293,74.8929825}, {165.712585,74.9419861}, {166.068878,74.9909897}}}
673debugShowCubicIntersection wtTs[0]=1 {{{165,74.8744736}, {165.356293,74.8929825}, {165.712585,74.9419861}, {166.068878,74.9909897}}} {{166.068878,74.9909897}} wnTs[0]=0 {{{166.068878,74.9909897}, {166.445923,75.0428467}, {166.822952,75.0947037}, {167.199997,75.1104279}}}
674debugShowCubicIntersection wtTs[0]=1 {{{166.068878,74.9909897}, {166.445923,75.0428467}, {166.822952,75.0947037}, {167.199997,75.1104279}}} {{167.199997,75.1104279}} wnTs[0]=0 {{{167.199997,75.1104279}, {167.933334,75.1409988}, {168.666672,75.1096573}, {169.399994,75.0579224}}}
675debugShowCubicIntersection wtTs[0]=1 {{{167.199997,75.1104279}, {167.933334,75.1409988}, {168.666672,75.1096573}, {169.399994,75.0579224}}} {{169.399994,75.0579224}} wnTs[0]=0 {{{169.399994,75.0579224}, {169.752808,75.0330276}, {170.105621,74.982338}, {170.458435,74.9316483}}}
676debugShowCubicIntersection wtTs[0]=1 {{{169.399994,75.0579224}, {169.752808,75.0330276}, {170.105621,74.982338}, {170.458435,74.9316483}}} {{170.458435,74.9316483}} wnTs[0]=0 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}}
677debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}}
678debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
679debugShowCubicIntersection wtTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}}
680debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
681debugShowCubicLineIntersection wtTs[0]=1 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}} {{175.902405,75.0138397}} wnTs[0]=0 {{{175.902405,75.0138397}, {176,75.0262146}}}
682debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
683debugShowCubicLineIntersection wtTs[0]=0 {{{176,75.0262146}, {176.306427,75.0650406}, {176.612839,75.1189728}, {176.919266,75.1729126}}} {{176,75.0262146}} wnTs[0]=1 {{{175.902405,75.0138397}, {176,75.0262146}}}
684debugShowCubicIntersection wtTs[0]=1 {{{176,75.0262146}, {176.306427,75.0650406}, {176.612839,75.1189728}, {176.919266,75.1729126}}} {{176.919266,75.1729126}} wnTs[0]=0 {{{176.919266,75.1729126}, {177.346176,75.2480545}, {177.773087,75.3231964}, {178.199997,75.3574677}}}
685debugShowCubicIntersection wtTs[0]=1 {{{176.919266,75.1729126}, {177.346176,75.2480545}, {177.773087,75.3231964}, {178.199997,75.3574677}}} {{178.199997,75.3574677}} wnTs[0]=0 {{{178.199997,75.3574677}, {178.933334,75.4163361}, {179.666672,75.4057388}, {180.399994,75.3794556}}}
686debugShowCubicIntersection wtTs[0]=1 {{{178.199997,75.3574677}, {178.933334,75.4163361}, {179.666672,75.4057388}, {180.399994,75.3794556}}} {{180.399994,75.3794556}} wnTs[0]=0 {{{180.399994,75.3794556}, {180.822174,75.3643265}, {181.244354,75.322731}, {181.666534,75.2811356}}}
687debugShowCubicIntersection wtTs[0]=1 {{{180.399994,75.3794556}, {180.822174,75.3643265}, {181.244354,75.322731}, {181.666534,75.2811356}}} {{181.666534,75.2811356}} wnTs[0]=0 {{{181.666534,75.2811356}, {181.977692,75.2504807}, {182.288849,75.2198257}, {182.600006,75.1997681}}}
688debugShowCubicIntersection wtTs[0]=1 {{{181.666534,75.2811356}, {181.977692,75.2504807}, {182.288849,75.2198257}, {182.600006,75.1997681}}} {{182.600006,75.1997681}} wnTs[0]=0 {{{182.600006,75.1997681}, {183.153549,75.1640701}, {183.707108,75.1412506}, {184.260666,75.1184311}}}
689debugShowCubicIntersection wtTs[0]=1 {{{182.600006,75.1997681}, {183.153549,75.1640701}, {183.707108,75.1412506}, {184.260666,75.1184311}}} {{184.260666,75.1184311}} wnTs[0]=0 {{{184.260666,75.1184311}, {184.440445,75.1110229}, {184.620224,75.1036148}, {184.800003,75.0957642}}}
690debugShowCubicIntersection wtTs[0]=1 {{{184.260666,75.1184311}, {184.440445,75.1110229}, {184.620224,75.1036148}, {184.800003,75.0957642}}} {{184.800003,75.0957642}} wnTs[0]=0 {{{184.800003,75.0957642}, {185.53334,75.0637436}, {186.266663,75.0331039}, {187,75.0076218}}}
691debugShowCubicIntersection wtTs[0]=1 {{{184.800003,75.0957642}, {185.53334,75.0637436}, {186.266663,75.0331039}, {187,75.0076218}}} {{187,75.0076218}} wnTs[0]=0 {{{187,75.0076218}, {187.218643,75.0000229}, {187.437286,74.9894943}, {187.65593,74.9789658}}}
692debugShowCubicIntersection wtTs[0]=1 {{{187,75.0076218}, {187.218643,75.0000229}, {187.437286,74.9894943}, {187.65593,74.9789658}}} {{187.65593,74.9789658}} wnTs[0]=0 {{{187.65593,74.9789658}, {188.170624,74.9541702}, {188.685303,74.9293747}, {189.199997,74.9428329}}}
693debugShowCubicIntersection wtTs[0]=1 {{{187.65593,74.9789658}, {188.170624,74.9541702}, {188.685303,74.9293747}, {189.199997,74.9428329}}} {{189.199997,74.9428329}} wnTs[0]=0 {{{189.199997,74.9428329}, {189.560562,74.9522629}, {189.921127,74.9923019}, {190.281693,75.032341}}}
694debugShowCubicIntersection wtTs[0]=1 {{{189.199997,74.9428329}, {189.560562,74.9522629}, {189.921127,74.9923019}, {190.281693,75.032341}}} {{190.281693,75.032341}} wnTs[0]=0 {{{190.281693,75.032341}, {190.654465,75.0737381}, {191.027237,75.1151352}, {191.399994,75.1227036}}}
695debugShowCubicIntersection wtTs[0]=1 {{{190.281693,75.032341}, {190.654465,75.0737381}, {191.027237,75.1151352}, {191.399994,75.1227036}}} {{191.399994,75.1227036}} wnTs[0]=0 {{{191.399994,75.1227036}, {191.942627,75.1337204}, {192.48526,75.0998383}, {193.027893,75.0659485}}}
696debugShowCubicIntersection wtTs[0]=1 {{{191.399994,75.1227036}, {191.942627,75.1337204}, {192.48526,75.0998383}, {193.027893,75.0659485}}} {{193.027893,75.0659485}} wnTs[0]=0 {{{193.027893,75.0659485}, {193.218597,75.054039}, {193.409302,75.0421295}, {193.600006,75.0321732}}}
697debugShowCubicIntersection wtTs[0]=1 {{{193.027893,75.0659485}, {193.218597,75.054039}, {193.409302,75.0421295}, {193.600006,75.0321732}}} {{193.600006,75.0321732}} wnTs[0]=0 {{{193.600006,75.0321732}, {193.897125,75.016655}, {194.19426,74.9936142}, {194.491394,74.9705658}}}
698debugShowCubicIntersection wtTs[0]=1 {{{193.600006,75.0321732}, {193.897125,75.016655}, {194.19426,74.9936142}, {194.491394,74.9705658}}} {{194.491394,74.9705658}} wnTs[0]=0 {{{194.491394,74.9705658}, {194.927597,74.9367371}, {195.3638,74.9029083}, {195.800003,74.8928909}}}
699debugShowCubicIntersection wtTs[0]=1 {{{194.491394,74.9705658}, {194.927597,74.9367371}, {195.3638,74.9029083}, {195.800003,74.8928909}}} {{195.800003,74.8928909}} wnTs[0]=0 {{{195.800003,74.8928909}, {196.363327,74.8799515}, {196.926636,74.8978424}, {197.48996,74.9157333}}}
700debugShowCubicIntersection wtTs[0]=1 {{{195.800003,74.8928909}, {196.363327,74.8799515}, {196.926636,74.8978424}, {197.48996,74.9157333}}} {{197.48996,74.9157333}} wnTs[0]=0 {{{197.48996,74.9157333}, {197.659973,74.9211349}, {197.829987,74.9265366}, {198,74.9310913}}}
701debugShowCubicIntersection wtTs[0]=1 {{{197.48996,74.9157333}, {197.659973,74.9211349}, {197.829987,74.9265366}, {198,74.9310913}}} {{198,74.9310913}} wnTs[0]=0 {{{198,74.9310913}, {198.539948,74.945549}, {199.07988,74.9668427}, {199.619827,74.9881363}}}
702debugShowCubicIntersection wtTs[0]=1 {{{198,74.9310913}, {198.539948,74.945549}, {199.07988,74.9668427}, {199.619827,74.9881363}}} {{199.619827,74.9881363}} wnTs[0]=0 {{{199.619827,74.9881363}, {199.813217,74.9957657}, {200.006607,75.0033951}, {200.199997,75.0107117}}}
703debugShowCubicIntersection wtTs[0]=1 {{{199.619827,74.9881363}, {199.813217,74.9957657}, {200.006607,75.0033951}, {200.199997,75.0107117}}} {{200.199997,75.0107117}} wnTs[0]=0 {{{200.199997,75.0107117}, {200.468765,75.020874}, {200.737534,75.032814}, {201.006287,75.0447464}}}
704debugShowCubicIntersection wtTs[0]=1 {{{200.199997,75.0107117}, {200.468765,75.020874}, {200.737534,75.032814}, {201.006287,75.0447464}}} {{201.006287,75.0447464}} wnTs[0]=0 {{{201.006287,75.0447464}, {201.470856,75.0653763}, {201.935425,75.0860062}, {202.399994,75.0974884}}}
705debugShowCubicIntersection wtTs[0]=1 {{{201.006287,75.0447464}, {201.470856,75.0653763}, {201.935425,75.0860062}, {202.399994,75.0974884}}} {{202.399994,75.0974884}} wnTs[0]=0 {{{202.399994,75.0974884}, {202.888885,75.1095734}, {203.377777,75.1120605}, {203.866669,75.1145554}}}
706debugShowCubicIntersection wtTs[0]=1 {{{202.399994,75.0974884}, {202.888885,75.1095734}, {203.377777,75.1120605}, {203.866669,75.1145554}}} {{203.866669,75.1145554}} wnTs[0]=0 {{{203.866669,75.1145554}, {204.111115,75.115799}, {204.35556,75.1170425}, {204.600006,75.1194839}}}
707debugShowCubicIntersection wtTs[0]=1 {{{203.866669,75.1145554}, {204.111115,75.115799}, {204.35556,75.1170425}, {204.600006,75.1194839}}} {{204.600006,75.1194839}} wnTs[0]=0 {{{204.600006,75.1194839}, {204.84462,75.121933}, {205.089233,75.1239471}, {205.333847,75.1259613}}}
708debugShowCubicIntersection wtTs[0]=1 {{{204.600006,75.1194839}, {204.84462,75.121933}, {205.089233,75.1239471}, {205.333847,75.1259613}}} {{205.333847,75.1259613}} wnTs[0]=0 {{{205.333847,75.1259613}, {205.822556,75.129982}, {206.311279,75.1340103}, {206.800003,75.1414719}}}
709debugShowCubicIntersection wtTs[0]=1 {{{205.333847,75.1259613}, {205.822556,75.129982}, {206.311279,75.1340103}, {206.800003,75.1414719}}} {{206.800003,75.1414719}} wnTs[0]=0 {{{206.800003,75.1414719}, {207.53334,75.1526718}, {208.266663,75.1675339}, {209,75.1866531}}}
710debugShowCubicIntersection wtTs[0]=1 {{{206.800003,75.1414719}, {207.53334,75.1526718}, {208.266663,75.1675339}, {209,75.1866531}}} {{209,75.1866531}} wnTs[0]=0 {{{209,75.1866531}, {209.350708,75.1957932}, {209.701416,75.2080078}, {210.052124,75.2202225}}}
711debugShowCubicIntersection wtTs[0]=1 {{{209,75.1866531}, {209.350708,75.1957932}, {209.701416,75.2080078}, {210.052124,75.2202225}}} {{210.052124,75.2202225}} wnTs[0]=0 {{{210.052124,75.2202225}, {210.434753,75.2335434}, {210.817368,75.2468643}, {211.199997,75.2562027}}}
712debugShowCubicIntersection wtTs[0]=1 {{{210.052124,75.2202225}, {210.434753,75.2335434}, {210.817368,75.2468643}, {211.199997,75.2562027}}} {{211.199997,75.2562027}} wnTs[0]=0 {{{211.199997,75.2562027}, {211.933334,75.2741013}, {212.666672,75.2871475}, {213.399994,75.2940521}}}
713debugShowCubicIntersection wtTs[0]=1 {{{211.199997,75.2562027}, {211.933334,75.2741013}, {212.666672,75.2871475}, {213.399994,75.2940521}}} {{213.399994,75.2940521}} wnTs[0]=0 {{{213.399994,75.2940521}, {214.133331,75.3009567}, {214.866669,75.3041916}, {215.600006,75.2976303}}}
714debugShowCubicIntersection wtTs[0]=1 {{{213.399994,75.2940521}, {214.133331,75.3009567}, {214.866669,75.3041916}, {215.600006,75.2976303}}} {{215.600006,75.2976303}} wnTs[0]=0 {{{215.600006,75.2976303}, {216.076187,75.2933655}, {216.552383,75.2823792}, {217.02858,75.2713928}}}
715debugShowCubicIntersection wtTs[0]=1 {{{215.600006,75.2976303}, {216.076187,75.2933655}, {216.552383,75.2823792}, {217.02858,75.2713928}}} {{217.02858,75.2713928}} wnTs[0]=0 {{{217.02858,75.2713928}, {217.285721,75.2654572}, {217.542862,75.2595291}, {217.800003,75.2546539}}}
716debugShowCubicIntersection wtTs[0]=1 {{{217.02858,75.2713928}, {217.285721,75.2654572}, {217.542862,75.2595291}, {217.800003,75.2546539}}} {{217.800003,75.2546539}} wnTs[0]=0 {{{217.800003,75.2546539}, {218.041779,75.2500763}, {218.283554,75.2413101}, {218.52533,75.2325439}}}
717debugShowCubicIntersection wtTs[0]=1 {{{217.800003,75.2546539}, {218.041779,75.2500763}, {218.283554,75.2413101}, {218.52533,75.2325439}}} {{218.52533,75.2325439}} wnTs[0]=0 {{{218.52533,75.2325439}, {219.016891,75.2147217}, {219.508438,75.1968994}, {220,75.2142487}}}
718debugShowCubicIntersection wtTs[0]=1 {{{218.52533,75.2325439}, {219.016891,75.2147217}, {219.508438,75.1968994}, {220,75.2142487}}} {{220,75.2142487}} wnTs[0]=0 {{{220,75.2142487}, {220.409988,75.2287216}, {220.819977,75.2736588}, {221.229965,75.3185959}}}
719debugShowCubicIntersection wtTs[0]=1 {{{220,75.2142487}, {220.409988,75.2287216}, {220.819977,75.2736588}, {221.229965,75.3185959}}} {{221.229965,75.3185959}} wnTs[0]=0 {{{221.229965,75.3185959}, {221.553314,75.3540344}, {221.876648,75.389473}, {222.199997,75.4099731}}}
720debugShowCubicIntersection wtTs[0]=1 {{{221.229965,75.3185959}, {221.553314,75.3540344}, {221.876648,75.389473}, {222.199997,75.4099731}}} {{222.199997,75.4099731}} wnTs[0]=0 {{{222.199997,75.4099731}, {222.933334,75.456459}, {223.666672,75.4962387}, {224.399994,75.4931717}}}
721debugShowCubicIntersection wtTs[0]=1 {{{222.199997,75.4099731}, {222.933334,75.456459}, {223.666672,75.4962387}, {224.399994,75.4931717}}} {{224.399994,75.4931717}} wnTs[0]=0 {{{224.399994,75.4931717}, {224.885803,75.4911423}, {225.371613,75.4618988}, {225.857422,75.4326553}}}
722debugShowCubicIntersection wtTs[0]=1 {{{224.399994,75.4931717}, {224.885803,75.4911423}, {225.371613,75.4618988}, {225.857422,75.4326553}}} {{225.857422,75.4326553}} wnTs[0]=0 {{{225.857422,75.4326553}, {226.10495,75.4177551}, {226.352478,75.4028549}, {226.600006,75.3915558}}}
723debugShowCubicIntersection wtTs[0]=1 {{{225.857422,75.4326553}, {226.10495,75.4177551}, {226.352478,75.4028549}, {226.600006,75.3915558}}} {{226.600006,75.3915558}} wnTs[0]=0 {{{226.600006,75.3915558}, {226.839722,75.3806152}, {227.079437,75.3675385}, {227.319153,75.354454}}}
724debugShowCubicIntersection wtTs[0]=1 {{{226.600006,75.3915558}, {226.839722,75.3806152}, {227.079437,75.3675385}, {227.319153,75.354454}}} {{227.319153,75.354454}} wnTs[0]=0 {{{227.319153,75.354454}, {227.812759,75.3275223}, {228.306381,75.3005905}, {228.800003,75.2923279}}}
725debugShowCubicIntersection wtTs[0]=1 {{{227.319153,75.354454}, {227.812759,75.3275223}, {228.306381,75.3005905}, {228.800003,75.2923279}}} {{228.800003,75.2923279}} wnTs[0]=0 {{{228.800003,75.2923279}, {229.309921,75.2837906}, {229.819824,75.2945709}, {230.329742,75.3053513}}}
726debugShowCubicIntersection wtTs[0]=1 {{{228.800003,75.2923279}, {229.309921,75.2837906}, {229.819824,75.2945709}, {230.329742,75.3053513}}} {{230.329742,75.3053513}} wnTs[0]=0 {{{230.329742,75.3053513}, {230.553162,75.3100739}, {230.776581,75.3147964}, {231,75.317894}}}
727debugShowCubicIntersection wtTs[0]=1 {{{230.329742,75.3053513}, {230.553162,75.3100739}, {230.776581,75.3147964}, {231,75.317894}}} {{231,75.317894}} wnTs[0]=0 {{{231,75.317894}, {231.290405,75.3219223}, {231.580811,75.3275833}, {231.871216,75.333252}}}
728debugShowCubicIntersection wtTs[0]=1 {{{231,75.317894}, {231.290405,75.3219223}, {231.580811,75.3275833}, {231.871216,75.333252}}} {{231.871216,75.333252}} wnTs[0]=0 {{{231.871216,75.333252}, {232.314148,75.3418884}, {232.757065,75.3505249}, {233.199997,75.3533554}}}
729debugShowCubicIntersection wtTs[0]=1 {{{231.871216,75.333252}, {232.314148,75.3418884}, {232.757065,75.3505249}, {233.199997,75.3533554}}} {{233.199997,75.3533554}} wnTs[0]=0 {{{233.199997,75.3533554}, {233.933334,75.3580399}, {234.666672,75.3606873}, {235.399994,75.3460236}}}
730debugShowCubicIntersection wtTs[0]=1 {{{233.199997,75.3533554}, {233.933334,75.3580399}, {234.666672,75.3606873}, {235.399994,75.3460236}}} {{235.399994,75.3460236}} wnTs[0]=0 {{{235.399994,75.3460236}, {235.845032,75.3371277}, {236.29007,75.3182449}, {236.735107,75.2993622}}}
731debugShowCubicIntersection wtTs[0]=1 {{{235.399994,75.3460236}, {235.845032,75.3371277}, {236.29007,75.3182449}, {236.735107,75.2993622}}} {{236.735107,75.2993622}} wnTs[0]=0 {{{236.735107,75.2993622}, {237.023407,75.2871323}, {237.311707,75.2749023}, {237.600006,75.2653885}}}
732debugShowCubicIntersection wtTs[0]=1 {{{236.735107,75.2993622}, {237.023407,75.2871323}, {237.311707,75.2749023}, {237.600006,75.2653885}}} {{237.600006,75.2653885}} wnTs[0]=0 {{{237.600006,75.2653885}, {238.333328,75.2411804}, {239.066666,75.2196732}, {239.800003,75.2007828}}}
733debugShowCubicIntersection wtTs[0]=1 {{{237.600006,75.2653885}, {238.333328,75.2411804}, {239.066666,75.2196732}, {239.800003,75.2007828}}} {{239.800003,75.2007828}} wnTs[0]=0 {{{239.800003,75.2007828}, {240.082169,75.193512}, {240.364334,75.1891708}, {240.6465,75.1848297}}}
734debugShowCubicIntersection wtTs[0]=1 {{{239.800003,75.2007828}, {240.082169,75.193512}, {240.364334,75.1891708}, {240.6465,75.1848297}}} {{240.6465,75.1848297}} wnTs[0]=0 {{{240.6465,75.1848297}, {241.097672,75.177887}, {241.548828,75.1709366}, {242,75.1520233}}}
735debugShowCubicIntersection wtTs[0]=1 {{{240.6465,75.1848297}, {241.097672,75.177887}, {241.548828,75.1709366}, {242,75.1520233}}} {{242,75.1520233}} wnTs[0]=0 {{{242,75.1520233}, {242.416458,75.1345673}, {242.832916,75.1057968}, {243.249374,75.0770187}}}
736debugShowCubicIntersection wtTs[0]=1 {{{242,75.1520233}, {242.416458,75.1345673}, {242.832916,75.1057968}, {243.249374,75.0770187}}} {{243.249374,75.0770187}} wnTs[0]=0 {{{243.249374,75.0770187}, {243.566254,75.0551224}, {243.883118,75.033226}, {244.199997,75.0163193}}}
737debugShowCubicIntersection wtTs[0]=1 {{{243.249374,75.0770187}, {243.566254,75.0551224}, {243.883118,75.033226}, {244.199997,75.0163193}}} {{244.199997,75.0163193}} wnTs[0]=0 {{{244.199997,75.0163193}, {244.933334,74.9771957}, {245.666672,74.9453659}, {246.399994,74.9172668}}}
738debugShowCubicIntersection wtTs[0]=1 {{{244.199997,75.0163193}, {244.933334,74.9771957}, {245.666672,74.9453659}, {246.399994,74.9172668}}} {{246.399994,74.9172668}} wnTs[0]=0 {{{246.399994,74.9172668}, {247.133331,74.8891678}, {247.866669,74.8672562}, {248.600006,74.8477097}}}
739debugShowCubicLineIntersection wtTs[0]=1 {{{246.399994,74.9172668}, {247.133331,74.8891678}, {247.866669,74.8672562}, {248.600006,74.8477097}}} {{248.600006,74.8477097}} wnTs[0]=0 {{{248.600006,74.8477097}, {248.714218,74.8446655}}}
740debugShowCubicLineIntersection wtTs[0]=0 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{248.714218,74.8446655}} wnTs[0]=1 {{{248.600006,74.8477097}, {248.714218,74.8446655}}}
741debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
742debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
743debugShowCubicIntersection wtTs[0]=1 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}} {{252.266663,74.798233}} wnTs[0]=0 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}}
744debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
745debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
746SkOpSegment::addT insert t=0.928577558 segID=299 spanID=623
747SkOpSegment::addT insert t=0.99844881 segID=12 spanID=624
748</div>
749
750</div>
751
752<script type="text/javascript">
753
754var testDivs = [
755    issue3651_7,
756
757];
758
759var decimal_places = 3; // make this 3 to show more precision
760
761var tests = [];
762var testLines = [];
763var testTitles = [];
764var testIndex = 0;
765var ctx;
766
767var xmin, xmax, focusXmin, focusXmax;
768var ymin, ymax, focusYmin, focusYmax;
769var scale;
770var mouseX, mouseY;
771var srcLeft, srcTop;
772var screenWidth, screenHeight;
773var drawnPts, drawnLines, drawnQuads, drawnConics, drawnCubics;
774var curveT = 0;
775
776var pt_labels = 2;
777var collect_bounds = false;
778var control_lines = 0;
779var curve_t = false;
780var debug_xy = 1;
781var focus_enabled = false;
782var focus_on_selection = false;
783var step_limit = 0;
784var draw_active = false;
785var draw_add = false;
786var draw_angle = 0;
787var draw_coincidence = false;
788var draw_deriviatives = 0;
789var draw_hints = false;
790var draw_id = false;
791var draw_intersection = 0;
792var draw_intersectT = false;
793var draw_legend = true;
794var draw_log = false;
795var draw_mark = false;
796var draw_midpoint = false;
797var draw_op = 0;
798var draw_sequence = false;
799var draw_sort = 0;
800var draw_top = false;
801var draw_path = 3;
802var draw_computed = 0;
803var retina_scale = !!window.devicePixelRatio;
804
805var activeCount = 0;
806var addCount = 0;
807var angleCount = 0;
808var coinCount = 0;
809var opCount = 0;
810var sectCount = 0;
811var sortCount = 0;
812var topCount = 0;
813var markCount = 0;
814var activeMax = 0;
815var addMax = 0;
816var angleMax = 0;
817var coinMax = 0;
818var sectMax = 0;
819var sectMax2 = 0;
820var sortMax = 0;
821var topMax = 0;
822var markMax = 0;
823var opMax = 0;
824var stepMax = 0;
825var lastIndex = 0;
826var hasPath = false;
827var hasComputedPath = false;
828var angleBetween = false;
829var afterIndex = 0;
830
831var firstActiveSpan = -1;
832var logStart = -1;
833var logRange = 0;
834
835var SPAN_ID = 0;
836var SPAN_X1 = SPAN_ID + 1;
837var SPAN_Y1 = SPAN_X1 + 1;
838var SPAN_X2 = SPAN_Y1 + 1;
839var SPAN_Y2 = SPAN_X2 + 1;
840
841var SPAN_L_T = SPAN_Y2 + 1;
842var SPAN_L_TX = SPAN_L_T + 1;
843var SPAN_L_TY = SPAN_L_TX + 1;
844var SPAN_L_TEND = SPAN_L_TY + 1;
845var SPAN_L_OTHER = SPAN_L_TEND + 1;
846var SPAN_L_OTHERT = SPAN_L_OTHER + 1;
847var SPAN_L_OTHERI = SPAN_L_OTHERT + 1;
848var SPAN_L_SUM = SPAN_L_OTHERI + 1;
849var SPAN_L_VAL = SPAN_L_SUM + 1;
850var SPAN_L_OPP = SPAN_L_VAL + 1;
851
852var SPAN_X3 = SPAN_Y2 + 1;
853var SPAN_Y3 = SPAN_X3 + 1;
854
855var SPAN_Q_T = SPAN_Y3 + 1;
856var SPAN_Q_TX = SPAN_Q_T + 1;
857var SPAN_Q_TY = SPAN_Q_TX + 1;
858var SPAN_Q_TEND = SPAN_Q_TY + 1;
859var SPAN_Q_OTHER = SPAN_Q_TEND + 1;
860var SPAN_Q_OTHERT = SPAN_Q_OTHER + 1;
861var SPAN_Q_OTHERI = SPAN_Q_OTHERT + 1;
862var SPAN_Q_SUM = SPAN_Q_OTHERI + 1;
863var SPAN_Q_VAL = SPAN_Q_SUM + 1;
864var SPAN_Q_OPP = SPAN_Q_VAL + 1;
865
866var SPAN_K_W = SPAN_Y3 + 1;
867var SPAN_K_T = SPAN_K_W + 1;
868var SPAN_K_TX = SPAN_K_T + 1;
869var SPAN_K_TY = SPAN_K_TX + 1;
870var SPAN_K_TEND = SPAN_K_TY + 1;
871var SPAN_K_OTHER = SPAN_K_TEND + 1;
872var SPAN_K_OTHERT = SPAN_K_OTHER + 1;
873var SPAN_K_OTHERI = SPAN_K_OTHERT + 1;
874var SPAN_K_SUM = SPAN_K_OTHERI + 1;
875var SPAN_K_VAL = SPAN_K_SUM + 1;
876var SPAN_K_OPP = SPAN_K_VAL + 1;
877
878var SPAN_X4 = SPAN_Y3 + 1;
879var SPAN_Y4 = SPAN_X4 + 1;
880
881var SPAN_C_T = SPAN_Y4 + 1;
882var SPAN_C_TX = SPAN_C_T + 1;
883var SPAN_C_TY = SPAN_C_TX + 1;
884var SPAN_C_TEND = SPAN_C_TY + 1;
885var SPAN_C_OTHER = SPAN_C_TEND + 1;
886var SPAN_C_OTHERT = SPAN_C_OTHER + 1;
887var SPAN_C_OTHERI = SPAN_C_OTHERT + 1;
888var SPAN_C_SUM = SPAN_C_OTHERI + 1;
889var SPAN_C_VAL = SPAN_C_SUM + 1;
890var SPAN_C_OPP = SPAN_C_VAL + 1;
891
892var ACTIVE_LINE_SPAN =        1;
893var ACTIVE_QUAD_SPAN =        ACTIVE_LINE_SPAN + 1;
894var ACTIVE_CONIC_SPAN =       ACTIVE_QUAD_SPAN + 1;
895var ACTIVE_CUBIC_SPAN =       ACTIVE_CONIC_SPAN + 1;
896
897var ADD_MOVETO =              ACTIVE_CUBIC_SPAN + 1;
898var ADD_LINETO =              ADD_MOVETO + 1;
899var ADD_QUADTO =              ADD_LINETO + 1;
900var ADD_CONICTO =             ADD_QUADTO + 1;
901var ADD_CUBICTO =             ADD_CONICTO + 1;
902var ADD_CLOSE =               ADD_CUBICTO + 1;
903var ADD_FILL =                ADD_CLOSE + 1;
904
905var PATH_LINE =               ADD_FILL + 1;
906var PATH_QUAD =               PATH_LINE + 1;
907var PATH_CONIC =              PATH_QUAD + 1;
908var PATH_CUBIC =              PATH_CONIC + 1;
909
910var INTERSECT_LINE =          PATH_CUBIC + 1;
911var INTERSECT_LINE_2 =        INTERSECT_LINE + 1;
912var INTERSECT_LINE_NO =       INTERSECT_LINE_2 + 1;
913var INTERSECT_QUAD_LINE =     INTERSECT_LINE_NO + 1;
914var INTERSECT_QUAD_LINE_2 =   INTERSECT_QUAD_LINE + 1;
915var INTERSECT_QUAD_LINE_NO =  INTERSECT_QUAD_LINE_2 + 1;
916var INTERSECT_QUAD =          INTERSECT_QUAD_LINE_NO + 1;
917var INTERSECT_QUAD_2 =        INTERSECT_QUAD + 1;
918var INTERSECT_QUAD_NO =       INTERSECT_QUAD_2 + 1;
919var INTERSECT_CONIC_LINE =    INTERSECT_QUAD_NO + 1;
920var INTERSECT_CONIC_LINE_2 =  INTERSECT_CONIC_LINE + 1;
921var INTERSECT_CONIC_LINE_NO = INTERSECT_CONIC_LINE_2 + 1;
922var INTERSECT_CONIC =         INTERSECT_CONIC_LINE_NO + 1;
923var INTERSECT_CONIC_2 =       INTERSECT_CONIC + 1;
924var INTERSECT_CONIC_NO =      INTERSECT_CONIC_2 + 1;
925var INTERSECT_SELF_CUBIC =    INTERSECT_CONIC_NO + 1;
926var INTERSECT_SELF_CUBIC_NO = INTERSECT_SELF_CUBIC + 1;
927var INTERSECT_CUBIC_LINE =    INTERSECT_SELF_CUBIC_NO + 1;
928var INTERSECT_CUBIC_LINE_2 =  INTERSECT_CUBIC_LINE + 1;
929var INTERSECT_CUBIC_LINE_3 =  INTERSECT_CUBIC_LINE_2 + 1;
930var INTERSECT_CUBIC_LINE_NO = INTERSECT_CUBIC_LINE_3 + 1;
931var INTERSECT_CUBIC_QUAD =    INTERSECT_CUBIC_LINE_NO + 1;
932var INTERSECT_CUBIC_QUAD_2 =  INTERSECT_CUBIC_QUAD + 1;
933var INTERSECT_CUBIC_QUAD_3 =  INTERSECT_CUBIC_QUAD_2 + 1;
934var INTERSECT_CUBIC_QUAD_4 =  INTERSECT_CUBIC_QUAD_3 + 1;
935var INTERSECT_CUBIC_QUAD_NO = INTERSECT_CUBIC_QUAD_4 + 1;
936var INTERSECT_CUBIC =         INTERSECT_CUBIC_QUAD_NO + 1;
937var INTERSECT_CUBIC_2 =       INTERSECT_CUBIC + 1;
938var INTERSECT_CUBIC_3 =       INTERSECT_CUBIC_2 + 1;
939var INTERSECT_CUBIC_4 =       INTERSECT_CUBIC_3 + 1;
940// FIXME: add cubic 5- 9
941var INTERSECT_CUBIC_NO =      INTERSECT_CUBIC_4 + 1;
942
943var SORT_UNARY =              INTERSECT_CUBIC_NO + 1;
944var SORT_BINARY =             SORT_UNARY + 1;
945
946var OP_DIFFERENCE =           SORT_BINARY + 1;
947var OP_INTERSECT =            OP_DIFFERENCE + 1;
948var OP_UNION =                OP_INTERSECT + 1;
949var OP_XOR =                  OP_UNION + 1;
950
951var MARK_LINE =               OP_XOR + 1;
952var MARK_QUAD =               MARK_LINE + 1;
953var MARK_CONIC =              MARK_QUAD + 1;
954var MARK_CUBIC =              MARK_CONIC + 1;
955var MARK_DONE_LINE =          MARK_CUBIC + 1;
956var MARK_DONE_QUAD =          MARK_DONE_LINE + 1;
957var MARK_DONE_CONIC =         MARK_DONE_QUAD + 1;
958var MARK_DONE_CUBIC =         MARK_DONE_CONIC + 1;
959var MARK_UNSORTABLE_LINE =    MARK_DONE_CUBIC + 1;
960var MARK_UNSORTABLE_QUAD =    MARK_UNSORTABLE_LINE + 1;
961var MARK_UNSORTABLE_CONIC =   MARK_UNSORTABLE_QUAD + 1;
962var MARK_UNSORTABLE_CUBIC =   MARK_UNSORTABLE_CONIC + 1;
963var MARK_SIMPLE_LINE =        MARK_UNSORTABLE_CUBIC + 1;
964var MARK_SIMPLE_QUAD =        MARK_SIMPLE_LINE + 1;
965var MARK_SIMPLE_CONIC =       MARK_SIMPLE_QUAD + 1;
966var MARK_SIMPLE_CUBIC =       MARK_SIMPLE_CONIC + 1;
967var MARK_SIMPLE_DONE_LINE =   MARK_SIMPLE_CUBIC + 1;
968var MARK_SIMPLE_DONE_QUAD =   MARK_SIMPLE_DONE_LINE + 1;
969var MARK_SIMPLE_DONE_CONIC =  MARK_SIMPLE_DONE_QUAD + 1;
970var MARK_SIMPLE_DONE_CUBIC =  MARK_SIMPLE_DONE_CONIC + 1;
971var MARK_DONE_UNARY_LINE =    MARK_SIMPLE_DONE_CUBIC + 1;
972var MARK_DONE_UNARY_QUAD =    MARK_DONE_UNARY_LINE + 1;
973var MARK_DONE_UNARY_CONIC =   MARK_DONE_UNARY_QUAD + 1;
974var MARK_DONE_UNARY_CUBIC =   MARK_DONE_UNARY_CONIC + 1;
975var MARK_ANGLE_LAST =         MARK_DONE_UNARY_CUBIC + 1;
976
977var COMPUTED_SET_1 =          MARK_ANGLE_LAST + 1;
978var COMPUTED_SET_2 =          COMPUTED_SET_1 + 1;
979
980var ANGLE_AFTER =             COMPUTED_SET_2 + 1;
981var ANGLE_AFTERPART =         ANGLE_AFTER + 1;
982
983var ACTIVE_OP =               ANGLE_AFTERPART + 1;
984
985var COIN_MAIN_SPAN =          ACTIVE_OP + 1;
986var COIN_OPP_SPAN =           COIN_MAIN_SPAN + 1;
987
988var FRAG_TYPE_LAST =          COIN_OPP_SPAN;
989
990var REC_TYPE_UNKNOWN = -1;
991var REC_TYPE_PATH = 0;
992var REC_TYPE_PATH2 = 1;
993var REC_TYPE_SECT = 2;
994var REC_TYPE_ACTIVE = 3;
995var REC_TYPE_ADD = 4;
996var REC_TYPE_SORT = 5;
997var REC_TYPE_OP = 6;
998var REC_TYPE_MARK = 7;
999var REC_TYPE_COMPUTED = 8;
1000var REC_TYPE_COIN = 9;
1001var REC_TYPE_ANGLE = 10;
1002var REC_TYPE_ACTIVE_OP = 11;
1003var REC_TYPE_AFTERPART = 12;
1004var REC_TYPE_TOP = 13;
1005var REC_TYPE_COINCIDENCE = 14;
1006var REC_TYPE_LAST = REC_TYPE_COINCIDENCE;
1007
1008function strs_to_nums(strs) {
1009    var result = [];
1010    for (var idx = 1; idx < strs.length; ++idx) {
1011        var str = strs[idx];
1012        var num = parseFloat(str);
1013        if (isNaN(num)) {
1014            result.push(str);
1015        } else {
1016            result.push(num);
1017        }
1018    }
1019    return result;
1020}
1021
1022function filter_str_by(id, str, regex, array) {
1023    if (regex.test(str)) {
1024        var strs = regex.exec(str);
1025        var result = strs_to_nums(strs);
1026        array.push(id);
1027        array.push(result);
1028        return true;
1029    }
1030    return false;
1031}
1032
1033function construct_regexp2(pattern) {
1034    var escape = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
1035    escape = escape.replace(/UNSORTABLE/g, "\\*\\*\\* UNSORTABLE \\*\\*\\*");
1036    escape = escape.replace(/CUBIC_VAL/g, "\\(P_VAL P_VAL P_VAL P_VAL\\)");
1037    escape = escape.replace(/CONIC_VAL/g, "\\(P_VAL P_VAL P_VAL W_VAL\\)");
1038    escape = escape.replace(/QUAD_VAL/g, "\\(P_VAL P_VAL P_VAL\\)");
1039    escape = escape.replace(/LINE_VAL/g, "\\(P_VAL P_VAL\\)");
1040    escape = escape.replace(/FILL_TYPE/g, "SkPath::k[a-zA-Z]+_FillType");
1041    escape = escape.replace(/PTR_VAL/g, "0x[0-9A-F]+");
1042    escape = escape.replace(/PT_VAL/g, "\\(P_VAL\\)");
1043    escape = escape.replace(/P_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?, ?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
1044    escape = escape.replace(/T_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)");
1045    escape = escape.replace(/W_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
1046    escape = escape.replace(/PATH/g, "pathB?");
1047    escape = escape.replace(/IDX/g, "(-?\\d+)");
1048    escape = escape.replace(/NUM/g, "(-?\\d+)");
1049    escape = escape.replace(/OPT/g, "(\\?|-?\\d+)");
1050    return new RegExp(escape, 'i');
1051}
1052
1053function construct_regexp2c(pattern) {
1054    var escape = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
1055    escape = escape.replace(/UNSORTABLE/g, "\\*\\*\\* UNSORTABLE \\*\\*\\*");
1056    escape = escape.replace(/CUBIC_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
1057    escape = escape.replace(/CONIC_VAL/g, "(?:\\$\\d = )?\\{\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}, W_VAL\\}");
1058    escape = escape.replace(/QUAD_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
1059    escape = escape.replace(/LINE_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
1060    escape = escape.replace(/FILL_TYPE/g, "SkPath::k[a-zA-Z]+_FillType");
1061    escape = escape.replace(/PTR_VAL/g, "0x[0-9A-F]+");
1062    escape = escape.replace(/PT_VAL/g, "\\{\\{P_VAL\\}\\}");
1063    escape = escape.replace(/P_VAL/g, "(?:f?[xX] = )?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?, *(?: f?[yY] = )?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
1064    escape = escape.replace(/T_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)");
1065    escape = escape.replace(/W_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
1066    escape = escape.replace(/OPER/g, "[a-z]+");
1067    escape = escape.replace(/PATH/g, "pathB?");
1068    escape = escape.replace(/T_F/g, "([TF])");
1069    escape = escape.replace(/IDX/g, "(-?\\d+)");
1070    escape = escape.replace(/NUM/g, "(-?\\d+)");
1071    escape = escape.replace(/OPT/g, "(\\?|-?\\d+)");
1072    return new RegExp(escape, 'i');
1073}
1074
1075function match_regexp(str, lineNo, array, id, pattern) {
1076    var regex = construct_regexp2(pattern);
1077    if (filter_str_by(id, str, regex, array)) {
1078        return true;
1079    }
1080    regex = construct_regexp2c(pattern);
1081    return filter_str_by(id, str, regex, array);
1082}
1083
1084function endsWith(str, suffix) {
1085    return str.indexOf(suffix, str.length - suffix.length) !== -1;
1086}
1087
1088function parse_all(test) {
1089    var lines = test.match(/[^\r\n]+/g);
1090    var records = []; // a rec can be the original paths, a set of intersections, a set of active spans, a sort, or a path add
1091    var record = [];
1092    var recType = REC_TYPE_UNKNOWN;
1093    var lastLineNo;
1094    var moveX, moveY;
1095    for (var lineNo = 0; lineNo < lines.length; ++lineNo) {
1096        var line = lines[lineNo];
1097        if (line.length == 0) {
1098            continue;
1099        }
1100        var opStart = "SkOpSegment::";
1101        if (line.lastIndexOf(opStart, 0) === 0) {
1102            line = line.substr(opStart.length);
1103        }
1104        var angleStart = "SkOpAngle::";
1105        if (line.lastIndexOf(angleStart, 0) === 0) {
1106            line = line.substr(angleStart.length);
1107        }
1108        var coinStart = "SkOpCoincidence::";
1109        if (line.lastIndexOf(coinStart, 0) === 0) {
1110            line = line.substr(coinStart.length);
1111        }
1112        var type = line.lastIndexOf("debugShowActiveSpans", 0) === 0 ? REC_TYPE_ACTIVE
1113                : line.lastIndexOf("debugShowCoincidence", 0) === 0 ? REC_TYPE_COINCIDENCE
1114                : line.lastIndexOf("((SkOpSegment*)", 0) === 0 ? REC_TYPE_PATH2
1115                : line.lastIndexOf("debugShowTs", 0) === 0 ? REC_TYPE_COIN
1116                : line.lastIndexOf("afterPart", 0) === 0 ? REC_TYPE_AFTERPART
1117                : line.lastIndexOf("debugShow", 0) === 0 ? REC_TYPE_SECT
1118                : line.lastIndexOf("activeOp", 0) === 0 ? REC_TYPE_ACTIVE_OP
1119                : line.lastIndexOf("computed", 0) === 0 ? REC_TYPE_COMPUTED
1120                : line.lastIndexOf("debugOne", 0) === 0 ? REC_TYPE_SORT
1121                : line.lastIndexOf("dumpOne", 0) === 0 ? REC_TYPE_SORT
1122                : line.lastIndexOf("findTop", 0) === 0 ? REC_TYPE_TOP
1123                : line.lastIndexOf("pathB.", 0) === 0 ? REC_TYPE_ADD
1124                : line.lastIndexOf("path.", 0) === 0 ? REC_TYPE_ADD
1125                : line.lastIndexOf("after", 0) === 0 ? REC_TYPE_ANGLE
1126                : line.lastIndexOf("mark", 0) === 0 ? REC_TYPE_MARK
1127                : line.lastIndexOf("  {{", 0) === 0 ? REC_TYPE_COMPUTED
1128                : line.lastIndexOf("seg=", 0) === 0 ? REC_TYPE_PATH
1129                : line.lastIndexOf("op", 0) === 0 ? REC_TYPE_OP
1130                : line.lastIndexOf("$", 0) === 0 ? REC_TYPE_PATH
1131                : REC_TYPE_UNKNOWN;
1132        if (recType != type || recType == REC_TYPE_ADD || recType == REC_TYPE_SECT
1133                || recType == REC_TYPE_ACTIVE_OP || recType == REC_TYPE_ANGLE) {
1134            if (recType != REC_TYPE_UNKNOWN) {
1135                records.push(recType);
1136                records.push(lastLineNo);
1137                records.push(record);
1138            }
1139            record = [];
1140            recType = type;
1141            lastLineNo = lineNo;
1142        }
1143        var found = false;
1144        switch (recType) {
1145            case REC_TYPE_ACTIVE:
1146                found = match_regexp(line, lineNo, record, ACTIVE_LINE_SPAN, "debugShowActiveSpans" +
1147" id=IDX LINE_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
1148                ) || match_regexp(line, lineNo, record, ACTIVE_QUAD_SPAN, "debugShowActiveSpans" +
1149" id=IDX QUAD_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
1150                ) || match_regexp(line, lineNo, record, ACTIVE_CONIC_SPAN, "debugShowActiveSpans" +
1151" id=IDX CONIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
1152                ) || match_regexp(line, lineNo, record, ACTIVE_CUBIC_SPAN, "debugShowActiveSpans" +
1153" id=IDX CUBIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
1154                ) || match_regexp(line, lineNo, record, ACTIVE_LINE_SPAN, "debugShowActiveSpans" +
1155" id=IDX LINE_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
1156                ) || match_regexp(line, lineNo, record, ACTIVE_QUAD_SPAN, "debugShowActiveSpans" +
1157" id=IDX QUAD_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
1158                ) || match_regexp(line, lineNo, record, ACTIVE_CONIC_SPAN, "debugShowActiveSpans" +
1159" id=IDX CONIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
1160                ) || match_regexp(line, lineNo, record, ACTIVE_CUBIC_SPAN, "debugShowActiveSpans" +
1161" id=IDX CUBIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
1162                );
1163                break;
1164            case REC_TYPE_ACTIVE_OP:
1165                found = match_regexp(line, lineNo, record, ACTIVE_OP, "activeOp" +
1166" id=IDX t=T_VAL tEnd=T_VAL op=OPER miFrom=NUM miTo=NUM suFrom=NUM suTo=NUM result=IDX"
1167                );
1168                break;
1169            case REC_TYPE_ADD:
1170                if (match_regexp(line, lineNo, record, ADD_MOVETO, "PATH.moveTo(P_VAL);")) {
1171                    moveX = record[1][0];
1172                    moveY = record[1][1];
1173                    found = true;
1174                } else if (match_regexp(line, lineNo, record, ADD_LINETO, "PATH.lineTo(P_VAL);")) {
1175                    record[1].unshift(moveY);
1176                    record[1].unshift(moveX);
1177                    moveX = record[1][2];
1178                    moveY = record[1][3];
1179                    found = true;
1180                } else if (match_regexp(line, lineNo, record, ADD_QUADTO, "PATH.quadTo(P_VAL, P_VAL);")) {
1181                    record[1].unshift(moveY);
1182                    record[1].unshift(moveX);
1183                    moveX = record[1][4];
1184                    moveY = record[1][5];
1185                    found = true;
1186                } else if (match_regexp(line, lineNo, record, ADD_CONICTO, "PATH.conicTo(P_VAL, P_VAL, T_VAL);")) {
1187                    record[1].unshift(moveY);
1188                    record[1].unshift(moveX);
1189                    moveX = record[1][4];
1190                    moveY = record[1][5];
1191                    found = true;
1192                } else if (match_regexp(line, lineNo, record, ADD_CUBICTO, "PATH.cubicTo(P_VAL, P_VAL, P_VAL);")) {
1193                    record[1].unshift(moveY);
1194                    record[1].unshift(moveX);
1195                    moveX = record[1][6];
1196                    moveY = record[1][7];
1197                    found = true;
1198                } else if (match_regexp(line, lineNo, record, ADD_FILL, "PATH.setFillType(FILL_TYPE);")) {
1199                    found = true;
1200                } else {
1201                    found = match_regexp(line, lineNo, record, ADD_CLOSE, "PATH.close();");
1202                }
1203                break;
1204            case REC_TYPE_AFTERPART:
1205                found = match_regexp(line, lineNo, record, PATH_LINE, "afterPart LINE_VAL")
1206                    || match_regexp(line, lineNo, record, PATH_QUAD, "afterPart QUAD_VAL")
1207                    || match_regexp(line, lineNo, record, PATH_CONIC, "afterPart CONIC_VAL")
1208                    || match_regexp(line, lineNo, record, PATH_CUBIC, "afterPart CUBIC_VAL")
1209                break;
1210            case REC_TYPE_ANGLE:
1211                found = match_regexp(line, lineNo, record, ANGLE_AFTER, "after " +
1212"[IDX/IDX] NUM/NUM tStart=T_VAL tEnd=T_VAL < [IDX/IDX] NUM/NUM tStart=T_VAL tEnd=T_VAL < [IDX/IDX] NUM/NUM tStart=T_VAL tEnd=T_VAL  T_F IDX");
1213                break;
1214            case REC_TYPE_COIN:
1215                found = true;
1216                break;
1217            case REC_TYPE_COINCIDENCE:
1218                found = match_regexp(line, lineNo, record, COIN_MAIN_SPAN, "debugShowCoincidence" +
1219" + id=IDX t=T_VAL tEnd=T_VAL"
1220                ) || match_regexp(line, lineNo, record, COIN_OPP_SPAN, "debugShowCoincidence" +
1221" - id=IDX t=T_VAL tEnd=T_VAL"
1222                );
1223                break;
1224            case REC_TYPE_COMPUTED:
1225                found = line ==  "computed quadratics given"
1226                  || match_regexp(line, lineNo, record, COMPUTED_SET_1, "computed quadratics set 1"
1227                ) || match_regexp(line, lineNo, record, COMPUTED_SET_2, "computed quadratics set 2"
1228                ) || match_regexp(line, lineNo, record, PATH_QUAD, "  QUAD_VAL,"
1229                ) || match_regexp(line, lineNo, record, PATH_CONIC, "  CONIC_VAL,"
1230                ) || match_regexp(line, lineNo, record, PATH_CUBIC, "  CUBIC_VAL,"
1231                );
1232                break;
1233            case REC_TYPE_PATH:
1234                found = match_regexp(line, lineNo, record, PATH_LINE, "seg=IDX LINE_VAL"
1235                ) || match_regexp(line, lineNo, record, PATH_QUAD, "seg=IDX QUAD_VAL"
1236                ) || match_regexp(line, lineNo, record, PATH_CONIC, "seg=IDX CONIC_VAL"
1237                ) || match_regexp(line, lineNo, record, PATH_CUBIC, "seg=IDX CUBIC_VAL"
1238                );
1239                break;
1240            case REC_TYPE_PATH2:
1241                found = match_regexp(line, lineNo, record, PATH_LINE, "((SkOpSegment*) PTR_VAL) [IDX] {LINE_VAL}"
1242                ) || match_regexp(line, lineNo, record, PATH_QUAD, "((SkOpSegment*) PTR_VAL) [IDX] {QUAD_VAL}"
1243                ) || match_regexp(line, lineNo, record, PATH_CONIC, "((SkOpSegment*) PTR_VAL) [IDX] {CONIC_VAL}"
1244                ) || match_regexp(line, lineNo, record, PATH_CUBIC, "((SkOpSegment*) PTR_VAL) [IDX] {CUBIC_VAL}"
1245                );
1246                break;
1247            case REC_TYPE_SECT:
1248                found = match_regexp(line, lineNo, record, INTERSECT_LINE, "debugShowLineIntersection" +
1249" wtTs[0]=T_VAL LINE_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1250                ) || match_regexp(line, lineNo, record, INTERSECT_LINE_2, "debugShowLineIntersection" +
1251" wtTs[0]=T_VAL LINE_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1252                ) || match_regexp(line, lineNo, record, INTERSECT_LINE_NO, "debugShowLineIntersection" +
1253" no intersect LINE_VAL LINE_VAL"
1254                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE, "debugShowQuadLineIntersection" +
1255" wtTs[0]=T_VAL QUAD_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1256                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE_2, "debugShowQuadLineIntersection" +
1257" wtTs[0]=T_VAL QUAD_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1258                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE_NO, "debugShowQuadLineIntersection" +
1259" no intersect QUAD_VAL LINE_VAL"
1260                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD, "debugShowQuadIntersection" +
1261" wtTs[0]=T_VAL QUAD_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL"
1262                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_2, "debugShowQuadIntersection" +
1263" wtTs[0]=T_VAL QUAD_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL"
1264                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_NO, "debugShowQuadIntersection" +
1265" no intersect QUAD_VAL QUAD_VAL"
1266                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE, "debugShowConicLineIntersection" +
1267" wtTs[0]=T_VAL CONIC_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1268                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE_2, "debugShowConicLineIntersection" +
1269" wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1270                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE_NO, "debugShowConicLineIntersection" +
1271" no intersect CONIC_VAL LINE_VAL"
1272                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC, "debugShowConicIntersection" +
1273" wtTs[0]=T_VAL CONIC_VAL PT_VAL wnTs[0]=T_VAL CONIC_VAL"
1274                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_2, "debugShowConicIntersection" +
1275" wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL CONIC_VAL wnTs[1]=T_VAL"
1276                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_NO, "debugShowConicIntersection" +
1277" no intersect CONIC_VAL CONIC_VAL"
1278                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE, "debugShowCubicLineIntersection" +
1279" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1280                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_2, "debugShowCubicLineIntersection" +
1281" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1282                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_3, "debugShowCubicLineIntersection" +
1283" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL"
1284                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_NO, "debugShowCubicLineIntersection" +
1285" no intersect CUBIC_VAL LINE_VAL"
1286                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD, "debugShowCubicQuadIntersection" +
1287" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL"
1288                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_2, "debugShowCubicQuadIntersection" +
1289" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL"
1290                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_3, "debugShowCubicQuadIntersection" +
1291" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL"
1292                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_4, "debugShowCubicQuadIntersection" +
1293" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL wtTs[3]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL wnTs[3]=T_VAL"
1294                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_NO, "debugShowCubicQuadIntersection" +
1295" no intersect CUBIC_VAL QUAD_VAL"
1296                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC, "debugShowCubicIntersection" +
1297" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL"
1298                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_2, "debugShowCubicIntersection" +
1299" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL wnTs[1]=T_VAL"
1300                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_3, "debugShowCubicIntersection" +
1301" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL"
1302                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_4, "debugShowCubicIntersection" +
1303" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wtTs[3]=T_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL wnTs[3]=T_VAL"
1304                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_NO, "debugShowCubicIntersection" +
1305" no intersect CUBIC_VAL CUBIC_VAL"
1306                ) || match_regexp(line, lineNo, record, INTERSECT_SELF_CUBIC, "debugShowCubicIntersection" +
1307" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL"
1308                ) || match_regexp(line, lineNo, record, INTERSECT_SELF_CUBIC_NO, "debugShowCubicIntersection" +
1309" no self intersect CUBIC_VAL"
1310                );
1311                break;
1312            case REC_TYPE_SORT:
1313                var hasDone = / done/.test(line);
1314                var hasUnorderable = / unorderable/.test(line);
1315                var hasSmall = / small/.test(line);
1316                var hasTiny = / tiny/.test(line);
1317                var hasOperand = / operand/.test(line);
1318                var hasStop = / stop/.test(line);
1319                line.replace(/[ a-z]+$/, "");
1320                found = match_regexp(line, lineNo, record, SORT_UNARY, "debugOne" +
1321" [IDX/IDX] next=IDX/IDX sect=IDX/IDX  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT"
1322                ) || match_regexp(line, lineNo, record, SORT_BINARY, "debugOne" +
1323" [IDX/IDX] next=IDX/IDX sect=IDX/IDX  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT oppVal=IDX oppSum=OPT"
1324                ) || match_regexp(line, lineNo, record, SORT_UNARY, "dumpOne" +
1325" [IDX/IDX] next=IDX/IDX sect=NUM/NUM  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT"
1326                ) || match_regexp(line, lineNo, record, SORT_BINARY, "dumpOne" +
1327" [IDX/IDX] next=IDX/IDX sect=NUM/NUM  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT oppVal=IDX oppSum=OPT"
1328                );
1329                if (found) {
1330                    record[1].push(hasDone);
1331                    record[1].push(hasUnorderable);
1332                    record[1].push(hasSmall);
1333                    record[1].push(hasTiny);
1334                    record[1].push(hasOperand);
1335                    record[1].push(hasStop);
1336                }
1337                break;
1338            case REC_TYPE_TOP:
1339                found = match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
1340" id=IDX s=T_VAL e=T_VAL cw=NUM swap=NUM inflections=NUM monotonic=NUM"
1341                ) || match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
1342" id=IDX s=T_VAL e=T_VAL (-) cw=NUM swap=NUM inflections=NUM monotonic=NUM"
1343                ) || match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
1344" id=IDX s=T_VAL e=T_VAL (+) cw=NUM swap=NUM inflections=NUM monotonic=NUM"
1345                );
1346                break;
1347            case REC_TYPE_MARK:
1348                found = match_regexp(line, lineNo, record, MARK_LINE, "markWinding" +
1349" id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
1350                ) || match_regexp(line, lineNo, record, MARK_QUAD, "markWinding" +
1351" id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
1352                ) || match_regexp(line, lineNo, record, MARK_CONIC, "markWinding" +
1353" id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
1354                ) || match_regexp(line, lineNo, record, MARK_CUBIC, "markWinding" +
1355" id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
1356                ) || match_regexp(line, lineNo, record, MARK_DONE_LINE, "markDone" +
1357" id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
1358                ) || match_regexp(line, lineNo, record, MARK_DONE_QUAD, "markDone" +
1359" id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
1360                ) || match_regexp(line, lineNo, record, MARK_DONE_CONIC, "markDone" +
1361" id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
1362                ) || match_regexp(line, lineNo, record, MARK_DONE_CUBIC, "markDone" +
1363" id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
1364                ) || match_regexp(line, lineNo, record, MARK_SIMPLE_LINE, "markWinding" +
1365" id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
1366                ) || match_regexp(line, lineNo, record, MARK_SIMPLE_QUAD, "markWinding" +
1367" id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
1368                ) || match_regexp(line, lineNo, record, MARK_SIMPLE_CONIC, "markWinding" +
1369" id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
1370                ) || match_regexp(line, lineNo, record, MARK_SIMPLE_CUBIC, "markWinding" +
1371" id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
1372                ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" +
1373" last segment=IDX span=IDX"
1374                ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" +
1375" last segment=IDX span=IDX windSum=OPT");
1376                break;
1377            case REC_TYPE_OP:
1378                if (line.lastIndexOf("oppSign oppSign=", 0) === 0
1379                        || line.lastIndexOf("operator<", 0) === 0) {
1380                    found = true;
1381                    break;
1382                }
1383                found = match_regexp(line, lineNo, record, OP_DIFFERENCE, "op diff"
1384                ) || match_regexp(line, lineNo, record, OP_INTERSECT, "op intersect"
1385                ) || match_regexp(line, lineNo, record, OP_INTERSECT, "op sect"
1386                ) || match_regexp(line, lineNo, record, OP_UNION, "op union"
1387                ) || match_regexp(line, lineNo, record, OP_XOR, "op xor"
1388                );
1389                break;
1390            case REC_TYPE_UNKNOWN:
1391                found = true;
1392                break;
1393        }
1394        if (!found) {
1395            console.log(line + " [" + lineNo + "] of type " + type + " not found");
1396        }
1397    }
1398    if (recType != REC_TYPE_UNKNOWN) {
1399        records.push(recType);
1400        records.push(lastLineNo);
1401        records.push(record);
1402    }
1403    if (records.length >= 1) {
1404        tests[testIndex] = records;
1405        testLines[testIndex] = lines;
1406    }
1407}
1408
1409function init(test) {
1410    var canvas = document.getElementById('canvas');
1411    if (!canvas.getContext) return;
1412    ctx = canvas.getContext('2d');
1413    var resScale = retina_scale && window.devicePixelRatio ? window.devicePixelRatio : 1;
1414    var unscaledWidth = window.innerWidth - 20;
1415    var unscaledHeight = window.innerHeight - 20;
1416    screenWidth = unscaledWidth;
1417    screenHeight = unscaledHeight;
1418    canvas.width = unscaledWidth * resScale;
1419    canvas.height = unscaledHeight * resScale;
1420    canvas.style.width = unscaledWidth + 'px';
1421    canvas.style.height = unscaledHeight + 'px';
1422    if (resScale != 1) {
1423        ctx.scale(resScale, resScale);
1424    }
1425    xmin = Infinity;
1426    xmax = -Infinity;
1427    ymin = Infinity;
1428    ymax = -Infinity;
1429    hasPath = hasComputedPath = false;
1430    firstActiveSpan = -1;
1431    for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
1432        var recType = test[tIndex];
1433        if (!typeof recType == 'number' || recType < REC_TYPE_UNKNOWN || recType > REC_TYPE_LAST) {
1434            console.log("unknown rec type: " + recType);
1435            throw "stop execution";
1436        }
1437        var records = test[tIndex + 2];
1438        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1439            var fragType = records[recordIndex];
1440            if (!typeof fragType == 'number' || fragType < 1 || fragType > FRAG_TYPE_LAST) {
1441                console.log("unknown in range frag type: " + fragType);
1442                throw "stop execution";
1443            }
1444            var frags = records[recordIndex + 1];
1445            var first = 0;
1446            var last = -1;
1447            var first2 = 0;
1448            var last2 = 0;
1449            switch (recType) {
1450                case REC_TYPE_COMPUTED:
1451                    if (fragType == COMPUTED_SET_1 || fragType == COMPUTED_SET_2) {
1452                        break;
1453                    }
1454                    hasComputedPath = true;
1455                case REC_TYPE_PATH:
1456                    first = 1;
1457                    switch (fragType) {
1458                        case PATH_LINE:
1459                            last = 5;
1460                            break;
1461                        case PATH_CONIC:
1462                        case PATH_QUAD:
1463                            last = 7;
1464                            break;
1465                        case PATH_CUBIC:
1466                            last = 9;
1467                            break;
1468                        default:
1469                            console.log("unknown " + (recType == REC_TYPE_PATH ? "REC_TYPE_PATH"
1470                                    : "REC_TYPE_COMPUTED") + " frag type:" + fragType);
1471                            throw "stop execution";
1472                    }
1473                    if (recType == REC_TYPE_PATH) {
1474                        hasPath = true;
1475                    }
1476                    break;
1477                case REC_TYPE_PATH2:
1478                    first = 1;
1479                    switch (fragType) {
1480                        case PATH_LINE:
1481                            last = 5;
1482                            break;
1483                        case PATH_CONIC:
1484                        case PATH_QUAD:
1485                            last = 7;
1486                            break;
1487                        case PATH_CUBIC:
1488                            last = 9;
1489                            break;
1490                        default:
1491                            console.log("unknown " + (recType == REC_TYPE_PATH2 ? "REC_TYPE_PATH2"
1492                                    : "REC_TYPE_COMPUTED") + " frag type:" + fragType);
1493                            throw "stop execution";
1494                    }
1495                    if (recType == REC_TYPE_PATH2) {
1496                        hasPath = true;
1497                    }
1498                    break;
1499                case REC_TYPE_ACTIVE:
1500                    if (firstActiveSpan < 0) {
1501                        firstActiveSpan = tIndex;
1502                    }
1503                    first = 1;
1504                    switch (fragType) {
1505                        case ACTIVE_LINE_SPAN:
1506                            last = 5;
1507                            break;
1508                        case ACTIVE_CONIC_SPAN:
1509                        case ACTIVE_QUAD_SPAN:
1510                            last = 7;
1511                            break;
1512                        case ACTIVE_CUBIC_SPAN:
1513                            last = 9;
1514                            break;
1515                        default:
1516                            console.log("unknown REC_TYPE_ACTIVE frag type: " + fragType);
1517                            throw "stop execution";
1518                    }
1519                    break;
1520                case REC_TYPE_ADD:
1521                    switch (fragType) {
1522                        case ADD_MOVETO:
1523                            break;
1524                        case ADD_LINETO:
1525                            last = 4;
1526                            break;
1527                        case ADD_CONICTO:
1528                        case ADD_QUADTO:
1529                            last = 6;
1530                            break;
1531                        case ADD_CUBICTO:
1532                            last = 8;
1533                            break;
1534                        case ADD_CLOSE:
1535                        case ADD_FILL:
1536                            break;
1537                        default:
1538                            console.log("unknown REC_TYPE_ADD frag type: " + fragType);
1539                            throw "stop execution";
1540                    }
1541                    break;
1542                case REC_TYPE_AFTERPART:
1543                    switch (fragType) {
1544                        case PATH_LINE:
1545                            last = 4;
1546                            break;
1547                        case PATH_CONIC:
1548                        case PATH_QUAD:
1549                            last = 6;
1550                            break;
1551                        case PATH_CUBIC:
1552                            last = 8;
1553                            break;
1554                        default:
1555                            console.log("unknown REC_TYPE_ACTIVEPART frag type: " + fragType);
1556                            throw "stop execution";
1557                    }
1558                    break;
1559                case REC_TYPE_SECT:
1560                    switch (fragType) {
1561                        case INTERSECT_LINE:
1562                            first = 1; last = 5; first2 = 8; last2 = 12;
1563                            break;
1564                        case INTERSECT_LINE_2:
1565                            first = 1; last = 5; first2 = 11; last2 = 15;
1566                            break;
1567                        case INTERSECT_LINE_NO:
1568                            first = 0; last = 4; first2 = 4; last2 = 8;
1569                            break;
1570                        case INTERSECT_CONIC_LINE:
1571                            first = 1; last = 7; first2 = 11; last2 = 15;
1572                            break;
1573                        case INTERSECT_QUAD_LINE:
1574                            first = 1; last = 7; first2 = 10; last2 = 14;
1575                            break;
1576                        case INTERSECT_CONIC_LINE_2:
1577                            first = 1; last = 7; first2 = 14; last2 = 18;
1578                            break;
1579                        case INTERSECT_QUAD_LINE_2:
1580                            first = 1; last = 7; first2 = 13; last2 = 17;
1581                            break;
1582                        case INTERSECT_CONIC_LINE_NO:
1583                            first = 0; last = 6; first2 = 7; last2 = 11;
1584                            break;
1585                        case INTERSECT_QUAD_LINE_NO:
1586                            first = 0; last = 6; first2 = 6; last2 = 10;
1587                            break;
1588                        case INTERSECT_CONIC:
1589                            first = 1; last = 7; first2 = 11; last2 = 17;
1590                            break;
1591                        case INTERSECT_QUAD:
1592                            first = 1; last = 7; first2 = 10; last2 = 16;
1593                            break;
1594                        case INTERSECT_CONIC_2:
1595                            first = 1; last = 7; first2 = 14; last2 = 20;
1596                            break;
1597                        case INTERSECT_QUAD_2:
1598                            first = 1; last = 7; first2 = 13; last2 = 19;
1599                            break;
1600                        case INTERSECT_CONIC_NO:
1601                            first = 0; last = 6; first2 = 7; last2 = 13;
1602                            break;
1603                        case INTERSECT_QUAD_NO:
1604                            first = 0; last = 6; first2 = 6; last2 = 12;
1605                            break;
1606                        case INTERSECT_SELF_CUBIC:
1607                            first = 1; last = 9;
1608                            break;
1609                        case INTERSECT_SELF_CUBIC_NO:
1610                            first = 0; last = 8;
1611                            break;
1612                        case INTERSECT_CUBIC_LINE:
1613                            first = 1; last = 9; first2 = 12; last2 = 16;
1614                            break;
1615                        case INTERSECT_CUBIC_LINE_2:
1616                            first = 1; last = 9; first2 = 15; last2 = 19;
1617                            break;
1618                        case INTERSECT_CUBIC_LINE_3:
1619                            first = 1; last = 9; first2 = 18; last2 = 22;
1620                            break;
1621                        case INTERSECT_CUBIC_LINE_NO:
1622                            first = 0; last = 8; first2 = 8; last2 = 12;
1623                            break;
1624                        case INTERSECT_CUBIC_QUAD:
1625                            first = 1; last = 9; first2 = 12; last2 = 18;
1626                            break;
1627                        case INTERSECT_CUBIC_QUAD_2:
1628                            first = 1; last = 9; first2 = 15; last2 = 21;
1629                            break;
1630                        case INTERSECT_CUBIC_QUAD_3:
1631                            first = 1; last = 9; first2 = 18; last2 = 24;
1632                            break;
1633                        case INTERSECT_CUBIC_QUAD_4:
1634                            first = 1; last = 9; first2 = 21; last2 = 27;
1635                            break;
1636                        case INTERSECT_CUBIC_QUAD_NO:
1637                            first = 0; last = 8; first2 = 8; last2 = 14;
1638                            break;
1639                        case INTERSECT_CUBIC:
1640                            first = 1; last = 9; first2 = 12; last2 = 20;
1641                            break;
1642                        case INTERSECT_CUBIC_2:
1643                            first = 1; last = 9; first2 = 15; last2 = 23;
1644                            break;
1645                        case INTERSECT_CUBIC_3:
1646                            first = 1; last = 9; first2 = 18; last2 = 26;
1647                            break;
1648                        case INTERSECT_CUBIC_4:
1649                            first = 1; last = 9; first2 = 21; last2 = 29;
1650                            break;
1651                        case INTERSECT_CUBIC_NO:
1652                            first = 0; last = 8; first2 = 8; last2 = 16;
1653                            break;
1654                        default:
1655                            console.log("unknown REC_TYPE_SECT frag type: " + fragType);
1656                            throw "stop execution";
1657                    }
1658                    break;
1659                default:
1660                    continue;
1661            }
1662            for (var idx = first; idx < last; idx += 2) {
1663                xmin = Math.min(xmin, frags[idx]);
1664                xmax = Math.max(xmax, frags[idx]);
1665                ymin = Math.min(ymin, frags[idx + 1]);
1666                ymax = Math.max(ymax, frags[idx + 1]);
1667            }
1668            for (var idx = first2; idx < last2; idx += 2) {
1669                xmin = Math.min(xmin, frags[idx]);
1670                xmax = Math.max(xmax, frags[idx]);
1671                ymin = Math.min(ymin, frags[idx + 1]);
1672                ymax = Math.max(ymax, frags[idx + 1]);
1673            }
1674        }
1675    }
1676    var angleBounds = [Infinity, Infinity, -Infinity, -Infinity];
1677    for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
1678        var recType = test[tIndex];
1679        var records = test[tIndex + 2];
1680        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1681            var fragType = records[recordIndex];
1682            var frags = records[recordIndex + 1];
1683            switch (recType) {
1684                case REC_TYPE_ACTIVE_OP:
1685                    if (!draw_op) {
1686                        break;
1687                    }
1688                    {
1689                        var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
1690                        curve_extremes(curve, angleBounds);
1691                    }
1692                    break;
1693                case REC_TYPE_ANGLE:
1694                    if (!draw_angle) {
1695                        break;
1696                    }
1697                    {
1698                        var curve = curvePartialByID(test, frags[0], frags[4], frags[5]);
1699                        curve_extremes(curve, angleBounds);
1700                        curve = curvePartialByID(test, frags[6], frags[10], frags[11]);
1701                        curve_extremes(curve, angleBounds);
1702                        curve = curvePartialByID(test, frags[12], frags[16], frags[17]);
1703                    }
1704                    break;
1705                case REC_TYPE_COINCIDENCE:
1706                    if (!draw_coincidence) {
1707                        break;
1708                    }
1709                    {
1710                        var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
1711                        curve_extremes(curve, angleBounds);
1712                    }
1713                    break;
1714                case REC_TYPE_SORT:
1715                    if (!draw_sort) {
1716                        break;
1717                    }
1718                    if (fragType == SORT_UNARY || fragType == SORT_BINARY) {
1719                        var curve = curvePartialByID(test, frags[0], frags[6], frags[8]);
1720                        curve_extremes(curve, angleBounds);
1721                    }
1722                    break;
1723                case REC_TYPE_TOP:
1724                    if (!draw_top) {
1725                        break;
1726                    }
1727                    {
1728                        var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
1729                        curve_extremes(curve, angleBounds);
1730                    }
1731                    break;
1732            }
1733        }
1734    }
1735    xmin = Math.min(xmin, angleBounds[0]);
1736    ymin = Math.min(ymin, angleBounds[1]);
1737    xmax = Math.max(xmax, angleBounds[2]);
1738    ymax = Math.max(ymax, angleBounds[3]);
1739    setScale(xmin, xmax, ymin, ymax);
1740    if (hasPath == false && hasComputedPath == true && !draw_computed) {
1741        draw_computed = 7; // show quadratics, conics, and cubics
1742    }
1743    if (hasPath == true && hasComputedPath == false && draw_computed) {
1744        draw_computed = 0;
1745    }
1746}
1747
1748function curveByID(test, id) {
1749    var tIndex = -3;
1750    while ((tIndex += 3) < test.length) {
1751        var recType = test[tIndex];
1752        if (recType == REC_TYPE_OP) {
1753            continue;
1754        }
1755        if (recType != REC_TYPE_PATH) {
1756            return [];
1757        }
1758        var records = test[tIndex + 2];
1759        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1760            var fragType = records[recordIndex];
1761            var frags = records[recordIndex + 1];
1762            if (frags[0] == id) {
1763                switch (fragType) {
1764                    case PATH_LINE:
1765                        return [frags[1], frags[2], frags[3], frags[4]];
1766                    case PATH_QUAD:
1767                        return [frags[1], frags[2], frags[3], frags[4],
1768                                frags[5], frags[6]];
1769                    case PATH_CONIC:
1770                        return [frags[1], frags[2], frags[3], frags[4],
1771                                frags[5], frags[6], frags[7]];
1772                    case PATH_CUBIC:
1773                        return [frags[1], frags[2], frags[3], frags[4],
1774                                frags[5], frags[6], frags[7], frags[8]];
1775                }
1776            }
1777        }
1778    }
1779    return [];
1780}
1781
1782function curvePartialByID(test, id, t0, t1) {
1783    var tIndex = -3;
1784    while ((tIndex += 3) < test.length) {
1785        var recType = test[tIndex];
1786        if (recType == REC_TYPE_OP) {
1787            continue;
1788        }
1789        if (recType != REC_TYPE_PATH) {
1790            return [];
1791        }
1792        var records = test[tIndex + 2];
1793        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1794            var fragType = records[recordIndex];
1795            var frags = records[recordIndex + 1];
1796            if (frags[0] == id) {
1797                switch (fragType) {
1798                    case PATH_LINE:
1799                        return linePartial(frags[1], frags[2], frags[3], frags[4], t0, t1);
1800                    case PATH_QUAD:
1801                        return quadPartial(frags[1], frags[2], frags[3], frags[4],
1802                                frags[5], frags[6], t0, t1);
1803                    case PATH_CONIC:
1804                        return conicPartial(frags[1], frags[2], frags[3], frags[4],
1805                                frags[5], frags[6], frags[7], t0, t1);
1806                    case PATH_CUBIC:
1807                        return cubicPartial(frags[1], frags[2], frags[3], frags[4],
1808                                frags[5], frags[6], frags[7], frags[8], t0, t1);
1809                }
1810            }
1811        }
1812    }
1813    return [];
1814}
1815
1816function idByCurve(test, frag, type) {
1817    var tIndex = 0;
1818    while (tIndex < test.length) {
1819        var recType = test[tIndex];
1820        if (recType != REC_TYPE_PATH) {
1821            ++tIndex;
1822            continue;
1823        }
1824        var records = test[tIndex + 2];
1825        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1826            var fragType = records[recordIndex];
1827            var frags = records[recordIndex + 1];
1828            if (frag.length != frags.length - 1) {
1829                continue;
1830            }
1831            switch (fragType) {
1832                case PATH_LINE:
1833                    if (frag[0] != frags[1] || frag[1] != frags[2]
1834                            || frag[2] != frags[3] || frag[3] != frags[4]) {
1835                        continue;
1836                    }
1837                    return frags[0];
1838                case PATH_QUAD:
1839                    if (frag[0] != frags[1] || frag[1] != frags[2]
1840                            || frag[2] != frags[3] || frag[3] != frags[4]
1841                            || frag[4] != frags[5] || frag[5] != frags[6]) {
1842                        continue;
1843                    }
1844                    return frags[0];
1845                case PATH_CONIC:
1846                    if (frag[0] != frags[1] || frag[1] != frags[2]
1847                            || frag[2] != frags[3] || frag[3] != frags[4]
1848                            || frag[4] != frags[5] || frag[5] != frags[6]
1849                            || frag[6] != frags[7]) {
1850                        continue;
1851                    }
1852                    return frags[0];
1853                case PATH_CUBIC:
1854                    if (frag[0] != frags[1] || frag[1] != frags[2]
1855                            || frag[2] != frags[3] || frag[3] != frags[4]
1856                            || frag[4] != frags[5] || frag[5] != frags[6]
1857                            || frag[6] != frags[7] || frag[7] != frags[8]) {
1858                        continue;
1859                    }
1860                    return frags[0];
1861            }
1862        }
1863        ++tIndex;
1864    }
1865    return -1;
1866}
1867
1868function curve_extremes(curve, bounds) {
1869    var length = curve.length == 7 ? 6 : curve.length;
1870    for (var index = 0; index < curve.length; index += 2) {
1871        var x = curve[index];
1872        var y = curve[index + 1];
1873        bounds[0] = Math.min(bounds[0], x);
1874        bounds[1] = Math.min(bounds[1], y);
1875        bounds[2] = Math.max(bounds[2], x);
1876        bounds[3] = Math.max(bounds[3], y);
1877    }
1878}
1879
1880function setScale(x0, x1, y0, y1) {
1881    var srcWidth = x1 - x0;
1882    var srcHeight = y1 - y0;
1883    var usableWidth = screenWidth;
1884    var xDigits = Math.ceil(Math.log(Math.abs(xmax)) / Math.log(10));
1885    var yDigits = Math.ceil(Math.log(Math.abs(ymax)) / Math.log(10));
1886    usableWidth -= (xDigits + yDigits) * 10;
1887    usableWidth -= decimal_places * 10;
1888    if (draw_legend) {
1889        usableWidth -= 40;
1890    }
1891    var hscale = usableWidth / srcWidth;
1892    var vscale = screenHeight / srcHeight;
1893    scale = Math.min(hscale, vscale);
1894    var invScale = 1 / scale;
1895    var sxmin = x0 - invScale * 5;
1896    var symin = y0 - invScale * 10;
1897    var sxmax = x1 + invScale * (6 * decimal_places + 10);
1898    var symax = y1 + invScale * 10;
1899    srcWidth = sxmax - sxmin;
1900    srcHeight = symax - symin;
1901    hscale = usableWidth / srcWidth;
1902    vscale = screenHeight / srcHeight;
1903    scale = Math.min(hscale, vscale);
1904    srcLeft = sxmin;
1905    srcTop = symin;
1906}
1907
1908function drawArc(curve, op, from, to) {
1909    var type = PATH_LINE + (curve.length / 2 - 2);
1910    var pt = pointAtT(curve, type, op ? 0.4 : 0.6);
1911    var dy = pt.y - curve[1];
1912    var dx = pt.x - curve[0];
1913    var dist = Math.sqrt(dy * dy + dx * dx);
1914    var _dist = dist * scale;
1915    var angle = Math.atan2(dy, dx);
1916    var _px = (curve[0] - srcLeft) * scale;
1917    var _py = (curve[1] - srcTop) * scale;
1918    var divisor = 4;
1919    var endDist;
1920    do {
1921        var ends = [];
1922        for (var index = -1; index <= 1; index += 2) {
1923            var px = Math.cos(index * Math.PI / divisor);
1924            var py = Math.sin(index * Math.PI / divisor);
1925            ends.push(px);
1926            ends.push(py);
1927        }
1928        var endDx = (ends[2] - ends[0]) * scale * dist;
1929        var endDy = (ends[3] - ends[1]) * scale * dist;
1930        endDist = Math.sqrt(endDx * endDx + endDy * endDy);
1931        if (endDist < 100) {
1932            break;
1933        }
1934        divisor *= 2;
1935    } while (true);
1936    if (endDist < 30) {
1937        return;
1938    }
1939    if (op) {
1940        divisor *= 2;
1941    }
1942    ctx.strokeStyle = op ? "rgba(210,0,45, 0.4)" : "rgba(90,90,90, 0.5)";
1943    ctx.beginPath();
1944    ctx.arc(_px, _py, _dist, angle - Math.PI / divisor, angle + Math.PI / divisor, false);
1945    ctx.stroke();
1946    var saveAlign = ctx.textAlign;
1947    var saveStyle = ctx.fillStyle;
1948    var saveFont = ctx.font;
1949    ctx.textAlign = "center";
1950    ctx.fillStyle = "black";
1951    ctx.font = "normal 24px Arial";
1952    divisor *= 0.8;
1953    for (var index = -1; index <= 1; index += 2) {
1954        var px = curve[0] + Math.cos(angle + index * Math.PI / divisor) * dist;
1955        var py = curve[1] + Math.sin(angle + index * Math.PI / divisor) * dist;
1956        var _px = (px - srcLeft) * scale;
1957        var _py = (py - srcTop) * scale;
1958        ctx.fillText(index < 0 ? to.toString() : from.toString(), _px, _py + 8);
1959    }
1960    ctx.textAlign = saveAlign;
1961    ctx.fillStyle = saveStyle;
1962    ctx.font = saveFont;
1963}
1964
1965function drawPoint(px, py, end) {
1966    var length = drawnPts.length == 7 ? 6 : drawnPts.length;
1967    for (var pts = 0; pts < length; pts += 2) {
1968        var x = drawnPts[pts];
1969        var y = drawnPts[pts + 1];
1970        if (px == x && py == y) {
1971            return;
1972        }
1973    }
1974    drawnPts.push(px);
1975    drawnPts.push(py);
1976    var label = px.toFixed(decimal_places) + ", " + py.toFixed(decimal_places);
1977    var _px = (px - srcLeft) * scale;
1978    var _py = (py - srcTop) * scale;
1979    ctx.beginPath();
1980    ctx.arc(_px, _py, 3, 0, Math.PI*2, true);
1981    ctx.closePath();
1982    if (end) {
1983        ctx.fill();
1984    } else {
1985        ctx.stroke();
1986    }
1987    if (debug_xy) {
1988        ctx.textAlign = "left";
1989        ctx.fillText(label, _px + 5, _py);
1990    }
1991}
1992
1993function coordCount(curveType) {
1994    switch (curveType) {
1995        case PATH_LINE:
1996            return 4;
1997        case PATH_QUAD:
1998            return 6;
1999        case PATH_CONIC:
2000            return 6;
2001        case PATH_CUBIC:
2002            return 8;
2003    }
2004    return -1;
2005}
2006
2007function drawPoints(ptArray, curveType, drawControls) {
2008    var count = coordCount(curveType);
2009    for (var idx = 0; idx < count; idx += 2) {
2010        if (!drawControls && idx != 0 && idx != count - 2) {
2011            continue;
2012        }
2013        drawPoint(ptArray[idx], ptArray[idx + 1], idx == 0 || idx == count - 2);
2014    }
2015}
2016
2017function drawControlLines(curve, curveType, drawEnd) {
2018    if (curveType == PATH_LINE) {
2019        return;
2020    }
2021    ctx.strokeStyle = "rgba(0,0,0, 0.3)";
2022    drawLine(curve[0], curve[1], curve[2], curve[3]);
2023    drawLine(curve[2], curve[3], curve[4], curve[5]);
2024    if (curveType == PATH_CUBIC) {
2025        drawLine(curve[4], curve[5], curve[6], curve[7]);
2026        if (drawEnd > 1) {
2027            drawLine(curve[6], curve[7], curve[0], curve[1]);
2028            if (drawEnd > 2) {
2029                drawLine(curve[0], curve[1], curve[4], curve[5]);
2030                drawLine(curve[6], curve[7], curve[2], curve[3]);
2031            }
2032        }
2033    } else if (drawEnd > 1) {
2034        drawLine(curve[4], curve[5], curve[0], curve[1]);
2035    }
2036}
2037
2038function pointAtT(curve, curveType, t) {
2039    var xy = {};
2040    switch (curveType) {
2041        case PATH_LINE:
2042            var a = 1 - t;
2043            var b = t;
2044            xy.x = a * curve[0] + b * curve[2];
2045            xy.y = a * curve[1] + b * curve[3];
2046            break;
2047        case PATH_QUAD:
2048            var one_t = 1 - t;
2049            var a = one_t * one_t;
2050            var b = 2 * one_t * t;
2051            var c = t * t;
2052            xy.x = a * curve[0] + b * curve[2] + c * curve[4];
2053            xy.y = a * curve[1] + b * curve[3] + c * curve[5];
2054            break;
2055        case PATH_CONIC:
2056            var one_t = 1 - t;
2057            var a = one_t * one_t;
2058            var b = 2 * one_t * t;
2059            var c = t * t;
2060            xy.x = a * curve[0] + b * curve[2] * curve[6] + c * curve[4];
2061            xy.y = a * curve[1] + b * curve[3] * curve[6] + c * curve[5];
2062            var d = a + b * curve[6] + c;
2063            xy.x /= d;
2064            xy.y /= d;
2065            break;
2066        case PATH_CUBIC:
2067            var one_t = 1 - t;
2068            var one_t2 = one_t * one_t;
2069            var a = one_t2 * one_t;
2070            var b = 3 * one_t2 * t;
2071            var t2 = t * t;
2072            var c = 3 * one_t * t2;
2073            var d = t2 * t;
2074            xy.x = a * curve[0] + b * curve[2] + c * curve[4] + d * curve[6];
2075            xy.y = a * curve[1] + b * curve[3] + c * curve[5] + d * curve[7];
2076            break;
2077    }
2078    return xy;
2079}
2080
2081function drawPointAtT(curve, curveType) {
2082    var x, y;
2083    var xy = pointAtT(curve, curveType, curveT);
2084    drawPoint(xy.x, xy.y, true);
2085    if (!draw_intersectT) {
2086        return;
2087    }
2088    ctx.fillStyle = "red";
2089    drawTAtPointUp(xy.x, xy.y, curveT);
2090}
2091
2092function drawTAtPointUp(px, py, t) {
2093    var label = t.toFixed(decimal_places);
2094    var _px = (px - srcLeft)* scale;
2095    var _py = (py - srcTop) * scale;
2096    ctx.fillText(label, _px + 5, _py - 10);
2097}
2098
2099function drawTAtPointDown(px, py, t) {
2100    var label = t.toFixed(decimal_places);
2101    var _px = (px - srcLeft)* scale;
2102    var _py = (py - srcTop) * scale;
2103    ctx.fillText(label, _px + 5, _py + 10);
2104}
2105
2106function alreadyDrawnLine(x1, y1, x2, y2) {
2107    if (collect_bounds) {
2108        if (focus_enabled) {
2109            focusXmin = Math.min(focusXmin, x1, x2);
2110            focusYmin = Math.min(focusYmin, y1, y2);
2111            focusXmax = Math.max(focusXmax, x1, x2);
2112            focusYmax = Math.max(focusYmax, y1, y2);
2113        }
2114        return true;
2115    }
2116    for (var pts = 0; pts < drawnLines.length; pts += 4) {
2117        if (x1 == drawnLines[pts] && y1 == drawnLines[pts + 1]
2118                && x2 == drawnLines[pts + 2] && y2 == drawnLines[pts + 3]) {
2119            return true;
2120        }
2121    }
2122    drawnLines.push(x1);
2123    drawnLines.push(y1);
2124    drawnLines.push(x2);
2125    drawnLines.push(y2);
2126    return false;
2127}
2128
2129function drawLine(x1, y1, x2, y2) {
2130    if (alreadyDrawnLine(x1, y1, x2, y2)) {
2131        return;
2132    }
2133    ctx.beginPath();
2134    ctx.moveTo((x1 - srcLeft) * scale,
2135            (y1 - srcTop) * scale);
2136    ctx.lineTo((x2 - srcLeft) * scale,
2137            (y2 - srcTop) * scale);
2138    ctx.stroke();
2139}
2140
2141function linePartial(x1, y1, x2, y2, t1, t2) {
2142    var dx = x1 - x2;
2143    var dy = y1 - y2;
2144    var array = [
2145        x1 - t1 * dx,
2146        y1 - t1 * dy,
2147        x1 - t2 * dx,
2148        y1 - t2 * dy
2149    ];
2150    return array;
2151}
2152
2153function drawLinePartial(x1, y1, x2, y2, t1, t2) {
2154    var a = linePartial(x1, y1, x2, y2, t1, t2);
2155    var ax = a[0];
2156    var ay = a[1];
2157    var bx = a[2];
2158    var by = a[3];
2159    if (alreadyDrawnLine(ax, ay, bx, by)) {
2160        return;
2161    }
2162    ctx.beginPath();
2163    ctx.moveTo((ax - srcLeft) * scale,
2164            (ay - srcTop) * scale);
2165    ctx.lineTo((bx - srcLeft) * scale,
2166            (by - srcTop) * scale);
2167    ctx.stroke();
2168}
2169
2170function alreadyDrawnQuad(x1, y1, x2, y2, x3, y3) {
2171    if (collect_bounds) {
2172        if (focus_enabled) {
2173            focusXmin = Math.min(focusXmin, x1, x2, x3);
2174            focusYmin = Math.min(focusYmin, y1, y2, y3);
2175            focusXmax = Math.max(focusXmax, x1, x2, x3);
2176            focusYmax = Math.max(focusYmax, y1, y2, y3);
2177        }
2178        return true;
2179    }
2180    for (var pts = 0; pts < drawnQuads.length; pts += 6) {
2181        if (x1 == drawnQuads[pts] && y1 == drawnQuads[pts + 1]
2182                && x2 == drawnQuads[pts + 2] && y2 == drawnQuads[pts + 3]
2183                && x3 == drawnQuads[pts + 4] && y3 == drawnQuads[pts + 5]) {
2184            return true;
2185        }
2186    }
2187    drawnQuads.push(x1);
2188    drawnQuads.push(y1);
2189    drawnQuads.push(x2);
2190    drawnQuads.push(y2);
2191    drawnQuads.push(x3);
2192    drawnQuads.push(y3);
2193    return false;
2194}
2195
2196function drawQuad(x1, y1, x2, y2, x3, y3) {
2197    if (alreadyDrawnQuad(x1, y1, x2, y2, x3, y3)) {
2198        return;
2199    }
2200    ctx.beginPath();
2201    ctx.moveTo((x1 - srcLeft) * scale,
2202            (y1 - srcTop) * scale);
2203    ctx.quadraticCurveTo((x2 - srcLeft) * scale,
2204            (y2 - srcTop) * scale,
2205            (x3 - srcLeft) * scale,
2206            (y3 - srcTop) * scale);
2207    ctx.stroke();
2208}
2209
2210function interp(A, B, t) {
2211    return A + (B - A) * t;
2212}
2213
2214function interp_quad_coords(x1, x2, x3, t)
2215{
2216    var ab = interp(x1, x2, t);
2217    var bc = interp(x2, x3, t);
2218    var abc = interp(ab, bc, t);
2219    return abc;
2220}
2221
2222function quadPartial(x1, y1, x2, y2, x3, y3, t1, t2) {
2223    var ax = interp_quad_coords(x1, x2, x3, t1);
2224    var ay = interp_quad_coords(y1, y2, y3, t1);
2225    var dx = interp_quad_coords(x1, x2, x3, (t1 + t2) / 2);
2226    var dy = interp_quad_coords(y1, y2, y3, (t1 + t2) / 2);
2227    var cx = interp_quad_coords(x1, x2, x3, t2);
2228    var cy = interp_quad_coords(y1, y2, y3, t2);
2229    var bx = 2*dx - (ax + cx)/2;
2230    var by = 2*dy - (ay + cy)/2;
2231    var array = [
2232        ax, ay, bx, by, cx, cy
2233    ];
2234    return array;
2235}
2236
2237function drawQuadPartial(x1, y1, x2, y2, x3, y3, t1, t2) {
2238    var a = quadPartial(x1, y1, x2, y2, x3, y3, t1, t2);
2239    var ax = a[0];
2240    var ay = a[1];
2241    var bx = a[2];
2242    var by = a[3];
2243    var cx = a[4];
2244    var cy = a[5];
2245    if (alreadyDrawnQuad(ax, ay, bx, by, cx, cy)) {
2246        return;
2247    }
2248    ctx.beginPath();
2249    ctx.moveTo((ax - srcLeft) * scale,
2250            (ay - srcTop) * scale);
2251    ctx.quadraticCurveTo((bx - srcLeft) * scale,
2252            (by - srcTop) * scale,
2253            (cx - srcLeft) * scale,
2254            (cy - srcTop) * scale);
2255    ctx.stroke();
2256}
2257
2258function alreadyDrawnConic(x1, y1, x2, y2, x3, y3, w) {
2259    if (collect_bounds) {
2260        if (focus_enabled) {
2261            focusXmin = Math.min(focusXmin, x1, x2, x3);
2262            focusYmin = Math.min(focusYmin, y1, y2, y3);
2263            focusXmax = Math.max(focusXmax, x1, x2, x3);
2264            focusYmax = Math.max(focusYmax, y1, y2, y3);
2265        }
2266        return true;
2267    }
2268    for (var pts = 0; pts < drawnConics.length; pts += 8) {
2269        if (x1 == drawnConics[pts] && y1 == drawnCubics[pts + 1]
2270                && x2 == drawnCubics[pts + 2] && y2 == drawnCubics[pts + 3]
2271                && x3 == drawnCubics[pts + 4] && y3 == drawnCubics[pts + 5]
2272                && w == drawnCubics[pts + 6]) {
2273            return true;
2274        }
2275    }
2276    drawnConics.push(x1);
2277    drawnConics.push(y1);
2278    drawnConics.push(x2);
2279    drawnConics.push(y2);
2280    drawnConics.push(x3);
2281    drawnConics.push(y3);
2282    drawnCubics.push(w);
2283    return false;
2284}
2285
2286var kMaxConicToQuadPOW2 = 5;
2287
2288function computeQuadPOW2(curve, tol) {
2289    var a = curve[6] - 1;
2290    var k = a / (4 * (2 + a));
2291    var x = k * (curve[0] - 2 * curve[2] + curve[4]);
2292    var y = k * (curve[1] - 2 * curve[3] + curve[5]);
2293
2294    var error = Math.sqrt(x * x + y * y);
2295    var pow2;
2296    for (pow2 = 0; pow2 < kMaxConicToQuadPOW2; ++pow2) {
2297        if (error <= tol) {
2298            break;
2299        }
2300        error *= 0.25;
2301    }
2302    return pow2;
2303}
2304
2305function subdivide_w_value(w) {
2306    return Math.sqrt(0.5 + w * 0.5);
2307}
2308
2309function chop(curve, part1, part2) {
2310    var w = curve[6];
2311    var scale = 1 / (1 + w);
2312    part1[0] = curve[0];
2313    part1[1] = curve[1];
2314    part1[2] = (curve[0] + curve[2] * w) * scale;
2315    part1[3] = (curve[1] + curve[3] * w) * scale;
2316    part1[4] = part2[0] = (curve[0] + (curve[2] * w) * 2 + curve[4]) * scale * 0.5;
2317    part1[5] = part2[1] = (curve[1] + (curve[3] * w) * 2 + curve[5]) * scale * 0.5;
2318    part2[2] = (curve[2] * w + curve[4]) * scale;
2319    part2[3] = (curve[3] * w + curve[5]) * scale;
2320    part2[4] = curve[4];
2321    part2[5] = curve[5];
2322    part1[6] = part2[6] = subdivide_w_value(w);
2323}
2324
2325function subdivide(curve, level, pts) {
2326    if (0 == level) {
2327        pts.push(curve[2]);
2328        pts.push(curve[3]);
2329        pts.push(curve[4]);
2330        pts.push(curve[5]);
2331    } else {
2332        var part1 = [], part2 = [];
2333        chop(curve, part1, part2);
2334        --level;
2335        subdivide(part1, level, pts);
2336        subdivide(part2, level, pts);
2337    }
2338}
2339
2340function chopIntoQuadsPOW2(curve, pow2, pts) {
2341    subdivide(curve, pow2, pts);
2342    return 1 << pow2;
2343}
2344
2345function drawConicWithQuads(x1, y1, x2, y2, x3, y3, w) {
2346    if (alreadyDrawnConic(x1, y1, x2, y2, x3, y3, w)) {
2347        return;
2348    }
2349    ctx.beginPath();
2350    ctx.moveTo((x1 - srcLeft) * scale,
2351            (y1 - srcTop) * scale);
2352    var tol = 1 / scale;
2353    var curve = [x1, y1, x2, y2, x3, y3, w];
2354    var pow2 = computeQuadPOW2(curve, tol);
2355    var pts = [];
2356    chopIntoQuadsPOW2(curve, pow2, pts);
2357    for (var i = 0; i < pts.length; i += 4) {
2358        ctx.quadraticCurveTo(
2359            (pts[i + 0] - srcLeft) * scale, (pts[i + 1] - srcTop) * scale,
2360            (pts[i + 2] - srcLeft) * scale, (pts[i + 3] - srcTop) * scale);
2361    }
2362    ctx.stroke();
2363}
2364
2365function conic_eval_numerator(x1, x2, x3, w, t) {
2366    var src2w = x2 * w;
2367    var C = x1;
2368    var A = x3 - 2 * src2w + C;
2369    var B = 2 * (src2w - C);
2370    return (A * t + B) * t + C;
2371}
2372
2373
2374function conic_eval_denominator(w, t) {
2375    var B = 2 * (w - 1);
2376    var C = 1;
2377    var A = -B;
2378    return (A * t + B) * t + C;
2379}
2380
2381function conicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2) {
2382    var ax = conic_eval_numerator(x1, x2, x3, w, t1);
2383    var ay = conic_eval_numerator(y1, y2, y3, w, t1);
2384    var az = conic_eval_denominator(w, t1);
2385    var midT = (t1 + t2) / 2;
2386    var dx = conic_eval_numerator(x1, x2, x3, w, midT);
2387    var dy = conic_eval_numerator(y1, y2, y3, w, midT);
2388    var dz = conic_eval_denominator(w, midT);
2389    var cx = conic_eval_numerator(x1, x2, x3, w, t2);
2390    var cy = conic_eval_numerator(y1, y2, y3, w, t2);
2391    var cz = conic_eval_denominator(w, t2);
2392    var bx = 2 * dx - (ax + cx) / 2;
2393    var by = 2 * dy - (ay + cy) / 2;
2394    var bz = 2 * dz - (az + cz) / 2;
2395    var dt = t2 - t1;
2396    var dt_1 = 1 - dt;
2397    var partW = (1 + dt * (w - 1)) / Math.sqrt(dt * dt + 2 * dt * dt_1 * w + dt_1 * dt_1);
2398    var array = [
2399        ax / az, ay / az, bx / bz, by / bz, cx / cz, cy / cz, partW
2400    ];
2401    return array;
2402}
2403
2404function drawConicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2) {
2405    var a = conicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2);
2406    var ax = a[0];
2407    var ay = a[1];
2408    var bx = a[2];
2409    var by = a[3];
2410    var cx = a[4];
2411    var cy = a[5];
2412    var w_ = a[6];
2413    drawConicWithQuads(ax, ay, bx, by, cx, cy, w_);
2414}
2415
2416function alreadyDrawnCubic(x1, y1, x2, y2, x3, y3, x4, y4) {
2417    if (collect_bounds) {
2418        if (focus_enabled) {
2419            focusXmin = Math.min(focusXmin, x1, x2, x3, x4);
2420            focusYmin = Math.min(focusYmin, y1, y2, y3, y4);
2421            focusXmax = Math.max(focusXmax, x1, x2, x3, x4);
2422            focusYmax = Math.max(focusYmax, y1, y2, y3, y4);
2423        }
2424        return true;
2425    }
2426    for (var pts = 0; pts < drawnCubics.length; pts += 8) {
2427        if (x1 == drawnCubics[pts] && y1 == drawnCubics[pts + 1]
2428                && x2 == drawnCubics[pts + 2] && y2 == drawnCubics[pts + 3]
2429                && x3 == drawnCubics[pts + 4] && y3 == drawnCubics[pts + 5]
2430                && x4 == drawnCubics[pts + 6] && y4 == drawnCubics[pts + 7]) {
2431            return true;
2432        }
2433    }
2434    drawnCubics.push(x1);
2435    drawnCubics.push(y1);
2436    drawnCubics.push(x2);
2437    drawnCubics.push(y2);
2438    drawnCubics.push(x3);
2439    drawnCubics.push(y3);
2440    drawnCubics.push(x4);
2441    drawnCubics.push(y4);
2442    return false;
2443}
2444
2445function drawCubic(x1, y1, x2, y2, x3, y3, x4, y4) {
2446    if (alreadyDrawnCubic(x1, y1, x2, y2, x3, y3, x4, y4)) {
2447        return;
2448    }
2449    ctx.beginPath();
2450    ctx.moveTo((x1 - srcLeft) * scale,
2451            (y1 - srcTop) * scale);
2452    ctx.bezierCurveTo((x2 - srcLeft) * scale,
2453            (y2 - srcTop) * scale,
2454            (x3 - srcLeft) * scale,
2455            (y3 - srcTop) * scale,
2456            (x4 - srcLeft) * scale,
2457            (y4 - srcTop) * scale);
2458    ctx.stroke();
2459}
2460
2461function interp_cubic_coords(x1, x2, x3, x4, t)
2462{
2463    var ab = interp(x1, x2, t);
2464    var bc = interp(x2, x3, t);
2465    var cd = interp(x3, x4, t);
2466    var abc = interp(ab, bc, t);
2467    var bcd = interp(bc, cd, t);
2468    var abcd = interp(abc, bcd, t);
2469    return abcd;
2470}
2471
2472function cubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
2473    var ax = interp_cubic_coords(x1, x2, x3, x4, t1);
2474    var ay = interp_cubic_coords(y1, y2, y3, y4, t1);
2475    var ex = interp_cubic_coords(x1, x2, x3, x4, (t1*2+t2)/3);
2476    var ey = interp_cubic_coords(y1, y2, y3, y4, (t1*2+t2)/3);
2477    var fx = interp_cubic_coords(x1, x2, x3, x4, (t1+t2*2)/3);
2478    var fy = interp_cubic_coords(y1, y2, y3, y4, (t1+t2*2)/3);
2479    var dx = interp_cubic_coords(x1, x2, x3, x4, t2);
2480    var dy = interp_cubic_coords(y1, y2, y3, y4, t2);
2481    var mx = ex * 27 - ax * 8 - dx;
2482    var my = ey * 27 - ay * 8 - dy;
2483    var nx = fx * 27 - ax - dx * 8;
2484    var ny = fy * 27 - ay - dy * 8;
2485    var bx = (mx * 2 - nx) / 18;
2486    var by = (my * 2 - ny) / 18;
2487    var cx = (nx * 2 - mx) / 18;
2488    var cy = (ny * 2 - my) / 18;
2489    var array = [
2490        ax, ay, bx, by, cx, cy, dx, dy
2491    ];
2492    return array;
2493}
2494
2495function drawCubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
2496    var a = cubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2);
2497    var ax = a[0];
2498    var ay = a[1];
2499    var bx = a[2];
2500    var by = a[3];
2501    var cx = a[4];
2502    var cy = a[5];
2503    var dx = a[6];
2504    var dy = a[7];
2505    if (alreadyDrawnCubic(ax, ay, bx, by, cx, cy, dx, dy)) {
2506        return;
2507    }
2508    ctx.beginPath();
2509    ctx.moveTo((ax - srcLeft) * scale,
2510            (ay - srcTop) * scale);
2511    ctx.bezierCurveTo((bx - srcLeft) * scale,
2512            (by - srcTop) * scale,
2513            (cx - srcLeft) * scale,
2514            (cy - srcTop) * scale,
2515            (dx - srcLeft) * scale,
2516            (dy - srcTop) * scale);
2517    ctx.stroke();
2518}
2519
2520function drawCurve(c) {
2521    switch (c.length) {
2522        case 4:
2523            drawLine(c[0], c[1], c[2], c[3]);
2524            break;
2525        case 6:
2526            drawQuad(c[0], c[1], c[2], c[3], c[4], c[5]);
2527            break;
2528        case 7:
2529            drawConicWithQuads(c[0], c[1], c[2], c[3], c[4], c[5], c[6]);
2530            break;
2531        case 8:
2532            drawCubic(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
2533            break;
2534    }
2535}
2536
2537function boundsWidth(pts) {
2538    var min = pts[0];
2539    var max = pts[0];
2540    var length = pts.length == 7 ? 6 : pts.length;
2541    for (var idx = 2; idx < length; idx += 2) {
2542        min = Math.min(min, pts[idx]);
2543        max = Math.max(max, pts[idx]);
2544    }
2545    return max - min;
2546}
2547
2548function boundsHeight(pts) {
2549    var min = pts[1];
2550    var max = pts[1];
2551    var length = pts.length == 7 ? 6 : pts.length;
2552    for (var idx = 3; idx < length; idx += 2) {
2553        min = Math.min(min, pts[idx]);
2554        max = Math.max(max, pts[idx]);
2555    }
2556    return max - min;
2557}
2558
2559function tangent(pts) {
2560    var dx = pts[2] - pts[0];
2561    var dy = pts[3] - pts[1];
2562    if (dx == 0 && dy == 0 && pts.length > 4) {
2563        dx = pts[4] - pts[0];
2564        dy = pts[5] - pts[1];
2565        if (dx == 0 && dy == 0 && pts.length == 8) {
2566            dx = pts[6] - pts[0];
2567            dy = pts[7] - pts[1];
2568        }
2569    }
2570    return Math.atan2(-dy, dx);
2571}
2572
2573function hodograph(cubic) {
2574    var hodo = [];
2575    hodo[0] = 3 * (cubic[2] - cubic[0]);
2576    hodo[1] = 3 * (cubic[3] - cubic[1]);
2577    hodo[2] = 3 * (cubic[4] - cubic[2]);
2578    hodo[3] = 3 * (cubic[5] - cubic[3]);
2579    hodo[4] = 3 * (cubic[6] - cubic[4]);
2580    hodo[5] = 3 * (cubic[7] - cubic[5]);
2581    return hodo;
2582}
2583
2584function hodograph2(cubic) {
2585    var quad = hodograph(cubic);
2586    var hodo = [];
2587    hodo[0] = 2 * (quad[2] - quad[0]);
2588    hodo[1] = 2 * (quad[3] - quad[1]);
2589    hodo[2] = 2 * (quad[4] - quad[2]);
2590    hodo[3] = 2 * (quad[5] - quad[3]);
2591    return hodo;
2592}
2593
2594function quadraticRootsReal(A, B, C, s) {
2595    if (A == 0) {
2596        if (B == 0) {
2597            s[0] = 0;
2598            return C == 0;
2599        }
2600        s[0] = -C / B;
2601        return 1;
2602    }
2603    /* normal form: x^2 + px + q = 0 */
2604    var p = B / (2 * A);
2605    var q = C / A;
2606    var p2 = p * p;
2607    if (p2 < q) {
2608        return 0;
2609    }
2610    var sqrt_D = 0;
2611    if (p2 > q) {
2612        sqrt_D = sqrt(p2 - q);
2613    }
2614    s[0] = sqrt_D - p;
2615    s[1] = -sqrt_D - p;
2616    return 1 + s[0] != s[1];
2617}
2618
2619function add_valid_ts(s, realRoots, t) {
2620    var foundRoots = 0;
2621    for (var index = 0; index < realRoots; ++index) {
2622        var tValue = s[index];
2623        if (tValue >= 0 && tValue <= 1) {
2624            for (var idx2 = 0; idx2 < foundRoots; ++idx2) {
2625                if (t[idx2] != tValue) {
2626                    t[foundRoots++] = tValue;
2627                }
2628            }
2629        }
2630    }
2631    return foundRoots;
2632}
2633
2634function quadraticRootsValidT(a, b, c, t) {
2635    var s = [];
2636    var realRoots = quadraticRootsReal(A, B, C, s);
2637    var foundRoots = add_valid_ts(s, realRoots, t);
2638    return foundRoots != 0;
2639}
2640
2641function find_cubic_inflections(cubic, tValues) {
2642    var Ax = src[2] - src[0];
2643    var Ay = src[3] - src[1];
2644    var Bx = src[4] - 2 * src[2] + src[0];
2645    var By = src[5] - 2 * src[3] + src[1];
2646    var Cx = src[6] + 3 * (src[2] - src[4]) - src[0];
2647    var Cy = src[7] + 3 * (src[3] - src[5]) - src[1];
2648    return quadraticRootsValidT(Bx * Cy - By * Cx, (Ax * Cy - Ay * Cx),
2649            Ax * By - Ay * Bx, tValues);
2650}
2651
2652function dxy_at_t(curve, type, t) {
2653    var dxy = {};
2654    if (type == PATH_QUAD) {
2655        var a = t - 1;
2656        var b = 1 - 2 * t;
2657        var c = t;
2658        dxy.x = a * curve[0] + b * curve[2] + c * curve[4];
2659        dxy.y = a * curve[1] + b * curve[3] + c * curve[5];
2660    } else if (type == PATH_CONIC) {
2661        var p20x = curve[4] - curve[0];
2662        var p20y = curve[5] - curve[1];
2663        var p10xw = (curve[2] - curve[0]) * curve[6];
2664        var p10yw = (curve[3] - curve[1]) * curve[6];
2665        var coeff0x = curve[6] * p20x - p20x;
2666        var coeff0y = curve[6] * p20y - p20y;
2667        var coeff1x = p20x - 2 * p10xw;
2668        var coeff1y = p20y - 2 * p10yw;
2669        dxy.x = t * (t * coeff0x + coeff1x) + p10xw;
2670        dxy.y = t * (t * coeff0y + coeff1y) + p10yw;
2671    } else if (type == PATH_CUBIC) {
2672        var one_t = 1 - t;
2673        var a = curve[0];
2674        var b = curve[2];
2675        var c = curve[4];
2676        var d = curve[6];
2677        dxy.x = 3 * ((b - a) * one_t * one_t + 2 * (c - b) * t * one_t + (d - c) * t * t);
2678        a = curve[1];
2679        b = curve[3];
2680        c = curve[5];
2681        d = curve[7];
2682        dxy.y = 3 * ((b - a) * one_t * one_t + 2 * (c - b) * t * one_t + (d - c) * t * t);
2683    }
2684    return dxy;
2685}
2686
2687function drawLabel(num, px, py) {
2688    ctx.beginPath();
2689    ctx.arc(px, py, 8, 0, Math.PI*2, true);
2690    ctx.closePath();
2691    ctx.strokeStyle = "rgba(0,0,0, 0.4)";
2692    ctx.lineWidth = num == 0 || num == 3 ? 2 : 1;
2693    ctx.stroke();
2694    ctx.fillStyle = "black";
2695    ctx.font = "normal 10px Arial";
2696  //  ctx.rotate(0.001);
2697    ctx.fillText(num, px - 2, py + 3);
2698  //  ctx.rotate(-0.001);
2699}
2700
2701function drawLabelX(ymin, num, loc) {
2702    var px = (loc - srcLeft) * scale;
2703    var py = (ymin - srcTop) * scale - 20;
2704    drawLabel(num, px, py);
2705}
2706
2707function drawLabelY(xmin, num, loc) {
2708    var px = (xmin - srcLeft) * scale - 20;
2709    var py = (loc - srcTop) * scale;
2710    drawLabel(num, px, py);
2711}
2712
2713function drawHodoOrigin(hx, hy, hMinX, hMinY, hMaxX, hMaxY) {
2714    ctx.beginPath();
2715    ctx.moveTo(hx, hy - 100);
2716    ctx.lineTo(hx, hy);
2717    ctx.strokeStyle = hMinY < 0 ? "green" : "blue";
2718    ctx.stroke();
2719    ctx.beginPath();
2720    ctx.moveTo(hx, hy);
2721    ctx.lineTo(hx, hy + 100);
2722    ctx.strokeStyle = hMaxY > 0 ? "green" : "blue";
2723    ctx.stroke();
2724    ctx.beginPath();
2725    ctx.moveTo(hx - 100, hy);
2726    ctx.lineTo(hx, hy);
2727    ctx.strokeStyle = hMinX < 0 ? "green" : "blue";
2728    ctx.stroke();
2729    ctx.beginPath();
2730    ctx.moveTo(hx, hy);
2731    ctx.lineTo(hx + 100, hy);
2732    ctx.strokeStyle = hMaxX > 0 ? "green" : "blue";
2733    ctx.stroke();
2734}
2735
2736function scalexy(x, y, mag) {
2737    var length = Math.sqrt(x * x + y * y);
2738    return mag / length;
2739}
2740
2741function drawArrow(x, y, dx, dy, s) {
2742    var dscale = scalexy(dx, dy, 1 / scale * 100 * s);
2743    dx *= dscale;
2744    dy *= dscale;
2745    ctx.beginPath();
2746    ctx.moveTo((x - srcLeft) * scale, (y - srcTop) * scale);
2747    x += dx;
2748    y += dy;
2749    ctx.lineTo((x - srcLeft) * scale, (y - srcTop) * scale);
2750    dx /= 10;
2751    dy /= 10;
2752    ctx.lineTo((x - dy - srcLeft) * scale, (y + dx - srcTop) * scale);
2753    ctx.lineTo((x + dx * 2 - srcLeft) * scale, (y + dy * 2 - srcTop) * scale);
2754    ctx.lineTo((x + dy - srcLeft) * scale, (y - dx - srcTop) * scale);
2755    ctx.lineTo((x - srcLeft) * scale, (y - srcTop) * scale);
2756    ctx.strokeStyle = "rgba(0,75,0, 0.4)";
2757    ctx.stroke();
2758}
2759
2760function x_at_t(curve, t) {
2761    var one_t = 1 - t;
2762    if (curve.length == 4) {
2763        return one_t * curve[0] + t * curve[2];
2764    }
2765    var one_t2 = one_t * one_t;
2766    var t2 = t * t;
2767    if (curve.length == 6) {
2768        return one_t2 * curve[0] + 2 * one_t * t * curve[2] + t2 * curve[4];
2769    }
2770    if (curve.length == 7) {
2771        return (one_t2 * curve[0] + 2 * one_t * t * curve[2] * curve[6] + t2 * curve[4])
2772                / (one_t2 +2 * one_t * t * curve[6] + t2);
2773    }
2774    var a = one_t2 * one_t;
2775    var b = 3 * one_t2 * t;
2776    var c = 3 * one_t * t2;
2777    var d = t2 * t;
2778    return a * curve[0] + b * curve[2] + c * curve[4] + d * curve[6];
2779}
2780
2781function y_at_t(curve, t) {
2782    var one_t = 1 - t;
2783    if (curve.length == 4) {
2784        return one_t * curve[1] + t * curve[3];
2785    }
2786    var one_t2 = one_t * one_t;
2787    var t2 = t * t;
2788    if (curve.length == 6) {
2789        return one_t2 * curve[1] + 2 * one_t * t * curve[3] + t2 * curve[5];
2790    }
2791    if (curve.length == 7) {
2792        return (one_t2 * curve[1] + 2 * one_t * t * curve[3] * curve[6] + t2 * curve[5])
2793                / (one_t2 +2 * one_t * t * curve[6] + t2);
2794    }
2795    var a = one_t2 * one_t;
2796    var b = 3 * one_t2 * t;
2797    var c = 3 * one_t * t2;
2798    var d = t2 * t;
2799    return a * curve[1] + b * curve[3] + c * curve[5] + d * curve[7];
2800}
2801
2802function drawOrder(curve, label) {
2803    var px = x_at_t(curve, 0.75);
2804    var py = y_at_t(curve, 0.75);
2805    var _px = (px - srcLeft) * scale;
2806    var _py = (py - srcTop) * scale;
2807    ctx.beginPath();
2808    ctx.arc(_px, _py, 15, 0, Math.PI * 2, true);
2809    ctx.closePath();
2810    ctx.fillStyle = "white";
2811    ctx.fill();
2812    if (label == 'L') {
2813        ctx.strokeStyle = "rgba(255,0,0, 1)";
2814        ctx.fillStyle = "rgba(255,0,0, 1)";
2815    } else {
2816        ctx.strokeStyle = "rgba(0,0,255, 1)";
2817        ctx.fillStyle = "rgba(0,0,255, 1)";
2818    }
2819    ctx.stroke();
2820    ctx.font = "normal 16px Arial";
2821    ctx.textAlign = "center";
2822    ctx.fillText(label, _px, _py + 5);
2823    ctx.font = "normal 10px Arial";
2824}
2825
2826function drawID(curve, id) {
2827    var px = x_at_t(curve, 0.5);
2828    var py = y_at_t(curve, 0.5);
2829    var _px = (px - srcLeft) * scale;
2830    var _py = (py - srcTop) * scale;
2831    draw_id_at(id, _px, _py);
2832}
2833
2834function draw_id_at(id, _px, _py) {
2835    ctx.beginPath();
2836    ctx.arc(_px, _py, 15, 0, Math.PI * 2, true);
2837    ctx.closePath();
2838    ctx.fillStyle = "white";
2839    ctx.fill();
2840    ctx.strokeStyle = "rgba(127,127,0, 1)";
2841    ctx.fillStyle = "rgba(127,127,0, 1)";
2842    ctx.stroke();
2843    ctx.font = "normal 16px Arial";
2844    ctx.textAlign = "center";
2845    ctx.fillText(id, _px, _py + 5);
2846    ctx.font = "normal 10px Arial";
2847}
2848
2849function drawLinePartialID(id, x1, y1, x2, y2, t1, t2) {
2850    var curve = [x1, y1, x2, y2];
2851    drawCurvePartialID(id, curve, t1, t2);
2852}
2853
2854function drawQuadPartialID(id, x1, y1, x2, y2, x3, y3, t1, t2) {
2855    var curve = [x1, y1, x2, y2, x3, y3];
2856    drawCurvePartialID(id, curve, t1, t2);
2857}
2858
2859function drawConicPartialID(id, x1, y1, x2, y2, x3, y3, w, t1, t2) {
2860    var curve = [x1, y1, x2, y2, x3, y3, w];
2861    drawCurvePartialID(id, curve, t1, t2);
2862}
2863
2864function drawCubicPartialID(id, x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
2865    var curve = [x1, y1, x2, y2, x3, y3, x4, y4];
2866    drawCurvePartialID(id, curve, t1, t2);
2867}
2868
2869function  drawCurvePartialID(id, curve, t1, t2) {
2870    var px = x_at_t(curve, (t1 + t2) / 2);
2871    var py = y_at_t(curve, (t1 + t2) / 2);
2872    var _px = (px - srcLeft) * scale;
2873    var _py = (py - srcTop) * scale;
2874    draw_id_at(id, _px, _py);
2875}
2876
2877function drawCurveSpecials(test, curve, type) {
2878    if (pt_labels) {
2879        drawPoints(curve, type, pt_labels == 2);
2880    }
2881    if (control_lines != 0) {
2882        drawControlLines(curve, type, control_lines);
2883    }
2884    if (curve_t) {
2885        drawPointAtT(curve, type);
2886    }
2887    if (draw_midpoint) {
2888        var mid = pointAtT(curve, type, 0.5);
2889        drawPoint(mid.x, mid.y, true);
2890    }
2891    if (draw_id) {
2892        var id = idByCurve(test, curve, type);
2893        if (id >= 0) {
2894            drawID(curve, id);
2895        }
2896    }
2897    if (type == PATH_LINE) {
2898        return;
2899    }
2900    if (draw_deriviatives > 0) {
2901        var d = dxy_at_t(curve, type, 0);
2902        drawArrow(curve[0], curve[1], d.x, d.y, 1);
2903        if (draw_deriviatives == 2) {
2904            d = dxy_at_t(curve, type, 1);
2905            if (type == PATH_CUBIC) {
2906                drawArrow(curve[6], curve[7], d.x, d.y, 1);
2907            } else {
2908                drawArrow(curve[4], curve[5], d.x, d.y, 1);
2909            }
2910        }
2911        if (draw_midpoint) {
2912            var mid = pointAtT(curve, type, 0.5);
2913            d = dxy_at_t(curve, type, 0.5);
2914            drawArrow(mid.x, mid.y, d.x, d.y, 1);
2915        }
2916    }
2917    if (type != PATH_CUBIC) {
2918        return;
2919    }
2920    if (draw_sequence) {
2921        var ymin = Math.min(curve[1], curve[3], curve[5], curve[7]);
2922        for (var i = 0; i < 8; i+= 2) {
2923            drawLabelX(ymin, i >> 1, curve[i]);
2924        }
2925        var xmin = Math.min(curve[0], curve[2], curve[4], curve[6]);
2926        for (var i = 1; i < 8; i+= 2) {
2927            drawLabelY(xmin, i >> 1, curve[i]);
2928        }
2929    }
2930}
2931
2932function logCurves(test) {
2933    for (curves in test) {
2934        var curve = test[curves];
2935        dumpCurve(curve);
2936    }
2937}
2938
2939function curveToString(curve) {
2940    var str = "{{";
2941    var length = curve.length == 7 ? 6 : curve.length;
2942    if (curve.length == 7) {
2943        str += "{";
2944    }
2945    for (i = 0; i < length; i += 2) {
2946        str += curve[i].toFixed(decimal_places) + "," + curve[i + 1].toFixed(decimal_places);
2947        if (i < curve.length - 2) {
2948            str += "}, {";
2949        }
2950    }
2951    str += "}";
2952    if (curve.length == 7) {
2953        str += "}, " + curve[6].toFixed(decimal_places);
2954    }
2955    str += "}";
2956    return str;
2957}
2958
2959function dumpCurve(curve) {
2960    console.log(curveToString(curve));
2961}
2962
2963function draw(test, lines, title) {
2964    ctx.fillStyle = "rgba(0,0,0, 0.1)";
2965    ctx.font = "normal 50px Arial";
2966    ctx.textAlign = "left";
2967    ctx.fillText(title, 50, 50);
2968    ctx.font = "normal 10px Arial";
2969    ctx.lineWidth = "1.001"; "0.999";
2970    var secondPath = test.length;
2971    var closeCount = 0;
2972    logStart = -1;
2973    logRange = 0;
2974    // find last active rec type at this step
2975    var curType = test[0];
2976    var curStep = 0;
2977    var hasOp = false;
2978    var lastActive = 0;
2979    var lastAdd = 0;
2980    var lastCoin = 0;
2981    var lastSect = 0;
2982    var lastSort = 0;
2983    var lastMark = 0;
2984    var lastTop = 0;
2985    activeCount = 0;
2986    addCount = 0;
2987    angleCount = 0;
2988    opCount = 0;
2989    sectCount = 0;
2990    sortCount = 0;
2991    topCount = 0;
2992    markCount = 0;
2993    activeMax = 0;
2994    addMax = 0;
2995    angleMax = 0;
2996    coinMax = 0;
2997    opMax = 0;
2998    sectMax = 0;
2999    sectMax2 = 0;
3000    sortMax = 0;
3001    topMax = 0;
3002    markMax = 0;
3003    lastIndex = test.length - 3;
3004    for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
3005        var recType = test[tIndex];
3006        if (!typeof recType == 'number' || recType < REC_TYPE_UNKNOWN || recType > REC_TYPE_LAST) {
3007            console.log("unknown rec type: " + recType);
3008            throw "stop execution";
3009        }
3010   //     if (curType == recType && curType != REC_TYPE_ADD) {
3011   //         continue;
3012   //     }
3013        var inStepRange = step_limit == 0 || curStep < step_limit;
3014        curType = recType;
3015        if (recType == REC_TYPE_OP) {
3016            hasOp = true;
3017            continue;
3018        }
3019        if (recType == REC_TYPE_UNKNOWN) {
3020            // these types do not advance step
3021            continue;
3022        }
3023        var bumpStep = false;
3024        var records = test[tIndex + 2];
3025        var fragType = records[0];
3026        if (recType == REC_TYPE_ADD) {
3027            if (records.length != 2) {
3028                console.log("expect only two elements: " + records.length);
3029                throw "stop execution";
3030            }
3031            if (fragType == ADD_MOVETO || fragType == ADD_CLOSE) {
3032                continue;
3033            }
3034            ++addMax;
3035            if (!draw_add || !inStepRange) {
3036                continue;
3037            }
3038            lastAdd = tIndex;
3039            ++addCount;
3040            bumpStep = true;
3041        }
3042        if (recType == REC_TYPE_PATH && hasOp) {
3043            secondPath = tIndex;
3044        }
3045        if (recType == REC_TYPE_PATH2 && hasOp) {
3046            secondPath = tIndex;
3047        }
3048        if (recType == REC_TYPE_ACTIVE) {
3049            ++activeMax;
3050            if (!draw_active || !inStepRange) {
3051                continue;
3052            }
3053            lastActive = tIndex;
3054            ++activeCount;
3055            bumpStep = true;
3056        }
3057        if (recType == REC_TYPE_ACTIVE_OP) {
3058            ++opMax;
3059            if (!draw_op || !inStepRange) {
3060                continue;
3061            }
3062            lastOp = tIndex;
3063            ++opCount;
3064            bumpStep = true;
3065        }
3066        if (recType == REC_TYPE_AFTERPART) {
3067            if (draw_angle != 3 || !inStepRange) {
3068                continue;
3069            }
3070            lastAngle = tIndex;
3071            ++angleCount;
3072            bumpStep = true;
3073        }
3074        if (recType == REC_TYPE_ANGLE) {
3075            ++angleMax;
3076            if (draw_angle == 0 || draw_angle == 3 || !inStepRange) {
3077                continue;
3078            }
3079            lastAngle = tIndex;
3080            ++angleCount;
3081            bumpStep = true;
3082        }
3083        if (recType == REC_TYPE_COINCIDENCE) {
3084            ++coinMax;
3085            if (!draw_coincidence || !inStepRange) {
3086                continue;
3087            }
3088            lastCoin = tIndex;
3089            ++coinCount;
3090            bumpStep = true;
3091        }
3092        if (recType == REC_TYPE_SECT) {
3093            if (records.length != 2) {
3094                console.log("expect only two elements: " + records.length);
3095                throw "stop execution";
3096            }
3097            ++sectMax;
3098            var sectBump = 1;
3099            switch (fragType) {
3100                case INTERSECT_LINE:
3101                case INTERSECT_QUAD_LINE:
3102                case INTERSECT_QUAD:
3103                case INTERSECT_CONIC_LINE:
3104                case INTERSECT_CONIC:
3105                case INTERSECT_SELF_CUBIC:
3106                case INTERSECT_CUBIC_LINE:
3107                case INTERSECT_CUBIC_QUAD:
3108                case INTERSECT_CUBIC:
3109                    sectBump = 1;
3110                    break;
3111                case INTERSECT_LINE_2:
3112                case INTERSECT_QUAD_LINE_2:
3113                case INTERSECT_QUAD_2:
3114                case INTERSECT_CONIC_LINE_2:
3115                case INTERSECT_CONIC_2:
3116                case INTERSECT_CUBIC_LINE_2:
3117                case INTERSECT_CUBIC_QUAD_2:
3118                case INTERSECT_CUBIC_2:
3119                    sectBump = 2;
3120                    break;
3121                case INTERSECT_LINE_NO:
3122                case INTERSECT_QUAD_LINE_NO:
3123                case INTERSECT_QUAD_NO:
3124                case INTERSECT_CONIC_LINE_NO:
3125                case INTERSECT_CONIC_NO:
3126                case INTERSECT_SELF_CUBIC_NO:
3127                case INTERSECT_CUBIC_LINE_NO:
3128                case INTERSECT_CUBIC_QUAD_NO:
3129                case INTERSECT_CUBIC_NO:
3130                    sectBump = 0;
3131                    break;
3132                case INTERSECT_CUBIC_LINE_3:
3133                case INTERSECT_CUBIC_QUAD_3:
3134                case INTERSECT_CUBIC_3:
3135                    sectBump = 3;
3136                    break;
3137                case INTERSECT_CUBIC_QUAD_4:
3138                case INTERSECT_CUBIC_4:
3139                    sectBump = 4;
3140                    break;
3141                default:
3142                    console.log("missing case " + records.length);
3143                    throw "stop execution";
3144            }
3145            sectMax2 += sectBump;
3146            if (draw_intersection <= 1 || !inStepRange) {
3147                continue;
3148            }
3149            lastSect = tIndex;
3150            sectCount += sectBump;
3151            bumpStep = true;
3152        }
3153        if (recType == REC_TYPE_SORT) {
3154            ++sortMax;
3155            if (!draw_sort || !inStepRange) {
3156                continue;
3157            }
3158            lastSort = tIndex;
3159            ++sortCount;
3160            bumpStep = true;
3161        }
3162        if (recType == REC_TYPE_TOP) {
3163            ++topMax;
3164            if (!draw_top || !inStepRange) {
3165                continue;
3166            }
3167            lastTop = tIndex;
3168            ++topCount;
3169            bumpStep = true;
3170        }
3171        if (recType == REC_TYPE_MARK) {
3172            ++markMax;
3173            if (!draw_mark || !inStepRange) {
3174                continue;
3175            }
3176            lastMark = tIndex;
3177            ++markCount;
3178            bumpStep = true;
3179        }
3180        if (bumpStep) {
3181            lastIndex = tIndex;
3182            logStart = test[tIndex + 1];
3183            logRange = records.length / 2;
3184            ++curStep;
3185        }
3186    }
3187    stepMax = (draw_add ? addMax : 0)
3188            + (draw_active ? activeMax : 0)
3189            + (draw_angle ? angleMax : 0)
3190            + (draw_coincidence ? coinMax : 0)
3191            + (draw_op ? opMax : 0)
3192            + (draw_sort ? sortMax : 0)
3193            + (draw_top ? topMax : 0)
3194            + (draw_mark ? markMax : 0)
3195            + (draw_intersection == 2 ? sectMax : draw_intersection == 3 ? sectMax2 : 0);
3196    if (stepMax == 0) {
3197        stepMax = addMax + activeMax + angleMax + coinMax + opMax + sortMax + topMax + markMax;
3198    }
3199    drawnPts = [];
3200    drawnLines = [];
3201    drawnQuads = [];
3202    drawnConics = [];
3203    drawnCubics = [];
3204    focusXmin = focusYmin = Infinity;
3205    focusXmax = focusYmax = -Infinity;
3206    var pathIndex = 0;
3207    var opLetter = 'S';
3208    for (var tIndex = lastIndex; tIndex >= 0; tIndex -= 3) {
3209        var recType = test[tIndex];
3210        var records = test[tIndex + 2];
3211        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
3212            var fragType = records[recordIndex];
3213            if (!typeof fragType == 'number' || fragType < 1 || fragType > FRAG_TYPE_LAST) {
3214                console.log("unknown in range frag type: " + fragType);
3215                throw "stop execution";
3216            }
3217            var frags = records[recordIndex + 1];
3218            focus_enabled = false;
3219            switch (recType) {
3220                case REC_TYPE_COMPUTED:
3221                    if (draw_computed == 0) {
3222                        continue;
3223                    }
3224                    ctx.lineWidth = 1;
3225                    ctx.strokeStyle = pathIndex == 0 ? "black" : "red";
3226                    ctx.fillStyle = "blue";
3227                    var drawThis = false;
3228                    switch (fragType) {
3229                        case PATH_QUAD:
3230                            if ((draw_computed & 0x9) == 1 || ((draw_computed & 8) != 0
3231                                    && (draw_computed & 7) == pathIndex)) {
3232                                drawQuad(frags[0], frags[1], frags[2], frags[3],
3233                                        frags[4], frags[5]);
3234                                drawThis = true;
3235                            }
3236                            break;
3237                        case PATH_CONIC:
3238                            if ((draw_computed & 0xA) == 2 || ((draw_computed & 8) != 0
3239                                    && (draw_computed & 7) == pathIndex)) {
3240                                drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
3241                                        frags[4], frags[5], frags[6]);
3242                                drawThis = true;
3243                            }
3244                            break;
3245                        case PATH_CUBIC:
3246                            if ((draw_computed & 0xC) == 4 || ((draw_computed & 8) != 0
3247                                     && (draw_computed & 7) == pathIndex)) {
3248                                drawCubic(frags[0], frags[1], frags[2], frags[3],
3249                                        frags[4], frags[5], frags[6], frags[7]);
3250                                drawThis = true;
3251                            }
3252                            ++pathIndex;
3253                            break;
3254                        case COMPUTED_SET_1:
3255                            pathIndex = 0;
3256                            break;
3257                        case COMPUTED_SET_2:
3258                            pathIndex = 1;
3259                            break;
3260                        default:
3261                            console.log("unknown REC_TYPE_COMPUTED frag type: " + fragType);
3262                            throw "stop execution";
3263                    }
3264                    if (!drawThis || collect_bounds) {
3265                        break;
3266                    }
3267                    drawCurveSpecials(test, frags, fragType);
3268                    break;
3269                case REC_TYPE_PATH:
3270                case REC_TYPE_PATH2:
3271                    if (!draw_path) {
3272                        continue;
3273                    }
3274                    var firstPath = tIndex < secondPath;
3275                    if ((draw_path & (firstPath ? 1 : 2)) == 0) {
3276                        continue;
3277                    }
3278                    ctx.lineWidth = 1;
3279                    ctx.strokeStyle = firstPath ? "black" : "red";
3280                    ctx.fillStyle = "blue";
3281                    var frags2 = [];
3282                    switch (fragType) {
3283                        case PATH_LINE:
3284                            for (var i = 0; i < 4; ++ i) { frags2[i] = frags[i + 1]; }
3285                            drawLine(frags2[0], frags2[1], frags2[2], frags2[3]);
3286                            break;
3287                        case PATH_QUAD:
3288                            for (var i = 0; i < 6; ++ i) { frags2[i] = frags[i + 1]; }
3289                            drawQuad(frags2[0], frags2[1], frags2[2], frags2[3],
3290                                    frags2[4], frags2[5]);
3291                            break;
3292                        case PATH_CONIC:
3293                            for (var i = 0; i < 7; ++ i) { frags2[i] = frags[i + 1]; }
3294                            drawConicWithQuads(frags2[0], frags2[1], frags2[2], frags2[3],
3295                                    frags2[4], frags2[5], frags2[6]);
3296                            break;
3297                        case PATH_CUBIC:
3298                            for (var i = 0; i < 8; ++ i) { frags2[i] = frags[i + 1]; }
3299                            drawCubic(frags2[0], frags2[1], frags2[2], frags2[3],
3300                                    frags2[4], frags2[5], frags2[6], frags2[7]);
3301                            break;
3302                        default:
3303                            console.log("unknown REC_TYPE_PATH2 frag type: " + fragType);
3304                            throw "stop execution";
3305                    }
3306                    if (collect_bounds) {
3307                        break;
3308                    }
3309                    drawCurveSpecials(test, frags2, fragType);
3310                    break;
3311                case REC_TYPE_OP:
3312                    switch (fragType) {
3313                        case OP_INTERSECT: opLetter = 'I'; break;
3314                        case OP_DIFFERENCE: opLetter = 'D'; break;
3315                        case OP_UNION: opLetter = 'U'; break;
3316                        case OP_XOR: opLetter = 'X'; break;
3317                        default:
3318                            console.log("unknown REC_TYPE_OP frag type: " + fragType);
3319                            throw "stop execution";
3320                    }
3321                    break;
3322                case REC_TYPE_ACTIVE:
3323                    if (!draw_active || (step_limit > 0 && tIndex < lastActive)) {
3324                        continue;
3325                    }
3326                    var x1 = frags[SPAN_X1];
3327                    var y1 = frags[SPAN_Y1];
3328                    var x2 = frags[SPAN_X2];
3329                    var y2 = frags[SPAN_Y2];
3330                    var x3, y3, x3, y4, t1, t2, w;
3331                    ctx.lineWidth = 3;
3332                    ctx.strokeStyle = "rgba(0,0,255, 0.3)";
3333                    focus_enabled = true;
3334                    switch (fragType) {
3335                        case ACTIVE_LINE_SPAN:
3336                            t1 = frags[SPAN_L_T];
3337                            t2 = frags[SPAN_L_TEND];
3338                            drawLinePartial(x1, y1, x2, y2, t1, t2);
3339                            if (draw_id) {
3340                                drawLinePartialID(frags[0], x1, y1, x2, y2, t1, t2);
3341                            }
3342                             break;
3343                        case ACTIVE_QUAD_SPAN:
3344                            x3 = frags[SPAN_X3];
3345                            y3 = frags[SPAN_Y3];
3346                            t1 = frags[SPAN_Q_T];
3347                            t2 = frags[SPAN_Q_TEND];
3348                            drawQuadPartial(x1, y1, x2, y2, x3, y3, t1, t2);
3349                            if (draw_id) {
3350                                drawQuadPartialID(frags[0], x1, y1, x2, y2, x3, y3, t1, t2);
3351                            }
3352                            break;
3353                        case ACTIVE_CONIC_SPAN:
3354                            x3 = frags[SPAN_X3];
3355                            y3 = frags[SPAN_Y3];
3356                            t1 = frags[SPAN_K_T];
3357                            t2 = frags[SPAN_K_TEND];
3358                            w = frags[SPAN_K_W];
3359                            drawConicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2);
3360                            if (draw_id) {
3361                                drawConicPartialID(frags[0], x1, y1, x2, y2, x3, y3, w, t1, t2);
3362                            }
3363                            break;
3364                        case ACTIVE_CUBIC_SPAN:
3365                            x3 = frags[SPAN_X3];
3366                            y3 = frags[SPAN_Y3];
3367                            x4 = frags[SPAN_X4];
3368                            y4 = frags[SPAN_Y4];
3369                            t1 = frags[SPAN_C_T];
3370                            t2 = frags[SPAN_C_TEND];
3371                            drawCubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2);
3372                            if (draw_id) {
3373                                drawCubicPartialID(frags[0], x1, y1, x2, y2, x3, y3, x4, y4, t1, t2);
3374                            }
3375                            break;
3376                        default:
3377                            console.log("unknown REC_TYPE_ACTIVE frag type: " + fragType);
3378                            throw "stop execution";
3379                    }
3380                    break;
3381                case REC_TYPE_ACTIVE_OP:
3382                    if (!draw_op || (step_limit > 0 && tIndex < lastOp)) {
3383                        continue;
3384                    }
3385                    focus_enabled = true;
3386                    ctx.lineWidth = 3;
3387                    var activeSpan = frags[7] == "1";
3388                    ctx.strokeStyle = activeSpan ? "rgba(45,160,0, 0.3)" : "rgba(255,45,0, 0.5)";
3389                    var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
3390                    drawCurve(curve);
3391                    if (draw_op > 1) {
3392                        drawArc(curve, false, frags[3], frags[4]);
3393                        drawArc(curve, true, frags[5], frags[6]);
3394                    }
3395                    break;
3396                case REC_TYPE_ADD:
3397                    if (!draw_add) {
3398                        continue;
3399                    }
3400                    ctx.lineWidth = 3;
3401                    ctx.strokeStyle = closeCount == 0 ? "rgba(0,0,255, 0.3)"
3402                            : closeCount == 1 ? "rgba(0,127,0, 0.3)"
3403                            : closeCount == 2 ? "rgba(0,127,127, 0.3)"
3404                            : closeCount == 3 ? "rgba(127,127,0, 0.3)"
3405                            : "rgba(127,0,127, 0.3)";
3406                    focus_enabled = true;
3407                    switch (fragType) {
3408                        case ADD_MOVETO:
3409                            break;
3410                        case ADD_LINETO:
3411                            if (step_limit == 0 || tIndex >= lastAdd) {
3412                                drawLine(frags[0], frags[1], frags[2], frags[3]);
3413                            }
3414                            break;
3415                        case ADD_QUADTO:
3416                            if (step_limit == 0 || tIndex >= lastAdd) {
3417                                drawQuad(frags[0], frags[1], frags[2], frags[3], frags[4], frags[5]);
3418                            }
3419                            break;
3420                        case ADD_CONICTO:
3421                            if (step_limit == 0 || tIndex >= lastAdd) {
3422                                drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
3423                                        frags[4], frags[5], frags[6]);
3424                            }
3425                            break;
3426                        case ADD_CUBICTO:
3427                            if (step_limit == 0 || tIndex >= lastAdd) {
3428                                drawCubic(frags[0], frags[1], frags[2], frags[3],
3429                                        frags[4], frags[5], frags[6], frags[7]);
3430                            }
3431                            break;
3432                        case ADD_CLOSE:
3433                            ++closeCount;
3434                            break;
3435                        case ADD_FILL:
3436                            break;
3437                        default:
3438                            console.log("unknown REC_TYPE_ADD frag type: " + fragType);
3439                            throw "stop execution";
3440                    }
3441                    break;
3442                case REC_TYPE_ANGLE:
3443                    angleBetween = frags[18] == "T";
3444                    afterIndex = 0;
3445                    if (draw_angle == 0 || draw_angle == 3 || (step_limit > 0 && tIndex < lastAngle)) {
3446                        continue;
3447                    }
3448                    focus_enabled = true;
3449                    ctx.lineWidth = 3;
3450                    ctx.strokeStyle = "rgba(127,45,127, 0.3)";
3451                    var leftCurve = curvePartialByID(test, frags[0], frags[4], frags[5]);
3452                    var midCurve = curvePartialByID(test, frags[6], frags[10], frags[11]);
3453                    var rightCurve = curvePartialByID(test, frags[12], frags[16], frags[17]);
3454                    drawCurve(leftCurve);
3455                    drawCurve(rightCurve);
3456                    ctx.strokeStyle = angleBetween ? "rgba(0,160,45, 0.3)" : "rgba(255,0,45, 0.5)";
3457                    drawCurve(midCurve);
3458                    if (draw_angle > 1) {
3459                        drawOrder(leftCurve, 'L');
3460                        drawOrder(rightCurve, 'R');
3461                    }
3462                    break;
3463                case REC_TYPE_AFTERPART:
3464                    if (draw_angle != 3 || (step_limit > 0 && tIndex < lastAngle)) {
3465                        continue;
3466                    }
3467                    ctx.strokeStyle = afterIndex == 0 ? "rgba(255,0,0, 1.0)"
3468                            : (afterIndex == 1) == angleBetween ? "rgba(0,128,0, 1.0)"
3469                            :  "rgba(0,0,255, 1.0)";
3470                    switch (fragType) {
3471                        case PATH_LINE:
3472                            drawLine(frags[0], frags[1], frags[2], frags[3]);
3473                            break;
3474                        case PATH_QUAD:
3475                            drawQuad(frags[0], frags[1], frags[2], frags[3],
3476                                     frags[4], frags[5]);
3477                            break;
3478                        case PATH_CONIC:
3479                            drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
3480                                     frags[4], frags[5], frags[6]);
3481                            break;
3482                        case PATH_CUBIC:
3483                            drawCubic(frags[0], frags[1], frags[2], frags[3],
3484                                     frags[4], frags[5], frags[6], frags[7]);
3485                            break;
3486                        default:
3487                            console.log("unknown REC_TYPE_AFTERPART frag type: " + fragType);
3488                            throw "stop execution";
3489                    }
3490                    ++afterIndex;
3491                    break;
3492                case REC_TYPE_COINCIDENCE:
3493                    if (!draw_coincidence || (step_limit > 0 && tIndex < lastCoin)) {
3494                        continue;
3495                    }
3496                    focus_enabled = true;
3497                    ctx.lineWidth = 3;
3498                    ctx.strokeStyle = "rgba(127,45,63, 0.3)";
3499                    var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
3500                    drawCurve(curve);
3501                    break;
3502                case REC_TYPE_SECT:
3503                    if (!draw_intersection) {
3504                        continue;
3505                    }
3506                    if (draw_intersection != 1 && (step_limit > 0 && tIndex < lastSect)) {
3507                        continue;
3508                    }
3509                    // draw_intersection == 1 : show all
3510                    // draw_intersection == 2 : step == 0 ? show all : show intersection line #step
3511                    // draw_intersection == 3 : step == 0 ? show all : show intersection #step
3512                    ctx.lineWidth = 1;
3513                    ctx.strokeStyle = "rgba(0,0,255, 0.3)";
3514                    ctx.fillStyle = "blue";
3515                    focus_enabled = true;
3516                    var f = [];
3517                    var c1s;
3518                    var c1l;
3519                    var c2s;
3520                    var c2l;
3521                    switch (fragType) {
3522                        case INTERSECT_LINE:
3523                            f.push(5, 6, 0, 7);
3524                            c1s = 1; c1l = 4; c2s = 8; c2l = 4;
3525                            break;
3526                        case INTERSECT_LINE_2:
3527                            f.push(5, 6, 0, 10);
3528                            f.push(8, 9, 7, 15);
3529                            c1s = 1; c1l = 4; c2s = 11; c2l = 4;
3530                            break;
3531                        case INTERSECT_LINE_NO:
3532                            c1s = 0; c1l = 4; c2s = 4; c2l = 4;
3533                            break;
3534                        case INTERSECT_QUAD_LINE:
3535                            f.push(7, 8, 0, 9);
3536                            c1s = 1; c1l = 6; c2s = 10; c2l = 4;
3537                            break;
3538                        case INTERSECT_QUAD_LINE_2:
3539                            f.push(7, 8, 0, 12);
3540                            f.push(10, 11, 9, 17);
3541                            c1s = 1; c1l = 6; c2s = 13; c2l = 4;
3542                            break;
3543                        case INTERSECT_QUAD_LINE_NO:
3544                            c1s = 0; c1l = 6; c2s = 6; c2l = 4;
3545                            break;
3546                        case INTERSECT_QUAD:
3547                            f.push(7, 8, 0, 9);
3548                            c1s = 1; c1l = 6; c2s = 10; c2l = 6;
3549                            break;
3550                        case INTERSECT_QUAD_2:
3551                            f.push(7, 8, 0, 12);
3552                            f.push(10, 11, 9, 19);
3553                            c1s = 1; c1l = 6; c2s = 13; c2l = 6;
3554                            break;
3555                        case INTERSECT_QUAD_NO:
3556                            c1s = 0; c1l = 6; c2s = 6; c2l = 6;
3557                            break;
3558                        case INTERSECT_CONIC_LINE:
3559                            f.push(8, 9, 0, 10);
3560                            c1s = 1; c1l = 7; c2s = 11; c2l = 4;
3561                            break;
3562                        case INTERSECT_CONIC_LINE_2:
3563                            f.push(8, 9, 0, 12);
3564                            f.push(11, 12, 10, 18);
3565                            c1s = 1; c1l = 7; c2s = 14; c2l = 4;
3566                            break;
3567                        case INTERSECT_CONIC_LINE_NO:
3568                            c1s = 0; c1l = 7; c2s = 7; c2l = 4;
3569                            break;
3570                        case INTERSECT_CONIC:
3571                            f.push(8, 9, 0, 10);
3572                            c1s = 1; c1l = 7; c2s = 11; c2l = 7;
3573                            break;
3574                        case INTERSECT_CONIC_2:
3575                            f.push(8, 9, 0, 13);
3576                            f.push(11, 12, 10, 21);
3577                            c1s = 1; c1l = 7; c2s = 14; c2l = 7;
3578                            break;
3579                        case INTERSECT_CONIC_NO:
3580                            c1s = 0; c1l = 7; c2s = 7; c2l = 7;
3581                            break;
3582                        case INTERSECT_SELF_CUBIC:
3583                            f.push(9, 10, 0, 11);
3584                            c1s = 1; c1l = 8; c2s = 0; c2l = 0;
3585                            break;
3586                        case INTERSECT_SELF_CUBIC_NO:
3587                            c1s = 0; c1l = 8; c2s = 0; c2l = 0;
3588                            break;
3589                        case INTERSECT_CUBIC_LINE:
3590                            f.push(9, 10, 0, 11);
3591                            c1s = 1; c1l = 8; c2s = 12; c2l = 4;
3592                            break;
3593                        case INTERSECT_CUBIC_LINE_2:
3594                            f.push(9, 10, 0, 14);
3595                            f.push(12, 13, 11, 19);
3596                            c1s = 1; c1l = 8; c2s = 15; c2l = 4;
3597                            break;
3598                        case INTERSECT_CUBIC_LINE_3:
3599                            f.push(9, 10, 0, 17);
3600                            f.push(12, 13, 11, 22);
3601                            f.push(15, 16, 14, 23);
3602                            c1s = 1; c1l = 8; c2s = 18; c2l = 4;
3603                            break;
3604                        case INTERSECT_CUBIC_QUAD_NO:
3605                            c1s = 0; c1l = 8; c2s = 8; c2l = 6;
3606                            break;
3607                        case INTERSECT_CUBIC_QUAD:
3608                            f.push(9, 10, 0, 11);
3609                            c1s = 1; c1l = 8; c2s = 12; c2l = 6;
3610                            break;
3611                        case INTERSECT_CUBIC_QUAD_2:
3612                            f.push(9, 10, 0, 14);
3613                            f.push(12, 13, 11, 21);
3614                            c1s = 1; c1l = 8; c2s = 15; c2l = 6;
3615                            break;
3616                        case INTERSECT_CUBIC_QUAD_3:
3617                            f.push(9, 10, 0, 17);
3618                            f.push(12, 13, 11, 24);
3619                            f.push(15, 16, 14, 25);
3620                            c1s = 1; c1l = 8; c2s = 18; c2l = 6;
3621                            break;
3622                        case INTERSECT_CUBIC_QUAD_4:
3623                            f.push(9, 10, 0, 20);
3624                            f.push(12, 13, 11, 27);
3625                            f.push(15, 16, 14, 28);
3626                            f.push(18, 19, 17, 29);
3627                            c1s = 1; c1l = 8; c2s = 21; c2l = 6;
3628                            break;
3629                        case INTERSECT_CUBIC_LINE_NO:
3630                            c1s = 0; c1l = 8; c2s = 8; c2l = 4;
3631                            break;
3632                        case INTERSECT_CUBIC:
3633                            f.push(9, 10, 0, 11);
3634                            c1s = 1; c1l = 8; c2s = 12; c2l = 8;
3635                            break;
3636                        case INTERSECT_CUBIC_2:
3637                            f.push(9, 10, 0, 14);
3638                            f.push(12, 13, 11, 23);
3639                            c1s = 1; c1l = 8; c2s = 15; c2l = 8;
3640                            break;
3641                        case INTERSECT_CUBIC_3:
3642                            f.push(9, 10, 0, 17);
3643                            f.push(12, 13, 11, 26);
3644                            f.push(15, 16, 14, 27);
3645                            c1s = 1; c1l = 8; c2s = 18; c2l = 8;
3646                            break;
3647                        case INTERSECT_CUBIC_4:
3648                            f.push(9, 10, 0, 20);
3649                            f.push(12, 13, 11, 29);
3650                            f.push(15, 16, 14, 30);
3651                            f.push(18, 19, 17, 31);
3652                            c1s = 1; c1l = 8; c2s = 21; c2l = 8;
3653                            break;
3654                        case INTERSECT_CUBIC_NO:
3655                            c1s = 0; c1l = 8; c2s = 8; c2l = 8;
3656                            break;
3657                        default:
3658                            console.log("unknown REC_TYPE_SECT frag type: " + fragType);
3659                            throw "stop execution";
3660                    }
3661                    if (draw_intersection != 1) {
3662                        var id = -1;
3663                        var curve;
3664                        switch (c1l) {
3665                            case 4:
3666                                drawLine(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3]);
3667                                if (draw_id) {
3668                                    curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3]];
3669                                    id = idByCurve(test, curve, PATH_LINE);
3670                                }
3671                                break;
3672                            case 6:
3673                                drawQuad(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3674                                        frags[c1s + 4], frags[c1s + 5]);
3675                                if (draw_id) {
3676                                    curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3677                                            frags[c1s + 4], frags[c1s + 5]];
3678                                    id = idByCurve(test, curve, PATH_QUAD);
3679                                }
3680                                break;
3681                            case 7:
3682                                drawConicWithQuads(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3683                                        frags[c1s + 4], frags[c1s + 5], frags[c1s + 6]);
3684                                if (draw_id) {
3685                                    curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3686                                            frags[c1s + 4], frags[c1s + 5], frags[c1s + 6]];
3687                                    id = idByCurve(test, curve, PATH_CONIC);
3688                                }
3689                                break;
3690                            case 8:
3691                                drawCubic(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3692                                        frags[c1s + 4], frags[c1s + 5], frags[c1s + 6], frags[c1s + 7]);
3693                                if (draw_id) {
3694                                    curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3695                                            frags[c1s + 4], frags[c1s + 5], frags[c1s + 6], frags[c1s + 7]];
3696                                    id = idByCurve(test, curve, PATH_CUBIC);
3697                                }
3698                                break;
3699                        }
3700                        if (id >= 0) {
3701                            drawID(curve, id);
3702                        }
3703                        id = -1;
3704                        switch (c2l) {
3705                            case 0:
3706                                break;
3707                            case 4:
3708                                drawLine(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3]);
3709                                if (draw_id) {
3710                                    curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3]];
3711                                    id = idByCurve(test, curve, PATH_LINE);
3712                                }
3713                                break;
3714                            case 6:
3715                                drawQuad(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3716                                        frags[c2s + 4], frags[c2s + 5]);
3717                                if (draw_id) {
3718                                    curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3719                                            frags[c2s + 4], frags[c2s + 5]];
3720                                    id = idByCurve(test, curve, PATH_QUAD);
3721                                }
3722                                break;
3723                            case 7:
3724                                drawConicWithQuads(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3725                                        frags[c2s + 4], frags[c2s + 5], frags[c2s + 6]);
3726                                if (draw_id) {
3727                                    curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3728                                            frags[c2s + 4], frags[c2s + 5], frags[c2s + 6]];
3729                                    id = idByCurve(test, curve, PATH_CONIC);
3730                                }
3731                                break;
3732                            case 8:
3733                                drawCubic(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3734                                        frags[c2s + 4], frags[c2s + 5], frags[c2s + 6], frags[c2s + 7]);
3735                                if (draw_id) {
3736                                    curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3737                                            frags[c2s + 4], frags[c2s + 5], frags[c2s + 6], frags[c2s + 7]];
3738                                    id = idByCurve(test, curve, PATH_CUBIC);
3739                                }
3740                                break;
3741                        }
3742                        if (id >= 0) {
3743                            drawID(curve, id);
3744                        }
3745                    }
3746                    if (collect_bounds) {
3747                        break;
3748                    }
3749                    if (draw_intersection != 3 || step_limit == 0 || tIndex >= lastSect) {
3750                        for (var idx = 0; idx < f.length; idx += 4) {
3751                            drawPoint(frags[f[idx]], frags[f[idx + 1]], true);
3752                        }
3753                    }
3754                    if (!draw_intersectT) {
3755                        break;
3756                    }
3757                    ctx.fillStyle = "red";
3758                    if (draw_intersection != 3 || step_limit == 0 || tIndex >= lastSect) {
3759                        for (var idx = 0; idx < f.length; idx += 4) {
3760                            drawTAtPointUp(frags[f[idx]], frags[f[idx + 1]], frags[f[idx + 2]]);
3761                            drawTAtPointDown(frags[f[idx]], frags[f[idx + 1]], frags[f[idx + 3]]);
3762                        }
3763                    }
3764                    break;
3765                case REC_TYPE_SORT:
3766                    if (!draw_sort || (step_limit > 0 && tIndex < lastSort)) {
3767                        continue;
3768                    }
3769                    ctx.lineWidth = 3;
3770                    ctx.strokeStyle = "rgba(127,127,0, 0.5)";
3771                    focus_enabled = true;
3772                    switch (fragType) {
3773                        case SORT_UNARY:
3774                        case SORT_BINARY:
3775                            var curve = curvePartialByID(test, frags[0], frags[6], frags[8]);
3776                            drawCurve(curve);
3777                            break;
3778                        default:
3779                            console.log("unknown REC_TYPE_SORT frag type: " + fragType);
3780                            throw "stop execution";
3781                    }
3782                    break;
3783                case REC_TYPE_TOP:
3784                    if (!draw_top || (step_limit > 0 && tIndex < lastTop)) {
3785                        continue;
3786                    }
3787                    ctx.lineWidth = 3;
3788                    ctx.strokeStyle = "rgba(127,127,0, 0.5)";
3789                    focus_enabled = true;
3790                    {
3791                        var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
3792                        drawCurve(curve);
3793                        var type = PATH_LINE + (curve.length / 2 - 2);
3794                        var mid = pointAtT(curve, type, 0.5);
3795                        var d = dxy_at_t(curve, type, 0.5);
3796                        drawArrow(mid.x, mid.y, d.x, d.y, 0.3);
3797                    }
3798                    break;
3799                case REC_TYPE_MARK:
3800                    if (!draw_mark || (step_limit > 0 && tIndex < lastMark)) {
3801                        continue;
3802                    }
3803                    ctx.lineWidth = 3;
3804                    ctx.strokeStyle = fragType >= MARK_DONE_LINE ?
3805                            "rgba(127,0,127, 0.5)" : "rgba(127,127,0, 0.5)";
3806                    focus_enabled = true;
3807                    switch (fragType) {
3808                        case MARK_LINE:
3809                        case MARK_DONE_LINE:
3810                        case MARK_UNSORTABLE_LINE:
3811                        case MARK_SIMPLE_LINE:
3812                        case MARK_SIMPLE_DONE_LINE:
3813                        case MARK_DONE_UNARY_LINE:
3814                            drawLinePartial(frags[1], frags[2], frags[3], frags[4],
3815                                frags[5], frags[9]);
3816                            if (draw_id) {
3817                                drawLinePartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
3818                                frags[5], frags[9]);
3819                            }
3820                            break;
3821                        case MARK_QUAD:
3822                        case MARK_DONE_QUAD:
3823                        case MARK_UNSORTABLE_QUAD:
3824                        case MARK_SIMPLE_QUAD:
3825                        case MARK_SIMPLE_DONE_QUAD:
3826                        case MARK_DONE_UNARY_QUAD:
3827                            drawQuadPartial(frags[1], frags[2], frags[3], frags[4],
3828                                frags[5], frags[6], frags[7], frags[11]);
3829                            if (draw_id) {
3830                                drawQuadPartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
3831                                frags[5], frags[6], frags[7], frags[11]);
3832                            }
3833                            break;
3834                        case MARK_CUBIC:
3835                        case MARK_DONE_CUBIC:
3836                        case MARK_UNSORTABLE_CUBIC:
3837                        case MARK_SIMPLE_CUBIC:
3838                        case MARK_SIMPLE_DONE_CUBIC:
3839                        case MARK_DONE_UNARY_CUBIC:
3840                            drawCubicPartial(frags[1], frags[2], frags[3], frags[4],
3841                                frags[5], frags[6], frags[7], frags[8], frags[9], frags[13]);
3842                            if (draw_id) {
3843                                drawCubicPartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
3844                                frags[5], frags[6], frags[7], frags[8], frags[9], frags[13]);
3845                            }
3846                            break;
3847                        case MARK_ANGLE_LAST:
3848                            // FIXME: ignored for now
3849                            break;
3850                        default:
3851                            console.log("unknown REC_TYPE_MARK frag type: " + fragType);
3852                            throw "stop execution";
3853                    }
3854                    break;
3855                default:
3856                    continue;
3857            }
3858        }
3859        switch (recType) {
3860            case REC_TYPE_SORT:
3861                if (!draw_sort || (step_limit > 0 && tIndex < lastSort)) {
3862                    break;
3863                }
3864                var angles = []; // use tangent lines to describe arcs
3865                var windFrom = [];
3866                var windTo = [];
3867                var opp = [];
3868                var minXY = Number.MAX_VALUE;
3869                var partial;
3870                focus_enabled = true;
3871                var someUnsortable = false;
3872                for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
3873                    var fragType = records[recordIndex];
3874                    var frags = records[recordIndex + 1];
3875                    var unsortable = (fragType == SORT_UNARY && frags[14]) ||
3876                            (fragType == SORT_BINARY && frags[16]);
3877                    someUnsortable |= unsortable;
3878                    switch (fragType) {
3879                        case SORT_UNARY:
3880                        case SORT_BINARY:
3881                            partial = curvePartialByID(test, frags[0], frags[6], frags[8]);
3882                            break;
3883                        default:
3884                            console.log("unknown REC_TYPE_SORT frag type: " + fragType);
3885                            throw "stop execution";
3886                    }
3887                    var dx = boundsWidth(partial);
3888                    var dy = boundsHeight(partial);
3889                    minXY = Math.min(minXY, dx * dx + dy * dy);
3890                    if (collect_bounds) {
3891                        continue;
3892                    }
3893                    angles.push(tangent(partial));
3894                    var from = frags[12];
3895                    var to = frags[12];
3896                    var sgn = frags[10];
3897                    if (sgn < 0) {
3898                        from -= frags[11];
3899                    } else if (sgn > 0) {
3900                        to -= frags[11];
3901                    }
3902                    windFrom.push(from + (unsortable ? "!" : ""));
3903                    windTo.push(to + (unsortable ? "!" : ""));
3904                    opp.push(fragType == SORT_BINARY);
3905                    if (draw_sort == 1) {
3906                        drawOrder(partial, frags[12]);
3907                    } else {
3908                        drawOrder(partial, (recordIndex / 2) + 1);
3909                    }
3910                }
3911                var radius = Math.sqrt(minXY) / 2 * scale;
3912                radius = Math.min(50, radius);
3913                var scaledRadius = radius / scale;
3914                var centerX = partial[0];
3915                var centerY = partial[1];
3916                if (collect_bounds) {
3917                    if (focus_enabled) {
3918                        focusXmin = Math.min(focusXmin, centerX - scaledRadius);
3919                        focusYmin = Math.min(focusYmin, centerY - scaledRadius);
3920                        focusXmax = Math.max(focusXmax, centerX + scaledRadius);
3921                        focusYmax = Math.max(focusYmax, centerY + scaledRadius);
3922                    }
3923                    break;
3924                }
3925                break;
3926            default:
3927                break;
3928        }
3929    }
3930    if (collect_bounds) {
3931        return;
3932    }
3933    if (draw_log && logStart >= 0) {
3934        ctx.font = "normal 10px Arial";
3935        ctx.textAlign = "left";
3936        ctx.beginPath();
3937        var top = screenHeight - 20 - (logRange + 2) * 10;
3938        ctx.rect(50, top, screenWidth - 100, (logRange + 2) * 10);
3939        ctx.fillStyle = "white";
3940        ctx.fill();
3941        ctx.fillStyle = "rgba(0,0,0, 0.5)";
3942        if (logStart > 0) {
3943            ctx.fillText(lines[logStart - 1], 50, top + 8);
3944        }
3945        ctx.fillStyle = "black";
3946        for (var idx = 0; idx < logRange; ++idx) {
3947            ctx.fillText(lines[logStart + idx], 50, top + 18 + 10 * idx);
3948        }
3949        ctx.fillStyle = "rgba(0,0,0, 0.5)";
3950        if (logStart + logRange < lines.length) {
3951            ctx.fillText(lines[logStart + logRange], 50, top + 18 + 10 * logRange);
3952        }
3953    }
3954    if (draw_legend) {
3955        var pos = 0;
3956        var drawSomething = draw_add | draw_active | draw_angle | draw_coincidence | draw_sort | draw_mark;
3957   //     drawBox(pos++, "yellow", "black", opLetter, true, '');
3958        drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_intersection > 1 ? sectCount : sectMax2, draw_intersection, intersectionKey);
3959        drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_add ? addCount : addMax, draw_add, addKey);
3960        drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_active ? activeCount : activeMax, draw_active, activeKey);
3961        drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_angle ? angleCount : angleMax, draw_angle, angleKey);
3962        drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_coincidence ? coinCount : coinMax, draw_coincidence, coincidenceKey);
3963        drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_op ? opCount : opMax, draw_op, opKey);
3964        drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_sort ? sortCount : sortMax, draw_sort, sortKey);
3965        drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_top ? topCount : topMax, draw_top, topKey);
3966        drawBox(pos++, "rgba(127,0,127, 0.3)", "black", draw_mark ? markCount : markMax, draw_mark, markKey);
3967        drawBox(pos++, "black", "white",
3968                (new Array('P', 'P1', 'P2', 'P'))[draw_path], draw_path != 0, pathKey);
3969        drawBox(pos++, "rgba(0,63,0, 0.7)", "white",
3970                (new Array('Q', 'Q', 'C', 'QC', 'Qc', 'Cq'))[draw_computed],
3971                draw_computed != 0, computedKey);
3972        drawBox(pos++, "green", "black", step_limit, drawSomething, '');
3973        drawBox(pos++, "green", "black", stepMax, drawSomething, '');
3974        drawBox(pos++, "rgba(255,0,0, 0.6)", "black", lastIndex, drawSomething & draw_log, '');
3975        drawBox(pos++, "rgba(255,0,0, 0.6)", "black", test.length - 1, drawSomething & draw_log, '');
3976        if (curve_t) {
3977            drawCurveTControl();
3978        }
3979        ctx.font = "normal 20px Arial";
3980        ctx.fillStyle = "rgba(0,0,0, 0.3)";
3981        ctx.textAlign = "right";
3982        ctx.fillText(scale.toFixed(decimal_places) + 'x' , screenWidth - 10, screenHeight - 5);
3983    }
3984    if (draw_hints) {
3985        ctx.font = "normal 10px Arial";
3986        ctx.fillStyle = "rgba(0,0,0, 0.5)";
3987        ctx.textAlign = "right";
3988        var y = 4;
3989        ctx.fillText("control lines : " +  controlLinesKey, ctx.screenWidthwidth - 10, pos * 50 + y++ * 10);
3990        ctx.fillText("curve t : " +  curveTKey, screenWidth - 10, pos * 50 + y++ * 10);
3991        ctx.fillText("deriviatives : " +  deriviativesKey, screenWidth - 10, pos * 50 + y++ * 10);
3992        ctx.fillText("intersect t : " +  intersectTKey, screenWidth - 10, pos * 50 + y++ * 10);
3993        ctx.fillText("log : " +  logKey, screenWidth - 10, pos * 50 + y++ * 10);
3994        ctx.fillText("log curve : " +  logCurvesKey, screenWidth - 10, pos * 50 + y++ * 10);
3995        ctx.fillText("mid point : " +  midpointKey, screenWidth - 10, pos * 50 + y++ * 10);
3996        ctx.fillText("points : " +  ptsKey, screenWidth - 10, pos * 50 + y++ * 10);
3997        ctx.fillText("sequence : " +  sequenceKey, screenWidth - 10, pos * 50 + y++ * 10);
3998        ctx.fillText("xy : " +  xyKey, screenWidth - 10, pos * 50 + y++ * 10);
3999    }
4000}
4001
4002function drawBox(y, backC, foreC, str, enable, label) {
4003    ctx.beginPath();
4004    ctx.fillStyle = backC;
4005    ctx.rect(screenWidth - 40, y * 50 + 10, 40, 30);
4006    ctx.fill();
4007    ctx.font = "normal 16px Arial";
4008    ctx.fillStyle = foreC;
4009    ctx.textAlign = "center";
4010    ctx.fillText(str, screenWidth - 20, y * 50 + 32);
4011    if (!enable) {
4012        ctx.fillStyle = "rgba(255,255,255, 0.5)";
4013        ctx.fill();
4014    }
4015    if (label != '') {
4016        ctx.font = "normal 9px Arial";
4017        ctx.fillStyle = "black";
4018        ctx.fillText(label, screenWidth - 47, y * 50 + 40);
4019    }
4020}
4021
4022function drawCurveTControl() {
4023    ctx.lineWidth = 2;
4024    ctx.strokeStyle = "rgba(0,0,0, 0.3)";
4025    ctx.beginPath();
4026    ctx.rect(screenWidth - 80, 40, 28, screenHeight - 80);
4027    ctx.stroke();
4028    var ty = 40 + curveT * (screenHeight - 80);
4029    ctx.beginPath();
4030    ctx.moveTo(screenWidth - 80, ty);
4031    ctx.lineTo(screenWidth - 85, ty - 5);
4032    ctx.lineTo(screenWidth - 85, ty + 5);
4033    ctx.lineTo(screenWidth - 80, ty);
4034    ctx.fillStyle = "rgba(0,0,0, 0.6)";
4035    ctx.fill();
4036    var num = curveT.toFixed(decimal_places);
4037    ctx.font = "normal 10px Arial";
4038    ctx.textAlign = "left";
4039    ctx.fillText(num, screenWidth - 78, ty);
4040}
4041
4042function ptInTControl() {
4043    var e = window.event;
4044	var tgt = e.target || e.srcElement;
4045    var left = tgt.offsetLeft;
4046    var top = tgt.offsetTop;
4047    var x = (e.clientX - left);
4048    var y = (e.clientY - top);
4049    if (x < screenWidth - 80 || x > screenWidth - 50) {
4050        return false;
4051    }
4052    if (y < 40 || y > screenHeight - 80) {
4053        return false;
4054    }
4055    curveT = (y - 40) / (screenHeight - 120);
4056    if (curveT < 0 || curveT > 1) {
4057        throw "stop execution";
4058    }
4059    return true;
4060}
4061
4062function drawTop() {
4063    if (tests[testIndex] == null) {
4064        var str = testDivs[testIndex].textContent;
4065        parse_all(str);
4066        var title = testDivs[testIndex].id.toString();
4067        testTitles[testIndex] = title;
4068    }
4069    init(tests[testIndex]);
4070    redraw();
4071}
4072
4073function redraw() {
4074    if (focus_on_selection) {
4075        collect_bounds = true;
4076        draw(tests[testIndex], testLines[testIndex], testTitles[testIndex]);
4077        collect_bounds = false;
4078        if (focusXmin < focusXmax && focusYmin < focusYmax) {
4079            setScale(focusXmin, focusXmax, focusYmin, focusYmax);
4080        }
4081    }
4082    ctx.beginPath();
4083    ctx.fillStyle = "white";
4084    ctx.rect(0, 0, screenWidth, screenHeight);
4085    ctx.fill();
4086    draw(tests[testIndex], testLines[testIndex], testTitles[testIndex]);
4087}
4088
4089function dumpCurvePartial(test, id, t0, t1) {
4090    var curve = curveByID(test, id);
4091    var name = ["line", "quad", "cubic"][curve.length / 2 - 2];
4092    console.log("id=" + id + " " + name + "=" +  curveToString(curve)
4093        + " t0=" + t0 + " t1=" + t1
4094        + " partial=" + curveToString(curvePartialByID(test, id, t0, t1)));
4095}
4096
4097function dumpAngleTest(test, id, t0, t1) {
4098    var curve = curveByID(test, id);
4099    console.log("    { {" + curveToString(curve) + "}, "
4100            + curve.length / 2 + ", " + t0 + ", " + t1 + ", {} }, //");
4101}
4102
4103function dumpLogToConsole() {
4104    if (logStart < 0) {
4105        return;
4106    }
4107    var test = tests[testIndex];
4108    var recType = REC_TYPE_UNKNOWN;
4109    var records;
4110    for (var index = 0; index < test.length; index += 3) {
4111        var lastLineNo = test[index + 1];
4112        if (lastLineNo >= logStart && lastLineNo < logStart + logRange) {
4113            recType = test[index];
4114            records = test[index + 2];
4115            break;
4116        }
4117    }
4118    if (recType == REC_TYPE_UNKNOWN) {
4119        return;
4120    }
4121    var lines = testLines[testIndex];
4122    for (var idx = 0; idx < logRange; ++idx) {
4123        var line = lines[logStart + idx];
4124        console.log(line);
4125        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
4126            var fragType = records[recordIndex];
4127            var frags = records[recordIndex + 1];
4128            if (recType == REC_TYPE_ANGLE && fragType == ANGLE_AFTER) {
4129                dumpCurvePartial(test, frags[0], frags[4], frags[5]);
4130                dumpCurvePartial(test, frags[6], frags[10], frags[11]);
4131                dumpCurvePartial(test, frags[12], frags[16], frags[17]);
4132                console.log("\nstatic IntersectData intersectDataSet[] = { //");
4133                dumpAngleTest(test, frags[0], frags[4], frags[5]);
4134                dumpAngleTest(test, frags[6], frags[10], frags[11]);
4135                dumpAngleTest(test, frags[12], frags[16], frags[17]);
4136                console.log("}; //");
4137            }
4138        }
4139    }
4140}
4141
4142var activeKey = 'a';
4143var pathKey = 'b';
4144var pathBackKey = 'B';
4145var centerKey = 'c';
4146var coincidenceKey = 'C';
4147var addKey = 'd';
4148var deriviativesKey = 'f';
4149var angleKey = 'g';
4150var angleBackKey = 'G';
4151var intersectionKey = 'i';
4152var intersectionBackKey = 'I';
4153var sequenceKey = 'j';
4154var midpointKey = 'k';
4155var logKey = 'l';
4156var logToConsoleKey = 'L';
4157var markKey = 'm';
4158var sortKey = 'o';
4159var opKey = 'p';
4160var opBackKey = 'P';
4161var computedKey = 'q';
4162var computedBackKey = 'Q';
4163var stepKey = 's';
4164var stepBackKey = 'S';
4165var intersectTKey = 't';
4166var topKey = 'T';
4167var curveTKey = 'u';
4168var controlLinesBackKey = 'V';
4169var controlLinesKey = 'v';
4170var ptsKey = 'x';
4171var xyKey = 'y';
4172var logCurvesKey = 'z';
4173var focusKey = '`';
4174var idKey = '.';
4175var retinaKey = '\\';
4176
4177function doKeyPress(evt) {
4178    var char = String.fromCharCode(evt.charCode);
4179    var focusWasOn = false;
4180    switch (char) {
4181    case '0':
4182    case '1':
4183    case '2':
4184    case '3':
4185    case '4':
4186    case '5':
4187    case '6':
4188    case '7':
4189    case '8':
4190    case '9':
4191        decimal_places = char - '0';
4192        redraw();
4193        break;
4194    case activeKey:
4195        draw_active ^= true;
4196        redraw();
4197        break;
4198    case addKey:
4199        draw_add ^= true;
4200        redraw();
4201        break;
4202    case angleKey:
4203        draw_angle = (draw_angle + 1) % 4;
4204        redraw();
4205        break;
4206    case angleBackKey:
4207        draw_angle = (draw_angle + 2) % 3;
4208        redraw();
4209        break;
4210    case centerKey:
4211        setScale(xmin, xmax, ymin, ymax);
4212        redraw();
4213        break;
4214    case coincidenceKey:
4215        draw_coincidence ^= true;
4216        redraw();
4217        break;
4218    case controlLinesBackKey:
4219        control_lines = (control_lines + 3) % 4;
4220        redraw();
4221        break;
4222    case controlLinesKey:
4223        control_lines = (control_lines + 1) % 4;
4224        redraw();
4225        break;
4226    case computedBackKey:
4227        draw_computed = (draw_computed + 5) % 6;
4228        redraw();
4229        break;
4230    case computedKey:
4231        draw_computed = (draw_computed + 1) % 6;
4232        redraw();
4233        break;
4234    case curveTKey:
4235        curve_t ^= true;
4236        if (curve_t) {
4237            draw_legend = true;
4238        }
4239        redraw();
4240        break;
4241    case deriviativesKey:
4242        draw_deriviatives = (draw_deriviatives + 1) % 3;
4243        redraw();
4244        break;
4245    case focusKey:
4246        focus_on_selection ^= true;
4247        setScale(xmin, xmax, ymin, ymax);
4248        redraw();
4249        break;
4250    case idKey:
4251        draw_id ^= true;
4252        redraw();
4253        break;
4254    case intersectionBackKey:
4255        draw_intersection = (draw_intersection + 3) % 4;
4256        redraw();
4257        break;
4258    case intersectionKey:
4259        draw_intersection = (draw_intersection + 1) % 4;
4260        redraw();
4261        break;
4262    case intersectTKey:
4263        draw_intersectT ^= true;
4264        redraw();
4265        break;
4266    case logCurvesKey:
4267        logCurves(tests[testIndex]);
4268        break;
4269    case logKey:
4270        draw_log ^= true;
4271        redraw();
4272        break;
4273    case logToConsoleKey:
4274        if (draw_log) {
4275            dumpLogToConsole();
4276        }
4277        break;
4278    case markKey:
4279        draw_mark ^= true;
4280        redraw();
4281        break;
4282    case midpointKey:
4283        draw_midpoint ^= true;
4284        redraw();
4285        break;
4286    case opKey:
4287        draw_op = (draw_op + 1) % 3;
4288        redraw();
4289        break;
4290    case opBackKey:
4291        draw_op = (draw_op + 2) % 3;
4292        redraw();
4293        break;
4294    case pathKey:
4295        draw_path = (draw_path + 1) % 4;
4296        redraw();
4297        break;
4298    case pathBackKey:
4299        draw_path = (draw_path + 3) % 4;
4300        redraw();
4301        break;
4302    case ptsKey:
4303        pt_labels = (pt_labels + 1) % 3;
4304        redraw();
4305        break;
4306    case retinaKey:
4307        retina_scale ^= true;
4308        drawTop();
4309        break;
4310    case sequenceKey:
4311        draw_sequence ^= true;
4312        redraw();
4313        break;
4314    case sortKey:
4315        draw_sort = (draw_sort + 1) % 3;
4316        drawTop();
4317        break;
4318    case stepKey:
4319        step_limit++;
4320        if (step_limit > stepMax) {
4321            step_limit = stepMax;
4322        }
4323        redraw();
4324        break;
4325    case stepBackKey:
4326        step_limit--;
4327        if (step_limit < 0) {
4328            step_limit = 0;
4329        }
4330        redraw();
4331        break;
4332    case topKey:
4333        draw_top ^= true;
4334        redraw();
4335        break;
4336    case xyKey:
4337        debug_xy = (debug_xy + 1) % 3;
4338        redraw();
4339        break;
4340    case '-':
4341        focusWasOn = focus_on_selection;
4342        if (focusWasOn) {
4343            focus_on_selection = false;
4344            scale /= 1.2;
4345        } else {
4346            scale /= 2;
4347            calcLeftTop();
4348        }
4349        redraw();
4350        focus_on_selection = focusWasOn;
4351        break;
4352    case '=':
4353    case '+':
4354        focusWasOn = focus_on_selection;
4355        if (focusWasOn) {
4356            focus_on_selection = false;
4357            scale *= 1.2;
4358        } else {
4359            scale *= 2;
4360            calcLeftTop();
4361        }
4362        redraw();
4363        focus_on_selection = focusWasOn;
4364        break;
4365    case '?':
4366        draw_hints ^= true;
4367        if (draw_hints && !draw_legend) {
4368            draw_legend = true;
4369        }
4370        redraw();
4371        break;
4372    case '/':
4373        draw_legend ^= true;
4374        redraw();
4375        break;
4376    }
4377}
4378
4379function doKeyDown(evt) {
4380    var char = evt.keyCode;
4381    var preventDefault = false;
4382    switch (char) {
4383    case 37: // left arrow
4384        if (evt.shiftKey) {
4385            testIndex -= 9;
4386        }
4387        if (--testIndex < 0)
4388            testIndex = tests.length - 1;
4389        drawTop();
4390        preventDefault = true;
4391        break;
4392    case 39: // right arrow
4393        if (evt.shiftKey) {
4394            testIndex += 9;
4395        }
4396        if (++testIndex >= tests.length)
4397            testIndex = 0;
4398        drawTop();
4399        preventDefault = true;
4400        break;
4401    }
4402    if (preventDefault) {
4403          evt.preventDefault();
4404          return false;
4405    }
4406    return true;
4407}
4408
4409(function() {
4410    var hidden = "hidden";
4411
4412    // Standards:
4413    if (hidden in document)
4414        document.addEventListener("visibilitychange", onchange);
4415    else if ((hidden = "mozHidden") in document)
4416        document.addEventListener("mozvisibilitychange", onchange);
4417    else if ((hidden = "webkitHidden") in document)
4418        document.addEventListener("webkitvisibilitychange", onchange);
4419    else if ((hidden = "msHidden") in document)
4420        document.addEventListener("msvisibilitychange", onchange);
4421    // IE 9 and lower:
4422    else if ('onfocusin' in document)
4423        document.onfocusin = document.onfocusout = onchange;
4424    // All others:
4425    else
4426        window.onpageshow = window.onpagehide
4427            = window.onfocus = window.onblur = onchange;
4428
4429    function onchange (evt) {
4430        var v = 'visible', h = 'hidden',
4431            evtMap = {
4432                focus:v, focusin:v, pageshow:v, blur:h, focusout:h, pagehide:h
4433            };
4434
4435        evt = evt || window.event;
4436        if (evt.type in evtMap)
4437            document.body.className = evtMap[evt.type];
4438        else
4439            document.body.className = this[hidden] ? "hidden" : "visible";
4440    }
4441})();
4442
4443function calcXY() {
4444    var e = window.event;
4445	var tgt = e.target || e.srcElement;
4446    var left = tgt.offsetLeft;
4447    var top = tgt.offsetTop;
4448    mouseX = (e.clientX - left) / scale + srcLeft;
4449    mouseY = (e.clientY - top) / scale + srcTop;
4450}
4451
4452function calcLeftTop() {
4453    srcLeft = mouseX - screenWidth / 2 / scale;
4454    srcTop = mouseY - screenHeight / 2 / scale;
4455}
4456
4457var disableClick = false;
4458
4459function handleMouseClick() {
4460    if (disableClick) {
4461        return;
4462    }
4463    if (!curve_t || !ptInTControl()) {
4464        calcXY();
4465        calcLeftTop();
4466    }
4467    redraw();
4468//    if (!curve_t || !ptInTControl()) {
4469//        mouseX = screenWidth / 2 / scale + srcLeft;
4470//        mouseY = screenHeight / 2 / scale + srcTop;
4471//    }
4472}
4473
4474function handleMouseOver() {
4475    calcXY();
4476    if (debug_xy != 2) {
4477        return;
4478    }
4479    var num = mouseX.toFixed(decimal_places) + ", " + mouseY.toFixed(decimal_places);
4480    ctx.beginPath();
4481    ctx.rect(300,100,num.length * 6,10);
4482    ctx.fillStyle="white";
4483    ctx.fill();
4484    ctx.font = "normal 10px Arial";
4485    ctx.fillStyle="black";
4486    ctx.textAlign = "left";
4487    ctx.fillText(num, 300, 108);
4488}
4489
4490function start() {
4491    for (var i = 0; i < testDivs.length; ++i) {
4492        tests[i] = null;
4493    }
4494    testIndex = 0;
4495    drawTop();
4496    window.addEventListener('keypress', doKeyPress, true);
4497    window.addEventListener('keydown', doKeyDown, true);
4498    window.onresize = function() {
4499        drawTop();
4500    }
4501    /*
4502    window.onpagehide = function() {
4503        disableClick = true;
4504    }
4505    */
4506    window.onpageshow = function () {
4507        disableClick = false;
4508    }
4509}
4510
4511</script>
4512</head>
4513
4514<body onLoad="start();">
4515<canvas id="canvas" width="750" height="500"
4516    onmousemove="handleMouseOver()"
4517    onclick="handleMouseClick()"
4518    ></canvas >
4519</body>
4520</html>
4521