Check-in [f658d4913c]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:merge with trunk
Timelines: family | ancestors | descendants | both | wtf-8-experiment
Files: files | file ages | folders
SHA1: f658d4913ca0e8bdfc0b56742b61f39f8625dbfa
User & Date: chw 2019-09-13 11:58:06.676
Context
2019-09-15
11:15
merge with trunk check-in: a8d3f02653 user: chw tags: wtf-8-experiment
2019-09-13
11:58
merge with trunk check-in: f658d4913c user: chw tags: wtf-8-experiment
11:50
update curl library to version 7.66.0 check-in: 9f2d627eb9 user: chw tags: trunk
2019-09-12
10:09
merge with trunk check-in: 1426863e72 user: chw tags: wtf-8-experiment
Changes
Unified Diff Ignore Whitespace Patch
Changes to jni/curl/CHANGES.
1
2
3
4
5
6
7










































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































8
9
10
11
12
13
14
                                  _   _ ____  _
                              ___| | | |  _ \| |
                             / __| | | | |_) | |
                            | (__| |_| |  _ <| |___
                             \___|\___/|_| \_\_____|

                                  Changelog











































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Version 7.65.3 (19 Jul 2019)

Daniel Stenberg (19 Jul 2019)
- RELEASE-NOTES: 7.65.3

- THANKS: 7.65.3 status







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
                                  _   _ ____  _
                              ___| | | |  _ \| |
                             / __| | | | |_) | |
                            | (__| |_| |  _ <| |___
                             \___|\___/|_| \_\_____|

                                  Changelog

Version 7.66.0 (10 Sep 2019)

Daniel Stenberg (10 Sep 2019)
- RELEASE-NOTES: curl 7.66.0

- THANKS: from the 7.66.0 release

- curl: make sure the parallel transfers do them all
  
  The logic could erroneously break the loop too early before all
  transfers had been transferred.
  
  Reported-by: Tom van der Woerdt
  Fixes #4316
  Closes #4317

- urlapi: one colon is enough for the strspn() input (typo)

- urlapi: verify the IPv6 numerical address
  
  It needs to parse correctly. Otherwise it could be tricked into letting
  through a-f using host names that libcurl would then resolve. Like
  '[ab.be]'.
  
  Reported-by: Thomas Vegas
  Closes #4315

- [Clément Notin brought this change]

  openssl: use SSL_CTX_set_<min|max>_proto_version() when available
  
  OpenSSL 1.1.0 adds SSL_CTX_set_<min|max>_proto_version() that we now use
  when available.  Existing code is preserved for older versions of
  OpenSSL.
  
  Closes #4304

- [Clément Notin brought this change]

  openssl: indent, re-organize and add comments

- [migueljcrum brought this change]

  sspi: fix memory leaks
  
  Closes #4299

- travis: disable ngtcp2 builds (again)

- Curl_fillreadbuffer: avoid double-free trailer buf on error
  
  Reviewed-by: Jay Satiro
  Reported-by: Thomas Vegas
  
  Closes #4307

- tool_setopt: handle a libcurl build without netrc support
  
  Reported-by: codesniffer13 on github
  Fixes #4302
  Closes #4305

- security:read_data fix bad realloc()
  
  ... that could end up a double-free
  
  CVE-2019-5481
  Bug: https://curl.haxx.se/docs/CVE-2019-5481.html

- [Thomas Vegas brought this change]

  tftp: Alloc maximum blksize, and use default unless OACK is received
  
  Fixes potential buffer overflow from 'recvfrom()', should the server
  return an OACK without blksize.
  
  Bug: https://curl.haxx.se/docs/CVE-2019-5482.html
  CVE-2019-5482

- [Thomas Vegas brought this change]

  tftp: return error when packet is too small for options

- KNOWN_BUGS/TODO: cleanup and remove outdated issues

- RELEASE-NOTES: synced

- netrc: free 'home' on error
  
  Follow-up to f9c7ba9096ec2
  
  Coverity CID 1453474
  
  Closes #4291

- urldata: avoid 'generic', use dedicated pointers
  
  For the 'proto' union within the connectdata struct.
  
  Closes #4290

- cleanup: move functions out of url.c and make them static
  
  Closes #4289

- smtp: check for and bail out on too short EHLO response
  
  Otherwise, a three byte response would make the smtp_state_ehlo_resp()
  function misbehave.
  
  Credit to OSS-Fuzz
  Bug: https://crbug.com/oss-fuzz/16918
  
  Assisted-by: Max Dymond
  
  Closes #4287

- smb: init *msg to NULL in smb_send_and_recv()
  
  ... it might otherwise return OK from this function leaving that pointer
  uninitialized.
  
  Bug: https://crbug.com/oss-fuzz/16907
  
  Closes #4286

- ROADMAP: updated after recent user poll
  
  In rough prio order

- THANKS: remove duplicate

- Curl_addr2string: take an addrlen argument too
  
  This allows the function to figure out if a unix domain socket has a
  file name or not associated with it! When a socket is created with
  socketpair(), as done in the fuzzer testing, the path struct member is
  uninitialized and must not be accessed.
  
  Bug: https://crbug.com/oss-fuzz/16699
  
  Closes #4283

- [Rolf Eike Beer brought this change]

  CMake: remove needless newlines at end of gss variables

- [Rolf Eike Beer brought this change]

  CI: remove duplicate configure flag for LGTM.com

- [Rolf Eike Beer brought this change]

  CMake: use platform dependent name for dlopen() library
  
  Closes #4279

- quiche: expire when poll returned data
  
  ... to make sure we continue draining the queue until empty
  
  Closes #4281

- quiche: decrease available buffer size, don't assign it!
  
  Found-by: Jeremy Lainé

- RELEASE-NOTES: synced

- [Kyohei Kadota brought this change]

  curl: fix include conditions

- [Kyohei Kadota brought this change]

  plan9: fix installation instructions
  
  Closes #4276

- ngtcp2: on h3 stream close, call expire
  
  ... to trigger a new read to detect the stream close!
  
  Closes #4275

- [Tatsuhiro Tsujikawa brought this change]

  ngtcp2: build latest ngtcp2 and ngtcp2_crypto_openssl
  
  Closes #4278

- ngtcp2: set flow control window to stream buffer size
  
  Closes #4274

- [Christopher Head brought this change]

  CURLOPT_HEADERFUNCTION.3: clarify
  
  Closes #4273

- CURLINFO docs: mention that in redirects times are added
  
  Suggested-by: Brandon Dong
  Fixes #4250
  Closes #4269

- travis: enable ngtcp2 builds again
  
  Switched to the openssl-quic-draft-22 openssl branch.
  
  Closes #4271

- HTTP3: switched openssl branch to use

- [Tatsuhiro Tsujikawa brought this change]

  ngtcp2: Build with latest ngtcp2 and ngtcp2_crypto_openssl
  
  Closes #4270

- http2: when marked for closure and wanted to close == OK
  
  It could otherwise return an error even when closed correctly if GOAWAY
  had been received previously.
  
  Reported-by: Tom van der Woerdt
  Fixes #4267
  Closes #4268

- RELEASE-NOTES: synced

- build-openssl: fix build with Visual Studio 2019
  
  Reviewed-by: Marcel Raad
  Contributed-by: osabc on github
  Fixes #4188
  Closes #4266

Kamil Dudka (26 Aug 2019)
- vauth: return CURLE_AUTH_ERROR on gss_init_sec_context() failure
  
  This is a follow-up to https://github.com/curl/curl/pull/3864 .
  
  Closes #4224

Daniel Stenberg (26 Aug 2019)
- KNOWN_BUGS: USE_UNIX_SOCKETS on Windows
  
  Closes #4040

- quiche: send the HTTP body correctly on callback uploads
  
  Closes #4265

- travis: disable ngtcp2 builds (temporarily)
  
  Just too many API changes right now
  
  Closes #4264

- ngtcp2: add support for SSLKEYLOGFILE
  
  Closes #4260

- ngtcp2: improve h3 response receiving
  
  Closes #4259

- ngtcp2: use nghttp3_version()

- ngtcp2: sync with upstream API changes
  
  Assisted-by: Tatsuhiro Tsujikawa

- [Kyle Abramowitz brought this change]

  scp: fix directory name length used in memcpy
  
  Fix read off end of array due to bad pointer math in getworkingpath for
  SCP home directory case.
  
  Closes #4258

- http: the 'closed' struct field is used by both ngh2 and ngh3
  
  and remove 'header_recvbuf', not used for anything
  
  Reported-by: Jeremy Lainé
  
  Closes #4257

- ngtcp2: accept upload via callback
  
  Closes #4256

- defines: avoid underscore-prefixed defines
  
  Double-underscored or underscore plus uppercase letter at least.
  
  ... as they're claimed to be reserved.
  
  Reported-by: patnyb on github
  
  Fixes #4254
  Closes #4255

- travis: add a build using ngtcp2 + nghttp3 (and a patched OpenSSL)
  
  Runs no tests
  
  Closes #4253

- travis: bump to using nghttp2 version 1.39.2
  
  Closes #4252

- [Gisle Vanem brought this change]

  docs/examples/curlx: fix errors
  
  Initialise 'mimetype' and require the -p12 arg.
  
  Closes #4248

- cleanup: remove DOT_CHAR completely
  
  Follow-up to f9c7ba9096ec
  
  The use of DOT_CHAR for ".ssh" was probably a mistake and is removed
  now.
  
  Pointed-out-by: Gisle Vanem
  Bug: https://github.com/curl/curl/pull/4230#issuecomment-522960638
  
  Closes #4247

- spnego_sspi: add typecast to fix build warning
  
  Reported in build "Win32 target on Debian Stretch (64-bit) -
  i686-w64-mingw32 - gcc-20170516"
  
  Closes #4245

- openssl: build warning free with boringssl
  
  Closes #4244

- curl: make --libcurl use CURL_HTTP_VERSION_3
  
  Closes #4243

- ngtcp2: make postfields-set posts work
  
  Closes #4242

- http: remove chunked-encoding and expect header use for HTTP/3

- [Alessandro Ghedini brought this change]

  configure: use pkg-config to detect quiche
  
  This removes the need to hard-code the quiche target path in
  configure.ac.
  
  This depends on https://github.com/cloudflare/quiche/pull/128
  
  Closes #4237

- CURLOPT_SSL_VERIFYHOST: treat the value 1 as 2
  
  For a long time (since 7.28.1) we've returned error when setting the
  value to 1 to make applications notice that we stopped supported the old
  behavior for 1. Starting now, we treat 1 and 2 exactly the same.
  
  Closes #4241

- curl: use .curlrc (with a dot) on Windows as well
  
  Fall-back to _curlrc if the dot-version is missing.
  
  Co-Authored-By: Steve Holme
  
  Closes #4230

- netrc: make the code try ".netrc" on Windows as well
  
  ... but fall back and try "_netrc" too if the dot version didn't work.
  
  Co-Authored-By: Steve Holme

- ngtcp2: use ngtcp2_version() to get the run-time version
  
  ... which of course doesn't have to be the same used at build-time.
  
  Function just recently merged in ngtcp2.

- ngtcp2: move the h3 initing to immediately after the rx key
  
  To fix a segfault and to better deal with 0-RTT
  
  Assisted-by: Tatsuhiro Tsujikawa

- [Alessandro Ghedini brought this change]

  quiche: register debug callback once and earlier
  
  The quiche debug callback is global and can only be initialized once, so
  make sure we don't do it multiple times (e.g. if multiple requests are
  executed).
  
  In addition this initializes the callback before the connection is
  created, so we get logs for the handshake as well.
  
  Closes #4236

- ssh: add a generic Curl_ssh_version function for SSH backends
  
  Closes #4235

- base64: check for SSH, not specific SSH backends

- vssh: move ssh init/cleanup functions into backend code

- vssh: create directory for SSH backend code

- TODO/ROADMAP: remove "refuse downgrade redirects" and HTTP/3
  
  HTTP3 is now already in full progress
  
  Downgrade redirects can be achived almost exactly like that by setting
  CURLOPT_REDIR_PROTOCOLS.

- RELEASE-NOTES: synced

- travis: add a quiche build
  
  Closes #4207

- http: fix use of credentials from URL when using HTTP proxy
  
  When a username and password are provided in the URL, they were wrongly
  removed from the stored URL so that subsequent uses of the same URL
  wouldn't find the crendentials. This made doing HTTP auth with multiple
  connections (like Digest) mishave.
  
  Regression from 46e164069d1a5230 (7.62.0)
  
  Test case 335 added to verify.
  
  Reported-by: Mike Crowe
  
  Fixes #4228
  Closes #4229

- [Mike Crowe brought this change]

  tests: Replace outdated test case numbering documentation
  
  Tests are no longer grouped by numeric range[1]. Let's stop saying that
  and provide some alternative advice for numbering tests.
  
  [1] https://curl.haxx.se/mail/lib-2019-08/0043.html
  
  Closes #4227

- travis: reduce number of torture tests in 'coverage'
  
  ... to make it complete in time. This cut seems not almost not affect
  the coverage percentage and yet completes within 35 minutes on travis
  where the previous runs recently always timed out after 50.
  
  Closes #4223

- [Igor Makarov brought this change]

  configure: use -lquiche to link to quiche
  
  Closes #4226

- ngtcp2: provide the callbacks as a static struct
  
  ... instead of having them in quicsocket

- [Tatsuhiro Tsujikawa brought this change]

  ngtcp2: add missing nghttp3_conn_add_write_offset call
  
  Closes #4225

- [Tatsuhiro Tsujikawa brought this change]

  ngtcp2: deal with stream close

- [Tatsuhiro Tsujikawa brought this change]

  ngtcp2: Consume QUIC STREAM data properly

- [Tatsuhiro Tsujikawa brought this change]

  ngtcp2: don't reinitialize SSL on Retry

- multi: getsock improvements for QUIC connecting

- connect: connections are persistent by default for HTTP/3

- quiche: happy eyeballs
  
  Closes #4220

- ngtcp2: do QUIC connections happy-eyeballs friendly

- curl_version: bump string buffer size to 250
  
  With HTTP/3 libs and plenty TLS libs, I manged to hit the limit (which
  causes a truncated output).

- CURLOPT_ALTSVC.3: use a "" file name to not load from a file

Jay Satiro (14 Aug 2019)
- vauth: Use CURLE_AUTH_ERROR for auth function errors
  
  - Add new error code CURLE_AUTH_ERROR.
  
  Prior to this change auth function errors were signaled by
  CURLE_OUT_OF_MEMORY and CURLE_RECV_ERROR, and neither one was
  technically correct.
  
  Ref: https://github.com/curl/curl/pull/3848
  
  Co-authored-by: Dominik Hölzl
  
  Closes https://github.com/curl/curl/pull/3864

Daniel Stenberg (13 Aug 2019)
- curl_version_info: make the quic_version a const
  
  Follow-up from 1a2df1518ad8653f
  
  Closes #4222

- examples: add http3.c, altsvc.c and http3-present.c
  
  Closes #4221

Peter Wu (13 Aug 2019)
- nss: use TLSv1.3 as default if supported
  
  SSL_VersionRangeGetDefault returns (TLSv1.0, TLSv1.2) as supported
  range in NSS 3.45. It looks like the intention is to raise the minimum
  version rather than lowering the maximum, so adjust accordingly. Note
  that the caller (nss_setup_connect) initializes the version range to
  (TLSv1.0, TLSv1.3), so there is no need to check for >= TLSv1.0 again.
  
  Closes #4187
  Reviewed-by: Daniel Stenberg
  Reviewed-by: Kamil Dudka

Daniel Stenberg (13 Aug 2019)
- quic.h: remove unused proto

- curl_version_info.3: mentioned ALTSVC and HTTP3
  
  ... and sorted the list alphabetically

- lib/quic.c: unused - removed

- CURLOPT_ALTSVC_CTRL.3: remove CURLALTSVC_ALTUSED
  
  Follow-up to 98c3f148 that removed it from the header file

- [Junho Choi brought this change]

  docs/HTTP3: simplify quiche build instruction
  
  Use --recursive to get boringssl in one line
  
  Closes #4219

- altsvc: make it use h3-22 with ngtcp2 as well

- ngtcp2: initial h3 request work
  
  Closes #4217

- curl_version_info: offer quic (and h3) library info
  
  Closes #4216

- HTTP3: use ngtcp2's draft-22 branch

- RELEASE-NOTES: synced

- CURLOPT_READFUNCTION.3: provide inline example
  
  ... instead of mentioning one in another place

- [Tatsuhiro Tsujikawa brought this change]

  ngtcp2: send HTTP/3 request with nghttp3
  
  This commit makes sending HTTP/3 request with nghttp3 work.  It
  minimally receives HTTP response and calls nghttp3 callbacks, but no
  processing is made at the moment.
  
  Closes #4215

- nghttp3: initial h3 template code added

- nghttp3: required when ngtcp2 is used for QUIC
  
  - checked for by configure
  - updated docs/HTTP3.md
  - shown in the version string
  
  Closes #4210

- [Eric Wong brought this change]

  asyn-thread: issue CURL_POLL_REMOVE before closing socket
  
  This avoids EBADF errors from EPOLL_CTL_DEL operations in the
  ephiperfifo.c example.  EBADF is dangerous in multi-threaded
  applications where I rely on epoll_ctl to operate on the same
  epoll description from different threads.
  
  Follow-up to eb9a604f8d7db8
  
  Bug: https://curl.haxx.se/mail/lib-2019-08/0026.html
  Closes #4211

- [Carlo Marcelo Arenas Belón brought this change]

  configure: avoid undefined check_for_ca_bundle
  
  instead of using a "greater than 0" test, check for variable being
  set, as it is always set to 1, and could be left unset if non of
  OPENSSL MBEDTLS GNUTLS WOLFSSL is being configured for.
  
  Closes #4213

- [Tatsuhiro Tsujikawa brought this change]

  ngtcp2: Send ALPN h3-22
  
  Closes #4212

- [Tatsuhiro Tsujikawa brought this change]

  ngtcp2: use ngtcp2_settings_default and specify initial_ts

- curl_global_init_mem.3: mention it was added in 7.12.0

- [Tatsuhiro Tsujikawa brought this change]

  ngtcp2: make the QUIC handshake work
  
  Closes #4209

- [Alex Mayorga brought this change]

  HTTP3.md: Update quiche build instructions
  
  Added cloning for quiche and BoringSSL and modified the build
  instructions so they work on a clean folder.
  
  Closes #4208

- CURLOPT_H3: removed
  
  There's no use for this anymore and it was never in a release.
  
  Closes #4206

- http3: make connection reuse work
  
  Closes #4204

- quiche: add SSLKEYLOGFILE support

- cleanup: s/curl_debug/curl_dbg_debug in comments and docs
  
  Leftovers from the function rename back in 76b63489495
  
  Reported-by: Gisle Vanem
  Bug: https://github.com/curl/curl/commit/f3e0f071b14fcb46a453f69bdf4e062bcaacf362#com
  mitcomment-34601751
  
  Closes #4203

- RELEASE-NOTES: synced

- alt-svc: add protocol version selection masking
  
  So that users can mask in/out specific HTTP versions when Alt-Svc is
  used.
  
   - Removed "h2c" and updated test case accordingly
   - Changed how the altsvc struct is laid out
   - Added ifdefs to make the unittest run even in a quiche-tree
  
  Closes #4201

- http3: fix the HTTP/3 in the request, make alt-svc set right versions
  
  Closes #4200

- alt-svc: send Alt-Used: in redirected requests
  
  RFC 7838 section 5:
  
     When using an alternative service, clients SHOULD include an Alt-Used
     header field in all requests.
  
  Removed CURLALTSVC_ALTUSED again (feature is still EXPERIMENTAL thus
  this is deemed ok).
  
  You can disable sending this header just like you disable any other HTTP
  header in libcurl.
  
  Closes #4199

- CURLOPT_HTTP_VERSION: seting this to 3 forces HTTP/3 use directly
  
  Even though it cannot fall-back to a lower HTTP version automatically. The
  safer way to upgrade remains via CURLOPT_ALTSVC.
  
  CURLOPT_H3 no longer has any bits that do anything and might be removed
  before we remove the experimental label.
  
  Updated the curl tool accordingly to use "--http3".
  
  Closes #4197

- docs/ALTSVC: remove what works and the experimental explanation
  
  Also, put the TODO items at the bottom.
  
  Closes #4198

- docs/EXPERIMENTAL: explain what it means and what's experimental now

- curl: make use of CURLINFO_RETRY_AFTER when retrying
  
  If a Retry-After: header was used in the response, that value overrides
  other retry timing options.
  
  Fixes #3794
  Closes #4195

- curl: use CURLINFO_PROTOCOL to check for HTTP(s)
  
  ... instead of CURLINFO_EFFECTIVE_URL to avoid string operations.

- CURLINFO_RETRY_AFTER: parse the Retry-After header value
  
  This is only the libcurl part that provides the information. There's no
  user of the parsed value. This change includes three new tests for the
  parser.
  
  Ref: #3794

- docs/ALTSVC.md: first basic file format description

- curl: have -w's 'http_version' show '3' for HTTP/3
  
  Closes #4196

- curl.h: add CURL_HTTP_VERSION_3 to the version enum
  
  It can't be set for CURLOPT_HTTP_VERSION, but it can be extracted with
  CURLINFO_HTTP_VERSION.

- quiche: make use of the connection timeout API properly

- quiche: make POSTFIELDS posts work

- quiche: improved error handling and memory cleanups

- quiche: flush egress in h3_stream_recv() too

- RELEASE-NOTES: synced

Jay Satiro (6 Aug 2019)
- [Patrick Monnerat brought this change]

  os400: take care of CURLOPT_SASL_AUTHZID in curl_easy_setopt_ccsid().
  
  Ref: https://github.com/curl/curl/issues/3653
  Ref: https://github.com/curl/curl/pull/3790
  
  NOTE: This commit was cherry-picked and is part of a series of commits
  that added the authzid feature for upcoming 7.66.0. The series was
  temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
  patch release.
  
  Closes https://github.com/curl/curl/pull/4186

- tests: Fix the line endings for the SASL alt-auth tests
  
  - Change data and protocol sections to CRLF line endings.
  
  Prior to this change the tests would fail or hang, which is because
  certain sections such as protocol require CRLF line endings.
  
  Follow-up to grandparent commit which added the tests.
  
  Ref: https://github.com/curl/curl/issues/3653
  Ref: https://github.com/curl/curl/pull/3790
  
  NOTE: This commit was cherry-picked and is part of a series of commits
  that added the authzid feature for upcoming 7.66.0. The series was
  temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
  patch release.
  
  Closes https://github.com/curl/curl/pull/4186

- [Steve Holme brought this change]

  examples: Added SASL PLAIN authorisation identity (authzid) examples
  
  Ref: https://github.com/curl/curl/issues/3653
  Ref: https://github.com/curl/curl/pull/3790
  
  NOTE: This commit was cherry-picked and is part of a series of commits
  that added the authzid feature for upcoming 7.66.0. The series was
  temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
  patch release.
  
  Closes https://github.com/curl/curl/pull/4186

- [Steve Holme brought this change]

  curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool
  
  Ref: https://github.com/curl/curl/issues/3653
  Ref: https://github.com/curl/curl/pull/3790
  
  NOTE: This commit was cherry-picked and is part of a series of commits
  that added the authzid feature for upcoming 7.66.0. The series was
  temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
  patch release.
  
  Closes https://github.com/curl/curl/pull/4186

- [Steve Holme brought this change]

  sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID
  
  Added the ability for the calling program to specify the authorisation
  identity (authzid), the identity to act as, in addition to the
  authentication identity (authcid) and password when using SASL PLAIN
  authentication.
  
  Fixes #3653
  Closes #3790
  
  NOTE: This commit was cherry-picked and is part of a series of commits
  that added the authzid feature for upcoming 7.66.0. The series was
  temporarily reverted in db8ec1f so that it would not ship in a 7.65.x
  patch release.
  
  Closes https://github.com/curl/curl/pull/4186

Daniel Stenberg (6 Aug 2019)
- docs/HTTP3: refreshed as it is now in master and HTTP/3 can be tested

- [Yiming Jing brought this change]

  mesalink: implement client authentication
  
  Closes #4184

- curl_multi_poll: a sister to curl_multi_wait() that waits more
  
  Repeatedly we see problems where using curl_multi_wait() is difficult or
  just awkward because if it has no file descriptor to wait for
  internally, it returns immediately and leaves it to the caller to wait
  for a small amount of time in order to avoid occasional busy-looping.
  
  This is often missed or misunderstood, leading to underperforming
  applications.
  
  This change introduces curl_multi_poll() as a replacement drop-in
  function that accepts the exact same set of arguments. This function
  works identically to curl_multi_wait() - EXCEPT - for the case when
  there's nothing to wait for internally, as then this function will by
  itself wait for a "suitable" short time before it returns. This
  effectiely avoids all risks of busy-looping and should also make it less
  likely that apps "over-wait".
  
  This also changes the curl tool to use this funtion internally when
  doing parallel transfers and changes curl_easy_perform() to use it
  internally.
  
  Closes #4163

- quiche:h3_stream_recv return 0 at end of stream
  
  ... and remove some verbose messages we don't need. Made transfers from
  facebook.com work better.

- altsvc: make quiche use h3-22 now

- quiche: show the actual version number

- quiche: first working HTTP/3 request
  
   - enable debug log
   - fix use of quiche API
   - use download buffer
   - separate header/body
  
  Closes #4193

- http09: disable HTTP/0.9 by default in both tool and library
  
  As the plan has been laid out in DEPRECATED. Update docs accordingly and
  verify in test 1174. Now requires the option to be set to allow HTTP/0.9
  responses.
  
  Closes #4191

- quiche: initial h3 request send/receive

- lib/Makefile.am: make checksrc run in vquic too

- altsvc: fix removal of expired cache entry
  
  Closes #4192

- RELEASE-NOTES: synced

Steve Holme (4 Aug 2019)
- md4: Use our own MD4 implementation when no crypto libraries are available
  
  Closes #3780

- md4: No need to include Curl_md4.h for each TLS library

- md4: No need for the NTLM code to call Curl_md4it() for each TLS library
  
  As the NTLM code no longer calls any of TLS libraries' specific MD4
  functions, there is no need to call this function for each #ifdef.

- md4: Move the mbed TLS MD4 implementation out of the NTLM code

- md4: Move the WinCrypt implementation out of the NTLM code

- md4: Move the SecureTransport implementation out of the NTLM code

- md4: Use the Curl_md4it() function for OpenSSL based NTLM

- md4: Move the GNU TLS gcrypt MD4 implementation out of the NTLM code

- md4: Move the GNU TLS Nettle MD4 implementation out of the NTLM code

Jay Satiro (4 Aug 2019)
- OS400: Add CURLOPT_H3 symbols
  
  Follow-up to 3af0e76 which added experimental H3 support.
  
  Closes https://github.com/curl/curl/pull/4185

Daniel Stenberg (3 Aug 2019)
- url: make use of new HTTP version if alt-svc has one

- url: set conn->transport to default TCP at init time

- altsvc: with quiche, use the quiche h3 alpn string
  
  Closes #4183

- alt-svc: more liberal ALPN name parsing
  
  Allow pretty much anything to be part of the ALPN identifier. In
  particular minus, which is used for "h3-20" (in-progress HTTP/3
  versions) etc.
  
  Updated test 356.
  Closes #4182

- quiche: use the proper HTTP/3 ALPN

- quiche: add failf() calls for two error cases
  
  To aid debugging
  
  Closes #4181

- mailmap: added Kyohei Kadota

Kamil Dudka (1 Aug 2019)
- http_negotiate: improve handling of gss_init_sec_context() failures
  
  If HTTPAUTH_GSSNEGOTIATE was used for a POST request and
  gss_init_sec_context() failed, the POST request was sent
  with empty body.  This commit also restores the original
  behavior of `curl --fail --negotiate`, which was changed
  by commit 6c6035532383e300c712e4c1cd9fdd749ed5cf59.
  
  Add regression tests 2077 and 2078 to cover this.
  
  Fixes #3992
  Closes #4171

Daniel Stenberg (1 Aug 2019)
- mailmap: added 4 more names
  
  Evgeny Grin, Peter Pih, Anton Malov and Marquis de Muesli

- mailmap: add Giorgos Oikonomou

- src/makefile: fix uncompressed hugehelp.c generation
  
  Regression from 5cf5d57ab9 (7.64.1)
  
  Fixed-by: Lance Ware
  Fixes #4176
  Closes #4177

- appveyor: pass on -k to make

- timediff: make it 64 bit (if possible) even with 32 bit time_t
  
  ... to make it hold microseconds too.
  
  Fixes #4165
  Closes #4168

- ROADMAP: parallel transfers are merged now

- getenv: support up to 4K environment variable contents on windows
  
  Reported-by: Michal Čaplygin
  Fixes #4174
  Closes #4175

- [Kyohei Kadota brought this change]

  plan9: add support for running on Plan 9
  
  Closes #3701

- [Kyohei Kadota brought this change]

  ntlm: explicit type casting

- [Justin brought this change]

  curl.h: fix outdated comment
  
  Closes #4167

- curl: remove outdated comment
  
  Turned bad with commit b8894085000
  
  Reported-by: niallor on github
  Fixes #4172
  Closes #4173

- cleanup: remove the 'numsocks' argument used in many places
  
  It was used (intended) to pass in the size of the 'socks' array that is
  also passed to these functions, but was rarely actually checked/used and
  the array is defined to a fixed size of MAX_SOCKSPEREASYHANDLE entries
  that should be used instead.
  
  Closes #4169

- readwrite_data: repair setting the TIMER_STARTTRANSFER stamp
  
  Regression, broken in commit 65eb65fde64bd5f (curl 7.64.1)
  
  Reported-by: Jonathan Cardoso Machado
  Assisted-by: Jay Satiro
  
  Fixes #4136
  Closes #4162

- mailmap: Amit Katyal

- asyn-thread: removed unused variable
  
  Follow-up to eb9a604f. Mistake caused by me when I edited the commit
  before push...

- RELEASE-NOTES: synced

- [Amit Katyal brought this change]

  asyn-thread: create a socketpair to wait on
  
  Closes #4157

- curl: cap the maximum allowed values for retry time arguments
  
  ... to avoid integer overflows later when multiplying with 1000 to
  convert seconds to milliseconds.
  
  Added test 1269 to verify.
  
  Reported-by: Jason Lee
  Closes #4166

- progress: reset download/uploaded counter
  
  ... to make CURLOPT_MAX_RECV_SPEED_LARGE and
  CURLOPT_MAX_SEND_SPEED_LARGE work correctly on subsequent transfers that
  reuse the same handle.
  
  Fixed-by: Ironbars13 on github
  Fixes #4084
  Closes #4161

- http2_recv: trigger another read when the last data is returned
  
  ... so that end-of-stream is detected properly.
  
  Reported-by: Tom van der Woerdt
  Fixes #4043
  Closes #4160

- curl: avoid uncessary libcurl timeouts (in parallel mode)
  
  When curl_multi_wait() returns OK without file descriptors to wait for,
  it might already have done a long timeout.
  
  Closes #4159

- [Balazs Kovacsics brought this change]

  HTTP: use chunked Transfer-Encoding for HTTP_POST if size unknown
  
  If using the read callback for HTTP_POST, and POSTFIELDSIZE is not set,
  automatically add a Transfer-Encoding: chunked header, same as it is
  already done for HTTP_PUT, HTTP_POST_FORM and HTTP_POST_MIME.  Update
  test 1514 according to the new behaviour.
  
  Closes #4138

Jay Satiro (29 Jul 2019)
- [Daniel Stenberg brought this change]

  winbuild: add vquic to list of build directories
  
  This fixes the winbuild build method which broke several days ago
  when experimental quic support was added in 3af0e76.
  
  Reported-by: Michael Lee
  
  Fixes https://github.com/curl/curl/issues/4158

- easy: resize receive buffer on easy handle reset
  
  - In curl_easy_reset attempt to resize the receive buffer to its default
    size. If realloc fails then continue using the previous size.
  
  Prior to this change curl_easy_reset did not properly handle resetting
  the receive buffer (data->state.buffer). It reset the variable holding
  its size (data->set.buffer_size) to the default size (READBUFFER_SIZE)
  but then did not actually resize the buffer. If a user resized the
  buffer by using CURLOPT_BUFFERSIZE to set the size smaller than the
  default, later called curl_easy_reset and attempted to reuse the handle
  then a heap overflow would very likely occur during that handle's next
  transfer.
  
  Reported-by: Felix Hädicke
  
  Fixes https://github.com/curl/curl/issues/4143
  Closes https://github.com/curl/curl/pull/4145

- [Brad Spencer brought this change]

  examples: Avoid reserved names in hiperfifo examples
  
  - Trade in __attribute__((unused)) for the classic (void)x to silence
    unused symbols.
  
  Because the classic way is not gcc specific. Also because the prior
  method mapped to symbol _Unused, which starts with _ and a capital
  letter which is reserved.
  
  Assisted-by: The Infinnovation team
  
  Bug: https://github.com/curl/curl/issues/4120#issuecomment-512542108
  
  Closes https://github.com/curl/curl/pull/4153

Daniel Stenberg (25 Jul 2019)
- RELEASE-NOTES: synced

- [Felix Hädicke brought this change]

  ssh-libssh: do not specify O_APPEND when not in append mode
  
  Specifying O_APPEND in conjunction with O_TRUNC and O_CREAT does not
  make much sense. And this combination of flags is not accepted by all
  SFTP servers (at least not Apache SSHD).
  
  Fixes #4147
  Closes #4148

- [Gergely Nagy brought this change]

  multi: call detach_connection before Curl_disconnect
  
  Curl_disconnect bails out if conn->easyq is not empty, detach_connection
  needs to be called first to remove the current easy from the queue.
  
  Fixes #4144
  Closes #4151

Jay Satiro (23 Jul 2019)
- tool_operate: fix implicit call to easysrc_cleanup
  
  easysrc_cleanup is only defined when CURL_DISABLE_LIBCURL_OPTION is not
  defined, and prior to this change would be called regardless.
  
  Bug: https://github.com/curl/curl/pull/3804#issuecomment-513922637
  Reported-by: Marcel Raad
  
  Closes https://github.com/curl/curl/pull/4142

Daniel Stenberg (22 Jul 2019)
- curl:create_transfers check return code from curl_easy_setopt
  
  From commit b8894085
  
  Pointed out by Coverity CID 1451703
  
  Closes #4134

- HTTP3: initial (experimental) support
  
  USe configure --with-ngtcp2 or --with-quiche
  
  Using either option will enable a HTTP3 build.
  Co-authored-by: Alessandro Ghedini <alessandro@ghedini.me>
  
  Closes #3500

- curl: remove dead code
  
  The loop never loops (since b889408500), pointed out by Coverity (CID
  1451702)
  
  Closes #4133

- docs/PARALLEL-TRANSFERS: correct the version number

- docs/PARALLEL-TRANSFERS: added

- curl: support parallel transfers
  
  This is done by making sure each individual transfer is first added to a
  linked list as then they can be performed serially, or at will, in
  parallel.
  
  Closes #3804

- docs/MANUAL.md: converted to markdown from plain text
  
  ... will make it render as a nicer web page.
  
  Closes #4131

- curl_version_info: provide nghttp2 details
  
  Introducing CURLVERSION_SIXTH with nghttp2 info.
  
  Closes #4121

- bump: start working on 7.66.0

- source: remove names from source comments
  
  Several reasons:
  
  - we can't add everyone who's helping out so its unfair to just a few
  selected ones.
  - we already list all helpers in THANKS and in RELEASE-NOTES for each
  release
  - we don't want to give the impression that some parts of the code is
  "owned" or "controlled" by specific persons
  
  Assisted-by: Daniel Gustafsson
  Closes #4129

Version 7.65.3 (19 Jul 2019)

Daniel Stenberg (19 Jul 2019)
- RELEASE-NOTES: 7.65.3

- THANKS: 7.65.3 status
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

- [Stefano Simonelli brought this change]

  CURLOPT_SEEKDATA.3: fix variable name
  
  Closes https://github.com/curl/curl/pull/4118

- [georgeok brought this change]

  CIPHERS.md: Explain Schannel error SEC_E_ALGORITHM_MISMATCH
  
  If the SSL backend is Schannel and the user specifies an Schannel CALG_
  that is not supported by the protocol or the server then curl returns
  CURLE_SSL_CONNECT_ERROR (35) SEC_E_ALGORITHM_MISMATCH.
  







|







1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359

- [Stefano Simonelli brought this change]

  CURLOPT_SEEKDATA.3: fix variable name
  
  Closes https://github.com/curl/curl/pull/4118

- [Giorgos Oikonomou brought this change]

  CIPHERS.md: Explain Schannel error SEC_E_ALGORITHM_MISMATCH
  
  If the SSL backend is Schannel and the user specifies an Schannel CALG_
  that is not supported by the protocol or the server then curl returns
  CURLE_SSL_CONNECT_ERROR (35) SEC_E_ALGORITHM_MISMATCH.
  
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
  
  - Add an additional check for LDAP that also checks for OpenSSL since
    on AIX those libraries may be required to link LDAP properly.
  
  Fixes https://github.com/curl/curl/issues/3595
  Closes https://github.com/curl/curl/pull/3596

- [georgeok brought this change]

  schannel: support CALG_ECDH_EPHEM algorithm
  
  Add support for Ephemeral elliptic curve Diffie-Hellman key exchange
  algorithm option when selecting ciphers. This became available on the
  Win10 SDK.
  







|







4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
  
  - Add an additional check for LDAP that also checks for OpenSSL since
    on AIX those libraries may be required to link LDAP properly.
  
  Fixes https://github.com/curl/curl/issues/3595
  Closes https://github.com/curl/curl/pull/3596

- [Giorgos Oikonomou brought this change]

  schannel: support CALG_ECDH_EPHEM algorithm
  
  Add support for Ephemeral elliptic curve Diffie-Hellman key exchange
  algorithm option when selecting ciphers. This became available on the
  Win10 SDK.
  
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
- NTLM: fix size check condition for type2 received data
  
  Bug: https://curl.haxx.se/docs/CVE-2018-16890.html
  Reported-by: Wenxiang Qian
  CVE-2018-16890

Marcel Raad (1 Feb 2019)
- [georgeok brought this change]

  spnego_sspi: add support for channel binding
  
  Attempt to add support for Secure Channel binding when negotiate
  authentication is used. The problem to solve is that by default IIS
  accepts channel binding and curl doesn't utilise them. The result was a
  401 response. Scope affects only the Schannel(winssl)-SSPI combination.







|







5937
5938
5939
5940
5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
- NTLM: fix size check condition for type2 received data
  
  Bug: https://curl.haxx.se/docs/CVE-2018-16890.html
  Reported-by: Wenxiang Qian
  CVE-2018-16890

Marcel Raad (1 Feb 2019)
- [Giorgos Oikonomou brought this change]

  spnego_sspi: add support for channel binding
  
  Attempt to add support for Secure Channel binding when negotiate
  authentication is used. The problem to solve is that by default IIS
  accepts channel binding and curl doesn't utilise them. The result was a
  401 response. Scope affects only the Schannel(winssl)-SSPI combination.
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
  NDK17. Actually they only exist in two NDK versions (15 and 16). With
  overloadable, the first condition tried will succeed. Results in wrong
  detection result.
  
  Closes #3484

Marcel Raad (19 Jan 2019)
- [georgeok brought this change]

  ntlm_sspi: add support for channel binding
  
  Windows extended potection (aka ssl channel binding) is required
  to login to ntlm IIS endpoint, otherwise the server returns 401
  responses.
  







|







6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
  NDK17. Actually they only exist in two NDK versions (15 and 16). With
  overloadable, the first condition tried will succeed. Results in wrong
  detection result.
  
  Closes #3484

Marcel Raad (19 Jan 2019)
- [Giorgos Oikonomou brought this change]

  ntlm_sspi: add support for channel binding
  
  Windows extended potection (aka ssl channel binding) is required
  to login to ntlm IIS endpoint, otherwise the server returns 401
  responses.
  
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846
6847
6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872
6873
6874
6875
6876
6877
6878
6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095
7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506
7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611
7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626
7627
7628
7629
7630
7631
7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703
7704
7705
7706
7707
7708
7709
7710
7711
7712
7713
7714
7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
  
  Curl_ftp_parselist: avoid unsigned integer overflows
  
  The overflow has no real world impact, just avoid it for "best
  practice".
  
  Closes #3225

- curl: --local-port range was not "including"
  
  The end port number in a given range was not included in the range used,
  as it is documented to be.
  
  Reported-by: infinnovation-dev on github
  Fixes #3251
  Closes #3255

- [Jérémy Rocher brought this change]

  openssl: support BoringSSL TLS renegotiation
  
  As per BoringSSL porting documentation [1], BoringSSL rejects peer
  renegotiations by default.
  
  curl fails when trying to authenticate to server through client
  certificate if it is requested by server after the initial TLS
  handshake.
  
  Enable renegotiation by default with BoringSSL to get same behavior as
  with OpenSSL. This is done by calling SSL_set_renegotiate_mode [2]
  which was introduced in commit 1d5ef3bb1eb9 [3].
  
  1 - https://boringssl.googlesource.com/boringssl/+/HEAD/PORTING.md#tls-renegotiation
  2 - https://boringssl.googlesource.com/boringssl/+/master/include/openssl/ssl.h#3482
  3 - https://boringssl.googlesource.com/boringssl/+/1d5ef3bb1eb97848617db5e7d633d735a401df86
  
  Signed-off-by: Jérémy Rocher <rocher.jeremy@gmail.com>
  Fixes #3258
  Closes #3259

- HISTORY: add some milestones
  
  Added a few of the more notable milestones in curl history that were
  missing. Primarily more recent ones but I also noted some older that
  could be worth mentioning.
  
  [ci skip]
  Closes #3257

Daniel Gustafsson (9 Nov 2018)
- KNOWN_BUGS: add --proxy-any connection issue
  
  Add the identified issue with --proxy-any and proxy servers which
  advertise authentication schemes other than the supported one.
  
  Closes #876
  Closes #3250
  Reported-by: NTMan on Github
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

Daniel Stenberg (9 Nov 2018)
- [Jim Fuller brought this change]

  setopt: add CURLOPT_CURLU
  
  Allows an application to pass in a pre-parsed URL via a URL handle.
  
  Closes #3227

- [Gisle Vanem brought this change]

  docs: ESCape "\n" codes
  
  Groff / Troff will display a:
   printaf("Errno: %ld\n", error);
  as:
    printf("Errno: %ld0, error);
  
  when a "\n" is not escaped. Use "\\n" instead.
  
  Closes #3246

- curl: --local-port fix followup
  
  Regression by 52db54869e6.
  
  Reported-by: infinnovation-dev on github
  Fixes #3248
  Closes #3249

GitHub (7 Nov 2018)
- [Gisle Vanem brought this change]

  More "\n" ESCaping

Daniel Stenberg (7 Nov 2018)
- RELEASE-NOTES: synced

- curl: fix --local-port integer overflow
  
  The tool's local port command line range parser didn't check for integer
  overflows and could pass "weird" data to libcurl for this option.
  libcurl however, has a strict range check for the values so it rejects
  anything outside of the accepted range.
  
  Reported-by: Brian Carpenter
  Closes #3242

- curl: correct the switch() logic in ourWriteOut
  
  Follow-up to e431daf013, as I did the wrong correction for a compiler
  warning. It should be a break and not a fall-through.
  
  Pointed-out-by: Frank Gevaerts

- [Frank Gevaerts brought this change]

  curl: add %{stderr} and %{stdout} for --write-out
  
  Closes #3115

Daniel Gustafsson (7 Nov 2018)
- winssl: be consistent in Schannel capitalization
  
  The productname from Microsoft is "Schannel", but in infof/failf
  reporting we use "schannel". This removes different versions.
  
  Closes #3243
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

Daniel Stenberg (7 Nov 2018)
- TODO: Have the URL API offer IDN decoding
  
  Similar to how URL decoding/encoding is done, we could have URL
  functions to convert IDN host names to punycode.
  
  Suggested-by: Alexey Melnichuk
  Closes #3232

- urlapi: only skip encoding the first '=' with APPENDQUERY set
  
  APPENDQUERY + URLENCODE would skip all equals signs but now it only skip
  encoding the first to better allow "name=content" for any content.
  
  Reported-by: Alexey Melnichuk
  Fixes #3231
  Closes #3231

- url: a short host name + port is not a scheme
  
  The function identifying a leading "scheme" part of the URL considered a
  few letters ending with a colon to be a scheme, making something like
  "short:80" to become an unknown scheme instead of a short host name and
  a port number.
  
  Extended test 1560 to verify.
  
  Also fixed test203 to use file_pwd to make it get the correct path on
  windows. Removed test 2070 since it was a duplicate of 203.
  
  Assisted-by: Marcel Raad
  Reported-by: Hagai Auro
  Fixes #3220
  Fixes #3233
  Closes #3223
  Closes #3235

- [Sangamkar brought this change]

  libcurl: stop reading from paused transfers
  
  In the transfer loop it would previously not acknwledge the pause bit
  and continue until drained or loop ended.
  
  Closes #3240

Jay Satiro (6 Nov 2018)
- tool: add undocumented option --dump-module-paths for win32
  
  - Add an undocumented diagnostic option for Windows to show the full
    paths of all loaded modules regardless of whether or not libcurl
    initialization succeeds.
  
  This is needed so that in the CI we can get a list of all DLL
  dependencies after initialization (when they're most likely to have
  finished loading) and then package them as artifacts so that a
  functioning build can be downloaded. Also I imagine it may have some use
  as a diagnostic for help requests.
  
  Ref: https://github.com/curl/curl/pull/3103
  
  Closes https://github.com/curl/curl/pull/3208

- curl_multibyte: fix a malloc overcalculation
  
  Prior to this change twice as many bytes as necessary were malloc'd when
  converting wchar to UTF8. To allay confusion in the future I also
  changed the variable name for the amount of bytes from len to bytes.
  
  Closes https://github.com/curl/curl/pull/3209

Michael Kaufmann (5 Nov 2018)
- netrc: don't ignore the login name specified with "--user"
  
  - for "--netrc", don't ignore the login/password specified with "--user",
    only ignore the login/password in the URL.
    This restores the netrc behaviour of curl 7.61.1 and earlier.
  - fix the documentation of CURL_NETRC_REQUIRED
  - improve the detection of login/password changes when reading .netrc
  - don't read .netrc if both login and password are already set
  
  Fixes #3213
  Closes #3224

Patrick Monnerat (5 Nov 2018)
- OS400: add URL API ccsid wrappers and sync ILE/RPG bindings

Daniel Stenberg (5 Nov 2018)
- [Yasuhiro Matsumoto brought this change]

  curl: fixed UTF-8 in current console code page (Windows)
  
  Fixes #3211
  Fixes #3175
  Closes #3212

- TODO: 2.6 multi upkeep
  
  Closes #3199

Daniel Gustafsson (5 Nov 2018)
- unittest: make 1652 stable across collations
  
  The previous coding used a format string whose output depended on the
  current locale of the environment running the test. Since the gist of
  the test is to have a format string, with the actual formatting being
  less important, switch to a more stable formatstring with decimals.
  
  Reported-by: Marcel Raad
  Closes #3234
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>

Daniel Stenberg (5 Nov 2018)
- Revert "url: a short host name + port is not a scheme"
  
  This reverts commit 226cfa8264cd979eff3fd52c0f3585ef095e7cf2.
  
  This commit caused test failures on appveyor/windows. Work on fixing them is
  in #3235.

- symbols-in-versions: add missing CURLU_ symbols
  
  ...and fix symbol-scan.pl to also scan urlapi.h
  
  Reported-by: Alexey Melnichuk
  Fixes #3226
  Closes #3230

Daniel Gustafsson (3 Nov 2018)
- infof: clearly indicate truncation
  
  The internal buffer in infof() is limited to 2048 bytes of payload plus
  an additional byte for NULL termination. Servers with very long error
  messages can however cause truncation of the string, which currently
  isn't very clear, and leads to badly formatted output.
  
  This appends a "...\n" (or just "..." in case the format didn't with a
  newline char) marker to the end of the string to clearly show
  that it has been truncated.
  
  Also include a unittest covering infof() to try and catch any bugs
  introduced in this quite important function.
  
  Closes #3216
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>

Michael Kaufmann (3 Nov 2018)
- tool_getparam: fix some comments

Daniel Stenberg (3 Nov 2018)
- url: a short host name + port is not a scheme
  
  The function identifying a leading "scheme" part of the URL considered a few
  letters ending with a colon to be a scheme, making something like "short:80"
  to become an unknown scheme instead of a short host name and a port number.
  
  Extended test 1560 to verify.
  
  Reported-by: Hagai Auro
  Fixes #3220
  Closes #3223

- URL: fix IPv6 numeral address parser
  
  Regression from 46e164069d1a52. Extended test 1560 to verify.
  
  Reported-by: tpaukrt on github
  Fixes #3218
  Closes #3219

- travis: remove curl before a normal build
  
  on Linux. To make sure the test suite runs with its newly build tool and
  doesn't require an external one present.
  
  Bug: #3198
  Closes #3200

- [Tim Rühsen brought this change]

  mprintf: avoid unsigned integer overflow warning
  
  The overflow has no real world impact.
  Just avoid it for "best practice".
  
  Code change suggested by "The Infinnovation Team" and Daniel Stenberg.
  Closes #3184

- Curl_follow: accept non-supported schemes for "fake" redirects
  
  When not actually following the redirect and the target URL is only
  stored for later retrieval, curl always accepted "non-supported"
  schemes. This was a regression from 46e164069d1a5230.
  
  Reported-by: Brad King
  Fixes #3210
  Closes #3215

Daniel Gustafsson (2 Nov 2018)
- openvms: fix example name
  
  Commit efc696a2e09225bfeab4 renamed persistant.c to persistent.c to
  fix the typo in the name, but missed to update the OpenVMS package
  files which still looked for the old name.
  
  Closes #3217
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
  Reviewed-by: Viktor Szakats <commit@vszakats.net>

Daniel Stenberg (1 Nov 2018)
- configure: show CFLAGS, LDFLAGS etc in summary
  
  To make it easier to understand other people's and remote builds etc.
  
  Closes #3207

- version: bump for next cycle

- axtls: removed
  
  As has been outlined in the DEPRECATE.md document, the axTLS code has
  been disabled for 6 months and is hereby removed.
  
  Use a better supported TLS library!
  
  Assisted-by: Daniel Gustafsson
  Closes #3194

- [marcosdiazr brought this change]

  schannel: make CURLOPT_CERTINFO support using Issuer chain
  
  Closes #3197

- travis: build with sanitize=address,undefined,signed-integer-overflow
  
  ... using clang
  
  Closes #3190

- schannel: use Curl_ prefix for global private symbols
  
  Curl_verify_certificate() must use the Curl_ prefix since it is globally
  available in the lib and otherwise steps outside of our namespace!
  
  Closes #3201

Kamil Dudka (1 Nov 2018)
- tests: drop http_pipe.py script no longer used
  
  It is unused since commit f7208df7d9d5cd5e15e2d89237e828f32b63f135.
  
  Closes #3204

Daniel Stenberg (31 Oct 2018)
- runtests: use the local curl for verifying
  
  ... revert the mistaken change brought in commit 8440616f53.
  
  Reported-by: Alessandro Ghedini
  Bug: https://curl.haxx.se/mail/lib-2018-10/0118.html
  
  Closes #3198

Version 7.62.0 (30 Oct 2018)

Daniel Stenberg (30 Oct 2018)
- RELEASE-NOTES: 7.62.0

- THANKS: 7.62.0 status

Daniel Gustafsson (30 Oct 2018)
- vtls: add MesaLink to curl_sslbackend enum
  
  MesaLink support was added in commit 57348eb97d1b8fc3742e02c but the
  backend was never added to the curl_sslbackend enum in curl/curl.h.
  This adds the new backend to the enum and updates the relevant docs.
  
  Closes #3195
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

Daniel Stenberg (30 Oct 2018)
- [Ruslan Baratov brought this change]

  cmake: Remove unused CURL_CONFIG_HAS_BEEN_RUN_BEFORE variable
  
  Closes #3191

- test2080: verify the fix for CVE-2018-16842

- voutf: fix bad arethmetic when outputting warnings to stderr
  
  CVE-2018-16842
  Reported-by: Brian Carpenter
  Bug: https://curl.haxx.se/docs/CVE-2018-16842.html

- [Tuomo Rinne brought this change]

  cmake: uniform ZLIB to use USE_ variable and clean curl-config.cmake.in
  
  Closes #3123

- [Tuomo Rinne brought this change]

  cmake: add find_dependency call for ZLIB to CMake config file

- [Tuomo Rinne brought this change]

  cmake: add support for transitive ZLIB target

- unit1650: fix "null pointer passed as argument 1 to memcmp"
  
  Detected by UndefinedBehaviorSanitizer
  
  Closes #3187

- travis: add a "make tidy" build that runs clang-tidy
  
  Closes #3182

- unit1300: fix stack-use-after-scope AddressSanitizer warning
  
  Closes #3186

- Curl_auth_create_plain_message: fix too-large-input-check
  
  CVE-2018-16839
  Reported-by: Harry Sintonen
  Bug: https://curl.haxx.se/docs/CVE-2018-16839.html

- Curl_close: clear data->multi_easy on free to avoid use-after-free
  
  Regression from b46cfbc068 (7.59.0)
  CVE-2018-16840
  Reported-by: Brian Carpenter (Geeknik Labs)
  
  Bug: https://curl.haxx.se/docs/CVE-2018-16840.html

- [randomswdev brought this change]

  system.h: use proper setting with Sun C++ as well
  
  system.h selects the proper Sun settings when __SUNPRO_C is defined. The
  Sun compiler does not define it when compiling C++ files.  I'm adding a
  check also on __SUNPRO_CC to allow curl to work properly also when used
  in a C++ project on Sun Solaris.
  
  Closes #3181

- rand: add comment to skip a clang-tidy false positive

- test1651: unit test Curl_extract_certinfo()
  
  The version used for Gskit, NSS, GnuTLS, WolfSSL and schannel.

- x509asn1: always check return code from getASN1Element()

- Makefile: add 'tidy' target that runs clang-tidy
  
  Available in the root, src and lib dirs.
  
  Closes #3163

- RELEASE-PROCEDURE: adjust the release dates
  
  See: https://curl.haxx.se/mail/lib-2018-10/0107.html

Patrick Monnerat (27 Oct 2018)
- x509asn1: suppress left shift on signed value
  
  Use an unsigned variable: as the signed operation behavior is undefined,
  this change silents clang-tidy about it.
  
  Ref: https://github.com/curl/curl/pull/3163
  Reported-By: Daniel Stenberg

Michael Kaufmann (27 Oct 2018)
- multi: Fix error handling in the SENDPROTOCONNECT state
  
  If Curl_protocol_connect() returns an error code,
  handle the error instead of switching to the next state.
  
  Closes #3170

Daniel Stenberg (27 Oct 2018)
- RELEASE-NOTES: synced

- openssl: output the correct cipher list on TLS 1.3 error
  
  When failing to set the 1.3 cipher suite, the wrong string pointer would
  be used in the error message. Most often saying "(nil)".
  
  Reported-by: Ricky-Tigg on github
  Fixes #3178
  Closes #3180

- docs/CIPHERS: fix the TLS 1.3 cipher names
  
  ... picked straight from the OpenSSL man page:
  https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_ciphersuites.html
  
  Reported-by: Ricky-Tigg on github
  Bug: #3178

Marcel Raad (27 Oct 2018)
- travis: install gnutls-bin package
  
  This is required for gnutls-serv, which enables a few more tests.
  
  Closes https://github.com/curl/curl/pull/2958

Daniel Gustafsson (26 Oct 2018)
- ssh: free the session on init failures
  
  Ensure to clear the session object in case the libssh2 initialization
  fails.
  
  It could be argued that the libssh2 error function should be called to
  get a proper error message in this case. But since the only error path
  in libssh2_knownhost_init() is memory a allocation failure it's safest
  to avoid since the libssh2 error handling allocates memory.
  
  Closes #3179
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

Daniel Stenberg (26 Oct 2018)
- docs/RELEASE-PROCEDURE: remove old entries, modify the Dec 2018 date
  
  ... I'm moving it up one week due to travels. The rest stays.

- [Daniel Gustafsson brought this change]

  openssl: make 'done' a proper boolean
  
  Closes #3176

- gtls: Values stored to but never read
  
  Detected by clang-tidy
  
  Closes #3176

- [Alexey Eremikhin brought this change]

  curl.1: --ipv6 mutexes ipv4 (fixed typo)
  
  Fixes #3171
  Closes #3172

- tool_main: make TerminalSettings static
  
  Reported-by: Gisle Vanem
  Bug: https://github.com/curl/curl/commit/becfe1233ff2b6b0c3e1b6a10048b55b68c2539f#commitcomment-31008819
  Closes #3161

- curl-config.in: remove dependency on bc
  
  Reported-by: Dima Pasechnik
  Fixes #3143
  Closes #3174

- [Gisle Vanem brought this change]

  rtmp: fix for compiling with lwIP
  
  Compiling on _WIN32 and with USE_LWIPSOCK, causes this error:
    curl_rtmp.c(223,3):  error: use of undeclared identifier 'setsockopt'
      setsockopt(r->m_sb.sb_socket, SOL_SOCKET, SO_RCVTIMEO,
      ^
    curl_rtmp.c(41,32):  note: expanded from macro 'setsockopt'
    #define setsockopt(a,b,c,d,e) (setsockopt)(a,b,c,(const char *)d,(int)e)
                                   ^
  Closes #3155

- configure: remove CURL_CONFIGURE_CURL_SOCKLEN_T
  
  Follow-up to #3166 which did the cmake part of this. This type/define is
  not used.
  
  Closes #3168

- [Ruslan Baratov brought this change]

  cmake: remove unused variables
  
  Remove variables:
  * HAVE_SOCKLEN_T
  * CURL_SIZEOF_CURL_SOCKLEN_T
  * CURL_TYPEOF_CURL_SOCKLEN_T
  
  Closes #3166

Michael Kaufmann (25 Oct 2018)
- urldata: Fix comment in header
  
  The "connecting" function is used by multiple protocols, not only FTP

- netrc: free temporary strings if memory allocation fails
  
  - Change the inout parameters after all needed memory has been
    allocated. Do not change them if something goes wrong.
  - Free the allocated temporary strings if strdup() fails.
  
  Closes #3122

Daniel Stenberg (24 Oct 2018)
- [Ruslan Baratov brought this change]

  config: Remove unused SIZEOF_VOIDP
  
  Closes #3162

- RELEASE-NOTES: synced

GitHub (23 Oct 2018)
- [Gisle Vanem brought this change]

  Fix for compiling with lwIP (3)
  
  lwIP on Windows does not have a WSAIoctl() function.
  But it do have a SO_SNDBUF option to lwip_setsockopt(). But it currently does nothing.

Daniel Stenberg (23 Oct 2018)
- Curl_follow: return better errors on URL problems
  
  ... by making the converter function global and accessible.
  
  Closes #3153

- Curl_follow: remove remaining free(newurl)
  
  Follow-up to 05564e750e8f0c. This function no longer frees the passed-in
  URL.
  
  Reported-by: Michael Kaufmann
  Bug: https://github.com/curl/curl/commit/05564e750e8f0c79016c680f301ce251e6e86155#commitcomm
  ent-30985666

Daniel Gustafsson (23 Oct 2018)
- headers: end all headers with guard comment
  
  Most headerfiles end with a /* <headerguard> */ comment, but it was
  missing from some. The comment isn't the most important part of our
  code documentation but consistency has an intrinsic value in itself.
  This adds header guard comments to the files that were lacking it.
  
  Closes #3158
  Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

Jay Satiro (23 Oct 2018)
- CIPHERS.md: Mention the options used to set TLS 1.3 ciphers
  
  Closes https://github.com/curl/curl/pull/3159

Daniel Stenberg (20 Oct 2018)
- docs/BUG-BOUNTY: the sponsors actually decide the amount
  
  Retract the previous approach as the sponsors will be the ones to set the
  final amounts.
  
  Closes #3152
  [ci skip]

- multi: avoid double-free
  
  Curl_follow() no longer frees the string. Make sure it happens in the
  caller function, like we normally handle allocations.
  
  This bug was introduced with the use of the URL API internally, it has
  never been in a release version
  
  Reported-by: Dario Weißer
  Closes #3149

- multi: make the closure handle "inherit" CURLOPT_NOSIGNAL
  
  Otherwise, closing that handle can still cause surprises!
  
  Reported-by: Martin Ankerl
  Fixes #3138
  Closes #3147

Marcel Raad (19 Oct 2018)
- VS projects: add USE_IPV6
  
  The Visual Studio builds didn't use IPv6. Add it to all projects since
  Visual Studio 2008, which is verified to build via AppVeyor.
  
  Closes https://github.com/curl/curl/pull/3137

- config_win32: enable LDAPS
  
  As done in the autotools and CMake builds by default.
  
  Closes https://github.com/curl/curl/pull/3137

Daniel Stenberg (18 Oct 2018)
- travis: add build for "configure --disable-verbose"
  
  Closes #3144

Kamil Dudka (17 Oct 2018)
- tool_cb_hdr: handle failure of rename()
  
  Detected by Coverity.
  
  Closes #3140
  Reviewed-by: Jay Satiro

Daniel Stenberg (17 Oct 2018)
- RELEASE-NOTES: synced

- docs/SECURITY-PROCESS: the hackerone IBB program drops curl
  
  ... now there's only BountyGraph.

Jay Satiro (16 Oct 2018)
- [Matthew Whitehead brought this change]

  x509asn1: Fix SAN IP address verification
  
  For IP addresses in the subject alternative name field, the length
  of the IP address (and hence the number of bytes to perform a
  memcmp on) is incorrectly calculated to be zero. The code previously
  subtracted q from name.end. where in a successful case q = name.end
  and therefore addrlen equalled 0. The change modifies the code to
  subtract name.beg from name.end to calculate the length correctly.
  
  The issue only affects libcurl with GSKit SSL, not other SSL backends.
  The issue is not a security issue as IP verification would always fail.
  
  Fixes #3102
  Closes #3141

Daniel Gustafsson (15 Oct 2018)
- INSTALL: mention mesalink in TLS section
  
  Commit 57348eb97d1b8fc3742e02c6587d2d02ff592da5 added support for the
  MesaLink vtls backend, but missed updating the TLS section containing
  supported backends in the docs.
  
  Closes #3134
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

Marcel Raad (14 Oct 2018)
- nonblock: fix unused parameter warning
  
  If USE_BLOCKING_SOCKETS is defined, curlx_nonblock's arguments are not
  used.

Michael Kaufmann (13 Oct 2018)
- Curl_follow: Always free the passed new URL
  
  Closes #3124

Viktor Szakats (12 Oct 2018)
- replace rawgit links [ci skip]
  
  Ref: https://rawgit.com/ "RawGit has reached the end of its useful life"
  Ref: https://news.ycombinator.com/item?id=18202481
  Closes https://github.com/curl/curl/pull/3131

Daniel Stenberg (12 Oct 2018)
- docs/BUG-BOUNTY.md: for vulns published since Aug 1st 2018
  
  [ci skip]

- travis: make distcheck scan for BOM markers
  
  and remove BOM from projects/wolfssl_override.props
  
  Closes #3126

Marcel Raad (11 Oct 2018)
- CMake: remove BOM
  
  Accidentally aded in commit 1bb86057ff07083deeb0b00f8ad35879ec4d03ea.
  
  Reported-by: Viktor Szakats
  Ref: https://github.com/curl/curl/pull/3120#issuecomment-428673136

Daniel Gustafsson (10 Oct 2018)
- transfer: fix typo in comment

Michael Kaufmann (10 Oct 2018)
- docs: add "see also" links for SSL options
  
  - link TLS 1.2 and TLS 1.3 options
  - link proxy and non-proxy options
  
  Closes #3121

Marcel Raad (10 Oct 2018)
- AppVeyor: remove BDIR variable that sneaked in again
  
  Removed in ae762e1abebe3a5fe75658583c85059a0957ef6e, accidentally added
  again in 9f3be5672dc4dda30ab43e0152e13d714a84d762.

- CMake: disable -Wpedantic-ms-format
  
  As done in the autotools build. This is required for MinGW, which
  supports only %I64 for printing 64-bit values, but warns about it.
  
  Closes https://github.com/curl/curl/pull/3120

Viktor Szakats (9 Oct 2018)
- ldap: show precise LDAP call in error message on Windows
  
  Also add a unique but common text ('bind via') to make it
  easy to grep this specific failure regardless of platform.
  
  Ref: https://github.com/curl/curl/pull/878/files#diff-7a636f08047c4edb53a240f540b4ecf6R468
  Closes https://github.com/curl/curl/pull/3118
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>

Daniel Stenberg (9 Oct 2018)
- docs/DEPRECATE: minor reformat to render nicer on web

Daniel Gustafsson (9 Oct 2018)
- CURLOPT_SSL_VERIFYSTATUS: Fix typo
  
  Changes s/OSCP/OCSP/ and bumps the copyright year due to the change.

Marcel Raad (9 Oct 2018)
- curl_setup: define NOGDI on Windows
  
  This avoids an ERROR macro clash between <wingdi.h> and <arpa/tftp.h>
  on MinGW.
  
  Closes https://github.com/curl/curl/pull/3113

- Windows: fixes for MinGW targeting Windows Vista
  
  Classic MinGW has neither InitializeCriticalSectionEx nor
  GetTickCount64, independent of the target Windows version.
  
  Closes https://github.com/curl/curl/pull/3113

Daniel Stenberg (8 Oct 2018)
- TODO: fixed 'API for URL parsing/splitting'

Daniel Gustafsson (8 Oct 2018)
- KNOWN_BUGS: Fix various typos
  
  Closes #3112
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

Viktor Szakats (8 Oct 2018)
- spelling fixes [ci skip]
  
  as detected by codespell 1.14.0
  
  Closes https://github.com/curl/curl/pull/3114
  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>

Daniel Stenberg (8 Oct 2018)
- RELEASE-NOTES: synced

- curl_ntlm_wb: check aprintf() return codes
  
  ... when they return NULL we're out of memory and MUST return failure.
  
  closes #3111

- docs/BUG-BOUNTY: proposed additional docs
  
  Bug bounty explainer. See https://bountygraph.com/programs/curl
  
  Closes #3067

- [Rick Deist brought this change]

  hostip: fix check on Curl_shuffle_addr return value
  
  Closes #3110

- FILE: fix CURLOPT_NOBODY and CURLOPT_HEADER output
  
  Now FILE transfers send headers to the header callback like HTTP and
  other protocols. Also made curl_easy_getinfo(...CURLINFO_PROTOCOL...)
  work for FILE in the callbacks.
  
  Makes "curl -i file://.." and "curl -I file://.." work like before
  again. Applied the bold header logic to them too.
  
  Regression from c1c2762 (7.61.0)
  
  Reported-by: Shaun Jackman
  Fixes #3083
  Closes #3101

Daniel Gustafsson (7 Oct 2018)
- gskit: make sure to terminate version string
  
  In case a very small buffer was passed to the version function, it could
  result in the buffer not being NULL-terminated since strncpy() doesn't
  guarantee a terminator on an overflowed buffer. Rather than adding code
  to terminate (and handle zero-sized buffers), move to using snprintf()
  instead like all the other vtls backends.
  
  Closes #3105
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
  Reviewed-by: Viktor Szakats <commit@vszakats.net>

- TODO: add LD_PRELOAD support on macOS
  
  Add DYLD_INSERT_LIBRARIES support to the TODO list. Reported in #2394.

- runtests: skip ld_preload tests on macOS
  
  The LD_PRELOAD functionality doesn't exist on macOS, so skip any tests
  requiring it.
  
  Fixes #2394
  Closes #3106
  Reported-by: Github user @jakirkham
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

Marcel Raad (7 Oct 2018)
- AppVeyor: use Debug builds to run tests
  
  This enables more tests.
  
  Closes https://github.com/curl/curl/pull/3104

- AppVeyor: add HTTP_ONLY build
  
  Closes https://github.com/curl/curl/pull/3104

- AppVeyor: add WinSSL builds
  
  Use the oldest and latest Windows SDKs for them.
  Also, remove all but one OpenSSL build.
  
  Closes https://github.com/curl/curl/pull/3104

- AppVeyor: add remaining Visual Studio versions
  
  This adds Visual Studio 9 and 10 builds.
  There's no 64-bit VC9 compiler on AppVeyor, so use it as the Win32
  build. Also, VC9 cannot be used for running the test suite.
  
  Closes https://github.com/curl/curl/pull/3104

- AppVeyor: break long line
  
  Closes https://github.com/curl/curl/pull/3104

- AppVeyor: remove unused BDIR variable
  
  Closes https://github.com/curl/curl/pull/3104

Daniel Stenberg (6 Oct 2018)
- test2100: test DoH using IPv4-only
  
  To make it only send one DoH request and avoid the race condition that
  could lead to the requests getting sent in reversed order and thus
  making it hard to compare in the test case.
  
  Fixes #3107
  Closes #3108

- tests/FILEFORMAT: mention how to use <fileN> and <stripfileN> too
  
  [ci skip]

- RELEASE-NOTES: synced

- [Dmitry Kostjuchenko brought this change]

  timeval: fix use of weak symbol clock_gettime() on Apple platforms
  
  Closes #3048

- doh: keep the IPv4 address in (original) network byte order
  
  Ideally this will fix the reversed order shown in SPARC tests:
  
    resp 8: Expected 127.0.0.1 got 1.0.0.127
  
  Closes #3091

Jay Satiro (5 Oct 2018)
- INTERNALS.md: wrap lines longer than 79

Daniel Gustafsson (5 Oct 2018)
- INTERNALS: escape reference to parameter
  
  The parameter reference <string> was causing rendering issues in the
  generated HTML page, as <string> isn't a valid HTML tag. Fix by back-
  tick escaping it.
  
  Closes #3099
  Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

- checksrc: handle zero scoped ignore commands
  
  If a !checksrc! disable command specified to ignore zero errors, it was
  still added to the ignore block even though nothing was ignored. While
  there were no blocks ignored that shouldn't be ignored, the processing
  ended with with a warning:
  
  <filename>:<line>:<col>: warning: Unused ignore: LONGLINE (UNUSEDIGNORE)
   /* !checksrc! disable LONGLINE 0 */
                      ^
  Fix by instead treating a zero ignore as a a badcommand and throw a
  warning for that one.
  
  Closes #3096
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

- checksrc: enable strict mode and warnings
  
  Enable strict and warnings mode for checksrc to ensure we aren't missing
  anything due to bugs in the checking code. This uncovered a few things
  which are all fixed in this commit:
  
  * several variables were used uninitialized
  * several variables were not defined in the correct scope
  * the whitelist filehandle was read even if the file didn't exist
  * the enable_warn() call when a disable counter had expired was passing
    incorrect variables, but since the checkwarn() call is unlikely to hit
    (the counter is only decremented to zero on actual ignores) it didn't
    manifest a problem.
  
  Closes #3090
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>
  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>

Marcel Raad (5 Oct 2018)
- CMake: suppress MSVC warning C4127 for libtest
  
  It's issued by older Windows SDKs (prior to version 8.0).

Sergei Nikulov (5 Oct 2018)
- Merge branch 'dmitrykos-fix_missing_CMake_defines'

- [Dmitry Kostjuchenko brought this change]

  cmake: test and set missed defines during configuration
  
  Added configuration checks for HAVE_BUILTIN_AVAILABLE and HAVE_CLOCK_GETTIME_MONOTONIC.
  
  Closes #3097

Marcel Raad (5 Oct 2018)
- AppVeyor: disable test 500
  
  It almost always results in
  "starttransfer vs total: 0.000001 0.000000".
  I cannot reproduce this locally, so disable it for now.
  
  Closes https://github.com/curl/curl/pull/3100

- AppVeyor: set custom install prefix
  
  CMake's default has spaces and in 32-bit mode parentheses, which result
  in syntax errors in curl-config.
  
  Closes https://github.com/curl/curl/pull/3100

- AppVeyor: Remove non-SSL non-test builds
  
  They don't add much value.
  
  Closes https://github.com/curl/curl/pull/3100

- AppVeyor: run test suite
  
  Use the preinstalled MSYS2 bash for that.
  Disable test 1139 as the CMake build doesn't generate curl.1.
  
  Ref: https://github.com/curl/curl/issues/3070#issuecomment-425922224
  Closes https://github.com/curl/curl/pull/3100

- AppVeyor: use in-tree build
  
  Required to run the tests.
  
  Closes https://github.com/curl/curl/pull/3100

Daniel Stenberg (4 Oct 2018)
- doh: make sure TTL isn't re-inited by second (discarded?) response
  
  Closes #3092

- test320: strip out more HTML when comparing
  
  To make the test case work with different gnutls-serv versions better.
  
  Reported-by: Kamil Dudka
  Fixes #3093
  Closes #3094

Marcel Raad (4 Oct 2018)
- runtests: use Windows paths for Windows curl
  
  curl generated by CMake's Visual Studio generator has "Windows" in the
  version number.

Daniel Stenberg (4 Oct 2018)
- [Colin Hogben brought this change]

  tests/negtelnetserver.py: fix Python2-ism in neg TELNET server
  
  Fix problems caused by differences in treatment of bytes objects between
  python2 and python3.
  
  Fixes #2929
  Closes #3080

Daniel Gustafsson (3 Oct 2018)
- memory: ensure to check allocation results
  
  The result of a memory allocation should always be checked, as we may
  run under memory pressure where even a small allocation can fail. This
  adds checking and error handling to a few cases where the allocation
  wasn't checked for success. In the ftp case, the freeing of the path
  variable is moved ahead of the allocation since there is little point
  in keeping it around across the strdup, and the separation makes for
  more readable code. In nwlib, the lock is aslo freed in the error path.
  
  Also bumps the copyright years on affected files.
  
  Closes #3084
  Reviewed-by: Jay Satiro <raysatiro@yahoo.com>
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

- comment: Fix multiple typos in function parameters
  
  Ensure that the parameters in the comment match the actual names in the
  prototype.
  
  Closes #3079
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

- CURLOPT_SSLVERSION.3: fix typos and consistent spelling
  
  Use TLS vX.Y throughout the document, instead of TLS X.Y, as that was
  already done in all but a few cases. Also fix a few typos.
  
  Closes #3076
  Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

- SECURITY-PROCESS: make links into hyperlinks
  
  Use proper Markdown hyperlink format for the Bountygraph links in order
  for the generated website page to be more user friendly. Also link to
  the sponsors to give them a little extra credit.
  
  Closes #3082
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

Jay Satiro (3 Oct 2018)
- CURLOPT_HEADER.3: fix typo

- nss: fix nssckbi module loading on Windows
  
  - Use .DLL extension instead of .so to load modules on Windows.
  
  Bug: https://curl.haxx.se/mail/lib-2018-09/0077.html
  Reported-by: Maxime Legros
  
  Ref: https://github.com/curl/curl/pull/3016/#issuecomment-423069442
  
  Closes https://github.com/curl/curl/pull/3086

- data-binary.d: clarify default content-type is x-www-form-urlencoded
  
  - Advise user that --data-binary sends a default content type of
    x-www-form-urlencoded, and to have the data treated as arbitrary
    binary data by the server set the content-type header to octet-stream.
  
  Ref: https://github.com/curl/curl/pull/2852#issuecomment-426465094
  
  Closes https://github.com/curl/curl/pull/3085

Marcel Raad (2 Oct 2018)
- test1299: use single quotes around asterisk
  
  Ref: https://github.com/curl/curl/issues/1751#issuecomment-321522580

Daniel Stenberg (2 Oct 2018)
- docs/CIPHERS: mention the colon separation for OpenSSL
  
  Bug: #3077

- runtests: ignore disabled even when ranges are given
  
  runtests.pl support running a range of tests, like "44 to 127". Starting
  now, the code makes sure that even such given ranges will ignore tests
  that are marked as disabled.
  
  Disabled tests can still be run by explictly specifying that test
  number.
  
  Closes #3075

- urlapi: starting with a drive letter on win32 is not an abs url
  
  ... and libcurl doesn't support any single-letter URL schemes (if there
  even exist any) so it should be fairly risk-free.
  
  Reported-by: Marcel Raad
  
  Fixes #3070
  Closes #3071

Marcel Raad (2 Oct 2018)
- doh: fix curl_easy_setopt argument type
  
  CURLOPT_POSTFIELDSIZE is long. Fixes a compiler warning on 64-bit
  MinGW.

Daniel Stenberg (2 Oct 2018)
- RELEASE-NOTES: synced

Jay Satiro (1 Oct 2018)
- [Ruslan Baratov brought this change]

  CMake: Improve config installation
  
  Use 'GNUInstallDirs' standard module to set destinations of installed
  files.
  
  Use uppercase "CURL" names instead of lowercase "curl" to match standard
  'FindCURL.cmake' CMake module:
  * https://cmake.org/cmake/help/latest/module/FindCURL.html
  
  Meaning:
  * Install 'CURLConfig.cmake' instead of 'curl-config.cmake'
  * User should call 'find_package(CURL)' instead of 'find_package(curl)'
  
  Use 'configure_package_config_file' function to generate
  'CURLConfig.cmake' file. This will make 'curl-config.cmake.in' template
  file smaller and handle components better.  E.g.  current configuration
  report no error if user specified unknown components (note: new
  configuration expects no components, report error if user will try to
  specify any).
  
  Closes https://github.com/curl/curl/pull/2849

Daniel Stenberg (1 Oct 2018)
- test1650: make it depend on http/2
  
  Follow-up to 570008c99da0ccbb as it gets link errors.
  
  Reported-by: Michael Kaufmann
  Closes #3068

- [Nate Prewitt brought this change]

  MANUAL: minor grammar fix
  
  Noticed a typo reading through the docs.
  
  Closes #3069

- doh: only build if h2 enabled
  
  The DoH spec says "HTTP/2 [RFC7540] is the minimum RECOMMENDED version
  of HTTP for use with DoH".
  
  Reported-by: Marcel Raad
  Closes #3066

- test2100: require http2 to run
  
  Reported-by: Marcel Raad
  Fixes #3064
  Closes #3065

- multi: fix memory leak in content encoding related error path
  
  ... a missing multi_done() call.
  
  Credit to OSS-Fuzz
  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10728
  Closes #3063

- travis: bump the Secure Transport build to use xcode 10
  
  Due to an issue with travis
  (https://github.com/travis-ci/travis-ci/issues/9956) we've been using
  Xcode 9.2 for darwinssl builds for a while. Now xcode 10 is offered as
  an alternative and as it builds curl+darwinssl fine that seems like a
  better choice.
  
  Closes #3062

- [Rich Turner brought this change]

  curl: enabled Windows VT Support and UTF-8 output
  
  Enabled Console VT support (if running OS supports VT) in tool_main.c.
  
  Fixes #3008
  Closes #3011

- multi: fix location URL memleak in error path
  
  Follow-up to #3044 - fix a leak OSS-Fuzz detected
  Closes #3057

Sergei Nikulov (28 Sep 2018)
- cmake: fixed path used in generation of docs/tests during curl build through add_subdicectory(...)

- [Brad King brought this change]

  cmake: Backport to work with CMake 3.0 again
  
  Changes in commit 7867aaa9a0 (cmake: link curl to the OpenSSL targets
  instead of lib absolute paths, 2018-07-17) and commit f826b4ce98 (cmake:
  bumped minimum version to 3.4, 2018-07-19) required CMake 3.4 to fix
  issue #2746.  This broke support for users on older versions of CMake
  even if they just want to build curl and do not care whether transitive
  dependencies work.
  
  Backport the logic to work with CMake 3.0 again by implementing the
  fix only when the version of CMake is at least 3.4.

Marcel Raad (27 Sep 2018)
- curl_threads: fix classic MinGW compile break
  
  Classic MinGW still has _beginthreadex's return type as unsigned long
  instead of uintptr_t [0]. uintptr_t is not even defined because of [1].
  
  [0] https://sourceforge.net/p/mingw/mingw-org-wsl/ci/wsl-5.1-release/tree/mingwrt/include/process.h#l167
  [1] https://sourceforge.net/p/mingw/mingw-org-wsl/ci/wsl-5.1-release/tree/mingwrt/include/process.h#l90
  
  Bug: https://github.com/curl/curl/issues/2924#issuecomment-424334807
  Closes https://github.com/curl/curl/pull/3051

Daniel Stenberg (26 Sep 2018)
- configure: s/AC_RUN_IFELSE/CURL_RUN_IFELSE
  
  fix a few leftovers
  
  Fixes #3006
  Closes #3049

- [Doron Behar brought this change]

  example/htmltidy: fix include paths of tidy libraries
  
  Closes #3050

- RELEASE-NOTES: synced

- Curl_http2_done: fix memleak in error path
  
  Free 'header_recvbuf' unconditionally even if 'h2' isn't (yet) set, for
  early failures.
  
  Detected by OSS-Fuzz
  
  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10669
  Closes #3046

- http: fix memleak in rewind error path
  
  If the rewind would fail, a strdup() would not get freed.
  
  Detected by OSS-Fuzz
  
  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10665
  Closes #3044

Viktor Szakats (24 Sep 2018)
- test320: fix regression in [ci skip]
  
  The value in question is coming directly from `gnutls-serv`, so it cannot
  be modified freely.
  
  Reported-by: Marcel Raad
  Ref: https://github.com/curl/curl/commit/6ae6b2a533e8630afbb21f570305bd4ceece6348#commitcomment-30621004

Daniel Stenberg (24 Sep 2018)
- Curl_retry_request: fix memory leak
  
  Detected by OSS-Fuzz
  
  Bug: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10648
  Closes #3042

- openssl: load built-in engines too
  
  Regression since 38203f1
  
  Reported-by: Jean Fabrice
  Fixes #3023
  Closes #3040

- [Christian Heimes brought this change]

  OpenSSL: enable TLS 1.3 post-handshake auth
  
  OpenSSL 1.1.1 requires clients to opt-in for post-handshake
  authentication.
  
  Fixes: https://github.com/curl/curl/issues/3026
  Signed-off-by: Christian Heimes <christian@python.org>
  
  Closes https://github.com/curl/curl/pull/3027

- [Even Rouault brought this change]

  Curl_dedotdotify(): always nul terminate returned string.
  
  This fixes potential out-of-buffer access on "file:./" URL
  
  $ valgrind curl "file:./"
  ==24516== Memcheck, a memory error detector
  ==24516== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
  ==24516== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
  ==24516== Command: /home/even/install-curl-git/bin/curl file:./
  ==24516==
  ==24516== Conditional jump or move depends on uninitialised value(s)
  ==24516==    at 0x4C31F9C: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
  ==24516==    by 0x4EBB315: seturl (urlapi.c:801)
  ==24516==    by 0x4EBB568: parseurl (urlapi.c:861)
  ==24516==    by 0x4EBC509: curl_url_set (urlapi.c:1199)
  ==24516==    by 0x4E644C6: parseurlandfillconn (url.c:2044)
  ==24516==    by 0x4E67AEF: create_conn (url.c:3613)
  ==24516==    by 0x4E68A4F: Curl_connect (url.c:4119)
  ==24516==    by 0x4E7F0A4: multi_runsingle (multi.c:1440)
  ==24516==    by 0x4E808E5: curl_multi_perform (multi.c:2173)
  ==24516==    by 0x4E7558C: easy_transfer (easy.c:686)
  ==24516==    by 0x4E75801: easy_perform (easy.c:779)
  ==24516==    by 0x4E75868: curl_easy_perform (easy.c:798)
  
  Was originally spotted by
  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=10637
  Credit to OSS-Fuzz
  
  Closes #3039

Viktor Szakats (23 Sep 2018)
- update URLs in tests
  
  - and one in docs/MANUAL as well
  
  Closes https://github.com/curl/curl/pull/3038

- whitespace fixes
  
  - replace tabs with spaces where possible
  - remove line ending spaces
  - remove double/triple newlines at EOF
  - fix a non-UTF-8 character
  - cleanup a few indentations/line continuations
    in manual examples
  
  Closes https://github.com/curl/curl/pull/3037

Daniel Stenberg (23 Sep 2018)
- http: add missing return code check
  
  Detected by Coverity. CID 1439610.
  
  Follow-up from 46e164069d1a523
  
  Closes #3034

- ftp: don't access pointer before NULL check
  
  Detected by Coverity. CID 1439611.
  
  Follow-up from 46e164069d1a523

- unit1650: fix out of boundary access
  
  Fixes #2987
  Closes #3035

Viktor Szakats (23 Sep 2018)
- docs/examples: URL updates
  
  - also update two URLs outside of docs/examples
  - fix spelling of filename persistant.c
  - fix three long lines that started failing checksrc.pl
  
  Closes https://github.com/curl/curl/pull/3036

- examples/Makefile.m32: sync with core [ci skip]
  
  also:
  - fix two warnings in synctime.c (one of them Windows-specific)
  - upgrade URLs in synctime.c and remove a broken one
  
  Closes https://github.com/curl/curl/pull/3033

Daniel Stenberg (22 Sep 2018)
- examples/parseurl.c: show off the URL API a bit
  
  Closes #3030

- SECURITY-PROCESS: mention the bountygraph program [ci skip]
  
  Closes #3032

- url: use the URL API internally as well
  
  ... to make it a truly unified URL parser.
  
  Closes #3017

Viktor Szakats (22 Sep 2018)
- URL and mailmap updates, remove an obsolete directory [ci skip]
  
  Closes https://github.com/curl/curl/pull/3031

Daniel Stenberg (22 Sep 2018)
- RELEASE-NOTES: synced

- configure: force-use -lpthreads on HPUX
  
  When trying to detect pthreads use on HPUX the checks will succeed
  without the correct -l option but then end up failing at run-time.
  
  Reported-by: Eason-Yu on github
  Fixes #2697
  Closes #3025

- [Erik Minekus brought this change]

  Curl_saferealloc: Fixed typo in docblock
  
  Closes #3029

- urlapi: fix support for address scope in IPv6 numerical addresses
  
  Closes #3024

- [Loganaden Velvindron brought this change]

  GnutTLS: TLS 1.3 support
  
  Closes #2971

- TODO: c-ares and CURLOPT_OPENSOCKETFUNCTION
  
  Removed DoH.
  
  Closes #2734

Jay Satiro (20 Sep 2018)
- vtls: fix ssl version "or later" behavior change for many backends
  
  - Treat CURL_SSLVERSION_MAX_NONE the same as
    CURL_SSLVERSION_MAX_DEFAULT. Prior to this change NONE would mean use
    the minimum version also as the maximum.
  
  This is a follow-up to 6015cef which changed the behavior of setting
  the SSL version so that the requested version would only be the minimum
  and not the maximum. It appears it was (mostly) implemented in OpenSSL
  but not other backends. In other words CURL_SSLVERSION_TLSv1_0 used to
  mean use just TLS v1.0 and now it means use TLS v1.0 *or later*.
  
  - Fix CURL_SSLVERSION_MAX_DEFAULT for OpenSSL.
  
  Prior to this change CURL_SSLVERSION_MAX_DEFAULT with OpenSSL was
  erroneously treated as always TLS 1.3, and would cause an error if
  OpenSSL was built without TLS 1.3 support.
  
  Co-authored-by: Daniel Gustafsson
  
  Fixes https://github.com/curl/curl/issues/2969
  Closes https://github.com/curl/curl/pull/3012

Daniel Stenberg (20 Sep 2018)
- certs: generate tests certs with sha256 digest algorithm
  
  As OpenSSL 1.1.1 starts to complain and fail on sha1 CAs:
  
  "SSL certificate problem: CA signature digest algorithm too weak"
  
  Closes #3014

- urlapi: document the error codes, remove two unused ones
  
  Assisted-by: Daniel Gustafsson
  Closes #3019

- urlapi: add CURLU_GUESS_SCHEME and fix hostname acceptance
  
  In order for this API to fully work for libcurl itself, it now offers a
  CURLU_GUESS_SCHEME flag that makes it "guess" scheme based on the host
  name prefix just like libcurl always did. If there's no known prefix, it
  will guess "http://".
  
  Separately, it relaxes the check of the host name so that IDN host names
  can be passed in as well.
  
  Both these changes are necessary for libcurl itself to use this API.
  
  Assisted-by: Daniel Gustafsson
  Closes #3018

Kamil Dudka (19 Sep 2018)
- nss: try to connect even if libnssckbi.so fails to load
  
  One can still use CA certificates stored in NSS database.
  
  Reported-by: Maxime Legros
  Bug: https://curl.haxx.se/mail/lib-2018-09/0077.html
  
  Closes #3016

Daniel Gustafsson (19 Sep 2018)
- urlapi: don't set value which is never read
  
  In the CURLUPART_URL case, there is no codepath which invokes url
  decoding so remove the assignment of the urldecode variable. This
  fixes the deadstore bug-report from clang static analysis.
  
  Closes #3015
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

- todo: Update reference to already done item
  
  TODO item 1.1 was implemented in commit 946ce5b61f, update reference
  to it with instead referencing the implemented option.
  
  Closes #3013
  Reviewed-by: Daniel Stenberg <daniel@haxx.se>

Daniel Stenberg (18 Sep 2018)
- RELEASE-NOTES: synced

- [slodki brought this change]

  cmake: don't require OpenSSL if USE_OPENSSL=OFF
  
  User must have OpenSSL installed even if not used by libcurl at all
  since 7.61.1 release.  Broken at
  7867aaa9a01decf93711428462335be8cef70212
  
  Reviewed-by: Sergei Nikulov
  Closes #3001

- curl_multi_wait: call getsock before figuring out timeout
  
  .... since getsock may update the expiry timer.
  
  Fixes #2996
  Closes #3000

- examples/http2-pushinmemory: receive HTTP/2 pushed files in memory
  
  Closes #3004







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
7619
7620
7621
7622
7623
7624
7625
















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































  
  Curl_ftp_parselist: avoid unsigned integer overflows
  
  The overflow has no real world impact, just avoid it for "best
  practice".
  
  Closes #3225
















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Changes to jni/curl/CMake/FindGSS.cmake.
58
59
60
61
62
63
64

65
66
67
68
69
70
71
  )

  if(_GSS_CONFIGURE_SCRIPT)
    execute_process(
          COMMAND ${_GSS_CONFIGURE_SCRIPT} "--cflags" "gssapi"
          OUTPUT_VARIABLE _GSS_CFLAGS
          RESULT_VARIABLE _GSS_CONFIGURE_FAILED

      )
    message(STATUS "CFLAGS: ${_GSS_CFLAGS}")
    if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
      # should also work in an odd case when multiple directories are given
      string(STRIP "${_GSS_CFLAGS}" _GSS_CFLAGS)
      string(REGEX REPLACE " +-I" ";" _GSS_CFLAGS "${_GSS_CFLAGS}")
      string(REGEX REPLACE " +-([^I][^ \\t;]*)" ";-\\1" _GSS_CFLAGS "${_GSS_CFLAGS}")







>







58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  )

  if(_GSS_CONFIGURE_SCRIPT)
    execute_process(
          COMMAND ${_GSS_CONFIGURE_SCRIPT} "--cflags" "gssapi"
          OUTPUT_VARIABLE _GSS_CFLAGS
          RESULT_VARIABLE _GSS_CONFIGURE_FAILED
          OUTPUT_STRIP_TRAILING_WHITESPACE
      )
    message(STATUS "CFLAGS: ${_GSS_CFLAGS}")
    if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
      # should also work in an odd case when multiple directories are given
      string(STRIP "${_GSS_CFLAGS}" _GSS_CFLAGS)
      string(REGEX REPLACE " +-I" ";" _GSS_CFLAGS "${_GSS_CFLAGS}")
      string(REGEX REPLACE " +-([^I][^ \\t;]*)" ";-\\1" _GSS_CFLAGS "${_GSS_CFLAGS}")
80
81
82
83
84
85
86

87
88
89
90
91
92
93
      endforeach()
    endif()

    execute_process(
        COMMAND ${_GSS_CONFIGURE_SCRIPT} "--libs" "gssapi"
        OUTPUT_VARIABLE _GSS_LIB_FLAGS
        RESULT_VARIABLE _GSS_CONFIGURE_FAILED

    )
    message(STATUS "LDFLAGS: ${_GSS_LIB_FLAGS}")

    if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
      # this script gives us libraries and link directories. Blah. We have to deal with it.
      string(STRIP "${_GSS_LIB_FLAGS}" _GSS_LIB_FLAGS)
      string(REGEX REPLACE " +-(L|l)" ";-\\1" _GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}")







>







81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
      endforeach()
    endif()

    execute_process(
        COMMAND ${_GSS_CONFIGURE_SCRIPT} "--libs" "gssapi"
        OUTPUT_VARIABLE _GSS_LIB_FLAGS
        RESULT_VARIABLE _GSS_CONFIGURE_FAILED
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    message(STATUS "LDFLAGS: ${_GSS_LIB_FLAGS}")

    if(NOT _GSS_CONFIGURE_FAILED) # 0 means success
      # this script gives us libraries and link directories. Blah. We have to deal with it.
      string(STRIP "${_GSS_LIB_FLAGS}" _GSS_LIB_FLAGS)
      string(REGEX REPLACE " +-(L|l)" ";-\\1" _GSS_LIB_FLAGS "${_GSS_LIB_FLAGS}")
106
107
108
109
110
111
112

113
114
115
116
117
118
119
120
121
122
123

124
125
126
127
128
129
130
      endforeach()
    endif()

    execute_process(
        COMMAND ${_GSS_CONFIGURE_SCRIPT} "--version"
        OUTPUT_VARIABLE _GSS_VERSION
        RESULT_VARIABLE _GSS_CONFIGURE_FAILED

    )

    # older versions may not have the "--version" parameter. In this case we just don't care.
    if(_GSS_CONFIGURE_FAILED)
      set(_GSS_VERSION 0)
    endif()

    execute_process(
        COMMAND ${_GSS_CONFIGURE_SCRIPT} "--vendor"
        OUTPUT_VARIABLE _GSS_VENDOR
        RESULT_VARIABLE _GSS_CONFIGURE_FAILED

    )

    # older versions may not have the "--vendor" parameter. In this case we just don't care.
    if(_GSS_CONFIGURE_FAILED)
      set(GSS_FLAVOUR "Heimdal") # most probably, shouldn't really matter
    else()
      if(_GSS_VENDOR MATCHES ".*H|heimdal.*")







>











>







108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
      endforeach()
    endif()

    execute_process(
        COMMAND ${_GSS_CONFIGURE_SCRIPT} "--version"
        OUTPUT_VARIABLE _GSS_VERSION
        RESULT_VARIABLE _GSS_CONFIGURE_FAILED
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )

    # older versions may not have the "--version" parameter. In this case we just don't care.
    if(_GSS_CONFIGURE_FAILED)
      set(_GSS_VERSION 0)
    endif()

    execute_process(
        COMMAND ${_GSS_CONFIGURE_SCRIPT} "--vendor"
        OUTPUT_VARIABLE _GSS_VENDOR
        RESULT_VARIABLE _GSS_CONFIGURE_FAILED
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )

    # older versions may not have the "--vendor" parameter. In this case we just don't care.
    if(_GSS_CONFIGURE_FAILED)
      set(GSS_FLAVOUR "Heimdal") # most probably, shouldn't really matter
    else()
      if(_GSS_VENDOR MATCHES ".*H|heimdal.*")
Changes to jni/curl/CMakeLists.txt.
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
    set(USE_THREADS_POSIX ${CMAKE_USE_PTHREADS_INIT})
    set(HAVE_PTHREAD_H ${CMAKE_USE_PTHREADS_INIT})
  endif()
  set(CURL_LIBS ${CURL_LIBS} ${CMAKE_THREAD_LIBS_INIT})
endif()

# Check for all needed libraries
check_library_exists_concat("dl"     dlopen       HAVE_LIBDL)
check_library_exists_concat("socket" connect      HAVE_LIBSOCKET)
check_library_exists("c" gethostbyname "" NOT_NEED_LIBNSL)

# Yellowtab Zeta needs different libraries than BeOS 5.
if(BEOS)
  set(NOT_NEED_LIBNSL 1)
  check_library_exists_concat("bind" gethostbyname HAVE_LIBBIND)







|







256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
    set(USE_THREADS_POSIX ${CMAKE_USE_PTHREADS_INIT})
    set(HAVE_PTHREAD_H ${CMAKE_USE_PTHREADS_INIT})
  endif()
  set(CURL_LIBS ${CURL_LIBS} ${CMAKE_THREAD_LIBS_INIT})
endif()

# Check for all needed libraries
check_library_exists_concat("${CMAKE_DL_LIBS}" dlopen HAVE_LIBDL)
check_library_exists_concat("socket" connect      HAVE_LIBSOCKET)
check_library_exists("c" gethostbyname "" NOT_NEED_LIBNSL)

# Yellowtab Zeta needs different libraries than BeOS 5.
if(BEOS)
  set(NOT_NEED_LIBNSL 1)
  check_library_exists_concat("bind" gethostbyname HAVE_LIBBIND)
856
857
858
859
860
861
862

863
864
865
866
867
868
869
check_symbol_exists(setvbuf       "${CURL_INCLUDES}" HAVE_SETVBUF)
check_symbol_exists(sigsetjmp     "${CURL_INCLUDES}" HAVE_SIGSETJMP)
check_symbol_exists(getpass_r     "${CURL_INCLUDES}" HAVE_GETPASS_R)
check_symbol_exists(strlcat       "${CURL_INCLUDES}" HAVE_STRLCAT)
check_symbol_exists(getpwuid      "${CURL_INCLUDES}" HAVE_GETPWUID)
check_symbol_exists(getpwuid_r    "${CURL_INCLUDES}" HAVE_GETPWUID_R)
check_symbol_exists(geteuid       "${CURL_INCLUDES}" HAVE_GETEUID)

check_symbol_exists(utime         "${CURL_INCLUDES}" HAVE_UTIME)
check_symbol_exists(gmtime_r      "${CURL_INCLUDES}" HAVE_GMTIME_R)
check_symbol_exists(localtime_r   "${CURL_INCLUDES}" HAVE_LOCALTIME_R)

check_symbol_exists(gethostbyname   "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME)
check_symbol_exists(gethostbyname_r "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R)








>







856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
check_symbol_exists(setvbuf       "${CURL_INCLUDES}" HAVE_SETVBUF)
check_symbol_exists(sigsetjmp     "${CURL_INCLUDES}" HAVE_SIGSETJMP)
check_symbol_exists(getpass_r     "${CURL_INCLUDES}" HAVE_GETPASS_R)
check_symbol_exists(strlcat       "${CURL_INCLUDES}" HAVE_STRLCAT)
check_symbol_exists(getpwuid      "${CURL_INCLUDES}" HAVE_GETPWUID)
check_symbol_exists(getpwuid_r    "${CURL_INCLUDES}" HAVE_GETPWUID_R)
check_symbol_exists(geteuid       "${CURL_INCLUDES}" HAVE_GETEUID)
check_symbol_exists(usleep        "${CURL_INCLUDES}" HAVE_USLEEP)
check_symbol_exists(utime         "${CURL_INCLUDES}" HAVE_UTIME)
check_symbol_exists(gmtime_r      "${CURL_INCLUDES}" HAVE_GMTIME_R)
check_symbol_exists(localtime_r   "${CURL_INCLUDES}" HAVE_LOCALTIME_R)

check_symbol_exists(gethostbyname   "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME)
check_symbol_exists(gethostbyname_r "${CURL_INCLUDES}" HAVE_GETHOSTBYNAME_R)

Changes to jni/curl/Makefile.am.
149
150
151
152
153
154
155










156
157
158
159

160
161
162
163
164
165
166
 projects/Windows/VC15/src/curl.vcxproj.filters     \
 projects/generate.bat                              \
 projects/wolfssl_options.h                         \
 projects/wolfssl_override.props

WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
 winbuild/MakefileBuild.vc winbuild/Makefile.vc











EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
 RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
 scripts/updatemanpages.pl $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) \

 lib/libcurl.vers.in buildconf.bat scripts/coverage.sh scripts/completion.pl

CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
 $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \
 $(VC9_LIBVCPROJ) $(VC9_SRCVCPROJ) $(VC10_LIBVCXPROJ) $(VC10_SRCVCXPROJ) \
 $(VC11_LIBVCXPROJ) $(VC11_SRCVCXPROJ) $(VC12_LIBVCXPROJ) $(VC12_SRCVCXPROJ) \
 $(VC14_LIBVCXPROJ) $(VC14_SRCVCXPROJ) $(VC15_LIBVCXPROJ) $(VC15_SRCVCXPROJ)







>
>
>
>
>
>
>
>
>
>



|
>







149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
 projects/Windows/VC15/src/curl.vcxproj.filters     \
 projects/generate.bat                              \
 projects/wolfssl_options.h                         \
 projects/wolfssl_override.props

WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
 winbuild/MakefileBuild.vc winbuild/Makefile.vc

PLAN9_DIST = plan9/include/mkfile \
 plan9/include/mkfile             \
 plan9/mkfile.proto               \
 plan9/mkfile                     \
 plan9/BUILD.PLAN9.txt            \
 plan9/lib/mkfile.inc             \
 plan9/lib/mkfile                 \
 plan9/src/mkfile.inc             \
 plan9/src/mkfile

EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
 RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
 scripts/updatemanpages.pl $(CMAKE_DIST) \
 $(VC_DIST) $(WINBUILD_DIST) $(PLAN9_DIST) \
 lib/libcurl.vers.in buildconf.bat scripts/coverage.sh scripts/completion.pl

CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
 $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \
 $(VC9_LIBVCPROJ) $(VC9_SRCVCPROJ) $(VC10_LIBVCXPROJ) $(VC10_SRCVCXPROJ) \
 $(VC11_LIBVCXPROJ) $(VC11_SRCVCXPROJ) $(VC12_LIBVCXPROJ) $(VC12_SRCVCXPROJ) \
 $(VC14_LIBVCXPROJ) $(VC14_SRCVCXPROJ) $(VC15_LIBVCXPROJ) $(VC15_SRCVCXPROJ)
Changes to jni/curl/Makefile.in.
432
433
434
435
436
437
438



439
440

441
442
443
444
445
446
447
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
619
620
621
622
623
624
625










626
627
628
629

630
631
632
633
634
635
636
 projects/Windows/VC15/src/curl.vcxproj.filters     \
 projects/generate.bat                              \
 projects/wolfssl_options.h                         \
 projects/wolfssl_override.props

WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
 winbuild/MakefileBuild.vc winbuild/Makefile.vc











EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
 RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
 scripts/updatemanpages.pl $(CMAKE_DIST) $(VC_DIST) $(WINBUILD_DIST) \

 lib/libcurl.vers.in buildconf.bat scripts/coverage.sh scripts/completion.pl

CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
 $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \
 $(VC9_LIBVCPROJ) $(VC9_SRCVCPROJ) $(VC10_LIBVCXPROJ) $(VC10_SRCVCXPROJ) \
 $(VC11_LIBVCXPROJ) $(VC11_SRCVCXPROJ) $(VC12_LIBVCXPROJ) $(VC12_SRCVCXPROJ) \
 $(VC14_LIBVCXPROJ) $(VC14_SRCVCXPROJ) $(VC15_LIBVCXPROJ) $(VC15_SRCVCXPROJ)







>
>
>
>
>
>
>
>
>
>



|
>







623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
 projects/Windows/VC15/src/curl.vcxproj.filters     \
 projects/generate.bat                              \
 projects/wolfssl_options.h                         \
 projects/wolfssl_override.props

WINBUILD_DIST = winbuild/BUILD.WINDOWS.txt winbuild/gen_resp_file.bat \
 winbuild/MakefileBuild.vc winbuild/Makefile.vc

PLAN9_DIST = plan9/include/mkfile \
 plan9/include/mkfile             \
 plan9/mkfile.proto               \
 plan9/mkfile                     \
 plan9/BUILD.PLAN9.txt            \
 plan9/lib/mkfile.inc             \
 plan9/lib/mkfile                 \
 plan9/src/mkfile.inc             \
 plan9/src/mkfile

EXTRA_DIST = CHANGES COPYING maketgz Makefile.dist curl-config.in \
 RELEASE-NOTES buildconf libcurl.pc.in MacOSX-Framework \
 scripts/updatemanpages.pl $(CMAKE_DIST) \
 $(VC_DIST) $(WINBUILD_DIST) $(PLAN9_DIST) \
 lib/libcurl.vers.in buildconf.bat scripts/coverage.sh scripts/completion.pl

CLEANFILES = $(VC6_LIBDSP) $(VC6_SRCDSP) $(VC7_LIBVCPROJ) $(VC7_SRCVCPROJ) \
 $(VC71_LIBVCPROJ) $(VC71_SRCVCPROJ) $(VC8_LIBVCPROJ) $(VC8_SRCVCPROJ) \
 $(VC9_LIBVCPROJ) $(VC9_SRCVCPROJ) $(VC10_LIBVCXPROJ) $(VC10_SRCVCXPROJ) \
 $(VC11_LIBVCXPROJ) $(VC11_SRCVCXPROJ) $(VC12_LIBVCXPROJ) $(VC12_SRCVCXPROJ) \
 $(VC14_LIBVCXPROJ) $(VC14_SRCVCXPROJ) $(VC15_LIBVCXPROJ) $(VC15_SRCVCXPROJ)
652
653
654
655
656
657
658



659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
  vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c

LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h                \
  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h                \
  vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h          \
  vtls/mbedtls.h vtls/mesalink.h




LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
  cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c       \
  ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c         \
  getinfo.c transfer.c strcase.c easy.c security.c curl_fnmatch.c       \
  fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c \
  strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c  \
  http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c    \
  strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c         \
  inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c      \
  ssh.c ssh-libssh.c curl_addrinfo.c socks_gssapi.c socks_sspi.c        \
  curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c    \
  pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c        \
  openldap.c curl_gethostname.c gopher.c idn_win32.c                    \
  http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c      \
  http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c        \
  curl_multibyte.c hostcheck.c conncache.c dotdot.c                     \
  x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c      \







>
>
>









|







667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
  vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c

LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h                \
  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h                \
  vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h          \
  vtls/mbedtls.h vtls/mesalink.h

LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c
LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h
LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c
LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
  cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c       \
  ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c         \
  getinfo.c transfer.c strcase.c easy.c security.c curl_fnmatch.c       \
  fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c \
  strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c  \
  http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c    \
  strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c         \
  inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c      \
  curl_addrinfo.c socks_gssapi.c socks_sspi.c                           \
  curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c    \
  pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c        \
  openldap.c curl_gethostname.c gopher.c idn_win32.c                    \
  http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c      \
  http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c        \
  curl_multibyte.c hostcheck.c conncache.c dotdot.c                     \
  x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c      \
691
692
693
694
695
696
697
698
699
700
701


702


703
704
705
706
707
708
709
  curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h           \
  http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h             \
  curl_sasl.h curl_multibyte.h hostcheck.h conncache.h                  \
  curl_setup_once.h multihandle.h setup-vms.h dotdot.h                  \
  x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h           \
  curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h     \
  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h        \
  curl_get_line.h altsvc.h

LIB_RCFILES = libcurl.rc
CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES)


HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES)



# libcurl has sources that provide functions named curlx_* that aren't part of
# the official API, but we re-use the code here to avoid duplication.
CURLX_CFILES = \
  ../lib/strtoofft.c \
  ../lib/nonblock.c \
  ../lib/warnless.c \







|


|
>
>
|
>
>







709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
  curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h           \
  http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h             \
  curl_sasl.h curl_multibyte.h hostcheck.h conncache.h                  \
  curl_setup_once.h multihandle.h setup-vms.h dotdot.h                  \
  x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h           \
  curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h     \
  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h        \
  curl_get_line.h altsvc.h quic.h

LIB_RCFILES = libcurl.rc
CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES) \
  $(LIB_VQUIC_CFILES) $(LIB_VSSH_CFILES)

HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES) \
  $(LIB_VQUIC_HFILES)


# libcurl has sources that provide functions named curlx_* that aren't part of
# the official API, but we re-use the code here to avoid duplication.
CURLX_CFILES = \
  ../lib/strtoofft.c \
  ../lib/nonblock.c \
  ../lib/warnless.c \
744
745
746
747
748
749
750

751
752
753
754
755
756
757
  tool_metalink.c \
  tool_msgs.c \
  tool_operate.c \
  tool_operhlp.c \
  tool_panykey.c \
  tool_paramhlp.c \
  tool_parsecfg.c \

  tool_strdup.c \
  tool_setopt.c \
  tool_sleep.c \
  tool_urlglob.c \
  tool_util.c \
  tool_vms.c \
  tool_writeout.c \







>







766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
  tool_metalink.c \
  tool_msgs.c \
  tool_operate.c \
  tool_operhlp.c \
  tool_panykey.c \
  tool_paramhlp.c \
  tool_parsecfg.c \
  tool_progress.c \
  tool_strdup.c \
  tool_setopt.c \
  tool_sleep.c \
  tool_urlglob.c \
  tool_util.c \
  tool_vms.c \
  tool_writeout.c \
785
786
787
788
789
790
791

792
793
794
795
796
797
798
  tool_metalink.h \
  tool_msgs.h \
  tool_operate.h \
  tool_operhlp.h \
  tool_panykey.h \
  tool_paramhlp.h \
  tool_parsecfg.h \

  tool_sdecls.h \
  tool_setopt.h \
  tool_setup.h \
  tool_sleep.h \
  tool_strdup.h \
  tool_urlglob.h \
  tool_util.h \







>







808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
  tool_metalink.h \
  tool_msgs.h \
  tool_operate.h \
  tool_operhlp.h \
  tool_panykey.h \
  tool_paramhlp.h \
  tool_parsecfg.h \
  tool_progress.h \
  tool_sdecls.h \
  tool_setopt.h \
  tool_setup.h \
  tool_sleep.h \
  tool_strdup.h \
  tool_urlglob.h \
  tool_util.h \
Changes to jni/curl/RELEASE-NOTES.
1
2
3
4
5
6
7
8
9
10






11



















































































12
13
14
15
16
17
18
19


20








21
22
23
24
25
26
27




































































curl and libcurl 7.65.3

 Public curl releases:         184
 Command line options:         221
 curl_easy_setopt() options:   268
 Public functions in libcurl:  80
 Contributors:                 1991

This release includes the following bugfixes:







 o progress: make the progress meter appear again [1]




















































































This release includes the following known bugs:

 o see docs/KNOWN_BUGS (https://curl.haxx.se/docs/knownbugs.html)

This release would not have looked like this without help, code, reports and
advice from friends like these:



  Chih-Hsuan Yen, Daniel Stenberg,








  (2 contributors)

        Thanks! (and sorry if I forgot to mention someone)

References to bug reports and discussions on issues:

 [1] = https://curl.haxx.se/bug/?i=4122




































































|

|
|
|
|


|

>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>








>
>
|
>
>
>
>
>
>
>
>
|





|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
curl and libcurl 7.66.0

 Public curl releases:         185
 Command line options:         225
 curl_easy_setopt() options:   269
 Public functions in libcurl:  81
 Contributors:                 1991

This release includes the following changes:

 o CURLINFO_RETRY_AFTER: parse the Retry-After header value [35]
 o HTTP3: initial (experimental still not working) support [5]
 o curl: --sasl-authzid added to support CURLOPT_SASL_AUTHZID from the tool [27]
 o curl: support parallel transfers with -Z [4]
 o curl_multi_poll: a sister to curl_multi_wait() that waits more [28]
 o sasl: Implement SASL authorisation identity via CURLOPT_SASL_AUTHZID [27]

This release includes the following bugfixes:

 o CVE-2019-5481: FTP-KRB double-free [64]
 o CVE-2019-5482: TFTP small blocksize heap buffer overflow [65]
 o CI: remove duplicate configure flag for LGTM.com
 o CMake: remove needless newlines at end of gss variables
 o CMake: use platform dependent name for dlopen() library [62]
 o CURLINFO docs: mention that in redirects times are added [55]
 o CURLOPT_ALTSVC.3: use a "" file name to not load from a file
 o CURLOPT_ALTSVC_CTRL.3: remove CURLALTSVC_ALTUSED
 o CURLOPT_HEADERFUNCTION.3: clarify [54]
 o CURLOPT_HTTP_VERSION: seting this to 3 forces HTTP/3 use directly [33]
 o CURLOPT_READFUNCTION.3: provide inline example
 o CURLOPT_SSL_VERIFYHOST: treat the value 1 as 2 [51]
 o Curl_addr2string: take an addrlen argument too [61]
 o Curl_fillreadbuffer: avoid double-free trailer buf on error [66]
 o HTTP: use chunked Transfer-Encoding for HTTP_POST if size unknown [10]
 o alt-svc: add protocol version selection masking [31]
 o alt-svc: fix removal of expired cache entry [30]
 o alt-svc: make it use h3-22 with ngtcp2 as well
 o alt-svc: more liberal ALPN name parsing [17]
 o alt-svc: send Alt-Used: in redirected requests [32]
 o alt-svc: with quiche, use the quiche h3 alpn string [16]
 o appveyor: pass on -k to make
 o asyn-thread: create a socketpair to wait on [14]
 o build-openssl: fix build with Visual Studio 2019 [45]
 o cleanup: move functions out of url.c and make them static [58]
 o cleanup: remove the 'numsocks' argument used in many places [25]
 o configure: avoid undefined check_for_ca_bundle [37]
 o curl.h: add CURL_HTTP_VERSION_3 to the version enum
 o curl.h: fix outdated comment [23]
 o curl: cap the maximum allowed values for retry time arguments [13]
 o curl: handle a libcurl build without netrc support [63]
 o curl: make use of CURLINFO_RETRY_AFTER when retrying [35]
 o curl: remove outdated comment [24]
 o curl: use .curlrc (with a dot) on Windows [52]
 o curl: use CURLINFO_PROTOCOL to check for HTTP(s)
 o curl_global_init_mem.3: mention it was added in 7.12.0
 o curl_version: bump string buffer size to 250
 o curl_version_info.3: mentioned ALTSVC and HTTP3
 o curl_version_info: offer quic (and h3) library info [38]
 o curl_version_info: provide nghttp2 details [2]
 o defines: avoid underscore-prefixed defines [47]
 o docs/ALTSVC: remove what works and the experimental explanation [34]
 o docs/EXPERIMENTAL: explain what it means and what's experimental now
 o docs/MANUAL.md: converted to markdown from plain text [3]
 o docs/examples/curlx: fix errors [48]
 o docs: s/curl_debug/curl_dbg_debug in comments and docs [36]
 o easy: resize receive buffer on easy handle reset [9]
 o examples: Avoid reserved names in hiperfifo examples [8]
 o examples: add http3.c, altsvc.c and http3-present.c [40]
 o getenv: support up to 4K environment variable contents on windows [21]
 o http09: disable HTTP/0.9 by default in both tool and library [29]
 o http2: when marked for closure and wanted to close == OK [56]
 o http2_recv: trigger another read when the last data is returned [11]
 o http: fix use of credentials from URL when using HTTP proxy [44]
 o http_negotiate: improve handling of gss_init_sec_context() failures [18]
 o md4: Use our own MD4 when no crypto libraries are available [15]
 o multi: call detach_connection before Curl_disconnect [6]
 o netrc: make the code try ".netrc" on Windows [52]
 o nss: use TLSv1.3 as default if supported [39]
 o openssl: build warning free with boringssl [50]
 o openssl: use SSL_CTX_set_<min|max>_proto_version() when available [68]
 o plan9: add support for running on Plan 9 [22]
 o progress: reset download/uploaded counter between transfers [12]
 o readwrite_data: repair setting the TIMER_STARTTRANSFER stamp [26]
 o scp: fix directory name length used in memcpy [46]
 o smb: init *msg to NULL in smb_send_and_recv() [60]
 o smtp: check for and bail out on too short EHLO response [59]
 o source: remove names from source comments [1]
 o spnego_sspi: add typecast to fix build warning [49]
 o src/makefile: fix uncompressed hugehelp.c generation [19]
 o ssh-libssh: do not specify O_APPEND when not in append mode [7]
 o ssh: move code into vssh for SSH backends [53]
 o sspi: fix memory leaks [67]
 o tests: Replace outdated test case numbering documentation [43]
 o tftp: return error when packet is too small for options
 o timediff: make it 64 bit (if possible) even with 32 bit time_t [20]
 o travis: reduce number of torture tests in 'coverage' [42]
 o url: make use of new HTTP version if alt-svc has one [16]
 o urlapi: verify the IPv6 numerical address [69]
 o urldata: avoid 'generic', use dedicated pointers [57]
 o vauth: Use CURLE_AUTH_ERROR for auth function errors [41]

This release includes the following known bugs:

 o see docs/KNOWN_BUGS (https://curl.haxx.se/docs/knownbugs.html)

This release would not have looked like this without help, code, reports and
advice from friends like these:

  Alessandro Ghedini, Alex Mayorga, Amit Katyal, Balazs Kovacsics,
  Brad Spencer, Brandon Dong, Carlo Marcelo Arenas Belón, Christopher Head,
  Clément Notin, codesniffer13 on github, Daniel Gustafsson, Daniel Stenberg,
  Dominik Hölzl, Eric Wong, Felix Hädicke, Gergely Nagy, Gisle Vanem,
  Igor Makarov, Ironbars13 on github, Jason Lee, Jeremy Lainé,
  Jonathan Cardoso Machado, Junho Choi, Kamil Dudka, Kyle Abramowitz,
  Kyohei Kadota, Lance Ware, Marcel Raad, Max Dymond, Michael Lee,
  Michal Čaplygin, migueljcrum on github, Mike Crowe, niallor on github,
  osabc on github, patnyb on github, Patrick Monnerat, Peter Wu, Ray Satiro,
  Rolf Eike Beer, Steve Holme, Tatsuhiro Tsujikawa, The Infinnovation team,
  Thomas Vegas, Tom van der Woerdt, Yiming Jing,
  (46 contributors)

        Thanks! (and sorry if I forgot to mention someone)

References to bug reports and discussions on issues:

 [1] = https://curl.haxx.se/bug/?i=4129
 [2] = https://curl.haxx.se/bug/?i=4121
 [3] = https://curl.haxx.se/bug/?i=4131
 [4] = https://curl.haxx.se/bug/?i=3804
 [5] = https://curl.haxx.se/bug/?i=3500
 [6] = https://curl.haxx.se/bug/?i=4144
 [7] = https://curl.haxx.se/bug/?i=4147
 [8] = https://curl.haxx.se/bug/?i=4153
 [9] = https://curl.haxx.se/bug/?i=4143
 [10] = https://curl.haxx.se/bug/?i=4138
 [11] = https://curl.haxx.se/bug/?i=4043
 [12] = https://curl.haxx.se/bug/?i=4084
 [13] = https://curl.haxx.se/bug/?i=4166
 [14] = https://curl.haxx.se/bug/?i=4157
 [15] = https://curl.haxx.se/bug/?i=3780
 [16] = https://curl.haxx.se/bug/?i=4183
 [17] = https://curl.haxx.se/bug/?i=4182
 [18] = https://curl.haxx.se/bug/?i=3992
 [19] = https://curl.haxx.se/bug/?i=4176
 [20] = https://curl.haxx.se/bug/?i=4165
 [21] = https://curl.haxx.se/bug/?i=4174
 [22] = https://curl.haxx.se/bug/?i=3701
 [23] = https://curl.haxx.se/bug/?i=4167
 [24] = https://curl.haxx.se/bug/?i=4172
 [25] = https://curl.haxx.se/bug/?i=4169
 [26] = https://curl.haxx.se/bug/?i=4136
 [27] = https://curl.haxx.se/bug/?i=3653
 [28] = https://curl.haxx.se/bug/?i=4163
 [29] = https://curl.haxx.se/bug/?i=4191
 [30] = https://curl.haxx.se/bug/?i=4192
 [31] = https://curl.haxx.se/bug/?i=4201
 [32] = https://curl.haxx.se/bug/?i=4199
 [33] = https://curl.haxx.se/bug/?i=4197
 [34] = https://curl.haxx.se/bug/?i=4198
 [35] = https://curl.haxx.se/bug/?i=3794
 [36] = https://curl.haxx.se/bug/?i=3794
 [37] = https://curl.haxx.se/bug/?i=4213
 [38] = https://curl.haxx.se/bug/?i=4216
 [39] = https://curl.haxx.se/bug/?i=4187
 [40] = https://curl.haxx.se/bug/?i=4221
 [41] = https://curl.haxx.se/bug/?i=3848
 [42] = https://curl.haxx.se/bug/?i=4223
 [43] = https://curl.haxx.se/bug/?i=4227
 [44] = https://curl.haxx.se/bug/?i=4228
 [45] = https://curl.haxx.se/bug/?i=4188
 [46] = https://curl.haxx.se/bug/?i=4258
 [47] = https://curl.haxx.se/bug/?i=4254
 [48] = https://curl.haxx.se/bug/?i=4248
 [49] = https://curl.haxx.se/bug/?i=4245
 [50] = https://curl.haxx.se/bug/?i=4244
 [51] = https://curl.haxx.se/bug/?i=4241
 [52] = https://curl.haxx.se/bug/?i=4230
 [53] = https://curl.haxx.se/bug/?i=4235
 [54] = https://curl.haxx.se/bug/?i=4273
 [55] = https://curl.haxx.se/bug/?i=4250
 [56] = https://curl.haxx.se/bug/?i=4267
 [57] = https://curl.haxx.se/bug/?i=4290
 [58] = https://curl.haxx.se/bug/?i=4289
 [59] = https://curl.haxx.se/bug/?i=4287
 [60] = https://curl.haxx.se/bug/?i=4286
 [61] = https://curl.haxx.se/bug/?i=4283
 [62] = https://curl.haxx.se/bug/?i=4279
 [63] = https://curl.haxx.se/bug/?i=4302
 [64] = https://curl.haxx.se/docs/CVE-2019-5481.html
 [65] = https://curl.haxx.se/docs/CVE-2019-5482.html
 [66] = https://curl.haxx.se/bug/?i=4307
 [67] = https://curl.haxx.se/bug/?i=4299
 [68] = https://curl.haxx.se/bug/?i=4304
 [69] = https://curl.haxx.se/bug/?i=4315
Changes to jni/curl/configure.
901
902
903
904
905
906
907




908
909
910
911
912
913
914
USE_MANUAL_TRUE
MANOPT
NROFF
PERL
IPV6_ENABLED
FISH_FUNCTIONS_DIR
ZSH_FUNCTIONS_DIR




USE_NGHTTP2
IDN_ENABLED
CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_FALSE
CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_TRUE
CURL_LT_SHLIB_VERSIONED_FLAVOUR
USE_LIBRTMP
USE_LIBSSH







>
>
>
>







901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
USE_MANUAL_TRUE
MANOPT
NROFF
PERL
IPV6_ENABLED
FISH_FUNCTIONS_DIR
ZSH_FUNCTIONS_DIR
USE_QUICHE
USE_NGHTTP3
USE_NGTCP2_CRYPTO_OPENSSL
USE_NGTCP2
USE_NGHTTP2
IDN_ENABLED
CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_FALSE
CURL_LT_SHLIB_USE_VERSIONED_SYMBOLS_TRUE
CURL_LT_SHLIB_VERSIONED_FLAVOUR
USE_LIBRTMP
USE_LIBSSH
1184
1185
1186
1187
1188
1189
1190



1191
1192
1193
1194
1195
1196
1197
with_libssh2
with_libssh
with_librtmp
enable_versioned_symbols
with_winidn
with_libidn2
with_nghttp2



with_zsh_functions_dir
with_fish_functions_dir
enable_threaded_resolver
enable_pthreads
enable_verbose
enable_sspi
enable_crypto_auth







>
>
>







1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
with_libssh2
with_libssh
with_librtmp
enable_versioned_symbols
with_winidn
with_libidn2
with_nghttp2
with_ngtcp2
with_nghttp3
with_quiche
with_zsh_functions_dir
with_fish_functions_dir
enable_threaded_resolver
enable_pthreads
enable_verbose
enable_sspi
enable_crypto_auth
2063
2064
2065
2066
2067
2068
2069






2070
2071
2072
2073
2074
2075
2076
  --without-librtmp       disable LIBRTMP
  --with-winidn=PATH      enable Windows native IDN
  --without-winidn        disable Windows native IDN
  --with-libidn2=PATH     Enable libidn2 usage
  --without-libidn2       Disable libidn2 usage
  --with-nghttp2=PATH     Enable nghttp2 usage
  --without-nghttp2       Disable nghttp2 usage






  --with-zsh-functions-dir=PATH
                          Install zsh completions to PATH
  --without-zsh-functions-dir
                          Do not install zsh completions
  --with-fish-functions-dir=PATH
                          Install fish completions to PATH
  --without-fish-functions-dir







>
>
>
>
>
>







2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
  --without-librtmp       disable LIBRTMP
  --with-winidn=PATH      enable Windows native IDN
  --without-winidn        disable Windows native IDN
  --with-libidn2=PATH     Enable libidn2 usage
  --without-libidn2       Disable libidn2 usage
  --with-nghttp2=PATH     Enable nghttp2 usage
  --without-nghttp2       Disable nghttp2 usage
  --with-ngtcp2=PATH      Enable ngtcp2 usage
  --without-ngtcp2        Disable ngtcp2 usage
  --with-nghttp3=PATH     Enable nghttp3 usage
  --without-nghttp3       Disable nghttp3 usage
  --with-quiche=PATH      Enable quiche usage
  --without-quiche        Disable quiche usage
  --with-zsh-functions-dir=PATH
                          Install zsh completions to PATH
  --without-zsh-functions-dir
                          Do not install zsh completions
  --with-fish-functions-dir=PATH
                          Install fish completions to PATH
  --without-fish-functions-dir
25375
25376
25377
25378
25379
25380
25381
25382
25383
25384
25385
25386
25387
25388
25389
cat >>confdefs.h <<_ACEOF
#define CURL_DEFAULT_SSL_BACKEND "$DEFAULT_SSL_BACKEND"
_ACEOF

fi


if test "$check_for_ca_bundle" -gt 0; then


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking default CA cert bundle/path" >&5
$as_echo_n "checking default CA cert bundle/path... " >&6; }


# Check whether --with-ca-bundle was given.







|







25388
25389
25390
25391
25392
25393
25394
25395
25396
25397
25398
25399
25400
25401
25402
cat >>confdefs.h <<_ACEOF
#define CURL_DEFAULT_SSL_BACKEND "$DEFAULT_SSL_BACKEND"
_ACEOF

fi


if test -n "$check_for_ca_bundle"; then


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking default CA cert bundle/path" >&5
$as_echo_n "checking default CA cert bundle/path... " >&6; }


# Check whether --with-ca-bundle was given.
27624
27625
27626
27627
27628
27629
27630





































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































27631
27632
27633
27634
27635
27636
27637
        if test X"$want_h2" != Xdefault; then
                  as_fn_error $? "--with-nghttp2 was specified but could not find libnghttp2 pkg-config file." "$LINENO" 5
    fi
  fi

fi







































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































OPT_ZSH_FPATH=default

# Check whether --with-zsh-functions-dir was given.
if test "${with_zsh_functions_dir+set}" = set; then :
  withval=$with_zsh_functions_dir; OPT_ZSH_FPATH=$withval
fi







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







27637
27638
27639
27640
27641
27642
27643
27644
27645
27646
27647
27648
27649
27650
27651
27652
27653
27654
27655
27656
27657
27658
27659
27660
27661
27662
27663
27664
27665
27666
27667
27668
27669
27670
27671
27672
27673
27674
27675
27676
27677
27678
27679
27680
27681
27682
27683
27684
27685
27686
27687
27688
27689
27690
27691
27692
27693
27694
27695
27696
27697
27698
27699
27700
27701
27702
27703
27704
27705
27706
27707
27708
27709
27710
27711
27712
27713
27714
27715
27716
27717
27718
27719
27720
27721
27722
27723
27724
27725
27726
27727
27728
27729
27730
27731
27732
27733
27734
27735
27736
27737
27738
27739
27740
27741
27742
27743
27744
27745
27746
27747
27748
27749
27750
27751
27752
27753
27754
27755
27756
27757
27758
27759
27760
27761
27762
27763
27764
27765
27766
27767
27768
27769
27770
27771
27772
27773
27774
27775
27776
27777
27778
27779
27780
27781
27782
27783
27784
27785
27786
27787
27788
27789
27790
27791
27792
27793
27794
27795
27796
27797
27798
27799
27800
27801
27802
27803
27804
27805
27806
27807
27808
27809
27810
27811
27812
27813
27814
27815
27816
27817
27818
27819
27820
27821
27822
27823
27824
27825
27826
27827
27828
27829
27830
27831
27832
27833
27834
27835
27836
27837
27838
27839
27840
27841
27842
27843
27844
27845
27846
27847
27848
27849
27850
27851
27852
27853
27854
27855
27856
27857
27858
27859
27860
27861
27862
27863
27864
27865
27866
27867
27868
27869
27870
27871
27872
27873
27874
27875
27876
27877
27878
27879
27880
27881
27882
27883
27884
27885
27886
27887
27888
27889
27890
27891
27892
27893
27894
27895
27896
27897
27898
27899
27900
27901
27902
27903
27904
27905
27906
27907
27908
27909
27910
27911
27912
27913
27914
27915
27916
27917
27918
27919
27920
27921
27922
27923
27924
27925
27926
27927
27928
27929
27930
27931
27932
27933
27934
27935
27936
27937
27938
27939
27940
27941
27942
27943
27944
27945
27946
27947
27948
27949
27950
27951
27952
27953
27954
27955
27956
27957
27958
27959
27960
27961
27962
27963
27964
27965
27966
27967
27968
27969
27970
27971
27972
27973
27974
27975
27976
27977
27978
27979
27980
27981
27982
27983
27984
27985
27986
27987
27988
27989
27990
27991
27992
27993
27994
27995
27996
27997
27998
27999
28000
28001
28002
28003
28004
28005
28006
28007
28008
28009
28010
28011
28012
28013
28014
28015
28016
28017
28018
28019
28020
28021
28022
28023
28024
28025
28026
28027
28028
28029
28030
28031
28032
28033
28034
28035
28036
28037
28038
28039
28040
28041
28042
28043
28044
28045
28046
28047
28048
28049
28050
28051
28052
28053
28054
28055
28056
28057
28058
28059
28060
28061
28062
28063
28064
28065
28066
28067
28068
28069
28070
28071
28072
28073
28074
28075
28076
28077
28078
28079
28080
28081
28082
28083
28084
28085
28086
28087
28088
28089
28090
28091
28092
28093
28094
28095
28096
28097
28098
28099
28100
28101
28102
28103
28104
28105
28106
28107
28108
28109
28110
28111
28112
28113
28114
28115
28116
28117
28118
28119
28120
28121
28122
28123
28124
28125
28126
28127
28128
28129
28130
28131
28132
28133
28134
28135
28136
28137
28138
28139
28140
28141
28142
28143
28144
28145
28146
28147
28148
28149
28150
28151
28152
28153
28154
28155
28156
28157
28158
28159
28160
28161
28162
28163
28164
28165
28166
28167
28168
28169
28170
28171
28172
28173
28174
28175
28176
28177
28178
28179
28180
28181
28182
28183
28184
28185
28186
28187
28188
28189
28190
28191
28192
28193
28194
28195
28196
28197
28198
28199
28200
28201
28202
28203
28204
28205
28206
28207
28208
28209
28210
28211
28212
28213
28214
28215
28216
28217
28218
28219
28220
28221
28222
28223
28224
28225
28226
28227
28228
28229
28230
28231
28232
28233
28234
28235
28236
28237
28238
28239
28240
28241
28242
28243
28244
28245
28246
28247
28248
28249
28250
28251
28252
28253
28254
28255
28256
28257
28258
28259
28260
28261
28262
28263
28264
28265
28266
28267
28268
28269
28270
28271
28272
28273
28274
28275
28276
28277
28278
28279
28280
28281
28282
28283
28284
28285
28286
28287
28288
28289
28290
28291
28292
28293
28294
28295
28296
28297
28298
28299
28300
28301
28302
28303
28304
28305
28306
28307
28308
28309
28310
28311
28312
28313
28314
28315
28316
28317
28318
28319
28320
28321
28322
28323
28324
28325
28326
28327
28328
28329
28330
28331
28332
28333
28334
28335
28336
28337
28338
28339
28340
28341
28342
28343
28344
28345
28346
28347
28348
28349
28350
28351
28352
28353
28354
28355
28356
28357
28358
28359
28360
28361
28362
28363
28364
28365
28366
28367
28368
28369
28370
28371
28372
28373
28374
28375
28376
28377
28378
28379
28380
28381
28382
28383
28384
28385
28386
28387
28388
28389
28390
28391
28392
28393
28394
28395
28396
28397
28398
28399
28400
28401
28402
28403
28404
28405
28406
28407
28408
28409
28410
28411
28412
28413
28414
28415
28416
28417
28418
28419
28420
28421
28422
28423
28424
28425
28426
28427
28428
28429
28430
28431
28432
28433
28434
28435
28436
28437
28438
28439
28440
28441
28442
28443
28444
28445
28446
28447
28448
28449
28450
28451
28452
28453
28454
28455
28456
28457
28458
28459
28460
28461
28462
28463
28464
28465
28466
28467
28468
28469
28470
28471
28472
28473
28474
28475
28476
28477
28478
28479
28480
28481
28482
28483
28484
28485
28486
28487
28488
28489
28490
28491
28492
28493
28494
28495
28496
28497
28498
28499
28500
28501
28502
28503
28504
28505
28506
28507
28508
28509
28510
28511
28512
28513
28514
28515
28516
28517
28518
28519
28520
28521
28522
28523
28524
28525
28526
28527
28528
28529
28530
28531
28532
28533
28534
28535
28536
28537
28538
28539
28540
28541
28542
28543
28544
28545
28546
28547
28548
28549
28550
28551
28552
28553
28554
28555
28556
28557
28558
28559
28560
28561
28562
28563
28564
28565
28566
28567
28568
28569
28570
28571
28572
28573
28574
28575
28576
28577
28578
28579
28580
28581
28582
28583
28584
28585
28586
28587
28588
28589
28590
28591
28592
28593
28594
28595
28596
28597
28598
28599
28600
28601
28602
28603
28604
28605
28606
28607
28608
28609
28610
28611
28612
28613
28614
28615
28616
28617
28618
28619
28620
28621
28622
28623
28624
28625
28626
28627
28628
28629
28630
28631
28632
28633
28634
28635
28636
28637
28638
28639
28640
28641
28642
28643
28644
28645
28646
28647
28648
28649
28650
28651
28652
28653
28654
28655
28656
28657
28658
28659
28660
28661
28662
28663
28664
28665
28666
28667
28668
28669
28670
28671
28672
28673
28674
28675
28676
28677
28678
28679
28680
28681
28682
28683
28684
28685
28686
28687
28688
28689
28690
28691
28692
28693
28694
28695
28696
28697
28698
28699
28700
28701
28702
28703
28704
28705
28706
28707
28708
28709
28710
28711
        if test X"$want_h2" != Xdefault; then
                  as_fn_error $? "--with-nghttp2 was specified but could not find libnghttp2 pkg-config file." "$LINENO" 5
    fi
  fi

fi


OPT_TCP2="yes"
curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)"

if test "x$disable_http" = "xyes"; then
  # without HTTP, ngtcp2 is no use
  OPT_TCP2="no"
fi


# Check whether --with-ngtcp2 was given.
if test "${with_ngtcp2+set}" = set; then :
  withval=$with_ngtcp2; OPT_TCP2=$withval
fi

case "$OPT_TCP2" in
  no)
        want_tcp2="no"
    ;;
  yes)
        want_tcp2="default"
    want_tcp2_path=""
    ;;
  *)
        want_tcp2="yes"
    want_tcp2_path="$withval/lib/pkgconfig"
    ;;
esac

curl_tcp2_msg="disabled (--with-ngtcp2)"
if test X"$want_tcp2" != Xno; then
    CLEANLDFLAGS="$LDFLAGS"
  CLEANCPPFLAGS="$CPPFLAGS"
  CLEANLIBS="$LIBS"


    if test -n "$PKG_CONFIG"; then
      PKGCONFIG="$PKG_CONFIG"
    else
      if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PKGCONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $PKGCONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$PATH:/usr/bin:/usr/local/bin"
for as_dir in $as_dummy
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
PKGCONFIG=$ac_cv_path_PKGCONFIG
if test -n "$PKGCONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
$as_echo "$PKGCONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_path_PKGCONFIG"; then
  ac_pt_PKGCONFIG=$PKGCONFIG
  # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $ac_pt_PKGCONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$PATH:/usr/bin:/usr/local/bin"
for as_dir in $as_dummy
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
if test -n "$ac_pt_PKGCONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
$as_echo "$ac_pt_PKGCONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_pt_PKGCONFIG" = x; then
    PKGCONFIG="no"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    PKGCONFIG=$ac_pt_PKGCONFIG
  fi
else
  PKGCONFIG="$ac_cv_path_PKGCONFIG"
fi

    fi

    if test "x$PKGCONFIG" != "xno"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libngtcp2 options with pkg-config" >&5
$as_echo_n "checking for libngtcp2 options with pkg-config... " >&6; }
            itexists=`
    if test -n "$want_tcp2_path"; then
      PKG_CONFIG_LIBDIR="$want_tcp2_path"
      export PKG_CONFIG_LIBDIR
    fi
         $PKGCONFIG --exists libngtcp2 >/dev/null 2>&1 && echo 1`

      if test -z "$itexists"; then
                        PKGCONFIG="no"
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
$as_echo "found" >&6; }
      fi
    fi


  if test "$PKGCONFIG" != "no" ; then
    LIB_TCP2=`
    if test -n "$want_tcp2_path"; then
      PKG_CONFIG_LIBDIR="$want_tcp2_path"
      export PKG_CONFIG_LIBDIR
    fi

      $PKGCONFIG --libs-only-l libngtcp2`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_TCP2" >&5
$as_echo "$as_me: -l is $LIB_TCP2" >&6;}

    CPP_TCP2=`
    if test -n "$want_tcp2_path"; then
      PKG_CONFIG_LIBDIR="$want_tcp2_path"
      export PKG_CONFIG_LIBDIR
    fi
       $PKGCONFIG --cflags-only-I libngtcp2`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_TCP2" >&5
$as_echo "$as_me: -I is $CPP_TCP2" >&6;}

    LD_TCP2=`
    if test -n "$want_tcp2_path"; then
      PKG_CONFIG_LIBDIR="$want_tcp2_path"
      export PKG_CONFIG_LIBDIR
    fi

      $PKGCONFIG --libs-only-L libngtcp2`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_TCP2" >&5
$as_echo "$as_me: -L is $LD_TCP2" >&6;}

    LDFLAGS="$LDFLAGS $LD_TCP2"
    CPPFLAGS="$CPPFLAGS $CPP_TCP2"
    LIBS="$LIB_TCP2 $LIBS"

    if test "x$cross_compiling" != "xyes"; then
      DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/-L//'`
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_conn_client_new in -lngtcp2" >&5
$as_echo_n "checking for ngtcp2_conn_client_new in -lngtcp2... " >&6; }
if ${ac_cv_lib_ngtcp2_ngtcp2_conn_client_new+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lngtcp2  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#ifdef __cplusplus
extern "C"
#endif
char ngtcp2_conn_client_new ();
int main (void)
{
return ngtcp2_conn_client_new ();
 ;
 return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_ngtcp2_ngtcp2_conn_client_new=yes
else
  ac_cv_lib_ngtcp2_ngtcp2_conn_client_new=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_ngtcp2_conn_client_new" >&5
$as_echo "$ac_cv_lib_ngtcp2_ngtcp2_conn_client_new" >&6; }
if test "x$ac_cv_lib_ngtcp2_ngtcp2_conn_client_new" = xyes; then :

       for ac_header in ngtcp2/ngtcp2.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "ngtcp2/ngtcp2.h" "ac_cv_header_ngtcp2_ngtcp2_h" "$ac_includes_default"
if test "x$ac_cv_header_ngtcp2_ngtcp2_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NGTCP2_NGTCP2_H 1
_ACEOF
 NGTCP2_ENABLED=1

$as_echo "#define USE_NGTCP2 1" >>confdefs.h

          USE_NGTCP2=1

          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_TCP2"
          export CURL_LIBRARY_PATH
          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_TCP2 to CURL_LIBRARY_PATH" >&5
$as_echo "$as_me: Added $DIR_TCP2 to CURL_LIBRARY_PATH" >&6;}

fi

done


else
          LDFLAGS=$CLEANLDFLAGS
        CPPFLAGS=$CLEANCPPFLAGS
        LIBS=$CLEANLIBS

fi


  else
        if test X"$want_tcp2" != Xdefault; then
                  as_fn_error $? "--with-ngtcp2 was specified but could not find ngtcp2 pkg-config file." "$LINENO" 5
    fi
  fi

fi

if test "x$NGTCP2_ENABLED" = "x1"; then
    CLEANLDFLAGS="$LDFLAGS"
  CLEANCPPFLAGS="$CPPFLAGS"
  CLEANLIBS="$LIBS"


    if test -n "$PKG_CONFIG"; then
      PKGCONFIG="$PKG_CONFIG"
    else
      if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PKGCONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $PKGCONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$PATH:/usr/bin:/usr/local/bin"
for as_dir in $as_dummy
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
PKGCONFIG=$ac_cv_path_PKGCONFIG
if test -n "$PKGCONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
$as_echo "$PKGCONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_path_PKGCONFIG"; then
  ac_pt_PKGCONFIG=$PKGCONFIG
  # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $ac_pt_PKGCONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$PATH:/usr/bin:/usr/local/bin"
for as_dir in $as_dummy
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
if test -n "$ac_pt_PKGCONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
$as_echo "$ac_pt_PKGCONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_pt_PKGCONFIG" = x; then
    PKGCONFIG="no"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    PKGCONFIG=$ac_pt_PKGCONFIG
  fi
else
  PKGCONFIG="$ac_cv_path_PKGCONFIG"
fi

    fi

    if test "x$PKGCONFIG" != "xno"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libngtcp2_crypto_openssl options with pkg-config" >&5
$as_echo_n "checking for libngtcp2_crypto_openssl options with pkg-config... " >&6; }
            itexists=`
    if test -n "$want_tcp2_path"; then
      PKG_CONFIG_LIBDIR="$want_tcp2_path"
      export PKG_CONFIG_LIBDIR
    fi
         $PKGCONFIG --exists libngtcp2_crypto_openssl >/dev/null 2>&1 && echo 1`

      if test -z "$itexists"; then
                        PKGCONFIG="no"
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
$as_echo "found" >&6; }
      fi
    fi


  if test "$PKGCONFIG" != "no" ; then
    LIB_NGTCP2_CRYPTO_OPENSSL=`
    if test -n "$want_tcp2_path"; then
      PKG_CONFIG_LIBDIR="$want_tcp2_path"
      export PKG_CONFIG_LIBDIR
    fi

      $PKGCONFIG --libs-only-l libngtcp2_crypto_openssl`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_NGTCP2_CRYPTO_OPENSSL" >&5
$as_echo "$as_me: -l is $LIB_NGTCP2_CRYPTO_OPENSSL" >&6;}

    CPP_NGTCP2_CRYPTO_OPENSSL=`
    if test -n "$want_tcp2_path"; then
      PKG_CONFIG_LIBDIR="$want_tcp2_path"
      export PKG_CONFIG_LIBDIR
    fi
       $PKGCONFIG --cflags-only-I libngtcp2_crypto_openssl`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_NGTCP2_CRYPTO_OPENSSL" >&5
$as_echo "$as_me: -I is $CPP_NGTCP2_CRYPTO_OPENSSL" >&6;}

    LD_NGTCP2_CRYPTO_OPENSSL=`
    if test -n "$want_tcp2_path"; then
      PKG_CONFIG_LIBDIR="$want_tcp2_path"
      export PKG_CONFIG_LIBDIR
    fi

      $PKGCONFIG --libs-only-L libngtcp2_crypto_openssl`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_NGTCP2_CRYPTO_OPENSSL" >&5
$as_echo "$as_me: -L is $LD_NGTCP2_CRYPTO_OPENSSL" >&6;}

    LDFLAGS="$LDFLAGS $LD_NGTCP2_CRYPTO_OPENSSL"
    CPPFLAGS="$CPPFLAGS $CPP_NGTCP2_CRYPTO_OPENSSL"
    LIBS="$LIB_NGTCP2_CRYPTO_OPENSSL $LIBS"

    if test "x$cross_compiling" != "xyes"; then
      DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/-L//'`
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngtcp2_crypto_ctx_initial in -lngtcp2_crypto_openssl" >&5
$as_echo_n "checking for ngtcp2_crypto_ctx_initial in -lngtcp2_crypto_openssl... " >&6; }
if ${ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lngtcp2_crypto_openssl  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#ifdef __cplusplus
extern "C"
#endif
char ngtcp2_crypto_ctx_initial ();
int main (void)
{
return ngtcp2_crypto_ctx_initial ();
 ;
 return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial=yes
else
  ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial" >&5
$as_echo "$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial" >&6; }
if test "x$ac_cv_lib_ngtcp2_crypto_openssl_ngtcp2_crypto_ctx_initial" = xyes; then :

       for ac_header in ngtcp2/ngtcp2_crypto.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "ngtcp2/ngtcp2_crypto.h" "ac_cv_header_ngtcp2_ngtcp2_crypto_h" "$ac_includes_default"
if test "x$ac_cv_header_ngtcp2_ngtcp2_crypto_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NGTCP2_NGTCP2_CRYPTO_H 1
_ACEOF
 NGTCP2_ENABLED=1

$as_echo "#define USE_NGTCP2_CRYPTO_OPENSSL 1" >>confdefs.h

          USE_NGTCP2_CRYPTO_OPENSSL=1

          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGTCP2_CRYPTO_OPENSSL"
          export CURL_LIBRARY_PATH
          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_NGTCP2_CRYPTO_OPENSSL to CURL_LIBRARY_PATH" >&5
$as_echo "$as_me: Added $DIR_NGTCP2_CRYPTO_OPENSSL to CURL_LIBRARY_PATH" >&6;}

fi

done


else
          LDFLAGS=$CLEANLDFLAGS
        CPPFLAGS=$CLEANCPPFLAGS
        LIBS=$CLEANLIBS

fi


  else
        if test X"$want_tcp2" != Xdefault; then
                  as_fn_error $? "--with-ngtcp2 was specified but could not find ngtcp2_crypto_openssl pkg-config file." "$LINENO" 5
    fi
  fi
fi


OPT_NGHTTP3="yes"

if test "x$NGTCP2_ENABLED" = "x"; then
  # without ngtcp2, nghttp3 is of no use for us
  OPT_NGHTTP3="no"
fi


# Check whether --with-nghttp3 was given.
if test "${with_nghttp3+set}" = set; then :
  withval=$with_nghttp3; OPT_NGHTTP3=$withval
fi

case "$OPT_NGHTTP3" in
  no)
        want_nghttp3="no"
    ;;
  yes)
        want_nghttp3="default"
    want_nghttp3_path=""
    ;;
  *)
        want_nghttp3="yes"
    want_nghttp3_path="$withval/lib/pkgconfig"
    ;;
esac

curl_http3_msg="disabled (--with-nghttp3)"
if test X"$want_nghttp3" != Xno; then
    CLEANLDFLAGS="$LDFLAGS"
  CLEANCPPFLAGS="$CPPFLAGS"
  CLEANLIBS="$LIBS"


    if test -n "$PKG_CONFIG"; then
      PKGCONFIG="$PKG_CONFIG"
    else
      if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PKGCONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $PKGCONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$PATH:/usr/bin:/usr/local/bin"
for as_dir in $as_dummy
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
PKGCONFIG=$ac_cv_path_PKGCONFIG
if test -n "$PKGCONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
$as_echo "$PKGCONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_path_PKGCONFIG"; then
  ac_pt_PKGCONFIG=$PKGCONFIG
  # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $ac_pt_PKGCONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$PATH:/usr/bin:/usr/local/bin"
for as_dir in $as_dummy
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
if test -n "$ac_pt_PKGCONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
$as_echo "$ac_pt_PKGCONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_pt_PKGCONFIG" = x; then
    PKGCONFIG="no"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    PKGCONFIG=$ac_pt_PKGCONFIG
  fi
else
  PKGCONFIG="$ac_cv_path_PKGCONFIG"
fi

    fi

    if test "x$PKGCONFIG" != "xno"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libnghttp3 options with pkg-config" >&5
$as_echo_n "checking for libnghttp3 options with pkg-config... " >&6; }
            itexists=`
    if test -n "$want_nghttp3_path"; then
      PKG_CONFIG_LIBDIR="$want_nghttp3_path"
      export PKG_CONFIG_LIBDIR
    fi
         $PKGCONFIG --exists libnghttp3 >/dev/null 2>&1 && echo 1`

      if test -z "$itexists"; then
                        PKGCONFIG="no"
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
$as_echo "found" >&6; }
      fi
    fi


  if test "$PKGCONFIG" != "no" ; then
    LIB_NGHTTP3=`
    if test -n "$want_nghttp3_path"; then
      PKG_CONFIG_LIBDIR="$want_nghttp3_path"
      export PKG_CONFIG_LIBDIR
    fi

      $PKGCONFIG --libs-only-l libnghttp3`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_NGHTTP3" >&5
$as_echo "$as_me: -l is $LIB_NGHTTP3" >&6;}

    CPP_NGHTTP3=`
    if test -n "$want_nghttp3_path"; then
      PKG_CONFIG_LIBDIR="$want_nghttp3_path"
      export PKG_CONFIG_LIBDIR
    fi
       $PKGCONFIG --cflags-only-I libnghttp3`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_NGHTTP3" >&5
$as_echo "$as_me: -I is $CPP_NGHTTP3" >&6;}

    LD_NGHTTP3=`
    if test -n "$want_nghttp3_path"; then
      PKG_CONFIG_LIBDIR="$want_nghttp3_path"
      export PKG_CONFIG_LIBDIR
    fi

      $PKGCONFIG --libs-only-L libnghttp3`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_NGHTTP3" >&5
$as_echo "$as_me: -L is $LD_NGHTTP3" >&6;}

    LDFLAGS="$LDFLAGS $LD_NGHTTP3"
    CPPFLAGS="$CPPFLAGS $CPP_NGHTTP3"
    LIBS="$LIB_NGHTTP3 $LIBS"

    if test "x$cross_compiling" != "xyes"; then
      DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/-L//'`
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nghttp3_conn_client_new in -lnghttp3" >&5
$as_echo_n "checking for nghttp3_conn_client_new in -lnghttp3... " >&6; }
if ${ac_cv_lib_nghttp3_nghttp3_conn_client_new+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lnghttp3  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#ifdef __cplusplus
extern "C"
#endif
char nghttp3_conn_client_new ();
int main (void)
{
return nghttp3_conn_client_new ();
 ;
 return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_nghttp3_nghttp3_conn_client_new=yes
else
  ac_cv_lib_nghttp3_nghttp3_conn_client_new=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nghttp3_nghttp3_conn_client_new" >&5
$as_echo "$ac_cv_lib_nghttp3_nghttp3_conn_client_new" >&6; }
if test "x$ac_cv_lib_nghttp3_nghttp3_conn_client_new" = xyes; then :

       for ac_header in nghttp3/nghttp3.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "nghttp3/nghttp3.h" "ac_cv_header_nghttp3_nghttp3_h" "$ac_includes_default"
if test "x$ac_cv_header_nghttp3_nghttp3_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NGHTTP3_NGHTTP3_H 1
_ACEOF
 curl_h3_msg="enabled (ngtcp2 + nghttp3)"
          NGHTTP3_ENABLED=1

$as_echo "#define USE_NGHTTP3 1" >>confdefs.h

          USE_NGHTTP3=1

          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGHTTP3"
          export CURL_LIBRARY_PATH
          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_NGHTTP3 to CURL_LIBRARY_PATH" >&5
$as_echo "$as_me: Added $DIR_NGHTTP3 to CURL_LIBRARY_PATH" >&6;}
          experimental="$experimental HTTP3"

fi

done


else
          LDFLAGS=$CLEANLDFLAGS
        CPPFLAGS=$CLEANCPPFLAGS
        LIBS=$CLEANLIBS

fi


  else
        if test X"$want_nghttp3" != Xdefault; then
                  as_fn_error $? "--with-nghttp3 was specified but could not find nghttp3 pkg-config file." "$LINENO" 5
    fi
  fi

fi


OPT_QUICHE="yes"

if test "x$disable_http" = "xyes" -o "x$USE_NGTCP" = "x1"; then
  # without HTTP or with ngtcp2, quiche is no use
  OPT_QUICHE="no"
fi


# Check whether --with-quiche was given.
if test "${with_quiche+set}" = set; then :
  withval=$with_quiche; OPT_QUICHE=$withval
fi

case "$OPT_QUICHE" in
  no)
        want_quiche="no"
    ;;
  yes)
        want_quiche="default"
    want_quiche_path=""
    ;;
  *)
        want_quiche="yes"
    want_quiche_path="$withval"
    ;;
esac

if test X"$want_quiche" != Xno; then
    CLEANLDFLAGS="$LDFLAGS"
  CLEANCPPFLAGS="$CPPFLAGS"
  CLEANLIBS="$LIBS"


    if test -n "$PKG_CONFIG"; then
      PKGCONFIG="$PKG_CONFIG"
    else
      if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PKGCONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $PKGCONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$PATH:/usr/bin:/usr/local/bin"
for as_dir in $as_dummy
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
PKGCONFIG=$ac_cv_path_PKGCONFIG
if test -n "$PKGCONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5
$as_echo "$PKGCONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_path_PKGCONFIG"; then
  ac_pt_PKGCONFIG=$PKGCONFIG
  # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_PKGCONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $ac_pt_PKGCONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_PKGCONFIG="$ac_pt_PKGCONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="$PATH:/usr/bin:/usr/local/bin"
for as_dir in $as_dummy
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
ac_pt_PKGCONFIG=$ac_cv_path_ac_pt_PKGCONFIG
if test -n "$ac_pt_PKGCONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKGCONFIG" >&5
$as_echo "$ac_pt_PKGCONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_pt_PKGCONFIG" = x; then
    PKGCONFIG="no"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    PKGCONFIG=$ac_pt_PKGCONFIG
  fi
else
  PKGCONFIG="$ac_cv_path_PKGCONFIG"
fi

    fi

    if test "x$PKGCONFIG" != "xno"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quiche options with pkg-config" >&5
$as_echo_n "checking for quiche options with pkg-config... " >&6; }
            itexists=`
    if test -n "$want_quiche_path"; then
      PKG_CONFIG_LIBDIR="$want_quiche_path"
      export PKG_CONFIG_LIBDIR
    fi
         $PKGCONFIG --exists quiche >/dev/null 2>&1 && echo 1`

      if test -z "$itexists"; then
                        PKGCONFIG="no"
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
$as_echo "found" >&6; }
      fi
    fi


  if test "$PKGCONFIG" != "no" ; then
    LIB_QUICHE=`
    if test -n "$want_quiche_path"; then
      PKG_CONFIG_LIBDIR="$want_quiche_path"
      export PKG_CONFIG_LIBDIR
    fi

      $PKGCONFIG --libs-only-l quiche`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -l is $LIB_QUICHE" >&5
$as_echo "$as_me: -l is $LIB_QUICHE" >&6;}

    CPP_QUICHE=`
    if test -n "$want_quiche_path"; then
      PKG_CONFIG_LIBDIR="$want_quiche_path"
      export PKG_CONFIG_LIBDIR
    fi
       $PKGCONFIG --cflags-only-I quiche`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -I is $CPP_QUICHE" >&5
$as_echo "$as_me: -I is $CPP_QUICHE" >&6;}

    LD_QUICHE=`
    if test -n "$want_quiche_path"; then
      PKG_CONFIG_LIBDIR="$want_quiche_path"
      export PKG_CONFIG_LIBDIR
    fi

      $PKGCONFIG --libs-only-L quiche`
    { $as_echo "$as_me:${as_lineno-$LINENO}: -L is $LD_QUICHE" >&5
$as_echo "$as_me: -L is $LD_QUICHE" >&6;}

    LDFLAGS="$LDFLAGS $LD_QUICHE"
    CPPFLAGS="$CPPFLAGS $CPP_QUICHE"
    LIBS="$LIB_QUICHE $LIBS"

    if test "x$cross_compiling" != "xyes"; then
      DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/-L//'`
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for quiche_connect in -lquiche" >&5
$as_echo_n "checking for quiche_connect in -lquiche... " >&6; }
if ${ac_cv_lib_quiche_quiche_connect+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lquiche  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#ifdef __cplusplus
extern "C"
#endif
char quiche_connect ();
int main (void)
{
return quiche_connect ();
 ;
 return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_quiche_quiche_connect=yes
else
  ac_cv_lib_quiche_quiche_connect=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_quiche_quiche_connect" >&5
$as_echo "$ac_cv_lib_quiche_quiche_connect" >&6; }
if test "x$ac_cv_lib_quiche_quiche_connect" = xyes; then :

       for ac_header in quiche.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "quiche.h" "ac_cv_header_quiche_h" "$ac_includes_default"
if test "x$ac_cv_header_quiche_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_QUICHE_H 1
_ACEOF
 experimental="$experimental HTTP3"
          { $as_echo "$as_me:${as_lineno-$LINENO}: HTTP3 support is experimental" >&5
$as_echo "$as_me: HTTP3 support is experimental" >&6;}
          curl_h3_msg="enabled (quiche)"
          QUICHE_ENABLED=1

$as_echo "#define USE_QUICHE 1" >>confdefs.h

          USE_QUICHE=1

          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_QUICHE"
          export CURL_LIBRARY_PATH
          { $as_echo "$as_me:${as_lineno-$LINENO}: Added $DIR_QUICHE to CURL_LIBRARY_PATH" >&5
$as_echo "$as_me: Added $DIR_QUICHE to CURL_LIBRARY_PATH" >&6;}
fi

done


else
          LDFLAGS=$CLEANLDFLAGS
        CPPFLAGS=$CLEANCPPFLAGS
        LIBS=$CLEANLIBS

fi

  else
        if test X"$want_quiche" != Xdefault; then
                  as_fn_error $? "--with-quiche was specified but could not find quiche pkg-config file." "$LINENO" 5
    fi
  fi
fi


OPT_ZSH_FPATH=default

# Check whether --with-zsh-functions-dir was given.
if test "${with_zsh_functions_dir+set}" = set; then :
  withval=$with_zsh_functions_dir; OPT_ZSH_FPATH=$withval
fi
40304
40305
40306
40307
40308
40309
40310

40311
40312
40313
40314
40315
40316
40317
  gettimeofday \
  if_nametoindex \
  mach_absolute_time \
  pipe \
  setlocale \
  setmode \
  setrlimit \

  utime \
  utimes

do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :







>







41378
41379
41380
41381
41382
41383
41384
41385
41386
41387
41388
41389
41390
41391
41392
  gettimeofday \
  if_nametoindex \
  mach_absolute_time \
  pipe \
  setlocale \
  setmode \
  setrlimit \
  usleep \
  utime \
  utimes

do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
41526
41527
41528
41529
41530
41531
41532
41533
41534
41535
41536
41537
41538
41539
41540
41541
41542
41543
41544
41545
41546
41547
41548
41549
41550
41551
41552
41553
41554
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
       ;;
  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
       curl_altsvc_msg="enabled";
       enable_altsvc="yes"
       experimental="alt-svc"
       ;;
  esac
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

fi


if test "$enable_altsvc" = "yes"; then

$as_echo "#define USE_ALTSVC 1" >>confdefs.h

  experimental="alt-svc"
fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether hiding of library internal symbols will actually happen" >&5
$as_echo_n "checking whether hiding of library internal symbols will actually happen... " >&6; }
  CFLAG_CURL_SYMBOL_HIDING=""
  doing_symbol_hiding="no"







<













|







42601
42602
42603
42604
42605
42606
42607

42608
42609
42610
42611
42612
42613
42614
42615
42616
42617
42618
42619
42620
42621
42622
42623
42624
42625
42626
42627
42628
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
       ;;
  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
       curl_altsvc_msg="enabled";
       enable_altsvc="yes"

       ;;
  esac
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

fi


if test "$enable_altsvc" = "yes"; then

$as_echo "#define USE_ALTSVC 1" >>confdefs.h

  experimental="$experimental alt-svc"
fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether hiding of library internal symbols will actually happen" >&5
$as_echo_n "checking whether hiding of library internal symbols will actually happen... " >&6; }
  CFLAG_CURL_SYMBOL_HIDING=""
  doing_symbol_hiding="no"
41671
41672
41673
41674
41675
41676
41677




41678
41679
41680
41681
41682
41683
41684
if test "x$USE_TLS_SRP" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES TLS-SRP"
fi

if test "x$USE_NGHTTP2" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
fi





if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
fi

if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
    -o "x$NSS_ENABLED" = "x1"; then







>
>
>
>







42745
42746
42747
42748
42749
42750
42751
42752
42753
42754
42755
42756
42757
42758
42759
42760
42761
42762
if test "x$USE_TLS_SRP" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES TLS-SRP"
fi

if test "x$USE_NGHTTP2" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
fi

if test "x$USE_NGTCP2" = "x1" -o "x$USE_QUICHE" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP3"
fi

if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
fi

if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
    -o "x$NSS_ENABLED" = "x1"; then
44651
44652
44653
44654
44655
44656
44657

44658
44659
44660
44661
44662
44663
44664
  LDAPS:            ${curl_ldaps_msg}
  RTSP:             ${curl_rtsp_msg}
  RTMP:             ${curl_rtmp_msg}
  Metalink:         ${curl_mtlnk_msg}
  PSL:              ${curl_psl_msg}
  Alt-svc:          ${curl_altsvc_msg}
  HTTP2:            ${curl_h2_msg}

  Protocols:        ${SUPPORT_PROTOCOLS}
  Features:         ${SUPPORT_FEATURES}
" >&5
$as_echo "$as_me: Configured to build curl/libcurl:

  Host setup:       ${host}
  Install prefix:   ${prefix}







>







45729
45730
45731
45732
45733
45734
45735
45736
45737
45738
45739
45740
45741
45742
45743
  LDAPS:            ${curl_ldaps_msg}
  RTSP:             ${curl_rtsp_msg}
  RTMP:             ${curl_rtmp_msg}
  Metalink:         ${curl_mtlnk_msg}
  PSL:              ${curl_psl_msg}
  Alt-svc:          ${curl_altsvc_msg}
  HTTP2:            ${curl_h2_msg}
  HTTP3:            ${curl_h3_msg}
  Protocols:        ${SUPPORT_PROTOCOLS}
  Features:         ${SUPPORT_FEATURES}
" >&5
$as_echo "$as_me: Configured to build curl/libcurl:

  Host setup:       ${host}
  Install prefix:   ${prefix}
44692
44693
44694
44695
44696
44697
44698

44699
44700
44701
44702
44703
44704
44705
44706
  LDAPS:            ${curl_ldaps_msg}
  RTSP:             ${curl_rtsp_msg}
  RTMP:             ${curl_rtmp_msg}
  Metalink:         ${curl_mtlnk_msg}
  PSL:              ${curl_psl_msg}
  Alt-svc:          ${curl_altsvc_msg}
  HTTP2:            ${curl_h2_msg}

  Protocols:        ${SUPPORT_PROTOCOLS}
  Features:         ${SUPPORT_FEATURES}
" >&6;}
if test -n "$experimental"; then
 cat >&2 << _EOF
  WARNING: $experimental is enabled but marked EXPERIMENTAL. Use with caution!
_EOF
fi







>





|


45771
45772
45773
45774
45775
45776
45777
45778
45779
45780
45781
45782
45783
45784
45785
45786
  LDAPS:            ${curl_ldaps_msg}
  RTSP:             ${curl_rtsp_msg}
  RTMP:             ${curl_rtmp_msg}
  Metalink:         ${curl_mtlnk_msg}
  PSL:              ${curl_psl_msg}
  Alt-svc:          ${curl_altsvc_msg}
  HTTP2:            ${curl_h2_msg}
  HTTP3:            ${curl_h3_msg}
  Protocols:        ${SUPPORT_PROTOCOLS}
  Features:         ${SUPPORT_FEATURES}
" >&6;}
if test -n "$experimental"; then
 cat >&2 << _EOF
  WARNING: $experimental enabled but marked EXPERIMENTAL. Use with caution!
_EOF
fi
Changes to jni/curl/configure.ac.
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
  AC_DEFINE_UNQUOTED([CURL_DEFAULT_SSL_BACKEND], ["$DEFAULT_SSL_BACKEND"], [Default SSL backend])
fi

dnl **********************************************************************
dnl Check for the CA bundle
dnl **********************************************************************

if test "$check_for_ca_bundle" -gt 0; then
  CURL_CHECK_CA_BUNDLE
fi

dnl **********************************************************************
dnl Check for libpsl
dnl **********************************************************************








|







2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
  AC_DEFINE_UNQUOTED([CURL_DEFAULT_SSL_BACKEND], ["$DEFAULT_SSL_BACKEND"], [Default SSL backend])
fi

dnl **********************************************************************
dnl Check for the CA bundle
dnl **********************************************************************

if test -n "$check_for_ca_bundle"; then
  CURL_CHECK_CA_BUNDLE
fi

dnl **********************************************************************
dnl Check for libpsl
dnl **********************************************************************

3332
3333
3334
3335
3336
3337
3338





































































































































































































































































































































3339
3340
3341
3342
3343
3344
3345
      dnl To avoid link errors, we do not allow --with-nghttp2 without
      dnl a pkgconfig file
      AC_MSG_ERROR([--with-nghttp2 was specified but could not find libnghttp2 pkg-config file.])
    fi
  fi

fi






































































































































































































































































































































dnl **********************************************************************
dnl Check for zsh completion path
dnl **********************************************************************

OPT_ZSH_FPATH=default
AC_ARG_WITH(zsh-functions-dir,







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
      dnl To avoid link errors, we do not allow --with-nghttp2 without
      dnl a pkgconfig file
      AC_MSG_ERROR([--with-nghttp2 was specified but could not find libnghttp2 pkg-config file.])
    fi
  fi

fi

dnl **********************************************************************
dnl Check for ngtcp2 (QUIC)
dnl **********************************************************************

OPT_TCP2="yes"
curl_h3_msg="disabled (--with-ngtcp2, --with-quiche)"

if test "x$disable_http" = "xyes"; then
  # without HTTP, ngtcp2 is no use
  OPT_TCP2="no"
fi

AC_ARG_WITH(ngtcp2,
AC_HELP_STRING([--with-ngtcp2=PATH],[Enable ngtcp2 usage])
AC_HELP_STRING([--without-ngtcp2],[Disable ngtcp2 usage]),
  [OPT_TCP2=$withval])
case "$OPT_TCP2" in
  no)
    dnl --without-ngtcp2 option used
    want_tcp2="no"
    ;;
  yes)
    dnl --with-ngtcp2 option used without path
    want_tcp2="default"
    want_tcp2_path=""
    ;;
  *)
    dnl --with-ngtcp2 option used with path
    want_tcp2="yes"
    want_tcp2_path="$withval/lib/pkgconfig"
    ;;
esac

curl_tcp2_msg="disabled (--with-ngtcp2)"
if test X"$want_tcp2" != Xno; then
  dnl backup the pre-ngtcp2 variables
  CLEANLDFLAGS="$LDFLAGS"
  CLEANCPPFLAGS="$CPPFLAGS"
  CLEANLIBS="$LIBS"

  CURL_CHECK_PKGCONFIG(libngtcp2, $want_tcp2_path)

  if test "$PKGCONFIG" != "no" ; then
    LIB_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path])
      $PKGCONFIG --libs-only-l libngtcp2`
    AC_MSG_NOTICE([-l is $LIB_TCP2])

    CPP_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path]) dnl
      $PKGCONFIG --cflags-only-I libngtcp2`
    AC_MSG_NOTICE([-I is $CPP_TCP2])

    LD_TCP2=`CURL_EXPORT_PCDIR([$want_tcp2_path])
      $PKGCONFIG --libs-only-L libngtcp2`
    AC_MSG_NOTICE([-L is $LD_TCP2])

    LDFLAGS="$LDFLAGS $LD_TCP2"
    CPPFLAGS="$CPPFLAGS $CPP_TCP2"
    LIBS="$LIB_TCP2 $LIBS"

    if test "x$cross_compiling" != "xyes"; then
      DIR_TCP2=`echo $LD_TCP2 | $SED -e 's/-L//'`
    fi
    AC_CHECK_LIB(ngtcp2, ngtcp2_conn_client_new,
      [
       AC_CHECK_HEADERS(ngtcp2/ngtcp2.h,
          NGTCP2_ENABLED=1
          AC_DEFINE(USE_NGTCP2, 1, [if ngtcp2 is in use])
          AC_SUBST(USE_NGTCP2, [1])
          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_TCP2"
          export CURL_LIBRARY_PATH
          AC_MSG_NOTICE([Added $DIR_TCP2 to CURL_LIBRARY_PATH])
       )
      ],
        dnl not found, revert back to clean variables
        LDFLAGS=$CLEANLDFLAGS
        CPPFLAGS=$CLEANCPPFLAGS
        LIBS=$CLEANLIBS
    )

  else
    dnl no ngtcp2 pkg-config found, deal with it
    if test X"$want_tcp2" != Xdefault; then
      dnl To avoid link errors, we do not allow --with-ngtcp2 without
      dnl a pkgconfig file
      AC_MSG_ERROR([--with-ngtcp2 was specified but could not find ngtcp2 pkg-config file.])
    fi
  fi

fi

if test "x$NGTCP2_ENABLED" = "x1"; then
  dnl backup the pre-ngtcp2_crypto_openssl variables
  CLEANLDFLAGS="$LDFLAGS"
  CLEANCPPFLAGS="$CPPFLAGS"
  CLEANLIBS="$LIBS"

  CURL_CHECK_PKGCONFIG(libngtcp2_crypto_openssl, $want_tcp2_path)

  if test "$PKGCONFIG" != "no" ; then
    LIB_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path])
      $PKGCONFIG --libs-only-l libngtcp2_crypto_openssl`
    AC_MSG_NOTICE([-l is $LIB_NGTCP2_CRYPTO_OPENSSL])

    CPP_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path]) dnl
      $PKGCONFIG --cflags-only-I libngtcp2_crypto_openssl`
    AC_MSG_NOTICE([-I is $CPP_NGTCP2_CRYPTO_OPENSSL])

    LD_NGTCP2_CRYPTO_OPENSSL=`CURL_EXPORT_PCDIR([$want_tcp2_path])
      $PKGCONFIG --libs-only-L libngtcp2_crypto_openssl`
    AC_MSG_NOTICE([-L is $LD_NGTCP2_CRYPTO_OPENSSL])

    LDFLAGS="$LDFLAGS $LD_NGTCP2_CRYPTO_OPENSSL"
    CPPFLAGS="$CPPFLAGS $CPP_NGTCP2_CRYPTO_OPENSSL"
    LIBS="$LIB_NGTCP2_CRYPTO_OPENSSL $LIBS"

    if test "x$cross_compiling" != "xyes"; then
      DIR_NGTCP2_CRYPTO_OPENSSL=`echo $LD_NGTCP2_CRYPTO_OPENSSL | $SED -e 's/-L//'`
    fi
    AC_CHECK_LIB(ngtcp2_crypto_openssl, ngtcp2_crypto_ctx_initial,
      [
       AC_CHECK_HEADERS(ngtcp2/ngtcp2_crypto.h,
          NGTCP2_ENABLED=1
          AC_DEFINE(USE_NGTCP2_CRYPTO_OPENSSL, 1, [if ngtcp2_crypto_openssl is in use])
          AC_SUBST(USE_NGTCP2_CRYPTO_OPENSSL, [1])
          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGTCP2_CRYPTO_OPENSSL"
          export CURL_LIBRARY_PATH
          AC_MSG_NOTICE([Added $DIR_NGTCP2_CRYPTO_OPENSSL to CURL_LIBRARY_PATH])
       )
      ],
        dnl not found, revert back to clean variables
        LDFLAGS=$CLEANLDFLAGS
        CPPFLAGS=$CLEANCPPFLAGS
        LIBS=$CLEANLIBS
    )

  else
    dnl no ngtcp2_crypto_openssl pkg-config found, deal with it
    if test X"$want_tcp2" != Xdefault; then
      dnl To avoid link errors, we do not allow --with-ngtcp2 without
      dnl a pkgconfig file
      AC_MSG_ERROR([--with-ngtcp2 was specified but could not find ngtcp2_crypto_openssl pkg-config file.])
    fi
  fi
fi

dnl **********************************************************************
dnl Check for nghttp3 (HTTP/3 with ngtcp2)
dnl **********************************************************************

OPT_NGHTTP3="yes"

if test "x$NGTCP2_ENABLED" = "x"; then
  # without ngtcp2, nghttp3 is of no use for us
  OPT_NGHTTP3="no"
fi

AC_ARG_WITH(nghttp3,
AC_HELP_STRING([--with-nghttp3=PATH],[Enable nghttp3 usage])
AC_HELP_STRING([--without-nghttp3],[Disable nghttp3 usage]),
  [OPT_NGHTTP3=$withval])
case "$OPT_NGHTTP3" in
  no)
    dnl --without-nghttp3 option used
    want_nghttp3="no"
    ;;
  yes)
    dnl --with-nghttp3 option used without path
    want_nghttp3="default"
    want_nghttp3_path=""
    ;;
  *)
    dnl --with-nghttp3 option used with path
    want_nghttp3="yes"
    want_nghttp3_path="$withval/lib/pkgconfig"
    ;;
esac

curl_http3_msg="disabled (--with-nghttp3)"
if test X"$want_nghttp3" != Xno; then
  dnl backup the pre-nghttp3 variables
  CLEANLDFLAGS="$LDFLAGS"
  CLEANCPPFLAGS="$CPPFLAGS"
  CLEANLIBS="$LIBS"

  CURL_CHECK_PKGCONFIG(libnghttp3, $want_nghttp3_path)

  if test "$PKGCONFIG" != "no" ; then
    LIB_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path])
      $PKGCONFIG --libs-only-l libnghttp3`
    AC_MSG_NOTICE([-l is $LIB_NGHTTP3])

    CPP_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path]) dnl
      $PKGCONFIG --cflags-only-I libnghttp3`
    AC_MSG_NOTICE([-I is $CPP_NGHTTP3])

    LD_NGHTTP3=`CURL_EXPORT_PCDIR([$want_nghttp3_path])
      $PKGCONFIG --libs-only-L libnghttp3`
    AC_MSG_NOTICE([-L is $LD_NGHTTP3])

    LDFLAGS="$LDFLAGS $LD_NGHTTP3"
    CPPFLAGS="$CPPFLAGS $CPP_NGHTTP3"
    LIBS="$LIB_NGHTTP3 $LIBS"

    if test "x$cross_compiling" != "xyes"; then
      DIR_NGHTTP3=`echo $LD_NGHTTP3 | $SED -e 's/-L//'`
    fi
    AC_CHECK_LIB(nghttp3, nghttp3_conn_client_new,
      [
       AC_CHECK_HEADERS(nghttp3/nghttp3.h,
          curl_h3_msg="enabled (ngtcp2 + nghttp3)"
          NGHTTP3_ENABLED=1
          AC_DEFINE(USE_NGHTTP3, 1, [if nghttp3 is in use])
          AC_SUBST(USE_NGHTTP3, [1])
          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_NGHTTP3"
          export CURL_LIBRARY_PATH
          AC_MSG_NOTICE([Added $DIR_NGHTTP3 to CURL_LIBRARY_PATH])
          experimental="$experimental HTTP3"
       )
      ],
        dnl not found, revert back to clean variables
        LDFLAGS=$CLEANLDFLAGS
        CPPFLAGS=$CLEANCPPFLAGS
        LIBS=$CLEANLIBS
    )

  else
    dnl no nghttp3 pkg-config found, deal with it
    if test X"$want_nghttp3" != Xdefault; then
      dnl To avoid link errors, we do not allow --with-nghttp3 without
      dnl a pkgconfig file
      AC_MSG_ERROR([--with-nghttp3 was specified but could not find nghttp3 pkg-config file.])
    fi
  fi

fi

dnl **********************************************************************
dnl Check for quiche (QUIC)
dnl **********************************************************************

OPT_QUICHE="yes"

if test "x$disable_http" = "xyes" -o "x$USE_NGTCP" = "x1"; then
  # without HTTP or with ngtcp2, quiche is no use
  OPT_QUICHE="no"
fi

AC_ARG_WITH(quiche,
AC_HELP_STRING([--with-quiche=PATH],[Enable quiche usage])
AC_HELP_STRING([--without-quiche],[Disable quiche usage]),
  [OPT_QUICHE=$withval])
case "$OPT_QUICHE" in
  no)
    dnl --without-quiche option used
    want_quiche="no"
    ;;
  yes)
    dnl --with-quiche option used without path
    want_quiche="default"
    want_quiche_path=""
    ;;
  *)
    dnl --with-quiche option used with path
    want_quiche="yes"
    want_quiche_path="$withval"
    ;;
esac

if test X"$want_quiche" != Xno; then
  dnl backup the pre-quiche variables
  CLEANLDFLAGS="$LDFLAGS"
  CLEANCPPFLAGS="$CPPFLAGS"
  CLEANLIBS="$LIBS"

  CURL_CHECK_PKGCONFIG(quiche, $want_quiche_path)

  if test "$PKGCONFIG" != "no" ; then
    LIB_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path])
      $PKGCONFIG --libs-only-l quiche`
    AC_MSG_NOTICE([-l is $LIB_QUICHE])

    CPP_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path]) dnl
      $PKGCONFIG --cflags-only-I quiche`
    AC_MSG_NOTICE([-I is $CPP_QUICHE])

    LD_QUICHE=`CURL_EXPORT_PCDIR([$want_quiche_path])
      $PKGCONFIG --libs-only-L quiche`
    AC_MSG_NOTICE([-L is $LD_QUICHE])

    LDFLAGS="$LDFLAGS $LD_QUICHE"
    CPPFLAGS="$CPPFLAGS $CPP_QUICHE"
    LIBS="$LIB_QUICHE $LIBS"

    if test "x$cross_compiling" != "xyes"; then
      DIR_QUICHE=`echo $LD_QUICHE | $SED -e 's/-L//'`
    fi
    AC_CHECK_LIB(quiche, quiche_connect,
      [
       AC_CHECK_HEADERS(quiche.h,
          experimental="$experimental HTTP3"
          AC_MSG_NOTICE([HTTP3 support is experimental])
          curl_h3_msg="enabled (quiche)"
          QUICHE_ENABLED=1
          AC_DEFINE(USE_QUICHE, 1, [if quiche is in use])
          AC_SUBST(USE_QUICHE, [1])
          CURL_LIBRARY_PATH="$CURL_LIBRARY_PATH:$DIR_QUICHE"
          export CURL_LIBRARY_PATH
          AC_MSG_NOTICE([Added $DIR_QUICHE to CURL_LIBRARY_PATH]),
       )
      ],
        dnl not found, revert back to clean variables
        LDFLAGS=$CLEANLDFLAGS
        CPPFLAGS=$CLEANCPPFLAGS
        LIBS=$CLEANLIBS
    )
  else
    dnl no nghttp3 pkg-config found, deal with it
    if test X"$want_quiche" != Xdefault; then
      dnl To avoid link errors, we do not allow --with-nghttp3 without
      dnl a pkgconfig file
      AC_MSG_ERROR([--with-quiche was specified but could not find quiche pkg-config file.])
    fi
  fi
fi

dnl **********************************************************************
dnl Check for zsh completion path
dnl **********************************************************************

OPT_ZSH_FPATH=default
AC_ARG_WITH(zsh-functions-dir,
3667
3668
3669
3670
3671
3672
3673

3674
3675
3676
3677
3678
3679
3680
  gettimeofday \
  if_nametoindex \
  mach_absolute_time \
  pipe \
  setlocale \
  setmode \
  setrlimit \

  utime \
  utimes
],[
],[
  func="$ac_func"
  eval skipcheck=\$skipcheck_$func
  if test "x$skipcheck" != "xyes"; then







>







3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
  gettimeofday \
  if_nametoindex \
  mach_absolute_time \
  pipe \
  setlocale \
  setmode \
  setrlimit \
  usleep \
  utime \
  utimes
],[
],[
  func="$ac_func"
  eval skipcheck=\$skipcheck_$func
  if test "x$skipcheck" != "xyes"; then
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
[ case "$enableval" in
  no)
       AC_MSG_RESULT(no)
       ;;
  *) AC_MSG_RESULT(yes)
       curl_altsvc_msg="enabled";
       enable_altsvc="yes"
       experimental="alt-svc"
       ;;
  esac ],
       AC_MSG_RESULT(no)
)

if test "$enable_altsvc" = "yes"; then
  AC_DEFINE(USE_ALTSVC, 1, [to enable alt-svc])
  experimental="alt-svc"
fi

dnl ************************************************************
dnl hiding of library internal symbols
dnl
CURL_CONFIGURE_SYMBOL_HIDING








<







|







4483
4484
4485
4486
4487
4488
4489

4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
[ case "$enableval" in
  no)
       AC_MSG_RESULT(no)
       ;;
  *) AC_MSG_RESULT(yes)
       curl_altsvc_msg="enabled";
       enable_altsvc="yes"

       ;;
  esac ],
       AC_MSG_RESULT(no)
)

if test "$enable_altsvc" = "yes"; then
  AC_DEFINE(USE_ALTSVC, 1, [to enable alt-svc])
  experimental="$experimental alt-svc"
fi

dnl ************************************************************
dnl hiding of library internal symbols
dnl
CURL_CONFIGURE_SYMBOL_HIDING

4275
4276
4277
4278
4279
4280
4281




4282
4283
4284
4285
4286
4287
4288
if test "x$USE_TLS_SRP" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES TLS-SRP"
fi

if test "x$USE_NGHTTP2" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
fi





if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
fi

if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
    -o "x$NSS_ENABLED" = "x1"; then







>
>
>
>







4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
if test "x$USE_TLS_SRP" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES TLS-SRP"
fi

if test "x$USE_NGHTTP2" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP2"
fi

if test "x$USE_NGTCP2" = "x1" -o "x$USE_QUICHE" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES HTTP3"
fi

if test "x$CURL_WITH_MULTI_SSL" = "x1"; then
  SUPPORT_FEATURES="$SUPPORT_FEATURES MultiSSL"
fi

if test "x$OPENSSL_ENABLED" = "x1" -o "x$GNUTLS_ENABLED" = "x1" \
    -o "x$NSS_ENABLED" = "x1"; then
4467
4468
4469
4470
4471
4472
4473

4474
4475
4476
4477
4478
4479
4480
4481
  LDAPS:            ${curl_ldaps_msg}
  RTSP:             ${curl_rtsp_msg}
  RTMP:             ${curl_rtmp_msg}
  Metalink:         ${curl_mtlnk_msg}
  PSL:              ${curl_psl_msg}
  Alt-svc:          ${curl_altsvc_msg}
  HTTP2:            ${curl_h2_msg}

  Protocols:        ${SUPPORT_PROTOCOLS}
  Features:         ${SUPPORT_FEATURES}
])
if test -n "$experimental"; then
 cat >&2 << _EOF
  WARNING: $experimental is enabled but marked EXPERIMENTAL. Use with caution!
_EOF
fi







>





|


4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
  LDAPS:            ${curl_ldaps_msg}
  RTSP:             ${curl_rtsp_msg}
  RTMP:             ${curl_rtmp_msg}
  Metalink:         ${curl_mtlnk_msg}
  PSL:              ${curl_psl_msg}
  Alt-svc:          ${curl_altsvc_msg}
  HTTP2:            ${curl_h2_msg}
  HTTP3:            ${curl_h3_msg}
  Protocols:        ${SUPPORT_PROTOCOLS}
  Features:         ${SUPPORT_FEATURES}
])
if test -n "$experimental"; then
 cat >&2 << _EOF
  WARNING: $experimental enabled but marked EXPERIMENTAL. Use with caution!
_EOF
fi
Changes to jni/curl/docs/ALTSVC.md.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

37
38
39
40
41
42
43
44
45
46
47
48
49
50

51

52
53
54
55
56
57
58
59
# Alt-Svc

curl features **EXPERIMENTAL** support for the Alt-Svc: HTTP header.

## Experimental

Experimental support in curl means:

1. Experimental features are provided to allow users to try them out and
   provide feedback on functionality and API etc before they ship and get
   "carved in stone".
2. You must enable the feature when invoking configure as otherwise curl will
   not be built with the feature present.
3. We strongly advice against using this feature in production.
4. **We reserve the right to change behavior** of the feature without sticking
   to our API/ABI rules as we do for regular features, as long as it is marked
   experimental.
5. Experimental features are clearly marked so in documentation. Beware.

## Enable Alt-Svc in build

`./configure --enable-alt-svc`

## Standard

[RFC 7838](https://tools.ietf.org/html/rfc7838)

## What works

- read alt-svc file from disk
- write alt-svc file from disk
- parse `Alt-Svc:` response headers, including `ma`, `clear` and `persist`.
- replaces old entries when new alternatives are received
- unit tests to verify most of this functionality (test 1654)
- act on `Alt-Svc:` response headers
- build conditionally on `configure --enable-alt-svc` only, feature marked as

  **EXPERIMENTAL**
- implement `CURLOPT_ALTSVC_CTRL`
- implement `CURLOPT_ALTSVC`
- document  `CURLOPT_ALTSVC_CTRL`
- document `CURLOPT_ALTSVC`
- document `--alt-svc`
- add `CURL_VERSION_ALTSVC`
- make `curl -V` show 'alt-svc' as a feature if built-in
- support `curl --alt-svc [file]` to enable caching, using that file
- make `tests/runtests.pl` able to filter tests on the feature `alt-svc`
- actually use the existing in-memory alt-svc cache for outgoing connections
- alt-svc cache expiry
- test 355 and 356 verify curl acting on Alt-Svc, received from header and
  loaded from cache. The latter needs a debug build since it enables Alt-Svc

  for plain HTTP.


## What is left

- handle multiple response headers, when one of them says `clear` (should
  override them all)
- using `Age:` value for caching age as per spec
- `CURLALTSVC_IMMEDIATELY` support
- `CURLALTSVC_ALTUSED` support




<
<
<
<
<
<
<
<
<
<
<
<
<
<
<








|

|
|
|
|
|
|
|
>
|
<
|
|
|
|
<
<
<
<
<
|
<
|
>
|
>

|





<
1
2
3
4















5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

24
25
26
27





28

29
30
31
32
33
34
35
36
37
38
39

# Alt-Svc

curl features **EXPERIMENTAL** support for the Alt-Svc: HTTP header.
















## Enable Alt-Svc in build

`./configure --enable-alt-svc`

## Standard

[RFC 7838](https://tools.ietf.org/html/rfc7838)

# Alt-Svc cache file format

This a text based file with one line per entry and each line consists of nine
space separated fields.

## Example

    h2 quic.tech 8443 h3-22 quic.tech 8443 "20190808 06:18:37" 0 0

## Fields


1. The ALPN id for the source origin
2. The host name for the source origin
3. The port number for the source origin
4. The ALPN id for the destination host





5. The host name for the destination host

6. The host number for the destination host
7. The expiration date and time of this entry withing double quotes. The date format is "YYYYMMDD HH:MM:SS" and the time zone is GMT.
8. Boolean (1 or 0) if "persist" was set for this entry
9. Integer priority value (not currently used)

# TODO

- handle multiple response headers, when one of them says `clear` (should
  override them all)
- using `Age:` value for caching age as per spec
- `CURLALTSVC_IMMEDIATELY` support

Changes to jni/curl/docs/DEPRECATE.md.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Items to be removed from future curl releases

If any of these deprecated features is a cause for concern for you, please
email the curl-library mailing list as soon as possible and explain to us why
this is a problem for you and how your use case can't be satisfied properly
using a work around.

## HTTP/0.9

Supporting this is non-obvious and might even come as a surprise to some
users. Potentially even being a security risk in some cases.

### State

curl 7.64.0 introduces options to disable/enable support for this protocol
version. The default remains supported for now.

### Removal

The support for HTTP/0.9 will be switched to disabled by default in 6 months,
in the September 2019 release (possibly called curl 7.68.0).

## PolarSSL

The polarssl TLS library has not had an update in over three years. The last
release was done on [January 7
2016](https://tls.mbed.org/tech-updates/releases). This library has been
superseded by the mbedTLS library, which is the current incarnation of
PolarSSL. curl has supported mbedTLS since 2015.







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







1
2
3
4
5
6
7















8
9
10
11
12
13
14
# Items to be removed from future curl releases

If any of these deprecated features is a cause for concern for you, please
email the curl-library mailing list as soon as possible and explain to us why
this is a problem for you and how your use case can't be satisfied properly
using a work around.
















## PolarSSL

The polarssl TLS library has not had an update in over three years. The last
release was done on [January 7
2016](https://tls.mbed.org/tech-updates/releases). This library has been
superseded by the mbedTLS library, which is the current incarnation of
PolarSSL. curl has supported mbedTLS since 2015.
Added jni/curl/docs/EXPERIMENTAL.md.












































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Experimental

Some features and functionality in curl and libcurl are considered
**EXPERIMENTAL**.

Experimental support in curl means:

1. Experimental features are provided to allow users to try them out and
   provide feedback on functionality and API etc before they ship and get
   "carved in stone".
2. You must enable the feature when invoking configure as otherwise curl will
   not be built with the feature present.
3. We strongly advice against using this feature in production.
4. **We reserve the right to change behavior** of the feature without sticking
   to our API/ABI rules as we do for regular features, as long as it is marked
   experimental.
5. Experimental features are clearly marked so in documentation. Beware.

## Experimental features right now

 - HTTP/3 support and options
 - alt-svc support and options
Added jni/curl/docs/HTTP3.md.


















































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# HTTP3 (and QUIC)

## Resources

[HTTP/3 Explained](https://daniel.haxx.se/http3-explained/) - the online free
book describing the protocols involved.

[QUIC implementation](https://github.com/curl/curl/wiki/QUIC-implementation) -
the wiki page describing the plan for how to support QUIC and HTTP/3 in curl
and libcurl.

[quicwg.org](https://quicwg.org/) - home of the official protocol drafts

## QUIC libraries

QUIC libraries we're experiementing with:

[ngtcp2](https://github.com/ngtcp2/ngtcp2)

[quiche](https://github.com/cloudflare/quiche)

## Experimental!

HTTP/3 and QUIC support in curl is considered **EXPERIMENTAL** until further
notice. It needs to be enabled at build-time.

Further development and tweaking of the HTTP/3 support in curl will happen in
in the master branch using pull-requests, just like ordinary changes.

# ngtcp2 version

## Build

Build (patched) OpenSSL

     % git clone --depth 1 -b openssl-quic-draft-22 https://github.com/tatsuhiro-t/openssl
     % cd openssl
     % ./config enable-tls1_3 --prefix=<somewhere1>
     % make
     % make install_sw

Build nghttp3

     % cd ..
     % git clone https://github.com/ngtcp2/nghttp3
     % cd nghttp3
     % autoreconf -i
     % ./configure --prefix=<somewhere2> --enable-lib-only
     % make
     % make install

Build ngtcp2

     % cd ..
     % git clone -b draft-22 https://github.com/ngtcp2/ngtcp2
     % cd ngtcp2
     % autoreconf -i
     % ./configure PKG_CONFIG_PATH=<somewhere1>/lib/pkgconfig:<somewhere2>/lib/pkgconfig LDFLAGS="-Wl,-rpath,<somehere1>/lib" --prefix==<somewhere3>
     % make
     % make install

Build curl

     % cd ..
     % git clone https://github.com/curl/curl
     % cd curl
     % ./buildconf
     % LDFLAGS="-Wl,-rpath,<somewhere1>/lib" ./configure -with-ssl=<somewhere1> --with-nghttp3=<somewhere2> --with-ngtcp2=<somewhere3>
     % make

## Running

Make sure the custom OpenSSL library is the one used at run-time, as otherwise
you'll just get ld.so linker errors.

## Invoke from command line

    curl --http3 https://nghttp2.org:8443/

# quiche version

## build

Clone quiche and BoringSSL:

     % git clone --recursive https://github.com/cloudflare/quiche

Build BoringSSL (it needs to be built manually so it can be reused with curl):

     % cd quiche/deps/boringssl
     % mkdir build
     % cd build
     % cmake -DCMAKE_POSITION_INDEPENDENT_CODE=on ..
     % make -j`nproc`
     % cd ..
     % mkdir .openssl/lib -p
     % cp build/crypto/libcrypto.a build/ssl/libssl.a .openssl/lib
     % ln -s $PWD/include .openssl

Build quiche:

     % cd ../..
     % QUICHE_BSSL_PATH=$PWD/deps/boringssl cargo build --release --features pkg-config-meta

Clone and build curl:

     % cd ..
     % git clone https://github.com/curl/curl
     % cd curl
     % ./buildconf
     % ./configure LDFLAGS="-Wl,-rpath,$PWD/../quiche/target/release" --with-ssl=$PWD/../quiche/deps/boringssl/.openssl --with-quiche=$PWD/../quiche/target/release
     % make -j`nproc`

## Running

Make an HTTP/3 request.

     % src/curl --http3 https://cloudflare-quic.com/
     % src/curl --http3 https://facebook.com/
     % src/curl --http3 https://quic.aiortc.org:4433/
     % src/curl --http3 https://quic.rocks:4433/
Changes to jni/curl/docs/INTERNALS.md.
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783

  This will create a library that has memory debugging enabled.

## Modify Your Application

  Add a line in your application code:

       `curl_memdebug("dump");`

  This will make the malloc debug system output a full trace of all resource
  using functions to the given file name. Make sure you rebuild your program
  and that you link with the same libcurl you built for this purpose as
  described above.

## Run Your Application







|







769
770
771
772
773
774
775
776
777
778
779
780
781
782
783

  This will create a library that has memory debugging enabled.

## Modify Your Application

  Add a line in your application code:

       `curl_dbg_memdebug("dump");`

  This will make the malloc debug system output a full trace of all resource
  using functions to the given file name. Make sure you rebuild your program
  and that you link with the same libcurl you built for this purpose as
  described above.

## Run Your Application
Changes to jni/curl/docs/KNOWN_BUGS.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
These are problems and bugs known to exist at the time of this release. Feel
free to join in and help us correct one or more of these! Also be sure to
check the changelog of the current development status, as one or more of these
problems may have been fixed or changed somewhat since this was written!

 1. HTTP
 1.1 CURLFORM_CONTENTLEN in an array
 1.2 Disabling HTTP Pipelining
 1.3 STARTTRANSFER time is wrong for HTTP POSTs
 1.4 multipart formposts file name encoding
 1.5 Expect-100 meets 417
 1.6 Unnecessary close when 401 received waiting for 100
 1.7 Deflate error after all content was received
 1.8 DoH isn't used for all name resolves when enabled
 1.9 HTTP/2 frames while in the connection pool kill reuse
 1.10 Strips trailing dot from host name
 1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM

 2. TLS
 2.1 CURLINFO_SSL_VERIFYRESULT has limited support
 2.2 DER in keychain
 2.3 GnuTLS backend skips really long certificate fields
 2.4 DarwinSSL won't import PKCS#12 client certificates without a password







<







<







9
10
11
12
13
14
15

16
17
18
19
20
21
22

23
24
25
26
27
28
29
These are problems and bugs known to exist at the time of this release. Feel
free to join in and help us correct one or more of these! Also be sure to
check the changelog of the current development status, as one or more of these
problems may have been fixed or changed somewhat since this was written!

 1. HTTP
 1.1 CURLFORM_CONTENTLEN in an array

 1.3 STARTTRANSFER time is wrong for HTTP POSTs
 1.4 multipart formposts file name encoding
 1.5 Expect-100 meets 417
 1.6 Unnecessary close when 401 received waiting for 100
 1.7 Deflate error after all content was received
 1.8 DoH isn't used for all name resolves when enabled
 1.9 HTTP/2 frames while in the connection pool kill reuse

 1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM

 2. TLS
 2.1 CURLINFO_SSL_VERIFYRESULT has limited support
 2.2 DER in keychain
 2.3 GnuTLS backend skips really long certificate fields
 2.4 DarwinSSL won't import PKCS#12 client certificates without a password
44
45
46
47
48
49
50

51
52
53
54
55
56
57
 4.1 -J and -O with %-encoded file names
 4.2 -J with -C - fails
 4.3 --retry and transfer timeouts
 4.4 --upload-file . hang if delay in STDIN
 4.5 Improve --data-urlencode space encoding

 5. Build and portability issues

 5.2 curl-config --libs contains private details
 5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10
 5.4 Cannot compile against a static build of OpenLDAP
 5.5 can't handle Unicode arguments in Windows
 5.6 cmake support gaps
 5.7 Visual Studio project gaps
 5.8 configure finding libs in wrong directory







>







42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 4.1 -J and -O with %-encoded file names
 4.2 -J with -C - fails
 4.3 --retry and transfer timeouts
 4.4 --upload-file . hang if delay in STDIN
 4.5 Improve --data-urlencode space encoding

 5. Build and portability issues
 5.1 USE_UNIX_SOCKETS on Windows
 5.2 curl-config --libs contains private details
 5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10
 5.4 Cannot compile against a static build of OpenLDAP
 5.5 can't handle Unicode arguments in Windows
 5.6 cmake support gaps
 5.7 Visual Studio project gaps
 5.8 configure finding libs in wrong directory
94
95
96
97
98
99
100

101
102
103
104
105
106
107
 11. Internals
 11.1 Curl leaks .onion hostnames in DNS
 11.2 error buffer not set if connection to multiple addresses fails
 11.3 c-ares deviates from stock resolver on http://1346569778
 11.4 HTTP test server 'connection-monitor' problems
 11.5 Connection information when using TCP Fast Open
 11.6 slow connect to localhost on Windows


 12. LDAP and OpenLDAP
 12.1 OpenLDAP hangs after returning results

 13. TCP/IP
 13.1 --interface for ipv6 binds to unusable IP address








>







93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 11. Internals
 11.1 Curl leaks .onion hostnames in DNS
 11.2 error buffer not set if connection to multiple addresses fails
 11.3 c-ares deviates from stock resolver on http://1346569778
 11.4 HTTP test server 'connection-monitor' problems
 11.5 Connection information when using TCP Fast Open
 11.6 slow connect to localhost on Windows
 11.7 signal-based resolver timeouts

 12. LDAP and OpenLDAP
 12.1 OpenLDAP hangs after returning results

 13. TCP/IP
 13.1 --interface for ipv6 binds to unusable IP address

117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
 It is not possible to pass a 64-bit value using CURLFORM_CONTENTLEN with
 CURLFORM_ARRAY, when compiled on 32-bit platforms that support 64-bit
 integers. This is because the underlying structure 'curl_forms' uses a dual
 purpose char* for storing these values in via casting. For more information
 see the now closed related issue:
 https://github.com/curl/curl/issues/608

1.2 Disabling HTTP Pipelining

 Disabling HTTP Pipelining when there are ongoing transfers can lead to
 heap corruption and crash. https://curl.haxx.se/bug/view.cgi?id=1411

 Similarly, removing a handle when pipelining corrupts data:
 https://github.com/curl/curl/issues/2101

1.3 STARTTRANSFER time is wrong for HTTP POSTs

 Wrong STARTTRANSFER timer accounting for POST requests Timer works fine with
 GET requests, but while using POST the time for CURLINFO_STARTTRANSFER_TIME
 is wrong. While using POST CURLINFO_STARTTRANSFER_TIME minus
 CURLINFO_PRETRANSFER_TIME is near to zero every time.








<
<
<
<
<
<
<
<







117
118
119
120
121
122
123








124
125
126
127
128
129
130
 It is not possible to pass a 64-bit value using CURLFORM_CONTENTLEN with
 CURLFORM_ARRAY, when compiled on 32-bit platforms that support 64-bit
 integers. This is because the underlying structure 'curl_forms' uses a dual
 purpose char* for storing these values in via casting. For more information
 see the now closed related issue:
 https://github.com/curl/curl/issues/608









1.3 STARTTRANSFER time is wrong for HTTP POSTs

 Wrong STARTTRANSFER timer accounting for POST requests Timer works fine with
 GET requests, but while using POST the time for CURLINFO_STARTTRANSFER_TIME
 is wrong. While using POST CURLINFO_STARTTRANSFER_TIME minus
 CURLINFO_PRETRANSFER_TIME is near to zero every time.

185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
 curl while the connection is held in curl's connection pool, the socket will
 be found readable when considered for reuse and that makes curl think it is
 dead and then it will be closed and a new connection gets created instead.

 This is *best* fixed by adding monitoring to connections while they are kept
 in the pool so that pings can be responded to appropriately.

1.10 Strips trailing dot from host name

 When given a URL with a trailing dot for the host name part:
 "https://example.com./", libcurl will strip off the dot and use the name
 without a dot internally and send it dot-less in HTTP Host: headers and in
 the TLS SNI field. For the purpose of resolving the name to an address
 the hostname is used as is without any change.

 The HTTP part violates RFC 7230 section 5.4 but the SNI part is accordance
 with RFC 6066 section 3.

 URLs using these trailing dots are very rare in the wild and we have not seen
 or gotten any real-world problems with such URLs reported. The popular
 browsers seem to have stayed with not stripping the dot for both uses (thus
 they violate RFC 6066 instead of RFC 7230).

 Daniel took the discussion to the HTTPbis mailing list in March 2016:
 https://lists.w3.org/Archives/Public/ietf-http-wg/2016JanMar/0430.html but
 there was not major rush or interest to fix this. The impression I get is
 that most HTTP people rather not rock the boat now and instead prioritize web
 compatibility rather than to strictly adhere to these RFCs.

 Our current approach allows a knowing client to send a custom HTTP header
 with the dot added.

 In a few cases there is a difference in name resolving to IP addresses with
 a trailing dot, but it can be noted that many HTTP servers will not happily
 accept the trailing dot there unless that has been specifically configured
 to be a fine virtual host.

 If URLs with trailing dots for host names become more popular or even just
 used more than for just plain fun experiments, I'm sure we will have reason
 to go back and reconsider.

 See https://github.com/curl/curl/issues/716 for the discussion.

1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM

 I'm using libcurl to POST form data using a FILE* with the CURLFORM_STREAM
 option of curl_formadd(). I've noticed that if the connection drops at just
 the right time, the POST is reattempted without the data from the file. It
 seems like the file stream position isn't getting reset to the beginning of
 the file. I found the CURLOPT_SEEKFUNCTION option and set that with a







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







177
178
179
180
181
182
183




































184
185
186
187
188
189
190
 curl while the connection is held in curl's connection pool, the socket will
 be found readable when considered for reuse and that makes curl think it is
 dead and then it will be closed and a new connection gets created instead.

 This is *best* fixed by adding monitoring to connections while they are kept
 in the pool so that pings can be responded to appropriately.





































1.11 CURLOPT_SEEKFUNCTION not called with CURLFORM_STREAM

 I'm using libcurl to POST form data using a FILE* with the CURLFORM_STREAM
 option of curl_formadd(). I've noticed that if the connection drops at just
 the right time, the POST is reattempted without the data from the file. It
 seems like the file stream position isn't getting reset to the beginning of
 the file. I found the CURLOPT_SEEKFUNCTION option and set that with a
385
386
387
388
389
390
391







392
393
394
395
396
397
398
 ASCII space characters in --data-urlencode are currently encoded as %20
 rather than +, which RFC 1866 says should be used.

 See https://github.com/curl/curl/issues/3229

5. Build and portability issues








5.2 curl-config --libs contains private details

 "curl-config --libs" will include details set in LDFLAGS when configure is
 run that might be needed only for building libcurl. Further, curl-config
 --cflags suffers from the same effects with CFLAGS/CPPFLAGS.

5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10







>
>
>
>
>
>
>







341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
 ASCII space characters in --data-urlencode are currently encoded as %20
 rather than +, which RFC 1866 says should be used.

 See https://github.com/curl/curl/issues/3229

5. Build and portability issues

5.1 USE_UNIX_SOCKETS on Windows

 Due to incorrect CMake checks for the presense of the feature, it will never
 be enabled for windows in a cmake build.

 See https://github.com/curl/curl/issues/4040

5.2 curl-config --libs contains private details

 "curl-config --libs" will include details set in LDFLAGS when configure is
 run that might be needed only for building libcurl. Further, curl-config
 --cflags suffers from the same effects with CFLAGS/CPPFLAGS.

5.3 curl compiled on OSX 10.13 failed to run on OSX 10.10
723
724
725
726
727
728
729













730
731
732
733
734
735
736
 connection, suggesting a problem in the HE handling.

 If we can *know* that we're talking to a local host, we should lower the
 happy eyeballs delay timeout for IPv6 (related: hardcode the "localhost"
 addresses, mentioned in TODO). Possibly we should reduce that delay for all.

 https://github.com/curl/curl/issues/2281














12. LDAP and OpenLDAP

12.1 OpenLDAP hangs after returning results

 By configuration defaults, openldap automatically chase referrals on
 secondary socket descriptors. The OpenLDAP backend is asynchronous and thus







>
>
>
>
>
>
>
>
>
>
>
>
>







686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
 connection, suggesting a problem in the HE handling.

 If we can *know* that we're talking to a local host, we should lower the
 happy eyeballs delay timeout for IPv6 (related: hardcode the "localhost"
 addresses, mentioned in TODO). Possibly we should reduce that delay for all.

 https://github.com/curl/curl/issues/2281

11.7 signal-based resolver timeouts

 libcurl built without an asynchronous resolver library uses alarm() to time
 out DNS lookups. When a timeout occurs, this causes libcurl to jump from the
 signal handler back into the library with a sigsetjmp, which effectively
 causes libcurl to continue running within the signal handler. This is
 non-portable and could cause problems on some platforms. A discussion on the
 problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html

 Also, alarm() provides timeout resolution only to the nearest second. alarm
 ought to be replaced by setitimer on systems that support it.


12. LDAP and OpenLDAP

12.1 OpenLDAP hangs after returning results

 By configuration defaults, openldap automatically chase referrals on
 secondary socket descriptors. The OpenLDAP backend is asynchronous and thus
Changes to jni/curl/docs/Makefile.am.
49
50
51
52
53
54
55

56
57
58
59
60
61
62

63
64
65
66
67
68
69

70
71
72
73
74
75
76
 CHECKSRC.md                                    \
 CIPHERS.md                                     \
 CMakeLists.txt                                 \
 CODE_OF_CONDUCT.md                             \
 CODE_STYLE.md                                  \
 CONTRIBUTE.md                                  \
 DEPRECATE.md                                   \

 FAQ                                            \
 FEATURES                                       \
 GOVERNANCE.md                                  \
 HELP-US.md                                     \
 HISTORY.md                                     \
 HTTP-COOKIES.md                                \
 HTTP2.md                                       \

 INSTALL                                        \
 INSTALL.cmake                                  \
 INSTALL.md                                     \
 INTERNALS.md                                   \
 KNOWN_BUGS                                     \
 LICENSE-MIXING.md                              \
 MAIL-ETIQUETTE                                 \

 README.cmake                                   \
 README.md                                      \
 README.netware                                 \
 README.win32                                   \
 RELEASE-PROCEDURE.md                           \
 RESOURCES                                      \
 ROADMAP.md                                     \







>







>







>







49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 CHECKSRC.md                                    \
 CIPHERS.md                                     \
 CMakeLists.txt                                 \
 CODE_OF_CONDUCT.md                             \
 CODE_STYLE.md                                  \
 CONTRIBUTE.md                                  \
 DEPRECATE.md                                   \
 EXPERIMENTAL.md                                \
 FAQ                                            \
 FEATURES                                       \
 GOVERNANCE.md                                  \
 HELP-US.md                                     \
 HISTORY.md                                     \
 HTTP-COOKIES.md                                \
 HTTP2.md                                       \
 HTTP3.md                                       \
 INSTALL                                        \
 INSTALL.cmake                                  \
 INSTALL.md                                     \
 INTERNALS.md                                   \
 KNOWN_BUGS                                     \
 LICENSE-MIXING.md                              \
 MAIL-ETIQUETTE                                 \
 PARALLEL-TRANSFERS.md                          \
 README.cmake                                   \
 README.md                                      \
 README.netware                                 \
 README.win32                                   \
 RELEASE-PROCEDURE.md                           \
 RESOURCES                                      \
 ROADMAP.md                                     \
Changes to jni/curl/docs/Makefile.in.
379
380
381
382
383
384
385



386
387

388
389
390
391
392
393
394
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
475
476
477
478
479
480
481

482
483
484
485
486
487
488

489
490
491
492
493
494
495

496
497
498
499
500
501
502
 CHECKSRC.md                                    \
 CIPHERS.md                                     \
 CMakeLists.txt                                 \
 CODE_OF_CONDUCT.md                             \
 CODE_STYLE.md                                  \
 CONTRIBUTE.md                                  \
 DEPRECATE.md                                   \

 FAQ                                            \
 FEATURES                                       \
 GOVERNANCE.md                                  \
 HELP-US.md                                     \
 HISTORY.md                                     \
 HTTP-COOKIES.md                                \
 HTTP2.md                                       \

 INSTALL                                        \
 INSTALL.cmake                                  \
 INSTALL.md                                     \
 INTERNALS.md                                   \
 KNOWN_BUGS                                     \
 LICENSE-MIXING.md                              \
 MAIL-ETIQUETTE                                 \

 README.cmake                                   \
 README.md                                      \
 README.netware                                 \
 README.win32                                   \
 RELEASE-PROCEDURE.md                           \
 RESOURCES                                      \
 ROADMAP.md                                     \







>







>







>







479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
 CHECKSRC.md                                    \
 CIPHERS.md                                     \
 CMakeLists.txt                                 \
 CODE_OF_CONDUCT.md                             \
 CODE_STYLE.md                                  \
 CONTRIBUTE.md                                  \
 DEPRECATE.md                                   \
 EXPERIMENTAL.md                                \
 FAQ                                            \
 FEATURES                                       \
 GOVERNANCE.md                                  \
 HELP-US.md                                     \
 HISTORY.md                                     \
 HTTP-COOKIES.md                                \
 HTTP2.md                                       \
 HTTP3.md                                       \
 INSTALL                                        \
 INSTALL.cmake                                  \
 INSTALL.md                                     \
 INTERNALS.md                                   \
 KNOWN_BUGS                                     \
 LICENSE-MIXING.md                              \
 MAIL-ETIQUETTE                                 \
 PARALLEL-TRANSFERS.md                          \
 README.cmake                                   \
 README.md                                      \
 README.netware                                 \
 README.win32                                   \
 RELEASE-PROCEDURE.md                           \
 RESOURCES                                      \
 ROADMAP.md                                     \
Added jni/curl/docs/PARALLEL-TRANSFERS.md.




















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# Parallel transfers

curl 7.66.0 introduces support for doing multiple transfers simultaneously; in
parallel.

## -Z, --parallel

When this command line option is used, curl will perform the transfers given
to it at the same time. It will do up to `--parallel-max` concurrent
transfers, with a default value of 50.

## Progress meter

The progress meter that is displayed when doing parallel transfers is
completely different than the regular one used for each single transfer.

  It shows:

 o percent download (if known, which means *all* transfers need to have a
   known size)
 o precent upload (if known, with the same caveat as for download)
 o total amount of downloaded data
 o total amount of uploaded data
 o number of transfers to perform
 o number of concurrent transfers being transferred right now
 o number of transfers queued up waiting to start
 o total time all transfers are expected to take (if sizes are known)
 o current time the transfers have spent so far
 o estimated time left (if sizes are known)
 o current transfer speed (the faster of UL/DL speeds measured over the last
   few seconds)

Example:

    DL% UL%  Dled  Uled  Xfers  Live   Qd Total     Current  Left    Speed
    72  --  37.9G     0   101    30    23  0:00:55  0:00:34  0:00:22 2752M

## Behavior differences

Connections are shared fine between different easy handles, but the
"authentication contexts" are not. So for example doing HTTP Digest auth with
one handle for a particular transfer and then continue on with another handle
that reuses the same connection, the second handle can't send the necessary
Authorization header at once since the context is only kept in the original
easy handle.

To fix this, the authorization state could be made possible to share with the
share API as well, as a context per origin + path (realm?) basically.

Visible in test 153, 1412 and more.

## Feedback!

This is early days for parallel transfer support. Keep your eyes open for
unintended side effects or downright bugs.

Tell us what you think and how you think we could improve this feature!

Changes to jni/curl/docs/ROADMAP.md.
1
2
3
4
5
6
7
8
9
10
11









12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

40
41
42
43
44

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
curl the next few years - perhaps
=================================

Roadmap of things Daniel Stenberg wants to work on next. It is intended to
serve as a guideline for others for information, feedback and possible
participation.

HTTP/3
------

 See the [QUIC and HTTP/3 wiki page](https://github.com/curl/curl/wiki/QUIC).










ESNI (Encrypted SNI)
--------------------

 See Daniel's post on [Support of Encrypted
 SNI](https://curl.haxx.se/mail/lib-2019-03/0000.html) on the mailing list.

HSTS
----

Complete and merge [the existing PR](https://github.com/curl/curl/pull/2682).

Parallel transfers for the curl tool
------------------------------------

This will require several new command line options to enable and control.

 1. switch to creating a list of all the transfers first before any transfer
    is done
 2. make the transfers using the multi interface
 3. optionally fire up more transfers before the previous has completed

Option to refuse HTTPS => HTTP redirects
----------------------------------------

Possibly as a new bit to `CURLOPT_FOLLOWLOCATION` ?

Option to let CURLOPT_CUSTOMREQUEST be overridden on redirect

-------------------------------------------------------------

(This is a common problem for people using `-X` and `-L` together.)

Possibly as a new bit to `CURLOPT_FOLLOWLOCATION` ?


Hardcode “localhost”
--------------------

No need to resolve it. Avoid a risk where this is resolved over the network
and actually responds with something else than a local address. Some operating
systems already do this. Also:
https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02

Consider "menu config"-style build feature selection
----------------------------------------------------

Allow easier building of custom libcurl versions with only a selected feature
where the available features are easily browsable and toggle-able ON/OFF or
similar.







|
|

|
>
>
>
>
>
>
>
>
>







<
<
<
|

|
|

<
|
<
<
<
<
|
<
<
|
<

<
>
|

<
|
<
>




|
|
|
|

|
|

|
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27



28
29
30
31
32

33




34


35

36

37
38
39

40

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
curl the next few years - perhaps
=================================

Roadmap of things Daniel Stenberg wants to work on next. It is intended to
serve as a guideline for others for information, feedback and possible
participation.

HSTS
----

 Complete and merge [the existing PR](https://github.com/curl/curl/pull/2682).

 Loading a huge preload file is probably not too interesting to most people,
 but using a custom file and reacting to HSTS response header probably are
 good features.

DNS-over-TLS
------------

 Similar to DNS-over-HTTPS. Could share quite a lot of generic code.

ESNI (Encrypted SNI)
--------------------

 See Daniel's post on [Support of Encrypted
 SNI](https://curl.haxx.se/mail/lib-2019-03/0000.html) on the mailing list.




 Initial work exists in https://github.com/curl/curl/pull/4011

tiny-curl
---------


 There's no immediate action for this but users seem keen on being able to




 building custom minimized versions of libcurl for their products. Make sure


 new features that are "niche" can still be disabled at build-time.



MQTT
----


 Support receiving and sending MQTT messages. Initial work exists in

 https://github.com/curl/curl/pull/3514

Hardcode “localhost”
--------------------

 No need to resolve it. Avoid a risk where this is resolved over the network
 and actually responds with something else than a local address. Some
 operating systems already do this. Also:
 https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02

"menu config"-style build feature selection
-------------------------------------------

 Allow easier building of custom libcurl versions with only a selected feature
 where the available features are easily browsable and toggle-able ON/OFF or
 similar.
Changes to jni/curl/docs/THANKS.
48
49
50
51
52
53
54

55
56
57
58
59
60
61
Alex Baines
Alex Bligh
Alex Chan
Alex Fishman
Alex Grebenschikov
Alex Gruz
Alex Malinovich

Alex McLellan
Alex Neblett
Alex Nichols
Alex Potapenko
Alex Rousskov
Alex Suykov
Alex Vinnik







>







48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Alex Baines
Alex Bligh
Alex Chan
Alex Fishman
Alex Grebenschikov
Alex Gruz
Alex Malinovich
Alex Mayorga
Alex McLellan
Alex Neblett
Alex Nichols
Alex Potapenko
Alex Rousskov
Alex Suykov
Alex Vinnik
80
81
82
83
84
85
86

87
88
89
90
91
92
93
Alexey Zakhlestin
Alexis Carvalho
Alexis La Goutte
Alfonso Martone
Alfred Gebert
Allen Pulsifer
Alona Rossen

Amol Pattekar
Amr Shahin
Anatol Belski
Anatoli Tubman
Anders Bakken
Anders Gustafsson
Anders Havn







>







81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Alexey Zakhlestin
Alexis Carvalho
Alexis La Goutte
Alfonso Martone
Alfred Gebert
Allen Pulsifer
Alona Rossen
Amit Katyal
Amol Pattekar
Amr Shahin
Anatol Belski
Anatoli Tubman
Anders Bakken
Anders Gustafsson
Anders Havn
168
169
170
171
172
173
174

175
176
177
178
179
180
181
Augustus Saunders
Avery Fay
Axel Tillequin
Ayoub Boudhar
Balaji Parasuram
Balaji S Rao
Balaji Salunke

Balint Szilakszi
Barry Abrahamson
Bart Whiteley
Bas Mevissen
Bas van Schaik
Basuke Suzuki
Ben Boeckel







>







170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
Augustus Saunders
Avery Fay
Axel Tillequin
Ayoub Boudhar
Balaji Parasuram
Balaji S Rao
Balaji Salunke
Balazs Kovacsics
Balint Szilakszi
Barry Abrahamson
Bart Whiteley
Bas Mevissen
Bas van Schaik
Basuke Suzuki
Ben Boeckel
226
227
228
229
230
231
232

233
234
235
236
237
238
239
Brad Fitzpatrick
Brad Harder
Brad Hards
Brad King
Brad Spencer
Bradford Bruce
Brandon Casey

Brandon Wang
Brendan Jurd
Brent Beardsley
Brian Akins
Brian Carpenter
Brian Chaplin
Brian Childs







>







229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
Brad Fitzpatrick
Brad Harder
Brad Hards
Brad King
Brad Spencer
Bradford Bruce
Brandon Casey
Brandon Dong
Brandon Wang
Brendan Jurd
Brent Beardsley
Brian Akins
Brian Carpenter
Brian Chaplin
Brian Childs
257
258
259
260
261
262
263

264
265
266
267
268
269
270
Caleb Raitto
Cameron Kaiser
Cameron MacMinn
Camille Moncelier
Caolan McNamara
Carie Pointer
Carlo Cannas

Carlo Teubner
Carlo Wood
Carlos ORyan
Carsten Lange
Casey O'Donnell
Catalin Patulea
Chad Monroe







>







261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
Caleb Raitto
Cameron Kaiser
Cameron MacMinn
Camille Moncelier
Caolan McNamara
Carie Pointer
Carlo Cannas
Carlo Marcelo Arenas Belón
Carlo Teubner
Carlo Wood
Carlos ORyan
Carsten Lange
Casey O'Donnell
Catalin Patulea
Chad Monroe
311
312
313
314
315
316
317

318
319
320
321
322
323
324
Claes Jakobsson
Clarence Gardner
Claudio Neves
Clemens Gruber
Cliff Crosland
Clifford Wolf
Clint Clayton

Cody Jones
Cody Mack
Colby Ranger
Colin Blair
Colin Hogben
Colin Watson
Colm Buckley







>







316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
Claes Jakobsson
Clarence Gardner
Claudio Neves
Clemens Gruber
Cliff Crosland
Clifford Wolf
Clint Clayton
Clément Notin
Cody Jones
Cody Mack
Colby Ranger
Colin Blair
Colin Hogben
Colin Watson
Colm Buckley
710
711
712
713
714
715
716

717
718
719
720
721
722
723
724
725
726
727
728

729
730
731
732
733
734
735
Ian Gulliver
Ian Lynagh
Ian Turner
Ian Wilkes
Ignacio Vazquez-Abrams
Igor Franchuk
Igor Khristophorov

Igor Novoseltsev
Igor Polyakov
Ihor Karpenko
Iida Yosiaki
Ilguiz Latypov
Ilja van Sprundel
Immanuel Gregoire
Inca R
Ingmar Runge
Ingo Ralf Blum
Ingo Wilken
Irfan Adilovic

Irving Wolfe
Isaac Boukris
Isaiah Norton
Ishan SinghLevett
Ithubg on github
Ivan Avdeev
Ivo Bellin Salarin







>












>







716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
Ian Gulliver
Ian Lynagh
Ian Turner
Ian Wilkes
Ignacio Vazquez-Abrams
Igor Franchuk
Igor Khristophorov
Igor Makarov
Igor Novoseltsev
Igor Polyakov
Ihor Karpenko
Iida Yosiaki
Ilguiz Latypov
Ilja van Sprundel
Immanuel Gregoire
Inca R
Ingmar Runge
Ingo Ralf Blum
Ingo Wilken
Irfan Adilovic
Ironbars13 on github
Irving Wolfe
Isaac Boukris
Isaiah Norton
Ishan SinghLevett
Ithubg on github
Ivan Avdeev
Ivo Bellin Salarin
771
772
773
774
775
776
777

778
779
780
781
782
783
784
Jared Jennings
Jared Lundell
Jari Aalto
Jari Sundell
Jason Baietto
Jason Glasgow
Jason Juang

Jason Liu
Jason McDonald
Jason S. Priebe
Javier Barroso
Javier Blazquez
Javier G. Sogo
Javier Sixto







>







779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
Jared Jennings
Jared Lundell
Jari Aalto
Jari Sundell
Jason Baietto
Jason Glasgow
Jason Juang
Jason Lee
Jason Liu
Jason McDonald
Jason S. Priebe
Javier Barroso
Javier Blazquez
Javier G. Sogo
Javier Sixto
805
806
807
808
809
810
811

812
813
814
815
816
817
818
Jeff Weber
Jeffrey Walton
Jens Rantil
Jens Schleusener
Jeremie Rapin
Jeremy Friesner
Jeremy Huddleston

Jeremy Lin
Jeremy Pearson
Jeremy Tan
Jeroen Koekkoek
Jeroen Ooms
Jerome Muffat-Meridol
Jerome Robert







>







814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
Jeff Weber
Jeffrey Walton
Jens Rantil
Jens Schleusener
Jeremie Rapin
Jeremy Friesner
Jeremy Huddleston
Jeremy Lainé
Jeremy Lin
Jeremy Pearson
Jeremy Tan
Jeroen Koekkoek
Jeroen Ooms
Jerome Muffat-Meridol
Jerome Robert
925
926
927
928
929
930
931

932
933
934
935
936
937
938
Julian Romero Nieto
Julian Taylor
Julian Z
Julien Chaffraix
Julien Nabet
Julien Royer
Jun-ichiro itojun Hagino

Jurij Smakov
Juro Bystricky
Justin Clift
Justin Ehlert
Justin Fletcher
Justin Karneges
Justin Maggard







>







935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
Julian Romero Nieto
Julian Taylor
Julian Z
Julien Chaffraix
Julien Nabet
Julien Royer
Jun-ichiro itojun Hagino
Junho Choi
Jurij Smakov
Juro Bystricky
Justin Clift
Justin Ehlert
Justin Fletcher
Justin Karneges
Justin Maggard
992
993
994
995
996
997
998

999
1000
1001
1002

1003
1004
1005

1006
1007
1008
1009
1010
1011
1012
Krister Johansen
Kristian Gunstone
Kristian Köhntopp
Kristiyan Tsaklev
Kristoffer Gleditsch
Kunal Ekawde
Kurt Fankhauser

Kyle Edwards
Kyle J. McKay
Kyle L. Huff
Kyle Sallee

Kyselgov E.N
Lachlan O'Dea
Ladar Levison

Larry Campbell
Larry Fahnoe
Larry Lin
Larry Stefani
Larry Stone
Lars Buitinck
Lars Gustafsson







>




>



>







1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
Krister Johansen
Kristian Gunstone
Kristian Köhntopp
Kristiyan Tsaklev
Kristoffer Gleditsch
Kunal Ekawde
Kurt Fankhauser
Kyle Abramowitz
Kyle Edwards
Kyle J. McKay
Kyle L. Huff
Kyle Sallee
Kyohei Kadota
Kyselgov E.N
Lachlan O'Dea
Ladar Levison
Lance Ware
Larry Campbell
Larry Fahnoe
Larry Lin
Larry Stefani
Larry Stone
Lars Buitinck
Lars Gustafsson
1203
1204
1205
1206
1207
1208
1209

1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222

1223
1224
1225
1226
1227
1228
1229
Michael Jahn
Michael Jerris
Michael Kalinin
Michael Kaufmann
Michael Kilburn
Michael Kujawa
Michael König

Michael Maltese
Michael Mealling
Michael Mueller
Michael Osipov
Michael Schmid
Michael Smith
Michael Stapelberg
Michael Steuer
Michael Stillwell
Michael Wallner
Michal Bonino
Michal Marek
Michal Trybus

Michał Antoniak
Michał Fita
Michał Górny
Michał Janiszewski
Michał Kowalczyk
Michał Piechowski
Michel Promonet







>













>







1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
Michael Jahn
Michael Jerris
Michael Kalinin
Michael Kaufmann
Michael Kilburn
Michael Kujawa
Michael König
Michael Lee
Michael Maltese
Michael Mealling
Michael Mueller
Michael Osipov
Michael Schmid
Michael Smith
Michael Stapelberg
Michael Steuer
Michael Stillwell
Michael Wallner
Michal Bonino
Michal Marek
Michal Trybus
Michal Čaplygin
Michał Antoniak
Michał Fita
Michał Górny
Michał Janiszewski
Michał Kowalczyk
Michał Piechowski
Michel Promonet
1545
1546
1547
1548
1549
1550
1551

1552
1553
1554
1555
1556
1557
1558
Rodney Simmons
Rodric Glaser
Rodrigo Silva
Roger Leigh
Roland Blom
Roland Krikava
Roland Zimmermann

Rolland Dudemaine
Romain Coltel
Romain Fliedel
Romain Geissler
Roman Koifman
Roman Mamedov
Romulo A. Ceccon







>







1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
Rodney Simmons
Rodric Glaser
Rodrigo Silva
Roger Leigh
Roland Blom
Roland Krikava
Roland Zimmermann
Rolf Eike Beer
Rolland Dudemaine
Romain Coltel
Romain Fliedel
Romain Geissler
Roman Koifman
Roman Mamedov
Romulo A. Ceccon
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
Stephan Szabo
Stephen Brokenshire
Stephen Collyer
Stephen Kick
Stephen More
Stephen Toub
Sterling Hughes
Steve Brokenshire
Steve Green
Steve H Truong
Steve Havelka
Steve Holme
Steve Lhomme
Steve Little
Steve Marx







<







1695
1696
1697
1698
1699
1700
1701

1702
1703
1704
1705
1706
1707
1708
Stephan Szabo
Stephen Brokenshire
Stephen Collyer
Stephen Kick
Stephen More
Stephen Toub
Sterling Hughes

Steve Green
Steve H Truong
Steve Havelka
Steve Holme
Steve Lhomme
Steve Little
Steve Marx
1719
1720
1721
1722
1723
1724
1725

1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738

1739
1740
1741
1742
1743
1744
1745
Taneli Vähäkangas
Tanguy Fautre
Tatsuhiro Tsujikawa
Teemu Yli-Elsila
Temprimus
Terri Oda
Terry Wu

TheAssassin on github
Theodore Dubois
Thomas Braun
Thomas Gamper
Thomas Glanzmann
Thomas J. Moore
Thomas Klausner
Thomas L. Shinnick
Thomas Lopatic
Thomas Petazzoni
Thomas Ruecker
Thomas Schwinge
Thomas Tonino

Thomas van Hesteren
Thorsten Schöning
Tiit Pikma
Till Maas
Tim Ansell
Tim Baker
Tim Bartley







>













>







1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
Taneli Vähäkangas
Tanguy Fautre
Tatsuhiro Tsujikawa
Teemu Yli-Elsila
Temprimus
Terri Oda
Terry Wu
The Infinnovation team
TheAssassin on github
Theodore Dubois
Thomas Braun
Thomas Gamper
Thomas Glanzmann
Thomas J. Moore
Thomas Klausner
Thomas L. Shinnick
Thomas Lopatic
Thomas Petazzoni
Thomas Ruecker
Thomas Schwinge
Thomas Tonino
Thomas Vegas
Thomas van Hesteren
Thorsten Schöning
Tiit Pikma
Till Maas
Tim Ansell
Tim Baker
Tim Bartley
1917
1918
1919
1920
1921
1922
1923

1924
1925
1926
1927
1928
1929
1930
bobmitchell1956 on github
bsammon on github
buzo-ffm on github
cbartl on github
cclauss on github
clbr on github
cmfrolick on github

d912e3 on github
daboul on github
dasimx on github
dbrowndan on github
destman on github
dkjjr89 on github
dkwolfe4 on github







>







1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
bobmitchell1956 on github
bsammon on github
buzo-ffm on github
cbartl on github
cclauss on github
clbr on github
cmfrolick on github
codesniffer13 on github
d912e3 on github
daboul on github
dasimx on github
dbrowndan on github
destman on github
dkjjr89 on github
dkwolfe4 on github
1952
1953
1954
1955
1956
1957
1958

1959
1960
1961
1962
1963
1964

1965
1966
1967
1968
1969
1970

1971
1972

1973
1974
1975
1976
1977
1978
1979
l00p3r on Hackerone
lijian996 on github
lukaszgn on github
madblobfish on github
marc-groundctl on github
masbug on github
mccormickt12 on github

mkzero on github
moohoorama on github
nedres on github
neex on github
neheb on github
nevv on HackerOne/curl

nianxuejie on github
niner on github
nk
nopjmp on github
olesteban on github
omau on github

ovidiu-benea on github
patelvivekv1993 on github

pendrek at hackerone
pszemus on github
silveja1 on github
smuellerDD on github
sstruchtrup on github
steelman on github
steini2000 on github







>






>






>


>







1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
l00p3r on Hackerone
lijian996 on github
lukaszgn on github
madblobfish on github
marc-groundctl on github
masbug on github
mccormickt12 on github
migueljcrum on github
mkzero on github
moohoorama on github
nedres on github
neex on github
neheb on github
nevv on HackerOne/curl
niallor on github
nianxuejie on github
niner on github
nk
nopjmp on github
olesteban on github
omau on github
osabc on github
ovidiu-benea on github
patelvivekv1993 on github
patnyb on github
pendrek at hackerone
pszemus on github
silveja1 on github
smuellerDD on github
sstruchtrup on github
steelman on github
steini2000 on github
Changes to jni/curl/docs/TODO.
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
 consider bringing it up for discussions first on the mailing list so that we
 all agree it is still a good idea for the project!

 All bugs documented in the KNOWN_BUGS document are subject for fixing!

 1. libcurl
 1.1 TFO support on Windows
 1.2 More data sharing
 1.3 struct lifreq
 1.4 signal-based resolver timeouts
 1.5 get rid of PATH_MAX
 1.6 Modified buffer size approach
 1.7 Support HTTP/2 for HTTP(S) proxies
 1.8 CURLOPT_RESOLVE for any port number
 1.9 Cache negative name resolves
 1.10 auto-detect proxy
 1.11 minimize dependencies with dynamically loaded modules
 1.12 updated DNS server while running
 1.13 c-ares and CURLOPT_OPENSOCKETFUNCTION
 1.14 Typesafe curl_easy_setopt()
 1.15 Monitor connections in the connection pool
 1.16 Try to URL encode given URL
 1.17 Add support for IRIs
 1.18 try next proxy if one doesn't work
 1.20 SRV and URI DNS records
 1.21 Have the URL API offer IDN decoding
 1.22 CURLINFO_PAUSE_STATE
 1.23 Offer API to flush the connection pool
 1.24 TCP Fast Open for windows
 1.25 Expose tried IP addresses that failed
 1.26 CURL_REFUSE_CLEARTEXT
 1.27 hardcode the "localhost" addresses
 1.28 FD_CLOEXEC
 1.29 Upgrade to websockets
 1.30 config file parsing

 2. libcurl - multi interface
 2.1 More non-blocking
 2.2 Better support for same name resolves
 2.3 Non-blocking curl_multi_remove_handle()
 2.4 Split connect and authentication process
 2.5 Edge-triggered sockets should work
 2.6 multi upkeep

 3. Documentation
 3.2 Provide cmake config-file

 4. FTP
 4.1 HOST
 4.2 Alter passive/active on failure and retry
 4.3 Earlier bad letter detection
 4.4 REST for large files
 4.5 ASCII support
 4.6 GSSAPI via Windows SSPI
 4.7 STAT for LIST without data connection
 4.8 Option to ignore private IP addresses in PASV response

 5. HTTP
 5.1 Better persistency for HTTP 1.0
 5.2 support FF3 sqlite cookie files
 5.3 Rearrange request header order
 5.4 Allow SAN names in HTTP/2 server push
 5.5 auth= in URLs
 5.6 Refuse "downgrade" redirects
 5.7 QUIC

 6. TELNET
 6.1 ditch stdin
 6.2 ditch telnet-specific select
 6.3 feature negotiation debug data

 7. SMTP
 7.1 Pipelining
 7.2 Enhanced capability support
 7.3 Add CURLOPT_MAIL_CLIENT option

 8. POP3
 8.1 Pipelining
 8.2 Enhanced capability support

 9. IMAP
 9.1 Enhanced capability support

 10. LDAP
 10.1 SASL based authentication mechanisms

 11. SMB
 11.1 File listing support
 11.2 Honor file timestamps
 11.3 Use NTLMv2
 11.4 Create remote directories

 12. New protocols
 12.1 RSYNC

 13. SSL
 13.1 Disable specific versions
 13.2 Provide mutex locking API
 13.3 Support in-memory certs/ca certs/keys
 13.4 Cache/share OpenSSL contexts
 13.5 Export session ids
 13.6 Provide callback for cert verification
 13.7 improve configure --with-ssl
 13.8 Support DANE
 13.9 Configurable loading of OpenSSL configuration file
 13.10 Support Authority Information Access certificate extension (AIA)
 13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
 13.12 Support HSTS
 13.13 Support HPKP
 13.14 Support the clienthello extension

 14. GnuTLS
 14.1 SSL engine stuff
 14.2 check connection

 15. WinSSL/SChannel
 15.1 Add support for client certificate authentication
 15.3 Add support for the --ciphers option
 15.4 Add option to disable client certificate auto-send

 16. SASL
 16.1 Other authentication mechanisms
 16.2 Add QOP support to GSSAPI authentication
 16.3 Support binary messages (i.e.: non-base64)

 17. SSH protocols
 17.1 Multiplexing
 17.2 SFTP performance
 17.3 Support better than MD5 hostkey hash
 17.4 Support CURLOPT_PREQUOTE

 18. Command line tool
 18.1 sync
 18.2 glob posts
 18.3 prevent file overwriting
 18.4 simultaneous parallel transfers
 18.5 UTF-8 filenames in Content-Disposition
 18.6 warning when setting an option
 18.7 at least N milliseconds between requests
 18.9 Choose the name of file in braces for complex URLs
 18.10 improve how curl works in a windows console window
 18.11 Windows: set attribute 'archive' for completed downloads
 18.12 keep running, read instructions from pipe/socket
 18.13 support metalink in http headers
 18.14 --fail without --location should treat 3xx as a failure
 18.15 --retry should resume
 18.16 send only part of --data
 18.17 consider file name from the redirected URL with -O ?
 18.18 retry on network is unreachable
 18.19 expand ~/ in config files
 18.20 host name sections in config files








<

<

<













<




<




















<







<



<
<







<




<















<


<







<



<



<














<







<

<





<
<







14
15
16
17
18
19
20

21

22

23
24
25
26
27
28
29
30
31
32
33
34
35

36
37
38
39

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

60
61
62
63
64
65
66

67
68
69


70
71
72
73
74
75
76

77
78
79
80

81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

96
97

98
99
100
101
102
103
104

105
106
107

108
109
110

111
112
113
114
115
116
117
118
119
120
121
122
123
124

125
126
127
128
129
130
131

132

133
134
135
136
137


138
139
140
141
142
143
144
 consider bringing it up for discussions first on the mailing list so that we
 all agree it is still a good idea for the project!

 All bugs documented in the KNOWN_BUGS document are subject for fixing!

 1. libcurl
 1.1 TFO support on Windows

 1.3 struct lifreq

 1.5 get rid of PATH_MAX

 1.7 Support HTTP/2 for HTTP(S) proxies
 1.8 CURLOPT_RESOLVE for any port number
 1.9 Cache negative name resolves
 1.10 auto-detect proxy
 1.11 minimize dependencies with dynamically loaded modules
 1.12 updated DNS server while running
 1.13 c-ares and CURLOPT_OPENSOCKETFUNCTION
 1.14 Typesafe curl_easy_setopt()
 1.15 Monitor connections in the connection pool
 1.16 Try to URL encode given URL
 1.17 Add support for IRIs
 1.18 try next proxy if one doesn't work
 1.20 SRV and URI DNS records

 1.22 CURLINFO_PAUSE_STATE
 1.23 Offer API to flush the connection pool
 1.24 TCP Fast Open for windows
 1.25 Expose tried IP addresses that failed

 1.27 hardcode the "localhost" addresses
 1.28 FD_CLOEXEC
 1.29 Upgrade to websockets
 1.30 config file parsing

 2. libcurl - multi interface
 2.1 More non-blocking
 2.2 Better support for same name resolves
 2.3 Non-blocking curl_multi_remove_handle()
 2.4 Split connect and authentication process
 2.5 Edge-triggered sockets should work
 2.6 multi upkeep

 3. Documentation
 3.2 Provide cmake config-file

 4. FTP
 4.1 HOST
 4.2 Alter passive/active on failure and retry
 4.3 Earlier bad letter detection

 4.5 ASCII support
 4.6 GSSAPI via Windows SSPI
 4.7 STAT for LIST without data connection
 4.8 Option to ignore private IP addresses in PASV response

 5. HTTP
 5.1 Better persistency for HTTP 1.0

 5.3 Rearrange request header order
 5.4 Allow SAN names in HTTP/2 server push
 5.5 auth= in URLs



 6. TELNET
 6.1 ditch stdin
 6.2 ditch telnet-specific select
 6.3 feature negotiation debug data

 7. SMTP

 7.2 Enhanced capability support
 7.3 Add CURLOPT_MAIL_CLIENT option

 8. POP3

 8.2 Enhanced capability support

 9. IMAP
 9.1 Enhanced capability support

 10. LDAP
 10.1 SASL based authentication mechanisms

 11. SMB
 11.1 File listing support
 11.2 Honor file timestamps
 11.3 Use NTLMv2
 11.4 Create remote directories

 12. New protocols


 13. SSL

 13.2 Provide mutex locking API
 13.3 Support in-memory certs/ca certs/keys
 13.4 Cache/share OpenSSL contexts
 13.5 Export session ids
 13.6 Provide callback for cert verification
 13.7 improve configure --with-ssl
 13.8 Support DANE

 13.10 Support Authority Information Access certificate extension (AIA)
 13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
 13.12 Support HSTS

 13.14 Support the clienthello extension

 14. GnuTLS

 14.2 check connection

 15. WinSSL/SChannel
 15.1 Add support for client certificate authentication
 15.3 Add support for the --ciphers option
 15.4 Add option to disable client certificate auto-send

 16. SASL
 16.1 Other authentication mechanisms
 16.2 Add QOP support to GSSAPI authentication
 16.3 Support binary messages (i.e.: non-base64)

 17. SSH protocols
 17.1 Multiplexing

 17.3 Support better than MD5 hostkey hash
 17.4 Support CURLOPT_PREQUOTE

 18. Command line tool
 18.1 sync
 18.2 glob posts
 18.3 prevent file overwriting

 18.5 UTF-8 filenames in Content-Disposition

 18.7 at least N milliseconds between requests
 18.9 Choose the name of file in braces for complex URLs
 18.10 improve how curl works in a windows console window
 18.11 Windows: set attribute 'archive' for completed downloads
 18.12 keep running, read instructions from pipe/socket


 18.15 --retry should resume
 18.16 send only part of --data
 18.17 consider file name from the redirected URL with -O ?
 18.18 retry on network is unreachable
 18.19 expand ~/ in config files
 18.20 host name sections in config files

198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
1.1 TFO support on Windows

 TCP Fast Open is supported on several platforms but not on Windows. Work on
 this was once started but never finished.

 See https://github.com/curl/curl/pull/3378

1.2 More data sharing

 curl_share_* functions already exist and work, and they can be extended to
 share more. For example, enable sharing of the ares channel.

1.3 struct lifreq

 Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
 SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
 To support IPv6 interface addresses for network interfaces properly.

1.4 signal-based resolver timeouts

 libcurl built without an asynchronous resolver library uses alarm() to time
 out DNS lookups. When a timeout occurs, this causes libcurl to jump from the
 signal handler back into the library with a sigsetjmp, which effectively
 causes libcurl to continue running within the signal handler. This is
 non-portable and could cause problems on some platforms. A discussion on the
 problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html

 Also, alarm() provides timeout resolution only to the nearest second. alarm
 ought to be replaced by setitimer on systems that support it.

1.5 get rid of PATH_MAX

 Having code use and rely on PATH_MAX is not nice:
 https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html

 Currently the SSH based code uses it a bit, but to remove PATH_MAX from there
 we need libssh2 to properly tell us when we pass in a too small buffer and
 its current API (as of libssh2 1.2.7) doesn't.

1.6 Modified buffer size approach

 Current libcurl allocates a fixed 16K size buffer for download and an
 additional 16K for upload. They are always unconditionally part of the easy
 handle. If CRLF translations are requested, an additional 32K "scratch
 buffer" is allocated. A total of 64K transfer buffers in the worst case.

 First, while the handles are not actually in use these buffers could be freed
 so that lingering handles just kept in queues or whatever waste less memory.

 Secondly, SFTP is a protocol that needs to handle many ~30K blocks at once
 since each need to be individually acked and therefore libssh2 must be
 allowed to send (or receive) many separate ones in parallel to achieve high
 transfer speeds. A current libcurl build with a 16K buffer makes that
 impossible, but one with a 512K buffer will reach MUCH faster transfers. But
 allocating 512K unconditionally for all buffers just in case they would like
 to do fast SFTP transfers at some point is not a good solution either.

 Dynamically allocate buffer size depending on protocol in use in combination
 with freeing it after each individual transfer? Other suggestions?

1.7 Support HTTP/2 for HTTP(S) proxies

 Support for doing HTTP/2 to HTTP and HTTPS proxies is still missing.

 See https://github.com/curl/curl/issues/3570








<
<
<
<
<






<
<
<
<
<
<
<
<
<
<
<
<





|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







177
178
179
180
181
182
183





184
185
186
187
188
189












190
191
192
193
194
195
196
197





















198
199
200
201
202
203
204
1.1 TFO support on Windows

 TCP Fast Open is supported on several platforms but not on Windows. Work on
 this was once started but never finished.

 See https://github.com/curl/curl/pull/3378






1.3 struct lifreq

 Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
 SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
 To support IPv6 interface addresses for network interfaces properly.













1.5 get rid of PATH_MAX

 Having code use and rely on PATH_MAX is not nice:
 https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html

 Currently the libssh2 SSH based code uses it, but to remove PATH_MAX from
 there we need libssh2 to properly tell us when we pass in a too small buffer
 and its current API (as of libssh2 1.2.7) doesn't.






















1.7 Support HTTP/2 for HTTP(S) proxies

 Support for doing HTTP/2 to HTTP and HTTPS proxies is still missing.

 See https://github.com/curl/curl/issues/3570

373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
 https://github.com/curl/curl/issues/896

1.20 SRV and URI DNS records

 Offer support for resolving SRV and URI DNS records for libcurl to know which
 server to connect to for various protocols (including HTTP!).

1.21 Have the URL API offer IDN decoding

 Similar to how URL decoding/encoding is done, we could have URL functions to
 convert IDN host names to punycode (probably not the reverse).
 https://github.com/curl/curl/issues/3232

1.22 CURLINFO_PAUSE_STATE

 Return information about the transfer's current pause state, in both
 directions. https://github.com/curl/curl/issues/2588

1.23 Offer API to flush the connection pool








<
<
<
<
<
<







314
315
316
317
318
319
320






321
322
323
324
325
326
327
 https://github.com/curl/curl/issues/896

1.20 SRV and URI DNS records

 Offer support for resolving SRV and URI DNS records for libcurl to know which
 server to connect to for various protocols (including HTTP!).







1.22 CURLINFO_PAUSE_STATE

 Return information about the transfer's current pause state, in both
 directions. https://github.com/curl/curl/issues/2588

1.23 Offer API to flush the connection pool

403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
1.25 Expose tried IP addresses that failed

 When libcurl fails to connect to a host, it should be able to offer the
 application the list of IP addresses that were used in the attempt.

 https://github.com/curl/curl/issues/2126

1.26 CURL_REFUSE_CLEARTEXT

 An environment variable that when set will make libcurl refuse to use any
 cleartext network protocol. That's all non-encrypted ones (FTP, HTTP, Gopher,
 etc). By adding the check to libcurl and not just curl, this environment
 variable can then help users to block all libcurl-using programs from
 accessing the network using unsafe protocols.

 The variable could be given some sort of syntax or different levels and be
 used to also allow for example users to refuse libcurl to do transfers with
 HTTPS certificate checks disabled.

 It could also automatically refuse usernames in URLs when set
 (see CURLOPT_DISALLOW_USERNAME_IN_URL)

1.27 hardcode the "localhost" addresses

 There's this new spec getting adopted that says "localhost" should always and
 unconditionally be a local address and not get resolved by a DNS server. A
 fine way for curl to fix this would be to simply hard-code the response to
 127.0.0.1 and/or ::1 (depending on what IP versions that are requested). This
 is what the browsers probably will do with this hostname.







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







338
339
340
341
342
343
344















345
346
347
348
349
350
351
1.25 Expose tried IP addresses that failed

 When libcurl fails to connect to a host, it should be able to offer the
 application the list of IP addresses that were used in the attempt.

 https://github.com/curl/curl/issues/2126
















1.27 hardcode the "localhost" addresses

 There's this new spec getting adopted that says "localhost" should always and
 unconditionally be a local address and not get resolved by a DNS server. A
 fine way for curl to fix this would be to simply hard-code the response to
 127.0.0.1 and/or ::1 (depending on what IP versions that are requested). This
 is what the browsers probably will do with this hostname.
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
 vice versa). https://curl.haxx.se/bug/feature.cgi?id=1754793

4.3 Earlier bad letter detection

 Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the
 process to avoid doing a resolve and connect in vain.

4.4 REST for large files

 REST fix for servers not behaving well on >2GB requests. This should fail if
 the server doesn't set the pointer to the requested index. The tricky
 (impossible?) part is to figure out if the server did the right thing or not.

4.5 ASCII support

 FTP ASCII transfers do not follow RFC959. They don't convert the data
 accordingly.

4.6 GSSAPI via Windows SSPI








<
<
<
<
<
<







455
456
457
458
459
460
461






462
463
464
465
466
467
468
 vice versa). https://curl.haxx.se/bug/feature.cgi?id=1754793

4.3 Earlier bad letter detection

 Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the
 process to avoid doing a resolve and connect in vain.







4.5 ASCII support

 FTP ASCII transfers do not follow RFC959. They don't convert the data
 accordingly.

4.6 GSSAPI via Windows SSPI

573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
5. HTTP

5.1 Better persistency for HTTP 1.0

 "Better" support for persistent connections over HTTP 1.0
 https://curl.haxx.se/bug/feature.cgi?id=1089001

5.2 support FF3 sqlite cookie files

 Firefox 3 is changing from its former format to a a sqlite database instead.
 We should consider how (lib)curl can/should support this.
 https://curl.haxx.se/bug/feature.cgi?id=1871388

5.3 Rearrange request header order

 Server implementors often make an effort to detect browser and to reject
 clients it can detect to not match. One of the last details we cannot yet
 control in libcurl's HTTP requests, which also can be exploited to detect
 that libcurl is in fact used even when it tries to impersonate a browser, is
 the order of the request headers. I propose that we introduce a new option in







<
<
<
<
<
<







487
488
489
490
491
492
493






494
495
496
497
498
499
500
5. HTTP

5.1 Better persistency for HTTP 1.0

 "Better" support for persistent connections over HTTP 1.0
 https://curl.haxx.se/bug/feature.cgi?id=1089001







5.3 Rearrange request header order

 Server implementors often make an effort to detect browser and to reject
 clients it can detect to not match. One of the last details we cannot yet
 control in libcurl's HTTP requests, which also can be exploited to detect
 that libcurl is in fact used even when it tries to impersonate a browser, is
 the order of the request headers. I propose that we introduce a new option in
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
5.5 auth= in URLs

 Add the ability to specify the preferred authentication mechanism to use by
 using ;auth=<mech> in the login part of the URL.

 For example:

 http://test:pass;auth=NTLM@example.com would be equivalent to specifying --user
 test:pass;auth=NTLM or --user test:pass --ntlm from the command line.

 Additionally this should be implemented for proxy base URLs as well.

5.6 Refuse "downgrade" redirects

 See https://github.com/curl/curl/issues/226

 Consider a way to tell curl to refuse to "downgrade" protocol with a redirect
 and/or possibly a bit that refuses redirect to change protocol completely.

5.7 QUIC

 The standardization process of QUIC has been taken to the IETF and can be
 followed on the [IETF QUIC Mailing
 list](https://www.ietf.org/mailman/listinfo/quic). I'd like us to get on the
 bandwagon. Ideally, this would be done with a separate library/project to
 handle the binary/framing layer in a similar fashion to how HTTP/2 is
 implemented. This, to allow other projects to benefit from the work and to
 thus broaden the interest and chance of others to participate.


6. TELNET

6.1 ditch stdin

Reading input (to send to the remote server) on stdin is a crappy solution for
library purposes. We need to invent a good way for the application to be able
to provide the data to send.

6.2 ditch telnet-specific select

 Move the telnet support's network select() loop go away and merge the code
 into the main transfer loop. Until this is done, the multi interface won't
 work for telnet.

6.3 feature negotiation debug data

  Add telnet feature negotiation data to the debug callback as header data.


7. SMTP

7.1 Pipelining

 Add support for pipelining emails.

7.2 Enhanced capability support

 Add the ability, for an application that uses libcurl, to obtain the list of
 capabilities returned from the EHLO command.

7.3 Add CURLOPT_MAIL_CLIENT option

 Rather than use the URL to specify the mail client string to present in the
 HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
 specifying this data as the URL is non-standard and to be honest a bit of a
 hack ;-)

 Please see the following thread for more information:
 https://curl.haxx.se/mail/lib-2012-05/0178.html


8. POP3

8.1 Pipelining

 Add support for pipelining commands.

8.2 Enhanced capability support

 Add the ability, for an application that uses libcurl, to obtain the list of
 capabilities returned from the CAPA command.

9. IMAP








|
|



<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<





|
|
|









|




<
<
<
<


















<
<
<
<







515
516
517
518
519
520
521
522
523
524
525
526

















527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548




549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566




567
568
569
570
571
572
573
5.5 auth= in URLs

 Add the ability to specify the preferred authentication mechanism to use by
 using ;auth=<mech> in the login part of the URL.

 For example:

 http://test:pass;auth=NTLM@example.com would be equivalent to specifying
 --user test:pass;auth=NTLM or --user test:pass --ntlm from the command line.

 Additionally this should be implemented for proxy base URLs as well.



















6. TELNET

6.1 ditch stdin

 Reading input (to send to the remote server) on stdin is a crappy solution
 for library purposes. We need to invent a good way for the application to be
 able to provide the data to send.

6.2 ditch telnet-specific select

 Move the telnet support's network select() loop go away and merge the code
 into the main transfer loop. Until this is done, the multi interface won't
 work for telnet.

6.3 feature negotiation debug data

 Add telnet feature negotiation data to the debug callback as header data.


7. SMTP





7.2 Enhanced capability support

 Add the ability, for an application that uses libcurl, to obtain the list of
 capabilities returned from the EHLO command.

7.3 Add CURLOPT_MAIL_CLIENT option

 Rather than use the URL to specify the mail client string to present in the
 HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
 specifying this data as the URL is non-standard and to be honest a bit of a
 hack ;-)

 Please see the following thread for more information:
 https://curl.haxx.se/mail/lib-2012-05/0178.html


8. POP3





8.2 Enhanced capability support

 Add the ability, for an application that uses libcurl, to obtain the list of
 capabilities returned from the CAPA command.

9. IMAP

721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
11.4 Create remote directories

Support for creating remote directories when uploading a file to a directory
that doesn't exist on the server, just like --ftp-create-dirs.

12. New protocols

12.1 RSYNC

 There's no RFC for the protocol or an URI/URL format.  An implementation
 should most probably use an existing rsync library, such as librsync.

13. SSL

13.1 Disable specific versions

 Provide an option that allows for disabling specific SSL versions, such as
 SSLv2 https://curl.haxx.se/bug/feature.cgi?id=1767276

13.2 Provide mutex locking API

 Provide a libcurl API for setting mutex callbacks in the underlying SSL
 library, so that the same application code can use mutex-locking
 independently of OpenSSL or GnutTLS being used.

13.3 Support in-memory certs/ca certs/keys







<
<
<
<
<


<
<
<
<
<







604
605
606
607
608
609
610





611
612





613
614
615
616
617
618
619
11.4 Create remote directories

Support for creating remote directories when uploading a file to a directory
that doesn't exist on the server, just like --ftp-create-dirs.

12. New protocols






13. SSL






13.2 Provide mutex locking API

 Provide a libcurl API for setting mutex callbacks in the underlying SSL
 library, so that the same application code can use mutex-locking
 independently of OpenSSL or GnutTLS being used.

13.3 Support in-memory certs/ca certs/keys
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
 approach. See Daniel's comments:
 https://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the
 correct library to base this development on.

 Björn Stenberg wrote a separate initial take on DANE that was never
 completed.

13.9 Configurable loading of OpenSSL configuration file

 libcurl calls the OpenSSL function CONF_modules_load_file() in openssl.c,
 Curl_ossl_init(). "We regard any changes in the OpenSSL configuration as a
 security risk or at least as unnecessary."

 Please add a configuration switch or something similar to disable the
 CONF_modules_load_file() call.

 See https://github.com/curl/curl/issues/2724

13.10 Support Authority Information Access certificate extension (AIA)

 AIA can provide various things like CRLs but more importantly information
 about intermediate CA certificates that can allow validation path to be
 fulfilled when the HTTPS server doesn't itself provide them.

 Since AIA is about downloading certs on demand to complete a TLS handshake,







<
<
<
<
<
<
<
<
<
<
<







670
671
672
673
674
675
676











677
678
679
680
681
682
683
 approach. See Daniel's comments:
 https://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the
 correct library to base this development on.

 Björn Stenberg wrote a separate initial take on DANE that was never
 completed.












13.10 Support Authority Information Access certificate extension (AIA)

 AIA can provide various things like CRLs but more importantly information
 about intermediate CA certificates that can allow validation path to be
 fulfilled when the HTTPS server doesn't itself provide them.

 Since AIA is about downloading certs on demand to complete a TLS handshake,
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
 features indicated by a HTTP header send by the webserver. It is widely used
 in browsers and it's purpose is to prevent insecure HTTP connections after
 a previous HTTPS connection. It protects against SSLStripping attacks.

 Doc: https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
 RFC 6797: https://tools.ietf.org/html/rfc6797

13.13 Support HPKP

 "HTTP Public Key Pinning" is TOFU (trust on first use), time-based
 features indicated by a HTTP header send by the webserver. It's purpose is
 to prevent Man-in-the-middle attacks by trusted CAs by allowing webadmins
 to specify which CAs/certificates/public keys to trust when connection to
 their websites.

 It can be build based on PINNEDPUBLICKEY.

 Wikipedia: https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning
 OWASP: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning
 Doc: https://developer.mozilla.org/de/docs/Web/Security/Public_Key_Pinning
 RFC: https://tools.ietf.org/html/draft-ietf-websec-key-pinning-21

13.14 Support the clienthello extension

 Certain stupid networks and middle boxes have a problem with SSL handshake
 pakets that are within a certain size range because how that sets some bits
 that previously (in older TLS version) were not set. The clienthello
 extension adds padding to avoid that size range.

 https://tools.ietf.org/html/rfc7685
 https://github.com/curl/curl/issues/2299

14. GnuTLS

14.1 SSL engine stuff

 Is this even possible?

14.2 check connection

 Add a way to check if the connection seems to be alive, to correspond to the
 SSL_peak() way we use with OpenSSL.

15. WinSSL/SChannel








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<












<
<
<
<







702
703
704
705
706
707
708















709
710
711
712
713
714
715
716
717
718
719
720




721
722
723
724
725
726
727
 features indicated by a HTTP header send by the webserver. It is widely used
 in browsers and it's purpose is to prevent insecure HTTP connections after
 a previous HTTPS connection. It protects against SSLStripping attacks.

 Doc: https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
 RFC 6797: https://tools.ietf.org/html/rfc6797
















13.14 Support the clienthello extension

 Certain stupid networks and middle boxes have a problem with SSL handshake
 pakets that are within a certain size range because how that sets some bits
 that previously (in older TLS version) were not set. The clienthello
 extension adds padding to avoid that size range.

 https://tools.ietf.org/html/rfc7685
 https://github.com/curl/curl/issues/2299

14. GnuTLS





14.2 check connection

 Add a way to check if the connection seems to be alive, to correspond to the
 SSL_peak() way we use with OpenSSL.

15. WinSSL/SChannel

945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
 much in the same spirit as HTTP/2 does. libcurl however does not take
 advantage of that ability but will instead always create a new connection for
 new transfers even if an existing connection already exists to the host.

 To fix this, libcurl would have to detect an existing connection and "attach"
 the new transfer to the existing one.

17.2 SFTP performance

 libcurl's SFTP transfer performance is sub par and can be improved, mostly by
 the approach mentioned in "1.6 Modified buffer size approach".

17.3 Support better than MD5 hostkey hash

 libcurl offers the CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 option for verifying the
 server's key. MD5 is generally being deprecated so we should implement
 support for stronger hashing algorithms. libssh2 itself is what provides this
 underlying functionality and it supports at least SHA-1 as an alternative.
 SHA-1 is also being deprecated these days so we should consider working with







<
<
<
<
<







788
789
790
791
792
793
794





795
796
797
798
799
800
801
 much in the same spirit as HTTP/2 does. libcurl however does not take
 advantage of that ability but will instead always create a new connection for
 new transfers even if an existing connection already exists to the host.

 To fix this, libcurl would have to detect an existing connection and "attach"
 the new transfer to the existing one.






17.3 Support better than MD5 hostkey hash

 libcurl offers the CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 option for verifying the
 server's key. MD5 is generally being deprecated so we should implement
 support for stronger hashing algorithms. libssh2 itself is what provides this
 underlying functionality and it supports at least SHA-1 as an alternative.
 SHA-1 is also being deprecated these days so we should consider working with
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024

 Add an option that prevents curl from overwriting existing local files. When
 used, and there already is an existing file with the target file name
 (either -O or -o), a number should be appended (and increased if already
 existing). So that index.html becomes first index.html.1 and then
 index.html.2 etc.

18.4 simultaneous parallel transfers

 The client could be told to use maximum N simultaneous parallel transfers and
 then just make sure that happens. It should of course not make more than one
 connection to the same remote host. This would require the client to use the
 multi interface. https://curl.haxx.se/bug/feature.cgi?id=1558595

 Using the multi interface would also allow properly using parallel transfers
 with HTTP/2 and supporting HTTP/2 server push from the command line.

18.5 UTF-8 filenames in Content-Disposition

 RFC 6266 documents how UTF-8 names can be passed to a client in the
 Content-Disposition header, and curl does not support this.

 https://github.com/curl/curl/issues/1888

18.6 warning when setting an option

 Display a warning when libcurl returns an error when setting an option.
 This can be useful to tell when support for a particular feature hasn't been
 compiled into the library.

18.7 at least N milliseconds between requests

 Allow curl command lines issue a lot of request against services that limit
 users to no more than N requests/second or similar. Could be implemented with
 an option asking that at least a certain time has elapsed since the previous
 request before the next one will be performed. Example:








<
<
<
<
<
<
<
<
<
<







<
<
<
<
<
<







826
827
828
829
830
831
832










833
834
835
836
837
838
839






840
841
842
843
844
845
846

 Add an option that prevents curl from overwriting existing local files. When
 used, and there already is an existing file with the target file name
 (either -O or -o), a number should be appended (and increased if already
 existing). So that index.html becomes first index.html.1 and then
 index.html.2 etc.











18.5 UTF-8 filenames in Content-Disposition

 RFC 6266 documents how UTF-8 names can be passed to a client in the
 Content-Disposition header, and curl does not support this.

 https://github.com/curl/curl/issues/1888







18.7 at least N milliseconds between requests

 Allow curl command lines issue a lot of request against services that limit
 users to no more than N requests/second or similar. Could be implemented with
 an option asking that at least a certain time has elapsed since the previous
 request before the next one will be performed. Example:

1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096

 Provide an option that makes curl not exit after the last URL (or even work
 without a given URL), and then make it read instructions passed on a pipe or
 over a socket to make further instructions so that a second subsequent curl
 invoke can talk to the still running instance and ask for transfers to get
 done, and thus maintain its connection pool, DNS cache and more.

18.13 support metalink in http headers

 Curl has support for downloading a metalink xml file, processing it, and then
 downloading the target of the metalink. This is done via the --metalink option.
 It would be nice if metalink also supported downloading via metalink
 information that is stored in HTTP headers (RFC 6249). Theoretically this could
 also be supported with the --metalink option.

 See https://tools.ietf.org/html/rfc6249

 See also https://lists.gnu.org/archive/html/bug-wget/2015-06/msg00034.html for
 an implematation of this in wget.

18.14 --fail without --location should treat 3xx as a failure

 To allow a command line like this to detect a redirect and consider it a
 failure:

    curl -v --fail -O https://example.com/curl-7.48.0.tar.gz

 ... --fail must treat 3xx responses as failures too. The least problematic
 way to implement this is probably to add that new logic in the command line
 tool only and not in the underlying CURLOPT_FAILONERROR logic.

18.15 --retry should resume

 When --retry is used and curl actually retries transfer, it should use the
 already transferred data and do a resumed transfer for the rest (when
 possible) so that it doesn't have to transfer the same data again that was
 already transferred before the retry.








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







881
882
883
884
885
886
887
























888
889
890
891
892
893
894

 Provide an option that makes curl not exit after the last URL (or even work
 without a given URL), and then make it read instructions passed on a pipe or
 over a socket to make further instructions so that a second subsequent curl
 invoke can talk to the still running instance and ask for transfers to get
 done, and thus maintain its connection pool, DNS cache and more.

























18.15 --retry should resume

 When --retry is used and curl actually retries transfer, it should use the
 already transferred data and do a resumed transfer for the rest (when
 possible) so that it doesn't have to transfer the same data again that was
 already transferred before the retry.

1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
20.4 more platforms supported

 Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
 fork()s and it should become even more portable.

20.5 Add support for concurrent connections

 Tests 836, 882 and 938 were designed to verify that separate connections aren't
 used when using different login credentials in protocols that shouldn't re-use
 a connection under such circumstances.

 Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent
 connections. The read while() loop seems to loop until it receives a disconnect
 from the client, where it then enters the waiting for connections loop. When
 the client opens a second connection to the server, the first connection hasn't
 been dropped (unless it has been forced - which we shouldn't do in these tests)
 and thus the wait for connections loop is never entered to receive the second
 connection.

20.6 Use the RFC6265 test suite

 A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at
 https://github.com/abarth/http-state/tree/master/tests

 It'd be really awesome if someone would write a script/setup that would run







|
|
|


|
|
|
|
|
|







996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
20.4 more platforms supported

 Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
 fork()s and it should become even more portable.

20.5 Add support for concurrent connections

 Tests 836, 882 and 938 were designed to verify that separate connections
 aren't used when using different login credentials in protocols that
 shouldn't re-use a connection under such circumstances.

 Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent
 connections. The read while() loop seems to loop until it receives a
 disconnect from the client, where it then enters the waiting for connections
 loop. When the client opens a second connection to the server, the first
 connection hasn't been dropped (unless it has been forced - which we
 shouldn't do in these tests) and thus the wait for connections loop is never
 entered to receive the second connection.

20.6 Use the RFC6265 test suite

 A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at
 https://github.com/abarth/http-state/tree/master/tests

 It'd be really awesome if someone would write a script/setup that would run
Changes to jni/curl/docs/cmdline-opts/Makefile.in.
291
292
293
294
295
296
297



298
299

300
301
302
303
304
305
306
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
424
425
426
427
428
429
430

431
432
433
434
435
436
437
  head.d header.d				\
  help.d					\
  hostpubmd5.d					\
  http0.9.d					\
  http1.0.d					\
  http1.1.d http2.d				\
  http2-prior-knowledge.d			\

  ignore-content-length.d			\
  include.d					\
  insecure.d					\
  interface.d					\
  ipv4.d ipv6.d					\
  junk-session-cookies.d			\
  keepalive-time.d				\







>







428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
  head.d header.d				\
  help.d					\
  hostpubmd5.d					\
  http0.9.d					\
  http1.0.d					\
  http1.1.d http2.d				\
  http2-prior-knowledge.d			\
  http3.d                                       \
  ignore-content-length.d			\
  include.d					\
  insecure.d					\
  interface.d					\
  ipv4.d ipv6.d					\
  junk-session-cookies.d			\
  keepalive-time.d				\
459
460
461
462
463
464
465
466



467
468
469
470
471
472
473
  no-buffer.d					\
  no-keepalive.d				\
  no-npn.d					\
  no-sessionid.d				\
  noproxy.d					\
  ntlm.d ntlm-wb.d				\
  oauth2-bearer.d				\
  output.d pass.d				\



  path-as-is.d					\
  pinnedpubkey.d				\
  post301.d					\
  post302.d					\
  post303.d					\
  preproxy.d					\
  progress-bar.d				\







|
>
>
>







464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
  no-buffer.d					\
  no-keepalive.d				\
  no-npn.d					\
  no-sessionid.d				\
  noproxy.d					\
  ntlm.d ntlm-wb.d				\
  oauth2-bearer.d				\
  output.d                                      \
  pass.d                			\
  parallel.d                                    \
  parallel-max.d                                \
  path-as-is.d					\
  pinnedpubkey.d				\
  post301.d					\
  post302.d					\
  post303.d					\
  preproxy.d					\
  progress-bar.d				\
513
514
515
516
517
518
519

520
521
522
523
524
525
526
  request-target.d				\
  request.d					\
  resolve.d					\
  retry-connrefused.d				\
  retry-delay.d					\
  retry-max-time.d				\
  retry.d					\

  sasl-ir.d					\
  service-name.d				\
  show-error.d					\
  silent.d					\
  socks4.d socks5.d				\
  socks4a.d					\
  socks5-basic.d				\







>







521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
  request-target.d				\
  request.d					\
  resolve.d					\
  retry-connrefused.d				\
  retry-delay.d					\
  retry-max-time.d				\
  retry.d					\
  sasl-authzid.d					\
  sasl-ir.d					\
  service-name.d				\
  show-error.d					\
  silent.d					\
  socks4.d socks5.d				\
  socks4a.d					\
  socks5-basic.d				\
Changes to jni/curl/docs/cmdline-opts/Makefile.inc.
61
62
63
64
65
66
67

68
69
70
71
72
73
74
  head.d header.d				\
  help.d					\
  hostpubmd5.d					\
  http0.9.d					\
  http1.0.d					\
  http1.1.d http2.d				\
  http2-prior-knowledge.d			\

  ignore-content-length.d			\
  include.d					\
  insecure.d					\
  interface.d					\
  ipv4.d ipv6.d					\
  junk-session-cookies.d			\
  keepalive-time.d				\







>







61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  head.d header.d				\
  help.d					\
  hostpubmd5.d					\
  http0.9.d					\
  http1.0.d					\
  http1.1.d http2.d				\
  http2-prior-knowledge.d			\
  http3.d                                       \
  ignore-content-length.d			\
  include.d					\
  insecure.d					\
  interface.d					\
  ipv4.d ipv6.d					\
  junk-session-cookies.d			\
  keepalive-time.d				\
96
97
98
99
100
101
102
103



104
105
106
107
108
109
110
  no-buffer.d					\
  no-keepalive.d				\
  no-npn.d					\
  no-sessionid.d				\
  noproxy.d					\
  ntlm.d ntlm-wb.d				\
  oauth2-bearer.d				\
  output.d pass.d				\



  path-as-is.d					\
  pinnedpubkey.d				\
  post301.d					\
  post302.d					\
  post303.d					\
  preproxy.d					\
  progress-bar.d				\







|
>
>
>







97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  no-buffer.d					\
  no-keepalive.d				\
  no-npn.d					\
  no-sessionid.d				\
  noproxy.d					\
  ntlm.d ntlm-wb.d				\
  oauth2-bearer.d				\
  output.d                                      \
  pass.d                			\
  parallel.d                                    \
  parallel-max.d                                \
  path-as-is.d					\
  pinnedpubkey.d				\
  post301.d					\
  post302.d					\
  post303.d					\
  preproxy.d					\
  progress-bar.d				\
150
151
152
153
154
155
156

157
158
159
160
161
162
163
  request-target.d				\
  request.d					\
  resolve.d					\
  retry-connrefused.d				\
  retry-delay.d					\
  retry-max-time.d				\
  retry.d					\

  sasl-ir.d					\
  service-name.d				\
  show-error.d					\
  silent.d					\
  socks4.d socks5.d				\
  socks4a.d					\
  socks5-basic.d				\







>







154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
  request-target.d				\
  request.d					\
  resolve.d					\
  retry-connrefused.d				\
  retry-delay.d					\
  retry-max-time.d				\
  retry.d					\
  sasl-authzid.d					\
  sasl-ir.d					\
  service-name.d				\
  show-error.d					\
  silent.d					\
  socks4.d socks5.d				\
  socks4a.d					\
  socks5-basic.d				\
Changes to jni/curl/docs/cmdline-opts/config.d.
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

1) curl tries to find the "home dir": It first checks for the CURL_HOME and
then the HOME environment variables. Failing that, it uses getpwuid() on
Unix-like systems (which returns the home dir given the current user in your
system). On Windows, it then checks for the APPDATA variable, or as a last
resort the '%USERPROFILE%\\Application Data'.

2) On windows, if there is no _curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.

.nf
# --- Example file ---
# this is a comment
url = "example.com"







|







36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

1) curl tries to find the "home dir": It first checks for the CURL_HOME and
then the HOME environment variables. Failing that, it uses getpwuid() on
Unix-like systems (which returns the home dir given the current user in your
system). On Windows, it then checks for the APPDATA variable, or as a last
resort the '%USERPROFILE%\\Application Data'.

2) On windows, if there is no .curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.

.nf
# --- Example file ---
# this is a comment
url = "example.com"
Changes to jni/curl/docs/cmdline-opts/http0.9.d.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Long: http0.9
Tags: Versions
Protocols: HTTP
Added:
Help: Allow HTTP 0.9 responses
---
Tells curl to be fine with HTTP version 0.9 response.

HTTP/0.9 is a completely headerless response and therefore you can also
connect with this to non-HTTP servers and still get a response since curl will
simply transparently downgrade - if allowed.

A future curl version will deny continuing if the response isn't at least
HTTP/1.0 unless this option is used.












<
|
1
2
3
4
5
6
7
8
9
10
11
12

13
Long: http0.9
Tags: Versions
Protocols: HTTP
Added:
Help: Allow HTTP 0.9 responses
---
Tells curl to be fine with HTTP version 0.9 response.

HTTP/0.9 is a completely headerless response and therefore you can also
connect with this to non-HTTP servers and still get a response since curl will
simply transparently downgrade - if allowed.


Since curl 7.66.0, HTTP/0.9 is disabled by default.
Changes to jni/curl/docs/cmdline-opts/http2.d.
1
2
3
4
5
6
7
8

9
10
Long: http2
Tags: Versions
Protocols: HTTP
Added: 7.33.0
Mutexed: http1.1 http1.0 http2-prior-knowledge
Requires: HTTP/2
See-also: no-alpn
Help: Use HTTP 2

---
Tells curl to use HTTP version 2.








>


1
2
3
4
5
6
7
8
9
10
11
Long: http2
Tags: Versions
Protocols: HTTP
Added: 7.33.0
Mutexed: http1.1 http1.0 http2-prior-knowledge
Requires: HTTP/2
See-also: no-alpn
Help: Use HTTP 2
See-also: http1.1 http3
---
Tells curl to use HTTP version 2.
Added jni/curl/docs/cmdline-opts/http3.d.






































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Long: http3
Tags: Versions
Protocols: HTTP
Added: 7.66.0
Mutexed: http1.1 http1.0 http2 http2-prior-knowledge
Requires: HTTP/3
Help: Use HTTP v3
See-also: http1.1 http2
---

WARNING: this option is experiemental. Do not use in production.

Tells curl to use HTTP version 3 directly to the host and port number used in
the URL. A normal HTTP/3 transaction will be done to a host and then get
redirected via Alt-SVc, but this option allows a user to circumvent that when
you know that the target speaks HTTP/3 on the given host and port.

This option will make curl fail if a QUIC connection cannot be established, it
cannot fall back to a lower HTTP version on its own.
Added jni/curl/docs/cmdline-opts/parallel-max.d.


















>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
Long: parallel-max
Help: Maximum concurrency for parallel transfers
Added: 7.66.0
See-also: parallel
---
When asked to do parallel transfers, using --parallel, this option controls
the maximum amount of transfers to do simultaneously.

The default is 50.
Added jni/curl/docs/cmdline-opts/parallel.d.














>
>
>
>
>
>
>
1
2
3
4
5
6
7
Short: Z
Long: parallel
Help: Perform transfers in parallel
Added: 7.66.0
---
Makes curl perform its transfers in parallel as compared to the regular serial
manner.
Changes to jni/curl/docs/cmdline-opts/retry.d.
9
10
11
12
13
14
15



16
17
a timeout, an FTP 4xx response code or an HTTP 408 or 5xx response code.

When curl is about to retry a transfer, it will first wait one second and then
for all forthcoming retries it will double the waiting time until it reaches
10 minutes which then will be the delay between the rest of the retries.  By
using --retry-delay you disable this exponential backoff algorithm. See also
--retry-max-time to limit the total time allowed for retries.




If this option is used several times, the last one will be used.







>
>
>


9
10
11
12
13
14
15
16
17
18
19
20
a timeout, an FTP 4xx response code or an HTTP 408 or 5xx response code.

When curl is about to retry a transfer, it will first wait one second and then
for all forthcoming retries it will double the waiting time until it reaches
10 minutes which then will be the delay between the rest of the retries.  By
using --retry-delay you disable this exponential backoff algorithm. See also
--retry-max-time to limit the total time allowed for retries.

Since curl 7.66.0, curl will comply with the Retry-After: response header if
one was present to know when to issue the next retry.

If this option is used several times, the last one will be used.
Added jni/curl/docs/cmdline-opts/sasl-authzid.d.






















>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
Long: sasl-authzid
Help: Use this identity to act as during SASL PLAIN authentication
Added: 7.66.0
---
Use this authorisation identity (authzid), during SASL PLAIN authentication,
in addition to the authentication identity (authcid) as specified by --user.

If the option isn't specified, the server will derive the authzid from the
authcid, but if specified, and depending on the server implementation, it may
be used to access another user's inbox, that the user has been granted access
to, or a shared mailbox for example.
Changes to jni/curl/docs/curl-config.1.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl-config 1 "November 30, 2017" "Curl 7.65.3" "curl-config manual"

.SH NAME
curl-config \- Get information about a libcurl installation
.SH SYNOPSIS
.B curl-config [options]
.SH DESCRIPTION
.B curl-config







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl-config 1 "November 30, 2017" "Curl 7.66.0" "curl-config manual"

.SH NAME
curl-config \- Get information about a libcurl installation
.SH SYNOPSIS
.B curl-config [options]
.SH DESCRIPTION
.B curl-config
Changes to jni/curl/docs/curl.1.
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.\" DO NOT EDIT. Generated by the curl project gen.pl man page generator.
.\"
.TH curl 1 "November 16, 2016" "Curl 7.65.3" "Curl Manual"

.SH NAME
curl \- transfer a URL
.SH SYNOPSIS
.B curl [options / URLs]
.SH DESCRIPTION
.B curl







|







18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.\" DO NOT EDIT. Generated by the curl project gen.pl man page generator.
.\"
.TH curl 1 "November 16, 2016" "Curl 7.66.0" "Curl Manual"

.SH NAME
curl \- transfer a URL
.SH SYNOPSIS
.B curl [options / URLs]
.SH DESCRIPTION
.B curl
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356

1) curl tries to find the "home dir": It first checks for the CURL_HOME and
then the HOME environment variables. Failing that, it uses getpwuid() on
Unix-like systems (which returns the home dir given the current user in your
system). On Windows, it then checks for the APPDATA variable, or as a last
resort the '%USERPROFILE%\\Application Data'.

2) On windows, if there is no _curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.

.nf
# --- Example file ---
# this is a comment
url = "example.com"







|







342
343
344
345
346
347
348
349
350
351
352
353
354
355
356

1) curl tries to find the "home dir": It first checks for the CURL_HOME and
then the HOME environment variables. Failing that, it uses getpwuid() on
Unix-like systems (which returns the home dir given the current user in your
system). On Windows, it then checks for the APPDATA variable, or as a last
resort the '%USERPROFILE%\\Application Data'.

2) On windows, if there is no .curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.

.nf
# --- Example file ---
# this is a comment
url = "example.com"
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086













1087
1088
1089
1090
1091
1092
1093
.IP "--http0.9"
(HTTP) Tells curl to be fine with HTTP version 0.9 response.

HTTP/0.9 is a completely headerless response and therefore you can also
connect with this to non-HTTP servers and still get a response since curl will
simply transparently downgrade - if allowed.

A future curl version will deny continuing if the response isn't at least
HTTP/1.0 unless this option is used.
.IP "-0, --http1.0"
(HTTP) Tells curl to use HTTP version 1.0 instead of using its internally preferred
HTTP version.

This option overrides \fI--http1.1\fP and \fI--http2\fP.
.IP "--http1.1"
(HTTP) Tells curl to use HTTP version 1.1.

This option overrides \fI-0, --http1.0\fP and \fI--http2\fP. Added in 7.33.0.
.IP "--http2-prior-knowledge"
(HTTP) Tells curl to issue its non-TLS HTTP requests using HTTP/2 without HTTP/1.1
Upgrade. It requires prior knowledge that the server supports HTTP/2 straight
away. HTTPS requests will still do HTTP/2 the standard way with negotiated
protocol version in the TLS handshake.

\fI--http2-prior-knowledge\fP requires that the underlying libcurl was built to support HTTP/2. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2\fP. Added in 7.49.0.
.IP "--http2"
(HTTP) Tells curl to use HTTP version 2.

See also \fI--no-alpn\fP. \fI--http2\fP requires that the underlying libcurl was built to support HTTP/2. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2-prior-knowledge\fP. Added in 7.33.0.













.IP "--ignore-content-length"
(FTP HTTP) For HTTP, Ignore the Content-Length header. This is particularly useful for
servers running Apache 1.x, which will report incorrect Content-Length for
files larger than 2 gigabytes.

For FTP (since 7.46.0), skip the RETR command to figure out the size before
downloading a file.







<
|



















|
>
>
>
>
>
>
>
>
>
>
>
>
>







1058
1059
1060
1061
1062
1063
1064

1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
.IP "--http0.9"
(HTTP) Tells curl to be fine with HTTP version 0.9 response.

HTTP/0.9 is a completely headerless response and therefore you can also
connect with this to non-HTTP servers and still get a response since curl will
simply transparently downgrade - if allowed.


Since curl 7.66.0, HTTP/0.9 is disabled by default.
.IP "-0, --http1.0"
(HTTP) Tells curl to use HTTP version 1.0 instead of using its internally preferred
HTTP version.

This option overrides \fI--http1.1\fP and \fI--http2\fP.
.IP "--http1.1"
(HTTP) Tells curl to use HTTP version 1.1.

This option overrides \fI-0, --http1.0\fP and \fI--http2\fP. Added in 7.33.0.
.IP "--http2-prior-knowledge"
(HTTP) Tells curl to issue its non-TLS HTTP requests using HTTP/2 without HTTP/1.1
Upgrade. It requires prior knowledge that the server supports HTTP/2 straight
away. HTTPS requests will still do HTTP/2 the standard way with negotiated
protocol version in the TLS handshake.

\fI--http2-prior-knowledge\fP requires that the underlying libcurl was built to support HTTP/2. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2\fP. Added in 7.49.0.
.IP "--http2"
(HTTP) Tells curl to use HTTP version 2.

See also \fI--http1.1\fP and \fI--http3\fP. \fI--http2\fP requires that the underlying libcurl was built to support HTTP/2. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2-prior-knowledge\fP. Added in 7.33.0.
.IP "--http3"
(HTTP) 
WARNING: this option is experiemental. Do not use in production.

Tells curl to use HTTP version 3 directly to the host and port number used in
the URL. A normal HTTP/3 transaction will be done to a host and then get
redirected via Alt-SVc, but this option allows a user to circumvent that when
you know that the target speaks HTTP/3 on the given host and port.

This option will make curl fail if a QUIC connection cannot be established, it
cannot fall back to a lower HTTP version on its own.

See also \fI--http1.1\fP and \fI--http2\fP. \fI--http3\fP requires that the underlying libcurl was built to support HTTP/3. This option overrides \fI--http1.1\fP and \fI-0, --http1.0\fP and \fI--http2\fP and \fI--http2-prior-knowledge\fP. Added in 7.66.0.
.IP "--ignore-content-length"
(FTP HTTP) For HTTP, Ignore the Content-Length header. This is particularly useful for
servers running Apache 1.x, which will report incorrect Content-Length for
files larger than 2 gigabytes.

For FTP (since 7.46.0), skip the RETR command to figure out the size before
downloading a file.
1509
1510
1511
1512
1513
1514
1515












1516
1517
1518
1519
1520
1521
1522
  curl example.com example.net -o aa -o bb

See also the \fI--create-dirs\fP option to create the local directories
dynamically. Specifying the output as '-' (a single dash) will force the
output to be done to stdout.

See also \fI-O, --remote-name\fP and \fI--remote-name-all\fP and \fI-J, --remote-header-name\fP.












.IP "--pass <phrase>"
(SSH TLS) Passphrase for the private key

If this option is used several times, the last one will be used.
.IP "--path-as-is"
Tell curl to not handle sequences of /../ or /./ in the given URL
path. Normally curl will squash or merge them according to standards but with







>
>
>
>
>
>
>
>
>
>
>
>







1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
  curl example.com example.net -o aa -o bb

See also the \fI--create-dirs\fP option to create the local directories
dynamically. Specifying the output as '-' (a single dash) will force the
output to be done to stdout.

See also \fI-O, --remote-name\fP and \fI--remote-name-all\fP and \fI-J, --remote-header-name\fP.
.IP "--parallel-max"
When asked to do parallel transfers, using \fI-Z, --parallel\fP, this option controls
the maximum amount of transfers to do simultaneously.

The default is 50.

See also \fI-Z, --parallel\fP. Added in 7.66.0.
.IP "-Z, --parallel"
Makes curl perform its transfers in parallel as compared to the regular serial
manner.

Added in 7.66.0.
.IP "--pass <phrase>"
(SSH TLS) Passphrase for the private key

If this option is used several times, the last one will be used.
.IP "--path-as-is"
Tell curl to not handle sequences of /../ or /./ in the given URL
path. Normally curl will squash or merge them according to standards but with
2134
2135
2136
2137
2138
2139
2140



2141
2142
2143
2144










2145
2146
2147
2148
2149
2150
2151
a timeout, an FTP 4xx response code or an HTTP 408 or 5xx response code.

When curl is about to retry a transfer, it will first wait one second and then
for all forthcoming retries it will double the waiting time until it reaches
10 minutes which then will be the delay between the rest of the retries.  By
using \fI--retry-delay\fP you disable this exponential backoff algorithm. See also
\fI--retry-max-time\fP to limit the total time allowed for retries.




If this option is used several times, the last one will be used.

Added in 7.12.3.










.IP "--sasl-ir"
Enable initial response in SASL authentication.

Added in 7.31.0.
.IP "--service-name <name>"
This option allows you to change the service name for SPNEGO.








>
>
>




>
>
>
>
>
>
>
>
>
>







2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
a timeout, an FTP 4xx response code or an HTTP 408 or 5xx response code.

When curl is about to retry a transfer, it will first wait one second and then
for all forthcoming retries it will double the waiting time until it reaches
10 minutes which then will be the delay between the rest of the retries.  By
using \fI--retry-delay\fP you disable this exponential backoff algorithm. See also
\fI--retry-max-time\fP to limit the total time allowed for retries.

Since curl 7.66.0, curl will comply with the Retry-After: response header if
one was present to know when to issue the next retry.

If this option is used several times, the last one will be used.

Added in 7.12.3.
.IP "--sasl-authzid"
Use this authorisation identity (authzid), during SASL PLAIN authentication,
in addition to the authentication identity (authcid) as specified by \fI-u, --user\fP.

If the option isn't specified, the server will derive the authzid from the
authcid, but if specified, and depending on the server implementation, it may
be used to access another user's inbox, that the user has been granted access
to, or a shared mailbox for example.

Added in 7.66.0.
.IP "--sasl-ir"
Enable initial response in SASL authentication.

Added in 7.31.0.
.IP "--service-name <name>"
This option allows you to change the service name for SPNEGO.

Changes to jni/curl/docs/examples/Makefile.in.
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is







|







39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
159
160
161
162
163
164
165
166


167
168
169
170
171
172
173
	sftpget$(EXEEXT) ftpsget$(EXEEXT) postinmemory$(EXEEXT) \
	http2-download$(EXEEXT) http2-upload$(EXEEXT) \
	http2-serverpush$(EXEEXT) getredirect$(EXEEXT) \
	ftpuploadfrommem$(EXEEXT) ftpuploadresume$(EXEEXT) \
	sslbackend$(EXEEXT) postit2-formadd$(EXEEXT) \
	multi-formadd$(EXEEXT) shared-connection-cache$(EXEEXT) \
	sftpuploadresume$(EXEEXT) http2-pushinmemory$(EXEEXT) \
	parseurl$(EXEEXT) urlapi$(EXEEXT)


subdir = docs/examples
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
	$(top_srcdir)/m4/curl-compilers.m4 \
	$(top_srcdir)/m4/curl-confopts.m4 \
	$(top_srcdir)/m4/curl-functions.m4 \
	$(top_srcdir)/m4/curl-openssl.m4 \







|
>
>







159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
	sftpget$(EXEEXT) ftpsget$(EXEEXT) postinmemory$(EXEEXT) \
	http2-download$(EXEEXT) http2-upload$(EXEEXT) \
	http2-serverpush$(EXEEXT) getredirect$(EXEEXT) \
	ftpuploadfrommem$(EXEEXT) ftpuploadresume$(EXEEXT) \
	sslbackend$(EXEEXT) postit2-formadd$(EXEEXT) \
	multi-formadd$(EXEEXT) shared-connection-cache$(EXEEXT) \
	sftpuploadresume$(EXEEXT) http2-pushinmemory$(EXEEXT) \
	parseurl$(EXEEXT) urlapi$(EXEEXT) imap-authzid$(EXEEXT) \
	pop3-authzid$(EXEEXT) smtp-authzid$(EXEEXT) http3$(EXEEXT) \
	altsvc$(EXEEXT) http3-present$(EXEEXT)
subdir = docs/examples
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compile_check_sizeof.m4 \
	$(top_srcdir)/m4/curl-compilers.m4 \
	$(top_srcdir)/m4/curl-confopts.m4 \
	$(top_srcdir)/m4/curl-functions.m4 \
	$(top_srcdir)/m4/curl-openssl.m4 \
198
199
200
201
202
203
204







205
206
207
208
209
210
211
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@10_at_a_time_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
am__v_lt_1 = 







anyauthput_SOURCES = anyauthput.c
anyauthput_OBJECTS = anyauthput.$(OBJEXT)
anyauthput_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@anyauthput_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@anyauthput_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la







>
>
>
>
>
>
>







200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@10_at_a_time_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
am__v_lt_1 = 
altsvc_SOURCES = altsvc.c
altsvc_OBJECTS = altsvc.$(OBJEXT)
altsvc_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@altsvc_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@altsvc_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
anyauthput_SOURCES = anyauthput.c
anyauthput_OBJECTS = anyauthput.$(OBJEXT)
anyauthput_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@anyauthput_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@anyauthput_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
364
365
366
367
368
369
370













371
372
373
374
375
376
377
http2_upload_SOURCES = http2-upload.c
http2_upload_OBJECTS = http2-upload.$(OBJEXT)
http2_upload_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@http2_upload_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@http2_upload_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la













httpcustomheader_SOURCES = httpcustomheader.c
httpcustomheader_OBJECTS = httpcustomheader.$(OBJEXT)
httpcustomheader_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@httpcustomheader_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@httpcustomheader_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la







>
>
>
>
>
>
>
>
>
>
>
>
>







373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
http2_upload_SOURCES = http2-upload.c
http2_upload_OBJECTS = http2-upload.$(OBJEXT)
http2_upload_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@http2_upload_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@http2_upload_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
http3_SOURCES = http3.c
http3_OBJECTS = http3.$(OBJEXT)
http3_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@http3_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@http3_DEPENDENCIES = $(LIBDIR)/libcurl.la
http3_present_SOURCES = http3-present.c
http3_present_OBJECTS = http3-present.$(OBJEXT)
http3_present_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@http3_present_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@http3_present_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
httpcustomheader_SOURCES = httpcustomheader.c
httpcustomheader_OBJECTS = httpcustomheader.$(OBJEXT)
httpcustomheader_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@httpcustomheader_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@httpcustomheader_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
391
392
393
394
395
396
397







398
399
400
401
402
403
404
imap_append_SOURCES = imap-append.c
imap_append_OBJECTS = imap-append.$(OBJEXT)
imap_append_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@imap_append_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@imap_append_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la







imap_copy_SOURCES = imap-copy.c
imap_copy_OBJECTS = imap-copy.$(OBJEXT)
imap_copy_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@imap_copy_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@imap_copy_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la







>
>
>
>
>
>
>







413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
imap_append_SOURCES = imap-append.c
imap_append_OBJECTS = imap-append.$(OBJEXT)
imap_append_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@imap_append_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@imap_append_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
imap_authzid_SOURCES = imap-authzid.c
imap_authzid_OBJECTS = imap-authzid.$(OBJEXT)
imap_authzid_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@imap_authzid_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@imap_authzid_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
imap_copy_SOURCES = imap-copy.c
imap_copy_OBJECTS = imap-copy.$(OBJEXT)
imap_copy_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@imap_copy_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@imap_copy_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
538
539
540
541
542
543
544







545
546
547
548
549
550
551
persistent_SOURCES = persistent.c
persistent_OBJECTS = persistent.$(OBJEXT)
persistent_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@persistent_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@persistent_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la







pop3_dele_SOURCES = pop3-dele.c
pop3_dele_OBJECTS = pop3-dele.$(OBJEXT)
pop3_dele_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_dele_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_dele_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la







>
>
>
>
>
>
>







567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
persistent_SOURCES = persistent.c
persistent_OBJECTS = persistent.$(OBJEXT)
persistent_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@persistent_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@persistent_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
pop3_authzid_SOURCES = pop3-authzid.c
pop3_authzid_OBJECTS = pop3-authzid.$(OBJEXT)
pop3_authzid_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_authzid_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_authzid_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
pop3_dele_SOURCES = pop3-dele.c
pop3_dele_OBJECTS = pop3-dele.$(OBJEXT)
pop3_dele_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@pop3_dele_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@pop3_dele_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
711
712
713
714
715
716
717







718
719
720
721
722
723
724
simplessl_SOURCES = simplessl.c
simplessl_OBJECTS = simplessl.$(OBJEXT)
simplessl_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@simplessl_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@simplessl_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la







smtp_expn_SOURCES = smtp-expn.c
smtp_expn_OBJECTS = smtp-expn.$(OBJEXT)
smtp_expn_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@smtp_expn_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@smtp_expn_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la







>
>
>
>
>
>
>







747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
simplessl_SOURCES = simplessl.c
simplessl_OBJECTS = simplessl.$(OBJEXT)
simplessl_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@simplessl_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@simplessl_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
smtp_authzid_SOURCES = smtp-authzid.c
smtp_authzid_OBJECTS = smtp-authzid.$(OBJEXT)
smtp_authzid_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@smtp_authzid_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@smtp_authzid_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
smtp_expn_SOURCES = smtp-expn.c
smtp_expn_OBJECTS = smtp-expn.$(OBJEXT)
smtp_expn_LDADD = $(LDADD)
@USE_EXPLICIT_LIB_DEPS_FALSE@smtp_expn_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_FALSE@	$(LIBDIR)/libcurl.la
@USE_EXPLICIT_LIB_DEPS_TRUE@smtp_expn_DEPENDENCIES =  \
@USE_EXPLICIT_LIB_DEPS_TRUE@	$(LIBDIR)/libcurl.la
797
798
799
800
801
802
803

804
805
806
807
808
809
810
811
812
813
814
815
816

817
818

819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841

842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872

873
874
875
876
877
878
879
880
881
882
883
884

885
886
887
888
889
890
891

892
893
894
895
896
897
898
899
900
901
902
903

904
905
906
907
908
909
910
911
912
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
am__v_at_1 = 
DEFAULT_INCLUDES = 
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__maybe_remake_depfiles = depfiles
am__depfiles_remade = ./$(DEPDIR)/10-at-a-time.Po \

	./$(DEPDIR)/anyauthput.Po ./$(DEPDIR)/certinfo.Po \
	./$(DEPDIR)/chkspeed.Po ./$(DEPDIR)/cookie_interface.Po \
	./$(DEPDIR)/debug.Po ./$(DEPDIR)/externalsocket.Po \
	./$(DEPDIR)/fileupload.Po ./$(DEPDIR)/fopen.Po \
	./$(DEPDIR)/ftp-wildcard.Po ./$(DEPDIR)/ftpget.Po \
	./$(DEPDIR)/ftpgetinfo.Po ./$(DEPDIR)/ftpgetresp.Po \
	./$(DEPDIR)/ftpsget.Po ./$(DEPDIR)/ftpupload.Po \
	./$(DEPDIR)/ftpuploadfrommem.Po ./$(DEPDIR)/ftpuploadresume.Po \
	./$(DEPDIR)/getinfo.Po ./$(DEPDIR)/getinmemory.Po \
	./$(DEPDIR)/getredirect.Po ./$(DEPDIR)/http-post.Po \
	./$(DEPDIR)/http2-download.Po \
	./$(DEPDIR)/http2-pushinmemory.Po \
	./$(DEPDIR)/http2-serverpush.Po ./$(DEPDIR)/http2-upload.Po \

	./$(DEPDIR)/httpcustomheader.Po ./$(DEPDIR)/httpput.Po \
	./$(DEPDIR)/https.Po ./$(DEPDIR)/imap-append.Po \

	./$(DEPDIR)/imap-copy.Po ./$(DEPDIR)/imap-create.Po \
	./$(DEPDIR)/imap-delete.Po ./$(DEPDIR)/imap-examine.Po \
	./$(DEPDIR)/imap-fetch.Po ./$(DEPDIR)/imap-list.Po \
	./$(DEPDIR)/imap-lsub.Po ./$(DEPDIR)/imap-multi.Po \
	./$(DEPDIR)/imap-noop.Po ./$(DEPDIR)/imap-search.Po \
	./$(DEPDIR)/imap-ssl.Po ./$(DEPDIR)/imap-store.Po \
	./$(DEPDIR)/imap-tls.Po ./$(DEPDIR)/multi-app.Po \
	./$(DEPDIR)/multi-debugcallback.Po ./$(DEPDIR)/multi-double.Po \
	./$(DEPDIR)/multi-formadd.Po ./$(DEPDIR)/multi-post.Po \
	./$(DEPDIR)/multi-single.Po ./$(DEPDIR)/parseurl.Po \
	./$(DEPDIR)/persistent.Po ./$(DEPDIR)/pop3-dele.Po \
	./$(DEPDIR)/pop3-list.Po ./$(DEPDIR)/pop3-multi.Po \
	./$(DEPDIR)/pop3-noop.Po ./$(DEPDIR)/pop3-retr.Po \
	./$(DEPDIR)/pop3-ssl.Po ./$(DEPDIR)/pop3-stat.Po \
	./$(DEPDIR)/pop3-tls.Po ./$(DEPDIR)/pop3-top.Po \
	./$(DEPDIR)/pop3-uidl.Po ./$(DEPDIR)/post-callback.Po \
	./$(DEPDIR)/postinmemory.Po ./$(DEPDIR)/postit2-formadd.Po \
	./$(DEPDIR)/postit2.Po ./$(DEPDIR)/progressfunc.Po \
	./$(DEPDIR)/resolve.Po ./$(DEPDIR)/rtsp.Po \
	./$(DEPDIR)/sendrecv.Po ./$(DEPDIR)/sepheaders.Po \
	./$(DEPDIR)/sftpget.Po ./$(DEPDIR)/sftpuploadresume.Po \
	./$(DEPDIR)/shared-connection-cache.Po ./$(DEPDIR)/simple.Po \
	./$(DEPDIR)/simplepost.Po ./$(DEPDIR)/simplessl.Po \

	./$(DEPDIR)/smtp-expn.Po ./$(DEPDIR)/smtp-mail.Po \
	./$(DEPDIR)/smtp-mime.Po ./$(DEPDIR)/smtp-multi.Po \
	./$(DEPDIR)/smtp-ssl.Po ./$(DEPDIR)/smtp-tls.Po \
	./$(DEPDIR)/smtp-vrfy.Po ./$(DEPDIR)/sslbackend.Po \
	./$(DEPDIR)/url2file.Po ./$(DEPDIR)/urlapi.Po
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
	$(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
am__v_CC_0 = @echo "  CC      " $@;
am__v_CC_1 = 
CCLD = $(CC)
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
	$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo "  CCLD    " $@;
am__v_CCLD_1 = 
SOURCES = 10-at-a-time.c anyauthput.c certinfo.c chkspeed.c \
	cookie_interface.c debug.c externalsocket.c fileupload.c \
	fopen.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c \
	ftpsget.c ftpupload.c ftpuploadfrommem.c ftpuploadresume.c \
	getinfo.c getinmemory.c getredirect.c http-post.c \
	http2-download.c http2-pushinmemory.c http2-serverpush.c \
	http2-upload.c httpcustomheader.c httpput.c https.c \

	imap-append.c imap-copy.c imap-create.c imap-delete.c \
	imap-examine.c imap-fetch.c imap-list.c imap-lsub.c \
	imap-multi.c imap-noop.c imap-search.c imap-ssl.c imap-store.c \
	imap-tls.c multi-app.c multi-debugcallback.c multi-double.c \
	multi-formadd.c multi-post.c multi-single.c parseurl.c \
	persistent.c pop3-dele.c pop3-list.c pop3-multi.c pop3-noop.c \
	pop3-retr.c pop3-ssl.c pop3-stat.c pop3-tls.c pop3-top.c \
	pop3-uidl.c post-callback.c postinmemory.c postit2.c \
	postit2-formadd.c progressfunc.c resolve.c rtsp.c sendrecv.c \
	sepheaders.c sftpget.c sftpuploadresume.c \
	shared-connection-cache.c simple.c simplepost.c simplessl.c \
	smtp-expn.c smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c \

	smtp-tls.c smtp-vrfy.c sslbackend.c url2file.c urlapi.c
DIST_SOURCES = 10-at-a-time.c anyauthput.c certinfo.c chkspeed.c \
	cookie_interface.c debug.c externalsocket.c fileupload.c \
	fopen.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c \
	ftpsget.c ftpupload.c ftpuploadfrommem.c ftpuploadresume.c \
	getinfo.c getinmemory.c getredirect.c http-post.c \
	http2-download.c http2-pushinmemory.c http2-serverpush.c \

	http2-upload.c httpcustomheader.c httpput.c https.c \
	imap-append.c imap-copy.c imap-create.c imap-delete.c \
	imap-examine.c imap-fetch.c imap-list.c imap-lsub.c \
	imap-multi.c imap-noop.c imap-search.c imap-ssl.c imap-store.c \
	imap-tls.c multi-app.c multi-debugcallback.c multi-double.c \
	multi-formadd.c multi-post.c multi-single.c parseurl.c \
	persistent.c pop3-dele.c pop3-list.c pop3-multi.c pop3-noop.c \
	pop3-retr.c pop3-ssl.c pop3-stat.c pop3-tls.c pop3-top.c \
	pop3-uidl.c post-callback.c postinmemory.c postit2.c \
	postit2-formadd.c progressfunc.c resolve.c rtsp.c sendrecv.c \
	sepheaders.c sftpget.c sftpuploadresume.c \
	shared-connection-cache.c simple.c simplepost.c simplessl.c \

	smtp-expn.c smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c \
	smtp-tls.c smtp-vrfy.c sslbackend.c url2file.c urlapi.c
am__can_run_installinfo = \
  case $$AM_UPDATE_INFO_DIR in \
    n|no|NO) false;; \
    *) (install-info --version) >/dev/null 2>&1;; \
  esac
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,







>
|
|
|
|
|
|
|
|
|
<
|


>


>
|
|
|
|
|
|
|
|
|
|
|












>
|
|
|
|
|



















|





|
>
|
|
|
|
|
|
|
|
|
|

|
>
|
|
|
|
|
|
|
>
|
|




|
|
|
|
|
|
>
|
|







840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856

857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
am__v_at_0 = @
am__v_at_1 = 
DEFAULT_INCLUDES = 
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__maybe_remake_depfiles = depfiles
am__depfiles_remade = ./$(DEPDIR)/10-at-a-time.Po \
	./$(DEPDIR)/altsvc.Po ./$(DEPDIR)/anyauthput.Po \
	./$(DEPDIR)/certinfo.Po ./$(DEPDIR)/chkspeed.Po \
	./$(DEPDIR)/cookie_interface.Po ./$(DEPDIR)/debug.Po \
	./$(DEPDIR)/externalsocket.Po ./$(DEPDIR)/fileupload.Po \
	./$(DEPDIR)/fopen.Po ./$(DEPDIR)/ftp-wildcard.Po \
	./$(DEPDIR)/ftpget.Po ./$(DEPDIR)/ftpgetinfo.Po \
	./$(DEPDIR)/ftpgetresp.Po ./$(DEPDIR)/ftpsget.Po \
	./$(DEPDIR)/ftpupload.Po ./$(DEPDIR)/ftpuploadfrommem.Po \
	./$(DEPDIR)/ftpuploadresume.Po ./$(DEPDIR)/getinfo.Po \
	./$(DEPDIR)/getinmemory.Po ./$(DEPDIR)/getredirect.Po \

	./$(DEPDIR)/http-post.Po ./$(DEPDIR)/http2-download.Po \
	./$(DEPDIR)/http2-pushinmemory.Po \
	./$(DEPDIR)/http2-serverpush.Po ./$(DEPDIR)/http2-upload.Po \
	./$(DEPDIR)/http3-present.Po ./$(DEPDIR)/http3.Po \
	./$(DEPDIR)/httpcustomheader.Po ./$(DEPDIR)/httpput.Po \
	./$(DEPDIR)/https.Po ./$(DEPDIR)/imap-append.Po \
	./$(DEPDIR)/imap-authzid.Po ./$(DEPDIR)/imap-copy.Po \
	./$(DEPDIR)/imap-create.Po ./$(DEPDIR)/imap-delete.Po \
	./$(DEPDIR)/imap-examine.Po ./$(DEPDIR)/imap-fetch.Po \
	./$(DEPDIR)/imap-list.Po ./$(DEPDIR)/imap-lsub.Po \
	./$(DEPDIR)/imap-multi.Po ./$(DEPDIR)/imap-noop.Po \
	./$(DEPDIR)/imap-search.Po ./$(DEPDIR)/imap-ssl.Po \
	./$(DEPDIR)/imap-store.Po ./$(DEPDIR)/imap-tls.Po \
	./$(DEPDIR)/multi-app.Po ./$(DEPDIR)/multi-debugcallback.Po \
	./$(DEPDIR)/multi-double.Po ./$(DEPDIR)/multi-formadd.Po \
	./$(DEPDIR)/multi-post.Po ./$(DEPDIR)/multi-single.Po \
	./$(DEPDIR)/parseurl.Po ./$(DEPDIR)/persistent.Po \
	./$(DEPDIR)/pop3-authzid.Po ./$(DEPDIR)/pop3-dele.Po \
	./$(DEPDIR)/pop3-list.Po ./$(DEPDIR)/pop3-multi.Po \
	./$(DEPDIR)/pop3-noop.Po ./$(DEPDIR)/pop3-retr.Po \
	./$(DEPDIR)/pop3-ssl.Po ./$(DEPDIR)/pop3-stat.Po \
	./$(DEPDIR)/pop3-tls.Po ./$(DEPDIR)/pop3-top.Po \
	./$(DEPDIR)/pop3-uidl.Po ./$(DEPDIR)/post-callback.Po \
	./$(DEPDIR)/postinmemory.Po ./$(DEPDIR)/postit2-formadd.Po \
	./$(DEPDIR)/postit2.Po ./$(DEPDIR)/progressfunc.Po \
	./$(DEPDIR)/resolve.Po ./$(DEPDIR)/rtsp.Po \
	./$(DEPDIR)/sendrecv.Po ./$(DEPDIR)/sepheaders.Po \
	./$(DEPDIR)/sftpget.Po ./$(DEPDIR)/sftpuploadresume.Po \
	./$(DEPDIR)/shared-connection-cache.Po ./$(DEPDIR)/simple.Po \
	./$(DEPDIR)/simplepost.Po ./$(DEPDIR)/simplessl.Po \
	./$(DEPDIR)/smtp-authzid.Po ./$(DEPDIR)/smtp-expn.Po \
	./$(DEPDIR)/smtp-mail.Po ./$(DEPDIR)/smtp-mime.Po \
	./$(DEPDIR)/smtp-multi.Po ./$(DEPDIR)/smtp-ssl.Po \
	./$(DEPDIR)/smtp-tls.Po ./$(DEPDIR)/smtp-vrfy.Po \
	./$(DEPDIR)/sslbackend.Po ./$(DEPDIR)/url2file.Po \
	./$(DEPDIR)/urlapi.Po
am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
	$(AM_CFLAGS) $(CFLAGS)
AM_V_CC = $(am__v_CC_@AM_V@)
am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
am__v_CC_0 = @echo "  CC      " $@;
am__v_CC_1 = 
CCLD = $(CC)
LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
	$(AM_LDFLAGS) $(LDFLAGS) -o $@
AM_V_CCLD = $(am__v_CCLD_@AM_V@)
am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
am__v_CCLD_0 = @echo "  CCLD    " $@;
am__v_CCLD_1 = 
SOURCES = 10-at-a-time.c altsvc.c anyauthput.c certinfo.c chkspeed.c \
	cookie_interface.c debug.c externalsocket.c fileupload.c \
	fopen.c ftp-wildcard.c ftpget.c ftpgetinfo.c ftpgetresp.c \
	ftpsget.c ftpupload.c ftpuploadfrommem.c ftpuploadresume.c \
	getinfo.c getinmemory.c getredirect.c http-post.c \
	http2-download.c http2-pushinmemory.c http2-serverpush.c \
	http2-upload.c http3.c http3-present.c httpcustomheader.c \
	httpput.c https.c imap-append.c imap-authzid.c imap-copy.c \
	imap-create.c imap-delete.c imap-examine.c imap-fetch.c \
	imap-list.c imap-lsub.c imap-multi.c imap-noop.c imap-search.c \
	imap-ssl.c imap-store.c imap-tls.c multi-app.c \
	multi-debugcallback.c multi-double.c multi-formadd.c \
	multi-post.c multi-single.c parseurl.c persistent.c \
	pop3-authzid.c pop3-dele.c pop3-list.c pop3-multi.c \
	pop3-noop.c pop3-retr.c pop3-ssl.c pop3-stat.c pop3-tls.c \
	pop3-top.c pop3-uidl.c post-callback.c postinmemory.c \
	postit2.c postit2-formadd.c progressfunc.c resolve.c rtsp.c \
	sendrecv.c sepheaders.c sftpget.c sftpuploadresume.c \
	shared-connection-cache.c simple.c simplepost.c simplessl.c \
	smtp-authzid.c smtp-expn.c smtp-mail.c smtp-mime.c \
	smtp-multi.c smtp-ssl.c smtp-tls.c smtp-vrfy.c sslbackend.c \
	url2file.c urlapi.c
DIST_SOURCES = 10-at-a-time.c altsvc.c anyauthput.c certinfo.c \
	chkspeed.c cookie_interface.c debug.c externalsocket.c \
	fileupload.c fopen.c ftp-wildcard.c ftpget.c ftpgetinfo.c \
	ftpgetresp.c ftpsget.c ftpupload.c ftpuploadfrommem.c \
	ftpuploadresume.c getinfo.c getinmemory.c getredirect.c \
	http-post.c http2-download.c http2-pushinmemory.c \
	http2-serverpush.c http2-upload.c http3.c http3-present.c \
	httpcustomheader.c httpput.c https.c imap-append.c \
	imap-authzid.c imap-copy.c imap-create.c imap-delete.c \
	imap-examine.c imap-fetch.c imap-list.c imap-lsub.c \
	imap-multi.c imap-noop.c imap-search.c imap-ssl.c imap-store.c \
	imap-tls.c multi-app.c multi-debugcallback.c multi-double.c \
	multi-formadd.c multi-post.c multi-single.c parseurl.c \
	persistent.c pop3-authzid.c pop3-dele.c pop3-list.c \
	pop3-multi.c pop3-noop.c pop3-retr.c pop3-ssl.c pop3-stat.c \
	pop3-tls.c pop3-top.c pop3-uidl.c post-callback.c \
	postinmemory.c postit2.c postit2-formadd.c progressfunc.c \
	resolve.c rtsp.c sendrecv.c sepheaders.c sftpget.c \
	sftpuploadresume.c shared-connection-cache.c simple.c \
	simplepost.c simplessl.c smtp-authzid.c smtp-expn.c \
	smtp-mail.c smtp-mime.c smtp-multi.c smtp-ssl.c smtp-tls.c \
	smtp-vrfy.c sslbackend.c url2file.c urlapi.c
am__can_run_installinfo = \
  case $$AM_UPDATE_INFO_DIR in \
    n|no|NO) false;; \
    *) (install-info --version) >/dev/null 2>&1;; \
  esac
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
1063
1064
1065
1066
1067
1068
1069



1070
1071

1072
1073
1074
1075
1076
1077
1078
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
1209
1210
1211
1212
1213
1214
1215




1216
1217
1218
1219
1220
1221
1222
	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
	echo " rm -f" $$list; \
	rm -f $$list

10-at-a-time$(EXEEXT): $(10_at_a_time_OBJECTS) $(10_at_a_time_DEPENDENCIES) $(EXTRA_10_at_a_time_DEPENDENCIES) 
	@rm -f 10-at-a-time$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(10_at_a_time_OBJECTS) $(10_at_a_time_LDADD) $(LIBS)





anyauthput$(EXEEXT): $(anyauthput_OBJECTS) $(anyauthput_DEPENDENCIES) $(EXTRA_anyauthput_DEPENDENCIES) 
	@rm -f anyauthput$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(anyauthput_OBJECTS) $(anyauthput_LDADD) $(LIBS)

certinfo$(EXEEXT): $(certinfo_OBJECTS) $(certinfo_DEPENDENCIES) $(EXTRA_certinfo_DEPENDENCIES) 
	@rm -f certinfo$(EXEEXT)







>
>
>
>







1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
	echo " rm -f" $$list; \
	rm -f $$list

10-at-a-time$(EXEEXT): $(10_at_a_time_OBJECTS) $(10_at_a_time_DEPENDENCIES) $(EXTRA_10_at_a_time_DEPENDENCIES) 
	@rm -f 10-at-a-time$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(10_at_a_time_OBJECTS) $(10_at_a_time_LDADD) $(LIBS)

altsvc$(EXEEXT): $(altsvc_OBJECTS) $(altsvc_DEPENDENCIES) $(EXTRA_altsvc_DEPENDENCIES) 
	@rm -f altsvc$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(altsvc_OBJECTS) $(altsvc_LDADD) $(LIBS)

anyauthput$(EXEEXT): $(anyauthput_OBJECTS) $(anyauthput_DEPENDENCIES) $(EXTRA_anyauthput_DEPENDENCIES) 
	@rm -f anyauthput$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(anyauthput_OBJECTS) $(anyauthput_LDADD) $(LIBS)

certinfo$(EXEEXT): $(certinfo_OBJECTS) $(certinfo_DEPENDENCIES) $(EXTRA_certinfo_DEPENDENCIES) 
	@rm -f certinfo$(EXEEXT)
1305
1306
1307
1308
1309
1310
1311








1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327




1328
1329
1330
1331
1332
1333
1334
http2-serverpush$(EXEEXT): $(http2_serverpush_OBJECTS) $(http2_serverpush_DEPENDENCIES) $(EXTRA_http2_serverpush_DEPENDENCIES) 
	@rm -f http2-serverpush$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(http2_serverpush_OBJECTS) $(http2_serverpush_LDADD) $(LIBS)

http2-upload$(EXEEXT): $(http2_upload_OBJECTS) $(http2_upload_DEPENDENCIES) $(EXTRA_http2_upload_DEPENDENCIES) 
	@rm -f http2-upload$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(http2_upload_OBJECTS) $(http2_upload_LDADD) $(LIBS)









httpcustomheader$(EXEEXT): $(httpcustomheader_OBJECTS) $(httpcustomheader_DEPENDENCIES) $(EXTRA_httpcustomheader_DEPENDENCIES) 
	@rm -f httpcustomheader$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(httpcustomheader_OBJECTS) $(httpcustomheader_LDADD) $(LIBS)

httpput$(EXEEXT): $(httpput_OBJECTS) $(httpput_DEPENDENCIES) $(EXTRA_httpput_DEPENDENCIES) 
	@rm -f httpput$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(httpput_OBJECTS) $(httpput_LDADD) $(LIBS)

https$(EXEEXT): $(https_OBJECTS) $(https_DEPENDENCIES) $(EXTRA_https_DEPENDENCIES) 
	@rm -f https$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(https_OBJECTS) $(https_LDADD) $(LIBS)

imap-append$(EXEEXT): $(imap_append_OBJECTS) $(imap_append_DEPENDENCIES) $(EXTRA_imap_append_DEPENDENCIES) 
	@rm -f imap-append$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(imap_append_OBJECTS) $(imap_append_LDADD) $(LIBS)





imap-copy$(EXEEXT): $(imap_copy_OBJECTS) $(imap_copy_DEPENDENCIES) $(EXTRA_imap_copy_DEPENDENCIES) 
	@rm -f imap-copy$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(imap_copy_OBJECTS) $(imap_copy_LDADD) $(LIBS)

imap-create$(EXEEXT): $(imap_create_OBJECTS) $(imap_create_DEPENDENCIES) $(EXTRA_imap_create_DEPENDENCIES) 
	@rm -f imap-create$(EXEEXT)







>
>
>
>
>
>
>
>
















>
>
>
>







1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
http2-serverpush$(EXEEXT): $(http2_serverpush_OBJECTS) $(http2_serverpush_DEPENDENCIES) $(EXTRA_http2_serverpush_DEPENDENCIES) 
	@rm -f http2-serverpush$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(http2_serverpush_OBJECTS) $(http2_serverpush_LDADD) $(LIBS)

http2-upload$(EXEEXT): $(http2_upload_OBJECTS) $(http2_upload_DEPENDENCIES) $(EXTRA_http2_upload_DEPENDENCIES) 
	@rm -f http2-upload$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(http2_upload_OBJECTS) $(http2_upload_LDADD) $(LIBS)

http3$(EXEEXT): $(http3_OBJECTS) $(http3_DEPENDENCIES) $(EXTRA_http3_DEPENDENCIES) 
	@rm -f http3$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(http3_OBJECTS) $(http3_LDADD) $(LIBS)

http3-present$(EXEEXT): $(http3_present_OBJECTS) $(http3_present_DEPENDENCIES) $(EXTRA_http3_present_DEPENDENCIES) 
	@rm -f http3-present$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(http3_present_OBJECTS) $(http3_present_LDADD) $(LIBS)

httpcustomheader$(EXEEXT): $(httpcustomheader_OBJECTS) $(httpcustomheader_DEPENDENCIES) $(EXTRA_httpcustomheader_DEPENDENCIES) 
	@rm -f httpcustomheader$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(httpcustomheader_OBJECTS) $(httpcustomheader_LDADD) $(LIBS)

httpput$(EXEEXT): $(httpput_OBJECTS) $(httpput_DEPENDENCIES) $(EXTRA_httpput_DEPENDENCIES) 
	@rm -f httpput$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(httpput_OBJECTS) $(httpput_LDADD) $(LIBS)

https$(EXEEXT): $(https_OBJECTS) $(https_DEPENDENCIES) $(EXTRA_https_DEPENDENCIES) 
	@rm -f https$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(https_OBJECTS) $(https_LDADD) $(LIBS)

imap-append$(EXEEXT): $(imap_append_OBJECTS) $(imap_append_DEPENDENCIES) $(EXTRA_imap_append_DEPENDENCIES) 
	@rm -f imap-append$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(imap_append_OBJECTS) $(imap_append_LDADD) $(LIBS)

imap-authzid$(EXEEXT): $(imap_authzid_OBJECTS) $(imap_authzid_DEPENDENCIES) $(EXTRA_imap_authzid_DEPENDENCIES) 
	@rm -f imap-authzid$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(imap_authzid_OBJECTS) $(imap_authzid_LDADD) $(LIBS)

imap-copy$(EXEEXT): $(imap_copy_OBJECTS) $(imap_copy_DEPENDENCIES) $(EXTRA_imap_copy_DEPENDENCIES) 
	@rm -f imap-copy$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(imap_copy_OBJECTS) $(imap_copy_LDADD) $(LIBS)

imap-create$(EXEEXT): $(imap_create_OBJECTS) $(imap_create_DEPENDENCIES) $(EXTRA_imap_create_DEPENDENCIES) 
	@rm -f imap-create$(EXEEXT)
1405
1406
1407
1408
1409
1410
1411




1412
1413
1414
1415
1416
1417
1418
parseurl$(EXEEXT): $(parseurl_OBJECTS) $(parseurl_DEPENDENCIES) $(EXTRA_parseurl_DEPENDENCIES) 
	@rm -f parseurl$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(parseurl_OBJECTS) $(parseurl_LDADD) $(LIBS)

persistent$(EXEEXT): $(persistent_OBJECTS) $(persistent_DEPENDENCIES) $(EXTRA_persistent_DEPENDENCIES) 
	@rm -f persistent$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(persistent_OBJECTS) $(persistent_LDADD) $(LIBS)





pop3-dele$(EXEEXT): $(pop3_dele_OBJECTS) $(pop3_dele_DEPENDENCIES) $(EXTRA_pop3_dele_DEPENDENCIES) 
	@rm -f pop3-dele$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(pop3_dele_OBJECTS) $(pop3_dele_LDADD) $(LIBS)

pop3-list$(EXEEXT): $(pop3_list_OBJECTS) $(pop3_list_DEPENDENCIES) $(EXTRA_pop3_list_DEPENDENCIES) 
	@rm -f pop3-list$(EXEEXT)







>
>
>
>







1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
parseurl$(EXEEXT): $(parseurl_OBJECTS) $(parseurl_DEPENDENCIES) $(EXTRA_parseurl_DEPENDENCIES) 
	@rm -f parseurl$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(parseurl_OBJECTS) $(parseurl_LDADD) $(LIBS)

persistent$(EXEEXT): $(persistent_OBJECTS) $(persistent_DEPENDENCIES) $(EXTRA_persistent_DEPENDENCIES) 
	@rm -f persistent$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(persistent_OBJECTS) $(persistent_LDADD) $(LIBS)

pop3-authzid$(EXEEXT): $(pop3_authzid_OBJECTS) $(pop3_authzid_DEPENDENCIES) $(EXTRA_pop3_authzid_DEPENDENCIES) 
	@rm -f pop3-authzid$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(pop3_authzid_OBJECTS) $(pop3_authzid_LDADD) $(LIBS)

pop3-dele$(EXEEXT): $(pop3_dele_OBJECTS) $(pop3_dele_DEPENDENCIES) $(EXTRA_pop3_dele_DEPENDENCIES) 
	@rm -f pop3-dele$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(pop3_dele_OBJECTS) $(pop3_dele_LDADD) $(LIBS)

pop3-list$(EXEEXT): $(pop3_list_OBJECTS) $(pop3_list_DEPENDENCIES) $(EXTRA_pop3_list_DEPENDENCIES) 
	@rm -f pop3-list$(EXEEXT)
1505
1506
1507
1508
1509
1510
1511




1512
1513
1514
1515
1516
1517
1518
simplepost$(EXEEXT): $(simplepost_OBJECTS) $(simplepost_DEPENDENCIES) $(EXTRA_simplepost_DEPENDENCIES) 
	@rm -f simplepost$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(simplepost_OBJECTS) $(simplepost_LDADD) $(LIBS)

simplessl$(EXEEXT): $(simplessl_OBJECTS) $(simplessl_DEPENDENCIES) $(EXTRA_simplessl_DEPENDENCIES) 
	@rm -f simplessl$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(simplessl_OBJECTS) $(simplessl_LDADD) $(LIBS)





smtp-expn$(EXEEXT): $(smtp_expn_OBJECTS) $(smtp_expn_DEPENDENCIES) $(EXTRA_smtp_expn_DEPENDENCIES) 
	@rm -f smtp-expn$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(smtp_expn_OBJECTS) $(smtp_expn_LDADD) $(LIBS)

smtp-mail$(EXEEXT): $(smtp_mail_OBJECTS) $(smtp_mail_DEPENDENCIES) $(EXTRA_smtp_mail_DEPENDENCIES) 
	@rm -f smtp-mail$(EXEEXT)







>
>
>
>







1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
simplepost$(EXEEXT): $(simplepost_OBJECTS) $(simplepost_DEPENDENCIES) $(EXTRA_simplepost_DEPENDENCIES) 
	@rm -f simplepost$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(simplepost_OBJECTS) $(simplepost_LDADD) $(LIBS)

simplessl$(EXEEXT): $(simplessl_OBJECTS) $(simplessl_DEPENDENCIES) $(EXTRA_simplessl_DEPENDENCIES) 
	@rm -f simplessl$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(simplessl_OBJECTS) $(simplessl_LDADD) $(LIBS)

smtp-authzid$(EXEEXT): $(smtp_authzid_OBJECTS) $(smtp_authzid_DEPENDENCIES) $(EXTRA_smtp_authzid_DEPENDENCIES) 
	@rm -f smtp-authzid$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(smtp_authzid_OBJECTS) $(smtp_authzid_LDADD) $(LIBS)

smtp-expn$(EXEEXT): $(smtp_expn_OBJECTS) $(smtp_expn_DEPENDENCIES) $(EXTRA_smtp_expn_DEPENDENCIES) 
	@rm -f smtp-expn$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(smtp_expn_OBJECTS) $(smtp_expn_LDADD) $(LIBS)

smtp-mail$(EXEEXT): $(smtp_mail_OBJECTS) $(smtp_mail_DEPENDENCIES) $(EXTRA_smtp_mail_DEPENDENCIES) 
	@rm -f smtp-mail$(EXEEXT)
1553
1554
1555
1556
1557
1558
1559

1560
1561
1562
1563
1564
1565
1566
mostlyclean-compile:
	-rm -f *.$(OBJEXT)

distclean-compile:
	-rm -f *.tab.c

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/10-at-a-time.Po@am__quote@ # am--include-marker

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anyauthput.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/certinfo.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chkspeed.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cookie_interface.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/externalsocket.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileupload.Po@am__quote@ # am--include-marker







>







1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
mostlyclean-compile:
	-rm -f *.$(OBJEXT)

distclean-compile:
	-rm -f *.tab.c

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/10-at-a-time.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/altsvc.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/anyauthput.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/certinfo.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chkspeed.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cookie_interface.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/externalsocket.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileupload.Po@am__quote@ # am--include-marker
1577
1578
1579
1580
1581
1582
1583


1584
1585
1586
1587

1588
1589
1590
1591
1592
1593
1594
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getinmemory.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getredirect.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http-post.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-download.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-pushinmemory.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-serverpush.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-upload.Po@am__quote@ # am--include-marker


@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpcustomheader.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpput.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/https.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-append.Po@am__quote@ # am--include-marker

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-copy.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-create.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-delete.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-examine.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-fetch.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-list.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-lsub.Po@am__quote@ # am--include-marker







>
>




>







1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getinmemory.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getredirect.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http-post.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-download.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-pushinmemory.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-serverpush.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http2-upload.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http3-present.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http3.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpcustomheader.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpput.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/https.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-append.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-authzid.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-copy.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-create.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-delete.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-examine.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-fetch.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-list.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imap-lsub.Po@am__quote@ # am--include-marker
1602
1603
1604
1605
1606
1607
1608

1609
1610
1611
1612
1613
1614
1615
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-debugcallback.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-double.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-formadd.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-post.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-single.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseurl.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/persistent.Po@am__quote@ # am--include-marker

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-dele.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-list.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-multi.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-noop.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-retr.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-ssl.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-stat.Po@am__quote@ # am--include-marker







>







1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-debugcallback.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-double.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-formadd.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-post.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multi-single.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parseurl.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/persistent.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-authzid.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-dele.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-list.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-multi.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-noop.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-retr.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-ssl.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pop3-stat.Po@am__quote@ # am--include-marker
1627
1628
1629
1630
1631
1632
1633

1634
1635
1636
1637
1638
1639
1640
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sepheaders.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftpget.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftpuploadresume.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shared-connection-cache.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplepost.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplessl.Po@am__quote@ # am--include-marker

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-expn.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-mail.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-mime.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-multi.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-ssl.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-tls.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-vrfy.Po@am__quote@ # am--include-marker







>







1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sepheaders.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftpget.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sftpuploadresume.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shared-connection-cache.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplepost.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simplessl.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-authzid.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-expn.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-mail.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-mime.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-multi.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-ssl.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-tls.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smtp-vrfy.Po@am__quote@ # am--include-marker
1801
1802
1803
1804
1805
1806
1807

1808
1809
1810
1811
1812
1813
1814
clean: clean-am

clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
	mostlyclean-am

distclean: distclean-am
		-rm -f ./$(DEPDIR)/10-at-a-time.Po

	-rm -f ./$(DEPDIR)/anyauthput.Po
	-rm -f ./$(DEPDIR)/certinfo.Po
	-rm -f ./$(DEPDIR)/chkspeed.Po
	-rm -f ./$(DEPDIR)/cookie_interface.Po
	-rm -f ./$(DEPDIR)/debug.Po
	-rm -f ./$(DEPDIR)/externalsocket.Po
	-rm -f ./$(DEPDIR)/fileupload.Po







>







1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
clean: clean-am

clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
	mostlyclean-am

distclean: distclean-am
		-rm -f ./$(DEPDIR)/10-at-a-time.Po
	-rm -f ./$(DEPDIR)/altsvc.Po
	-rm -f ./$(DEPDIR)/anyauthput.Po
	-rm -f ./$(DEPDIR)/certinfo.Po
	-rm -f ./$(DEPDIR)/chkspeed.Po
	-rm -f ./$(DEPDIR)/cookie_interface.Po
	-rm -f ./$(DEPDIR)/debug.Po
	-rm -f ./$(DEPDIR)/externalsocket.Po
	-rm -f ./$(DEPDIR)/fileupload.Po
1825
1826
1827
1828
1829
1830
1831


1832
1833
1834
1835

1836
1837
1838
1839
1840
1841
1842
	-rm -f ./$(DEPDIR)/getinmemory.Po
	-rm -f ./$(DEPDIR)/getredirect.Po
	-rm -f ./$(DEPDIR)/http-post.Po
	-rm -f ./$(DEPDIR)/http2-download.Po
	-rm -f ./$(DEPDIR)/http2-pushinmemory.Po
	-rm -f ./$(DEPDIR)/http2-serverpush.Po
	-rm -f ./$(DEPDIR)/http2-upload.Po


	-rm -f ./$(DEPDIR)/httpcustomheader.Po
	-rm -f ./$(DEPDIR)/httpput.Po
	-rm -f ./$(DEPDIR)/https.Po
	-rm -f ./$(DEPDIR)/imap-append.Po

	-rm -f ./$(DEPDIR)/imap-copy.Po
	-rm -f ./$(DEPDIR)/imap-create.Po
	-rm -f ./$(DEPDIR)/imap-delete.Po
	-rm -f ./$(DEPDIR)/imap-examine.Po
	-rm -f ./$(DEPDIR)/imap-fetch.Po
	-rm -f ./$(DEPDIR)/imap-list.Po
	-rm -f ./$(DEPDIR)/imap-lsub.Po







>
>




>







1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
	-rm -f ./$(DEPDIR)/getinmemory.Po
	-rm -f ./$(DEPDIR)/getredirect.Po
	-rm -f ./$(DEPDIR)/http-post.Po
	-rm -f ./$(DEPDIR)/http2-download.Po
	-rm -f ./$(DEPDIR)/http2-pushinmemory.Po
	-rm -f ./$(DEPDIR)/http2-serverpush.Po
	-rm -f ./$(DEPDIR)/http2-upload.Po
	-rm -f ./$(DEPDIR)/http3-present.Po
	-rm -f ./$(DEPDIR)/http3.Po
	-rm -f ./$(DEPDIR)/httpcustomheader.Po
	-rm -f ./$(DEPDIR)/httpput.Po
	-rm -f ./$(DEPDIR)/https.Po
	-rm -f ./$(DEPDIR)/imap-append.Po
	-rm -f ./$(DEPDIR)/imap-authzid.Po
	-rm -f ./$(DEPDIR)/imap-copy.Po
	-rm -f ./$(DEPDIR)/imap-create.Po
	-rm -f ./$(DEPDIR)/imap-delete.Po
	-rm -f ./$(DEPDIR)/imap-examine.Po
	-rm -f ./$(DEPDIR)/imap-fetch.Po
	-rm -f ./$(DEPDIR)/imap-list.Po
	-rm -f ./$(DEPDIR)/imap-lsub.Po
1850
1851
1852
1853
1854
1855
1856

1857
1858
1859
1860
1861
1862
1863
	-rm -f ./$(DEPDIR)/multi-debugcallback.Po
	-rm -f ./$(DEPDIR)/multi-double.Po
	-rm -f ./$(DEPDIR)/multi-formadd.Po
	-rm -f ./$(DEPDIR)/multi-post.Po
	-rm -f ./$(DEPDIR)/multi-single.Po
	-rm -f ./$(DEPDIR)/parseurl.Po
	-rm -f ./$(DEPDIR)/persistent.Po

	-rm -f ./$(DEPDIR)/pop3-dele.Po
	-rm -f ./$(DEPDIR)/pop3-list.Po
	-rm -f ./$(DEPDIR)/pop3-multi.Po
	-rm -f ./$(DEPDIR)/pop3-noop.Po
	-rm -f ./$(DEPDIR)/pop3-retr.Po
	-rm -f ./$(DEPDIR)/pop3-ssl.Po
	-rm -f ./$(DEPDIR)/pop3-stat.Po







>







1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
	-rm -f ./$(DEPDIR)/multi-debugcallback.Po
	-rm -f ./$(DEPDIR)/multi-double.Po
	-rm -f ./$(DEPDIR)/multi-formadd.Po
	-rm -f ./$(DEPDIR)/multi-post.Po
	-rm -f ./$(DEPDIR)/multi-single.Po
	-rm -f ./$(DEPDIR)/parseurl.Po
	-rm -f ./$(DEPDIR)/persistent.Po
	-rm -f ./$(DEPDIR)/pop3-authzid.Po
	-rm -f ./$(DEPDIR)/pop3-dele.Po
	-rm -f ./$(DEPDIR)/pop3-list.Po
	-rm -f ./$(DEPDIR)/pop3-multi.Po
	-rm -f ./$(DEPDIR)/pop3-noop.Po
	-rm -f ./$(DEPDIR)/pop3-retr.Po
	-rm -f ./$(DEPDIR)/pop3-ssl.Po
	-rm -f ./$(DEPDIR)/pop3-stat.Po
1875
1876
1877
1878
1879
1880
1881

1882
1883
1884
1885
1886
1887
1888
	-rm -f ./$(DEPDIR)/sepheaders.Po
	-rm -f ./$(DEPDIR)/sftpget.Po
	-rm -f ./$(DEPDIR)/sftpuploadresume.Po
	-rm -f ./$(DEPDIR)/shared-connection-cache.Po
	-rm -f ./$(DEPDIR)/simple.Po
	-rm -f ./$(DEPDIR)/simplepost.Po
	-rm -f ./$(DEPDIR)/simplessl.Po

	-rm -f ./$(DEPDIR)/smtp-expn.Po
	-rm -f ./$(DEPDIR)/smtp-mail.Po
	-rm -f ./$(DEPDIR)/smtp-mime.Po
	-rm -f ./$(DEPDIR)/smtp-multi.Po
	-rm -f ./$(DEPDIR)/smtp-ssl.Po
	-rm -f ./$(DEPDIR)/smtp-tls.Po
	-rm -f ./$(DEPDIR)/smtp-vrfy.Po







>







1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
	-rm -f ./$(DEPDIR)/sepheaders.Po
	-rm -f ./$(DEPDIR)/sftpget.Po
	-rm -f ./$(DEPDIR)/sftpuploadresume.Po
	-rm -f ./$(DEPDIR)/shared-connection-cache.Po
	-rm -f ./$(DEPDIR)/simple.Po
	-rm -f ./$(DEPDIR)/simplepost.Po
	-rm -f ./$(DEPDIR)/simplessl.Po
	-rm -f ./$(DEPDIR)/smtp-authzid.Po
	-rm -f ./$(DEPDIR)/smtp-expn.Po
	-rm -f ./$(DEPDIR)/smtp-mail.Po
	-rm -f ./$(DEPDIR)/smtp-mime.Po
	-rm -f ./$(DEPDIR)/smtp-multi.Po
	-rm -f ./$(DEPDIR)/smtp-ssl.Po
	-rm -f ./$(DEPDIR)/smtp-tls.Po
	-rm -f ./$(DEPDIR)/smtp-vrfy.Po
1931
1932
1933
1934
1935
1936
1937

1938
1939
1940
1941
1942
1943
1944

install-ps-am:

installcheck-am:

maintainer-clean: maintainer-clean-am
		-rm -f ./$(DEPDIR)/10-at-a-time.Po

	-rm -f ./$(DEPDIR)/anyauthput.Po
	-rm -f ./$(DEPDIR)/certinfo.Po
	-rm -f ./$(DEPDIR)/chkspeed.Po
	-rm -f ./$(DEPDIR)/cookie_interface.Po
	-rm -f ./$(DEPDIR)/debug.Po
	-rm -f ./$(DEPDIR)/externalsocket.Po
	-rm -f ./$(DEPDIR)/fileupload.Po







>







2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035

install-ps-am:

installcheck-am:

maintainer-clean: maintainer-clean-am
		-rm -f ./$(DEPDIR)/10-at-a-time.Po
	-rm -f ./$(DEPDIR)/altsvc.Po
	-rm -f ./$(DEPDIR)/anyauthput.Po
	-rm -f ./$(DEPDIR)/certinfo.Po
	-rm -f ./$(DEPDIR)/chkspeed.Po
	-rm -f ./$(DEPDIR)/cookie_interface.Po
	-rm -f ./$(DEPDIR)/debug.Po
	-rm -f ./$(DEPDIR)/externalsocket.Po
	-rm -f ./$(DEPDIR)/fileupload.Po
1955
1956
1957
1958
1959
1960
1961


1962
1963
1964
1965

1966
1967
1968
1969
1970
1971
1972
	-rm -f ./$(DEPDIR)/getinmemory.Po
	-rm -f ./$(DEPDIR)/getredirect.Po
	-rm -f ./$(DEPDIR)/http-post.Po
	-rm -f ./$(DEPDIR)/http2-download.Po
	-rm -f ./$(DEPDIR)/http2-pushinmemory.Po
	-rm -f ./$(DEPDIR)/http2-serverpush.Po
	-rm -f ./$(DEPDIR)/http2-upload.Po


	-rm -f ./$(DEPDIR)/httpcustomheader.Po
	-rm -f ./$(DEPDIR)/httpput.Po
	-rm -f ./$(DEPDIR)/https.Po
	-rm -f ./$(DEPDIR)/imap-append.Po

	-rm -f ./$(DEPDIR)/imap-copy.Po
	-rm -f ./$(DEPDIR)/imap-create.Po
	-rm -f ./$(DEPDIR)/imap-delete.Po
	-rm -f ./$(DEPDIR)/imap-examine.Po
	-rm -f ./$(DEPDIR)/imap-fetch.Po
	-rm -f ./$(DEPDIR)/imap-list.Po
	-rm -f ./$(DEPDIR)/imap-lsub.Po







>
>




>







2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
	-rm -f ./$(DEPDIR)/getinmemory.Po
	-rm -f ./$(DEPDIR)/getredirect.Po
	-rm -f ./$(DEPDIR)/http-post.Po
	-rm -f ./$(DEPDIR)/http2-download.Po
	-rm -f ./$(DEPDIR)/http2-pushinmemory.Po
	-rm -f ./$(DEPDIR)/http2-serverpush.Po
	-rm -f ./$(DEPDIR)/http2-upload.Po
	-rm -f ./$(DEPDIR)/http3-present.Po
	-rm -f ./$(DEPDIR)/http3.Po
	-rm -f ./$(DEPDIR)/httpcustomheader.Po
	-rm -f ./$(DEPDIR)/httpput.Po
	-rm -f ./$(DEPDIR)/https.Po
	-rm -f ./$(DEPDIR)/imap-append.Po
	-rm -f ./$(DEPDIR)/imap-authzid.Po
	-rm -f ./$(DEPDIR)/imap-copy.Po
	-rm -f ./$(DEPDIR)/imap-create.Po
	-rm -f ./$(DEPDIR)/imap-delete.Po
	-rm -f ./$(DEPDIR)/imap-examine.Po
	-rm -f ./$(DEPDIR)/imap-fetch.Po
	-rm -f ./$(DEPDIR)/imap-list.Po
	-rm -f ./$(DEPDIR)/imap-lsub.Po
1980
1981
1982
1983
1984
1985
1986

1987
1988
1989
1990
1991
1992
1993
	-rm -f ./$(DEPDIR)/multi-debugcallback.Po
	-rm -f ./$(DEPDIR)/multi-double.Po
	-rm -f ./$(DEPDIR)/multi-formadd.Po
	-rm -f ./$(DEPDIR)/multi-post.Po
	-rm -f ./$(DEPDIR)/multi-single.Po
	-rm -f ./$(DEPDIR)/parseurl.Po
	-rm -f ./$(DEPDIR)/persistent.Po

	-rm -f ./$(DEPDIR)/pop3-dele.Po
	-rm -f ./$(DEPDIR)/pop3-list.Po
	-rm -f ./$(DEPDIR)/pop3-multi.Po
	-rm -f ./$(DEPDIR)/pop3-noop.Po
	-rm -f ./$(DEPDIR)/pop3-retr.Po
	-rm -f ./$(DEPDIR)/pop3-ssl.Po
	-rm -f ./$(DEPDIR)/pop3-stat.Po







>







2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
	-rm -f ./$(DEPDIR)/multi-debugcallback.Po
	-rm -f ./$(DEPDIR)/multi-double.Po
	-rm -f ./$(DEPDIR)/multi-formadd.Po
	-rm -f ./$(DEPDIR)/multi-post.Po
	-rm -f ./$(DEPDIR)/multi-single.Po
	-rm -f ./$(DEPDIR)/parseurl.Po
	-rm -f ./$(DEPDIR)/persistent.Po
	-rm -f ./$(DEPDIR)/pop3-authzid.Po
	-rm -f ./$(DEPDIR)/pop3-dele.Po
	-rm -f ./$(DEPDIR)/pop3-list.Po
	-rm -f ./$(DEPDIR)/pop3-multi.Po
	-rm -f ./$(DEPDIR)/pop3-noop.Po
	-rm -f ./$(DEPDIR)/pop3-retr.Po
	-rm -f ./$(DEPDIR)/pop3-ssl.Po
	-rm -f ./$(DEPDIR)/pop3-stat.Po
2005
2006
2007
2008
2009
2010
2011

2012
2013
2014
2015
2016
2017
2018
	-rm -f ./$(DEPDIR)/sepheaders.Po
	-rm -f ./$(DEPDIR)/sftpget.Po
	-rm -f ./$(DEPDIR)/sftpuploadresume.Po
	-rm -f ./$(DEPDIR)/shared-connection-cache.Po
	-rm -f ./$(DEPDIR)/simple.Po
	-rm -f ./$(DEPDIR)/simplepost.Po
	-rm -f ./$(DEPDIR)/simplessl.Po

	-rm -f ./$(DEPDIR)/smtp-expn.Po
	-rm -f ./$(DEPDIR)/smtp-mail.Po
	-rm -f ./$(DEPDIR)/smtp-mime.Po
	-rm -f ./$(DEPDIR)/smtp-multi.Po
	-rm -f ./$(DEPDIR)/smtp-ssl.Po
	-rm -f ./$(DEPDIR)/smtp-tls.Po
	-rm -f ./$(DEPDIR)/smtp-vrfy.Po







>







2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
	-rm -f ./$(DEPDIR)/sepheaders.Po
	-rm -f ./$(DEPDIR)/sftpget.Po
	-rm -f ./$(DEPDIR)/sftpuploadresume.Po
	-rm -f ./$(DEPDIR)/shared-connection-cache.Po
	-rm -f ./$(DEPDIR)/simple.Po
	-rm -f ./$(DEPDIR)/simplepost.Po
	-rm -f ./$(DEPDIR)/simplessl.Po
	-rm -f ./$(DEPDIR)/smtp-authzid.Po
	-rm -f ./$(DEPDIR)/smtp-expn.Po
	-rm -f ./$(DEPDIR)/smtp-mail.Po
	-rm -f ./$(DEPDIR)/smtp-mime.Po
	-rm -f ./$(DEPDIR)/smtp-multi.Po
	-rm -f ./$(DEPDIR)/smtp-ssl.Po
	-rm -f ./$(DEPDIR)/smtp-tls.Po
	-rm -f ./$(DEPDIR)/smtp-vrfy.Po
Changes to jni/curl/docs/examples/Makefile.inc.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
31
32
33
34
35
36
37
38

39
40
41
42
43
44
45
46
47
  pop3-dele pop3-top pop3-stat pop3-noop pop3-ssl pop3-tls pop3-multi      \
  imap-list imap-lsub imap-fetch imap-store imap-append imap-examine       \
  imap-search imap-create imap-delete imap-copy imap-noop imap-ssl         \
  imap-tls imap-multi url2file sftpget ftpsget postinmemory http2-download \
  http2-upload http2-serverpush getredirect ftpuploadfrommem               \
  ftpuploadresume sslbackend postit2-formadd multi-formadd                 \
  shared-connection-cache sftpuploadresume http2-pushinmemory parseurl     \
  urlapi


# These examples require external dependencies that may not be commonly
# available on POSIX systems, so don't bother attempting to compile them here.
COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \
  ghiper.c hiperfifo.c htmltidy.c multithread.c opensslthreadlock.c \
  sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
  smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \
  multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c \
  threaded-shared-conn.c crawler.c ephiperfifo.c







|
>









31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  pop3-dele pop3-top pop3-stat pop3-noop pop3-ssl pop3-tls pop3-multi      \
  imap-list imap-lsub imap-fetch imap-store imap-append imap-examine       \
  imap-search imap-create imap-delete imap-copy imap-noop imap-ssl         \
  imap-tls imap-multi url2file sftpget ftpsget postinmemory http2-download \
  http2-upload http2-serverpush getredirect ftpuploadfrommem               \
  ftpuploadresume sslbackend postit2-formadd multi-formadd                 \
  shared-connection-cache sftpuploadresume http2-pushinmemory parseurl     \
  urlapi imap-authzid pop3-authzid smtp-authzid http3 altsvc               \
  http3-present

# These examples require external dependencies that may not be commonly
# available on POSIX systems, so don't bother attempting to compile them here.
COMPLICATED_EXAMPLES = curlgtk.c curlx.c htmltitle.cpp cacertinmem.c \
  ghiper.c hiperfifo.c htmltidy.c multithread.c opensslthreadlock.c \
  sampleconv.c synctime.c threaded-ssl.c evhiperfifo.c \
  smooth-gtk-thread.c version-check.pl href_extractor.c asiohiper.cpp \
  multi-uv.c xmlstream.c usercertinmem.c sessioninfo.c \
  threaded-shared-conn.c crawler.c ephiperfifo.c
Added jni/curl/docs/examples/altsvc.c.
















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
/* <DESC>
 * HTTP with Alt-Svc support
 * </DESC>
 */
#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");

    /* cache the alternatives in this file */
    curl_easy_setopt(curl, CURLOPT_ALTSVC, "altsvc.txt");

    /* restrict which HTTP versions to use alternatives */
    curl_easy_setopt(curl, CURLOPT_ALTSVC_CTRL, (long)
                     CURLALTSVC_H1|CURLALTSVC_H2|CURLALTSVC_H3);

    /* Perform the request, res will get the return code */
    res = curl_easy_perform(curl);
    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return 0;
}
Changes to jni/curl/docs/examples/curlx.c.
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
  BIO* out = NULL;

  char *outfile = NULL;
  char *infile = NULL;

  int tabLength = 100;
  char *binaryptr;
  char *mimetype;
  char *mimetypeaccept = NULL;
  char *contenttype;
  const char **pp;
  unsigned char *hostporturl = NULL;
  BIO *p12bio;
  char **args = argv + 1;
  unsigned char *serverurl;
  sslctxparm p;
  char *response;

  CURLcode res;
  struct curl_slist *headers = NULL;
  int badarg = 0;

  binaryptr = malloc(tabLength);

  p.verbose = 0;
  p.errorbio = BIO_new_fp(stderr, BIO_NOCLOSE);

  curl_global_init(CURL_GLOBAL_DEFAULT);

  /* we need some more for the P12 decoding */

  OpenSSL_add_all_ciphers();







|
















|







273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
  BIO* out = NULL;

  char *outfile = NULL;
  char *infile = NULL;

  int tabLength = 100;
  char *binaryptr;
  char *mimetype = NULL;
  char *mimetypeaccept = NULL;
  char *contenttype;
  const char **pp;
  unsigned char *hostporturl = NULL;
  BIO *p12bio;
  char **args = argv + 1;
  unsigned char *serverurl;
  sslctxparm p;
  char *response;

  CURLcode res;
  struct curl_slist *headers = NULL;
  int badarg = 0;

  binaryptr = malloc(tabLength);

  memset(&p, '\0', sizeof(p));
  p.errorbio = BIO_new_fp(stderr, BIO_NOCLOSE);

  curl_global_init(CURL_GLOBAL_DEFAULT);

  /* we need some more for the P12 decoding */

  OpenSSL_add_all_ciphers();
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
      p.verbose++;
    }
    else
      badarg = 1;
    args++;
  }

  if(mimetype == NULL || mimetypeaccept == NULL)
    badarg = 1;

  if(badarg) {
    for(pp = curlx_usage; (*pp != NULL); pp++)
      BIO_printf(p.errorbio, "%s\n", *pp);
    BIO_printf(p.errorbio, "\n");
    goto err;







|







368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
      p.verbose++;
    }
    else
      badarg = 1;
    args++;
  }

  if(mimetype == NULL || mimetypeaccept == NULL || p.p12file == NULL)
    badarg = 1;

  if(badarg) {
    for(pp = curlx_usage; (*pp != NULL); pp++)
      BIO_printf(p.errorbio, "%s\n", *pp);
    BIO_printf(p.errorbio, "\n");
    goto err;
Changes to jni/curl/docs/examples/ephiperfifo.c.
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <sys/timerfd.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>

#include <curl/curl.h>

#ifdef __GNUC__
#define _Unused __attribute__((unused))
#else
#define _Unused
#endif

#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */


/* Global information, common to all connections */
typedef struct _GlobalInfo
{
  int epfd;    /* epoll filedescriptor */







<
<
<
<
<
<







69
70
71
72
73
74
75






76
77
78
79
80
81
82
#include <sys/timerfd.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>

#include <curl/curl.h>







#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */


/* Global information, common to all connections */
typedef struct _GlobalInfo
{
  int epfd;    /* epoll filedescriptor */
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  curl_socket_t sockfd;
  CURL *easy;
  int action;
  long timeout;
  GlobalInfo *global;
} SockInfo;

#define __case(code) \
  case code: s = __STRING(code)

/* Die if we get a bad CURLMcode somewhere */
static void mcode_or_die(const char *where, CURLMcode code)
{
  if(CURLM_OK != code) {
    const char *s;
    switch(code) {
      __case(CURLM_BAD_HANDLE); break;
      __case(CURLM_BAD_EASY_HANDLE); break;
      __case(CURLM_OUT_OF_MEMORY); break;
      __case(CURLM_INTERNAL_ERROR); break;
      __case(CURLM_UNKNOWN_OPTION); break;
      __case(CURLM_LAST); break;
      default: s = "CURLM_unknown"; break;
      __case(CURLM_BAD_SOCKET);
      fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
      /* ignore this error */
      return;
    }
    fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
    exit(code);
  }







|








|
|
|
|
|
|

|







104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  curl_socket_t sockfd;
  CURL *easy;
  int action;
  long timeout;
  GlobalInfo *global;
} SockInfo;

#define mycase(code) \
  case code: s = __STRING(code)

/* Die if we get a bad CURLMcode somewhere */
static void mcode_or_die(const char *where, CURLMcode code)
{
  if(CURLM_OK != code) {
    const char *s;
    switch(code) {
      mycase(CURLM_BAD_HANDLE); break;
      mycase(CURLM_BAD_EASY_HANDLE); break;
      mycase(CURLM_OUT_OF_MEMORY); break;
      mycase(CURLM_INTERNAL_ERROR); break;
      mycase(CURLM_UNKNOWN_OPTION); break;
      mycase(CURLM_LAST); break;
      default: s = "CURLM_unknown"; break;
      mycase(CURLM_BAD_SOCKET);
      fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
      /* ignore this error */
      return;
    }
    fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
    exit(code);
  }
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354


355
356
357
358
359
360
361
  }
  return 0;
}



/* CURLOPT_WRITEFUNCTION */
static size_t write_cb(void *ptr _Unused, size_t size, size_t nmemb,
                       void *data)
{
  size_t realsize = size * nmemb;
  (void)_Unused;
  (void)data;

  return realsize;
}


/* CURLOPT_PROGRESSFUNCTION */
static int prog_cb(void *p, double dltotal, double dlnow, double ult _Unused,
                   double uln _Unused)
{
  ConnInfo *conn = (ConnInfo *)p;



  fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
  return 0;
}


/* Create a new easy handle, and add it to the global curl_multi */







|
<

<
|

<
|




|
|


>
>







326
327
328
329
330
331
332
333

334

335
336

337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
  }
  return 0;
}



/* CURLOPT_WRITEFUNCTION */
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)

{

  (void)ptr;
  (void)data;

  return size * nmemb;
}


/* CURLOPT_PROGRESSFUNCTION */
static int prog_cb(void *p, double dltotal, double dlnow, double ult,
                   double uln)
{
  ConnInfo *conn = (ConnInfo *)p;
  (void)ult;
  (void)uln;

  fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
  return 0;
}


/* Create a new easy handle, and add it to the global curl_multi */
465
466
467
468
469
470
471
472
473
474
475
476
477


478
479
480
481
482
483
484
void SignalHandler(int signo)
{
  if(signo == SIGINT) {
    g_should_exit_ = 1;
  }
}

int main(int argc _Unused, char **argv _Unused)
{
  GlobalInfo g;
  struct itimerspec its;
  struct epoll_event ev;
  struct epoll_event events[10];



  g_should_exit_ = 0;
  signal(SIGINT, SignalHandler);

  memset(&g, 0, sizeof(GlobalInfo));
  g.epfd = epoll_create1(EPOLL_CLOEXEC);
  if(g.epfd == -1) {







|





>
>







458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
void SignalHandler(int signo)
{
  if(signo == SIGINT) {
    g_should_exit_ = 1;
  }
}

int main(int argc, char **argv)
{
  GlobalInfo g;
  struct itimerspec its;
  struct epoll_event ev;
  struct epoll_event events[10];
  (void)argc;
  (void)argv;

  g_should_exit_ = 0;
  signal(SIGINT, SignalHandler);

  memset(&g, 0, sizeof(GlobalInfo));
  g.epfd = epoll_create1(EPOLL_CLOEXEC);
  if(g.epfd == -1) {
543
544
545
546
547
548
549

550
551
    }
  }

  fprintf(MSG_OUT, "Exiting normally.\n");
  fflush(MSG_OUT);

  curl_multi_cleanup(g.multi);

  return 0;
}







>


538
539
540
541
542
543
544
545
546
547
    }
  }

  fprintf(MSG_OUT, "Exiting normally.\n");
  fflush(MSG_OUT);

  curl_multi_cleanup(g.multi);
  clean_fifo(&g);
  return 0;
}
Changes to jni/curl/docs/examples/hiperfifo.c.
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <event2/event.h>
#include <event2/event_struct.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
#include <sys/cdefs.h>

#ifdef __GNUC__
#define _Unused __attribute__((unused))
#else
#define _Unused
#endif

#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */


/* Global information, common to all connections */
typedef struct _GlobalInfo
{
  struct event_base *evbase;







<
<
<
<
<
<







68
69
70
71
72
73
74






75
76
77
78
79
80
81
#include <event2/event.h>
#include <event2/event_struct.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
#include <sys/cdefs.h>







#define MSG_OUT stdout /* Send info to stdout, change to stderr if you want */


/* Global information, common to all connections */
typedef struct _GlobalInfo
{
  struct event_base *evbase;
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148

149
150
151
152
153
154
155
  CURL *easy;
  int action;
  long timeout;
  struct event ev;
  GlobalInfo *global;
} SockInfo;

#define __case(code) \
  case code: s = __STRING(code)

/* Die if we get a bad CURLMcode somewhere */
static void mcode_or_die(const char *where, CURLMcode code)
{
  if(CURLM_OK != code) {
    const char *s;
    switch(code) {
      __case(CURLM_BAD_HANDLE); break;
      __case(CURLM_BAD_EASY_HANDLE); break;
      __case(CURLM_OUT_OF_MEMORY); break;
      __case(CURLM_INTERNAL_ERROR); break;
      __case(CURLM_UNKNOWN_OPTION); break;
      __case(CURLM_LAST); break;
      default: s = "CURLM_unknown"; break;
      __case(CURLM_BAD_SOCKET);
      fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
      /* ignore this error */
      return;
    }
    fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
    exit(code);
  }
}


/* Update the event timer after curl_multi library calls */
static int multi_timer_cb(CURLM *multi _Unused, long timeout_ms, GlobalInfo *g)
{
  struct timeval timeout;


  timeout.tv_sec = timeout_ms/1000;
  timeout.tv_usec = (timeout_ms%1000)*1000;
  fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);

  /*
   * if timeout_ms is -1, just delete the timer







|








|
|
|
|
|
|

|











|


>







105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
  CURL *easy;
  int action;
  long timeout;
  struct event ev;
  GlobalInfo *global;
} SockInfo;

#define mycase(code) \
  case code: s = __STRING(code)

/* Die if we get a bad CURLMcode somewhere */
static void mcode_or_die(const char *where, CURLMcode code)
{
  if(CURLM_OK != code) {
    const char *s;
    switch(code) {
      mycase(CURLM_BAD_HANDLE); break;
      mycase(CURLM_BAD_EASY_HANDLE); break;
      mycase(CURLM_OUT_OF_MEMORY); break;
      mycase(CURLM_INTERNAL_ERROR); break;
      mycase(CURLM_UNKNOWN_OPTION); break;
      mycase(CURLM_LAST); break;
      default: s = "CURLM_unknown"; break;
      mycase(CURLM_BAD_SOCKET);
      fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
      /* ignore this error */
      return;
    }
    fprintf(MSG_OUT, "ERROR: %s returns %s\n", where, s);
    exit(code);
  }
}


/* Update the event timer after curl_multi library calls */
static int multi_timer_cb(CURLM *multi, long timeout_ms, GlobalInfo *g)
{
  struct timeval timeout;
  (void)multi;

  timeout.tv_sec = timeout_ms/1000;
  timeout.tv_usec = (timeout_ms%1000)*1000;
  fprintf(MSG_OUT, "multi_timer_cb: Setting timeout to %ld ms\n", timeout_ms);

  /*
   * if timeout_ms is -1, just delete the timer
216
217
218
219
220
221
222
223
224
225
226


227
228
229
230
231
232
233
    }
  }
}



/* Called by libevent when our timeout expires */
static void timer_cb(int fd _Unused, short kind _Unused, void *userp)
{
  GlobalInfo *g = (GlobalInfo *)userp;
  CURLMcode rc;



  rc = curl_multi_socket_action(g->multi,
                                  CURL_SOCKET_TIMEOUT, 0, &g->still_running);
  mcode_or_die("timer_cb: curl_multi_socket_action", rc);
  check_multi_info(g);
}








|



>
>







211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
    }
  }
}



/* Called by libevent when our timeout expires */
static void timer_cb(int fd, short kind, void *userp)
{
  GlobalInfo *g = (GlobalInfo *)userp;
  CURLMcode rc;
  (void)fd;
  (void)kind;

  rc = curl_multi_socket_action(g->multi,
                                  CURL_SOCKET_TIMEOUT, 0, &g->still_running);
  mcode_or_die("timer_cb: curl_multi_socket_action", rc);
  check_multi_info(g);
}

299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321


322
323
324
325
326
327
328
  }
  return 0;
}



/* CURLOPT_WRITEFUNCTION */
static size_t write_cb(void *ptr _Unused, size_t size, size_t nmemb,
                       void *data)
{
  size_t realsize = size * nmemb;
  (void)_Unused;
  (void)data;

  return realsize;
}


/* CURLOPT_PROGRESSFUNCTION */
static int prog_cb(void *p, double dltotal, double dlnow, double ult _Unused,
                   double uln _Unused)
{
  ConnInfo *conn = (ConnInfo *)p;



  fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
  return 0;
}


/* Create a new easy handle, and add it to the global curl_multi */







|
<

<
|

<
|




|
|


>
>







296
297
298
299
300
301
302
303

304

305
306

307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
  }
  return 0;
}



/* CURLOPT_WRITEFUNCTION */
static size_t write_cb(void *ptr, size_t size, size_t nmemb, void *data)

{

  (void)ptr;
  (void)data;

  return size * nmemb;
}


/* CURLOPT_PROGRESSFUNCTION */
static int prog_cb(void *p, double dltotal, double dlnow, double ult,
                   double uln)
{
  ConnInfo *conn = (ConnInfo *)p;
  (void)ult;
  (void)uln;

  fprintf(MSG_OUT, "Progress: %s (%g/%g)\n", conn->url, dlnow, dltotal);
  return 0;
}


/* Create a new easy handle, and add it to the global curl_multi */
357
358
359
360
361
362
363
364
365
366
367
368
369


370
371
372
373
374
375
376
  mcode_or_die("new_conn: curl_multi_add_handle", rc);

  /* note that the add_handle() will set a time-out to trigger very soon so
     that the necessary socket_action() call will be called by this app */
}

/* This gets called whenever data is received from the fifo */
static void fifo_cb(int fd _Unused, short event _Unused, void *arg)
{
  char s[1024];
  long int rv = 0;
  int n = 0;
  GlobalInfo *g = (GlobalInfo *)arg;



  do {
    s[0]='\0';
    rv = fscanf(g->input, "%1023s%n", s, &n);
    s[n]='\0';
    if(n && s[0]) {
      if(!strcmp(s, "stop")) {







|





>
>







353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
  mcode_or_die("new_conn: curl_multi_add_handle", rc);

  /* note that the add_handle() will set a time-out to trigger very soon so
     that the necessary socket_action() call will be called by this app */
}

/* This gets called whenever data is received from the fifo */
static void fifo_cb(int fd, short event, void *arg)
{
  char s[1024];
  long int rv = 0;
  int n = 0;
  GlobalInfo *g = (GlobalInfo *)arg;
  (void)fd;
  (void)event;

  do {
    s[0]='\0';
    rv = fscanf(g->input, "%1023s%n", s, &n);
    s[n]='\0';
    if(n && s[0]) {
      if(!strcmp(s, "stop")) {
423
424
425
426
427
428
429
430
431
432


433
434
435
436
437
438
439
static void clean_fifo(GlobalInfo *g)
{
    event_del(&g->fifo_event);
    fclose(g->input);
    unlink(fifo);
}

int main(int argc _Unused, char **argv _Unused)
{
  GlobalInfo g;



  memset(&g, 0, sizeof(GlobalInfo));
  g.evbase = event_base_new();
  init_fifo(&g);
  g.multi = curl_multi_init();
  evtimer_assign(&g.timer_event, g.evbase, timer_cb, &g);








|


>
>







421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
static void clean_fifo(GlobalInfo *g)
{
    event_del(&g->fifo_event);
    fclose(g->input);
    unlink(fifo);
}

int main(int argc, char **argv)
{
  GlobalInfo g;
  (void)argc;
  (void)argv;

  memset(&g, 0, sizeof(GlobalInfo));
  g.evbase = event_base_new();
  init_fifo(&g);
  g.multi = curl_multi_init();
  evtimer_assign(&g.timer_event, g.evbase, timer_cb, &g);

Added jni/curl/docs/examples/http3-present.c.






























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
/* <DESC>
 * Checks if HTTP/3 support is present in libcurl.
 * </DESC>
 */
#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  curl_version_info_data *ver;

  curl_global_init(CURL_GLOBAL_ALL);

  ver = curl_version_info(CURLVERSION_NOW);
  if(ver->features & CURL_VERSION_HTTP2)
    printf("HTTP/2 support is present\n");

  if(ver->features & CURL_VERSION_HTTP3)
    printf("HTTP/3 support is present\n");

  if(ver->features & CURL_VERSION_ALTSVC)
    printf("Alt-svc support is present\n");

  curl_global_cleanup();
  return 0;
}
Added jni/curl/docs/examples/http3.c.












































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
/* <DESC>
 * Very simple HTTP/3 GET
 * </DESC>
 */
#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "https://example.com");

    /* Forcing HTTP/3 will make the connection fail if the server isn't
       accessible over QUIC + HTTP/3 on the given host and port.
       Consider using CURLOPT_ALTSVC instead! */
    curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_3);

    /* Perform the request, res will get the return code */
    res = curl_easy_perform(curl);
    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return 0;
}
Added jni/curl/docs/examples/imap-authzid.c.














































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

/* <DESC>
 * IMAP example showing how to retreieve e-mails from a shared mailed box
 * </DESC>
 */

#include <stdio.h>
#include <curl/curl.h>

/* This is a simple example showing how to fetch mail using libcurl's IMAP
 * capabilities.
 *
 * Note that this example requires libcurl 7.66.0 or above.
 */

int main(void)
{
  CURL *curl;
  CURLcode res = CURLE_OK;

  curl = curl_easy_init();
  if(curl) {
    /* Set the username and password */
    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");

    /* Set the authorisation identity (identity to act as) */
    curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "shared-mailbox");

    /* Force PLAIN authentication */
    curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=PLAIN");

    /* This will fetch message 1 from the user's inbox */
    curl_easy_setopt(curl, CURLOPT_URL,
                     "imap://imap.example.com/INBOX/;UID=1");

    /* Perform the fetch */
    res = curl_easy_perform(curl);

    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* Always cleanup */
    curl_easy_cleanup(curl);
  }

  return (int)res;
}
Added jni/curl/docs/examples/pop3-authzid.c.












































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

/* <DESC>
 * POP3 example showing how to retrieve e-mails from a shared mailbox
 * </DESC>
 */

#include <stdio.h>
#include <curl/curl.h>

/* This is a simple example showing how to retrieve mail using libcurl's POP3
 * capabilities.
 *
 * Note that this example requires libcurl 7.66.0 or above.
 */

int main(void)
{
  CURL *curl;
  CURLcode res = CURLE_OK;

  curl = curl_easy_init();
  if(curl) {
    /* Set the username and password */
    curl_easy_setopt(curl, CURLOPT_USERNAME, "user");
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "secret");

    /* Set the authorisation identity (identity to act as) */
    curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "shared-mailbox");

    /* Force PLAIN authentication */
    curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=PLAIN");

    /* This will retrieve message 1 from the user's mailbox */
    curl_easy_setopt(curl, CURLOPT_URL, "pop3://pop.example.com/1");

    /* Perform the retr */
    res = curl_easy_perform(curl);

    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* Always cleanup */
    curl_easy_cleanup(curl);
  }

  return (int)res;
}
Added jni/curl/docs/examples/smtp-authzid.c.


































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

/* <DESC>
 * Send e-mail on behalf of another user with SMTP
 * </DESC>
 */

#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

/*
 * This is a simple example show how to send an email using libcurl's SMTP
 * capabilities.
 *
 * Note that this example requires libcurl 7.66.0 or above.
 */

/* The libcurl options want plain addresses, the viewable headers in the mail
 * can very well get a full name as well.
 */
#define FROM_ADDR    "<ursel@example.org>"
#define SENDER_ADDR  "<kurt@example.org>"
#define TO_ADDR      "<addressee@example.net>"

#define FROM_MAIL    "Ursel " FROM_ADDR
#define SENDER_MAIL  "Kurt " SENDER_ADDR
#define TO_MAIL      "A Receiver " TO_ADDR

static const char *payload_text[] = {
  "Date: Mon, 29 Nov 2010 21:54:29 +1100\r\n",
  "To: " TO_MAIL "\r\n",
  "From: " FROM_MAIL "\r\n",
  "Sender: " SENDER_MAIL "\r\n",
  "Message-ID: <dcd7cb36-11db-487a-9f3a-e652a9458efd@"
  "rfcpedant.example.org>\r\n",
  "Subject: SMTP example message\r\n",
  "\r\n", /* empty line to divide headers from body, see RFC5322 */
  "The body of the message starts here.\r\n",
  "\r\n",
  "It could be a lot of lines, could be MIME encoded, whatever.\r\n",
  "Check RFC5322.\r\n",
  NULL
};

struct upload_status {
  int lines_read;
};

static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp)
{
  struct upload_status *upload_ctx = (struct upload_status *)userp;
  const char *data;

  if((size == 0) || (nmemb == 0) || ((size*nmemb) < 1)) {
    return 0;
  }

  data = payload_text[upload_ctx->lines_read];

  if(data) {
    size_t len = strlen(data);
    memcpy(ptr, data, len);
    upload_ctx->lines_read++;

    return len;
  }

  return 0;
}

int main(void)
{
  CURL *curl;
  CURLcode res = CURLE_OK;
  struct curl_slist *recipients = NULL;
  struct upload_status upload_ctx;

  upload_ctx.lines_read = 0;

  curl = curl_easy_init();
  if(curl) {
    /* This is the URL for your mailserver. In this example we connect to the
       smtp-submission port as we require an authenticated connection. */
    curl_easy_setopt(curl, CURLOPT_URL, "smtp://mail.example.com:587");

    /* Set the username and password */
    curl_easy_setopt(curl, CURLOPT_USERNAME, "kurt");
    curl_easy_setopt(curl, CURLOPT_PASSWORD, "xipj3plmq");

    /* Set the authorisation identity (identity to act as) */
    curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "ursel");

    /* Force PLAIN authentication */
    curl_easy_setopt(curl, CURLOPT_LOGIN_OPTIONS, "AUTH=PLAIN");

    /* Note that this option isn't strictly required, omitting it will result
     * in libcurl sending the MAIL FROM command with empty sender data. All
     * autoresponses should have an empty reverse-path, and should be directed
     * to the address in the reverse-path which triggered them. Otherwise,
     * they could cause an endless loop. See RFC 5321 Section 4.5.5 for more
     * details.
     */
    curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM_ADDR);

    /* Add a recipient, in this particular case it corresponds to the
     * To: addressee in the header. */
    recipients = curl_slist_append(recipients, TO_ADDR);
    curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients);

    /* We're using a callback function to specify the payload (the headers and
     * body of the message). You could just use the CURLOPT_READDATA option to
     * specify a FILE pointer to read from. */
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source);
    curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx);
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);

    /* Send the message */
    res = curl_easy_perform(curl);

    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* Free the list of recipients */
    curl_slist_free_all(recipients);

    /* curl won't send the QUIT command until you call cleanup, so you should
     * be able to re-use this connection for additional messages (setting
     * CURLOPT_MAIL_FROM and CURLOPT_MAIL_RCPT as required, and calling
     * curl_easy_perform() again. It may not be a good idea to keep the
     * connection open for a very long time though (more than a few minutes
     * may result in the server timing out the connection), and you do want to
     * clean up in the end.
     */
    curl_easy_cleanup(curl);
  }

  return (int)res;
}
Changes to jni/curl/docs/libcurl/Makefile.in.
561
562
563
564
565
566
567



568
569

570
571
572
573
574
575
576
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
675
676
677
678
679
680
681

682
683
684
685
686
687
688
 curl_multi_add_handle.3 \
 curl_multi_assign.3 \
 curl_multi_cleanup.3 \
 curl_multi_fdset.3 \
 curl_multi_info_read.3 \
 curl_multi_init.3 \
 curl_multi_perform.3 \

 curl_multi_remove_handle.3 \
 curl_multi_setopt.3 \
 curl_multi_socket.3 \
 curl_multi_socket_action.3 \
 curl_multi_socket_all.3 \
 curl_multi_strerror.3 \
 curl_multi_timeout.3 \







>







679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
 curl_multi_add_handle.3 \
 curl_multi_assign.3 \
 curl_multi_cleanup.3 \
 curl_multi_fdset.3 \
 curl_multi_info_read.3 \
 curl_multi_init.3 \
 curl_multi_perform.3 \
 curl_multi_poll.3 \
 curl_multi_remove_handle.3 \
 curl_multi_setopt.3 \
 curl_multi_socket.3 \
 curl_multi_socket_action.3 \
 curl_multi_socket_all.3 \
 curl_multi_strerror.3 \
 curl_multi_timeout.3 \
Changes to jni/curl/docs/libcurl/Makefile.inc.
42
43
44
45
46
47
48

49
50
51
52
53
54
55
 curl_multi_add_handle.3 \
 curl_multi_assign.3 \
 curl_multi_cleanup.3 \
 curl_multi_fdset.3 \
 curl_multi_info_read.3 \
 curl_multi_init.3 \
 curl_multi_perform.3 \

 curl_multi_remove_handle.3 \
 curl_multi_setopt.3 \
 curl_multi_socket.3 \
 curl_multi_socket_action.3 \
 curl_multi_socket_all.3 \
 curl_multi_strerror.3 \
 curl_multi_timeout.3 \







>







42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 curl_multi_add_handle.3 \
 curl_multi_assign.3 \
 curl_multi_cleanup.3 \
 curl_multi_fdset.3 \
 curl_multi_info_read.3 \
 curl_multi_init.3 \
 curl_multi_perform.3 \
 curl_multi_poll.3 \
 curl_multi_remove_handle.3 \
 curl_multi_setopt.3 \
 curl_multi_socket.3 \
 curl_multi_socket_action.3 \
 curl_multi_socket_all.3 \
 curl_multi_strerror.3 \
 curl_multi_timeout.3 \
Changes to jni/curl/docs/libcurl/curl_easy_cleanup.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_cleanup 3 "August 09, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_cleanup - End a libcurl easy handle
.SH SYNOPSIS
.B #include <curl/curl.h>

.BI "void curl_easy_cleanup(CURL *" handle ");"







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_cleanup 3 "August 09, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_cleanup - End a libcurl easy handle
.SH SYNOPSIS
.B #include <curl/curl.h>

.BI "void curl_easy_cleanup(CURL *" handle ");"
Changes to jni/curl/docs/libcurl/curl_easy_duphandle.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_duphandle 3 "March 01, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_duphandle - Clone a libcurl session handle
.SH SYNOPSIS
.B #include <curl/curl.h>

.BI "CURL *curl_easy_duphandle(CURL *"handle ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_duphandle 3 "March 01, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_duphandle - Clone a libcurl session handle
.SH SYNOPSIS
.B #include <curl/curl.h>

.BI "CURL *curl_easy_duphandle(CURL *"handle ");"
Changes to jni/curl/docs/libcurl/curl_easy_escape.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_escape - URL encodes the given string
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_easy_escape( CURL *" curl ", const char *" string







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_escape 3 "August 12, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_escape - URL encodes the given string
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_easy_escape( CURL *" curl ", const char *" string
Changes to jni/curl/docs/libcurl/curl_easy_getinfo.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_getinfo 3 "April 11, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_getinfo - extract information from a curl handle
.SH SYNOPSIS
.B #include <curl/curl.h>

.B "CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... );"







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_getinfo 3 "August 06, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_getinfo - extract information from a curl handle
.SH SYNOPSIS
.B #include <curl/curl.h>

.B "CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ... );"
154
155
156
157
158
159
160



161
162
163
164
165
166
167
.IP CURLINFO_CONTENT_LENGTH_UPLOAD
(Deprecated) Upload size. See \fICURLINFO_CONTENT_LENGTH_UPLOAD(3)\fP
.IP CURLINFO_CONTENT_LENGTH_UPLOAD_T
Upload size.  See \fICURLINFO_CONTENT_LENGTH_UPLOAD_T(3)\fP
.IP CURLINFO_CONTENT_TYPE
Content type from the Content-Type header.
See \fICURLINFO_CONTENT_TYPE(3)\fP



.IP CURLINFO_PRIVATE
User's private data pointer.
See \fICURLINFO_PRIVATE(3)\fP
.IP CURLINFO_HTTPAUTH_AVAIL
Available HTTP authentication methods.
See \fICURLINFO_HTTPAUTH_AVAIL(3)\fP
.IP CURLINFO_PROXYAUTH_AVAIL







>
>
>







154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
.IP CURLINFO_CONTENT_LENGTH_UPLOAD
(Deprecated) Upload size. See \fICURLINFO_CONTENT_LENGTH_UPLOAD(3)\fP
.IP CURLINFO_CONTENT_LENGTH_UPLOAD_T
Upload size.  See \fICURLINFO_CONTENT_LENGTH_UPLOAD_T(3)\fP
.IP CURLINFO_CONTENT_TYPE
Content type from the Content-Type header.
See \fICURLINFO_CONTENT_TYPE(3)\fP
.IP CURLINFO_RETRY_AFTER
The value from the from the Retry-After header.
See \fICURLINFO_RETRY_AFTER(3)\fP
.IP CURLINFO_PRIVATE
User's private data pointer.
See \fICURLINFO_PRIVATE(3)\fP
.IP CURLINFO_HTTPAUTH_AVAIL
Available HTTP authentication methods.
See \fICURLINFO_HTTPAUTH_AVAIL(3)\fP
.IP CURLINFO_PROXYAUTH_AVAIL
Changes to jni/curl/docs/libcurl/curl_easy_init.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_init 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_init - Start a libcurl easy session
.SH SYNOPSIS
.B #include <curl/curl.h>

.BI "CURL *curl_easy_init( );"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_init 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_init - Start a libcurl easy session
.SH SYNOPSIS
.B #include <curl/curl.h>

.BI "CURL *curl_easy_init( );"
Changes to jni/curl/docs/libcurl/curl_easy_pause.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_pause - pause and unpause a connection
.SH SYNOPSIS
.B #include <curl/curl.h>

.BI "CURLcode curl_easy_pause(CURL *"handle ", int "bitmask " );"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_pause 3 "May 01, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_pause - pause and unpause a connection
.SH SYNOPSIS
.B #include <curl/curl.h>

.BI "CURLcode curl_easy_pause(CURL *"handle ", int "bitmask " );"
Changes to jni/curl/docs/libcurl/curl_easy_perform.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_perform 3 "September 23, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_perform - perform a blocking file transfer
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_easy_perform(CURL *" easy_handle ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_perform 3 "September 23, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_perform - perform a blocking file transfer
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_easy_perform(CURL *" easy_handle ");"
Changes to jni/curl/docs/libcurl/curl_easy_recv.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_recv - receives raw data on an "easy" connection
.SH SYNOPSIS
.B #include <curl/easy.h>
.sp
.BI "CURLcode curl_easy_recv( CURL *" curl ", void *" buffer ","







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_recv 3 "December 18, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_recv - receives raw data on an "easy" connection
.SH SYNOPSIS
.B #include <curl/easy.h>
.sp
.BI "CURLcode curl_easy_recv( CURL *" curl ", void *" buffer ","
Changes to jni/curl/docs/libcurl/curl_easy_reset.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_reset 3 "September 23, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_reset - reset all options of a libcurl session handle
.SH SYNOPSIS
.B #include <curl/curl.h>

.BI "void curl_easy_reset(CURL *"handle ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_reset 3 "September 23, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_reset - reset all options of a libcurl session handle
.SH SYNOPSIS
.B #include <curl/curl.h>

.BI "void curl_easy_reset(CURL *"handle ");"
Changes to jni/curl/docs/libcurl/curl_easy_send.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_send - sends raw data over an "easy" connection
.SH SYNOPSIS
.B #include <curl/easy.h>
.sp
.BI "CURLcode curl_easy_send( CURL *" curl ", const void *" buffer ","







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_send 3 "December 18, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_send - sends raw data over an "easy" connection
.SH SYNOPSIS
.B #include <curl/easy.h>
.sp
.BI "CURLcode curl_easy_send( CURL *" curl ", const void *" buffer ","
Changes to jni/curl/docs/libcurl/curl_easy_setopt.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_setopt 3 "May 24, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_setopt \- set options for a curl easy handle
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_setopt 3 "August 09, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_setopt \- set options for a curl easy handle
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
253
254
255
256
257
258
259


260
261
262
263
264
265
266
Proxy TLS authentication password. See \fICURLOPT_PROXY_TLSAUTH_PASSWORD(3)\fP
.IP CURLOPT_TLSAUTH_TYPE
TLS authentication methods. See \fICURLOPT_TLSAUTH_TYPE(3)\fP
.IP CURLOPT_PROXY_TLSAUTH_TYPE
Proxy TLS authentication methods. See \fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP
.IP CURLOPT_PROXYAUTH
HTTP proxy authentication methods. See \fICURLOPT_PROXYAUTH(3)\fP


.IP CURLOPT_SASL_IR
Enable SASL initial response. See \fICURLOPT_SASL_IR(3)\fP
.IP CURLOPT_XOAUTH2_BEARER
OAuth2 bearer token. See \fICURLOPT_XOAUTH2_BEARER(3)\fP
.IP CURLOPT_DISALLOW_USERNAME_IN_URL
Don't allow username in URL. See \fICURLOPT_DISALLOW_USERNAME_IN_URL(3)\fP
.SH HTTP OPTIONS







>
>







253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
Proxy TLS authentication password. See \fICURLOPT_PROXY_TLSAUTH_PASSWORD(3)\fP
.IP CURLOPT_TLSAUTH_TYPE
TLS authentication methods. See \fICURLOPT_TLSAUTH_TYPE(3)\fP
.IP CURLOPT_PROXY_TLSAUTH_TYPE
Proxy TLS authentication methods. See \fICURLOPT_PROXY_TLSAUTH_TYPE(3)\fP
.IP CURLOPT_PROXYAUTH
HTTP proxy authentication methods. See \fICURLOPT_PROXYAUTH(3)\fP
.IP CURLOPT_SASL_AUTHZID
SASL authorisation identity (identity to act as). See \fICURLOPT_SASL_AUTHZID(3)\fP
.IP CURLOPT_SASL_IR
Enable SASL initial response. See \fICURLOPT_SASL_IR(3)\fP
.IP CURLOPT_XOAUTH2_BEARER
OAuth2 bearer token. See \fICURLOPT_XOAUTH2_BEARER(3)\fP
.IP CURLOPT_DISALLOW_USERNAME_IN_URL
Don't allow username in URL. See \fICURLOPT_DISALLOW_USERNAME_IN_URL(3)\fP
.SH HTTP OPTIONS
Changes to jni/curl/docs/libcurl/curl_easy_strerror.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_strerror 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_strerror - return string describing error code
.SH SYNOPSIS
#include <curl/curl.h>

const char *curl_easy_strerror(CURLcode errornum);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_easy_strerror 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_strerror - return string describing error code
.SH SYNOPSIS
#include <curl/curl.h>

const char *curl_easy_strerror(CURLcode errornum);
Changes to jni/curl/docs/libcurl/curl_easy_unescape.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_easy_unescape - URL decodes the given string
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_easy_unescape( CURL *" curl ", const char *" url







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_easy_unescape 3 "October 04, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_easy_unescape - URL decodes the given string
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_easy_unescape( CURL *" curl ", const char *" url
Changes to jni/curl/docs/libcurl/curl_escape.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_escape 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_escape - URL encodes the given string
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_escape( const char *" url ", int "length " );"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_escape 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_escape - URL encodes the given string
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_escape( const char *" url ", int "length " );"
Changes to jni/curl/docs/libcurl/curl_formadd.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_formadd 3 "December 11, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_formadd - add a section to a multipart/formdata HTTP POST
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLFORMcode curl_formadd(struct curl_httppost ** " firstitem,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_formadd 3 "December 11, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_formadd - add a section to a multipart/formdata HTTP POST
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLFORMcode curl_formadd(struct curl_httppost ** " firstitem,
Changes to jni/curl/docs/libcurl/curl_formfree.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_formfree 3 "August 09, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_formfree - free a previously build multipart/formdata HTTP POST chain
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_formfree(struct curl_httppost *" form);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_formfree 3 "August 09, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_formfree - free a previously build multipart/formdata HTTP POST chain
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_formfree(struct curl_httppost *" form);
Changes to jni/curl/docs/libcurl/curl_formget.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_formget 3 "September 02, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_formget - serialize a previously built multipart/formdata HTTP POST chain
.SH SYNOPSIS
.nf
.B #include <curl/curl.h>








|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_formget 3 "September 02, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_formget - serialize a previously built multipart/formdata HTTP POST chain
.SH SYNOPSIS
.nf
.B #include <curl/curl.h>

Changes to jni/curl/docs/libcurl/curl_free.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_free 3 "August 09, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_free - reclaim memory that has been obtained through a libcurl call
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_free( char *" ptr " );"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_free 3 "August 09, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_free - reclaim memory that has been obtained through a libcurl call
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_free( char *" ptr " );"
Changes to jni/curl/docs/libcurl/curl_getdate.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_getdate 3 "January 18, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_getdate - Convert a date string to number of seconds
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "time_t curl_getdate(char *" datestring ", time_t *"now " );"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_getdate 3 "January 18, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_getdate - Convert a date string to number of seconds
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "time_t curl_getdate(char *" datestring ", time_t *"now " );"
Changes to jni/curl/docs/libcurl/curl_getenv.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_getenv 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_getenv - return value for environment name
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_getenv(const char *" name ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_getenv 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_getenv - return value for environment name
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_getenv(const char *" name ");"
Changes to jni/curl/docs/libcurl/curl_global_cleanup.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_global_cleanup - global libcurl cleanup
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_global_cleanup(void);"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_global_cleanup 3 "September 20, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_global_cleanup - global libcurl cleanup
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_global_cleanup(void);"
Changes to jni/curl/docs/libcurl/curl_global_init.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_global_init 3 "April 17, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_global_init - Global libcurl initialisation
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_global_init(long " flags ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_global_init 3 "April 17, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_global_init - Global libcurl initialisation
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_global_init(long " flags ");"
Changes to jni/curl/docs/libcurl/curl_global_init_mem.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_global_init_mem 3 "September 23, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_global_init_mem - Global libcurl initialisation with memory callbacks
.SH SYNOPSIS
.B #include <curl/curl.h>
.nf
.B "CURLcode curl_global_init_mem(long " flags,







|













|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_global_init_mem 3 "August 11, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_global_init_mem - Global libcurl initialisation with memory callbacks
.SH SYNOPSIS
.B #include <curl/curl.h>
.nf
.B "CURLcode curl_global_init_mem(long " flags,
56
57
58
59
60
61
62


63
64
65
To replace calloc()
.RE
This function is otherwise the same as \fIcurl_global_init(3)\fP, please refer
to that man page for documentation.
.SH "CAUTION"
Manipulating these gives considerable powers to the application to severely
screw things up for libcurl. Take care!


.SH "SEE ALSO"
.BR curl_global_init "(3), "
.BR curl_global_cleanup "(3), "







>
>



56
57
58
59
60
61
62
63
64
65
66
67
To replace calloc()
.RE
This function is otherwise the same as \fIcurl_global_init(3)\fP, please refer
to that man page for documentation.
.SH "CAUTION"
Manipulating these gives considerable powers to the application to severely
screw things up for libcurl. Take care!
.SH AVAILABILITY
Added in 7.12.0
.SH "SEE ALSO"
.BR curl_global_init "(3), "
.BR curl_global_cleanup "(3), "
Changes to jni/curl/docs/libcurl/curl_global_sslset.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_global_sslset 3 "October 30, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_global_sslset - Select SSL backend to use with libcurl
.SH SYNOPSIS
.B #include <curl/curl.h>
.nf








|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_global_sslset 3 "October 30, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_global_sslset - Select SSL backend to use with libcurl
.SH SYNOPSIS
.B #include <curl/curl.h>
.nf

Changes to jni/curl/docs/libcurl/curl_mime_addpart.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_addpart - append a new empty part to a mime structure
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "curl_mimepart * curl_mime_addpart(curl_mime * " mime ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_addpart 3 "September 22, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_addpart - append a new empty part to a mime structure
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "curl_mimepart * curl_mime_addpart(curl_mime * " mime ");"
Changes to jni/curl/docs/libcurl/curl_mime_data.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_data 3 "September 22, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_data - set a mime part's body data from memory
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_data(curl_mimepart * " part ", const char * " data







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_data 3 "September 22, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_data - set a mime part's body data from memory
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_data(curl_mimepart * " part ", const char * " data
Changes to jni/curl/docs/libcurl/curl_mime_data_cb.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_data_cb 3 "April 17, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_data_cb - set a callback-based data source for a mime part's body
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
size_t readfunc(char *buffer, size_t size, size_t nitems, void *arg);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_data_cb 3 "April 17, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_data_cb - set a callback-based data source for a mime part's body
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
size_t readfunc(char *buffer, size_t size, size_t nitems, void *arg);
Changes to jni/curl/docs/libcurl/curl_mime_encoder.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_encoder 3 "September 05, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_encoder - set a mime part's encoder and content transfer encoding
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_encoder(curl_mimepart * " part ,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_encoder 3 "September 05, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_encoder - set a mime part's encoder and content transfer encoding
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_encoder(curl_mimepart * " part ,
Changes to jni/curl/docs/libcurl/curl_mime_filedata.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_filedata 3 "April 17, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_filedata - set a mime part's body data from a file contents
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_filedata(curl_mimepart * " part ,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_filedata 3 "April 17, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_filedata - set a mime part's body data from a file contents
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_filedata(curl_mimepart * " part ,
Changes to jni/curl/docs/libcurl/curl_mime_filename.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_filename 3 "September 22, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_filename - set a mime part's remote file name
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_filename(curl_mimepart * " part ,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_filename 3 "September 22, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_filename - set a mime part's remote file name
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_filename(curl_mimepart * " part ,
Changes to jni/curl/docs/libcurl/curl_mime_free.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_free 3 "August 09, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_free - free a previously built mime structure
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_mime_free(curl_mime *" mime);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_free 3 "August 09, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_free - free a previously built mime structure
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_mime_free(curl_mime *" mime);
Changes to jni/curl/docs/libcurl/curl_mime_headers.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_headers 3 "September 22, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_headers - set a mime part's custom headers
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_headers(curl_mimepart * " part ,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_headers 3 "September 22, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_headers - set a mime part's custom headers
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_headers(curl_mimepart * " part ,
Changes to jni/curl/docs/libcurl/curl_mime_init.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_init 3 "September 22, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_init - create a mime handle
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "curl_mime * curl_mime_init(CURL * " easy_handle ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_init 3 "September 22, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_init - create a mime handle
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "curl_mime * curl_mime_init(CURL * " easy_handle ");"
Changes to jni/curl/docs/libcurl/curl_mime_name.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_name 3 "September 22, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_name - set a mime part's name
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_name(curl_mimepart * " part ", const char * " name ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_name 3 "September 22, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_name - set a mime part's name
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_name(curl_mimepart * " part ", const char * " name ");"
Changes to jni/curl/docs/libcurl/curl_mime_subparts.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_subparts - set subparts of a multipart mime part
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_subparts(curl_mimepart * " part ,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_subparts 3 "September 05, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_subparts - set subparts of a multipart mime part
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_subparts(curl_mimepart * " part ,
Changes to jni/curl/docs/libcurl/curl_mime_type.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_type 3 "April 17, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_mime_type - set a mime part's content type
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_type(curl_mimepart * " part ,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_mime_type 3 "April 17, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_mime_type - set a mime part's content type
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLcode curl_mime_type(curl_mimepart * " part ,
Changes to jni/curl/docs/libcurl/curl_mprintf.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_printf 3 "April 01, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_maprintf, curl_mfprintf, curl_mprintf, curl_msnprintf, curl_msprintf
curl_mvaprintf, curl_mvfprintf, curl_mvprintf, curl_mvsnprintf,
curl_mvsprintf - formatted output conversion
.SH SYNOPSIS
.B #include <curl/mprintf.h>







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_printf 3 "April 01, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_maprintf, curl_mfprintf, curl_mprintf, curl_msnprintf, curl_msprintf
curl_mvaprintf, curl_mvfprintf, curl_mvprintf, curl_mvsnprintf,
curl_mvsprintf - formatted output conversion
.SH SYNOPSIS
.B #include <curl/mprintf.h>
Changes to jni/curl/docs/libcurl/curl_multi_add_handle.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_add_handle 3 "June 30, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_add_handle - add an easy handle to a multi session
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_add_handle 3 "June 30, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_add_handle - add an easy handle to a multi session
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_add_handle(CURLM *multi_handle, CURL *easy_handle);
Changes to jni/curl/docs/libcurl/curl_multi_assign.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_assign 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_assign \- set data to associate with an internal socket
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t sockfd,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_assign 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_assign \- set data to associate with an internal socket
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_assign(CURLM *multi_handle, curl_socket_t sockfd,
Changes to jni/curl/docs/libcurl/curl_multi_cleanup.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_cleanup 3 "August 09, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_cleanup - close down a multi session
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLMcode curl_multi_cleanup( CURLM *multi_handle );"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_cleanup 3 "August 09, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_cleanup - close down a multi session
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLMcode curl_multi_cleanup( CURLM *multi_handle );"
Changes to jni/curl/docs/libcurl/curl_multi_fdset.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_fdset - extracts file descriptor information from a multi handle
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_fdset 3 "November 09, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_fdset - extracts file descriptor information from a multi handle
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/curl_multi_info_read.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_info_read 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_info_read - read multi stack informationals
.SH SYNOPSIS
#include <curl/curl.h>

CURLMsg *curl_multi_info_read( CURLM *multi_handle,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_info_read 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_info_read - read multi stack informationals
.SH SYNOPSIS
#include <curl/curl.h>

CURLMsg *curl_multi_info_read( CURLM *multi_handle,
Changes to jni/curl/docs/libcurl/curl_multi_init.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_init 3 "September 23, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_init - create a multi handle
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLM *curl_multi_init( );"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_init 3 "September 23, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_init - create a multi handle
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLM *curl_multi_init( );"
Changes to jni/curl/docs/libcurl/curl_multi_perform.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_perform 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_perform - reads/writes available data from each easy handle
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_perform 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_perform - reads/writes available data from each easy handle
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles);
Added jni/curl/docs/libcurl/curl_multi_poll.3.






























































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_poll 3 "July 29, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_poll - polls on all easy handles in a multi handle
.SH SYNOPSIS
.nf
#include <curl/curl.h>

CURLMcode curl_multi_poll(CURLM *multi_handle,
                          struct curl_waitfd extra_fds[],
                          unsigned int extra_nfds,
                          int timeout_ms,
                          int *numfds);
.ad
.SH DESCRIPTION
\fIcurl_multi_poll(3)\fP polls all file descriptors used by the curl easy
handles contained in the given multi handle set.  It will block until activity
is detected on at least one of the handles or \fItimeout_ms\fP has passed.
Alternatively, if the multi handle has a pending internal timeout that has a
shorter expiry time than \fItimeout_ms\fP, that shorter time will be used
instead to make sure timeout accuracy is reasonably kept.

The calling application may pass additional curl_waitfd structures which are
similar to \fIpoll(2)\fP's pollfd structure to be waited on in the same call.

On completion, if \fInumfds\fP is non-NULL, it will be populated with the
total number of file descriptors on which interesting events occurred. This
number can include both libcurl internal descriptors as well as descriptors
provided in \fIextra_fds\fP.

If no extra file descriptors are provided and libcurl has no file descriptor
to offer to wait for, this function will instead wait during \fItimeout_ms\fP
milliseconds (or shorter if an internal timer indicates so). This is the
detail that makes this function different than \fIcurl_multi_wait(3)\fP.

This function is encouraged to be used instead of select(3) when using the
multi interface to allow applications to easier circumvent the common problem
with 1024 maximum file descriptors.
.SH curl_waitfd
.nf
struct curl_waitfd {
  curl_socket_t fd;
  short events;
  short revents;
};
.fi
.IP CURL_WAIT_POLLIN
Bit flag to curl_waitfd.events indicating the socket should poll on read
events such as new data received.
.IP CURL_WAIT_POLLPRI
Bit flag to curl_waitfd.events indicating the socket should poll on high
priority read events such as out of band data.
.IP CURL_WAIT_POLLOUT
Bit flag to curl_waitfd.events indicating the socket should poll on write
events such as the socket being clear to write without blocking.
.SH EXAMPLE
.nf
CURL *easy_handle;
CURLM *multi_handle;

/* add the individual easy handle */
curl_multi_add_handle(multi_handle, easy_handle);

do {
  CURLMcode mc;
  int numfds;

  mc = curl_multi_perform(multi_handle, &still_running);

  if(mc == CURLM_OK) {
    /* wait for activity or timeout */
    mc = curl_multi_poll(multi_handle, NULL, 0, 1000, &numfds);
  }

  if(mc != CURLM_OK) {
    fprintf(stderr, "curl_multi failed, code %d.\\n", mc);
    break;
  }

} while(still_running);

curl_multi_remove_handle(multi_handle, easy_handle);
.fi
.SH RETURN VALUE
CURLMcode type, general libcurl multi interface error code. See
\fIlibcurl-errors(3)\fP
.SH AVAILABILITY
This function was added in libcurl 7.66.0.
.SH "SEE ALSO"
.BR curl_multi_fdset "(3), " curl_multi_perform "(3), " curl_multi_wait "(3)"
Changes to jni/curl/docs/libcurl/curl_multi_remove_handle.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_remove_handle 3 "February 19, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_remove_handle - remove an easy handle from a multi session
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_remove_handle 3 "February 19, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_remove_handle - remove an easy handle from a multi session
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_remove_handle(CURLM *multi_handle, CURL *easy_handle);
Changes to jni/curl/docs/libcurl/curl_multi_setopt.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_setopt 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_setopt \- set options for a curl multi handle
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM * multi_handle, CURLMoption option, param);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_setopt 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_setopt \- set options for a curl multi handle
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM * multi_handle, CURLMoption option, param);
Changes to jni/curl/docs/libcurl/curl_multi_socket.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_socket 3 "June 30, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_socket \- reads/writes available data
.SH SYNOPSIS
.nf
#include <curl/curl.h>
CURLMcode curl_multi_socket(CURLM * multi_handle, curl_socket_t sockfd,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_socket 3 "June 30, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_socket \- reads/writes available data
.SH SYNOPSIS
.nf
#include <curl/curl.h>
CURLMcode curl_multi_socket(CURLM * multi_handle, curl_socket_t sockfd,
Changes to jni/curl/docs/libcurl/curl_multi_socket_action.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_socket_action 3 "June 10, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_socket_action \- reads/writes available data given an action
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_socket_action 3 "June 10, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_socket_action \- reads/writes available data given an action
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/curl_multi_strerror.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_strerror 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_strerror - return string describing error code
.SH SYNOPSIS
.nf
.B #include <curl/curl.h>
.BI "const char *curl_multi_strerror(CURLMcode " errornum ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_strerror 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_strerror - return string describing error code
.SH SYNOPSIS
.nf
.B #include <curl/curl.h>
.BI "const char *curl_multi_strerror(CURLMcode " errornum ");"
Changes to jni/curl/docs/libcurl/curl_multi_timeout.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_timeout 3 "September 23, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_timeout \- how long to wait for action before proceeding
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_timeout(CURLM *multi_handle, long *timeout);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_timeout 3 "September 23, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_timeout \- how long to wait for action before proceeding
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_timeout(CURLM *multi_handle, long *timeout);
Changes to jni/curl/docs/libcurl/curl_multi_wait.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_wait 3 "June 26, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_multi_wait - polls on all easy handles in a multi handle
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_multi_wait 3 "June 26, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_multi_wait - polls on all easy handles in a multi handle
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/curl_share_cleanup.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_share_cleanup 3 "August 09, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_share_cleanup - Clean up a shared object
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLSHcode curl_share_cleanup(CURLSH *" share_handle ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_share_cleanup 3 "August 09, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_share_cleanup - Clean up a shared object
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLSHcode curl_share_cleanup(CURLSH *" share_handle ");"
Changes to jni/curl/docs/libcurl/curl_share_init.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_share_init 3 "September 23, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_share_init - Create a shared object
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLSH *curl_share_init( );"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_share_init 3 "September 23, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_share_init - Create a shared object
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "CURLSH *curl_share_init( );"
Changes to jni/curl/docs/libcurl/curl_share_setopt.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_share_setopt 3 "June 04, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_share_setopt - Set options for a shared object
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
CURLSHcode curl_share_setopt(CURLSH *share, CURLSHoption option, parameter);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_share_setopt 3 "June 04, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_share_setopt - Set options for a shared object
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
CURLSHcode curl_share_setopt(CURLSH *share, CURLSHoption option, parameter);
Changes to jni/curl/docs/libcurl/curl_share_strerror.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_share_strerror 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_share_strerror - return string describing error code
.SH SYNOPSIS
.nf
.B #include <curl/curl.h>
.BI "const char *curl_share_strerror(CURLSHcode " errornum ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_share_strerror 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_share_strerror - return string describing error code
.SH SYNOPSIS
.nf
.B #include <curl/curl.h>
.BI "const char *curl_share_strerror(CURLSHcode " errornum ");"
Changes to jni/curl/docs/libcurl/curl_slist_append.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_slist_append 3 "January 02, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_slist_append - add a string to an slist
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "struct curl_slist *curl_slist_append(struct curl_slist *" list,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_slist_append 3 "January 02, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_slist_append - add a string to an slist
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "struct curl_slist *curl_slist_append(struct curl_slist *" list,
Changes to jni/curl/docs/libcurl/curl_slist_free_all.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_slist_free_all 3 "September 23, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_slist_free_all - free an entire curl_slist list
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_slist_free_all(struct curl_slist *" list);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_slist_free_all 3 "September 23, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_slist_free_all - free an entire curl_slist list
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "void curl_slist_free_all(struct curl_slist *" list);
Changes to jni/curl/docs/libcurl/curl_strequal.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_strequal 3 "June 29, 2017" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_strequal, curl_strnequal - case insensitive string comparisons
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "int curl_strequal(char *" str1 ", char *" str2 ");"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_strequal 3 "June 29, 2017" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_strequal, curl_strnequal - case insensitive string comparisons
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "int curl_strequal(char *" str1 ", char *" str2 ");"
Changes to jni/curl/docs/libcurl/curl_unescape.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_unescape 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_unescape - URL decodes the given string
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_unescape( const char *" url ", int "length " );"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_unescape 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_unescape - URL decodes the given string
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_unescape( const char *" url ", int "length " );"
Changes to jni/curl/docs/libcurl/curl_url.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_url 3 "March 22, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_url - returns a new CURLU handle
.SH SYNOPSIS
.B #include <curl/curl.h>

CURLU *curl_url();







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_url 3 "March 22, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_url - returns a new CURLU handle
.SH SYNOPSIS
.B #include <curl/curl.h>

CURLU *curl_url();
Changes to jni/curl/docs/libcurl/curl_url_cleanup.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_url_cleanup 3 "September 08, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_url_cleanup - free a CURLU handle
.SH SYNOPSIS
.B #include <curl/curl.h>

void curl_url_cleanup(CURLU *handle);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_url_cleanup 3 "September 08, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_url_cleanup - free a CURLU handle
.SH SYNOPSIS
.B #include <curl/curl.h>

void curl_url_cleanup(CURLU *handle);
Changes to jni/curl/docs/libcurl/curl_url_dup.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_url_dup 3 "September 08, 2018" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_url_dup - duplicate a CURLU handle
.SH SYNOPSIS
.B #include <curl/curl.h>

CURLU *curl_url_dup(CURLU *inhandle);







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_url_dup 3 "September 08, 2018" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_url_dup - duplicate a CURLU handle
.SH SYNOPSIS
.B #include <curl/curl.h>

CURLU *curl_url_dup(CURLU *inhandle);
Changes to jni/curl/docs/libcurl/curl_url_get.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_url_get 3 "May 03, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_url_get - extract a part from a URL
.SH SYNOPSIS
.B #include <curl/curl.h>

.nf







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_url_get 3 "May 03, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_url_get - extract a part from a URL
.SH SYNOPSIS
.B #include <curl/curl.h>

.nf
Changes to jni/curl/docs/libcurl/curl_url_set.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_url_set 3 "May 03, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_url_set - set a URL part
.SH SYNOPSIS
.B #include <curl/curl.h>

CURLUcode curl_url_set(CURLU *url,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_url_set 3 "May 03, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_url_set - set a URL part
.SH SYNOPSIS
.B #include <curl/curl.h>

CURLUcode curl_url_set(CURLU *url,
Changes to jni/curl/docs/libcurl/curl_version.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_version 3 "February 03, 2016" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_version - returns the libcurl version string
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_version( );"







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH curl_version 3 "February 03, 2016" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_version - returns the libcurl version string
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "char *curl_version( );"
Changes to jni/curl/docs/libcurl/curl_version_info.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_version_info 3 "January 29, 2019" "libcurl 7.65.3" "libcurl Manual"

.SH NAME
curl_version_info - returns run-time libcurl version info
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "curl_version_info_data *curl_version_info( CURLversion "age ");"







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH curl_version_info 3 "August 13, 2019" "libcurl 7.66.0" "libcurl Manual"

.SH NAME
curl_version_info - returns run-time libcurl version info
.SH SYNOPSIS
.B #include <curl/curl.h>
.sp
.BI "curl_version_info_data *curl_version_info( CURLversion "age ");"
75
76
77
78
79
80
81









82
83
84
85
86
87
88

  /* when 'age' is 4 or higher (7.57.0 or later), the members below also
     exist  */
  unsigned int brotli_ver_num; /* Numeric Brotli version
                                  (MAJOR << 24) | (MINOR << 12) | PATCH */
  const char *brotli_version; /* human readable string. */










} curl_version_info_data;
.fi

\fIage\fP describes what the age of this struct is. The number depends on how
new the libcurl you're using is. You are however guaranteed to get a struct
that you have a matching struct for in the header, as you tell libcurl your
"age" with the input argument.







>
>
>
>
>
>
>
>
>







75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

  /* when 'age' is 4 or higher (7.57.0 or later), the members below also
     exist  */
  unsigned int brotli_ver_num; /* Numeric Brotli version
                                  (MAJOR << 24) | (MINOR << 12) | PATCH */
  const char *brotli_version; /* human readable string. */

  /* when 'age is CURLVERSION_SIXTH or alter (7.66.0 or later), these fields
     also exist */
  unsigned int nghttp2_ver_num; /* Numeric nghttp2 version
                                   (MAJOR << 16) | (MINOR << 8) | PATCH */
  const char *nghttp2_version; /* human readable string. */

  const char *quic_version;    /* human readable quic (+ HTTP/3) library +
                                  version or NULL */

} curl_version_info_data;
.fi

\fIage\fP describes what the age of this struct is. The number depends on how
new the libcurl you're using is. You are however guaranteed to get a struct
that you have a matching struct for in the header, as you tell libcurl your
"age" with the input argument.
96
97
98
99
100
101
102


































103
104
105
106
107
108
109
110
111
112
113
114


115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
\fIhost\fP is an ascii string showing what host information that this libcurl
was built for. As discovered by a configure script or set by the build
environment.

\fIfeatures\fP can have none, one or more bits set, and the currently defined
bits are:
.RS


































.IP CURL_VERSION_IPV6
supports IPv6
.IP CURL_VERSION_KERBEROS4
supports Kerberos V4 (when using FTP)
.IP CURL_VERSION_KERBEROS5
supports Kerberos V5 authentication for FTP, IMAP, POP3, SMTP and SOCKSv5 proxy
(Added in 7.40.0)
.IP CURL_VERSION_SSL
supports SSL (HTTPS/FTPS) (Added in 7.10)
.IP CURL_VERSION_LIBZ
supports HTTP deflate using libz (Added in 7.10)
.IP CURL_VERSION_NTLM


supports HTTP NTLM (added in 7.10.6)
.IP CURL_VERSION_GSSNEGOTIATE
supports HTTP GSS-Negotiate (added in 7.10.6)
.IP CURL_VERSION_DEBUG
libcurl was built with debug capabilities (added in 7.10.6)
.IP CURL_VERSION_CURLDEBUG
libcurl was built with memory tracking debug capabilities. This is mainly of
interest for libcurl hackers. (added in 7.19.6)
.IP CURL_VERSION_ASYNCHDNS
libcurl was built with support for asynchronous name lookups, which allows
more exact timeouts (even on Windows) and less blocking when using the multi
interface. (added in 7.10.7)
.IP CURL_VERSION_SPNEGO
libcurl was built with support for SPNEGO authentication (Simple and Protected
GSS-API Negotiation Mechanism, defined in RFC 2478.) (added in 7.10.8)
.IP CURL_VERSION_LARGEFILE
libcurl was built with support for large files. (Added in 7.11.1)
.IP CURL_VERSION_IDN
libcurl was built with support for IDNA, domain names with international
letters. (Added in 7.12.0)
.IP CURL_VERSION_SSPI
libcurl was built with support for SSPI. This is only available on Windows and
makes libcurl use Windows-provided functions for Kerberos, NTLM, SPNEGO and
Digest authentication. It also allows libcurl to use the current user
credentials without the app having to pass them on. (Added in 7.13.2)
.IP CURL_VERSION_GSSAPI
libcurl was built with support for GSS-API. This makes libcurl use provided
functions for Kerberos and SPNEGO authentication. It also allows libcurl
to use the current user credentials without the app having to pass them on.
(Added in 7.38.0)
.IP CURL_VERSION_CONV
libcurl was built with support for character conversions, as provided by the
CURLOPT_CONV_* callbacks. (Added in 7.15.4)
.IP CURL_VERSION_TLSAUTH_SRP
libcurl was built with support for TLS-SRP. (Added in 7.21.4)
.IP CURL_VERSION_NTLM_WB
libcurl was built with support for NTLM delegation to a winbind helper.
(Added in 7.22.0)
.IP CURL_VERSION_HTTP2
libcurl was built with support for HTTP2.
(Added in 7.33.0)
.IP CURL_VERSION_UNIX_SOCKETS
libcurl was built with support for Unix domain sockets.
(Added in 7.40.0)
.IP CURL_VERSION_PSL
libcurl was built with support for Mozilla's Public Suffix List. This makes
libcurl ignore cookies with a domain that's on the list.
(Added in 7.47.0)
.IP CURL_VERSION_HTTPS_PROXY
libcurl was built with support for HTTPS-proxy.
(Added in 7.52.0)
.IP CURL_VERSION_MULTI_SSL
libcurl was built with multiple SSL backends. For details, see
\fIcurl_global_sslset(3)\fP.
(Added in 7.56.0)
.IP CURL_VERSION_BROTLI
supports HTTP Brotli content encoding using libbrotlidec (Added in 7.57.0)
.RE
\fIssl_version\fP is an ASCII string for the TLS library name + version
used. If libcurl has no SSL support, this is NULL. For example "Schannel",
\&"SecureTransport" or "OpenSSL/1.1.0g".

\fIssl_version_num\fP is always 0.








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







|
|


|
>
>
|
|
|
|
|
<
<
|
|
|
|
|



|
<
<
<
|





<
<
<
<
<
<
<
<


<
<
<
<
<
<



<
<
<
<
<
<
<
<
<
<
<
<
<







105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164


165
166
167
168
169
170
171
172
173



174
175
176
177
178
179








180
181






182
183
184













185
186
187
188
189
190
191
\fIhost\fP is an ascii string showing what host information that this libcurl
was built for. As discovered by a configure script or set by the build
environment.

\fIfeatures\fP can have none, one or more bits set, and the currently defined
bits are:
.RS
.IP CURL_VERSION_ALTSVC
HTTP Alt-Svc parsing and the associated options (Added in 7.64.1)
.IP CURL_VERSION_ASYNCHDNS
libcurl was built with support for asynchronous name lookups, which allows
more exact timeouts (even on Windows) and less blocking when using the multi
interface. (added in 7.10.7)
.IP CURL_VERSION_BROTLI
supports HTTP Brotli content encoding using libbrotlidec (Added in 7.57.0)
.IP CURL_VERSION_CONV
libcurl was built with support for character conversions, as provided by the
CURLOPT_CONV_* callbacks. (Added in 7.15.4)
.IP CURL_VERSION_CURLDEBUG
libcurl was built with memory tracking debug capabilities. This is mainly of
interest for libcurl hackers. (added in 7.19.6)
.IP CURL_VERSION_DEBUG
libcurl was built with debug capabilities (added in 7.10.6)
.IP CURL_VERSION_GSSAPI
libcurl was built with support for GSS-API. This makes libcurl use provided
functions for Kerberos and SPNEGO authentication. It also allows libcurl
to use the current user credentials without the app having to pass them on.
(Added in 7.38.0)
.IP CURL_VERSION_GSSNEGOTIATE
supports HTTP GSS-Negotiate (added in 7.10.6)
.IP CURL_VERSION_HTTPS_PROXY
libcurl was built with support for HTTPS-proxy.
(Added in 7.52.0)
.IP CURL_VERSION_HTTP2
libcurl was built with support for HTTP2.
(Added in 7.33.0)
.IP CURL_VERSION_HTTP3
HTTP/3 and QUIC support are built-in (Added in 7.66.0)
.IP CURL_VERSION_IDN
libcurl was built with support for IDNA, domain names with international
letters. (Added in 7.12.0)
.IP CURL_VERSION_IPV6
supports IPv6
.IP CURL_VERSION_KERBEROS4
supports Kerberos V4 (when using FTP)
.IP CURL_VERSION_KERBEROS5
supports Kerberos V5 authentication for FTP, IMAP, POP3, SMTP and SOCKSv5 proxy
(Added in 7.40.0)
.IP CURL_VERSION_LARGEFILE
libcurl was built with support for large files. (Added in 7.11.1)
.IP CURL_VERSION_LIBZ
supports HTTP deflate using libz (Added in 7.10)
.IP CURL_VERSION_MULTI_SSL
libcurl was built with multiple SSL backends. For details, see
\fIcurl_global_sslset(3)\fP.
(Added in 7.56.0)
.IP CURL_VERSION_NTLM
supports HTTP NTLM (added in 7.10.6)
.IP CURL_VERSION_NTLM_WB
libcurl was built with support for NTLM delegation to a winbind helper.


(Added in 7.22.0)
.IP CURL_VERSION_PSL
libcurl was built with support for Mozilla's Public Suffix List. This makes
libcurl ignore cookies with a domain that's on the list.
(Added in 7.47.0)
.IP CURL_VERSION_SPNEGO
libcurl was built with support for SPNEGO authentication (Simple and Protected
GSS-API Negotiation Mechanism, defined in RFC 2478.) (added in 7.10.8)
.IP CURL_VERSION_SSL



supports SSL (HTTPS/FTPS) (Added in 7.10)
.IP CURL_VERSION_SSPI
libcurl was built with support for SSPI. This is only available on Windows and
makes libcurl use Windows-provided functions for Kerberos, NTLM, SPNEGO and
Digest authentication. It also allows libcurl to use the current user
credentials without the app having to pass them on. (Added in 7.13.2)








.IP CURL_VERSION_TLSAUTH_SRP
libcurl was built with support for TLS-SRP. (Added in 7.21.4)






.IP CURL_VERSION_UNIX_SOCKETS
libcurl was built with support for Unix domain sockets.
(Added in 7.40.0)













.RE
\fIssl_version\fP is an ASCII string for the TLS library name + version
used. If libcurl has no SSL support, this is NULL. For example "Schannel",
\&"SecureTransport" or "OpenSSL/1.1.0g".

\fIssl_version_num\fP is always 0.

Changes to jni/curl/docs/libcurl/libcurl-easy.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl 3 "February 03, 2016" "libcurl 7.65.3" "libcurl easy interface"

.SH NAME
libcurl-easy \- easy interface overview
.SH DESCRIPTION
When using libcurl's "easy" interface you init your session and get a handle
(often referred to as an "easy handle"), which you use as input to the easy
interface functions you use. Use \fIcurl_easy_init(3)\fP to get the handle.







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl 3 "February 03, 2016" "libcurl 7.66.0" "libcurl easy interface"

.SH NAME
libcurl-easy \- easy interface overview
.SH DESCRIPTION
When using libcurl's "easy" interface you init your session and get a handle
(often referred to as an "easy handle"), which you use as input to the easy
interface functions you use. Use \fIcurl_easy_init(3)\fP to get the handle.
Changes to jni/curl/docs/libcurl/libcurl-env.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl-env 3 "April 17, 2018" "libcurl 7.65.3" "libcurl environment variables"

.SH NAME
libcurl-env \- environment variables libcurl understands
.SH DESCRIPTION
libcurl reads and understands a set of environment variables that if set will
control and change behaviors. This is the full list of variables to set and
description of what they do. Also note that curl, the command line tool,







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl-env 3 "April 17, 2018" "libcurl 7.66.0" "libcurl environment variables"

.SH NAME
libcurl-env \- environment variables libcurl understands
.SH DESCRIPTION
libcurl reads and understands a set of environment variables that if set will
control and change behaviors. This is the full list of variables to set and
description of what they do. Also note that curl, the command line tool,
Changes to jni/curl/docs/libcurl/libcurl-errors.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH libcurl-errors 3 "November 19, 2018" "libcurl 7.65.3" "libcurl errors"

.SH NAME
libcurl-errors \- error codes in libcurl
.SH DESCRIPTION
This man page includes most, if not all, available error codes in libcurl.
Why they occur and possibly what you can do to fix the problem are also included.
.SH "CURLcode"







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH libcurl-errors 3 "May 11, 2019" "libcurl 7.66.0" "libcurl errors"

.SH NAME
libcurl-errors \- error codes in libcurl
.SH DESCRIPTION
This man page includes most, if not all, available error codes in libcurl.
Why they occur and possibly what you can do to fix the problem are also included.
.SH "CURLcode"
251
252
253
254
255
256
257


258
259
260
261
262
263
264
Failed to match the pinned key specified with \fICURLOPT_PINNEDPUBLICKEY(3)\fP.
.IP "CURLE_SSL_INVALIDCERTSTATUS (91)"
Status returned failure when asked with \fICURLOPT_SSL_VERIFYSTATUS(3)\fP.
.IP "CURLE_HTTP2_STREAM (92)"
Stream error in the HTTP/2 framing layer.
.IP "CURLE_RECURSIVE_API_CALL (93)"
An API function was called from inside a callback.


.IP "CURLE_OBSOLETE*"
These error codes will never be returned. They were used in an old libcurl
version and are currently unused.
.SH "CURLMcode"
This is the generic return code used by functions in the libcurl multi
interface. Also consider \fIcurl_multi_strerror(3)\fP.
.IP "CURLM_CALL_MULTI_PERFORM (-1)"







>
>







251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
Failed to match the pinned key specified with \fICURLOPT_PINNEDPUBLICKEY(3)\fP.
.IP "CURLE_SSL_INVALIDCERTSTATUS (91)"
Status returned failure when asked with \fICURLOPT_SSL_VERIFYSTATUS(3)\fP.
.IP "CURLE_HTTP2_STREAM (92)"
Stream error in the HTTP/2 framing layer.
.IP "CURLE_RECURSIVE_API_CALL (93)"
An API function was called from inside a callback.
.IP "CURLE_AUTH_ERROR (94)"
An authentication function returned an error.
.IP "CURLE_OBSOLETE*"
These error codes will never be returned. They were used in an old libcurl
version and are currently unused.
.SH "CURLMcode"
This is the generic return code used by functions in the libcurl multi
interface. Also consider \fIcurl_multi_strerror(3)\fP.
.IP "CURLM_CALL_MULTI_PERFORM (-1)"
Changes to jni/curl/docs/libcurl/libcurl-multi.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH libcurl-multi 3 "June 30, 2018" "libcurl 7.65.3" "libcurl multi interface"

.SH NAME
libcurl-multi \- how to use the multi interface
.SH DESCRIPTION
This is an overview on how to use the libcurl multi interface in your C
programs. There are specific man pages for each function mentioned in
here. There's also the \fIlibcurl-tutorial(3)\fP man page for a complete







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH libcurl-multi 3 "June 30, 2018" "libcurl 7.66.0" "libcurl multi interface"

.SH NAME
libcurl-multi \- how to use the multi interface
.SH DESCRIPTION
This is an overview on how to use the libcurl multi interface in your C
programs. There are specific man pages for each function mentioned in
here. There's also the \fIlibcurl-tutorial(3)\fP man page for a complete
Changes to jni/curl/docs/libcurl/libcurl-security.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH libcurl-security 3 "July 16, 2019" "libcurl 7.65.3" "libcurl security"

.SH NAME
libcurl-security \- security considerations when using libcurl
.SH "Security"
The libcurl project takes security seriously.  The library is written with
caution and precautions are taken to mitigate many kinds of risks encountered
while operating with potentially malicious servers on the Internet. It is a







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH libcurl-security 3 "July 16, 2019" "libcurl 7.66.0" "libcurl security"

.SH NAME
libcurl-security \- security considerations when using libcurl
.SH "Security"
The libcurl project takes security seriously.  The library is written with
caution and precautions are taken to mitigate many kinds of risks encountered
while operating with potentially malicious servers on the Internet. It is a
Changes to jni/curl/docs/libcurl/libcurl-share.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl-share 3 "November 27, 2017" "libcurl 7.65.3" "libcurl share interface"

.SH NAME
libcurl-share \- how to use the share interface
.SH DESCRIPTION
This is an overview on how to use the libcurl share interface in your C
programs. There are specific man pages for each function mentioned in
here.







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl-share 3 "November 27, 2017" "libcurl 7.66.0" "libcurl share interface"

.SH NAME
libcurl-share \- how to use the share interface
.SH DESCRIPTION
This is an overview on how to use the libcurl share interface in your C
programs. There are specific man pages for each function mentioned in
here.
Changes to jni/curl/docs/libcurl/libcurl-symbols.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl-symbols 3 "jul 19, 2019" "libcurl 7.41.0" "libcurl symbols"
.SH NAME
libcurl-symbols \- libcurl symbol version information
.SH "libcurl symbols"
This man page details version information for public symbols provided in the
libcurl header files. This lists the first version in which the symbol was
introduced and for some symbols two additional information pieces:

The first version in which the symbol is marked "deprecated" - meaning that
since that version no new code should be written to use the symbol as it is
marked for getting removed in a future.

The last version that featured the specific symbol. Using the symbol in source
code will make it no longer compile error-free after that specified version.

This man page is automatically generated from the symbols-in-versions file.
.IP CURLALTSVC_ALTUSED
Introduced in 7.64.1
.IP CURLALTSVC_H1
Introduced in 7.64.1
.IP CURLALTSVC_H2
Introduced in 7.64.1
.IP CURLALTSVC_H3
Introduced in 7.64.1
.IP CURLALTSVC_IMMEDIATELY







|















<
<







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37


38
39
40
41
42
43
44
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl-symbols 3 "sep 11, 2019" "libcurl 7.41.0" "libcurl symbols"
.SH NAME
libcurl-symbols \- libcurl symbol version information
.SH "libcurl symbols"
This man page details version information for public symbols provided in the
libcurl header files. This lists the first version in which the symbol was
introduced and for some symbols two additional information pieces:

The first version in which the symbol is marked "deprecated" - meaning that
since that version no new code should be written to use the symbol as it is
marked for getting removed in a future.

The last version that featured the specific symbol. Using the symbol in source
code will make it no longer compile error-free after that specified version.

This man page is automatically generated from the symbols-in-versions file.


.IP CURLALTSVC_H1
Introduced in 7.64.1
.IP CURLALTSVC_H2
Introduced in 7.64.1
.IP CURLALTSVC_H3
Introduced in 7.64.1
.IP CURLALTSVC_IMMEDIATELY
88
89
90
91
92
93
94


95
96
97
98
99
100
101
Introduced in 7.7
.IP CURLE_ABORTED_BY_CALLBACK
Introduced in 7.1
.IP CURLE_AGAIN
Introduced in 7.18.2
.IP CURLE_ALREADY_COMPLETE
Introduced in 7.7.2


.IP CURLE_BAD_CALLING_ORDER
Introduced in 7.1
Deprecated since 7.17.0
.IP CURLE_BAD_CONTENT_ENCODING
Introduced in 7.10
.IP CURLE_BAD_DOWNLOAD_RESUME
Introduced in 7.10







>
>







86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
Introduced in 7.7
.IP CURLE_ABORTED_BY_CALLBACK
Introduced in 7.1
.IP CURLE_AGAIN
Introduced in 7.18.2
.IP CURLE_ALREADY_COMPLETE
Introduced in 7.7.2
.IP CURLE_AUTH_ERROR
Introduced in 7.66.0
.IP CURLE_BAD_CALLING_ORDER
Introduced in 7.1
Deprecated since 7.17.0
.IP CURLE_BAD_CONTENT_ENCODING
Introduced in 7.10
.IP CURLE_BAD_DOWNLOAD_RESUME
Introduced in 7.10
592
593
594
595
596
597
598


599
600
601
602
603
604
605
Introduced in 7.61.0
.IP CURLINFO_REDIRECT_URL
Introduced in 7.18.2
.IP CURLINFO_REQUEST_SIZE
Introduced in 7.4.1
.IP CURLINFO_RESPONSE_CODE
Introduced in 7.10.8


.IP CURLINFO_RTSP_CLIENT_CSEQ
Introduced in 7.20.0
.IP CURLINFO_RTSP_CSEQ_RECV
Introduced in 7.20.0
.IP CURLINFO_RTSP_SERVER_CSEQ
Introduced in 7.20.0
.IP CURLINFO_RTSP_SESSION_ID







>
>







592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
Introduced in 7.61.0
.IP CURLINFO_REDIRECT_URL
Introduced in 7.18.2
.IP CURLINFO_REQUEST_SIZE
Introduced in 7.4.1
.IP CURLINFO_RESPONSE_CODE
Introduced in 7.10.8
.IP CURLINFO_RETRY_AFTER
Introduced in 7.66.0
.IP CURLINFO_RTSP_CLIENT_CSEQ
Introduced in 7.20.0
.IP CURLINFO_RTSP_CSEQ_RECV
Introduced in 7.20.0
.IP CURLINFO_RTSP_SERVER_CSEQ
Introduced in 7.20.0
.IP CURLINFO_RTSP_SESSION_ID
1194
1195
1196
1197
1198
1199
1200


1201
1202
1203
1204
1205
1206
1207
Introduced in 7.20.0
.IP CURLOPT_RTSP_SESSION_ID
Introduced in 7.20.0
.IP CURLOPT_RTSP_STREAM_URI
Introduced in 7.20.0
.IP CURLOPT_RTSP_TRANSPORT
Introduced in 7.20.0


.IP CURLOPT_SASL_IR
Introduced in 7.31.0
.IP CURLOPT_SEEKDATA
Introduced in 7.18.0
.IP CURLOPT_SEEKFUNCTION
Introduced in 7.18.0
.IP CURLOPT_SERVER_RESPONSE_TIMEOUT







>
>







1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
Introduced in 7.20.0
.IP CURLOPT_RTSP_SESSION_ID
Introduced in 7.20.0
.IP CURLOPT_RTSP_STREAM_URI
Introduced in 7.20.0
.IP CURLOPT_RTSP_TRANSPORT
Introduced in 7.20.0
.IP CURLOPT_SASL_AUTHZID
Introduced in 7.66.0
.IP CURLOPT_SASL_IR
Introduced in 7.31.0
.IP CURLOPT_SEEKDATA
Introduced in 7.18.0
.IP CURLOPT_SEEKFUNCTION
Introduced in 7.18.0
.IP CURLOPT_SERVER_RESPONSE_TIMEOUT
1663
1664
1665
1666
1667
1668
1669


1670
1671
1672
1673
1674
1675
1676
Introduced in 7.16.1
.IP CURLVERSION_NOW
Introduced in 7.10
.IP CURLVERSION_SECOND
Introduced in 7.11.1
.IP CURLVERSION_THIRD
Introduced in 7.12.0


.IP CURL_CHUNK_BGN_FUNC_FAIL
Introduced in 7.21.0
.IP CURL_CHUNK_BGN_FUNC_OK
Introduced in 7.21.0
.IP CURL_CHUNK_BGN_FUNC_SKIP
Introduced in 7.21.0
.IP CURL_CHUNK_END_FUNC_FAIL







>
>







1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
Introduced in 7.16.1
.IP CURLVERSION_NOW
Introduced in 7.10
.IP CURLVERSION_SECOND
Introduced in 7.11.1
.IP CURLVERSION_THIRD
Introduced in 7.12.0
.IP CURLVERSION_SIXTH
Introduced in 7.66.0
.IP CURL_CHUNK_BGN_FUNC_FAIL
Introduced in 7.21.0
.IP CURL_CHUNK_BGN_FUNC_OK
Introduced in 7.21.0
.IP CURL_CHUNK_BGN_FUNC_SKIP
Introduced in 7.21.0
.IP CURL_CHUNK_END_FUNC_FAIL
1759
1760
1761
1762
1763
1764
1765


1766
1767
1768
1769
1770
1771
1772
Introduced in 7.43.0
.IP CURL_HTTP_VERSION_2TLS
Introduced in 7.47.0
.IP CURL_HTTP_VERSION_2_0
Introduced in 7.33.0
.IP CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE
Introduced in 7.49.0


.IP CURL_HTTP_VERSION_NONE
Introduced in 7.9.1
.IP CURL_IPRESOLVE_V4
Introduced in 7.10.8
.IP CURL_IPRESOLVE_V6
Introduced in 7.10.8
.IP CURL_IPRESOLVE_WHATEVER







>
>







1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
Introduced in 7.43.0
.IP CURL_HTTP_VERSION_2TLS
Introduced in 7.47.0
.IP CURL_HTTP_VERSION_2_0
Introduced in 7.33.0
.IP CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE
Introduced in 7.49.0
.IP CURL_HTTP_VERSION_3
Introduced in 7.66.0
.IP CURL_HTTP_VERSION_NONE
Introduced in 7.9.1
.IP CURL_IPRESOLVE_V4
Introduced in 7.10.8
.IP CURL_IPRESOLVE_V6
Introduced in 7.10.8
.IP CURL_IPRESOLVE_WHATEVER
1948
1949
1950
1951
1952
1953
1954


1955
1956
1957
1958
1959
1960
1961
.IP CURL_VERSION_GSSAPI
Introduced in 7.38.0
.IP CURL_VERSION_GSSNEGOTIATE
Introduced in 7.10.6
Deprecated since 7.38.0
.IP CURL_VERSION_HTTP2
Introduced in 7.33.0


.IP CURL_VERSION_HTTPS_PROXY
Introduced in 7.52.0
.IP CURL_VERSION_IDN
Introduced in 7.12.0
.IP CURL_VERSION_IPV6
Introduced in 7.10
.IP CURL_VERSION_KERBEROS4







>
>







1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
.IP CURL_VERSION_GSSAPI
Introduced in 7.38.0
.IP CURL_VERSION_GSSNEGOTIATE
Introduced in 7.10.6
Deprecated since 7.38.0
.IP CURL_VERSION_HTTP2
Introduced in 7.33.0
.IP CURL_VERSION_HTTP3
Introduced in 7.66.0
.IP CURL_VERSION_HTTPS_PROXY
Introduced in 7.52.0
.IP CURL_VERSION_IDN
Introduced in 7.12.0
.IP CURL_VERSION_IPV6
Introduced in 7.10
.IP CURL_VERSION_KERBEROS4
Changes to jni/curl/docs/libcurl/libcurl-thread.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH libcurl-thread 3 "June 30, 2019" "libcurl 7.65.3" "libcurl thread safety"

.SH NAME
libcurl-thread \- libcurl thread safety
.SH "Multi-threading with libcurl"
libcurl is thread safe but has no internal thread synchronization. You may have
to provide your own locking should you meet any of the thread safety exceptions
below.







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH libcurl-thread 3 "June 30, 2019" "libcurl 7.66.0" "libcurl thread safety"

.SH NAME
libcurl-thread \- libcurl thread safety
.SH "Multi-threading with libcurl"
libcurl is thread safe but has no internal thread synchronization. You may have
to provide your own locking should you meet any of the thread safety exceptions
below.
Changes to jni/curl/docs/libcurl/libcurl-tutorial.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH libcurl-tutorial 3 "June 08, 2019" "libcurl 7.65.3" "libcurl programming"

.SH NAME
libcurl-tutorial \- libcurl programming tutorial
.SH "Objective"
This document attempts to describe the general principles and some basic
approaches to consider when programming with libcurl. The text will focus
mainly on the C interface but might apply fairly well on other interfaces as







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH libcurl-tutorial 3 "June 08, 2019" "libcurl 7.66.0" "libcurl programming"

.SH NAME
libcurl-tutorial \- libcurl programming tutorial
.SH "Objective"
This document attempts to describe the general principles and some basic
approaches to consider when programming with libcurl. The text will focus
mainly on the C interface but might apply fairly well on other interfaces as
Changes to jni/curl/docs/libcurl/libcurl-url.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl 3 "September 10, 2018" "libcurl 7.65.3" "libcurl url interface"

.SH NAME
libcurl-url \- URL interface overview
.SH DESCRIPTION
The URL interface provides a set of functions for parsing and generating URLs.
.SH INCLUDE
You still only include <curl/curl.h> in your code. Note that the URL API was







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl 3 "September 10, 2018" "libcurl 7.66.0" "libcurl url interface"

.SH NAME
libcurl-url \- URL interface overview
.SH DESCRIPTION
The URL interface provides a set of functions for parsing and generating URLs.
.SH INCLUDE
You still only include <curl/curl.h> in your code. Note that the URL API was
Changes to jni/curl/docs/libcurl/libcurl.3.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl 3 "July 15, 2017" "libcurl 7.65.3" "libcurl overview"

.SH NAME
libcurl \- client-side URL transfers
.SH DESCRIPTION
This is a short overview on how to use libcurl in your C programs. There are
specific man pages for each function mentioned in here. There are also the
\fIlibcurl-easy(3)\fP man page, the \fIlibcurl-multi(3)\fP man page, the







|







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.TH libcurl 3 "July 15, 2017" "libcurl 7.66.0" "libcurl overview"

.SH NAME
libcurl \- client-side URL transfers
.SH DESCRIPTION
This is a short overview on how to use libcurl in your C programs. There are
specific man pages for each function mentioned in here. There are also the
\fIlibcurl-easy(3)\fP man page, the \fIlibcurl-multi(3)\fP man page, the
Changes to jni/curl/docs/libcurl/opts/CURLINFO_ACTIVESOCKET.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_ACTIVESOCKET \- get the active socket
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_ACTIVESOCKET,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_ACTIVESOCKET 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_ACTIVESOCKET \- get the active socket
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_ACTIVESOCKET,
Changes to jni/curl/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36


37
38
39
40
41
42
43
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_APPCONNECT_TIME 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_APPCONNECT_TIME \- get the time until the SSL/SSH handshake is completed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_APPCONNECT_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the time, in seconds, it took from the
start until the SSL/SSH connect/handshake to the remote host was completed.
This time is most often very near to the \fICURLINFO_PRETRANSFER_TIME(3)\fP
time, except for cases such as HTTP pipelining where the pretransfer time can
be delayed due to waits in line for the pipeline and more.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|













>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_APPCONNECT_TIME 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_APPCONNECT_TIME \- get the time until the SSL/SSH handshake is completed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_APPCONNECT_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the time, in seconds, it took from the
start until the SSL/SSH connect/handshake to the remote host was completed.
This time is most often very near to the \fICURLINFO_PRETRANSFER_TIME(3)\fP
time, except for cases such as HTTP pipelining where the pretransfer time can
be delayed due to waits in line for the pipeline and more.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLINFO_APPCONNECT_TIME_T.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37


38
39
40
41
42
43
44
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_APPCONNECT_TIME_T 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_APPCONNECT_TIME_T \- get the time until the SSL/SSH handshake is completed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_APPCONNECT_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the time, in microseconds,
it took from the
start until the SSL/SSH connect/handshake to the remote host was completed.
This time is most often very near to the \fICURLINFO_PRETRANSFER_TIME_T(3)\fP
time, except for cases such as HTTP pipelining where the pretransfer time can
be delayed due to waits in line for the pipeline and more.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|














>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_APPCONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_APPCONNECT_TIME_T \- get the time until the SSL/SSH handshake is completed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_APPCONNECT_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the time, in microseconds,
it took from the
start until the SSL/SSH connect/handshake to the remote host was completed.
This time is most often very near to the \fICURLINFO_PRETRANSFER_TIME_T(3)\fP
time, except for cases such as HTTP pipelining where the pretransfer time can
be delayed due to waits in line for the pipeline and more.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLINFO_CERTINFO.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CERTINFO 3 "November 07, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CERTINFO \- get the TLS certificate chain
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CERTINFO,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CERTINFO 3 "November 07, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CERTINFO \- get the TLS certificate chain
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CERTINFO,
Changes to jni/curl/docs/libcurl/opts/CURLINFO_CONDITION_UNMET.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONDITION_UNMET 3 "February 23, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONDITION_UNMET \- get info on unmet time conditional
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONDITION_UNMET, long *unmet);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONDITION_UNMET 3 "February 23, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONDITION_UNMET \- get info on unmet time conditional
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONDITION_UNMET, long *unmet);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_CONNECT_TIME.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33


34
35
36
37
38
39
40
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONNECT_TIME 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONNECT_TIME \- get the time until connect
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONNECT_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the total time in seconds from the start
until the connection to the remote host (or proxy) was completed.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|










>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONNECT_TIME 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONNECT_TIME \- get the time until connect
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONNECT_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the total time in seconds from the start
until the connection to the remote host (or proxy) was completed.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLINFO_CONNECT_TIME_T.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33



34
35
36
37
38
39
40
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONNECT_TIME_T 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONNECT_TIME_T \- get the time until connect
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONNECT_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the total time in microseconds
from the start until the connection to the remote host (or proxy) was completed.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
if(curl) {







|














|










>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONNECT_TIME_T 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONNECT_TIME_T \- get the time until connect
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONNECT_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the total time in microseconds
from the start until the connection to the remote host (or proxy) was completed.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
if(curl) {
Changes to jni/curl/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD \- get content-length of download
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD 3 "June 15, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD \- get content-length of download
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
Changes to jni/curl/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T \- get content-length of download
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONTENT_LENGTH_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONTENT_LENGTH_DOWNLOAD_T \- get content-length of download
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T,
Changes to jni/curl/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD \- get the specified size of the upload
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_UPLOAD,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONTENT_LENGTH_UPLOAD 3 "June 15, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD \- get the specified size of the upload
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_UPLOAD,
Changes to jni/curl/docs/libcurl/opts/CURLINFO_CONTENT_LENGTH_UPLOAD_T.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "March 31, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD_T \- get the specified size of the upload
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_UPLOAD_T,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONTENT_LENGTH_UPLOAD_T 3 "March 31, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONTENT_LENGTH_UPLOAD_T \- get the specified size of the upload
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_LENGTH_UPLOAD_T,
Changes to jni/curl/docs/libcurl/opts/CURLINFO_CONTENT_TYPE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONTENT_TYPE \- get Content-Type
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_TYPE, char **ct);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_CONTENT_TYPE 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_CONTENT_TYPE \- get Content-Type
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_CONTENT_TYPE, char **ct);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_COOKIELIST.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_COOKIELIST 3 "March 20, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_COOKIELIST \- get all known cookies
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_COOKIELIST,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_COOKIELIST 3 "March 20, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_COOKIELIST \- get all known cookies
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_COOKIELIST,
Changes to jni/curl/docs/libcurl/opts/CURLINFO_EFFECTIVE_URL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_EFFECTIVE_URL \- get the last used URL
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_EFFECTIVE_URL, char **urlp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_EFFECTIVE_URL 3 "May 04, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_EFFECTIVE_URL \- get the last used URL
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_EFFECTIVE_URL, char **urlp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_FILETIME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_FILETIME \- get the remote time of the retrieved document
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_FILETIME, long *timep);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_FILETIME \- get the remote time of the retrieved document
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_FILETIME, long *timep);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_FILETIME_T.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_FILETIME_T \- get the remote time of the retrieved document
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_FILETIME_T, curl_off_t *timep);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_FILETIME 3 "January 25, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_FILETIME_T \- get the remote time of the retrieved document
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_FILETIME_T, curl_off_t *timep);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_FTP_ENTRY_PATH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_FTP_ENTRY_PATH \- get entry path in FTP server
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_FTP_ENTRY_PATH, char **path);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_FTP_ENTRY_PATH 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_FTP_ENTRY_PATH \- get entry path in FTP server
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_FTP_ENTRY_PATH, char **path);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_HEADER_SIZE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_HEADER_SIZE \- get size of retrieved headers
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HEADER_SIZE, long *sizep);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_HEADER_SIZE 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_HEADER_SIZE \- get size of retrieved headers
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HEADER_SIZE, long *sizep);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_HTTPAUTH_AVAIL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_HTTPAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_HTTPAUTH_AVAIL \- get available HTTP authentication methods
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTPAUTH_AVAIL, long *authp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_HTTPAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_HTTPAUTH_AVAIL \- get available HTTP authentication methods
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTPAUTH_AVAIL, long *authp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_HTTP_CONNECTCODE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_HTTP_CONNECTCODE \- get the CONNECT response code
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTP_CONNECTCODE, long *p);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_HTTP_CONNECTCODE 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_HTTP_CONNECTCODE \- get the CONNECT response code
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTP_CONNECTCODE, long *p);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_HTTP_VERSION.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

34
35
36
37
38
39
40
41
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_HTTP_VERSION 3 "May 11, 2016" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_HTTP_VERSION \- get the http version used in the connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTP_VERSION, long *p);
.SH DESCRIPTION
Pass a pointer to a long to receive the version used in the last http connection.
The returned value will be CURL_HTTP_VERSION_1_0, CURL_HTTP_VERSION_1_1, or

CURL_HTTP_VERSION_2_0, or 0 if the version can't be determined.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
if(curl) {
  CURLcode res;







|














|








|
|
>
|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_HTTP_VERSION 3 "August 07, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_HTTP_VERSION \- get the http version used in the connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_HTTP_VERSION, long *p);
.SH DESCRIPTION
Pass a pointer to a long to receive the version used in the last http
connection.  The returned value will be CURL_HTTP_VERSION_1_0,
CURL_HTTP_VERSION_1_1, CURL_HTTP_VERSION_2_0, CURL_HTTP_VERSION_3 or 0 if the
version can't be determined.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
if(curl) {
  CURLcode res;
Changes to jni/curl/docs/libcurl/opts/CURLINFO_LASTSOCKET.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_LASTSOCKET \- get the last socket used
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_LASTSOCKET, long *socket);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_LASTSOCKET 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_LASTSOCKET \- get the last socket used
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_LASTSOCKET, long *socket);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_LOCAL_IP.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_LOCAL_IP 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_LOCAL_IP \- get local IP address of last connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_LOCAL_IP, char **ip);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_LOCAL_IP 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_LOCAL_IP \- get local IP address of last connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_LOCAL_IP, char **ip);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_LOCAL_PORT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_LOCAL_PORT \- get the latest local port number
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_LOCAL_PORT, long *portp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_LOCAL_PORT 3 "March 16, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_LOCAL_PORT \- get the latest local port number
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_LOCAL_PORT, long *portp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33


34
35
36
37
38
39
40
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_NAMELOOKUP_TIME 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_NAMELOOKUP_TIME \- get the name lookup time
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NAMELOOKUP_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the total time in seconds from the start
until the name resolving was completed.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|










>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_NAMELOOKUP_TIME 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_NAMELOOKUP_TIME \- get the name lookup time
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NAMELOOKUP_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the total time in seconds from the start
until the name resolving was completed.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLINFO_NAMELOOKUP_TIME_T.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33


34
35
36
37
38
39
40
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_NAMELOOKUP_TIME_T 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_NAMELOOKUP_TIME_T \- get the name lookup time in microseconds
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NAMELOOKUP_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the total time in microseconds
from the start until the name resolving was completed.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|










>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_NAMELOOKUP_TIME_T 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_NAMELOOKUP_TIME_T \- get the name lookup time in microseconds
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NAMELOOKUP_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the total time in microseconds
from the start until the name resolving was completed.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLINFO_NUM_CONNECTS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_NUM_CONNECTS \- get number of created connections
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NUM_CONNECTS, long *nump);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_NUM_CONNECTS 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_NUM_CONNECTS \- get number of created connections
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_NUM_CONNECTS, long *nump);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_OS_ERRNO.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_OS_ERRNO 3 "November 07, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_OS_ERRNO \- get errno number from last connect failure
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_OS_ERRNO, long *errnop);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_OS_ERRNO 3 "November 07, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_OS_ERRNO \- get errno number from last connect failure
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_OS_ERRNO, long *errnop);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36


37
38
39
40
41
42
43
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PRETRANSFER_TIME 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PRETRANSFER_TIME \- get the time until the file transfer start
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRETRANSFER_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the time, in seconds, it took from the
start until the file transfer is just about to begin. This includes all
pre-transfer commands and negotiations that are specific to the particular
protocol(s) involved. It does \fInot\fP involve the sending of the protocol-
specific request that triggers a transfer.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|













>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PRETRANSFER_TIME 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PRETRANSFER_TIME \- get the time until the file transfer start
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRETRANSFER_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the time, in seconds, it took from the
start until the file transfer is just about to begin. This includes all
pre-transfer commands and negotiations that are specific to the particular
protocol(s) involved. It does \fInot\fP involve the sending of the protocol-
specific request that triggers a transfer.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLINFO_PRETRANSFER_TIME_T.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37


38
39
40
41
42
43
44
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PRETRANSFER_TIME_T 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PRETRANSFER_TIME_T \- get the time until the file transfer start
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRETRANSFER_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the time, in microseconds,
it took from the
start until the file transfer is just about to begin. This includes all
pre-transfer commands and negotiations that are specific to the particular
protocol(s) involved. It does \fInot\fP involve the sending of the protocol-
specific request that triggers a transfer.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|














>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PRETRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PRETRANSFER_TIME_T \- get the time until the file transfer start
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRETRANSFER_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the time, in microseconds,
it took from the
start until the file transfer is just about to begin. This includes all
pre-transfer commands and negotiations that are specific to the particular
protocol(s) involved. It does \fInot\fP involve the sending of the protocol-
specific request that triggers a transfer.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLINFO_PRIMARY_IP.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PRIMARY_IP 3 "March 22, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PRIMARY_IP \- get IP address of last connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRIMARY_IP, char **ip);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PRIMARY_IP 3 "March 22, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PRIMARY_IP \- get IP address of last connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRIMARY_IP, char **ip);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_PRIMARY_PORT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PRIMARY_PORT \- get the latest destination port number
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRIMARY_PORT, long *portp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PRIMARY_PORT 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PRIMARY_PORT \- get the latest destination port number
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRIMARY_PORT, long *portp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_PRIVATE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PRIVATE \- get the private pointer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRIVATE, char **private);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PRIVATE 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PRIVATE \- get the private pointer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PRIVATE, char **private);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_PROTOCOL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PROTOCOL 3 "April 27, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PROTOCOL \- get the protocol used in the connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROTOCOL, long *p);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PROTOCOL 3 "April 27, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PROTOCOL \- get the protocol used in the connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROTOCOL, long *p);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_PROXYAUTH_AVAIL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PROXYAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PROXYAUTH_AVAIL \- get available HTTP proxy authentication methods
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROXYAUTH_AVAIL, long *authp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PROXYAUTH_AVAIL 3 "October 07, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PROXYAUTH_AVAIL \- get available HTTP proxy authentication methods
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROXYAUTH_AVAIL, long *authp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_PROXY_SSL_VERIFYRESULT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PROXY_SSL_VERIFYRESULT \- get the result of the proxy certificate verification
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROXY_SSL_VERIFYRESULT, long *result);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_PROXY_SSL_VERIFYRESULT 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_PROXY_SSL_VERIFYRESULT \- get the result of the proxy certificate verification
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_PROXY_SSL_VERIFYRESULT, long *result);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_REDIRECT_COUNT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_REDIRECT_COUNT \- get the number of redirects
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_COUNT, long *countp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_REDIRECT_COUNT 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_REDIRECT_COUNT \- get the number of redirects
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_COUNT, long *countp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_REDIRECT_TIME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_REDIRECT_TIME 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_REDIRECT_TIME \- get the time for all redirection steps
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_TIME, double *timep);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_REDIRECT_TIME 3 "May 17, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_REDIRECT_TIME \- get the time for all redirection steps
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_TIME, double *timep);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_REDIRECT_TIME_T.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_REDIRECT_TIME_T 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_REDIRECT_TIME_T \- get the time for all redirection steps
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_TIME_T, curl_off_t *timep);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_REDIRECT_TIME_T 3 "May 17, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_REDIRECT_TIME_T \- get the time for all redirection steps
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_TIME_T, curl_off_t *timep);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_REDIRECT_URL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_REDIRECT_URL \- get the URL a redirect would go to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_URL, char **urlp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_REDIRECT_URL 3 "June 24, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_REDIRECT_URL \- get the URL a redirect would go to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REDIRECT_URL, char **urlp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_REQUEST_SIZE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_REQUEST_SIZE \- get size of sent request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REQUEST_SIZE, long *sizep);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_REQUEST_SIZE 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_REQUEST_SIZE \- get size of sent request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_REQUEST_SIZE, long *sizep);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_RESPONSE_CODE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RESPONSE_CODE 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RESPONSE_CODE \- get the last response code
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RESPONSE_CODE, long *codep);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RESPONSE_CODE 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RESPONSE_CODE \- get the last response code
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RESPONSE_CODE, long *codep);
Added jni/curl/docs/libcurl/opts/CURLINFO_RETRY_AFTER.3.
































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RETRY_AFTER 3 "August 06, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RETRY_AFTER \- returns the Retry-After retry delay
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RETRY_AFTER, curl_off_t *retry);
.SH DESCRIPTION
Pass a pointer to a curl_off_t variable to receive the number of seconds the
HTTP server suggesets the client should wait until the next request is
issued. The information from the "Retry-After:" header.

While the HTTP header might contain a fixed date string, the
\fICURLINFO_RETRY_AFTER(3)\fP will alwaus return number of seconds to wait -
or zero if there was no header or the header couldn't be parsed.
.SH DEFAULT
Returns zero delay if there was no header.
.SH PROTOCOLS
HTTP(S)
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
if(curl) {
  CURLcode res;
  curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
  res = curl_easy_perform(curl);
  if(res == CURLE_OK) {
    curl_off_t wait = 0;
    curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &wait);
    if(wait)
      printf("Wait for %" CURL_FORMAT_CURL_OFF_T " seconds\\n", wait);
  }
  curl_easy_cleanup(curl);
}
.fi
.SH AVAILABILITY
Added in curl 7.66.0
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR CURLOPT_STDERR "(3), " CURLOPT_HEADERFUNCTION "(3), "
Changes to jni/curl/docs/libcurl/opts/CURLINFO_RTSP_CLIENT_CSEQ.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RTSP_CLIENT_CSEQ \- get the next RTSP client CSeq
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_CLIENT_CSEQ, long *cseq);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RTSP_CLIENT_CSEQ 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RTSP_CLIENT_CSEQ \- get the next RTSP client CSeq
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_CLIENT_CSEQ, long *cseq);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_RTSP_CSEQ_RECV.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RTSP_CSEQ_RECV \- get the recently received CSeq
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_CSEQ_RECV, long *cseq);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RTSP_CSEQ_RECV 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RTSP_CSEQ_RECV \- get the recently received CSeq
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_CSEQ_RECV, long *cseq);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_RTSP_SERVER_CSEQ.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RTSP_SERVER_CSEQ \- get the next RTSP server CSeq
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_SERVER_CSEQ, long *cseq);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RTSP_SERVER_CSEQ \- get the next RTSP server CSeq
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_SERVER_CSEQ, long *cseq);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_RTSP_SESSION_ID.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RTSP_SESSION_ID \- get RTSP session ID
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_SESSION_ID, char **id);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_RTSP_SESSION_ID \- get RTSP session ID
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_RTSP_SESSION_ID, char **id);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SCHEME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SCHEME, char **scheme);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SCHEME 3 "April 08, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SCHEME \- get the URL scheme (sometimes called protocol) used in the connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SCHEME, char **scheme);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SIZE_DOWNLOAD \- get the number of downloaded bytes
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_DOWNLOAD, double *dlp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SIZE_DOWNLOAD 3 "June 15, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SIZE_DOWNLOAD \- get the number of downloaded bytes
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_DOWNLOAD, double *dlp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SIZE_DOWNLOAD_T.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SIZE_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SIZE_DOWNLOAD_T \- get the number of downloaded bytes
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_DOWNLOAD_T, curl_off_t *dlp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SIZE_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SIZE_DOWNLOAD_T \- get the number of downloaded bytes
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_DOWNLOAD_T, curl_off_t *dlp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SIZE_UPLOAD \- get the number of uploaded bytes
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_UPLOAD, double *uploadp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SIZE_UPLOAD 3 "June 15, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SIZE_UPLOAD \- get the number of uploaded bytes
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_UPLOAD, double *uploadp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SIZE_UPLOAD_T.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SIZE_UPLOAD_T 3 "March 31, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SIZE_UPLOAD_T \- get the number of uploaded bytes
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_UPLOAD_T, curl_off_t *uploadp);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SIZE_UPLOAD_T 3 "March 31, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SIZE_UPLOAD_T \- get the number of uploaded bytes
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SIZE_UPLOAD_T, curl_off_t *uploadp);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SPEED_DOWNLOAD \- get download speed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_DOWNLOAD, double *speed);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SPEED_DOWNLOAD 3 "June 15, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SPEED_DOWNLOAD \- get download speed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_DOWNLOAD, double *speed);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SPEED_DOWNLOAD_T.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SPEED_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SPEED_DOWNLOAD_T \- get download speed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_DOWNLOAD_T, curl_off_t *speed);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SPEED_DOWNLOAD_T 3 "March 31, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SPEED_DOWNLOAD_T \- get download speed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_DOWNLOAD_T, curl_off_t *speed);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SPEED_UPLOAD \- get upload speed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_UPLOAD, double *speed);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SPEED_UPLOAD 3 "June 15, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SPEED_UPLOAD \- get upload speed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_UPLOAD, double *speed);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SPEED_UPLOAD_T.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SPEED_UPLOAD_T 3 "March 31, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SPEED_UPLOAD_T \- get upload speed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_UPLOAD_T, curl_off_t *speed);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SPEED_UPLOAD_T 3 "March 31, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SPEED_UPLOAD_T \- get upload speed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SPEED_UPLOAD_T, curl_off_t *speed);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SSL_ENGINES.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SSL_ENGINES \- get an slist of OpenSSL crypto-engines
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SSL_ENGINES,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SSL_ENGINES 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SSL_ENGINES \- get an slist of OpenSSL crypto-engines
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SSL_ENGINES,
Changes to jni/curl/docs/libcurl/opts/CURLINFO_SSL_VERIFYRESULT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SSL_VERIFYRESULT 3 "March 21, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SSL_VERIFYRESULT \- get the result of the certificate verification
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SSL_VERIFYRESULT, long *result);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_SSL_VERIFYRESULT 3 "March 21, 2018" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_SSL_VERIFYRESULT \- get the result of the certificate verification
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_SSL_VERIFYRESULT, long *result);
Changes to jni/curl/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35


36
37
38
39
40
41
42
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_STARTTRANSFER_TIME 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_STARTTRANSFER_TIME \- get the time until the first byte is received
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_STARTTRANSFER_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the time, in seconds, it took from the
start until the first byte is received by libcurl. This includes
\fICURLINFO_PRETRANSFER_TIME(3)\fP and also the time the server needs to
calculate the result.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|












>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_STARTTRANSFER_TIME 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_STARTTRANSFER_TIME \- get the time until the first byte is received
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_STARTTRANSFER_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the time, in seconds, it took from the
start until the first byte is received by libcurl. This includes
\fICURLINFO_PRETRANSFER_TIME(3)\fP and also the time the server needs to
calculate the result.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLINFO_STARTTRANSFER_TIME_T.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36


37
38
39
40
41
42
43
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_STARTTRANSFER_TIME_T 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_STARTTRANSFER_TIME_T \- get the time until the first byte is received
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_STARTTRANSFER_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the time, in microseconds,
it took from the
start until the first byte is received by libcurl. This includes
\fICURLINFO_PRETRANSFER_TIME_T(3)\fP and also the time the server needs to
calculate the result.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|













>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_STARTTRANSFER_TIME_T 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_STARTTRANSFER_TIME_T \- get the time until the first byte is received
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_STARTTRANSFER_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the time, in microseconds,
it took from the
start until the first byte is received by libcurl. This includes
\fICURLINFO_PRETRANSFER_TIME_T(3)\fP and also the time the server needs to
calculate the result.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLINFO_TLS_SESSION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_TLS_SESSION \- get TLS session info
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_TLS_SESSION 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_TLS_SESSION \- get TLS session info
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLINFO_TLS_SSL_PTR.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_TLS_SSL_PTR 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_TLS_SESSION, CURLINFO_TLS_SSL_PTR \- get TLS session info
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_TLS_SSL_PTR 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_TLS_SESSION, CURLINFO_TLS_SSL_PTR \- get TLS session info
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLINFO_TOTAL_TIME.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34


35
36
37
38
39
40
41
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_TOTAL_TIME 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_TOTAL_TIME \- get total time of previous transfer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_TOTAL_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the total time in seconds for the
previous transfer, including name resolving, TCP connect etc. The double
represents the time in seconds, including fractions.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|











>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_TOTAL_TIME 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_TOTAL_TIME \- get total time of previous transfer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_TOTAL_TIME, double *timep);
.SH DESCRIPTION
Pass a pointer to a double to receive the total time in seconds for the
previous transfer, including name resolving, TCP connect etc. The double
represents the time in seconds, including fractions.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLINFO_TOTAL_TIME_T.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34


35
36
37
38
39
40
41
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_TOTAL_TIME_T 3 "May 17, 2018" "libcurl 7.65.3" "curl_easy_getinfo options"

.SH NAME
CURLINFO_TOTAL_TIME_T \- get total time of previous transfer in microseconds
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_TOTAL_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the total time in microseconds
for the previous transfer, including name resolving, TCP connect etc.
The curl_off_t represents the time in microseconds.



See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();







|














|











>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 2018 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLINFO_TOTAL_TIME_T 3 "August 26, 2019" "libcurl 7.66.0" "curl_easy_getinfo options"

.SH NAME
CURLINFO_TOTAL_TIME_T \- get total time of previous transfer in microseconds
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_getinfo(CURL *handle, CURLINFO_TOTAL_TIME_T, curl_off_t *timep);
.SH DESCRIPTION
Pass a pointer to a curl_off_t to receive the total time in microseconds
for the previous transfer, including name resolving, TCP connect etc.
The curl_off_t represents the time in microseconds.

When a redirect is followed, the time from each request is added together.

See also the TIMES overview in the \fIcurl_easy_getinfo(3)\fP man page.
.SH PROTOCOLS
All
.SH EXAMPLE
.nf
curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, long size);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE \- chunk length threshold for pipelining
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, long size);
Changes to jni/curl/docs/libcurl/opts/CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, long size);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE 3 "April 05, 2019" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE \- size threshold for pipelining penalty
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, long size);
Changes to jni/curl/docs/libcurl/opts/CURLMOPT_MAXCONNECTS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_MAXCONNECTS 3 "September 23, 2018" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_MAXCONNECTS \- set size of connection cache
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAXCONNECTS, long max);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_MAXCONNECTS 3 "September 23, 2018" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_MAXCONNECTS \- set size of connection cache
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAXCONNECTS, long max);
Changes to jni/curl/docs/libcurl/opts/CURLMOPT_MAX_HOST_CONNECTIONS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single host
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_HOST_CONNECTIONS, long max);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_MAX_HOST_CONNECTIONS 3 "May 27, 2017" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_MAX_HOST_CONNECTIONS \- set max number of connections to a single host
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_HOST_CONNECTIONS, long max);
Changes to jni/curl/docs/libcurl/opts/CURLMOPT_MAX_PIPELINE_LENGTH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "April 05, 2019" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_PIPELINE_LENGTH, long max);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_MAX_PIPELINE_LENGTH 3 "April 05, 2019" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_MAX_PIPELINE_LENGTH \- maximum number of requests in a pipeline
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_PIPELINE_LENGTH, long max);
Changes to jni/curl/docs/libcurl/opts/CURLMOPT_MAX_TOTAL_CONNECTIONS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_MAX_TOTAL_CONNECTIONS \- max simultaneously open connections
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_TOTAL_CONNECTIONS, long amount);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_MAX_TOTAL_CONNECTIONS 3 "May 27, 2017" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_MAX_TOTAL_CONNECTIONS \- max simultaneously open connections
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_MAX_TOTAL_CONNECTIONS, long amount);
Changes to jni/curl/docs/libcurl/opts/CURLMOPT_PIPELINING.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_PIPELINING 3 "April 05, 2019" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_PIPELINING \- enable HTTP pipelining and multiplexing
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING, long bitmask);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_PIPELINING 3 "April 05, 2019" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_PIPELINING \- enable HTTP pipelining and multiplexing
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING, long bitmask);
Changes to jni/curl/docs/libcurl/opts/CURLMOPT_PIPELINING_SERVER_BL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_PIPELINING_SERVER_BL 3 "April 05, 2019" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SERVER_BL, char **servers);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_PIPELINING_SERVER_BL 3 "April 05, 2019" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_PIPELINING_SERVER_BL \- pipelining server blacklist
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SERVER_BL, char **servers);
Changes to jni/curl/docs/libcurl/opts/CURLMOPT_PIPELINING_SITE_BL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_PIPELINING_SITE_BL 3 "April 05, 2019" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SITE_BL, char **hosts);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_PIPELINING_SITE_BL 3 "April 05, 2019" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_PIPELINING_SITE_BL \- pipelining host blacklist
.SH SYNOPSIS
#include <curl/curl.h>

CURLMcode curl_multi_setopt(CURLM *handle, CURLMOPT_PIPELINING_SITE_BL, char **hosts);
Changes to jni/curl/docs/libcurl/opts/CURLMOPT_PUSHDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_PUSHDATA \- pointer to pass to push callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_PUSHDATA 3 "May 27, 2017" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_PUSHDATA \- pointer to pass to push callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLMOPT_PUSHFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_PUSHFUNCTION 3 "February 03, 2016" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_PUSHFUNCTION \- callback that approves or denies server pushes
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLMOPT_SOCKETDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_SOCKETDATA \- custom pointer passed to the socket callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_SOCKETDATA 3 "May 31, 2017" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_SOCKETDATA \- custom pointer passed to the socket callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLMOPT_SOCKETFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_SOCKETFUNCTION 3 "June 24, 2019" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_SOCKETFUNCTION \- callback informed about what to wait for
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_SOCKETFUNCTION 3 "June 24, 2019" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_SOCKETFUNCTION \- callback informed about what to wait for
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLMOPT_TIMERDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_TIMERDATA \- custom pointer to pass to timer callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_TIMERDATA 3 "May 27, 2017" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_TIMERDATA \- custom pointer to pass to timer callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLMOPT_TIMERFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_TIMERFUNCTION 3 "May 03, 2019" "libcurl 7.65.3" "curl_multi_setopt options"

.SH NAME
CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLMOPT_TIMERFUNCTION 3 "May 03, 2019" "libcurl 7.66.0" "curl_multi_setopt options"

.SH NAME
CURLMOPT_TIMERFUNCTION \- set callback to receive timeout values
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_ABSTRACT_UNIX_SOCKET.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "January 09, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ABSTRACT_UNIX_SOCKET, char *path);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ABSTRACT_UNIX_SOCKET 3 "January 09, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_ABSTRACT_UNIX_SOCKET \- set an abstract Unix domain socket
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ABSTRACT_UNIX_SOCKET, char *path);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_ACCEPTTIMEOUT_MS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_ACCEPTTIMEOUT_MS \- timeout waiting for FTP server to connect back
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ACCEPTTIMEOUT_MS, long ms);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ACCEPTTIMEOUT_MS 3 "March 06, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_ACCEPTTIMEOUT_MS \- timeout waiting for FTP server to connect back
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ACCEPTTIMEOUT_MS, long ms);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_ACCEPT_ENCODING.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ACCEPT_ENCODING 3 "August 27, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ACCEPT_ENCODING, char *enc);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ACCEPT_ENCODING 3 "August 27, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_ACCEPT_ENCODING \- enables automatic decompression of HTTP downloads
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ACCEPT_ENCODING, char *enc);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_ADDRESS_SCOPE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ADDRESS_SCOPE 3 "March 07, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_ADDRESS_SCOPE \- set scope id for IPv6 addresses
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ADDRESS_SCOPE, long scope);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ADDRESS_SCOPE 3 "March 07, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_ADDRESS_SCOPE \- set scope id for IPv6 addresses
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ADDRESS_SCOPE, long scope);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_ALTSVC.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42


43
44
45
46
47
48
49
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ALTSVC 3 "April 03, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_ALTSVC \- set alt-svc cache file name
.SH SYNOPSIS
.nf
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ALTSVC, char *filename);
.fi
.SH EXPERIMENTAL
Warning: this feature is early code and is marked as experimental. It can only
be enabled by explicitly telling configure with \fB--enable-alt-svc\fP. You are
advised to not ship this in production before the experimental label is
removed.
.SH DESCRIPTION
Pass in a pointer to a \fIfilename\fP to instruct libcurl to use that file as
the Alt-Svc cache to read existing cache contents from and possibly also write
it back to a after a transfer, unless \fBCURLALTSVC_READONLYFILE\fP is set in
\fICURLOPT_ALTSVC_CTRL(3)\fP.


.SH DEFAULT
NULL. The alt-svc cache is not read nor written to file.
.SH PROTOCOLS
HTTPS
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();







|



















>
>







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ALTSVC 3 "August 14, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_ALTSVC \- set alt-svc cache file name
.SH SYNOPSIS
.nf
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ALTSVC, char *filename);
.fi
.SH EXPERIMENTAL
Warning: this feature is early code and is marked as experimental. It can only
be enabled by explicitly telling configure with \fB--enable-alt-svc\fP. You are
advised to not ship this in production before the experimental label is
removed.
.SH DESCRIPTION
Pass in a pointer to a \fIfilename\fP to instruct libcurl to use that file as
the Alt-Svc cache to read existing cache contents from and possibly also write
it back to a after a transfer, unless \fBCURLALTSVC_READONLYFILE\fP is set in
\fICURLOPT_ALTSVC_CTRL(3)\fP.

Specify a blank file name ("") to make libcurl not load from a file at all.
.SH DEFAULT
NULL. The alt-svc cache is not read nor written to file.
.SH PROTOCOLS
HTTPS
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
Changes to jni/curl/docs/libcurl/opts/CURLOPT_ALTSVC_CTRL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ALTSVC_CTRL 3 "April 03, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_ALTSVC_CTRL \- control alt-svc behavior
.SH SYNOPSIS
.nf
#include <curl/curl.h>

#define CURLALTSVC_IMMEDIATELY  (1<<0)
#define CURLALTSVC_ALTUSED      (1<<1)
#define CURLALTSVC_READONLYFILE (1<<2)
#define CURLALTSVC_H1           (1<<3)
#define CURLALTSVC_H2           (1<<4)
#define CURLALTSVC_H3           (1<<5)

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ALTSVC_CTRL, long bitmask);
.fi







|








<







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

32
33
34
35
36
37
38
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ALTSVC_CTRL 3 "August 13, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_ALTSVC_CTRL \- control alt-svc behavior
.SH SYNOPSIS
.nf
#include <curl/curl.h>

#define CURLALTSVC_IMMEDIATELY  (1<<0)

#define CURLALTSVC_READONLYFILE (1<<2)
#define CURLALTSVC_H1           (1<<3)
#define CURLALTSVC_H2           (1<<4)
#define CURLALTSVC_H3           (1<<5)

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ALTSVC_CTRL, long bitmask);
.fi
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
HTTPS. It will also only complete a request to an alternative origin if that
origin is properly hosted over HTTPS. These requirements are there to make
sure both the source and the destination are legitimate.

Setting any bit will enable the alt-svc engine.
.IP "CURLALTSVC_IMMEDIATELY"
If an Alt-Svc: header is received, this instructs libcurl to switch to one of
those alternatives asap rather than to save it and use for the next request.
.IP "CURLALTSVC_ALTUSED"
Issue the Alt-Used: header in all requests that have been redirected by
alt-svc.
.IP "CURLALTSVC_READONLYFILE"
Do not write the alt-svc cache back to the file specified with
\fICURLOPT_ALTSVC(3)\fP even if it gets updated. By default a file specified
with that option will be read and written to as deemed necessary.
.IP "CURLALTSVC_H1"
Accept alternative services offered over HTTP/1.1.
.IP "CURLALTSVC_H2"







|
<
|
<







49
50
51
52
53
54
55
56

57

58
59
60
61
62
63
64
HTTPS. It will also only complete a request to an alternative origin if that
origin is properly hosted over HTTPS. These requirements are there to make
sure both the source and the destination are legitimate.

Setting any bit will enable the alt-svc engine.
.IP "CURLALTSVC_IMMEDIATELY"
If an Alt-Svc: header is received, this instructs libcurl to switch to one of
those alternatives asap rather than to save it and use for the next

request. (Not currently supported).

.IP "CURLALTSVC_READONLYFILE"
Do not write the alt-svc cache back to the file specified with
\fICURLOPT_ALTSVC(3)\fP even if it gets updated. By default a file specified
with that option will be read and written to as deemed necessary.
.IP "CURLALTSVC_H1"
Accept alternative services offered over HTTP/1.1.
.IP "CURLALTSVC_H2"
Changes to jni/curl/docs/libcurl/opts/CURLOPT_APPEND.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_APPEND \- enable appending to the remote file
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_APPEND, long append);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_APPEND 3 "March 06, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_APPEND \- enable appending to the remote file
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_APPEND, long append);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_AUTOREFERER.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_AUTOREFERER \- automatically update the referer header
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_AUTOREFERER, long autorefer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_AUTOREFERER 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_AUTOREFERER \- automatically update the referer header
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_AUTOREFERER, long autorefer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_BUFFERSIZE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_BUFFERSIZE \- set preferred receive buffer size
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_BUFFERSIZE, long size);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_BUFFERSIZE 3 "May 13, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_BUFFERSIZE \- set preferred receive buffer size
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_BUFFERSIZE, long size);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CAINFO.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CAINFO 3 "June 10, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAINFO, char *path);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CAINFO 3 "June 10, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CAINFO \- path to Certificate Authority (CA) bundle
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAINFO, char *path);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CAPATH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CAPATH 3 "September 10, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CAPATH \- specify directory holding CA certificates
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAPATH, char *capath);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CAPATH 3 "September 10, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CAPATH \- specify directory holding CA certificates
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CAPATH, char *capath);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CERTINFO.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CERTINFO 3 "January 29, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CERTINFO \- request SSL certificate information
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CERTINFO, long certinfo);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CERTINFO 3 "January 29, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CERTINFO \- request SSL certificate information
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CERTINFO, long certinfo);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CHUNK_BGN_FUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 03, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CHUNK_BGN_FUNCTION 3 "May 03, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CHUNK_BGN_FUNCTION \- callback before a transfer with FTP wildcardmatch
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_CHUNK_DATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CHUNK_DATA 3 "November 07, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_DATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CHUNK_DATA 3 "November 07, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CHUNK_DATA \- custom pointer to the FTP chunk callbacks
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CHUNK_DATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CHUNK_END_FUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CHUNK_END_FUNCTION \- callback after a transfer with FTP wildcardmatch
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CHUNK_END_FUNCTION 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CHUNK_END_FUNCTION \- callback after a transfer with FTP wildcardmatch
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_CLOSESOCKETDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CLOSESOCKETDATA 3 "November 07, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CLOSESOCKETDATA \- pointer passed to the socket close callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CLOSESOCKETDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CLOSESOCKETDATA 3 "November 07, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CLOSESOCKETDATA \- pointer passed to the socket close callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CLOSESOCKETDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CLOSESOCKETFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CLOSESOCKETFUNCTION 3 "November 07, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CLOSESOCKETFUNCTION \- callback to socket close replacement function
.SH SYNOPSIS
#include <curl/curl.h>

int closesocket_callback(void *clientp, curl_socket_t item);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CLOSESOCKETFUNCTION 3 "November 07, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CLOSESOCKETFUNCTION \- callback to socket close replacement function
.SH SYNOPSIS
#include <curl/curl.h>

int closesocket_callback(void *clientp, curl_socket_t item);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONNECTTIMEOUT 3 "October 03, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT, long timeout);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONNECTTIMEOUT 3 "October 03, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONNECTTIMEOUT \- timeout for the connect phase
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT, long timeout);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CONNECTTIMEOUT_MS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONNECTTIMEOUT_MS 3 "September 23, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT_MS, long timeout);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONNECTTIMEOUT_MS 3 "September 23, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONNECTTIMEOUT_MS \- timeout for the connect phase
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECTTIMEOUT_MS, long timeout);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CONNECT_ONLY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONNECT_ONLY 3 "February 18, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONNECT_ONLY \- stop when connected to target server
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECT_ONLY, long only);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONNECT_ONLY 3 "February 18, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONNECT_ONLY \- stop when connected to target server
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONNECT_ONLY, long only);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CONNECT_TO.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONNECT_TO 3 "May 05, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONNECT_TO \- Connect to a specific host and port instead of the URL's host and port
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONNECT_TO 3 "May 05, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONNECT_TO \- Connect to a specific host and port instead of the URL's host and port
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_CONV_FROM_NETWORK_FUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONV_FROM_NETWORK_FUNCTION \- convert data from network to host encoding
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONV_FROM_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONV_FROM_NETWORK_FUNCTION \- convert data from network to host encoding
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_CONV_FROM_UTF8_FUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONV_FROM_UTF8_FUNCTION \- convert data from UTF8 to host encoding
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONV_FROM_UTF8_FUNCTION 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONV_FROM_UTF8_FUNCTION \- convert data from UTF8 to host encoding
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_CONV_TO_NETWORK_FUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONV_TO_NETWORK_FUNCTION \- convert data to network from host encoding
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CONV_TO_NETWORK_FUNCTION 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CONV_TO_NETWORK_FUNCTION \- convert data to network from host encoding
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_COOKIE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_COOKIE \- set contents of HTTP Cookie header
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIE, char *cookie);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COOKIE 3 "December 21, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_COOKIE \- set contents of HTTP Cookie header
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIE, char *cookie);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_COOKIEFILE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COOKIEFILE 3 "March 13, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_COOKIEFILE \- file name to read cookies from
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEFILE, char *filename);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COOKIEFILE 3 "March 13, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_COOKIEFILE \- file name to read cookies from
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEFILE, char *filename);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_COOKIEJAR.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COOKIEJAR 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_COOKIEJAR \- file name to store cookies to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEJAR, char *filename);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COOKIEJAR 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_COOKIEJAR \- file name to store cookies to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIEJAR, char *filename);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_COOKIELIST.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COOKIELIST 3 "April 26, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COOKIELIST 3 "April 26, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_COOKIELIST \- add to or manipulate cookies held in memory
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_COOKIESESSION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_COOKIESESSION \- start a new cookie session
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIESESSION, long init);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COOKIESESSION 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_COOKIESESSION \- start a new cookie session
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COOKIESESSION, long init);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_COPYPOSTFIELDS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COPYPOSTFIELDS, char *data);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_COPYPOSTFIELDS 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_COPYPOSTFIELDS \- have libcurl copy data to POST
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_COPYPOSTFIELDS, char *data);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CRLF.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CRLF \- enable/disable CRLF conversion
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLF, long conv);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CRLF 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CRLF \- enable/disable CRLF conversion
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLF, long conv);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CRLFILE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CRLFILE \- specify a Certificate Revocation List file
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLFILE, char *file);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CRLFILE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CRLFILE \- specify a Certificate Revocation List file
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CRLFILE, char *file);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CURLU.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CURLU 3 "January 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CURLU \- set URL with CURLU *
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CURLU, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CURLU 3 "January 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CURLU \- set URL with CURLU *
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CURLU, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_CUSTOMREQUEST.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CUSTOMREQUEST 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_CUSTOMREQUEST \- custom string for request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CUSTOMREQUEST, char *request);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_CUSTOMREQUEST 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_CUSTOMREQUEST \- custom string for request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CUSTOMREQUEST, char *request);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_DEBUGDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DEBUGDATA \- custom pointer for debug callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DEBUGDATA 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DEBUGDATA \- custom pointer for debug callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEBUGDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_DEBUGFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DEBUGFUNCTION \- debug callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DEBUGFUNCTION 3 "October 06, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DEBUGFUNCTION \- debug callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_DEFAULT_PROTOCOL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DEFAULT_PROTOCOL 3 "December 21, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DEFAULT_PROTOCOL \- default protocol to use if the URL is missing a
scheme name
.SH SYNOPSIS
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DEFAULT_PROTOCOL 3 "December 21, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DEFAULT_PROTOCOL \- default protocol to use if the URL is missing a
scheme name
.SH SYNOPSIS
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_DIRLISTONLY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DIRLISTONLY \- ask for names only in a directory listing
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DIRLISTONLY, long listonly);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DIRLISTONLY 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DIRLISTONLY \- ask for names only in a directory listing
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DIRLISTONLY, long listonly);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_DISALLOW_USERNAME_IN_URL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DISALLOW_USERNAME_IN_URL 3 "February 25, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DISALLOW_USERNAME_IN_URL \- disallow specifying username in the url
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DISALLOW_USERNAME_IN_URL, long disallow);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DISALLOW_USERNAME_IN_URL 3 "February 25, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DISALLOW_USERNAME_IN_URL \- disallow specifying username in the url
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DISALLOW_USERNAME_IN_URL, long disallow);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_DNS_CACHE_TIMEOUT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "December 09, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_CACHE_TIMEOUT, long age);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_CACHE_TIMEOUT 3 "December 09, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_CACHE_TIMEOUT \- set life-time for DNS cache entries
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_CACHE_TIMEOUT, long age);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_DNS_INTERFACE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_INTERFACE \- set interface to speak DNS over
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_INTERFACE, char *ifname);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_INTERFACE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_INTERFACE \- set interface to speak DNS over
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_INTERFACE, char *ifname);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP4.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_LOCAL_IP4 3 "December 10, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP4, char *address);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_LOCAL_IP4 3 "December 10, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_LOCAL_IP4 \- IPv4 address to bind DNS resolves to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP4, char *address);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_DNS_LOCAL_IP6.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP6, char *address);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_LOCAL_IP6 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_LOCAL_IP6 \- IPv6 address to bind DNS resolves to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_LOCAL_IP6, char *address);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_DNS_SERVERS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_SERVERS \- set preferred DNS servers
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_SERVERS, char *servers);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_SERVERS 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_SERVERS \- set preferred DNS servers
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_SERVERS, char *servers);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_DNS_SHUFFLE_ADDRESSES.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_SHUFFLE_ADDRESSES 3 "March 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_SHUFFLE_ADDRESSES \- Shuffle addresses when a hostname returns more than one
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_SHUFFLE_ADDRESSES 3 "March 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_SHUFFLE_ADDRESSES \- Shuffle addresses when a hostname returns more than one
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_DNS_USE_GLOBAL_CACHE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "March 07, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_USE_GLOBAL_CACHE,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DNS_USE_GLOBAL_CACHE 3 "March 07, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DNS_USE_GLOBAL_CACHE \- enable/disable global DNS cache
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DNS_USE_GLOBAL_CACHE,
Changes to jni/curl/docs/libcurl/opts/CURLOPT_DOH_URL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DOH_URL 3 "September 06, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_DOH_URL \- provide the DNS-over-HTTPS URL
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DOH_URL, char *URL);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_DOH_URL 3 "September 06, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_DOH_URL \- provide the DNS-over-HTTPS URL
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DOH_URL, char *URL);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_EGDSOCKET.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_EGDSOCKET 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_EGDSOCKET \- set EGD socket path
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_EGDSOCKET, char *path);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_EGDSOCKET 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_EGDSOCKET \- set EGD socket path
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_EGDSOCKET, char *path);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_ERRORBUFFER.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ERRORBUFFER 3 "March 13, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_ERRORBUFFER \- set error buffer for error messages
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ERRORBUFFER, char *buf);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ERRORBUFFER 3 "March 13, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_ERRORBUFFER \- set error buffer for error messages
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ERRORBUFFER, char *buf);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_EXPECT_100_TIMEOUT_MS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_EXPECT_100_TIMEOUT_MS 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_EXPECT_100_TIMEOUT_MS \- timeout for Expect: 100-continue response
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_FAILONERROR.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FAILONERROR 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FAILONERROR \- request failure on HTTP response >= 400
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FAILONERROR, long fail);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FAILONERROR 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FAILONERROR \- request failure on HTTP response >= 400
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FAILONERROR, long fail);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FILETIME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FILETIME \- get the modification time of the remote resource
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FILETIME, long gettime);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FILETIME 3 "April 03, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FILETIME \- get the modification time of the remote resource
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FILETIME, long gettime);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FNMATCH_DATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FNMATCH_DATA \- custom pointer to fnmatch callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FNMATCH_DATA 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FNMATCH_DATA \- custom pointer to fnmatch callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_FNMATCH_FUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FNMATCH_FUNCTION \- wildcard matching function callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FNMATCH_FUNCTION 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FNMATCH_FUNCTION \- wildcard matching function callback
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_FOLLOWLOCATION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FOLLOWLOCATION 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FOLLOWLOCATION, long enable);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FOLLOWLOCATION 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FOLLOWLOCATION \- follow HTTP 3xx redirects
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FOLLOWLOCATION, long enable);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FORBID_REUSE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FORBID_REUSE \- make connection get closed at once after use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FORBID_REUSE, long close);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FORBID_REUSE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FORBID_REUSE \- make connection get closed at once after use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FORBID_REUSE, long close);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FRESH_CONNECT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FRESH_CONNECT \- force a new connection to be used
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FRESH_CONNECT, long fresh);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FRESH_CONNECT 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FRESH_CONNECT \- force a new connection to be used
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FRESH_CONNECT, long fresh);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTPPORT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTPPORT 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTPPORT \- make FTP transfer active
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPPORT, char *spec);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTPPORT 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTPPORT \- make FTP transfer active
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPPORT, char *spec);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTPSSLAUTH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTPSSLAUTH \- set order in which to attempt TLS vs SSL when using FTP
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPSSLAUTH, long order);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTPSSLAUTH 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTPSSLAUTH \- set order in which to attempt TLS vs SSL when using FTP
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTPSSLAUTH, long order);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTP_ACCOUNT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_ACCOUNT 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_ACCOUNT \- set account info for FTP
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ACCOUNT, char *account);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_ACCOUNT 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_ACCOUNT \- set account info for FTP
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_ACCOUNT, char *account);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTP_ALTERNATIVE_TO_USER.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_ALTERNATIVE_TO_USER \- command to use instead of USER with FTP
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_ALTERNATIVE_TO_USER 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_ALTERNATIVE_TO_USER \- command to use instead of USER with FTP
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTP_CREATE_MISSING_DIRS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_CREATE_MISSING_DIRS \- create missing dirs for FTP and SFTP
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_CREATE_MISSING_DIRS 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_CREATE_MISSING_DIRS \- create missing dirs for FTP and SFTP
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTP_FILEMETHOD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_FILEMETHOD \- select directory traversing method for FTP
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_FILEMETHOD 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_FILEMETHOD \- select directory traversing method for FTP
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTP_RESPONSE_TIMEOUT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_RESPONSE_TIMEOUT \- time allowed to wait for FTP response
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_RESPONSE_TIMEOUT, long timeout);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_RESPONSE_TIMEOUT 3 "October 03, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_RESPONSE_TIMEOUT \- time allowed to wait for FTP response
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_RESPONSE_TIMEOUT, long timeout);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTP_SKIP_PASV_IP.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_SKIP_PASV_IP \- ignore the IP address in the PASV response
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_SKIP_PASV_IP, long skip);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_SKIP_PASV_IP 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_SKIP_PASV_IP \- ignore the IP address in the PASV response
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_SKIP_PASV_IP, long skip);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTP_SSL_CCC.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_SSL_CCC \- switch off SSL again with FTP after auth
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_SSL_CCC,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_SSL_CCC 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_SSL_CCC \- switch off SSL again with FTP after auth
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_SSL_CCC,
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTP_USE_EPRT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_USE_EPRT 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_USE_EPRT \- enable/disable use of EPRT with FTP
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_EPRT, long enabled);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_USE_EPRT 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_USE_EPRT \- enable/disable use of EPRT with FTP
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_EPRT, long enabled);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTP_USE_EPSV.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_USE_EPSV \- enable/disable use of EPSV
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_EPSV, long epsv);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_USE_EPSV 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_USE_EPSV \- enable/disable use of EPSV
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_EPSV, long epsv);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_FTP_USE_PRET.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_USE_PRET \- enable the PRET command
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_PRET, long enable);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_FTP_USE_PRET 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_FTP_USE_PRET \- enable the PRET command
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_FTP_USE_PRET, long enable);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_GSSAPI_DELEGATION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_GSSAPI_DELEGATION, long level);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_GSSAPI_DELEGATION 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_GSSAPI_DELEGATION \- set allowed GSS-API delegation
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_GSSAPI_DELEGATION, long level);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "February 21, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS \- head start for ipv6 for happy eyeballs
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, long timeout);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS 3 "February 21, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS \- head start for ipv6 for happy eyeballs
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, long timeout);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HAPROXYPROTOCOL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HAPROXYPROTOCOL 3 "May 18, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HAPROXYPROTOCOL \- send HAProxy PROXY protocol v1 header
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HAPROXYPROTOCOL,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HAPROXYPROTOCOL 3 "May 18, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HAPROXYPROTOCOL \- send HAProxy PROXY protocol v1 header
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HAPROXYPROTOCOL,
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HEADER.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HEADER 3 "October 03, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HEADER \- pass headers to the data stream
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADER, long onoff);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HEADER 3 "October 03, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HEADER \- pass headers to the data stream
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADER, long onoff);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HEADERDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HEADERDATA \- pointer to pass to header callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADERDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HEADERDATA 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HEADERDATA \- pointer to pass to header callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADERDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HEADERFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HEADERFUNCTION 3 "November 22, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HEADERFUNCTION \- callback that receives header data
.SH SYNOPSIS
#include <curl/curl.h>

size_t header_callback(char *buffer,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HEADERFUNCTION 3 "August 27, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HEADERFUNCTION \- callback that receives header data
.SH SYNOPSIS
#include <curl/curl.h>

size_t header_callback(char *buffer,
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69



70
71
72
73
74
75
76

This callback function must return the number of bytes actually taken care of.
If that amount differs from the amount passed in to your function, it'll signal
an error to the library. This will cause the transfer to get aborted and the
libcurl function in progress will return \fICURLE_WRITE_ERROR\fP.

A complete HTTP header that is passed to this function can be up to
\fICURL_MAX_HTTP_HEADER\fP (100K) bytes.

If this option is not set, or if it is set to NULL, but
\fICURLOPT_HEADERDATA(3)\fP is set to anything but NULL, the function used to
accept response data will be used instead. That is, it will be the function
specified with \fICURLOPT_WRITEFUNCTION(3)\fP, or if it is not specified or
NULL - the default, stream-writing function.

It's important to note that the callback will be invoked for the headers of
all responses received after initiating a request and not just the final
response. This includes all responses which occur during authentication
negotiation. If you need to operate on only the headers from the final
response, you will need to collect headers in the callback yourself and use
HTTP status lines, for example, to delimit response boundaries.




When a server sends a chunked encoded transfer, it may contain a trailer. That
trailer is identical to an HTTP header and if such a trailer is received it is
passed to the application using this callback as well. There are several ways
to detect it being a trailer and not an ordinary header: 1) it comes after the
response-body. 2) it comes after the final header line (CR LF) 3) a Trailer:
header among the regular response-headers mention what header(s) to expect in







|













>
>
>







49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

This callback function must return the number of bytes actually taken care of.
If that amount differs from the amount passed in to your function, it'll signal
an error to the library. This will cause the transfer to get aborted and the
libcurl function in progress will return \fICURLE_WRITE_ERROR\fP.

A complete HTTP header that is passed to this function can be up to
\fICURL_MAX_HTTP_HEADER\fP (100K) bytes and includes the final line terminator.

If this option is not set, or if it is set to NULL, but
\fICURLOPT_HEADERDATA(3)\fP is set to anything but NULL, the function used to
accept response data will be used instead. That is, it will be the function
specified with \fICURLOPT_WRITEFUNCTION(3)\fP, or if it is not specified or
NULL - the default, stream-writing function.

It's important to note that the callback will be invoked for the headers of
all responses received after initiating a request and not just the final
response. This includes all responses which occur during authentication
negotiation. If you need to operate on only the headers from the final
response, you will need to collect headers in the callback yourself and use
HTTP status lines, for example, to delimit response boundaries.

For an HTTP transfer, the status line and the blank line preceding the response
body are both included as headers and passed to this function.

When a server sends a chunked encoded transfer, it may contain a trailer. That
trailer is identical to an HTTP header and if such a trailer is received it is
passed to the application using this callback as well. There are several ways
to detect it being a trailer and not an ordinary header: 1) it comes after the
response-body. 2) it comes after the final header line (CR LF) 3) a Trailer:
header among the regular response-headers mention what header(s) to expect in
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HEADEROPT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HEADEROPT 3 "July 03, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HEADEROPT \- set how to send HTTP headers
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADEROPT, long bitmask);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HEADEROPT 3 "July 03, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HEADEROPT \- set how to send HTTP headers
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HEADEROPT, long bitmask);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HTTP09_ALLOWED.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTP09_ALLOWED 3 "December 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTP09 \- allow HTTP/0.9 response
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP09_ALLOWED, long allowed);
.SH DESCRIPTION
Pass the long argument \fIallowed\fP set to 1L to allow HTTP/0.9 responses.

A HTTP/0.9 response is a server response entirely without headers and only a
body, while you can connect to lots of random TCP services and still get a
response that curl might consider to be HTTP/0.9.
.SH DEFAULT
curl allows HTTP/0.9 responses by default.

A future curl version will require this option to be set to allow HTTP/0.9
responses.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
if(curl) {







|














|











|
|

|

|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTP09_ALLOWED 3 "August 05, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTP09 \- allow HTTP/0.9 response
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP09_ALLOWED, long allowed);
.SH DESCRIPTION
Pass the long argument \fIallowed\fP set to 1L to allow HTTP/0.9 responses.

A HTTP/0.9 response is a server response entirely without headers and only a
body. You can connect to lots of random TCP services and still get a response
that curl might consider to be HTTP/0.9!
.SH DEFAULT
curl allowed HTTP/0.9 responses by default before 7.66.0

Since 7.66.0, libcurl requires this option set to 1L to allow HTTP/0.9
responses.
.SH PROTOCOLS
HTTP
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
if(curl) {
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HTTP200ALIASES.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTP200ALIASES 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTP200ALIASES \- specify alternative matches for HTTP 200 OK
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_HTTPAUTH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTPAUTH 3 "June 15, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTPAUTH \- set HTTP server authentication methods to try
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTPAUTH 3 "June 15, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTPAUTH \- set HTTP server authentication methods to try
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_HTTPGET.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTPGET 3 "May 21, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTPGET \- ask for an HTTP GET request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPGET, long useget);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTPGET 3 "May 21, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTPGET \- ask for an HTTP GET request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPGET, long useget);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HTTPHEADER.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTPHEADER 3 "December 30, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTPHEADER \- set custom HTTP headers
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPHEADER, struct curl_slist *headers);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTPHEADER 3 "December 30, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTPHEADER \- set custom HTTP headers
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPHEADER, struct curl_slist *headers);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HTTPPOST.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTPPOST \- specify the multipart formpost content
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTPPOST 3 "September 02, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTPPOST \- specify the multipart formpost content
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_HTTPPROXYTUNNEL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTPPROXYTUNNEL 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPPROXYTUNNEL, long tunnel);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTPPROXYTUNNEL 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTPPROXYTUNNEL \- tunnel through HTTP proxy
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTPPROXYTUNNEL, long tunnel);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_HTTP_CONTENT_DECODING.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTP_CONTENT_DECODING \- enable/disable HTTP content decoding
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTP_CONTENT_DECODING 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTP_CONTENT_DECODING \- enable/disable HTTP content decoding
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_HTTP_TRANSFER_DECODING.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTP_TRANSFER_DECODING \- enable/disable HTTP transfer decoding
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTP_TRANSFER_DECODING 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTP_TRANSFER_DECODING \- enable/disable HTTP transfer decoding
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_HTTP_VERSION.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTP_VERSION 3 "June 25, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_VERSION, long version);







|














|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_HTTP_VERSION 3 "August 09, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_HTTP_VERSION \- specify HTTP protocol version to use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_HTTP_VERSION, long version);
54
55
56
57
58
59
60








61
62
63
64
65
66
67
HTTP 2 can't be negotiated with the HTTPS server. For clear text HTTP servers,
libcurl will use 1.1. (Added in 7.47.0)
.IP CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE
Issue non-TLS HTTP requests using HTTP/2 without HTTP/1.1 Upgrade. It requires
prior knowledge that the server supports HTTP/2 straight away. HTTPS requests
will still do HTTP/2 the standard way with negotiated protocol version in the
TLS handshake. (Added in 7.49.0)








.SH DEFAULT
Since curl 7.62.0: CURL_HTTP_VERSION_2TLS

Before that: CURL_HTTP_VERSION_1_1
.SH PROTOCOLS
HTTP
.SH EXAMPLE







>
>
>
>
>
>
>
>







54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
HTTP 2 can't be negotiated with the HTTPS server. For clear text HTTP servers,
libcurl will use 1.1. (Added in 7.47.0)
.IP CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE
Issue non-TLS HTTP requests using HTTP/2 without HTTP/1.1 Upgrade. It requires
prior knowledge that the server supports HTTP/2 straight away. HTTPS requests
will still do HTTP/2 the standard way with negotiated protocol version in the
TLS handshake. (Added in 7.49.0)
.IP CURL_HTTP_VERSION_3
(Added in 7.66.0) Setting this value will make libcurl attempt to use HTTP/3
directly to server given in the URL. Note that this cannot gracefully
downgrade to earlier HTTP version if the server doesn't support HTTP/3.

For more reliably upgrading to HTTP/3, set the prefered version to something
lower and let the server announce its HTTP/3 support via Alt-Svc:. See
\fICURLOPT_ALTSVC(3)\fP.
.SH DEFAULT
Since curl 7.62.0: CURL_HTTP_VERSION_2TLS

Before that: CURL_HTTP_VERSION_1_1
.SH PROTOCOLS
HTTP
.SH EXAMPLE
79
80
81
82
83
84
85
86
.fi
.SH AVAILABILITY
Along with HTTP
.SH RETURN VALUE
Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR CURLOPT_SSLVERSION "(3), " CURLOPT_HTTP200ALIASES "(3), "
.BR CURLOPT_HTTP09_ALLOWED "(3), "







|
87
88
89
90
91
92
93
94
.fi
.SH AVAILABILITY
Along with HTTP
.SH RETURN VALUE
Returns CURLE_OK if HTTP is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR CURLOPT_SSLVERSION "(3), " CURLOPT_HTTP200ALIASES "(3), "
.BR CURLOPT_HTTP09_ALLOWED "(3), " CURLOPT_ALTSVC "(3) "
Changes to jni/curl/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_INFILESIZE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_INFILESIZE \- set size of the input file to send off
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INFILESIZE, long filesize);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_INFILESIZE 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_INFILESIZE \- set size of the input file to send off
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INFILESIZE, long filesize);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_INFILESIZE_LARGE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_INFILESIZE_LARGE 3 "September 23, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_INFILESIZE_LARGE \- set size of the input file to send off
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_INFILESIZE_LARGE 3 "September 23, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_INFILESIZE_LARGE \- set size of the input file to send off
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_INTERFACE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_INTERFACE 3 "June 18, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_INTERFACE \- source interface for outgoing traffic
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERFACE, char *interface);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_INTERFACE 3 "June 18, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_INTERFACE \- source interface for outgoing traffic
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERFACE, char *interface);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_INTERLEAVEDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_INTERLEAVEDATA \- custom pointer passed to RTSP interleave callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERLEAVEDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_INTERLEAVEDATA 3 "September 15, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_INTERLEAVEDATA \- custom pointer passed to RTSP interleave callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_INTERLEAVEDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_INTERLEAVEFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_INTERLEAVEFUNCTION 3 "August 11, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_INTERLEAVEFUNCTION \- callback function for RTSP interleaved data
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_INTERLEAVEFUNCTION 3 "August 11, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_INTERLEAVEFUNCTION \- callback function for RTSP interleaved data
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_IOCTLDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_IOCTLDATA \- custom pointer passed to I/O callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IOCTLDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_IOCTLDATA 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_IOCTLDATA \- custom pointer passed to I/O callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IOCTLDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_IOCTLFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_IOCTLFUNCTION 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_IOCTLFUNCTION \- callback for I/O operations
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_IOCTLFUNCTION 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_IOCTLFUNCTION \- callback for I/O operations
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_IPRESOLVE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_IPRESOLVE \- specify which IP protocol version to use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IPRESOLVE, long resolve);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_IPRESOLVE 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_IPRESOLVE \- specify which IP protocol version to use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IPRESOLVE, long resolve);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_ISSUERCERT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ISSUERCERT 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_ISSUERCERT \- issuer SSL certificate filename
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ISSUERCERT, char *file);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_ISSUERCERT 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_ISSUERCERT \- issuer SSL certificate filename
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_ISSUERCERT, char *file);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_KEEP_SENDING_ON_ERROR.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_KEEP_SENDING_ON_ERROR \- keep sending on early HTTP response >= 300
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KEEP_SENDING_ON_ERROR,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_KEEP_SENDING_ON_ERROR 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_KEEP_SENDING_ON_ERROR \- keep sending on early HTTP response >= 300
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KEEP_SENDING_ON_ERROR,
Changes to jni/curl/docs/libcurl/opts/CURLOPT_KEYPASSWD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_KEYPASSWD 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_KEYPASSWD \- set passphrase to private key
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KEYPASSWD, char *pwd);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_KEYPASSWD 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_KEYPASSWD \- set passphrase to private key
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KEYPASSWD, char *pwd);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_KRBLEVEL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_KRBLEVEL \- set FTP kerberos security level
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KRBLEVEL, char *level);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_KRBLEVEL 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_KRBLEVEL \- set FTP kerberos security level
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_KRBLEVEL, char *level);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_LOCALPORT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_LOCALPORT 3 "January 31, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_LOCALPORT \- set local port number to use for socket
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOCALPORT, long port);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_LOCALPORT 3 "January 31, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_LOCALPORT \- set local port number to use for socket
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOCALPORT, long port);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_LOCALPORTRANGE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_LOCALPORTRANGE 3 "January 31, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_LOCALPORTRANGE \- number of additional local ports to try
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOCALPORTRANGE,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_LOCALPORTRANGE 3 "January 31, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_LOCALPORTRANGE \- number of additional local ports to try
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOCALPORTRANGE,
Changes to jni/curl/docs/libcurl/opts/CURLOPT_LOGIN_OPTIONS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_LOGIN_OPTIONS 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_LOGIN_OPTIONS \- set login options
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOGIN_OPTIONS, char *options);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_LOGIN_OPTIONS 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_LOGIN_OPTIONS \- set login options
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOGIN_OPTIONS, char *options);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_LOW_SPEED_LIMIT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_LOW_SPEED_LIMIT \- set low speed limit in bytes per second
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOW_SPEED_LIMIT, long speedlimit);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_LOW_SPEED_LIMIT 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_LOW_SPEED_LIMIT \- set low speed limit in bytes per second
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOW_SPEED_LIMIT, long speedlimit);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_LOW_SPEED_TIME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_LOW_SPEED_TIME \- set low speed limit time period
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOW_SPEED_TIME, long speedtime);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_LOW_SPEED_TIME 3 "May 06, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_LOW_SPEED_TIME \- set low speed limit time period
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_LOW_SPEED_TIME, long speedtime);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_MAIL_AUTH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAIL_AUTH 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAIL_AUTH \- SMTP authentication address
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_AUTH, char *auth);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAIL_AUTH 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAIL_AUTH \- SMTP authentication address
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_AUTH, char *auth);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_MAIL_FROM.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAIL_FROM 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAIL_FROM \- SMTP sender address
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_FROM, char *from);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAIL_FROM 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAIL_FROM \- SMTP sender address
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAIL_FROM, char *from);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_MAIL_RCPT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAIL_RCPT 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAIL_RCPT \- list of SMTP mail recipients
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAIL_RCPT 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAIL_RCPT \- list of SMTP mail recipients
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_MAXAGE_CONN.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAXAGE_CONN 3 "April 14, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAXAGE_CONN \- max idle time allowed for reusing a connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXAGE_CONN, long maxage);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAXAGE_CONN 3 "April 14, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAXAGE_CONN \- max idle time allowed for reusing a connection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXAGE_CONN, long maxage);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_MAXCONNECTS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAXCONNECTS \- maximum connection cache size
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXCONNECTS, long amount);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAXCONNECTS 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAXCONNECTS \- maximum connection cache size
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXCONNECTS, long amount);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_MAXFILESIZE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAXFILESIZE \- maximum file size allowed to download
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXFILESIZE, long size);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAXFILESIZE 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAXFILESIZE \- maximum file size allowed to download
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXFILESIZE, long size);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_MAXFILESIZE_LARGE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAXFILESIZE_LARGE \- maximum file size allowed to download
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAXFILESIZE_LARGE 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAXFILESIZE_LARGE \- maximum file size allowed to download
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_MAXREDIRS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAXREDIRS \- maximum number of redirects allowed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXREDIRS, long amount);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAXREDIRS 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAXREDIRS \- maximum number of redirects allowed
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MAXREDIRS, long amount);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_MAX_RECV_SPEED_LARGE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAX_RECV_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAX_RECV_SPEED_LARGE \- rate limit data download speed
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_MAX_SEND_SPEED_LARGE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MAX_SEND_SPEED_LARGE 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MAX_SEND_SPEED_LARGE \- rate limit data upload speed
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_MIMEPOST.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_MIMEPOST \- set post/send data from mime structure
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_MIMEPOST 3 "September 04, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_MIMEPOST \- set post/send data from mime structure
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_NETRC.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NETRC 3 "November 03, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_NETRC \- request that .netrc is used
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC, long level);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NETRC 3 "November 03, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_NETRC \- request that .netrc is used
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC, long level);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_NETRC_FILE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NETRC_FILE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_NETRC_FILE \- file name to read .netrc info from
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC_FILE, char *file);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NETRC_FILE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_NETRC_FILE \- file name to read .netrc info from
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NETRC_FILE, char *file);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_NEW_DIRECTORY_PERMS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_NEW_DIRECTORY_PERMS \- permissions for remotely created directories
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NEW_DIRECTORY_PERMS 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_NEW_DIRECTORY_PERMS \- permissions for remotely created directories
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_NEW_FILE_PERMS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_NEW_FILE_PERMS \- permissions for remotely created files
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NEW_FILE_PERMS 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_NEW_FILE_PERMS \- permissions for remotely created files
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_NOBODY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_NOBODY \- do the download request without getting the body
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOBODY, long opt);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NOBODY 3 "June 21, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_NOBODY \- do the download request without getting the body
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOBODY, long opt);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_NOPROGRESS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NOPROGRESS 3 "October 09, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_NOPROGRESS \- switch off the progress meter
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROGRESS, long onoff);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NOPROGRESS 3 "October 09, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_NOPROGRESS \- switch off the progress meter
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROGRESS, long onoff);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_NOPROXY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NOPROXY 3 "August 24, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_NOPROXY \- disable proxy use for specific hosts
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROXY, char *noproxy);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NOPROXY 3 "August 24, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_NOPROXY \- disable proxy use for specific hosts
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOPROXY, char *noproxy);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_NOSIGNAL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_NOSIGNAL \- skip all signal handling
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOSIGNAL, long onoff);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_NOSIGNAL 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_NOSIGNAL \- skip all signal handling
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_NOSIGNAL, long onoff);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_OPENSOCKETDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_OPENSOCKETDATA \- custom pointer passed to open socket callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_OPENSOCKETDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_OPENSOCKETDATA 3 "May 15, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_OPENSOCKETDATA \- custom pointer passed to open socket callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_OPENSOCKETDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_OPENSOCKETFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_OPENSOCKETFUNCTION 3 "May 15, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_OPENSOCKETFUNCTION 3 "May 15, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_OPENSOCKETFUNCTION \- set callback for opening sockets
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_PASSWORD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PASSWORD 3 "September 23, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PASSWORD \- password to use in authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PASSWORD, char *pwd);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PASSWORD 3 "September 23, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PASSWORD \- password to use in authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PASSWORD, char *pwd);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PATH_AS_IS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PATH_AS_IS 3 "September 23, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PATH_AS_IS \- do not handle dot dot sequences
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PATH_AS_IS, long leaveit);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PATH_AS_IS 3 "September 23, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PATH_AS_IS \- do not handle dot dot sequences
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PATH_AS_IS, long leaveit);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PINNEDPUBLICKEY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PINNEDPUBLICKEY 3 "June 02, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PINNEDPUBLICKEY \- set pinned public key
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PINNEDPUBLICKEY, char *pinnedpubkey);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PINNEDPUBLICKEY 3 "June 02, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PINNEDPUBLICKEY \- set pinned public key
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PINNEDPUBLICKEY, char *pinnedpubkey);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PIPEWAIT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PIPEWAIT \- wait for pipelining/multiplexing
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PIPEWAIT, long wait);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PIPEWAIT 3 "May 01, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PIPEWAIT \- wait for pipelining/multiplexing
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PIPEWAIT, long wait);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PORT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PORT \- set remote port number to work with
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PORT, long number);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PORT 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PORT \- set remote port number to work with
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PORT, long number);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_POST.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POST 3 "May 21, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_POST \- request an HTTP POST
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POST, long post);







|














|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POST 3 "July 22, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_POST \- request an HTTP POST
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POST, long post);
52
53
54
55
56
57
58
59

60
61
62
63
64
65
66
Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual.

If you use POST to an HTTP 1.1 server, you can send data without knowing the
size before starting the POST if you use chunked encoding. You enable this by
adding a header like "Transfer-Encoding: chunked" with
\fICURLOPT_HTTPHEADER(3)\fP. With HTTP 1.0 or without chunked transfer, you
must specify the size in the request.


When setting \fICURLOPT_POST(3)\fP to 1, libcurl will automatically set
\fICURLOPT_NOBODY(3)\fP and \fICURLOPT_HTTPGET(3)\fP to 0.

If you issue a POST request and then want to make a HEAD or GET using the same
re-used handle, you must explicitly set the new request type using
\fICURLOPT_NOBODY(3)\fP or \fICURLOPT_HTTPGET(3)\fP or similar.







|
>







52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Using POST with HTTP 1.1 implies the use of a "Expect: 100-continue" header.
You can disable this header with \fICURLOPT_HTTPHEADER(3)\fP as usual.

If you use POST to an HTTP 1.1 server, you can send data without knowing the
size before starting the POST if you use chunked encoding. You enable this by
adding a header like "Transfer-Encoding: chunked" with
\fICURLOPT_HTTPHEADER(3)\fP. With HTTP 1.0 or without chunked transfer, you
must specify the size in the request. (Since 7.66.0, libcurl will
automatically use chunked encoding for POSTs if the size is unknown.)

When setting \fICURLOPT_POST(3)\fP to 1, libcurl will automatically set
\fICURLOPT_NOBODY(3)\fP and \fICURLOPT_HTTPGET(3)\fP to 0.

If you issue a POST request and then want to make a HEAD or GET using the same
re-used handle, you must explicitly set the new request type using
\fICURLOPT_NOBODY(3)\fP or \fICURLOPT_HTTPGET(3)\fP or similar.
Changes to jni/curl/docs/libcurl/opts/CURLOPT_POSTFIELDS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POSTFIELDS 3 "May 21, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_POSTFIELDS \- specify data to POST to server
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDS, char *postdata);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POSTFIELDS 3 "May 21, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_POSTFIELDS \- specify data to POST to server
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDS, char *postdata);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_POSTFIELDSIZE \- size of POST data pointed to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDSIZE, long size);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POSTFIELDSIZE 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_POSTFIELDSIZE \- size of POST data pointed to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTFIELDSIZE, long size);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_POSTFIELDSIZE_LARGE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POSTFIELDSIZE_LARGE 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_POSTFIELDSIZE_LARGE \- size of POST data pointed to
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_POSTQUOTE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POSTQUOTE 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTQUOTE, struct curl_slist *cmds);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POSTQUOTE 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_POSTQUOTE \- (S)FTP commands to run after the transfer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_POSTQUOTE, struct curl_slist *cmds);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_POSTREDIR.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POSTREDIR 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_POSTREDIR \- how to act on an HTTP POST redirect
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_POSTREDIR 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_POSTREDIR \- how to act on an HTTP POST redirect
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_PREQUOTE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PREQUOTE 3 "June 18, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PREQUOTE \- commands to run before an FTP transfer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PREQUOTE,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PREQUOTE 3 "June 18, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PREQUOTE \- commands to run before an FTP transfer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PREQUOTE,
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PRE_PROXY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PRE_PROXY 3 "September 23, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PRE_PROXY \- set pre-proxy to use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PRE_PROXY, char *preproxy);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PRE_PROXY 3 "September 23, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PRE_PROXY \- set pre-proxy to use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PRE_PROXY, char *preproxy);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PRIVATE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PRIVATE 3 "December 08, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PRIVATE \- store a private pointer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PRIVATE, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PRIVATE 3 "December 08, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PRIVATE \- store a private pointer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PRIVATE, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROGRESSDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROGRESSDATA \- custom pointer passed to the progress callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROGRESSDATA 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROGRESSDATA \- custom pointer passed to the progress callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROGRESSDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROGRESSFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROGRESSFUNCTION 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROGRESSFUNCTION \- callback to progress meter function
.SH SYNOPSIS
#include <curl/curl.h>

int progress_callback(void *clientp,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROGRESSFUNCTION 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROGRESSFUNCTION \- callback to progress meter function
.SH SYNOPSIS
#include <curl/curl.h>

int progress_callback(void *clientp,
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROTOCOLS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROTOCOLS \- set allowed protocols
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROTOCOLS, long bitmask);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROTOCOLS 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROTOCOLS \- set allowed protocols
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROTOCOLS, long bitmask);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY 3 "August 24, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY \- set proxy to use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY, char *proxy);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY 3 "August 24, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY \- set proxy to use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY, char *proxy);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXYAUTH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYAUTH \- set HTTP proxy authentication methods to try
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYAUTH, long bitmask);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYAUTH 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYAUTH \- set HTTP proxy authentication methods to try
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYAUTH, long bitmask);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXYHEADER.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYHEADER \- custom HTTP headers to pass to proxy
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYHEADER 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYHEADER \- custom HTTP headers to pass to proxy
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXYPASSWORD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYPASSWORD 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPASSWORD, char *pwd);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYPASSWORD 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYPASSWORD \- password to use with proxy authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPASSWORD, char *pwd);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXYPORT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYPORT \- port number the proxy listens on
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPORT, long port);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYPORT 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYPORT \- port number the proxy listens on
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYPORT, long port);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXYTYPE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYTYPE \- proxy protocol type
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYTYPE, long type);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYTYPE 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYTYPE \- proxy protocol type
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYTYPE, long type);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXYUSERNAME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYUSERNAME 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYUSERNAME 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYUSERNAME \- user name to use for proxy authentication
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXYUSERPWD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYUSERPWD, char *userpwd);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXYUSERPWD 3 "May 30, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXYUSERPWD \- user name and password to use for proxy authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXYUSERPWD, char *userpwd);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_CAINFO.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_CAINFO 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_CAINFO \- path to proxy Certificate Authority (CA) bundle
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CAINFO, char *path);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_CAINFO 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_CAINFO \- path to proxy Certificate Authority (CA) bundle
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CAINFO, char *path);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_CAPATH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_CAPATH 3 "May 15, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CAPATH, char *capath);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_CAPATH 3 "May 15, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_CAPATH \- specify directory holding proxy CA certificates
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CAPATH, char *capath);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_CRLFILE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_CRLFILE 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_CRLFILE \- specify a proxy Certificate Revocation List file
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CRLFILE, char *file);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_CRLFILE 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_CRLFILE \- specify a proxy Certificate Revocation List file
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_CRLFILE, char *file);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_KEYPASSWD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_KEYPASSWD 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_KEYPASSWD \- set passphrase to proxy private key
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_KEYPASSWD, char *pwd);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_KEYPASSWD 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_KEYPASSWD \- set passphrase to proxy private key
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_KEYPASSWD, char *pwd);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_PINNEDPUBLICKEY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "May 15, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_PINNEDPUBLICKEY, char *pinnedpubkey);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_PINNEDPUBLICKEY 3 "May 15, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_PINNEDPUBLICKEY \- set pinned public key for https proxy
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_PINNEDPUBLICKEY, char *pinnedpubkey);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_SERVICE_NAME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SERVICE_NAME \- proxy authentication service name
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SERVICE_NAME, char *name);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SERVICE_NAME \- proxy authentication service name
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SERVICE_NAME, char *name);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_SSLCERT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSLCERT 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSLCERT \- set SSL proxy client certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLCERT, char *cert);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSLCERT 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSLCERT \- set SSL proxy client certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLCERT, char *cert);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_SSLCERTTYPE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSLCERTTYPE 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLCERTTYPE, char *type);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSLCERTTYPE 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSLCERTTYPE \- specify type of the proxy client SSL certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLCERTTYPE, char *type);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_SSLKEY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSLKEY 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client cert
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLKEY, char *keyfile);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSLKEY 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSLKEY \- specify private keyfile for TLS and SSL proxy client cert
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLKEY, char *keyfile);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_SSLKEYTYPE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSLKEYTYPE 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSLKEYTYPE \- set type of the proxy private key file
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLKEYTYPE, char *type);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSLKEYTYPE 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSLKEYTYPE \- set type of the proxy private key file
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLKEYTYPE, char *type);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_SSLVERSION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSLVERSION 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSLVERSION \- set preferred proxy TLS/SSL version
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLVERSION, long version);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSLVERSION 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSLVERSION \- set preferred proxy TLS/SSL version
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSLVERSION, long version);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_SSL_CIPHER_LIST.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_CIPHER_LIST, char *list);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSL_CIPHER_LIST \- specify ciphers to use for proxy TLS
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_CIPHER_LIST, char *list);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_SSL_OPTIONS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSL_OPTIONS 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_OPTIONS, long bitmask);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSL_OPTIONS 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSL_OPTIONS \- set proxy SSL behavior options
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_OPTIONS, long bitmask);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYHOST.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "May 02, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSL_VERIFYHOST \- verify the proxy certificate's name against host
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_VERIFYHOST, long verify);







|














|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSL_VERIFYHOST \- verify the proxy certificate's name against host
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_VERIFYHOST, long verify);
39
40
41
42
43
44
45
46
47







48
49
50
51
52
53
54
indicate that the server is the proxy to which you meant to connect to, or the
connection fails.

Curl considers the proxy the intended one when the Common Name field or a
Subject Alternate Name field in the certificate matches the host name in the
proxy string which you told curl to use.

When the \fIverify\fP value is 1L, \fIcurl_easy_setopt\fP will return an error
and the option value will not be changed due to old legacy reasons.








When the \fIverify\fP value is 0L, the connection succeeds regardless of the
names used in the certificate. Use that ability with caution!

See also \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP to verify the digital signature
of the proxy certificate.  If libcurl is built against NSS and
\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP is zero,







|
|
>
>
>
>
>
>
>







39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
indicate that the server is the proxy to which you meant to connect to, or the
connection fails.

Curl considers the proxy the intended one when the Common Name field or a
Subject Alternate Name field in the certificate matches the host name in the
proxy string which you told curl to use.

If \fIverify\fP value is set to 1:

In 7.28.0 and earlier: treated as a debug option of some sorts, not supported
anymore due to frequently leading to programmer mistakes.

From 7.28.1 to 7.65.3: setting it to 1 made curl_easy_setopt() return an error
and leaving the flag untouched.

From 7.66.0: treats 1 and 2 the same.

When the \fIverify\fP value is 0L, the connection succeeds regardless of the
names used in the certificate. Use that ability with caution!

See also \fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP to verify the digital signature
of the proxy certificate.  If libcurl is built against NSS and
\fICURLOPT_PROXY_SSL_VERIFYPEER(3)\fP is zero,
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_SSL_VERIFYPEER.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSL_VERIFYPEER \- verify the proxy's SSL certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_VERIFYPEER, long verify);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_SSL_VERIFYPEER 3 "December 16, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_SSL_VERIFYPEER \- verify the proxy's SSL certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_SSL_VERIFYPEER, long verify);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_TLS13_CIPHERS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_TLS13_CIPHERS 3 "May 27, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_TLS13_CIPHERS \- ciphers suites for proxy TLS 1.3
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLS13_CIPHERS, char *list);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_TLS13_CIPHERS 3 "May 27, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_TLS13_CIPHERS \- ciphers suites for proxy TLS 1.3
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLS13_CIPHERS, char *list);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_PASSWORD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_PASSWORD, char *pwd);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_TLSAUTH_PASSWORD \- password to use for proxy TLS authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_PASSWORD, char *pwd);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_TYPE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_TYPE, char *type);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_TLSAUTH_TYPE \- set proxy TLS authentication methods
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_TYPE, char *type);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_TLSAUTH_USERNAME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_USERNAME, char *user);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_TLSAUTH_USERNAME \- user name to use for proxy TLS authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TLSAUTH_USERNAME, char *user);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PROXY_TRANSFER_MODE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_TRANSFER_MODE 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_TRANSFER_MODE \- append FTP transfer mode to URL for proxy
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TRANSFER_MODE, long enabled);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PROXY_TRANSFER_MODE 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PROXY_TRANSFER_MODE \- append FTP transfer mode to URL for proxy
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PROXY_TRANSFER_MODE, long enabled);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_PUT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PUT 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_PUT \- make an HTTP PUT request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PUT, long put);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_PUT 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_PUT \- make an HTTP PUT request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_PUT, long put);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_QUOTE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_QUOTE 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_QUOTE \- (S)FTP commands to run before transfer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_QUOTE, struct curl_slist *cmds);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_QUOTE 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_QUOTE \- (S)FTP commands to run before transfer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_QUOTE, struct curl_slist *cmds);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_RANDOM_FILE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RANDOM_FILE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RANDOM_FILE \- specify a source for random data
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANDOM_FILE, char *path);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RANDOM_FILE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RANDOM_FILE \- specify a source for random data
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANDOM_FILE, char *path);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_RANGE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RANGE 3 "July 17, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RANGE \- set byte range to request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANGE, char *range);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RANGE 3 "July 17, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RANGE \- set byte range to request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RANGE, char *range);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_READDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_READDATA 3 "August 11, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_READDATA \- custom pointer passed to the read callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_READDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_READDATA 3 "August 11, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_READDATA \- custom pointer passed to the read callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_READDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_READFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_READFUNCTION 3 "May 15, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_READFUNCTION \- read callback for data uploads
.SH SYNOPSIS
#include <curl/curl.h>

size_t read_callback(char *buffer, size_t size, size_t nitems, void *userdata);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_READFUNCTION 3 "August 12, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_READFUNCTION \- read callback for data uploads
.SH SYNOPSIS
#include <curl/curl.h>

size_t read_callback(char *buffer, size_t size, size_t nitems, void *userdata);
66
67
68
69
70
71
72





73



74





















75
76
77
78
79
80
81
82
83
internal read function will be used. It is doing an fread() on the FILE *
userdata set with \fICURLOPT_READDATA(3)\fP.
.SH DEFAULT
The default internal read callback is fread().
.SH PROTOCOLS
This is used for all protocols when doing uploads.
.SH EXAMPLE





Here's an example setting a read callback for reading that to upload to an FTP



site: https://curl.haxx.se/libcurl/c/ftpupload.html





















.SH AVAILABILITY
CURL_READFUNC_PAUSE return code was added in 7.18.0 and CURL_READFUNC_ABORT
was added in 7.12.1.
.SH RETURN VALUE
This will return CURLE_OK.
.SH "SEE ALSO"
.BR CURLOPT_READDATA "(3), " CURLOPT_WRITEFUNCTION "(3), "
.BR CURLOPT_SEEKFUNCTION "(3), " CURLOPT_UPLOAD "(3), " CURLOPT_POST "(3), "
.BR CURLOPT_UPLOAD_BUFFERSIZE "(3), "







>
>
>
>
>
|
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>









66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
internal read function will be used. It is doing an fread() on the FILE *
userdata set with \fICURLOPT_READDATA(3)\fP.
.SH DEFAULT
The default internal read callback is fread().
.SH PROTOCOLS
This is used for all protocols when doing uploads.
.SH EXAMPLE
.nf
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
{
  FILE *readhere = (FILE *)userdata;
  curl_off_t nread;

  /* copy as much data as possible into the 'ptr' buffer, but no more than
     'size' * 'nmemb' bytes! */
  size_t retcode = fread(ptr, size, nmemb, readhere);

  nread = (curl_off_t)retcode;

  fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
          " bytes from file\\n", nread);
  return retcode;
}

void setup(char *uploadthis)
{
  FILE *file = fopen("rb", uploadthis);
  CURLcode result;

  /* set callback to use */
  curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);

  /* pass in suitable argument to callback */
  curl_easy_setopt(curl, CURLOPT_READDATA, uploadthis);

  result = curl_easy_perform(curl);
}
.fi
.SH AVAILABILITY
CURL_READFUNC_PAUSE return code was added in 7.18.0 and CURL_READFUNC_ABORT
was added in 7.12.1.
.SH RETURN VALUE
This will return CURLE_OK.
.SH "SEE ALSO"
.BR CURLOPT_READDATA "(3), " CURLOPT_WRITEFUNCTION "(3), "
.BR CURLOPT_SEEKFUNCTION "(3), " CURLOPT_UPLOAD "(3), " CURLOPT_POST "(3), "
.BR CURLOPT_UPLOAD_BUFFERSIZE "(3), "
Changes to jni/curl/docs/libcurl/opts/CURLOPT_REDIR_PROTOCOLS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_REDIR_PROTOCOLS 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REDIR_PROTOCOLS, long bitmask);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_REDIR_PROTOCOLS 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_REDIR_PROTOCOLS \- set protocols allowed to redirect to
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REDIR_PROTOCOLS, long bitmask);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_REFERER.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_REFERER \- set the HTTP referer header
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REFERER, char *where);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_REFERER 3 "December 21, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_REFERER \- set the HTTP referer header
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REFERER, char *where);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_REQUEST_TARGET.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REQUEST_TARGET, string);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_REQUEST_TARGET 3 "June 21, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_REQUEST_TARGET \- specify an alternative target for this request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_REQUEST_TARGET, string);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_RESOLVE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RESOLVE 3 "May 30, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RESOLVE \- provide custom host name to IP address resolves
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RESOLVE 3 "May 30, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RESOLVE \- provide custom host name to IP address resolves
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_RESOLVER_START_DATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RESOLVER_START_DATA 3 "February 14, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RESOLVER_START_DATA \- custom pointer passed to the resolver start callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESOLVER_START_DATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RESOLVER_START_DATA 3 "February 14, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RESOLVER_START_DATA \- custom pointer passed to the resolver start callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESOLVER_START_DATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_RESOLVER_START_FUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RESOLVER_START_FUNCTION 3 "February 14, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RESOLVER_START_FUNCTION \- set callback to be called before a new resolve request is started
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RESOLVER_START_FUNCTION 3 "February 14, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RESOLVER_START_FUNCTION \- set callback to be called before a new resolve request is started
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_RESUME_FROM.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RESUME_FROM 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RESUME_FROM \- set a point to resume transfer from
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESUME_FROM, long from);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RESUME_FROM 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RESUME_FROM \- set a point to resume transfer from
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RESUME_FROM, long from);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_RESUME_FROM_LARGE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RESUME_FROM_LARGE 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RESUME_FROM_LARGE \- set a point to resume transfer from
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RESUME_FROM_LARGE 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RESUME_FROM_LARGE \- set a point to resume transfer from
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_RTSP_CLIENT_CSEQ.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_CLIENT_CSEQ \- set the RTSP client CSEQ number
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_CLIENT_CSEQ, long cseq);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_CLIENT_CSEQ 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_CLIENT_CSEQ \- set the RTSP client CSEQ number
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_CLIENT_CSEQ, long cseq);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_RTSP_REQUEST.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_REQUEST 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_REQUEST \- specify RTSP request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_REQUEST, long request);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_REQUEST 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_REQUEST \- specify RTSP request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_REQUEST, long request);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_RTSP_SERVER_CSEQ.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_SERVER_CSEQ \- set the RTSP server CSEQ number
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_SERVER_CSEQ, long cseq);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_SERVER_CSEQ 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_SERVER_CSEQ \- set the RTSP server CSEQ number
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_SERVER_CSEQ, long cseq);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_RTSP_SESSION_ID.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_SESSION_ID \- set RTSP session ID
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_SESSION_ID, char *id);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_SESSION_ID 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_SESSION_ID \- set RTSP session ID
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_SESSION_ID, char *id);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_RTSP_STREAM_URI.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_STREAM_URI 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_STREAM_URI \- set RTSP stream URI
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_STREAM_URI, char *URI);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_STREAM_URI 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_STREAM_URI \- set RTSP stream URI
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_RTSP_STREAM_URI, char *URI);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_RTSP_TRANSPORT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_RTSP_TRANSPORT 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_RTSP_TRANSPORT \- set RTSP Transport: header
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Added jni/curl/docs/libcurl/opts/CURLOPT_SASL_AUTHZID.3.
































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SASL_AUTHZID 3 "11 Sep 2019" "libcurl 7.66.0" "curl_easy_setopt options"
.SH NAME
CURLOPT_SASL_AUTHZID \- authorisation identity (identity to act as)
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SASL_AUTHZID, char *authzid);
.SH DESCRIPTION
Pass a char * as parameter, which should be pointing to the zero terminated
authorisation identity (authzid) for the transfer. Only applicable to the PLAIN
SASL authentication mechanism where it is optional.

When not specified only the authentication identity (authcid) as specified by
the username will be sent to the server, along with the password. The server
will derive a authzid from the authcid when not provided, which it will then
uses internally.

When the authzid is specified, the use of which is server dependent, it can be
used to access another user's inbox, that the user has been granted access to,
or a shared mailbox for example.
.SH DEFAULT
blank
.SH PROTOCOLS
IMAP, POP3 and SMTP
.SH EXAMPLE
.nf
CURL *curl = curl_easy_init();
if(curl) {
  curl_easy_setopt(curl, CURLOPT_URL, "imap://example.com/");
  curl_easy_setopt(curl, CURLOPT_USERNAME, "Kurt");
  curl_easy_setopt(curl, CURLOPT_PASSWORD, "xipj3plmq");
  curl_easy_setopt(curl, CURLOPT_SASL_AUTHZID, "Ursel");
  ret = curl_easy_perform(curl);
  curl_easy_cleanup(curl);
}
.fi
.SH AVAILABILITY
Added in 7.66.0
.SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO"
.BR CURLOPT_USERNAME "(3), " CURLOPT_PASSWORD "(3), ".BR CURLOPT_USERPWD "(3)"
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SASL_IR.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SASL_IR \- enable sending initial response in first packet
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SASL_IR, long enable);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SASL_IR 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SASL_IR \- enable sending initial response in first packet
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SASL_IR, long enable);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SEEKDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SEEKDATA 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SEEKDATA \- custom pointer passed to the seek callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SEEKDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SEEKDATA 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SEEKDATA \- custom pointer passed to the seek callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SEEKDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SEEKFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SEEKFUNCTION 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SEEKFUNCTION \- user callback for seeking in input stream
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SEEKFUNCTION 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SEEKFUNCTION \- user callback for seeking in input stream
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_SERVICE_NAME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SERVICE_NAME \- authentication service name
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SERVICE_NAME, char *name);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SERVICE_NAME 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SERVICE_NAME \- authentication service name
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SERVICE_NAME, char *name);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SHARE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SHARE \- specify share handle to use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SHARE, CURLSH *share);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SHARE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SHARE \- specify share handle to use
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SHARE, CURLSH *share);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SOCKOPTDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKOPTDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SOCKOPTDATA 3 "May 15, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SOCKOPTDATA \- custom pointer to pass to sockopt callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKOPTDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SOCKOPTFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SOCKOPTFUNCTION \- set callback for setting socket options
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SOCKOPTFUNCTION 3 "May 15, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SOCKOPTFUNCTION \- set callback for setting socket options
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_SOCKS5_AUTH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SOCKS5_AUTH \- set allowed methods for SOCKS5 proxy authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_AUTH, long bitmask);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SOCKS5_AUTH 3 "April 27, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SOCKS5_AUTH \- set allowed methods for SOCKS5 proxy authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_AUTH, long bitmask);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_NEC.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SOCKS5_GSSAPI_NEC \- set socks proxy gssapi negotiation protection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_GSSAPI_NEC, long nec);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SOCKS5_GSSAPI_NEC 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SOCKS5_GSSAPI_NEC \- set socks proxy gssapi negotiation protection
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_GSSAPI_NEC, long nec);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SOCKS5_GSSAPI_SERVICE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SOCKS5_GSSAPI_SERVICE \- SOCKS5 proxy authentication service name
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_GSSAPI_SERVICE, char *name);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SOCKS5_GSSAPI_SERVICE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SOCKS5_GSSAPI_SERVICE \- SOCKS5 proxy authentication service name
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SOCKS5_GSSAPI_SERVICE, char *name);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSH_AUTH_TYPES.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_AUTH_TYPES \- set desired auth types for SFTP and SCP
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_AUTH_TYPES, long bitmask);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_AUTH_TYPES 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_AUTH_TYPES \- set desired auth types for SFTP and SCP
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_AUTH_TYPES, long bitmask);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSH_COMPRESSION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_COMPRESSION 3 "August 10, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_COMPRESSION \- enables compression / decompression of SSH traffic
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_COMPRESSION, long enable);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_COMPRESSION 3 "August 10, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_COMPRESSION \- enables compression / decompression of SSH traffic
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_COMPRESSION, long enable);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSH_HOST_PUBLIC_KEY_MD5.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 \- checksum of SSH server public key
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 \- checksum of SSH server public key
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSH_KEYDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_KEYDATA \- pointer to pass to the SSH key callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KEYDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_KEYDATA 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_KEYDATA \- pointer to pass to the SSH key callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KEYDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSH_KEYFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_KEYFUNCTION 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_KEYFUNCTION 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_KEYFUNCTION \- callback for known host matching logic
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSH_KNOWNHOSTS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_KNOWNHOSTS 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KNOWNHOSTS, char *fname);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_KNOWNHOSTS 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_KNOWNHOSTS \- file name holding the SSH known hosts
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSH_KNOWNHOSTS, char *fname);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSH_PRIVATE_KEYFILE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_PRIVATE_KEYFILE \- set private key file for SSH auth
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_PRIVATE_KEYFILE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_PRIVATE_KEYFILE \- set private key file for SSH auth
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSH_PUBLIC_KEYFILE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_PUBLIC_KEYFILE \- set public key file for SSH auth
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSH_PUBLIC_KEYFILE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSH_PUBLIC_KEYFILE \- set public key file for SSH auth
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSLCERT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLCERT 3 "January 29, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLCERT \- set SSL client certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERT, char *cert);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLCERT 3 "January 29, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLCERT \- set SSL client certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERT, char *cert);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSLCERTTYPE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERTTYPE, char *type);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLCERTTYPE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLCERTTYPE \- specify type of the client SSL certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLCERTTYPE, char *type);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSLENGINE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLENGINE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLENGINE \- set SSL engine identifier
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE, char *id);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLENGINE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLENGINE \- set SSL engine identifier
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE, char *id);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSLENGINE_DEFAULT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLENGINE_DEFAULT \- make SSL engine default
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE_DEFAULT, long val);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLENGINE_DEFAULT 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLENGINE_DEFAULT \- make SSL engine default
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLENGINE_DEFAULT, long val);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSLKEY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLKEY 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEY, char *keyfile);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLKEY 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLKEY \- specify private keyfile for TLS and SSL client cert
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEY, char *keyfile);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSLKEYTYPE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLKEYTYPE \- set type of the private key file
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEYTYPE, char *type);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLKEYTYPE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLKEYTYPE \- set type of the private key file
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLKEYTYPE, char *type);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSLVERSION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLVERSION 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLVERSION \- set preferred TLS/SSL version
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLVERSION, long version);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSLVERSION 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSLVERSION \- set preferred TLS/SSL version
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSLVERSION, long version);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_CIPHER_LIST.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CIPHER_LIST, char *list);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_CIPHER_LIST 3 "October 10, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_CIPHER_LIST \- specify ciphers to use for TLS
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CIPHER_LIST, char *list);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_CTX_DATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_CTX_DATA 3 "June 02, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_CTX_DATA \- custom pointer passed to ssl_ctx callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_DATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_CTX_DATA 3 "June 02, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_CTX_DATA \- custom pointer passed to ssl_ctx callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_CTX_DATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_CTX_FUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_CTX_FUNCTION 3 "June 02, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL or mbedTLS
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_CTX_FUNCTION 3 "June 02, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_CTX_FUNCTION \- SSL context callback for OpenSSL, wolfSSL or mbedTLS
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_ENABLE_ALPN.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_ENABLE_ALPN \- enable ALPN
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_ALPN, long npn);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_ENABLE_ALPN 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_ENABLE_ALPN \- enable ALPN
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_ALPN, long npn);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_ENABLE_NPN.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_ENABLE_NPN \- enable NPN
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_NPN, long npn);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_ENABLE_NPN 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_ENABLE_NPN \- enable NPN
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_NPN, long npn);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_FALSESTART.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_FALSESTART \- enable TLS false start
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_FALSESTART, long enable);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_FALSESTART 3 "May 15, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_FALSESTART \- enable TLS false start
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_FALSESTART, long enable);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_OPTIONS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_OPTIONS 3 "July 16, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_OPTIONS \- set SSL behavior options
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_OPTIONS, long bitmask);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_OPTIONS 3 "July 16, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_OPTIONS \- set SSL behavior options
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_OPTIONS, long bitmask);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_SESSIONID_CACHE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_SESSIONID_CACHE \- enable/disable use of the SSL session-ID cache
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_SESSIONID_CACHE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_SESSIONID_CACHE \- enable/disable use of the SSL session-ID cache
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_VERIFYHOST.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_VERIFYHOST 3 "February 02, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYHOST, long verify);







|














|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" **************************************************************************
.\" *                                  _   _ ____  _
.\" *  Project                     ___| | | |  _ \| |
.\" *                             / __| | | | |_) | |
.\" *                            | (__| |_| |  _ <| |___
.\" *                             \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
.\" * are also available at https://curl.haxx.se/docs/copyright.html.
.\" *
.\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
.\" * copies of the Software, and permit persons to whom the Software is
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_VERIFYHOST 3 "August 20, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_VERIFYHOST \- verify the certificate's name against host
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYHOST, long verify);
42
43
44
45
46
47
48
49
50
51
52




53
54
55
56
57
58
59
60
fails. Simply put, it means it has to have the same name in the certificate as
is in the URL you operate against.

Curl considers the server the intended one when the Common Name field or a
Subject Alternate Name field in the certificate matches the host name in the
URL to which you told Curl to connect.

When the \fIverify\fP value is 1, \fIcurl_easy_setopt\fP will return an error
and the option value will not be changed.  It was previously (in 7.28.0 and
earlier) a debug option of some sorts, but it is no longer supported due to
frequently leading to programmer mistakes. Future versions will stop returning




an error for 1 and just treat 1 and 2 the same.

When the \fIverify\fP value is 0, the connection succeeds regardless of the
names in the certificate. Use that ability with caution!

The default value for this option is 2.

This option controls checking the server's certificate's claimed identity.







|
|
|
|
>
>
>
>
|







42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
fails. Simply put, it means it has to have the same name in the certificate as
is in the URL you operate against.

Curl considers the server the intended one when the Common Name field or a
Subject Alternate Name field in the certificate matches the host name in the
URL to which you told Curl to connect.

If \fIverify\fP value is set to 1:

In 7.28.0 and earlier: treated as a debug option of some sorts, not supported
anymore due to frequently leading to programmer mistakes.

From 7.28.1 to 7.65.3: setting it to 1 made curl_easy_setopt() return an error
and leaving the flag untouched.

From 7.66.0: treats 1 and 2 the same.

When the \fIverify\fP value is 0, the connection succeeds regardless of the
names in the certificate. Use that ability with caution!

The default value for this option is 2.

This option controls checking the server's certificate's claimed identity.
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_VERIFYPEER.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_VERIFYPEER 3 "June 24, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_VERIFYPEER \- verify the peer's SSL certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYPEER, long verify);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_VERIFYPEER 3 "June 24, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_VERIFYPEER \- verify the peer's SSL certificate
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYPEER, long verify);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SSL_VERIFYSTATUS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_VERIFYSTATUS 3 "October 09, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_VERIFYSTATUS \- verify the certificate's status
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYSTATUS, long verify);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SSL_VERIFYSTATUS 3 "October 09, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SSL_VERIFYSTATUS \- verify the certificate's status
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_VERIFYSTATUS, long verify);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_STDERR.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_STDERR \- redirect stderr to another stream
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STDERR, FILE *stream);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_STDERR 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_STDERR \- redirect stderr to another stream
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STDERR, FILE *stream);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_STREAM_DEPENDS \- set stream this transfer depends on
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STREAM_DEPENDS, CURL *dephandle);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_STREAM_DEPENDS 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_STREAM_DEPENDS \- set stream this transfer depends on
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STREAM_DEPENDS, CURL *dephandle);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_STREAM_DEPENDS_E.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_STREAM_DEPENDS_E 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_STREAM_DEPENDS_E \- set stream this transfer depends on exclusively
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STREAM_DEPENDS_E, CURL *dephandle);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_STREAM_DEPENDS_E 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_STREAM_DEPENDS_E \- set stream this transfer depends on exclusively
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STREAM_DEPENDS_E, CURL *dephandle);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_STREAM_WEIGHT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_STREAM_WEIGHT 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_STREAM_WEIGHT \- set numerical stream weight
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STREAM_WEIGHT, long weight);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_STREAM_WEIGHT 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_STREAM_WEIGHT \- set numerical stream weight
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_STREAM_WEIGHT, long weight);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_SUPPRESS_CONNECT_HEADERS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_SUPPRESS_CONNECT_HEADERS \- Suppress proxy CONNECT response headers from user callbacks
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_SUPPRESS_CONNECT_HEADERS 3 "April 28, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_SUPPRESS_CONNECT_HEADERS \- Suppress proxy CONNECT response headers from user callbacks
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_TCP_FASTOPEN.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_FASTOPEN, long enable);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TCP_FASTOPEN 3 "May 15, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TCP_FASTOPEN \- enable TCP Fast Open
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_FASTOPEN, long enable);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TCP_KEEPALIVE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TCP_KEEPALIVE 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPALIVE, long probe);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TCP_KEEPALIVE 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TCP_KEEPALIVE \- enable TCP keep-alive probing
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPALIVE, long probe);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TCP_KEEPIDLE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TCP_KEEPIDLE 3 "January 02, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPIDLE, long delay);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TCP_KEEPIDLE 3 "January 02, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TCP_KEEPIDLE \- set TCP keep-alive idle time wait
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPIDLE, long delay);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TCP_KEEPINTVL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TCP_KEEPINTVL 3 "January 02, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPINTVL, long interval);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TCP_KEEPINTVL 3 "January 02, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TCP_KEEPINTVL \- set TCP keep-alive interval
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_KEEPINTVL, long interval);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TCP_NODELAY.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TCP_NODELAY 3 "January 15, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_NODELAY, long nodelay);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TCP_NODELAY 3 "January 15, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TCP_NODELAY \- set the TCP_NODELAY option
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TCP_NODELAY, long nodelay);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TELNETOPTIONS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TELNETOPTIONS \- custom telnet options
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TELNETOPTIONS,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TELNETOPTIONS 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TELNETOPTIONS \- custom telnet options
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TELNETOPTIONS,
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TFTP_BLKSIZE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TFTP_BLKSIZE \- TFTP block size
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TFTP_BLKSIZE, long blocksize);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TFTP_BLKSIZE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TFTP_BLKSIZE \- TFTP block size
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TFTP_BLKSIZE, long blocksize);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TFTP_NO_OPTIONS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TFTP_NO_OPTIONS \- Do not send TFTP options requests.
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TFTP_NO_OPTIONS, long onoff);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TFTP_NO_OPTIONS 3 "April 06, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TFTP_NO_OPTIONS \- Do not send TFTP options requests.
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TFTP_NO_OPTIONS, long onoff);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TIMECONDITION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TIMECONDITION \- select condition for a time request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMECONDITION, long cond);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TIMECONDITION 3 "April 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TIMECONDITION \- select condition for a time request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMECONDITION, long cond);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TIMEOUT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TIMEOUT 3 "October 03, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TIMEOUT \- set maximum time the request is allowed to take
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT, long timeout);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TIMEOUT 3 "October 03, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TIMEOUT \- set maximum time the request is allowed to take
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT, long timeout);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TIMEOUT_MS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TIMEOUT_MS 3 "September 23, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT_MS, long timeout);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TIMEOUT_MS 3 "September 23, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TIMEOUT_MS \- set maximum time the request is allowed to take
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEOUT_MS, long timeout);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TIMEVALUE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TIMEVALUE 3 "January 25, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TIMEVALUE \- set time value for conditional
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEVALUE, long val);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TIMEVALUE 3 "January 25, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TIMEVALUE \- set time value for conditional
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEVALUE, long val);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TIMEVALUE_LARGE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TIMEVALUE_LARGE 3 "January 25, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TIMEVALUE_LARGE \- set time value for conditional
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEVALUE_LARGE, curl_off_t val);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TIMEVALUE_LARGE 3 "January 25, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TIMEVALUE_LARGE \- set time value for conditional
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TIMEVALUE_LARGE, curl_off_t val);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TLS13_CIPHERS.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TLS13_CIPHERS 3 "May 27, 2019" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TLS13_CIPHERS \- specify ciphers suites to use for TLS 1.3
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLS13_CIPHERS, char *list);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TLS13_CIPHERS 3 "May 27, 2019" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TLS13_CIPHERS \- specify ciphers suites to use for TLS 1.3
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLS13_CIPHERS, char *list);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TLSAUTH_PASSWORD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_PASSWORD, char *pwd);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TLSAUTH_PASSWORD 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TLSAUTH_PASSWORD \- password to use for TLS authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_PASSWORD, char *pwd);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TLSAUTH_TYPE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_TYPE, char *type);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TLSAUTH_TYPE 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TLSAUTH_TYPE \- set TLS authentication methods
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_TYPE, char *type);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TLSAUTH_USERNAME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_USERNAME, char *user);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TLSAUTH_USERNAME 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TLSAUTH_USERNAME \- user name to use for TLS authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TLSAUTH_USERNAME, char *user);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TRAILERDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TRAILERDATA 3 "December 14, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME:
CURLOPT_TRAILERDATA \- Custom pointer passed to the trailing headers callback
.SH SYNOPSIS:
#include <curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRAILERDATA, void *userdata);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TRAILERDATA 3 "December 14, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME:
CURLOPT_TRAILERDATA \- Custom pointer passed to the trailing headers callback
.SH SYNOPSIS:
#include <curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRAILERDATA, void *userdata);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TRAILERFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TRAILERFUNCTION 3 "December 14, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME:
CURLOPT_TRAILERFUNCTION \- Set callback for sending trailing headers
.SH SYNOPSIS:
#include <curl.h>

int curl_trailer_callback(struct curl_slist ** list, void *userdata);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TRAILERFUNCTION 3 "December 14, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME:
CURLOPT_TRAILERFUNCTION \- Set callback for sending trailing headers
.SH SYNOPSIS:
#include <curl.h>

int curl_trailer_callback(struct curl_slist ** list, void *userdata);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TRANSFERTEXT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TRANSFERTEXT \- request a text based transfer for FTP
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFERTEXT, long text);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TRANSFERTEXT 3 "May 31, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TRANSFERTEXT \- request a text based transfer for FTP
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFERTEXT, long text);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_TRANSFER_ENCODING.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFER_ENCODING, long enable);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_TRANSFER_ENCODING 3 "May 15, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_TRANSFER_ENCODING \- ask for HTTP Transfer Encoding
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_TRANSFER_ENCODING, long enable);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_UNIX_SOCKET_PATH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_UNIX_SOCKET_PATH 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_UNIX_SOCKET_PATH \- set Unix domain socket
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UNIX_SOCKET_PATH, char *path);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_UNIX_SOCKET_PATH 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_UNIX_SOCKET_PATH \- set Unix domain socket
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UNIX_SOCKET_PATH, char *path);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_UNRESTRICTED_AUTH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_UNRESTRICTED_AUTH 3 "May 15, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_UNRESTRICTED_AUTH \- send credentials to other hosts too
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_UPLOAD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_UPLOAD 3 "April 17, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_UPLOAD \- enable data upload
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UPLOAD, long upload);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_UPLOAD 3 "April 17, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_UPLOAD \- enable data upload
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UPLOAD, long upload);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_UPLOAD_BUFFERSIZE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_UPLOAD_BUFFERSIZE 3 "August 18, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_UPLOAD_BUFFERSIZE \- set preferred upload buffer size
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UPLOAD_BUFFERSIZE, long size);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_UPLOAD_BUFFERSIZE 3 "August 18, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_UPLOAD_BUFFERSIZE \- set preferred upload buffer size
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_UPLOAD_BUFFERSIZE, long size);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_URL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_URL 3 "November 11, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_URL \- provide the URL to use in the request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_URL, char *URL);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_URL 3 "November 11, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_URL \- provide the URL to use in the request
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_URL, char *URL);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_USERAGENT.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_USERAGENT \- set HTTP user-agent header
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERAGENT, char *ua);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_USERAGENT 3 "December 21, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_USERAGENT \- set HTTP user-agent header
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERAGENT, char *ua);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_USERNAME.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_USERNAME 3 "May 05, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_USERNAME \- user name to use in authentication
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_USERNAME 3 "May 05, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_USERNAME \- user name to use in authentication
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_USERPWD.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_USERPWD 3 "August 24, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_USERPWD \- user name and password to use in authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERPWD, char *userpwd);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_USERPWD 3 "August 24, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_USERPWD \- user name and password to use in authentication
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USERPWD, char *userpwd);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_USE_SSL.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_USE_SSL 3 "October 10, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_USE_SSL \- request using SSL / TLS for the transfer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USE_SSL, long level);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_USE_SSL 3 "October 10, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_USE_SSL \- request using SSL / TLS for the transfer
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_USE_SSL, long level);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_VERBOSE.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_VERBOSE 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_VERBOSE \- set verbose mode on/off
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_VERBOSE, long onoff);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_VERBOSE 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_VERBOSE \- set verbose mode on/off
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_VERBOSE, long onoff);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_WILDCARDMATCH.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_WILDCARDMATCH 3 "May 18, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_WILDCARDMATCH \- enable directory wildcard transfers
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WILDCARDMATCH, long onoff);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_WILDCARDMATCH 3 "May 18, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_WILDCARDMATCH \- enable directory wildcard transfers
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WILDCARDMATCH, long onoff);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_WRITEDATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_WRITEDATA 3 "August 11, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_WRITEDATA \- custom pointer passed to the write callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_WRITEDATA 3 "August 11, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_WRITEDATA \- custom pointer passed to the write callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_WRITEDATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_WRITEFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_WRITEFUNCTION 3 "November 23, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_WRITEFUNCTION \- set callback for writing received data
.SH SYNOPSIS
.nf
#include <curl/curl.h>








|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_WRITEFUNCTION 3 "November 23, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_WRITEFUNCTION \- set callback for writing received data
.SH SYNOPSIS
.nf
#include <curl/curl.h>

Changes to jni/curl/docs/libcurl/opts/CURLOPT_XFERINFODATA.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_XFERINFODATA \- custom pointer passed to the progress callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XFERINFODATA, void *pointer);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_XFERINFODATA 3 "October 09, 2017" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_XFERINFODATA \- custom pointer passed to the progress callback
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XFERINFODATA, void *pointer);
Changes to jni/curl/docs/libcurl/opts/CURLOPT_XFERINFOFUNCTION.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_XFERINFOFUNCTION 3 "February 03, 2016" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_XFERINFOFUNCTION \- callback to progress meter function
.SH SYNOPSIS
#include <curl/curl.h>

int progress_callback(void *clientp,







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_XFERINFOFUNCTION 3 "February 03, 2016" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_XFERINFOFUNCTION \- callback to progress meter function
.SH SYNOPSIS
#include <curl/curl.h>

int progress_callback(void *clientp,
Changes to jni/curl/docs/libcurl/opts/CURLOPT_XOAUTH2_BEARER.3.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_XOAUTH2_BEARER 3 "May 22, 2018" "libcurl 7.65.3" "curl_easy_setopt options"

.SH NAME
CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XOAUTH2_BEARER, char *token);







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH CURLOPT_XOAUTH2_BEARER 3 "May 22, 2018" "libcurl 7.66.0" "curl_easy_setopt options"

.SH NAME
CURLOPT_XOAUTH2_BEARER \- specify OAuth 2.0 access token
.SH SYNOPSIS
#include <curl/curl.h>

CURLcode curl_easy_setopt(CURL *handle, CURLOPT_XOAUTH2_BEARER, char *token);
Changes to jni/curl/docs/libcurl/opts/Makefile.in.
321
322
323
324
325
326
327



328
329

330
331
332
333
334
335
336
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
431
432
433
434
435
436
437

438
439
440
441
442
443
444
  CURLINFO_PROXY_SSL_VERIFYRESULT.3             \
  CURLINFO_REDIRECT_COUNT.3                     \
  CURLINFO_REDIRECT_TIME.3                      \
  CURLINFO_REDIRECT_TIME_T.3                    \
  CURLINFO_REDIRECT_URL.3                       \
  CURLINFO_REQUEST_SIZE.3                       \
  CURLINFO_RESPONSE_CODE.3                      \

  CURLINFO_RTSP_CLIENT_CSEQ.3                   \
  CURLINFO_RTSP_CSEQ_RECV.3                     \
  CURLINFO_RTSP_SERVER_CSEQ.3                   \
  CURLINFO_RTSP_SESSION_ID.3                    \
  CURLINFO_SCHEME.3                             \
  CURLINFO_SIZE_DOWNLOAD.3                      \
  CURLINFO_SIZE_DOWNLOAD_T.3                    \







>







435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
  CURLINFO_PROXY_SSL_VERIFYRESULT.3             \
  CURLINFO_REDIRECT_COUNT.3                     \
  CURLINFO_REDIRECT_TIME.3                      \
  CURLINFO_REDIRECT_TIME_T.3                    \
  CURLINFO_REDIRECT_URL.3                       \
  CURLINFO_REQUEST_SIZE.3                       \
  CURLINFO_RESPONSE_CODE.3                      \
  CURLINFO_RETRY_AFTER.3                        \
  CURLINFO_RTSP_CLIENT_CSEQ.3                   \
  CURLINFO_RTSP_CSEQ_RECV.3                     \
  CURLINFO_RTSP_SERVER_CSEQ.3                   \
  CURLINFO_RTSP_SESSION_ID.3                    \
  CURLINFO_SCHEME.3                             \
  CURLINFO_SIZE_DOWNLOAD.3                      \
  CURLINFO_SIZE_DOWNLOAD_T.3                    \
660
661
662
663
664
665
666

667
668
669
670
671
672
673
  CURLOPT_RESUME_FROM_LARGE.3                   \
  CURLOPT_RTSP_CLIENT_CSEQ.3                    \
  CURLOPT_RTSP_REQUEST.3                        \
  CURLOPT_RTSP_SERVER_CSEQ.3                    \
  CURLOPT_RTSP_SESSION_ID.3                     \
  CURLOPT_RTSP_STREAM_URI.3                     \
  CURLOPT_RTSP_TRANSPORT.3                      \

  CURLOPT_SASL_IR.3                             \
  CURLOPT_SEEKDATA.3                            \
  CURLOPT_SEEKFUNCTION.3                        \
  CURLOPT_SERVICE_NAME.3                        \
  CURLOPT_SHARE.3                               \
  CURLOPT_SOCKOPTDATA.3                         \
  CURLOPT_SOCKOPTFUNCTION.3                     \







>







665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
  CURLOPT_RESUME_FROM_LARGE.3                   \
  CURLOPT_RTSP_CLIENT_CSEQ.3                    \
  CURLOPT_RTSP_REQUEST.3                        \
  CURLOPT_RTSP_SERVER_CSEQ.3                    \
  CURLOPT_RTSP_SESSION_ID.3                     \
  CURLOPT_RTSP_STREAM_URI.3                     \
  CURLOPT_RTSP_TRANSPORT.3                      \
  CURLOPT_SASL_AUTHZID.3                        \
  CURLOPT_SASL_IR.3                             \
  CURLOPT_SEEKDATA.3                            \
  CURLOPT_SEEKFUNCTION.3                        \
  CURLOPT_SERVICE_NAME.3                        \
  CURLOPT_SHARE.3                               \
  CURLOPT_SOCKOPTDATA.3                         \
  CURLOPT_SOCKOPTFUNCTION.3                     \
Changes to jni/curl/docs/libcurl/opts/Makefile.inc.
39
40
41
42
43
44
45

46
47
48
49
50
51
52
  CURLINFO_PROXY_SSL_VERIFYRESULT.3             \
  CURLINFO_REDIRECT_COUNT.3                     \
  CURLINFO_REDIRECT_TIME.3                      \
  CURLINFO_REDIRECT_TIME_T.3                    \
  CURLINFO_REDIRECT_URL.3                       \
  CURLINFO_REQUEST_SIZE.3                       \
  CURLINFO_RESPONSE_CODE.3                      \

  CURLINFO_RTSP_CLIENT_CSEQ.3                   \
  CURLINFO_RTSP_CSEQ_RECV.3                     \
  CURLINFO_RTSP_SERVER_CSEQ.3                   \
  CURLINFO_RTSP_SESSION_ID.3                    \
  CURLINFO_SCHEME.3                             \
  CURLINFO_SIZE_DOWNLOAD.3                      \
  CURLINFO_SIZE_DOWNLOAD_T.3                    \







>







39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  CURLINFO_PROXY_SSL_VERIFYRESULT.3             \
  CURLINFO_REDIRECT_COUNT.3                     \
  CURLINFO_REDIRECT_TIME.3                      \
  CURLINFO_REDIRECT_TIME_T.3                    \
  CURLINFO_REDIRECT_URL.3                       \
  CURLINFO_REQUEST_SIZE.3                       \
  CURLINFO_RESPONSE_CODE.3                      \
  CURLINFO_RETRY_AFTER.3                        \
  CURLINFO_RTSP_CLIENT_CSEQ.3                   \
  CURLINFO_RTSP_CSEQ_RECV.3                     \
  CURLINFO_RTSP_SERVER_CSEQ.3                   \
  CURLINFO_RTSP_SESSION_ID.3                    \
  CURLINFO_SCHEME.3                             \
  CURLINFO_SIZE_DOWNLOAD.3                      \
  CURLINFO_SIZE_DOWNLOAD_T.3                    \
268
269
270
271
272
273
274

275
276
277
278
279
280
281
  CURLOPT_RESUME_FROM_LARGE.3                   \
  CURLOPT_RTSP_CLIENT_CSEQ.3                    \
  CURLOPT_RTSP_REQUEST.3                        \
  CURLOPT_RTSP_SERVER_CSEQ.3                    \
  CURLOPT_RTSP_SESSION_ID.3                     \
  CURLOPT_RTSP_STREAM_URI.3                     \
  CURLOPT_RTSP_TRANSPORT.3                      \

  CURLOPT_SASL_IR.3                             \
  CURLOPT_SEEKDATA.3                            \
  CURLOPT_SEEKFUNCTION.3                        \
  CURLOPT_SERVICE_NAME.3                        \
  CURLOPT_SHARE.3                               \
  CURLOPT_SOCKOPTDATA.3                         \
  CURLOPT_SOCKOPTFUNCTION.3                     \







>







269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
  CURLOPT_RESUME_FROM_LARGE.3                   \
  CURLOPT_RTSP_CLIENT_CSEQ.3                    \
  CURLOPT_RTSP_REQUEST.3                        \
  CURLOPT_RTSP_SERVER_CSEQ.3                    \
  CURLOPT_RTSP_SESSION_ID.3                     \
  CURLOPT_RTSP_STREAM_URI.3                     \
  CURLOPT_RTSP_TRANSPORT.3                      \
  CURLOPT_SASL_AUTHZID.3                        \
  CURLOPT_SASL_IR.3                             \
  CURLOPT_SEEKDATA.3                            \
  CURLOPT_SEEKFUNCTION.3                        \
  CURLOPT_SERVICE_NAME.3                        \
  CURLOPT_SHARE.3                               \
  CURLOPT_SOCKOPTDATA.3                         \
  CURLOPT_SOCKOPTFUNCTION.3                     \
Changes to jni/curl/docs/libcurl/symbols-in-versions.
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 with exact information about the first libcurl version that provides the
 symbol, the first version in which the symbol was marked as deprecated and
 for a few symbols the last version that featured it. The names appear in
 alphabetical order.

 Name                           Introduced  Deprecated  Removed

CURLALTSVC_ALTUSED              7.64.1
CURLALTSVC_H1                   7.64.1
CURLALTSVC_H2                   7.64.1
CURLALTSVC_H3                   7.64.1
CURLALTSVC_IMMEDIATELY          7.64.1
CURLALTSVC_READONLYFILE         7.64.1
CURLAUTH_ANY                    7.10.6
CURLAUTH_ANYSAFE                7.10.6







<







8
9
10
11
12
13
14

15
16
17
18
19
20
21
 with exact information about the first libcurl version that provides the
 symbol, the first version in which the symbol was marked as deprecated and
 for a few symbols the last version that featured it. The names appear in
 alphabetical order.

 Name                           Introduced  Deprecated  Removed


CURLALTSVC_H1                   7.64.1
CURLALTSVC_H2                   7.64.1
CURLALTSVC_H3                   7.64.1
CURLALTSVC_IMMEDIATELY          7.64.1
CURLALTSVC_READONLYFILE         7.64.1
CURLAUTH_ANY                    7.10.6
CURLAUTH_ANYSAFE                7.10.6
36
37
38
39
40
41
42

43
44
45
46
47
48
49
CURLCLOSEPOLICY_LEAST_TRAFFIC   7.7
CURLCLOSEPOLICY_NONE            7.7
CURLCLOSEPOLICY_OLDEST          7.7
CURLCLOSEPOLICY_SLOWEST         7.7
CURLE_ABORTED_BY_CALLBACK       7.1
CURLE_AGAIN                     7.18.2
CURLE_ALREADY_COMPLETE          7.7.2

CURLE_BAD_CALLING_ORDER         7.1           7.17.0
CURLE_BAD_CONTENT_ENCODING      7.10
CURLE_BAD_DOWNLOAD_RESUME       7.10
CURLE_BAD_FUNCTION_ARGUMENT     7.1
CURLE_BAD_PASSWORD_ENTERED      7.4.2         7.17.0
CURLE_CHUNK_FAILED              7.21.0
CURLE_CONV_FAILED               7.15.4







>







35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
CURLCLOSEPOLICY_LEAST_TRAFFIC   7.7
CURLCLOSEPOLICY_NONE            7.7
CURLCLOSEPOLICY_OLDEST          7.7
CURLCLOSEPOLICY_SLOWEST         7.7
CURLE_ABORTED_BY_CALLBACK       7.1
CURLE_AGAIN                     7.18.2
CURLE_ALREADY_COMPLETE          7.7.2
CURLE_AUTH_ERROR                7.66.0
CURLE_BAD_CALLING_ORDER         7.1           7.17.0
CURLE_BAD_CONTENT_ENCODING      7.10
CURLE_BAD_DOWNLOAD_RESUME       7.10
CURLE_BAD_FUNCTION_ARGUMENT     7.1
CURLE_BAD_PASSWORD_ENTERED      7.4.2         7.17.0
CURLE_CHUNK_FAILED              7.21.0
CURLE_CONV_FAILED               7.15.4
262
263
264
265
266
267
268

269
270
271
272
273
274
275
CURLINFO_PTR                    7.54.1
CURLINFO_REDIRECT_COUNT         7.9.7
CURLINFO_REDIRECT_TIME          7.9.7
CURLINFO_REDIRECT_TIME_T        7.61.0
CURLINFO_REDIRECT_URL           7.18.2
CURLINFO_REQUEST_SIZE           7.4.1
CURLINFO_RESPONSE_CODE          7.10.8

CURLINFO_RTSP_CLIENT_CSEQ       7.20.0
CURLINFO_RTSP_CSEQ_RECV         7.20.0
CURLINFO_RTSP_SERVER_CSEQ       7.20.0
CURLINFO_RTSP_SESSION_ID        7.20.0
CURLINFO_SCHEME                 7.52.0
CURLINFO_SIZE_DOWNLOAD          7.4.1
CURLINFO_SIZE_DOWNLOAD_T        7.55.0







>







262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
CURLINFO_PTR                    7.54.1
CURLINFO_REDIRECT_COUNT         7.9.7
CURLINFO_REDIRECT_TIME          7.9.7
CURLINFO_REDIRECT_TIME_T        7.61.0
CURLINFO_REDIRECT_URL           7.18.2
CURLINFO_REQUEST_SIZE           7.4.1
CURLINFO_RESPONSE_CODE          7.10.8
CURLINFO_RETRY_AFTER            7.66.0
CURLINFO_RTSP_CLIENT_CSEQ       7.20.0
CURLINFO_RTSP_CSEQ_RECV         7.20.0
CURLINFO_RTSP_SERVER_CSEQ       7.20.0
CURLINFO_RTSP_SESSION_ID        7.20.0
CURLINFO_SCHEME                 7.52.0
CURLINFO_SIZE_DOWNLOAD          7.4.1
CURLINFO_SIZE_DOWNLOAD_T        7.55.0
550
551
552
553
554
555
556

557
558
559
560
561
562
563
CURLOPT_RTSPHEADER              7.20.0
CURLOPT_RTSP_CLIENT_CSEQ        7.20.0
CURLOPT_RTSP_REQUEST            7.20.0
CURLOPT_RTSP_SERVER_CSEQ        7.20.0
CURLOPT_RTSP_SESSION_ID         7.20.0
CURLOPT_RTSP_STREAM_URI         7.20.0
CURLOPT_RTSP_TRANSPORT          7.20.0

CURLOPT_SASL_IR                 7.31.0
CURLOPT_SEEKDATA                7.18.0
CURLOPT_SEEKFUNCTION            7.18.0
CURLOPT_SERVER_RESPONSE_TIMEOUT 7.20.0
CURLOPT_SERVICE_NAME            7.43.0
CURLOPT_SHARE                   7.10
CURLOPT_SOCKOPTDATA             7.16.0







>







551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
CURLOPT_RTSPHEADER              7.20.0
CURLOPT_RTSP_CLIENT_CSEQ        7.20.0
CURLOPT_RTSP_REQUEST            7.20.0
CURLOPT_RTSP_SERVER_CSEQ        7.20.0
CURLOPT_RTSP_SESSION_ID         7.20.0
CURLOPT_RTSP_STREAM_URI         7.20.0
CURLOPT_RTSP_TRANSPORT          7.20.0
CURLOPT_SASL_AUTHZID            7.66.0
CURLOPT_SASL_IR                 7.31.0
CURLOPT_SEEKDATA                7.18.0
CURLOPT_SEEKFUNCTION            7.18.0
CURLOPT_SERVER_RESPONSE_TIMEOUT 7.20.0
CURLOPT_SERVICE_NAME            7.43.0
CURLOPT_SHARE                   7.10
CURLOPT_SOCKOPTDATA             7.16.0
782
783
784
785
786
787
788

789
790
791
792
793
794
795
CURLU_URLENCODE                 7.62.0
CURLVERSION_FIFTH               7.57.0
CURLVERSION_FIRST               7.10
CURLVERSION_FOURTH              7.16.1
CURLVERSION_NOW                 7.10
CURLVERSION_SECOND              7.11.1
CURLVERSION_THIRD               7.12.0

CURL_CHUNK_BGN_FUNC_FAIL        7.21.0
CURL_CHUNK_BGN_FUNC_OK          7.21.0
CURL_CHUNK_BGN_FUNC_SKIP        7.21.0
CURL_CHUNK_END_FUNC_FAIL        7.21.0
CURL_CHUNK_END_FUNC_OK          7.21.0
CURL_CSELECT_ERR                7.16.3
CURL_CSELECT_IN                 7.16.3







>







784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
CURLU_URLENCODE                 7.62.0
CURLVERSION_FIFTH               7.57.0
CURLVERSION_FIRST               7.10
CURLVERSION_FOURTH              7.16.1
CURLVERSION_NOW                 7.10
CURLVERSION_SECOND              7.11.1
CURLVERSION_THIRD               7.12.0
CURLVERSION_SIXTH               7.66.0
CURL_CHUNK_BGN_FUNC_FAIL        7.21.0
CURL_CHUNK_BGN_FUNC_OK          7.21.0
CURL_CHUNK_BGN_FUNC_SKIP        7.21.0
CURL_CHUNK_END_FUNC_FAIL        7.21.0
CURL_CHUNK_END_FUNC_OK          7.21.0
CURL_CSELECT_ERR                7.16.3
CURL_CSELECT_IN                 7.16.3
826
827
828
829
830
831
832

833
834
835
836
837
838
839
CURL_HTTPPOST_READFILE          7.46.0
CURL_HTTP_VERSION_1_0           7.9.1
CURL_HTTP_VERSION_1_1           7.9.1
CURL_HTTP_VERSION_2             7.43.0
CURL_HTTP_VERSION_2TLS          7.47.0
CURL_HTTP_VERSION_2_0           7.33.0
CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE 7.49.0

CURL_HTTP_VERSION_NONE          7.9.1
CURL_IPRESOLVE_V4               7.10.8
CURL_IPRESOLVE_V6               7.10.8
CURL_IPRESOLVE_WHATEVER         7.10.8
CURL_LOCK_ACCESS_NONE           7.10.3
CURL_LOCK_ACCESS_SHARED         7.10.3
CURL_LOCK_ACCESS_SINGLE         7.10.3







>







829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
CURL_HTTPPOST_READFILE          7.46.0
CURL_HTTP_VERSION_1_0           7.9.1
CURL_HTTP_VERSION_1_1           7.9.1
CURL_HTTP_VERSION_2             7.43.0
CURL_HTTP_VERSION_2TLS          7.47.0
CURL_HTTP_VERSION_2_0           7.33.0
CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE 7.49.0
CURL_HTTP_VERSION_3             7.66.0
CURL_HTTP_VERSION_NONE          7.9.1
CURL_IPRESOLVE_V4               7.10.8
CURL_IPRESOLVE_V6               7.10.8
CURL_IPRESOLVE_WHATEVER         7.10.8
CURL_LOCK_ACCESS_NONE           7.10.3
CURL_LOCK_ACCESS_SHARED         7.10.3
CURL_LOCK_ACCESS_SINGLE         7.10.3
920
921
922
923
924
925
926

927
928
929
930
931
932
933
CURL_VERSION_BROTLI             7.57.0
CURL_VERSION_CONV               7.15.4
CURL_VERSION_CURLDEBUG          7.19.6
CURL_VERSION_DEBUG              7.10.6
CURL_VERSION_GSSAPI             7.38.0
CURL_VERSION_GSSNEGOTIATE       7.10.6        7.38.0
CURL_VERSION_HTTP2              7.33.0

CURL_VERSION_HTTPS_PROXY        7.52.0
CURL_VERSION_IDN                7.12.0
CURL_VERSION_IPV6               7.10
CURL_VERSION_KERBEROS4          7.10          7.33.0
CURL_VERSION_KERBEROS5          7.40.0
CURL_VERSION_LARGEFILE          7.11.1
CURL_VERSION_LIBZ               7.10







>







924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
CURL_VERSION_BROTLI             7.57.0
CURL_VERSION_CONV               7.15.4
CURL_VERSION_CURLDEBUG          7.19.6
CURL_VERSION_DEBUG              7.10.6
CURL_VERSION_GSSAPI             7.38.0
CURL_VERSION_GSSNEGOTIATE       7.10.6        7.38.0
CURL_VERSION_HTTP2              7.33.0
CURL_VERSION_HTTP3              7.66.0
CURL_VERSION_HTTPS_PROXY        7.52.0
CURL_VERSION_IDN                7.12.0
CURL_VERSION_IPV6               7.10
CURL_VERSION_KERBEROS4          7.10          7.33.0
CURL_VERSION_KERBEROS5          7.40.0
CURL_VERSION_LARGEFILE          7.11.1
CURL_VERSION_LIBZ               7.10
Changes to jni/curl/include/Makefile.in.
327
328
329
330
331
332
333



334
335

336
337
338
339
340
341
342
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
Changes to jni/curl/include/curl/Makefile.in.
314
315
316
317
318
319
320



321
322

323
324
325
326
327
328
329
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu include/curl/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --gnu include/curl/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \







|

|







426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/curl/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --foreign include/curl/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
Changes to jni/curl/include/curl/curl.h.
1
2
3
4
5
6
7
8
9
#ifndef __CURL_CURL_H
#define __CURL_CURL_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
|
|







1
2
3
4
5
6
7
8
9
#ifndef CURLINC_CURL_H
#define CURLINC_CURL_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
#define CURLFINFOFLAG_KNOWN_TIME        (1<<2)
#define CURLFINFOFLAG_KNOWN_PERM        (1<<3)
#define CURLFINFOFLAG_KNOWN_UID         (1<<4)
#define CURLFINFOFLAG_KNOWN_GID         (1<<5)
#define CURLFINFOFLAG_KNOWN_SIZE        (1<<6)
#define CURLFINFOFLAG_KNOWN_HLINKCOUNT  (1<<7)

/* Content of this structure depends on information which is known and is
   achievable (e.g. by FTP LIST parsing). Please see the url_easy_setopt(3) man
   page for callbacks returning this structure -- some fields are mandatory,
   some others are optional. The FLAG field has special meaning. */
struct curl_fileinfo {
  char *filename;
  curlfiletype filetype;
  time_t time; /* always zero! */
  unsigned int perm;
  int uid;
  int gid;







|
<
<
<







280
281
282
283
284
285
286
287



288
289
290
291
292
293
294
#define CURLFINFOFLAG_KNOWN_TIME        (1<<2)
#define CURLFINFOFLAG_KNOWN_PERM        (1<<3)
#define CURLFINFOFLAG_KNOWN_UID         (1<<4)
#define CURLFINFOFLAG_KNOWN_GID         (1<<5)
#define CURLFINFOFLAG_KNOWN_SIZE        (1<<6)
#define CURLFINFOFLAG_KNOWN_HLINKCOUNT  (1<<7)

/* Information about a single file, used when doing FTP wildcard matching */



struct curl_fileinfo {
  char *filename;
  curlfiletype filetype;
  time_t time; /* always zero! */
  unsigned int perm;
  int uid;
  int gid;
599
600
601
602
603
604
605


606
607
608
609
610
611
612
  CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not
                                     match */
  CURLE_SSL_INVALIDCERTSTATUS,   /* 91 - invalid certificate status */
  CURLE_HTTP2_STREAM,            /* 92 - stream error in HTTP/2 framing layer
                                    */
  CURLE_RECURSIVE_API_CALL,      /* 93 - an api function was called from
                                    inside a callback */


  CURL_LAST /* never use! */
} CURLcode;

#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
                          the obsolete stuff removed! */

/* Previously obsolete error code re-used in 7.38.0 */







>
>







596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
  CURLE_SSL_PINNEDPUBKEYNOTMATCH, /* 90 - specified pinned public key did not
                                     match */
  CURLE_SSL_INVALIDCERTSTATUS,   /* 91 - invalid certificate status */
  CURLE_HTTP2_STREAM,            /* 92 - stream error in HTTP/2 framing layer
                                    */
  CURLE_RECURSIVE_API_CALL,      /* 93 - an api function was called from
                                    inside a callback */
  CURLE_AUTH_ERROR,              /* 94 - an authentication function returned an
                                    error */
  CURL_LAST /* never use! */
} CURLcode;

#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
                          the obsolete stuff removed! */

/* Previously obsolete error code re-used in 7.38.0 */
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896

/* bitmask defines for CURLOPT_HEADEROPT */
#define CURLHEADER_UNIFIED  0
#define CURLHEADER_SEPARATE (1<<0)

/* CURLALTSVC_* are bits for the CURLOPT_ALTSVC_CTRL option */
#define CURLALTSVC_IMMEDIATELY  (1<<0)
#define CURLALTSVC_ALTUSED      (1<<1)
#define CURLALTSVC_READONLYFILE (1<<2)
#define CURLALTSVC_H1           (1<<3)
#define CURLALTSVC_H2           (1<<4)
#define CURLALTSVC_H3           (1<<5)

/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */
#define CURLPROTO_HTTP   (1<<0)







|







881
882
883
884
885
886
887
888
889
890
891
892
893
894
895

/* bitmask defines for CURLOPT_HEADEROPT */
#define CURLHEADER_UNIFIED  0
#define CURLHEADER_SEPARATE (1<<0)

/* CURLALTSVC_* are bits for the CURLOPT_ALTSVC_CTRL option */
#define CURLALTSVC_IMMEDIATELY  (1<<0)

#define CURLALTSVC_READONLYFILE (1<<2)
#define CURLALTSVC_H1           (1<<3)
#define CURLALTSVC_H2           (1<<4)
#define CURLALTSVC_H3           (1<<5)

/* CURLPROTO_ defines are for the CURLOPT_*PROTOCOLS options */
#define CURLPROTO_HTTP   (1<<0)
1921
1922
1923
1924
1925
1926
1927



1928
1929
1930
1931
1932
1933
1934

  /* alt-svc cache file name to possibly read from/write to */
  CINIT(ALTSVC, STRINGPOINT, 287),

  /* maximum age of a connection to consider it for reuse (in seconds) */
  CINIT(MAXAGE_CONN, LONG, 288),




  CURLOPT_LASTENTRY /* the last unused */
} CURLoption;

#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
                          the obsolete stuff removed! */

/* Backwards compatibility with older names */







>
>
>







1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936

  /* alt-svc cache file name to possibly read from/write to */
  CINIT(ALTSVC, STRINGPOINT, 287),

  /* maximum age of a connection to consider it for reuse (in seconds) */
  CINIT(MAXAGE_CONN, LONG, 288),

  /* SASL authorisation identity */
  CINIT(SASL_AUTHZID, STRINGPOINT, 289),

  CURLOPT_LASTENTRY /* the last unused */
} CURLoption;

#ifndef CURL_NO_OLDIES /* define this to test if your app builds with all
                          the obsolete stuff removed! */

/* Backwards compatibility with older names */
1974
1975
1976
1977
1978
1979
1980
1981

1982
1983
1984
1985
1986
1987
1988
                             for us! */
  CURL_HTTP_VERSION_1_0,  /* please use HTTP 1.0 in the request */
  CURL_HTTP_VERSION_1_1,  /* please use HTTP 1.1 in the request */
  CURL_HTTP_VERSION_2_0,  /* please use HTTP 2 in the request */
  CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */
  CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE,  /* please use HTTP 2 without HTTP/1.1
                                           Upgrade */


  CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */
};

/* Convenience definition simple because the name of the version is HTTP/2 and
   not 2.0. The 2_0 version of the enum name was set while the version was
   still planned to be 2.0 and we stick to it for compatibility. */
#define CURL_HTTP_VERSION_2 CURL_HTTP_VERSION_2_0







|
>







1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
                             for us! */
  CURL_HTTP_VERSION_1_0,  /* please use HTTP 1.0 in the request */
  CURL_HTTP_VERSION_1_1,  /* please use HTTP 1.1 in the request */
  CURL_HTTP_VERSION_2_0,  /* please use HTTP 2 in the request */
  CURL_HTTP_VERSION_2TLS, /* use version 2 for HTTPS, version 1.1 for HTTP */
  CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE,  /* please use HTTP 2 without HTTP/1.1
                                           Upgrade */
  CURL_HTTP_VERSION_3 = 30, /* Makes use of explicit HTTP/3 without fallback.
                               Use CURLOPT_ALTSVC to enable HTTP/3 upgrade */
  CURL_HTTP_VERSION_LAST /* *ILLEGAL* http version */
};

/* Convenience definition simple because the name of the version is HTTP/2 and
   not 2.0. The 2_0 version of the enum name was set while the version was
   still planned to be 2.0 and we stick to it for compatibility. */
#define CURL_HTTP_VERSION_2 CURL_HTTP_VERSION_2_0
2610
2611
2612
2613
2614
2615
2616

2617
2618
2619
2620
2621
2622
2623
2624
2625
  CURLINFO_TOTAL_TIME_T     = CURLINFO_OFF_T + 50,
  CURLINFO_NAMELOOKUP_TIME_T = CURLINFO_OFF_T + 51,
  CURLINFO_CONNECT_TIME_T   = CURLINFO_OFF_T + 52,
  CURLINFO_PRETRANSFER_TIME_T = CURLINFO_OFF_T + 53,
  CURLINFO_STARTTRANSFER_TIME_T = CURLINFO_OFF_T + 54,
  CURLINFO_REDIRECT_TIME_T  = CURLINFO_OFF_T + 55,
  CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56,


  CURLINFO_LASTONE          = 56
} CURLINFO;

/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
   CURLINFO_HTTP_CODE */
#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE

typedef enum {







>

|







2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
  CURLINFO_TOTAL_TIME_T     = CURLINFO_OFF_T + 50,
  CURLINFO_NAMELOOKUP_TIME_T = CURLINFO_OFF_T + 51,
  CURLINFO_CONNECT_TIME_T   = CURLINFO_OFF_T + 52,
  CURLINFO_PRETRANSFER_TIME_T = CURLINFO_OFF_T + 53,
  CURLINFO_STARTTRANSFER_TIME_T = CURLINFO_OFF_T + 54,
  CURLINFO_REDIRECT_TIME_T  = CURLINFO_OFF_T + 55,
  CURLINFO_APPCONNECT_TIME_T = CURLINFO_OFF_T + 56,
  CURLINFO_RETRY_AFTER      = CURLINFO_OFF_T + 57,

  CURLINFO_LASTONE          = 57
} CURLINFO;

/* CURLINFO_RESPONSE_CODE is the new name for the option previously known as
   CURLINFO_HTTP_CODE */
#define CURLINFO_HTTP_CODE CURLINFO_RESPONSE_CODE

typedef enum {
2710
2711
2712
2713
2714
2715
2716

2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732

typedef enum {
  CURLVERSION_FIRST,
  CURLVERSION_SECOND,
  CURLVERSION_THIRD,
  CURLVERSION_FOURTH,
  CURLVERSION_FIFTH,

  CURLVERSION_LAST /* never actually use this */
} CURLversion;

/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by
   basically all programs ever that want to get version information. It is
   meant to be a built-in version number for what kind of struct the caller
   expects. If the struct ever changes, we redefine the NOW to another enum
   from above. */
#define CURLVERSION_NOW CURLVERSION_FIFTH

typedef struct {
  CURLversion age;          /* age of the returned struct */
  const char *version;      /* LIBCURL_VERSION */
  unsigned int version_num; /* LIBCURL_VERSION_NUM */
  const char *host;         /* OS/host/cpu/machine when configured */
  int features;             /* bitmask, see defines below */







>








|







2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737

typedef enum {
  CURLVERSION_FIRST,
  CURLVERSION_SECOND,
  CURLVERSION_THIRD,
  CURLVERSION_FOURTH,
  CURLVERSION_FIFTH,
  CURLVERSION_SIXTH,
  CURLVERSION_LAST /* never actually use this */
} CURLversion;

/* The 'CURLVERSION_NOW' is the symbolic name meant to be used by
   basically all programs ever that want to get version information. It is
   meant to be a built-in version number for what kind of struct the caller
   expects. If the struct ever changes, we redefine the NOW to another enum
   from above. */
#define CURLVERSION_NOW CURLVERSION_SIXTH

typedef struct {
  CURLversion age;          /* age of the returned struct */
  const char *version;      /* LIBCURL_VERSION */
  unsigned int version_num; /* LIBCURL_VERSION_NUM */
  const char *host;         /* OS/host/cpu/machine when configured */
  int features;             /* bitmask, see defines below */
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758






2759
2760
2761
2762
2763
2764
2765

  /* Same as '_libiconv_version' if built with HAVE_ICONV */
  int iconv_ver_num;

  const char *libssh_version; /* human readable string */

  /* These fields were added in CURLVERSION_FIFTH */

  unsigned int brotli_ver_num; /* Numeric Brotli version
                                  (MAJOR << 24) | (MINOR << 12) | PATCH */
  const char *brotli_version; /* human readable string. */







} curl_version_info_data;

#define CURL_VERSION_IPV6         (1<<0)  /* IPv6-enabled */
#define CURL_VERSION_KERBEROS4    (1<<1)  /* Kerberos V4 auth is supported
                                             (deprecated) */
#define CURL_VERSION_SSL          (1<<2)  /* SSL options are present */
#define CURL_VERSION_LIBZ         (1<<3)  /* libz features are present */







<




>
>
>
>
>
>







2752
2753
2754
2755
2756
2757
2758

2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775

  /* Same as '_libiconv_version' if built with HAVE_ICONV */
  int iconv_ver_num;

  const char *libssh_version; /* human readable string */

  /* These fields were added in CURLVERSION_FIFTH */

  unsigned int brotli_ver_num; /* Numeric Brotli version
                                  (MAJOR << 24) | (MINOR << 12) | PATCH */
  const char *brotli_version; /* human readable string. */

  /* These fields were added in CURLVERSION_SIXTH */
  unsigned int nghttp2_ver_num; /* Numeric nghttp2 version
                                   (MAJOR << 16) | (MINOR << 8) | PATCH */
  const char *nghttp2_version; /* human readable string. */
  const char *quic_version;    /* human readable quic (+ HTTP/3) library +
                                  version or NULL */
} curl_version_info_data;

#define CURL_VERSION_IPV6         (1<<0)  /* IPv6-enabled */
#define CURL_VERSION_KERBEROS4    (1<<1)  /* Kerberos V4 auth is supported
                                             (deprecated) */
#define CURL_VERSION_SSL          (1<<2)  /* SSL options are present */
#define CURL_VERSION_LIBZ         (1<<3)  /* libz features are present */
2784
2785
2786
2787
2788
2789
2790

2791
2792
2793
2794
2795
2796
2797
#define CURL_VERSION_UNIX_SOCKETS (1<<19) /* Unix domain sockets support */
#define CURL_VERSION_PSL          (1<<20) /* Mozilla's Public Suffix List, used
                                             for cookie domain verification */
#define CURL_VERSION_HTTPS_PROXY  (1<<21) /* HTTPS-proxy support built-in */
#define CURL_VERSION_MULTI_SSL    (1<<22) /* Multiple SSL backends available */
#define CURL_VERSION_BROTLI       (1<<23) /* Brotli features are present. */
#define CURL_VERSION_ALTSVC       (1<<24) /* Alt-Svc handling built-in */


 /*
 * NAME curl_version_info()
 *
 * DESCRIPTION
 *
 * This function returns a pointer to a static copy of the version info







>







2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
#define CURL_VERSION_UNIX_SOCKETS (1<<19) /* Unix domain sockets support */
#define CURL_VERSION_PSL          (1<<20) /* Mozilla's Public Suffix List, used
                                             for cookie domain verification */
#define CURL_VERSION_HTTPS_PROXY  (1<<21) /* HTTPS-proxy support built-in */
#define CURL_VERSION_MULTI_SSL    (1<<22) /* Multiple SSL backends available */
#define CURL_VERSION_BROTLI       (1<<23) /* Brotli features are present. */
#define CURL_VERSION_ALTSVC       (1<<24) /* Alt-Svc handling built-in */
#define CURL_VERSION_HTTP3        (1<<25) /* HTTP3 support built-in */

 /*
 * NAME curl_version_info()
 *
 * DESCRIPTION
 *
 * This function returns a pointer to a static copy of the version info
2864
2865
2866
2867
2868
2869
2870
2871
#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param)
#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg)
#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)
#endif /* __STDC__ >= 1 */
#endif /* gcc >= 4.3 && !__cplusplus */

#endif /* __CURL_CURL_H */







|
2875
2876
2877
2878
2879
2880
2881
2882
#define curl_easy_setopt(handle,opt,param) curl_easy_setopt(handle,opt,param)
#define curl_easy_getinfo(handle,info,arg) curl_easy_getinfo(handle,info,arg)
#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)
#endif /* __STDC__ >= 1 */
#endif /* gcc >= 4.3 && !__cplusplus */

#endif /* CURLINC_CURL_H */
Changes to jni/curl/include/curl/curlver.h.
1
2
3
4
5
6
7
8
9
#ifndef __CURL_CURLVER_H
#define __CURL_CURLVER_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
|
|







1
2
3
4
5
6
7
8
9
#ifndef CURLINC_CURLVER_H
#define CURLINC_CURLVER_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
   a script at release-time. This was made its own header file in 7.11.2 */

/* This is the global package copyright */
#define LIBCURL_COPYRIGHT "1996 - 2019 Daniel Stenberg, <daniel@haxx.se>."

/* This is the version number of the libcurl package from which this header
   file origins: */
#define LIBCURL_VERSION "7.65.3"

/* The numeric version number is also available "in parts" by using these
   defines: */
#define LIBCURL_VERSION_MAJOR 7
#define LIBCURL_VERSION_MINOR 65
#define LIBCURL_VERSION_PATCH 3

/* This is the numeric version of the libcurl version number, meant for easier
   parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
   always follow this syntax:

         0xXXYYZZ

   Where XX, YY and ZZ are the main version, release and patch numbers in
   hexadecimal (using 8 bits each). All three numbers are always represented
   using two digits.  1.2 would appear as "0x010200" while version 9.11.7
   appears as "0x090b07".

   This 6-digit (24 bits) hexadecimal number does not show pre-release number,
   and it is always a greater number in a more recent release. It makes
   comparisons with greater than and less than work.

   Note: This define is the full hex number and _does not_ use the
   CURL_VERSION_BITS() macro since curl's own configure script greps for it
   and needs it to contain the full number.
*/
#define LIBCURL_VERSION_NUM 0x074103

/*
 * This is the date and time when the full source package was created. The
 * timestamp is not stored in git, as the timestamp is properly set in the
 * tarballs by the maketgz script.
 *
 * The format of the date follows this template:
 *
 * "2007-11-23"
 */
#define LIBCURL_TIMESTAMP "2019-07-19"

#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z))
#define CURL_AT_LEAST_VERSION(x,y,z) \
  (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z))

#endif /* __CURL_CURLVER_H */







|




|
|




















|










|





|
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
   a script at release-time. This was made its own header file in 7.11.2 */

/* This is the global package copyright */
#define LIBCURL_COPYRIGHT "1996 - 2019 Daniel Stenberg, <daniel@haxx.se>."

/* This is the version number of the libcurl package from which this header
   file origins: */
#define LIBCURL_VERSION "7.66.0"

/* The numeric version number is also available "in parts" by using these
   defines: */
#define LIBCURL_VERSION_MAJOR 7
#define LIBCURL_VERSION_MINOR 66
#define LIBCURL_VERSION_PATCH 0

/* This is the numeric version of the libcurl version number, meant for easier
   parsing and comparions by programs. The LIBCURL_VERSION_NUM define will
   always follow this syntax:

         0xXXYYZZ

   Where XX, YY and ZZ are the main version, release and patch numbers in
   hexadecimal (using 8 bits each). All three numbers are always represented
   using two digits.  1.2 would appear as "0x010200" while version 9.11.7
   appears as "0x090b07".

   This 6-digit (24 bits) hexadecimal number does not show pre-release number,
   and it is always a greater number in a more recent release. It makes
   comparisons with greater than and less than work.

   Note: This define is the full hex number and _does not_ use the
   CURL_VERSION_BITS() macro since curl's own configure script greps for it
   and needs it to contain the full number.
*/
#define LIBCURL_VERSION_NUM 0x074200

/*
 * This is the date and time when the full source package was created. The
 * timestamp is not stored in git, as the timestamp is properly set in the
 * tarballs by the maketgz script.
 *
 * The format of the date follows this template:
 *
 * "2007-11-23"
 */
#define LIBCURL_TIMESTAMP "2019-09-11"

#define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z))
#define CURL_AT_LEAST_VERSION(x,y,z) \
  (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z))

#endif /* CURLINC_CURLVER_H */
Changes to jni/curl/include/curl/easy.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef __CURL_EASY_H
#define __CURL_EASY_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
|
|







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef CURLINC_EASY_H
#define CURLINC_EASY_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
Changes to jni/curl/include/curl/mprintf.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef __CURL_MPRINTF_H
#define __CURL_MPRINTF_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
|
|







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef CURLINC_MPRINTF_H
#define CURLINC_MPRINTF_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
43
44
45
46
47
48
49
50
CURL_EXTERN char *curl_maprintf(const char *format, ...);
CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);

#ifdef  __cplusplus
}
#endif

#endif /* __CURL_MPRINTF_H */







|
43
44
45
46
47
48
49
50
CURL_EXTERN char *curl_maprintf(const char *format, ...);
CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);

#ifdef  __cplusplus
}
#endif

#endif /* CURLINC_MPRINTF_H */
Changes to jni/curl/include/curl/multi.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef __CURL_MULTI_H
#define __CURL_MULTI_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
|
|







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef CURLINC_MULTI_H
#define CURLINC_MULTI_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
164
165
166
167
168
169
170














171
172
173
174
175
176
177
 *
 * Desc:     Poll on all fds within a CURLM set as well as any
 *           additional fds passed to the function.
 *
 * Returns:  CURLMcode type, general multi error code.
 */
CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,














                                      struct curl_waitfd extra_fds[],
                                      unsigned int extra_nfds,
                                      int timeout_ms,
                                      int *ret);

 /*
  * Name:    curl_multi_perform()







>
>
>
>
>
>
>
>
>
>
>
>
>
>







164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
 *
 * Desc:     Poll on all fds within a CURLM set as well as any
 *           additional fds passed to the function.
 *
 * Returns:  CURLMcode type, general multi error code.
 */
CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
                                      struct curl_waitfd extra_fds[],
                                      unsigned int extra_nfds,
                                      int timeout_ms,
                                      int *ret);

/*
 * Name:     curl_multi_poll()
 *
 * Desc:     Poll on all fds within a CURLM set as well as any
 *           additional fds passed to the function.
 *
 * Returns:  CURLMcode type, general multi error code.
 */
CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
                                      struct curl_waitfd extra_fds[],
                                      unsigned int extra_nfds,
                                      int timeout_ms,
                                      int *ret);

 /*
  * Name:    curl_multi_perform()
Changes to jni/curl/include/curl/stdcheaders.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef __STDC_HEADERS_H
#define __STDC_HEADERS_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
|
|







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef CURLINC_STDCHEADERS_H
#define CURLINC_STDCHEADERS_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
26
27
28
29
30
31
32
33

size_t fread(void *, size_t, size_t, FILE *);
size_t fwrite(const void *, size_t, size_t, FILE *);

int strcasecmp(const char *, const char *);
int strncasecmp(const char *, const char *, size_t);

#endif /* __STDC_HEADERS_H */







|
26
27
28
29
30
31
32
33

size_t fread(void *, size_t, size_t, FILE *);
size_t fwrite(const void *, size_t, size_t, FILE *);

int strcasecmp(const char *, const char *);
int strncasecmp(const char *, const char *, size_t);

#endif /* CURLINC_STDCHEADERS_H */
Changes to jni/curl/include/curl/system.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef __CURL_SYSTEM_H
#define __CURL_SYSTEM_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
|
|







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef CURLINC_SYSTEM_H
#define CURLINC_SYSTEM_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
#endif

/*
 * Macros for minimum-width signed and unsigned curl_off_t integer constants.
 */

#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
#  define __CURL_OFF_T_C_HLPR2(x) x
#  define __CURL_OFF_T_C_HLPR1(x) __CURL_OFF_T_C_HLPR2(x)
#  define CURL_OFF_T_C(Val)  __CURL_OFF_T_C_HLPR1(Val) ## \
                             __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
#  define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val) ## \
                             __CURL_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
#else
#  ifdef CURL_ISOCPP
#    define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
#  else
#    define __CURL_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
#  endif
#  define __CURL_OFF_T_C_HLPR1(Val,Suffix) __CURL_OFF_T_C_HLPR2(Val,Suffix)
#  define CURL_OFF_T_C(Val)  __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
#  define CURL_OFF_TU_C(Val) __CURL_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
#endif

#endif /* __CURL_SYSTEM_H */







|
|
|
|
|
|


|

|

|
|
|


|
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
#endif

/*
 * Macros for minimum-width signed and unsigned curl_off_t integer constants.
 */

#if defined(__BORLANDC__) && (__BORLANDC__ == 0x0551)
#  define CURLINC_OFF_T_C_HLPR2(x) x
#  define CURLINC_OFF_T_C_HLPR1(x) CURLINC_OFF_T_C_HLPR2(x)
#  define CURL_OFF_T_C(Val)  CURLINC_OFF_T_C_HLPR1(Val) ## \
                             CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_T)
#  define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val) ## \
                             CURLINC_OFF_T_C_HLPR1(CURL_SUFFIX_CURL_OFF_TU)
#else
#  ifdef CURL_ISOCPP
#    define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val ## Suffix
#  else
#    define CURLINC_OFF_T_C_HLPR2(Val,Suffix) Val/**/Suffix
#  endif
#  define CURLINC_OFF_T_C_HLPR1(Val,Suffix) CURLINC_OFF_T_C_HLPR2(Val,Suffix)
#  define CURL_OFF_T_C(Val)  CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_T)
#  define CURL_OFF_TU_C(Val) CURLINC_OFF_T_C_HLPR1(Val,CURL_SUFFIX_CURL_OFF_TU)
#endif

#endif /* CURLINC_SYSTEM_H */
Changes to jni/curl/include/curl/typecheck-gcc.h.
1
2
3
4
5
6
7
8
9
#ifndef __CURL_TYPECHECK_GCC_H
#define __CURL_TYPECHECK_GCC_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
|
|







1
2
3
4
5
6
7
8
9
#ifndef CURLINC_TYPECHECK_GCC_H
#define CURLINC_TYPECHECK_GCC_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
 * KIND, either express or implied.
 *
 ***************************************************************************/

/* wraps curl_easy_setopt() with typechecking */

/* To add a new kind of warning, add an
 *   if(_curl_is_sometype_option(_curl_opt))
 *     if(!_curl_is_sometype(value))
 *       _curl_easy_setopt_err_sometype();
 * block and define _curl_is_sometype_option, _curl_is_sometype and
 * _curl_easy_setopt_err_sometype below
 *
 * NOTE: We use two nested 'if' statements here instead of the && operator, in
 *       order to work around gcc bug #32061.  It affects only gcc 4.3.x/4.4.x
 *       when compiling with -Wlogical-op.
 *
 * To add an option that uses the same type as an existing option, you'll just
 * need to extend the appropriate _curl_*_option macro
 */
#define curl_easy_setopt(handle, option, value)                               \
__extension__ ({                                                              \
  __typeof__(option) _curl_opt = option;                                     \
  if(__builtin_constant_p(_curl_opt)) {                                       \
    if(_curl_is_long_option(_curl_opt))                                       \
      if(!_curl_is_long(value))                                               \
        _curl_easy_setopt_err_long();                                         \
    if(_curl_is_off_t_option(_curl_opt))                                      \
      if(!_curl_is_off_t(value))                                              \
        _curl_easy_setopt_err_curl_off_t();                                   \
    if(_curl_is_string_option(_curl_opt))                                     \
      if(!_curl_is_string(value))                                             \
        _curl_easy_setopt_err_string();                                       \
    if(_curl_is_write_cb_option(_curl_opt))                                   \
      if(!_curl_is_write_cb(value))                                           \
        _curl_easy_setopt_err_write_callback();                               \
    if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION)                        \
      if(!_curl_is_resolver_start_callback(value))                            \
        _curl_easy_setopt_err_resolver_start_callback();                      \
    if((_curl_opt) == CURLOPT_READFUNCTION)                                   \
      if(!_curl_is_read_cb(value))                                            \
        _curl_easy_setopt_err_read_cb();                                      \
    if((_curl_opt) == CURLOPT_IOCTLFUNCTION)                                  \
      if(!_curl_is_ioctl_cb(value))                                           \
        _curl_easy_setopt_err_ioctl_cb();                                     \
    if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION)                                \
      if(!_curl_is_sockopt_cb(value))                                         \
        _curl_easy_setopt_err_sockopt_cb();                                   \
    if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION)                             \
      if(!_curl_is_opensocket_cb(value))                                      \
        _curl_easy_setopt_err_opensocket_cb();                                \
    if((_curl_opt) == CURLOPT_PROGRESSFUNCTION)                               \
      if(!_curl_is_progress_cb(value))                                        \
        _curl_easy_setopt_err_progress_cb();                                  \
    if((_curl_opt) == CURLOPT_DEBUGFUNCTION)                                  \
      if(!_curl_is_debug_cb(value))                                           \
        _curl_easy_setopt_err_debug_cb();                                     \
    if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION)                               \
      if(!_curl_is_ssl_ctx_cb(value))                                         \
        _curl_easy_setopt_err_ssl_ctx_cb();                                   \
    if(_curl_is_conv_cb_option(_curl_opt))                                    \
      if(!_curl_is_conv_cb(value))                                            \
        _curl_easy_setopt_err_conv_cb();                                      \
    if((_curl_opt) == CURLOPT_SEEKFUNCTION)                                   \
      if(!_curl_is_seek_cb(value))                                            \
        _curl_easy_setopt_err_seek_cb();                                      \
    if(_curl_is_cb_data_option(_curl_opt))                                    \
      if(!_curl_is_cb_data(value))                                            \
        _curl_easy_setopt_err_cb_data();                                      \
    if((_curl_opt) == CURLOPT_ERRORBUFFER)                                    \
      if(!_curl_is_error_buffer(value))                                       \
        _curl_easy_setopt_err_error_buffer();                                 \
    if((_curl_opt) == CURLOPT_STDERR)                                         \
      if(!_curl_is_FILE(value))                                               \
        _curl_easy_setopt_err_FILE();                                         \
    if(_curl_is_postfields_option(_curl_opt))                                 \
      if(!_curl_is_postfields(value))                                         \
        _curl_easy_setopt_err_postfields();                                   \
    if((_curl_opt) == CURLOPT_HTTPPOST)                                       \
      if(!_curl_is_arr((value), struct curl_httppost))                        \
        _curl_easy_setopt_err_curl_httpost();                                 \
    if((_curl_opt) == CURLOPT_MIMEPOST)                                       \
      if(!_curl_is_ptr((value), curl_mime))                                   \
        _curl_easy_setopt_err_curl_mimepost();                                \
    if(_curl_is_slist_option(_curl_opt))                                      \
      if(!_curl_is_arr((value), struct curl_slist))                           \
        _curl_easy_setopt_err_curl_slist();                                   \
    if((_curl_opt) == CURLOPT_SHARE)                                          \
      if(!_curl_is_ptr((value), CURLSH))                                      \
        _curl_easy_setopt_err_CURLSH();                                       \
  }                                                                           \
  curl_easy_setopt(handle, _curl_opt, value);                                 \
})

/* wraps curl_easy_getinfo() with typechecking */
#define curl_easy_getinfo(handle, info, arg)                                  \
__extension__ ({                                                              \
  __typeof__(info) _curl_info = info;                                         \
  if(__builtin_constant_p(_curl_info)) {                                      \
    if(_curl_is_string_info(_curl_info))                                      \
      if(!_curl_is_arr((arg), char *))                                        \
        _curl_easy_getinfo_err_string();                                      \
    if(_curl_is_long_info(_curl_info))                                        \
      if(!_curl_is_arr((arg), long))                                          \
        _curl_easy_getinfo_err_long();                                        \
    if(_curl_is_double_info(_curl_info))                                      \
      if(!_curl_is_arr((arg), double))                                        \
        _curl_easy_getinfo_err_double();                                      \
    if(_curl_is_slist_info(_curl_info))                                       \
      if(!_curl_is_arr((arg), struct curl_slist *))                           \
        _curl_easy_getinfo_err_curl_slist();                                  \
    if(_curl_is_tlssessioninfo_info(_curl_info))                              \
      if(!_curl_is_arr((arg), struct curl_tlssessioninfo *))                  \
        _curl_easy_getinfo_err_curl_tlssesssioninfo();                        \
    if(_curl_is_certinfo_info(_curl_info))                                    \
      if(!_curl_is_arr((arg), struct curl_certinfo *))                        \
        _curl_easy_getinfo_err_curl_certinfo();                               \
    if(_curl_is_socket_info(_curl_info))                                      \
      if(!_curl_is_arr((arg), curl_socket_t))                                 \
        _curl_easy_getinfo_err_curl_socket();                                 \
    if(_curl_is_off_t_info(_curl_info))                                       \
      if(!_curl_is_arr((arg), curl_off_t))                                    \
        _curl_easy_getinfo_err_curl_off_t();                                  \
  }                                                                           \
  curl_easy_getinfo(handle, _curl_info, arg);                                 \
})

/*
 * For now, just make sure that the functions are called with three arguments
 */
#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)


/* the actual warnings, triggered by calling the _curl_easy_setopt_err*
 * functions */

/* To define a new warning, use _CURL_WARNING(identifier, "message") */
#define _CURL_WARNING(id, message)                                            \
  static void __attribute__((__warning__(message)))                           \
  __attribute__((__unused__)) __attribute__((__noinline__))                   \
  id(void) { __asm__(""); }

_CURL_WARNING(_curl_easy_setopt_err_long,
  "curl_easy_setopt expects a long argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_curl_off_t,
  "curl_easy_setopt expects a curl_off_t argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_string,
              "curl_easy_setopt expects a "
              "string ('char *' or char[]) argument for this option"
  )
_CURL_WARNING(_curl_easy_setopt_err_write_callback,
  "curl_easy_setopt expects a curl_write_callback argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_resolver_start_callback,
              "curl_easy_setopt expects a "
              "curl_resolver_start_callback argument for this option"
  )
_CURL_WARNING(_curl_easy_setopt_err_read_cb,
  "curl_easy_setopt expects a curl_read_callback argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_ioctl_cb,
  "curl_easy_setopt expects a curl_ioctl_callback argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_sockopt_cb,
  "curl_easy_setopt expects a curl_sockopt_callback argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_opensocket_cb,
              "curl_easy_setopt expects a "
              "curl_opensocket_callback argument for this option"
  )
_CURL_WARNING(_curl_easy_setopt_err_progress_cb,
  "curl_easy_setopt expects a curl_progress_callback argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_debug_cb,
  "curl_easy_setopt expects a curl_debug_callback argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_ssl_ctx_cb,
  "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_conv_cb,
  "curl_easy_setopt expects a curl_conv_callback argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_seek_cb,
  "curl_easy_setopt expects a curl_seek_callback argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_cb_data,
              "curl_easy_setopt expects a "
              "private data pointer as argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_error_buffer,
              "curl_easy_setopt expects a "
              "char buffer of CURL_ERROR_SIZE as argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_FILE,
  "curl_easy_setopt expects a 'FILE *' argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_postfields,
  "curl_easy_setopt expects a 'void *' or 'char *' argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_curl_httpost,
              "curl_easy_setopt expects a 'struct curl_httppost *' "
              "argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_curl_mimepost,
              "curl_easy_setopt expects a 'curl_mime *' "
              "argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_curl_slist,
  "curl_easy_setopt expects a 'struct curl_slist *' argument for this option")
_CURL_WARNING(_curl_easy_setopt_err_CURLSH,
  "curl_easy_setopt expects a CURLSH* argument for this option")

_CURL_WARNING(_curl_easy_getinfo_err_string,
  "curl_easy_getinfo expects a pointer to 'char *' for this info")
_CURL_WARNING(_curl_easy_getinfo_err_long,
  "curl_easy_getinfo expects a pointer to long for this info")
_CURL_WARNING(_curl_easy_getinfo_err_double,
  "curl_easy_getinfo expects a pointer to double for this info")
_CURL_WARNING(_curl_easy_getinfo_err_curl_slist,
  "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info")
_CURL_WARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
              "curl_easy_getinfo expects a pointer to "
              "'struct curl_tlssessioninfo *' for this info")
_CURL_WARNING(_curl_easy_getinfo_err_curl_certinfo,
              "curl_easy_getinfo expects a pointer to "
              "'struct curl_certinfo *' for this info")
_CURL_WARNING(_curl_easy_getinfo_err_curl_socket,
  "curl_easy_getinfo expects a pointer to curl_socket_t for this info")
_CURL_WARNING(_curl_easy_getinfo_err_curl_off_t,
  "curl_easy_getinfo expects a pointer to curl_off_t for this info")

/* groups of curl_easy_setops options that take the same type of argument */

/* To add a new option to one of the groups, just add
 *   (option) == CURLOPT_SOMETHING
 * to the or-expression. If the option takes a long or curl_off_t, you don't
 * have to do anything
 */

/* evaluates to true if option takes a long argument */
#define _curl_is_long_option(option)                                          \
  (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT)

#define _curl_is_off_t_option(option)                                         \
  ((option) > CURLOPTTYPE_OFF_T)

/* evaluates to true if option takes a char* argument */
#define _curl_is_string_option(option)                                        \
  ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET ||                                \
   (option) == CURLOPT_ACCEPT_ENCODING ||                                     \
   (option) == CURLOPT_ALTSVC ||                                              \
   (option) == CURLOPT_CAINFO ||                                              \
   (option) == CURLOPT_CAPATH ||                                              \
   (option) == CURLOPT_COOKIE ||                                              \
   (option) == CURLOPT_COOKIEFILE ||                                          \







|
|

|









|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|


|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|












|
|
|


|

|

|



|

|



|

|

|

|



|

|

|

|

|

|


|


|

|

|


|


|

|


|

|

|

|

|


|


|

|











|


|



|







21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
 * KIND, either express or implied.
 *
 ***************************************************************************/

/* wraps curl_easy_setopt() with typechecking */

/* To add a new kind of warning, add an
 *   if(curlcheck_sometype_option(_curl_opt))
 *     if(!curlcheck_sometype(value))
 *       _curl_easy_setopt_err_sometype();
 * block and define curlcheck_sometype_option, curlcheck_sometype and
 * _curl_easy_setopt_err_sometype below
 *
 * NOTE: We use two nested 'if' statements here instead of the && operator, in
 *       order to work around gcc bug #32061.  It affects only gcc 4.3.x/4.4.x
 *       when compiling with -Wlogical-op.
 *
 * To add an option that uses the same type as an existing option, you'll just
 * need to extend the appropriate _curl_*_option macro
 */
#define curl_easy_setopt(handle, option, value)                         \
  __extension__({                                                       \
      __typeof__(option) _curl_opt = option;                            \
      if(__builtin_constant_p(_curl_opt)) {                             \
        if(curlcheck_long_option(_curl_opt))                            \
          if(!curlcheck_long(value))                                    \
            _curl_easy_setopt_err_long();                               \
        if(curlcheck_off_t_option(_curl_opt))                           \
          if(!curlcheck_off_t(value))                                   \
            _curl_easy_setopt_err_curl_off_t();                         \
        if(curlcheck_string_option(_curl_opt))                          \
          if(!curlcheck_string(value))                                  \
            _curl_easy_setopt_err_string();                             \
        if(curlcheck_write_cb_option(_curl_opt))                        \
          if(!curlcheck_write_cb(value))                                \
            _curl_easy_setopt_err_write_callback();                     \
        if((_curl_opt) == CURLOPT_RESOLVER_START_FUNCTION)              \
          if(!curlcheck_resolver_start_callback(value))                 \
            _curl_easy_setopt_err_resolver_start_callback();            \
        if((_curl_opt) == CURLOPT_READFUNCTION)                         \
          if(!curlcheck_read_cb(value))                                 \
            _curl_easy_setopt_err_read_cb();                            \
        if((_curl_opt) == CURLOPT_IOCTLFUNCTION)                        \
          if(!curlcheck_ioctl_cb(value))                                \
            _curl_easy_setopt_err_ioctl_cb();                           \
        if((_curl_opt) == CURLOPT_SOCKOPTFUNCTION)                      \
          if(!curlcheck_sockopt_cb(value))                              \
            _curl_easy_setopt_err_sockopt_cb();                         \
        if((_curl_opt) == CURLOPT_OPENSOCKETFUNCTION)                   \
          if(!curlcheck_opensocket_cb(value))                           \
            _curl_easy_setopt_err_opensocket_cb();                      \
        if((_curl_opt) == CURLOPT_PROGRESSFUNCTION)                     \
          if(!curlcheck_progress_cb(value))                             \
            _curl_easy_setopt_err_progress_cb();                        \
        if((_curl_opt) == CURLOPT_DEBUGFUNCTION)                        \
          if(!curlcheck_debug_cb(value))                                \
            _curl_easy_setopt_err_debug_cb();                           \
        if((_curl_opt) == CURLOPT_SSL_CTX_FUNCTION)                     \
          if(!curlcheck_ssl_ctx_cb(value))                              \
            _curl_easy_setopt_err_ssl_ctx_cb();                         \
        if(curlcheck_conv_cb_option(_curl_opt))                         \
          if(!curlcheck_conv_cb(value))                                 \
            _curl_easy_setopt_err_conv_cb();                            \
        if((_curl_opt) == CURLOPT_SEEKFUNCTION)                         \
          if(!curlcheck_seek_cb(value))                                 \
            _curl_easy_setopt_err_seek_cb();                            \
        if(curlcheck_cb_data_option(_curl_opt))                         \
          if(!curlcheck_cb_data(value))                                 \
            _curl_easy_setopt_err_cb_data();                            \
        if((_curl_opt) == CURLOPT_ERRORBUFFER)                          \
          if(!curlcheck_error_buffer(value))                            \
            _curl_easy_setopt_err_error_buffer();                       \
        if((_curl_opt) == CURLOPT_STDERR)                               \
          if(!curlcheck_FILE(value))                                    \
            _curl_easy_setopt_err_FILE();                               \
        if(curlcheck_postfields_option(_curl_opt))                      \
          if(!curlcheck_postfields(value))                              \
            _curl_easy_setopt_err_postfields();                         \
        if((_curl_opt) == CURLOPT_HTTPPOST)                             \
          if(!curlcheck_arr((value), struct curl_httppost))             \
            _curl_easy_setopt_err_curl_httpost();                       \
        if((_curl_opt) == CURLOPT_MIMEPOST)                             \
          if(!curlcheck_ptr((value), curl_mime))                        \
            _curl_easy_setopt_err_curl_mimepost();                      \
        if(curlcheck_slist_option(_curl_opt))                           \
          if(!curlcheck_arr((value), struct curl_slist))                \
            _curl_easy_setopt_err_curl_slist();                         \
        if((_curl_opt) == CURLOPT_SHARE)                                \
          if(!curlcheck_ptr((value), CURLSH))                           \
            _curl_easy_setopt_err_CURLSH();                             \
      }                                                                 \
      curl_easy_setopt(handle, _curl_opt, value);                       \
    })

/* wraps curl_easy_getinfo() with typechecking */
#define curl_easy_getinfo(handle, info, arg)                            \
  __extension__({                                                      \
      __typeof__(info) _curl_info = info;                               \
      if(__builtin_constant_p(_curl_info)) {                            \
        if(curlcheck_string_info(_curl_info))                           \
          if(!curlcheck_arr((arg), char *))                             \
            _curl_easy_getinfo_err_string();                            \
        if(curlcheck_long_info(_curl_info))                             \
          if(!curlcheck_arr((arg), long))                               \
            _curl_easy_getinfo_err_long();                              \
        if(curlcheck_double_info(_curl_info))                           \
          if(!curlcheck_arr((arg), double))                             \
            _curl_easy_getinfo_err_double();                            \
        if(curlcheck_slist_info(_curl_info))                            \
          if(!curlcheck_arr((arg), struct curl_slist *))                \
            _curl_easy_getinfo_err_curl_slist();                        \
        if(curlcheck_tlssessioninfo_info(_curl_info))                   \
          if(!curlcheck_arr((arg), struct curl_tlssessioninfo *))       \
            _curl_easy_getinfo_err_curl_tlssesssioninfo();              \
        if(curlcheck_certinfo_info(_curl_info))                         \
          if(!curlcheck_arr((arg), struct curl_certinfo *))             \
            _curl_easy_getinfo_err_curl_certinfo();                     \
        if(curlcheck_socket_info(_curl_info))                           \
          if(!curlcheck_arr((arg), curl_socket_t))                      \
            _curl_easy_getinfo_err_curl_socket();                       \
        if(curlcheck_off_t_info(_curl_info))                            \
          if(!curlcheck_arr((arg), curl_off_t))                         \
            _curl_easy_getinfo_err_curl_off_t();                        \
      }                                                                 \
      curl_easy_getinfo(handle, _curl_info, arg);                       \
    })

/*
 * For now, just make sure that the functions are called with three arguments
 */
#define curl_share_setopt(share,opt,param) curl_share_setopt(share,opt,param)
#define curl_multi_setopt(handle,opt,param) curl_multi_setopt(handle,opt,param)


/* the actual warnings, triggered by calling the _curl_easy_setopt_err*
 * functions */

/* To define a new warning, use _CURL_WARNING(identifier, "message") */
#define CURLWARNING(id, message)                                        \
  static void __attribute__((__warning__(message)))                     \
  __attribute__((__unused__)) __attribute__((__noinline__))             \
  id(void) { __asm__(""); }

CURLWARNING(_curl_easy_setopt_err_long,
  "curl_easy_setopt expects a long argument for this option")
CURLWARNING(_curl_easy_setopt_err_curl_off_t,
  "curl_easy_setopt expects a curl_off_t argument for this option")
CURLWARNING(_curl_easy_setopt_err_string,
              "curl_easy_setopt expects a "
              "string ('char *' or char[]) argument for this option"
  )
CURLWARNING(_curl_easy_setopt_err_write_callback,
  "curl_easy_setopt expects a curl_write_callback argument for this option")
CURLWARNING(_curl_easy_setopt_err_resolver_start_callback,
              "curl_easy_setopt expects a "
              "curl_resolver_start_callback argument for this option"
  )
CURLWARNING(_curl_easy_setopt_err_read_cb,
  "curl_easy_setopt expects a curl_read_callback argument for this option")
CURLWARNING(_curl_easy_setopt_err_ioctl_cb,
  "curl_easy_setopt expects a curl_ioctl_callback argument for this option")
CURLWARNING(_curl_easy_setopt_err_sockopt_cb,
  "curl_easy_setopt expects a curl_sockopt_callback argument for this option")
CURLWARNING(_curl_easy_setopt_err_opensocket_cb,
              "curl_easy_setopt expects a "
              "curl_opensocket_callback argument for this option"
  )
CURLWARNING(_curl_easy_setopt_err_progress_cb,
  "curl_easy_setopt expects a curl_progress_callback argument for this option")
CURLWARNING(_curl_easy_setopt_err_debug_cb,
  "curl_easy_setopt expects a curl_debug_callback argument for this option")
CURLWARNING(_curl_easy_setopt_err_ssl_ctx_cb,
  "curl_easy_setopt expects a curl_ssl_ctx_callback argument for this option")
CURLWARNING(_curl_easy_setopt_err_conv_cb,
  "curl_easy_setopt expects a curl_conv_callback argument for this option")
CURLWARNING(_curl_easy_setopt_err_seek_cb,
  "curl_easy_setopt expects a curl_seek_callback argument for this option")
CURLWARNING(_curl_easy_setopt_err_cb_data,
              "curl_easy_setopt expects a "
              "private data pointer as argument for this option")
CURLWARNING(_curl_easy_setopt_err_error_buffer,
              "curl_easy_setopt expects a "
              "char buffer of CURL_ERROR_SIZE as argument for this option")
CURLWARNING(_curl_easy_setopt_err_FILE,
  "curl_easy_setopt expects a 'FILE *' argument for this option")
CURLWARNING(_curl_easy_setopt_err_postfields,
  "curl_easy_setopt expects a 'void *' or 'char *' argument for this option")
CURLWARNING(_curl_easy_setopt_err_curl_httpost,
              "curl_easy_setopt expects a 'struct curl_httppost *' "
              "argument for this option")
CURLWARNING(_curl_easy_setopt_err_curl_mimepost,
              "curl_easy_setopt expects a 'curl_mime *' "
              "argument for this option")
CURLWARNING(_curl_easy_setopt_err_curl_slist,
  "curl_easy_setopt expects a 'struct curl_slist *' argument for this option")
CURLWARNING(_curl_easy_setopt_err_CURLSH,
  "curl_easy_setopt expects a CURLSH* argument for this option")

CURLWARNING(_curl_easy_getinfo_err_string,
  "curl_easy_getinfo expects a pointer to 'char *' for this info")
CURLWARNING(_curl_easy_getinfo_err_long,
  "curl_easy_getinfo expects a pointer to long for this info")
CURLWARNING(_curl_easy_getinfo_err_double,
  "curl_easy_getinfo expects a pointer to double for this info")
CURLWARNING(_curl_easy_getinfo_err_curl_slist,
  "curl_easy_getinfo expects a pointer to 'struct curl_slist *' for this info")
CURLWARNING(_curl_easy_getinfo_err_curl_tlssesssioninfo,
              "curl_easy_getinfo expects a pointer to "
              "'struct curl_tlssessioninfo *' for this info")
CURLWARNING(_curl_easy_getinfo_err_curl_certinfo,
              "curl_easy_getinfo expects a pointer to "
              "'struct curl_certinfo *' for this info")
CURLWARNING(_curl_easy_getinfo_err_curl_socket,
  "curl_easy_getinfo expects a pointer to curl_socket_t for this info")
CURLWARNING(_curl_easy_getinfo_err_curl_off_t,
  "curl_easy_getinfo expects a pointer to curl_off_t for this info")

/* groups of curl_easy_setops options that take the same type of argument */

/* To add a new option to one of the groups, just add
 *   (option) == CURLOPT_SOMETHING
 * to the or-expression. If the option takes a long or curl_off_t, you don't
 * have to do anything
 */

/* evaluates to true if option takes a long argument */
#define curlcheck_long_option(option)                   \
  (0 < (option) && (option) < CURLOPTTYPE_OBJECTPOINT)

#define curlcheck_off_t_option(option)          \
  ((option) > CURLOPTTYPE_OFF_T)

/* evaluates to true if option takes a char* argument */
#define curlcheck_string_option(option)                                       \
  ((option) == CURLOPT_ABSTRACT_UNIX_SOCKET ||                                \
   (option) == CURLOPT_ACCEPT_ENCODING ||                                     \
   (option) == CURLOPT_ALTSVC ||                                              \
   (option) == CURLOPT_CAINFO ||                                              \
   (option) == CURLOPT_CAPATH ||                                              \
   (option) == CURLOPT_COOKIE ||                                              \
   (option) == CURLOPT_COOKIEFILE ||                                          \
307
308
309
310
311
312
313

314
315
316
317
318
319
320
   (option) == CURLOPT_RANDOM_FILE ||                                         \
   (option) == CURLOPT_RANGE ||                                               \
   (option) == CURLOPT_REFERER ||                                             \
   (option) == CURLOPT_REQUEST_TARGET ||                                      \
   (option) == CURLOPT_RTSP_SESSION_ID ||                                     \
   (option) == CURLOPT_RTSP_STREAM_URI ||                                     \
   (option) == CURLOPT_RTSP_TRANSPORT ||                                      \

   (option) == CURLOPT_SERVICE_NAME ||                                        \
   (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE ||                               \
   (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 ||                             \
   (option) == CURLOPT_SSH_KNOWNHOSTS ||                                      \
   (option) == CURLOPT_SSH_PRIVATE_KEYFILE ||                                 \
   (option) == CURLOPT_SSH_PUBLIC_KEYFILE ||                                  \
   (option) == CURLOPT_SSLCERT ||                                             \







>







307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
   (option) == CURLOPT_RANDOM_FILE ||                                         \
   (option) == CURLOPT_RANGE ||                                               \
   (option) == CURLOPT_REFERER ||                                             \
   (option) == CURLOPT_REQUEST_TARGET ||                                      \
   (option) == CURLOPT_RTSP_SESSION_ID ||                                     \
   (option) == CURLOPT_RTSP_STREAM_URI ||                                     \
   (option) == CURLOPT_RTSP_TRANSPORT ||                                      \
   (option) == CURLOPT_SASL_AUTHZID ||                                        \
   (option) == CURLOPT_SERVICE_NAME ||                                        \
   (option) == CURLOPT_SOCKS5_GSSAPI_SERVICE ||                               \
   (option) == CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 ||                             \
   (option) == CURLOPT_SSH_KNOWNHOSTS ||                                      \
   (option) == CURLOPT_SSH_PRIVATE_KEYFILE ||                                 \
   (option) == CURLOPT_SSH_PUBLIC_KEYFILE ||                                  \
   (option) == CURLOPT_SSLCERT ||                                             \
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
   (option) == CURLOPT_USERAGENT ||                                           \
   (option) == CURLOPT_USERNAME ||                                            \
   (option) == CURLOPT_USERPWD ||                                             \
   (option) == CURLOPT_XOAUTH2_BEARER ||                                      \
   0)

/* evaluates to true if option takes a curl_write_callback argument */
#define _curl_is_write_cb_option(option)                                      \
  ((option) == CURLOPT_HEADERFUNCTION ||                                      \
   (option) == CURLOPT_WRITEFUNCTION)

/* evaluates to true if option takes a curl_conv_callback argument */
#define _curl_is_conv_cb_option(option)                                       \
  ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION ||                            \
   (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION ||                          \
   (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION)

/* evaluates to true if option takes a data argument to pass to a callback */
#define _curl_is_cb_data_option(option)                                       \
  ((option) == CURLOPT_CHUNK_DATA ||                                          \
   (option) == CURLOPT_CLOSESOCKETDATA ||                                     \
   (option) == CURLOPT_DEBUGDATA ||                                           \
   (option) == CURLOPT_FNMATCH_DATA ||                                        \
   (option) == CURLOPT_HEADERDATA ||                                          \
   (option) == CURLOPT_INTERLEAVEDATA ||                                      \
   (option) == CURLOPT_IOCTLDATA ||                                           \







|
|



|
|
|



|







333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
   (option) == CURLOPT_USERAGENT ||                                           \
   (option) == CURLOPT_USERNAME ||                                            \
   (option) == CURLOPT_USERPWD ||                                             \
   (option) == CURLOPT_XOAUTH2_BEARER ||                                      \
   0)

/* evaluates to true if option takes a curl_write_callback argument */
#define curlcheck_write_cb_option(option)                               \
  ((option) == CURLOPT_HEADERFUNCTION ||                                \
   (option) == CURLOPT_WRITEFUNCTION)

/* evaluates to true if option takes a curl_conv_callback argument */
#define curlcheck_conv_cb_option(option)                                \
  ((option) == CURLOPT_CONV_TO_NETWORK_FUNCTION ||                      \
   (option) == CURLOPT_CONV_FROM_NETWORK_FUNCTION ||                    \
   (option) == CURLOPT_CONV_FROM_UTF8_FUNCTION)

/* evaluates to true if option takes a data argument to pass to a callback */
#define curlcheck_cb_data_option(option)                                      \
  ((option) == CURLOPT_CHUNK_DATA ||                                          \
   (option) == CURLOPT_CLOSESOCKETDATA ||                                     \
   (option) == CURLOPT_DEBUGDATA ||                                           \
   (option) == CURLOPT_FNMATCH_DATA ||                                        \
   (option) == CURLOPT_HEADERDATA ||                                          \
   (option) == CURLOPT_INTERLEAVEDATA ||                                      \
   (option) == CURLOPT_IOCTLDATA ||                                           \
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
   (option) == CURLOPT_SSL_CTX_DATA ||                                        \
   (option) == CURLOPT_WRITEDATA ||                                           \
   (option) == CURLOPT_RESOLVER_START_DATA ||                                 \
   (option) == CURLOPT_TRAILERDATA ||                                         \
   0)

/* evaluates to true if option takes a POST data argument (void* or char*) */
#define _curl_is_postfields_option(option)                                    \
  ((option) == CURLOPT_POSTFIELDS ||                                          \
   (option) == CURLOPT_COPYPOSTFIELDS ||                                      \
   0)

/* evaluates to true if option takes a struct curl_slist * argument */
#define _curl_is_slist_option(option)                                         \
  ((option) == CURLOPT_HTTP200ALIASES ||                                      \
   (option) == CURLOPT_HTTPHEADER ||                                          \
   (option) == CURLOPT_MAIL_RCPT ||                                           \
   (option) == CURLOPT_POSTQUOTE ||                                           \
   (option) == CURLOPT_PREQUOTE ||                                            \
   (option) == CURLOPT_PROXYHEADER ||                                         \
   (option) == CURLOPT_QUOTE ||                                               \
   (option) == CURLOPT_RESOLVE ||                                             \
   (option) == CURLOPT_TELNETOPTIONS ||                                       \
   (option) == CURLOPT_CONNECT_TO ||                                          \
   0)

/* groups of curl_easy_getinfo infos that take the same type of argument */

/* evaluates to true if info expects a pointer to char * argument */
#define _curl_is_string_info(info)                                            \
  (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG)

/* evaluates to true if info expects a pointer to long argument */
#define _curl_is_long_info(info)                                              \
  (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE)

/* evaluates to true if info expects a pointer to double argument */
#define _curl_is_double_info(info)                                            \
  (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST)

/* true if info expects a pointer to struct curl_slist * argument */
#define _curl_is_slist_info(info)                                       \
  (((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST))

/* true if info expects a pointer to struct curl_tlssessioninfo * argument */
#define _curl_is_tlssessioninfo_info(info)                              \
  (((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION))

/* true if info expects a pointer to struct curl_certinfo * argument */
#define _curl_is_certinfo_info(info) ((info) == CURLINFO_CERTINFO)

/* true if info expects a pointer to struct curl_socket_t argument */
#define _curl_is_socket_info(info)                                            \
  (CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T)

/* true if info expects a pointer to curl_off_t argument */
#define _curl_is_off_t_info(info)                                             \
  (CURLINFO_OFF_T < (info))


/* typecheck helpers -- check whether given expression has requested type*/

/* For pointers, you can use the _curl_is_ptr/_curl_is_arr macros,
 * otherwise define a new macro. Search for __builtin_types_compatible_p
 * in the GCC manual.
 * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is
 * the actual expression passed to the curl_easy_setopt macro. This
 * means that you can only apply the sizeof and __typeof__ operators, no
 * == or whatsoever.
 */

/* XXX: should evaluate to true if expr is a pointer */
#define _curl_is_any_ptr(expr)                                                \
  (sizeof(expr) == sizeof(void *))

/* evaluates to true if expr is NULL */
/* XXX: must not evaluate expr, so this check is not accurate */
#define _curl_is_NULL(expr)                                                   \
  (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL)))

/* evaluates to true if expr is type*, const type* or NULL */
#define _curl_is_ptr(expr, type)                                              \
  (_curl_is_NULL(expr) ||                                                     \
   __builtin_types_compatible_p(__typeof__(expr), type *) ||                  \
   __builtin_types_compatible_p(__typeof__(expr), const type *))

/* evaluates to true if expr is one of type[], type*, NULL or const type* */
#define _curl_is_arr(expr, type)                                              \
  (_curl_is_ptr((expr), type) ||                                              \
   __builtin_types_compatible_p(__typeof__(expr), type []))

/* evaluates to true if expr is a string */
#define _curl_is_string(expr)                                                 \
  (_curl_is_arr((expr), char) ||                                              \
   _curl_is_arr((expr), signed char) ||                                       \
   _curl_is_arr((expr), unsigned char))

/* evaluates to true if expr is a long (no matter the signedness)
 * XXX: for now, int is also accepted (and therefore short and char, which
 * are promoted to int when passed to a variadic function) */
#define _curl_is_long(expr)                                                   \
  (__builtin_types_compatible_p(__typeof__(expr), long) ||                    \
   __builtin_types_compatible_p(__typeof__(expr), signed long) ||             \
   __builtin_types_compatible_p(__typeof__(expr), unsigned long) ||           \
   __builtin_types_compatible_p(__typeof__(expr), int) ||                     \
   __builtin_types_compatible_p(__typeof__(expr), signed int) ||              \
   __builtin_types_compatible_p(__typeof__(expr), unsigned int) ||            \
   __builtin_types_compatible_p(__typeof__(expr), short) ||                   \
   __builtin_types_compatible_p(__typeof__(expr), signed short) ||            \
   __builtin_types_compatible_p(__typeof__(expr), unsigned short) ||          \
   __builtin_types_compatible_p(__typeof__(expr), char) ||                    \
   __builtin_types_compatible_p(__typeof__(expr), signed char) ||             \
   __builtin_types_compatible_p(__typeof__(expr), unsigned char))

/* evaluates to true if expr is of type curl_off_t */
#define _curl_is_off_t(expr)                                                  \
  (__builtin_types_compatible_p(__typeof__(expr), curl_off_t))

/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */
/* XXX: also check size of an char[] array? */
#define _curl_is_error_buffer(expr)                                           \
  (_curl_is_NULL(expr) ||                                                     \
   __builtin_types_compatible_p(__typeof__(expr), char *) ||                  \
   __builtin_types_compatible_p(__typeof__(expr), char[]))

/* evaluates to true if expr is of type (const) void* or (const) FILE* */
#if 0
#define _curl_is_cb_data(expr)                                                \
  (_curl_is_ptr((expr), void) ||                                              \
   _curl_is_ptr((expr), FILE))
#else /* be less strict */
#define _curl_is_cb_data(expr)                                                \
  _curl_is_any_ptr(expr)
#endif

/* evaluates to true if expr is of type FILE* */
#define _curl_is_FILE(expr)                                             \
  (_curl_is_NULL(expr) ||                                              \
   (__builtin_types_compatible_p(__typeof__(expr), FILE *)))

/* evaluates to true if expr can be passed as POST data (void* or char*) */
#define _curl_is_postfields(expr)                                             \
  (_curl_is_ptr((expr), void) ||                                              \
   _curl_is_arr((expr), char) ||                                              \
   _curl_is_arr((expr), unsigned char))

/* helper: __builtin_types_compatible_p distinguishes between functions and
 * function pointers, hide it */
#define _curl_callback_compatible(func, type)                                 \
  (__builtin_types_compatible_p(__typeof__(func), type) ||                    \
   __builtin_types_compatible_p(__typeof__(func) *, type))

/* evaluates to true if expr is of type curl_resolver_start_callback */
#define _curl_is_resolver_start_callback(expr)       \
  (_curl_is_NULL(expr) || \
   _curl_callback_compatible((expr), curl_resolver_start_callback))

/* evaluates to true if expr is of type curl_read_callback or "similar" */
#define _curl_is_read_cb(expr)                                          \
  (_curl_is_NULL(expr) ||                                                     \
   _curl_callback_compatible((expr), __typeof__(fread) *) ||                  \
   _curl_callback_compatible((expr), curl_read_callback) ||                   \
   _curl_callback_compatible((expr), _curl_read_callback1) ||                 \
   _curl_callback_compatible((expr), _curl_read_callback2) ||                 \
   _curl_callback_compatible((expr), _curl_read_callback3) ||                 \
   _curl_callback_compatible((expr), _curl_read_callback4) ||                 \
   _curl_callback_compatible((expr), _curl_read_callback5) ||                 \
   _curl_callback_compatible((expr), _curl_read_callback6))
typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *);
typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *);
typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *);
typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *);
typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *);
typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *);

/* evaluates to true if expr is of type curl_write_callback or "similar" */
#define _curl_is_write_cb(expr)                                               \
  (_curl_is_read_cb(expr) ||                                            \
   _curl_callback_compatible((expr), __typeof__(fwrite) *) ||                 \
   _curl_callback_compatible((expr), curl_write_callback) ||                  \
   _curl_callback_compatible((expr), _curl_write_callback1) ||                \
   _curl_callback_compatible((expr), _curl_write_callback2) ||                \
   _curl_callback_compatible((expr), _curl_write_callback3) ||                \
   _curl_callback_compatible((expr), _curl_write_callback4) ||                \
   _curl_callback_compatible((expr), _curl_write_callback5) ||                \
   _curl_callback_compatible((expr), _curl_write_callback6))
typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *);
typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t,
                                       const void *);
typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *);
typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *);
typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t,
                                       const void *);
typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *);

/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */
#define _curl_is_ioctl_cb(expr)                                         \
  (_curl_is_NULL(expr) ||                                                     \
   _curl_callback_compatible((expr), curl_ioctl_callback) ||                  \
   _curl_callback_compatible((expr), _curl_ioctl_callback1) ||                \
   _curl_callback_compatible((expr), _curl_ioctl_callback2) ||                \
   _curl_callback_compatible((expr), _curl_ioctl_callback3) ||                \
   _curl_callback_compatible((expr), _curl_ioctl_callback4))
typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *);
typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *);
typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *);
typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *);

/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */
#define _curl_is_sockopt_cb(expr)                                       \
  (_curl_is_NULL(expr) ||                                                     \
   _curl_callback_compatible((expr), curl_sockopt_callback) ||                \
   _curl_callback_compatible((expr), _curl_sockopt_callback1) ||              \
   _curl_callback_compatible((expr), _curl_sockopt_callback2))
typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype);
typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t,
                                      curlsocktype);

/* evaluates to true if expr is of type curl_opensocket_callback or
   "similar" */
#define _curl_is_opensocket_cb(expr)                                    \
  (_curl_is_NULL(expr) ||                                                     \
   _curl_callback_compatible((expr), curl_opensocket_callback) ||             \
   _curl_callback_compatible((expr), _curl_opensocket_callback1) ||           \
   _curl_callback_compatible((expr), _curl_opensocket_callback2) ||           \
   _curl_callback_compatible((expr), _curl_opensocket_callback3) ||           \
   _curl_callback_compatible((expr), _curl_opensocket_callback4))
typedef curl_socket_t (*_curl_opensocket_callback1)
  (void *, curlsocktype, struct curl_sockaddr *);
typedef curl_socket_t (*_curl_opensocket_callback2)
  (void *, curlsocktype, const struct curl_sockaddr *);
typedef curl_socket_t (*_curl_opensocket_callback3)
  (const void *, curlsocktype, struct curl_sockaddr *);
typedef curl_socket_t (*_curl_opensocket_callback4)
  (const void *, curlsocktype, const struct curl_sockaddr *);

/* evaluates to true if expr is of type curl_progress_callback or "similar" */
#define _curl_is_progress_cb(expr)                                      \
  (_curl_is_NULL(expr) ||                                                     \
   _curl_callback_compatible((expr), curl_progress_callback) ||               \
   _curl_callback_compatible((expr), _curl_progress_callback1) ||             \
   _curl_callback_compatible((expr), _curl_progress_callback2))
typedef int (*_curl_progress_callback1)(void *,
    double, double, double, double);
typedef int (*_curl_progress_callback2)(const void *,
    double, double, double, double);

/* evaluates to true if expr is of type curl_debug_callback or "similar" */
#define _curl_is_debug_cb(expr)                                         \
  (_curl_is_NULL(expr) ||                                                     \
   _curl_callback_compatible((expr), curl_debug_callback) ||                  \
   _curl_callback_compatible((expr), _curl_debug_callback1) ||                \
   _curl_callback_compatible((expr), _curl_debug_callback2) ||                \
   _curl_callback_compatible((expr), _curl_debug_callback3) ||                \
   _curl_callback_compatible((expr), _curl_debug_callback4) ||                \
   _curl_callback_compatible((expr), _curl_debug_callback5) ||                \
   _curl_callback_compatible((expr), _curl_debug_callback6) ||                \
   _curl_callback_compatible((expr), _curl_debug_callback7) ||                \
   _curl_callback_compatible((expr), _curl_debug_callback8))
typedef int (*_curl_debug_callback1) (CURL *,
    curl_infotype, char *, size_t, void *);
typedef int (*_curl_debug_callback2) (CURL *,
    curl_infotype, char *, size_t, const void *);
typedef int (*_curl_debug_callback3) (CURL *,
    curl_infotype, const char *, size_t, void *);
typedef int (*_curl_debug_callback4) (CURL *,
    curl_infotype, const char *, size_t, const void *);
typedef int (*_curl_debug_callback5) (CURL *,
    curl_infotype, unsigned char *, size_t, void *);
typedef int (*_curl_debug_callback6) (CURL *,
    curl_infotype, unsigned char *, size_t, const void *);
typedef int (*_curl_debug_callback7) (CURL *,
    curl_infotype, const unsigned char *, size_t, void *);
typedef int (*_curl_debug_callback8) (CURL *,
    curl_infotype, const unsigned char *, size_t, const void *);

/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */
/* this is getting even messier... */
#define _curl_is_ssl_ctx_cb(expr)                                       \
  (_curl_is_NULL(expr) ||                                                     \
   _curl_callback_compatible((expr), curl_ssl_ctx_callback) ||                \
   _curl_callback_compatible((expr), _curl_ssl_ctx_callback1) ||              \
   _curl_callback_compatible((expr), _curl_ssl_ctx_callback2) ||              \
   _curl_callback_compatible((expr), _curl_ssl_ctx_callback3) ||              \
   _curl_callback_compatible((expr), _curl_ssl_ctx_callback4) ||              \
   _curl_callback_compatible((expr), _curl_ssl_ctx_callback5) ||              \
   _curl_callback_compatible((expr), _curl_ssl_ctx_callback6) ||              \
   _curl_callback_compatible((expr), _curl_ssl_ctx_callback7) ||              \
   _curl_callback_compatible((expr), _curl_ssl_ctx_callback8))
typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *);
typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *);
typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *);
typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *,
                                            const void *);
#ifdef HEADER_SSL_H
/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX







|





|















|



|



|



|



|



|


|



|





|









|




|



|
|
|



|
|



|
|
|
|




|














|




|
|
|




|
|
|

|
|



|
|



|
|
|
|



|
|



|
|
|


|
|
|
|
|
|
|
|
|
|








|
|
|
|
|
|
|
|
|
|










|
|
|
|
|
|
|






|
|
|
|
|






|
|
|
|
|
|
|










|
|
|
|
|






|
|
|
|
|
|
|
|
|
|
|



















|
|
|
|
|
|
|
|
|
|
|







366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
   (option) == CURLOPT_SSL_CTX_DATA ||                                        \
   (option) == CURLOPT_WRITEDATA ||                                           \
   (option) == CURLOPT_RESOLVER_START_DATA ||                                 \
   (option) == CURLOPT_TRAILERDATA ||                                         \
   0)

/* evaluates to true if option takes a POST data argument (void* or char*) */
#define curlcheck_postfields_option(option)                                   \
  ((option) == CURLOPT_POSTFIELDS ||                                          \
   (option) == CURLOPT_COPYPOSTFIELDS ||                                      \
   0)

/* evaluates to true if option takes a struct curl_slist * argument */
#define curlcheck_slist_option(option)                                        \
  ((option) == CURLOPT_HTTP200ALIASES ||                                      \
   (option) == CURLOPT_HTTPHEADER ||                                          \
   (option) == CURLOPT_MAIL_RCPT ||                                           \
   (option) == CURLOPT_POSTQUOTE ||                                           \
   (option) == CURLOPT_PREQUOTE ||                                            \
   (option) == CURLOPT_PROXYHEADER ||                                         \
   (option) == CURLOPT_QUOTE ||                                               \
   (option) == CURLOPT_RESOLVE ||                                             \
   (option) == CURLOPT_TELNETOPTIONS ||                                       \
   (option) == CURLOPT_CONNECT_TO ||                                          \
   0)

/* groups of curl_easy_getinfo infos that take the same type of argument */

/* evaluates to true if info expects a pointer to char * argument */
#define curlcheck_string_info(info)                     \
  (CURLINFO_STRING < (info) && (info) < CURLINFO_LONG)

/* evaluates to true if info expects a pointer to long argument */
#define curlcheck_long_info(info)                       \
  (CURLINFO_LONG < (info) && (info) < CURLINFO_DOUBLE)

/* evaluates to true if info expects a pointer to double argument */
#define curlcheck_double_info(info)                     \
  (CURLINFO_DOUBLE < (info) && (info) < CURLINFO_SLIST)

/* true if info expects a pointer to struct curl_slist * argument */
#define curlcheck_slist_info(info)                                      \
  (((info) == CURLINFO_SSL_ENGINES) || ((info) == CURLINFO_COOKIELIST))

/* true if info expects a pointer to struct curl_tlssessioninfo * argument */
#define curlcheck_tlssessioninfo_info(info)                              \
  (((info) == CURLINFO_TLS_SSL_PTR) || ((info) == CURLINFO_TLS_SESSION))

/* true if info expects a pointer to struct curl_certinfo * argument */
#define curlcheck_certinfo_info(info) ((info) == CURLINFO_CERTINFO)

/* true if info expects a pointer to struct curl_socket_t argument */
#define curlcheck_socket_info(info)                     \
  (CURLINFO_SOCKET < (info) && (info) < CURLINFO_OFF_T)

/* true if info expects a pointer to curl_off_t argument */
#define curlcheck_off_t_info(info)              \
  (CURLINFO_OFF_T < (info))


/* typecheck helpers -- check whether given expression has requested type*/

/* For pointers, you can use the curlcheck_ptr/curlcheck_arr macros,
 * otherwise define a new macro. Search for __builtin_types_compatible_p
 * in the GCC manual.
 * NOTE: these macros MUST NOT EVALUATE their arguments! The argument is
 * the actual expression passed to the curl_easy_setopt macro. This
 * means that you can only apply the sizeof and __typeof__ operators, no
 * == or whatsoever.
 */

/* XXX: should evaluate to true if expr is a pointer */
#define curlcheck_any_ptr(expr)                 \
  (sizeof(expr) == sizeof(void *))

/* evaluates to true if expr is NULL */
/* XXX: must not evaluate expr, so this check is not accurate */
#define curlcheck_NULL(expr)                                            \
  (__builtin_types_compatible_p(__typeof__(expr), __typeof__(NULL)))

/* evaluates to true if expr is type*, const type* or NULL */
#define curlcheck_ptr(expr, type)                                       \
  (curlcheck_NULL(expr) ||                                              \
   __builtin_types_compatible_p(__typeof__(expr), type *) ||            \
   __builtin_types_compatible_p(__typeof__(expr), const type *))

/* evaluates to true if expr is one of type[], type*, NULL or const type* */
#define curlcheck_arr(expr, type)                                       \
  (curlcheck_ptr((expr), type) ||                                       \
   __builtin_types_compatible_p(__typeof__(expr), type []))

/* evaluates to true if expr is a string */
#define curlcheck_string(expr)                                          \
  (curlcheck_arr((expr), char) ||                                       \
   curlcheck_arr((expr), signed char) ||                                \
   curlcheck_arr((expr), unsigned char))

/* evaluates to true if expr is a long (no matter the signedness)
 * XXX: for now, int is also accepted (and therefore short and char, which
 * are promoted to int when passed to a variadic function) */
#define curlcheck_long(expr)                                                  \
  (__builtin_types_compatible_p(__typeof__(expr), long) ||                    \
   __builtin_types_compatible_p(__typeof__(expr), signed long) ||             \
   __builtin_types_compatible_p(__typeof__(expr), unsigned long) ||           \
   __builtin_types_compatible_p(__typeof__(expr), int) ||                     \
   __builtin_types_compatible_p(__typeof__(expr), signed int) ||              \
   __builtin_types_compatible_p(__typeof__(expr), unsigned int) ||            \
   __builtin_types_compatible_p(__typeof__(expr), short) ||                   \
   __builtin_types_compatible_p(__typeof__(expr), signed short) ||            \
   __builtin_types_compatible_p(__typeof__(expr), unsigned short) ||          \
   __builtin_types_compatible_p(__typeof__(expr), char) ||                    \
   __builtin_types_compatible_p(__typeof__(expr), signed char) ||             \
   __builtin_types_compatible_p(__typeof__(expr), unsigned char))

/* evaluates to true if expr is of type curl_off_t */
#define curlcheck_off_t(expr)                                   \
  (__builtin_types_compatible_p(__typeof__(expr), curl_off_t))

/* evaluates to true if expr is abuffer suitable for CURLOPT_ERRORBUFFER */
/* XXX: also check size of an char[] array? */
#define curlcheck_error_buffer(expr)                                    \
  (curlcheck_NULL(expr) ||                                              \
   __builtin_types_compatible_p(__typeof__(expr), char *) ||            \
   __builtin_types_compatible_p(__typeof__(expr), char[]))

/* evaluates to true if expr is of type (const) void* or (const) FILE* */
#if 0
#define curlcheck_cb_data(expr)                                         \
  (curlcheck_ptr((expr), void) ||                                       \
   curlcheck_ptr((expr), FILE))
#else /* be less strict */
#define curlcheck_cb_data(expr)                 \
  curlcheck_any_ptr(expr)
#endif

/* evaluates to true if expr is of type FILE* */
#define curlcheck_FILE(expr)                                            \
  (curlcheck_NULL(expr) ||                                              \
   (__builtin_types_compatible_p(__typeof__(expr), FILE *)))

/* evaluates to true if expr can be passed as POST data (void* or char*) */
#define curlcheck_postfields(expr)                                      \
  (curlcheck_ptr((expr), void) ||                                       \
   curlcheck_arr((expr), char) ||                                       \
   curlcheck_arr((expr), unsigned char))

/* helper: __builtin_types_compatible_p distinguishes between functions and
 * function pointers, hide it */
#define curlcheck_cb_compatible(func, type)                             \
  (__builtin_types_compatible_p(__typeof__(func), type) ||              \
   __builtin_types_compatible_p(__typeof__(func) *, type))

/* evaluates to true if expr is of type curl_resolver_start_callback */
#define curlcheck_resolver_start_callback(expr)       \
  (curlcheck_NULL(expr) || \
   curlcheck_cb_compatible((expr), curl_resolver_start_callback))

/* evaluates to true if expr is of type curl_read_callback or "similar" */
#define curlcheck_read_cb(expr)                                         \
  (curlcheck_NULL(expr) ||                                              \
   curlcheck_cb_compatible((expr), __typeof__(fread) *) ||              \
   curlcheck_cb_compatible((expr), curl_read_callback) ||               \
   curlcheck_cb_compatible((expr), _curl_read_callback1) ||             \
   curlcheck_cb_compatible((expr), _curl_read_callback2) ||             \
   curlcheck_cb_compatible((expr), _curl_read_callback3) ||             \
   curlcheck_cb_compatible((expr), _curl_read_callback4) ||             \
   curlcheck_cb_compatible((expr), _curl_read_callback5) ||             \
   curlcheck_cb_compatible((expr), _curl_read_callback6))
typedef size_t (*_curl_read_callback1)(char *, size_t, size_t, void *);
typedef size_t (*_curl_read_callback2)(char *, size_t, size_t, const void *);
typedef size_t (*_curl_read_callback3)(char *, size_t, size_t, FILE *);
typedef size_t (*_curl_read_callback4)(void *, size_t, size_t, void *);
typedef size_t (*_curl_read_callback5)(void *, size_t, size_t, const void *);
typedef size_t (*_curl_read_callback6)(void *, size_t, size_t, FILE *);

/* evaluates to true if expr is of type curl_write_callback or "similar" */
#define curlcheck_write_cb(expr)                                        \
  (curlcheck_read_cb(expr) ||                                           \
   curlcheck_cb_compatible((expr), __typeof__(fwrite) *) ||             \
   curlcheck_cb_compatible((expr), curl_write_callback) ||              \
   curlcheck_cb_compatible((expr), _curl_write_callback1) ||            \
   curlcheck_cb_compatible((expr), _curl_write_callback2) ||            \
   curlcheck_cb_compatible((expr), _curl_write_callback3) ||            \
   curlcheck_cb_compatible((expr), _curl_write_callback4) ||            \
   curlcheck_cb_compatible((expr), _curl_write_callback5) ||            \
   curlcheck_cb_compatible((expr), _curl_write_callback6))
typedef size_t (*_curl_write_callback1)(const char *, size_t, size_t, void *);
typedef size_t (*_curl_write_callback2)(const char *, size_t, size_t,
                                       const void *);
typedef size_t (*_curl_write_callback3)(const char *, size_t, size_t, FILE *);
typedef size_t (*_curl_write_callback4)(const void *, size_t, size_t, void *);
typedef size_t (*_curl_write_callback5)(const void *, size_t, size_t,
                                       const void *);
typedef size_t (*_curl_write_callback6)(const void *, size_t, size_t, FILE *);

/* evaluates to true if expr is of type curl_ioctl_callback or "similar" */
#define curlcheck_ioctl_cb(expr)                                        \
  (curlcheck_NULL(expr) ||                                              \
   curlcheck_cb_compatible((expr), curl_ioctl_callback) ||              \
   curlcheck_cb_compatible((expr), _curl_ioctl_callback1) ||            \
   curlcheck_cb_compatible((expr), _curl_ioctl_callback2) ||            \
   curlcheck_cb_compatible((expr), _curl_ioctl_callback3) ||            \
   curlcheck_cb_compatible((expr), _curl_ioctl_callback4))
typedef curlioerr (*_curl_ioctl_callback1)(CURL *, int, void *);
typedef curlioerr (*_curl_ioctl_callback2)(CURL *, int, const void *);
typedef curlioerr (*_curl_ioctl_callback3)(CURL *, curliocmd, void *);
typedef curlioerr (*_curl_ioctl_callback4)(CURL *, curliocmd, const void *);

/* evaluates to true if expr is of type curl_sockopt_callback or "similar" */
#define curlcheck_sockopt_cb(expr)                                      \
  (curlcheck_NULL(expr) ||                                              \
   curlcheck_cb_compatible((expr), curl_sockopt_callback) ||            \
   curlcheck_cb_compatible((expr), _curl_sockopt_callback1) ||          \
   curlcheck_cb_compatible((expr), _curl_sockopt_callback2))
typedef int (*_curl_sockopt_callback1)(void *, curl_socket_t, curlsocktype);
typedef int (*_curl_sockopt_callback2)(const void *, curl_socket_t,
                                      curlsocktype);

/* evaluates to true if expr is of type curl_opensocket_callback or
   "similar" */
#define curlcheck_opensocket_cb(expr)                                   \
  (curlcheck_NULL(expr) ||                                              \
   curlcheck_cb_compatible((expr), curl_opensocket_callback) ||         \
   curlcheck_cb_compatible((expr), _curl_opensocket_callback1) ||       \
   curlcheck_cb_compatible((expr), _curl_opensocket_callback2) ||       \
   curlcheck_cb_compatible((expr), _curl_opensocket_callback3) ||       \
   curlcheck_cb_compatible((expr), _curl_opensocket_callback4))
typedef curl_socket_t (*_curl_opensocket_callback1)
  (void *, curlsocktype, struct curl_sockaddr *);
typedef curl_socket_t (*_curl_opensocket_callback2)
  (void *, curlsocktype, const struct curl_sockaddr *);
typedef curl_socket_t (*_curl_opensocket_callback3)
  (const void *, curlsocktype, struct curl_sockaddr *);
typedef curl_socket_t (*_curl_opensocket_callback4)
  (const void *, curlsocktype, const struct curl_sockaddr *);

/* evaluates to true if expr is of type curl_progress_callback or "similar" */
#define curlcheck_progress_cb(expr)                                     \
  (curlcheck_NULL(expr) ||                                              \
   curlcheck_cb_compatible((expr), curl_progress_callback) ||           \
   curlcheck_cb_compatible((expr), _curl_progress_callback1) ||         \
   curlcheck_cb_compatible((expr), _curl_progress_callback2))
typedef int (*_curl_progress_callback1)(void *,
    double, double, double, double);
typedef int (*_curl_progress_callback2)(const void *,
    double, double, double, double);

/* evaluates to true if expr is of type curl_debug_callback or "similar" */
#define curlcheck_debug_cb(expr)                                        \
  (curlcheck_NULL(expr) ||                                              \
   curlcheck_cb_compatible((expr), curl_debug_callback) ||              \
   curlcheck_cb_compatible((expr), _curl_debug_callback1) ||            \
   curlcheck_cb_compatible((expr), _curl_debug_callback2) ||            \
   curlcheck_cb_compatible((expr), _curl_debug_callback3) ||            \
   curlcheck_cb_compatible((expr), _curl_debug_callback4) ||            \
   curlcheck_cb_compatible((expr), _curl_debug_callback5) ||            \
   curlcheck_cb_compatible((expr), _curl_debug_callback6) ||            \
   curlcheck_cb_compatible((expr), _curl_debug_callback7) ||            \
   curlcheck_cb_compatible((expr), _curl_debug_callback8))
typedef int (*_curl_debug_callback1) (CURL *,
    curl_infotype, char *, size_t, void *);
typedef int (*_curl_debug_callback2) (CURL *,
    curl_infotype, char *, size_t, const void *);
typedef int (*_curl_debug_callback3) (CURL *,
    curl_infotype, const char *, size_t, void *);
typedef int (*_curl_debug_callback4) (CURL *,
    curl_infotype, const char *, size_t, const void *);
typedef int (*_curl_debug_callback5) (CURL *,
    curl_infotype, unsigned char *, size_t, void *);
typedef int (*_curl_debug_callback6) (CURL *,
    curl_infotype, unsigned char *, size_t, const void *);
typedef int (*_curl_debug_callback7) (CURL *,
    curl_infotype, const unsigned char *, size_t, void *);
typedef int (*_curl_debug_callback8) (CURL *,
    curl_infotype, const unsigned char *, size_t, const void *);

/* evaluates to true if expr is of type curl_ssl_ctx_callback or "similar" */
/* this is getting even messier... */
#define curlcheck_ssl_ctx_cb(expr)                                      \
  (curlcheck_NULL(expr) ||                                              \
   curlcheck_cb_compatible((expr), curl_ssl_ctx_callback) ||            \
   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback1) ||          \
   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback2) ||          \
   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback3) ||          \
   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback4) ||          \
   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback5) ||          \
   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback6) ||          \
   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback7) ||          \
   curlcheck_cb_compatible((expr), _curl_ssl_ctx_callback8))
typedef CURLcode (*_curl_ssl_ctx_callback1)(CURL *, void *, void *);
typedef CURLcode (*_curl_ssl_ctx_callback2)(CURL *, void *, const void *);
typedef CURLcode (*_curl_ssl_ctx_callback3)(CURL *, const void *, void *);
typedef CURLcode (*_curl_ssl_ctx_callback4)(CURL *, const void *,
                                            const void *);
#ifdef HEADER_SSL_H
/* hack: if we included OpenSSL's ssl.h, we know about SSL_CTX
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5;
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6;
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7;
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8;
#endif

/* evaluates to true if expr is of type curl_conv_callback or "similar" */
#define _curl_is_conv_cb(expr)                                          \
  (_curl_is_NULL(expr) ||                                                     \
   _curl_callback_compatible((expr), curl_conv_callback) ||                   \
   _curl_callback_compatible((expr), _curl_conv_callback1) ||                 \
   _curl_callback_compatible((expr), _curl_conv_callback2) ||                 \
   _curl_callback_compatible((expr), _curl_conv_callback3) ||                 \
   _curl_callback_compatible((expr), _curl_conv_callback4))
typedef CURLcode (*_curl_conv_callback1)(char *, size_t length);
typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length);
typedef CURLcode (*_curl_conv_callback3)(void *, size_t length);
typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length);

/* evaluates to true if expr is of type curl_seek_callback or "similar" */
#define _curl_is_seek_cb(expr)                                          \
  (_curl_is_NULL(expr) ||                                                     \
   _curl_callback_compatible((expr), curl_seek_callback) ||                   \
   _curl_callback_compatible((expr), _curl_seek_callback1) ||                 \
   _curl_callback_compatible((expr), _curl_seek_callback2))
typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int);
typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int);


#endif /* __CURL_TYPECHECK_GCC_H */







|
|
|
|
|
|
|






|
|
|
|
|




|
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback5;
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback6;
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback7;
typedef _curl_ssl_ctx_callback1 _curl_ssl_ctx_callback8;
#endif

/* evaluates to true if expr is of type curl_conv_callback or "similar" */
#define curlcheck_conv_cb(expr)                                         \
  (curlcheck_NULL(expr) ||                                              \
   curlcheck_cb_compatible((expr), curl_conv_callback) ||               \
   curlcheck_cb_compatible((expr), _curl_conv_callback1) ||             \
   curlcheck_cb_compatible((expr), _curl_conv_callback2) ||             \
   curlcheck_cb_compatible((expr), _curl_conv_callback3) ||             \
   curlcheck_cb_compatible((expr), _curl_conv_callback4))
typedef CURLcode (*_curl_conv_callback1)(char *, size_t length);
typedef CURLcode (*_curl_conv_callback2)(const char *, size_t length);
typedef CURLcode (*_curl_conv_callback3)(void *, size_t length);
typedef CURLcode (*_curl_conv_callback4)(const void *, size_t length);

/* evaluates to true if expr is of type curl_seek_callback or "similar" */
#define curlcheck_seek_cb(expr)                                         \
  (curlcheck_NULL(expr) ||                                              \
   curlcheck_cb_compatible((expr), curl_seek_callback) ||               \
   curlcheck_cb_compatible((expr), _curl_seek_callback1) ||             \
   curlcheck_cb_compatible((expr), _curl_seek_callback2))
typedef CURLcode (*_curl_seek_callback1)(void *, curl_off_t, int);
typedef CURLcode (*_curl_seek_callback2)(const void *, curl_off_t, int);


#endif /* CURLINC_TYPECHECK_GCC_H */
Changes to jni/curl/include/curl/urlapi.h.
1
2
3
4
5
6
7
8
9
#ifndef __CURL_URLAPI_H
#define __CURL_URLAPI_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
|
|







1
2
3
4
5
6
7
8
9
#ifndef CURLINC_URLAPI_H
#define CURLINC_URLAPI_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
116
117
118
119
120
121
122
123
                                   const char *part, unsigned int flags);


#ifdef __cplusplus
} /* end of extern "C" */
#endif

#endif







|
116
117
118
119
120
121
122
123
                                   const char *part, unsigned int flags);


#ifdef __cplusplus
} /* end of extern "C" */
#endif

#endif /* CURLINC_URLAPI_H */
Changes to jni/curl/lib/Makefile.am.
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# KIND, either express or implied.
#
###########################################################################
AUTOMAKE_OPTIONS = foreign nostdinc

CMAKE_DIST = CMakeLists.txt curl_config.h.cmake

EXTRA_DIST = Makefile.m32 config-win32.h                            \
 config-win32ce.h config-riscos.h config-mac.h curl_config.h.in     \
 makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \
 makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h    \
 config-os400.h setup-os400.h config-symbian.h Makefile.Watcom      \
 config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST)        \
 firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl

lib_LTLIBRARIES = libcurl.la







|
|







19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# KIND, either express or implied.
#
###########################################################################
AUTOMAKE_OPTIONS = foreign nostdinc

CMAKE_DIST = CMakeLists.txt curl_config.h.cmake

EXTRA_DIST = Makefile.m32 config-win32.h config-win32ce.h           \
 config-plan9.h config-riscos.h config-mac.h curl_config.h.in       \
 makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \
 makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h    \
 config-os400.h setup-os400.h config-symbian.h Makefile.Watcom      \
 config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST)        \
 firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl

lib_LTLIBRARIES = libcurl.la
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
AM_CPPFLAGS += -I$(top_builddir)/ares        \
               -I$(top_srcdir)/ares
endif

# Prevent LIBS from being used for all link targets
LIBS = $(BLANK_AT_MAKETIME)

VERSIONINFO=-version-info 9:0:5
# This flag accepts an argument of the form current[:revision[:age]]. So,
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
# 1.
#
# Here's the simplified rule guide on how to change -version-info:
# (current version is C:R:A)
#







|







61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
AM_CPPFLAGS += -I$(top_builddir)/ares        \
               -I$(top_srcdir)/ares
endif

# Prevent LIBS from being used for all link targets
LIBS = $(BLANK_AT_MAKETIME)

VERSIONINFO=-version-info 10:0:6
# This flag accepts an argument of the form current[:revision[:age]]. So,
# passing -version-info 3:12:1 sets current to 3, revision to 12, and age to
# 1.
#
# Here's the simplified rule guide on how to change -version-info:
# (current version is C:R:A)
#
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
CHECKSRC = $(CS_$(V))
CS_0 = @echo "  RUN     " $@;
CS_1 =
CS_ = $(CS_0)

checksrc:
	$(CHECKSRC)(@PERL@ $(srcdir)/checksrc.pl -D$(srcdir) -W$(srcdir)/curl_config.h \
	$(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] $(srcdir)/vtls/*.[ch])

if CURLDEBUG
# for debug builds, we scan the sources on all regular make invokes
all-local: checksrc
endif

# disable the tests that are mostly causing false positives
TIDYFLAGS=-checks=-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-valist.Uninitialized,-clang-analyzer-core.NonNullParamChecker,-clang-analyzer-core.NullDereference -quiet

TIDY:=clang-tidy

tidy:
	$(TIDY) $(CSOURCES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H







|













134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
CHECKSRC = $(CS_$(V))
CS_0 = @echo "  RUN     " $@;
CS_1 =
CS_ = $(CS_0)

checksrc:
	$(CHECKSRC)(@PERL@ $(srcdir)/checksrc.pl -D$(srcdir) -W$(srcdir)/curl_config.h \
	$(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] $(srcdir)/vtls/*.[ch] $(srcdir)/vquic/*.[ch] $(srcdir)/vssh/*.[ch])

if CURLDEBUG
# for debug builds, we scan the sources on all regular make invokes
all-local: checksrc
endif

# disable the tests that are mostly causing false positives
TIDYFLAGS=-checks=-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-optin.performance.Padding,-clang-analyzer-valist.Uninitialized,-clang-analyzer-core.NonNullParamChecker,-clang-analyzer-core.NullDereference -quiet

TIDY:=clang-tidy

tidy:
	$(TIDY) $(CSOURCES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H
Changes to jni/curl/lib/Makefile.in.
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
	libcurl_la-http_negotiate.lo libcurl_la-inet_pton.lo \
	libcurl_la-strtoofft.lo libcurl_la-strerror.lo \
	libcurl_la-amigaos.lo libcurl_la-hostasyn.lo \
	libcurl_la-hostip4.lo libcurl_la-hostip6.lo \
	libcurl_la-hostsyn.lo libcurl_la-inet_ntop.lo \
	libcurl_la-parsedate.lo libcurl_la-select.lo \
	libcurl_la-tftp.lo libcurl_la-splay.lo libcurl_la-strdup.lo \
	libcurl_la-socks.lo libcurl_la-ssh.lo libcurl_la-ssh-libssh.lo \
	libcurl_la-curl_addrinfo.lo libcurl_la-socks_gssapi.lo \
	libcurl_la-socks_sspi.lo libcurl_la-curl_sspi.lo \
	libcurl_la-slist.lo libcurl_la-nonblock.lo \
	libcurl_la-curl_memrchr.lo libcurl_la-imap.lo \
	libcurl_la-pop3.lo libcurl_la-smtp.lo libcurl_la-pingpong.lo \
	libcurl_la-rtsp.lo libcurl_la-curl_threads.lo \
	libcurl_la-warnless.lo libcurl_la-hmac.lo \
	libcurl_la-curl_rtmp.lo libcurl_la-openldap.lo \
	libcurl_la-curl_gethostname.lo libcurl_la-gopher.lo \
	libcurl_la-idn_win32.lo libcurl_la-http_proxy.lo \
	libcurl_la-non-ascii.lo libcurl_la-asyn-ares.lo \
	libcurl_la-asyn-thread.lo libcurl_la-curl_gssapi.lo \
	libcurl_la-http_ntlm.lo libcurl_la-curl_ntlm_wb.lo \
	libcurl_la-curl_ntlm_core.lo libcurl_la-curl_sasl.lo \
	libcurl_la-rand.lo libcurl_la-curl_multibyte.lo \
	libcurl_la-hostcheck.lo libcurl_la-conncache.lo \
	libcurl_la-dotdot.lo libcurl_la-x509asn1.lo \
	libcurl_la-http2.lo libcurl_la-smb.lo \
	libcurl_la-curl_endian.lo libcurl_la-curl_des.lo \
	libcurl_la-system_win32.lo libcurl_la-mime.lo \
	libcurl_la-sha256.lo libcurl_la-setopt.lo \
	libcurl_la-curl_path.lo libcurl_la-curl_ctype.lo \
	libcurl_la-curl_range.lo libcurl_la-psl.lo libcurl_la-doh.lo \
	libcurl_la-urlapi.lo libcurl_la-curl_get_line.lo \
	libcurl_la-altsvc.lo







|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|







201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224

225
226
227
228
229
230
231
232
	libcurl_la-http_negotiate.lo libcurl_la-inet_pton.lo \
	libcurl_la-strtoofft.lo libcurl_la-strerror.lo \
	libcurl_la-amigaos.lo libcurl_la-hostasyn.lo \
	libcurl_la-hostip4.lo libcurl_la-hostip6.lo \
	libcurl_la-hostsyn.lo libcurl_la-inet_ntop.lo \
	libcurl_la-parsedate.lo libcurl_la-select.lo \
	libcurl_la-tftp.lo libcurl_la-splay.lo libcurl_la-strdup.lo \
	libcurl_la-socks.lo libcurl_la-curl_addrinfo.lo \
	libcurl_la-socks_gssapi.lo libcurl_la-socks_sspi.lo \
	libcurl_la-curl_sspi.lo libcurl_la-slist.lo \
	libcurl_la-nonblock.lo libcurl_la-curl_memrchr.lo \
	libcurl_la-imap.lo libcurl_la-pop3.lo libcurl_la-smtp.lo \
	libcurl_la-pingpong.lo libcurl_la-rtsp.lo \
	libcurl_la-curl_threads.lo libcurl_la-warnless.lo \
	libcurl_la-hmac.lo libcurl_la-curl_rtmp.lo \
	libcurl_la-openldap.lo libcurl_la-curl_gethostname.lo \
	libcurl_la-gopher.lo libcurl_la-idn_win32.lo \
	libcurl_la-http_proxy.lo libcurl_la-non-ascii.lo \
	libcurl_la-asyn-ares.lo libcurl_la-asyn-thread.lo \
	libcurl_la-curl_gssapi.lo libcurl_la-http_ntlm.lo \
	libcurl_la-curl_ntlm_wb.lo libcurl_la-curl_ntlm_core.lo \
	libcurl_la-curl_sasl.lo libcurl_la-rand.lo \
	libcurl_la-curl_multibyte.lo libcurl_la-hostcheck.lo \
	libcurl_la-conncache.lo libcurl_la-dotdot.lo \

	libcurl_la-x509asn1.lo libcurl_la-http2.lo libcurl_la-smb.lo \
	libcurl_la-curl_endian.lo libcurl_la-curl_des.lo \
	libcurl_la-system_win32.lo libcurl_la-mime.lo \
	libcurl_la-sha256.lo libcurl_la-setopt.lo \
	libcurl_la-curl_path.lo libcurl_la-curl_ctype.lo \
	libcurl_la-curl_range.lo libcurl_la-psl.lo libcurl_la-doh.lo \
	libcurl_la-urlapi.lo libcurl_la-curl_get_line.lo \
	libcurl_la-altsvc.lo
243
244
245
246
247
248
249


250

251

252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
	vtls/libcurl_la-vtls.lo vtls/libcurl_la-nss.lo \
	vtls/libcurl_la-polarssl.lo \
	vtls/libcurl_la-polarssl_threadlock.lo \
	vtls/libcurl_la-wolfssl.lo vtls/libcurl_la-schannel.lo \
	vtls/libcurl_la-schannel_verify.lo \
	vtls/libcurl_la-sectransp.lo vtls/libcurl_la-gskit.lo \
	vtls/libcurl_la-mbedtls.lo vtls/libcurl_la-mesalink.lo


am__objects_4 = $(am__objects_1) $(am__objects_2) $(am__objects_3)

am__objects_5 =

am__objects_6 = $(am__objects_5) $(am__objects_5) $(am__objects_5)
am_libcurl_la_OBJECTS = $(am__objects_4) $(am__objects_6)
libcurl_la_OBJECTS = $(am_libcurl_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
am__v_lt_1 = 
libcurl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcurl_la_CFLAGS) \
	$(CFLAGS) $(libcurl_la_LDFLAGS) $(LDFLAGS) -o $@
libcurlu_la_LIBADD =
am__objects_7 = libcurlu_la-file.lo libcurlu_la-timeval.lo \
	libcurlu_la-base64.lo libcurlu_la-hostip.lo \
	libcurlu_la-progress.lo libcurlu_la-formdata.lo \
	libcurlu_la-cookie.lo libcurlu_la-http.lo libcurlu_la-sendf.lo \
	libcurlu_la-ftp.lo libcurlu_la-url.lo libcurlu_la-dict.lo \
	libcurlu_la-if2ip.lo libcurlu_la-speedcheck.lo \
	libcurlu_la-ldap.lo libcurlu_la-version.lo \
	libcurlu_la-getenv.lo libcurlu_la-escape.lo \







>
>
|
>
|
>
|
|









|







242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
	vtls/libcurl_la-vtls.lo vtls/libcurl_la-nss.lo \
	vtls/libcurl_la-polarssl.lo \
	vtls/libcurl_la-polarssl_threadlock.lo \
	vtls/libcurl_la-wolfssl.lo vtls/libcurl_la-schannel.lo \
	vtls/libcurl_la-schannel_verify.lo \
	vtls/libcurl_la-sectransp.lo vtls/libcurl_la-gskit.lo \
	vtls/libcurl_la-mbedtls.lo vtls/libcurl_la-mesalink.lo
am__objects_4 = vquic/libcurl_la-ngtcp2.lo vquic/libcurl_la-quiche.lo
am__objects_5 = vssh/libcurl_la-libssh2.lo vssh/libcurl_la-libssh.lo
am__objects_6 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
	$(am__objects_4) $(am__objects_5)
am__objects_7 =
am__objects_8 = $(am__objects_7) $(am__objects_7) $(am__objects_7) \
	$(am__objects_7)
am_libcurl_la_OBJECTS = $(am__objects_6) $(am__objects_8)
libcurl_la_OBJECTS = $(am_libcurl_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
am__v_lt_0 = --silent
am__v_lt_1 = 
libcurl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcurl_la_CFLAGS) \
	$(CFLAGS) $(libcurl_la_LDFLAGS) $(LDFLAGS) -o $@
libcurlu_la_LIBADD =
am__objects_9 = libcurlu_la-file.lo libcurlu_la-timeval.lo \
	libcurlu_la-base64.lo libcurlu_la-hostip.lo \
	libcurlu_la-progress.lo libcurlu_la-formdata.lo \
	libcurlu_la-cookie.lo libcurlu_la-http.lo libcurlu_la-sendf.lo \
	libcurlu_la-ftp.lo libcurlu_la-url.lo libcurlu_la-dict.lo \
	libcurlu_la-if2ip.lo libcurlu_la-speedcheck.lo \
	libcurlu_la-ldap.lo libcurlu_la-version.lo \
	libcurlu_la-getenv.lo libcurlu_la-escape.lo \
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331





332
333
334
335
336
337
338
339
340
	libcurlu_la-md5.lo libcurlu_la-http_negotiate.lo \
	libcurlu_la-inet_pton.lo libcurlu_la-strtoofft.lo \
	libcurlu_la-strerror.lo libcurlu_la-amigaos.lo \
	libcurlu_la-hostasyn.lo libcurlu_la-hostip4.lo \
	libcurlu_la-hostip6.lo libcurlu_la-hostsyn.lo \
	libcurlu_la-inet_ntop.lo libcurlu_la-parsedate.lo \
	libcurlu_la-select.lo libcurlu_la-tftp.lo libcurlu_la-splay.lo \
	libcurlu_la-strdup.lo libcurlu_la-socks.lo libcurlu_la-ssh.lo \
	libcurlu_la-ssh-libssh.lo libcurlu_la-curl_addrinfo.lo \
	libcurlu_la-socks_gssapi.lo libcurlu_la-socks_sspi.lo \
	libcurlu_la-curl_sspi.lo libcurlu_la-slist.lo \
	libcurlu_la-nonblock.lo libcurlu_la-curl_memrchr.lo \
	libcurlu_la-imap.lo libcurlu_la-pop3.lo libcurlu_la-smtp.lo \
	libcurlu_la-pingpong.lo libcurlu_la-rtsp.lo \
	libcurlu_la-curl_threads.lo libcurlu_la-warnless.lo \
	libcurlu_la-hmac.lo libcurlu_la-curl_rtmp.lo \
	libcurlu_la-openldap.lo libcurlu_la-curl_gethostname.lo \
	libcurlu_la-gopher.lo libcurlu_la-idn_win32.lo \
	libcurlu_la-http_proxy.lo libcurlu_la-non-ascii.lo \
	libcurlu_la-asyn-ares.lo libcurlu_la-asyn-thread.lo \
	libcurlu_la-curl_gssapi.lo libcurlu_la-http_ntlm.lo \
	libcurlu_la-curl_ntlm_wb.lo libcurlu_la-curl_ntlm_core.lo \
	libcurlu_la-curl_sasl.lo libcurlu_la-rand.lo \
	libcurlu_la-curl_multibyte.lo libcurlu_la-hostcheck.lo \
	libcurlu_la-conncache.lo libcurlu_la-dotdot.lo \
	libcurlu_la-x509asn1.lo libcurlu_la-http2.lo \
	libcurlu_la-smb.lo libcurlu_la-curl_endian.lo \
	libcurlu_la-curl_des.lo libcurlu_la-system_win32.lo \
	libcurlu_la-mime.lo libcurlu_la-sha256.lo \
	libcurlu_la-setopt.lo libcurlu_la-curl_path.lo \
	libcurlu_la-curl_ctype.lo libcurlu_la-curl_range.lo \
	libcurlu_la-psl.lo libcurlu_la-doh.lo libcurlu_la-urlapi.lo \
	libcurlu_la-curl_get_line.lo libcurlu_la-altsvc.lo
am__objects_8 = vauth/libcurlu_la-vauth.lo \
	vauth/libcurlu_la-cleartext.lo vauth/libcurlu_la-cram.lo \
	vauth/libcurlu_la-digest.lo vauth/libcurlu_la-digest_sspi.lo \
	vauth/libcurlu_la-krb5_gssapi.lo \
	vauth/libcurlu_la-krb5_sspi.lo vauth/libcurlu_la-ntlm.lo \
	vauth/libcurlu_la-ntlm_sspi.lo vauth/libcurlu_la-oauth2.lo \
	vauth/libcurlu_la-spnego_gssapi.lo \
	vauth/libcurlu_la-spnego_sspi.lo
am__objects_9 = vtls/libcurlu_la-openssl.lo vtls/libcurlu_la-gtls.lo \
	vtls/libcurlu_la-vtls.lo vtls/libcurlu_la-nss.lo \
	vtls/libcurlu_la-polarssl.lo \
	vtls/libcurlu_la-polarssl_threadlock.lo \
	vtls/libcurlu_la-wolfssl.lo vtls/libcurlu_la-schannel.lo \
	vtls/libcurlu_la-schannel_verify.lo \
	vtls/libcurlu_la-sectransp.lo vtls/libcurlu_la-gskit.lo \
	vtls/libcurlu_la-mbedtls.lo vtls/libcurlu_la-mesalink.lo





am__objects_10 = $(am__objects_7) $(am__objects_8) $(am__objects_9)
am_libcurlu_la_OBJECTS = $(am__objects_10) $(am__objects_6)
libcurlu_la_OBJECTS = $(am_libcurlu_la_OBJECTS)
libcurlu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcurlu_la_CFLAGS) \
	$(CFLAGS) $(libcurlu_la_LDFLAGS) $(LDFLAGS) -o $@
@BUILD_UNITTESTS_TRUE@am_libcurlu_la_rpath =
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)







|
|
|
|
|
|




















|







|







>
>
>
>
>
|
|







286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
	libcurlu_la-md5.lo libcurlu_la-http_negotiate.lo \
	libcurlu_la-inet_pton.lo libcurlu_la-strtoofft.lo \
	libcurlu_la-strerror.lo libcurlu_la-amigaos.lo \
	libcurlu_la-hostasyn.lo libcurlu_la-hostip4.lo \
	libcurlu_la-hostip6.lo libcurlu_la-hostsyn.lo \
	libcurlu_la-inet_ntop.lo libcurlu_la-parsedate.lo \
	libcurlu_la-select.lo libcurlu_la-tftp.lo libcurlu_la-splay.lo \
	libcurlu_la-strdup.lo libcurlu_la-socks.lo \
	libcurlu_la-curl_addrinfo.lo libcurlu_la-socks_gssapi.lo \
	libcurlu_la-socks_sspi.lo libcurlu_la-curl_sspi.lo \
	libcurlu_la-slist.lo libcurlu_la-nonblock.lo \
	libcurlu_la-curl_memrchr.lo libcurlu_la-imap.lo \
	libcurlu_la-pop3.lo libcurlu_la-smtp.lo \
	libcurlu_la-pingpong.lo libcurlu_la-rtsp.lo \
	libcurlu_la-curl_threads.lo libcurlu_la-warnless.lo \
	libcurlu_la-hmac.lo libcurlu_la-curl_rtmp.lo \
	libcurlu_la-openldap.lo libcurlu_la-curl_gethostname.lo \
	libcurlu_la-gopher.lo libcurlu_la-idn_win32.lo \
	libcurlu_la-http_proxy.lo libcurlu_la-non-ascii.lo \
	libcurlu_la-asyn-ares.lo libcurlu_la-asyn-thread.lo \
	libcurlu_la-curl_gssapi.lo libcurlu_la-http_ntlm.lo \
	libcurlu_la-curl_ntlm_wb.lo libcurlu_la-curl_ntlm_core.lo \
	libcurlu_la-curl_sasl.lo libcurlu_la-rand.lo \
	libcurlu_la-curl_multibyte.lo libcurlu_la-hostcheck.lo \
	libcurlu_la-conncache.lo libcurlu_la-dotdot.lo \
	libcurlu_la-x509asn1.lo libcurlu_la-http2.lo \
	libcurlu_la-smb.lo libcurlu_la-curl_endian.lo \
	libcurlu_la-curl_des.lo libcurlu_la-system_win32.lo \
	libcurlu_la-mime.lo libcurlu_la-sha256.lo \
	libcurlu_la-setopt.lo libcurlu_la-curl_path.lo \
	libcurlu_la-curl_ctype.lo libcurlu_la-curl_range.lo \
	libcurlu_la-psl.lo libcurlu_la-doh.lo libcurlu_la-urlapi.lo \
	libcurlu_la-curl_get_line.lo libcurlu_la-altsvc.lo
am__objects_10 = vauth/libcurlu_la-vauth.lo \
	vauth/libcurlu_la-cleartext.lo vauth/libcurlu_la-cram.lo \
	vauth/libcurlu_la-digest.lo vauth/libcurlu_la-digest_sspi.lo \
	vauth/libcurlu_la-krb5_gssapi.lo \
	vauth/libcurlu_la-krb5_sspi.lo vauth/libcurlu_la-ntlm.lo \
	vauth/libcurlu_la-ntlm_sspi.lo vauth/libcurlu_la-oauth2.lo \
	vauth/libcurlu_la-spnego_gssapi.lo \
	vauth/libcurlu_la-spnego_sspi.lo
am__objects_11 = vtls/libcurlu_la-openssl.lo vtls/libcurlu_la-gtls.lo \
	vtls/libcurlu_la-vtls.lo vtls/libcurlu_la-nss.lo \
	vtls/libcurlu_la-polarssl.lo \
	vtls/libcurlu_la-polarssl_threadlock.lo \
	vtls/libcurlu_la-wolfssl.lo vtls/libcurlu_la-schannel.lo \
	vtls/libcurlu_la-schannel_verify.lo \
	vtls/libcurlu_la-sectransp.lo vtls/libcurlu_la-gskit.lo \
	vtls/libcurlu_la-mbedtls.lo vtls/libcurlu_la-mesalink.lo
am__objects_12 = vquic/libcurlu_la-ngtcp2.lo \
	vquic/libcurlu_la-quiche.lo
am__objects_13 = vssh/libcurlu_la-libssh2.lo \
	vssh/libcurlu_la-libssh.lo
am__objects_14 = $(am__objects_9) $(am__objects_10) $(am__objects_11) \
	$(am__objects_12) $(am__objects_13)
am_libcurlu_la_OBJECTS = $(am__objects_14) $(am__objects_8)
libcurlu_la_OBJECTS = $(am_libcurlu_la_OBJECTS)
libcurlu_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcurlu_la_CFLAGS) \
	$(CFLAGS) $(libcurlu_la_LDFLAGS) $(LDFLAGS) -o $@
@BUILD_UNITTESTS_TRUE@am_libcurlu_la_rpath =
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
	./$(DEPDIR)/libcurl_la-slist.Plo \
	./$(DEPDIR)/libcurl_la-smb.Plo ./$(DEPDIR)/libcurl_la-smtp.Plo \
	./$(DEPDIR)/libcurl_la-socks.Plo \
	./$(DEPDIR)/libcurl_la-socks_gssapi.Plo \
	./$(DEPDIR)/libcurl_la-socks_sspi.Plo \
	./$(DEPDIR)/libcurl_la-speedcheck.Plo \
	./$(DEPDIR)/libcurl_la-splay.Plo \
	./$(DEPDIR)/libcurl_la-ssh-libssh.Plo \
	./$(DEPDIR)/libcurl_la-ssh.Plo \
	./$(DEPDIR)/libcurl_la-strcase.Plo \
	./$(DEPDIR)/libcurl_la-strdup.Plo \
	./$(DEPDIR)/libcurl_la-strerror.Plo \
	./$(DEPDIR)/libcurl_la-strtok.Plo \
	./$(DEPDIR)/libcurl_la-strtoofft.Plo \
	./$(DEPDIR)/libcurl_la-system_win32.Plo \
	./$(DEPDIR)/libcurl_la-telnet.Plo \







<
<







445
446
447
448
449
450
451


452
453
454
455
456
457
458
	./$(DEPDIR)/libcurl_la-slist.Plo \
	./$(DEPDIR)/libcurl_la-smb.Plo ./$(DEPDIR)/libcurl_la-smtp.Plo \
	./$(DEPDIR)/libcurl_la-socks.Plo \
	./$(DEPDIR)/libcurl_la-socks_gssapi.Plo \
	./$(DEPDIR)/libcurl_la-socks_sspi.Plo \
	./$(DEPDIR)/libcurl_la-speedcheck.Plo \
	./$(DEPDIR)/libcurl_la-splay.Plo \


	./$(DEPDIR)/libcurl_la-strcase.Plo \
	./$(DEPDIR)/libcurl_la-strdup.Plo \
	./$(DEPDIR)/libcurl_la-strerror.Plo \
	./$(DEPDIR)/libcurl_la-strtok.Plo \
	./$(DEPDIR)/libcurl_la-strtoofft.Plo \
	./$(DEPDIR)/libcurl_la-system_win32.Plo \
	./$(DEPDIR)/libcurl_la-telnet.Plo \
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
	./$(DEPDIR)/libcurlu_la-smb.Plo \
	./$(DEPDIR)/libcurlu_la-smtp.Plo \
	./$(DEPDIR)/libcurlu_la-socks.Plo \
	./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo \
	./$(DEPDIR)/libcurlu_la-socks_sspi.Plo \
	./$(DEPDIR)/libcurlu_la-speedcheck.Plo \
	./$(DEPDIR)/libcurlu_la-splay.Plo \
	./$(DEPDIR)/libcurlu_la-ssh-libssh.Plo \
	./$(DEPDIR)/libcurlu_la-ssh.Plo \
	./$(DEPDIR)/libcurlu_la-strcase.Plo \
	./$(DEPDIR)/libcurlu_la-strdup.Plo \
	./$(DEPDIR)/libcurlu_la-strerror.Plo \
	./$(DEPDIR)/libcurlu_la-strtok.Plo \
	./$(DEPDIR)/libcurlu_la-strtoofft.Plo \
	./$(DEPDIR)/libcurlu_la-system_win32.Plo \
	./$(DEPDIR)/libcurlu_la-telnet.Plo \







<
<







555
556
557
558
559
560
561


562
563
564
565
566
567
568
	./$(DEPDIR)/libcurlu_la-smb.Plo \
	./$(DEPDIR)/libcurlu_la-smtp.Plo \
	./$(DEPDIR)/libcurlu_la-socks.Plo \
	./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo \
	./$(DEPDIR)/libcurlu_la-socks_sspi.Plo \
	./$(DEPDIR)/libcurlu_la-speedcheck.Plo \
	./$(DEPDIR)/libcurlu_la-splay.Plo \


	./$(DEPDIR)/libcurlu_la-strcase.Plo \
	./$(DEPDIR)/libcurlu_la-strdup.Plo \
	./$(DEPDIR)/libcurlu_la-strerror.Plo \
	./$(DEPDIR)/libcurlu_la-strtok.Plo \
	./$(DEPDIR)/libcurlu_la-strtoofft.Plo \
	./$(DEPDIR)/libcurlu_la-system_win32.Plo \
	./$(DEPDIR)/libcurlu_la-telnet.Plo \
591
592
593
594
595
596
597








598
599
600
601
602
603
604
	vauth/$(DEPDIR)/libcurlu_la-krb5_sspi.Plo \
	vauth/$(DEPDIR)/libcurlu_la-ntlm.Plo \
	vauth/$(DEPDIR)/libcurlu_la-ntlm_sspi.Plo \
	vauth/$(DEPDIR)/libcurlu_la-oauth2.Plo \
	vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo \
	vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo \
	vauth/$(DEPDIR)/libcurlu_la-vauth.Plo \








	vtls/$(DEPDIR)/libcurl_la-gskit.Plo \
	vtls/$(DEPDIR)/libcurl_la-gtls.Plo \
	vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo \
	vtls/$(DEPDIR)/libcurl_la-mesalink.Plo \
	vtls/$(DEPDIR)/libcurl_la-nss.Plo \
	vtls/$(DEPDIR)/libcurl_la-openssl.Plo \
	vtls/$(DEPDIR)/libcurl_la-polarssl.Plo \







>
>
>
>
>
>
>
>







595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
	vauth/$(DEPDIR)/libcurlu_la-krb5_sspi.Plo \
	vauth/$(DEPDIR)/libcurlu_la-ntlm.Plo \
	vauth/$(DEPDIR)/libcurlu_la-ntlm_sspi.Plo \
	vauth/$(DEPDIR)/libcurlu_la-oauth2.Plo \
	vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo \
	vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo \
	vauth/$(DEPDIR)/libcurlu_la-vauth.Plo \
	vquic/$(DEPDIR)/libcurl_la-ngtcp2.Plo \
	vquic/$(DEPDIR)/libcurl_la-quiche.Plo \
	vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Plo \
	vquic/$(DEPDIR)/libcurlu_la-quiche.Plo \
	vssh/$(DEPDIR)/libcurl_la-libssh.Plo \
	vssh/$(DEPDIR)/libcurl_la-libssh2.Plo \
	vssh/$(DEPDIR)/libcurlu_la-libssh.Plo \
	vssh/$(DEPDIR)/libcurlu_la-libssh2.Plo \
	vtls/$(DEPDIR)/libcurl_la-gskit.Plo \
	vtls/$(DEPDIR)/libcurl_la-gtls.Plo \
	vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo \
	vtls/$(DEPDIR)/libcurl_la-mesalink.Plo \
	vtls/$(DEPDIR)/libcurl_la-nss.Plo \
	vtls/$(DEPDIR)/libcurl_la-openssl.Plo \
	vtls/$(DEPDIR)/libcurl_la-polarssl.Plo \
804
805
806
807
808
809
810



811
812

813
814
815
816
817
818
819
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################
AUTOMAKE_OPTIONS = foreign nostdinc
CMAKE_DIST = CMakeLists.txt curl_config.h.cmake
EXTRA_DIST = Makefile.m32 config-win32.h                            \
 config-win32ce.h config-riscos.h config-mac.h curl_config.h.in     \
 makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \
 makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h    \
 config-os400.h setup-os400.h config-symbian.h Makefile.Watcom      \
 config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST)        \
 firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl

lib_LTLIBRARIES = libcurl.la







|
|







910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################
AUTOMAKE_OPTIONS = foreign nostdinc
CMAKE_DIST = CMakeLists.txt curl_config.h.cmake
EXTRA_DIST = Makefile.m32 config-win32.h config-win32ce.h           \
 config-plan9.h config-riscos.h config-mac.h curl_config.h.in       \
 makefile.dj config-dos.h libcurl.plist libcurl.rc config-amigaos.h \
 makefile.amiga Makefile.netware nwlib.c nwos.c config-win32ce.h    \
 config-os400.h setup-os400.h config-symbian.h Makefile.Watcom      \
 config-tpf.h mk-ca-bundle.pl mk-ca-bundle.vbs $(CMAKE_DIST)        \
 firefox-db2pem.sh config-vxworks.h Makefile.vxworks checksrc.pl

lib_LTLIBRARIES = libcurl.la
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
# 1. if there are only source changes, use C:R+1:A
# 2. if interfaces were added use C+1:0:A+1
# 3. if interfaces were removed, then use C+1:0:0
#
# For the full guide on libcurl ABI rules, see docs/libcurl/ABI
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/lib \
	-I$(top_srcdir)/lib $(am__append_1) -DBUILDING_LIBCURL
VERSIONINFO = -version-info 9:0:5
AM_LDFLAGS = 
AM_CFLAGS = 
libcurl_la_CPPFLAGS_EXTRA = $(am__append_7) $(am__append_8)
libcurl_la_LDFLAGS_EXTRA = $(am__append_2) $(am__append_3) \
	$(am__append_4) $(am__append_5) $(am__append_6)
libcurl_la_CFLAGS_EXTRA = $(am__append_9)
libcurl_la_CPPFLAGS = $(AM_CPPFLAGS) $(libcurl_la_CPPFLAGS_EXTRA)







|







946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
# 1. if there are only source changes, use C:R+1:A
# 2. if interfaces were added use C+1:0:A+1
# 3. if interfaces were removed, then use C+1:0:0
#
# For the full guide on libcurl ABI rules, see docs/libcurl/ABI
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/lib \
	-I$(top_srcdir)/lib $(am__append_1) -DBUILDING_LIBCURL
VERSIONINFO = -version-info 10:0:6
AM_LDFLAGS = 
AM_CFLAGS = 
libcurl_la_CPPFLAGS_EXTRA = $(am__append_7) $(am__append_8)
libcurl_la_LDFLAGS_EXTRA = $(am__append_2) $(am__append_3) \
	$(am__append_4) $(am__append_5) $(am__append_6)
libcurl_la_CFLAGS_EXTRA = $(am__append_9)
libcurl_la_CPPFLAGS = $(AM_CPPFLAGS) $(libcurl_la_CPPFLAGS_EXTRA)
959
960
961
962
963
964
965



966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
  vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c

LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h                \
  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h                \
  vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h          \
  vtls/mbedtls.h vtls/mesalink.h




LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
  cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c       \
  ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c         \
  getinfo.c transfer.c strcase.c easy.c security.c curl_fnmatch.c       \
  fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c \
  strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c  \
  http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c    \
  strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c         \
  inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c      \
  ssh.c ssh-libssh.c curl_addrinfo.c socks_gssapi.c socks_sspi.c        \
  curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c    \
  pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c        \
  openldap.c curl_gethostname.c gopher.c idn_win32.c                    \
  http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c      \
  http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c        \
  curl_multibyte.c hostcheck.c conncache.c dotdot.c                     \
  x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c      \







>
>
>









|







975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
  vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c

LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h                \
  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h                \
  vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h          \
  vtls/mbedtls.h vtls/mesalink.h

LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c
LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h
LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c
LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
  cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c       \
  ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c         \
  getinfo.c transfer.c strcase.c easy.c security.c curl_fnmatch.c       \
  fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c \
  strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c  \
  http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c    \
  strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c         \
  inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c      \
  curl_addrinfo.c socks_gssapi.c socks_sspi.c                           \
  curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c    \
  pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c        \
  openldap.c curl_gethostname.c gopher.c idn_win32.c                    \
  http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c      \
  http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c        \
  curl_multibyte.c hostcheck.c conncache.c dotdot.c                     \
  x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c      \
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008


1009


1010
1011
1012
1013
1014
1015
1016
  curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h           \
  http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h             \
  curl_sasl.h curl_multibyte.h hostcheck.h conncache.h                  \
  curl_setup_once.h multihandle.h setup-vms.h dotdot.h                  \
  x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h           \
  curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h     \
  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h        \
  curl_get_line.h altsvc.h

LIB_RCFILES = libcurl.rc
CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES)


HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES)



# Makefile.inc provides the CSOURCES and HHEADERS defines
libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS)
libcurlu_la_SOURCES = $(CSOURCES) $(HHEADERS)
CHECKSRC = $(CS_$(V))
CS_0 = @echo "  RUN     " $@;
CS_1 = 







|


|
>
>
|
>
>







1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
  curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h           \
  http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h             \
  curl_sasl.h curl_multibyte.h hostcheck.h conncache.h                  \
  curl_setup_once.h multihandle.h setup-vms.h dotdot.h                  \
  x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h           \
  curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h     \
  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h        \
  curl_get_line.h altsvc.h quic.h

LIB_RCFILES = libcurl.rc
CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES) \
  $(LIB_VQUIC_CFILES) $(LIB_VSSH_CFILES)

HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES) \
  $(LIB_VQUIC_HFILES)


# Makefile.inc provides the CSOURCES and HHEADERS defines
libcurl_la_SOURCES = $(CSOURCES) $(HHEADERS)
libcurlu_la_SOURCES = $(CSOURCES) $(HHEADERS)
CHECKSRC = $(CS_$(V))
CS_0 = @echo "  RUN     " $@;
CS_1 = 
1175
1176
1177
1178
1179
1180
1181




















1182
1183
1184
1185
1186
1187
1188
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurl_la-gskit.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurl_la-mbedtls.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurl_la-mesalink.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)





















libcurl.la: $(libcurl_la_OBJECTS) $(libcurl_la_DEPENDENCIES) $(EXTRA_libcurl_la_DEPENDENCIES) 
	$(AM_V_CCLD)$(libcurl_la_LINK) -rpath $(libdir) $(libcurl_la_OBJECTS) $(libcurl_la_LIBADD) $(LIBS)
vauth/libcurlu_la-vauth.lo: vauth/$(am__dirstamp) \
	vauth/$(DEPDIR)/$(am__dirstamp)
vauth/libcurlu_la-cleartext.lo: vauth/$(am__dirstamp) \
	vauth/$(DEPDIR)/$(am__dirstamp)







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurl_la-gskit.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurl_la-mbedtls.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurl_la-mesalink.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)
vquic/$(am__dirstamp):
	@$(MKDIR_P) vquic
	@: > vquic/$(am__dirstamp)
vquic/$(DEPDIR)/$(am__dirstamp):
	@$(MKDIR_P) vquic/$(DEPDIR)
	@: > vquic/$(DEPDIR)/$(am__dirstamp)
vquic/libcurl_la-ngtcp2.lo: vquic/$(am__dirstamp) \
	vquic/$(DEPDIR)/$(am__dirstamp)
vquic/libcurl_la-quiche.lo: vquic/$(am__dirstamp) \
	vquic/$(DEPDIR)/$(am__dirstamp)
vssh/$(am__dirstamp):
	@$(MKDIR_P) vssh
	@: > vssh/$(am__dirstamp)
vssh/$(DEPDIR)/$(am__dirstamp):
	@$(MKDIR_P) vssh/$(DEPDIR)
	@: > vssh/$(DEPDIR)/$(am__dirstamp)
vssh/libcurl_la-libssh2.lo: vssh/$(am__dirstamp) \
	vssh/$(DEPDIR)/$(am__dirstamp)
vssh/libcurl_la-libssh.lo: vssh/$(am__dirstamp) \
	vssh/$(DEPDIR)/$(am__dirstamp)

libcurl.la: $(libcurl_la_OBJECTS) $(libcurl_la_DEPENDENCIES) $(EXTRA_libcurl_la_DEPENDENCIES) 
	$(AM_V_CCLD)$(libcurl_la_LINK) -rpath $(libdir) $(libcurl_la_OBJECTS) $(libcurl_la_LIBADD) $(LIBS)
vauth/libcurlu_la-vauth.lo: vauth/$(am__dirstamp) \
	vauth/$(DEPDIR)/$(am__dirstamp)
vauth/libcurlu_la-cleartext.lo: vauth/$(am__dirstamp) \
	vauth/$(DEPDIR)/$(am__dirstamp)
1228
1229
1230
1231
1232
1233
1234








1235
1236
1237
1238
1239
1240
1241
1242




1243
1244
1245
1246
1247
1248
1249
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurlu_la-gskit.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurlu_la-mbedtls.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurlu_la-mesalink.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)









libcurlu.la: $(libcurlu_la_OBJECTS) $(libcurlu_la_DEPENDENCIES) $(EXTRA_libcurlu_la_DEPENDENCIES) 
	$(AM_V_CCLD)$(libcurlu_la_LINK) $(am_libcurlu_la_rpath) $(libcurlu_la_OBJECTS) $(libcurlu_la_LIBADD) $(LIBS)

mostlyclean-compile:
	-rm -f *.$(OBJEXT)
	-rm -f vauth/*.$(OBJEXT)
	-rm -f vauth/*.lo




	-rm -f vtls/*.$(OBJEXT)
	-rm -f vtls/*.lo

distclean-compile:
	-rm -f *.tab.c

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-altsvc.Plo@am__quote@ # am--include-marker







>
>
>
>
>
>
>
>








>
>
>
>







1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurlu_la-gskit.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurlu_la-mbedtls.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)
vtls/libcurlu_la-mesalink.lo: vtls/$(am__dirstamp) \
	vtls/$(DEPDIR)/$(am__dirstamp)
vquic/libcurlu_la-ngtcp2.lo: vquic/$(am__dirstamp) \
	vquic/$(DEPDIR)/$(am__dirstamp)
vquic/libcurlu_la-quiche.lo: vquic/$(am__dirstamp) \
	vquic/$(DEPDIR)/$(am__dirstamp)
vssh/libcurlu_la-libssh2.lo: vssh/$(am__dirstamp) \
	vssh/$(DEPDIR)/$(am__dirstamp)
vssh/libcurlu_la-libssh.lo: vssh/$(am__dirstamp) \
	vssh/$(DEPDIR)/$(am__dirstamp)

libcurlu.la: $(libcurlu_la_OBJECTS) $(libcurlu_la_DEPENDENCIES) $(EXTRA_libcurlu_la_DEPENDENCIES) 
	$(AM_V_CCLD)$(libcurlu_la_LINK) $(am_libcurlu_la_rpath) $(libcurlu_la_OBJECTS) $(libcurlu_la_LIBADD) $(LIBS)

mostlyclean-compile:
	-rm -f *.$(OBJEXT)
	-rm -f vauth/*.$(OBJEXT)
	-rm -f vauth/*.lo
	-rm -f vquic/*.$(OBJEXT)
	-rm -f vquic/*.lo
	-rm -f vssh/*.$(OBJEXT)
	-rm -f vssh/*.lo
	-rm -f vtls/*.$(OBJEXT)
	-rm -f vtls/*.lo

distclean-compile:
	-rm -f *.tab.c

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-altsvc.Plo@am__quote@ # am--include-marker
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-smb.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-smtp.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks_gssapi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks_sspi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-speedcheck.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-splay.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-ssh-libssh.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-ssh.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strcase.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strdup.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strerror.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strtok.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strtoofft.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-system_win32.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-telnet.Plo@am__quote@ # am--include-marker







<
<







1391
1392
1393
1394
1395
1396
1397


1398
1399
1400
1401
1402
1403
1404
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-smb.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-smtp.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks_gssapi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-socks_sspi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-speedcheck.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-splay.Plo@am__quote@ # am--include-marker


@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strcase.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strdup.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strerror.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strtok.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-strtoofft.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-system_win32.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurl_la-telnet.Plo@am__quote@ # am--include-marker
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-smb.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-smtp.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks_sspi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-speedcheck.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-splay.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-ssh-libssh.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-ssh.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strcase.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strdup.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strerror.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strtok.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strtoofft.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-system_win32.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-telnet.Plo@am__quote@ # am--include-marker







<
<







1501
1502
1503
1504
1505
1506
1507


1508
1509
1510
1511
1512
1513
1514
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-smb.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-smtp.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-socks_sspi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-speedcheck.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-splay.Plo@am__quote@ # am--include-marker


@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strcase.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strdup.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strerror.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strtok.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-strtoofft.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-system_win32.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurlu_la-telnet.Plo@am__quote@ # am--include-marker
1490
1491
1492
1493
1494
1495
1496








1497
1498
1499
1500
1501
1502
1503
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-krb5_sspi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-ntlm.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-ntlm_sspi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-oauth2.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-vauth.Plo@am__quote@ # am--include-marker








@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-gskit.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-gtls.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-mesalink.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-nss.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-openssl.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-polarssl.Plo@am__quote@ # am--include-marker







>
>
>
>
>
>
>
>







1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-krb5_sspi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-ntlm.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-ntlm_sspi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-oauth2.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vauth/$(DEPDIR)/libcurlu_la-vauth.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vquic/$(DEPDIR)/libcurl_la-ngtcp2.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vquic/$(DEPDIR)/libcurl_la-quiche.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vquic/$(DEPDIR)/libcurlu_la-quiche.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vssh/$(DEPDIR)/libcurl_la-libssh.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vssh/$(DEPDIR)/libcurl_la-libssh2.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vssh/$(DEPDIR)/libcurlu_la-libssh.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vssh/$(DEPDIR)/libcurlu_la-libssh2.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-gskit.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-gtls.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-mesalink.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-nss.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-openssl.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@vtls/$(DEPDIR)/libcurl_la-polarssl.Plo@am__quote@ # am--include-marker
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
libcurl_la-socks.lo: socks.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-socks.lo -MD -MP -MF $(DEPDIR)/libcurl_la-socks.Tpo -c -o libcurl_la-socks.lo `test -f 'socks.c' || echo '$(srcdir)/'`socks.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-socks.Tpo $(DEPDIR)/libcurl_la-socks.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='socks.c' object='libcurl_la-socks.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-socks.lo `test -f 'socks.c' || echo '$(srcdir)/'`socks.c

libcurl_la-ssh.lo: ssh.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-ssh.lo -MD -MP -MF $(DEPDIR)/libcurl_la-ssh.Tpo -c -o libcurl_la-ssh.lo `test -f 'ssh.c' || echo '$(srcdir)/'`ssh.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-ssh.Tpo $(DEPDIR)/libcurl_la-ssh.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ssh.c' object='libcurl_la-ssh.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-ssh.lo `test -f 'ssh.c' || echo '$(srcdir)/'`ssh.c

libcurl_la-ssh-libssh.lo: ssh-libssh.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-ssh-libssh.lo -MD -MP -MF $(DEPDIR)/libcurl_la-ssh-libssh.Tpo -c -o libcurl_la-ssh-libssh.lo `test -f 'ssh-libssh.c' || echo '$(srcdir)/'`ssh-libssh.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-ssh-libssh.Tpo $(DEPDIR)/libcurl_la-ssh-libssh.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ssh-libssh.c' object='libcurl_la-ssh-libssh.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-ssh-libssh.lo `test -f 'ssh-libssh.c' || echo '$(srcdir)/'`ssh-libssh.c

libcurl_la-curl_addrinfo.lo: curl_addrinfo.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_addrinfo.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_addrinfo.Tpo -c -o libcurl_la-curl_addrinfo.lo `test -f 'curl_addrinfo.c' || echo '$(srcdir)/'`curl_addrinfo.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_addrinfo.Tpo $(DEPDIR)/libcurl_la-curl_addrinfo.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='curl_addrinfo.c' object='libcurl_la-curl_addrinfo.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-curl_addrinfo.lo `test -f 'curl_addrinfo.c' || echo '$(srcdir)/'`curl_addrinfo.c








<
<
<
<
<
<
<
<
<
<
<
<
<
<







2019
2020
2021
2022
2023
2024
2025














2026
2027
2028
2029
2030
2031
2032
libcurl_la-socks.lo: socks.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-socks.lo -MD -MP -MF $(DEPDIR)/libcurl_la-socks.Tpo -c -o libcurl_la-socks.lo `test -f 'socks.c' || echo '$(srcdir)/'`socks.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-socks.Tpo $(DEPDIR)/libcurl_la-socks.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='socks.c' object='libcurl_la-socks.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-socks.lo `test -f 'socks.c' || echo '$(srcdir)/'`socks.c















libcurl_la-curl_addrinfo.lo: curl_addrinfo.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT libcurl_la-curl_addrinfo.lo -MD -MP -MF $(DEPDIR)/libcurl_la-curl_addrinfo.Tpo -c -o libcurl_la-curl_addrinfo.lo `test -f 'curl_addrinfo.c' || echo '$(srcdir)/'`curl_addrinfo.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurl_la-curl_addrinfo.Tpo $(DEPDIR)/libcurl_la-curl_addrinfo.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='curl_addrinfo.c' object='libcurl_la-curl_addrinfo.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o libcurl_la-curl_addrinfo.lo `test -f 'curl_addrinfo.c' || echo '$(srcdir)/'`curl_addrinfo.c

2506
2507
2508
2509
2510
2511
2512




























2513
2514
2515
2516
2517
2518
2519
vtls/libcurl_la-mesalink.lo: vtls/mesalink.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-mesalink.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-mesalink.Tpo -c -o vtls/libcurl_la-mesalink.lo `test -f 'vtls/mesalink.c' || echo '$(srcdir)/'`vtls/mesalink.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-mesalink.Tpo vtls/$(DEPDIR)/libcurl_la-mesalink.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vtls/mesalink.c' object='vtls/libcurl_la-mesalink.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-mesalink.lo `test -f 'vtls/mesalink.c' || echo '$(srcdir)/'`vtls/mesalink.c





























libcurlu_la-file.lo: file.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-file.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-file.Tpo -c -o libcurlu_la-file.lo `test -f 'file.c' || echo '$(srcdir)/'`file.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-file.Tpo $(DEPDIR)/libcurlu_la-file.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='file.c' object='libcurlu_la-file.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-file.lo `test -f 'file.c' || echo '$(srcdir)/'`file.c








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
vtls/libcurl_la-mesalink.lo: vtls/mesalink.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vtls/libcurl_la-mesalink.lo -MD -MP -MF vtls/$(DEPDIR)/libcurl_la-mesalink.Tpo -c -o vtls/libcurl_la-mesalink.lo `test -f 'vtls/mesalink.c' || echo '$(srcdir)/'`vtls/mesalink.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurl_la-mesalink.Tpo vtls/$(DEPDIR)/libcurl_la-mesalink.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vtls/mesalink.c' object='vtls/libcurl_la-mesalink.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurl_la-mesalink.lo `test -f 'vtls/mesalink.c' || echo '$(srcdir)/'`vtls/mesalink.c

vquic/libcurl_la-ngtcp2.lo: vquic/ngtcp2.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vquic/libcurl_la-ngtcp2.lo -MD -MP -MF vquic/$(DEPDIR)/libcurl_la-ngtcp2.Tpo -c -o vquic/libcurl_la-ngtcp2.lo `test -f 'vquic/ngtcp2.c' || echo '$(srcdir)/'`vquic/ngtcp2.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vquic/$(DEPDIR)/libcurl_la-ngtcp2.Tpo vquic/$(DEPDIR)/libcurl_la-ngtcp2.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vquic/ngtcp2.c' object='vquic/libcurl_la-ngtcp2.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vquic/libcurl_la-ngtcp2.lo `test -f 'vquic/ngtcp2.c' || echo '$(srcdir)/'`vquic/ngtcp2.c

vquic/libcurl_la-quiche.lo: vquic/quiche.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vquic/libcurl_la-quiche.lo -MD -MP -MF vquic/$(DEPDIR)/libcurl_la-quiche.Tpo -c -o vquic/libcurl_la-quiche.lo `test -f 'vquic/quiche.c' || echo '$(srcdir)/'`vquic/quiche.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vquic/$(DEPDIR)/libcurl_la-quiche.Tpo vquic/$(DEPDIR)/libcurl_la-quiche.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vquic/quiche.c' object='vquic/libcurl_la-quiche.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vquic/libcurl_la-quiche.lo `test -f 'vquic/quiche.c' || echo '$(srcdir)/'`vquic/quiche.c

vssh/libcurl_la-libssh2.lo: vssh/libssh2.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vssh/libcurl_la-libssh2.lo -MD -MP -MF vssh/$(DEPDIR)/libcurl_la-libssh2.Tpo -c -o vssh/libcurl_la-libssh2.lo `test -f 'vssh/libssh2.c' || echo '$(srcdir)/'`vssh/libssh2.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vssh/$(DEPDIR)/libcurl_la-libssh2.Tpo vssh/$(DEPDIR)/libcurl_la-libssh2.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vssh/libssh2.c' object='vssh/libcurl_la-libssh2.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vssh/libcurl_la-libssh2.lo `test -f 'vssh/libssh2.c' || echo '$(srcdir)/'`vssh/libssh2.c

vssh/libcurl_la-libssh.lo: vssh/libssh.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -MT vssh/libcurl_la-libssh.lo -MD -MP -MF vssh/$(DEPDIR)/libcurl_la-libssh.Tpo -c -o vssh/libcurl_la-libssh.lo `test -f 'vssh/libssh.c' || echo '$(srcdir)/'`vssh/libssh.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vssh/$(DEPDIR)/libcurl_la-libssh.Tpo vssh/$(DEPDIR)/libcurl_la-libssh.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vssh/libssh.c' object='vssh/libcurl_la-libssh.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurl_la_CPPFLAGS) $(CPPFLAGS) $(libcurl_la_CFLAGS) $(CFLAGS) -c -o vssh/libcurl_la-libssh.lo `test -f 'vssh/libssh.c' || echo '$(srcdir)/'`vssh/libssh.c

libcurlu_la-file.lo: file.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-file.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-file.Tpo -c -o libcurlu_la-file.lo `test -f 'file.c' || echo '$(srcdir)/'`file.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-file.Tpo $(DEPDIR)/libcurlu_la-file.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='file.c' object='libcurlu_la-file.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-file.lo `test -f 'file.c' || echo '$(srcdir)/'`file.c

2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
libcurlu_la-socks.lo: socks.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-socks.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-socks.Tpo -c -o libcurlu_la-socks.lo `test -f 'socks.c' || echo '$(srcdir)/'`socks.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-socks.Tpo $(DEPDIR)/libcurlu_la-socks.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='socks.c' object='libcurlu_la-socks.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-socks.lo `test -f 'socks.c' || echo '$(srcdir)/'`socks.c

libcurlu_la-ssh.lo: ssh.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-ssh.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-ssh.Tpo -c -o libcurlu_la-ssh.lo `test -f 'ssh.c' || echo '$(srcdir)/'`ssh.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-ssh.Tpo $(DEPDIR)/libcurlu_la-ssh.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ssh.c' object='libcurlu_la-ssh.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-ssh.lo `test -f 'ssh.c' || echo '$(srcdir)/'`ssh.c

libcurlu_la-ssh-libssh.lo: ssh-libssh.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-ssh-libssh.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-ssh-libssh.Tpo -c -o libcurlu_la-ssh-libssh.lo `test -f 'ssh-libssh.c' || echo '$(srcdir)/'`ssh-libssh.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-ssh-libssh.Tpo $(DEPDIR)/libcurlu_la-ssh-libssh.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ssh-libssh.c' object='libcurlu_la-ssh-libssh.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-ssh-libssh.lo `test -f 'ssh-libssh.c' || echo '$(srcdir)/'`ssh-libssh.c

libcurlu_la-curl_addrinfo.lo: curl_addrinfo.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_addrinfo.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_addrinfo.Tpo -c -o libcurlu_la-curl_addrinfo.lo `test -f 'curl_addrinfo.c' || echo '$(srcdir)/'`curl_addrinfo.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_addrinfo.Tpo $(DEPDIR)/libcurlu_la-curl_addrinfo.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='curl_addrinfo.c' object='libcurlu_la-curl_addrinfo.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-curl_addrinfo.lo `test -f 'curl_addrinfo.c' || echo '$(srcdir)/'`curl_addrinfo.c








<
<
<
<
<
<
<
<
<
<
<
<
<
<







2992
2993
2994
2995
2996
2997
2998














2999
3000
3001
3002
3003
3004
3005
libcurlu_la-socks.lo: socks.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-socks.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-socks.Tpo -c -o libcurlu_la-socks.lo `test -f 'socks.c' || echo '$(srcdir)/'`socks.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-socks.Tpo $(DEPDIR)/libcurlu_la-socks.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='socks.c' object='libcurlu_la-socks.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-socks.lo `test -f 'socks.c' || echo '$(srcdir)/'`socks.c















libcurlu_la-curl_addrinfo.lo: curl_addrinfo.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT libcurlu_la-curl_addrinfo.lo -MD -MP -MF $(DEPDIR)/libcurlu_la-curl_addrinfo.Tpo -c -o libcurlu_la-curl_addrinfo.lo `test -f 'curl_addrinfo.c' || echo '$(srcdir)/'`curl_addrinfo.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurlu_la-curl_addrinfo.Tpo $(DEPDIR)/libcurlu_la-curl_addrinfo.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='curl_addrinfo.c' object='libcurlu_la-curl_addrinfo.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o libcurlu_la-curl_addrinfo.lo `test -f 'curl_addrinfo.c' || echo '$(srcdir)/'`curl_addrinfo.c

3465
3466
3467
3468
3469
3470
3471




























3472
3473
3474
3475
3476
3477


3478
3479
3480
3481
3482
3483
3484
vtls/libcurlu_la-mesalink.lo: vtls/mesalink.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-mesalink.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-mesalink.Tpo -c -o vtls/libcurlu_la-mesalink.lo `test -f 'vtls/mesalink.c' || echo '$(srcdir)/'`vtls/mesalink.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-mesalink.Tpo vtls/$(DEPDIR)/libcurlu_la-mesalink.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vtls/mesalink.c' object='vtls/libcurlu_la-mesalink.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-mesalink.lo `test -f 'vtls/mesalink.c' || echo '$(srcdir)/'`vtls/mesalink.c





























mostlyclean-libtool:
	-rm -f *.lo

clean-libtool:
	-rm -rf .libs _libs
	-rm -rf vauth/.libs vauth/_libs


	-rm -rf vtls/.libs vtls/_libs

ID: $(am__tagged_files)
	$(am__define_uniq_tagged_files); mkid -fID $$unique
tags: tags-am
TAGS: tags








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>






>
>







3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
vtls/libcurlu_la-mesalink.lo: vtls/mesalink.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vtls/libcurlu_la-mesalink.lo -MD -MP -MF vtls/$(DEPDIR)/libcurlu_la-mesalink.Tpo -c -o vtls/libcurlu_la-mesalink.lo `test -f 'vtls/mesalink.c' || echo '$(srcdir)/'`vtls/mesalink.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vtls/$(DEPDIR)/libcurlu_la-mesalink.Tpo vtls/$(DEPDIR)/libcurlu_la-mesalink.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vtls/mesalink.c' object='vtls/libcurlu_la-mesalink.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vtls/libcurlu_la-mesalink.lo `test -f 'vtls/mesalink.c' || echo '$(srcdir)/'`vtls/mesalink.c

vquic/libcurlu_la-ngtcp2.lo: vquic/ngtcp2.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vquic/libcurlu_la-ngtcp2.lo -MD -MP -MF vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Tpo -c -o vquic/libcurlu_la-ngtcp2.lo `test -f 'vquic/ngtcp2.c' || echo '$(srcdir)/'`vquic/ngtcp2.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Tpo vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vquic/ngtcp2.c' object='vquic/libcurlu_la-ngtcp2.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vquic/libcurlu_la-ngtcp2.lo `test -f 'vquic/ngtcp2.c' || echo '$(srcdir)/'`vquic/ngtcp2.c

vquic/libcurlu_la-quiche.lo: vquic/quiche.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vquic/libcurlu_la-quiche.lo -MD -MP -MF vquic/$(DEPDIR)/libcurlu_la-quiche.Tpo -c -o vquic/libcurlu_la-quiche.lo `test -f 'vquic/quiche.c' || echo '$(srcdir)/'`vquic/quiche.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vquic/$(DEPDIR)/libcurlu_la-quiche.Tpo vquic/$(DEPDIR)/libcurlu_la-quiche.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vquic/quiche.c' object='vquic/libcurlu_la-quiche.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vquic/libcurlu_la-quiche.lo `test -f 'vquic/quiche.c' || echo '$(srcdir)/'`vquic/quiche.c

vssh/libcurlu_la-libssh2.lo: vssh/libssh2.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vssh/libcurlu_la-libssh2.lo -MD -MP -MF vssh/$(DEPDIR)/libcurlu_la-libssh2.Tpo -c -o vssh/libcurlu_la-libssh2.lo `test -f 'vssh/libssh2.c' || echo '$(srcdir)/'`vssh/libssh2.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vssh/$(DEPDIR)/libcurlu_la-libssh2.Tpo vssh/$(DEPDIR)/libcurlu_la-libssh2.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vssh/libssh2.c' object='vssh/libcurlu_la-libssh2.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vssh/libcurlu_la-libssh2.lo `test -f 'vssh/libssh2.c' || echo '$(srcdir)/'`vssh/libssh2.c

vssh/libcurlu_la-libssh.lo: vssh/libssh.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -MT vssh/libcurlu_la-libssh.lo -MD -MP -MF vssh/$(DEPDIR)/libcurlu_la-libssh.Tpo -c -o vssh/libcurlu_la-libssh.lo `test -f 'vssh/libssh.c' || echo '$(srcdir)/'`vssh/libssh.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) vssh/$(DEPDIR)/libcurlu_la-libssh.Tpo vssh/$(DEPDIR)/libcurlu_la-libssh.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='vssh/libssh.c' object='vssh/libcurlu_la-libssh.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurlu_la_CPPFLAGS) $(CPPFLAGS) $(libcurlu_la_CFLAGS) $(CFLAGS) -c -o vssh/libcurlu_la-libssh.lo `test -f 'vssh/libssh.c' || echo '$(srcdir)/'`vssh/libssh.c

mostlyclean-libtool:
	-rm -f *.lo

clean-libtool:
	-rm -rf .libs _libs
	-rm -rf vauth/.libs vauth/_libs
	-rm -rf vquic/.libs vquic/_libs
	-rm -rf vssh/.libs vssh/_libs
	-rm -rf vtls/.libs vtls/_libs

ID: $(am__tagged_files)
	$(am__define_uniq_tagged_files); mkid -fID $$unique
tags: tags-am
TAGS: tags

3594
3595
3596
3597
3598
3599
3600




3601
3602
3603
3604
3605
3606
3607
clean-generic:

distclean-generic:
	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
	-rm -f vauth/$(DEPDIR)/$(am__dirstamp)
	-rm -f vauth/$(am__dirstamp)




	-rm -f vtls/$(DEPDIR)/$(am__dirstamp)
	-rm -f vtls/$(am__dirstamp)

maintainer-clean-generic:
	@echo "This command is intended for maintainers to use"
	@echo "it deletes files that may require special tools to rebuild."
clean: clean-am







>
>
>
>







3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
clean-generic:

distclean-generic:
	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
	-rm -f vauth/$(DEPDIR)/$(am__dirstamp)
	-rm -f vauth/$(am__dirstamp)
	-rm -f vquic/$(DEPDIR)/$(am__dirstamp)
	-rm -f vquic/$(am__dirstamp)
	-rm -f vssh/$(DEPDIR)/$(am__dirstamp)
	-rm -f vssh/$(am__dirstamp)
	-rm -f vtls/$(DEPDIR)/$(am__dirstamp)
	-rm -f vtls/$(am__dirstamp)

maintainer-clean-generic:
	@echo "This command is intended for maintainers to use"
	@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
	-rm -f ./$(DEPDIR)/libcurl_la-smb.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-smtp.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks_gssapi.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks_sspi.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-speedcheck.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-splay.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-ssh-libssh.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-ssh.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strcase.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strdup.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strerror.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strtok.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strtoofft.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-system_win32.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-telnet.Plo







<
<







3793
3794
3795
3796
3797
3798
3799


3800
3801
3802
3803
3804
3805
3806
	-rm -f ./$(DEPDIR)/libcurl_la-smb.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-smtp.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks_gssapi.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks_sspi.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-speedcheck.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-splay.Plo


	-rm -f ./$(DEPDIR)/libcurl_la-strcase.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strdup.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strerror.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strtok.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strtoofft.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-system_win32.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-telnet.Plo
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
	-rm -f ./$(DEPDIR)/libcurlu_la-smb.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-smtp.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks_sspi.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-speedcheck.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-splay.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-ssh-libssh.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-ssh.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strcase.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strdup.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strerror.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strtok.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strtoofft.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-system_win32.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-telnet.Plo







<
<







3903
3904
3905
3906
3907
3908
3909


3910
3911
3912
3913
3914
3915
3916
	-rm -f ./$(DEPDIR)/libcurlu_la-smb.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-smtp.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks_sspi.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-speedcheck.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-splay.Plo


	-rm -f ./$(DEPDIR)/libcurlu_la-strcase.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strdup.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strerror.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strtok.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strtoofft.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-system_win32.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-telnet.Plo
3854
3855
3856
3857
3858
3859
3860








3861
3862
3863
3864
3865
3866
3867
	-rm -f vauth/$(DEPDIR)/libcurlu_la-krb5_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-ntlm.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-ntlm_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-oauth2.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-vauth.Plo








	-rm -f vtls/$(DEPDIR)/libcurl_la-gskit.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-gtls.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-mesalink.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-nss.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-openssl.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-polarssl.Plo







>
>
>
>
>
>
>
>







3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
	-rm -f vauth/$(DEPDIR)/libcurlu_la-krb5_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-ntlm.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-ntlm_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-oauth2.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-vauth.Plo
	-rm -f vquic/$(DEPDIR)/libcurl_la-ngtcp2.Plo
	-rm -f vquic/$(DEPDIR)/libcurl_la-quiche.Plo
	-rm -f vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Plo
	-rm -f vquic/$(DEPDIR)/libcurlu_la-quiche.Plo
	-rm -f vssh/$(DEPDIR)/libcurl_la-libssh.Plo
	-rm -f vssh/$(DEPDIR)/libcurl_la-libssh2.Plo
	-rm -f vssh/$(DEPDIR)/libcurlu_la-libssh.Plo
	-rm -f vssh/$(DEPDIR)/libcurlu_la-libssh2.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-gskit.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-gtls.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-mesalink.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-nss.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-openssl.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-polarssl.Plo
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
	-rm -f ./$(DEPDIR)/libcurl_la-smb.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-smtp.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks_gssapi.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks_sspi.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-speedcheck.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-splay.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-ssh-libssh.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-ssh.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strcase.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strdup.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strerror.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strtok.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strtoofft.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-system_win32.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-telnet.Plo







<
<







4116
4117
4118
4119
4120
4121
4122


4123
4124
4125
4126
4127
4128
4129
	-rm -f ./$(DEPDIR)/libcurl_la-smb.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-smtp.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks_gssapi.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-socks_sspi.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-speedcheck.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-splay.Plo


	-rm -f ./$(DEPDIR)/libcurl_la-strcase.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strdup.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strerror.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strtok.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-strtoofft.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-system_win32.Plo
	-rm -f ./$(DEPDIR)/libcurl_la-telnet.Plo
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
	-rm -f ./$(DEPDIR)/libcurlu_la-smb.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-smtp.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks_sspi.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-speedcheck.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-splay.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-ssh-libssh.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-ssh.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strcase.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strdup.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strerror.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strtok.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strtoofft.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-system_win32.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-telnet.Plo







<
<







4226
4227
4228
4229
4230
4231
4232


4233
4234
4235
4236
4237
4238
4239
	-rm -f ./$(DEPDIR)/libcurlu_la-smb.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-smtp.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks_gssapi.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-socks_sspi.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-speedcheck.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-splay.Plo


	-rm -f ./$(DEPDIR)/libcurlu_la-strcase.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strdup.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strerror.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strtok.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-strtoofft.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-system_win32.Plo
	-rm -f ./$(DEPDIR)/libcurlu_la-telnet.Plo
4173
4174
4175
4176
4177
4178
4179








4180
4181
4182
4183
4184
4185
4186
	-rm -f vauth/$(DEPDIR)/libcurlu_la-krb5_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-ntlm.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-ntlm_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-oauth2.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-vauth.Plo








	-rm -f vtls/$(DEPDIR)/libcurl_la-gskit.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-gtls.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-mesalink.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-nss.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-openssl.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-polarssl.Plo







>
>
>
>
>
>
>
>







4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
	-rm -f vauth/$(DEPDIR)/libcurlu_la-krb5_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-ntlm.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-ntlm_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-oauth2.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_gssapi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-spnego_sspi.Plo
	-rm -f vauth/$(DEPDIR)/libcurlu_la-vauth.Plo
	-rm -f vquic/$(DEPDIR)/libcurl_la-ngtcp2.Plo
	-rm -f vquic/$(DEPDIR)/libcurl_la-quiche.Plo
	-rm -f vquic/$(DEPDIR)/libcurlu_la-ngtcp2.Plo
	-rm -f vquic/$(DEPDIR)/libcurlu_la-quiche.Plo
	-rm -f vssh/$(DEPDIR)/libcurl_la-libssh.Plo
	-rm -f vssh/$(DEPDIR)/libcurl_la-libssh2.Plo
	-rm -f vssh/$(DEPDIR)/libcurlu_la-libssh.Plo
	-rm -f vssh/$(DEPDIR)/libcurlu_la-libssh2.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-gskit.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-gtls.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-mbedtls.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-mesalink.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-nss.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-openssl.Plo
	-rm -f vtls/$(DEPDIR)/libcurl_la-polarssl.Plo
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
	uninstall-am uninstall-libLTLIBRARIES

.PRECIOUS: Makefile


checksrc:
	$(CHECKSRC)(@PERL@ $(srcdir)/checksrc.pl -D$(srcdir) -W$(srcdir)/curl_config.h \
	$(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] $(srcdir)/vtls/*.[ch])

# for debug builds, we scan the sources on all regular make invokes
@CURLDEBUG_TRUE@all-local: checksrc

tidy:
	$(TIDY) $(CSOURCES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H

# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:







|










4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
	uninstall-am uninstall-libLTLIBRARIES

.PRECIOUS: Makefile


checksrc:
	$(CHECKSRC)(@PERL@ $(srcdir)/checksrc.pl -D$(srcdir) -W$(srcdir)/curl_config.h \
	$(srcdir)/*.[ch] $(srcdir)/vauth/*.[ch] $(srcdir)/vtls/*.[ch] $(srcdir)/vquic/*.[ch] $(srcdir)/vssh/*.[ch])

# for debug builds, we scan the sources on all regular make invokes
@CURLDEBUG_TRUE@all-local: checksrc

tidy:
	$(TIDY) $(CSOURCES) $(TIDYFLAGS) -- $(AM_CPPFLAGS) $(CPPFLAGS) -DHAVE_CONFIG_H

# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
Changes to jni/curl/lib/Makefile.inc.
32
33
34
35
36
37
38






39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  vtls/wolfssl.c vtls/schannel.c vtls/schannel_verify.c                 \
  vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c

LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h                \
  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h                \
  vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h          \
  vtls/mbedtls.h vtls/mesalink.h







LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
  cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c       \
  ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c         \
  getinfo.c transfer.c strcase.c easy.c security.c curl_fnmatch.c       \
  fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c \
  strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c  \
  http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c    \
  strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c         \
  inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c      \
  ssh.c ssh-libssh.c curl_addrinfo.c socks_gssapi.c socks_sspi.c        \
  curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c    \
  pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c        \
  openldap.c curl_gethostname.c gopher.c idn_win32.c                    \
  http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c      \
  http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c        \
  curl_multibyte.c hostcheck.c conncache.c dotdot.c                     \
  x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c      \







>
>
>
>
>
>










|







32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  vtls/wolfssl.c vtls/schannel.c vtls/schannel_verify.c                 \
  vtls/sectransp.c vtls/gskit.c vtls/mbedtls.c vtls/mesalink.c

LIB_VTLS_HFILES = vtls/openssl.h vtls/vtls.h vtls/gtls.h                \
  vtls/nssg.h vtls/polarssl.h vtls/polarssl_threadlock.h                \
  vtls/wolfssl.h vtls/schannel.h vtls/sectransp.h vtls/gskit.h          \
  vtls/mbedtls.h vtls/mesalink.h

LIB_VQUIC_CFILES = vquic/ngtcp2.c vquic/quiche.c

LIB_VQUIC_HFILES = vquic/ngtcp2.h vquic/quiche.h

LIB_VSSH_CFILES = vssh/libssh2.c vssh/libssh.c

LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c   \
  cookie.c http.c sendf.c ftp.c url.c dict.c if2ip.c speedcheck.c       \
  ldap.c version.c getenv.c escape.c mprintf.c telnet.c netrc.c         \
  getinfo.c transfer.c strcase.c easy.c security.c curl_fnmatch.c       \
  fileinfo.c ftplistparser.c wildcard.c krb5.c memdebug.c http_chunks.c \
  strtok.c connect.c llist.c hash.c multi.c content_encoding.c share.c  \
  http_digest.c md4.c md5.c http_negotiate.c inet_pton.c strtoofft.c    \
  strerror.c amigaos.c hostasyn.c hostip4.c hostip6.c hostsyn.c         \
  inet_ntop.c parsedate.c select.c tftp.c splay.c strdup.c socks.c      \
  curl_addrinfo.c socks_gssapi.c socks_sspi.c                           \
  curl_sspi.c slist.c nonblock.c curl_memrchr.c imap.c pop3.c smtp.c    \
  pingpong.c rtsp.c curl_threads.c warnless.c hmac.c curl_rtmp.c        \
  openldap.c curl_gethostname.c gopher.c idn_win32.c                    \
  http_proxy.c non-ascii.c asyn-ares.c asyn-thread.c curl_gssapi.c      \
  http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c        \
  curl_multibyte.c hostcheck.c conncache.c dotdot.c                     \
  x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c      \
72
73
74
75
76
77
78
79
80
81
82
83

84

  curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h           \
  http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h             \
  curl_sasl.h curl_multibyte.h hostcheck.h conncache.h                  \
  curl_setup_once.h multihandle.h setup-vms.h dotdot.h                  \
  x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h           \
  curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h     \
  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h        \
  curl_get_line.h altsvc.h

LIB_RCFILES = libcurl.rc

CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES)

HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES)








|



|
>
|
>
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  curl_gethostname.h gopher.h http_proxy.h non-ascii.h asyn.h           \
  http_ntlm.h curl_gssapi.h curl_ntlm_wb.h curl_ntlm_core.h             \
  curl_sasl.h curl_multibyte.h hostcheck.h conncache.h                  \
  curl_setup_once.h multihandle.h setup-vms.h dotdot.h                  \
  x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h           \
  curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h     \
  curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h        \
  curl_get_line.h altsvc.h quic.h

LIB_RCFILES = libcurl.rc

CSOURCES = $(LIB_CFILES) $(LIB_VAUTH_CFILES) $(LIB_VTLS_CFILES) \
  $(LIB_VQUIC_CFILES) $(LIB_VSSH_CFILES)
HHEADERS = $(LIB_HFILES) $(LIB_VAUTH_HFILES) $(LIB_VTLS_HFILES) \
  $(LIB_VQUIC_HFILES)
Changes to jni/curl/lib/altsvc.c.
50
51
52
53
54
55
56

57
58

59
60

61
62
63
64
65
66
67
68
69
70
71
72

73
74
75

76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117

static enum alpnid alpn2alpnid(char *name)
{
  if(strcasecompare(name, "h1"))
    return ALPN_h1;
  if(strcasecompare(name, "h2"))
    return ALPN_h2;

  if(strcasecompare(name, "h2c"))
    return ALPN_h2c;

  if(strcasecompare(name, "h3"))
    return ALPN_h3;

  return ALPN_none; /* unknown, probably rubbish input */
}

/* Given the ALPN ID, return the name */
const char *Curl_alpnid2str(enum alpnid id)
{
  switch(id) {
  case ALPN_h1:
    return "h1";
  case ALPN_h2:
    return "h2";
  case ALPN_h2c:

    return "h2c";
  case ALPN_h3:
    return "h3";

  default:
    return ""; /* bad */
  }
}


static void altsvc_free(struct altsvc *as)
{
  free(as->srchost);
  free(as->dsthost);
  free(as);
}

static struct altsvc *altsvc_createid(const char *srchost,
                                      const char *dsthost,
                                      enum alpnid srcalpnid,
                                      enum alpnid dstalpnid,
                                      unsigned int srcport,
                                      unsigned int dstport)
{
  struct altsvc *as = calloc(sizeof(struct altsvc), 1);
  if(!as)
    return NULL;

  as->srchost = strdup(srchost);
  if(!as->srchost)
    goto error;
  as->dsthost = strdup(dsthost);
  if(!as->dsthost)
    goto error;

  as->srcalpnid = srcalpnid;
  as->dstalpnid = dstalpnid;
  as->srcport = curlx_ultous(srcport);
  as->dstport = curlx_ultous(dstport);

  return as;
  error:
  altsvc_free(as);
  return NULL;
}








>
|
|
>


>











|
>
|
|

>








|
|














|
|

|
|


|
|
|
|







50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122

static enum alpnid alpn2alpnid(char *name)
{
  if(strcasecompare(name, "h1"))
    return ALPN_h1;
  if(strcasecompare(name, "h2"))
    return ALPN_h2;
#if (defined(USE_QUICHE) || defined(USE_NGHTTP2)) && !defined(UNITTESTS)
  if(strcasecompare(name, "h3-22"))
    return ALPN_h3;
#else
  if(strcasecompare(name, "h3"))
    return ALPN_h3;
#endif
  return ALPN_none; /* unknown, probably rubbish input */
}

/* Given the ALPN ID, return the name */
const char *Curl_alpnid2str(enum alpnid id)
{
  switch(id) {
  case ALPN_h1:
    return "h1";
  case ALPN_h2:
    return "h2";
  case ALPN_h3:
#if (defined(USE_QUICHE) || defined(USE_NGHTTP2)) && !defined(UNITTESTS)
    return "h3-22";
#else
    return "h3";
#endif
  default:
    return ""; /* bad */
  }
}


static void altsvc_free(struct altsvc *as)
{
  free(as->src.host);
  free(as->dst.host);
  free(as);
}

static struct altsvc *altsvc_createid(const char *srchost,
                                      const char *dsthost,
                                      enum alpnid srcalpnid,
                                      enum alpnid dstalpnid,
                                      unsigned int srcport,
                                      unsigned int dstport)
{
  struct altsvc *as = calloc(sizeof(struct altsvc), 1);
  if(!as)
    return NULL;

  as->src.host = strdup(srchost);
  if(!as->src.host)
    goto error;
  as->dst.host = strdup(dsthost);
  if(!as->dst.host)
    goto error;

  as->src.alpnid = srcalpnid;
  as->dst.alpnid = dstalpnid;
  as->src.port = curlx_ultous(srcport);
  as->dst.port = curlx_ultous(dstport);

  return as;
  error:
  altsvc_free(as);
  return NULL;
}

222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237

  fprintf(fp,
          "%s %s %u "
          "%s %s %u "
          "\"%d%02d%02d "
          "%02d:%02d:%02d\" "
          "%u %d\n",
          Curl_alpnid2str(as->srcalpnid), as->srchost, as->srcport,
          Curl_alpnid2str(as->dstalpnid), as->dsthost, as->dstport,
          stamp.tm_year + 1900, stamp.tm_mon + 1, stamp.tm_mday,
          stamp.tm_hour, stamp.tm_min, stamp.tm_sec,
          as->persist, as->prio);
  return CURLE_OK;
}

/* ---- library-wide functions below ---- */







|
|







227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242

  fprintf(fp,
          "%s %s %u "
          "%s %s %u "
          "\"%d%02d%02d "
          "%02d:%02d:%02d\" "
          "%u %d\n",
          Curl_alpnid2str(as->src.alpnid), as->src.host, as->src.port,
          Curl_alpnid2str(as->dst.alpnid), as->dst.host, as->dst.port,
          stamp.tm_year + 1900, stamp.tm_mon + 1, stamp.tm_mday,
          stamp.tm_hour, stamp.tm_min, stamp.tm_sec,
          as->persist, as->prio);
  return CURLE_OK;
}

/* ---- library-wide functions below ---- */
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
  Curl_llist_init(&asi->list, NULL);

  /* set default behavior */
  asi->flags = CURLALTSVC_H1
#ifdef USE_NGHTTP2
    | CURLALTSVC_H2
#endif
#ifdef USE_HTTP3
    | CURLALTSVC_H3
#endif
    ;
  return asi;
}

/*







|







253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
  Curl_llist_init(&asi->list, NULL);

  /* set default behavior */
  asi->flags = CURLALTSVC_H1
#ifdef USE_NGHTTP2
    | CURLALTSVC_H2
#endif
#ifdef ENABLE_QUIC
    | CURLALTSVC_H3
#endif
    ;
  return asi;
}

/*
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
{
  size_t len;
  const char *protop;
  const char *p = *ptr;
  while(*p && ISBLANK(*p))
    p++;
  protop = p;
  while(*p && ISALNUM(*p))
    p++;
  len = p - protop;

  if(!len || (len >= buflen))
    return CURLE_BAD_FUNCTION_ARGUMENT;
  memcpy(alpnbuf, protop, len);
  alpnbuf[len] = 0;







|







344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
{
  size_t len;
  const char *protop;
  const char *p = *ptr;
  while(*p && ISBLANK(*p))
    p++;
  protop = p;
  while(*p && !ISBLANK(*p) && (*p != ';') && (*p != '='))
    p++;
  len = p - protop;

  if(!len || (len >= buflen))
    return CURLE_BAD_FUNCTION_ARGUMENT;
  memcpy(alpnbuf, protop, len);
  alpnbuf[len] = 0;
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
                         const char *srchost, unsigned short srcport)
{
  struct curl_llist_element *e;
  struct curl_llist_element *n;
  for(e = asi->list.head; e; e = n) {
    struct altsvc *as = e->ptr;
    n = e->next;
    if((srcalpnid == as->srcalpnid) &&
       (srcport == as->srcport) &&
       strcasecompare(srchost, as->srchost)) {
      Curl_llist_remove(&asi->list, e, NULL);
      altsvc_free(as);
      asi->num--;
    }
  }
}








|
|
|







366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
                         const char *srchost, unsigned short srcport)
{
  struct curl_llist_element *e;
  struct curl_llist_element *n;
  for(e = asi->list.head; e; e = n) {
    struct altsvc *as = e->ptr;
    n = e->next;
    if((srcalpnid == as->src.alpnid) &&
       (srcport == as->src.port) &&
       strcasecompare(srchost, as->src.host)) {
      Curl_llist_remove(&asi->list, e, NULL);
      altsvc_free(as);
      asi->num--;
    }
  }
}

531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552

553
554
555
556
557
558

559
560
561
562
563
564
565
566
567
568
569

/*
 * Return TRUE on a match
 */
bool Curl_altsvc_lookup(struct altsvcinfo *asi,
                        enum alpnid srcalpnid, const char *srchost,
                        int srcport,
                        enum alpnid *dstalpnid, const char **dsthost,
                        int *dstport)
{
  struct curl_llist_element *e;
  struct curl_llist_element *n;
  time_t now = time(NULL);
  DEBUGASSERT(asi);
  DEBUGASSERT(srchost);
  DEBUGASSERT(dsthost);

  for(e = asi->list.head; e; e = n) {
    struct altsvc *as = e->ptr;
    n = e->next;
    if(as->expires < now) {
      /* an expired entry, remove */

      altsvc_free(as);
      continue;
    }
    if((as->srcalpnid == srcalpnid) &&
       strcasecompare(as->srchost, srchost) &&
       as->srcport == srcport) {

      /* match */
      *dstalpnid = as->dstalpnid;
      *dsthost = as->dsthost;
      *dstport = as->dstport;
      return TRUE;
    }
  }
  return FALSE;
}

#endif /* CURL_DISABLE_HTTP || USE_ALTSVC */







|
|






|






>



|
|
|
>

<
|
<







536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566

567

568
569
570
571
572
573
574

/*
 * Return TRUE on a match
 */
bool Curl_altsvc_lookup(struct altsvcinfo *asi,
                        enum alpnid srcalpnid, const char *srchost,
                        int srcport,
                        struct altsvc **dstentry,
                        const int versions) /* one or more bits */
{
  struct curl_llist_element *e;
  struct curl_llist_element *n;
  time_t now = time(NULL);
  DEBUGASSERT(asi);
  DEBUGASSERT(srchost);
  DEBUGASSERT(dstentry);

  for(e = asi->list.head; e; e = n) {
    struct altsvc *as = e->ptr;
    n = e->next;
    if(as->expires < now) {
      /* an expired entry, remove */
      Curl_llist_remove(&asi->list, e, NULL);
      altsvc_free(as);
      continue;
    }
    if((as->src.alpnid == srcalpnid) &&
       strcasecompare(as->src.host, srchost) &&
       (as->src.port == srcport) &&
       (versions & as->dst.alpnid)) {
      /* match */

      *dstentry = as;

      return TRUE;
    }
  }
  return FALSE;
}

#endif /* CURL_DISABLE_HTTP || USE_ALTSVC */
Changes to jni/curl/lib/altsvc.h.
24
25
26
27
28
29
30
31
32
33
34

35




36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "curl_setup.h"

#if !defined(CURL_DISABLE_HTTP) && defined(USE_ALTSVC)
#include <curl/curl.h>
#include "llist.h"

enum alpnid {
  ALPN_none,
  ALPN_h1,
  ALPN_h2,
  ALPN_h2c,

  ALPN_h3




};

struct altsvc {
  char *srchost;
  char *dsthost;
  unsigned short srcport;
  unsigned short dstport;
  enum alpnid srcalpnid;
  enum alpnid dstalpnid;
  time_t expires;
  bool persist;
  int prio;
  struct curl_llist_element node;
};

struct altsvcinfo {







|
|
|
|
>
|
>
>
>
>



|
|
<
<
<
<







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45




46
47
48
49
50
51
52
#include "curl_setup.h"

#if !defined(CURL_DISABLE_HTTP) && defined(USE_ALTSVC)
#include <curl/curl.h>
#include "llist.h"

enum alpnid {
  ALPN_none = 0,
  ALPN_h1 = CURLALTSVC_H1,
  ALPN_h2 = CURLALTSVC_H2,
  ALPN_h3 = CURLALTSVC_H3
};

struct althost {
  char *host;
  unsigned short port;
  enum alpnid alpnid;
};

struct altsvc {
  struct althost src;
  struct althost dst;




  time_t expires;
  bool persist;
  int prio;
  struct curl_llist_element node;
};

struct altsvcinfo {
64
65
66
67
68
69
70
71
72
73
74
75
76
77
CURLcode Curl_altsvc_parse(struct Curl_easy *data,
                           struct altsvcinfo *altsvc, const char *value,
                           enum alpnid srcalpn, const char *srchost,
                           unsigned short srcport);
bool Curl_altsvc_lookup(struct altsvcinfo *asi,
                        enum alpnid srcalpnid, const char *srchost,
                        int srcport,
                        enum alpnid *dstalpnid, const char **dsthost,
                        int *dstport);
#else
/* disabled */
#define Curl_altsvc_save(a,b)
#endif /* CURL_DISABLE_HTTP || USE_ALTSVC */
#endif /* HEADER_CURL_ALTSVC_H */







|
|





65
66
67
68
69
70
71
72
73
74
75
76
77
78
CURLcode Curl_altsvc_parse(struct Curl_easy *data,
                           struct altsvcinfo *altsvc, const char *value,
                           enum alpnid srcalpn, const char *srchost,
                           unsigned short srcport);
bool Curl_altsvc_lookup(struct altsvcinfo *asi,
                        enum alpnid srcalpnid, const char *srchost,
                        int srcport,
                        struct altsvc **dstentry,
                        int versions); /* one or more CURLALTSVC_H* bits */
#else
/* disabled */
#define Curl_altsvc_save(a,b)
#endif /* CURL_DISABLE_HTTP || USE_ALTSVC */
#endif /* HEADER_CURL_ALTSVC_H */
Changes to jni/curl/lib/asyn-ares.c.
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
 * with ares. The caller must make sure that this function is only called when
 * we have a working ares channel.
 *
 * Returns: sockets-in-use-bitmap
 */

int Curl_resolver_getsock(struct connectdata *conn,
                          curl_socket_t *socks,
                          int numsocks)

{
  struct timeval maxtime;
  struct timeval timebuf;
  struct timeval *timeout;
  long milli;
  int max = ares_getsock((ares_channel)conn->data->state.resolver,
                         (ares_socket_t *)socks, numsocks);

  maxtime.tv_sec = CURL_TIMEOUT_RESOLVE;
  maxtime.tv_usec = 0;

  timeout = ares_timeout((ares_channel)conn->data->state.resolver, &maxtime,
                         &timebuf);
  milli = (timeout->tv_sec * 1000) + (timeout->tv_usec/1000);







|
<
<






|







249
250
251
252
253
254
255
256


257
258
259
260
261
262
263
264
265
266
267
268
269
270
 * with ares. The caller must make sure that this function is only called when
 * we have a working ares channel.
 *
 * Returns: sockets-in-use-bitmap
 */

int Curl_resolver_getsock(struct connectdata *conn,
                          curl_socket_t *socks)


{
  struct timeval maxtime;
  struct timeval timebuf;
  struct timeval *timeout;
  long milli;
  int max = ares_getsock((ares_channel)conn->data->state.resolver,
                         (ares_socket_t *)socks, MAX_SOCKSPEREASYHANDLE);

  maxtime.tv_sec = CURL_TIMEOUT_RESOLVE;
  maxtime.tv_usec = 0;

  timeout = ares_timeout((ares_channel)conn->data->state.resolver, &maxtime,
                         &timebuf);
  milli = (timeout->tv_sec * 1000) + (timeout->tv_usec/1000);
Changes to jni/curl/lib/asyn-thread.c.
159
160
161
162
163
164
165




166
167
168
169
170
171
172
struct thread_sync_data {
  curl_mutex_t * mtx;
  int done;

  char *hostname;        /* hostname to resolve, Curl_async.hostname
                            duplicate */
  int port;




  int sock_error;
  Curl_addrinfo *res;
#ifdef HAVE_GETADDRINFO
  struct addrinfo hints;
#endif
  struct thread_data *td; /* for thread-self cleanup */
};







>
>
>
>







159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
struct thread_sync_data {
  curl_mutex_t * mtx;
  int done;

  char *hostname;        /* hostname to resolve, Curl_async.hostname
                            duplicate */
  int port;
#ifdef HAVE_SOCKETPAIR
  struct connectdata *conn;
  curl_socket_t sock_pair[2]; /* socket pair */
#endif
  int sock_error;
  Curl_addrinfo *res;
#ifdef HAVE_GETADDRINFO
  struct addrinfo hints;
#endif
  struct thread_data *td; /* for thread-self cleanup */
};
193
194
195
196
197
198
199









200
201
202
203
204
205
206
  }

  free(tsd->hostname);

  if(tsd->res)
    Curl_freeaddrinfo(tsd->res);










  memset(tsd, 0, sizeof(*tsd));
}

/* Initialize resolver thread synchronization data */
static
int init_thread_sync_data(struct thread_data * td,
                           const char *hostname,







>
>
>
>
>
>
>
>
>







197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
  }

  free(tsd->hostname);

  if(tsd->res)
    Curl_freeaddrinfo(tsd->res);

#ifdef HAVE_SOCKETPAIR
  /*
   * close one end of the socket pair (may be done in resolver thread);
   * the other end (for reading) is always closed in the parent thread.
   */
  if(tsd->sock_pair[1] != CURL_SOCKET_BAD) {
    sclose(tsd->sock_pair[1]);
  }
#endif
  memset(tsd, 0, sizeof(*tsd));
}

/* Initialize resolver thread synchronization data */
static
int init_thread_sync_data(struct thread_data * td,
                           const char *hostname,
226
227
228
229
230
231
232








233
234
235
236
237
238
239

  tsd->mtx = malloc(sizeof(curl_mutex_t));
  if(tsd->mtx == NULL)
    goto err_exit;

  Curl_mutex_init(tsd->mtx);









  tsd->sock_error = CURL_ASYNC_SUCCESS;

  /* Copying hostname string because original can be destroyed by parent
   * thread during gethostbyname execution.
   */
  tsd->hostname = strdup(hostname);
  if(!tsd->hostname)







>
>
>
>
>
>
>
>







239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260

  tsd->mtx = malloc(sizeof(curl_mutex_t));
  if(tsd->mtx == NULL)
    goto err_exit;

  Curl_mutex_init(tsd->mtx);

#ifdef HAVE_SOCKETPAIR
  /* create socket pair */
  if(socketpair(AF_LOCAL, SOCK_STREAM, 0, &tsd->sock_pair[0]) < 0) {
    tsd->sock_pair[0] = CURL_SOCKET_BAD;
    tsd->sock_pair[1] = CURL_SOCKET_BAD;
    goto err_exit;
  }
#endif
  tsd->sock_error = CURL_ASYNC_SUCCESS;

  /* Copying hostname string because original can be destroyed by parent
   * thread during gethostbyname execution.
   */
  tsd->hostname = strdup(hostname);
  if(!tsd->hostname)
272
273
274
275
276
277
278



279
280
281
282
283
284
285
 */
static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
{
  struct thread_sync_data *tsd = (struct thread_sync_data*)arg;
  struct thread_data *td = tsd->td;
  char service[12];
  int rc;




  msnprintf(service, sizeof(service), "%d", tsd->port);

  rc = Curl_getaddrinfo_ex(tsd->hostname, service, &tsd->hints, &tsd->res);

  if(rc != 0) {
    tsd->sock_error = SOCKERRNO?SOCKERRNO:rc;







>
>
>







293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
 */
static unsigned int CURL_STDCALL getaddrinfo_thread(void *arg)
{
  struct thread_sync_data *tsd = (struct thread_sync_data*)arg;
  struct thread_data *td = tsd->td;
  char service[12];
  int rc;
#ifdef HAVE_SOCKETPAIR
  char buf[1];
#endif

  msnprintf(service, sizeof(service), "%d", tsd->port);

  rc = Curl_getaddrinfo_ex(tsd->hostname, service, &tsd->hints, &tsd->res);

  if(rc != 0) {
    tsd->sock_error = SOCKERRNO?SOCKERRNO:rc;
294
295
296
297
298
299
300










301
302
303
304
305
306
307
  if(tsd->done) {
    /* too late, gotta clean up the mess */
    Curl_mutex_release(tsd->mtx);
    destroy_thread_sync_data(tsd);
    free(td);
  }
  else {










    tsd->done = 1;
    Curl_mutex_release(tsd->mtx);
  }

  return 0;
}








>
>
>
>
>
>
>
>
>
>







318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
  if(tsd->done) {
    /* too late, gotta clean up the mess */
    Curl_mutex_release(tsd->mtx);
    destroy_thread_sync_data(tsd);
    free(td);
  }
  else {
#ifdef HAVE_SOCKETPAIR
    if(tsd->sock_pair[1] != CURL_SOCKET_BAD) {
      /* DNS has been resolved, signal client task */
      buf[0] = 1;
      if(write(tsd->sock_pair[1],  buf, sizeof(buf)) < 0) {
        /* update sock_erro to errno */
        tsd->sock_error = SOCKERRNO;
      }
    }
#endif
    tsd->done = 1;
    Curl_mutex_release(tsd->mtx);
  }

  return 0;
}

344
345
346
347
348
349
350




351
352
353
354
355
356
357
 * destroy_async_data() cleans up async resolver data and thread handle.
 */
static void destroy_async_data(struct Curl_async *async)
{
  if(async->os_specific) {
    struct thread_data *td = (struct thread_data*) async->os_specific;
    int done;





    /*
     * if the thread is still blocking in the resolve syscall, detach it and
     * let the thread do the cleanup...
     */
    Curl_mutex_acquire(td->tsd.mtx);
    done = td->tsd.done;







>
>
>
>







378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
 * destroy_async_data() cleans up async resolver data and thread handle.
 */
static void destroy_async_data(struct Curl_async *async)
{
  if(async->os_specific) {
    struct thread_data *td = (struct thread_data*) async->os_specific;
    int done;
#ifdef HAVE_SOCKETPAIR
    curl_socket_t sock_rd = td->tsd.sock_pair[0];
    struct connectdata *conn = td->tsd.conn;
#endif

    /*
     * if the thread is still blocking in the resolve syscall, detach it and
     * let the thread do the cleanup...
     */
    Curl_mutex_acquire(td->tsd.mtx);
    done = td->tsd.done;
365
366
367
368
369
370
371









372
373
374
375
376
377
378
      if(td->thread_hnd != curl_thread_t_null)
        Curl_thread_join(&td->thread_hnd);

      destroy_thread_sync_data(&td->tsd);

      free(async->os_specific);
    }









  }
  async->os_specific = NULL;

  free(async->hostname);
  async->hostname = NULL;
}








>
>
>
>
>
>
>
>
>







403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
      if(td->thread_hnd != curl_thread_t_null)
        Curl_thread_join(&td->thread_hnd);

      destroy_thread_sync_data(&td->tsd);

      free(async->os_specific);
    }
#ifdef HAVE_SOCKETPAIR
    /*
     * ensure CURLMOPT_SOCKETFUNCTION fires CURL_POLL_REMOVE
     * before the FD is invalidated to avoid EBADF on EPOLL_CTL_DEL
     */
    if(conn)
      Curl_multi_closed(conn->data, sock_rd);
    sclose(sock_rd);
#endif
  }
  async->os_specific = NULL;

  free(async->hostname);
  async->hostname = NULL;
}

565
566
567
568
569
570
571

572
573
574
575
576
577
578
579
580
      return result;
    }
    destroy_async_data(&conn->async);
    *entry = conn->async.dns;
  }
  else {
    /* poll for name lookup done with exponential backoff up to 250ms */

    timediff_t elapsed = Curl_timediff(Curl_now(),
                                       data->progress.t_startsingle);
    if(elapsed < 0)
      elapsed = 0;

    if(td->poll_interval == 0)
      /* Start at 1ms poll interval */
      td->poll_interval = 1;
    else if(elapsed >= td->interval_end)







>
|
|







612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
      return result;
    }
    destroy_async_data(&conn->async);
    *entry = conn->async.dns;
  }
  else {
    /* poll for name lookup done with exponential backoff up to 250ms */
    /* should be fine even if this converts to 32 bit */
    time_t elapsed = (time_t)Curl_timediff(Curl_now(),
                                           data->progress.t_startsingle);
    if(elapsed < 0)
      elapsed = 0;

    if(td->poll_interval == 0)
      /* Start at 1ms poll interval */
      td->poll_interval = 1;
    else if(elapsed >= td->interval_end)
588
589
590
591
592
593
594
595
596
597

598
599
600
601



602

603










604
605
606
607
608
609
610
611
612
613





614
615
616
617
618
619
620
621
    Curl_expire(conn->data, td->poll_interval, EXPIRE_ASYNC_NAME);
  }

  return CURLE_OK;
}

int Curl_resolver_getsock(struct connectdata *conn,
                          curl_socket_t *socks,
                          int numsocks)
{

  time_t milli;
  timediff_t ms;
  struct Curl_easy *data = conn->data;
  struct resdata *reslv = (struct resdata *)data->state.resolver;



  (void)socks;

  (void)numsocks;










  ms = Curl_timediff(Curl_now(), reslv->start);
  if(ms < 3)
    milli = 0;
  else if(ms <= 50)
    milli = ms/3;
  else if(ms <= 250)
    milli = 50;
  else
    milli = 200;
  Curl_expire(data, milli, EXPIRE_ASYNC_NAME);





  return 0;
}

#ifndef HAVE_GETADDRINFO
/*
 * Curl_getaddrinfo() - for platforms without getaddrinfo
 */
Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,







|
<

>




>
>
>

>
|
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
|
|
|
|
>
>
>
>
>
|







636
637
638
639
640
641
642
643

644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
    Curl_expire(conn->data, td->poll_interval, EXPIRE_ASYNC_NAME);
  }

  return CURLE_OK;
}

int Curl_resolver_getsock(struct connectdata *conn,
                          curl_socket_t *socks)

{
  int ret_val = 0;
  time_t milli;
  timediff_t ms;
  struct Curl_easy *data = conn->data;
  struct resdata *reslv = (struct resdata *)data->state.resolver;
#ifdef HAVE_SOCKETPAIR
  struct thread_data *td = (struct thread_data*)conn->async.os_specific;
#else
  (void)socks;
#endif

#ifdef HAVE_SOCKETPAIR
  if(td) {
    /* return read fd to client for polling the DNS resolution status */
    socks[0] = td->tsd.sock_pair[0];
    DEBUGASSERT(td->tsd.conn == conn || !td->tsd.conn);
    td->tsd.conn = conn;
    ret_val = GETSOCK_READSOCK(0);
  }
  else {
#endif
    ms = Curl_timediff(Curl_now(), reslv->start);
    if(ms < 3)
      milli = 0;
    else if(ms <= 50)
      milli = (time_t)ms/3;
    else if(ms <= 250)
      milli = 50;
    else
      milli = 200;
    Curl_expire(data, milli, EXPIRE_ASYNC_NAME);
#ifdef HAVE_SOCKETPAIR
  }
#endif


  return ret_val;
}

#ifndef HAVE_GETADDRINFO
/*
 * Curl_getaddrinfo() - for platforms without getaddrinfo
 */
Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn,
702
703
704
705
706
707
708
709

710
711
712
713
714
715
716
  if((pf != PF_INET) && !Curl_ipv6works())
    /* The stack seems to be a non-IPv6 one */
    pf = PF_INET;
#endif /* CURLRES_IPV6 */

  memset(&hints, 0, sizeof(hints));
  hints.ai_family = pf;
  hints.ai_socktype = conn->socktype;


  msnprintf(sbuf, sizeof(sbuf), "%d", port);

  reslv->start = Curl_now();
  /* fire up a new resolver thread! */
  if(init_resolve_thread(conn, hostname, port, &hints)) {
    *waitp = 1; /* expect asynchronous response */







|
>







769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
  if((pf != PF_INET) && !Curl_ipv6works())
    /* The stack seems to be a non-IPv6 one */
    pf = PF_INET;
#endif /* CURLRES_IPV6 */

  memset(&hints, 0, sizeof(hints));
  hints.ai_family = pf;
  hints.ai_socktype = (conn->transport == TRNSPRT_TCP)?
    SOCK_STREAM : SOCK_DGRAM;

  msnprintf(sbuf, sizeof(sbuf), "%d", port);

  reslv->start = Curl_now();
  /* fire up a new resolver thread! */
  if(init_resolve_thread(conn, hostname, port, &hints)) {
    *waitp = 1; /* expect asynchronous response */
Changes to jni/curl/lib/asyn.h.
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 *
 * This function is called from the multi_getsock() function.  'sock' is a
 * pointer to an array to hold the file descriptors, with 'numsock' being the
 * size of that array (in number of entries). This function is supposed to
 * return bitmask indicating what file descriptors (referring to array indexes
 * in the 'sock' array) to wait for, read/write.
 */
int Curl_resolver_getsock(struct connectdata *conn, curl_socket_t *sock,
                          int numsocks);

/*
 * Curl_resolver_is_resolved()
 *
 * Called repeatedly to check if a previous name resolve request has
 * completed. It should also make sure to time-out if the operation seems to
 * take too long.







|
<







110
111
112
113
114
115
116
117

118
119
120
121
122
123
124
 *
 * This function is called from the multi_getsock() function.  'sock' is a
 * pointer to an array to hold the file descriptors, with 'numsock' being the
 * size of that array (in number of entries). This function is supposed to
 * return bitmask indicating what file descriptors (referring to array indexes
 * in the 'sock' array) to wait for, read/write.
 */
int Curl_resolver_getsock(struct connectdata *conn, curl_socket_t *sock);


/*
 * Curl_resolver_is_resolved()
 *
 * Called repeatedly to check if a previous name resolve request has
 * completed. It should also make sure to time-out if the operation seems to
 * take too long.
Changes to jni/curl/lib/base64.c.
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 *
 ***************************************************************************/

/* Base64 encoding/decoding */

#include "curl_setup.h"

#if !defined(CURL_DISABLE_HTTP_AUTH) || defined(USE_LIBSSH2) || \
  defined(USE_LIBSSH) || !defined(CURL_DISABLE_LDAP) || \
  !defined(CURL_DISABLE_DOH) || defined(USE_SSL)

#include "urldata.h" /* for the Curl_easy definition */
#include "warnless.h"
#include "curl_base64.h"
#include "non-ascii.h"








|
|







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 *
 ***************************************************************************/

/* Base64 encoding/decoding */

#include "curl_setup.h"

#if !defined(CURL_DISABLE_HTTP_AUTH) || defined(USE_SSH) || \
  !defined(CURL_DISABLE_LDAP) || \
  !defined(CURL_DISABLE_DOH) || defined(USE_SSL)

#include "urldata.h" /* for the Curl_easy definition */
#include "warnless.h"
#include "curl_base64.h"
#include "non-ascii.h"

Changes to jni/curl/lib/config-os400.h.
429
430
431
432
433
434
435



436
437
438
439
440
441
442
#define STDC_HEADERS

/* Define if you can safely include both <sys/time.h> and <time.h>. */
#define TIME_WITH_SYS_TIME

/* Define to enable alt-svc support (experimental) */
#undef USE_ALTSVC




/* Version number of package */
#undef VERSION

/* Number of bits in a file offset, on hosts where this is settable. */
#undef _FILE_OFFSET_BITS








>
>
>







429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
#define STDC_HEADERS

/* Define if you can safely include both <sys/time.h> and <time.h>. */
#define TIME_WITH_SYS_TIME

/* Define to enable alt-svc support (experimental) */
#undef USE_ALTSVC

/* Define to enable HTTP3 support (experimental, requires NGTCP2 or QUICHE) */
#undef ENABLE_QUIC

/* Version number of package */
#undef VERSION

/* Number of bits in a file offset, on hosts where this is settable. */
#undef _FILE_OFFSET_BITS

Added jni/curl/lib/config-plan9.h.


















































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#ifndef HEADER_CURL_CONFIG_PLAN9_H
#define HEADER_CURL_CONFIG_PLAN9_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#define BUILDING_LIBCURL 1
#define CURL_CA_BUNDLE "/sys/lib/tls/ca.pem"
#define CURL_CA_PATH "/sys/lib/tls"
#define CURL_STATICLIB 1
#define ENABLE_IPV6 1
#define CURL_DISABLE_LDAP 1

#define NEED_REENTRANT 1
#define OS "plan9"
#define PACKAGE "curl"
#define PACKAGE_NAME "curl"
#define PACKAGE_BUGREPORT "a suitable mailing list: https://curl.haxx.se/mail/"
#define PACKAGE_STRING "curl -"
#define PACKAGE_TARNAME "curl"
#define PACKAGE_VERSION "-"
#define RANDOM_FILE "/dev/random"
#define VERSION "0.0.0" /* TODO */

#define RETSIGTYPE void

#define STDC_HEADERS 1

#ifdef _BITS64
#error not implement
#else
#define SIZEOF_INT 4
#define SIZEOF_SHORT 2
#define SIZEOF_LONG 4
#define SIZEOF_OFF_T 8
#define SIZEOF_CURL_OFF_T 4 /* curl_off_t = timediff_t = int */
#define SIZEOF_SIZE_T 4
#define SIZEOF_TIME_T 4
#endif

#define HAVE_GETNAMEINFO 1
#define GETNAMEINFO_QUAL_ARG1 const
#define GETNAMEINFO_TYPE_ARG1 struct sockaddr *
#define GETNAMEINFO_TYPE_ARG2 int
#define GETNAMEINFO_TYPE_ARG46 long
#define GETNAMEINFO_TYPE_ARG7 int

#define HAVE_RECV 1
#define RECV_TYPE_ARG1 int
#define RECV_TYPE_ARG2 void *
#define RECV_TYPE_ARG3 int
#define RECV_TYPE_ARG4 int
#define RECV_TYPE_RETV int

#define HAVE_RECVFROM 1
#define RECVFROM_TYPE_ARG1 int
#define RECVFROM_TYPE_ARG2 void
#define RECVFROM_TYPE_ARG2_IS_VOID 1
#define RECVFROM_TYPE_ARG3 int
#define RECVFROM_TYPE_ARG4 int
#define RECVFROM_TYPE_ARG5 void
#define RECVFROM_TYPE_ARG5_IS_VOID 1
#define RECVFROM_TYPE_ARG6 int
#define RECVFROM_TYPE_ARG6_IS_VOID 1
#define RECVFROM_TYPE_RETV int

#define HAVE_SELECT 1
#define SELECT_TYPE_ARG1 int
#define SELECT_TYPE_ARG234 fd_set *
#define SELECT_TYPE_ARG5 struct timeval *
#define SELECT_TYPE_RETV int

#define HAVE_SEND 1
#define SEND_TYPE_ARG1 int
#define SEND_TYPE_ARG2 void *
#define SEND_QUAL_ARG2
#define SEND_TYPE_ARG3 int
#define SEND_TYPE_ARG4 int
#define SEND_TYPE_RETV int

#define HAVE_ALARM 1
#define HAVE_ARPA_INET_H 1
#define HAVE_ASSERT_H 1
#define HAVE_BASENAME 1
#define HAVE_BOOL_T 1
#define HAVE_CRYPTO_CLEANUP_ALL_EX_DATA 1
#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
#define HAVE_ERRNO_H 1
#define HAVE_FCNTL 1
#define HAVE_FCNTL_H 1
#define HAVE_FDOPEN 1
#define HAVE_FORK 1
#define HAVE_FREEADDRINFO 1
#define HAVE_FTRUNCATE 1
#define HAVE_GETADDRINFO 1
#define HAVE_GETEUID 1
#define HAVE_GETHOSTBYADDR 1
#define HAVE_GETHOSTBYNAME 1
#define HAVE_GETHOSTNAME 1
#define HAVE_GETPPID 1
#define HAVE_GETPROTOBYNAME 1
#define HAVE_GETPWUID 1
#define HAVE_GETTIMEOFDAY 1
#define HAVE_GMTIME_R 1
#define HAVE_INET_ADDR 1
#define HAVE_INET_NTOP 1
#define HAVE_INET_PTON 1
#define HAVE_INTTYPES_H 1
#define HAVE_IOCTL 1
#define HAVE_LIBGEN_H 1
#define HAVE_LIBSSL 1
#define HAVE_LIBZ 1
#define HAVE_LL 1
#define HAVE_LOCALE_H 1
#define HAVE_LOCALTIME_R 1
#define HAVE_LONGLONG 1
#define HAVE_NETDB_H 1
#define HAVE_NETINET_IN_H 1
#define HAVE_NETINET_TCP_H 1
#define HAVE_PWD_H 1
#define HAVE_SYS_SELECT_H 1

#define USE_OPENSSL 1
#define HAVE_OPENSSL_CRYPTO_H 1
#define HAVE_OPENSSL_ENGINE_H 1
#define HAVE_OPENSSL_ERR_H 1
#define HAVE_OPENSSL_PEM_H 1
#define HAVE_OPENSSL_PKCS12_H 1
#define HAVE_OPENSSL_RSA_H 1
#define HAVE_OPENSSL_SSL_H 1
#define HAVE_OPENSSL_X509_H 1

#define HAVE_PERROR 1
#define HAVE_PIPE 1
#define HAVE_POLL 1
#define HAVE_POLL_FINE 1
#define HAVE_POLL_H 1
#define HAVE_PTHREAD_H 1
#define HAVE_RAND_STATUS 1
#define HAVE_SETJMP_H 1
#define HAVE_SETLOCALE 1

#define HAVE_SETSOCKOPT 1
#define HAVE_SOCK_OPTS 1 /* for /sys/include/ape/sys/socket.h */

#define HAVE_SIGACTION 1
#define HAVE_SIGNAL 1
#define HAVE_SIGNAL_H 1
#define HAVE_SIGSETJMP 1
#define HAVE_SIG_ATOMIC_T 1
#define HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID 1
#define HAVE_SOCKET 1
#define HAVE_SSL_GET_SHUTDOWN 1
#define HAVE_STDBOOL_H 1
#define HAVE_STDINT_H 1
#define HAVE_STDIO_H 1
#define HAVE_STDLIB_H 1
#define HAVE_STRCASECMP 1
#define HAVE_STRDUP 1
#define HAVE_STRING_H 1
#define HAVE_STRNCASECMP 1
#define HAVE_STRSTR 1
#define HAVE_STRTOK_R 1
#define HAVE_STRTOLL 1
#define HAVE_STRUCT_TIMEVAL 1
#define HAVE_SYS_IOCTL_H 1
#define HAVE_SYS_PARAM_H 1
#define HAVE_SYS_RESOURCE_H 1
#define HAVE_SYS_SOCKET_H 1
#define HAVE_SYS_STAT_H 1
#define HAVE_SYS_TIME_H 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_SYS_UIO_H 1
#define HAVE_SYS_UN_H 1
#define HAVE_TERMIOS_H 1
#define HAVE_TIME_H 1
#define HAVE_UNAME 1
#define HAVE_UNISTD_H 1
#define HAVE_UTIME 1
#define HAVE_UTIME_H 1
#define HAVE_WRITEV 1

#define HAVE_ZLIB_H 1

#define HAVE_POSIX_STRERROR_R 1
#define HAVE_STRERROR_R 1
#define STRERROR_R_TYPE_ARG3 int

#define TIME_WITH_SYS_TIME 1
#define USE_BLOCKING_SOCKETS 1
#define USE_MANUAL 1

#define __attribute__(x)

#ifndef __cplusplus
#undef inline
#endif

#endif /* HEADER_CURL_CONFIG_PLAN9_H */
Changes to jni/curl/lib/connect.c.
71
72
73
74
75
76
77


78
79
80
81
82
83
84
#include "inet_pton.h"
#include "vtls/vtls.h" /* for Curl_ssl_check_cxn() */
#include "progress.h"
#include "warnless.h"
#include "conncache.h"
#include "multihandle.h"
#include "system_win32.h"



/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"

#ifdef __SYMBIAN32__







>
>







71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "inet_pton.h"
#include "vtls/vtls.h" /* for Curl_ssl_check_cxn() */
#include "progress.h"
#include "warnless.h"
#include "conncache.h"
#include "multihandle.h"
#include "system_win32.h"
#include "quic.h"
#include "socks.h"

/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"

#ifdef __SYMBIAN32__
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#endif
  }
}

static CURLcode
singleipconnect(struct connectdata *conn,
                const Curl_addrinfo *ai, /* start connecting to this */
                curl_socket_t *sock);

/*
 * Curl_timeleft() returns the amount of milliseconds left allowed for the
 * transfer/connection. If the value is negative, the timeout time has already
 * elapsed.
 *
 * The start time is stored in progress.t_startsingle - as set with







|







163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#endif
  }
}

static CURLcode
singleipconnect(struct connectdata *conn,
                const Curl_addrinfo *ai, /* start connecting to this */
                int sockindex);          /* 0 or 1 among the temp ones */

/*
 * Curl_timeleft() returns the amount of milliseconds left allowed for the
 * transfer/connection. If the value is negative, the timeout time has already
 * elapsed.
 *
 * The start time is stored in progress.t_startsingle - as set with
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
      if(conn->tempaddr[other]) {
        /* we can safely skip addresses of the other protocol family */
        while(ai && ai->ai_family != family)
          ai = ai->ai_next;
      }

      if(ai) {
        result = singleipconnect(conn, ai, &conn->tempsock[tempindex]);
        if(result == CURLE_COULDNT_CONNECT) {
          ai = ai->ai_next;
          continue;
        }

        conn->tempaddr[tempindex] = ai;
      }







|







593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
      if(conn->tempaddr[other]) {
        /* we can safely skip addresses of the other protocol family */
        while(ai && ai->ai_family != family)
          ai = ai->ai_next;
      }

      if(ai) {
        result = singleipconnect(conn, ai, tempindex);
        if(result == CURLE_COULDNT_CONNECT) {
          ai = ai->ai_next;
          continue;
        }

        conn->tempaddr[tempindex] = ai;
      }
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641


642
643
644
645
646
647
648
  memcpy(conn->data->info.conn_local_ip, conn->local_ip, MAX_IPADR_LEN);
  conn->data->info.conn_scheme = conn->handler->scheme;
  conn->data->info.conn_protocol = conn->handler->protocol;
  conn->data->info.conn_primary_port = conn->primary_port;
  conn->data->info.conn_local_port = conn->local_port;
}

UNITTEST bool getaddressinfo(struct sockaddr *sa, char *addr,
                             long *port);

/* retrieves ip address and port from a sockaddr structure.
   note it calls Curl_inet_ntop which sets errno on fail, not SOCKERRNO. */
UNITTEST bool getaddressinfo(struct sockaddr *sa, char *addr,
                             long *port)
{
  struct sockaddr_in *si = NULL;
#ifdef ENABLE_IPV6
  struct sockaddr_in6 *si6 = NULL;
#endif
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
  struct sockaddr_un *su = NULL;


#endif

  switch(sa->sa_family) {
    case AF_INET:
      si = (struct sockaddr_in *)(void *) sa;
      if(Curl_inet_ntop(sa->sa_family, &si->sin_addr,
                        addr, MAX_IPADR_LEN)) {







<
<
<


|
|







>
>







623
624
625
626
627
628
629



630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
  memcpy(conn->data->info.conn_local_ip, conn->local_ip, MAX_IPADR_LEN);
  conn->data->info.conn_scheme = conn->handler->scheme;
  conn->data->info.conn_protocol = conn->handler->protocol;
  conn->data->info.conn_primary_port = conn->primary_port;
  conn->data->info.conn_local_port = conn->local_port;
}




/* retrieves ip address and port from a sockaddr structure.
   note it calls Curl_inet_ntop which sets errno on fail, not SOCKERRNO. */
bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
                      char *addr, long *port)
{
  struct sockaddr_in *si = NULL;
#ifdef ENABLE_IPV6
  struct sockaddr_in6 *si6 = NULL;
#endif
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
  struct sockaddr_un *su = NULL;
#else
  (void)salen;
#endif

  switch(sa->sa_family) {
    case AF_INET:
      si = (struct sockaddr_in *)(void *) sa;
      if(Curl_inet_ntop(sa->sa_family, &si->sin_addr,
                        addr, MAX_IPADR_LEN)) {
660
661
662
663
664
665
666

667
668



669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696

697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740




















































741
742
743
744
745
746
747
        *port = us_port;
        return TRUE;
      }
      break;
#endif
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
    case AF_UNIX:

      su = (struct sockaddr_un*)sa;
      msnprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path);



      *port = 0;
      return TRUE;
#endif
    default:
      break;
  }

  addr[0] = '\0';
  *port = 0;
  errno = EAFNOSUPPORT;
  return FALSE;
}

/* retrieves the start/end point information of a socket of an established
   connection */
void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
{
  if(conn->socktype == SOCK_DGRAM)
    /* there's no connection! */
    return;

#if defined(HAVE_GETPEERNAME) || defined(HAVE_GETSOCKNAME)
  if(!conn->bits.reuse && !conn->bits.tcp_fastopen) {
    struct Curl_easy *data = conn->data;
    char buffer[STRERROR_LEN];
    struct Curl_sockaddr_storage ssrem;
    struct Curl_sockaddr_storage ssloc;
    curl_socklen_t len;

#ifdef HAVE_GETPEERNAME
    len = sizeof(struct Curl_sockaddr_storage);
    if(getpeername(sockfd, (struct sockaddr*) &ssrem, &len)) {
      int error = SOCKERRNO;
      failf(data, "getpeername() failed with errno %d: %s",
            error, Curl_strerror(error, buffer, sizeof(buffer)));
      return;
    }
#endif
#ifdef HAVE_GETSOCKNAME
    len = sizeof(struct Curl_sockaddr_storage);
    memset(&ssloc, 0, sizeof(ssloc));
    if(getsockname(sockfd, (struct sockaddr*) &ssloc, &len)) {
      int error = SOCKERRNO;
      failf(data, "getsockname() failed with errno %d: %s",
            error, Curl_strerror(error, buffer, sizeof(buffer)));
      return;
    }
#endif
#ifdef HAVE_GETPEERNAME
    if(!getaddressinfo((struct sockaddr*)&ssrem,
                       conn->primary_ip, &conn->primary_port)) {
      failf(data, "ssrem inet_ntop() failed with errno %d: %s",
            errno, Curl_strerror(errno, buffer, sizeof(buffer)));
      return;
    }
    memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
#endif
#ifdef HAVE_GETSOCKNAME
    if(!getaddressinfo((struct sockaddr*)&ssloc,
                       conn->local_ip, &conn->local_port)) {
      failf(data, "ssloc inet_ntop() failed with errno %d: %s",
            errno, Curl_strerror(errno, buffer, sizeof(buffer)));
      return;
    }
#endif
  }
#else /* !HAVE_GETSOCKNAME && !HAVE_GETPEERNAME */
  (void)sockfd; /* unused */
#endif

  /* persist connection info in session handle */
  Curl_persistconninfo(conn);
}





















































/*
 * Curl_is_connected() checks if the socket has connected.
 */

CURLcode Curl_is_connected(struct connectdata *conn,
                           int sockindex,







>
|
|
>
>
>

















|
|








|
>

|
|







|

|







|
|







|
|













>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
        *port = us_port;
        return TRUE;
      }
      break;
#endif
#if defined(HAVE_SYS_UN_H) && defined(AF_UNIX)
    case AF_UNIX:
      if(salen > sizeof(sa_family_t)) {
        su = (struct sockaddr_un*)sa;
        msnprintf(addr, MAX_IPADR_LEN, "%s", su->sun_path);
      }
      else
        addr[0] = 0; /* socket with no name */
      *port = 0;
      return TRUE;
#endif
    default:
      break;
  }

  addr[0] = '\0';
  *port = 0;
  errno = EAFNOSUPPORT;
  return FALSE;
}

/* retrieves the start/end point information of a socket of an established
   connection */
void Curl_updateconninfo(struct connectdata *conn, curl_socket_t sockfd)
{
  if(conn->transport != TRNSPRT_TCP)
    /* there's no TCP connection! */
    return;

#if defined(HAVE_GETPEERNAME) || defined(HAVE_GETSOCKNAME)
  if(!conn->bits.reuse && !conn->bits.tcp_fastopen) {
    struct Curl_easy *data = conn->data;
    char buffer[STRERROR_LEN];
    struct Curl_sockaddr_storage ssrem;
    struct Curl_sockaddr_storage ssloc;
    curl_socklen_t plen;
    curl_socklen_t slen;
#ifdef HAVE_GETPEERNAME
    plen = sizeof(struct Curl_sockaddr_storage);
    if(getpeername(sockfd, (struct sockaddr*) &ssrem, &plen)) {
      int error = SOCKERRNO;
      failf(data, "getpeername() failed with errno %d: %s",
            error, Curl_strerror(error, buffer, sizeof(buffer)));
      return;
    }
#endif
#ifdef HAVE_GETSOCKNAME
    slen = sizeof(struct Curl_sockaddr_storage);
    memset(&ssloc, 0, sizeof(ssloc));
    if(getsockname(sockfd, (struct sockaddr*) &ssloc, &slen)) {
      int error = SOCKERRNO;
      failf(data, "getsockname() failed with errno %d: %s",
            error, Curl_strerror(error, buffer, sizeof(buffer)));
      return;
    }
#endif
#ifdef HAVE_GETPEERNAME
    if(!Curl_addr2string((struct sockaddr*)&ssrem, plen,
                         conn->primary_ip, &conn->primary_port)) {
      failf(data, "ssrem inet_ntop() failed with errno %d: %s",
            errno, Curl_strerror(errno, buffer, sizeof(buffer)));
      return;
    }
    memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
#endif
#ifdef HAVE_GETSOCKNAME
    if(!Curl_addr2string((struct sockaddr*)&ssloc, slen,
                         conn->local_ip, &conn->local_port)) {
      failf(data, "ssloc inet_ntop() failed with errno %d: %s",
            errno, Curl_strerror(errno, buffer, sizeof(buffer)));
      return;
    }
#endif
  }
#else /* !HAVE_GETSOCKNAME && !HAVE_GETPEERNAME */
  (void)sockfd; /* unused */
#endif

  /* persist connection info in session handle */
  Curl_persistconninfo(conn);
}

/* after a TCP connection to the proxy has been verified, this function does
   the next magic step.

   Note: this function's sub-functions call failf()

*/
static CURLcode connected_proxy(struct connectdata *conn, int sockindex)
{
  CURLcode result = CURLE_OK;

  if(conn->bits.socksproxy) {
#ifndef CURL_DISABLE_PROXY
    /* for the secondary socket (FTP), use the "connect to host"
     * but ignore the "connect to port" (use the secondary port)
     */
    const char * const host = conn->bits.httpproxy ?
                              conn->http_proxy.host.name :
                              conn->bits.conn_to_host ?
                              conn->conn_to_host.name :
                              sockindex == SECONDARYSOCKET ?
                              conn->secondaryhostname : conn->host.name;
    const int port = conn->bits.httpproxy ? (int)conn->http_proxy.port :
                     sockindex == SECONDARYSOCKET ? conn->secondary_port :
                     conn->bits.conn_to_port ? conn->conn_to_port :
                     conn->remote_port;
    conn->bits.socksproxy_connecting = TRUE;
    switch(conn->socks_proxy.proxytype) {
    case CURLPROXY_SOCKS5:
    case CURLPROXY_SOCKS5_HOSTNAME:
      result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
                         host, port, sockindex, conn);
      break;

    case CURLPROXY_SOCKS4:
    case CURLPROXY_SOCKS4A:
      result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
                           conn);
      break;

    default:
      failf(conn->data, "unknown proxytype option given");
      result = CURLE_COULDNT_CONNECT;
    } /* switch proxytype */
    conn->bits.socksproxy_connecting = FALSE;
#else
  (void)sockindex;
#endif /* CURL_DISABLE_PROXY */
  }

  return result;
}

/*
 * Curl_is_connected() checks if the socket has connected.
 */

CURLcode Curl_is_connected(struct connectdata *conn,
                           int sockindex,
776
777
778
779
780
781
782


















783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
    return CURLE_OPERATION_TIMEDOUT;
  }

  for(i = 0; i<2; i++) {
    const int other = i ^ 1;
    if(conn->tempsock[i] == CURL_SOCKET_BAD)
      continue;



















#ifdef mpeix
    /* Call this function once now, and ignore the results. We do this to
       "clear" the error state on the socket so that we can later read it
       reliably. This is reported necessary on the MPE/iX operating system. */
    (void)verifyconnect(conn->tempsock[i], NULL);
#endif

    /* check socket for connect */
    rc = SOCKET_WRITABLE(conn->tempsock[i], 0);

    if(rc == 0) { /* no connection yet */
      error = 0;
      if(Curl_timediff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
        infof(data, "After %ldms connect time, move on!\n",
              conn->timeoutms_per_addr);
        error = ETIMEDOUT;
      }

      /* should we try another protocol family? */
      if(i == 0 && conn->tempaddr[1] == NULL &&
         (Curl_timediff(now, conn->connecttime) >=
          data->set.happy_eyeballs_timeout)) {







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>














|
|







834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
    return CURLE_OPERATION_TIMEDOUT;
  }

  for(i = 0; i<2; i++) {
    const int other = i ^ 1;
    if(conn->tempsock[i] == CURL_SOCKET_BAD)
      continue;

#ifdef ENABLE_QUIC
    if(conn->transport == TRNSPRT_QUIC) {
      result = Curl_quic_is_connected(conn, i, connected);
      if(result) {
        error = SOCKERRNO;
        goto error;
      }
      if(*connected) {
        /* use this socket from now on */
        conn->sock[sockindex] = conn->tempsock[i];
        conn->ip_addr = conn->tempaddr[i];
        conn->tempsock[i] = CURL_SOCKET_BAD;
        connkeep(conn, "HTTP/3 default");
      }
      return result;
    }
#endif

#ifdef mpeix
    /* Call this function once now, and ignore the results. We do this to
       "clear" the error state on the socket so that we can later read it
       reliably. This is reported necessary on the MPE/iX operating system. */
    (void)verifyconnect(conn->tempsock[i], NULL);
#endif

    /* check socket for connect */
    rc = SOCKET_WRITABLE(conn->tempsock[i], 0);

    if(rc == 0) { /* no connection yet */
      error = 0;
      if(Curl_timediff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
        infof(data, "After %" CURL_FORMAT_TIMEDIFF_T
              "ms connect time, move on!\n", conn->timeoutms_per_addr);
        error = ETIMEDOUT;
      }

      /* should we try another protocol family? */
      if(i == 0 && conn->tempaddr[1] == NULL &&
         (Curl_timediff(now, conn->connecttime) >=
          data->set.happy_eyeballs_timeout)) {
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846



847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
        /* close the other socket, if open */
        if(conn->tempsock[other] != CURL_SOCKET_BAD) {
          Curl_closesocket(conn, conn->tempsock[other]);
          conn->tempsock[other] = CURL_SOCKET_BAD;
        }

        /* see if we need to do any proxy magic first once we connected */
        result = Curl_connected_proxy(conn, sockindex);
        if(result)
          return result;

        conn->bits.tcpconnect[sockindex] = TRUE;

        *connected = TRUE;
        if(sockindex == FIRSTSOCKET)
          Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */
        Curl_updateconninfo(conn, conn->sock[sockindex]);
        Curl_verboseconnect(conn);

        return CURLE_OK;
      }
      infof(data, "Connection failed\n");
    }
    else if(rc & CURL_CSELECT_ERR)
      (void)verifyconnect(conn->tempsock[i], &error);




    /*
     * The connection failed here, we should attempt to connect to the "next
     * address" for the given host. But first remember the latest error.
     */
    if(error) {
      data->state.os_errno = error;
      SET_SOCKERRNO(error);
      if(conn->tempaddr[i]) {
        CURLcode status;
        char ipaddress[MAX_IPADR_LEN];
        char buffer[STRERROR_LEN];
        Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN);
        infof(data, "connect to %s port %ld failed: %s\n",
              ipaddress, conn->port,
              Curl_strerror(error, buffer, sizeof(buffer)));

        conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ?
                                   allow : allow / 2;

        status = trynextip(conn, sockindex, i);
        if(status != CURLE_COULDNT_CONNECT
            || conn->tempsock[other] == CURL_SOCKET_BAD)
          /* the last attempt failed and no other sockets remain open */
          result = status;
      }
    }
  }

  if(result) {







|


















>
>
>

















|


|
|







897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
        /* close the other socket, if open */
        if(conn->tempsock[other] != CURL_SOCKET_BAD) {
          Curl_closesocket(conn, conn->tempsock[other]);
          conn->tempsock[other] = CURL_SOCKET_BAD;
        }

        /* see if we need to do any proxy magic first once we connected */
        result = connected_proxy(conn, sockindex);
        if(result)
          return result;

        conn->bits.tcpconnect[sockindex] = TRUE;

        *connected = TRUE;
        if(sockindex == FIRSTSOCKET)
          Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */
        Curl_updateconninfo(conn, conn->sock[sockindex]);
        Curl_verboseconnect(conn);

        return CURLE_OK;
      }
      infof(data, "Connection failed\n");
    }
    else if(rc & CURL_CSELECT_ERR)
      (void)verifyconnect(conn->tempsock[i], &error);

#ifdef ENABLE_QUIC
    error:
#endif
    /*
     * The connection failed here, we should attempt to connect to the "next
     * address" for the given host. But first remember the latest error.
     */
    if(error) {
      data->state.os_errno = error;
      SET_SOCKERRNO(error);
      if(conn->tempaddr[i]) {
        CURLcode status;
        char ipaddress[MAX_IPADR_LEN];
        char buffer[STRERROR_LEN];
        Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN);
        infof(data, "connect to %s port %ld failed: %s\n",
              ipaddress, conn->port,
              Curl_strerror(error, buffer, sizeof(buffer)));

        conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ?
          allow : allow / 2;

        status = trynextip(conn, sockindex, i);
        if((status != CURLE_COULDNT_CONNECT) ||
           conn->tempsock[other] == CURL_SOCKET_BAD)
          /* the last attempt failed and no other sockets remain open */
          result = status;
      }
    }
  }

  if(result) {
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
 * CURL_SOCKET_BAD. Other errors will however return proper errors.
 *
 * singleipconnect() connects to the given IP only, and it may return without
 * having connected.
 */
static CURLcode singleipconnect(struct connectdata *conn,
                                const Curl_addrinfo *ai,
                                curl_socket_t *sockp)
{
  struct Curl_sockaddr_ex addr;
  int rc = -1;
  int error = 0;
  bool isconnected = FALSE;
  struct Curl_easy *data = conn->data;
  curl_socket_t sockfd;
  CURLcode result;
  char ipaddress[MAX_IPADR_LEN];
  long port;
  bool is_tcp;
#ifdef TCP_FASTOPEN_CONNECT
  int optval = 1;
#endif
  char buffer[STRERROR_LEN];

  *sockp = CURL_SOCKET_BAD;

  result = Curl_socket(conn, ai, &addr, &sockfd);
  if(result)
    /* Failed to create the socket, but still return OK since we signal the
       lack of socket as well. This allows the parent function to keep looping
       over alternative addresses/socket families etc. */
    return CURLE_OK;

  /* store remote address and port used in this connection attempt */
  if(!getaddressinfo((struct sockaddr*)&addr.sa_addr,
                     ipaddress, &port)) {
    /* malformed address or bug in inet_ntop, try next address */
    failf(data, "sa_addr inet_ntop() failed with errno %d: %s",
          errno, Curl_strerror(errno, buffer, sizeof(buffer)));
    Curl_closesocket(conn, sockfd);
    return CURLE_OK;
  }
  infof(data, "  Trying %s:%ld...\n", ipaddress, port);







|















|










|
|







1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
 * CURL_SOCKET_BAD. Other errors will however return proper errors.
 *
 * singleipconnect() connects to the given IP only, and it may return without
 * having connected.
 */
static CURLcode singleipconnect(struct connectdata *conn,
                                const Curl_addrinfo *ai,
                                int sockindex)
{
  struct Curl_sockaddr_ex addr;
  int rc = -1;
  int error = 0;
  bool isconnected = FALSE;
  struct Curl_easy *data = conn->data;
  curl_socket_t sockfd;
  CURLcode result;
  char ipaddress[MAX_IPADR_LEN];
  long port;
  bool is_tcp;
#ifdef TCP_FASTOPEN_CONNECT
  int optval = 1;
#endif
  char buffer[STRERROR_LEN];
  curl_socket_t *sockp = &conn->tempsock[sockindex];
  *sockp = CURL_SOCKET_BAD;

  result = Curl_socket(conn, ai, &addr, &sockfd);
  if(result)
    /* Failed to create the socket, but still return OK since we signal the
       lack of socket as well. This allows the parent function to keep looping
       over alternative addresses/socket families etc. */
    return CURLE_OK;

  /* store remote address and port used in this connection attempt */
  if(!Curl_addr2string((struct sockaddr*)&addr.sa_addr, addr.addrlen,
                       ipaddress, &port)) {
    /* malformed address or bug in inet_ntop, try next address */
    failf(data, "sa_addr inet_ntop() failed with errno %d: %s",
          errno, Curl_strerror(errno, buffer, sizeof(buffer)));
    Curl_closesocket(conn, sockfd);
    return CURLE_OK;
  }
  infof(data, "  Trying %s:%ld...\n", ipaddress, port);
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
  /* set socket non-blocking */
  (void)curlx_nonblock(sockfd, TRUE);

  conn->connecttime = Curl_now();
  if(conn->num_addr > 1)
    Curl_expire(data, conn->timeoutms_per_addr, EXPIRE_DNS_PER_NAME);

  /* Connect TCP sockets, bind UDP */
  if(!isconnected && (conn->socktype == SOCK_STREAM)) {
    if(conn->bits.tcp_fastopen) {
#if defined(CONNECT_DATA_IDEMPOTENT) /* Darwin */
#  if defined(HAVE_BUILTIN_AVAILABLE)
      /* while connectx function is available since macOS 10.11 / iOS 9,
         it did not have the interface declared correctly until
         Xcode 9 / macOS SDK 10.13 */
      if(__builtin_available(macOS 10.11, iOS 9.0, tvOS 9.0, watchOS 2.0, *)) {







|
|







1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
  /* set socket non-blocking */
  (void)curlx_nonblock(sockfd, TRUE);

  conn->connecttime = Curl_now();
  if(conn->num_addr > 1)
    Curl_expire(data, conn->timeoutms_per_addr, EXPIRE_DNS_PER_NAME);

  /* Connect TCP and QUIC sockets */
  if(!isconnected && (conn->transport != TRNSPRT_UDP)) {
    if(conn->bits.tcp_fastopen) {
#if defined(CONNECT_DATA_IDEMPOTENT) /* Darwin */
#  if defined(HAVE_BUILTIN_AVAILABLE)
      /* while connectx function is available since macOS 10.11 / iOS 9,
         it did not have the interface declared correctly until
         Xcode 9 / macOS SDK 10.13 */
      if(__builtin_available(macOS 10.11, iOS 9.0, tvOS 9.0, watchOS 2.0, *)) {
1142
1143
1144
1145
1146
1147
1148










1149
1150
1151
1152
1153
1154
1155
    }
    else {
      rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
    }

    if(-1 == rc)
      error = SOCKERRNO;










  }
  else {
    *sockp = sockfd;
    return CURLE_OK;
  }

  if(-1 == rc) {







>
>
>
>
>
>
>
>
>
>







1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
    }
    else {
      rc = connect(sockfd, &addr.sa_addr, addr.addrlen);
    }

    if(-1 == rc)
      error = SOCKERRNO;
#ifdef ENABLE_QUIC
    else if(conn->transport == TRNSPRT_QUIC) {
      /* pass in 'sockfd' separately since it hasn't been put into the
         tempsock array at this point */
      result = Curl_quic_connect(conn, sockfd, sockindex,
                                 &addr.sa_addr, addr.addrlen);
      if(result)
        error = SOCKERRNO;
    }
#endif
  }
  else {
    *sockp = sockfd;
    return CURLE_OK;
  }

  if(-1 == rc) {
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229

  /* Max time for the next connection attempt */
  conn->timeoutms_per_addr =
    conn->tempaddr[0]->ai_next == NULL ? timeout_ms : timeout_ms / 2;

  /* start connecting to first IP */
  while(conn->tempaddr[0]) {
    result = singleipconnect(conn, conn->tempaddr[0], &(conn->tempsock[0]));
    if(!result)
      break;
    conn->tempaddr[0] = conn->tempaddr[0]->ai_next;
  }

  if(conn->tempsock[0] == CURL_SOCKET_BAD) {
    if(!result)







|







1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318

  /* Max time for the next connection attempt */
  conn->timeoutms_per_addr =
    conn->tempaddr[0]->ai_next == NULL ? timeout_ms : timeout_ms / 2;

  /* start connecting to first IP */
  while(conn->tempaddr[0]) {
    result = singleipconnect(conn, conn->tempaddr[0], 0);
    if(!result)
      break;
    conn->tempaddr[0] = conn->tempaddr[0]->ai_next;
  }

  if(conn->tempsock[0] == CURL_SOCKET_BAD) {
    if(!result)
1382
1383
1384
1385
1386
1387
1388
1389

1390
1391
1392
1393
1394
1395
1396
1397
   * curl_sockaddr structure with enough space available to directly hold
   * any protocol-specific address structures. The variable declared here
   * will be used to pass / receive data to/from the fopensocket callback
   * if this has been set, before that, it is initialized from parameters.
   */

  addr->family = ai->ai_family;
  addr->socktype = conn->socktype;

  addr->protocol = conn->socktype == SOCK_DGRAM?IPPROTO_UDP:ai->ai_protocol;
  addr->addrlen = ai->ai_addrlen;

  if(addr->addrlen > sizeof(struct Curl_sockaddr_storage))
     addr->addrlen = sizeof(struct Curl_sockaddr_storage);
  memcpy(&addr->sa_addr, ai->ai_addr, addr->addrlen);

  if(data->set.fopensocket) {







|
>
|







1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
   * curl_sockaddr structure with enough space available to directly hold
   * any protocol-specific address structures. The variable declared here
   * will be used to pass / receive data to/from the fopensocket callback
   * if this has been set, before that, it is initialized from parameters.
   */

  addr->family = ai->ai_family;
  addr->socktype = (conn->transport == TRNSPRT_TCP) ? SOCK_STREAM : SOCK_DGRAM;
  addr->protocol = conn->transport != TRNSPRT_TCP ? IPPROTO_UDP :
    ai->ai_protocol;
  addr->addrlen = ai->ai_addrlen;

  if(addr->addrlen > sizeof(struct Curl_sockaddr_storage))
     addr->addrlen = sizeof(struct Curl_sockaddr_storage);
  memcpy(&addr->sa_addr, ai->ai_addr, addr->addrlen);

  if(data->set.fopensocket) {
Changes to jni/curl/lib/connect.h.
46
47
48
49
50
51
52



53
54
55
56
57
58
59
 * Used to extract socket and connectdata struct for the most recent
 * transfer on the given Curl_easy.
 *
 * The returned socket will be CURL_SOCKET_BAD in case of failure!
 */
curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
                                  struct connectdata **connp);




/*
 * Check if a connection seems to be alive.
 */
bool Curl_connalive(struct connectdata *conn);

#ifdef USE_WINSOCK







>
>
>







46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 * Used to extract socket and connectdata struct for the most recent
 * transfer on the given Curl_easy.
 *
 * The returned socket will be CURL_SOCKET_BAD in case of failure!
 */
curl_socket_t Curl_getconnectinfo(struct Curl_easy *data,
                                  struct connectdata **connp);

bool Curl_addr2string(struct sockaddr *sa, curl_socklen_t salen,
                      char *addr, long *port);

/*
 * Check if a connection seems to be alive.
 */
bool Curl_connalive(struct connectdata *conn);

#ifdef USE_WINSOCK
Changes to jni/curl/lib/cookie.c.
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
        if(ptr[0]=='.') /* skip preceding dots */
          ptr++;
        co->domain = strdup(ptr);
        if(!co->domain)
          badcookie = TRUE;
        break;
      case 1:
        /* This field got its explanation on the 23rd of May 2001 by
           Andrés García:

           flag: A TRUE/FALSE value indicating if all machines within a given
           domain can access the variable. This value is set automatically by
           the browser, depending on the value you set for the domain.

           As far as I can see, it is set to true when the cookie says
           .domain.com and to false when the domain is complete www.domain.com
        */
        co->tailmatch = strcasecompare(ptr, "TRUE")?TRUE:FALSE;
        break;
      case 2:
        /* It turns out, that sometimes the file format allows the path
           field to remain not filled in, we try to detect this and work
           around it! Andrés García made us aware of this... */
        if(strcmp("TRUE", ptr) && strcmp("FALSE", ptr)) {
          /* only if the path doesn't look like a boolean option! */
          co->path = strdup(ptr);
          if(!co->path)
            badcookie = TRUE;
          else {
            co->spath = sanitize_cookie_path(co->path);







<
<
<
|
|
<
<
<





|
<
<







815
816
817
818
819
820
821



822
823



824
825
826
827
828
829


830
831
832
833
834
835
836
        if(ptr[0]=='.') /* skip preceding dots */
          ptr++;
        co->domain = strdup(ptr);
        if(!co->domain)
          badcookie = TRUE;
        break;
      case 1:



        /* flag: A TRUE/FALSE value indicating if all machines within a given
           domain can access the variable. Set TRUE when the cookie says



           .domain.com and to false when the domain is complete www.domain.com
        */
        co->tailmatch = strcasecompare(ptr, "TRUE")?TRUE:FALSE;
        break;
      case 2:
        /* The file format allows the path field to remain not filled in */


        if(strcmp("TRUE", ptr) && strcmp("FALSE", ptr)) {
          /* only if the path doesn't look like a boolean option! */
          co->path = strdup(ptr);
          if(!co->path)
            badcookie = TRUE;
          else {
            co->spath = sanitize_cookie_path(co->path);
Changes to jni/curl/lib/curl_config.h.in.
481
482
483
484
485
486
487









488
489
490
491
492
493
494
#undef HAVE_NETINET_TCP_H

/* Define to 1 if you have the <net/if.h> header file. */
#undef HAVE_NET_IF_H

/* Define to 1 if you have the <nghttp2/nghttp2.h> header file. */
#undef HAVE_NGHTTP2_NGHTTP2_H










/* if you have an old MIT Kerberos version, lacking GSS_C_NT_HOSTBASED_SERVICE
   */
#undef HAVE_OLD_GSSMIT

/* Define to 1 if you have the <openssl/crypto.h> header file. */
#undef HAVE_OPENSSL_CRYPTO_H







>
>
>
>
>
>
>
>
>







481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
#undef HAVE_NETINET_TCP_H

/* Define to 1 if you have the <net/if.h> header file. */
#undef HAVE_NET_IF_H

/* Define to 1 if you have the <nghttp2/nghttp2.h> header file. */
#undef HAVE_NGHTTP2_NGHTTP2_H

/* Define to 1 if you have the <nghttp3/nghttp3.h> header file. */
#undef HAVE_NGHTTP3_NGHTTP3_H

/* Define to 1 if you have the <ngtcp2/ngtcp2_crypto.h> header file. */
#undef HAVE_NGTCP2_NGTCP2_CRYPTO_H

/* Define to 1 if you have the <ngtcp2/ngtcp2.h> header file. */
#undef HAVE_NGTCP2_NGTCP2_H

/* if you have an old MIT Kerberos version, lacking GSS_C_NT_HOSTBASED_SERVICE
   */
#undef HAVE_OLD_GSSMIT

/* Define to 1 if you have the <openssl/crypto.h> header file. */
#undef HAVE_OPENSSL_CRYPTO_H
539
540
541
542
543
544
545



546
547
548
549
550
551
552
#undef HAVE_PROTO_BSDSOCKET_H

/* if you have <pthread.h> */
#undef HAVE_PTHREAD_H

/* Define to 1 if you have the <pwd.h> header file. */
#undef HAVE_PWD_H




/* Define to 1 if you have the `RAND_egd' function. */
#undef HAVE_RAND_EGD

/* Define to 1 if you have the recv function. */
#undef HAVE_RECV








>
>
>







548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
#undef HAVE_PROTO_BSDSOCKET_H

/* if you have <pthread.h> */
#undef HAVE_PTHREAD_H

/* Define to 1 if you have the <pwd.h> header file. */
#undef HAVE_PWD_H

/* Define to 1 if you have the <quiche.h> header file. */
#undef HAVE_QUICHE_H

/* Define to 1 if you have the `RAND_egd' function. */
#undef HAVE_RAND_EGD

/* Define to 1 if you have the recv function. */
#undef HAVE_RECV

734
735
736
737
738
739
740



741
742
743
744
745
746
747
#undef HAVE_TIME_H

/* Define this if time_t is unsigned */
#undef HAVE_TIME_T_UNSIGNED

/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H




/* Define to 1 if you have the `utime' function. */
#undef HAVE_UTIME

/* Define to 1 if you have the `utimes' function. */
#undef HAVE_UTIMES








>
>
>







746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
#undef HAVE_TIME_H

/* Define this if time_t is unsigned */
#undef HAVE_TIME_T_UNSIGNED

/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H

/* Define to 1 if you have the `usleep' function. */
#undef HAVE_USLEEP

/* Define to 1 if you have the `utime' function. */
#undef HAVE_UTIME

/* Define to 1 if you have the `utimes' function. */
#undef HAVE_UTIMES

966
967
968
969
970
971
972









973
974
975
976
977
978
979
980



981
982
983
984
985
986
987

/* Define to enable metalink support */
#undef USE_METALINK

/* if nghttp2 is in use */
#undef USE_NGHTTP2










/* if NSS is enabled */
#undef USE_NSS

/* Use OpenLDAP-specific code */
#undef USE_OPENLDAP

/* if OpenSSL is in use */
#undef USE_OPENSSL




/* to enable Windows native SSL/TLS support */
#undef USE_SCHANNEL

/* enable Secure Transport */
#undef USE_SECTRANSP








>
>
>
>
>
>
>
>
>








>
>
>







981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014

/* Define to enable metalink support */
#undef USE_METALINK

/* if nghttp2 is in use */
#undef USE_NGHTTP2

/* if nghttp3 is in use */
#undef USE_NGHTTP3

/* if ngtcp2 is in use */
#undef USE_NGTCP2

/* if ngtcp2_crypto_openssl is in use */
#undef USE_NGTCP2_CRYPTO_OPENSSL

/* if NSS is enabled */
#undef USE_NSS

/* Use OpenLDAP-specific code */
#undef USE_OPENLDAP

/* if OpenSSL is in use */
#undef USE_OPENSSL

/* if quiche is in use */
#undef USE_QUICHE

/* to enable Windows native SSL/TLS support */
#undef USE_SCHANNEL

/* enable Secure Transport */
#undef USE_SECTRANSP

Changes to jni/curl/lib/curl_md4.h.
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#if defined(USE_NSS) || defined(USE_OS400CRYPTO) || \
    (defined(USE_OPENSSL) && defined(OPENSSL_NO_MD4)) || \
    (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))

void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len);

#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) ||
    (defined(USE_OPENSSL) && defined(OPENSSL_NO_MD4)) ||
    (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C)) */

#endif /* HEADER_CURL_MD4_H */







|
|
|



|
<
<


20
21
22
23
24
25
26
27
28
29
30
31
32
33


34
35
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#if !defined(CURL_DISABLE_CRYPTO_AUTH)

#define MD4_DIGEST_LENGTH 16

void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len);

#endif /* !defined(CURL_DISABLE_CRYPTO_AUTH) */



#endif /* HEADER_CURL_MD4_H */
Changes to jni/curl/lib/curl_ntlm_core.c.
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128

129
130
131
132
133
134
135
 */

#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)

#ifdef USE_OPENSSL

#  include <openssl/des.h>
#  ifndef OPENSSL_NO_MD4
#    include <openssl/md4.h>
#  else
#    include "curl_md4.h"
#  endif
#  include <openssl/md5.h>
#  include <openssl/ssl.h>
#  include <openssl/rand.h>
#  if (OPENSSL_VERSION_NUMBER < 0x00907001L)
#    define DES_key_schedule des_key_schedule
#    define DES_cblock des_cblock
#    define DES_set_odd_parity des_set_odd_parity
#    define DES_set_key des_set_key
#    define DES_ecb_encrypt des_ecb_encrypt
#    define DESKEY(x) x
#    define DESKEYARG(x) x
#  else
#    define DESKEYARG(x) *x
#    define DESKEY(x) &x
#  endif

#elif defined(USE_GNUTLS_NETTLE)

#  include <nettle/des.h>
#  include <nettle/md4.h>

#elif defined(USE_GNUTLS)

#  include <gcrypt.h>
#  define MD5_DIGEST_LENGTH 16
#  define MD4_DIGEST_LENGTH 16

#elif defined(USE_NSS)

#  include <nss.h>
#  include <pk11pub.h>
#  include <hasht.h>
#  include "curl_md4.h"
#  define MD5_DIGEST_LENGTH MD5_LENGTH

#elif defined(USE_MBEDTLS)

#  include <mbedtls/des.h>
#  include <mbedtls/md4.h>
#  if !defined(MBEDTLS_MD4_C)
#    include "curl_md4.h"
#  endif

#elif defined(USE_SECTRANSP)

#  include <CommonCrypto/CommonCryptor.h>
#  include <CommonCrypto/CommonDigest.h>

#elif defined(USE_OS400CRYPTO)
#  include "cipher.mih"  /* mih/cipher */
#  include "curl_md4.h"
#elif defined(USE_WIN32_CRYPTO)
#  include <wincrypt.h>
#else
#  error "Can't compile NTLM support without a crypto library."
#endif

#include "urldata.h"
#include "non-ascii.h"
#include "strcase.h"
#include "curl_ntlm_core.h"
#include "curl_md5.h"
#include "curl_hmac.h"
#include "warnless.h"
#include "curl_endian.h"
#include "curl_des.h"

/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"

#define NTLM_HMAC_MD5_LEN     (16)
#define NTLMv2_BLOB_SIGNATURE "\x01\x01\x00\x00"







<
<
<
<
<



















<





<






<





<
<
|
<








<















>







51
52
53
54
55
56
57





58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

77
78
79
80
81

82
83
84
85
86
87

88
89
90
91
92


93

94
95
96
97
98
99
100
101

102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
 */

#if !defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)

#ifdef USE_OPENSSL

#  include <openssl/des.h>





#  include <openssl/md5.h>
#  include <openssl/ssl.h>
#  include <openssl/rand.h>
#  if (OPENSSL_VERSION_NUMBER < 0x00907001L)
#    define DES_key_schedule des_key_schedule
#    define DES_cblock des_cblock
#    define DES_set_odd_parity des_set_odd_parity
#    define DES_set_key des_set_key
#    define DES_ecb_encrypt des_ecb_encrypt
#    define DESKEY(x) x
#    define DESKEYARG(x) x
#  else
#    define DESKEYARG(x) *x
#    define DESKEY(x) &x
#  endif

#elif defined(USE_GNUTLS_NETTLE)

#  include <nettle/des.h>


#elif defined(USE_GNUTLS)

#  include <gcrypt.h>
#  define MD5_DIGEST_LENGTH 16


#elif defined(USE_NSS)

#  include <nss.h>
#  include <pk11pub.h>
#  include <hasht.h>

#  define MD5_DIGEST_LENGTH MD5_LENGTH

#elif defined(USE_MBEDTLS)

#  include <mbedtls/des.h>


#  include "curl_md4.h"


#elif defined(USE_SECTRANSP)

#  include <CommonCrypto/CommonCryptor.h>
#  include <CommonCrypto/CommonDigest.h>

#elif defined(USE_OS400CRYPTO)
#  include "cipher.mih"  /* mih/cipher */

#elif defined(USE_WIN32_CRYPTO)
#  include <wincrypt.h>
#else
#  error "Can't compile NTLM support without a crypto library."
#endif

#include "urldata.h"
#include "non-ascii.h"
#include "strcase.h"
#include "curl_ntlm_core.h"
#include "curl_md5.h"
#include "curl_hmac.h"
#include "warnless.h"
#include "curl_endian.h"
#include "curl_des.h"
#include "curl_md4.h"
/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"

#define NTLM_HMAC_MD5_LEN     (16)
#define NTLMv2_BLOB_SIGNATURE "\x01\x01\x00\x00"
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
                                   unsigned char *ntbuffer /* 21 bytes */)
{
  size_t len = strlen(password);
  unsigned char *pw;
  CURLcode result;
  if(len > SIZE_T_MAX/2) /* avoid integer overflow */
    return CURLE_OUT_OF_MEMORY;
  pw = len ? malloc(len * 2) : strdup("");
  if(!pw)
    return CURLE_OUT_OF_MEMORY;

  ascii_to_unicode_le(pw, password, len);

  /*
   * The NT hashed password needs to be created using the password in the
   * network encoding not the host encoding.
   */
  result = Curl_convert_to_network(data, (char *)pw, len * 2);
  if(result)
    return result;

  {
    /* Create NT hashed password. */
#ifdef USE_OPENSSL
#if !defined(OPENSSL_NO_MD4)
    MD4_CTX MD4pw;
    MD4_Init(&MD4pw);
    MD4_Update(&MD4pw, pw, 2 * len);
    MD4_Final(ntbuffer, &MD4pw);
#else
    Curl_md4it(ntbuffer, pw, 2 * len);
#endif
#elif defined(USE_GNUTLS_NETTLE)
    struct md4_ctx MD4pw;
    md4_init(&MD4pw);
    md4_update(&MD4pw, (unsigned int)(2 * len), pw);
    md4_digest(&MD4pw, MD4_DIGEST_SIZE, ntbuffer);
#elif defined(USE_GNUTLS)
    gcry_md_hd_t MD4pw;
    gcry_md_open(&MD4pw, GCRY_MD_MD4, 0);
    gcry_md_write(MD4pw, pw, 2 * len);
    memcpy(ntbuffer, gcry_md_read(MD4pw, 0), MD4_DIGEST_LENGTH);
    gcry_md_close(MD4pw);
#elif defined(USE_NSS)
    Curl_md4it(ntbuffer, pw, 2 * len);
#elif defined(USE_MBEDTLS)
#if defined(MBEDTLS_MD4_C)
    mbedtls_md4(pw, 2 * len, ntbuffer);
#else
    Curl_md4it(ntbuffer, pw, 2 * len);
#endif
#elif defined(USE_SECTRANSP)
    (void)CC_MD4(pw, (CC_LONG)(2 * len), ntbuffer);
#elif defined(USE_OS400CRYPTO)
    Curl_md4it(ntbuffer, pw, 2 * len);
#elif defined(USE_WIN32_CRYPTO)
    HCRYPTPROV hprov;
    if(CryptAcquireContext(&hprov, NULL, NULL, PROV_RSA_FULL,
                           CRYPT_VERIFYCONTEXT)) {
      HCRYPTHASH hhash;
      if(CryptCreateHash(hprov, CALG_MD4, 0, 0, &hhash)) {
        DWORD length = 16;
        CryptHashData(hhash, pw, (unsigned int)len * 2, 0);
        CryptGetHashParam(hhash, HP_HASHVAL, ntbuffer, &length, 0);
        CryptDestroyHash(hhash);
      }
      CryptReleaseContext(hprov, 0);
    }
#endif

    memset(ntbuffer + 16, 0, 21 - 16);
  }

  free(pw);

  return CURLE_OK;
}

#if defined(USE_NTLM_V2) && !defined(USE_WINDOWS_SSPI)







|













<
|
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
|
<







537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557

558







559


































560




561

562
563
564
565
566
567
568
                                   unsigned char *ntbuffer /* 21 bytes */)
{
  size_t len = strlen(password);
  unsigned char *pw;
  CURLcode result;
  if(len > SIZE_T_MAX/2) /* avoid integer overflow */
    return CURLE_OUT_OF_MEMORY;
  pw = len ? malloc(len * 2) : (unsigned char *)strdup("");
  if(!pw)
    return CURLE_OUT_OF_MEMORY;

  ascii_to_unicode_le(pw, password, len);

  /*
   * The NT hashed password needs to be created using the password in the
   * network encoding not the host encoding.
   */
  result = Curl_convert_to_network(data, (char *)pw, len * 2);
  if(result)
    return result;


  /* Create NT hashed password. */







  Curl_md4it(ntbuffer, pw, 2 * len);







































  memset(ntbuffer + 16, 0, 21 - 16);


  free(pw);

  return CURLE_OK;
}

#if defined(USE_NTLM_V2) && !defined(USE_WINDOWS_SSPI)
Changes to jni/curl/lib/curl_path.c.
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    real_path = malloc(working_path_len + 1);
    if(real_path == NULL) {
      free(working_path);
      return CURLE_OUT_OF_MEMORY;
    }
    if((working_path_len > 3) && (!memcmp(working_path, "/~/", 3)))
      /* It is referenced to the home directory, so strip the leading '/~/' */
      memcpy(real_path, working_path + 3, 4 + working_path_len-3);
    else
      memcpy(real_path, working_path, 1 + working_path_len);
  }
  else if(conn->handler->protocol & CURLPROTO_SFTP) {
    if((working_path_len > 1) && (working_path[1] == '~')) {
      size_t homelen = strlen(homedir);
      real_path = malloc(homelen + working_path_len + 1);







|







51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    real_path = malloc(working_path_len + 1);
    if(real_path == NULL) {
      free(working_path);
      return CURLE_OUT_OF_MEMORY;
    }
    if((working_path_len > 3) && (!memcmp(working_path, "/~/", 3)))
      /* It is referenced to the home directory, so strip the leading '/~/' */
      memcpy(real_path, working_path + 3, working_path_len - 2);
    else
      memcpy(real_path, working_path, 1 + working_path_len);
  }
  else if(conn->handler->protocol & CURLPROTO_SFTP) {
    if((working_path_len > 1) && (working_path[1] == '~')) {
      size_t homelen = strlen(homedir);
      real_path = malloc(homelen + working_path_len + 1);
Changes to jni/curl/lib/curl_rtmp.c.
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215

  RTMP_Init(r);
  RTMP_SetBufferMS(r, DEF_BUFTIME);
  if(!RTMP_SetupURL(r, conn->data->change.url)) {
    RTMP_Free(r);
    return CURLE_URL_MALFORMAT;
  }
  conn->proto.generic = r;
  return CURLE_OK;
}

static CURLcode rtmp_connect(struct connectdata *conn, bool *done)
{
  RTMP *r = conn->proto.generic;
  SET_RCVTIMEO(tv, 10);

  r->m_sb.sb_socket = (int)conn->sock[FIRSTSOCKET];

  /* We have to know if it's a write before we send the
   * connect request packet
   */







|





|







195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215

  RTMP_Init(r);
  RTMP_SetBufferMS(r, DEF_BUFTIME);
  if(!RTMP_SetupURL(r, conn->data->change.url)) {
    RTMP_Free(r);
    return CURLE_URL_MALFORMAT;
  }
  conn->proto.rtmp = r;
  return CURLE_OK;
}

static CURLcode rtmp_connect(struct connectdata *conn, bool *done)
{
  RTMP *r = conn->proto.rtmp;
  SET_RCVTIMEO(tv, 10);

  r->m_sb.sb_socket = (int)conn->sock[FIRSTSOCKET];

  /* We have to know if it's a write before we send the
   * connect request packet
   */
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
  conn->send[FIRSTSOCKET] = rtmp_send;
  return CURLE_OK;
}

static CURLcode rtmp_do(struct connectdata *conn, bool *done)
{
  struct Curl_easy *data = conn->data;
  RTMP *r = conn->proto.generic;

  if(!RTMP_ConnectStream(r, 0))
    return CURLE_FAILED_INIT;

  if(conn->data->set.upload) {
    Curl_pgrsSetUploadSize(data, data->state.infilesize);
    Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);







|







236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
  conn->send[FIRSTSOCKET] = rtmp_send;
  return CURLE_OK;
}

static CURLcode rtmp_do(struct connectdata *conn, bool *done)
{
  struct Curl_easy *data = conn->data;
  RTMP *r = conn->proto.rtmp;

  if(!RTMP_ConnectStream(r, 0))
    return CURLE_FAILED_INIT;

  if(conn->data->set.upload) {
    Curl_pgrsSetUploadSize(data, data->state.infilesize);
    Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316

  return CURLE_OK;
}

static CURLcode rtmp_disconnect(struct connectdata *conn,
                                bool dead_connection)
{
  RTMP *r = conn->proto.generic;
  (void)dead_connection;
  if(r) {
    conn->proto.generic = NULL;
    RTMP_Close(r);
    RTMP_Free(r);
  }
  return CURLE_OK;
}

static ssize_t rtmp_recv(struct connectdata *conn, int sockindex, char *buf,
                         size_t len, CURLcode *err)
{
  RTMP *r = conn->proto.generic;
  ssize_t nread;

  (void)sockindex; /* unused */

  nread = RTMP_Read(r, buf, curlx_uztosi(len));
  if(nread < 0) {
    if(r->m_read.status == RTMP_READ_COMPLETE ||
        r->m_read.status == RTMP_READ_EOF) {
      conn->data->req.size = conn->data->req.bytecount;
      nread = 0;
    }
    else
      *err = CURLE_RECV_ERROR;
  }
  return nread;
}

static ssize_t rtmp_send(struct connectdata *conn, int sockindex,
                         const void *buf, size_t len, CURLcode *err)
{
  RTMP *r = conn->proto.generic;
  ssize_t num;

  (void)sockindex; /* unused */

  num = RTMP_Write(r, (char *)buf, curlx_uztosi(len));
  if(num < 0)
    *err = CURLE_SEND_ERROR;

  return num;
}
#endif  /* USE_LIBRTMP */







|


|









|




















|











264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316

  return CURLE_OK;
}

static CURLcode rtmp_disconnect(struct connectdata *conn,
                                bool dead_connection)
{
  RTMP *r = conn->proto.rtmp;
  (void)dead_connection;
  if(r) {
    conn->proto.rtmp = NULL;
    RTMP_Close(r);
    RTMP_Free(r);
  }
  return CURLE_OK;
}

static ssize_t rtmp_recv(struct connectdata *conn, int sockindex, char *buf,
                         size_t len, CURLcode *err)
{
  RTMP *r = conn->proto.rtmp;
  ssize_t nread;

  (void)sockindex; /* unused */

  nread = RTMP_Read(r, buf, curlx_uztosi(len));
  if(nread < 0) {
    if(r->m_read.status == RTMP_READ_COMPLETE ||
        r->m_read.status == RTMP_READ_EOF) {
      conn->data->req.size = conn->data->req.bytecount;
      nread = 0;
    }
    else
      *err = CURLE_RECV_ERROR;
  }
  return nread;
}

static ssize_t rtmp_send(struct connectdata *conn, int sockindex,
                         const void *buf, size_t len, CURLcode *err)
{
  RTMP *r = conn->proto.rtmp;
  ssize_t num;

  (void)sockindex; /* unused */

  num = RTMP_Write(r, (char *)buf, curlx_uztosi(len));
  if(num < 0)
    *err = CURLE_SEND_ERROR;

  return num;
}
#endif  /* USE_LIBRTMP */
Changes to jni/curl/lib/curl_sasl.c.
366
367
368
369
370
371
372
373

374
375
376
377
378
379
380
381
    }
    else if(enabledmechs & SASL_MECH_PLAIN) {
      mech = SASL_MECH_STRING_PLAIN;
      state1 = SASL_PLAIN;
      sasl->authused = SASL_MECH_PLAIN;

      if(force_ir || data->set.sasl_ir)
        result = Curl_auth_create_plain_message(data, NULL, conn->user,

                                                conn->passwd, &resp, &len);
    }
    else if(enabledmechs & SASL_MECH_LOGIN) {
      mech = SASL_MECH_STRING_LOGIN;
      state1 = SASL_LOGIN;
      state2 = SASL_LOGIN_PASSWD;
      sasl->authused = SASL_MECH_LOGIN;








|
>
|







366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
    }
    else if(enabledmechs & SASL_MECH_PLAIN) {
      mech = SASL_MECH_STRING_PLAIN;
      state1 = SASL_PLAIN;
      sasl->authused = SASL_MECH_PLAIN;

      if(force_ir || data->set.sasl_ir)
        result = Curl_auth_create_plain_message(data, conn->sasl_authzid,
                                                conn->user, conn->passwd,
                                                &resp, &len);
    }
    else if(enabledmechs & SASL_MECH_LOGIN) {
      mech = SASL_MECH_STRING_LOGIN;
      state1 = SASL_LOGIN;
      state2 = SASL_LOGIN_PASSWD;
      sasl->authused = SASL_MECH_LOGIN;

449
450
451
452
453
454
455
456

457
458
459
460
461
462
463
464
  }

  switch(sasl->state) {
  case SASL_STOP:
    *progress = SASL_DONE;
    return result;
  case SASL_PLAIN:
    result = Curl_auth_create_plain_message(data, NULL, conn->user,

                                            conn->passwd, &resp, &len);
    break;
  case SASL_LOGIN:
    result = Curl_auth_create_login_message(data, conn->user, &resp, &len);
    newstate = SASL_LOGIN_PASSWD;
    break;
  case SASL_LOGIN_PASSWD:
    result = Curl_auth_create_login_message(data, conn->passwd, &resp, &len);







|
>
|







450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
  }

  switch(sasl->state) {
  case SASL_STOP:
    *progress = SASL_DONE;
    return result;
  case SASL_PLAIN:
    result = Curl_auth_create_plain_message(data, conn->sasl_authzid,
                                            conn->user, conn->passwd,
                                            &resp, &len);
    break;
  case SASL_LOGIN:
    result = Curl_auth_create_login_message(data, conn->user, &resp, &len);
    newstate = SASL_LOGIN_PASSWD;
    break;
  case SASL_LOGIN_PASSWD:
    result = Curl_auth_create_login_message(data, conn->passwd, &resp, &len);
Changes to jni/curl/lib/curl_setup.h.
91
92
93
94
95
96
97




98
99
100
101
102
103
104
#ifdef TPF
#  include "config-tpf.h"
#endif

#ifdef __VXWORKS__
#  include "config-vxworks.h"
#endif





#endif /* HAVE_CONFIG_H */

/* ================================================================ */
/* Definition of preprocessor macros/symbols which modify compiler  */
/* behavior or generated code characteristics must be done here,   */
/* as appropriate, before any system header file is included. It is */







>
>
>
>







91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifdef TPF
#  include "config-tpf.h"
#endif

#ifdef __VXWORKS__
#  include "config-vxworks.h"
#endif

#ifdef __PLAN9__
#  include "config-plan9.h"
#endif

#endif /* HAVE_CONFIG_H */

/* ================================================================ */
/* Definition of preprocessor macros/symbols which modify compiler  */
/* behavior or generated code characteristics must be done here,   */
/* as appropriate, before any system header file is included. It is */
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
   4. set the SIGALRM signal timeout
   5. set dir/file naming defines
   */

#ifdef WIN32

#  define DIR_CHAR      "\\"
#  define DOT_CHAR      "_"

#else /* WIN32 */

#  ifdef MSDOS  /* Watt-32 */

#    include <sys/ioctl.h>
#    define select(n,r,w,x,t) select_s(n,r,w,x,t)







<







482
483
484
485
486
487
488

489
490
491
492
493
494
495
   4. set the SIGALRM signal timeout
   5. set dir/file naming defines
   */

#ifdef WIN32

#  define DIR_CHAR      "\\"


#else /* WIN32 */

#  ifdef MSDOS  /* Watt-32 */

#    include <sys/ioctl.h>
#    define select(n,r,w,x,t) select_s(n,r,w,x,t)
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
#  ifdef __minix
     /* Minix 3 versions up to at least 3.1.3 are missing these prototypes */
     extern char *strtok_r(char *s, const char *delim, char **last);
     extern struct tm *gmtime_r(const time_t * const timep, struct tm *tmp);
#  endif

#  define DIR_CHAR      "/"
#  ifndef DOT_CHAR
#    define DOT_CHAR      "."
#  endif

#  ifdef MSDOS
#    undef DOT_CHAR
#    define DOT_CHAR      "_"
#  endif

#  ifndef fileno /* sunos 4 have this as a macro! */
     int fileno(FILE *stream);
#  endif

#endif /* WIN32 */








<
<
<
<
<
<
<
<







507
508
509
510
511
512
513








514
515
516
517
518
519
520
#  ifdef __minix
     /* Minix 3 versions up to at least 3.1.3 are missing these prototypes */
     extern char *strtok_r(char *s, const char *delim, char **last);
     extern struct tm *gmtime_r(const time_t * const timep, struct tm *tmp);
#  endif

#  define DIR_CHAR      "/"









#  ifndef fileno /* sunos 4 have this as a macro! */
     int fileno(FILE *stream);
#  endif

#endif /* WIN32 */

822
823
824
825
826
827
828
829




830
#endif

#ifdef DEBUGBUILD
#define UNITTEST
#else
#define UNITTEST static
#endif





#endif /* HEADER_CURL_SETUP_H */








>
>
>
>

817
818
819
820
821
822
823
824
825
826
827
828
829
#endif

#ifdef DEBUGBUILD
#define UNITTEST
#else
#define UNITTEST static
#endif

#if defined(USE_NGTCP2) || defined(USE_QUICHE)
#define ENABLE_QUIC
#endif

#endif /* HEADER_CURL_SETUP_H */
Changes to jni/curl/lib/doh.h.
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
                        const char *hostname,
                        int port,
                        int *waitp);

CURLcode Curl_doh_is_resolved(struct connectdata *conn,
                              struct Curl_dns_entry **dns);

int Curl_doh_getsock(struct connectdata *conn, curl_socket_t *socks,
                     int numsocks);

typedef enum {
  DOH_OK,
  DOH_DNS_BAD_LABEL,    /* 1 */
  DOH_DNS_OUT_OF_RANGE, /* 2 */
  DOH_DNS_LABEL_LOOP,   /* 3 */
  DOH_TOO_SMALL_BUFFER, /* 4 */







|
<







36
37
38
39
40
41
42
43

44
45
46
47
48
49
50
                        const char *hostname,
                        int port,
                        int *waitp);

CURLcode Curl_doh_is_resolved(struct connectdata *conn,
                              struct Curl_dns_entry **dns);

int Curl_doh_getsock(struct connectdata *conn, curl_socket_t *socks);


typedef enum {
  DOH_OK,
  DOH_DNS_BAD_LABEL,    /* 1 */
  DOH_DNS_OUT_OF_RANGE, /* 2 */
  DOH_DNS_LABEL_LOOP,   /* 3 */
  DOH_TOO_SMALL_BUFFER, /* 4 */
Changes to jni/curl/lib/easy.c.
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
  if(Curl_resolver_global_init()) {
    DEBUGF(fprintf(stderr, "Error: resolver_global_init failed\n"));
    return CURLE_FAILED_INIT;
  }

  (void)Curl_ipv6works();

#if defined(USE_LIBSSH2) && defined(HAVE_LIBSSH2_INIT)
  if(libssh2_init(0)) {
    DEBUGF(fprintf(stderr, "Error: libssh2_init failed\n"));
    return CURLE_FAILED_INIT;
  }
#endif

#if defined(USE_LIBSSH)
  if(ssh_init()) {
    DEBUGF(fprintf(stderr, "Error: libssh_init failed\n"));
    return CURLE_FAILED_INIT;
  }
#endif

  if(flags & CURL_GLOBAL_ACK_EINTR)
    Curl_ack_eintr = 1;








<
<
<
<
<
<
<
|
|
<







183
184
185
186
187
188
189







190
191

192
193
194
195
196
197
198
  if(Curl_resolver_global_init()) {
    DEBUGF(fprintf(stderr, "Error: resolver_global_init failed\n"));
    return CURLE_FAILED_INIT;
  }

  (void)Curl_ipv6works();








#if defined(USE_SSH)
  if(Curl_ssh_init()) {

    return CURLE_FAILED_INIT;
  }
#endif

  if(flags & CURL_GLOBAL_ACK_EINTR)
    Curl_ack_eintr = 1;

270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290

#ifdef WIN32
  Curl_win32_cleanup(init_flags);
#endif

  Curl_amiga_cleanup();

#if defined(USE_LIBSSH2) && defined(HAVE_LIBSSH2_EXIT)
  (void)libssh2_exit();
#endif

#if defined(USE_LIBSSH)
  (void)ssh_finalize();
#endif

  init_flags  = 0;
}

/*
 * curl_easy_init() is the external interface to alloc, setup and init an
 * easy handle that is returned. If anything goes wrong, NULL is returned.







<
<
<
|
<
<
<







262
263
264
265
266
267
268



269



270
271
272
273
274
275
276

#ifdef WIN32
  Curl_win32_cleanup(init_flags);
#endif

  Curl_amiga_cleanup();




  Curl_ssh_cleanup();




  init_flags  = 0;
}

/*
 * curl_easy_init() is the external interface to alloc, setup and init an
 * easy handle that is returned. If anything goes wrong, NULL is returned.
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
{
  bool done = FALSE;
  CURLMcode mcode = CURLM_OK;
  CURLcode result = CURLE_OK;

  while(!done && !mcode) {
    int still_running = 0;
    bool gotsocket = FALSE;

    mcode = Curl_multi_wait(multi, NULL, 0, 1000, NULL, &gotsocket);

    if(!mcode) {
      if(!gotsocket) {
        long sleep_ms;

        /* If it returns without any filedescriptor instantly, we need to
           avoid busy-looping during periods where it has nothing particular
           to wait for */
        curl_multi_timeout(multi, &sleep_ms);
        if(sleep_ms) {
          if(sleep_ms > 1000)
            sleep_ms = 1000;
          Curl_wait_ms((int)sleep_ms);
        }
      }

      mcode = curl_multi_perform(multi, &still_running);
    }

    /* only read 'still_running' if curl_multi_perform() return OK */
    if(!mcode && !still_running) {
      int rc;
      CURLMsg *msg = curl_multi_info_read(multi, &rc);
      if(msg) {
        result = msg->data.result;







<

|

|
<
<
<
<
<
<
<
<
<
<
<
<
<
<

<







584
585
586
587
588
589
590

591
592
593
594














595

596
597
598
599
600
601
602
{
  bool done = FALSE;
  CURLMcode mcode = CURLM_OK;
  CURLcode result = CURLE_OK;

  while(!done && !mcode) {
    int still_running = 0;


    mcode = curl_multi_poll(multi, NULL, 0, 1000, NULL);

    if(!mcode)














      mcode = curl_multi_perform(multi, &still_running);


    /* only read 'still_running' if curl_multi_perform() return OK */
    if(!mcode && !still_running) {
      int rc;
      CURLMsg *msg = curl_multi_info_read(multi, &rc);
      if(msg) {
        result = msg->data.result;
938
939
940
941
942
943
944


945
946
947
948
949
950
951

/*
 * curl_easy_reset() is an external interface that allows an app to re-
 * initialize a session handle to the default values.
 */
void curl_easy_reset(struct Curl_easy *data)
{


  Curl_free_request_state(data);

  /* zero out UserDefined data: */
  Curl_freeset(data);
  memset(&data->set, 0, sizeof(struct UserDefined));
  (void)Curl_init_userdefined(data);








>
>







908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923

/*
 * curl_easy_reset() is an external interface that allows an app to re-
 * initialize a session handle to the default values.
 */
void curl_easy_reset(struct Curl_easy *data)
{
  long old_buffer_size = data->set.buffer_size;

  Curl_free_request_state(data);

  /* zero out UserDefined data: */
  Curl_freeset(data);
  memset(&data->set, 0, sizeof(struct UserDefined));
  (void)Curl_init_userdefined(data);

961
962
963
964
965
966
967












968
969
970
971
972
973
974
  /* zero out authentication data: */
  memset(&data->state.authhost, 0, sizeof(struct auth));
  memset(&data->state.authproxy, 0, sizeof(struct auth));

#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
  Curl_http_auth_cleanup_digest(data);
#endif












}

/*
 * curl_easy_pause() allows an application to pause or unpause a specific
 * transfer and direction. This function sets the full new state for the
 * current connection this easy handle operates on.
 *







>
>
>
>
>
>
>
>
>
>
>
>







933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
  /* zero out authentication data: */
  memset(&data->state.authhost, 0, sizeof(struct auth));
  memset(&data->state.authproxy, 0, sizeof(struct auth));

#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH)
  Curl_http_auth_cleanup_digest(data);
#endif

  /* resize receive buffer */
  if(old_buffer_size != data->set.buffer_size) {
    char *newbuff = realloc(data->state.buffer, data->set.buffer_size + 1);
    if(!newbuff) {
      DEBUGF(fprintf(stderr, "Error: realloc of buffer failed\n"));
      /* nothing we can do here except use the old size */
      data->set.buffer_size = old_buffer_size;
    }
    else
      data->state.buffer = newbuff;
  }
}

/*
 * curl_easy_pause() allows an application to pause or unpause a specific
 * transfer and direction. This function sets the full new state for the
 * current connection this easy handle operates on.
 *
1135
1136
1137
1138
1139
1140
1141





























1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
  if(!result && !n1)
    return CURLE_AGAIN;

  *n = (size_t)n1;

  return result;
}






























/*
 * Performs connection upkeep for the given session handle.
 */
CURLcode curl_easy_upkeep(struct Curl_easy *data)
{
  /* Verify that we got an easy handle we can work with. */
  if(!GOOD_EASY_HANDLE(data))
    return CURLE_BAD_FUNCTION_ARGUMENT;

  if(data->multi_easy) {
    /* Use the common function to keep connections alive. */
    return Curl_upkeep(&data->multi_easy->conn_cache, data);
  }
  else {
    /* No connections, so just return success */
    return CURLE_OK;
  }
}







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>












|






1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
  if(!result && !n1)
    return CURLE_AGAIN;

  *n = (size_t)n1;

  return result;
}

/*
 * Wrapper to call functions in Curl_conncache_foreach()
 *
 * Returns always 0.
 */
static int conn_upkeep(struct connectdata *conn,
                       void *param)
{
  /* Param is unused. */
  (void)param;

  if(conn->handler->connection_check) {
    /* Do a protocol-specific keepalive check on the connection. */
    conn->handler->connection_check(conn, CONNCHECK_KEEPALIVE);
  }

  return 0; /* continue iteration */
}

static CURLcode upkeep(struct conncache *conn_cache, void *data)
{
  /* Loop over every connection and make connection alive. */
  Curl_conncache_foreach(data,
                         conn_cache,
                         data,
                         conn_upkeep);
  return CURLE_OK;
}

/*
 * Performs connection upkeep for the given session handle.
 */
CURLcode curl_easy_upkeep(struct Curl_easy *data)
{
  /* Verify that we got an easy handle we can work with. */
  if(!GOOD_EASY_HANDLE(data))
    return CURLE_BAD_FUNCTION_ARGUMENT;

  if(data->multi_easy) {
    /* Use the common function to keep connections alive. */
    return upkeep(&data->multi_easy->conn_cache, data);
  }
  else {
    /* No connections, so just return success */
    return CURLE_OK;
  }
}
Changes to jni/curl/lib/ftp.c.
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
static CURLcode ftp_do(struct connectdata *conn, bool *done);
static CURLcode ftp_done(struct connectdata *conn,
                         CURLcode, bool premature);
static CURLcode ftp_connect(struct connectdata *conn, bool *done);
static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection);
static CURLcode ftp_do_more(struct connectdata *conn, int *completed);
static CURLcode ftp_multi_statemach(struct connectdata *conn, bool *done);
static int ftp_getsock(struct connectdata *conn, curl_socket_t *socks,
                       int numsocks);
static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
                              int numsocks);
static CURLcode ftp_doing(struct connectdata *conn,
                          bool *dophase_done);
static CURLcode ftp_setup_connection(struct connectdata * conn);

static CURLcode init_wc_data(struct connectdata *conn);
static CURLcode wc_statemach(struct connectdata *conn);








|
<
|
<







128
129
130
131
132
133
134
135

136

137
138
139
140
141
142
143
static CURLcode ftp_do(struct connectdata *conn, bool *done);
static CURLcode ftp_done(struct connectdata *conn,
                         CURLcode, bool premature);
static CURLcode ftp_connect(struct connectdata *conn, bool *done);
static CURLcode ftp_disconnect(struct connectdata *conn, bool dead_connection);
static CURLcode ftp_do_more(struct connectdata *conn, int *completed);
static CURLcode ftp_multi_statemach(struct connectdata *conn, bool *done);
static int ftp_getsock(struct connectdata *conn, curl_socket_t *socks);

static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks);

static CURLcode ftp_doing(struct connectdata *conn,
                          bool *dophase_done);
static CURLcode ftp_setup_connection(struct connectdata * conn);

static CURLcode init_wc_data(struct connectdata *conn);
static CURLcode wc_statemach(struct connectdata *conn);

378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
{
  struct Curl_easy *data = conn->data;
  curl_socket_t ctrl_sock = conn->sock[FIRSTSOCKET];
  curl_socket_t data_sock = conn->sock[SECONDARYSOCKET];
  struct ftp_conn *ftpc = &conn->proto.ftpc;
  struct pingpong *pp = &ftpc->pp;
  int result;
  time_t timeout_ms;
  ssize_t nread;
  int ftpcode;

  *received = FALSE;

  timeout_ms = ftp_timeleft_accept(data);
  infof(data, "Checking for server connect\n");







|







376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
{
  struct Curl_easy *data = conn->data;
  curl_socket_t ctrl_sock = conn->sock[FIRSTSOCKET];
  curl_socket_t data_sock = conn->sock[SECONDARYSOCKET];
  struct ftp_conn *ftpc = &conn->proto.ftpc;
  struct pingpong *pp = &ftpc->pp;
  int result;
  timediff_t timeout_ms;
  ssize_t nread;
  int ftpcode;

  *received = FALSE;

  timeout_ms = ftp_timeleft_accept(data);
  infof(data, "Checking for server connect\n");
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
 * us. This function checks whether data connection is established if so it is
 * accepted.
 *
 */
static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected)
{
  struct Curl_easy *data = conn->data;
  time_t timeout_ms;
  CURLcode result = CURLE_OK;

  *connected = FALSE;
  infof(data, "Preparing for accepting server on data port\n");

  /* Save the time we start accepting server connect */
  Curl_pgrsTime(data, TIMER_STARTACCEPT);







|







487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
 * us. This function checks whether data connection is established if so it is
 * accepted.
 *
 */
static CURLcode AllowServerConnect(struct connectdata *conn, bool *connected)
{
  struct Curl_easy *data = conn->data;
  timediff_t timeout_ms;
  CURLcode result = CURLE_OK;

  *connected = FALSE;
  infof(data, "Preparing for accepting server on data port\n");

  /* Save the time we start accepting server connect */
  Curl_pgrsTime(data, TIMER_STARTACCEPT);
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
  state(conn, FTP_PWD);

  return CURLE_OK;
}

/* For the FTP "protocol connect" and "doing" phases only */
static int ftp_getsock(struct connectdata *conn,
                       curl_socket_t *socks,
                       int numsocks)
{
  return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
}

/* For the FTP "DO_MORE" phase only */
static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
                              int numsocks)
{
  struct ftp_conn *ftpc = &conn->proto.ftpc;

  if(!numsocks)
    return GETSOCK_BLANK;

  /* When in DO_MORE state, we could be either waiting for us to connect to a
   * remote site, or we could wait for that site to connect to us. Or just
   * handle ordinary commands.
   */

  if(FTP_STOP == ftpc->state) {
    int bits = GETSOCK_READSOCK(0);







|
<

|



|
<



<
<
<







804
805
806
807
808
809
810
811

812
813
814
815
816
817

818
819
820



821
822
823
824
825
826
827
  state(conn, FTP_PWD);

  return CURLE_OK;
}

/* For the FTP "protocol connect" and "doing" phases only */
static int ftp_getsock(struct connectdata *conn,
                       curl_socket_t *socks)

{
  return Curl_pp_getsock(&conn->proto.ftpc.pp, socks);
}

/* For the FTP "DO_MORE" phase only */
static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks)

{
  struct ftp_conn *ftpc = &conn->proto.ftpc;




  /* When in DO_MORE state, we could be either waiting for us to connect to a
   * remote site, or we could wait for that site to connect to us. Or just
   * handle ordinary commands.
   */

  if(FTP_STOP == ftpc->state) {
    int bits = GETSOCK_READSOCK(0);
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
    else {
      socks[1] = conn->sock[SECONDARYSOCKET];
      bits |= GETSOCK_WRITESOCK(1) | GETSOCK_READSOCK(1);
    }

    return bits;
  }
  return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
}

/* This is called after the FTP_QUOTE state is passed.

   ftp_state_cwd() sends the range of CWD commands to the server to change to
   the correct directory. It may also need to send MKD commands to create
   missing ones, if that option is enabled.







|







845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
    else {
      socks[1] = conn->sock[SECONDARYSOCKET];
      bits |= GETSOCK_WRITESOCK(1) | GETSOCK_READSOCK(1);
    }

    return bits;
  }
  return Curl_pp_getsock(&conn->proto.ftpc.pp, socks);
}

/* This is called after the FTP_QUOTE state is passed.

   ftp_state_cwd() sends the range of CWD commands to the server to change to
   the correct directory. It may also need to send MKD commands to create
   missing ones, if that option is enabled.
Changes to jni/curl/lib/getenv.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
char *GetEnv(const char *variable)
{
#if defined(_WIN32_WCE) || defined(CURL_WINDOWS_APP)
  (void)variable;
  return NULL;
#else
#ifdef WIN32
  char env[MAX_PATH]; /* MAX_PATH is from windef.h */
  char *temp = getenv(variable);
  env[0] = '\0';
  if(temp != NULL)
    ExpandEnvironmentStringsA(temp, env, sizeof(env));
  return (env[0] != '\0')?strdup(env):NULL;
#else
  char *env = getenv(variable);







|







31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
char *GetEnv(const char *variable)
{
#if defined(_WIN32_WCE) || defined(CURL_WINDOWS_APP)
  (void)variable;
  return NULL;
#else
#ifdef WIN32
  char env[4096];
  char *temp = getenv(variable);
  env[0] = '\0';
  if(temp != NULL)
    ExpandEnvironmentStringsA(temp, env, sizeof(env));
  return (env[0] != '\0')?strdup(env):NULL;
#else
  char *env = getenv(variable);
Changes to jni/curl/lib/getinfo.c.
231
232
233
234
235
236
237



238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
      break;
    case 11:
      *param_longp = CURL_HTTP_VERSION_1_1;
      break;
    case 20:
      *param_longp = CURL_HTTP_VERSION_2_0;
      break;



    default:
      *param_longp = CURL_HTTP_VERSION_NONE;
      break;
    }
    break;
  case CURLINFO_PROTOCOL:
    *param_longp = data->info.conn_protocol;
    break;

  default:
    return CURLE_UNKNOWN_OPTION;
  }

  return CURLE_OK;
}








>
>
>








<







231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248

249
250
251
252
253
254
255
      break;
    case 11:
      *param_longp = CURL_HTTP_VERSION_1_1;
      break;
    case 20:
      *param_longp = CURL_HTTP_VERSION_2_0;
      break;
    case 30:
      *param_longp = CURL_HTTP_VERSION_3;
      break;
    default:
      *param_longp = CURL_HTTP_VERSION_NONE;
      break;
    }
    break;
  case CURLINFO_PROTOCOL:
    *param_longp = data->info.conn_protocol;
    break;

  default:
    return CURLE_UNKNOWN_OPTION;
  }

  return CURLE_OK;
}

297
298
299
300
301
302
303
304


305
306
307
308
309
310
311
    break;
  case CURLINFO_STARTTRANSFER_TIME_T:
    *param_offt = data->progress.t_starttransfer;
    break;
  case CURLINFO_REDIRECT_TIME_T:
    *param_offt = data->progress.t_redirect;
    break;



  default:
    return CURLE_UNKNOWN_OPTION;
  }

  return CURLE_OK;
}








|
>
>







299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
    break;
  case CURLINFO_STARTTRANSFER_TIME_T:
    *param_offt = data->progress.t_starttransfer;
    break;
  case CURLINFO_REDIRECT_TIME_T:
    *param_offt = data->progress.t_redirect;
    break;
  case CURLINFO_RETRY_AFTER:
    *param_offt = data->info.retry_after;
    break;
  default:
    return CURLE_UNKNOWN_OPTION;
  }

  return CURLE_OK;
}

Changes to jni/curl/lib/hostip.c.
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
 * CURLRESOLV_PENDING  (1) = waiting for response, no pointer
 */

int Curl_resolv_timeout(struct connectdata *conn,
                        const char *hostname,
                        int port,
                        struct Curl_dns_entry **entry,
                        time_t timeoutms)
{
#ifdef USE_ALARM_TIMEOUT
#ifdef HAVE_SIGACTION
  struct sigaction keep_sigact;   /* store the old struct here */
  volatile bool keep_copysig = FALSE; /* whether old sigact has been saved */
  struct sigaction sigact;
#else







|







620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
 * CURLRESOLV_PENDING  (1) = waiting for response, no pointer
 */

int Curl_resolv_timeout(struct connectdata *conn,
                        const char *hostname,
                        int port,
                        struct Curl_dns_entry **entry,
                        timediff_t timeoutms)
{
#ifdef USE_ALARM_TIMEOUT
#ifdef HAVE_SIGACTION
  struct sigaction keep_sigact;   /* store the old struct here */
  volatile bool keep_copysig = FALSE; /* whether old sigact has been saved */
  struct sigaction sigact;
#else
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
{
  if(conn->data->set.doh)
    return Curl_doh_is_resolved(conn, dns);
  return Curl_resolver_is_resolved(conn, dns);
}

int Curl_resolv_getsock(struct connectdata *conn,
                        curl_socket_t *socks,
                        int numsocks)
{
#ifdef CURLRES_ASYNCH
  if(conn->data->set.doh)
    /* nothing to wait for during DOH resolve, those handles have their own
       sockets */
    return GETSOCK_BLANK;
  return Curl_resolver_getsock(conn, socks, numsocks);
#else
  (void)conn;
  (void)socks;
  (void)numsocks;
  return GETSOCK_BLANK;
#endif
}

/* Call this function after Curl_connect() has returned async=TRUE and
   then a successful name resolve has been received.








|
<






|



<







1023
1024
1025
1026
1027
1028
1029
1030

1031
1032
1033
1034
1035
1036
1037
1038
1039
1040

1041
1042
1043
1044
1045
1046
1047
{
  if(conn->data->set.doh)
    return Curl_doh_is_resolved(conn, dns);
  return Curl_resolver_is_resolved(conn, dns);
}

int Curl_resolv_getsock(struct connectdata *conn,
                        curl_socket_t *socks)

{
#ifdef CURLRES_ASYNCH
  if(conn->data->set.doh)
    /* nothing to wait for during DOH resolve, those handles have their own
       sockets */
    return GETSOCK_BLANK;
  return Curl_resolver_getsock(conn, socks);
#else
  (void)conn;
  (void)socks;

  return GETSOCK_BLANK;
#endif
}

/* Call this function after Curl_connect() has returned async=TRUE and
   then a successful name resolve has been received.

Changes to jni/curl/lib/hostip.h.
21
22
23
24
25
26
27

28
29
30
31
32
33
34
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"
#include "hash.h"
#include "curl_addrinfo.h"

#include "asyn.h"

#ifdef HAVE_SETJMP_H
#include <setjmp.h>
#endif

#ifdef NETWARE







>







21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"
#include "hash.h"
#include "curl_addrinfo.h"
#include "timeval.h" /* for timediff_t */
#include "asyn.h"

#ifdef HAVE_SETJMP_H
#include <setjmp.h>
#endif

#ifdef NETWARE
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
int Curl_resolv(struct connectdata *conn,
                const char *hostname,
                int port,
                bool allowDOH,
                struct Curl_dns_entry **dnsentry);
int Curl_resolv_timeout(struct connectdata *conn, const char *hostname,
                        int port, struct Curl_dns_entry **dnsentry,
                        time_t timeoutms);

#ifdef CURLRES_IPV6
/*
 * Curl_ipv6works() returns TRUE if IPv6 seems to work.
 */
bool Curl_ipv6works(void);
#else







|







86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
int Curl_resolv(struct connectdata *conn,
                const char *hostname,
                int port,
                bool allowDOH,
                struct Curl_dns_entry **dnsentry);
int Curl_resolv_timeout(struct connectdata *conn, const char *hostname,
                        int port, struct Curl_dns_entry **dnsentry,
                        timediff_t timeoutms);

#ifdef CURLRES_IPV6
/*
 * Curl_ipv6works() returns TRUE if IPv6 seems to work.
 */
bool Curl_ipv6works(void);
#else
236
237
238
239
240
241
242
243
244
245
246
 * Populate the cache with specified entries from CURLOPT_RESOLVE.
 */
CURLcode Curl_loadhostpairs(struct Curl_easy *data);

CURLcode Curl_resolv_check(struct connectdata *conn,
                           struct Curl_dns_entry **dns);
int Curl_resolv_getsock(struct connectdata *conn,
                        curl_socket_t *socks,
                        int numsocks);

#endif /* HEADER_CURL_HOSTIP_H */







|
<


237
238
239
240
241
242
243
244

245
246
 * Populate the cache with specified entries from CURLOPT_RESOLVE.
 */
CURLcode Curl_loadhostpairs(struct Curl_easy *data);

CURLcode Curl_resolv_check(struct connectdata *conn,
                           struct Curl_dns_entry **dns);
int Curl_resolv_getsock(struct connectdata *conn,
                        curl_socket_t *socks);


#endif /* HEADER_CURL_HOSTIP_H */
Changes to jni/curl/lib/hostip6.c.
161
162
163
164
165
166
167
168

169
170
171
172
173
174
175

  if((pf != PF_INET) && !Curl_ipv6works())
    /* The stack seems to be a non-IPv6 one */
    pf = PF_INET;

  memset(&hints, 0, sizeof(hints));
  hints.ai_family = pf;
  hints.ai_socktype = conn->socktype;


#ifndef USE_RESOLVE_ON_IPS
  /*
   * The AI_NUMERICHOST must not be set to get synthesized IPv6 address from
   * an IPv4 address on iOS and Mac OS X.
   */
  if((1 == Curl_inet_pton(AF_INET, hostname, addrbuf)) ||







|
>







161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176

  if((pf != PF_INET) && !Curl_ipv6works())
    /* The stack seems to be a non-IPv6 one */
    pf = PF_INET;

  memset(&hints, 0, sizeof(hints));
  hints.ai_family = pf;
  hints.ai_socktype = (conn->transport == TRNSPRT_TCP) ?
    SOCK_STREAM : SOCK_DGRAM;

#ifndef USE_RESOLVE_ON_IPS
  /*
   * The AI_NUMERICHOST must not be set to get synthesized IPv6 address from
   * an IPv4 address on iOS and Mac OS X.
   */
  if((1 == Curl_inet_pton(AF_INET, hostname, addrbuf)) ||
Changes to jni/curl/lib/http.c.
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "memdebug.h"

/*
 * Forward declarations.
 */

static int http_getsock_do(struct connectdata *conn,
                           curl_socket_t *socks,
                           int numsocks);
static int http_should_fail(struct connectdata *conn);

#ifndef CURL_DISABLE_PROXY
static CURLcode add_haproxy_protocol_header(struct connectdata *conn);
#endif

#ifdef USE_SSL
static CURLcode https_connecting(struct connectdata *conn, bool *done);
static int https_getsock(struct connectdata *conn,
                         curl_socket_t *socks,
                         int numsocks);
#else
#define https_connecting(x,y) CURLE_COULDNT_CONNECT
#endif
static CURLcode http_setup_conn(struct connectdata *conn);

/*
 * HTTP handler interface.







|
<









|
<







84
85
86
87
88
89
90
91

92
93
94
95
96
97
98
99
100
101

102
103
104
105
106
107
108
#include "memdebug.h"

/*
 * Forward declarations.
 */

static int http_getsock_do(struct connectdata *conn,
                           curl_socket_t *socks);

static int http_should_fail(struct connectdata *conn);

#ifndef CURL_DISABLE_PROXY
static CURLcode add_haproxy_protocol_header(struct connectdata *conn);
#endif

#ifdef USE_SSL
static CURLcode https_connecting(struct connectdata *conn, bool *done);
static int https_getsock(struct connectdata *conn,
                         curl_socket_t *socks);

#else
#define https_connecting(x,y) CURLE_COULDNT_CONNECT
#endif
static CURLcode http_setup_conn(struct connectdata *conn);

/*
 * HTTP handler interface.
167
168
169
170
171
172
173











174
175
176
177

178
179
180
181
182
183
184
  http = calloc(1, sizeof(struct HTTP));
  if(!http)
    return CURLE_OUT_OF_MEMORY;

  Curl_mime_initpart(&http->form, conn->data);
  data->req.protop = http;












  if(!CONN_INUSE(conn))
    /* if not already multi-using, setup connection details */
    Curl_http2_setup_conn(conn);
  Curl_http2_setup_req(data);

  return CURLE_OK;
}

#ifndef CURL_DISABLE_PROXY
/*
 * checkProxyHeaders() checks the linked list of custom proxy headers
 * if proxy headers are not available, then it will lookup into http header







>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
>







165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  http = calloc(1, sizeof(struct HTTP));
  if(!http)
    return CURLE_OUT_OF_MEMORY;

  Curl_mime_initpart(&http->form, conn->data);
  data->req.protop = http;

  if(data->set.httpversion == CURL_HTTP_VERSION_3) {
    if(conn->handler->flags & PROTOPT_SSL)
      /* Only go HTTP/3 directly on HTTPS URLs. It needs a UDP socket and does
         the QUIC dance. */
      conn->transport = TRNSPRT_QUIC;
    else {
      failf(data, "HTTP/3 requested for non-HTTPS URL");
      return CURLE_URL_MALFORMAT;
    }
  }
  else {
    if(!CONN_INUSE(conn))
      /* if not already multi-using, setup connection details */
      Curl_http2_setup_conn(conn);
    Curl_http2_setup_req(data);
  }
  return CURLE_OK;
}

#ifndef CURL_DISABLE_PROXY
/*
 * checkProxyHeaders() checks the linked list of custom proxy headers
 * if proxy headers are not available, then it will lookup into http header
1132
1133
1134
1135
1136
1137
1138
1139



1140
1141
1142

1143
1144
1145
1146
1147
1148
1149
}

/*
 * Curl_add_buffer_free() frees all associated resources.
 */
void Curl_add_buffer_free(Curl_send_buffer **inp)
{
  Curl_send_buffer *in = *inp;



  if(in) /* deal with NULL input */
    free(in->buffer);
  free(in);

  *inp = NULL;
}

/*
 * Curl_add_buffer_send() sends a header buffer and frees all associated
 * memory.  Body data may be appended to the header data if desired.
 *







|
>
>
>
|

|
>







1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
}

/*
 * Curl_add_buffer_free() frees all associated resources.
 */
void Curl_add_buffer_free(Curl_send_buffer **inp)
{
  Curl_send_buffer *in;
  if(!inp)
    return;
  in = *inp;
  if(in) { /* deal with NULL input */
    free(in->buffer);
    free(in);
  }
  *inp = NULL;
}

/*
 * Curl_add_buffer_send() sends a header buffer and frees all associated
 * memory.  Body data may be appended to the header data if desired.
 *
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
  return CURLE_OK;
}

/* this returns the socket to wait for in the DO and DOING state for the multi
   interface and then we're always _sending_ a request and thus we wait for
   the single socket to become writable only */
static int http_getsock_do(struct connectdata *conn,
                           curl_socket_t *socks,
                           int numsocks)
{
  /* write mode */
  (void)numsocks; /* unused, we trust it to be at least 1 */
  socks[0] = conn->sock[FIRSTSOCKET];
  return GETSOCK_WRITESOCK(0);
}

#ifndef CURL_DISABLE_PROXY
static CURLcode add_haproxy_protocol_header(struct connectdata *conn)
{







|
<


<







1507
1508
1509
1510
1511
1512
1513
1514

1515
1516

1517
1518
1519
1520
1521
1522
1523
  return CURLE_OK;
}

/* this returns the socket to wait for in the DO and DOING state for the multi
   interface and then we're always _sending_ a request and thus we wait for
   the single socket to become writable only */
static int http_getsock_do(struct connectdata *conn,
                           curl_socket_t *socks)

{
  /* write mode */

  socks[0] = conn->sock[FIRSTSOCKET];
  return GETSOCK_WRITESOCK(0);
}

#ifndef CURL_DISABLE_PROXY
static CURLcode add_haproxy_protocol_header(struct connectdata *conn)
{
1550
1551
1552
1553
1554
1555
1556







1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
#endif

#ifdef USE_SSL
static CURLcode https_connecting(struct connectdata *conn, bool *done)
{
  CURLcode result;
  DEBUGASSERT((conn) && (conn->handler->flags & PROTOPT_SSL));








  /* perform SSL initialization for this socket */
  result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, done);
  if(result)
    connclose(conn, "Failed HTTPS connection");

  return result;
}

static int https_getsock(struct connectdata *conn,
                         curl_socket_t *socks,
                         int numsocks)
{
  if(conn->handler->flags & PROTOPT_SSL)
    return Curl_ssl_getsock(conn, socks, numsocks);
  return GETSOCK_BLANK;
}
#endif /* USE_SSL */

/*
 * Curl_http_done() gets called after a single HTTP request has been
 * performed.







>
>
>
>
>
>
>










|
<


|







1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586

1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
#endif

#ifdef USE_SSL
static CURLcode https_connecting(struct connectdata *conn, bool *done)
{
  CURLcode result;
  DEBUGASSERT((conn) && (conn->handler->flags & PROTOPT_SSL));

#ifdef ENABLE_QUIC
  if(conn->transport == TRNSPRT_QUIC) {
    *done = TRUE;
    return CURLE_OK;
  }
#endif

  /* perform SSL initialization for this socket */
  result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, done);
  if(result)
    connclose(conn, "Failed HTTPS connection");

  return result;
}

static int https_getsock(struct connectdata *conn,
                         curl_socket_t *socks)

{
  if(conn->handler->flags & PROTOPT_SSL)
    return Curl_ssl_getsock(conn, socks);
  return GETSOCK_BLANK;
}
#endif /* USE_SSL */

/*
 * Curl_http_done() gets called after a single HTTP request has been
 * performed.
1646
1647
1648
1649
1650
1651
1652






1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
  return ((data->set.httpversion == CURL_HTTP_VERSION_NONE) ||
          (data->set.httpversion >= CURL_HTTP_VERSION_1_1));
}

static const char *get_http_string(const struct Curl_easy *data,
                                   const struct connectdata *conn)
{






#ifdef USE_NGHTTP2
  if(conn->proto.httpc.h2)
    return "2";
#endif

  if(use_http_1_1plus(data, conn))
    return "1.1";

  return "1.0";
}

/* check and possibly add an Expect: header */
static CURLcode expect100(struct Curl_easy *data,
                          struct connectdata *conn,
                          Curl_send_buffer *req_buffer)
{
  CURLcode result = CURLE_OK;
  data->state.expect100header = FALSE; /* default to false unless it is set
                                          to TRUE below */
  if(use_http_1_1plus(data, conn) &&
     (conn->httpversion != 20)) {
    /* if not doing HTTP 1.0 or version 2, or disabled explicitly, we add an
       Expect: 100-continue to the headers which actually speeds up post
       operations (as there is one packet coming back from the web server) */
    const char *ptr = Curl_checkheaders(conn, "Expect");
    if(ptr) {
      data->state.expect100header =
        Curl_compareheader(ptr, "Expect:", "100-continue");







>
>
>
>
>
>




















|







1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
  return ((data->set.httpversion == CURL_HTTP_VERSION_NONE) ||
          (data->set.httpversion >= CURL_HTTP_VERSION_1_1));
}

static const char *get_http_string(const struct Curl_easy *data,
                                   const struct connectdata *conn)
{
#ifdef ENABLE_QUIC
  if((data->set.httpversion == CURL_HTTP_VERSION_3) ||
     (conn->httpversion == 30))
    return "3";
#endif

#ifdef USE_NGHTTP2
  if(conn->proto.httpc.h2)
    return "2";
#endif

  if(use_http_1_1plus(data, conn))
    return "1.1";

  return "1.0";
}

/* check and possibly add an Expect: header */
static CURLcode expect100(struct Curl_easy *data,
                          struct connectdata *conn,
                          Curl_send_buffer *req_buffer)
{
  CURLcode result = CURLE_OK;
  data->state.expect100header = FALSE; /* default to false unless it is set
                                          to TRUE below */
  if(use_http_1_1plus(data, conn) &&
     (conn->httpversion < 20)) {
    /* if not doing HTTP 1.0 or version 2, or disabled explicitly, we add an
       Expect: 100-continue to the headers which actually speeds up post
       operations (as there is one packet coming back from the web server) */
    const char *ptr = Curl_checkheaders(conn, "Expect");
    if(ptr) {
      data->state.expect100header =
        Curl_compareheader(ptr, "Expect:", "100-continue");
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
  HEADER_CONNECT  /* sending CONNECT to a proxy */
};

/* used to compile the provided trailers into one buffer
   will return an error code if one of the headers is
   not formatted correctly */
CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
                                    Curl_send_buffer *buffer,
                                    struct Curl_easy *handle)
{
  char *ptr = NULL;
  CURLcode result = CURLE_OK;
  const char *endofline_native = NULL;
  const char *endofline_network = NULL;








|







1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
  HEADER_CONNECT  /* sending CONNECT to a proxy */
};

/* used to compile the provided trailers into one buffer
   will return an error code if one of the headers is
   not formatted correctly */
CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
                                    Curl_send_buffer **buffer,
                                    struct Curl_easy *handle)
{
  char *ptr = NULL;
  CURLcode result = CURLE_OK;
  const char *endofline_native = NULL;
  const char *endofline_network = NULL;

1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
    endofline_network = "\x0d\x0a";
  }

  while(trailers) {
    /* only add correctly formatted trailers */
    ptr = strchr(trailers->data, ':');
    if(ptr && *(ptr + 1) == ' ') {
      result = Curl_add_bufferf(&buffer, "%s%s", trailers->data,
                                endofline_native);
      if(result)
        return result;
    }
    else
      infof(handle, "Malformatted trailing header ! Skipping trailer.");
    trailers = trailers->next;
  }
  result = Curl_add_buffer(&buffer, endofline_network,
                           strlen(endofline_network));
  return result;
}

CURLcode Curl_add_custom_headers(struct connectdata *conn,
                                 bool is_connect,
                                 Curl_send_buffer *req_buffer)







|








|







1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
    endofline_network = "\x0d\x0a";
  }

  while(trailers) {
    /* only add correctly formatted trailers */
    ptr = strchr(trailers->data, ':');
    if(ptr && *(ptr + 1) == ' ') {
      result = Curl_add_bufferf(buffer, "%s%s", trailers->data,
                                endofline_native);
      if(result)
        return result;
    }
    else
      infof(handle, "Malformatted trailing header ! Skipping trailer.");
    trailers = trailers->next;
  }
  result = Curl_add_buffer(buffer, endofline_network,
                           strlen(endofline_network));
  return result;
}

CURLcode Curl_add_custom_headers(struct connectdata *conn,
                                 bool is_connect,
                                 Curl_send_buffer *req_buffer)
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
                  checkprefix("Content-Length:", compare))
            ;
          else if(conn->allocptr.te &&
                  /* when asking for Transfer-Encoding, don't pass on a custom
                     Connection: */
                  checkprefix("Connection:", compare))
            ;
          else if((conn->httpversion == 20) &&
                  checkprefix("Transfer-Encoding:", compare))
            /* HTTP/2 doesn't support chunked requests */
            ;
          else if((checkprefix("Authorization:", compare) ||
                   checkprefix("Cookie:", compare)) &&
                  /* be careful of sending this potentially sensitive header to
                     other hosts */







|







1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
                  checkprefix("Content-Length:", compare))
            ;
          else if(conn->allocptr.te &&
                  /* when asking for Transfer-Encoding, don't pass on a custom
                     Connection: */
                  checkprefix("Connection:", compare))
            ;
          else if((conn->httpversion >= 20) &&
                  checkprefix("Transfer-Encoding:", compare))
            /* HTTP/2 doesn't support chunked requests */
            ;
          else if((checkprefix("Authorization:", compare) ||
                   checkprefix("Cookie:", compare)) &&
                  /* be careful of sending this potentially sensitive header to
                     other hosts */
1978
1979
1980
1981
1982
1983
1984

1985
1986
1987
1988
1989
1990

1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
#if !defined(CURL_DISABLE_COOKIES)
  char *addcookies = NULL;
#endif
  curl_off_t included_body = 0;
  const char *httpstring;
  Curl_send_buffer *req_buffer;
  curl_off_t postsize = 0; /* curl_off_t to handle large file sizes */


  /* Always consider the DO phase done after this function call, even if there
     may be parts of the request that is not yet sent, since we can deal with
     the rest of the request in the PERFORM phase. */
  *done = TRUE;


  if(conn->httpversion < 20) { /* unless the connection is re-used and already
                                  http2 */
    switch(conn->negnpn) {
    case CURL_HTTP_VERSION_2:
      conn->httpversion = 20; /* we know we're on HTTP/2 now */

      result = Curl_http2_switched(conn, NULL, 0);
      if(result)
        return result;
      break;
    case CURL_HTTP_VERSION_1_1:
      /* continue with HTTP/1.1 when explicitly requested */
      break;
    default:
      /* Check if user wants to use HTTP/2 with clear TCP*/
#ifdef USE_NGHTTP2
      if(conn->data->set.httpversion ==
         CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
        if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
          /* We don't support HTTP/2 proxies yet. Also it's debatable whether
             or not this setting should apply to HTTP/2 proxies. */
          infof(data, "Ignoring HTTP/2 prior knowledge due to proxy\n");
          break;
        }

        DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
        conn->httpversion = 20;

        result = Curl_http2_switched(conn, NULL, 0);
        if(result)
          return result;
      }
#endif
      break;
    }
  }
  else {
    /* prepare for a http2 request */
    result = Curl_http2_setup(conn);
    if(result)
      return result;
  }

  http = data->req.protop;
  DEBUGASSERT(http);

  if(!data->state.this_is_a_follow) {
    /* Free to avoid leaking memory on multiple requests*/
    free(data->state.first_host);








>






>
|
|
|
|
|

|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|

|
|

|
|
|
|

|
|
|
|
|
|
|
|
|
|







2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
#if !defined(CURL_DISABLE_COOKIES)
  char *addcookies = NULL;
#endif
  curl_off_t included_body = 0;
  const char *httpstring;
  Curl_send_buffer *req_buffer;
  curl_off_t postsize = 0; /* curl_off_t to handle large file sizes */
  char *altused = NULL;

  /* Always consider the DO phase done after this function call, even if there
     may be parts of the request that is not yet sent, since we can deal with
     the rest of the request in the PERFORM phase. */
  *done = TRUE;

  if(conn->transport != TRNSPRT_QUIC) {
    if(conn->httpversion < 20) { /* unless the connection is re-used and
                                    already http2 */
      switch(conn->negnpn) {
      case CURL_HTTP_VERSION_2:
        conn->httpversion = 20; /* we know we're on HTTP/2 now */

        result = Curl_http2_switched(conn, NULL, 0);
        if(result)
          return result;
        break;
      case CURL_HTTP_VERSION_1_1:
        /* continue with HTTP/1.1 when explicitly requested */
        break;
      default:
        /* Check if user wants to use HTTP/2 with clear TCP*/
#ifdef USE_NGHTTP2
        if(conn->data->set.httpversion ==
           CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE) {
          if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
            /* We don't support HTTP/2 proxies yet. Also it's debatable
               whether or not this setting should apply to HTTP/2 proxies. */
            infof(data, "Ignoring HTTP/2 prior knowledge due to proxy\n");
            break;
          }

          DEBUGF(infof(data, "HTTP/2 over clean TCP\n"));
          conn->httpversion = 20;

          result = Curl_http2_switched(conn, NULL, 0);
          if(result)
            return result;
        }
#endif
        break;
      }
    }
    else {
      /* prepare for a http2 request */
      result = Curl_http2_setup(conn);
      if(result)
        return result;
    }
  }
  http = data->req.protop;
  DEBUGASSERT(http);

  if(!data->state.this_is_a_follow) {
    /* Free to avoid leaking memory on multiple requests*/
    free(data->state.first_host);

2222
2223
2224
2225
2226
2227
2228
2229

2230
2231
2232
2233
2234

2235
2236
2237
2238
2239
2240
2241
2242
2243
    /* Some kind of TE is requested, check if 'chunked' is chosen */
    data->req.upload_chunky =
      Curl_compareheader(ptr, "Transfer-Encoding:", "chunked");
  }
  else {
    if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
       (((httpreq == HTTPREQ_POST_MIME || httpreq == HTTPREQ_POST_FORM) &&
       http->postsize < 0) ||

       (data->set.upload && data->state.infilesize == -1))) {
      if(conn->bits.authneg)
        /* don't enable chunked during auth neg */
        ;
      else if(use_http_1_1plus(data, conn)) {

        /* HTTP, upload, unknown file size and not HTTP 1.0 */
        data->req.upload_chunky = TRUE;
      }
      else {
        failf(data, "Chunky upload is not supported by HTTP 1.0");
        return CURLE_UPLOAD_FAILED;
      }
    }
    else {







|
>
|




>
|
|







2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
    /* Some kind of TE is requested, check if 'chunked' is chosen */
    data->req.upload_chunky =
      Curl_compareheader(ptr, "Transfer-Encoding:", "chunked");
  }
  else {
    if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
       (((httpreq == HTTPREQ_POST_MIME || httpreq == HTTPREQ_POST_FORM) &&
         http->postsize < 0) ||
        ((data->set.upload || httpreq == HTTPREQ_POST) &&
         data->state.infilesize == -1))) {
      if(conn->bits.authneg)
        /* don't enable chunked during auth neg */
        ;
      else if(use_http_1_1plus(data, conn)) {
        if(conn->httpversion < 20)
          /* HTTP, upload, unknown file size and not HTTP 1.0 */
          data->req.upload_chunky = TRUE;
      }
      else {
        failf(data, "Chunky upload is not supported by HTTP 1.0");
        return CURLE_UPLOAD_FAILED;
      }
    }
    else {
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344

    /* The path sent to the proxy is in fact the entire URL. But if the remote
       host is a IDN-name, we must make sure that the request we produce only
       uses the encoded host name! */

    /* and no fragment part */
    CURLUcode uc;
    char *url;
    CURLU *h = curl_url_dup(data->state.uh);
    if(!h)
      return CURLE_OUT_OF_MEMORY;

    if(conn->host.dispname != conn->host.name) {
      uc = curl_url_set(h, CURLUPART_HOST, conn->host.name, 0);
      if(uc) {







<







2358
2359
2360
2361
2362
2363
2364

2365
2366
2367
2368
2369
2370
2371

    /* The path sent to the proxy is in fact the entire URL. But if the remote
       host is a IDN-name, we must make sure that the request we produce only
       uses the encoded host name! */

    /* and no fragment part */
    CURLUcode uc;

    CURLU *h = curl_url_dup(data->state.uh);
    if(!h)
      return CURLE_OUT_OF_MEMORY;

    if(conn->host.dispname != conn->host.name) {
      uc = curl_url_set(h, CURLUPART_HOST, conn->host.name, 0);
      if(uc) {
2361
2362
2363
2364
2365
2366
2367
2368


2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
      }
      uc = curl_url_set(h, CURLUPART_PASSWORD, NULL, 0);
      if(uc) {
        curl_url_cleanup(h);
        return CURLE_OUT_OF_MEMORY;
      }
    }
    /* now extract the new version of the URL */


    uc = curl_url_get(h, CURLUPART_URL, &url, 0);
    if(uc) {
      curl_url_cleanup(h);
      return CURLE_OUT_OF_MEMORY;
    }

    if(data->change.url_alloc)
      free(data->change.url);

    data->change.url = url;
    data->change.url_alloc = TRUE;

    curl_url_cleanup(h);

    if(strcasecompare("ftp", data->state.up.scheme)) {
      if(data->set.proxy_transfer_mode) {
        /* when doing ftp, append ;type=<a|i> if not present */
        char *type = strstr(path, ";type=");
        if(type && type[6] && type[7] == 0) {







|
>
>
|





<
<
<
<
<
<







2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403






2404
2405
2406
2407
2408
2409
2410
      }
      uc = curl_url_set(h, CURLUPART_PASSWORD, NULL, 0);
      if(uc) {
        curl_url_cleanup(h);
        return CURLE_OUT_OF_MEMORY;
      }
    }
    /* Extract the the URL to use in the request. Store in STRING_TEMP_URL for
       clean-up reasons if the function returns before the free() further
       down. */
    uc = curl_url_get(h, CURLUPART_URL, &data->set.str[STRING_TEMP_URL], 0);
    if(uc) {
      curl_url_cleanup(h);
      return CURLE_OUT_OF_MEMORY;
    }







    curl_url_cleanup(h);

    if(strcasecompare("ftp", data->state.up.scheme)) {
      if(data->set.proxy_transfer_mode) {
        /* when doing ftp, append ;type=<a|i> if not present */
        char *type = strstr(path, ";type=");
        if(type && type[6] && type[7] == 0) {
2552
2553
2554
2555
2556
2557
2558

2559
2560
2561
2562

2563


2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577








2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592

2593
2594
2595
2596
2597
2598
2599
    return result;

  if(data->set.str[STRING_TARGET]) {
    path = data->set.str[STRING_TARGET];
    query = NULL;
  }


  /* url */
  if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
    char *url = data->change.url;
    result = Curl_add_buffer(&req_buffer, url, strlen(url));

  }


  else if(paste_ftp_userpwd)
    result = Curl_add_bufferf(&req_buffer, "ftp://%s:%s@%s",
                              conn->user, conn->passwd,
                              path + sizeof("ftp://") - 1);
  else {
    result = Curl_add_buffer(&req_buffer, path, strlen(path));
    if(result)
      return result;
    if(query)
      result = Curl_add_bufferf(&req_buffer, "?%s", query);
  }
  if(result)
    return result;









  result =
    Curl_add_bufferf(&req_buffer,
                     "%s" /* ftp typecode (;type=x) */
                     " HTTP/%s\r\n" /* HTTP version */
                     "%s" /* host */
                     "%s" /* proxyuserpwd */
                     "%s" /* userpwd */
                     "%s" /* range */
                     "%s" /* user agent */
                     "%s" /* accept */
                     "%s" /* TE: */
                     "%s" /* accept-encoding */
                     "%s" /* referer */
                     "%s" /* Proxy-Connection */
                     "%s",/* transfer-encoding */


                     ftp_typecode,
                     httpstring,
                     (conn->allocptr.host?conn->allocptr.host:""),
                     conn->allocptr.proxyuserpwd?
                     conn->allocptr.proxyuserpwd:"",
                     conn->allocptr.userpwd?conn->allocptr.userpwd:"",







>


|

>

>
>
|













>
>
>
>
>
>
>
>














|
>







2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
    return result;

  if(data->set.str[STRING_TARGET]) {
    path = data->set.str[STRING_TARGET];
    query = NULL;
  }

#ifndef CURL_DISABLE_PROXY
  /* url */
  if(conn->bits.httpproxy && !conn->bits.tunnel_proxy) {
    char *url = data->set.str[STRING_TEMP_URL];
    result = Curl_add_buffer(&req_buffer, url, strlen(url));
    Curl_safefree(data->set.str[STRING_TEMP_URL]);
  }
  else
#endif
  if(paste_ftp_userpwd)
    result = Curl_add_bufferf(&req_buffer, "ftp://%s:%s@%s",
                              conn->user, conn->passwd,
                              path + sizeof("ftp://") - 1);
  else {
    result = Curl_add_buffer(&req_buffer, path, strlen(path));
    if(result)
      return result;
    if(query)
      result = Curl_add_bufferf(&req_buffer, "?%s", query);
  }
  if(result)
    return result;

#ifdef USE_ALTSVC
  if(conn->bits.altused && !Curl_checkheaders(conn, "Alt-Used")) {
    altused = aprintf("Alt-Used: %s:%d\r\n",
                      conn->conn_to_host.name, conn->conn_to_port);
    if(!altused)
      return CURLE_OUT_OF_MEMORY;
  }
#endif
  result =
    Curl_add_bufferf(&req_buffer,
                     "%s" /* ftp typecode (;type=x) */
                     " HTTP/%s\r\n" /* HTTP version */
                     "%s" /* host */
                     "%s" /* proxyuserpwd */
                     "%s" /* userpwd */
                     "%s" /* range */
                     "%s" /* user agent */
                     "%s" /* accept */
                     "%s" /* TE: */
                     "%s" /* accept-encoding */
                     "%s" /* referer */
                     "%s" /* Proxy-Connection */
                     "%s" /* transfer-encoding */
                     "%s",/* Alt-Used */

                     ftp_typecode,
                     httpstring,
                     (conn->allocptr.host?conn->allocptr.host:""),
                     conn->allocptr.proxyuserpwd?
                     conn->allocptr.proxyuserpwd:"",
                     conn->allocptr.userpwd?conn->allocptr.userpwd:"",
2611
2612
2613
2614
2615
2616
2617
2618

2619
2620
2621
2622
2623
2624

2625
2626
2627
2628
2629
2630
2631
                     conn->allocptr.accept_encoding:"",
                     (data->change.referer && conn->allocptr.ref)?
                     conn->allocptr.ref:"" /* Referer: <data> */,
                     (conn->bits.httpproxy &&
                      !conn->bits.tunnel_proxy &&
                      !Curl_checkProxyheaders(conn, "Proxy-Connection"))?
                     "Proxy-Connection: Keep-Alive\r\n":"",
                     te

      );

  /* clear userpwd and proxyuserpwd to avoid re-using old credentials
   * from re-used connections */
  Curl_safefree(conn->allocptr.userpwd);
  Curl_safefree(conn->allocptr.proxyuserpwd);


  if(result)
    return result;

  if(!(conn->handler->flags&PROTOPT_SSL) &&
     conn->httpversion != 20 &&
     (data->set.httpversion == CURL_HTTP_VERSION_2)) {







|
>






>







2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
                     conn->allocptr.accept_encoding:"",
                     (data->change.referer && conn->allocptr.ref)?
                     conn->allocptr.ref:"" /* Referer: <data> */,
                     (conn->bits.httpproxy &&
                      !conn->bits.tunnel_proxy &&
                      !Curl_checkProxyheaders(conn, "Proxy-Connection"))?
                     "Proxy-Connection: Keep-Alive\r\n":"",
                     te,
                     altused ? altused : ""
      );

  /* clear userpwd and proxyuserpwd to avoid re-using old credentials
   * from re-used connections */
  Curl_safefree(conn->allocptr.userpwd);
  Curl_safefree(conn->allocptr.proxyuserpwd);
  free(altused);

  if(result)
    return result;

  if(!(conn->handler->flags&PROTOPT_SSL) &&
     conn->httpversion != 20 &&
     (data->set.httpversion == CURL_HTTP_VERSION_2)) {
3656
3657
3658
3659
3660
3661
3662

3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
         * https://tools.ietf.org/html/rfc7230#section-3.1.2
         *
         * The response code is always a three-digit number in HTTP as the spec
         * says. We try to allow any number here, but we cannot make
         * guarantees on future behaviors since it isn't within the protocol.
         */
        char separator;

        nc = sscanf(HEADER1,
                    " HTTP/%1d.%1d%c%3d",
                    &httpversion_major,
                    &conn->httpversion,
                    &separator,
                    &k->httpcode);

        if(nc == 1 && httpversion_major == 2 &&
           1 == sscanf(HEADER1, " HTTP/2 %d", &k->httpcode)) {
          conn->httpversion = 0;
          nc = 4;
          separator = ' ';
        }

        if((nc == 4) && (' ' == separator)) {
          conn->httpversion += 10 * httpversion_major;







>







|
|







3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
         * https://tools.ietf.org/html/rfc7230#section-3.1.2
         *
         * The response code is always a three-digit number in HTTP as the spec
         * says. We try to allow any number here, but we cannot make
         * guarantees on future behaviors since it isn't within the protocol.
         */
        char separator;
        char twoorthree[2];
        nc = sscanf(HEADER1,
                    " HTTP/%1d.%1d%c%3d",
                    &httpversion_major,
                    &conn->httpversion,
                    &separator,
                    &k->httpcode);

        if(nc == 1 && httpversion_major >= 2 &&
           2 == sscanf(HEADER1, " HTTP/%1[23] %d", twoorthree, &k->httpcode)) {
          conn->httpversion = 0;
          nc = 4;
          separator = ' ';
        }

        if((nc == 4) && (' ' == separator)) {
          conn->httpversion += 10 * httpversion_major;
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
              nc = 1;
              k->httpcode = 200;
              conn->httpversion = 10;
            }
          }
        }
        else {
          failf(data, "Unsupported HTTP version in response\n");
          return CURLE_UNSUPPORTED_PROTOCOL;
        }
      }
      else if(conn->handler->protocol & CURLPROTO_RTSP) {
        char separator;
        nc = sscanf(HEADER1,
                    " RTSP/%1d.%1d%c%3d",







|







3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
              nc = 1;
              k->httpcode = 200;
              conn->httpversion = 10;
            }
          }
        }
        else {
          failf(data, "Unsupported HTTP version in response");
          return CURLE_UNSUPPORTED_PROTOCOL;
        }
      }
      else if(conn->handler->protocol & CURLPROTO_RTSP) {
        char separator;
        nc = sscanf(HEADER1,
                    " RTSP/%1d.%1d%c%3d",
3931
3932
3933
3934
3935
3936
3937













3938
3939
3940
3941
3942
3943
3944
       * 2616). zlib cannot handle compress.  However, errors are
       * handled further down when the response body is processed
       */
      result = Curl_build_unencoding_stack(conn, k->p + 17, FALSE);
      if(result)
        return result;
    }













    else if(!k->http_bodyless && checkprefix("Content-Range:", k->p)) {
      /* Content-Range: bytes [num]-
         Content-Range: bytes: [num]-
         Content-Range: [num]-
         Content-Range: [asterisk]/[total]

         The second format was added since Sun's webserver







>
>
>
>
>
>
>
>
>
>
>
>
>







3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
       * 2616). zlib cannot handle compress.  However, errors are
       * handled further down when the response body is processed
       */
      result = Curl_build_unencoding_stack(conn, k->p + 17, FALSE);
      if(result)
        return result;
    }
    else if(checkprefix("Retry-After:", k->p)) {
      /* Retry-After = HTTP-date / delay-seconds */
      curl_off_t retry_after = 0; /* zero for unknown or "now" */
      time_t date = curl_getdate(&k->p[12], NULL);
      if(-1 == date) {
        /* not a date, try it as a decimal number */
        (void)curlx_strtoofft(&k->p[12], NULL, 10, &retry_after);
      }
      else
        /* convert date to number of seconds into the future */
        retry_after = date - time(NULL);
      data->info.retry_after = retry_after; /* store it */
    }
    else if(!k->http_bodyless && checkprefix("Content-Range:", k->p)) {
      /* Content-Range: bytes [num]-
         Content-Range: bytes: [num]-
         Content-Range: [num]-
         Content-Range: [asterisk]/[total]

         The second format was added since Sun's webserver
Changes to jni/curl/lib/http.h.
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

CURLcode Curl_add_timecondition(const struct connectdata *conn,
                                Curl_send_buffer *buf);
CURLcode Curl_add_custom_headers(struct connectdata *conn,
                                 bool is_connect,
                                 Curl_send_buffer *req_buffer);
CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
                                    Curl_send_buffer *buffer,
                                    struct Curl_easy *handle);

/* protocol-specific functions set up to be called by the main engine */
CURLcode Curl_http(struct connectdata *conn, bool *done);
CURLcode Curl_http_done(struct connectdata *, CURLcode, bool premature);
CURLcode Curl_http_connect(struct connectdata *conn, bool *done);








|







71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

CURLcode Curl_add_timecondition(const struct connectdata *conn,
                                Curl_send_buffer *buf);
CURLcode Curl_add_custom_headers(struct connectdata *conn,
                                 bool is_connect,
                                 Curl_send_buffer *req_buffer);
CURLcode Curl_http_compile_trailers(struct curl_slist *trailers,
                                    Curl_send_buffer **buffer,
                                    struct Curl_easy *handle);

/* protocol-specific functions set up to be called by the main engine */
CURLcode Curl_http(struct connectdata *conn, bool *done);
CURLcode Curl_http_done(struct connectdata *, CURLcode, bool premature);
CURLcode Curl_http_connect(struct connectdata *conn, bool *done);

121
122
123
124
125
126
127




128
129
130
131
132
133
134
 *
 */
#ifndef EXPECT_100_THRESHOLD
#define EXPECT_100_THRESHOLD 1024
#endif

#endif /* CURL_DISABLE_HTTP */





/****************************************************************************
 * HTTP unique setup
 ***************************************************************************/
struct HTTP {
  curl_mimepart *sendit;
  curl_off_t postsize; /* off_t to handle large file sizes */







>
>
>
>







121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
 *
 */
#ifndef EXPECT_100_THRESHOLD
#define EXPECT_100_THRESHOLD 1024
#endif

#endif /* CURL_DISABLE_HTTP */

#ifdef USE_NGHTTP3
struct h3out; /* see ngtcp2 */
#endif

/****************************************************************************
 * HTTP unique setup
 ***************************************************************************/
struct HTTP {
  curl_mimepart *sendit;
  curl_off_t postsize; /* off_t to handle large file sizes */
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188























189
190
191
192
193
194
195
  Curl_send_buffer *header_recvbuf;
  size_t nread_header_recvbuf; /* number of bytes in header_recvbuf fed into
                                  upper layer */
  Curl_send_buffer *trailer_recvbuf;
  int status_code; /* HTTP status code */
  const uint8_t *pausedata; /* pointer to data received in on_data_chunk */
  size_t pauselen; /* the number of bytes left in data */
  bool closed; /* TRUE on HTTP2 stream close */
  bool close_handled; /* TRUE if stream closure is handled by libcurl */
  char *mem;     /* points to a buffer in memory to store received data */
  size_t len;    /* size of the buffer 'mem' points to */
  size_t memlen; /* size of data copied to mem */

  const uint8_t *upload_mem; /* points to a buffer to read from */
  size_t upload_len; /* size of the buffer 'upload_mem' points to */
  curl_off_t upload_left; /* number of bytes left to upload */

  char **push_headers;       /* allocated array */
  size_t push_headers_used;  /* number of entries filled in */
  size_t push_headers_alloc; /* number of entries allocated */
#endif























};

#ifdef USE_NGHTTP2
/* h2 settings for this connection */
struct h2settings {
  uint32_t max_concurrent_streams;
  bool enable_push;







<

<
<
<
<
<
<
<





>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







172
173
174
175
176
177
178

179







180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
  Curl_send_buffer *header_recvbuf;
  size_t nread_header_recvbuf; /* number of bytes in header_recvbuf fed into
                                  upper layer */
  Curl_send_buffer *trailer_recvbuf;
  int status_code; /* HTTP status code */
  const uint8_t *pausedata; /* pointer to data received in on_data_chunk */
  size_t pauselen; /* the number of bytes left in data */

  bool close_handled; /* TRUE if stream closure is handled by libcurl */








  char **push_headers;       /* allocated array */
  size_t push_headers_used;  /* number of entries filled in */
  size_t push_headers_alloc; /* number of entries allocated */
#endif
#if defined(USE_NGHTTP2) || defined(USE_NGHTTP3)
  bool closed; /* TRUE on HTTP2 stream close */
  char *mem;     /* points to a buffer in memory to store received data */
  size_t len;    /* size of the buffer 'mem' points to */
  size_t memlen; /* size of data copied to mem */
#endif
#if defined(USE_NGHTTP2) || defined(ENABLE_QUIC)
  /* fields used by both HTTP/2 and HTTP/3 */
  const uint8_t *upload_mem; /* points to a buffer to read from */
  size_t upload_len; /* size of the buffer 'upload_mem' points to */
  curl_off_t upload_left; /* number of bytes left to upload */
#endif

#ifdef ENABLE_QUIC
  /*********** for HTTP/3 we store stream-local data here *************/
  int64_t stream3_id; /* stream we are interested in */
  bool firstbody;  /* FALSE until body arrives */
  bool h3req;    /* FALSE until request is issued */
  bool upload_done;
#endif
#ifdef USE_NGHTTP3
  struct h3out *h3out; /* per-stream buffers for upload */
#endif
};

#ifdef USE_NGHTTP2
/* h2 settings for this connection */
struct h2settings {
  uint32_t max_concurrent_streams;
  bool enable_push;
Changes to jni/curl/lib/http2.c.
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
 */
void Curl_http2_init_userset(struct UserDefined *set)
{
  set->stream_weight = NGHTTP2_DEFAULT_WEIGHT;
}

static int http2_perform_getsock(const struct connectdata *conn,
                                 curl_socket_t *sock, /* points to
                                                         numsocks
                                                         number of
                                                         sockets */
                                 int numsocks)
{
  const struct http_conn *c = &conn->proto.httpc;
  struct SingleRequest *k = &conn->data->req;
  int bitmap = GETSOCK_BLANK;
  (void)numsocks;

  sock[0] = conn->sock[FIRSTSOCKET];

  /* in a HTTP/2 connection we can basically always get a frame so we should
     always be ready for one */
  bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);

  /* we're still uploading or the HTTP/2 layer wants to send data */
  if(((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND) ||
     nghttp2_session_want_write(c->h2))
    bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);

  return bitmap;
}

static int http2_getsock(struct connectdata *conn,
                         curl_socket_t *sock, /* points to numsocks
                                                 number of sockets */
                         int numsocks)
{
  return http2_perform_getsock(conn, sock, numsocks);
}

/*
 * http2_stream_free() free HTTP2 stream related data
 */
static void http2_stream_free(struct HTTP *http)
{







|
<
<
<
<




<
















|
<
<

|







96
97
98
99
100
101
102
103




104
105
106
107

108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124


125
126
127
128
129
130
131
132
133
 */
void Curl_http2_init_userset(struct UserDefined *set)
{
  set->stream_weight = NGHTTP2_DEFAULT_WEIGHT;
}

static int http2_perform_getsock(const struct connectdata *conn,
                                 curl_socket_t *sock)




{
  const struct http_conn *c = &conn->proto.httpc;
  struct SingleRequest *k = &conn->data->req;
  int bitmap = GETSOCK_BLANK;


  sock[0] = conn->sock[FIRSTSOCKET];

  /* in a HTTP/2 connection we can basically always get a frame so we should
     always be ready for one */
  bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);

  /* we're still uploading or the HTTP/2 layer wants to send data */
  if(((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND) ||
     nghttp2_session_want_write(c->h2))
    bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);

  return bitmap;
}

static int http2_getsock(struct connectdata *conn,
                         curl_socket_t *socks)


{
  return http2_perform_getsock(conn, socks);
}

/*
 * http2_stream_free() free HTTP2 stream related data
 */
static void http2_stream_free(struct HTTP *http)
{
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
  if(checks_to_perform & CONNCHECK_ISDEAD) {
    if(http2_connisdead(check))
      ret_val |= CONNRESULT_DEAD;
  }

  if(checks_to_perform & CONNCHECK_KEEPALIVE) {
    struct curltime now = Curl_now();
    time_t elapsed = Curl_timediff(now, check->keepalive);

    if(elapsed > check->upkeep_interval_ms) {
      /* Perform an HTTP/2 PING */
      rc = nghttp2_submit_ping(c->h2, 0, ZERO_NULL);
      if(!rc) {
        /* Successfully added a PING frame to the session. Need to flag this
           so the frame is sent. */







|







229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
  if(checks_to_perform & CONNCHECK_ISDEAD) {
    if(http2_connisdead(check))
      ret_val |= CONNRESULT_DEAD;
  }

  if(checks_to_perform & CONNCHECK_KEEPALIVE) {
    struct curltime now = Curl_now();
    timediff_t elapsed = Curl_timediff(now, check->keepalive);

    if(elapsed > check->upkeep_interval_ms) {
      /* Perform an HTTP/2 PING */
      rc = nghttp2_submit_ping(c->h2, 0, ZERO_NULL);
      if(!rc) {
        /* Successfully added a PING frame to the session. Need to flag this
           so the frame is sent. */
1562
1563
1564
1565
1566
1567
1568





1569
1570
1571
1572
1573
1574
1575
  struct HTTP *stream = data->req.protop;

  (void)sockindex; /* we always do HTTP2 on sockindex 0 */

  if(should_close_session(httpc)) {
    H2BUGF(infof(data,
                 "http2_recv: nothing to do in this session\n"));





    *err = CURLE_HTTP2;
    return -1;
  }

  /* Nullify here because we call nghttp2_session_send() and they
     might refer to the old buffer. */
  stream->upload_mem = NULL;







>
>
>
>
>







1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
  struct HTTP *stream = data->req.protop;

  (void)sockindex; /* we always do HTTP2 on sockindex 0 */

  if(should_close_session(httpc)) {
    H2BUGF(infof(data,
                 "http2_recv: nothing to do in this session\n"));
    if(conn->bits.close) {
      /* already marked for closure, return OK and we're done */
      *err = CURLE_OK;
      return 0;
    }
    *err = CURLE_HTTP2;
    return -1;
  }

  /* Nullify here because we call nghttp2_session_send() and they
     might refer to the old buffer. */
  stream->upload_mem = NULL;
1751
1752
1753
1754
1755
1756
1757



1758
1759
1760
1761
1762
1763
1764
         already so we need it called again asap */
      H2BUGF(infof(data, "Data returned for PAUSED stream %u\n",
                   stream->stream_id));
    }
    else if(!stream->closed) {
      drained_transfer(data, httpc);
    }




    return retlen;
  }
  /* If this stream is closed, return 0 to signal the http routine to close
     the connection */
  if(stream->closed)
    return 0;







>
>
>







1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
         already so we need it called again asap */
      H2BUGF(infof(data, "Data returned for PAUSED stream %u\n",
                   stream->stream_id));
    }
    else if(!stream->closed) {
      drained_transfer(data, httpc);
    }
    else
      /* this stream is closed, trigger a another read ASAP to detect that */
      Curl_expire(data, 0, EXPIRE_RUN_NOW);

    return retlen;
  }
  /* If this stream is closed, return 0 to signal the http routine to close
     the connection */
  if(stream->closed)
    return 0;
Changes to jni/curl/lib/http_negotiate.c.
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
    if(neg_ctx->noauthpersist && *state == GSS_AUTHSUCC) {
      infof(conn->data, "Curl_output_negotiate, "
       "no persistent authentication: cleanup existing context");
      Curl_http_auth_cleanup_negotiate(conn);
    }
    if(!neg_ctx->context) {
      result = Curl_input_negotiate(conn, proxy, "Negotiate");
      if(result == CURLE_LOGIN_DENIED) {
        /* negotiate auth failed, let's continue unauthenticated to stay
         * compatible with the behavior before curl-7_64_0-158-g6c6035532 */
        conn->data->state.authproblem = TRUE;
        return CURLE_OK;
      }
      else if(result)
        return result;
    }

    result = Curl_auth_create_spnego_message(conn->data,







|


|







144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
    if(neg_ctx->noauthpersist && *state == GSS_AUTHSUCC) {
      infof(conn->data, "Curl_output_negotiate, "
       "no persistent authentication: cleanup existing context");
      Curl_http_auth_cleanup_negotiate(conn);
    }
    if(!neg_ctx->context) {
      result = Curl_input_negotiate(conn, proxy, "Negotiate");
      if(result == CURLE_AUTH_ERROR) {
        /* negotiate auth failed, let's continue unauthenticated to stay
         * compatible with the behavior before curl-7_64_0-158-g6c6035532 */
        authp->done = TRUE;
        return CURLE_OK;
      }
      else if(result)
        return result;
    }

    result = Curl_auth_create_spnego_message(conn->data,
Changes to jni/curl/lib/imap.c.
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
static CURLcode imap_regular_transfer(struct connectdata *conn, bool *done);
static CURLcode imap_do(struct connectdata *conn, bool *done);
static CURLcode imap_done(struct connectdata *conn, CURLcode status,
                          bool premature);
static CURLcode imap_connect(struct connectdata *conn, bool *done);
static CURLcode imap_disconnect(struct connectdata *conn, bool dead);
static CURLcode imap_multi_statemach(struct connectdata *conn, bool *done);
static int imap_getsock(struct connectdata *conn, curl_socket_t *socks,
                        int numsocks);
static CURLcode imap_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode imap_setup_connection(struct connectdata *conn);
static char *imap_atom(const char *str, bool escape_only);
static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...);
static CURLcode imap_parse_url_options(struct connectdata *conn);
static CURLcode imap_parse_url_path(struct connectdata *conn);
static CURLcode imap_parse_custom_request(struct connectdata *conn);







|
<







91
92
93
94
95
96
97
98

99
100
101
102
103
104
105
static CURLcode imap_regular_transfer(struct connectdata *conn, bool *done);
static CURLcode imap_do(struct connectdata *conn, bool *done);
static CURLcode imap_done(struct connectdata *conn, CURLcode status,
                          bool premature);
static CURLcode imap_connect(struct connectdata *conn, bool *done);
static CURLcode imap_disconnect(struct connectdata *conn, bool dead);
static CURLcode imap_multi_statemach(struct connectdata *conn, bool *done);
static int imap_getsock(struct connectdata *conn, curl_socket_t *socks);

static CURLcode imap_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode imap_setup_connection(struct connectdata *conn);
static char *imap_atom(const char *str, bool escape_only);
static CURLcode imap_sendf(struct connectdata *conn, const char *fmt, ...);
static CURLcode imap_parse_url_options(struct connectdata *conn);
static CURLcode imap_parse_url_path(struct connectdata *conn);
static CURLcode imap_parse_custom_request(struct connectdata *conn);
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
  if(!imap)
    result = CURLE_OUT_OF_MEMORY;

  return result;
}

/* For the IMAP "protocol connect" and "doing" phases only */
static int imap_getsock(struct connectdata *conn, curl_socket_t *socks,
                        int numsocks)
{
  return Curl_pp_getsock(&conn->proto.imapc.pp, socks, numsocks);
}

/***********************************************************************
 *
 * imap_connect()
 *
 * This function should do everything that is to be considered a part of the







|
<

|







1387
1388
1389
1390
1391
1392
1393
1394

1395
1396
1397
1398
1399
1400
1401
1402
1403
  if(!imap)
    result = CURLE_OUT_OF_MEMORY;

  return result;
}

/* For the IMAP "protocol connect" and "doing" phases only */
static int imap_getsock(struct connectdata *conn, curl_socket_t *socks)

{
  return Curl_pp_getsock(&conn->proto.imapc.pp, socks);
}

/***********************************************************************
 *
 * imap_connect()
 *
 * This function should do everything that is to be considered a part of the
Changes to jni/curl/lib/libcurl.plist.
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
	<key>CFBundleExecutable</key>
	<string>curl</string>

	<key>CFBundleIdentifier</key>
	<string>se.haxx.curl.libcurl</string>

	<key>CFBundleVersion</key>
	<string>7.65.3</string>

	<key>CFBundleName</key>
	<string>libcurl</string>

	<key>CFBundlePackageType</key>
	<string>FMWK</string>

	<key>CFBundleSignature</key>
	<string>????</string>

	<key>CFBundleShortVersionString</key>
	<string>libcurl 7.65.3</string>

	<key>CFBundleGetInfoString</key>
	<string>libcurl.plist 7.65.3</string>
</dict>
</plist>







|











|


|


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
	<key>CFBundleExecutable</key>
	<string>curl</string>

	<key>CFBundleIdentifier</key>
	<string>se.haxx.curl.libcurl</string>

	<key>CFBundleVersion</key>
	<string>7.66.0</string>

	<key>CFBundleName</key>
	<string>libcurl</string>

	<key>CFBundlePackageType</key>
	<string>FMWK</string>

	<key>CFBundleSignature</key>
	<string>????</string>

	<key>CFBundleShortVersionString</key>
	<string>libcurl 7.66.0</string>

	<key>CFBundleGetInfoString</key>
	<string>libcurl.plist 7.66.0</string>
</dict>
</plist>
Changes to jni/curl/lib/md4.c.





















1

2




































































































































































































3
4
5
6
7
8
9





















/*

 * !checksrc! disable COPYRIGHT




































































































































































































 * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
 * MD4 Message-Digest Algorithm (RFC 1320).
 *
 * Homepage:
 https://openwall.info/wiki/people/solar/software/public-domain-source-code/md4
 *
 * Author:
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#if !defined(CURL_DISABLE_CRYPTO_AUTH)

#include "curl_md4.h"
#include "warnless.h"

#ifdef USE_OPENSSL
#include <openssl/opensslconf.h>
#endif
#ifdef USE_MBEDTLS
#include <mbedtls/config.h>
#endif

#if defined(USE_GNUTLS_NETTLE)

#include <nettle/md4.h>

#include "curl_memory.h"

/* The last #include file should be: */
#include "memdebug.h"

typedef struct md4_ctx MD4_CTX;

static void MD4_Init(MD4_CTX *ctx)
{
  md4_init(ctx);
}

static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
{
  md4_update(ctx, size, data);
}

static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
{
  md4_digest(ctx, MD4_DIGEST_SIZE, result);
}

#elif defined(USE_GNUTLS)

#include <gcrypt.h>

#include "curl_memory.h"
/* The last #include file should be: */
#include "memdebug.h"

typedef struct gcry_md_hd_t MD4_CTX;

static void MD4_Init(MD4_CTX *ctx)
{
  gcry_md_open(ctx, GCRY_MD_MD4, 0);
}

static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
{
  gcry_md_write(*ctx, data, size);
}

static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
{
  memcpy(result, gcry_md_read(ctx, 0), MD4_DIGEST_LENGTH);
  gcry_md_close(ctx);
}

#elif defined(USE_OPENSSL) && !defined(OPENSSL_NO_MD4)
/* When OpenSSL is available we use the MD4-functions from OpenSSL */
#include <openssl/md4.h>

#elif defined(USE_SECTRANSP)

#include <CommonCrypto/CommonDigest.h>

#include "curl_memory.h"
/* The last #include file should be: */
#include "memdebug.h"

typedef struct {
  void *data;
  unsigned long size;
} MD4_CTX;

static void MD4_Init(MD4_CTX *ctx)
{
  ctx->data = NULL;
  ctx->size = 0;
}

static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
{
  if(ctx->data == NULL) {
    ctx->data = malloc(size);
    if(ctx->data != NULL) {
      memcpy(ctx->data, data, size);
      ctx->size = size;
    }
  }
}

static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
{
  if(ctx->data != NULL) {
    (void)CC_MD4(ctx->data, (CC_LONG) ctx->size, result);

    Curl_safefree(ctx->data);
    ctx->size = 0;
  }
}

#elif defined(USE_WIN32_CRYPTO)

#include <wincrypt.h>

#include "curl_memory.h"
 /* The last #include file should be: */
#include "memdebug.h"

typedef struct {
  HCRYPTPROV hCryptProv;
  HCRYPTHASH hHash;
} MD4_CTX;

static void MD4_Init(MD4_CTX *ctx)
{
  ctx->hCryptProv = 0;
  ctx->hHash = 0;

  if(CryptAcquireContext(&ctx->hCryptProv, NULL, NULL, PROV_RSA_FULL,
                         CRYPT_VERIFYCONTEXT)) {
    CryptCreateHash(ctx->hCryptProv, CALG_MD4, 0, 0, &ctx->hHash);
  }
}

static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
{
  CryptHashData(ctx->hHash, data, (unsigned int) size, 0);
}

static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
{
  unsigned long length = 0;

  CryptGetHashParam(ctx->hHash, HP_HASHVAL, NULL, &length, 0);
  if(length == MD4_DIGEST_LENGTH)
    CryptGetHashParam(ctx->hHash, HP_HASHVAL, result, &length, 0);

  if(ctx->hHash)
    CryptDestroyHash(ctx->hHash);

  if(ctx->hCryptProv)
    CryptReleaseContext(ctx->hCryptProv, 0);
}

#elif(defined(USE_MBEDTLS) && defined(MBEDTLS_MD4_C))

#include <mbedtls/md4.h>

#include "curl_memory.h"
/* The last #include file should be: */
#include "memdebug.h"

typedef struct {
  void *data;
  unsigned long size;
} MD4_CTX;

static void MD4_Init(MD4_CTX *ctx)
{
  ctx->data = NULL;
  ctx->size = 0;
}

static void MD4_Update(MD4_CTX *ctx, const void *data, unsigned long size)
{
  if(ctx->data == NULL) {
    ctx->data = malloc(size);
    if(ctx->data != NULL) {
      memcpy(ctx->data, data, size);
      ctx->size = size;
    }
  }
}

static void MD4_Final(unsigned char *result, MD4_CTX *ctx)
{
  if(ctx->data != NULL) {
    mbedtls_md4(ctx->data, ctx->size, result);

    Curl_safefree(ctx->data);
    ctx->size = 0;
  }
}

#else
/* When no other crypto library is available, or the crypto library doesn't
 * support MD4, we use this code segment this implementation of it
 *
 * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
 * MD4 Message-Digest Algorithm (RFC 1320).
 *
 * Homepage:
 https://openwall.info/wiki/people/solar/software/public-domain-source-code/md4
 *
 * Author:
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
 *
 * The primary goals of this implementation are portability and ease of use.
 * It is meant to be fast, but not as fast as possible.  Some known
 * optimizations are not included to reduce source code size and avoid
 * compile-time configuration.
 */

#include "curl_setup.h"

#ifdef USE_OPENSSL
#include <openssl/opensslconf.h>
#endif
#ifdef USE_MBEDTLS
#include <mbedtls/config.h>
#endif

/* The NSS, OS/400, and when not included, OpenSSL and mbed TLS crypto
 * libraries do not provide the MD4 hash algorithm, so we use this
 * implementation of it */
#if defined(USE_NSS) || defined(USE_OS400CRYPTO) || \
    (defined(USE_OPENSSL) && defined(OPENSSL_NO_MD4)) || \
    (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C))

#include "curl_md4.h"
#include "warnless.h"

#ifndef HAVE_OPENSSL

#include <string.h>

/* Any 32-bit or wider unsigned integer data type will do */
typedef unsigned int MD4_u32plus;

typedef struct {







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







250
251
252
253
254
255
256




















257
258
259
260
261
262
263
 *
 * The primary goals of this implementation are portability and ease of use.
 * It is meant to be fast, but not as fast as possible.  Some known
 * optimizations are not included to reduce source code size and avoid
 * compile-time configuration.
 */






















#include <string.h>

/* Any 32-bit or wider unsigned integer data type will do */
typedef unsigned int MD4_u32plus;

typedef struct {
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
  result[13] = curlx_ultouc((ctx->d >> 8)&0xff);
  result[14] = curlx_ultouc((ctx->d >> 16)&0xff);
  result[15] = curlx_ultouc(ctx->d >> 24);

  memset(ctx, 0, sizeof(*ctx));
}

#endif

void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len)
{
  MD4_CTX ctx;
  MD4_Init(&ctx);
  MD4_Update(&ctx, input, curlx_uztoui(len));
  MD4_Final(output, &ctx);
}

#endif /* defined(USE_NSS) || defined(USE_OS400CRYPTO) ||
    (defined(USE_OPENSSL) && defined(OPENSSL_NO_MD4)) ||
    (defined(USE_MBEDTLS) && !defined(MBEDTLS_MD4_C)) */







|









|
<
<
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516


  result[13] = curlx_ultouc((ctx->d >> 8)&0xff);
  result[14] = curlx_ultouc((ctx->d >> 16)&0xff);
  result[15] = curlx_ultouc(ctx->d >> 24);

  memset(ctx, 0, sizeof(*ctx));
}

#endif /* CRYPTO LIBS */

void Curl_md4it(unsigned char *output, const unsigned char *input, size_t len)
{
  MD4_CTX ctx;
  MD4_Init(&ctx);
  MD4_Update(&ctx, input, curlx_uztoui(len));
  MD4_Final(output, &ctx);
}

#endif /* CURL_DISABLE_CRYPTO_AUTH */


Changes to jni/curl/lib/multi.c.
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839






840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871




















872

873
874
875
876
877
878
879
880
881
882
883
  DEBUGASSERT(conn);
  data->conn = conn;
  Curl_llist_insert_next(&conn->easyq, conn->easyq.tail, data,
                         &data->conn_queue);
}

static int waitconnect_getsock(struct connectdata *conn,
                               curl_socket_t *sock,
                               int numsocks)
{
  int i;
  int s = 0;
  int rc = 0;

  if(!numsocks)
    return GETSOCK_BLANK;

#ifdef USE_SSL
  if(CONNECT_FIRSTSOCKET_PROXY_SSL())
    return Curl_ssl_getsock(conn, sock, numsocks);
#endif

  for(i = 0; i<2; i++) {
    if(conn->tempsock[i] != CURL_SOCKET_BAD) {
      sock[s] = conn->tempsock[i];
      rc |= GETSOCK_WRITESOCK(s++);






    }
  }

  return rc;
}

static int waitproxyconnect_getsock(struct connectdata *conn,
                                    curl_socket_t *sock,
                                    int numsocks)
{
  if(!numsocks)
    return GETSOCK_BLANK;

  sock[0] = conn->sock[FIRSTSOCKET];

  /* when we've sent a CONNECT to a proxy, we should rather wait for the
     socket to become readable to be able to get the response headers */
  if(conn->connect_state)
    return GETSOCK_READSOCK(0);

  return GETSOCK_WRITESOCK(0);
}

static int domore_getsock(struct connectdata *conn,
                          curl_socket_t *socks,
                          int numsocks)
{
  if(conn && conn->handler->domore_getsock)
    return conn->handler->domore_getsock(conn, socks, numsocks);
  return GETSOCK_BLANK;
}





















/* returns bitmapped flags for this handle and its sockets */

static int multi_getsock(struct Curl_easy *data,
                         curl_socket_t *socks, /* points to numsocks number
                                                  of sockets */
                         int numsocks)
{
  /* The no connection case can happen when this is called from
     curl_multi_remove_handle() => singlesocket() => multi_getsock().
  */
  if(!data->conn)
    return 0;








|
<





<
<
<


|





|
>
>
>
>
>
>







|
<

<
<
<











|
<


|



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>

|
<
<







814
815
816
817
818
819
820
821

822
823
824
825
826



827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849

850



851
852
853
854
855
856
857
858
859
860
861
862

863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892


893
894
895
896
897
898
899
  DEBUGASSERT(conn);
  data->conn = conn;
  Curl_llist_insert_next(&conn->easyq, conn->easyq.tail, data,
                         &data->conn_queue);
}

static int waitconnect_getsock(struct connectdata *conn,
                               curl_socket_t *sock)

{
  int i;
  int s = 0;
  int rc = 0;




#ifdef USE_SSL
  if(CONNECT_FIRSTSOCKET_PROXY_SSL())
    return Curl_ssl_getsock(conn, sock);
#endif

  for(i = 0; i<2; i++) {
    if(conn->tempsock[i] != CURL_SOCKET_BAD) {
      sock[s] = conn->tempsock[i];
      rc |= GETSOCK_WRITESOCK(s);
#ifdef ENABLE_QUIC
      if(conn->transport == TRNSPRT_QUIC)
        /* when connecting QUIC, we want to read the socket too */
        rc |= GETSOCK_READSOCK(s);
#endif
      s++;
    }
  }

  return rc;
}

static int waitproxyconnect_getsock(struct connectdata *conn,
                                    curl_socket_t *sock)

{



  sock[0] = conn->sock[FIRSTSOCKET];

  /* when we've sent a CONNECT to a proxy, we should rather wait for the
     socket to become readable to be able to get the response headers */
  if(conn->connect_state)
    return GETSOCK_READSOCK(0);

  return GETSOCK_WRITESOCK(0);
}

static int domore_getsock(struct connectdata *conn,
                          curl_socket_t *socks)

{
  if(conn && conn->handler->domore_getsock)
    return conn->handler->domore_getsock(conn, socks);
  return GETSOCK_BLANK;
}

static int doing_getsock(struct connectdata *conn,
                         curl_socket_t *socks)
{
  if(conn && conn->handler->doing_getsock)
    return conn->handler->doing_getsock(conn, socks);
  return GETSOCK_BLANK;
}

static int protocol_getsock(struct connectdata *conn,
                            curl_socket_t *socks)
{
  if(conn->handler->proto_getsock)
    return conn->handler->proto_getsock(conn, socks);
  /* Backup getsock logic. Since there is a live socket in use, we must wait
     for it or it will be removed from watching when the multi_socket API is
     used. */
  socks[0] = conn->sock[FIRSTSOCKET];
  return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
}

/* returns bitmapped flags for this handle and its sockets. The 'socks[]'
   array contains MAX_SOCKSPEREASYHANDLE entries. */
static int multi_getsock(struct Curl_easy *data,
                         curl_socket_t *socks)


{
  /* The no connection case can happen when this is called from
     curl_multi_remove_handle() => singlesocket() => multi_getsock().
  */
  if(!data->conn)
    return 0;

901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
  case CURLM_STATE_LAST:
    /* this will get called with CURLM_STATE_COMPLETED when a handle is
       removed */
#endif
    return 0;

  case CURLM_STATE_WAITRESOLVE:
    return Curl_resolv_getsock(data->conn, socks, numsocks);

  case CURLM_STATE_PROTOCONNECT:
  case CURLM_STATE_SENDPROTOCONNECT:
    return Curl_protocol_getsock(data->conn, socks, numsocks);

  case CURLM_STATE_DO:
  case CURLM_STATE_DOING:
    return Curl_doing_getsock(data->conn, socks, numsocks);

  case CURLM_STATE_WAITPROXYCONNECT:
    return waitproxyconnect_getsock(data->conn, socks, numsocks);

  case CURLM_STATE_WAITCONNECT:
    return waitconnect_getsock(data->conn, socks, numsocks);

  case CURLM_STATE_DO_MORE:
    return domore_getsock(data->conn, socks, numsocks);

  case CURLM_STATE_DO_DONE: /* since is set after DO is completed, we switch
                               to waiting for the same as the *PERFORM
                               states */
  case CURLM_STATE_PERFORM:
    return Curl_single_getsock(data->conn, socks, numsocks);
  }

}

CURLMcode curl_multi_fdset(struct Curl_multi *multi,
                           fd_set *read_fd_set, fd_set *write_fd_set,
                           fd_set *exc_fd_set, int *max_fd)







|



|



|


|


|


|





|







917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
  case CURLM_STATE_LAST:
    /* this will get called with CURLM_STATE_COMPLETED when a handle is
       removed */
#endif
    return 0;

  case CURLM_STATE_WAITRESOLVE:
    return Curl_resolv_getsock(data->conn, socks);

  case CURLM_STATE_PROTOCONNECT:
  case CURLM_STATE_SENDPROTOCONNECT:
    return protocol_getsock(data->conn, socks);

  case CURLM_STATE_DO:
  case CURLM_STATE_DOING:
    return doing_getsock(data->conn, socks);

  case CURLM_STATE_WAITPROXYCONNECT:
    return waitproxyconnect_getsock(data->conn, socks);

  case CURLM_STATE_WAITCONNECT:
    return waitconnect_getsock(data->conn, socks);

  case CURLM_STATE_DO_MORE:
    return domore_getsock(data->conn, socks);

  case CURLM_STATE_DO_DONE: /* since is set after DO is completed, we switch
                               to waiting for the same as the *PERFORM
                               states */
  case CURLM_STATE_PERFORM:
    return Curl_single_getsock(data->conn, socks);
  }

}

CURLMcode curl_multi_fdset(struct Curl_multi *multi,
                           fd_set *read_fd_set, fd_set *write_fd_set,
                           fd_set *exc_fd_set, int *max_fd)
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
    return CURLM_BAD_HANDLE;

  if(multi->in_callback)
    return CURLM_RECURSIVE_API_CALL;

  data = multi->easyp;
  while(data) {
    int bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);

    for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
      curl_socket_t s = CURL_SOCKET_BAD;

      if((bitmap & GETSOCK_READSOCK(i)) && VALID_SOCK((sockbunch[i]))) {
        FD_SET(sockbunch[i], read_fd_set);
        s = sockbunch[i];







|







966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
    return CURLM_BAD_HANDLE;

  if(multi->in_callback)
    return CURLM_RECURSIVE_API_CALL;

  data = multi->easyp;
  while(data) {
    int bitmap = multi_getsock(data, sockbunch);

    for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
      curl_socket_t s = CURL_SOCKET_BAD;

      if((bitmap & GETSOCK_READSOCK(i)) && VALID_SOCK((sockbunch[i]))) {
        FD_SET(sockbunch[i], read_fd_set);
        s = sockbunch[i];
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
  *max_fd = this_max_fd;

  return CURLM_OK;
}

#define NUM_POLLS_ON_STACK 10

CURLMcode Curl_multi_wait(struct Curl_multi *multi,
                          struct curl_waitfd extra_fds[],
                          unsigned int extra_nfds,
                          int timeout_ms,
                          int *ret,
                          bool *gotsocket) /* if any socket was checked */
{
  struct Curl_easy *data;
  curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
  int bitmap;
  unsigned int i;
  unsigned int nfds = 0;
  unsigned int curlfds;
  bool ufds_malloc = FALSE;
  long timeout_internal;
  int retcode = 0;
  struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK];
  struct pollfd *ufds = &a_few_on_stack[0];

  if(gotsocket)
    *gotsocket = FALSE;

  if(!GOOD_MULTI_HANDLE(multi))
    return CURLM_BAD_HANDLE;

  if(multi->in_callback)
    return CURLM_RECURSIVE_API_CALL;

  /* Count up how many fds we have from the multi handle */
  data = multi->easyp;
  while(data) {
    bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);

    for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
      curl_socket_t s = CURL_SOCKET_BAD;

      if(bitmap & GETSOCK_READSOCK(i)) {
        ++nfds;
        s = sockbunch[i];







|
|
|
|
|
|













<
<
<









|







996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021



1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
  *max_fd = this_max_fd;

  return CURLM_OK;
}

#define NUM_POLLS_ON_STACK 10

static CURLMcode Curl_multi_wait(struct Curl_multi *multi,
                                 struct curl_waitfd extra_fds[],
                                 unsigned int extra_nfds,
                                 int timeout_ms,
                                 int *ret,
                                 bool extrawait) /* when no socket, wait */
{
  struct Curl_easy *data;
  curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
  int bitmap;
  unsigned int i;
  unsigned int nfds = 0;
  unsigned int curlfds;
  bool ufds_malloc = FALSE;
  long timeout_internal;
  int retcode = 0;
  struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK];
  struct pollfd *ufds = &a_few_on_stack[0];




  if(!GOOD_MULTI_HANDLE(multi))
    return CURLM_BAD_HANDLE;

  if(multi->in_callback)
    return CURLM_RECURSIVE_API_CALL;

  /* Count up how many fds we have from the multi handle */
  data = multi->easyp;
  while(data) {
    bitmap = multi_getsock(data, sockbunch);

    for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
      curl_socket_t s = CURL_SOCKET_BAD;

      if(bitmap & GETSOCK_READSOCK(i)) {
        ++nfds;
        s = sockbunch[i];
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
  /* only do the second loop if we found descriptors in the first stage run
     above */

  if(curlfds) {
    /* Add the curl handles to our pollfds first */
    data = multi->easyp;
    while(data) {
      bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);

      for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
        curl_socket_t s = CURL_SOCKET_BAD;

        if(bitmap & GETSOCK_READSOCK(i)) {
          ufds[nfds].fd = sockbunch[i];
          ufds[nfds].events = POLLIN;







|







1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
  /* only do the second loop if we found descriptors in the first stage run
     above */

  if(curlfds) {
    /* Add the curl handles to our pollfds first */
    data = multi->easyp;
    while(data) {
      bitmap = multi_getsock(data, sockbunch);

      for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
        curl_socket_t s = CURL_SOCKET_BAD;

        if(bitmap & GETSOCK_READSOCK(i)) {
          ufds[nfds].fd = sockbunch[i];
          ufds[nfds].events = POLLIN;
1130
1131
1132
1133
1134
1135
1136
1137
1138



1139







1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150









1151
1152
1153
1154
1155
1156
1157
    }
  }

  if(ufds_malloc)
    free(ufds);
  if(ret)
    *ret = retcode;
  if(gotsocket && (extra_fds || curlfds))
    /* if any socket was checked */



    *gotsocket = TRUE;








  return CURLM_OK;
}

CURLMcode curl_multi_wait(struct Curl_multi *multi,
                          struct curl_waitfd extra_fds[],
                          unsigned int extra_nfds,
                          int timeout_ms,
                          int *ret)
{
  return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, NULL);









}

/*
 * multi_ischanged() is called
 *
 * Returns TRUE/FALSE whether the state is changed to trigger a CONNECT_PEND
 * => CONNECT action.







|

>
>
>
|
>
>
>
>
>
>
>










|
>
>
>
>
>
>
>
>
>







1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
    }
  }

  if(ufds_malloc)
    free(ufds);
  if(ret)
    *ret = retcode;
  if(!extrawait || extra_fds || curlfds)
    /* if any socket was checked */
    ;
  else {
    long sleep_ms = 0;

    /* Avoid busy-looping when there's nothing particular to wait for */
    if(!curl_multi_timeout(multi, &sleep_ms) && sleep_ms) {
      if(sleep_ms > timeout_ms)
        sleep_ms = timeout_ms;
      Curl_wait_ms((int)sleep_ms);
    }
  }

  return CURLM_OK;
}

CURLMcode curl_multi_wait(struct Curl_multi *multi,
                          struct curl_waitfd extra_fds[],
                          unsigned int extra_nfds,
                          int timeout_ms,
                          int *ret)
{
  return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, FALSE);
}

CURLMcode curl_multi_poll(struct Curl_multi *multi,
                          struct curl_waitfd extra_fds[],
                          unsigned int extra_nfds,
                          int timeout_ms,
                          int *ret)
{
  return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, TRUE);
}

/*
 * multi_ischanged() is called
 *
 * Returns TRUE/FALSE whether the state is changed to trigger a CONNECT_PEND
 * => CONNECT action.
1242
1243
1244
1245
1246
1247
1248
1249







































































































1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264

  if(!result && (*complete == 1))
    /* do_complete must be called after the protocol-specific DO function */
    do_complete(conn);

  return result;
}








































































































static CURLMcode multi_runsingle(struct Curl_multi *multi,
                                 struct curltime now,
                                 struct Curl_easy *data)
{
  struct Curl_message *msg = NULL;
  bool connected;
  bool async;
  bool protocol_connect = FALSE;
  bool dophase_done = FALSE;
  bool done = FALSE;
  CURLMcode rc;
  CURLcode result = CURLE_OK;
  timediff_t timeout_ms;
  timediff_t recv_timeout_ms;
  timediff_t send_timeout_ms;








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







|







1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399

  if(!result && (*complete == 1))
    /* do_complete must be called after the protocol-specific DO function */
    do_complete(conn);

  return result;
}

/*
 * We are doing protocol-specific connecting and this is being called over and
 * over from the multi interface until the connection phase is done on
 * protocol layer.
 */

static CURLcode protocol_connecting(struct connectdata *conn,
                                    bool *done)
{
  CURLcode result = CURLE_OK;

  if(conn && conn->handler->connecting) {
    *done = FALSE;
    result = conn->handler->connecting(conn, done);
  }
  else
    *done = TRUE;

  return result;
}

/*
 * We are DOING this is being called over and over from the multi interface
 * until the DOING phase is done on protocol layer.
 */

static CURLcode protocol_doing(struct connectdata *conn, bool *done)
{
  CURLcode result = CURLE_OK;

  if(conn && conn->handler->doing) {
    *done = FALSE;
    result = conn->handler->doing(conn, done);
  }
  else
    *done = TRUE;

  return result;
}

/*
 * We have discovered that the TCP connection has been successful, we can now
 * proceed with some action.
 *
 */
static CURLcode protocol_connect(struct connectdata *conn,
                                 bool *protocol_done)
{
  CURLcode result = CURLE_OK;

  DEBUGASSERT(conn);
  DEBUGASSERT(protocol_done);

  *protocol_done = FALSE;

  if(conn->bits.tcpconnect[FIRSTSOCKET] && conn->bits.protoconnstart) {
    /* We already are connected, get back. This may happen when the connect
       worked fine in the first call, like when we connect to a local server
       or proxy. Note that we don't know if the protocol is actually done.

       Unless this protocol doesn't have any protocol-connect callback, as
       then we know we're done. */
    if(!conn->handler->connecting)
      *protocol_done = TRUE;

    return CURLE_OK;
  }

  if(!conn->bits.protoconnstart) {

    result = Curl_proxy_connect(conn, FIRSTSOCKET);
    if(result)
      return result;

    if(CONNECT_FIRSTSOCKET_PROXY_SSL())
      /* wait for HTTPS proxy SSL initialization to complete */
      return CURLE_OK;

    if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
       Curl_connect_ongoing(conn))
      /* when using an HTTP tunnel proxy, await complete tunnel establishment
         before proceeding further. Return CURLE_OK so we'll be called again */
      return CURLE_OK;

    if(conn->handler->connect_it) {
      /* is there a protocol-specific connect() procedure? */

      /* Call the protocol-specific connect function */
      result = conn->handler->connect_it(conn, protocol_done);
    }
    else
      *protocol_done = TRUE;

    /* it has started, possibly even completed but that knowledge isn't stored
       in this bit! */
    if(!result)
      conn->bits.protoconnstart = TRUE;
  }

  return result; /* pass back status */
}


static CURLMcode multi_runsingle(struct Curl_multi *multi,
                                 struct curltime now,
                                 struct Curl_easy *data)
{
  struct Curl_message *msg = NULL;
  bool connected;
  bool async;
  bool protocol_connected = FALSE;
  bool dophase_done = FALSE;
  bool done = FALSE;
  CURLMcode rc;
  CURLcode result = CURLE_OK;
  timediff_t timeout_ms;
  timediff_t recv_timeout_ms;
  timediff_t send_timeout_ms;
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
      Curl_pgrsTime(data, TIMER_STARTSINGLE);
      if(data->set.timeout)
        Curl_expire(data, data->set.timeout, EXPIRE_TIMEOUT);

      if(data->set.connecttimeout)
        Curl_expire(data, data->set.connecttimeout, EXPIRE_CONNECTTIMEOUT);

      result = Curl_connect(data, &async, &protocol_connect);
      if(CURLE_NO_CONNECTION_AVAILABLE == result) {
        /* There was no connection available. We will go to the pending
           state and wait for an available connection. */
        multistate(data, CURLM_STATE_CONNECT_PEND);

        /* add this handle to the list of connect-pending handles */
        Curl_llist_insert_next(&multi->pending, multi->pending.tail, data,







|







1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
      Curl_pgrsTime(data, TIMER_STARTSINGLE);
      if(data->set.timeout)
        Curl_expire(data, data->set.timeout, EXPIRE_TIMEOUT);

      if(data->set.connecttimeout)
        Curl_expire(data, data->set.connecttimeout, EXPIRE_CONNECTTIMEOUT);

      result = Curl_connect(data, &async, &protocol_connected);
      if(CURLE_NO_CONNECTION_AVAILABLE == result) {
        /* There was no connection available. We will go to the pending
           state and wait for an available connection. */
        multistate(data, CURLM_STATE_CONNECT_PEND);

        /* add this handle to the list of connect-pending handles */
        Curl_llist_insert_next(&multi->pending, multi->pending.tail, data,
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
          multistate(data, CURLM_STATE_WAITRESOLVE);
        else {
          /* after the connect has been sent off, go WAITCONNECT unless the
             protocol connect is already done and we can go directly to
             WAITDO or DO! */
          rc = CURLM_CALL_MULTI_PERFORM;

          if(protocol_connect)
            multistate(data, CURLM_STATE_DO);
          else {
#ifndef CURL_DISABLE_HTTP
            if(Curl_connect_ongoing(data->conn))
              multistate(data, CURLM_STATE_WAITPROXYCONNECT);
            else
#endif







|







1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
          multistate(data, CURLM_STATE_WAITRESOLVE);
        else {
          /* after the connect has been sent off, go WAITCONNECT unless the
             protocol connect is already done and we can go directly to
             WAITDO or DO! */
          rc = CURLM_CALL_MULTI_PERFORM;

          if(protocol_connected)
            multistate(data, CURLM_STATE_DO);
          else {
#ifndef CURL_DISABLE_HTTP
            if(Curl_connect_ongoing(data->conn))
              multistate(data, CURLM_STATE_WAITPROXYCONNECT);
            else
#endif
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
         that new sockets have been opened in an attempt to contact
         another resolver. */
      singlesocket(multi, data);

      if(dns) {
        /* Perform the next step in the connection phase, and then move on
           to the WAITCONNECT state */
        result = Curl_once_resolved(data->conn, &protocol_connect);

        if(result)
          /* if Curl_once_resolved() returns failure, the connection struct
             is already freed and gone */
          data->conn = NULL; /* no more connection */
        else {
          /* call again please so that we get the next socket setup */
          rc = CURLM_CALL_MULTI_PERFORM;
          if(protocol_connect)
            multistate(data, CURLM_STATE_DO);
          else {
#ifndef CURL_DISABLE_HTTP
            if(Curl_connect_ongoing(data->conn))
              multistate(data, CURLM_STATE_WAITPROXYCONNECT);
            else
#endif







|








|







1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
         that new sockets have been opened in an attempt to contact
         another resolver. */
      singlesocket(multi, data);

      if(dns) {
        /* Perform the next step in the connection phase, and then move on
           to the WAITCONNECT state */
        result = Curl_once_resolved(data->conn, &protocol_connected);

        if(result)
          /* if Curl_once_resolved() returns failure, the connection struct
             is already freed and gone */
          data->conn = NULL; /* no more connection */
        else {
          /* call again please so that we get the next socket setup */
          rc = CURLM_CALL_MULTI_PERFORM;
          if(protocol_connected)
            multistate(data, CURLM_STATE_DO);
          else {
#ifndef CURL_DISABLE_HTTP
            if(Curl_connect_ongoing(data->conn))
              multistate(data, CURLM_STATE_WAITPROXYCONNECT);
            else
#endif
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
    }
    break;

#ifndef CURL_DISABLE_HTTP
    case CURLM_STATE_WAITPROXYCONNECT:
      /* this is HTTP-specific, but sending CONNECT to a proxy is HTTP... */
      DEBUGASSERT(data->conn);
      result = Curl_http_connect(data->conn, &protocol_connect);

      if(data->conn->bits.proxy_connect_closed) {
        rc = CURLM_CALL_MULTI_PERFORM;
        /* connect back to proxy again */
        result = CURLE_OK;
        multi_done(data, CURLE_OK, FALSE);
        multistate(data, CURLM_STATE_CONNECT);







|







1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
    }
    break;

#ifndef CURL_DISABLE_HTTP
    case CURLM_STATE_WAITPROXYCONNECT:
      /* this is HTTP-specific, but sending CONNECT to a proxy is HTTP... */
      DEBUGASSERT(data->conn);
      result = Curl_http_connect(data->conn, &protocol_connected);

      if(data->conn->bits.proxy_connect_closed) {
        rc = CURLM_CALL_MULTI_PERFORM;
        /* connect back to proxy again */
        result = CURLE_OK;
        multi_done(data, CURLE_OK, FALSE);
        multistate(data, CURLM_STATE_CONNECT);
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
        multi_done(data, result, TRUE);
        stream_error = TRUE;
        break;
      }
      break;

    case CURLM_STATE_SENDPROTOCONNECT:
      result = Curl_protocol_connect(data->conn, &protocol_connect);
      if(!result && !protocol_connect)
        /* switch to waiting state */
        multistate(data, CURLM_STATE_PROTOCONNECT);
      else if(!result) {
        /* protocol connect has completed, go WAITDO or DO */
        multistate(data, CURLM_STATE_DO);
        rc = CURLM_CALL_MULTI_PERFORM;
      }
      else if(result) {
        /* failure detected */
        Curl_posttransfer(data);
        multi_done(data, result, TRUE);
        stream_error = TRUE;
      }
      break;

    case CURLM_STATE_PROTOCONNECT:
      /* protocol-specific connect phase */
      result = Curl_protocol_connecting(data->conn, &protocol_connect);
      if(!result && protocol_connect) {
        /* after the connect has completed, go WAITDO or DO */
        multistate(data, CURLM_STATE_DO);
        rc = CURLM_CALL_MULTI_PERFORM;
      }
      else if(result) {
        /* failure detected */
        Curl_posttransfer(data);







|
|

















|
|







1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
        multi_done(data, result, TRUE);
        stream_error = TRUE;
        break;
      }
      break;

    case CURLM_STATE_SENDPROTOCONNECT:
      result = protocol_connect(data->conn, &protocol_connected);
      if(!result && !protocol_connected)
        /* switch to waiting state */
        multistate(data, CURLM_STATE_PROTOCONNECT);
      else if(!result) {
        /* protocol connect has completed, go WAITDO or DO */
        multistate(data, CURLM_STATE_DO);
        rc = CURLM_CALL_MULTI_PERFORM;
      }
      else if(result) {
        /* failure detected */
        Curl_posttransfer(data);
        multi_done(data, result, TRUE);
        stream_error = TRUE;
      }
      break;

    case CURLM_STATE_PROTOCONNECT:
      /* protocol-specific connect phase */
      result = protocol_connecting(data->conn, &protocol_connected);
      if(!result && protocol_connected) {
        /* after the connect has completed, go WAITDO or DO */
        multistate(data, CURLM_STATE_DO);
        rc = CURLM_CALL_MULTI_PERFORM;
      }
      else if(result) {
        /* failure detected */
        Curl_posttransfer(data);
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
        }
      }
      break;

    case CURLM_STATE_DOING:
      /* we continue DOING until the DO phase is complete */
      DEBUGASSERT(data->conn);
      result = Curl_protocol_doing(data->conn,
                                   &dophase_done);
      if(!result) {
        if(dophase_done) {
          /* after DO, go DO_DONE or DO_MORE */
          multistate(data, data->conn->bits.do_more?
                     CURLM_STATE_DO_MORE:
                     CURLM_STATE_DO_DONE);
          rc = CURLM_CALL_MULTI_PERFORM;







|
<







1814
1815
1816
1817
1818
1819
1820
1821

1822
1823
1824
1825
1826
1827
1828
        }
      }
      break;

    case CURLM_STATE_DOING:
      /* we continue DOING until the DO phase is complete */
      DEBUGASSERT(data->conn);
      result = protocol_doing(data->conn, &dophase_done);

      if(!result) {
        if(dophase_done) {
          /* after DO, go DO_DONE or DO_MORE */
          multistate(data, data->conn->bits.do_more?
                     CURLM_STATE_DO_MORE:
                     CURLM_STATE_DO_DONE);
          rc = CURLM_CALL_MULTI_PERFORM;
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021



2022
2023
2024
2025
2026
2027
2028
        /* Check if we can move pending requests to send pipe */
        process_pending_handles(multi); /* connection */

        if(data->conn) {
          if(stream_error) {
            /* Don't attempt to send data over a connection that timed out */
            bool dead_connection = result == CURLE_OPERATION_TIMEDOUT;
            /* disconnect properly */
            Curl_disconnect(data, data->conn, dead_connection);

            /* This is where we make sure that the conn pointer is reset.
               We don't have to do this in every case block above where a
               failure is detected */
            detach_connnection(data);



          }
        }
        else if(data->mstate == CURLM_STATE_CONNECT) {
          /* Curl_connect() failed */
          (void)Curl_posttransfer(data);
        }








|
<





>
>
>







2142
2143
2144
2145
2146
2147
2148
2149

2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
        /* Check if we can move pending requests to send pipe */
        process_pending_handles(multi); /* connection */

        if(data->conn) {
          if(stream_error) {
            /* Don't attempt to send data over a connection that timed out */
            bool dead_connection = result == CURLE_OPERATION_TIMEDOUT;
            struct connectdata *conn = data->conn;


            /* This is where we make sure that the conn pointer is reset.
               We don't have to do this in every case block above where a
               failure is detected */
            detach_connnection(data);

            /* disconnect properly */
            Curl_disconnect(data, conn, dead_connection);
          }
        }
        else if(data->mstate == CURLM_STATE_CONNECT) {
          /* Curl_connect() failed */
          (void)Curl_posttransfer(data);
        }

2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
  int actions[MAX_SOCKSPEREASYHANDLE];

  for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++)
    socks[i] = CURL_SOCKET_BAD;

  /* Fill in the 'current' struct with the state as it is now: what sockets to
     supervise and for what actions */
  curraction = multi_getsock(data, socks, MAX_SOCKSPEREASYHANDLE);

  /* We have 0 .. N sockets already and we get to know about the 0 .. M
     sockets we should have from now on. Detect the differences, remove no
     longer supervised ones and add new ones */

  /* walk over the sockets we got right now */
  for(i = 0; (i< MAX_SOCKSPEREASYHANDLE) &&







|







2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
  int actions[MAX_SOCKSPEREASYHANDLE];

  for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++)
    socks[i] = CURL_SOCKET_BAD;

  /* Fill in the 'current' struct with the state as it is now: what sockets to
     supervise and for what actions */
  curraction = multi_getsock(data, socks);

  /* We have 0 .. N sockets already and we get to know about the 0 .. M
     sockets we should have from now on. Detect the differences, remove no
     longer supervised ones and add new ones */

  /* walk over the sockets we got right now */
  for(i = 0; (i< MAX_SOCKSPEREASYHANDLE) &&
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
 * this'-time for the transfer, to be extracted by curl_multi_timeout()
 *
 * The timeout will be added to a queue of timeouts if it defines a moment in
 * time that is later than the current head of queue.
 *
 * Expire replaces a former timeout using the same id if already set.
 */
void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
{
  struct Curl_multi *multi = data->multi;
  struct curltime *nowp = &data->state.expiretime;
  struct curltime set;

  /* this is only interesting while there is still an associated multi struct
     remaining! */
  if(!multi)
    return;

  DEBUGASSERT(id < EXPIRE_LAST);

  set = Curl_now();
  set.tv_sec += milli/1000;
  set.tv_usec += (unsigned int)(milli%1000)*1000;

  if(set.tv_usec >= 1000000) {
    set.tv_sec++;
    set.tv_usec -= 1000000;
  }








|













|







2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
 * this'-time for the transfer, to be extracted by curl_multi_timeout()
 *
 * The timeout will be added to a queue of timeouts if it defines a moment in
 * time that is later than the current head of queue.
 *
 * Expire replaces a former timeout using the same id if already set.
 */
void Curl_expire(struct Curl_easy *data, timediff_t milli, expire_id id)
{
  struct Curl_multi *multi = data->multi;
  struct curltime *nowp = &data->state.expiretime;
  struct curltime set;

  /* this is only interesting while there is still an associated multi struct
     remaining! */
  if(!multi)
    return;

  DEBUGASSERT(id < EXPIRE_LAST);

  set = Curl_now();
  set.tv_sec += (time_t)(milli/1000); /* might be a 64 to 32 bit conversion */
  set.tv_usec += (unsigned int)(milli%1000)*1000;

  if(set.tv_usec >= 1000000) {
    set.tv_sec++;
    set.tv_usec -= 1000000;
  }

Changes to jni/curl/lib/multiif.h.
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 ***************************************************************************/

/*
 * Prototypes for library-wide functions provided by multi.c
 */

void Curl_updatesocket(struct Curl_easy *data);
void Curl_expire(struct Curl_easy *data, time_t milli, expire_id);
void Curl_expire_clear(struct Curl_easy *data);
void Curl_expire_done(struct Curl_easy *data, expire_id id);
void Curl_update_timer(struct Curl_multi *multi);
void Curl_attach_connnection(struct Curl_easy *data,
                             struct connectdata *conn);
bool Curl_multiplex_wanted(const struct Curl_multi *multi);
void Curl_set_in_callback(struct Curl_easy *data, bool value);







|







23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 ***************************************************************************/

/*
 * Prototypes for library-wide functions provided by multi.c
 */

void Curl_updatesocket(struct Curl_easy *data);
void Curl_expire(struct Curl_easy *data, timediff_t milli, expire_id);
void Curl_expire_clear(struct Curl_easy *data);
void Curl_expire_done(struct Curl_easy *data, expire_id id);
void Curl_update_timer(struct Curl_multi *multi);
void Curl_attach_connnection(struct Curl_easy *data,
                             struct connectdata *conn);
bool Curl_multiplex_wanted(const struct Curl_multi *multi);
void Curl_set_in_callback(struct Curl_easy *data, bool value);
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
 * Add a handle and move it into PERFORM state at once. For pushed streams.
 */
CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
                                 struct Curl_easy *data,
                                 struct connectdata *conn);

CURLMcode Curl_multi_wait(struct Curl_multi *multi,
                          struct curl_waitfd extra_fds[],
                          unsigned int extra_nfds,
                          int timeout_ms,
                          int *ret,
                          bool *gotsocket); /* if any socket was checked */

#endif /* HEADER_CURL_MULTIIF_H */







<
<
<
<
<
<
<

85
86
87
88
89
90
91







92
/*
 * Add a handle and move it into PERFORM state at once. For pushed streams.
 */
CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
                                 struct Curl_easy *data,
                                 struct connectdata *conn);








#endif /* HEADER_CURL_MULTIIF_H */
Changes to jni/curl/lib/netrc.c.
41
42
43
44
45
46
47
48

49

50
51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127

enum host_lookup_state {
  NOTHING,
  HOSTFOUND,    /* the 'machine' keyword was found */
  HOSTVALID     /* this is "our" machine! */
};

/*

 * @unittest: 1304

 *
 * *loginp and *passwordp MUST be allocated if they aren't NULL when passed

 * in.
 */
int Curl_parsenetrc(const char *host,
                    char **loginp,
                    char **passwordp,
                    bool *login_changed,
                    bool *password_changed,
                    char *netrcfile)
{
  FILE *file;
  int retcode = 1;
  char *login = *loginp;
  char *password = *passwordp;
  bool specific_login = (login && *login != 0);
  bool login_alloc = FALSE;
  bool password_alloc = FALSE;
  bool netrc_alloc = FALSE;
  enum host_lookup_state state = NOTHING;

  char state_login = 0;      /* Found a login keyword */
  char state_password = 0;   /* Found a password keyword */
  int state_our_login = FALSE;  /* With specific_login, found *our* login
                                   name */

#define NETRC DOT_CHAR "netrc"

  if(!netrcfile) {
    bool home_alloc = FALSE;
    char *home = curl_getenv("HOME"); /* portable environment reader */
    if(home) {
      home_alloc = TRUE;
#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID)
    }
    else {
      struct passwd pw, *pw_res;
      char pwbuf[1024];
      if(!getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res)
         && pw_res) {
        home = strdup(pw.pw_dir);
        if(!home)
          return -1;
        home_alloc = TRUE;
      }
#elif defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
    }
    else {
      struct passwd *pw;
      pw = getpwuid(geteuid());
      if(pw) {
        home = pw->pw_dir;
      }
#endif
    }

    if(!home)
      return retcode; /* no home directory found (or possibly out of memory) */

    netrcfile = curl_maprintf("%s%s%s", home, DIR_CHAR, NETRC);
    if(home_alloc)
      free(home);
    if(!netrcfile) {
      return -1;
    }
    netrc_alloc = TRUE;
  }

  file = fopen(netrcfile, FOPEN_READTEXT);
  if(netrc_alloc)
    free(netrcfile);
  if(file) {
    char *tok;
    char *tok_buf;
    bool done = FALSE;
    char netrcbuffer[4096];
    int  netrcbuffsize = (int)sizeof(netrcbuffer);








<
>
|
>
|
<
>
|

|
|
|
|
|
|


|





<







<
<
|
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

<
<







41
42
43
44
45
46
47

48
49
50
51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

69
70
71
72
73
74
75


76





77

































78


79
80
81
82
83
84
85

enum host_lookup_state {
  NOTHING,
  HOSTFOUND,    /* the 'machine' keyword was found */
  HOSTVALID     /* this is "our" machine! */
};


#define NETRC_FILE_MISSING 1
#define NETRC_FAILED -1
#define NETRC_SUCCESS 0


/*
 * Returns zero on success.
 */
static int parsenetrc(const char *host,
                      char **loginp,
                      char **passwordp,
                      bool *login_changed,
                      bool *password_changed,
                      char *netrcfile)
{
  FILE *file;
  int retcode = NETRC_FILE_MISSING;
  char *login = *loginp;
  char *password = *passwordp;
  bool specific_login = (login && *login != 0);
  bool login_alloc = FALSE;
  bool password_alloc = FALSE;

  enum host_lookup_state state = NOTHING;

  char state_login = 0;      /* Found a login keyword */
  char state_password = 0;   /* Found a password keyword */
  int state_our_login = FALSE;  /* With specific_login, found *our* login
                                   name */



  DEBUGASSERT(netrcfile);







































  file = fopen(netrcfile, FOPEN_READTEXT);


  if(file) {
    char *tok;
    char *tok_buf;
    bool done = FALSE;
    char netrcbuffer[4096];
    int  netrcbuffsize = (int)sizeof(netrcbuffer);

144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
               delimiter that starts the stuff entered for this machine,
               after this we need to search for 'login' and
               'password'. */
            state = HOSTFOUND;
          }
          else if(strcasecompare("default", tok)) {
            state = HOSTVALID;
            retcode = 0; /* we did find our host */
          }
          break;
        case HOSTFOUND:
          if(strcasecompare(host, tok)) {
            /* and yes, this is our host! */
            state = HOSTVALID;
            retcode = 0; /* we did find our host */
          }
          else
            /* not our host */
            state = NOTHING;
          break;
        case HOSTVALID:
          /* we are now parsing sub-keywords concerning "our" host */
          if(state_login) {
            if(specific_login) {
              state_our_login = strcasecompare(login, tok);
            }
            else if(!login || strcmp(login, tok)) {
              if(login_alloc) {
                free(login);
                login_alloc = FALSE;
              }
              login = strdup(tok);
              if(!login) {
                retcode = -1; /* allocation failed */
                goto out;
              }
              login_alloc = TRUE;
            }
            state_login = 0;
          }
          else if(state_password) {
            if((state_our_login || !specific_login)
                && (!password || strcmp(password, tok))) {
              if(password_alloc) {
                free(password);
                password_alloc = FALSE;
              }
              password = strdup(tok);
              if(!password) {
                retcode = -1; /* allocation failed */
                goto out;
              }
              password_alloc = TRUE;
            }
            state_password = 0;
          }
          else if(strcasecompare("login", tok))







|






|


















|















|







102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
               delimiter that starts the stuff entered for this machine,
               after this we need to search for 'login' and
               'password'. */
            state = HOSTFOUND;
          }
          else if(strcasecompare("default", tok)) {
            state = HOSTVALID;
            retcode = NETRC_SUCCESS; /* we did find our host */
          }
          break;
        case HOSTFOUND:
          if(strcasecompare(host, tok)) {
            /* and yes, this is our host! */
            state = HOSTVALID;
            retcode = NETRC_SUCCESS; /* we did find our host */
          }
          else
            /* not our host */
            state = NOTHING;
          break;
        case HOSTVALID:
          /* we are now parsing sub-keywords concerning "our" host */
          if(state_login) {
            if(specific_login) {
              state_our_login = strcasecompare(login, tok);
            }
            else if(!login || strcmp(login, tok)) {
              if(login_alloc) {
                free(login);
                login_alloc = FALSE;
              }
              login = strdup(tok);
              if(!login) {
                retcode = NETRC_FAILED; /* allocation failed */
                goto out;
              }
              login_alloc = TRUE;
            }
            state_login = 0;
          }
          else if(state_password) {
            if((state_our_login || !specific_login)
                && (!password || strcmp(password, tok))) {
              if(password_alloc) {
                free(password);
                password_alloc = FALSE;
              }
              password = strdup(tok);
              if(!password) {
                retcode = NETRC_FAILED; /* allocation failed */
                goto out;
              }
              password_alloc = TRUE;
            }
            state_password = 0;
          }
          else if(strcasecompare("login", tok))
211
212
213
214
215
216
217

218
219
220
221
222
223
224

        tok = strtok_r(NULL, " \t\n", &tok_buf);
      } /* while(tok) */
    } /* while fgets() */

    out:
    if(!retcode) {

      *login_changed = FALSE;
      *password_changed = FALSE;
      if(login_alloc) {
        if(*loginp)
          free(*loginp);
        *loginp = login;
        *login_changed = TRUE;







>







169
170
171
172
173
174
175
176
177
178
179
180
181
182
183

        tok = strtok_r(NULL, " \t\n", &tok_buf);
      } /* while(tok) */
    } /* while fgets() */

    out:
    if(!retcode) {
      /* success */
      *login_changed = FALSE;
      *password_changed = FALSE;
      if(login_alloc) {
        if(*loginp)
          free(*loginp);
        *loginp = login;
        *login_changed = TRUE;
237
238
239
240
241
242
243
244






































245




































        free(password);
    }
    fclose(file);
  }

  return retcode;
}







































#endif












































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
        free(password);
    }
    fclose(file);
  }

  return retcode;
}

/*
 * @unittest: 1304
 *
 * *loginp and *passwordp MUST be allocated if they aren't NULL when passed
 * in.
 */
int Curl_parsenetrc(const char *host,
                    char **loginp,
                    char **passwordp,
                    bool *login_changed,
                    bool *password_changed,
                    char *netrcfile)
{
  int retcode = 1;
  char *filealloc = NULL;

  if(!netrcfile) {
    char *home = NULL;
    char *homea = curl_getenv("HOME"); /* portable environment reader */
    if(homea) {
      home = homea;
#if defined(HAVE_GETPWUID_R) && defined(HAVE_GETEUID)
    }
    else {
      struct passwd pw, *pw_res;
      char pwbuf[1024];
      if(!getpwuid_r(geteuid(), &pw, pwbuf, sizeof(pwbuf), &pw_res)
         && pw_res) {
        home = pw.pw_dir;
      }
#elif defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
    }
    else {
      struct passwd *pw;
      pw = getpwuid(geteuid());
      if(pw) {
        home = pw->pw_dir;
      }
#endif
    }

    if(!home)
      return retcode; /* no home directory found (or possibly out of
                         memory) */

    filealloc = curl_maprintf("%s%s.netrc", home, DIR_CHAR);
    if(!filealloc) {
      free(homea);
      return -1;
    }
    retcode = parsenetrc(host, loginp, passwordp, login_changed,
                         password_changed, filealloc);
    free(filealloc);
#ifdef WIN32
    if(retcode == NETRC_FILE_MISSING) {
      /* fallback to the old-style "_netrc" file */
      filealloc = curl_maprintf("%s%s_netrc", home, DIR_CHAR);
      if(!filealloc) {
        free(homea);
        return -1;
      }
      retcode = parsenetrc(host, loginp, passwordp, login_changed,
                           password_changed, filealloc);
      free(filealloc);
    }
#endif
    free(homea);
  }
  else
    retcode = parsenetrc(host, loginp, passwordp, login_changed,
                         password_changed, netrcfile);
  return retcode;
}

#endif
Changes to jni/curl/lib/openldap.c.
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
  "bad host or port",
  "bad or missing attributes",
  "bad or missing scope",
  "bad or missing filter",
  "bad or missing extensions"
};

typedef struct ldapconninfo {
  LDAP *ld;
  Curl_recv *recv;  /* for stacking SSL handler */
  Curl_send *send;
  int proto;
  int msgid;
  bool ssldone;
  bool sslinst;
  bool didbind;
} ldapconninfo;

typedef struct ldapreqinfo {
  int msgid;
  int nument;
} ldapreqinfo;

static CURLcode ldap_setup_connection(struct connectdata *conn)
{
  ldapconninfo *li;
  LDAPURLDesc *lud;
  struct Curl_easy *data = conn->data;
  int rc, proto;
  CURLcode status;

  rc = ldap_url_parse(data->change.url, &lud);
  if(rc != LDAP_URL_SUCCESS) {
    const char *msg = "url parsing problem";
    status = CURLE_URL_MALFORMAT;
    if(rc > LDAP_URL_SUCCESS && rc <= LDAP_URL_ERR_BADEXTS) {
      if(rc == LDAP_URL_ERR_MEM)
        status = CURLE_OUT_OF_MEMORY;
      msg = url_errs[rc];
    }
    failf(conn->data, "LDAP local: %s", msg);
    return status;
  }
  proto = ldap_pvt_url_scheme2proto(lud->lud_scheme);
  ldap_free_urldesc(lud);

  li = calloc(1, sizeof(ldapconninfo));
  if(!li)
    return CURLE_OUT_OF_MEMORY;
  li->proto = proto;
  conn->proto.generic = li;
  connkeep(conn, "OpenLDAP default");
  return CURLE_OK;
}

#ifdef USE_SSL
static Sockbuf_IO ldapsb_tls;
#endif

static CURLcode ldap_connect(struct connectdata *conn, bool *done)
{
  ldapconninfo *li = conn->proto.generic;
  struct Curl_easy *data = conn->data;
  int rc, proto = LDAP_VERSION3;
  char hosturl[1024];
  char *ptr;

  (void)done;








|








|








|




















|



|










|







147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
  "bad host or port",
  "bad or missing attributes",
  "bad or missing scope",
  "bad or missing filter",
  "bad or missing extensions"
};

struct ldapconninfo {
  LDAP *ld;
  Curl_recv *recv;  /* for stacking SSL handler */
  Curl_send *send;
  int proto;
  int msgid;
  bool ssldone;
  bool sslinst;
  bool didbind;
};

typedef struct ldapreqinfo {
  int msgid;
  int nument;
} ldapreqinfo;

static CURLcode ldap_setup_connection(struct connectdata *conn)
{
  struct ldapconninfo *li;
  LDAPURLDesc *lud;
  struct Curl_easy *data = conn->data;
  int rc, proto;
  CURLcode status;

  rc = ldap_url_parse(data->change.url, &lud);
  if(rc != LDAP_URL_SUCCESS) {
    const char *msg = "url parsing problem";
    status = CURLE_URL_MALFORMAT;
    if(rc > LDAP_URL_SUCCESS && rc <= LDAP_URL_ERR_BADEXTS) {
      if(rc == LDAP_URL_ERR_MEM)
        status = CURLE_OUT_OF_MEMORY;
      msg = url_errs[rc];
    }
    failf(conn->data, "LDAP local: %s", msg);
    return status;
  }
  proto = ldap_pvt_url_scheme2proto(lud->lud_scheme);
  ldap_free_urldesc(lud);

  li = calloc(1, sizeof(struct ldapconninfo));
  if(!li)
    return CURLE_OUT_OF_MEMORY;
  li->proto = proto;
  conn->proto.ldapc = li;
  connkeep(conn, "OpenLDAP default");
  return CURLE_OK;
}

#ifdef USE_SSL
static Sockbuf_IO ldapsb_tls;
#endif

static CURLcode ldap_connect(struct connectdata *conn, bool *done)
{
  struct ldapconninfo *li = conn->proto.ldapc;
  struct Curl_easy *data = conn->data;
  int rc, proto = LDAP_VERSION3;
  char hosturl[1024];
  char *ptr;

  (void)done;

248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
#endif

  return CURLE_OK;
}

static CURLcode ldap_connecting(struct connectdata *conn, bool *done)
{
  ldapconninfo *li = conn->proto.generic;
  struct Curl_easy *data = conn->data;
  LDAPMessage *msg = NULL;
  struct timeval tv = {0, 1}, *tvp;
  int rc, err;
  char *info = NULL;

#ifdef USE_SSL







|







248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
#endif

  return CURLE_OK;
}

static CURLcode ldap_connecting(struct connectdata *conn, bool *done)
{
  struct ldapconninfo *li = conn->proto.ldapc;
  struct Curl_easy *data = conn->data;
  LDAPMessage *msg = NULL;
  struct timeval tv = {0, 1}, *tvp;
  int rc, err;
  char *info = NULL;

#ifdef USE_SSL
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
  *done = TRUE;

  return CURLE_OK;
}

static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
{
  ldapconninfo *li = conn->proto.generic;
  (void) dead_connection;

  if(li) {
    if(li->ld) {
      ldap_unbind_ext(li->ld, NULL, NULL);
      li->ld = NULL;
    }
    conn->proto.generic = NULL;
    free(li);
  }
  return CURLE_OK;
}

static CURLcode ldap_do(struct connectdata *conn, bool *done)
{
  ldapconninfo *li = conn->proto.generic;
  ldapreqinfo *lr;
  CURLcode status = CURLE_OK;
  int rc = 0;
  LDAPURLDesc *ludp = NULL;
  int msgid;
  struct Curl_easy *data = conn->data;








|







|







|







353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
  *done = TRUE;

  return CURLE_OK;
}

static CURLcode ldap_disconnect(struct connectdata *conn, bool dead_connection)
{
  struct ldapconninfo *li = conn->proto.ldapc;
  (void) dead_connection;

  if(li) {
    if(li->ld) {
      ldap_unbind_ext(li->ld, NULL, NULL);
      li->ld = NULL;
    }
    conn->proto.ldapc = NULL;
    free(li);
  }
  return CURLE_OK;
}

static CURLcode ldap_do(struct connectdata *conn, bool *done)
{
  struct ldapconninfo *li = conn->proto.ldapc;
  ldapreqinfo *lr;
  CURLcode status = CURLE_OK;
  int rc = 0;
  LDAPURLDesc *ludp = NULL;
  int msgid;
  struct Curl_easy *data = conn->data;

423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451

  (void)res;
  (void)premature;

  if(lr) {
    /* if there was a search in progress, abandon it */
    if(lr->msgid) {
      ldapconninfo *li = conn->proto.generic;
      ldap_abandon_ext(li->ld, lr->msgid, NULL, NULL);
      lr->msgid = 0;
    }
    conn->data->req.protop = NULL;
    free(lr);
  }

  return CURLE_OK;
}

static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,
                         size_t len, CURLcode *err)
{
  ldapconninfo *li = conn->proto.generic;
  struct Curl_easy *data = conn->data;
  ldapreqinfo *lr = data->req.protop;
  int rc, ret;
  LDAPMessage *msg = NULL;
  LDAPMessage *ent;
  BerElement *ber = NULL;
  struct timeval tv = {0, 1};







|













|







423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451

  (void)res;
  (void)premature;

  if(lr) {
    /* if there was a search in progress, abandon it */
    if(lr->msgid) {
      struct ldapconninfo *li = conn->proto.ldapc;
      ldap_abandon_ext(li->ld, lr->msgid, NULL, NULL);
      lr->msgid = 0;
    }
    conn->data->req.protop = NULL;
    free(lr);
  }

  return CURLE_OK;
}

static ssize_t ldap_recv(struct connectdata *conn, int sockindex, char *buf,
                         size_t len, CURLcode *err)
{
  struct ldapconninfo *li = conn->proto.ldapc;
  struct Curl_easy *data = conn->data;
  ldapreqinfo *lr = data->req.protop;
  int rc, ret;
  LDAPMessage *msg = NULL;
  LDAPMessage *ent;
  BerElement *ber = NULL;
  struct timeval tv = {0, 1};
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
  return 0;
}

static ber_slen_t
ldapsb_tls_read(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
{
  struct connectdata *conn = sbiod->sbiod_pvt;
  ldapconninfo *li = conn->proto.generic;
  ber_slen_t ret;
  CURLcode err = CURLE_RECV_ERROR;

  ret = (li->recv)(conn, FIRSTSOCKET, buf, len, &err);
  if(ret < 0 && err == CURLE_AGAIN) {
    SET_SOCKERRNO(EWOULDBLOCK);
  }
  return ret;
}

static ber_slen_t
ldapsb_tls_write(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
{
  struct connectdata *conn = sbiod->sbiod_pvt;
  ldapconninfo *li = conn->proto.generic;
  ber_slen_t ret;
  CURLcode err = CURLE_SEND_ERROR;

  ret = (li->send)(conn, FIRSTSOCKET, buf, len, &err);
  if(ret < 0 && err == CURLE_AGAIN) {
    SET_SOCKERRNO(EWOULDBLOCK);
  }







|














|







714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
  return 0;
}

static ber_slen_t
ldapsb_tls_read(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
{
  struct connectdata *conn = sbiod->sbiod_pvt;
  struct ldapconninfo *li = conn->proto.ldapc;
  ber_slen_t ret;
  CURLcode err = CURLE_RECV_ERROR;

  ret = (li->recv)(conn, FIRSTSOCKET, buf, len, &err);
  if(ret < 0 && err == CURLE_AGAIN) {
    SET_SOCKERRNO(EWOULDBLOCK);
  }
  return ret;
}

static ber_slen_t
ldapsb_tls_write(Sockbuf_IO_Desc *sbiod, void *buf, ber_len_t len)
{
  struct connectdata *conn = sbiod->sbiod_pvt;
  struct ldapconninfo *li = conn->proto.ldapc;
  ber_slen_t ret;
  CURLcode err = CURLE_SEND_ERROR;

  ret = (li->send)(conn, FIRSTSOCKET, buf, len, &err);
  if(ret < 0 && err == CURLE_AGAIN) {
    SET_SOCKERRNO(EWOULDBLOCK);
  }
Changes to jni/curl/lib/pingpong.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
     remaining time, or use pp->response because SERVER_RESPONSE_TIMEOUT is
     supposed to govern the response for any given server response, not for
     the time from connect to the given server response. */

  /* Without a requested timeout, we only wait 'response_time' seconds for the
     full response to arrive before we bail out */
  timeout_ms = response_time -
    Curl_timediff(Curl_now(), pp->response); /* spent time */

  if(data->set.timeout && !disconnecting) {
    /* if timeout is requested, find out how much remaining time we have */
    time_t timeout2_ms = data->set.timeout - /* timeout time */
      Curl_timediff(Curl_now(), conn->now); /* spent time */

    /* pick the lowest number */
    timeout_ms = CURLMIN(timeout_ms, timeout2_ms);
  }

  return timeout_ms;
}







|




|







56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
     remaining time, or use pp->response because SERVER_RESPONSE_TIMEOUT is
     supposed to govern the response for any given server response, not for
     the time from connect to the given server response. */

  /* Without a requested timeout, we only wait 'response_time' seconds for the
     full response to arrive before we bail out */
  timeout_ms = response_time -
    (time_t)Curl_timediff(Curl_now(), pp->response); /* spent time */

  if(data->set.timeout && !disconnecting) {
    /* if timeout is requested, find out how much remaining time we have */
    time_t timeout2_ms = data->set.timeout - /* timeout time */
      (time_t)Curl_timediff(Curl_now(), conn->now); /* spent time */

    /* pick the lowest number */
    timeout_ms = CURLMIN(timeout_ms, timeout2_ms);
  }

  return timeout_ms;
}
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480

  pp->pending_resp = FALSE;

  return result;
}

int Curl_pp_getsock(struct pingpong *pp,
                    curl_socket_t *socks,
                    int numsocks)
{
  struct connectdata *conn = pp->conn;

  if(!numsocks)
    return GETSOCK_BLANK;

  socks[0] = conn->sock[FIRSTSOCKET];

  if(pp->sendleft) {
    /* write mode */
    return GETSOCK_WRITESOCK(0);
  }








|
<


<
<
<
<







459
460
461
462
463
464
465
466

467
468




469
470
471
472
473
474
475

  pp->pending_resp = FALSE;

  return result;
}

int Curl_pp_getsock(struct pingpong *pp,
                    curl_socket_t *socks)

{
  struct connectdata *conn = pp->conn;




  socks[0] = conn->sock[FIRSTSOCKET];

  if(pp->sendleft) {
    /* write mode */
    return GETSOCK_WRITESOCK(0);
  }

Changes to jni/curl/lib/pingpong.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_CURL_PINGPONG_H
#define HEADER_CURL_PINGPONG_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_CURL_PINGPONG_H
#define HEADER_CURL_PINGPONG_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151


CURLcode Curl_pp_flushsend(struct pingpong *pp);

/* call this when a pingpong connection is disconnected */
CURLcode Curl_pp_disconnect(struct pingpong *pp);

int Curl_pp_getsock(struct pingpong *pp, curl_socket_t *socks,
                    int numsocks);


/***********************************************************************
 *
 * Curl_pp_moredata()
 *
 * Returns whether there are still more data in the cache and so a call
 * to Curl_pp_readresp() will not block.
 */
bool Curl_pp_moredata(struct pingpong *pp);

#endif /* HEADER_CURL_PINGPONG_H */







|
<












131
132
133
134
135
136
137
138

139
140
141
142
143
144
145
146
147
148
149
150


CURLcode Curl_pp_flushsend(struct pingpong *pp);

/* call this when a pingpong connection is disconnected */
CURLcode Curl_pp_disconnect(struct pingpong *pp);

int Curl_pp_getsock(struct pingpong *pp, curl_socket_t *socks);



/***********************************************************************
 *
 * Curl_pp_moredata()
 *
 * Returns whether there are still more data in the cache and so a call
 * to Curl_pp_readresp() will not block.
 */
bool Curl_pp_moredata(struct pingpong *pp);

#endif /* HEADER_CURL_PINGPONG_H */
Changes to jni/curl/lib/pop3.c.
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
static CURLcode pop3_regular_transfer(struct connectdata *conn, bool *done);
static CURLcode pop3_do(struct connectdata *conn, bool *done);
static CURLcode pop3_done(struct connectdata *conn, CURLcode status,
                          bool premature);
static CURLcode pop3_connect(struct connectdata *conn, bool *done);
static CURLcode pop3_disconnect(struct connectdata *conn, bool dead);
static CURLcode pop3_multi_statemach(struct connectdata *conn, bool *done);
static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks,
                        int numsocks);
static CURLcode pop3_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode pop3_setup_connection(struct connectdata *conn);
static CURLcode pop3_parse_url_options(struct connectdata *conn);
static CURLcode pop3_parse_url_path(struct connectdata *conn);
static CURLcode pop3_parse_custom_request(struct connectdata *conn);
static CURLcode pop3_perform_auth(struct connectdata *conn, const char *mech,
                                  const char *initresp);







|
<







91
92
93
94
95
96
97
98

99
100
101
102
103
104
105
static CURLcode pop3_regular_transfer(struct connectdata *conn, bool *done);
static CURLcode pop3_do(struct connectdata *conn, bool *done);
static CURLcode pop3_done(struct connectdata *conn, CURLcode status,
                          bool premature);
static CURLcode pop3_connect(struct connectdata *conn, bool *done);
static CURLcode pop3_disconnect(struct connectdata *conn, bool dead);
static CURLcode pop3_multi_statemach(struct connectdata *conn, bool *done);
static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks);

static CURLcode pop3_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode pop3_setup_connection(struct connectdata *conn);
static CURLcode pop3_parse_url_options(struct connectdata *conn);
static CURLcode pop3_parse_url_path(struct connectdata *conn);
static CURLcode pop3_parse_custom_request(struct connectdata *conn);
static CURLcode pop3_perform_auth(struct connectdata *conn, const char *mech,
                                  const char *initresp);
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
  if(!pop3)
    result = CURLE_OUT_OF_MEMORY;

  return result;
}

/* For the POP3 "protocol connect" and "doing" phases only */
static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks,
                        int numsocks)
{
  return Curl_pp_getsock(&conn->proto.pop3c.pp, socks, numsocks);
}

/***********************************************************************
 *
 * pop3_connect()
 *
 * This function should do everything that is to be considered a part of the







|
<

|







1050
1051
1052
1053
1054
1055
1056
1057

1058
1059
1060
1061
1062
1063
1064
1065
1066
  if(!pop3)
    result = CURLE_OUT_OF_MEMORY;

  return result;
}

/* For the POP3 "protocol connect" and "doing" phases only */
static int pop3_getsock(struct connectdata *conn, curl_socket_t *socks)

{
  return Curl_pp_getsock(&conn->proto.pop3c.pp, socks);
}

/***********************************************************************
 *
 * pop3_connect()
 *
 * This function should do everything that is to be considered a part of the
Changes to jni/curl/lib/progress.c.
22
23
24
25
26
27
28

29
30
31
32
33
34
35

#include "curl_setup.h"

#include "urldata.h"
#include "sendf.h"
#include "multiif.h"
#include "progress.h"

#include "curl_printf.h"

/* check rate limits within this many recent milliseconds, at minimum. */
#define MIN_RATE_LIMIT_PERIOD 3000

#ifndef CURL_DISABLE_PROGRESS_METER
/* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero







>







22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

#include "curl_setup.h"

#include "urldata.h"
#include "sendf.h"
#include "multiif.h"
#include "progress.h"
#include "timeval.h"
#include "curl_printf.h"

/* check rate limits within this many recent milliseconds, at minimum. */
#define MIN_RATE_LIMIT_PERIOD 3000

#ifndef CURL_DISABLE_PROGRESS_METER
/* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178

/*
 * @unittest: 1399
 */
void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
{
  struct curltime now = Curl_now();
  time_t *delta = NULL;

  switch(timer) {
  default:
  case TIMER_NONE:
    /* mistake filter */
    break;
  case TIMER_STARTOP:







|







165
166
167
168
169
170
171
172
173
174
175
176
177
178
179

/*
 * @unittest: 1399
 */
void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
{
  struct curltime now = Curl_now();
  timediff_t *delta = NULL;

  switch(timer) {
  default:
  case TIMER_NONE:
    /* mistake filter */
    break;
  case TIMER_STARTOP:
234
235
236
237
238
239
240


241
242
243
244
245
246
247
  data->progress.speeder_c = 0; /* reset the progress meter display */
  data->progress.start = Curl_now();
  data->progress.is_t_startransfer_set = false;
  data->progress.ul_limit_start.tv_sec = 0;
  data->progress.ul_limit_start.tv_usec = 0;
  data->progress.dl_limit_start.tv_sec = 0;
  data->progress.dl_limit_start.tv_usec = 0;


  /* clear all bits except HIDE and HEADERS_OUT */
  data->progress.flags &= PGRS_HIDE|PGRS_HEADERS_OUT;
  Curl_ratelimit(data, data->progress.start);
}

/*
 * This is used to handle speed limits, calculating how many milliseconds to







>
>







235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
  data->progress.speeder_c = 0; /* reset the progress meter display */
  data->progress.start = Curl_now();
  data->progress.is_t_startransfer_set = false;
  data->progress.ul_limit_start.tv_sec = 0;
  data->progress.ul_limit_start.tv_usec = 0;
  data->progress.dl_limit_start.tv_sec = 0;
  data->progress.dl_limit_start.tv_usec = 0;
  data->progress.downloaded = 0;
  data->progress.uploaded = 0;
  /* clear all bits except HIDE and HEADERS_OUT */
  data->progress.flags &= PGRS_HIDE|PGRS_HEADERS_OUT;
  Curl_ratelimit(data, data->progress.start);
}

/*
 * This is used to handle speed limits, calculating how many milliseconds to
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
                                  curl_off_t startsize,
                                  curl_off_t limit,
                                  struct curltime start,
                                  struct curltime now)
{
  curl_off_t size = cursize - startsize;
  time_t minimum;
  time_t actual;

  if(!limit || !size)
    return 0;

  /*
   * 'minimum' is the number of milliseconds 'size' should take to download to
   * stay below 'limit'.
   */
  if(size < CURL_OFF_T_MAX/1000)
    minimum = (time_t) (CURL_OFF_T_C(1000) * size / limit);
  else {
    minimum = (time_t) (size / limit);
    if(minimum < TIME_T_MAX/1000)
      minimum *= 1000;
    else
      minimum = TIME_T_MAX;
  }

  /*
   * 'actual' is the time in milliseconds it took to actually download the
   * last 'size' bytes.
   */
  actual = Curl_timediff(now, start);







|
|












|


|







267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
timediff_t Curl_pgrsLimitWaitTime(curl_off_t cursize,
                                  curl_off_t startsize,
                                  curl_off_t limit,
                                  struct curltime start,
                                  struct curltime now)
{
  curl_off_t size = cursize - startsize;
  timediff_t minimum;
  timediff_t actual;

  if(!limit || !size)
    return 0;

  /*
   * 'minimum' is the number of milliseconds 'size' should take to download to
   * stay below 'limit'.
   */
  if(size < CURL_OFF_T_MAX/1000)
    minimum = (time_t) (CURL_OFF_T_C(1000) * size / limit);
  else {
    minimum = (time_t) (size / limit);
    if(minimum < TIMEDIFF_T_MAX/1000)
      minimum *= 1000;
    else
      minimum = TIMEDIFF_T_MAX;
  }

  /*
   * 'actual' is the time in milliseconds it took to actually download the
   * last 'size' bytes.
   */
  actual = Curl_timediff(now, start);
Added jni/curl/lib/quic.h.










































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef HEADER_CURL_QUIC_H
#define HEADER_CURL_QUIC_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#ifdef ENABLE_QUIC
#ifdef USE_NGTCP2
#include "vquic/ngtcp2.h"
#endif
#ifdef USE_QUICHE
#include "vquic/quiche.h"
#endif

#include "urldata.h"

/* functions provided by the specific backends */
CURLcode Curl_quic_connect(struct connectdata *conn,
                           curl_socket_t sockfd,
                           int sockindex,
                           const struct sockaddr *addr,
                           socklen_t addrlen);
CURLcode Curl_quic_is_connected(struct connectdata *conn,
                                curl_socket_t sockfd,
                                bool *connected);
int Curl_quic_ver(char *p, size_t len);
CURLcode Curl_quic_done_sending(struct connectdata *conn);

#else /* ENABLE_QUIC */
#define Curl_quic_done_sending(x)
#endif /* !ENABLE_QUIC */

#endif /* HEADER_CURL_QUIC_H */
Changes to jni/curl/lib/rtsp.c.
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
                             ((int)((unsigned char)((p)[3]))))

/* protocol-specific functions set up to be called by the main engine */
static CURLcode rtsp_do(struct connectdata *conn, bool *done);
static CURLcode rtsp_done(struct connectdata *conn, CURLcode, bool premature);
static CURLcode rtsp_connect(struct connectdata *conn, bool *done);
static CURLcode rtsp_disconnect(struct connectdata *conn, bool dead);

static int rtsp_getsock_do(struct connectdata *conn,
                           curl_socket_t *socks,
                           int numsocks);

/*
 * Parse and write out any available RTP data.
 *
 * nread: amount of data left after k->str. will be modified if RTP
 *        data is parsed and k->str is moved up
 * readmore: whether or not the RTP parser needs more data right away







<
|
<
<







48
49
50
51
52
53
54

55


56
57
58
59
60
61
62
                             ((int)((unsigned char)((p)[3]))))

/* protocol-specific functions set up to be called by the main engine */
static CURLcode rtsp_do(struct connectdata *conn, bool *done);
static CURLcode rtsp_done(struct connectdata *conn, CURLcode, bool premature);
static CURLcode rtsp_connect(struct connectdata *conn, bool *done);
static CURLcode rtsp_disconnect(struct connectdata *conn, bool dead);

static int rtsp_getsock_do(struct connectdata *conn, curl_socket_t *socks);



/*
 * Parse and write out any available RTP data.
 *
 * nread: amount of data left after k->str. will be modified if RTP
 *        data is parsed and k->str is moved up
 * readmore: whether or not the RTP parser needs more data right away
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
static unsigned int rtsp_conncheck(struct connectdata *check,
                                   unsigned int checks_to_perform);

/* this returns the socket to wait for in the DO and DOING state for the multi
   interface and then we're always _sending_ a request and thus we wait for
   the single socket to become writable only */
static int rtsp_getsock_do(struct connectdata *conn,
                           curl_socket_t *socks,
                           int numsocks)
{
  /* write mode */
  (void)numsocks; /* unused, we trust it to be at least 1 */
  socks[0] = conn->sock[FIRSTSOCKET];
  return GETSOCK_WRITESOCK(0);
}

static
CURLcode rtp_client_write(struct connectdata *conn, char *ptr, size_t len);








|
<


<







70
71
72
73
74
75
76
77

78
79

80
81
82
83
84
85
86
static unsigned int rtsp_conncheck(struct connectdata *check,
                                   unsigned int checks_to_perform);

/* this returns the socket to wait for in the DO and DOING state for the multi
   interface and then we're always _sending_ a request and thus we wait for
   the single socket to become writable only */
static int rtsp_getsock_do(struct connectdata *conn,
                           curl_socket_t *socks)

{
  /* write mode */

  socks[0] = conn->sock[FIRSTSOCKET];
  return GETSOCK_WRITESOCK(0);
}

static
CURLcode rtp_client_write(struct connectdata *conn, char *ptr, size_t len);

Changes to jni/curl/lib/security.c.
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
}

static CURLcode read_data(struct connectdata *conn,
                          curl_socket_t fd,
                          struct krb5buffer *buf)
{
  int len;
  void *tmp = NULL;
  CURLcode result;

  result = socket_read(fd, &len, sizeof(len));
  if(result)
    return result;

  if(len) {
    /* only realloc if there was a length */
    len = ntohl(len);
    tmp = Curl_saferealloc(buf->data, len);
  }
  if(tmp == NULL)
    return CURLE_OUT_OF_MEMORY;

  buf->data = tmp;
  result = socket_read(fd, buf->data, len);
  if(result)
    return result;
  buf->size = conn->mech->decode(conn->app_data, buf->data, len,
                                 conn->data_prot, conn);
  buf->index = 0;
  return CURLE_OK;







<









|

|


<







187
188
189
190
191
192
193

194
195
196
197
198
199
200
201
202
203
204
205
206
207

208
209
210
211
212
213
214
}

static CURLcode read_data(struct connectdata *conn,
                          curl_socket_t fd,
                          struct krb5buffer *buf)
{
  int len;

  CURLcode result;

  result = socket_read(fd, &len, sizeof(len));
  if(result)
    return result;

  if(len) {
    /* only realloc if there was a length */
    len = ntohl(len);
    buf->data = Curl_saferealloc(buf->data, len);
  }
  if(!len || !buf->data)
    return CURLE_OUT_OF_MEMORY;


  result = socket_read(fd, buf->data, len);
  if(result)
    return result;
  buf->size = conn->mech->decode(conn->app_data, buf->data, len,
                                 conn->data_prot, conn);
  buf->index = 0;
  return CURLE_OK;
Changes to jni/curl/lib/select.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_CURL_SELECT_H
#define HEADER_CURL_SELECT_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_CURL_SELECT_H
#define HEADER_CURL_SELECT_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#define CURL_CSELECT_IN2 (CURL_CSELECT_ERR << 1)

int Curl_socket_check(curl_socket_t readfd, curl_socket_t readfd2,
                      curl_socket_t writefd,
                      time_t timeout_ms);

#define SOCKET_READABLE(x,z) \
  Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, z)
#define SOCKET_WRITABLE(x,z) \
  Curl_socket_check(CURL_SOCKET_BAD, CURL_SOCKET_BAD, x, z)

int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms);

/* On non-DOS and non-Winsock platforms, when Curl_ack_eintr is set,
 * EINTR condition is honored and function might exit early without
 * awaiting full timeout.  Otherwise EINTR will be ignored and full
 * timeout will elapse. */







|

|







73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#define CURL_CSELECT_IN2 (CURL_CSELECT_ERR << 1)

int Curl_socket_check(curl_socket_t readfd, curl_socket_t readfd2,
                      curl_socket_t writefd,
                      time_t timeout_ms);

#define SOCKET_READABLE(x,z) \
  Curl_socket_check(x, CURL_SOCKET_BAD, CURL_SOCKET_BAD, (time_t)z)
#define SOCKET_WRITABLE(x,z) \
  Curl_socket_check(CURL_SOCKET_BAD, CURL_SOCKET_BAD, x, (time_t)z)

int Curl_poll(struct pollfd ufds[], unsigned int nfds, int timeout_ms);

/* On non-DOS and non-Winsock platforms, when Curl_ack_eintr is set,
 * EINTR condition is honored and function might exit early without
 * awaiting full timeout.  Otherwise EINTR will be ignored and full
 * timeout will elapse. */
Changes to jni/curl/lib/setopt.c.
805
806
807
808
809
810
811





812
813
814
815
816
817
818
    /*
     * This sets a requested HTTP version to be used. The value is one of
     * the listed enums in curl/curl.h.
     */
    arg = va_arg(param, long);
    if(arg < CURL_HTTP_VERSION_NONE)
      return CURLE_BAD_FUNCTION_ARGUMENT;





#ifndef USE_NGHTTP2
    if(arg >= CURL_HTTP_VERSION_2)
      return CURLE_UNSUPPORTED_PROTOCOL;
#else
    if(arg > CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE)
      return CURLE_UNSUPPORTED_PROTOCOL;
    if(arg == CURL_HTTP_VERSION_NONE)







>
>
>
>
>







805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
    /*
     * This sets a requested HTTP version to be used. The value is one of
     * the listed enums in curl/curl.h.
     */
    arg = va_arg(param, long);
    if(arg < CURL_HTTP_VERSION_NONE)
      return CURLE_BAD_FUNCTION_ARGUMENT;
#ifdef ENABLE_QUIC
    if(arg == CURL_HTTP_VERSION_3)
      ;
    else
#endif
#ifndef USE_NGHTTP2
    if(arg >= CURL_HTTP_VERSION_2)
      return CURLE_UNSUPPORTED_PROTOCOL;
#else
    if(arg > CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE)
      return CURLE_UNSUPPORTED_PROTOCOL;
    if(arg == CURL_HTTP_VERSION_NONE)
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
  case CURLOPT_SSL_VERIFYHOST:
    /*
     * Enable verification of the host name in the peer certificate
     */
    arg = va_arg(param, long);

    /* Obviously people are not reading documentation and too many thought
       this argument took a boolean when it wasn't and misused it. We thus ban
       1 as a sensible input and we warn about its use. Then we only have the
       2 action internally stored as TRUE. */

    if(1 == arg) {
      failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
      return CURLE_BAD_FUNCTION_ARGUMENT;
    }

    data->set.ssl.primary.verifyhost = (0 != arg) ? TRUE : FALSE;

    /* Update the current connection ssl_config. */
    if(data->conn) {
      data->conn->ssl_config.verifyhost =
        data->set.ssl.primary.verifyhost;
    }
    break;
#ifndef CURL_DISABLE_PROXY
  case CURLOPT_PROXY_SSL_VERIFYHOST:
    /*
     * Enable verification of the host name in the peer certificate for proxy
     */
    arg = va_arg(param, long);

    /* Obviously people are not reading documentation and too many thought
       this argument took a boolean when it wasn't and misused it. We thus ban
       1 as a sensible input and we warn about its use. Then we only have the
       2 action internally stored as TRUE. */

    if(1 == arg) {
      failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
      return CURLE_BAD_FUNCTION_ARGUMENT;
    }

    data->set.proxy_ssl.primary.verifyhost = (0 != arg)?TRUE:FALSE;

    /* Update the current connection proxy_ssl_config. */
    if(data->conn) {
      data->conn->proxy_ssl_config.verifyhost =
        data->set.proxy_ssl.primary.verifyhost;
    }
    break;







|
<
<
|
<
<
<
<
<
|














<
<
<
<
|
<
<
<
<
<
|







1779
1780
1781
1782
1783
1784
1785
1786


1787





1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802




1803





1804
1805
1806
1807
1808
1809
1810
1811
  case CURLOPT_SSL_VERIFYHOST:
    /*
     * Enable verification of the host name in the peer certificate
     */
    arg = va_arg(param, long);

    /* Obviously people are not reading documentation and too many thought
       this argument took a boolean when it wasn't and misused it.


       Treat 1 and 2 the same */





    data->set.ssl.primary.verifyhost = (bool)((arg & 3) ? TRUE : FALSE);

    /* Update the current connection ssl_config. */
    if(data->conn) {
      data->conn->ssl_config.verifyhost =
        data->set.ssl.primary.verifyhost;
    }
    break;
#ifndef CURL_DISABLE_PROXY
  case CURLOPT_PROXY_SSL_VERIFYHOST:
    /*
     * Enable verification of the host name in the peer certificate for proxy
     */
    arg = va_arg(param, long);





    /* Treat both 1 and 2 as TRUE */





    data->set.proxy_ssl.primary.verifyhost = (bool)((arg & 3)?TRUE:FALSE);

    /* Update the current connection proxy_ssl_config. */
    if(data->conn) {
      data->conn->proxy_ssl_config.verifyhost =
        data->set.proxy_ssl.primary.verifyhost;
    }
    break;
2397
2398
2399
2400
2401
2402
2403






2404
2405
2406
2407
2408
2409
2410
    break;

  case CURLOPT_MAIL_RCPT:
    /* Set the list of mail recipients */
    data->set.mail_rcpt = va_arg(param, struct curl_slist *);
    break;
#endif







  case CURLOPT_SASL_IR:
    /* Enable/disable SASL initial response */
    data->set.sasl_ir = (0 != va_arg(param, long)) ? TRUE : FALSE;
    break;
#ifndef CURL_DISABLE_RTSP
  case CURLOPT_RTSP_REQUEST:







>
>
>
>
>
>







2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
    break;

  case CURLOPT_MAIL_RCPT:
    /* Set the list of mail recipients */
    data->set.mail_rcpt = va_arg(param, struct curl_slist *);
    break;
#endif

  case CURLOPT_SASL_AUTHZID:
    /* Authorisation identity (identity to act as) */
    result = Curl_setstropt(&data->set.str[STRING_SASL_AUTHZID],
                            va_arg(param, char *));
    break;

  case CURLOPT_SASL_IR:
    /* Enable/disable SASL initial response */
    data->set.sasl_ir = (0 != va_arg(param, long)) ? TRUE : FALSE;
    break;
#ifndef CURL_DISABLE_RTSP
  case CURLOPT_RTSP_REQUEST:
Changes to jni/curl/lib/smb.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies
 * Copyright (C) 2016-2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is








|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies
 * Copyright (C) 2016-2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
static CURLcode smb_connect(struct connectdata *conn, bool *done);
static CURLcode smb_connection_state(struct connectdata *conn, bool *done);
static CURLcode smb_do(struct connectdata *conn, bool *done);
static CURLcode smb_request_state(struct connectdata *conn, bool *done);
static CURLcode smb_done(struct connectdata *conn, CURLcode status,
                         bool premature);
static CURLcode smb_disconnect(struct connectdata *conn, bool dead);
static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
                       int numsocks);
static CURLcode smb_parse_url_path(struct connectdata *conn);

/*
 * SMB handler interface
 */
const struct Curl_handler Curl_handler_smb = {
  "SMB",                                /* scheme */







|
<







60
61
62
63
64
65
66
67

68
69
70
71
72
73
74
static CURLcode smb_connect(struct connectdata *conn, bool *done);
static CURLcode smb_connection_state(struct connectdata *conn, bool *done);
static CURLcode smb_do(struct connectdata *conn, bool *done);
static CURLcode smb_request_state(struct connectdata *conn, bool *done);
static CURLcode smb_done(struct connectdata *conn, CURLcode status,
                         bool premature);
static CURLcode smb_disconnect(struct connectdata *conn, bool dead);
static int smb_getsock(struct connectdata *conn, curl_socket_t *socks);

static CURLcode smb_parse_url_path(struct connectdata *conn);

/*
 * SMB handler interface
 */
const struct Curl_handler Curl_handler_smb = {
  "SMB",                                /* scheme */
603
604
605
606
607
608
609

610
611
612
613
614
615
616
  return smb_send(conn, sizeof(*msg), (size_t) upload_size);
}

static CURLcode smb_send_and_recv(struct connectdata *conn, void **msg)
{
  struct smb_conn *smbc = &conn->proto.smbc;
  CURLcode result;


  /* Check if there is data in the transfer buffer */
  if(!smbc->send_size && smbc->upload_size) {
    size_t nread = smbc->upload_size > conn->data->set.upload_buffer_size ?
      conn->data->set.upload_buffer_size :
      smbc->upload_size;
    conn->data->req.upload_fromhere = conn->data->state.ulbuf;







>







602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
  return smb_send(conn, sizeof(*msg), (size_t) upload_size);
}

static CURLcode smb_send_and_recv(struct connectdata *conn, void **msg)
{
  struct smb_conn *smbc = &conn->proto.smbc;
  CURLcode result;
  *msg = NULL; /* if it returns early */

  /* Check if there is data in the transfer buffer */
  if(!smbc->send_size && smbc->upload_size) {
    size_t nread = smbc->upload_size > conn->data->set.upload_buffer_size ?
      conn->data->set.upload_buffer_size :
      smbc->upload_size;
    conn->data->req.upload_fromhere = conn->data->state.ulbuf;
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
  (void) dead;
  Curl_safefree(smbc->share);
  Curl_safefree(smbc->domain);
  Curl_safefree(smbc->recv_buf);
  return CURLE_OK;
}

static int smb_getsock(struct connectdata *conn, curl_socket_t *socks,
                       int numsocks)
{
  if(!numsocks)
    return GETSOCK_BLANK;

  socks[0] = conn->sock[FIRSTSOCKET];
  return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
}

static CURLcode smb_do(struct connectdata *conn, bool *done)
{
  struct smb_conn *smbc = &conn->proto.smbc;







|
<

<
<
<







932
933
934
935
936
937
938
939

940



941
942
943
944
945
946
947
  (void) dead;
  Curl_safefree(smbc->share);
  Curl_safefree(smbc->domain);
  Curl_safefree(smbc->recv_buf);
  return CURLE_OK;
}

static int smb_getsock(struct connectdata *conn, curl_socket_t *socks)

{



  socks[0] = conn->sock[FIRSTSOCKET];
  return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
}

static CURLcode smb_do(struct connectdata *conn, bool *done)
{
  struct smb_conn *smbc = &conn->proto.smbc;
Changes to jni/curl/lib/smtp.c.
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
static CURLcode smtp_regular_transfer(struct connectdata *conn, bool *done);
static CURLcode smtp_do(struct connectdata *conn, bool *done);
static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
                          bool premature);
static CURLcode smtp_connect(struct connectdata *conn, bool *done);
static CURLcode smtp_disconnect(struct connectdata *conn, bool dead);
static CURLcode smtp_multi_statemach(struct connectdata *conn, bool *done);
static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks,
                        int numsocks);
static CURLcode smtp_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode smtp_setup_connection(struct connectdata *conn);
static CURLcode smtp_parse_url_options(struct connectdata *conn);
static CURLcode smtp_parse_url_path(struct connectdata *conn);
static CURLcode smtp_parse_custom_request(struct connectdata *conn);
static CURLcode smtp_perform_auth(struct connectdata *conn, const char *mech,
                                  const char *initresp);







|
<







91
92
93
94
95
96
97
98

99
100
101
102
103
104
105
static CURLcode smtp_regular_transfer(struct connectdata *conn, bool *done);
static CURLcode smtp_do(struct connectdata *conn, bool *done);
static CURLcode smtp_done(struct connectdata *conn, CURLcode status,
                          bool premature);
static CURLcode smtp_connect(struct connectdata *conn, bool *done);
static CURLcode smtp_disconnect(struct connectdata *conn, bool dead);
static CURLcode smtp_multi_statemach(struct connectdata *conn, bool *done);
static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks);

static CURLcode smtp_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode smtp_setup_connection(struct connectdata *conn);
static CURLcode smtp_parse_url_options(struct connectdata *conn);
static CURLcode smtp_parse_url_path(struct connectdata *conn);
static CURLcode smtp_parse_custom_request(struct connectdata *conn);
static CURLcode smtp_perform_auth(struct connectdata *conn, const char *mech,
                                  const char *initresp);
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
    if(data->set.use_ssl <= CURLUSESSL_TRY || conn->ssl[FIRSTSOCKET].use)
      result = smtp_perform_helo(conn);
    else {
      failf(data, "Remote access denied: %d", smtpcode);
      result = CURLE_REMOTE_ACCESS_DENIED;
    }
  }
  else {
    line += 4;
    len -= 4;

    /* Does the server support the STARTTLS capability? */
    if(len >= 8 && !memcmp(line, "STARTTLS", 8))
      smtpc->tls_supported = TRUE;








|







710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
    if(data->set.use_ssl <= CURLUSESSL_TRY || conn->ssl[FIRSTSOCKET].use)
      result = smtp_perform_helo(conn);
    else {
      failf(data, "Remote access denied: %d", smtpcode);
      result = CURLE_REMOTE_ACCESS_DENIED;
    }
  }
  else if(len >= 4) {
    line += 4;
    len -= 4;

    /* Does the server support the STARTTLS capability? */
    if(len >= 8 && !memcmp(line, "STARTTLS", 8))
      smtpc->tls_supported = TRUE;

782
783
784
785
786
787
788




789
790
791
792
793
794
795
          result = CURLE_USE_SSL_FAILED;
        }
      }
      else
        result = smtp_perform_authentication(conn);
    }
  }





  return result;
}

/* For HELO responses */
static CURLcode smtp_state_helo_resp(struct connectdata *conn, int smtpcode,
                                     smtpstate instate)







>
>
>
>







781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
          result = CURLE_USE_SSL_FAILED;
        }
      }
      else
        result = smtp_perform_authentication(conn);
    }
  }
  else {
    failf(data, "Unexpectedly short EHLO response");
    result = CURLE_WEIRD_SERVER_REPLY;
  }

  return result;
}

/* For HELO responses */
static CURLcode smtp_state_helo_resp(struct connectdata *conn, int smtpcode,
                                     smtpstate instate)
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
  if(!smtp)
    result = CURLE_OUT_OF_MEMORY;

  return result;
}

/* For the SMTP "protocol connect" and "doing" phases only */
static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks,
                        int numsocks)
{
  return Curl_pp_getsock(&conn->proto.smtpc.pp, socks, numsocks);
}

/***********************************************************************
 *
 * smtp_connect()
 *
 * This function should do everything that is to be considered a part of







|
<

|







1113
1114
1115
1116
1117
1118
1119
1120

1121
1122
1123
1124
1125
1126
1127
1128
1129
  if(!smtp)
    result = CURLE_OUT_OF_MEMORY;

  return result;
}

/* For the SMTP "protocol connect" and "doing" phases only */
static int smtp_getsock(struct connectdata *conn, curl_socket_t *socks)

{
  return Curl_pp_getsock(&conn->proto.smtpc.pp, socks);
}

/***********************************************************************
 *
 * smtp_connect()
 *
 * This function should do everything that is to be considered a part of
Deleted jni/curl/lib/ssh-libssh.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 2017 - 2019 Red Hat, Inc.
 *
 * Authors: Nikos Mavrogiannopoulos, Tomas Mraz, Stanislav Zidek,
 *          Robert Kolcun, Andreas Schneider
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#ifdef USE_LIBSSH

#include <limits.h>

#include <libssh/libssh.h>
#include <libssh/sftp.h>

#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif

#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_UTSNAME_H
#include <sys/utsname.h>
#endif
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
#ifdef __VMS
#include <in.h>
#include <inet.h>
#endif

#if (defined(NETWARE) && defined(__NOVELL_LIBC__))
#undef in_addr_t
#define in_addr_t unsigned long
#endif

#include <curl/curl.h>
#include "urldata.h"
#include "sendf.h"
#include "hostip.h"
#include "progress.h"
#include "transfer.h"
#include "escape.h"
#include "http.h"               /* for HTTP proxy tunnel stuff */
#include "ssh.h"
#include "url.h"
#include "speedcheck.h"
#include "getinfo.h"
#include "strdup.h"
#include "strcase.h"
#include "vtls/vtls.h"
#include "connect.h"
#include "strerror.h"
#include "inet_ntop.h"
#include "parsedate.h"          /* for the week day and month names */
#include "sockaddr.h"           /* required for Curl_sockaddr_storage */
#include "strtoofft.h"
#include "multiif.h"
#include "select.h"
#include "warnless.h"

/* for permission and open flags */
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"
#include "curl_path.h"

/* A recent macro provided by libssh. Or make our own. */
#ifndef SSH_STRING_FREE_CHAR
/* !checksrc! disable ASSIGNWITHINCONDITION 1 */
#define SSH_STRING_FREE_CHAR(x) \
    do { if((x) != NULL) { ssh_string_free_char(x); x = NULL; } } while(0)
#endif

/* Local functions: */
static CURLcode myssh_connect(struct connectdata *conn, bool *done);
static CURLcode myssh_multi_statemach(struct connectdata *conn,
                                      bool *done);
static CURLcode myssh_do_it(struct connectdata *conn, bool *done);

static CURLcode scp_done(struct connectdata *conn,
                         CURLcode, bool premature);
static CURLcode scp_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode scp_disconnect(struct connectdata *conn,
                               bool dead_connection);

static CURLcode sftp_done(struct connectdata *conn,
                          CURLcode, bool premature);
static CURLcode sftp_doing(struct connectdata *conn,
                           bool *dophase_done);
static CURLcode sftp_disconnect(struct connectdata *conn, bool dead);
static
CURLcode sftp_perform(struct connectdata *conn,
                      bool *connected,
                      bool *dophase_done);

static void sftp_quote(struct connectdata *conn);
static void sftp_quote_stat(struct connectdata *conn);

static int myssh_getsock(struct connectdata *conn, curl_socket_t *sock,
                         int numsocks);

static int myssh_perform_getsock(const struct connectdata *conn,
                                 curl_socket_t *sock,
                                 int numsocks);

static CURLcode myssh_setup_connection(struct connectdata *conn);

/*
 * SCP protocol handler.
 */

const struct Curl_handler Curl_handler_scp = {
  "SCP",                        /* scheme */
  myssh_setup_connection,       /* setup_connection */
  myssh_do_it,                  /* do_it */
  scp_done,                     /* done */
  ZERO_NULL,                    /* do_more */
  myssh_connect,                /* connect_it */
  myssh_multi_statemach,        /* connecting */
  scp_doing,                    /* doing */
  myssh_getsock,                /* proto_getsock */
  myssh_getsock,                /* doing_getsock */
  ZERO_NULL,                    /* domore_getsock */
  myssh_perform_getsock,        /* perform_getsock */
  scp_disconnect,               /* disconnect */
  ZERO_NULL,                    /* readwrite */
  ZERO_NULL,                    /* connection_check */
  PORT_SSH,                     /* defport */
  CURLPROTO_SCP,                /* protocol */
  PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY    /* flags */
};

/*
 * SFTP protocol handler.
 */

const struct Curl_handler Curl_handler_sftp = {
  "SFTP",                               /* scheme */
  myssh_setup_connection,               /* setup_connection */
  myssh_do_it,                          /* do_it */
  sftp_done,                            /* done */
  ZERO_NULL,                            /* do_more */
  myssh_connect,                        /* connect_it */
  myssh_multi_statemach,                /* connecting */
  sftp_doing,                           /* doing */
  myssh_getsock,                        /* proto_getsock */
  myssh_getsock,                        /* doing_getsock */
  ZERO_NULL,                            /* domore_getsock */
  myssh_perform_getsock,                /* perform_getsock */
  sftp_disconnect,                      /* disconnect */
  ZERO_NULL,                            /* readwrite */
  ZERO_NULL,                            /* connection_check */
  PORT_SSH,                             /* defport */
  CURLPROTO_SFTP,                       /* protocol */
  PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
  | PROTOPT_NOURLQUERY                  /* flags */
};

static CURLcode sftp_error_to_CURLE(int err)
{
  switch(err) {
    case SSH_FX_OK:
      return CURLE_OK;

    case SSH_FX_NO_SUCH_FILE:
    case SSH_FX_NO_SUCH_PATH:
      return CURLE_REMOTE_FILE_NOT_FOUND;

    case SSH_FX_PERMISSION_DENIED:
    case SSH_FX_WRITE_PROTECT:
      return CURLE_REMOTE_ACCESS_DENIED;

    case SSH_FX_FILE_ALREADY_EXISTS:
      return CURLE_REMOTE_FILE_EXISTS;

    default:
      break;
  }

  return CURLE_SSH;
}

#ifndef DEBUGBUILD
#define state(x,y) mystate(x,y)
#else
#define state(x,y) mystate(x,y, __LINE__)
#endif

/*
 * SSH State machine related code
 */
/* This is the ONLY way to change SSH state! */
static void mystate(struct connectdata *conn, sshstate nowstate
#ifdef DEBUGBUILD
                    , int lineno
#endif
  )
{
  struct ssh_conn *sshc = &conn->proto.sshc;
#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
  /* for debug purposes */
  static const char *const names[] = {
    "SSH_STOP",
    "SSH_INIT",
    "SSH_S_STARTUP",
    "SSH_HOSTKEY",
    "SSH_AUTHLIST",
    "SSH_AUTH_PKEY_INIT",
    "SSH_AUTH_PKEY",
    "SSH_AUTH_PASS_INIT",
    "SSH_AUTH_PASS",
    "SSH_AUTH_AGENT_INIT",
    "SSH_AUTH_AGENT_LIST",
    "SSH_AUTH_AGENT",
    "SSH_AUTH_HOST_INIT",
    "SSH_AUTH_HOST",
    "SSH_AUTH_KEY_INIT",
    "SSH_AUTH_KEY",
    "SSH_AUTH_GSSAPI",
    "SSH_AUTH_DONE",
    "SSH_SFTP_INIT",
    "SSH_SFTP_REALPATH",
    "SSH_SFTP_QUOTE_INIT",
    "SSH_SFTP_POSTQUOTE_INIT",
    "SSH_SFTP_QUOTE",
    "SSH_SFTP_NEXT_QUOTE",
    "SSH_SFTP_QUOTE_STAT",
    "SSH_SFTP_QUOTE_SETSTAT",
    "SSH_SFTP_QUOTE_SYMLINK",
    "SSH_SFTP_QUOTE_MKDIR",
    "SSH_SFTP_QUOTE_RENAME",
    "SSH_SFTP_QUOTE_RMDIR",
    "SSH_SFTP_QUOTE_UNLINK",
    "SSH_SFTP_QUOTE_STATVFS",
    "SSH_SFTP_GETINFO",
    "SSH_SFTP_FILETIME",
    "SSH_SFTP_TRANS_INIT",
    "SSH_SFTP_UPLOAD_INIT",
    "SSH_SFTP_CREATE_DIRS_INIT",
    "SSH_SFTP_CREATE_DIRS",
    "SSH_SFTP_CREATE_DIRS_MKDIR",
    "SSH_SFTP_READDIR_INIT",
    "SSH_SFTP_READDIR",
    "SSH_SFTP_READDIR_LINK",
    "SSH_SFTP_READDIR_BOTTOM",
    "SSH_SFTP_READDIR_DONE",
    "SSH_SFTP_DOWNLOAD_INIT",
    "SSH_SFTP_DOWNLOAD_STAT",
    "SSH_SFTP_CLOSE",
    "SSH_SFTP_SHUTDOWN",
    "SSH_SCP_TRANS_INIT",
    "SSH_SCP_UPLOAD_INIT",
    "SSH_SCP_DOWNLOAD_INIT",
    "SSH_SCP_DOWNLOAD",
    "SSH_SCP_DONE",
    "SSH_SCP_SEND_EOF",
    "SSH_SCP_WAIT_EOF",
    "SSH_SCP_WAIT_CLOSE",
    "SSH_SCP_CHANNEL_FREE",
    "SSH_SESSION_DISCONNECT",
    "SSH_SESSION_FREE",
    "QUIT"
  };


  if(sshc->state != nowstate) {
    infof(conn->data, "SSH %p state change from %s to %s (line %d)\n",
          (void *) sshc, names[sshc->state], names[nowstate],
          lineno);
  }
#endif

  sshc->state = nowstate;
}

/* Multiple options:
 * 1. data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5] is set with an MD5
 *    hash (90s style auth, not sure we should have it here)
 * 2. data->set.ssh_keyfunc callback is set. Then we do trust on first
 *    use. We even save on knownhosts if CURLKHSTAT_FINE_ADD_TO_FILE
 *    is returned by it.
 * 3. none of the above. We only accept if it is present on known hosts.
 *
 * Returns SSH_OK or SSH_ERROR.
 */
static int myssh_is_known(struct connectdata *conn)
{
  int rc;
  struct Curl_easy *data = conn->data;
  struct ssh_conn *sshc = &conn->proto.sshc;
  ssh_key pubkey;
  size_t hlen;
  unsigned char *hash = NULL;
  char *base64 = NULL;
  int vstate;
  enum curl_khmatch keymatch;
  struct curl_khkey foundkey;
  curl_sshkeycallback func =
    data->set.ssh_keyfunc;

  rc = ssh_get_publickey(sshc->ssh_session, &pubkey);
  if(rc != SSH_OK)
    return rc;

  if(data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5]) {
    rc = ssh_get_publickey_hash(pubkey, SSH_PUBLICKEY_HASH_MD5,
                                &hash, &hlen);
    if(rc != SSH_OK)
      goto cleanup;

    if(hlen != strlen(data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5]) ||
       memcmp(&data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5], hash, hlen)) {
      rc = SSH_ERROR;
      goto cleanup;
    }

    rc = SSH_OK;
    goto cleanup;
  }

  if(data->set.ssl.primary.verifyhost != TRUE) {
    rc = SSH_OK;
    goto cleanup;
  }

  vstate = ssh_is_server_known(sshc->ssh_session);
  switch(vstate) {
    case SSH_SERVER_KNOWN_OK:
      keymatch = CURLKHMATCH_OK;
      break;
    case SSH_SERVER_FILE_NOT_FOUND:
      /* fallthrough */
    case SSH_SERVER_NOT_KNOWN:
      keymatch = CURLKHMATCH_MISSING;
      break;
  default:
      keymatch = CURLKHMATCH_MISMATCH;
      break;
  }

  if(func) { /* use callback to determine action */
    rc = ssh_pki_export_pubkey_base64(pubkey, &base64);
    if(rc != SSH_OK)
      goto cleanup;

    foundkey.key = base64;
    foundkey.len = strlen(base64);

    switch(ssh_key_type(pubkey)) {
      case SSH_KEYTYPE_RSA:
        foundkey.keytype = CURLKHTYPE_RSA;
        break;
      case SSH_KEYTYPE_RSA1:
        foundkey.keytype = CURLKHTYPE_RSA1;
        break;
      case SSH_KEYTYPE_ECDSA:
        foundkey.keytype = CURLKHTYPE_ECDSA;
        break;
#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,7,0)
      case SSH_KEYTYPE_ED25519:
        foundkey.keytype = CURLKHTYPE_ED25519;
        break;
#endif
      case SSH_KEYTYPE_DSS:
        foundkey.keytype = CURLKHTYPE_DSS;
        break;
      default:
        rc = SSH_ERROR;
        goto cleanup;
    }

    /* we don't have anything equivalent to knownkey. Always NULL */
    Curl_set_in_callback(data, true);
    rc = func(data, NULL, &foundkey, /* from the remote host */
              keymatch, data->set.ssh_keyfunc_userp);
    Curl_set_in_callback(data, false);

    switch(rc) {
      case CURLKHSTAT_FINE_ADD_TO_FILE:
        rc = ssh_write_knownhost(sshc->ssh_session);
        if(rc != SSH_OK) {
          goto cleanup;
        }
        break;
      case CURLKHSTAT_FINE:
        break;
      default: /* REJECT/DEFER */
        rc = SSH_ERROR;
        goto cleanup;
    }
  }
  else {
    if(keymatch != CURLKHMATCH_OK) {
      rc = SSH_ERROR;
      goto cleanup;
    }
  }
  rc = SSH_OK;

cleanup:
  if(hash)
    ssh_clean_pubkey_hash(&hash);
  ssh_key_free(pubkey);
  return rc;
}

#define MOVE_TO_ERROR_STATE(_r) { \
  state(conn, SSH_SESSION_DISCONNECT); \
  sshc->actualcode = _r; \
  rc = SSH_ERROR; \
  break; \
}

#define MOVE_TO_SFTP_CLOSE_STATE() { \
  state(conn, SSH_SFTP_CLOSE); \
  sshc->actualcode = sftp_error_to_CURLE(sftp_get_error(sshc->sftp_session)); \
  rc = SSH_ERROR; \
  break; \
}

#define MOVE_TO_LAST_AUTH \
  if(sshc->auth_methods & SSH_AUTH_METHOD_PASSWORD) { \
    rc = SSH_OK; \
    state(conn, SSH_AUTH_PASS_INIT); \
    break; \
  } \
  else { \
    MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED); \
  }

#define MOVE_TO_TERTIARY_AUTH \
  if(sshc->auth_methods & SSH_AUTH_METHOD_INTERACTIVE) { \
    rc = SSH_OK; \
    state(conn, SSH_AUTH_KEY_INIT); \
    break; \
  } \
  else { \
    MOVE_TO_LAST_AUTH; \
  }

#define MOVE_TO_SECONDARY_AUTH \
  if(sshc->auth_methods & SSH_AUTH_METHOD_GSSAPI_MIC) { \
    rc = SSH_OK; \
    state(conn, SSH_AUTH_GSSAPI); \
    break; \
  } \
  else { \
    MOVE_TO_TERTIARY_AUTH; \
  }

static
int myssh_auth_interactive(struct connectdata *conn)
{
  int rc;
  struct ssh_conn *sshc = &conn->proto.sshc;
  int nprompts;

restart:
  switch(sshc->kbd_state) {
    case 0:
      rc = ssh_userauth_kbdint(sshc->ssh_session, NULL, NULL);
      if(rc == SSH_AUTH_AGAIN)
        return SSH_AGAIN;

      if(rc != SSH_AUTH_INFO)
        return SSH_ERROR;

      nprompts = ssh_userauth_kbdint_getnprompts(sshc->ssh_session);
      if(nprompts == SSH_ERROR || nprompts != 1)
        return SSH_ERROR;

      rc = ssh_userauth_kbdint_setanswer(sshc->ssh_session, 0, conn->passwd);
      if(rc < 0)
        return SSH_ERROR;

    /* FALLTHROUGH */
    case 1:
      sshc->kbd_state = 1;

      rc = ssh_userauth_kbdint(sshc->ssh_session, NULL, NULL);
      if(rc == SSH_AUTH_AGAIN)
        return SSH_AGAIN;
      else if(rc == SSH_AUTH_SUCCESS)
        rc = SSH_OK;
      else if(rc == SSH_AUTH_INFO) {
        nprompts = ssh_userauth_kbdint_getnprompts(sshc->ssh_session);
        if(nprompts != 0)
          return SSH_ERROR;

        sshc->kbd_state = 2;
        goto restart;
      }
      else
        rc = SSH_ERROR;
      break;
    case 2:
      sshc->kbd_state = 2;

      rc = ssh_userauth_kbdint(sshc->ssh_session, NULL, NULL);
      if(rc == SSH_AUTH_AGAIN)
        return SSH_AGAIN;
      else if(rc == SSH_AUTH_SUCCESS)
        rc = SSH_OK;
      else
        rc = SSH_ERROR;

      break;
    default:
      return SSH_ERROR;
  }

  sshc->kbd_state = 0;
  return rc;
}

/*
 * ssh_statemach_act() runs the SSH state machine as far as it can without
 * blocking and without reaching the end.  The data the pointer 'block' points
 * to will be set to TRUE if the libssh function returns SSH_AGAIN
 * meaning it wants to be called again when the socket is ready
 */
static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
{
  CURLcode result = CURLE_OK;
  struct Curl_easy *data = conn->data;
  struct SSHPROTO *protop = data->req.protop;
  struct ssh_conn *sshc = &conn->proto.sshc;
  curl_socket_t sock = conn->sock[FIRSTSOCKET];
  int rc = SSH_NO_ERROR, err;
  char *new_readdir_line;
  int seekerr = CURL_SEEKFUNC_OK;
  const char *err_msg;
  *block = 0;                   /* we're not blocking by default */

  do {

    switch(sshc->state) {
    case SSH_INIT:
      sshc->secondCreateDirs = 0;
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = CURLE_OK;

#if 0
      ssh_set_log_level(SSH_LOG_PROTOCOL);
#endif

      /* Set libssh to non-blocking, since everything internally is
         non-blocking */
      ssh_set_blocking(sshc->ssh_session, 0);

      state(conn, SSH_S_STARTUP);
      /* FALLTHROUGH */

    case SSH_S_STARTUP:
      rc = ssh_connect(sshc->ssh_session);
      if(rc == SSH_AGAIN)
        break;

      if(rc != SSH_OK) {
        failf(data, "Failure establishing ssh session");
        MOVE_TO_ERROR_STATE(CURLE_FAILED_INIT);
      }

      state(conn, SSH_HOSTKEY);

      /* FALLTHROUGH */
    case SSH_HOSTKEY:

      rc = myssh_is_known(conn);
      if(rc != SSH_OK) {
        MOVE_TO_ERROR_STATE(CURLE_PEER_FAILED_VERIFICATION);
      }

      state(conn, SSH_AUTHLIST);
      /* FALLTHROUGH */
    case SSH_AUTHLIST:{
        sshc->authed = FALSE;

        rc = ssh_userauth_none(sshc->ssh_session, NULL);
        if(rc == SSH_AUTH_AGAIN) {
          rc = SSH_AGAIN;
          break;
        }

        if(rc == SSH_AUTH_SUCCESS) {
          sshc->authed = TRUE;
          infof(data, "Authenticated with none\n");
          state(conn, SSH_AUTH_DONE);
          break;
        }
        else if(rc == SSH_AUTH_ERROR) {
          MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
        }

        sshc->auth_methods = ssh_userauth_list(sshc->ssh_session, NULL);
        if(sshc->auth_methods & SSH_AUTH_METHOD_PUBLICKEY) {
          state(conn, SSH_AUTH_PKEY_INIT);
          infof(data, "Authentication using SSH public key file\n");
        }
        else if(sshc->auth_methods & SSH_AUTH_METHOD_GSSAPI_MIC) {
          state(conn, SSH_AUTH_GSSAPI);
        }
        else if(sshc->auth_methods & SSH_AUTH_METHOD_INTERACTIVE) {
          state(conn, SSH_AUTH_KEY_INIT);
        }
        else if(sshc->auth_methods & SSH_AUTH_METHOD_PASSWORD) {
          state(conn, SSH_AUTH_PASS_INIT);
        }
        else {                  /* unsupported authentication method */
          MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
        }

        break;
      }
    case SSH_AUTH_PKEY_INIT:
      if(!(data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY)) {
        MOVE_TO_SECONDARY_AUTH;
      }

      /* Two choices, (1) private key was given on CMD,
       * (2) use the "default" keys. */
      if(data->set.str[STRING_SSH_PRIVATE_KEY]) {
        if(sshc->pubkey && !data->set.ssl.key_passwd) {
          rc = ssh_userauth_try_publickey(sshc->ssh_session, NULL,
                                          sshc->pubkey);
          if(rc == SSH_AUTH_AGAIN) {
            rc = SSH_AGAIN;
            break;
          }

          if(rc != SSH_OK) {
            MOVE_TO_SECONDARY_AUTH;
          }
        }

        rc = ssh_pki_import_privkey_file(data->
                                         set.str[STRING_SSH_PRIVATE_KEY],
                                         data->set.ssl.key_passwd, NULL,
                                         NULL, &sshc->privkey);
        if(rc != SSH_OK) {
          failf(data, "Could not load private key file %s",
                data->set.str[STRING_SSH_PRIVATE_KEY]);
          MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
          break;
        }

        state(conn, SSH_AUTH_PKEY);
        break;

      }
      else {
        rc = ssh_userauth_publickey_auto(sshc->ssh_session, NULL,
                                         data->set.ssl.key_passwd);
        if(rc == SSH_AUTH_AGAIN) {
          rc = SSH_AGAIN;
          break;
        }
        if(rc == SSH_AUTH_SUCCESS) {
          rc = SSH_OK;
          sshc->authed = TRUE;
          infof(data, "Completed public key authentication\n");
          state(conn, SSH_AUTH_DONE);
          break;
        }

        MOVE_TO_SECONDARY_AUTH;
      }
      break;
    case SSH_AUTH_PKEY:
      rc = ssh_userauth_publickey(sshc->ssh_session, NULL, sshc->privkey);
      if(rc == SSH_AUTH_AGAIN) {
        rc = SSH_AGAIN;
        break;
      }

      if(rc == SSH_AUTH_SUCCESS) {
        sshc->authed = TRUE;
        infof(data, "Completed public key authentication\n");
        state(conn, SSH_AUTH_DONE);
        break;
      }
      else {
        infof(data, "Failed public key authentication (rc: %d)\n", rc);
        MOVE_TO_SECONDARY_AUTH;
      }
      break;

    case SSH_AUTH_GSSAPI:
      if(!(data->set.ssh_auth_types & CURLSSH_AUTH_GSSAPI)) {
        MOVE_TO_TERTIARY_AUTH;
      }

      rc = ssh_userauth_gssapi(sshc->ssh_session);
      if(rc == SSH_AUTH_AGAIN) {
        rc = SSH_AGAIN;
        break;
      }

      if(rc == SSH_AUTH_SUCCESS) {
        rc = SSH_OK;
        sshc->authed = TRUE;
        infof(data, "Completed gssapi authentication\n");
        state(conn, SSH_AUTH_DONE);
        break;
      }

      MOVE_TO_TERTIARY_AUTH;
      break;

    case SSH_AUTH_KEY_INIT:
      if(data->set.ssh_auth_types & CURLSSH_AUTH_KEYBOARD) {
        state(conn, SSH_AUTH_KEY);
      }
      else {
        MOVE_TO_LAST_AUTH;
      }
      break;

    case SSH_AUTH_KEY:

      /* Authentication failed. Continue with keyboard-interactive now. */
      rc = myssh_auth_interactive(conn);
      if(rc == SSH_AGAIN) {
        break;
      }
      if(rc == SSH_OK) {
        sshc->authed = TRUE;
        infof(data, "completed keyboard interactive authentication\n");
      }
      state(conn, SSH_AUTH_DONE);
      break;

    case SSH_AUTH_PASS_INIT:
      if(!(data->set.ssh_auth_types & CURLSSH_AUTH_PASSWORD)) {
        /* Host key authentication is intentionally not implemented */
        MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
      }
      state(conn, SSH_AUTH_PASS);
      /* FALLTHROUGH */

    case SSH_AUTH_PASS:
      rc = ssh_userauth_password(sshc->ssh_session, NULL, conn->passwd);
      if(rc == SSH_AUTH_AGAIN) {
        rc = SSH_AGAIN;
        break;
      }

      if(rc == SSH_AUTH_SUCCESS) {
        sshc->authed = TRUE;
        infof(data, "Completed password authentication\n");
        state(conn, SSH_AUTH_DONE);
      }
      else {
        MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
      }
      break;

    case SSH_AUTH_DONE:
      if(!sshc->authed) {
        failf(data, "Authentication failure");
        MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
        break;
      }

      /*
       * At this point we have an authenticated ssh session.
       */
      infof(data, "Authentication complete\n");

      Curl_pgrsTime(conn->data, TIMER_APPCONNECT);      /* SSH is connected */

      conn->sockfd = sock;
      conn->writesockfd = CURL_SOCKET_BAD;

      if(conn->handler->protocol == CURLPROTO_SFTP) {
        state(conn, SSH_SFTP_INIT);
        break;
      }
      infof(data, "SSH CONNECT phase done\n");
      state(conn, SSH_STOP);
      break;

    case SSH_SFTP_INIT:
      ssh_set_blocking(sshc->ssh_session, 1);

      sshc->sftp_session = sftp_new(sshc->ssh_session);
      if(!sshc->sftp_session) {
        failf(data, "Failure initializing sftp session: %s",
              ssh_get_error(sshc->ssh_session));
        MOVE_TO_ERROR_STATE(CURLE_COULDNT_CONNECT);
        break;
      }

      rc = sftp_init(sshc->sftp_session);
      if(rc != SSH_OK) {
        rc = sftp_get_error(sshc->sftp_session);
        failf(data, "Failure initializing sftp session: %s",
              ssh_get_error(sshc->ssh_session));
        MOVE_TO_ERROR_STATE(sftp_error_to_CURLE(rc));
        break;
      }
      state(conn, SSH_SFTP_REALPATH);
      /* FALLTHROUGH */
    case SSH_SFTP_REALPATH:
      /*
       * Get the "home" directory
       */
      sshc->homedir = sftp_canonicalize_path(sshc->sftp_session, ".");
      if(sshc->homedir == NULL) {
        MOVE_TO_ERROR_STATE(CURLE_COULDNT_CONNECT);
      }
      conn->data->state.most_recent_ftp_entrypath = sshc->homedir;

      /* This is the last step in the SFTP connect phase. Do note that while
         we get the homedir here, we get the "workingpath" in the DO action
         since the homedir will remain the same between request but the
         working path will not. */
      DEBUGF(infof(data, "SSH CONNECT phase done\n"));
      state(conn, SSH_STOP);
      break;

    case SSH_SFTP_QUOTE_INIT:

      result = Curl_getworkingpath(conn, sshc->homedir, &protop->path);
      if(result) {
        sshc->actualcode = result;
        state(conn, SSH_STOP);
        break;
      }

      if(data->set.quote) {
        infof(data, "Sending quote commands\n");
        sshc->quote_item = data->set.quote;
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        state(conn, SSH_SFTP_GETINFO);
      }
      break;

    case SSH_SFTP_POSTQUOTE_INIT:
      if(data->set.postquote) {
        infof(data, "Sending quote commands\n");
        sshc->quote_item = data->set.postquote;
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        state(conn, SSH_STOP);
      }
      break;

    case SSH_SFTP_QUOTE:
      /* Send any quote commands */
      sftp_quote(conn);
      break;

    case SSH_SFTP_NEXT_QUOTE:
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);

      sshc->quote_item = sshc->quote_item->next;

      if(sshc->quote_item) {
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        if(sshc->nextstate != SSH_NO_STATE) {
          state(conn, sshc->nextstate);
          sshc->nextstate = SSH_NO_STATE;
        }
        else {
          state(conn, SSH_SFTP_GETINFO);
        }
      }
      break;

    case SSH_SFTP_QUOTE_STAT:
      sftp_quote_stat(conn);
      break;

    case SSH_SFTP_QUOTE_SETSTAT:
      rc = sftp_setstat(sshc->sftp_session, sshc->quote_path2,
                        sshc->quote_attrs);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "Attempt to set SFTP stats failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        /* sshc->actualcode = sftp_error_to_CURLE(err);
         * we do not send the actual error; we return
         * the error the libssh2 backend is returning */
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_SYMLINK:
      rc = sftp_symlink(sshc->sftp_session, sshc->quote_path2,
                        sshc->quote_path1);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "symlink command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_MKDIR:
      rc = sftp_mkdir(sshc->sftp_session, sshc->quote_path1,
                      (mode_t)data->set.new_directory_perms);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        failf(data, "mkdir command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_RENAME:
      rc = sftp_rename(sshc->sftp_session, sshc->quote_path1,
                       sshc->quote_path2);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "rename command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_RMDIR:
      rc = sftp_rmdir(sshc->sftp_session, sshc->quote_path1);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        failf(data, "rmdir command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_UNLINK:
      rc = sftp_unlink(sshc->sftp_session, sshc->quote_path1);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        failf(data, "rm command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_STATVFS:
    {
      sftp_statvfs_t statvfs;

      statvfs = sftp_statvfs(sshc->sftp_session, sshc->quote_path1);
      if(!statvfs && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        failf(data, "statvfs command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      else if(statvfs) {
        char *tmp = aprintf("statvfs:\n"
                            "f_bsize: %llu\n" "f_frsize: %llu\n"
                            "f_blocks: %llu\n" "f_bfree: %llu\n"
                            "f_bavail: %llu\n" "f_files: %llu\n"
                            "f_ffree: %llu\n" "f_favail: %llu\n"
                            "f_fsid: %llu\n" "f_flag: %llu\n"
                            "f_namemax: %llu\n",
                            statvfs->f_bsize, statvfs->f_frsize,
                            statvfs->f_blocks, statvfs->f_bfree,
                            statvfs->f_bavail, statvfs->f_files,
                            statvfs->f_ffree, statvfs->f_favail,
                            statvfs->f_fsid, statvfs->f_flag,
                            statvfs->f_namemax);
        sftp_statvfs_free(statvfs);

        if(!tmp) {
          result = CURLE_OUT_OF_MEMORY;
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          break;
        }

        result = Curl_client_write(conn, CLIENTWRITE_HEADER, tmp, strlen(tmp));
        free(tmp);
        if(result) {
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = result;
        }
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;
    }

    case SSH_SFTP_GETINFO:
      if(data->set.get_filetime) {
        state(conn, SSH_SFTP_FILETIME);
      }
      else {
        state(conn, SSH_SFTP_TRANS_INIT);
      }
      break;

    case SSH_SFTP_FILETIME:
    {
      sftp_attributes attrs;

      attrs = sftp_stat(sshc->sftp_session, protop->path);
      if(attrs != 0) {
        data->info.filetime = attrs->mtime;
        sftp_attributes_free(attrs);
      }

      state(conn, SSH_SFTP_TRANS_INIT);
      break;
    }

    case SSH_SFTP_TRANS_INIT:
      if(data->set.upload)
        state(conn, SSH_SFTP_UPLOAD_INIT);
      else {
        if(protop->path[strlen(protop->path)-1] == '/')
          state(conn, SSH_SFTP_READDIR_INIT);
        else
          state(conn, SSH_SFTP_DOWNLOAD_INIT);
      }
      break;

    case SSH_SFTP_UPLOAD_INIT:
    {
      int flags;

      if(data->state.resume_from != 0) {
        sftp_attributes attrs;

        if(data->state.resume_from < 0) {
          attrs = sftp_stat(sshc->sftp_session, protop->path);
          if(attrs != 0) {
            curl_off_t size = attrs->size;
            if(size < 0) {
              failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
              MOVE_TO_ERROR_STATE(CURLE_BAD_DOWNLOAD_RESUME);
            }
            data->state.resume_from = attrs->size;

            sftp_attributes_free(attrs);
          }
          else {
            data->state.resume_from = 0;
          }
        }
      }

      if(data->set.ftp_append)
        /* Try to open for append, but create if nonexisting */
        flags = O_WRONLY|O_CREAT|O_APPEND;
      else if(data->state.resume_from > 0)
        /* If we have restart position then open for append */
        flags = O_WRONLY|O_APPEND;
      else
        /* Clear file before writing (normal behaviour) */
        flags = O_WRONLY|O_APPEND|O_CREAT|O_TRUNC;

      if(sshc->sftp_file)
        sftp_close(sshc->sftp_file);
      sshc->sftp_file =
        sftp_open(sshc->sftp_session, protop->path,
                  flags, (mode_t)data->set.new_file_perms);
      if(!sshc->sftp_file) {
        err = sftp_get_error(sshc->sftp_session);

        if(((err == SSH_FX_NO_SUCH_FILE || err == SSH_FX_FAILURE ||
             err == SSH_FX_NO_SUCH_PATH)) &&
             (data->set.ftp_create_missing_dirs &&
             (strlen(protop->path) > 1))) {
               /* try to create the path remotely */
               rc = 0;
               sshc->secondCreateDirs = 1;
               state(conn, SSH_SFTP_CREATE_DIRS_INIT);
               break;
        }
        else {
          MOVE_TO_SFTP_CLOSE_STATE();
        }
      }

      /* If we have a restart point then we need to seek to the correct
         position. */
      if(data->state.resume_from > 0) {
        /* Let's read off the proper amount of bytes from the input. */
        if(conn->seek_func) {
          Curl_set_in_callback(data, true);
          seekerr = conn->seek_func(conn->seek_client, data->state.resume_from,
                                    SEEK_SET);
          Curl_set_in_callback(data, false);
        }

        if(seekerr != CURL_SEEKFUNC_OK) {
          curl_off_t passed = 0;

          if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
            failf(data, "Could not seek stream");
            return CURLE_FTP_COULDNT_USE_REST;
          }
          /* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
          do {
            size_t readthisamountnow =
              (data->state.resume_from - passed > data->set.buffer_size) ?
              (size_t)data->set.buffer_size :
              curlx_sotouz(data->state.resume_from - passed);

            size_t actuallyread =
              data->state.fread_func(data->state.buffer, 1,
                                     readthisamountnow, data->state.in);

            passed += actuallyread;
            if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
              /* this checks for greater-than only to make sure that the
                 CURL_READFUNC_ABORT return code still aborts */
              failf(data, "Failed to read data");
              MOVE_TO_ERROR_STATE(CURLE_FTP_COULDNT_USE_REST);
            }
          } while(passed < data->state.resume_from);
        }

        /* now, decrease the size of the read */
        if(data->state.infilesize > 0) {
          data->state.infilesize -= data->state.resume_from;
          data->req.size = data->state.infilesize;
          Curl_pgrsSetUploadSize(data, data->state.infilesize);
        }

        rc = sftp_seek64(sshc->sftp_file, data->state.resume_from);
        if(rc != 0) {
          MOVE_TO_SFTP_CLOSE_STATE();
        }
      }
      if(data->state.infilesize > 0) {
        data->req.size = data->state.infilesize;
        Curl_pgrsSetUploadSize(data, data->state.infilesize);
      }
      /* upload data */
      Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);

      /* not set by Curl_setup_transfer to preserve keepon bits */
      conn->sockfd = conn->writesockfd;

      /* store this original bitmask setup to use later on if we can't
         figure out a "real" bitmask */
      sshc->orig_waitfor = data->req.keepon;

      /* we want to use the _sending_ function even when the socket turns
         out readable as the underlying libssh sftp send function will deal
         with both accordingly */
      conn->cselect_bits = CURL_CSELECT_OUT;

      /* since we don't really wait for anything at this point, we want the
         state machine to move on as soon as possible so we set a very short
         timeout here */
      Curl_expire(data, 0, EXPIRE_RUN_NOW);

      state(conn, SSH_STOP);
      break;
    }

    case SSH_SFTP_CREATE_DIRS_INIT:
      if(strlen(protop->path) > 1) {
        sshc->slash_pos = protop->path + 1; /* ignore the leading '/' */
        state(conn, SSH_SFTP_CREATE_DIRS);
      }
      else {
        state(conn, SSH_SFTP_UPLOAD_INIT);
      }
      break;

    case SSH_SFTP_CREATE_DIRS:
      sshc->slash_pos = strchr(sshc->slash_pos, '/');
      if(sshc->slash_pos) {
        *sshc->slash_pos = 0;

        infof(data, "Creating directory '%s'\n", protop->path);
        state(conn, SSH_SFTP_CREATE_DIRS_MKDIR);
        break;
      }
      state(conn, SSH_SFTP_UPLOAD_INIT);
      break;

    case SSH_SFTP_CREATE_DIRS_MKDIR:
      /* 'mode' - parameter is preliminary - default to 0644 */
      rc = sftp_mkdir(sshc->sftp_session, protop->path,
                      (mode_t)data->set.new_directory_perms);
      *sshc->slash_pos = '/';
      ++sshc->slash_pos;
      if(rc < 0) {
        /*
         * Abort if failure wasn't that the dir already exists or the
         * permission was denied (creation might succeed further down the
         * path) - retry on unspecific FAILURE also
         */
        err = sftp_get_error(sshc->sftp_session);
        if((err != SSH_FX_FILE_ALREADY_EXISTS) &&
           (err != SSH_FX_FAILURE) &&
           (err != SSH_FX_PERMISSION_DENIED)) {
          MOVE_TO_SFTP_CLOSE_STATE();
        }
        rc = 0; /* clear rc and continue */
      }
      state(conn, SSH_SFTP_CREATE_DIRS);
      break;

    case SSH_SFTP_READDIR_INIT:
      Curl_pgrsSetDownloadSize(data, -1);
      if(data->set.opt_no_body) {
        state(conn, SSH_STOP);
        break;
      }

      /*
       * This is a directory that we are trying to get, so produce a directory
       * listing
       */
      sshc->sftp_dir = sftp_opendir(sshc->sftp_session,
                                    protop->path);
      if(!sshc->sftp_dir) {
        failf(data, "Could not open directory for reading: %s",
              ssh_get_error(sshc->ssh_session));
        MOVE_TO_SFTP_CLOSE_STATE();
      }
      state(conn, SSH_SFTP_READDIR);
      break;

    case SSH_SFTP_READDIR:

      if(sshc->readdir_attrs)
        sftp_attributes_free(sshc->readdir_attrs);

      sshc->readdir_attrs = sftp_readdir(sshc->sftp_session, sshc->sftp_dir);
      if(sshc->readdir_attrs) {
        sshc->readdir_filename = sshc->readdir_attrs->name;
        sshc->readdir_longentry = sshc->readdir_attrs->longname;
        sshc->readdir_len = strlen(sshc->readdir_filename);

        if(data->set.ftp_list_only) {
          char *tmpLine;

          tmpLine = aprintf("%s\n", sshc->readdir_filename);
          if(tmpLine == NULL) {
            state(conn, SSH_SFTP_CLOSE);
            sshc->actualcode = CURLE_OUT_OF_MEMORY;
            break;
          }
          result = Curl_client_write(conn, CLIENTWRITE_BODY,
                                     tmpLine, sshc->readdir_len + 1);
          free(tmpLine);

          if(result) {
            state(conn, SSH_STOP);
            break;
          }
          /* since this counts what we send to the client, we include the
             newline in this counter */
          data->req.bytecount += sshc->readdir_len + 1;

          /* output debug output if that is requested */
          if(data->set.verbose) {
            Curl_debug(data, CURLINFO_DATA_OUT,
                       (char *)sshc->readdir_filename,
                       sshc->readdir_len);
          }
        }
        else {
          sshc->readdir_currLen = strlen(sshc->readdir_longentry);
          sshc->readdir_totalLen = 80 + sshc->readdir_currLen;
          sshc->readdir_line = calloc(sshc->readdir_totalLen, 1);
          if(!sshc->readdir_line) {
            state(conn, SSH_SFTP_CLOSE);
            sshc->actualcode = CURLE_OUT_OF_MEMORY;
            break;
          }

          memcpy(sshc->readdir_line, sshc->readdir_longentry,
                 sshc->readdir_currLen);
          if((sshc->readdir_attrs->flags & SSH_FILEXFER_ATTR_PERMISSIONS) &&
             ((sshc->readdir_attrs->permissions & S_IFMT) ==
              S_IFLNK)) {
            sshc->readdir_linkPath = malloc(PATH_MAX + 1);
            if(sshc->readdir_linkPath == NULL) {
              state(conn, SSH_SFTP_CLOSE);
              sshc->actualcode = CURLE_OUT_OF_MEMORY;
              break;
            }

            msnprintf(sshc->readdir_linkPath, PATH_MAX, "%s%s", protop->path,
                      sshc->readdir_filename);

            state(conn, SSH_SFTP_READDIR_LINK);
            break;
          }
          state(conn, SSH_SFTP_READDIR_BOTTOM);
          break;
        }
      }
      else if(sshc->readdir_attrs == NULL && sftp_dir_eof(sshc->sftp_dir)) {
        state(conn, SSH_SFTP_READDIR_DONE);
        break;
      }
      else {
        failf(data, "Could not open remote file for reading: %s",
              ssh_get_error(sshc->ssh_session));
        MOVE_TO_SFTP_CLOSE_STATE();
        break;
      }
      break;

    case SSH_SFTP_READDIR_LINK:
      if(sshc->readdir_link_attrs)
        sftp_attributes_free(sshc->readdir_link_attrs);

      sshc->readdir_link_attrs = sftp_lstat(sshc->sftp_session,
                                            sshc->readdir_linkPath);
      if(sshc->readdir_link_attrs == 0) {
        failf(data, "Could not read symlink for reading: %s",
              ssh_get_error(sshc->ssh_session));
        MOVE_TO_SFTP_CLOSE_STATE();
      }

      if(sshc->readdir_link_attrs->name == NULL) {
        sshc->readdir_tmp = sftp_readlink(sshc->sftp_session,
                                          sshc->readdir_linkPath);
        if(sshc->readdir_filename == NULL)
          sshc->readdir_len = 0;
        else
          sshc->readdir_len = strlen(sshc->readdir_tmp);
        sshc->readdir_longentry = NULL;
        sshc->readdir_filename = sshc->readdir_tmp;
      }
      else {
        sshc->readdir_len = strlen(sshc->readdir_link_attrs->name);
        sshc->readdir_filename = sshc->readdir_link_attrs->name;
        sshc->readdir_longentry = sshc->readdir_link_attrs->longname;
      }

      Curl_safefree(sshc->readdir_linkPath);

      /* get room for the filename and extra output */
      sshc->readdir_totalLen += 4 + sshc->readdir_len;
      new_readdir_line = Curl_saferealloc(sshc->readdir_line,
                                          sshc->readdir_totalLen);
      if(!new_readdir_line) {
        sshc->readdir_line = NULL;
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = CURLE_OUT_OF_MEMORY;
        break;
      }
      sshc->readdir_line = new_readdir_line;

      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
                                         sshc->readdir_currLen,
                                         sshc->readdir_totalLen -
                                         sshc->readdir_currLen,
                                         " -> %s",
                                         sshc->readdir_filename);

      sftp_attributes_free(sshc->readdir_link_attrs);
      sshc->readdir_link_attrs = NULL;
      sshc->readdir_filename = NULL;
      sshc->readdir_longentry = NULL;

      state(conn, SSH_SFTP_READDIR_BOTTOM);
      /* FALLTHROUGH */
    case SSH_SFTP_READDIR_BOTTOM:
      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
                                         sshc->readdir_currLen,
                                         sshc->readdir_totalLen -
                                         sshc->readdir_currLen, "\n");
      result = Curl_client_write(conn, CLIENTWRITE_BODY,
                                 sshc->readdir_line,
                                 sshc->readdir_currLen);

      if(!result) {

        /* output debug output if that is requested */
        if(data->set.verbose) {
          Curl_debug(data, CURLINFO_DATA_OUT, sshc->readdir_line,
                     sshc->readdir_currLen);
        }
        data->req.bytecount += sshc->readdir_currLen;
      }
      Curl_safefree(sshc->readdir_line);
      ssh_string_free_char(sshc->readdir_tmp);
      sshc->readdir_tmp = NULL;

      if(result) {
        state(conn, SSH_STOP);
      }
      else
        state(conn, SSH_SFTP_READDIR);
      break;

    case SSH_SFTP_READDIR_DONE:
      sftp_closedir(sshc->sftp_dir);
      sshc->sftp_dir = NULL;

      /* no data to transfer */
      Curl_setup_transfer(data, -1, -1, FALSE, -1);
      state(conn, SSH_STOP);
      break;

    case SSH_SFTP_DOWNLOAD_INIT:
      /*
       * Work on getting the specified file
       */
      if(sshc->sftp_file)
        sftp_close(sshc->sftp_file);

      sshc->sftp_file = sftp_open(sshc->sftp_session, protop->path,
                                  O_RDONLY, (mode_t)data->set.new_file_perms);
      if(!sshc->sftp_file) {
        failf(data, "Could not open remote file for reading: %s",
              ssh_get_error(sshc->ssh_session));

        MOVE_TO_SFTP_CLOSE_STATE();
      }

      state(conn, SSH_SFTP_DOWNLOAD_STAT);
      break;

    case SSH_SFTP_DOWNLOAD_STAT:
    {
      sftp_attributes attrs;
      curl_off_t size;

      attrs = sftp_fstat(sshc->sftp_file);
      if(!attrs ||
              !(attrs->flags & SSH_FILEXFER_ATTR_SIZE) ||
              (attrs->size == 0)) {
        /*
         * sftp_fstat didn't return an error, so maybe the server
         * just doesn't support stat()
         * OR the server doesn't return a file size with a stat()
         * OR file size is 0
         */
        data->req.size = -1;
        data->req.maxdownload = -1;
        Curl_pgrsSetDownloadSize(data, -1);
        size = 0;
      }
      else {
        size = attrs->size;

        sftp_attributes_free(attrs);

        if(size < 0) {
          failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
          return CURLE_BAD_DOWNLOAD_RESUME;
        }
        if(conn->data->state.use_range) {
          curl_off_t from, to;
          char *ptr;
          char *ptr2;
          CURLofft to_t;
          CURLofft from_t;

          from_t = curlx_strtoofft(conn->data->state.range, &ptr, 0, &from);
          if(from_t == CURL_OFFT_FLOW) {
            return CURLE_RANGE_ERROR;
          }
          while(*ptr && (ISSPACE(*ptr) || (*ptr == '-')))
            ptr++;
          to_t = curlx_strtoofft(ptr, &ptr2, 0, &to);
          if(to_t == CURL_OFFT_FLOW) {
            return CURLE_RANGE_ERROR;
          }
          if((to_t == CURL_OFFT_INVAL) /* no "to" value given */
             || (to >= size)) {
            to = size - 1;
          }
          if(from_t) {
            /* from is relative to end of file */
            from = size - to;
            to = size - 1;
          }
          if(from > size) {
            failf(data, "Offset (%"
                  CURL_FORMAT_CURL_OFF_T ") was beyond file size (%"
                  CURL_FORMAT_CURL_OFF_T ")", from, size);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
          if(from > to) {
            from = to;
            size = 0;
          }
          else {
            size = to - from + 1;
          }

          rc = sftp_seek64(sshc->sftp_file, from);
          if(rc != 0) {
            MOVE_TO_SFTP_CLOSE_STATE();
          }
        }
        data->req.size = size;
        data->req.maxdownload = size;
        Curl_pgrsSetDownloadSize(data, size);
      }

      /* We can resume if we can seek to the resume position */
      if(data->state.resume_from) {
        if(data->state.resume_from < 0) {
          /* We're supposed to download the last abs(from) bytes */
          if((curl_off_t)size < -data->state.resume_from) {
            failf(data, "Offset (%"
                  CURL_FORMAT_CURL_OFF_T ") was beyond file size (%"
                  CURL_FORMAT_CURL_OFF_T ")",
                  data->state.resume_from, size);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
          /* download from where? */
          data->state.resume_from += size;
        }
        else {
          if((curl_off_t)size < data->state.resume_from) {
            failf(data, "Offset (%" CURL_FORMAT_CURL_OFF_T
                  ") was beyond file size (%" CURL_FORMAT_CURL_OFF_T ")",
                  data->state.resume_from, size);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
        }
        /* Does a completed file need to be seeked and started or closed ? */
        /* Now store the number of bytes we are expected to download */
        data->req.size = size - data->state.resume_from;
        data->req.maxdownload = size - data->state.resume_from;
        Curl_pgrsSetDownloadSize(data,
                                 size - data->state.resume_from);

        rc = sftp_seek64(sshc->sftp_file, data->state.resume_from);
        if(rc != 0) {
          MOVE_TO_SFTP_CLOSE_STATE();
        }
      }
    }

    /* Setup the actual download */
    if(data->req.size == 0) {
      /* no data to transfer */
      Curl_setup_transfer(data, -1, -1, FALSE, -1);
      infof(data, "File already completely downloaded\n");
      state(conn, SSH_STOP);
      break;
    }
    Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);

    /* not set by Curl_setup_transfer to preserve keepon bits */
    conn->writesockfd = conn->sockfd;

    /* we want to use the _receiving_ function even when the socket turns
       out writableable as the underlying libssh recv function will deal
       with both accordingly */
    conn->cselect_bits = CURL_CSELECT_IN;

    if(result) {
      /* this should never occur; the close state should be entered
         at the time the error occurs */
      state(conn, SSH_SFTP_CLOSE);
      sshc->actualcode = result;
    }
    else {
      sshc->sftp_recv_state = 0;
      state(conn, SSH_STOP);
    }
    break;

    case SSH_SFTP_CLOSE:
      if(sshc->sftp_file) {
        sftp_close(sshc->sftp_file);
        sshc->sftp_file = NULL;
      }
      Curl_safefree(protop->path);

      DEBUGF(infof(data, "SFTP DONE done\n"));

      /* Check if nextstate is set and move .nextstate could be POSTQUOTE_INIT
         After nextstate is executed, the control should come back to
         SSH_SFTP_CLOSE to pass the correct result back  */
      if(sshc->nextstate != SSH_NO_STATE &&
         sshc->nextstate != SSH_SFTP_CLOSE) {
        state(conn, sshc->nextstate);
        sshc->nextstate = SSH_SFTP_CLOSE;
      }
      else {
        state(conn, SSH_STOP);
        result = sshc->actualcode;
      }
      break;

    case SSH_SFTP_SHUTDOWN:
      /* during times we get here due to a broken transfer and then the
         sftp_handle might not have been taken down so make sure that is done
         before we proceed */

      if(sshc->sftp_file) {
        sftp_close(sshc->sftp_file);
        sshc->sftp_file = NULL;
      }

      if(sshc->sftp_session) {
        sftp_free(sshc->sftp_session);
        sshc->sftp_session = NULL;
      }

      SSH_STRING_FREE_CHAR(sshc->homedir);
      conn->data->state.most_recent_ftp_entrypath = NULL;

      state(conn, SSH_SESSION_DISCONNECT);
      break;


    case SSH_SCP_TRANS_INIT:
      result = Curl_getworkingpath(conn, sshc->homedir, &protop->path);
      if(result) {
        sshc->actualcode = result;
        state(conn, SSH_STOP);
        break;
      }

      /* Functions from the SCP subsystem cannot handle/return SSH_AGAIN */
      ssh_set_blocking(sshc->ssh_session, 1);

      if(data->set.upload) {
        if(data->state.infilesize < 0) {
          failf(data, "SCP requires a known file size for upload");
          sshc->actualcode = CURLE_UPLOAD_FAILED;
          MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
        }

        sshc->scp_session =
          ssh_scp_new(sshc->ssh_session, SSH_SCP_WRITE, protop->path);
        state(conn, SSH_SCP_UPLOAD_INIT);
      }
      else {
        sshc->scp_session =
          ssh_scp_new(sshc->ssh_session, SSH_SCP_READ, protop->path);
        state(conn, SSH_SCP_DOWNLOAD_INIT);
      }

      if(!sshc->scp_session) {
        err_msg = ssh_get_error(sshc->ssh_session);
        failf(conn->data, "%s", err_msg);
        MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
      }

      break;

    case SSH_SCP_UPLOAD_INIT:

      rc = ssh_scp_init(sshc->scp_session);
      if(rc != SSH_OK) {
        err_msg = ssh_get_error(sshc->ssh_session);
        failf(conn->data, "%s", err_msg);
        MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
      }

      rc = ssh_scp_push_file(sshc->scp_session, protop->path,
                             data->state.infilesize,
                             (int)data->set.new_file_perms);
      if(rc != SSH_OK) {
        err_msg = ssh_get_error(sshc->ssh_session);
        failf(conn->data, "%s", err_msg);
        MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
      }

      /* upload data */
      Curl_setup_transfer(data, -1, data->req.size, FALSE, FIRSTSOCKET);

      /* not set by Curl_setup_transfer to preserve keepon bits */
      conn->sockfd = conn->writesockfd;

      /* store this original bitmask setup to use later on if we can't
         figure out a "real" bitmask */
      sshc->orig_waitfor = data->req.keepon;

      /* we want to use the _sending_ function even when the socket turns
         out readable as the underlying libssh scp send function will deal
         with both accordingly */
      conn->cselect_bits = CURL_CSELECT_OUT;

      state(conn, SSH_STOP);

      break;

    case SSH_SCP_DOWNLOAD_INIT:

      rc = ssh_scp_init(sshc->scp_session);
      if(rc != SSH_OK) {
        err_msg = ssh_get_error(sshc->ssh_session);
        failf(conn->data, "%s", err_msg);
        MOVE_TO_ERROR_STATE(CURLE_COULDNT_CONNECT);
      }
      state(conn, SSH_SCP_DOWNLOAD);
      /* FALLTHROUGH */

    case SSH_SCP_DOWNLOAD:{
        curl_off_t bytecount;

        rc = ssh_scp_pull_request(sshc->scp_session);
        if(rc != SSH_SCP_REQUEST_NEWFILE) {
          err_msg = ssh_get_error(sshc->ssh_session);
          failf(conn->data, "%s", err_msg);
          MOVE_TO_ERROR_STATE(CURLE_REMOTE_FILE_NOT_FOUND);
          break;
        }

        /* download data */
        bytecount = ssh_scp_request_get_size(sshc->scp_session);
        data->req.maxdownload = (curl_off_t) bytecount;
        Curl_setup_transfer(data, FIRSTSOCKET, bytecount, FALSE, -1);

        /* not set by Curl_setup_transfer to preserve keepon bits */
        conn->writesockfd = conn->sockfd;

        /* we want to use the _receiving_ function even when the socket turns
           out writableable as the underlying libssh recv function will deal
           with both accordingly */
        conn->cselect_bits = CURL_CSELECT_IN;

        state(conn, SSH_STOP);
        break;
      }
    case SSH_SCP_DONE:
      if(data->set.upload)
        state(conn, SSH_SCP_SEND_EOF);
      else
        state(conn, SSH_SCP_CHANNEL_FREE);
      break;

    case SSH_SCP_SEND_EOF:
      if(sshc->scp_session) {
        rc = ssh_scp_close(sshc->scp_session);
        if(rc == SSH_AGAIN) {
          /* Currently the ssh_scp_close handles waiting for EOF in
           * blocking way.
           */
          break;
        }
        if(rc != SSH_OK) {
          infof(data, "Failed to close libssh scp channel: %s\n",
                ssh_get_error(sshc->ssh_session));
        }
      }

      state(conn, SSH_SCP_CHANNEL_FREE);
      break;

    case SSH_SCP_CHANNEL_FREE:
      if(sshc->scp_session) {
        ssh_scp_free(sshc->scp_session);
        sshc->scp_session = NULL;
      }
      DEBUGF(infof(data, "SCP DONE phase complete\n"));

      ssh_set_blocking(sshc->ssh_session, 0);

      state(conn, SSH_SESSION_DISCONNECT);
      /* FALLTHROUGH */

    case SSH_SESSION_DISCONNECT:
      /* during weird times when we've been prematurely aborted, the channel
         is still alive when we reach this state and we MUST kill the channel
         properly first */
      if(sshc->scp_session) {
        ssh_scp_free(sshc->scp_session);
        sshc->scp_session = NULL;
      }

      ssh_disconnect(sshc->ssh_session);

      SSH_STRING_FREE_CHAR(sshc->homedir);
      conn->data->state.most_recent_ftp_entrypath = NULL;

      state(conn, SSH_SESSION_FREE);
      /* FALLTHROUGH */
    case SSH_SESSION_FREE:
      if(sshc->ssh_session) {
        ssh_free(sshc->ssh_session);
        sshc->ssh_session = NULL;
      }

      /* worst-case scenario cleanup */

      DEBUGASSERT(sshc->ssh_session == NULL);
      DEBUGASSERT(sshc->scp_session == NULL);

      if(sshc->readdir_tmp) {
        ssh_string_free_char(sshc->readdir_tmp);
        sshc->readdir_tmp = NULL;
      }

      if(sshc->quote_attrs)
        sftp_attributes_free(sshc->quote_attrs);

      if(sshc->readdir_attrs)
        sftp_attributes_free(sshc->readdir_attrs);

      if(sshc->readdir_link_attrs)
        sftp_attributes_free(sshc->readdir_link_attrs);

      if(sshc->privkey)
        ssh_key_free(sshc->privkey);
      if(sshc->pubkey)
        ssh_key_free(sshc->pubkey);

      Curl_safefree(sshc->rsa_pub);
      Curl_safefree(sshc->rsa);
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);
      Curl_safefree(sshc->readdir_line);
      Curl_safefree(sshc->readdir_linkPath);
      SSH_STRING_FREE_CHAR(sshc->homedir);

      /* the code we are about to return */
      result = sshc->actualcode;

      memset(sshc, 0, sizeof(struct ssh_conn));

      connclose(conn, "SSH session free");
      sshc->state = SSH_SESSION_FREE;   /* current */
      sshc->nextstate = SSH_NO_STATE;
      state(conn, SSH_STOP);
      break;

    case SSH_QUIT:
      /* fallthrough, just stop! */
    default:
      /* internal error */
      sshc->nextstate = SSH_NO_STATE;
      state(conn, SSH_STOP);
      break;

    }
  } while(!rc && (sshc->state != SSH_STOP));


  if(rc == SSH_AGAIN) {
    /* we would block, we need to wait for the socket to be ready (in the
       right direction too)! */
    *block = TRUE;
  }

  return result;
}


/* called by the multi interface to figure out what socket(s) to wait for and
   for what actions in the DO_DONE, PERFORM and WAITPERFORM states */
static int myssh_perform_getsock(const struct connectdata *conn,
                                 curl_socket_t *sock,  /* points to numsocks
                                                          number of sockets */
                                 int numsocks)
{
  int bitmap = GETSOCK_BLANK;
  (void) numsocks;

  sock[0] = conn->sock[FIRSTSOCKET];

  if(conn->waitfor & KEEP_RECV)
    bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);

  if(conn->waitfor & KEEP_SEND)
    bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);

  return bitmap;
}

/* Generic function called by the multi interface to figure out what socket(s)
   to wait for and for what actions during the DOING and PROTOCONNECT states*/
static int myssh_getsock(struct connectdata *conn,
                         curl_socket_t *sock,  /* points to numsocks
                                                   number of sockets */
                         int numsocks)
{
  /* if we know the direction we can use the generic *_getsock() function even
     for the protocol_connect and doing states */
  return myssh_perform_getsock(conn, sock, numsocks);
}

static void myssh_block2waitfor(struct connectdata *conn, bool block)
{
  struct ssh_conn *sshc = &conn->proto.sshc;

  /* If it didn't block, or nothing was returned by ssh_get_poll_flags
   * have the original set */
  conn->waitfor = sshc->orig_waitfor;

  if(block) {
    int dir = ssh_get_poll_flags(sshc->ssh_session);
    if(dir & SSH_READ_PENDING) {
      /* translate the libssh define bits into our own bit defines */
      conn->waitfor = KEEP_RECV;
    }
    else if(dir & SSH_WRITE_PENDING) {
      conn->waitfor = KEEP_SEND;
    }
  }
}

/* called repeatedly until done from multi.c */
static CURLcode myssh_multi_statemach(struct connectdata *conn,
                                      bool *done)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  bool block;    /* we store the status and use that to provide a ssh_getsock()
                    implementation */
  CURLcode result = myssh_statemach_act(conn, &block);

  *done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
  myssh_block2waitfor(conn, block);

  return result;
}

static CURLcode myssh_block_statemach(struct connectdata *conn,
                                      bool disconnect)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  CURLcode result = CURLE_OK;
  struct Curl_easy *data = conn->data;

  while((sshc->state != SSH_STOP) && !result) {
    bool block;
    timediff_t left = 1000;
    struct curltime now = Curl_now();

    result = myssh_statemach_act(conn, &block);
    if(result)
      break;

    if(!disconnect) {
      if(Curl_pgrsUpdate(conn))
        return CURLE_ABORTED_BY_CALLBACK;

      result = Curl_speedcheck(data, now);
      if(result)
        break;

      left = Curl_timeleft(data, NULL, FALSE);
      if(left < 0) {
        failf(data, "Operation timed out");
        return CURLE_OPERATION_TIMEDOUT;
      }
    }

    if(!result && block) {
      curl_socket_t fd_read = conn->sock[FIRSTSOCKET];
      /* wait for the socket to become ready */
      (void) Curl_socket_check(fd_read, CURL_SOCKET_BAD,
                               CURL_SOCKET_BAD, left > 1000 ? 1000 : left);
    }

  }

  return result;
}

/*
 * SSH setup connection
 */
static CURLcode myssh_setup_connection(struct connectdata *conn)
{
  struct SSHPROTO *ssh;

  conn->data->req.protop = ssh = calloc(1, sizeof(struct SSHPROTO));
  if(!ssh)
    return CURLE_OUT_OF_MEMORY;

  return CURLE_OK;
}

static Curl_recv scp_recv, sftp_recv;
static Curl_send scp_send, sftp_send;

/*
 * Curl_ssh_connect() gets called from Curl_protocol_connect() to allow us to
 * do protocol-specific actions at connect-time.
 */
static CURLcode myssh_connect(struct connectdata *conn, bool *done)
{
  struct ssh_conn *ssh;
  CURLcode result;
  curl_socket_t sock = conn->sock[FIRSTSOCKET];
  struct Curl_easy *data = conn->data;

  /* initialize per-handle data if not already */
  if(!data->req.protop)
    myssh_setup_connection(conn);

  /* We default to persistent connections. We set this already in this connect
     function to make the re-use checks properly be able to check this bit. */
  connkeep(conn, "SSH default");

  if(conn->handler->protocol & CURLPROTO_SCP) {
    conn->recv[FIRSTSOCKET] = scp_recv;
    conn->send[FIRSTSOCKET] = scp_send;
  }
  else {
    conn->recv[FIRSTSOCKET] = sftp_recv;
    conn->send[FIRSTSOCKET] = sftp_send;
  }

  ssh = &conn->proto.sshc;

  ssh->ssh_session = ssh_new();
  if(ssh->ssh_session == NULL) {
    failf(data, "Failure initialising ssh session");
    return CURLE_FAILED_INIT;
  }

  ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock);

  if(conn->user) {
    infof(data, "User: %s\n", conn->user);
    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user);
  }

  if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
    infof(data, "Known hosts: %s\n", data->set.str[STRING_SSH_KNOWNHOSTS]);
    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_KNOWNHOSTS,
                    data->set.str[STRING_SSH_KNOWNHOSTS]);
  }

  ssh_options_set(ssh->ssh_session, SSH_OPTIONS_HOST, conn->host.name);
  if(conn->remote_port)
    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_PORT,
                    &conn->remote_port);

  if(data->set.ssh_compression) {
    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_COMPRESSION,
                    "zlib,zlib@openssh.com,none");
  }

  ssh->privkey = NULL;
  ssh->pubkey = NULL;

  if(data->set.str[STRING_SSH_PUBLIC_KEY]) {
    int rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
                                        &ssh->pubkey);
    if(rc != SSH_OK) {
      failf(data, "Could not load public key file");
      /* ignore */
    }
  }

  /* we do not verify here, we do it at the state machine,
   * after connection */

  state(conn, SSH_INIT);

  result = myssh_multi_statemach(conn, done);

  return result;
}

/* called from multi.c while DOing */
static CURLcode scp_doing(struct connectdata *conn, bool *dophase_done)
{
  CURLcode result;

  result = myssh_multi_statemach(conn, dophase_done);

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }
  return result;
}

/*
 ***********************************************************************
 *
 * scp_perform()
 *
 * This is the actual DO function for SCP. Get a file according to
 * the options previously setup.
 */

static
CURLcode scp_perform(struct connectdata *conn,
                     bool *connected, bool *dophase_done)
{
  CURLcode result = CURLE_OK;

  DEBUGF(infof(conn->data, "DO phase starts\n"));

  *dophase_done = FALSE;        /* not done yet */

  /* start the first command in the DO phase */
  state(conn, SSH_SCP_TRANS_INIT);

  result = myssh_multi_statemach(conn, dophase_done);

  *connected = conn->bits.tcpconnect[FIRSTSOCKET];

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }

  return result;
}

static CURLcode myssh_do_it(struct connectdata *conn, bool *done)
{
  CURLcode result;
  bool connected = 0;
  struct Curl_easy *data = conn->data;
  struct ssh_conn *sshc = &conn->proto.sshc;

  *done = FALSE;                /* default to false */

  data->req.size = -1;          /* make sure this is unknown at this point */

  sshc->actualcode = CURLE_OK;  /* reset error code */
  sshc->secondCreateDirs = 0;   /* reset the create dir attempt state
                                   variable */

  Curl_pgrsSetUploadCounter(data, 0);
  Curl_pgrsSetDownloadCounter(data, 0);
  Curl_pgrsSetUploadSize(data, -1);
  Curl_pgrsSetDownloadSize(data, -1);

  if(conn->handler->protocol & CURLPROTO_SCP)
    result = scp_perform(conn, &connected, done);
  else
    result = sftp_perform(conn, &connected, done);

  return result;
}

/* BLOCKING, but the function is using the state machine so the only reason
   this is still blocking is that the multi interface code has no support for
   disconnecting operations that takes a while */
static CURLcode scp_disconnect(struct connectdata *conn,
                               bool dead_connection)
{
  CURLcode result = CURLE_OK;
  struct ssh_conn *ssh = &conn->proto.sshc;
  (void) dead_connection;

  if(ssh->ssh_session) {
    /* only if there's a session still around to use! */

    state(conn, SSH_SESSION_DISCONNECT);

    result = myssh_block_statemach(conn, TRUE);
  }

  return result;
}

/* generic done function for both SCP and SFTP called from their specific
   done functions */
static CURLcode myssh_done(struct connectdata *conn, CURLcode status)
{
  CURLcode result = CURLE_OK;
  struct SSHPROTO *protop = conn->data->req.protop;

  if(!status) {
    /* run the state-machine */
    result = myssh_block_statemach(conn, FALSE);
  }
  else
    result = status;

  if(protop)
    Curl_safefree(protop->path);
  if(Curl_pgrsDone(conn))
    return CURLE_ABORTED_BY_CALLBACK;

  conn->data->req.keepon = 0;   /* clear all bits */
  return result;
}


static CURLcode scp_done(struct connectdata *conn, CURLcode status,
                         bool premature)
{
  (void) premature;             /* not used */

  if(!status)
    state(conn, SSH_SCP_DONE);

  return myssh_done(conn, status);

}

static ssize_t scp_send(struct connectdata *conn, int sockindex,
                        const void *mem, size_t len, CURLcode *err)
{
  int rc;
  (void) sockindex; /* we only support SCP on the fixed known primary socket */
  (void) err;

  rc = ssh_scp_write(conn->proto.sshc.scp_session, mem, len);

#if 0
  /* The following code is misleading, mostly added as wishful thinking
   * that libssh at some point will implement non-blocking ssh_scp_write/read.
   * Currently rc can only be number of bytes read or SSH_ERROR. */
  myssh_block2waitfor(conn, (rc == SSH_AGAIN) ? TRUE : FALSE);

  if(rc == SSH_AGAIN) {
    *err = CURLE_AGAIN;
    return 0;
  }
  else
#endif
  if(rc != SSH_OK) {
    *err = CURLE_SSH;
    return -1;
  }

  return len;
}

static ssize_t scp_recv(struct connectdata *conn, int sockindex,
                        char *mem, size_t len, CURLcode *err)
{
  ssize_t nread;
  (void) err;
  (void) sockindex; /* we only support SCP on the fixed known primary socket */

  /* libssh returns int */
  nread = ssh_scp_read(conn->proto.sshc.scp_session, mem, len);

#if 0
  /* The following code is misleading, mostly added as wishful thinking
   * that libssh at some point will implement non-blocking ssh_scp_write/read.
   * Currently rc can only be SSH_OK or SSH_ERROR. */

  myssh_block2waitfor(conn, (nread == SSH_AGAIN) ? TRUE : FALSE);
  if(nread == SSH_AGAIN) {
    *err = CURLE_AGAIN;
    nread = -1;
  }
#endif

  return nread;
}

/*
 * =============== SFTP ===============
 */

/*
 ***********************************************************************
 *
 * sftp_perform()
 *
 * This is the actual DO function for SFTP. Get a file/directory according to
 * the options previously setup.
 */

static
CURLcode sftp_perform(struct connectdata *conn,
                      bool *connected,
                      bool *dophase_done)
{
  CURLcode result = CURLE_OK;

  DEBUGF(infof(conn->data, "DO phase starts\n"));

  *dophase_done = FALSE; /* not done yet */

  /* start the first command in the DO phase */
  state(conn, SSH_SFTP_QUOTE_INIT);

  /* run the state-machine */
  result = myssh_multi_statemach(conn, dophase_done);

  *connected = conn->bits.tcpconnect[FIRSTSOCKET];

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }

  return result;
}

/* called from multi.c while DOing */
static CURLcode sftp_doing(struct connectdata *conn,
                           bool *dophase_done)
{
  CURLcode result = myssh_multi_statemach(conn, dophase_done);
  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }
  return result;
}

/* BLOCKING, but the function is using the state machine so the only reason
   this is still blocking is that the multi interface code has no support for
   disconnecting operations that takes a while */
static CURLcode sftp_disconnect(struct connectdata *conn, bool dead_connection)
{
  CURLcode result = CURLE_OK;
  (void) dead_connection;

  DEBUGF(infof(conn->data, "SSH DISCONNECT starts now\n"));

  if(conn->proto.sshc.ssh_session) {
    /* only if there's a session still around to use! */
    state(conn, SSH_SFTP_SHUTDOWN);
    result = myssh_block_statemach(conn, TRUE);
  }

  DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));

  return result;

}

static CURLcode sftp_done(struct connectdata *conn, CURLcode status,
                               bool premature)
{
  struct ssh_conn *sshc = &conn->proto.sshc;

  if(!status) {
    /* Post quote commands are executed after the SFTP_CLOSE state to avoid
       errors that could happen due to open file handles during POSTQUOTE
       operation */
    if(!premature && conn->data->set.postquote && !conn->bits.retry)
      sshc->nextstate = SSH_SFTP_POSTQUOTE_INIT;
    state(conn, SSH_SFTP_CLOSE);
  }
  return myssh_done(conn, status);
}

/* return number of sent bytes */
static ssize_t sftp_send(struct connectdata *conn, int sockindex,
                         const void *mem, size_t len, CURLcode *err)
{
  ssize_t nwrite;
  (void)sockindex;

  nwrite = sftp_write(conn->proto.sshc.sftp_file, mem, len);

  myssh_block2waitfor(conn, FALSE);

#if 0 /* not returned by libssh on write */
  if(nwrite == SSH_AGAIN) {
    *err = CURLE_AGAIN;
    nwrite = 0;
  }
  else
#endif
  if(nwrite < 0) {
    *err = CURLE_SSH;
    nwrite = -1;
  }

  return nwrite;
}

/*
 * Return number of received (decrypted) bytes
 * or <0 on error
 */
static ssize_t sftp_recv(struct connectdata *conn, int sockindex,
                         char *mem, size_t len, CURLcode *err)
{
  ssize_t nread;
  (void)sockindex;

  DEBUGASSERT(len < CURL_MAX_READ_SIZE);

  switch(conn->proto.sshc.sftp_recv_state) {
    case 0:
      conn->proto.sshc.sftp_file_index =
            sftp_async_read_begin(conn->proto.sshc.sftp_file,
                                  (uint32_t)len);
      if(conn->proto.sshc.sftp_file_index < 0) {
        *err = CURLE_RECV_ERROR;
        return -1;
      }

      /* FALLTHROUGH */
    case 1:
      conn->proto.sshc.sftp_recv_state = 1;

      nread = sftp_async_read(conn->proto.sshc.sftp_file,
                              mem, (uint32_t)len,
                              conn->proto.sshc.sftp_file_index);

      myssh_block2waitfor(conn, (nread == SSH_AGAIN)?TRUE:FALSE);

      if(nread == SSH_AGAIN) {
        *err = CURLE_AGAIN;
        return -1;
      }
      else if(nread < 0) {
        *err = CURLE_RECV_ERROR;
        return -1;
      }

      conn->proto.sshc.sftp_recv_state = 0;
      return nread;

    default:
      /* we never reach here */
      return -1;
  }
}

static void sftp_quote(struct connectdata *conn)
{
  const char *cp;
  struct Curl_easy *data = conn->data;
  struct SSHPROTO *protop = data->req.protop;
  struct ssh_conn *sshc = &conn->proto.sshc;
  CURLcode result;

  /*
   * Support some of the "FTP" commands
   */
  char *cmd = sshc->quote_item->data;
  sshc->acceptfail = FALSE;

  /* if a command starts with an asterisk, which a legal SFTP command never
     can, the command will be allowed to fail without it causing any
     aborts or cancels etc. It will cause libcurl to act as if the command
     is successful, whatever the server reponds. */

  if(cmd[0] == '*') {
    cmd++;
    sshc->acceptfail = TRUE;
  }

  if(strcasecompare("pwd", cmd)) {
    /* output debug output if that is requested */
    char *tmp = aprintf("257 \"%s\" is current directory.\n",
                        protop->path);
    if(!tmp) {
      sshc->actualcode = CURLE_OUT_OF_MEMORY;
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      return;
    }
    if(data->set.verbose) {
      Curl_debug(data, CURLINFO_HEADER_OUT, (char *) "PWD\n", 4);
      Curl_debug(data, CURLINFO_HEADER_IN, tmp, strlen(tmp));
    }
    /* this sends an FTP-like "header" to the header callback so that the
       current directory can be read very similar to how it is read when
       using ordinary FTP. */
    result = Curl_client_write(conn, CLIENTWRITE_HEADER, tmp, strlen(tmp));
    free(tmp);
    if(result) {
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = result;
    }
    else
      state(conn, SSH_SFTP_NEXT_QUOTE);
    return;
  }

  /*
   * the arguments following the command must be separated from the
   * command with a space so we can check for it unconditionally
   */
  cp = strchr(cmd, ' ');
  if(cp == NULL) {
    failf(data, "Syntax error in SFTP command. Supply parameter(s)!");
    state(conn, SSH_SFTP_CLOSE);
    sshc->nextstate = SSH_NO_STATE;
    sshc->actualcode = CURLE_QUOTE_ERROR;
    return;
  }

  /*
   * also, every command takes at least one argument so we get that
   * first argument right now
   */
  result = Curl_get_pathname(&cp, &sshc->quote_path1, sshc->homedir);
  if(result) {
    if(result == CURLE_OUT_OF_MEMORY)
      failf(data, "Out of memory");
    else
      failf(data, "Syntax error: Bad first parameter");
    state(conn, SSH_SFTP_CLOSE);
    sshc->nextstate = SSH_NO_STATE;
    sshc->actualcode = result;
    return;
  }

  /*
   * SFTP is a binary protocol, so we don't send text commands
   * to the server. Instead, we scan for commands used by
   * OpenSSH's sftp program and call the appropriate libssh
   * functions.
   */
  if(strncasecompare(cmd, "chgrp ", 6) ||
     strncasecompare(cmd, "chmod ", 6) ||
     strncasecompare(cmd, "chown ", 6)) {
    /* attribute change */

    /* sshc->quote_path1 contains the mode to set */
    /* get the destination */
    result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
    if(result) {
      if(result == CURLE_OUT_OF_MEMORY)
        failf(data, "Out of memory");
      else
        failf(data, "Syntax error in chgrp/chmod/chown: "
              "Bad second parameter");
      Curl_safefree(sshc->quote_path1);
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = result;
      return;
    }
    sshc->quote_attrs = NULL;
    state(conn, SSH_SFTP_QUOTE_STAT);
    return;
  }
  if(strncasecompare(cmd, "ln ", 3) ||
     strncasecompare(cmd, "symlink ", 8)) {
    /* symbolic linking */
    /* sshc->quote_path1 is the source */
    /* get the destination */
    result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
    if(result) {
      if(result == CURLE_OUT_OF_MEMORY)
        failf(data, "Out of memory");
      else
        failf(data, "Syntax error in ln/symlink: Bad second parameter");
      Curl_safefree(sshc->quote_path1);
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = result;
      return;
    }
    state(conn, SSH_SFTP_QUOTE_SYMLINK);
    return;
  }
  else if(strncasecompare(cmd, "mkdir ", 6)) {
    /* create dir */
    state(conn, SSH_SFTP_QUOTE_MKDIR);
    return;
  }
  else if(strncasecompare(cmd, "rename ", 7)) {
    /* rename file */
    /* first param is the source path */
    /* second param is the dest. path */
    result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
    if(result) {
      if(result == CURLE_OUT_OF_MEMORY)
        failf(data, "Out of memory");
      else
        failf(data, "Syntax error in rename: Bad second parameter");
      Curl_safefree(sshc->quote_path1);
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = result;
      return;
    }
    state(conn, SSH_SFTP_QUOTE_RENAME);
    return;
  }
  else if(strncasecompare(cmd, "rmdir ", 6)) {
    /* delete dir */
    state(conn, SSH_SFTP_QUOTE_RMDIR);
    return;
  }
  else if(strncasecompare(cmd, "rm ", 3)) {
    state(conn, SSH_SFTP_QUOTE_UNLINK);
    return;
  }
#ifdef HAS_STATVFS_SUPPORT
  else if(strncasecompare(cmd, "statvfs ", 8)) {
    state(conn, SSH_SFTP_QUOTE_STATVFS);
    return;
  }
#endif

  failf(data, "Unknown SFTP command");
  Curl_safefree(sshc->quote_path1);
  Curl_safefree(sshc->quote_path2);
  state(conn, SSH_SFTP_CLOSE);
  sshc->nextstate = SSH_NO_STATE;
  sshc->actualcode = CURLE_QUOTE_ERROR;
}

static void sftp_quote_stat(struct connectdata *conn)
{
  struct Curl_easy *data = conn->data;
  struct ssh_conn *sshc = &conn->proto.sshc;
  char *cmd = sshc->quote_item->data;
  sshc->acceptfail = FALSE;

  /* if a command starts with an asterisk, which a legal SFTP command never
     can, the command will be allowed to fail without it causing any
     aborts or cancels etc. It will cause libcurl to act as if the command
     is successful, whatever the server reponds. */

  if(cmd[0] == '*') {
    cmd++;
    sshc->acceptfail = TRUE;
  }

  /* We read the file attributes, store them in sshc->quote_attrs
   * and modify them accordingly to command. Then we switch to
   * QUOTE_SETSTAT state to write new ones.
   */

  if(sshc->quote_attrs)
    sftp_attributes_free(sshc->quote_attrs);
  sshc->quote_attrs = sftp_stat(sshc->sftp_session, sshc->quote_path2);
  if(sshc->quote_attrs == NULL) {
    Curl_safefree(sshc->quote_path1);
    Curl_safefree(sshc->quote_path2);
    failf(data, "Attempt to get SFTP stats failed: %d",
          sftp_get_error(sshc->sftp_session));
    state(conn, SSH_SFTP_CLOSE);
    sshc->nextstate = SSH_NO_STATE;
    sshc->actualcode = CURLE_QUOTE_ERROR;
    return;
  }

  /* Now set the new attributes... */
  if(strncasecompare(cmd, "chgrp", 5)) {
    sshc->quote_attrs->gid = (uint32_t)strtoul(sshc->quote_path1, NULL, 10);
    if(sshc->quote_attrs->gid == 0 && !ISDIGIT(sshc->quote_path1[0]) &&
        !sshc->acceptfail) {
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);
      failf(data, "Syntax error: chgrp gid not a number");
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = CURLE_QUOTE_ERROR;
      return;
    }
    sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_UIDGID;
  }
  else if(strncasecompare(cmd, "chmod", 5)) {
    mode_t perms;
    perms = (mode_t)strtoul(sshc->quote_path1, NULL, 8);
    /* permissions are octal */
    if(perms == 0 && !ISDIGIT(sshc->quote_path1[0])) {
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);
      failf(data, "Syntax error: chmod permissions not a number");
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = CURLE_QUOTE_ERROR;
      return;
    }
    sshc->quote_attrs->permissions = perms;
    sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_PERMISSIONS;
  }
  else if(strncasecompare(cmd, "chown", 5)) {
    sshc->quote_attrs->uid = (uint32_t)strtoul(sshc->quote_path1, NULL, 10);
    if(sshc->quote_attrs->uid == 0 && !ISDIGIT(sshc->quote_path1[0]) &&
        !sshc->acceptfail) {
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);
      failf(data, "Syntax error: chown uid not a number");
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = CURLE_QUOTE_ERROR;
      return;
    }
    sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_UIDGID;
  }

  /* Now send the completed structure... */
  state(conn, SSH_SFTP_QUOTE_SETSTAT);
  return;
}


#endif                          /* USE_LIBSSH */
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Deleted jni/curl/lib/ssh.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

/* #define CURL_LIBSSH2_DEBUG */

#include "curl_setup.h"

#ifdef USE_LIBSSH2

#include <limits.h>

#include <libssh2.h>
#include <libssh2_sftp.h>

#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif

#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_UTSNAME_H
#include <sys/utsname.h>
#endif
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
#ifdef __VMS
#include <in.h>
#include <inet.h>
#endif

#if (defined(NETWARE) && defined(__NOVELL_LIBC__))
#undef in_addr_t
#define in_addr_t unsigned long
#endif

#include <curl/curl.h>
#include "urldata.h"
#include "sendf.h"
#include "hostip.h"
#include "progress.h"
#include "transfer.h"
#include "escape.h"
#include "http.h" /* for HTTP proxy tunnel stuff */
#include "ssh.h"
#include "url.h"
#include "speedcheck.h"
#include "getinfo.h"
#include "strdup.h"
#include "strcase.h"
#include "vtls/vtls.h"
#include "connect.h"
#include "strerror.h"
#include "inet_ntop.h"
#include "parsedate.h" /* for the week day and month names */
#include "sockaddr.h" /* required for Curl_sockaddr_storage */
#include "strtoofft.h"
#include "multiif.h"
#include "select.h"
#include "warnless.h"
#include "curl_path.h"

/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"

#if LIBSSH2_VERSION_NUM >= 0x010206
/* libssh2_sftp_statvfs and friends were added in 1.2.6 */
#define HAS_STATVFS_SUPPORT 1
#endif

#define sftp_libssh2_last_error(s) curlx_ultosi(libssh2_sftp_last_error(s))

#define sftp_libssh2_realpath(s,p,t,m) \
        libssh2_sftp_symlink_ex((s), (p), curlx_uztoui(strlen(p)), \
                                (t), (m), LIBSSH2_SFTP_REALPATH)


/* Local functions: */
static const char *sftp_libssh2_strerror(int err);
static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc);
static LIBSSH2_REALLOC_FUNC(my_libssh2_realloc);
static LIBSSH2_FREE_FUNC(my_libssh2_free);

static CURLcode ssh_connect(struct connectdata *conn, bool *done);
static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done);
static CURLcode ssh_do(struct connectdata *conn, bool *done);

static CURLcode scp_done(struct connectdata *conn,
                         CURLcode, bool premature);
static CURLcode scp_doing(struct connectdata *conn,
                          bool *dophase_done);
static CURLcode scp_disconnect(struct connectdata *conn, bool dead_connection);

static CURLcode sftp_done(struct connectdata *conn,
                          CURLcode, bool premature);
static CURLcode sftp_doing(struct connectdata *conn,
                           bool *dophase_done);
static CURLcode sftp_disconnect(struct connectdata *conn, bool dead);
static
CURLcode sftp_perform(struct connectdata *conn,
                      bool *connected,
                      bool *dophase_done);

static int ssh_getsock(struct connectdata *conn,
                       curl_socket_t *sock, /* points to numsocks number
                                               of sockets */
                       int numsocks);

static int ssh_perform_getsock(const struct connectdata *conn,
                               curl_socket_t *sock, /* points to numsocks
                                                       number of sockets */
                               int numsocks);

static CURLcode ssh_setup_connection(struct connectdata *conn);

/*
 * SCP protocol handler.
 */

const struct Curl_handler Curl_handler_scp = {
  "SCP",                                /* scheme */
  ssh_setup_connection,                 /* setup_connection */
  ssh_do,                               /* do_it */
  scp_done,                             /* done */
  ZERO_NULL,                            /* do_more */
  ssh_connect,                          /* connect_it */
  ssh_multi_statemach,                  /* connecting */
  scp_doing,                            /* doing */
  ssh_getsock,                          /* proto_getsock */
  ssh_getsock,                          /* doing_getsock */
  ZERO_NULL,                            /* domore_getsock */
  ssh_perform_getsock,                  /* perform_getsock */
  scp_disconnect,                       /* disconnect */
  ZERO_NULL,                            /* readwrite */
  ZERO_NULL,                            /* connection_check */
  PORT_SSH,                             /* defport */
  CURLPROTO_SCP,                        /* protocol */
  PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
  | PROTOPT_NOURLQUERY                  /* flags */
};


/*
 * SFTP protocol handler.
 */

const struct Curl_handler Curl_handler_sftp = {
  "SFTP",                               /* scheme */
  ssh_setup_connection,                 /* setup_connection */
  ssh_do,                               /* do_it */
  sftp_done,                            /* done */
  ZERO_NULL,                            /* do_more */
  ssh_connect,                          /* connect_it */
  ssh_multi_statemach,                  /* connecting */
  sftp_doing,                           /* doing */
  ssh_getsock,                          /* proto_getsock */
  ssh_getsock,                          /* doing_getsock */
  ZERO_NULL,                            /* domore_getsock */
  ssh_perform_getsock,                  /* perform_getsock */
  sftp_disconnect,                      /* disconnect */
  ZERO_NULL,                            /* readwrite */
  ZERO_NULL,                            /* connection_check */
  PORT_SSH,                             /* defport */
  CURLPROTO_SFTP,                       /* protocol */
  PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
  | PROTOPT_NOURLQUERY                  /* flags */
};

static void
kbd_callback(const char *name, int name_len, const char *instruction,
             int instruction_len, int num_prompts,
             const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,
             LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,
             void **abstract)
{
  struct connectdata *conn = (struct connectdata *)*abstract;

#ifdef CURL_LIBSSH2_DEBUG
  fprintf(stderr, "name=%s\n", name);
  fprintf(stderr, "name_len=%d\n", name_len);
  fprintf(stderr, "instruction=%s\n", instruction);
  fprintf(stderr, "instruction_len=%d\n", instruction_len);
  fprintf(stderr, "num_prompts=%d\n", num_prompts);
#else
  (void)name;
  (void)name_len;
  (void)instruction;
  (void)instruction_len;
#endif  /* CURL_LIBSSH2_DEBUG */
  if(num_prompts == 1) {
    responses[0].text = strdup(conn->passwd);
    responses[0].length = curlx_uztoui(strlen(conn->passwd));
  }
  (void)prompts;
  (void)abstract;
} /* kbd_callback */

static CURLcode sftp_libssh2_error_to_CURLE(int err)
{
  switch(err) {
    case LIBSSH2_FX_OK:
      return CURLE_OK;

    case LIBSSH2_FX_NO_SUCH_FILE:
    case LIBSSH2_FX_NO_SUCH_PATH:
      return CURLE_REMOTE_FILE_NOT_FOUND;

    case LIBSSH2_FX_PERMISSION_DENIED:
    case LIBSSH2_FX_WRITE_PROTECT:
    case LIBSSH2_FX_LOCK_CONFlICT:
      return CURLE_REMOTE_ACCESS_DENIED;

    case LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM:
    case LIBSSH2_FX_QUOTA_EXCEEDED:
      return CURLE_REMOTE_DISK_FULL;

    case LIBSSH2_FX_FILE_ALREADY_EXISTS:
      return CURLE_REMOTE_FILE_EXISTS;

    case LIBSSH2_FX_DIR_NOT_EMPTY:
      return CURLE_QUOTE_ERROR;

    default:
      break;
  }

  return CURLE_SSH;
}

static CURLcode libssh2_session_error_to_CURLE(int err)
{
  switch(err) {
    /* Ordered by order of appearance in libssh2.h */
    case LIBSSH2_ERROR_NONE:
      return CURLE_OK;

    /* This is the error returned by libssh2_scp_recv2
     * on unknown file */
    case LIBSSH2_ERROR_SCP_PROTOCOL:
      return CURLE_REMOTE_FILE_NOT_FOUND;

    case LIBSSH2_ERROR_SOCKET_NONE:
      return CURLE_COULDNT_CONNECT;

    case LIBSSH2_ERROR_ALLOC:
      return CURLE_OUT_OF_MEMORY;

    case LIBSSH2_ERROR_SOCKET_SEND:
      return CURLE_SEND_ERROR;

    case LIBSSH2_ERROR_HOSTKEY_INIT:
    case LIBSSH2_ERROR_HOSTKEY_SIGN:
    case LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED:
    case LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED:
      return CURLE_PEER_FAILED_VERIFICATION;

    case LIBSSH2_ERROR_PASSWORD_EXPIRED:
      return CURLE_LOGIN_DENIED;

    case LIBSSH2_ERROR_SOCKET_TIMEOUT:
    case LIBSSH2_ERROR_TIMEOUT:
      return CURLE_OPERATION_TIMEDOUT;

    case LIBSSH2_ERROR_EAGAIN:
      return CURLE_AGAIN;
  }

  return CURLE_SSH;
}

static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc)
{
  (void)abstract; /* arg not used */
  return malloc(count);
}

static LIBSSH2_REALLOC_FUNC(my_libssh2_realloc)
{
  (void)abstract; /* arg not used */
  return realloc(ptr, count);
}

static LIBSSH2_FREE_FUNC(my_libssh2_free)
{
  (void)abstract; /* arg not used */
  if(ptr) /* ssh2 agent sometimes call free with null ptr */
    free(ptr);
}

/*
 * SSH State machine related code
 */
/* This is the ONLY way to change SSH state! */
static void state(struct connectdata *conn, sshstate nowstate)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
  /* for debug purposes */
  static const char * const names[] = {
    "SSH_STOP",
    "SSH_INIT",
    "SSH_S_STARTUP",
    "SSH_HOSTKEY",
    "SSH_AUTHLIST",
    "SSH_AUTH_PKEY_INIT",
    "SSH_AUTH_PKEY",
    "SSH_AUTH_PASS_INIT",
    "SSH_AUTH_PASS",
    "SSH_AUTH_AGENT_INIT",
    "SSH_AUTH_AGENT_LIST",
    "SSH_AUTH_AGENT",
    "SSH_AUTH_HOST_INIT",
    "SSH_AUTH_HOST",
    "SSH_AUTH_KEY_INIT",
    "SSH_AUTH_KEY",
    "SSH_AUTH_GSSAPI",
    "SSH_AUTH_DONE",
    "SSH_SFTP_INIT",
    "SSH_SFTP_REALPATH",
    "SSH_SFTP_QUOTE_INIT",
    "SSH_SFTP_POSTQUOTE_INIT",
    "SSH_SFTP_QUOTE",
    "SSH_SFTP_NEXT_QUOTE",
    "SSH_SFTP_QUOTE_STAT",
    "SSH_SFTP_QUOTE_SETSTAT",
    "SSH_SFTP_QUOTE_SYMLINK",
    "SSH_SFTP_QUOTE_MKDIR",
    "SSH_SFTP_QUOTE_RENAME",
    "SSH_SFTP_QUOTE_RMDIR",
    "SSH_SFTP_QUOTE_UNLINK",
    "SSH_SFTP_QUOTE_STATVFS",
    "SSH_SFTP_GETINFO",
    "SSH_SFTP_FILETIME",
    "SSH_SFTP_TRANS_INIT",
    "SSH_SFTP_UPLOAD_INIT",
    "SSH_SFTP_CREATE_DIRS_INIT",
    "SSH_SFTP_CREATE_DIRS",
    "SSH_SFTP_CREATE_DIRS_MKDIR",
    "SSH_SFTP_READDIR_INIT",
    "SSH_SFTP_READDIR",
    "SSH_SFTP_READDIR_LINK",
    "SSH_SFTP_READDIR_BOTTOM",
    "SSH_SFTP_READDIR_DONE",
    "SSH_SFTP_DOWNLOAD_INIT",
    "SSH_SFTP_DOWNLOAD_STAT",
    "SSH_SFTP_CLOSE",
    "SSH_SFTP_SHUTDOWN",
    "SSH_SCP_TRANS_INIT",
    "SSH_SCP_UPLOAD_INIT",
    "SSH_SCP_DOWNLOAD_INIT",
    "SSH_SCP_DOWNLOAD",
    "SSH_SCP_DONE",
    "SSH_SCP_SEND_EOF",
    "SSH_SCP_WAIT_EOF",
    "SSH_SCP_WAIT_CLOSE",
    "SSH_SCP_CHANNEL_FREE",
    "SSH_SESSION_DISCONNECT",
    "SSH_SESSION_FREE",
    "QUIT"
  };

  /* a precaution to make sure the lists are in sync */
  DEBUGASSERT(sizeof(names)/sizeof(names[0]) == SSH_LAST);

  if(sshc->state != nowstate) {
    infof(conn->data, "SFTP %p state change from %s to %s\n",
          (void *)sshc, names[sshc->state], names[nowstate]);
  }
#endif

  sshc->state = nowstate;
}


#ifdef HAVE_LIBSSH2_KNOWNHOST_API
static int sshkeycallback(struct Curl_easy *easy,
                          const struct curl_khkey *knownkey, /* known */
                          const struct curl_khkey *foundkey, /* found */
                          enum curl_khmatch match,
                          void *clientp)
{
  (void)easy;
  (void)knownkey;
  (void)foundkey;
  (void)clientp;

  /* we only allow perfect matches, and we reject everything else */
  return (match != CURLKHMATCH_OK)?CURLKHSTAT_REJECT:CURLKHSTAT_FINE;
}
#endif

/*
 * Earlier libssh2 versions didn't have the ability to seek to 64bit positions
 * with 32bit size_t.
 */
#ifdef HAVE_LIBSSH2_SFTP_SEEK64
#define SFTP_SEEK(x,y) libssh2_sftp_seek64(x, (libssh2_uint64_t)y)
#else
#define SFTP_SEEK(x,y) libssh2_sftp_seek(x, (size_t)y)
#endif

/*
 * Earlier libssh2 versions didn't do SCP properly beyond 32bit sizes on 32bit
 * architectures so we check of the necessary function is present.
 */
#ifndef HAVE_LIBSSH2_SCP_SEND64
#define SCP_SEND(a,b,c,d) libssh2_scp_send_ex(a, b, (int)(c), (size_t)d, 0, 0)
#else
#define SCP_SEND(a,b,c,d) libssh2_scp_send64(a, b, (int)(c),            \
                                             (libssh2_uint64_t)d, 0, 0)
#endif

/*
 * libssh2 1.2.8 fixed the problem with 32bit ints used for sockets on win64.
 */
#ifdef HAVE_LIBSSH2_SESSION_HANDSHAKE
#define libssh2_session_startup(x,y) libssh2_session_handshake(x,y)
#endif

static CURLcode ssh_knownhost(struct connectdata *conn)
{
  CURLcode result = CURLE_OK;

#ifdef HAVE_LIBSSH2_KNOWNHOST_API
  struct Curl_easy *data = conn->data;

  if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
    /* we're asked to verify the host against a file */
    struct ssh_conn *sshc = &conn->proto.sshc;
    int rc;
    int keytype;
    size_t keylen;
    const char *remotekey = libssh2_session_hostkey(sshc->ssh_session,
                                                    &keylen, &keytype);
    int keycheck = LIBSSH2_KNOWNHOST_CHECK_FAILURE;
    int keybit = 0;

    if(remotekey) {
      /*
       * A subject to figure out is what host name we need to pass in here.
       * What host name does OpenSSH store in its file if an IDN name is
       * used?
       */
      struct libssh2_knownhost *host;
      enum curl_khmatch keymatch;
      curl_sshkeycallback func =
        data->set.ssh_keyfunc?data->set.ssh_keyfunc:sshkeycallback;
      struct curl_khkey knownkey;
      struct curl_khkey *knownkeyp = NULL;
      struct curl_khkey foundkey;

      keybit = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
        LIBSSH2_KNOWNHOST_KEY_SSHRSA:LIBSSH2_KNOWNHOST_KEY_SSHDSS;

#ifdef HAVE_LIBSSH2_KNOWNHOST_CHECKP
      keycheck = libssh2_knownhost_checkp(sshc->kh,
                                          conn->host.name,
                                          (conn->remote_port != PORT_SSH)?
                                          conn->remote_port:-1,
                                          remotekey, keylen,
                                          LIBSSH2_KNOWNHOST_TYPE_PLAIN|
                                          LIBSSH2_KNOWNHOST_KEYENC_RAW|
                                          keybit,
                                          &host);
#else
      keycheck = libssh2_knownhost_check(sshc->kh,
                                         conn->host.name,
                                         remotekey, keylen,
                                         LIBSSH2_KNOWNHOST_TYPE_PLAIN|
                                         LIBSSH2_KNOWNHOST_KEYENC_RAW|
                                         keybit,
                                         &host);
#endif

      infof(data, "SSH host check: %d, key: %s\n", keycheck,
            (keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?
            host->key:"<none>");

      /* setup 'knownkey' */
      if(keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
        knownkey.key = host->key;
        knownkey.len = 0;
        knownkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
          CURLKHTYPE_RSA : CURLKHTYPE_DSS;
        knownkeyp = &knownkey;
      }

      /* setup 'foundkey' */
      foundkey.key = remotekey;
      foundkey.len = keylen;
      foundkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
        CURLKHTYPE_RSA : CURLKHTYPE_DSS;

      /*
       * if any of the LIBSSH2_KNOWNHOST_CHECK_* defines and the
       * curl_khmatch enum are ever modified, we need to introduce a
       * translation table here!
       */
      keymatch = (enum curl_khmatch)keycheck;

      /* Ask the callback how to behave */
      Curl_set_in_callback(data, true);
      rc = func(data, knownkeyp, /* from the knownhosts file */
                &foundkey, /* from the remote host */
                keymatch, data->set.ssh_keyfunc_userp);
      Curl_set_in_callback(data, false);
    }
    else
      /* no remotekey means failure! */
      rc = CURLKHSTAT_REJECT;

    switch(rc) {
    default: /* unknown return codes will equal reject */
      /* FALLTHROUGH */
    case CURLKHSTAT_REJECT:
      state(conn, SSH_SESSION_FREE);
      /* FALLTHROUGH */
    case CURLKHSTAT_DEFER:
      /* DEFER means bail out but keep the SSH_HOSTKEY state */
      result = sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION;
      break;
    case CURLKHSTAT_FINE:
    case CURLKHSTAT_FINE_ADD_TO_FILE:
      /* proceed */
      if(keycheck != LIBSSH2_KNOWNHOST_CHECK_MATCH) {
        /* the found host+key didn't match but has been told to be fine
           anyway so we add it in memory */
        int addrc = libssh2_knownhost_add(sshc->kh,
                                          conn->host.name, NULL,
                                          remotekey, keylen,
                                          LIBSSH2_KNOWNHOST_TYPE_PLAIN|
                                          LIBSSH2_KNOWNHOST_KEYENC_RAW|
                                          keybit, NULL);
        if(addrc)
          infof(data, "Warning adding the known host %s failed!\n",
                conn->host.name);
        else if(rc == CURLKHSTAT_FINE_ADD_TO_FILE) {
          /* now we write the entire in-memory list of known hosts to the
             known_hosts file */
          int wrc =
            libssh2_knownhost_writefile(sshc->kh,
                                        data->set.str[STRING_SSH_KNOWNHOSTS],
                                        LIBSSH2_KNOWNHOST_FILE_OPENSSH);
          if(wrc) {
            infof(data, "Warning, writing %s failed!\n",
                  data->set.str[STRING_SSH_KNOWNHOSTS]);
          }
        }
      }
      break;
    }
  }
#else /* HAVE_LIBSSH2_KNOWNHOST_API */
  (void)conn;
#endif
  return result;
}

static CURLcode ssh_check_fingerprint(struct connectdata *conn)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  struct Curl_easy *data = conn->data;
  const char *pubkey_md5 = data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5];
  char md5buffer[33];

  const char *fingerprint = libssh2_hostkey_hash(sshc->ssh_session,
      LIBSSH2_HOSTKEY_HASH_MD5);

  if(fingerprint) {
    /* The fingerprint points to static storage (!), don't free() it. */
    int i;
    for(i = 0; i < 16; i++)
      msnprintf(&md5buffer[i*2], 3, "%02x", (unsigned char) fingerprint[i]);
    infof(data, "SSH MD5 fingerprint: %s\n", md5buffer);
  }

  /* Before we authenticate we check the hostkey's MD5 fingerprint
   * against a known fingerprint, if available.
   */
  if(pubkey_md5 && strlen(pubkey_md5) == 32) {
    if(!fingerprint || !strcasecompare(md5buffer, pubkey_md5)) {
      if(fingerprint)
        failf(data,
            "Denied establishing ssh session: mismatch md5 fingerprint. "
            "Remote %s is not equal to %s", md5buffer, pubkey_md5);
      else
        failf(data,
            "Denied establishing ssh session: md5 fingerprint not available");
      state(conn, SSH_SESSION_FREE);
      sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION;
      return sshc->actualcode;
    }
    infof(data, "MD5 checksum match!\n");
    /* as we already matched, we skip the check for known hosts */
    return CURLE_OK;
  }
  return ssh_knownhost(conn);
}

/*
 * ssh_statemach_act() runs the SSH state machine as far as it can without
 * blocking and without reaching the end.  The data the pointer 'block' points
 * to will be set to TRUE if the libssh2 function returns LIBSSH2_ERROR_EAGAIN
 * meaning it wants to be called again when the socket is ready
 */

static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
{
  CURLcode result = CURLE_OK;
  struct Curl_easy *data = conn->data;
  struct SSHPROTO *sftp_scp = data->req.protop;
  struct ssh_conn *sshc = &conn->proto.sshc;
  curl_socket_t sock = conn->sock[FIRSTSOCKET];
  char *new_readdir_line;
  int rc = LIBSSH2_ERROR_NONE;
  int err;
  int seekerr = CURL_SEEKFUNC_OK;
  *block = 0; /* we're not blocking by default */

  do {

    switch(sshc->state) {
    case SSH_INIT:
      sshc->secondCreateDirs = 0;
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = CURLE_OK;

      /* Set libssh2 to non-blocking, since everything internally is
         non-blocking */
      libssh2_session_set_blocking(sshc->ssh_session, 0);

      state(conn, SSH_S_STARTUP);
      /* FALLTHROUGH */

    case SSH_S_STARTUP:
      rc = libssh2_session_startup(sshc->ssh_session, (int)sock);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc) {
        char *err_msg = NULL;
        (void)libssh2_session_last_error(sshc->ssh_session, &err_msg, NULL, 0);
        failf(data, "Failure establishing ssh session: %d, %s", rc, err_msg);

        state(conn, SSH_SESSION_FREE);
        sshc->actualcode = CURLE_FAILED_INIT;
        break;
      }

      state(conn, SSH_HOSTKEY);

      /* FALLTHROUGH */
    case SSH_HOSTKEY:
      /*
       * Before we authenticate we should check the hostkey's fingerprint
       * against our known hosts. How that is handled (reading from file,
       * whatever) is up to us.
       */
      result = ssh_check_fingerprint(conn);
      if(!result)
        state(conn, SSH_AUTHLIST);
      /* ssh_check_fingerprint sets state appropriately on error */
      break;

    case SSH_AUTHLIST:
      /*
       * Figure out authentication methods
       * NB: As soon as we have provided a username to an openssh server we
       * must never change it later. Thus, always specify the correct username
       * here, even though the libssh2 docs kind of indicate that it should be
       * possible to get a 'generic' list (not user-specific) of authentication
       * methods, presumably with a blank username. That won't work in my
       * experience.
       * So always specify it here.
       */
      sshc->authlist = libssh2_userauth_list(sshc->ssh_session,
                                             conn->user,
                                             curlx_uztoui(strlen(conn->user)));

      if(!sshc->authlist) {
        if(libssh2_userauth_authenticated(sshc->ssh_session)) {
          sshc->authed = TRUE;
          infof(data, "SSH user accepted with no authentication\n");
          state(conn, SSH_AUTH_DONE);
          break;
        }
        err = libssh2_session_last_errno(sshc->ssh_session);
        if(err == LIBSSH2_ERROR_EAGAIN)
          rc = LIBSSH2_ERROR_EAGAIN;
        else {
          state(conn, SSH_SESSION_FREE);
          sshc->actualcode = libssh2_session_error_to_CURLE(err);
        }
        break;
      }
      infof(data, "SSH authentication methods available: %s\n",
            sshc->authlist);

      state(conn, SSH_AUTH_PKEY_INIT);
      break;

    case SSH_AUTH_PKEY_INIT:
      /*
       * Check the supported auth types in the order I feel is most secure
       * with the requested type of authentication
       */
      sshc->authed = FALSE;

      if((data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY) &&
         (strstr(sshc->authlist, "publickey") != NULL)) {
        bool out_of_memory = FALSE;

        sshc->rsa_pub = sshc->rsa = NULL;

        if(data->set.str[STRING_SSH_PRIVATE_KEY])
          sshc->rsa = strdup(data->set.str[STRING_SSH_PRIVATE_KEY]);
        else {
          /* To ponder about: should really the lib be messing about with the
             HOME environment variable etc? */
          char *home = curl_getenv("HOME");

          /* If no private key file is specified, try some common paths. */
          if(home) {
            /* Try ~/.ssh first. */
            sshc->rsa = aprintf("%s/.ssh/id_rsa", home);
            if(!sshc->rsa)
              out_of_memory = TRUE;
            else if(access(sshc->rsa, R_OK) != 0) {
              Curl_safefree(sshc->rsa);
              sshc->rsa = aprintf("%s/.ssh/id_dsa", home);
              if(!sshc->rsa)
                out_of_memory = TRUE;
              else if(access(sshc->rsa, R_OK) != 0) {
                Curl_safefree(sshc->rsa);
              }
            }
            free(home);
          }
          if(!out_of_memory && !sshc->rsa) {
            /* Nothing found; try the current dir. */
            sshc->rsa = strdup("id_rsa");
            if(sshc->rsa && access(sshc->rsa, R_OK) != 0) {
              Curl_safefree(sshc->rsa);
              sshc->rsa = strdup("id_dsa");
              if(sshc->rsa && access(sshc->rsa, R_OK) != 0) {
                Curl_safefree(sshc->rsa);
                /* Out of guesses. Set to the empty string to avoid
                 * surprising info messages. */
                sshc->rsa = strdup("");
              }
            }
          }
        }

        /*
         * Unless the user explicitly specifies a public key file, let
         * libssh2 extract the public key from the private key file.
         * This is done by simply passing sshc->rsa_pub = NULL.
         */
        if(data->set.str[STRING_SSH_PUBLIC_KEY]
           /* treat empty string the same way as NULL */
           && data->set.str[STRING_SSH_PUBLIC_KEY][0]) {
          sshc->rsa_pub = strdup(data->set.str[STRING_SSH_PUBLIC_KEY]);
          if(!sshc->rsa_pub)
            out_of_memory = TRUE;
        }

        if(out_of_memory || sshc->rsa == NULL) {
          Curl_safefree(sshc->rsa);
          Curl_safefree(sshc->rsa_pub);
          state(conn, SSH_SESSION_FREE);
          sshc->actualcode = CURLE_OUT_OF_MEMORY;
          break;
        }

        sshc->passphrase = data->set.ssl.key_passwd;
        if(!sshc->passphrase)
          sshc->passphrase = "";

        if(sshc->rsa_pub)
          infof(data, "Using SSH public key file '%s'\n", sshc->rsa_pub);
        infof(data, "Using SSH private key file '%s'\n", sshc->rsa);

        state(conn, SSH_AUTH_PKEY);
      }
      else {
        state(conn, SSH_AUTH_PASS_INIT);
      }
      break;

    case SSH_AUTH_PKEY:
      /* The function below checks if the files exists, no need to stat() here.
       */
      rc = libssh2_userauth_publickey_fromfile_ex(sshc->ssh_session,
                                                  conn->user,
                                                  curlx_uztoui(
                                                    strlen(conn->user)),
                                                  sshc->rsa_pub,
                                                  sshc->rsa, sshc->passphrase);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }

      Curl_safefree(sshc->rsa_pub);
      Curl_safefree(sshc->rsa);

      if(rc == 0) {
        sshc->authed = TRUE;
        infof(data, "Initialized SSH public key authentication\n");
        state(conn, SSH_AUTH_DONE);
      }
      else {
        char *err_msg = NULL;
        (void)libssh2_session_last_error(sshc->ssh_session,
                                         &err_msg, NULL, 0);
        infof(data, "SSH public key authentication failed: %s\n", err_msg);
        state(conn, SSH_AUTH_PASS_INIT);
        rc = 0; /* clear rc and continue */
      }
      break;

    case SSH_AUTH_PASS_INIT:
      if((data->set.ssh_auth_types & CURLSSH_AUTH_PASSWORD) &&
         (strstr(sshc->authlist, "password") != NULL)) {
        state(conn, SSH_AUTH_PASS);
      }
      else {
        state(conn, SSH_AUTH_HOST_INIT);
        rc = 0; /* clear rc and continue */
      }
      break;

    case SSH_AUTH_PASS:
      rc = libssh2_userauth_password_ex(sshc->ssh_session, conn->user,
                                        curlx_uztoui(strlen(conn->user)),
                                        conn->passwd,
                                        curlx_uztoui(strlen(conn->passwd)),
                                        NULL);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc == 0) {
        sshc->authed = TRUE;
        infof(data, "Initialized password authentication\n");
        state(conn, SSH_AUTH_DONE);
      }
      else {
        state(conn, SSH_AUTH_HOST_INIT);
        rc = 0; /* clear rc and continue */
      }
      break;

    case SSH_AUTH_HOST_INIT:
      if((data->set.ssh_auth_types & CURLSSH_AUTH_HOST) &&
         (strstr(sshc->authlist, "hostbased") != NULL)) {
        state(conn, SSH_AUTH_HOST);
      }
      else {
        state(conn, SSH_AUTH_AGENT_INIT);
      }
      break;

    case SSH_AUTH_HOST:
      state(conn, SSH_AUTH_AGENT_INIT);
      break;

    case SSH_AUTH_AGENT_INIT:
#ifdef HAVE_LIBSSH2_AGENT_API
      if((data->set.ssh_auth_types & CURLSSH_AUTH_AGENT)
         && (strstr(sshc->authlist, "publickey") != NULL)) {

        /* Connect to the ssh-agent */
        /* The agent could be shared by a curl thread i believe
           but nothing obvious as keys can be added/removed at any time */
        if(!sshc->ssh_agent) {
          sshc->ssh_agent = libssh2_agent_init(sshc->ssh_session);
          if(!sshc->ssh_agent) {
            infof(data, "Could not create agent object\n");

            state(conn, SSH_AUTH_KEY_INIT);
            break;
          }
        }

        rc = libssh2_agent_connect(sshc->ssh_agent);
        if(rc == LIBSSH2_ERROR_EAGAIN)
          break;
        if(rc < 0) {
          infof(data, "Failure connecting to agent\n");
          state(conn, SSH_AUTH_KEY_INIT);
          rc = 0; /* clear rc and continue */
        }
        else {
          state(conn, SSH_AUTH_AGENT_LIST);
        }
      }
      else
#endif /* HAVE_LIBSSH2_AGENT_API */
        state(conn, SSH_AUTH_KEY_INIT);
      break;

    case SSH_AUTH_AGENT_LIST:
#ifdef HAVE_LIBSSH2_AGENT_API
      rc = libssh2_agent_list_identities(sshc->ssh_agent);

      if(rc == LIBSSH2_ERROR_EAGAIN)
        break;
      if(rc < 0) {
        infof(data, "Failure requesting identities to agent\n");
        state(conn, SSH_AUTH_KEY_INIT);
        rc = 0; /* clear rc and continue */
      }
      else {
        state(conn, SSH_AUTH_AGENT);
        sshc->sshagent_prev_identity = NULL;
      }
#endif
      break;

    case SSH_AUTH_AGENT:
#ifdef HAVE_LIBSSH2_AGENT_API
      /* as prev_identity evolves only after an identity user auth finished we
         can safely request it again as long as EAGAIN is returned here or by
         libssh2_agent_userauth */
      rc = libssh2_agent_get_identity(sshc->ssh_agent,
                                      &sshc->sshagent_identity,
                                      sshc->sshagent_prev_identity);
      if(rc == LIBSSH2_ERROR_EAGAIN)
        break;

      if(rc == 0) {
        rc = libssh2_agent_userauth(sshc->ssh_agent, conn->user,
                                    sshc->sshagent_identity);

        if(rc < 0) {
          if(rc != LIBSSH2_ERROR_EAGAIN) {
            /* tried and failed? go to next identity */
            sshc->sshagent_prev_identity = sshc->sshagent_identity;
          }
          break;
        }
      }

      if(rc < 0)
        infof(data, "Failure requesting identities to agent\n");
      else if(rc == 1)
        infof(data, "No identity would match\n");

      if(rc == LIBSSH2_ERROR_NONE) {
        sshc->authed = TRUE;
        infof(data, "Agent based authentication successful\n");
        state(conn, SSH_AUTH_DONE);
      }
      else {
        state(conn, SSH_AUTH_KEY_INIT);
        rc = 0; /* clear rc and continue */
      }
#endif
      break;

    case SSH_AUTH_KEY_INIT:
      if((data->set.ssh_auth_types & CURLSSH_AUTH_KEYBOARD)
         && (strstr(sshc->authlist, "keyboard-interactive") != NULL)) {
        state(conn, SSH_AUTH_KEY);
      }
      else {
        state(conn, SSH_AUTH_DONE);
      }
      break;

    case SSH_AUTH_KEY:
      /* Authentication failed. Continue with keyboard-interactive now. */
      rc = libssh2_userauth_keyboard_interactive_ex(sshc->ssh_session,
                                                    conn->user,
                                                    curlx_uztoui(
                                                      strlen(conn->user)),
                                                    &kbd_callback);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc == 0) {
        sshc->authed = TRUE;
        infof(data, "Initialized keyboard interactive authentication\n");
      }
      state(conn, SSH_AUTH_DONE);
      break;

    case SSH_AUTH_DONE:
      if(!sshc->authed) {
        failf(data, "Authentication failure");
        state(conn, SSH_SESSION_FREE);
        sshc->actualcode = CURLE_LOGIN_DENIED;
        break;
      }

      /*
       * At this point we have an authenticated ssh session.
       */
      infof(data, "Authentication complete\n");

      Curl_pgrsTime(conn->data, TIMER_APPCONNECT); /* SSH is connected */

      conn->sockfd = sock;
      conn->writesockfd = CURL_SOCKET_BAD;

      if(conn->handler->protocol == CURLPROTO_SFTP) {
        state(conn, SSH_SFTP_INIT);
        break;
      }
      infof(data, "SSH CONNECT phase done\n");
      state(conn, SSH_STOP);
      break;

    case SSH_SFTP_INIT:
      /*
       * Start the libssh2 sftp session
       */
      sshc->sftp_session = libssh2_sftp_init(sshc->ssh_session);
      if(!sshc->sftp_session) {
        char *err_msg = NULL;
        if(libssh2_session_last_errno(sshc->ssh_session) ==
           LIBSSH2_ERROR_EAGAIN) {
          rc = LIBSSH2_ERROR_EAGAIN;
          break;
        }

        (void)libssh2_session_last_error(sshc->ssh_session,
                                         &err_msg, NULL, 0);
        failf(data, "Failure initializing sftp session: %s", err_msg);
        state(conn, SSH_SESSION_FREE);
        sshc->actualcode = CURLE_FAILED_INIT;
        break;
      }
      state(conn, SSH_SFTP_REALPATH);
      break;

    case SSH_SFTP_REALPATH:
    {
      char tempHome[PATH_MAX];

      /*
       * Get the "home" directory
       */
      rc = sftp_libssh2_realpath(sshc->sftp_session, ".",
                                 tempHome, PATH_MAX-1);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc > 0) {
        /* It seems that this string is not always NULL terminated */
        tempHome[rc] = '\0';
        sshc->homedir = strdup(tempHome);
        if(!sshc->homedir) {
          state(conn, SSH_SFTP_CLOSE);
          sshc->actualcode = CURLE_OUT_OF_MEMORY;
          break;
        }
        conn->data->state.most_recent_ftp_entrypath = sshc->homedir;
      }
      else {
        /* Return the error type */
        err = sftp_libssh2_last_error(sshc->sftp_session);
        if(err)
          result = sftp_libssh2_error_to_CURLE(err);
        else
          /* in this case, the error wasn't in the SFTP level but for example
             a time-out or similar */
          result = CURLE_SSH;
        sshc->actualcode = result;
        DEBUGF(infof(data, "error = %d makes libcurl = %d\n",
                     err, (int)result));
        state(conn, SSH_STOP);
        break;
      }
    }
    /* This is the last step in the SFTP connect phase. Do note that while
       we get the homedir here, we get the "workingpath" in the DO action
       since the homedir will remain the same between request but the
       working path will not. */
    DEBUGF(infof(data, "SSH CONNECT phase done\n"));
    state(conn, SSH_STOP);
    break;

    case SSH_SFTP_QUOTE_INIT:

      result = Curl_getworkingpath(conn, sshc->homedir, &sftp_scp->path);
      if(result) {
        sshc->actualcode = result;
        state(conn, SSH_STOP);
        break;
      }

      if(data->set.quote) {
        infof(data, "Sending quote commands\n");
        sshc->quote_item = data->set.quote;
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        state(conn, SSH_SFTP_GETINFO);
      }
      break;

    case SSH_SFTP_POSTQUOTE_INIT:
      if(data->set.postquote) {
        infof(data, "Sending quote commands\n");
        sshc->quote_item = data->set.postquote;
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        state(conn, SSH_STOP);
      }
      break;

    case SSH_SFTP_QUOTE:
      /* Send any quote commands */
    {
      const char *cp;

      /*
       * Support some of the "FTP" commands
       *
       * 'sshc->quote_item' is already verified to be non-NULL before it
       * switched to this state.
       */
      char *cmd = sshc->quote_item->data;
      sshc->acceptfail = FALSE;

      /* if a command starts with an asterisk, which a legal SFTP command never
         can, the command will be allowed to fail without it causing any
         aborts or cancels etc. It will cause libcurl to act as if the command
         is successful, whatever the server reponds. */

      if(cmd[0] == '*') {
        cmd++;
        sshc->acceptfail = TRUE;
      }

      if(strcasecompare("pwd", cmd)) {
        /* output debug output if that is requested */
        char *tmp = aprintf("257 \"%s\" is current directory.\n",
                            sftp_scp->path);
        if(!tmp) {
          result = CURLE_OUT_OF_MEMORY;
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          break;
        }
        if(data->set.verbose) {
          Curl_debug(data, CURLINFO_HEADER_OUT, (char *)"PWD\n", 4);
          Curl_debug(data, CURLINFO_HEADER_IN, tmp, strlen(tmp));
        }
        /* this sends an FTP-like "header" to the header callback so that the
           current directory can be read very similar to how it is read when
           using ordinary FTP. */
        result = Curl_client_write(conn, CLIENTWRITE_HEADER, tmp, strlen(tmp));
        free(tmp);
        if(result) {
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = result;
        }
        else
          state(conn, SSH_SFTP_NEXT_QUOTE);
        break;
      }
      {
        /*
         * the arguments following the command must be separated from the
         * command with a space so we can check for it unconditionally
         */
        cp = strchr(cmd, ' ');
        if(cp == NULL) {
          failf(data, "Syntax error in SFTP command. Supply parameter(s)!");
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = CURLE_QUOTE_ERROR;
          break;
        }

        /*
         * also, every command takes at least one argument so we get that
         * first argument right now
         */
        result = Curl_get_pathname(&cp, &sshc->quote_path1, sshc->homedir);
        if(result) {
          if(result == CURLE_OUT_OF_MEMORY)
            failf(data, "Out of memory");
          else
            failf(data, "Syntax error: Bad first parameter");
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = result;
          break;
        }

        /*
         * SFTP is a binary protocol, so we don't send text commands
         * to the server. Instead, we scan for commands used by
         * OpenSSH's sftp program and call the appropriate libssh2
         * functions.
         */
        if(strncasecompare(cmd, "chgrp ", 6) ||
           strncasecompare(cmd, "chmod ", 6) ||
           strncasecompare(cmd, "chown ", 6) ) {
          /* attribute change */

          /* sshc->quote_path1 contains the mode to set */
          /* get the destination */
          result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
          if(result) {
            if(result == CURLE_OUT_OF_MEMORY)
              failf(data, "Out of memory");
            else
              failf(data, "Syntax error in chgrp/chmod/chown: "
                    "Bad second parameter");
            Curl_safefree(sshc->quote_path1);
            state(conn, SSH_SFTP_CLOSE);
            sshc->nextstate = SSH_NO_STATE;
            sshc->actualcode = result;
            break;
          }
          memset(&sshc->quote_attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES));
          state(conn, SSH_SFTP_QUOTE_STAT);
          break;
        }
        if(strncasecompare(cmd, "ln ", 3) ||
           strncasecompare(cmd, "symlink ", 8)) {
          /* symbolic linking */
          /* sshc->quote_path1 is the source */
          /* get the destination */
          result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
          if(result) {
            if(result == CURLE_OUT_OF_MEMORY)
              failf(data, "Out of memory");
            else
              failf(data,
                    "Syntax error in ln/symlink: Bad second parameter");
            Curl_safefree(sshc->quote_path1);
            state(conn, SSH_SFTP_CLOSE);
            sshc->nextstate = SSH_NO_STATE;
            sshc->actualcode = result;
            break;
          }
          state(conn, SSH_SFTP_QUOTE_SYMLINK);
          break;
        }
        else if(strncasecompare(cmd, "mkdir ", 6)) {
          /* create dir */
          state(conn, SSH_SFTP_QUOTE_MKDIR);
          break;
        }
        else if(strncasecompare(cmd, "rename ", 7)) {
          /* rename file */
          /* first param is the source path */
          /* second param is the dest. path */
          result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
          if(result) {
            if(result == CURLE_OUT_OF_MEMORY)
              failf(data, "Out of memory");
            else
              failf(data, "Syntax error in rename: Bad second parameter");
            Curl_safefree(sshc->quote_path1);
            state(conn, SSH_SFTP_CLOSE);
            sshc->nextstate = SSH_NO_STATE;
            sshc->actualcode = result;
            break;
          }
          state(conn, SSH_SFTP_QUOTE_RENAME);
          break;
        }
        else if(strncasecompare(cmd, "rmdir ", 6)) {
          /* delete dir */
          state(conn, SSH_SFTP_QUOTE_RMDIR);
          break;
        }
        else if(strncasecompare(cmd, "rm ", 3)) {
          state(conn, SSH_SFTP_QUOTE_UNLINK);
          break;
        }
#ifdef HAS_STATVFS_SUPPORT
        else if(strncasecompare(cmd, "statvfs ", 8)) {
          state(conn, SSH_SFTP_QUOTE_STATVFS);
          break;
        }
#endif

        failf(data, "Unknown SFTP command");
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
    }
    break;

    case SSH_SFTP_NEXT_QUOTE:
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);

      sshc->quote_item = sshc->quote_item->next;

      if(sshc->quote_item) {
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        if(sshc->nextstate != SSH_NO_STATE) {
          state(conn, sshc->nextstate);
          sshc->nextstate = SSH_NO_STATE;
        }
        else {
          state(conn, SSH_SFTP_GETINFO);
        }
      }
      break;

    case SSH_SFTP_QUOTE_STAT:
    {
      char *cmd = sshc->quote_item->data;
      sshc->acceptfail = FALSE;

      /* if a command starts with an asterisk, which a legal SFTP command never
         can, the command will be allowed to fail without it causing any
         aborts or cancels etc. It will cause libcurl to act as if the command
         is successful, whatever the server reponds. */

      if(cmd[0] == '*') {
        cmd++;
        sshc->acceptfail = TRUE;
      }

      if(!strncasecompare(cmd, "chmod", 5)) {
        /* Since chown and chgrp only set owner OR group but libssh2 wants to
         * set them both at once, we need to obtain the current ownership
         * first.  This takes an extra protocol round trip.
         */
        rc = libssh2_sftp_stat_ex(sshc->sftp_session, sshc->quote_path2,
                                  curlx_uztoui(strlen(sshc->quote_path2)),
                                  LIBSSH2_SFTP_STAT,
                                  &sshc->quote_attrs);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc != 0 && !sshc->acceptfail) { /* get those attributes */
          err = sftp_libssh2_last_error(sshc->sftp_session);
          Curl_safefree(sshc->quote_path1);
          Curl_safefree(sshc->quote_path2);
          failf(data, "Attempt to get SFTP stats failed: %s",
                sftp_libssh2_strerror(err));
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = CURLE_QUOTE_ERROR;
          break;
        }
      }

      /* Now set the new attributes... */
      if(strncasecompare(cmd, "chgrp", 5)) {
        sshc->quote_attrs.gid = strtoul(sshc->quote_path1, NULL, 10);
        sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_UIDGID;
        if(sshc->quote_attrs.gid == 0 && !ISDIGIT(sshc->quote_path1[0]) &&
           !sshc->acceptfail) {
          Curl_safefree(sshc->quote_path1);
          Curl_safefree(sshc->quote_path2);
          failf(data, "Syntax error: chgrp gid not a number");
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = CURLE_QUOTE_ERROR;
          break;
        }
      }
      else if(strncasecompare(cmd, "chmod", 5)) {
        sshc->quote_attrs.permissions = strtoul(sshc->quote_path1, NULL, 8);
        sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_PERMISSIONS;
        /* permissions are octal */
        if(sshc->quote_attrs.permissions == 0 &&
           !ISDIGIT(sshc->quote_path1[0])) {
          Curl_safefree(sshc->quote_path1);
          Curl_safefree(sshc->quote_path2);
          failf(data, "Syntax error: chmod permissions not a number");
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = CURLE_QUOTE_ERROR;
          break;
        }
      }
      else if(strncasecompare(cmd, "chown", 5)) {
        sshc->quote_attrs.uid = strtoul(sshc->quote_path1, NULL, 10);
        sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_UIDGID;
        if(sshc->quote_attrs.uid == 0 && !ISDIGIT(sshc->quote_path1[0]) &&
           !sshc->acceptfail) {
          Curl_safefree(sshc->quote_path1);
          Curl_safefree(sshc->quote_path2);
          failf(data, "Syntax error: chown uid not a number");
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = CURLE_QUOTE_ERROR;
          break;
        }
      }

      /* Now send the completed structure... */
      state(conn, SSH_SFTP_QUOTE_SETSTAT);
      break;
    }

    case SSH_SFTP_QUOTE_SETSTAT:
      rc = libssh2_sftp_stat_ex(sshc->sftp_session, sshc->quote_path2,
                                curlx_uztoui(strlen(sshc->quote_path2)),
                                LIBSSH2_SFTP_SETSTAT,
                                &sshc->quote_attrs);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "Attempt to set SFTP stats failed: %s",
              sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_SYMLINK:
      rc = libssh2_sftp_symlink_ex(sshc->sftp_session, sshc->quote_path1,
                                   curlx_uztoui(strlen(sshc->quote_path1)),
                                   sshc->quote_path2,
                                   curlx_uztoui(strlen(sshc->quote_path2)),
                                   LIBSSH2_SFTP_SYMLINK);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "symlink command failed: %s",
              sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_MKDIR:
      rc = libssh2_sftp_mkdir_ex(sshc->sftp_session, sshc->quote_path1,
                                 curlx_uztoui(strlen(sshc->quote_path1)),
                                 data->set.new_directory_perms);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        failf(data, "mkdir command failed: %s", sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_RENAME:
      rc = libssh2_sftp_rename_ex(sshc->sftp_session, sshc->quote_path1,
                                  curlx_uztoui(strlen(sshc->quote_path1)),
                                  sshc->quote_path2,
                                  curlx_uztoui(strlen(sshc->quote_path2)),
                                  LIBSSH2_SFTP_RENAME_OVERWRITE |
                                  LIBSSH2_SFTP_RENAME_ATOMIC |
                                  LIBSSH2_SFTP_RENAME_NATIVE);

      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "rename command failed: %s", sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_RMDIR:
      rc = libssh2_sftp_rmdir_ex(sshc->sftp_session, sshc->quote_path1,
                                 curlx_uztoui(strlen(sshc->quote_path1)));
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        failf(data, "rmdir command failed: %s", sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_UNLINK:
      rc = libssh2_sftp_unlink_ex(sshc->sftp_session, sshc->quote_path1,
                                  curlx_uztoui(strlen(sshc->quote_path1)));
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        failf(data, "rm command failed: %s", sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

#ifdef HAS_STATVFS_SUPPORT
    case SSH_SFTP_QUOTE_STATVFS:
    {
      LIBSSH2_SFTP_STATVFS statvfs;
      rc = libssh2_sftp_statvfs(sshc->sftp_session, sshc->quote_path1,
                                curlx_uztoui(strlen(sshc->quote_path1)),
                                &statvfs);

      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        failf(data, "statvfs command failed: %s", sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      else if(rc == 0) {
        char *tmp = aprintf("statvfs:\n"
                            "f_bsize: %llu\n" "f_frsize: %llu\n"
                            "f_blocks: %llu\n" "f_bfree: %llu\n"
                            "f_bavail: %llu\n" "f_files: %llu\n"
                            "f_ffree: %llu\n" "f_favail: %llu\n"
                            "f_fsid: %llu\n" "f_flag: %llu\n"
                            "f_namemax: %llu\n",
                            statvfs.f_bsize, statvfs.f_frsize,
                            statvfs.f_blocks, statvfs.f_bfree,
                            statvfs.f_bavail, statvfs.f_files,
                            statvfs.f_ffree, statvfs.f_favail,
                            statvfs.f_fsid, statvfs.f_flag,
                            statvfs.f_namemax);
        if(!tmp) {
          result = CURLE_OUT_OF_MEMORY;
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          break;
        }

        result = Curl_client_write(conn, CLIENTWRITE_HEADER, tmp, strlen(tmp));
        free(tmp);
        if(result) {
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = result;
        }
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;
    }
#endif
    case SSH_SFTP_GETINFO:
    {
      if(data->set.get_filetime) {
        state(conn, SSH_SFTP_FILETIME);
      }
      else {
        state(conn, SSH_SFTP_TRANS_INIT);
      }
      break;
    }

    case SSH_SFTP_FILETIME:
    {
      LIBSSH2_SFTP_ATTRIBUTES attrs;

      rc = libssh2_sftp_stat_ex(sshc->sftp_session, sftp_scp->path,
                                curlx_uztoui(strlen(sftp_scp->path)),
                                LIBSSH2_SFTP_STAT, &attrs);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc == 0) {
        data->info.filetime = attrs.mtime;
      }

      state(conn, SSH_SFTP_TRANS_INIT);
      break;
    }

    case SSH_SFTP_TRANS_INIT:
      if(data->set.upload)
        state(conn, SSH_SFTP_UPLOAD_INIT);
      else {
        if(sftp_scp->path[strlen(sftp_scp->path)-1] == '/')
          state(conn, SSH_SFTP_READDIR_INIT);
        else
          state(conn, SSH_SFTP_DOWNLOAD_INIT);
      }
      break;

    case SSH_SFTP_UPLOAD_INIT:
    {
      unsigned long flags;
      /*
       * NOTE!!!  libssh2 requires that the destination path is a full path
       *          that includes the destination file and name OR ends in a "/"
       *          If this is not done the destination file will be named the
       *          same name as the last directory in the path.
       */

      if(data->state.resume_from != 0) {
        LIBSSH2_SFTP_ATTRIBUTES attrs;
        if(data->state.resume_from < 0) {
          rc = libssh2_sftp_stat_ex(sshc->sftp_session, sftp_scp->path,
                                    curlx_uztoui(strlen(sftp_scp->path)),
                                    LIBSSH2_SFTP_STAT, &attrs);
          if(rc == LIBSSH2_ERROR_EAGAIN) {
            break;
          }
          if(rc) {
            data->state.resume_from = 0;
          }
          else {
            curl_off_t size = attrs.filesize;
            if(size < 0) {
              failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
              return CURLE_BAD_DOWNLOAD_RESUME;
            }
            data->state.resume_from = attrs.filesize;
          }
        }
      }

      if(data->set.ftp_append)
        /* Try to open for append, but create if nonexisting */
        flags = LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_APPEND;
      else if(data->state.resume_from > 0)
        /* If we have restart position then open for append */
        flags = LIBSSH2_FXF_WRITE|LIBSSH2_FXF_APPEND;
      else
        /* Clear file before writing (normal behaviour) */
        flags = LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC;

      sshc->sftp_handle =
        libssh2_sftp_open_ex(sshc->sftp_session, sftp_scp->path,
                             curlx_uztoui(strlen(sftp_scp->path)),
                             flags, data->set.new_file_perms,
                             LIBSSH2_SFTP_OPENFILE);

      if(!sshc->sftp_handle) {
        rc = libssh2_session_last_errno(sshc->ssh_session);

        if(LIBSSH2_ERROR_EAGAIN == rc)
          break;

        if(LIBSSH2_ERROR_SFTP_PROTOCOL == rc)
          /* only when there was an SFTP protocol error can we extract
             the sftp error! */
          err = sftp_libssh2_last_error(sshc->sftp_session);
        else
          err = -1; /* not an sftp error at all */

        if(sshc->secondCreateDirs) {
          state(conn, SSH_SFTP_CLOSE);
          sshc->actualcode = err>= LIBSSH2_FX_OK?
            sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
          failf(data, "Creating the dir/file failed: %s",
                sftp_libssh2_strerror(err));
          break;
        }
        if(((err == LIBSSH2_FX_NO_SUCH_FILE) ||
            (err == LIBSSH2_FX_FAILURE) ||
            (err == LIBSSH2_FX_NO_SUCH_PATH)) &&
           (data->set.ftp_create_missing_dirs &&
            (strlen(sftp_scp->path) > 1))) {
          /* try to create the path remotely */
          rc = 0; /* clear rc and continue */
          sshc->secondCreateDirs = 1;
          state(conn, SSH_SFTP_CREATE_DIRS_INIT);
          break;
        }
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = err>= LIBSSH2_FX_OK?
          sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
        if(!sshc->actualcode) {
          /* Sometimes, for some reason libssh2_sftp_last_error() returns
             zero even though libssh2_sftp_open() failed previously! We need
             to work around that! */
          sshc->actualcode = CURLE_SSH;
          err = -1;
        }
        failf(data, "Upload failed: %s (%d/%d)",
              err>= LIBSSH2_FX_OK?sftp_libssh2_strerror(err):"ssh error",
              err, rc);
        break;
      }

      /* If we have a restart point then we need to seek to the correct
         position. */
      if(data->state.resume_from > 0) {
        /* Let's read off the proper amount of bytes from the input. */
        if(conn->seek_func) {
          Curl_set_in_callback(data, true);
          seekerr = conn->seek_func(conn->seek_client, data->state.resume_from,
                                    SEEK_SET);
          Curl_set_in_callback(data, false);
        }

        if(seekerr != CURL_SEEKFUNC_OK) {
          curl_off_t passed = 0;

          if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
            failf(data, "Could not seek stream");
            return CURLE_FTP_COULDNT_USE_REST;
          }
          /* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
          do {
            size_t readthisamountnow =
              (data->state.resume_from - passed > data->set.buffer_size) ?
              (size_t)data->set.buffer_size :
              curlx_sotouz(data->state.resume_from - passed);

            size_t actuallyread;
            Curl_set_in_callback(data, true);
            actuallyread = data->state.fread_func(data->state.buffer, 1,
                                                  readthisamountnow,
                                                  data->state.in);
            Curl_set_in_callback(data, false);

            passed += actuallyread;
            if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
              /* this checks for greater-than only to make sure that the
                 CURL_READFUNC_ABORT return code still aborts */
              failf(data, "Failed to read data");
              return CURLE_FTP_COULDNT_USE_REST;
            }
          } while(passed < data->state.resume_from);
        }

        /* now, decrease the size of the read */
        if(data->state.infilesize > 0) {
          data->state.infilesize -= data->state.resume_from;
          data->req.size = data->state.infilesize;
          Curl_pgrsSetUploadSize(data, data->state.infilesize);
        }

        SFTP_SEEK(sshc->sftp_handle, data->state.resume_from);
      }
      if(data->state.infilesize > 0) {
        data->req.size = data->state.infilesize;
        Curl_pgrsSetUploadSize(data, data->state.infilesize);
      }
      /* upload data */
      Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);

      /* not set by Curl_setup_transfer to preserve keepon bits */
      conn->sockfd = conn->writesockfd;

      if(result) {
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = result;
      }
      else {
        /* store this original bitmask setup to use later on if we can't
           figure out a "real" bitmask */
        sshc->orig_waitfor = data->req.keepon;

        /* we want to use the _sending_ function even when the socket turns
           out readable as the underlying libssh2 sftp send function will deal
           with both accordingly */
        conn->cselect_bits = CURL_CSELECT_OUT;

        /* since we don't really wait for anything at this point, we want the
           state machine to move on as soon as possible so we set a very short
           timeout here */
        Curl_expire(data, 0, EXPIRE_RUN_NOW);

        state(conn, SSH_STOP);
      }
      break;
    }

    case SSH_SFTP_CREATE_DIRS_INIT:
      if(strlen(sftp_scp->path) > 1) {
        sshc->slash_pos = sftp_scp->path + 1; /* ignore the leading '/' */
        state(conn, SSH_SFTP_CREATE_DIRS);
      }
      else {
        state(conn, SSH_SFTP_UPLOAD_INIT);
      }
      break;

    case SSH_SFTP_CREATE_DIRS:
      sshc->slash_pos = strchr(sshc->slash_pos, '/');
      if(sshc->slash_pos) {
        *sshc->slash_pos = 0;

        infof(data, "Creating directory '%s'\n", sftp_scp->path);
        state(conn, SSH_SFTP_CREATE_DIRS_MKDIR);
        break;
      }
      state(conn, SSH_SFTP_UPLOAD_INIT);
      break;

    case SSH_SFTP_CREATE_DIRS_MKDIR:
      /* 'mode' - parameter is preliminary - default to 0644 */
      rc = libssh2_sftp_mkdir_ex(sshc->sftp_session, sftp_scp->path,
                                 curlx_uztoui(strlen(sftp_scp->path)),
                                 data->set.new_directory_perms);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      *sshc->slash_pos = '/';
      ++sshc->slash_pos;
      if(rc < 0) {
        /*
         * Abort if failure wasn't that the dir already exists or the
         * permission was denied (creation might succeed further down the
         * path) - retry on unspecific FAILURE also
         */
        err = sftp_libssh2_last_error(sshc->sftp_session);
        if((err != LIBSSH2_FX_FILE_ALREADY_EXISTS) &&
           (err != LIBSSH2_FX_FAILURE) &&
           (err != LIBSSH2_FX_PERMISSION_DENIED)) {
          result = sftp_libssh2_error_to_CURLE(err);
          state(conn, SSH_SFTP_CLOSE);
          sshc->actualcode = result?result:CURLE_SSH;
          break;
        }
        rc = 0; /* clear rc and continue */
      }
      state(conn, SSH_SFTP_CREATE_DIRS);
      break;

    case SSH_SFTP_READDIR_INIT:
      Curl_pgrsSetDownloadSize(data, -1);
      if(data->set.opt_no_body) {
        state(conn, SSH_STOP);
        break;
      }

      /*
       * This is a directory that we are trying to get, so produce a directory
       * listing
       */
      sshc->sftp_handle = libssh2_sftp_open_ex(sshc->sftp_session,
                                               sftp_scp->path,
                                               curlx_uztoui(
                                                 strlen(sftp_scp->path)),
                                               0, 0, LIBSSH2_SFTP_OPENDIR);
      if(!sshc->sftp_handle) {
        if(libssh2_session_last_errno(sshc->ssh_session) ==
           LIBSSH2_ERROR_EAGAIN) {
          rc = LIBSSH2_ERROR_EAGAIN;
          break;
        }
        err = sftp_libssh2_last_error(sshc->sftp_session);
        failf(data, "Could not open directory for reading: %s",
              sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        result = sftp_libssh2_error_to_CURLE(err);
        sshc->actualcode = result?result:CURLE_SSH;
        break;
      }
      sshc->readdir_filename = malloc(PATH_MAX + 1);
      if(!sshc->readdir_filename) {
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = CURLE_OUT_OF_MEMORY;
        break;
      }
      sshc->readdir_longentry = malloc(PATH_MAX + 1);
      if(!sshc->readdir_longentry) {
        Curl_safefree(sshc->readdir_filename);
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = CURLE_OUT_OF_MEMORY;
        break;
      }
      state(conn, SSH_SFTP_READDIR);
      break;

    case SSH_SFTP_READDIR:
      rc = libssh2_sftp_readdir_ex(sshc->sftp_handle,
                                   sshc->readdir_filename,
                                   PATH_MAX,
                                   sshc->readdir_longentry,
                                   PATH_MAX,
                                   &sshc->readdir_attrs);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc > 0) {
        sshc->readdir_len = (size_t) rc;
        sshc->readdir_filename[sshc->readdir_len] = '\0';

        if(data->set.ftp_list_only) {
          char *tmpLine;

          tmpLine = aprintf("%s\n", sshc->readdir_filename);
          if(tmpLine == NULL) {
            state(conn, SSH_SFTP_CLOSE);
            sshc->actualcode = CURLE_OUT_OF_MEMORY;
            break;
          }
          result = Curl_client_write(conn, CLIENTWRITE_BODY,
                                     tmpLine, sshc->readdir_len + 1);
          free(tmpLine);

          if(result) {
            state(conn, SSH_STOP);
            break;
          }
          /* since this counts what we send to the client, we include the
             newline in this counter */
          data->req.bytecount += sshc->readdir_len + 1;

          /* output debug output if that is requested */
          if(data->set.verbose) {
            Curl_debug(data, CURLINFO_DATA_OUT, sshc->readdir_filename,
                       sshc->readdir_len);
          }
        }
        else {
          sshc->readdir_currLen = strlen(sshc->readdir_longentry);
          sshc->readdir_totalLen = 80 + sshc->readdir_currLen;
          sshc->readdir_line = calloc(sshc->readdir_totalLen, 1);
          if(!sshc->readdir_line) {
            Curl_safefree(sshc->readdir_filename);
            Curl_safefree(sshc->readdir_longentry);
            state(conn, SSH_SFTP_CLOSE);
            sshc->actualcode = CURLE_OUT_OF_MEMORY;
            break;
          }

          memcpy(sshc->readdir_line, sshc->readdir_longentry,
                 sshc->readdir_currLen);
          if((sshc->readdir_attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) &&
             ((sshc->readdir_attrs.permissions & LIBSSH2_SFTP_S_IFMT) ==
              LIBSSH2_SFTP_S_IFLNK)) {
            sshc->readdir_linkPath = malloc(PATH_MAX + 1);
            if(sshc->readdir_linkPath == NULL) {
              Curl_safefree(sshc->readdir_filename);
              Curl_safefree(sshc->readdir_longentry);
              state(conn, SSH_SFTP_CLOSE);
              sshc->actualcode = CURLE_OUT_OF_MEMORY;
              break;
            }

            msnprintf(sshc->readdir_linkPath, PATH_MAX, "%s%s", sftp_scp->path,
                      sshc->readdir_filename);
            state(conn, SSH_SFTP_READDIR_LINK);
            break;
          }
          state(conn, SSH_SFTP_READDIR_BOTTOM);
          break;
        }
      }
      else if(rc == 0) {
        Curl_safefree(sshc->readdir_filename);
        Curl_safefree(sshc->readdir_longentry);
        state(conn, SSH_SFTP_READDIR_DONE);
        break;
      }
      else if(rc < 0) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        result = sftp_libssh2_error_to_CURLE(err);
        sshc->actualcode = result?result:CURLE_SSH;
        failf(data, "Could not open remote file for reading: %s :: %d",
              sftp_libssh2_strerror(err),
              libssh2_session_last_errno(sshc->ssh_session));
        Curl_safefree(sshc->readdir_filename);
        Curl_safefree(sshc->readdir_longentry);
        state(conn, SSH_SFTP_CLOSE);
        break;
      }
      break;

    case SSH_SFTP_READDIR_LINK:
      rc =
        libssh2_sftp_symlink_ex(sshc->sftp_session,
                                sshc->readdir_linkPath,
                                curlx_uztoui(strlen(sshc->readdir_linkPath)),
                                sshc->readdir_filename,
                                PATH_MAX, LIBSSH2_SFTP_READLINK);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      sshc->readdir_len = (size_t) rc;
      Curl_safefree(sshc->readdir_linkPath);

      /* get room for the filename and extra output */
      sshc->readdir_totalLen += 4 + sshc->readdir_len;
      new_readdir_line = Curl_saferealloc(sshc->readdir_line,
                                          sshc->readdir_totalLen);
      if(!new_readdir_line) {
        sshc->readdir_line = NULL;
        Curl_safefree(sshc->readdir_filename);
        Curl_safefree(sshc->readdir_longentry);
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = CURLE_OUT_OF_MEMORY;
        break;
      }
      sshc->readdir_line = new_readdir_line;

      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
                                         sshc->readdir_currLen,
                                         sshc->readdir_totalLen -
                                         sshc->readdir_currLen,
                                         " -> %s",
                                         sshc->readdir_filename);

      state(conn, SSH_SFTP_READDIR_BOTTOM);
      break;

    case SSH_SFTP_READDIR_BOTTOM:
      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
                                         sshc->readdir_currLen,
                                         sshc->readdir_totalLen -
                                         sshc->readdir_currLen, "\n");
      result = Curl_client_write(conn, CLIENTWRITE_BODY,
                                 sshc->readdir_line,
                                 sshc->readdir_currLen);

      if(!result) {

        /* output debug output if that is requested */
        if(data->set.verbose) {
          Curl_debug(data, CURLINFO_DATA_OUT, sshc->readdir_line,
                     sshc->readdir_currLen);
        }
        data->req.bytecount += sshc->readdir_currLen;
      }
      Curl_safefree(sshc->readdir_line);
      if(result) {
        state(conn, SSH_STOP);
      }
      else
        state(conn, SSH_SFTP_READDIR);
      break;

    case SSH_SFTP_READDIR_DONE:
      if(libssh2_sftp_closedir(sshc->sftp_handle) ==
         LIBSSH2_ERROR_EAGAIN) {
        rc = LIBSSH2_ERROR_EAGAIN;
        break;
      }
      sshc->sftp_handle = NULL;
      Curl_safefree(sshc->readdir_filename);
      Curl_safefree(sshc->readdir_longentry);

      /* no data to transfer */
      Curl_setup_transfer(data, -1, -1, FALSE, -1);
      state(conn, SSH_STOP);
      break;

    case SSH_SFTP_DOWNLOAD_INIT:
      /*
       * Work on getting the specified file
       */
      sshc->sftp_handle =
        libssh2_sftp_open_ex(sshc->sftp_session, sftp_scp->path,
                             curlx_uztoui(strlen(sftp_scp->path)),
                             LIBSSH2_FXF_READ, data->set.new_file_perms,
                             LIBSSH2_SFTP_OPENFILE);
      if(!sshc->sftp_handle) {
        if(libssh2_session_last_errno(sshc->ssh_session) ==
           LIBSSH2_ERROR_EAGAIN) {
          rc = LIBSSH2_ERROR_EAGAIN;
          break;
        }
        err = sftp_libssh2_last_error(sshc->sftp_session);
        failf(data, "Could not open remote file for reading: %s",
              sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        result = sftp_libssh2_error_to_CURLE(err);
        sshc->actualcode = result?result:CURLE_SSH;
        break;
      }
      state(conn, SSH_SFTP_DOWNLOAD_STAT);
      break;

    case SSH_SFTP_DOWNLOAD_STAT:
    {
      LIBSSH2_SFTP_ATTRIBUTES attrs;

      rc = libssh2_sftp_stat_ex(sshc->sftp_session, sftp_scp->path,
                                curlx_uztoui(strlen(sftp_scp->path)),
                                LIBSSH2_SFTP_STAT, &attrs);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc ||
         !(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) ||
         (attrs.filesize == 0)) {
        /*
         * libssh2_sftp_open() didn't return an error, so maybe the server
         * just doesn't support stat()
         * OR the server doesn't return a file size with a stat()
         * OR file size is 0
         */
        data->req.size = -1;
        data->req.maxdownload = -1;
        Curl_pgrsSetDownloadSize(data, -1);
      }
      else {
        curl_off_t size = attrs.filesize;

        if(size < 0) {
          failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
          return CURLE_BAD_DOWNLOAD_RESUME;
        }
        if(conn->data->state.use_range) {
          curl_off_t from, to;
          char *ptr;
          char *ptr2;
          CURLofft to_t;
          CURLofft from_t;

          from_t = curlx_strtoofft(conn->data->state.range, &ptr, 0, &from);
          if(from_t == CURL_OFFT_FLOW)
            return CURLE_RANGE_ERROR;
          while(*ptr && (ISSPACE(*ptr) || (*ptr == '-')))
            ptr++;
          to_t = curlx_strtoofft(ptr, &ptr2, 0, &to);
          if(to_t == CURL_OFFT_FLOW)
            return CURLE_RANGE_ERROR;
          if((to_t == CURL_OFFT_INVAL) /* no "to" value given */
             || (to >= size)) {
            to = size - 1;
          }
          if(from_t) {
            /* from is relative to end of file */
            from = size - to;
            to = size - 1;
          }
          if(from > size) {
            failf(data, "Offset (%"
                  CURL_FORMAT_CURL_OFF_T ") was beyond file size (%"
                  CURL_FORMAT_CURL_OFF_T ")", from, attrs.filesize);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
          if(from > to) {
            from = to;
            size = 0;
          }
          else {
            size = to - from + 1;
          }

          SFTP_SEEK(conn->proto.sshc.sftp_handle, from);
        }
        data->req.size = size;
        data->req.maxdownload = size;
        Curl_pgrsSetDownloadSize(data, size);
      }

      /* We can resume if we can seek to the resume position */
      if(data->state.resume_from) {
        if(data->state.resume_from < 0) {
          /* We're supposed to download the last abs(from) bytes */
          if((curl_off_t)attrs.filesize < -data->state.resume_from) {
            failf(data, "Offset (%"
                  CURL_FORMAT_CURL_OFF_T ") was beyond file size (%"
                  CURL_FORMAT_CURL_OFF_T ")",
                  data->state.resume_from, attrs.filesize);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
          /* download from where? */
          data->state.resume_from += attrs.filesize;
        }
        else {
          if((curl_off_t)attrs.filesize < data->state.resume_from) {
            failf(data, "Offset (%" CURL_FORMAT_CURL_OFF_T
                  ") was beyond file size (%" CURL_FORMAT_CURL_OFF_T ")",
                  data->state.resume_from, attrs.filesize);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
        }
        /* Does a completed file need to be seeked and started or closed ? */
        /* Now store the number of bytes we are expected to download */
        data->req.size = attrs.filesize - data->state.resume_from;
        data->req.maxdownload = attrs.filesize - data->state.resume_from;
        Curl_pgrsSetDownloadSize(data,
                                 attrs.filesize - data->state.resume_from);
        SFTP_SEEK(sshc->sftp_handle, data->state.resume_from);
      }
    }

    /* Setup the actual download */
    if(data->req.size == 0) {
      /* no data to transfer */
      Curl_setup_transfer(data, -1, -1, FALSE, -1);
      infof(data, "File already completely downloaded\n");
      state(conn, SSH_STOP);
      break;
    }
    Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);

    /* not set by Curl_setup_transfer to preserve keepon bits */
    conn->writesockfd = conn->sockfd;

    /* we want to use the _receiving_ function even when the socket turns
       out writableable as the underlying libssh2 recv function will deal
       with both accordingly */
    conn->cselect_bits = CURL_CSELECT_IN;

    if(result) {
      /* this should never occur; the close state should be entered
         at the time the error occurs */
      state(conn, SSH_SFTP_CLOSE);
      sshc->actualcode = result;
    }
    else {
      state(conn, SSH_STOP);
    }
    break;

    case SSH_SFTP_CLOSE:
      if(sshc->sftp_handle) {
        rc = libssh2_sftp_close(sshc->sftp_handle);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to close libssh2 file: %d %s\n", rc, err_msg);
        }
        sshc->sftp_handle = NULL;
      }

      Curl_safefree(sftp_scp->path);

      DEBUGF(infof(data, "SFTP DONE done\n"));

      /* Check if nextstate is set and move .nextstate could be POSTQUOTE_INIT
         After nextstate is executed, the control should come back to
         SSH_SFTP_CLOSE to pass the correct result back  */
      if(sshc->nextstate != SSH_NO_STATE &&
         sshc->nextstate != SSH_SFTP_CLOSE) {
        state(conn, sshc->nextstate);
        sshc->nextstate = SSH_SFTP_CLOSE;
      }
      else {
        state(conn, SSH_STOP);
        result = sshc->actualcode;
      }
      break;

    case SSH_SFTP_SHUTDOWN:
      /* during times we get here due to a broken transfer and then the
         sftp_handle might not have been taken down so make sure that is done
         before we proceed */

      if(sshc->sftp_handle) {
        rc = libssh2_sftp_close(sshc->sftp_handle);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session, &err_msg,
                                           NULL, 0);
          infof(data, "Failed to close libssh2 file: %d %s\n", rc, err_msg);
        }
        sshc->sftp_handle = NULL;
      }
      if(sshc->sftp_session) {
        rc = libssh2_sftp_shutdown(sshc->sftp_session);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          infof(data, "Failed to stop libssh2 sftp subsystem\n");
        }
        sshc->sftp_session = NULL;
      }

      Curl_safefree(sshc->homedir);
      conn->data->state.most_recent_ftp_entrypath = NULL;

      state(conn, SSH_SESSION_DISCONNECT);
      break;

    case SSH_SCP_TRANS_INIT:
      result = Curl_getworkingpath(conn, sshc->homedir, &sftp_scp->path);
      if(result) {
        sshc->actualcode = result;
        state(conn, SSH_STOP);
        break;
      }

      if(data->set.upload) {
        if(data->state.infilesize < 0) {
          failf(data, "SCP requires a known file size for upload");
          sshc->actualcode = CURLE_UPLOAD_FAILED;
          state(conn, SSH_SCP_CHANNEL_FREE);
          break;
        }
        state(conn, SSH_SCP_UPLOAD_INIT);
      }
      else {
        state(conn, SSH_SCP_DOWNLOAD_INIT);
      }
      break;

    case SSH_SCP_UPLOAD_INIT:
      /*
       * libssh2 requires that the destination path is a full path that
       * includes the destination file and name OR ends in a "/" .  If this is
       * not done the destination file will be named the same name as the last
       * directory in the path.
       */
      sshc->ssh_channel =
        SCP_SEND(sshc->ssh_session, sftp_scp->path, data->set.new_file_perms,
                 data->state.infilesize);
      if(!sshc->ssh_channel) {
        int ssh_err;
        char *err_msg = NULL;

        if(libssh2_session_last_errno(sshc->ssh_session) ==
           LIBSSH2_ERROR_EAGAIN) {
          rc = LIBSSH2_ERROR_EAGAIN;
          break;
        }

        ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
                                                   &err_msg, NULL, 0));
        failf(conn->data, "%s", err_msg);
        state(conn, SSH_SCP_CHANNEL_FREE);
        sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
        /* Map generic errors to upload failed */
        if(sshc->actualcode == CURLE_SSH ||
           sshc->actualcode == CURLE_REMOTE_FILE_NOT_FOUND)
          sshc->actualcode = CURLE_UPLOAD_FAILED;
        break;
      }

      /* upload data */
      Curl_setup_transfer(data, -1, data->req.size, FALSE, FIRSTSOCKET);

      /* not set by Curl_setup_transfer to preserve keepon bits */
      conn->sockfd = conn->writesockfd;

      if(result) {
        state(conn, SSH_SCP_CHANNEL_FREE);
        sshc->actualcode = result;
      }
      else {
        /* store this original bitmask setup to use later on if we can't
           figure out a "real" bitmask */
        sshc->orig_waitfor = data->req.keepon;

        /* we want to use the _sending_ function even when the socket turns
           out readable as the underlying libssh2 scp send function will deal
           with both accordingly */
        conn->cselect_bits = CURL_CSELECT_OUT;

        state(conn, SSH_STOP);
      }
      break;

    case SSH_SCP_DOWNLOAD_INIT:
    {
      curl_off_t bytecount;

      /*
       * We must check the remote file; if it is a directory no values will
       * be set in sb
       */

      /*
       * If support for >2GB files exists, use it.
       */

      /* get a fresh new channel from the ssh layer */
#if LIBSSH2_VERSION_NUM < 0x010700
      struct stat sb;
      memset(&sb, 0, sizeof(struct stat));
      sshc->ssh_channel = libssh2_scp_recv(sshc->ssh_session,
                                           sftp_scp->path, &sb);
#else
      libssh2_struct_stat sb;
      memset(&sb, 0, sizeof(libssh2_struct_stat));
      sshc->ssh_channel = libssh2_scp_recv2(sshc->ssh_session,
                                            sftp_scp->path, &sb);
#endif

      if(!sshc->ssh_channel) {
        int ssh_err;
        char *err_msg = NULL;

        if(libssh2_session_last_errno(sshc->ssh_session) ==
           LIBSSH2_ERROR_EAGAIN) {
          rc = LIBSSH2_ERROR_EAGAIN;
          break;
        }


        ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
                                                   &err_msg, NULL, 0));
        failf(conn->data, "%s", err_msg);
        state(conn, SSH_SCP_CHANNEL_FREE);
        sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
        break;
      }

      /* download data */
      bytecount = (curl_off_t)sb.st_size;
      data->req.maxdownload =  (curl_off_t)sb.st_size;
      Curl_setup_transfer(data, FIRSTSOCKET, bytecount, FALSE, -1);

      /* not set by Curl_setup_transfer to preserve keepon bits */
      conn->writesockfd = conn->sockfd;

      /* we want to use the _receiving_ function even when the socket turns
         out writableable as the underlying libssh2 recv function will deal
         with both accordingly */
      conn->cselect_bits = CURL_CSELECT_IN;

      if(result) {
        state(conn, SSH_SCP_CHANNEL_FREE);
        sshc->actualcode = result;
      }
      else
        state(conn, SSH_STOP);
    }
    break;

    case SSH_SCP_DONE:
      if(data->set.upload)
        state(conn, SSH_SCP_SEND_EOF);
      else
        state(conn, SSH_SCP_CHANNEL_FREE);
      break;

    case SSH_SCP_SEND_EOF:
      if(sshc->ssh_channel) {
        rc = libssh2_channel_send_eof(sshc->ssh_channel);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to send libssh2 channel EOF: %d %s\n",
                rc, err_msg);
        }
      }
      state(conn, SSH_SCP_WAIT_EOF);
      break;

    case SSH_SCP_WAIT_EOF:
      if(sshc->ssh_channel) {
        rc = libssh2_channel_wait_eof(sshc->ssh_channel);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to get channel EOF: %d %s\n", rc, err_msg);
        }
      }
      state(conn, SSH_SCP_WAIT_CLOSE);
      break;

    case SSH_SCP_WAIT_CLOSE:
      if(sshc->ssh_channel) {
        rc = libssh2_channel_wait_closed(sshc->ssh_channel);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Channel failed to close: %d %s\n", rc, err_msg);
        }
      }
      state(conn, SSH_SCP_CHANNEL_FREE);
      break;

    case SSH_SCP_CHANNEL_FREE:
      if(sshc->ssh_channel) {
        rc = libssh2_channel_free(sshc->ssh_channel);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to free libssh2 scp subsystem: %d %s\n",
                rc, err_msg);
        }
        sshc->ssh_channel = NULL;
      }
      DEBUGF(infof(data, "SCP DONE phase complete\n"));
#if 0 /* PREV */
      state(conn, SSH_SESSION_DISCONNECT);
#endif
      state(conn, SSH_STOP);
      result = sshc->actualcode;
      break;

    case SSH_SESSION_DISCONNECT:
      /* during weird times when we've been prematurely aborted, the channel
         is still alive when we reach this state and we MUST kill the channel
         properly first */
      if(sshc->ssh_channel) {
        rc = libssh2_channel_free(sshc->ssh_channel);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to free libssh2 scp subsystem: %d %s\n",
                rc, err_msg);
        }
        sshc->ssh_channel = NULL;
      }

      if(sshc->ssh_session) {
        rc = libssh2_session_disconnect(sshc->ssh_session, "Shutdown");
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to disconnect libssh2 session: %d %s\n",
                rc, err_msg);
        }
      }

      Curl_safefree(sshc->homedir);
      conn->data->state.most_recent_ftp_entrypath = NULL;

      state(conn, SSH_SESSION_FREE);
      break;

    case SSH_SESSION_FREE:
#ifdef HAVE_LIBSSH2_KNOWNHOST_API
      if(sshc->kh) {
        libssh2_knownhost_free(sshc->kh);
        sshc->kh = NULL;
      }
#endif

#ifdef HAVE_LIBSSH2_AGENT_API
      if(sshc->ssh_agent) {
        rc = libssh2_agent_disconnect(sshc->ssh_agent);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to disconnect from libssh2 agent: %d %s\n",
                rc, err_msg);
        }
        libssh2_agent_free(sshc->ssh_agent);
        sshc->ssh_agent = NULL;

        /* NB: there is no need to free identities, they are part of internal
           agent stuff */
        sshc->sshagent_identity = NULL;
        sshc->sshagent_prev_identity = NULL;
      }
#endif

      if(sshc->ssh_session) {
        rc = libssh2_session_free(sshc->ssh_session);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to free libssh2 session: %d %s\n", rc, err_msg);
        }
        sshc->ssh_session = NULL;
      }

      /* worst-case scenario cleanup */

      DEBUGASSERT(sshc->ssh_session == NULL);
      DEBUGASSERT(sshc->ssh_channel == NULL);
      DEBUGASSERT(sshc->sftp_session == NULL);
      DEBUGASSERT(sshc->sftp_handle == NULL);
#ifdef HAVE_LIBSSH2_KNOWNHOST_API
      DEBUGASSERT(sshc->kh == NULL);
#endif
#ifdef HAVE_LIBSSH2_AGENT_API
      DEBUGASSERT(sshc->ssh_agent == NULL);
#endif

      Curl_safefree(sshc->rsa_pub);
      Curl_safefree(sshc->rsa);

      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);

      Curl_safefree(sshc->homedir);

      Curl_safefree(sshc->readdir_filename);
      Curl_safefree(sshc->readdir_longentry);
      Curl_safefree(sshc->readdir_line);
      Curl_safefree(sshc->readdir_linkPath);

      /* the code we are about to return */
      result = sshc->actualcode;

      memset(sshc, 0, sizeof(struct ssh_conn));

      connclose(conn, "SSH session free");
      sshc->state = SSH_SESSION_FREE; /* current */
      sshc->nextstate = SSH_NO_STATE;
      state(conn, SSH_STOP);
      break;

    case SSH_QUIT:
      /* fallthrough, just stop! */
    default:
      /* internal error */
      sshc->nextstate = SSH_NO_STATE;
      state(conn, SSH_STOP);
      break;
    }

  } while(!rc && (sshc->state != SSH_STOP));

  if(rc == LIBSSH2_ERROR_EAGAIN) {
    /* we would block, we need to wait for the socket to be ready (in the
       right direction too)! */
    *block = TRUE;
  }

  return result;
}

/* called by the multi interface to figure out what socket(s) to wait for and
   for what actions in the DO_DONE, PERFORM and WAITPERFORM states */
static int ssh_perform_getsock(const struct connectdata *conn,
                               curl_socket_t *sock, /* points to numsocks
                                                       number of sockets */
                               int numsocks)
{
#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
  int bitmap = GETSOCK_BLANK;
  (void)numsocks;

  sock[0] = conn->sock[FIRSTSOCKET];

  if(conn->waitfor & KEEP_RECV)
    bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);

  if(conn->waitfor & KEEP_SEND)
    bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);

  return bitmap;
#else
  /* if we don't know the direction we can use the generic *_getsock()
     function even for the protocol_connect and doing states */
  return Curl_single_getsock(conn, sock, numsocks);
#endif
}

/* Generic function called by the multi interface to figure out what socket(s)
   to wait for and for what actions during the DOING and PROTOCONNECT states*/
static int ssh_getsock(struct connectdata *conn,
                       curl_socket_t *sock, /* points to numsocks number
                                               of sockets */
                       int numsocks)
{
#ifndef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
  (void)conn;
  (void)sock;
  (void)numsocks;
  /* if we don't know any direction we can just play along as we used to and
     not provide any sensible info */
  return GETSOCK_BLANK;
#else
  /* if we know the direction we can use the generic *_getsock() function even
     for the protocol_connect and doing states */
  return ssh_perform_getsock(conn, sock, numsocks);
#endif
}

#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
/*
 * When one of the libssh2 functions has returned LIBSSH2_ERROR_EAGAIN this
 * function is used to figure out in what direction and stores this info so
 * that the multi interface can take advantage of it. Make sure to call this
 * function in all cases so that when it _doesn't_ return EAGAIN we can
 * restore the default wait bits.
 */
static void ssh_block2waitfor(struct connectdata *conn, bool block)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  int dir = 0;
  if(block) {
    dir = libssh2_session_block_directions(sshc->ssh_session);
    if(dir) {
      /* translate the libssh2 define bits into our own bit defines */
      conn->waitfor = ((dir&LIBSSH2_SESSION_BLOCK_INBOUND)?KEEP_RECV:0) |
        ((dir&LIBSSH2_SESSION_BLOCK_OUTBOUND)?KEEP_SEND:0);
    }
  }
  if(!dir)
    /* It didn't block or libssh2 didn't reveal in which direction, put back
       the original set */
    conn->waitfor = sshc->orig_waitfor;
}
#else
  /* no libssh2 directional support so we simply don't know */
#define ssh_block2waitfor(x,y) Curl_nop_stmt
#endif

/* called repeatedly until done from multi.c */
static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  CURLcode result = CURLE_OK;
  bool block; /* we store the status and use that to provide a ssh_getsock()
                 implementation */
  do {
    result = ssh_statemach_act(conn, &block);
    *done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
    /* if there's no error, it isn't done and it didn't EWOULDBLOCK, then
       try again */
  } while(!result && !*done && !block);
  ssh_block2waitfor(conn, block);

  return result;
}

static CURLcode ssh_block_statemach(struct connectdata *conn,
                                    bool disconnect)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  CURLcode result = CURLE_OK;
  struct Curl_easy *data = conn->data;

  while((sshc->state != SSH_STOP) && !result) {
    bool block;
    timediff_t left = 1000;
    struct curltime now = Curl_now();

    result = ssh_statemach_act(conn, &block);
    if(result)
      break;

    if(!disconnect) {
      if(Curl_pgrsUpdate(conn))
        return CURLE_ABORTED_BY_CALLBACK;

      result = Curl_speedcheck(data, now);
      if(result)
        break;

      left = Curl_timeleft(data, NULL, FALSE);
      if(left < 0) {
        failf(data, "Operation timed out");
        return CURLE_OPERATION_TIMEDOUT;
      }
    }

#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
    if(!result && block) {
      int dir = libssh2_session_block_directions(sshc->ssh_session);
      curl_socket_t sock = conn->sock[FIRSTSOCKET];
      curl_socket_t fd_read = CURL_SOCKET_BAD;
      curl_socket_t fd_write = CURL_SOCKET_BAD;
      if(LIBSSH2_SESSION_BLOCK_INBOUND & dir)
        fd_read = sock;
      if(LIBSSH2_SESSION_BLOCK_OUTBOUND & dir)
        fd_write = sock;
      /* wait for the socket to become ready */
      (void)Curl_socket_check(fd_read, CURL_SOCKET_BAD, fd_write,
                              left>1000?1000:left); /* ignore result */
    }
#endif

  }

  return result;
}

/*
 * SSH setup and connection
 */
static CURLcode ssh_setup_connection(struct connectdata *conn)
{
  struct SSHPROTO *ssh;

  conn->data->req.protop = ssh = calloc(1, sizeof(struct SSHPROTO));
  if(!ssh)
    return CURLE_OUT_OF_MEMORY;

  return CURLE_OK;
}

static Curl_recv scp_recv, sftp_recv;
static Curl_send scp_send, sftp_send;

/*
 * Curl_ssh_connect() gets called from Curl_protocol_connect() to allow us to
 * do protocol-specific actions at connect-time.
 */
static CURLcode ssh_connect(struct connectdata *conn, bool *done)
{
#ifdef CURL_LIBSSH2_DEBUG
  curl_socket_t sock;
#endif
  struct ssh_conn *ssh;
  CURLcode result;
  struct Curl_easy *data = conn->data;

  /* initialize per-handle data if not already */
  if(!data->req.protop)
    ssh_setup_connection(conn);

  /* We default to persistent connections. We set this already in this connect
     function to make the re-use checks properly be able to check this bit. */
  connkeep(conn, "SSH default");

  if(conn->handler->protocol & CURLPROTO_SCP) {
    conn->recv[FIRSTSOCKET] = scp_recv;
    conn->send[FIRSTSOCKET] = scp_send;
  }
  else {
    conn->recv[FIRSTSOCKET] = sftp_recv;
    conn->send[FIRSTSOCKET] = sftp_send;
  }
  ssh = &conn->proto.sshc;

#ifdef CURL_LIBSSH2_DEBUG
  if(conn->user) {
    infof(data, "User: %s\n", conn->user);
  }
  if(conn->passwd) {
    infof(data, "Password: %s\n", conn->passwd);
  }
  sock = conn->sock[FIRSTSOCKET];
#endif /* CURL_LIBSSH2_DEBUG */

  ssh->ssh_session = libssh2_session_init_ex(my_libssh2_malloc,
                                             my_libssh2_free,
                                             my_libssh2_realloc, conn);
  if(ssh->ssh_session == NULL) {
    failf(data, "Failure initialising ssh session");
    return CURLE_FAILED_INIT;
  }

  if(data->set.ssh_compression) {
#if LIBSSH2_VERSION_NUM >= 0x010208
    if(libssh2_session_flag(ssh->ssh_session, LIBSSH2_FLAG_COMPRESS, 1) < 0)
#endif
      infof(data, "Failed to enable compression for ssh session\n");
  }

#ifdef HAVE_LIBSSH2_KNOWNHOST_API
  if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
    int rc;
    ssh->kh = libssh2_knownhost_init(ssh->ssh_session);
    if(!ssh->kh) {
      libssh2_session_free(ssh->ssh_session);
      return CURLE_FAILED_INIT;
    }

    /* read all known hosts from there */
    rc = libssh2_knownhost_readfile(ssh->kh,
                                    data->set.str[STRING_SSH_KNOWNHOSTS],
                                    LIBSSH2_KNOWNHOST_FILE_OPENSSH);
    if(rc < 0)
      infof(data, "Failed to read known hosts from %s\n",
            data->set.str[STRING_SSH_KNOWNHOSTS]);
  }
#endif /* HAVE_LIBSSH2_KNOWNHOST_API */

#ifdef CURL_LIBSSH2_DEBUG
  libssh2_trace(ssh->ssh_session, ~0);
  infof(data, "SSH socket: %d\n", (int)sock);
#endif /* CURL_LIBSSH2_DEBUG */

  state(conn, SSH_INIT);

  result = ssh_multi_statemach(conn, done);

  return result;
}

/*
 ***********************************************************************
 *
 * scp_perform()
 *
 * This is the actual DO function for SCP. Get a file according to
 * the options previously setup.
 */

static
CURLcode scp_perform(struct connectdata *conn,
                      bool *connected,
                      bool *dophase_done)
{
  CURLcode result = CURLE_OK;

  DEBUGF(infof(conn->data, "DO phase starts\n"));

  *dophase_done = FALSE; /* not done yet */

  /* start the first command in the DO phase */
  state(conn, SSH_SCP_TRANS_INIT);

  /* run the state-machine */
  result = ssh_multi_statemach(conn, dophase_done);

  *connected = conn->bits.tcpconnect[FIRSTSOCKET];

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }

  return result;
}

/* called from multi.c while DOing */
static CURLcode scp_doing(struct connectdata *conn,
                               bool *dophase_done)
{
  CURLcode result;
  result = ssh_multi_statemach(conn, dophase_done);

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }
  return result;
}

/*
 * The DO function is generic for both protocols. There was previously two
 * separate ones but this way means less duplicated code.
 */

static CURLcode ssh_do(struct connectdata *conn, bool *done)
{
  CURLcode result;
  bool connected = 0;
  struct Curl_easy *data = conn->data;
  struct ssh_conn *sshc = &conn->proto.sshc;

  *done = FALSE; /* default to false */

  data->req.size = -1; /* make sure this is unknown at this point */

  sshc->actualcode = CURLE_OK; /* reset error code */
  sshc->secondCreateDirs = 0;   /* reset the create dir attempt state
                                   variable */

  Curl_pgrsSetUploadCounter(data, 0);
  Curl_pgrsSetDownloadCounter(data, 0);
  Curl_pgrsSetUploadSize(data, -1);
  Curl_pgrsSetDownloadSize(data, -1);

  if(conn->handler->protocol & CURLPROTO_SCP)
    result = scp_perform(conn, &connected,  done);
  else
    result = sftp_perform(conn, &connected,  done);

  return result;
}

/* BLOCKING, but the function is using the state machine so the only reason
   this is still blocking is that the multi interface code has no support for
   disconnecting operations that takes a while */
static CURLcode scp_disconnect(struct connectdata *conn, bool dead_connection)
{
  CURLcode result = CURLE_OK;
  struct ssh_conn *ssh = &conn->proto.sshc;
  (void) dead_connection;

  if(ssh->ssh_session) {
    /* only if there's a session still around to use! */

    state(conn, SSH_SESSION_DISCONNECT);

    result = ssh_block_statemach(conn, TRUE);
  }

  return result;
}

/* generic done function for both SCP and SFTP called from their specific
   done functions */
static CURLcode ssh_done(struct connectdata *conn, CURLcode status)
{
  CURLcode result = CURLE_OK;
  struct SSHPROTO *sftp_scp = conn->data->req.protop;

  if(!status) {
    /* run the state-machine */
    result = ssh_block_statemach(conn, FALSE);
  }
  else
    result = status;

  if(sftp_scp)
    Curl_safefree(sftp_scp->path);
  if(Curl_pgrsDone(conn))
    return CURLE_ABORTED_BY_CALLBACK;

  conn->data->req.keepon = 0; /* clear all bits */
  return result;
}


static CURLcode scp_done(struct connectdata *conn, CURLcode status,
                         bool premature)
{
  (void)premature; /* not used */

  if(!status)
    state(conn, SSH_SCP_DONE);

  return ssh_done(conn, status);

}

static ssize_t scp_send(struct connectdata *conn, int sockindex,
                        const void *mem, size_t len, CURLcode *err)
{
  ssize_t nwrite;
  (void)sockindex; /* we only support SCP on the fixed known primary socket */

  /* libssh2_channel_write() returns int! */
  nwrite = (ssize_t)
    libssh2_channel_write(conn->proto.sshc.ssh_channel, mem, len);

  ssh_block2waitfor(conn, (nwrite == LIBSSH2_ERROR_EAGAIN)?TRUE:FALSE);

  if(nwrite == LIBSSH2_ERROR_EAGAIN) {
    *err = CURLE_AGAIN;
    nwrite = 0;
  }
  else if(nwrite < LIBSSH2_ERROR_NONE) {
    *err = libssh2_session_error_to_CURLE((int)nwrite);
    nwrite = -1;
  }

  return nwrite;
}

static ssize_t scp_recv(struct connectdata *conn, int sockindex,
                        char *mem, size_t len, CURLcode *err)
{
  ssize_t nread;
  (void)sockindex; /* we only support SCP on the fixed known primary socket */

  /* libssh2_channel_read() returns int */
  nread = (ssize_t)
    libssh2_channel_read(conn->proto.sshc.ssh_channel, mem, len);

  ssh_block2waitfor(conn, (nread == LIBSSH2_ERROR_EAGAIN)?TRUE:FALSE);
  if(nread == LIBSSH2_ERROR_EAGAIN) {
    *err = CURLE_AGAIN;
    nread = -1;
  }

  return nread;
}

/*
 * =============== SFTP ===============
 */

/*
 ***********************************************************************
 *
 * sftp_perform()
 *
 * This is the actual DO function for SFTP. Get a file/directory according to
 * the options previously setup.
 */

static
CURLcode sftp_perform(struct connectdata *conn,
                      bool *connected,
                      bool *dophase_done)
{
  CURLcode result = CURLE_OK;

  DEBUGF(infof(conn->data, "DO phase starts\n"));

  *dophase_done = FALSE; /* not done yet */

  /* start the first command in the DO phase */
  state(conn, SSH_SFTP_QUOTE_INIT);

  /* run the state-machine */
  result = ssh_multi_statemach(conn, dophase_done);

  *connected = conn->bits.tcpconnect[FIRSTSOCKET];

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }

  return result;
}

/* called from multi.c while DOing */
static CURLcode sftp_doing(struct connectdata *conn,
                           bool *dophase_done)
{
  CURLcode result = ssh_multi_statemach(conn, dophase_done);

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }
  return result;
}

/* BLOCKING, but the function is using the state machine so the only reason
   this is still blocking is that the multi interface code has no support for
   disconnecting operations that takes a while */
static CURLcode sftp_disconnect(struct connectdata *conn, bool dead_connection)
{
  CURLcode result = CURLE_OK;
  (void) dead_connection;

  DEBUGF(infof(conn->data, "SSH DISCONNECT starts now\n"));

  if(conn->proto.sshc.ssh_session) {
    /* only if there's a session still around to use! */
    state(conn, SSH_SFTP_SHUTDOWN);
    result = ssh_block_statemach(conn, TRUE);
  }

  DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));

  return result;

}

static CURLcode sftp_done(struct connectdata *conn, CURLcode status,
                               bool premature)
{
  struct ssh_conn *sshc = &conn->proto.sshc;

  if(!status) {
    /* Post quote commands are executed after the SFTP_CLOSE state to avoid
       errors that could happen due to open file handles during POSTQUOTE
       operation */
    if(!premature && conn->data->set.postquote && !conn->bits.retry)
      sshc->nextstate = SSH_SFTP_POSTQUOTE_INIT;
    state(conn, SSH_SFTP_CLOSE);
  }
  return ssh_done(conn, status);
}

/* return number of sent bytes */
static ssize_t sftp_send(struct connectdata *conn, int sockindex,
                         const void *mem, size_t len, CURLcode *err)
{
  ssize_t nwrite;   /* libssh2_sftp_write() used to return size_t in 0.14
                       but is changed to ssize_t in 0.15. These days we don't
                       support libssh2 0.15*/
  (void)sockindex;

  nwrite = libssh2_sftp_write(conn->proto.sshc.sftp_handle, mem, len);

  ssh_block2waitfor(conn, (nwrite == LIBSSH2_ERROR_EAGAIN)?TRUE:FALSE);

  if(nwrite == LIBSSH2_ERROR_EAGAIN) {
    *err = CURLE_AGAIN;
    nwrite = 0;
  }
  else if(nwrite < LIBSSH2_ERROR_NONE) {
    *err = libssh2_session_error_to_CURLE((int)nwrite);
    nwrite = -1;
  }

  return nwrite;
}

/*
 * Return number of received (decrypted) bytes
 * or <0 on error
 */
static ssize_t sftp_recv(struct connectdata *conn, int sockindex,
                         char *mem, size_t len, CURLcode *err)
{
  ssize_t nread;
  (void)sockindex;

  nread = libssh2_sftp_read(conn->proto.sshc.sftp_handle, mem, len);

  ssh_block2waitfor(conn, (nread == LIBSSH2_ERROR_EAGAIN)?TRUE:FALSE);

  if(nread == LIBSSH2_ERROR_EAGAIN) {
    *err = CURLE_AGAIN;
    nread = -1;

  }
  else if(nread < 0) {
    *err = libssh2_session_error_to_CURLE((int)nread);
  }
  return nread;
}

static const char *sftp_libssh2_strerror(int err)
{
  switch(err) {
    case LIBSSH2_FX_NO_SUCH_FILE:
      return "No such file or directory";

    case LIBSSH2_FX_PERMISSION_DENIED:
      return "Permission denied";

    case LIBSSH2_FX_FAILURE:
      return "Operation failed";

    case LIBSSH2_FX_BAD_MESSAGE:
      return "Bad message from SFTP server";

    case LIBSSH2_FX_NO_CONNECTION:
      return "Not connected to SFTP server";

    case LIBSSH2_FX_CONNECTION_LOST:
      return "Connection to SFTP server lost";

    case LIBSSH2_FX_OP_UNSUPPORTED:
      return "Operation not supported by SFTP server";

    case LIBSSH2_FX_INVALID_HANDLE:
      return "Invalid handle";

    case LIBSSH2_FX_NO_SUCH_PATH:
      return "No such file or directory";

    case LIBSSH2_FX_FILE_ALREADY_EXISTS:
      return "File already exists";

    case LIBSSH2_FX_WRITE_PROTECT:
      return "File is write protected";

    case LIBSSH2_FX_NO_MEDIA:
      return "No media";

    case LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM:
      return "Disk full";

    case LIBSSH2_FX_QUOTA_EXCEEDED:
      return "User quota exceeded";

    case LIBSSH2_FX_UNKNOWN_PRINCIPLE:
      return "Unknown principle";

    case LIBSSH2_FX_LOCK_CONFlICT:
      return "File lock conflict";

    case LIBSSH2_FX_DIR_NOT_EMPTY:
      return "Directory not empty";

    case LIBSSH2_FX_NOT_A_DIRECTORY:
      return "Not a directory";

    case LIBSSH2_FX_INVALID_FILENAME:
      return "Invalid filename";

    case LIBSSH2_FX_LINK_LOOP:
      return "Link points to itself";
  }
  return "Unknown error in libssh2";
}

#endif /* USE_LIBSSH2 */
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<


















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































Changes to jni/curl/lib/ssh.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_CURL_SSH_H
#define HEADER_CURL_SSH_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_CURL_SSH_H
#define HEADER_CURL_SSH_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
235
236
237
238
239
240
241

242








243
244
245
#else
/* use build-time if run-time not possible */
#define CURL_LIBSSH2_VERSION LIBSSH2_VERSION
#endif

extern const struct Curl_handler Curl_handler_scp;
extern const struct Curl_handler Curl_handler_sftp;










#endif /* USE_LIBSSH2 */

#endif /* HEADER_CURL_SSH_H */







>

>
>
>
>
>
>
>
>
|


235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
#else
/* use build-time if run-time not possible */
#define CURL_LIBSSH2_VERSION LIBSSH2_VERSION
#endif

extern const struct Curl_handler Curl_handler_scp;
extern const struct Curl_handler Curl_handler_sftp;
#endif /* USE_LIBSSH2 */

#ifdef USE_SSH
/* generic SSH backend functions */
CURLcode Curl_ssh_init(void);
void Curl_ssh_cleanup(void);
size_t Curl_ssh_version(char *buffer, size_t buflen);
#else
/* for non-SSH builds */
#define Curl_ssh_cleanup()
#endif

#endif /* HEADER_CURL_SSH_H */
Changes to jni/curl/lib/strerror.c.
307
308
309
310
311
312
313



314
315
316
317
318
319
320

  case CURLE_HTTP2_STREAM:
    return "Stream error in the HTTP/2 framing layer";

  case CURLE_RECURSIVE_API_CALL:
    return "API function called from within callback";




    /* error codes not used by current libcurl */
  case CURLE_OBSOLETE20:
  case CURLE_OBSOLETE24:
  case CURLE_OBSOLETE29:
  case CURLE_OBSOLETE32:
  case CURLE_OBSOLETE40:
  case CURLE_OBSOLETE44:







>
>
>







307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323

  case CURLE_HTTP2_STREAM:
    return "Stream error in the HTTP/2 framing layer";

  case CURLE_RECURSIVE_API_CALL:
    return "API function called from within callback";

  case CURLE_AUTH_ERROR:
    return "An authentication function returned an error";

    /* error codes not used by current libcurl */
  case CURLE_OBSOLETE20:
  case CURLE_OBSOLETE24:
  case CURLE_OBSOLETE29:
  case CURLE_OBSOLETE32:
  case CURLE_OBSOLETE40:
  case CURLE_OBSOLETE44:
Changes to jni/curl/lib/tftp.c.
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
                                bool dead_connection);
static CURLcode tftp_do(struct connectdata *conn, bool *done);
static CURLcode tftp_done(struct connectdata *conn,
                          CURLcode, bool premature);
static CURLcode tftp_setup_connection(struct connectdata * conn);
static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done);
static CURLcode tftp_doing(struct connectdata *conn, bool *dophase_done);
static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks,
                        int numsocks);
static CURLcode tftp_translate_code(tftp_error_t error);


/*
 * TFTP protocol handler.
 */








|
<







153
154
155
156
157
158
159
160

161
162
163
164
165
166
167
                                bool dead_connection);
static CURLcode tftp_do(struct connectdata *conn, bool *done);
static CURLcode tftp_done(struct connectdata *conn,
                          CURLcode, bool premature);
static CURLcode tftp_setup_connection(struct connectdata * conn);
static CURLcode tftp_multi_statemach(struct connectdata *conn, bool *done);
static CURLcode tftp_doing(struct connectdata *conn, bool *dophase_done);
static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks);

static CURLcode tftp_translate_code(tftp_error_t error);


/*
 * TFTP protocol handler.
 */

400
401
402
403
404
405
406
407
408
409
410
411
412
413

414
415
416
417
418
419
420
      }
    }
  }

  return CURLE_OK;
}

static size_t tftp_option_add(tftp_state_data_t *state, size_t csize,
                              char *buf, const char *option)
{
  if(( strlen(option) + csize + 1) > (size_t)state->blksize)
    return 0;
  strcpy(buf, option);
  return strlen(option) + 1;

}

static CURLcode tftp_connect_for_tx(tftp_state_data_t *state,
                                    tftp_event_t event)
{
  CURLcode result;
#ifndef CURL_DISABLE_VERBOSE_STRINGS







|
|

|
|

|
>







399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
      }
    }
  }

  return CURLE_OK;
}

static CURLcode tftp_option_add(tftp_state_data_t *state, size_t *csize,
                                char *buf, const char *option)
{
  if(( strlen(option) + *csize + 1) > (size_t)state->blksize)
    return CURLE_TFTP_ILLEGAL;
  strcpy(buf, option);
  *csize += strlen(option) + 1;
  return CURLE_OK;
}

static CURLcode tftp_connect_for_tx(tftp_state_data_t *state,
                                    tftp_event_t event)
{
  CURLcode result;
#ifndef CURL_DISABLE_VERBOSE_STRINGS
507
508
509
510
511
512
513
514
515
516

517
518

519
520

521
522
523

524
525
526
527
528

529
530
531

532
533






534
535
536
537
538
539
540
      /* add tsize option */
      if(data->set.upload && (data->state.infilesize != -1))
        msnprintf(buf, sizeof(buf), "%" CURL_FORMAT_CURL_OFF_T,
                  data->state.infilesize);
      else
        strcpy(buf, "0"); /* the destination is large enough */

      sbytes += tftp_option_add(state, sbytes,
                                (char *)state->spacket.data + sbytes,
                                TFTP_OPTION_TSIZE);

      sbytes += tftp_option_add(state, sbytes,
                                (char *)state->spacket.data + sbytes, buf);

      /* add blksize option */
      msnprintf(buf, sizeof(buf), "%d", state->requested_blksize);

      sbytes += tftp_option_add(state, sbytes,
                                (char *)state->spacket.data + sbytes,
                                TFTP_OPTION_BLKSIZE);

      sbytes += tftp_option_add(state, sbytes,
                                (char *)state->spacket.data + sbytes, buf);

      /* add timeout option */
      msnprintf(buf, sizeof(buf), "%d", state->retry_time);

      sbytes += tftp_option_add(state, sbytes,
                                (char *)state->spacket.data + sbytes,
                                TFTP_OPTION_INTERVAL);

      sbytes += tftp_option_add(state, sbytes,
                                (char *)state->spacket.data + sbytes, buf);






    }

    /* the typecase for the 3rd argument is mostly for systems that do
       not have a size_t argument, like older unixes that want an 'int' */
    senddata = sendto(state->sockfd, (void *)state->spacket.data,
                      (SEND_TYPE_ARG3)sbytes, 0,
                      state->conn->ip_addr->ai_addr,







|
|
|
>
|
|
>


>
|
|
|
>
|
|



>
|
|
|
>
|
|
>
>
>
>
>
>







507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
      /* add tsize option */
      if(data->set.upload && (data->state.infilesize != -1))
        msnprintf(buf, sizeof(buf), "%" CURL_FORMAT_CURL_OFF_T,
                  data->state.infilesize);
      else
        strcpy(buf, "0"); /* the destination is large enough */

      result = tftp_option_add(state, &sbytes,
                               (char *)state->spacket.data + sbytes,
                               TFTP_OPTION_TSIZE);
      if(result == CURLE_OK)
        result = tftp_option_add(state, &sbytes,
                                 (char *)state->spacket.data + sbytes, buf);

      /* add blksize option */
      msnprintf(buf, sizeof(buf), "%d", state->requested_blksize);
      if(result == CURLE_OK)
        result = tftp_option_add(state, &sbytes,
                                 (char *)state->spacket.data + sbytes,
                                 TFTP_OPTION_BLKSIZE);
      if(result == CURLE_OK)
        result = tftp_option_add(state, &sbytes,
                                 (char *)state->spacket.data + sbytes, buf);

      /* add timeout option */
      msnprintf(buf, sizeof(buf), "%d", state->retry_time);
      if(result == CURLE_OK)
        result = tftp_option_add(state, &sbytes,
                                 (char *)state->spacket.data + sbytes,
                                 TFTP_OPTION_INTERVAL);
      if(result == CURLE_OK)
        result = tftp_option_add(state, &sbytes,
                                 (char *)state->spacket.data + sbytes, buf);

      if(result != CURLE_OK) {
        failf(data, "TFTP buffer too small for options");
        free(filename);
        return CURLE_TFTP_ILLEGAL;
      }
    }

    /* the typecase for the 3rd argument is mostly for systems that do
       not have a size_t argument, like older unixes that want an 'int' */
    senddata = sendto(state->sockfd, (void *)state->spacket.data,
                      (SEND_TYPE_ARG3)sbytes, 0,
                      state->conn->ip_addr->ai_addr,
969
970
971
972
973
974
975

976
977
978
979
980
981
982
983
984
985
986
987
988
989





990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
 * The connect callback
 *
 **********************************************************/
static CURLcode tftp_connect(struct connectdata *conn, bool *done)
{
  tftp_state_data_t *state;
  int blksize;


  blksize = TFTP_BLKSIZE_DEFAULT;

  state = conn->proto.tftpc = calloc(1, sizeof(tftp_state_data_t));
  if(!state)
    return CURLE_OUT_OF_MEMORY;

  /* alloc pkt buffers based on specified blksize */
  if(conn->data->set.tftp_blksize) {
    blksize = (int)conn->data->set.tftp_blksize;
    if(blksize > TFTP_BLKSIZE_MAX || blksize < TFTP_BLKSIZE_MIN)
      return CURLE_TFTP_ILLEGAL;
  }






  if(!state->rpacket.data) {
    state->rpacket.data = calloc(1, blksize + 2 + 2);

    if(!state->rpacket.data)
      return CURLE_OUT_OF_MEMORY;
  }

  if(!state->spacket.data) {
    state->spacket.data = calloc(1, blksize + 2 + 2);

    if(!state->spacket.data)
      return CURLE_OUT_OF_MEMORY;
  }

  /* we don't keep TFTP connections up basically because there's none or very
   * little gain for UDP */
  connclose(conn, "TFTP");

  state->conn = conn;
  state->sockfd = state->conn->sock[FIRSTSOCKET];
  state->state = TFTP_STATE_START;
  state->error = TFTP_ERR_NONE;
  state->blksize = blksize;
  state->requested_blksize = blksize;

  ((struct sockaddr *)&state->local_addr)->sa_family =
    (CURL_SA_FAMILY_T)(conn->ip_addr->ai_family);

  tftp_set_timeouts(state);








>














>
>
>
>
>

|






|













|







981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
 * The connect callback
 *
 **********************************************************/
static CURLcode tftp_connect(struct connectdata *conn, bool *done)
{
  tftp_state_data_t *state;
  int blksize;
  int need_blksize;

  blksize = TFTP_BLKSIZE_DEFAULT;

  state = conn->proto.tftpc = calloc(1, sizeof(tftp_state_data_t));
  if(!state)
    return CURLE_OUT_OF_MEMORY;

  /* alloc pkt buffers based on specified blksize */
  if(conn->data->set.tftp_blksize) {
    blksize = (int)conn->data->set.tftp_blksize;
    if(blksize > TFTP_BLKSIZE_MAX || blksize < TFTP_BLKSIZE_MIN)
      return CURLE_TFTP_ILLEGAL;
  }

  need_blksize = blksize;
  /* default size is the fallback when no OACK is received */
  if(need_blksize < TFTP_BLKSIZE_DEFAULT)
    need_blksize = TFTP_BLKSIZE_DEFAULT;

  if(!state->rpacket.data) {
    state->rpacket.data = calloc(1, need_blksize + 2 + 2);

    if(!state->rpacket.data)
      return CURLE_OUT_OF_MEMORY;
  }

  if(!state->spacket.data) {
    state->spacket.data = calloc(1, need_blksize + 2 + 2);

    if(!state->spacket.data)
      return CURLE_OUT_OF_MEMORY;
  }

  /* we don't keep TFTP connections up basically because there's none or very
   * little gain for UDP */
  connclose(conn, "TFTP");

  state->conn = conn;
  state->sockfd = state->conn->sock[FIRSTSOCKET];
  state->state = TFTP_STATE_START;
  state->error = TFTP_ERR_NONE;
  state->blksize = TFTP_BLKSIZE_DEFAULT; /* Unless updated by OACK response */
  state->requested_blksize = blksize;

  ((struct sockaddr *)&state->local_addr)->sa_family =
    (CURL_SA_FAMILY_T)(conn->ip_addr->ai_family);

  tftp_set_timeouts(state);

1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
/**********************************************************
 *
 * tftp_getsock
 *
 * The getsock callback
 *
 **********************************************************/
static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks,
                        int numsocks)
{
  if(!numsocks)
    return GETSOCK_BLANK;

  socks[0] = conn->sock[FIRSTSOCKET];

  return GETSOCK_READSOCK(0);
}

/**********************************************************
 *
 * tftp_receive_packet
 *







|
<

<
<
<

<







1096
1097
1098
1099
1100
1101
1102
1103

1104



1105

1106
1107
1108
1109
1110
1111
1112
/**********************************************************
 *
 * tftp_getsock
 *
 * The getsock callback
 *
 **********************************************************/
static int tftp_getsock(struct connectdata *conn, curl_socket_t *socks)

{



  socks[0] = conn->sock[FIRSTSOCKET];

  return GETSOCK_READSOCK(0);
}

/**********************************************************
 *
 * tftp_receive_packet
 *
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
}

static CURLcode tftp_setup_connection(struct connectdata * conn)
{
  struct Curl_easy *data = conn->data;
  char *type;

  conn->socktype = SOCK_DGRAM;   /* UDP datagram based */

  /* TFTP URLs support an extension like ";mode=<typecode>" that
   * we'll try to get now! */
  type = strstr(data->state.up.path, ";mode=");

  if(!type)
    type = strstr(conn->host.rawalloc, ";mode=");







|







1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
}

static CURLcode tftp_setup_connection(struct connectdata * conn)
{
  struct Curl_easy *data = conn->data;
  char *type;

  conn->transport = TRNSPRT_UDP;

  /* TFTP URLs support an extension like ";mode=<typecode>" that
   * we'll try to get now! */
  type = strstr(data->state.up.path, ";mode=");

  if(!type)
    type = strstr(conn->host.rawalloc, ";mode=");
Changes to jni/curl/lib/timeval.c.
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
  now.tv_sec = time(NULL);
  now.tv_usec = 0;
  return now;
}

#endif

#if SIZEOF_TIME_T < 8
#define TIME_MAX INT_MAX
#define TIME_MIN INT_MIN
#else
#define TIME_MAX 9223372036854775807LL
#define TIME_MIN -9223372036854775807LL
#endif

/*
 * Returns: time difference in number of milliseconds. For too large diffs it
 * returns max value.
 *
 * @unittest: 1323
 */
timediff_t Curl_timediff(struct curltime newer, struct curltime older)
{
  timediff_t diff = (timediff_t)newer.tv_sec-older.tv_sec;
  if(diff >= (TIME_MAX/1000))
    return TIME_MAX;
  else if(diff <= (TIME_MIN/1000))
    return TIME_MIN;
  return diff * 1000 + (newer.tv_usec-older.tv_usec)/1000;
}

/*
 * Returns: time difference in number of microseconds. For too large diffs it
 * returns max value.
 */
timediff_t Curl_timediff_us(struct curltime newer, struct curltime older)
{
  timediff_t diff = (timediff_t)newer.tv_sec-older.tv_sec;
  if(diff >= (TIME_MAX/1000000))
    return TIME_MAX;
  else if(diff <= (TIME_MIN/1000000))
    return TIME_MIN;
  return diff * 1000000 + newer.tv_usec-older.tv_usec;
}







<
<
<
<
<
<
<
<









|
|
|
|










|
|
|
|


170
171
172
173
174
175
176








177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
  now.tv_sec = time(NULL);
  now.tv_usec = 0;
  return now;
}

#endif









/*
 * Returns: time difference in number of milliseconds. For too large diffs it
 * returns max value.
 *
 * @unittest: 1323
 */
timediff_t Curl_timediff(struct curltime newer, struct curltime older)
{
  timediff_t diff = (timediff_t)newer.tv_sec-older.tv_sec;
  if(diff >= (TIMEDIFF_T_MAX/1000))
    return TIMEDIFF_T_MAX;
  else if(diff <= (TIMEDIFF_T_MIN/1000))
    return TIMEDIFF_T_MIN;
  return diff * 1000 + (newer.tv_usec-older.tv_usec)/1000;
}

/*
 * Returns: time difference in number of microseconds. For too large diffs it
 * returns max value.
 */
timediff_t Curl_timediff_us(struct curltime newer, struct curltime older)
{
  timediff_t diff = (timediff_t)newer.tv_sec-older.tv_sec;
  if(diff >= (TIMEDIFF_T_MAX/1000000))
    return TIMEDIFF_T_MAX;
  else if(diff <= (TIMEDIFF_T_MIN/1000000))
    return TIMEDIFF_T_MIN;
  return diff * 1000000 + newer.tv_usec-older.tv_usec;
}
Changes to jni/curl/lib/timeval.h.
20
21
22
23
24
25
26
27
28
29
30
31
32
33


34
35
36
37
38
39
40
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#if SIZEOF_TIME_T < 8
typedef int timediff_t;
#define CURL_FORMAT_TIMEDIFF_T "d"
#else
typedef curl_off_t timediff_t;
#define CURL_FORMAT_TIMEDIFF_T CURL_FORMAT_CURL_OFF_T
#endif



struct curltime {
  time_t tv_sec; /* seconds */
  int tv_usec;   /* microseconds */
};

struct curltime Curl_now(void);







|
<
<
|


|
>
>







20
21
22
23
24
25
26
27


28
29
30
31
32
33
34
35
36
37
38
39
40
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

/* Use a larger type even for 32 bit time_t systems so that we can keep


   microsecond accuracy in it */
typedef curl_off_t timediff_t;
#define CURL_FORMAT_TIMEDIFF_T CURL_FORMAT_CURL_OFF_T

#define TIMEDIFF_T_MAX CURL_OFF_T_MAX
#define TIMEDIFF_T_MIN CURL_OFF_T_MIN

struct curltime {
  time_t tv_sec; /* seconds */
  int tv_usec;   /* microseconds */
};

struct curltime Curl_now(void);
Changes to jni/curl/lib/transfer.c.
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198

199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
      sending_http_headers = TRUE;
  }
#endif

#ifndef CURL_DISABLE_HTTP
  if(data->state.trailers_state == TRAILERS_INITIALIZED) {
    struct curl_slist *trailers = NULL;
    CURLcode c;
    int trailers_ret_code;

    /* at this point we already verified that the callback exists
       so we compile and store the trailers buffer, then proceed */
    infof(data,
          "Moving trailers state machine from initialized to sending.\n");
    data->state.trailers_state = TRAILERS_SENDING;
    data->state.trailers_buf = Curl_add_buffer_init();
    if(!data->state.trailers_buf) {
      failf(data, "Unable to allocate trailing headers buffer !");
      return CURLE_OUT_OF_MEMORY;
    }
    data->state.trailers_bytes_sent = 0;
    Curl_set_in_callback(data, true);
    trailers_ret_code = data->set.trailer_callback(&trailers,
                                                   data->set.trailer_data);
    Curl_set_in_callback(data, false);
    if(trailers_ret_code == CURL_TRAILERFUNC_OK) {
      c = Curl_http_compile_trailers(trailers, data->state.trailers_buf, data);

    }
    else {
      failf(data, "operation aborted by trailing headers callback");
      *nreadp = 0;
      c = CURLE_ABORTED_BY_CALLBACK;
    }
    if(c != CURLE_OK) {
      Curl_add_buffer_free(&data->state.trailers_buf);
      curl_slist_free_all(trailers);
      return c;
    }
    infof(data, "Successfully compiled trailers.\r\n");
    curl_slist_free_all(trailers);
  }
#endif

  /* if we are transmitting trailing data, we don't need to write







|


















|
>




|

|


|







172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
      sending_http_headers = TRUE;
  }
#endif

#ifndef CURL_DISABLE_HTTP
  if(data->state.trailers_state == TRAILERS_INITIALIZED) {
    struct curl_slist *trailers = NULL;
    CURLcode result;
    int trailers_ret_code;

    /* at this point we already verified that the callback exists
       so we compile and store the trailers buffer, then proceed */
    infof(data,
          "Moving trailers state machine from initialized to sending.\n");
    data->state.trailers_state = TRAILERS_SENDING;
    data->state.trailers_buf = Curl_add_buffer_init();
    if(!data->state.trailers_buf) {
      failf(data, "Unable to allocate trailing headers buffer !");
      return CURLE_OUT_OF_MEMORY;
    }
    data->state.trailers_bytes_sent = 0;
    Curl_set_in_callback(data, true);
    trailers_ret_code = data->set.trailer_callback(&trailers,
                                                   data->set.trailer_data);
    Curl_set_in_callback(data, false);
    if(trailers_ret_code == CURL_TRAILERFUNC_OK) {
      result = Curl_http_compile_trailers(trailers, &data->state.trailers_buf,
                                          data);
    }
    else {
      failf(data, "operation aborted by trailing headers callback");
      *nreadp = 0;
      result = CURLE_ABORTED_BY_CALLBACK;
    }
    if(result) {
      Curl_add_buffer_free(&data->state.trailers_buf);
      curl_slist_free_all(trailers);
      return result;
    }
    infof(data, "Successfully compiled trailers.\r\n");
    curl_slist_free_all(trailers);
  }
#endif

  /* if we are transmitting trailing data, we don't need to write
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
    /* For HTTP/2, we may read up everything including response body
       with header fields in Curl_http_readwrite_headers. If no
       content-length is provided, curl waits for the connection
       close, which we emulate it using conn->proto.httpc.closed =
       TRUE. The thing is if we read everything, then http2_recv won't
       be called and we cannot signal the HTTP/2 stream has closed. As
       a workaround, we return nonzero here to call http2_recv. */
    ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion == 20);
#else
    Curl_ssl_data_pending(conn, FIRSTSOCKET);
#endif
}

/*
 * Check to see if CURLOPT_TIMECONDITION was met by comparing the time of the







|







494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
    /* For HTTP/2, we may read up everything including response body
       with header fields in Curl_http_readwrite_headers. If no
       content-length is provided, curl waits for the connection
       close, which we emulate it using conn->proto.httpc.closed =
       TRUE. The thing is if we read everything, then http2_recv won't
       be called and we cannot signal the HTTP/2 stream has closed. As
       a workaround, we return nonzero here to call http2_recv. */
    ((conn->handler->protocol&PROTO_FAMILY_HTTP) && conn->httpversion >= 20);
#else
    Curl_ssl_data_pending(conn, FIRSTSOCKET);
#endif
}

/*
 * Check to see if CURLOPT_TIMECONDITION was met by comparing the time of the
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
    else {
      /* read nothing but since we wanted nothing we consider this an OK
         situation to proceed from */
      DEBUGF(infof(data, "readwrite_data: we're done!\n"));
      nread = 0;
    }

    if((k->bytecount == 0) && (k->writebytecount == 0)) {
      Curl_pgrsTime(data, TIMER_STARTTRANSFER);
      if(k->exp100 > EXP100_SEND_DATA)
        /* set time stamp to compare with when waiting for the 100 */
        k->start100 = Curl_now();
    }

    *didwhat |= KEEP_RECV;







|







598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
    else {
      /* read nothing but since we wanted nothing we consider this an OK
         situation to proceed from */
      DEBUGF(infof(data, "readwrite_data: we're done!\n"));
      nread = 0;
    }

    if(!k->bytecount) {
      Curl_pgrsTime(data, TIMER_STARTTRANSFER);
      if(k->exp100 > EXP100_SEND_DATA)
        /* set time stamp to compare with when waiting for the 100 */
        k->start100 = Curl_now();
    }

    *didwhat |= KEEP_RECV;
938
939
940
941
942
943
944

945

946
947
948
949
950
951
952
}

CURLcode Curl_done_sending(struct connectdata *conn,
                           struct SingleRequest *k)
{
  k->keepon &= ~KEEP_SEND; /* we're done writing */


  Curl_http2_done_sending(conn);


  if(conn->bits.rewindaftersend) {
    CURLcode result = Curl_readrewind(conn);
    if(result)
      return result;
  }
  return CURLE_OK;







>

>







939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
}

CURLcode Curl_done_sending(struct connectdata *conn,
                           struct SingleRequest *k)
{
  k->keepon &= ~KEEP_SEND; /* we're done writing */

  /* These functions should be moved into the handler struct! */
  Curl_http2_done_sending(conn);
  Curl_quic_done_sending(conn);

  if(conn->bits.rewindaftersend) {
    CURLcode result = Curl_readrewind(conn);
    if(result)
      return result;
  }
  return CURLE_OK;
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
 * Curl_single_getsock() gets called by the multi interface code when the app
 * has requested to get the sockets for the current connection. This function
 * will then be called once for every connection that the multi interface
 * keeps track of. This function will only be called for connections that are
 * in the proper state to have this information available.
 */
int Curl_single_getsock(const struct connectdata *conn,
                        curl_socket_t *sock, /* points to numsocks number
                                                of sockets */
                        int numsocks)
{
  const struct Curl_easy *data = conn->data;
  int bitmap = GETSOCK_BLANK;
  unsigned sockindex = 0;

  if(conn->handler->perform_getsock)
    return conn->handler->perform_getsock(conn, sock, numsocks);

  if(numsocks < 2)
    /* simple check but we might need two slots */
    return GETSOCK_BLANK;

  /* don't include HOLD and PAUSE connections */
  if((data->req.keepon & KEEP_RECVBITS) == KEEP_RECV) {

    DEBUGASSERT(conn->sockfd != CURL_SOCKET_BAD);

    bitmap |= GETSOCK_READSOCK(sockindex);







|
<
<






|
<
<
<
<







1353
1354
1355
1356
1357
1358
1359
1360


1361
1362
1363
1364
1365
1366
1367




1368
1369
1370
1371
1372
1373
1374
 * Curl_single_getsock() gets called by the multi interface code when the app
 * has requested to get the sockets for the current connection. This function
 * will then be called once for every connection that the multi interface
 * keeps track of. This function will only be called for connections that are
 * in the proper state to have this information available.
 */
int Curl_single_getsock(const struct connectdata *conn,
                        curl_socket_t *sock)


{
  const struct Curl_easy *data = conn->data;
  int bitmap = GETSOCK_BLANK;
  unsigned sockindex = 0;

  if(conn->handler->perform_getsock)
    return conn->handler->perform_getsock(conn, sock);





  /* don't include HOLD and PAUSE connections */
  if((data->req.keepon & KEEP_RECVBITS) == KEEP_RECV) {

    DEBUGASSERT(conn->sockfd != CURL_SOCKET_BAD);

    bitmap |= GETSOCK_READSOCK(sockindex);
Changes to jni/curl/lib/transfer.h.
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

CURLcode Curl_follow(struct Curl_easy *data, char *newurl,
                     followtype type);
CURLcode Curl_readwrite(struct connectdata *conn,
                        struct Curl_easy *data, bool *done,
                        bool *comeback);
int Curl_single_getsock(const struct connectdata *conn,
                        curl_socket_t *socks,
                        int numsocks);
CURLcode Curl_readrewind(struct connectdata *conn);
CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
                             size_t *nreadp);
CURLcode Curl_retry_request(struct connectdata *conn, char **url);
bool Curl_meets_timecondition(struct Curl_easy *data, time_t timeofdoc);
CURLcode Curl_get_upload_buffer(struct Curl_easy *data);








|
<







43
44
45
46
47
48
49
50

51
52
53
54
55
56
57

CURLcode Curl_follow(struct Curl_easy *data, char *newurl,
                     followtype type);
CURLcode Curl_readwrite(struct connectdata *conn,
                        struct Curl_easy *data, bool *done,
                        bool *comeback);
int Curl_single_getsock(const struct connectdata *conn,
                        curl_socket_t *socks);

CURLcode Curl_readrewind(struct connectdata *conn);
CURLcode Curl_fillreadbuffer(struct connectdata *conn, size_t bytes,
                             size_t *nreadp);
CURLcode Curl_retry_request(struct connectdata *conn, char **url);
bool Curl_meets_timecondition(struct Curl_easy *data, time_t timeofdoc);
CURLcode Curl_get_upload_buffer(struct Curl_easy *data);

Changes to jni/curl/lib/url.c.
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "curl_ldap.h"
#include "ssh.h"
#include "imap.h"
#include "url.h"
#include "connect.h"
#include "inet_ntop.h"
#include "http_ntlm.h"
#include "socks.h"
#include "curl_rtmp.h"
#include "gopher.h"
#include "http_proxy.h"
#include "conncache.h"
#include "multihandle.h"
#include "dotdot.h"
#include "strdup.h"







<







108
109
110
111
112
113
114

115
116
117
118
119
120
121
#include "curl_ldap.h"
#include "ssh.h"
#include "imap.h"
#include "url.h"
#include "connect.h"
#include "inet_ntop.h"
#include "http_ntlm.h"

#include "curl_rtmp.h"
#include "gopher.h"
#include "http_proxy.h"
#include "conncache.h"
#include "multihandle.h"
#include "dotdot.h"
#include "strdup.h"
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
  set->buffer_size = READBUFFER_SIZE;
  set->upload_buffer_size = UPLOADBUFFER_DEFAULT;
  set->happy_eyeballs_timeout = CURL_HET_DEFAULT;
  set->fnmatch = ZERO_NULL;
  set->upkeep_interval_ms = CURL_UPKEEP_INTERVAL_DEFAULT;
  set->maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */
  set->maxage_conn = 118;
  set->http09_allowed = TRUE;
  set->httpversion =
#ifdef USE_NGHTTP2
    CURL_HTTP_VERSION_2TLS
#else
    CURL_HTTP_VERSION_1_1
#endif
    ;







|







541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
  set->buffer_size = READBUFFER_SIZE;
  set->upload_buffer_size = UPLOADBUFFER_DEFAULT;
  set->happy_eyeballs_timeout = CURL_HET_DEFAULT;
  set->fnmatch = ZERO_NULL;
  set->upkeep_interval_ms = CURL_UPKEEP_INTERVAL_DEFAULT;
  set->maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */
  set->maxage_conn = 118;
  set->http09_allowed = FALSE;
  set->httpversion =
#ifdef USE_NGHTTP2
    CURL_HTTP_VERSION_2TLS
#else
    CURL_HTTP_VERSION_1_1
#endif
    ;
711
712
713
714
715
716
717

718
719
720
721
722
723
724
  free_idnconverted_hostname(&conn->conn_to_host);
  free_idnconverted_hostname(&conn->http_proxy.host);
  free_idnconverted_hostname(&conn->socks_proxy.host);

  Curl_safefree(conn->user);
  Curl_safefree(conn->passwd);
  Curl_safefree(conn->oauth_bearer);

  Curl_safefree(conn->options);
  Curl_safefree(conn->http_proxy.user);
  Curl_safefree(conn->socks_proxy.user);
  Curl_safefree(conn->http_proxy.passwd);
  Curl_safefree(conn->socks_proxy.passwd);
  Curl_safefree(conn->allocptr.proxyuserpwd);
  Curl_safefree(conn->allocptr.uagent);







>







710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
  free_idnconverted_hostname(&conn->conn_to_host);
  free_idnconverted_hostname(&conn->http_proxy.host);
  free_idnconverted_hostname(&conn->socks_proxy.host);

  Curl_safefree(conn->user);
  Curl_safefree(conn->passwd);
  Curl_safefree(conn->oauth_bearer);
  Curl_safefree(conn->sasl_authzid);
  Curl_safefree(conn->options);
  Curl_safefree(conn->http_proxy.user);
  Curl_safefree(conn->socks_proxy.user);
  Curl_safefree(conn->http_proxy.passwd);
  Curl_safefree(conn->socks_proxy.passwd);
  Curl_safefree(conn->allocptr.proxyuserpwd);
  Curl_safefree(conn->allocptr.uagent);
968
969
970
971
972
973
974

975
976
977
978
979
980
981
982
 * This function scans the connection cache for half-open/dead connections,
 * closes and removes them.
 * The cleanup is done at most once per second.
 */
static void prune_dead_connections(struct Curl_easy *data)
{
  struct curltime now = Curl_now();

  time_t elapsed = Curl_timediff(now, data->state.conn_cache->last_cleanup);

  if(elapsed >= 1000L) {
    struct prunedead prune;
    prune.data = data;
    prune.extracted = NULL;
    while(Curl_conncache_foreach(data, data->state.conn_cache, &prune,
                                 call_extract_if_dead)) {







>
|







968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
 * This function scans the connection cache for half-open/dead connections,
 * closes and removes them.
 * The cleanup is done at most once per second.
 */
static void prune_dead_connections(struct Curl_easy *data)
{
  struct curltime now = Curl_now();
  timediff_t elapsed =
    Curl_timediff(now, data->state.conn_cache->last_cleanup);

  if(elapsed >= 1000L) {
    struct prunedead prune;
    prune.data = data;
    prune.extracted = NULL;
    while(Curl_conncache_foreach(data, data->state.conn_cache, &prune,
                                 call_extract_if_dead)) {
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
          "Found pending candidate for reuse and CURLOPT_PIPEWAIT is set\n");
    *waitpipe = TRUE;
  }

  return FALSE; /* no matching connecting exists */
}

/* after a TCP connection to the proxy has been verified, this function does
   the next magic step.

   Note: this function's sub-functions call failf()

*/
CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex)
{
  CURLcode result = CURLE_OK;

  if(conn->bits.socksproxy) {
#ifndef CURL_DISABLE_PROXY
    /* for the secondary socket (FTP), use the "connect to host"
     * but ignore the "connect to port" (use the secondary port)
     */
    const char * const host = conn->bits.httpproxy ?
                              conn->http_proxy.host.name :
                              conn->bits.conn_to_host ?
                              conn->conn_to_host.name :
                              sockindex == SECONDARYSOCKET ?
                              conn->secondaryhostname : conn->host.name;
    const int port = conn->bits.httpproxy ? (int)conn->http_proxy.port :
                     sockindex == SECONDARYSOCKET ? conn->secondary_port :
                     conn->bits.conn_to_port ? conn->conn_to_port :
                     conn->remote_port;
    conn->bits.socksproxy_connecting = TRUE;
    switch(conn->socks_proxy.proxytype) {
    case CURLPROXY_SOCKS5:
    case CURLPROXY_SOCKS5_HOSTNAME:
      result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd,
                         host, port, sockindex, conn);
      break;

    case CURLPROXY_SOCKS4:
    case CURLPROXY_SOCKS4A:
      result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex,
                           conn);
      break;

    default:
      failf(conn->data, "unknown proxytype option given");
      result = CURLE_COULDNT_CONNECT;
    } /* switch proxytype */
    conn->bits.socksproxy_connecting = FALSE;
#else
  (void)sockindex;
#endif /* CURL_DISABLE_PROXY */
  }

  return result;
}

/*
 * verboseconnect() displays verbose information after a connect
 */
#ifndef CURL_DISABLE_VERBOSE_STRINGS
void Curl_verboseconnect(struct connectdata *conn)
{
  if(conn->data->set.verbose)
    infof(conn->data, "Connected to %s (%s) port %ld (#%ld)\n",
          conn->bits.socksproxy ? conn->socks_proxy.host.dispname :
          conn->bits.httpproxy ? conn->http_proxy.host.dispname :
          conn->bits.conn_to_host ? conn->conn_to_host.dispname :
          conn->host.dispname,
          conn->ip_addr_str, conn->port, conn->connection_id);
}
#endif

int Curl_protocol_getsock(struct connectdata *conn,
                          curl_socket_t *socks,
                          int numsocks)
{
  if(conn->handler->proto_getsock)
    return conn->handler->proto_getsock(conn, socks, numsocks);
  /* Backup getsock logic. Since there is a live socket in use, we must wait
     for it or it will be removed from watching when the multi_socket API is
     used. */
  socks[0] = conn->sock[FIRSTSOCKET];
  return GETSOCK_READSOCK(0) | GETSOCK_WRITESOCK(0);
}

int Curl_doing_getsock(struct connectdata *conn,
                       curl_socket_t *socks,
                       int numsocks)
{
  if(conn && conn->handler->doing_getsock)
    return conn->handler->doing_getsock(conn, socks, numsocks);
  return GETSOCK_BLANK;
}

/*
 * We are doing protocol-specific connecting and this is being called over and
 * over from the multi interface until the connection phase is done on
 * protocol layer.
 */

CURLcode Curl_protocol_connecting(struct connectdata *conn,
                                  bool *done)
{
  CURLcode result = CURLE_OK;

  if(conn && conn->handler->connecting) {
    *done = FALSE;
    result = conn->handler->connecting(conn, done);
  }
  else
    *done = TRUE;

  return result;
}

/*
 * We are DOING this is being called over and over from the multi interface
 * until the DOING phase is done on protocol layer.
 */

CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done)
{
  CURLcode result = CURLE_OK;

  if(conn && conn->handler->doing) {
    *done = FALSE;
    result = conn->handler->doing(conn, done);
  }
  else
    *done = TRUE;

  return result;
}

/*
 * We have discovered that the TCP connection has been successful, we can now
 * proceed with some action.
 *
 */
CURLcode Curl_protocol_connect(struct connectdata *conn,
                               bool *protocol_done)
{
  CURLcode result = CURLE_OK;

  *protocol_done = FALSE;

  if(conn->bits.tcpconnect[FIRSTSOCKET] && conn->bits.protoconnstart) {
    /* We already are connected, get back. This may happen when the connect
       worked fine in the first call, like when we connect to a local server
       or proxy. Note that we don't know if the protocol is actually done.

       Unless this protocol doesn't have any protocol-connect callback, as
       then we know we're done. */
    if(!conn->handler->connecting)
      *protocol_done = TRUE;

    return CURLE_OK;
  }

  if(!conn->bits.protoconnstart) {

    result = Curl_proxy_connect(conn, FIRSTSOCKET);
    if(result)
      return result;

    if(CONNECT_FIRSTSOCKET_PROXY_SSL())
      /* wait for HTTPS proxy SSL initialization to complete */
      return CURLE_OK;

    if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
       Curl_connect_ongoing(conn))
      /* when using an HTTP tunnel proxy, await complete tunnel establishment
         before proceeding further. Return CURLE_OK so we'll be called again */
      return CURLE_OK;

    if(conn->handler->connect_it) {
      /* is there a protocol-specific connect() procedure? */

      /* Call the protocol-specific connect function */
      result = conn->handler->connect_it(conn, protocol_done);
    }
    else
      *protocol_done = TRUE;

    /* it has started, possibly even completed but that knowledge isn't stored
       in this bit! */
    if(!result)
      conn->bits.protoconnstart = TRUE;
  }

  return result; /* pass back status */
}

/*
 * Helpers for IDNA conversions.
 */
static bool is_ASCII_name(const char *hostname)
{
  const unsigned char *ch = (const unsigned char *)hostname;








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
















<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







1368
1369
1370
1371
1372
1373
1374




















































1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390

























































































































1391
1392
1393
1394
1395
1396
1397
          "Found pending candidate for reuse and CURLOPT_PIPEWAIT is set\n");
    *waitpipe = TRUE;
  }

  return FALSE; /* no matching connecting exists */
}





















































/*
 * verboseconnect() displays verbose information after a connect
 */
#ifndef CURL_DISABLE_VERBOSE_STRINGS
void Curl_verboseconnect(struct connectdata *conn)
{
  if(conn->data->set.verbose)
    infof(conn->data, "Connected to %s (%s) port %ld (#%ld)\n",
          conn->bits.socksproxy ? conn->socks_proxy.host.dispname :
          conn->bits.httpproxy ? conn->http_proxy.host.dispname :
          conn->bits.conn_to_host ? conn->conn_to_host.dispname :
          conn->host.dispname,
          conn->ip_addr_str, conn->port, conn->connection_id);
}
#endif


























































































































/*
 * Helpers for IDNA conversions.
 */
static bool is_ASCII_name(const char *hostname)
{
  const unsigned char *ch = (const unsigned char *)hostname;

1770
1771
1772
1773
1774
1775
1776

1777
1778
1779
1780
1781
1782
1783
  conn->ssl_config.verifyhost = data->set.ssl.primary.verifyhost;
  conn->proxy_ssl_config.verifystatus =
    data->set.proxy_ssl.primary.verifystatus;
  conn->proxy_ssl_config.verifypeer = data->set.proxy_ssl.primary.verifypeer;
  conn->proxy_ssl_config.verifyhost = data->set.proxy_ssl.primary.verifyhost;
  conn->ip_version = data->set.ipver;
  conn->bits.connect_only = data->set.connect_only;


#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
    defined(NTLM_WB_ENABLED)
  conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
#endif

  /* Initialize the easy handle list */







>







1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
  conn->ssl_config.verifyhost = data->set.ssl.primary.verifyhost;
  conn->proxy_ssl_config.verifystatus =
    data->set.proxy_ssl.primary.verifystatus;
  conn->proxy_ssl_config.verifypeer = data->set.proxy_ssl.primary.verifypeer;
  conn->proxy_ssl_config.verifyhost = data->set.proxy_ssl.primary.verifyhost;
  conn->ip_version = data->set.ipver;
  conn->bits.connect_only = data->set.connect_only;
  conn->transport = TRNSPRT_TCP; /* most of them are TCP streams */

#if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \
    defined(NTLM_WB_ENABLED)
  conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
#endif

  /* Initialize the easy handle list */
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
 *
 * This MUST get called after proxy magic has been figured out.
 */
static CURLcode setup_connection_internals(struct connectdata *conn)
{
  const struct Curl_handler * p;
  CURLcode result;
  conn->socktype = SOCK_STREAM; /* most of them are TCP streams */

  /* Perform setup complement if some. */
  p = conn->handler;

  if(p->setup_connection) {
    result = (*p->setup_connection)(conn);








<







1935
1936
1937
1938
1939
1940
1941

1942
1943
1944
1945
1946
1947
1948
 *
 * This MUST get called after proxy magic has been figured out.
 */
static CURLcode setup_connection_internals(struct connectdata *conn)
{
  const struct Curl_handler * p;
  CURLcode result;


  /* Perform setup complement if some. */
  p = conn->handler;

  if(p->setup_connection) {
    result = (*p->setup_connection)(conn);

2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
    int ret;

    ret = Curl_parsenetrc(conn->host.name,
                          userp, passwdp,
                          &netrc_user_changed, &netrc_passwd_changed,
                          data->set.str[STRING_NETRC_FILE]);
    if(ret > 0) {
      infof(data, "Couldn't find host %s in the "
            DOT_CHAR "netrc file; using defaults\n",
            conn->host.name);
    }
    else if(ret < 0) {
      return CURLE_OUT_OF_MEMORY;
    }
    else {
      /* set bits.netrc TRUE to remember that we got the name from a .netrc







|
<







2684
2685
2686
2687
2688
2689
2690
2691

2692
2693
2694
2695
2696
2697
2698
    int ret;

    ret = Curl_parsenetrc(conn->host.name,
                          userp, passwdp,
                          &netrc_user_changed, &netrc_passwd_changed,
                          data->set.str[STRING_NETRC_FILE]);
    if(ret > 0) {
      infof(data, "Couldn't find host %s in the .netrc file; using defaults\n",

            conn->host.name);
    }
    else if(ret < 0) {
      return CURLE_OUT_OF_MEMORY;
    }
    else {
      /* set bits.netrc TRUE to remember that we got the name from a .netrc
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164










3165



3166
3167
3168










3169
3170
3171
3172
3173
3174
3175
3176
3177

3178
3179
3180

















3181
3182
3183
3184
3185
3186
3187
    conn_to_host = conn_to_host->next;
  }

#ifdef USE_ALTSVC
  if(data->asi && !host && (port == -1) &&
     (conn->handler->protocol == CURLPROTO_HTTPS)) {
    /* no connect_to match, try alt-svc! */
    const char *nhost;
    int nport;
    enum alpnid nalpnid;
    bool hit;










    host = conn->host.rawalloc;



    hit = Curl_altsvc_lookup(data->asi,
                             ALPN_h1, host, conn->remote_port, /* from */
                             &nalpnid, &nhost, &nport /* to */);










    if(hit) {
      char *hostd = strdup((char *)nhost);
      if(!hostd)
        return CURLE_OUT_OF_MEMORY;
      conn->conn_to_host.rawalloc = hostd;
      conn->conn_to_host.name = hostd;
      conn->bits.conn_to_host = TRUE;
      conn->conn_to_port = nport;
      conn->bits.conn_to_port = TRUE;

      infof(data, "Alt-svc connecting from [%s]%s:%d to [%s]%s:%d\n",
            Curl_alpnid2str(ALPN_h1), host, conn->remote_port,
            Curl_alpnid2str(nalpnid), hostd, nport);

















    }
  }
#endif

  return result;
}








<
<
|

>
>
>
>
>
>
>
>
>
>

>
>
>

|
|
>
>
>
>
>
>
>
>
>
>

|





|

>

|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







2981
2982
2983
2984
2985
2986
2987


2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
    conn_to_host = conn_to_host->next;
  }

#ifdef USE_ALTSVC
  if(data->asi && !host && (port == -1) &&
     (conn->handler->protocol == CURLPROTO_HTTPS)) {
    /* no connect_to match, try alt-svc! */


    enum alpnid srcalpnid;
    bool hit;
    struct altsvc *as;
    const int allowed_versions = ( ALPN_h1
#ifdef USE_NGHTTP2
      | ALPN_h2
#endif
#ifdef ENABLE_QUIC
      | ALPN_h3
#endif
      ) & data->asi->flags;

    host = conn->host.rawalloc;
#ifdef USE_NGHTTP2
    /* with h2 support, check that first */
    srcalpnid = ALPN_h2;
    hit = Curl_altsvc_lookup(data->asi,
                             srcalpnid, host, conn->remote_port, /* from */
                             &as /* to */,
                             allowed_versions);
    if(!hit)
#endif
    {
      srcalpnid = ALPN_h1;
      hit = Curl_altsvc_lookup(data->asi,
                               srcalpnid, host, conn->remote_port, /* from */
                               &as /* to */,
                               allowed_versions);
    }
    if(hit) {
      char *hostd = strdup((char *)as->dst.host);
      if(!hostd)
        return CURLE_OUT_OF_MEMORY;
      conn->conn_to_host.rawalloc = hostd;
      conn->conn_to_host.name = hostd;
      conn->bits.conn_to_host = TRUE;
      conn->conn_to_port = as->dst.port;
      conn->bits.conn_to_port = TRUE;
      conn->bits.altused = TRUE;
      infof(data, "Alt-svc connecting from [%s]%s:%d to [%s]%s:%d\n",
            Curl_alpnid2str(srcalpnid), host, conn->remote_port,
            Curl_alpnid2str(as->dst.alpnid), hostd, as->dst.port);
      if(srcalpnid != as->dst.alpnid) {
        /* protocol version switch */
        switch(as->dst.alpnid) {
        case ALPN_h1:
          conn->httpversion = 11;
          break;
        case ALPN_h2:
          conn->httpversion = 20;
          break;
        case ALPN_h3:
          conn->transport = TRNSPRT_QUIC;
          conn->httpversion = 30;
          break;
        default: /* shouldn't be possible */
          break;
        }
      }
    }
  }
#endif

  return result;
}

3459
3460
3461
3462
3463
3464
3465








3466
3467
3468
3469
3470
3471
3472
  if(data->set.str[STRING_BEARER]) {
    conn->oauth_bearer = strdup(data->set.str[STRING_BEARER]);
    if(!conn->oauth_bearer) {
      result = CURLE_OUT_OF_MEMORY;
      goto out;
    }
  }









#ifdef USE_UNIX_SOCKETS
  if(data->set.str[STRING_UNIX_SOCKET_PATH]) {
    conn->unix_domain_socket = strdup(data->set.str[STRING_UNIX_SOCKET_PATH]);
    if(conn->unix_domain_socket == NULL) {
      result = CURLE_OUT_OF_MEMORY;
      goto out;







>
>
>
>
>
>
>
>







3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
  if(data->set.str[STRING_BEARER]) {
    conn->oauth_bearer = strdup(data->set.str[STRING_BEARER]);
    if(!conn->oauth_bearer) {
      result = CURLE_OUT_OF_MEMORY;
      goto out;
    }
  }

  if(data->set.str[STRING_SASL_AUTHZID]) {
    conn->sasl_authzid = strdup(data->set.str[STRING_SASL_AUTHZID]);
    if(!conn->sasl_authzid) {
      result = CURLE_OUT_OF_MEMORY;
      goto out;
    }
  }

#ifdef USE_UNIX_SOCKETS
  if(data->set.str[STRING_UNIX_SOCKET_PATH]) {
    conn->unix_domain_socket = strdup(data->set.str[STRING_UNIX_SOCKET_PATH]);
    if(conn->unix_domain_socket == NULL) {
      result = CURLE_OUT_OF_MEMORY;
      goto out;
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
  default:
      family = 0;
      break;
  }

  return family;
}


/*
 * Wrapper to call functions in Curl_conncache_foreach()
 *
 * Returns always 0.
 */
static int conn_upkeep(struct connectdata *conn,
                       void *param)
{
  /* Param is unused. */
  (void)param;

  if(conn->handler->connection_check) {
    /* Do a protocol-specific keepalive check on the connection. */
    conn->handler->connection_check(conn, CONNCHECK_KEEPALIVE);
  }

  return 0; /* continue iteration */
}

CURLcode Curl_upkeep(struct conncache *conn_cache,
                          void *data)
{
  /* Loop over every connection and make connection alive. */
  Curl_conncache_foreach(data,
                         conn_cache,
                         data,
                         conn_upkeep);
  return CURLE_OK;
}







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
4032
4033
4034
4035
4036
4037
4038































  default:
      family = 0;
      break;
  }

  return family;
}































Changes to jni/curl/lib/url.h.
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

void Curl_freeset(struct Curl_easy * data);
CURLcode Curl_uc_to_curlcode(CURLUcode uc);
CURLcode Curl_close(struct Curl_easy *data); /* opposite of curl_open() */
CURLcode Curl_connect(struct Curl_easy *, bool *async, bool *protocol_connect);
CURLcode Curl_disconnect(struct Curl_easy *data,
                         struct connectdata *, bool dead_connection);
CURLcode Curl_protocol_connect(struct connectdata *conn, bool *done);
CURLcode Curl_protocol_connecting(struct connectdata *conn, bool *done);
CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done);
CURLcode Curl_setup_conn(struct connectdata *conn,
                         bool *protocol_done);
void Curl_free_request_state(struct Curl_easy *data);

int Curl_protocol_getsock(struct connectdata *conn,
                          curl_socket_t *socks,
                          int numsocks);
int Curl_doing_getsock(struct connectdata *conn,
                       curl_socket_t *socks,
                       int numsocks);
CURLcode Curl_parse_login_details(const char *login, const size_t len,
                                  char **userptr, char **passwdptr,
                                  char **optionsptr);
CURLcode Curl_upkeep(struct conncache *conn_cache, void *data);

const struct Curl_handler *Curl_builtin_scheme(const char *scheme);

#define CURL_DEFAULT_PROXY_PORT 1080 /* default proxy port unless specified */
#define CURL_DEFAULT_HTTPS_PROXY_PORT 443 /* default https proxy port unless
                                             specified */

CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex);

#ifdef CURL_DISABLE_VERBOSE_STRINGS
#define Curl_verboseconnect(x)  Curl_nop_stmt
#else
void Curl_verboseconnect(struct connectdata *conn);
#endif

#define CONNECT_PROXY_SSL()\







<
<
<



<
<
<
<
<
<
<



<







<
<







49
50
51
52
53
54
55



56
57
58







59
60
61

62
63
64
65
66
67
68


69
70
71
72
73
74
75

void Curl_freeset(struct Curl_easy * data);
CURLcode Curl_uc_to_curlcode(CURLUcode uc);
CURLcode Curl_close(struct Curl_easy *data); /* opposite of curl_open() */
CURLcode Curl_connect(struct Curl_easy *, bool *async, bool *protocol_connect);
CURLcode Curl_disconnect(struct Curl_easy *data,
                         struct connectdata *, bool dead_connection);



CURLcode Curl_setup_conn(struct connectdata *conn,
                         bool *protocol_done);
void Curl_free_request_state(struct Curl_easy *data);







CURLcode Curl_parse_login_details(const char *login, const size_t len,
                                  char **userptr, char **passwdptr,
                                  char **optionsptr);


const struct Curl_handler *Curl_builtin_scheme(const char *scheme);

#define CURL_DEFAULT_PROXY_PORT 1080 /* default proxy port unless specified */
#define CURL_DEFAULT_HTTPS_PROXY_PORT 443 /* default https proxy port unless
                                             specified */



#ifdef CURL_DISABLE_VERBOSE_STRINGS
#define Curl_verboseconnect(x)  Curl_nop_stmt
#else
void Curl_verboseconnect(struct connectdata *conn);
#endif

#define CONNECT_PROXY_SSL()\
Changes to jni/curl/lib/urlapi.c.
25
26
27
28
29
30
31

32
33
34
35
36
37
38
#include "urldata.h"
#include "urlapi-int.h"
#include "strcase.h"
#include "dotdot.h"
#include "url.h"
#include "escape.h"
#include "curl_ctype.h"


/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"

  /* MSDOS/Windows style drive prefix, eg c: in c:foo */







>







25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "urldata.h"
#include "urlapi-int.h"
#include "strcase.h"
#include "dotdot.h"
#include "url.h"
#include "escape.h"
#include "curl_ctype.h"
#include "inet_pton.h"

/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"

  /* MSDOS/Windows style drive prefix, eg c: in c:foo */
587
588
589
590
591
592
593
594
595
596
597
598


599
600
601
602


603
604
605
606
607

608
609
610
611
612
613
614
      return CURLUE_MALFORMED_INPUT;
  }
  return CURLUE_OK;
}

static CURLUcode hostname_check(struct Curl_URL *u, char *hostname)
{
  const char *l = NULL; /* accepted characters */
  size_t len;
  size_t hlen = strlen(hostname);

  if(hostname[0] == '[') {


    hostname++;
    l = "0123456789abcdefABCDEF::.";
    hlen -= 2;
  }



  if(l) {
    /* only valid letters are ok */
    len = strspn(hostname, l);
    if(hlen != len) {

      if(hostname[len] == '%') {
        /* this could now be '%[zone id]' */
        char zoneid[16];
        int i = 0;
        char *h = &hostname[len + 1];
        /* pass '25' if present and is a url encoded percent sign */
        if(!strncmp(h, "25", 2) && h[2] && (h[2] != ']'))







<




>
>

<

|
>
>

<



>







588
589
590
591
592
593
594

595
596
597
598
599
600
601

602
603
604
605
606

607
608
609
610
611
612
613
614
615
616
617
      return CURLUE_MALFORMED_INPUT;
  }
  return CURLUE_OK;
}

static CURLUcode hostname_check(struct Curl_URL *u, char *hostname)
{

  size_t len;
  size_t hlen = strlen(hostname);

  if(hostname[0] == '[') {
    char dest[16]; /* fits a binary IPv6 address */
    const char *l = "0123456789abcdefABCDEF:.";
    hostname++;

    hlen -= 2;

    if(hostname[hlen] != ']')
      return CURLUE_MALFORMED_INPUT;


    /* only valid letters are ok */
    len = strspn(hostname, l);
    if(hlen != len) {
      hlen = len;
      if(hostname[len] == '%') {
        /* this could now be '%[zone id]' */
        char zoneid[16];
        int i = 0;
        char *h = &hostname[len + 1];
        /* pass '25' if present and is a url encoded percent sign */
        if(!strncmp(h, "25", 2) && h[2] && (h[2] != ']'))
624
625
626
627
628
629
630






631
632
633
634
635
636
637
        hostname[len] = ']'; /* insert end bracket */
        hostname[len + 1] = 0; /* terminate the hostname */
      }
      else
        return CURLUE_MALFORMED_INPUT;
      /* hostname is fine */
    }






  }
  else {
    /* letters from the second string is not ok */
    len = strcspn(hostname, " ");
    if(hlen != len)
      /* hostname with bad content */
      return CURLUE_MALFORMED_INPUT;







>
>
>
>
>
>







627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
        hostname[len] = ']'; /* insert end bracket */
        hostname[len + 1] = 0; /* terminate the hostname */
      }
      else
        return CURLUE_MALFORMED_INPUT;
      /* hostname is fine */
    }
#ifdef ENABLE_IPV6
    hostname[hlen] = 0; /* end the address there */
    if(1 != Curl_inet_pton(AF_INET6, hostname, dest))
      return CURLUE_MALFORMED_INPUT;
    hostname[hlen] = ']'; /* restore ending bracket */
#endif
  }
  else {
    /* letters from the second string is not ok */
    len = strcspn(hostname, " ");
    if(hlen != len)
      /* hostname with bad content */
      return CURLUE_MALFORMED_INPUT;
Changes to jni/curl/lib/urldata.h.
125
126
127
128
129
130
131

132
133
134
135
136
137
138
#include "file.h"
#include "ssh.h"
#include "http.h"
#include "rtsp.h"
#include "smb.h"
#include "wildcard.h"
#include "multihandle.h"


#ifdef HAVE_GSSAPI
# ifdef HAVE_GSSGNU
#  include <gss.h>
# elif defined HAVE_GSSAPI_GSSAPI_H
#  include <gssapi/gssapi.h>
# else







>







125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include "file.h"
#include "ssh.h"
#include "http.h"
#include "rtsp.h"
#include "smb.h"
#include "wildcard.h"
#include "multihandle.h"
#include "quic.h"

#ifdef HAVE_GSSAPI
# ifdef HAVE_GSSGNU
#  include <gss.h>
# elif defined HAVE_GSSAPI_GSSAPI_H
#  include <gssapi/gssapi.h>
# else
400
401
402
403
404
405
406

407
408
409
410
411
412
413
  /* always modify bits.close with the connclose() and connkeep() macros! */
  bool proxy_ssl_connected[2]; /* TRUE when SSL initialization for HTTPS proxy
                                  is complete */
  bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
                         the first time on the first connect function call */
  bit close:1; /* if set, we close the connection after this request */
  bit reuse:1; /* if set, this is a re-used connection */

  bit conn_to_host:1; /* if set, this connection has a "connect to host"
                         that overrides the host in the URL */
  bit conn_to_port:1; /* if set, this connection has a "connect to port"
                         that overrides the port in the URL (remote port) */
  bit proxy:1; /* if set, this transfer is done through a proxy - any type */
  bit httpproxy:1;  /* if set, this transfer is done through a http proxy */
  bit socksproxy:1; /* if set, this transfer is done through a socks proxy */







>







401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
  /* always modify bits.close with the connclose() and connkeep() macros! */
  bool proxy_ssl_connected[2]; /* TRUE when SSL initialization for HTTPS proxy
                                  is complete */
  bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
                         the first time on the first connect function call */
  bit close:1; /* if set, we close the connection after this request */
  bit reuse:1; /* if set, this is a re-used connection */
  bit altused:1; /* this is an alt-svc "redirect" */
  bit conn_to_host:1; /* if set, this connection has a "connect to host"
                         that overrides the host in the URL */
  bit conn_to_port:1; /* if set, this connection has a "connect to port"
                         that overrides the port in the URL (remote port) */
  bit proxy:1; /* if set, this transfer is done through a proxy - any type */
  bit httpproxy:1;  /* if set, this transfer is done through a http proxy */
  bit socksproxy:1; /* if set, this transfer is done through a socks proxy */
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
  /* See above. */
  CURLcode (*connecting)(struct connectdata *, bool *done);
  CURLcode (*doing)(struct connectdata *, bool *done);

  /* Called from the multi interface during the PROTOCONNECT phase, and it
     should then return a proper fd set */
  int (*proto_getsock)(struct connectdata *conn,
                       curl_socket_t *socks,
                       int numsocks);

  /* Called from the multi interface during the DOING phase, and it should
     then return a proper fd set */
  int (*doing_getsock)(struct connectdata *conn,
                       curl_socket_t *socks,
                       int numsocks);

  /* Called from the multi interface during the DO_MORE phase, and it should
     then return a proper fd set */
  int (*domore_getsock)(struct connectdata *conn,
                        curl_socket_t *socks,
                        int numsocks);

  /* Called from the multi interface during the DO_DONE, PERFORM and
     WAITPERFORM phases, and it should then return a proper fd set. Not setting
     this will make libcurl use the generic default one. */
  int (*perform_getsock)(const struct connectdata *conn,
                         curl_socket_t *socks,
                         int numsocks);

  /* This function *MAY* be set to a protocol-dependent function that is run
   * by the curl_disconnect(), as a step in the disconnection.  If the handler
   * is called because the connection has been considered dead, dead_connection
   * is set to TRUE.
   */
  CURLcode (*disconnect)(struct connectdata *, bool dead_connection);







|
<




|
<




|
<





|
<







661
662
663
664
665
666
667
668

669
670
671
672
673

674
675
676
677
678

679
680
681
682
683
684

685
686
687
688
689
690
691
  /* See above. */
  CURLcode (*connecting)(struct connectdata *, bool *done);
  CURLcode (*doing)(struct connectdata *, bool *done);

  /* Called from the multi interface during the PROTOCONNECT phase, and it
     should then return a proper fd set */
  int (*proto_getsock)(struct connectdata *conn,
                       curl_socket_t *socks);


  /* Called from the multi interface during the DOING phase, and it should
     then return a proper fd set */
  int (*doing_getsock)(struct connectdata *conn,
                       curl_socket_t *socks);


  /* Called from the multi interface during the DO_MORE phase, and it should
     then return a proper fd set */
  int (*domore_getsock)(struct connectdata *conn,
                        curl_socket_t *socks);


  /* Called from the multi interface during the DO_DONE, PERFORM and
     WAITPERFORM phases, and it should then return a proper fd set. Not setting
     this will make libcurl use the generic default one. */
  int (*perform_getsock)(const struct connectdata *conn,
                         curl_socket_t *socks);


  /* This function *MAY* be set to a protocol-dependent function that is run
   * by the curl_disconnect(), as a step in the disconnection.  If the handler
   * is called because the connection has been considered dead, dead_connection
   * is set to TRUE.
   */
  CURLcode (*disconnect)(struct connectdata *, bool dead_connection);
778
779
780
781
782
783
784


785
786
787
788
789
790
791
    TUNNEL_CONNECT, /* CONNECT has been sent off */
    TUNNEL_COMPLETE /* CONNECT response received completely */
  } tunnel_state;
  bit chunked_encoding:1;
  bit close_connection:1;
};



/*
 * The connectdata struct contains all fields and variables that should be
 * unique for an entire connection.
 */
struct connectdata {
  /* 'data' is the CURRENT Curl_easy using this connection -- take great
     caution that this might very well vary between different times this







>
>







776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
    TUNNEL_CONNECT, /* CONNECT has been sent off */
    TUNNEL_COMPLETE /* CONNECT response received completely */
  } tunnel_state;
  bit chunked_encoding:1;
  bit close_connection:1;
};

struct ldapconninfo;

/*
 * The connectdata struct contains all fields and variables that should be
 * unique for an entire connection.
 */
struct connectdata {
  /* 'data' is the CURRENT Curl_easy using this connection -- take great
     caution that this might very well vary between different times this
827
828
829
830
831
832
833





834




835
836
837
838
839
840
841
  /* 'ip_addr_str' is the ip_addr data as a human readable string.
     It remains available as long as the connection does, which is longer than
     the ip_addr itself. */
  char ip_addr_str[MAX_IPADR_LEN];

  unsigned int scope_id;  /* Scope id for IPv6 */






  int socktype;  /* SOCK_STREAM or SOCK_DGRAM */





  struct hostname host;
  char *hostname_resolve; /* host name to resolve to address, allocated */
  char *secondaryhostname; /* secondary socket host name (ftp) */
  struct hostname conn_to_host; /* the host to connect to. valid only if
                                   bits.conn_to_host is set */








>
>
>
>
>
|
>
>
>
>







827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
  /* 'ip_addr_str' is the ip_addr data as a human readable string.
     It remains available as long as the connection does, which is longer than
     the ip_addr itself. */
  char ip_addr_str[MAX_IPADR_LEN];

  unsigned int scope_id;  /* Scope id for IPv6 */

  enum {
    TRNSPRT_TCP = 3,
    TRNSPRT_UDP = 4,
    TRNSPRT_QUIC = 5
  } transport;

#ifdef ENABLE_QUIC
  struct quicsocket hequic[2]; /* two, for happy eyeballs! */
  struct quicsocket *quic;
#endif

  struct hostname host;
  char *hostname_resolve; /* host name to resolve to address, allocated */
  char *secondaryhostname; /* secondary socket host name (ftp) */
  struct hostname conn_to_host; /* the host to connect to. valid only if
                                   bits.conn_to_host is set */

866
867
868
869
870
871
872
873

874
875
876
877
878
879
880
  char local_ip[MAX_IPADR_LEN];
  long local_port;

  char *user;    /* user name string, allocated */
  char *passwd;  /* password string, allocated */
  char *options; /* options string, allocated */

  char *oauth_bearer; /* bearer token for OAuth 2.0, allocated */


  int httpversion;        /* the HTTP version*10 reported by the server */
  int rtspversion;        /* the RTSP version*10 reported by the server */

  struct curltime now;     /* "current" time */
  struct curltime created; /* creation time */
  struct curltime lastused; /* when returned to the connection cache */







|
>







875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
  char local_ip[MAX_IPADR_LEN];
  long local_port;

  char *user;    /* user name string, allocated */
  char *passwd;  /* password string, allocated */
  char *options; /* options string, allocated */

  char *oauth_bearer;     /* bearer token for OAuth 2.0, allocated */
  char *sasl_authzid;     /* authorisation identity string, allocated */

  int httpversion;        /* the HTTP version*10 reported by the server */
  int rtspversion;        /* the RTSP version*10 reported by the server */

  struct curltime now;     /* "current" time */
  struct curltime created; /* creation time */
  struct curltime lastused; /* when returned to the connection cache */
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915

 /* connecttime: when connect() is called on the current IP address. Used to
    be able to track when to move on to try next IP - but only when the multi
    interface is used. */
  struct curltime connecttime;
  /* The two fields below get set in Curl_connecthost */
  int num_addr; /* number of addresses to try to connect to */
  time_t timeoutms_per_addr; /* how long time in milliseconds to spend on
                                trying to connect to each IP address */

  const struct Curl_handler *handler; /* Connection's protocol handler */
  const struct Curl_handler *given;   /* The protocol first given */

  long ip_version; /* copied from the Curl_easy at creation time */

  /* Protocols can use a custom keepalive mechanism to keep connections alive.







|
|







910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925

 /* connecttime: when connect() is called on the current IP address. Used to
    be able to track when to move on to try next IP - but only when the multi
    interface is used. */
  struct curltime connecttime;
  /* The two fields below get set in Curl_connecthost */
  int num_addr; /* number of addresses to try to connect to */
  timediff_t timeoutms_per_addr; /* how long time in milliseconds to spend on
                                    trying to connect to each IP address */

  const struct Curl_handler *handler; /* Connection's protocol handler */
  const struct Curl_handler *given;   /* The protocol first given */

  long ip_version; /* copied from the Curl_easy at creation time */

  /* Protocols can use a custom keepalive mechanism to keep connections alive.
1006
1007
1008
1009
1010
1011
1012
1013

1014
1015
1016
1017
1018
1019
1020
    struct ssh_conn sshc;
    struct tftp_state_data *tftpc;
    struct imap_conn imapc;
    struct pop3_conn pop3c;
    struct smtp_conn smtpc;
    struct rtsp_conn rtspc;
    struct smb_conn smbc;
    void *generic; /* RTMP and LDAP use this */

  } proto;

  int cselect_bits; /* bitmask of socket events */
  int waitfor;      /* current READ/WRITE bits to wait for */

#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
  int socks5_gssapi_enctype;







|
>







1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
    struct ssh_conn sshc;
    struct tftp_state_data *tftpc;
    struct imap_conn imapc;
    struct pop3_conn pop3c;
    struct smtp_conn smtpc;
    struct rtsp_conn rtspc;
    struct smb_conn smbc;
    void *rtmp;
    struct ldapconninfo *ldapc;
  } proto;

  int cselect_bits; /* bitmask of socket events */
  int waitfor;      /* current READ/WRITE bits to wait for */

#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
  int socks5_gssapi_enctype;
1061
1062
1063
1064
1065
1066
1067

1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
  curl_off_t header_size;  /* size of read header(s) in bytes */
  curl_off_t request_size; /* the amount of bytes sent in the request(s) */
  unsigned long proxyauthavail; /* what proxy auth types were announced */
  unsigned long httpauthavail;  /* what host auth types were announced */
  long numconnects; /* how many new connection did libcurl created */
  char *contenttype; /* the content type of the object */
  char *wouldredirect; /* URL this would've been redirected to if asked to */


  /* PureInfo members 'conn_primary_ip', 'conn_primary_port', 'conn_local_ip'
     and, 'conn_local_port' are copied over from the connectdata struct in
     order to allow curl_easy_getinfo() to return this information even when
     the session handle is no longer associated with a connection, and also
     allow curl_easy_reset() to clear this information from the session handle
     without disturbing information which is still alive, and that might be
     reused, in the connection cache. */

  char conn_primary_ip[MAX_IPADR_LEN];
  long conn_primary_port;
  char conn_local_ip[MAX_IPADR_LEN];
  long conn_local_port;
  const char *conn_scheme;
  unsigned int conn_protocol;
  struct curl_certinfo certs; /* info about the certs, only populated in
                                 OpenSSL, GnuTLS, Schannel, NSS and GSKit
                                 builds. Asked for with CURLOPT_CERTINFO
                                 / CURLINFO_CERTINFO */

  bit timecond:1;  /* set to TRUE if the time condition didn't match, which
                      thus made the document NOT get fetched */
};


struct Progress {
  time_t lastshow; /* time() of the last displayed progress meter or NULL to
                      force redraw at next call */
  curl_off_t size_dl; /* total expected size */
  curl_off_t size_ul; /* total expected size */
  curl_off_t downloaded; /* transferred so far */
  curl_off_t uploaded; /* transferred so far */

  curl_off_t current_speed; /* uses the currently fastest transfer */

  int width; /* screen width at download start */
  int flags; /* see progress.h */

  time_t timespent;

  curl_off_t dlspeed;
  curl_off_t ulspeed;

  time_t t_nslookup;
  time_t t_connect;
  time_t t_appconnect;
  time_t t_pretransfer;
  time_t t_starttransfer;
  time_t t_redirect;

  struct curltime start;
  struct curltime t_startsingle;
  struct curltime t_startop;
  struct curltime t_acceptdata;









>



















<


















|




|
|
|
|
|
|







1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098

1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
  curl_off_t header_size;  /* size of read header(s) in bytes */
  curl_off_t request_size; /* the amount of bytes sent in the request(s) */
  unsigned long proxyauthavail; /* what proxy auth types were announced */
  unsigned long httpauthavail;  /* what host auth types were announced */
  long numconnects; /* how many new connection did libcurl created */
  char *contenttype; /* the content type of the object */
  char *wouldredirect; /* URL this would've been redirected to if asked to */
  curl_off_t retry_after; /* info from Retry-After: header */

  /* PureInfo members 'conn_primary_ip', 'conn_primary_port', 'conn_local_ip'
     and, 'conn_local_port' are copied over from the connectdata struct in
     order to allow curl_easy_getinfo() to return this information even when
     the session handle is no longer associated with a connection, and also
     allow curl_easy_reset() to clear this information from the session handle
     without disturbing information which is still alive, and that might be
     reused, in the connection cache. */

  char conn_primary_ip[MAX_IPADR_LEN];
  long conn_primary_port;
  char conn_local_ip[MAX_IPADR_LEN];
  long conn_local_port;
  const char *conn_scheme;
  unsigned int conn_protocol;
  struct curl_certinfo certs; /* info about the certs, only populated in
                                 OpenSSL, GnuTLS, Schannel, NSS and GSKit
                                 builds. Asked for with CURLOPT_CERTINFO
                                 / CURLINFO_CERTINFO */

  bit timecond:1;  /* set to TRUE if the time condition didn't match, which
                      thus made the document NOT get fetched */
};


struct Progress {
  time_t lastshow; /* time() of the last displayed progress meter or NULL to
                      force redraw at next call */
  curl_off_t size_dl; /* total expected size */
  curl_off_t size_ul; /* total expected size */
  curl_off_t downloaded; /* transferred so far */
  curl_off_t uploaded; /* transferred so far */

  curl_off_t current_speed; /* uses the currently fastest transfer */

  int width; /* screen width at download start */
  int flags; /* see progress.h */

  timediff_t timespent;

  curl_off_t dlspeed;
  curl_off_t ulspeed;

  timediff_t t_nslookup;
  timediff_t t_connect;
  timediff_t t_appconnect;
  timediff_t t_pretransfer;
  timediff_t t_starttransfer;
  timediff_t t_redirect;

  struct curltime start;
  struct curltime t_startsingle;
  struct curltime t_startop;
  struct curltime t_acceptdata;


1217
1218
1219
1220
1221
1222
1223

1224
1225
1226
1227
1228
1229
1230
  EXPIRE_HAPPY_EYEBALLS_DNS, /* See asyn-ares.c */
  EXPIRE_HAPPY_EYEBALLS,
  EXPIRE_MULTI_PENDING,
  EXPIRE_RUN_NOW,
  EXPIRE_SPEEDCHECK,
  EXPIRE_TIMEOUT,
  EXPIRE_TOOFAST,

  EXPIRE_LAST /* not an actual timer, used as a marker only */
} expire_id;


typedef enum {
  TRAILERS_NONE,
  TRAILERS_INITIALIZED,







>







1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
  EXPIRE_HAPPY_EYEBALLS_DNS, /* See asyn-ares.c */
  EXPIRE_HAPPY_EYEBALLS,
  EXPIRE_MULTI_PENDING,
  EXPIRE_RUN_NOW,
  EXPIRE_SPEEDCHECK,
  EXPIRE_TIMEOUT,
  EXPIRE_TOOFAST,
  EXPIRE_QUIC,
  EXPIRE_LAST /* not an actual timer, used as a marker only */
} expire_id;


typedef enum {
  TRAILERS_NONE,
  TRAILERS_INITIALIZED,
1489
1490
1491
1492
1493
1494
1495




1496
1497
1498
1499
1500
1501
1502
  STRING_UNIX_SOCKET_PATH,      /* path to Unix socket, if used */
#endif
  STRING_TARGET,                /* CURLOPT_REQUEST_TARGET */
  STRING_DOH,                   /* CURLOPT_DOH_URL */
#ifdef USE_ALTSVC
  STRING_ALTSVC,                /* CURLOPT_ALTSVC */
#endif




  /* -- end of zero-terminated strings -- */

  STRING_LASTZEROTERMINATED,

  /* -- below this are pointers to binary data that cannot be strdup'ed. --- */

  STRING_COPYPOSTFIELDS,  /* if POST, set the fields' values here */







>
>
>
>







1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
  STRING_UNIX_SOCKET_PATH,      /* path to Unix socket, if used */
#endif
  STRING_TARGET,                /* CURLOPT_REQUEST_TARGET */
  STRING_DOH,                   /* CURLOPT_DOH_URL */
#ifdef USE_ALTSVC
  STRING_ALTSVC,                /* CURLOPT_ALTSVC */
#endif
  STRING_SASL_AUTHZID,          /* CURLOPT_SASL_AUTHZID */
#ifndef CURL_DISABLE_PROXY
  STRING_TEMP_URL,              /* temp URL storage for proxy use */
#endif
  /* -- end of zero-terminated strings -- */

  STRING_LASTZEROTERMINATED,

  /* -- below this are pointers to binary data that cannot be strdup'ed. --- */

  STRING_COPYPOSTFIELDS,  /* if POST, set the fields' values here */
Changes to jni/curl/lib/vauth/digest_sspi.c.
56
57
58
59
60
61
62





63
64
65
66
67
68
69
{
  PSecPkgInfo SecurityPackage;
  SECURITY_STATUS status;

  /* Query the security package for Digest */
  status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_DIGEST),
                                              &SecurityPackage);






  return (status == SEC_E_OK ? TRUE : FALSE);
}

/*
 * Curl_auth_create_digest_md5_message()
 *







>
>
>
>
>







56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
{
  PSecPkgInfo SecurityPackage;
  SECURITY_STATUS status;

  /* Query the security package for Digest */
  status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_DIGEST),
                                              &SecurityPackage);

  /* Release the package buffer as it is not required anymore */
  if(status == SEC_E_OK) {
    s_pSecFn->FreeContextBuffer(SecurityPackage);
  }

  return (status == SEC_E_OK ? TRUE : FALSE);
}

/*
 * Curl_auth_create_digest_md5_message()
 *
216
217
218
219
220
221
222



223
224
225
226
227
228
229
230
  else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) {
    s_pSecFn->FreeCredentialsHandle(&credentials);
    Curl_sspi_free_identity(p_identity);
    free(spn);
    free(output_token);
    free(input_token);




    return CURLE_RECV_ERROR;
  }

  /* Base64 encode the response */
  result = Curl_base64_encode(data, (char *) output_token, resp_buf.cbBuffer,
                              outptr, outlen);

  /* Free our handles */







>
>
>
|







221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
  else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) {
    s_pSecFn->FreeCredentialsHandle(&credentials);
    Curl_sspi_free_identity(p_identity);
    free(spn);
    free(output_token);
    free(input_token);

    if(status == SEC_E_INSUFFICIENT_MEMORY)
      return CURLE_OUT_OF_MEMORY;

    return CURLE_AUTH_ERROR;
  }

  /* Base64 encode the response */
  result = Curl_base64_encode(data, (char *) output_token, resp_buf.cbBuffer,
                              outptr, outlen);

  /* Free our handles */
603
604
605
606
607
608
609

610


611
612
613
614
615
616
617
      s_pSecFn->FreeCredentialsHandle(&credentials);

      Curl_sspi_free_identity(p_identity);
      free(output_token);

      Curl_safefree(digest->http_context);


      return CURLE_OUT_OF_MEMORY;


    }

    output_token_len = resp_buf.cbBuffer;

    s_pSecFn->FreeCredentialsHandle(&credentials);
    Curl_sspi_free_identity(p_identity);
  }







>
|
>
>







611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
      s_pSecFn->FreeCredentialsHandle(&credentials);

      Curl_sspi_free_identity(p_identity);
      free(output_token);

      Curl_safefree(digest->http_context);

      if(status == SEC_E_INSUFFICIENT_MEMORY)
        return CURLE_OUT_OF_MEMORY;

      return CURLE_AUTH_ERROR;
    }

    output_token_len = resp_buf.cbBuffer;

    s_pSecFn->FreeCredentialsHandle(&credentials);
    Curl_sspi_free_identity(p_identity);
  }
Changes to jni/curl/lib/vauth/krb5_gssapi.c.
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
                                   GSS_C_NT_HOSTBASED_SERVICE, &krb5->spn);
    if(GSS_ERROR(major_status)) {
      Curl_gss_log_error(data, "gss_import_name() failed: ",
                         major_status, minor_status);

      free(spn);

      return CURLE_OUT_OF_MEMORY;
    }

    free(spn);
  }

  if(chlg64 && *chlg64) {
    /* Decode the base-64 encoded challenge message */







|







117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
                                   GSS_C_NT_HOSTBASED_SERVICE, &krb5->spn);
    if(GSS_ERROR(major_status)) {
      Curl_gss_log_error(data, "gss_import_name() failed: ",
                         major_status, minor_status);

      free(spn);

      return CURLE_AUTH_ERROR;
    }

    free(spn);
  }

  if(chlg64 && *chlg64) {
    /* Decode the base-64 encoded challenge message */
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
  if(GSS_ERROR(major_status)) {
    if(output_token.value)
      gss_release_buffer(&unused_status, &output_token);

    Curl_gss_log_error(data, "gss_init_sec_context() failed: ",
                       major_status, minor_status);

    return CURLE_RECV_ERROR;
  }

  if(output_token.value && output_token.length) {
    /* Base64 encode the response */
    result = Curl_base64_encode(data, (char *) output_token.value,
                                output_token.length, outptr, outlen);








|







164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
  if(GSS_ERROR(major_status)) {
    if(output_token.value)
      gss_release_buffer(&unused_status, &output_token);

    Curl_gss_log_error(data, "gss_init_sec_context() failed: ",
                       major_status, minor_status);

    return CURLE_AUTH_ERROR;
  }

  if(output_token.value && output_token.length) {
    /* Base64 encode the response */
    result = Curl_base64_encode(data, (char *) output_token.value,
                                output_token.length, outptr, outlen);

248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
                                     NULL, NULL);
  if(GSS_ERROR(major_status)) {
    Curl_gss_log_error(data, "gss_inquire_context() failed: ",
                       major_status, minor_status);

    free(chlg);

    return CURLE_OUT_OF_MEMORY;
  }

  /* Convert the username from internal format to a displayable token */
  major_status = gss_display_name(&minor_status, username,
                                  &username_token, NULL);
  if(GSS_ERROR(major_status)) {
    Curl_gss_log_error(data, "gss_display_name() failed: ",
                       major_status, minor_status);

    free(chlg);

    return CURLE_OUT_OF_MEMORY;
  }

  /* Setup the challenge "input" security buffer */
  input_token.value = chlg;
  input_token.length = chlglen;

  /* Decrypt the inbound challenge and obtain the qop */







|











|







248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
                                     NULL, NULL);
  if(GSS_ERROR(major_status)) {
    Curl_gss_log_error(data, "gss_inquire_context() failed: ",
                       major_status, minor_status);

    free(chlg);

    return CURLE_AUTH_ERROR;
  }

  /* Convert the username from internal format to a displayable token */
  major_status = gss_display_name(&minor_status, username,
                                  &username_token, NULL);
  if(GSS_ERROR(major_status)) {
    Curl_gss_log_error(data, "gss_display_name() failed: ",
                       major_status, minor_status);

    free(chlg);

    return CURLE_AUTH_ERROR;
  }

  /* Setup the challenge "input" security buffer */
  input_token.value = chlg;
  input_token.length = chlglen;

  /* Decrypt the inbound challenge and obtain the qop */
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
                          &output_token);
  if(GSS_ERROR(major_status)) {
    Curl_gss_log_error(data, "gss_wrap() failed: ",
                       major_status, minor_status);

    free(message);

    return CURLE_OUT_OF_MEMORY;
  }

  /* Base64 encode the response */
  result = Curl_base64_encode(data, (char *) output_token.value,
                              output_token.length, outptr, outlen);

  /* Free the output buffer */







|







351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
                          &output_token);
  if(GSS_ERROR(major_status)) {
    Curl_gss_log_error(data, "gss_wrap() failed: ",
                       major_status, minor_status);

    free(message);

    return CURLE_AUTH_ERROR;
  }

  /* Base64 encode the response */
  result = Curl_base64_encode(data, (char *) output_token.value,
                              output_token.length, outptr, outlen);

  /* Free the output buffer */
Changes to jni/curl/lib/vauth/krb5_sspi.c.
53
54
55
56
57
58
59





60
61
62
63
64
65
66
  PSecPkgInfo SecurityPackage;
  SECURITY_STATUS status;

  /* Query the security package for Kerberos */
  status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *)
                                              TEXT(SP_NAME_KERBEROS),
                                              &SecurityPackage);






  return (status == SEC_E_OK ? TRUE : FALSE);
}

/*
 * Curl_auth_create_gssapi_user_message()
 *







>
>
>
>
>







53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  PSecPkgInfo SecurityPackage;
  SECURITY_STATUS status;

  /* Query the security package for Kerberos */
  status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *)
                                              TEXT(SP_NAME_KERBEROS),
                                              &SecurityPackage);

  /* Release the package buffer as it is not required anymore */
  if(status == SEC_E_OK) {
    s_pSecFn->FreeContextBuffer(SecurityPackage);
  }

  return (status == SEC_E_OK ? TRUE : FALSE);
}

/*
 * Curl_auth_create_gssapi_user_message()
 *
212
213
214
215
216
217
218
219




220
221
222
223
224
225
226
227
228
                                               chlg ? &chlg_desc : NULL, 0,
                                               &context,
                                               &resp_desc, &attrs,
                                               &expiry);

  /* Free the decoded challenge as it is not required anymore */
  free(chlg);





  if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) {
    return CURLE_RECV_ERROR;
  }

  if(memcmp(&context, krb5->context, sizeof(context))) {
    s_pSecFn->DeleteSecurityContext(krb5->context);

    memcpy(krb5->context, &context, sizeof(context));
  }








>
>
>
>

|







217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
                                               chlg ? &chlg_desc : NULL, 0,
                                               &context,
                                               &resp_desc, &attrs,
                                               &expiry);

  /* Free the decoded challenge as it is not required anymore */
  free(chlg);

  if(status == SEC_E_INSUFFICIENT_MEMORY) {
    return CURLE_OUT_OF_MEMORY;
  }

  if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED) {
    return CURLE_AUTH_ERROR;
  }

  if(memcmp(&context, krb5->context, sizeof(context))) {
    s_pSecFn->DeleteSecurityContext(krb5->context);

    memcpy(krb5->context, &context, sizeof(context));
  }
305
306
307
308
309
310
311

312


313
314
315
316
317
318
319
320
321



322
323
324
325
326
327
328
329
  /* Get our response size information */
  status = s_pSecFn->QueryContextAttributes(krb5->context,
                                            SECPKG_ATTR_SIZES,
                                            &sizes);
  if(status != SEC_E_OK) {
    free(chlg);


    return CURLE_OUT_OF_MEMORY;


  }

  /* Get the fully qualified username back from the context */
  status = s_pSecFn->QueryCredentialsAttributes(krb5->credentials,
                                                SECPKG_CRED_ATTR_NAMES,
                                                &names);
  if(status != SEC_E_OK) {
    free(chlg);




    return CURLE_RECV_ERROR;
  }

  /* Setup the "input" security buffer */
  input_desc.ulVersion = SECBUFFER_VERSION;
  input_desc.cBuffers = 2;
  input_desc.pBuffers = input_buf;
  input_buf[0].BufferType = SECBUFFER_STREAM;







>
|
>
>









>
>
>
|







314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
  /* Get our response size information */
  status = s_pSecFn->QueryContextAttributes(krb5->context,
                                            SECPKG_ATTR_SIZES,
                                            &sizes);
  if(status != SEC_E_OK) {
    free(chlg);

    if(status == SEC_E_INSUFFICIENT_MEMORY)
      return CURLE_OUT_OF_MEMORY;

    return CURLE_AUTH_ERROR;
  }

  /* Get the fully qualified username back from the context */
  status = s_pSecFn->QueryCredentialsAttributes(krb5->credentials,
                                                SECPKG_CRED_ATTR_NAMES,
                                                &names);
  if(status != SEC_E_OK) {
    free(chlg);

    if(status == SEC_E_INSUFFICIENT_MEMORY)
      return CURLE_OUT_OF_MEMORY;

    return CURLE_AUTH_ERROR;
  }

  /* Setup the "input" security buffer */
  input_desc.ulVersion = SECBUFFER_VERSION;
  input_desc.cBuffers = 2;
  input_desc.pBuffers = input_buf;
  input_buf[0].BufferType = SECBUFFER_STREAM;
434
435
436
437
438
439
440

441


442
443
444
445
446
447
448
  status = s_pSecFn->EncryptMessage(krb5->context, KERB_WRAP_NO_ENCRYPT,
                                    &wrap_desc, 0);
  if(status != SEC_E_OK) {
    free(padding);
    free(message);
    free(trailer);


    return CURLE_OUT_OF_MEMORY;


  }

  /* Allocate the encryption (wrap) buffer */
  appdatalen = wrap_buf[0].cbBuffer + wrap_buf[1].cbBuffer +
               wrap_buf[2].cbBuffer;
  appdata = malloc(appdatalen);
  if(!appdata) {







>
|
>
>







449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
  status = s_pSecFn->EncryptMessage(krb5->context, KERB_WRAP_NO_ENCRYPT,
                                    &wrap_desc, 0);
  if(status != SEC_E_OK) {
    free(padding);
    free(message);
    free(trailer);

    if(status == SEC_E_INSUFFICIENT_MEMORY)
      return CURLE_OUT_OF_MEMORY;

    return CURLE_AUTH_ERROR;
  }

  /* Allocate the encryption (wrap) buffer */
  appdatalen = wrap_buf[0].cbBuffer + wrap_buf[1].cbBuffer +
               wrap_buf[2].cbBuffer;
  appdata = malloc(appdatalen);
  if(!appdata) {
Changes to jni/curl/lib/vauth/ntlm_sspi.c.
51
52
53
54
55
56
57





58
59
60
61
62
63
64
{
  PSecPkgInfo SecurityPackage;
  SECURITY_STATUS status;

  /* Query the security package for NTLM */
  status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_NTLM),
                                              &SecurityPackage);






  return (status == SEC_E_OK ? TRUE : FALSE);
}

/*
 * Curl_auth_create_ntlm_type1_message()
 *







>
>
>
>
>







51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
{
  PSecPkgInfo SecurityPackage;
  SECURITY_STATUS status;

  /* Query the security package for NTLM */
  status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT(SP_NAME_NTLM),
                                              &SecurityPackage);

  /* Release the package buffer as it is not required anymore */
  if(status == SEC_E_OK) {
    s_pSecFn->FreeContextBuffer(SecurityPackage);
  }

  return (status == SEC_E_OK ? TRUE : FALSE);
}

/*
 * Curl_auth_create_ntlm_type1_message()
 *
165
166
167
168
169
170
171


172
173
174
175
176
177
178
179
180
                                               0, 0, SECURITY_NETWORK_DREP,
                                               NULL, 0,
                                               ntlm->context, &type_1_desc,
                                               &attrs, &expiry);
  if(status == SEC_I_COMPLETE_NEEDED ||
    status == SEC_I_COMPLETE_AND_CONTINUE)
    s_pSecFn->CompleteAuthToken(ntlm->context, &type_1_desc);


  else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED)
    return CURLE_RECV_ERROR;

  /* Base64 encode the response */
  return Curl_base64_encode(data, (char *) ntlm->output_token,
                            type_1_buf.cbBuffer, outptr, outlen);
}

/*







>
>

|







170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
                                               0, 0, SECURITY_NETWORK_DREP,
                                               NULL, 0,
                                               ntlm->context, &type_1_desc,
                                               &attrs, &expiry);
  if(status == SEC_I_COMPLETE_NEEDED ||
    status == SEC_I_COMPLETE_AND_CONTINUE)
    s_pSecFn->CompleteAuthToken(ntlm->context, &type_1_desc);
  else if(status == SEC_E_INSUFFICIENT_MEMORY)
    return CURLE_OUT_OF_MEMORY;
  else if(status != SEC_E_OK && status != SEC_I_CONTINUE_NEEDED)
    return CURLE_AUTH_ERROR;

  /* Base64 encode the response */
  return Curl_base64_encode(data, (char *) ntlm->output_token,
                            type_1_buf.cbBuffer, outptr, outlen);
}

/*
312
313
314
315
316
317
318



319
320
321
322
323
324
325
326
                                               0, ntlm->context,
                                               &type_3_desc,
                                               &attrs, &expiry);
  if(status != SEC_E_OK) {
    infof(data, "NTLM handshake failure (type-3 message): Status=%x\n",
          status);




    return CURLE_RECV_ERROR;
  }

  /* Base64 encode the response */
  result = Curl_base64_encode(data, (char *) ntlm->output_token,
                              type_3_buf.cbBuffer, outptr, outlen);

  Curl_auth_cleanup_ntlm(ntlm);







>
>
>
|







319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
                                               0, ntlm->context,
                                               &type_3_desc,
                                               &attrs, &expiry);
  if(status != SEC_E_OK) {
    infof(data, "NTLM handshake failure (type-3 message): Status=%x\n",
          status);

    if(status == SEC_E_INSUFFICIENT_MEMORY)
      return CURLE_OUT_OF_MEMORY;

    return CURLE_AUTH_ERROR;
  }

  /* Base64 encode the response */
  result = Curl_base64_encode(data, (char *) ntlm->output_token,
                              type_3_buf.cbBuffer, outptr, outlen);

  Curl_auth_cleanup_ntlm(ntlm);
Changes to jni/curl/lib/vauth/spnego_gssapi.c.
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
                                   &nego->spn);
    if(GSS_ERROR(major_status)) {
      Curl_gss_log_error(data, "gss_import_name() failed: ",
                         major_status, minor_status);

      free(spn);

      return CURLE_OUT_OF_MEMORY;
    }

    free(spn);
  }

  if(chlg64 && *chlg64) {
    /* Decode the base-64 encoded challenge message */







|







117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
                                   &nego->spn);
    if(GSS_ERROR(major_status)) {
      Curl_gss_log_error(data, "gss_import_name() failed: ",
                         major_status, minor_status);

      free(spn);

      return CURLE_AUTH_ERROR;
    }

    free(spn);
  }

  if(chlg64 && *chlg64) {
    /* Decode the base-64 encoded challenge message */
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
  if(GSS_ERROR(major_status)) {
    if(output_token.value)
      gss_release_buffer(&unused_status, &output_token);

    Curl_gss_log_error(data, "gss_init_sec_context() failed: ",
                       major_status, minor_status);

    return CURLE_LOGIN_DENIED;
  }

  if(!output_token.value || !output_token.length) {
    if(output_token.value)
      gss_release_buffer(&unused_status, &output_token);

    return CURLE_OUT_OF_MEMORY;
  }

  /* Free previous token */
  if(nego->output_token.length && nego->output_token.value)
    gss_release_buffer(&unused_status, &nego->output_token);

  nego->output_token = output_token;







|






|







166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
  if(GSS_ERROR(major_status)) {
    if(output_token.value)
      gss_release_buffer(&unused_status, &output_token);

    Curl_gss_log_error(data, "gss_init_sec_context() failed: ",
                       major_status, minor_status);

    return CURLE_AUTH_ERROR;
  }

  if(!output_token.value || !output_token.length) {
    if(output_token.value)
      gss_release_buffer(&unused_status, &output_token);

    return CURLE_AUTH_ERROR;
  }

  /* Free previous token */
  if(nego->output_token.length && nego->output_token.value)
    gss_release_buffer(&unused_status, &nego->output_token);

  nego->output_token = output_token;
Changes to jni/curl/lib/vauth/spnego_sspi.c.
54
55
56
57
58
59
60






61
62
63
64
65
66
67
  PSecPkgInfo SecurityPackage;
  SECURITY_STATUS status;

  /* Query the security package for Negotiate */
  status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *)
                                              TEXT(SP_NAME_NEGOTIATE),
                                              &SecurityPackage);







  return (status == SEC_E_OK ? TRUE : FALSE);
}

/*
 * Curl_auth_decode_spnego_message()
 *







>
>
>
>
>
>







54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  PSecPkgInfo SecurityPackage;
  SECURITY_STATUS status;

  /* Query the security package for Negotiate */
  status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *)
                                              TEXT(SP_NAME_NEGOTIATE),
                                              &SecurityPackage);

  /* Release the package buffer as it is not required anymore */
  if(status == SEC_E_OK) {
    s_pSecFn->FreeContextBuffer(SecurityPackage);
  }


  return (status == SEC_E_OK ? TRUE : FALSE);
}

/*
 * Curl_auth_decode_spnego_message()
 *
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
    nego->status =
      s_pSecFn->AcquireCredentialsHandle(NULL,
                                         (TCHAR *)TEXT(SP_NAME_NEGOTIATE),
                                         SECPKG_CRED_OUTBOUND, NULL,
                                         nego->p_identity, NULL, NULL,
                                         nego->credentials, &expiry);
    if(nego->status != SEC_E_OK)
      return CURLE_LOGIN_DENIED;

    /* Allocate our new context handle */
    nego->context = calloc(1, sizeof(CtxtHandle));
    if(!nego->context)
      return CURLE_OUT_OF_MEMORY;
  }








|







167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
    nego->status =
      s_pSecFn->AcquireCredentialsHandle(NULL,
                                         (TCHAR *)TEXT(SP_NAME_NEGOTIATE),
                                         SECPKG_CRED_OUTBOUND, NULL,
                                         nego->p_identity, NULL, NULL,
                                         nego->credentials, &expiry);
    if(nego->status != SEC_E_OK)
      return CURLE_AUTH_ERROR;

    /* Allocate our new context handle */
    nego->context = calloc(1, sizeof(CtxtHandle));
    if(!nego->context)
      return CURLE_OUT_OF_MEMORY;
  }

247
248
249
250
251
252
253


254


255
256
257
258
259
260







261
262
263
264
265
266
267
268
  /* Free the decoded challenge as it is not required anymore */
  free(chlg);

  if(GSS_ERROR(nego->status)) {
    char buffer[STRERROR_LEN];
    failf(data, "InitializeSecurityContext failed: %s",
          Curl_sspi_strerror(nego->status, buffer, sizeof(buffer)));


    return CURLE_OUT_OF_MEMORY;


  }

  if(nego->status == SEC_I_COMPLETE_NEEDED ||
     nego->status == SEC_I_COMPLETE_AND_CONTINUE) {
    nego->status = s_pSecFn->CompleteAuthToken(nego->context, &resp_desc);
    if(GSS_ERROR(nego->status)) {







      return CURLE_RECV_ERROR;
    }
  }

  nego->output_token_length = resp_buf.cbBuffer;

  return result;
}







>
>
|
>
>






>
>
>
>
>
>
>
|







253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
  /* Free the decoded challenge as it is not required anymore */
  free(chlg);

  if(GSS_ERROR(nego->status)) {
    char buffer[STRERROR_LEN];
    failf(data, "InitializeSecurityContext failed: %s",
          Curl_sspi_strerror(nego->status, buffer, sizeof(buffer)));

    if(nego->status == (DWORD)SEC_E_INSUFFICIENT_MEMORY)
      return CURLE_OUT_OF_MEMORY;

    return CURLE_AUTH_ERROR;
  }

  if(nego->status == SEC_I_COMPLETE_NEEDED ||
     nego->status == SEC_I_COMPLETE_AND_CONTINUE) {
    nego->status = s_pSecFn->CompleteAuthToken(nego->context, &resp_desc);
    if(GSS_ERROR(nego->status)) {
      char buffer[STRERROR_LEN];
      failf(data, "CompleteAuthToken failed: %s",
            Curl_sspi_strerror(nego->status, buffer, sizeof(buffer)));

      if(nego->status == (DWORD)SEC_E_INSUFFICIENT_MEMORY)
        return CURLE_OUT_OF_MEMORY;

      return CURLE_AUTH_ERROR;
    }
  }

  nego->output_token_length = resp_buf.cbBuffer;

  return result;
}
Changes to jni/curl/lib/version.c.
23
24
25
26
27
28
29

30
31
32
33
34
35
36
#include "curl_setup.h"

#include <curl/curl.h>
#include "urldata.h"
#include "vtls/vtls.h"
#include "http2.h"
#include "ssh.h"

#include "curl_printf.h"

#ifdef USE_ARES
#  if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
     (defined(WIN32) || defined(__SYMBIAN32__))
#    define CARES_STATICLIB
#  endif







>







23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "curl_setup.h"

#include <curl/curl.h>
#include "urldata.h"
#include "vtls/vtls.h"
#include "http2.h"
#include "ssh.h"
#include "quic.h"
#include "curl_printf.h"

#ifdef USE_ARES
#  if defined(CURL_STATICLIB) && !defined(CARES_STATICLIB) && \
     (defined(WIN32) || defined(__SYMBIAN32__))
#    define CARES_STATICLIB
#  endif
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iconv.h>
#endif

#ifdef USE_LIBRTMP
#include <librtmp/rtmp.h>
#endif

#ifdef USE_LIBSSH2
#include <libssh2.h>
#endif

#ifdef HAVE_LIBSSH2_VERSION
/* get it run-time if possible */
#define CURL_LIBSSH2_VERSION libssh2_version(0)
#else
/* use build-time if run-time not possible */
#define CURL_LIBSSH2_VERSION LIBSSH2_VERSION
#endif

#ifdef HAVE_ZLIB_H
#include <zlib.h>
#ifdef __SYMBIAN32__
/* zlib pollutes the namespace with this definition */
#undef WIN32
#endif
#endif







<
<
<
<
<
<
<
<
<
<
<
<







50
51
52
53
54
55
56












57
58
59
60
61
62
63
#include <iconv.h>
#endif

#ifdef USE_LIBRTMP
#include <librtmp/rtmp.h>
#endif













#ifdef HAVE_ZLIB_H
#include <zlib.h>
#ifdef __SYMBIAN32__
/* zlib pollutes the namespace with this definition */
#undef WIN32
#endif
#endif
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  return msnprintf(buf, bufsz, "%u.%u.%u", major, minor, patch);
}
#endif

char *curl_version(void)
{
  static bool initialized;
  static char version[200];
  char *ptr = version;
  size_t len;
  size_t left = sizeof(version);

  if(initialized)
    return version;








|







87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
  return msnprintf(buf, bufsz, "%u.%u.%u", major, minor, patch);
}
#endif

char *curl_version(void)
{
  static bool initialized;
  static char version[250];
  char *ptr = version;
  size_t len;
  size_t left = sizeof(version);

  if(initialized)
    return version;

168
169
170
171
172
173
174
175
176
177
178
179
180

181
182
183
184
185
186
187
188





189
190
191
192
193
194
195
#else
  /* version unknown */
  len = msnprintf(ptr, left, " iconv");
#endif /* _LIBICONV_VERSION */
  left -= len;
  ptr += len;
#endif
#ifdef USE_LIBSSH2
  len = msnprintf(ptr, left, " libssh2/%s", CURL_LIBSSH2_VERSION);
  left -= len;
  ptr += len;
#endif
#ifdef USE_LIBSSH

  len = msnprintf(ptr, left, " libssh/%s", CURL_LIBSSH_VERSION);
  left -= len;
  ptr += len;
#endif
#ifdef USE_NGHTTP2
  len = Curl_http2_ver(ptr, left);
  left -= len;
  ptr += len;





#endif
#ifdef USE_LIBRTMP
  {
    char suff[2];
    if(RTMP_LIB_VERSION & 0xff) {
      suff[0] = (RTMP_LIB_VERSION & 0xff) + 'a' - 1;
      suff[1] = '\0';







|
<
|
|
|
<
>
|







>
>
>
>
>







157
158
159
160
161
162
163
164

165
166
167

168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#else
  /* version unknown */
  len = msnprintf(ptr, left, " iconv");
#endif /* _LIBICONV_VERSION */
  left -= len;
  ptr += len;
#endif
#ifdef USE_SSH

  if(left) {
    *ptr++=' ';
    left--;

  }
  len = Curl_ssh_version(ptr, left);
  left -= len;
  ptr += len;
#endif
#ifdef USE_NGHTTP2
  len = Curl_http2_ver(ptr, left);
  left -= len;
  ptr += len;
#endif
#ifdef ENABLE_QUIC
  len = Curl_quic_ver(ptr, left);
  left -= len;
  ptr += len;
#endif
#ifdef USE_LIBRTMP
  {
    char suff[2];
    if(RTMP_LIB_VERSION & 0xff) {
      suff[0] = (RTMP_LIB_VERSION & 0xff) + 'a' - 1;
      suff[1] = '\0';
353
354
355
356
357
358
359



360
361
362
363
364
365
366
  | CURL_VERSION_CONV
#endif
#if defined(USE_TLS_SRP)
  | CURL_VERSION_TLSAUTH_SRP
#endif
#if defined(USE_NGHTTP2)
  | CURL_VERSION_HTTP2



#endif
#if defined(USE_UNIX_SOCKETS)
  | CURL_VERSION_UNIX_SOCKETS
#endif
#if defined(USE_LIBPSL)
  | CURL_VERSION_PSL
#endif







>
>
>







346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
  | CURL_VERSION_CONV
#endif
#if defined(USE_TLS_SRP)
  | CURL_VERSION_TLSAUTH_SRP
#endif
#if defined(USE_NGHTTP2)
  | CURL_VERSION_HTTP2
#endif
#if defined(ENABLE_QUIC)
  | CURL_VERSION_HTTP3
#endif
#if defined(USE_UNIX_SOCKETS)
  | CURL_VERSION_UNIX_SOCKETS
#endif
#if defined(USE_LIBPSL)
  | CURL_VERSION_PSL
#endif
381
382
383
384
385
386
387



388
389
390
391
392
393
394
  NULL, /* c-ares version */
  0,    /* c-ares version numerical */
  NULL, /* libidn version */
  0,    /* iconv version */
  NULL, /* ssh lib version */
  0,    /* brotli_ver_num */
  NULL, /* brotli version */



};

curl_version_info_data *curl_version_info(CURLversion stamp)
{
  static bool initialized;
#if defined(USE_SSH)
  static char ssh_buffer[80];







>
>
>







377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
  NULL, /* c-ares version */
  0,    /* c-ares version numerical */
  NULL, /* libidn version */
  0,    /* iconv version */
  NULL, /* ssh lib version */
  0,    /* brotli_ver_num */
  NULL, /* brotli version */
  0,    /* nghttp2 version number */
  NULL, /* nghttp2 version string */
  NULL  /* quic library string */
};

curl_version_info_data *curl_version_info(CURLversion stamp)
{
  static bool initialized;
#if defined(USE_SSH)
  static char ssh_buffer[80];
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
















462
463
464
465
466
467
  version_info.iconv_ver_num = _LIBICONV_VERSION;
#else
  /* version unknown */
  version_info.iconv_ver_num = -1;
#endif /* _LIBICONV_VERSION */
#endif

#if defined(USE_LIBSSH2)
  msnprintf(ssh_buffer, sizeof(ssh_buffer), "libssh2/%s", LIBSSH2_VERSION);
  version_info.libssh_version = ssh_buffer;
#elif defined(USE_LIBSSH)
  msnprintf(ssh_buffer, sizeof(ssh_buffer), "libssh/%s", CURL_LIBSSH_VERSION);
  version_info.libssh_version = ssh_buffer;
#endif

#ifdef HAVE_BROTLI
  version_info.brotli_ver_num = BrotliDecoderVersion();
  brotli_version(brotli_buffer, sizeof(brotli_buffer));
  version_info.brotli_version = brotli_buffer;
#endif

















  (void)stamp; /* avoid compiler warnings, we don't use this */

  initialized = true;
  return &version_info;
}







|
|
<
<
<








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>






441
442
443
444
445
446
447
448
449



450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
  version_info.iconv_ver_num = _LIBICONV_VERSION;
#else
  /* version unknown */
  version_info.iconv_ver_num = -1;
#endif /* _LIBICONV_VERSION */
#endif

#if defined(USE_SSH)
  Curl_ssh_version(ssh_buffer, sizeof(ssh_buffer));



  version_info.libssh_version = ssh_buffer;
#endif

#ifdef HAVE_BROTLI
  version_info.brotli_ver_num = BrotliDecoderVersion();
  brotli_version(brotli_buffer, sizeof(brotli_buffer));
  version_info.brotli_version = brotli_buffer;
#endif

#ifdef USE_NGHTTP2
  {
    nghttp2_info *h2 = nghttp2_version(0);
    version_info.nghttp2_ver_num = h2->version_num;
    version_info.nghttp2_version = h2->version_str;
  }
#endif

#ifdef ENABLE_QUIC
  {
    static char quicbuffer[80];
    Curl_quic_ver(quicbuffer, sizeof(quicbuffer));
    version_info.quic_version = quicbuffer;
  }
#endif

  (void)stamp; /* avoid compiler warnings, we don't use this */

  initialized = true;
  return &version_info;
}
Added jni/curl/lib/vquic/ngtcp2.c.
































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#ifdef USE_NGTCP2
#include <ngtcp2/ngtcp2.h>
#include <ngtcp2/ngtcp2_crypto.h>
#include <nghttp3/nghttp3.h>
#include <openssl/err.h>
#include "urldata.h"
#include "sendf.h"
#include "strdup.h"
#include "rand.h"
#include "ngtcp2.h"
#include "multiif.h"
#include "strcase.h"
#include "connect.h"
#include "strerror.h"

/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"

/* #define DEBUG_NGTCP2 */
#define DEBUG_HTTP3
#ifdef DEBUG_HTTP3
#define H3BUGF(x) x
#else
#define H3BUGF(x) do { } WHILE_FALSE
#endif

/*
 * This holds outgoing HTTP/3 stream data that is used by nghttp3 until acked.
 * It is used as a circular buffer. Add new bytes at the end until it reaches
 * the far end, then start over at index 0 again.
 */

#define H3_SEND_SIZE (20*1024)
struct h3out {
  uint8_t buf[H3_SEND_SIZE];
  size_t used;   /* number of bytes used in the buffer */
  size_t windex; /* index in the buffer where to start writing the next
                    data block */
};

#define QUIC_MAX_STREAMS (256*1024)
#define QUIC_MAX_DATA (1*1024*1024)
#define QUIC_IDLE_TIMEOUT 60000 /* milliseconds */
#define QUIC_CIPHERS                                                          \
  "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_"               \
  "POLY1305_SHA256:TLS_AES_128_CCM_SHA256"
#define QUIC_GROUPS "P-256:X25519:P-384:P-521"

static CURLcode ng_process_ingress(struct connectdata *conn,
                                   curl_socket_t sockfd,
                                   struct quicsocket *qs);
static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
                                struct quicsocket *qs);
static int cb_h3_acked_stream_data(nghttp3_conn *conn, int64_t stream_id,
                                   size_t datalen, void *user_data,
                                   void *stream_user_data);

static ngtcp2_tstamp timestamp(void)
{
  struct curltime ct = Curl_now();
  return ct.tv_sec * NGTCP2_SECONDS + ct.tv_usec * NGTCP2_MICROSECONDS;
}

#ifdef DEBUG_NGTCP2
static void quic_printf(void *user_data, const char *fmt, ...)
{
  va_list ap;
  (void)user_data; /* TODO, use this to do infof() instead long-term */
  va_start(ap, fmt);
  vfprintf(stderr, fmt, ap);
  va_end(ap);
  fprintf(stderr, "\n");
}
#endif

static ngtcp2_crypto_level
quic_from_ossl_level(OSSL_ENCRYPTION_LEVEL ossl_level)
{
  switch(ossl_level) {
  case ssl_encryption_initial:
    return NGTCP2_CRYPTO_LEVEL_INITIAL;
  case ssl_encryption_early_data:
    return NGTCP2_CRYPTO_LEVEL_EARLY;
  case ssl_encryption_handshake:
    return NGTCP2_CRYPTO_LEVEL_HANDSHAKE;
  case ssl_encryption_application:
    return NGTCP2_CRYPTO_LEVEL_APP;
  default:
    assert(0);
  }
}

static int setup_initial_crypto_context(struct quicsocket *qs)
{
  const ngtcp2_cid *dcid = ngtcp2_conn_get_dcid(qs->qconn);

  if(ngtcp2_crypto_derive_and_install_initial_key(
         qs->qconn, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, dcid,
         NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
    return -1;

  return 0;
}

static void quic_settings(ngtcp2_settings *s,
                          uint64_t stream_buffer_size)
{
  ngtcp2_settings_default(s);
#ifdef DEBUG_NGTCP2
  s->log_printf = quic_printf;
#else
  s->log_printf = NULL;
#endif
  s->initial_ts = timestamp();
  s->max_stream_data_bidi_local = stream_buffer_size;
  s->max_stream_data_bidi_remote = QUIC_MAX_STREAMS;
  s->max_stream_data_uni = QUIC_MAX_STREAMS;
  s->max_data = QUIC_MAX_DATA;
  s->max_streams_bidi = 1;
  s->max_streams_uni = 3;
  s->idle_timeout = QUIC_IDLE_TIMEOUT;
}

static FILE *keylog_file; /* not thread-safe */
static void keylog_callback(const SSL *ssl, const char *line)
{
  (void)ssl;
  fputs(line, keylog_file);
  fputc('\n', keylog_file);
  fflush(keylog_file);
}

static int init_ngh3_conn(struct quicsocket *qs);

static int quic_set_encryption_secrets(SSL *ssl,
                                       OSSL_ENCRYPTION_LEVEL ossl_level,
                                       const uint8_t *rx_secret,
                                       const uint8_t *tx_secret,
                                       size_t secretlen)
{
  struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
  int level = quic_from_ossl_level(ossl_level);

  if(ngtcp2_crypto_derive_and_install_key(
         qs->qconn, ssl, NULL, NULL, NULL, NULL, NULL, NULL, level, rx_secret,
         tx_secret, secretlen, NGTCP2_CRYPTO_SIDE_CLIENT) != 0)
    return 0;

  if(level == NGTCP2_CRYPTO_LEVEL_APP && init_ngh3_conn(qs) != CURLE_OK)
    return 0;

  return 1;
}

static int quic_add_handshake_data(SSL *ssl, OSSL_ENCRYPTION_LEVEL ossl_level,
                                   const uint8_t *data, size_t len)
{
  struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
  struct quic_handshake *crypto_data;
  ngtcp2_crypto_level level = quic_from_ossl_level(ossl_level);
  int rv;

  crypto_data = &qs->client_crypto_data[level];
  if(crypto_data->buf == NULL) {
    crypto_data->buf = malloc(4096);
    crypto_data->alloclen = 4096;
    /* TODO Explode if malloc failed */
  }

  /* TODO Just pretend that handshake does not grow more than 4KiB for
     now */
  assert(crypto_data->len + len <= crypto_data->alloclen);

  memcpy(&crypto_data->buf[crypto_data->len], data, len);
  crypto_data->len += len;

  rv = ngtcp2_conn_submit_crypto_data(
      qs->qconn, level, (uint8_t *)(&crypto_data->buf[crypto_data->len] - len),
      len);
  if(rv) {
    fprintf(stderr, "write_client_handshake failed\n");
  }
  assert(0 == rv);

  return 1;
}

static int quic_flush_flight(SSL *ssl)
{
  (void)ssl;
  return 1;
}

static int quic_send_alert(SSL *ssl, enum ssl_encryption_level_t level,
                           uint8_t alert)
{
  struct quicsocket *qs = (struct quicsocket *)SSL_get_app_data(ssl);
  (void)level;

  qs->tls_alert = alert;
  return 1;
}

static SSL_QUIC_METHOD quic_method = {quic_set_encryption_secrets,
                                      quic_add_handshake_data,
                                      quic_flush_flight, quic_send_alert};

static SSL_CTX *quic_ssl_ctx(struct Curl_easy *data)
{
  SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_method());
  const char *keylog_filename;

  SSL_CTX_set_min_proto_version(ssl_ctx, TLS1_3_VERSION);
  SSL_CTX_set_max_proto_version(ssl_ctx, TLS1_3_VERSION);

  SSL_CTX_set_default_verify_paths(ssl_ctx);

  if(SSL_CTX_set_ciphersuites(ssl_ctx, QUIC_CIPHERS) != 1) {
    failf(data, "SSL_CTX_set_ciphersuites: %s",
          ERR_error_string(ERR_get_error(), NULL));
    return NULL;
  }

  if(SSL_CTX_set1_groups_list(ssl_ctx, QUIC_GROUPS) != 1) {
    failf(data, "SSL_CTX_set1_groups_list failed");
    return NULL;
  }

  SSL_CTX_set_quic_method(ssl_ctx, &quic_method);

  keylog_filename = getenv("SSLKEYLOGFILE");
  if(keylog_filename) {
    keylog_file = fopen(keylog_filename, "wb");
    if(keylog_file) {
      SSL_CTX_set_keylog_callback(ssl_ctx, keylog_callback);
    }
  }

  return ssl_ctx;
}

/** SSL callbacks ***/

static int quic_init_ssl(struct quicsocket *qs)
{
  const uint8_t *alpn = NULL;
  size_t alpnlen = 0;
  /* this will need some attention when HTTPS proxy over QUIC get fixed */
  const char * const hostname = qs->conn->host.name;

  if(qs->ssl)
    SSL_free(qs->ssl);

  qs->ssl = SSL_new(qs->sslctx);

  SSL_set_app_data(qs->ssl, qs);
  SSL_set_connect_state(qs->ssl);

  switch(qs->version) {
#ifdef NGTCP2_PROTO_VER
  case NGTCP2_PROTO_VER:
    alpn = (const uint8_t *)NGTCP2_ALPN_H3;
    alpnlen = sizeof(NGTCP2_ALPN_H3) - 1;
    break;
#endif
  }
  if(alpn)
    SSL_set_alpn_protos(qs->ssl, alpn, (int)alpnlen);

  /* set SNI */
  SSL_set_tlsext_host_name(qs->ssl, hostname);
  return 0;
}

static int cb_initial(ngtcp2_conn *quic, void *user_data)
{
  struct quicsocket *qs = (struct quicsocket *)user_data;

  if(ngtcp2_crypto_read_write_crypto_data(
         quic, qs->ssl, NGTCP2_CRYPTO_LEVEL_INITIAL, NULL, 0) != 0)
    return NGTCP2_ERR_CALLBACK_FAILURE;

  return 0;
}

static int
cb_recv_crypto_data(ngtcp2_conn *tconn, ngtcp2_crypto_level crypto_level,
                    uint64_t offset,
                    const uint8_t *data, size_t datalen,
                    void *user_data)
{
  struct quicsocket *qs = (struct quicsocket *)user_data;
  (void)offset;

  if(ngtcp2_crypto_read_write_crypto_data(tconn, qs->ssl, crypto_level, data,
                                          datalen) != 0)
    return NGTCP2_ERR_CRYPTO;

  return 0;
}

static int cb_handshake_completed(ngtcp2_conn *tconn, void *user_data)
{
  struct quicsocket *qs = (struct quicsocket *)user_data;
  (void)tconn;
  infof(qs->conn->data, "QUIC handshake is completed\n");

  return 0;
}

static int cb_recv_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
                               int fin, uint64_t offset,
                               const uint8_t *buf, size_t buflen,
                               void *user_data, void *stream_user_data)
{
  struct quicsocket *qs = (struct quicsocket *)user_data;
  ssize_t nconsumed;
  (void)offset;
  (void)stream_user_data;

  infof(qs->conn->data, "Received %ld bytes data on stream %u\n",
        buflen, stream_id);

  nconsumed =
    nghttp3_conn_read_stream(qs->h3conn, stream_id, buf, buflen, fin);
  if(nconsumed < 0) {
    failf(qs->conn->data, "nghttp3_conn_read_stream returned error: %s\n",
          nghttp3_strerror((int)nconsumed));
    return NGTCP2_ERR_CALLBACK_FAILURE;
  }

  ngtcp2_conn_extend_max_stream_offset(tconn, stream_id, nconsumed);
  ngtcp2_conn_extend_max_offset(tconn, nconsumed);

  return 0;
}

static int
cb_acked_stream_data_offset(ngtcp2_conn *tconn, int64_t stream_id,
                            uint64_t offset, size_t datalen, void *user_data,
                            void *stream_user_data)
{
  struct quicsocket *qs = (struct quicsocket *)user_data;
  int rv;
  (void)stream_id;
  (void)tconn;
  (void)offset;
  (void)datalen;
  (void)stream_user_data;

  rv = nghttp3_conn_add_ack_offset(qs->h3conn, stream_id, datalen);
  if(rv != 0) {
    failf(qs->conn->data, "nghttp3_conn_add_ack_offset returned error: %s\n",
          nghttp3_strerror(rv));
    return NGTCP2_ERR_CALLBACK_FAILURE;
  }

  return 0;
}

static int cb_stream_close(ngtcp2_conn *tconn, int64_t stream_id,
                           uint64_t app_error_code,
                           void *user_data, void *stream_user_data)
{
  struct quicsocket *qs = (struct quicsocket *)user_data;
  int rv;
  (void)tconn;
  (void)stream_user_data;
  /* stream is closed... */

  rv = nghttp3_conn_close_stream(qs->h3conn, stream_id,
                                 app_error_code);
  if(rv != 0) {
    failf(qs->conn->data, "nghttp3_conn_close_stream returned error: %s\n",
          nghttp3_strerror(rv));
    return NGTCP2_ERR_CALLBACK_FAILURE;
  }

  return 0;
}

static int cb_stream_reset(ngtcp2_conn *tconn, int64_t stream_id,
                           uint64_t final_size, uint64_t app_error_code,
                           void *user_data, void *stream_user_data)
{
  struct quicsocket *qs = (struct quicsocket *)user_data;
  int rv;
  (void)tconn;
  (void)final_size;
  (void)app_error_code;
  (void)stream_user_data;

  rv = nghttp3_conn_reset_stream(qs->h3conn, stream_id);
  if(rv != 0) {
    failf(qs->conn->data, "nghttp3_conn_reset_stream returned error: %s\n",
          nghttp3_strerror(rv));
    return NGTCP2_ERR_CALLBACK_FAILURE;
  }

  return 0;
}

static int cb_recv_retry(ngtcp2_conn *tconn, const ngtcp2_pkt_hd *hd,
                         const ngtcp2_pkt_retry *retry, void *user_data)
{
  /* Re-generate handshake secrets here because connection ID might change. */
  struct quicsocket *qs = (struct quicsocket *)user_data;
  (void)tconn;
  (void)hd;
  (void)retry;

  setup_initial_crypto_context(qs);

  return 0;
}

static int cb_extend_max_local_streams_bidi(ngtcp2_conn *tconn,
                                            uint64_t max_streams,
                                            void *user_data)
{
  (void)tconn;
  (void)max_streams;
  (void)user_data;

  return 0;
}

static int cb_extend_max_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
                                     uint64_t max_data, void *user_data,
                                     void *stream_user_data)
{
  struct quicsocket *qs = (struct quicsocket *)user_data;
  int rv;
  (void)tconn;
  (void)max_data;
  (void)stream_user_data;

  rv = nghttp3_conn_unblock_stream(qs->h3conn, stream_id);
  if(rv != 0) {
    failf(qs->conn->data, "nghttp3_conn_unblock_stream returned error: %s\n",
          nghttp3_strerror(rv));
    return NGTCP2_ERR_CALLBACK_FAILURE;
  }

  return 0;
}

static int cb_get_new_connection_id(ngtcp2_conn *tconn, ngtcp2_cid *cid,
                                    uint8_t *token, size_t cidlen,
                                    void *user_data)
{
  struct quicsocket *qs = (struct quicsocket *)user_data;
  CURLcode result;
  (void)tconn;

  result = Curl_rand(qs->conn->data, cid->data, cidlen);
  if(result)
    return NGTCP2_ERR_CALLBACK_FAILURE;
  cid->datalen = cidlen;

  result = Curl_rand(qs->conn->data, token, NGTCP2_STATELESS_RESET_TOKENLEN);
  if(result)
    return NGTCP2_ERR_CALLBACK_FAILURE;

  return 0;
}

static ngtcp2_conn_callbacks ng_callbacks = {
  cb_initial,
  NULL, /* recv_client_initial */
  cb_recv_crypto_data,
  cb_handshake_completed,
  NULL, /* recv_version_negotiation */
  ngtcp2_crypto_encrypt_cb,
  ngtcp2_crypto_decrypt_cb,
  ngtcp2_crypto_hp_mask_cb,
  cb_recv_stream_data,
  NULL, /* acked_crypto_offset */
  cb_acked_stream_data_offset,
  NULL, /* stream_open */
  cb_stream_close,
  NULL, /* recv_stateless_reset */
  cb_recv_retry,
  cb_extend_max_local_streams_bidi,
  NULL, /* extend_max_local_streams_uni */
  NULL, /* rand  */
  cb_get_new_connection_id,
  NULL, /* remove_connection_id */
  NULL, /* update_key */
  NULL, /* path_validation */
  NULL, /* select_preferred_addr */
  cb_stream_reset,
  NULL, /* extend_max_remote_streams_bidi */
  NULL, /* extend_max_remote_streams_uni */
  cb_extend_max_stream_data,
};

/*
 * Might be called twice for happy eyeballs.
 */
CURLcode Curl_quic_connect(struct connectdata *conn,
                           curl_socket_t sockfd,
                           int sockindex,
                           const struct sockaddr *addr,
                           socklen_t addrlen)
{
  int rc;
  int rv;
  CURLcode result;
  ngtcp2_path path; /* TODO: this must be initialized properly */
  struct Curl_easy *data = conn->data;
  struct quicsocket *qs = &conn->hequic[sockindex];
  char ipbuf[40];
  long port;
  uint8_t paramsbuf[64];
  ngtcp2_transport_params params;
  ssize_t nwrite;

  qs->conn = conn;

  /* extract the used address as a string */
  if(!Curl_addr2string((struct sockaddr*)addr, addrlen, ipbuf, &port)) {
    char buffer[STRERROR_LEN];
    failf(data, "ssrem inet_ntop() failed with errno %d: %s",
          errno, Curl_strerror(errno, buffer, sizeof(buffer)));
    return CURLE_BAD_FUNCTION_ARGUMENT;
  }

  infof(data, "Connect socket %d over QUIC to %s:%ld\n",
        sockfd, ipbuf, port);

  qs->version = NGTCP2_PROTO_VER;
  qs->sslctx = quic_ssl_ctx(data);
  if(!qs->sslctx)
    return CURLE_FAILED_INIT; /* TODO: better return code */

  if(quic_init_ssl(qs))
    return CURLE_FAILED_INIT; /* TODO: better return code */

  qs->dcid.datalen = NGTCP2_MAX_CIDLEN;
  result = Curl_rand(data, qs->dcid.data, NGTCP2_MAX_CIDLEN);
  if(result)
    return result;

  qs->scid.datalen = NGTCP2_MAX_CIDLEN;
  result = Curl_rand(data, qs->scid.data, NGTCP2_MAX_CIDLEN);
  if(result)
    return result;

  quic_settings(&qs->settings, data->set.buffer_size);

  qs->local_addrlen = sizeof(qs->local_addr);
  rv = getsockname(sockfd, (struct sockaddr *)&qs->local_addr,
                   &qs->local_addrlen);
  if(rv == -1)
    return CURLE_FAILED_INIT;

  ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr, qs->local_addrlen,
                   NULL);
  ngtcp2_addr_init(&path.remote, (uint8_t*)addr, addrlen, NULL);

#ifdef NGTCP2_PROTO_VER
#define QUICVER NGTCP2_PROTO_VER
#else
#error "unsupported ngtcp2 version"
#endif
  rc = ngtcp2_conn_client_new(&qs->qconn, &qs->dcid, &qs->scid, &path, QUICVER,
                              &ng_callbacks, &qs->settings, NULL, qs);
  if(rc)
    return CURLE_FAILED_INIT; /* TODO: create a QUIC error code */

  ngtcp2_conn_get_local_transport_params(qs->qconn, &params);
  nwrite = ngtcp2_encode_transport_params(
      paramsbuf, sizeof(paramsbuf), NGTCP2_TRANSPORT_PARAMS_TYPE_CLIENT_HELLO,
      &params);
  if(nwrite < 0) {
    fprintf(stderr, "ngtcp2_encode_transport_params: %s\n",
            ngtcp2_strerror((int)nwrite));

    return CURLE_FAILED_INIT;
  }

  if(!SSL_set_quic_transport_params(qs->ssl, paramsbuf, nwrite))
    return CURLE_FAILED_INIT;

  rc = setup_initial_crypto_context(qs);
  if(rc)
    return CURLE_FAILED_INIT; /* TODO: better return code */

  return CURLE_OK;
}

/*
 * Store ngtp2 version info in this buffer, Prefix with a space.  Return total
 * length written.
 */
int Curl_quic_ver(char *p, size_t len)
{
  ngtcp2_info *ng2 = ngtcp2_version(0);
  nghttp3_info *ht3 = nghttp3_version(0);
  return msnprintf(p, len, " ngtcp2/%s nghttp3/%s",
                   ng2->version_str, ht3->version_str);
}

static int ng_getsock(struct connectdata *conn, curl_socket_t *socks)
{
  struct SingleRequest *k = &conn->data->req;
  int bitmap = GETSOCK_BLANK;

  socks[0] = conn->sock[FIRSTSOCKET];

  /* in a HTTP/2 connection we can basically always get a frame so we should
     always be ready for one */
  bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);

  /* we're still uploading or the HTTP/2 layer wants to send data */
  if((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND)
    bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);

  return bitmap;
}

static int ng_perform_getsock(const struct connectdata *conn,
                              curl_socket_t *socks)
{
  return ng_getsock((struct connectdata *)conn, socks);
}

static CURLcode ng_disconnect(struct connectdata *conn,
                              bool dead_connection)
{
  (void)conn;
  (void)dead_connection;
  return CURLE_OK;
}

static unsigned int ng_conncheck(struct connectdata *conn,
                                 unsigned int checks_to_perform)
{
  (void)conn;
  (void)checks_to_perform;
  return CONNRESULT_NONE;
}

static const struct Curl_handler Curl_handler_http3 = {
  "HTTPS",                              /* scheme */
  ZERO_NULL,                            /* setup_connection */
  Curl_http,                            /* do_it */
  Curl_http_done,                       /* done */
  ZERO_NULL,                            /* do_more */
  ZERO_NULL,                            /* connect_it */
  ZERO_NULL,                            /* connecting */
  ZERO_NULL,                            /* doing */
  ng_getsock,                           /* proto_getsock */
  ng_getsock,                           /* doing_getsock */
  ZERO_NULL,                            /* domore_getsock */
  ng_perform_getsock,                   /* perform_getsock */
  ng_disconnect,                        /* disconnect */
  ZERO_NULL,                            /* readwrite */
  ng_conncheck,                         /* connection_check */
  PORT_HTTP,                            /* defport */
  CURLPROTO_HTTPS,                      /* protocol */
  PROTOPT_SSL | PROTOPT_STREAM          /* flags */
};

static int cb_h3_stream_close(nghttp3_conn *conn, int64_t stream_id,
                              uint64_t app_error_code, void *user_data,
                              void *stream_user_data)
{
  struct Curl_easy *data = stream_user_data;
  struct HTTP *stream = data->req.protop;
  (void)conn;
  (void)stream_id;
  (void)app_error_code;
  (void)user_data;
  fprintf(stderr, "cb_h3_stream_close CALLED\n");

  stream->closed = TRUE;
  Curl_expire(data, 0, EXPIRE_QUIC);
  return 0;
}

static int cb_h3_recv_data(nghttp3_conn *conn, int64_t stream_id,
                           const uint8_t *buf, size_t buflen,
                           void *user_data, void *stream_user_data)
{
  struct quicsocket *qs = user_data;
  size_t ncopy;
  struct Curl_easy *data = stream_user_data;
  struct HTTP *stream = data->req.protop;
  (void)conn;
  fprintf(stderr, "cb_h3_recv_data CALLED with %d bytes\n", buflen);

  /* TODO: this needs to be handled properly */
  DEBUGASSERT(buflen <= stream->len);

  ncopy = CURLMIN(stream->len, buflen);
  memcpy(stream->mem, buf, ncopy);
  stream->len -= ncopy;
  stream->memlen += ncopy;
#if 0 /* extra debugging of incoming h3 data */
  fprintf(stderr, "!! Copies %zd bytes to %p (total %zd)\n",
          ncopy, stream->mem, stream->memlen);
  {
    size_t i;
    for(i = 0; i < ncopy; i++) {
      fprintf(stderr, "!! data[%d]: %02x '%c'\n", i, buf[i], buf[i]);
    }
  }
#endif
  stream->mem += ncopy;

  ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, buflen);
  ngtcp2_conn_extend_max_offset(qs->qconn, buflen);

  return 0;
}

static int cb_h3_deferred_consume(nghttp3_conn *conn, int64_t stream_id,
                                  size_t consumed, void *user_data,
                                  void *stream_user_data)
{
  struct quicsocket *qs = user_data;
  (void)conn;
  (void)stream_user_data;
  fprintf(stderr, "cb_h3_deferred_consume CALLED\n");

  ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, consumed);
  ngtcp2_conn_extend_max_offset(qs->qconn, consumed);

  return 0;
}

/* Decode HTTP status code.  Returns -1 if no valid status code was
   decoded. (duplicate from http2.c) */
static int decode_status_code(const uint8_t *value, size_t len)
{
  int i;
  int res;

  if(len != 3) {
    return -1;
  }

  res = 0;

  for(i = 0; i < 3; ++i) {
    char c = value[i];

    if(c < '0' || c > '9') {
      return -1;
    }

    res *= 10;
    res += c - '0';
  }

  return res;
}

static int cb_h3_end_headers(nghttp3_conn *conn, int64_t stream_id,
                             void *user_data, void *stream_user_data)
{
  struct Curl_easy *data = stream_user_data;
  struct HTTP *stream = data->req.protop;
  (void)conn;
  (void)stream_id;
  (void)user_data;

  if(stream->memlen >= 2) {
    memcpy(stream->mem, "\r\n", 2);
    stream->len -= 2;
    stream->memlen += 2;
    stream->mem += 2;
  }
  return 0;
}

static int cb_h3_recv_header(nghttp3_conn *conn, int64_t stream_id,
                             int32_t token, nghttp3_rcbuf *name,
                             nghttp3_rcbuf *value, uint8_t flags,
                             void *user_data, void *stream_user_data)
{
  nghttp3_vec h3name = nghttp3_rcbuf_get_buf(name);
  nghttp3_vec h3val = nghttp3_rcbuf_get_buf(value);
  struct Curl_easy *data = stream_user_data;
  struct HTTP *stream = data->req.protop;
  size_t ncopy;
  (void)conn;
  (void)stream_id;
  (void)token;
  (void)flags;
  (void)user_data;

  fprintf(stderr, "cb_h3_recv_header called!\n");

  if(h3name.len == sizeof(":status") - 1 &&
     !memcmp(":status", h3name.base, h3name.len)) {
    int status = decode_status_code(h3val.base, h3val.len);
    DEBUGASSERT(status != -1);
    msnprintf(stream->mem, stream->len, "HTTP/3 %03d \r\n", status);
  }
  else {
    /* store as a HTTP1-style header */
    msnprintf(stream->mem, stream->len, "%.*s: %.*s\n",
              h3name.len, h3name.base, h3val.len, h3val.base);
  }

  ncopy = strlen(stream->mem);
  stream->len -= ncopy;
  stream->memlen += ncopy;
  stream->mem += ncopy;
  return 0;
}

static int cb_h3_send_stop_sending(nghttp3_conn *conn, int64_t stream_id,
                                   uint64_t app_error_code,
                                   void *user_data,
                                   void *stream_user_data)
{
  (void)conn;
  (void)stream_id;
  (void)app_error_code;
  (void)user_data;
  (void)stream_user_data;
  fprintf(stderr, "cb_h3_send_stop_sending CALLED\n");
  return 0;
}

static nghttp3_conn_callbacks ngh3_callbacks = {
  cb_h3_acked_stream_data, /* acked_stream_data */
  cb_h3_stream_close,
  cb_h3_recv_data,
  cb_h3_deferred_consume,
  NULL, /* begin_headers */
  cb_h3_recv_header,
  cb_h3_end_headers,
  NULL, /* begin_trailers */
  cb_h3_recv_header,
  NULL, /* end_trailers */
  NULL, /* http_begin_push_promise */
  NULL, /* http_recv_push_promise */
  NULL, /* http_end_push_promise */
  NULL, /* http_cancel_push */
  cb_h3_send_stop_sending,
  NULL, /* push_stream */
  NULL, /* end_stream */
};

static int init_ngh3_conn(struct quicsocket *qs)
{
  CURLcode result;
  int rc;
  int64_t ctrl_stream_id, qpack_enc_stream_id, qpack_dec_stream_id;

  if(ngtcp2_conn_get_max_local_streams_uni(qs->qconn) < 3) {
    failf(qs->conn->data, "too few available QUIC streams");
    return CURLE_FAILED_INIT;
  }

  nghttp3_conn_settings_default(&qs->h3settings);

  rc = nghttp3_conn_client_new(&qs->h3conn,
                               &ngh3_callbacks,
                               &qs->h3settings,
                               nghttp3_mem_default(),
                               qs);
  if(rc) {
    result = CURLE_OUT_OF_MEMORY;
    goto fail;
  }

  rc = ngtcp2_conn_open_uni_stream(qs->qconn, &ctrl_stream_id, NULL);
  if(rc) {
    result = CURLE_FAILED_INIT;
    goto fail;
  }

  rc = nghttp3_conn_bind_control_stream(qs->h3conn, ctrl_stream_id);
  if(rc) {
    result = CURLE_FAILED_INIT;
    goto fail;
  }

  rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_enc_stream_id, NULL);
  if(rc) {
    result = CURLE_FAILED_INIT;
    goto fail;
  }

  rc = ngtcp2_conn_open_uni_stream(qs->qconn, &qpack_dec_stream_id, NULL);
  if(rc) {
    result = CURLE_FAILED_INIT;
    goto fail;
  }

  rc = nghttp3_conn_bind_qpack_streams(qs->h3conn, qpack_enc_stream_id,
                                       qpack_dec_stream_id);
  if(rc) {
    result = CURLE_FAILED_INIT;
    goto fail;
  }

  return CURLE_OK;
  fail:

  return result;
}

static Curl_recv ngh3_stream_recv;
static Curl_send ngh3_stream_send;

/* incoming data frames on the h3 stream */
static ssize_t ngh3_stream_recv(struct connectdata *conn,
                                int sockindex,
                                char *buf,
                                size_t buffersize,
                                CURLcode *curlcode)
{
  curl_socket_t sockfd = conn->sock[sockindex];
  struct HTTP *stream = conn->data->req.protop;
  struct quicsocket *qs = conn->quic;

  fprintf(stderr, "ngh3_stream_recv CALLED (easy %p, socket %d)\n",
          conn->data, sockfd);

  if(!stream->memlen) {
    /* remember where to store incoming data for this stream and how big the
       buffer is */
    stream->mem = buf;
    stream->len = buffersize;
  }
  /* else, there's data in the buffer already */

  if(ng_process_ingress(conn, sockfd, qs)) {
    *curlcode = CURLE_RECV_ERROR;
    return -1;
  }
  if(ng_flush_egress(conn, sockfd, qs)) {
    *curlcode = CURLE_SEND_ERROR;
    return -1;
  }

  if(stream->memlen) {
    ssize_t memlen = stream->memlen;
    /* data arrived */
    *curlcode = CURLE_OK;
    /* reset to allow more data to come */
    stream->memlen = 0;
    stream->mem = buf;
    stream->len = buffersize;
    H3BUGF(infof(conn->data, "!! ngh3_stream_recv returns %zd bytes at %p\n",
                 memlen, buf));
    return memlen;
  }

  if(stream->closed) {
    *curlcode = CURLE_OK;
    return 0;
  }

  infof(conn->data, "ngh3_stream_recv returns 0 bytes and EAGAIN\n");
  *curlcode = CURLE_AGAIN;
  return -1;
}

/* this amount of data has now been acked on this stream */
static int cb_h3_acked_stream_data(nghttp3_conn *conn, int64_t stream_id,
                                   size_t datalen, void *user_data,
                                   void *stream_user_data)
{
  struct Curl_easy *data = stream_user_data;
  struct HTTP *stream = data->req.protop;
  (void)conn;
  (void)stream_id;
  (void)user_data;

  if(!data->set.postfields) {
    stream->h3out->used -= datalen;
    fprintf(stderr, "cb_h3_acked_stream_data, %zd bytes, %zd left unacked\n",
            datalen, stream->h3out->used);
    DEBUGASSERT(stream->h3out->used < H3_SEND_SIZE);
  }
  return 0;
}

static int cb_h3_readfunction(nghttp3_conn *conn, int64_t stream_id,
                              const uint8_t **pdata,
                              size_t *pdatalen, uint32_t *pflags,
                              void *user_data, void *stream_user_data)
{
  struct Curl_easy *data = stream_user_data;
  size_t nread;
  struct HTTP *stream = data->req.protop;
  (void)conn;
  (void)stream_id;
  (void)user_data;

  if(data->set.postfields) {
    *pdata = data->set.postfields;
    *pdatalen = data->state.infilesize;
    *pflags = NGHTTP3_DATA_FLAG_EOF;
    return 0;
  }

  nread = CURLMIN(stream->upload_len, H3_SEND_SIZE - stream->h3out->used);
  if(nread > 0) {
    /* nghttp3 wants us to hold on to the data until it tells us it is okay to
       delete it. Append the data at the end of the h3out buffer. Since we can
       only return consecutive data, copy the amount that fits and the next
       part comes in next invoke. */
    struct h3out *out = stream->h3out;
    if(nread + out->windex > H3_SEND_SIZE)
      nread = H3_SEND_SIZE - out->windex;

    memcpy(&out->buf[out->windex], stream->upload_mem, nread);
    out->windex += nread;
    out->used += nread;

    /* that's the chunk we return to nghttp3 */
    *pdata = &out->buf[out->windex];
    *pdatalen = nread;

    if(out->windex == H3_SEND_SIZE)
      out->windex = 0; /* wrap */
    stream->upload_mem += nread;
    stream->upload_len -= nread;
    if(data->state.infilesize != -1) {
      stream->upload_left -= nread;
      if(!stream->upload_left)
        *pflags = NGHTTP3_DATA_FLAG_EOF;
    }
    fprintf(stderr, "cb_h3_readfunction %zd bytes%s (at %zd unacked)\n",
            nread, *pflags == NGHTTP3_DATA_FLAG_EOF?" EOF":"",
            out->used);
  }
  if(stream->upload_done && !stream->upload_len &&
     (stream->upload_left <= 0)) {
    H3BUGF(infof(data, "!!!!!!!!! cb_h3_readfunction sets EOF\n"));
    *pdata = NULL;
    *pdatalen = 0;
    *pflags = NGHTTP3_DATA_FLAG_EOF;
  }
  else if(!nread) {
    *pdatalen = 0;
    return NGHTTP3_ERR_WOULDBLOCK;
  }
  return 0;
}

/* Index where :authority header field will appear in request header
   field list. */
#define AUTHORITY_DST_IDX 3

static CURLcode http_request(struct connectdata *conn, const void *mem,
                             size_t len)
{
  struct HTTP *stream = conn->data->req.protop;
  size_t nheader;
  size_t i;
  size_t authority_idx;
  char *hdbuf = (char *)mem;
  char *end, *line_end;
  struct quicsocket *qs = conn->quic;
  CURLcode result = CURLE_OK;
  struct Curl_easy *data = conn->data;
  nghttp3_nv *nva = NULL;
  int64_t stream3_id;
  int rc;
  struct h3out *h3out = NULL;

  rc = ngtcp2_conn_open_bidi_stream(qs->qconn, &stream3_id, NULL);
  if(rc) {
    failf(conn->data, "can get bidi streams");
    result = CURLE_SEND_ERROR;
    goto fail;
  }

  stream->stream3_id = stream3_id;
  stream->h3req = TRUE; /* senf off! */

  /* Calculate number of headers contained in [mem, mem + len). Assumes a
     correctly generated HTTP header field block. */
  nheader = 0;
  for(i = 1; i < len; ++i) {
    if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
      ++nheader;
      ++i;
    }
  }
  if(nheader < 2)
    goto fail;

  /* We counted additional 2 \r\n in the first and last line. We need 3
     new headers: :method, :path and :scheme. Therefore we need one
     more space. */
  nheader += 1;
  nva = malloc(sizeof(nghttp3_nv) * nheader);
  if(!nva) {
    result = CURLE_OUT_OF_MEMORY;
    goto fail;
  }

  /* Extract :method, :path from request line
     We do line endings with CRLF so checking for CR is enough */
  line_end = memchr(hdbuf, '\r', len);
  if(!line_end) {
    result = CURLE_BAD_FUNCTION_ARGUMENT; /* internal error */
    goto fail;
  }

  /* Method does not contain spaces */
  end = memchr(hdbuf, ' ', line_end - hdbuf);
  if(!end || end == hdbuf)
    goto fail;
  nva[0].name = (unsigned char *)":method";
  nva[0].namelen = strlen((char *)nva[0].name);
  nva[0].value = (unsigned char *)hdbuf;
  nva[0].valuelen = (size_t)(end - hdbuf);
  nva[0].flags = NGHTTP3_NV_FLAG_NONE;

  hdbuf = end + 1;

  /* Path may contain spaces so scan backwards */
  end = NULL;
  for(i = (size_t)(line_end - hdbuf); i; --i) {
    if(hdbuf[i - 1] == ' ') {
      end = &hdbuf[i - 1];
      break;
    }
  }
  if(!end || end == hdbuf)
    goto fail;
  nva[1].name = (unsigned char *)":path";
  nva[1].namelen = strlen((char *)nva[1].name);
  nva[1].value = (unsigned char *)hdbuf;
  nva[1].valuelen = (size_t)(end - hdbuf);
  nva[1].flags = NGHTTP3_NV_FLAG_NONE;

  nva[2].name = (unsigned char *)":scheme";
  nva[2].namelen = strlen((char *)nva[2].name);
  if(conn->handler->flags & PROTOPT_SSL)
    nva[2].value = (unsigned char *)"https";
  else
    nva[2].value = (unsigned char *)"http";
  nva[2].valuelen = strlen((char *)nva[2].value);
  nva[2].flags = NGHTTP3_NV_FLAG_NONE;


  authority_idx = 0;
  i = 3;
  while(i < nheader) {
    size_t hlen;

    hdbuf = line_end + 2;

    /* check for next CR, but only within the piece of data left in the given
       buffer */
    line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
    if(!line_end || (line_end == hdbuf))
      goto fail;

    /* header continuation lines are not supported */
    if(*hdbuf == ' ' || *hdbuf == '\t')
      goto fail;

    for(end = hdbuf; end < line_end && *end != ':'; ++end)
      ;
    if(end == hdbuf || end == line_end)
      goto fail;
    hlen = end - hdbuf;

    if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
      authority_idx = i;
      nva[i].name = (unsigned char *)":authority";
      nva[i].namelen = strlen((char *)nva[i].name);
    }
    else {
      nva[i].name = (unsigned char *)hdbuf;
      nva[i].namelen = (size_t)(end - hdbuf);
    }
    nva[i].flags = NGHTTP3_NV_FLAG_NONE;
    hdbuf = end + 1;
    while(*hdbuf == ' ' || *hdbuf == '\t')
      ++hdbuf;
    end = line_end;

#if 0 /* This should probably go in more or less like this */
    switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
                          end - hdbuf)) {
    case HEADERINST_IGNORE:
      /* skip header fields prohibited by HTTP/2 specification. */
      --nheader;
      continue;
    case HEADERINST_TE_TRAILERS:
      nva[i].value = (uint8_t*)"trailers";
      nva[i].value_len = sizeof("trailers") - 1;
      break;
    default:
      nva[i].value = (unsigned char *)hdbuf;
      nva[i].value_len = (size_t)(end - hdbuf);
    }
#endif
    nva[i].value = (unsigned char *)hdbuf;
    nva[i].valuelen = (size_t)(end - hdbuf);
    nva[i].flags = NGHTTP3_NV_FLAG_NONE;

    ++i;
  }

  /* :authority must come before non-pseudo header fields */
  if(authority_idx != 0 && authority_idx != AUTHORITY_DST_IDX) {
    nghttp3_nv authority = nva[authority_idx];
    for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
      nva[i] = nva[i - 1];
    }
    nva[i] = authority;
  }

  /* Warn stream may be rejected if cumulative length of headers is too
     large. */
#define MAX_ACC 60000  /* <64KB to account for some overhead */
  {
    size_t acc = 0;
    for(i = 0; i < nheader; ++i)
      acc += nva[i].namelen + nva[i].valuelen;

    if(acc > MAX_ACC) {
      infof(data, "http_request: Warning: The cumulative length of all "
            "headers exceeds %zu bytes and that could cause the "
            "stream to be rejected.\n", MAX_ACC);
    }
  }

  switch(data->set.httpreq) {
  case HTTPREQ_POST:
  case HTTPREQ_POST_FORM:
  case HTTPREQ_POST_MIME:
  case HTTPREQ_PUT: {
    nghttp3_data_reader data_reader;
    if(data->state.infilesize != -1)
      stream->upload_left = data->state.infilesize;
    else
      /* data sending without specifying the data amount up front */
      stream->upload_left = -1; /* unknown, but not zero */

    data_reader.read_data = cb_h3_readfunction;

    h3out = calloc(sizeof(struct h3out), 1);
    if(!h3out) {
      result = CURLE_OUT_OF_MEMORY;
      goto fail;
    }
    stream->h3out = h3out;

    rc = nghttp3_conn_submit_request(qs->h3conn, stream->stream3_id,
                                     nva, nheader, &data_reader,
                                     conn->data);
    if(rc) {
      result = CURLE_SEND_ERROR;
      goto fail;
    }
    break;
  }
  default:
    stream->upload_left = 0; /* nothing left to send */
    rc = nghttp3_conn_submit_request(qs->h3conn, stream->stream3_id,
                                     nva, nheader,
                                     NULL, /* no body! */
                                     conn->data);
    if(rc) {
      result = CURLE_SEND_ERROR;
      goto fail;
    }
    break;
  }

  Curl_safefree(nva);

  infof(data, "Using HTTP/3 Stream ID: %x (easy handle %p)\n",
        stream3_id, (void *)data);

  return CURLE_OK;

fail:
  free(nva);
  return result;
}
static ssize_t ngh3_stream_send(struct connectdata *conn,
                                int sockindex,
                                const void *mem,
                                size_t len,
                                CURLcode *curlcode)
{
  ssize_t sent;
  struct quicsocket *qs = conn->quic;
  curl_socket_t sockfd = conn->sock[sockindex];
  struct HTTP *stream = conn->data->req.protop;

  if(!stream->h3req) {
    CURLcode result = http_request(conn, mem, len);
    if(result) {
      *curlcode = CURLE_SEND_ERROR;
      return -1;
    }
    sent = len;
  }
  else {
    fprintf(stderr, "ngh3_stream_send() wants to send %zd bytes\n", len);
    if(!stream->upload_len) {
      stream->upload_mem = mem;
      stream->upload_len = len;
      (void)nghttp3_conn_resume_stream(qs->h3conn, stream->stream3_id);
      sent = len;
    }
    else {
      *curlcode = CURLE_AGAIN;
      return -1;
    }
  }

  if(ng_flush_egress(conn, sockfd, qs)) {
    *curlcode = CURLE_SEND_ERROR;
    return -1;
  }

  *curlcode = CURLE_OK;
  return sent;
}

static void ng_has_connected(struct connectdata *conn, int tempindex)
{
  conn->recv[FIRSTSOCKET] = ngh3_stream_recv;
  conn->send[FIRSTSOCKET] = ngh3_stream_send;
  conn->handler = &Curl_handler_http3;
  conn->bits.multiplex = TRUE; /* at least potentially multiplexed */
  conn->httpversion = 30;
  conn->bundle->multiuse = BUNDLE_MULTIPLEX;
  conn->quic = &conn->hequic[tempindex];
  DEBUGF(infof(conn->data, "ngtcp2 established connection!\n"));
}

/*
 * There can be multiple connection attempts going on in parallel.
 */
CURLcode Curl_quic_is_connected(struct connectdata *conn,
                                int sockindex,
                                bool *done)
{
  CURLcode result;
  struct quicsocket *qs = &conn->hequic[sockindex];
  curl_socket_t sockfd = conn->tempsock[sockindex];

  result = ng_process_ingress(conn, sockfd, qs);
  if(result)
    return result;

  result = ng_flush_egress(conn, sockfd, qs);
  if(result)
    return result;

  if(ngtcp2_conn_get_handshake_completed(qs->qconn)) {
    *done = TRUE;
    ng_has_connected(conn, sockindex);
  }

  return result;
}

static CURLcode ng_process_ingress(struct connectdata *conn, int sockfd,
                                   struct quicsocket *qs)
{
  ssize_t recvd;
  int rv;
  uint8_t buf[65536];
  size_t bufsize = sizeof(buf);
  struct sockaddr_storage remote_addr;
  socklen_t remote_addrlen;
  ngtcp2_path path;
  ngtcp2_tstamp ts = timestamp();

  for(;;) {
    remote_addrlen = sizeof(remote_addr);
    while((recvd = recvfrom(sockfd, buf, bufsize, MSG_DONTWAIT,
                            (struct sockaddr *)&remote_addr,
                            &remote_addrlen)) == -1 &&
          errno == EINTR)
      ;
    if(recvd == -1) {
      if(errno == EAGAIN || errno == EWOULDBLOCK)
        break;

      failf(conn->data, "ngtcp2: recvfrom() unexpectedly returned %d", recvd);
      return CURLE_RECV_ERROR;
    }

    ngtcp2_addr_init(&path.local, (uint8_t *)&qs->local_addr,
                     qs->local_addrlen, NULL);
    ngtcp2_addr_init(&path.remote, (uint8_t *)&remote_addr, remote_addrlen,
                     NULL);

    rv = ngtcp2_conn_read_pkt(qs->qconn, &path, buf, recvd, ts);
    if(rv != 0) {
      /* TODO Send CONNECTION_CLOSE if possible */
      return CURLE_RECV_ERROR;
    }
  }

  return CURLE_OK;
}

static CURLcode ng_flush_egress(struct connectdata *conn, int sockfd,
                                struct quicsocket *qs)
{
  int rv;
  ssize_t sent;
  ssize_t outlen;
  uint8_t out[NGTCP2_MAX_PKTLEN_IPV4];
  size_t pktlen;
  ngtcp2_path_storage ps;
  ngtcp2_tstamp ts = timestamp();
  struct sockaddr_storage remote_addr;
  ngtcp2_tstamp expiry;
  ngtcp2_duration timeout;
  int64_t stream_id;
  ssize_t veccnt;
  int fin;
  nghttp3_vec vec[16];
  ssize_t ndatalen;

  switch(qs->local_addr.ss_family) {
  case AF_INET:
    pktlen = NGTCP2_MAX_PKTLEN_IPV4;
    break;
  case AF_INET6:
    pktlen = NGTCP2_MAX_PKTLEN_IPV6;
    break;
  default:
    assert(0);
  }

  rv = ngtcp2_conn_handle_expiry(qs->qconn, ts);
  if(rv != 0) {
    failf(conn->data, "ngtcp2_conn_handle_expiry returned error: %s\n",
          ngtcp2_strerror(rv));
    return CURLE_SEND_ERROR;
  }

  ngtcp2_path_storage_zero(&ps);

  for(;;) {
    outlen = -1;
    if(qs->h3conn && ngtcp2_conn_get_max_data_left(qs->qconn)) {
      veccnt = nghttp3_conn_writev_stream(qs->h3conn, &stream_id, &fin, vec,
                                          sizeof(vec) / sizeof(vec[0]));
      if(veccnt < 0) {
        failf(conn->data, "nghttp3_conn_writev_stream returned error: %s\n",
              nghttp3_strerror((int)veccnt));
        return CURLE_SEND_ERROR;
      }
      else if(veccnt > 0) {
        outlen =
          ngtcp2_conn_writev_stream(qs->qconn, &ps.path,
                                    out, pktlen, &ndatalen,
                                    NGTCP2_WRITE_STREAM_FLAG_MORE,
                                    stream_id, fin,
                                    (const ngtcp2_vec *)vec, veccnt, ts);
        if(outlen == 0) {
          break;
        }
        if(outlen < 0) {
          if(outlen == NGTCP2_ERR_STREAM_DATA_BLOCKED ||
             outlen == NGTCP2_ERR_STREAM_SHUT_WR) {
            rv = nghttp3_conn_block_stream(qs->h3conn, stream_id);
            if(rv != 0) {
              failf(conn->data,
                    "nghttp3_conn_block_stream returned error: %s\n",
                    nghttp3_strerror(rv));
              return CURLE_SEND_ERROR;
            }
            continue;
          }
          else if(outlen == NGTCP2_ERR_WRITE_STREAM_MORE) {
            assert(ndatalen > 0);
            rv = nghttp3_conn_add_write_offset(qs->h3conn, stream_id,
                                               ndatalen);
            if(rv != 0) {
              failf(conn->data,
                    "nghttp3_conn_add_write_offset returned error: %s\n",
                    nghttp3_strerror(rv));
              return CURLE_SEND_ERROR;
            }
            continue;
          }
          else {
            failf(conn->data, "ngtcp2_conn_writev_stream returned error: %s\n",
                  ngtcp2_strerror((int)outlen));
            return CURLE_SEND_ERROR;
          }
        }
        else if(ndatalen > 0) {
          rv = nghttp3_conn_add_write_offset(qs->h3conn, stream_id, ndatalen);
          if(rv != 0) {
            failf(conn->data,
                  "nghttp3_conn_add_write_offset returned error: %s\n",
                  nghttp3_strerror(rv));
            return CURLE_SEND_ERROR;
          }
        }
      }
    }
    if(outlen < 0) {
      outlen = ngtcp2_conn_write_pkt(qs->qconn, &ps.path, out, pktlen, ts);
      if(outlen < 0) {
        failf(conn->data, "ngtcp2_conn_write_pkt returned error: %s\n",
              ngtcp2_strerror((int)outlen));
        return CURLE_SEND_ERROR;
      }
      if(outlen == 0)
        break;
    }

    memcpy(&remote_addr, ps.path.remote.addr, ps.path.remote.addrlen);
    while((sent = sendto(sockfd, out, outlen, MSG_DONTWAIT,
                         (struct sockaddr *)&remote_addr,
                         (socklen_t)ps.path.remote.addrlen)) == -1 &&
          errno == EINTR)
      ;

    if(sent == -1) {
      if(errno == EAGAIN || errno == EWOULDBLOCK) {
        /* TODO Cache packet */
        break;
      }
      else {
        failf(conn->data, "sendto() returned %zd (errno %d)\n", sent,
              SOCKERRNO);
        return CURLE_SEND_ERROR;
      }
    }
  }

  expiry = ngtcp2_conn_get_expiry(qs->qconn);
  if(expiry != UINT64_MAX) {
    if(expiry <= ts) {
      timeout = NGTCP2_MILLISECONDS;
    }
    else {
      timeout = expiry - ts;
    }
    Curl_expire(conn->data, timeout / NGTCP2_MILLISECONDS, EXPIRE_QUIC);
  }

  return CURLE_OK;
}

/*
 * Called from transfer.c:done_sending when we stop HTTP/3 uploading.
 */
CURLcode Curl_quic_done_sending(struct connectdata *conn)
{
  if(conn->handler == &Curl_handler_http3) {
    /* only for HTTP/3 transfers */
    struct HTTP *stream = conn->data->req.protop;
    struct quicsocket *qs = conn->quic;
    fprintf(stderr, "!!! Curl_quic_done_sending stream %zu\n",
            stream->stream3_id);
    stream->upload_done = TRUE;
    (void)nghttp3_conn_resume_stream(qs->h3conn, stream->stream3_id);
  }

  return CURLE_OK;
}
#endif
Added jni/curl/lib/vquic/ngtcp2.h.






























































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#ifndef HEADER_CURL_VQUIC_NGTCP2_H
#define HEADER_CURL_VQUIC_NGTCP2_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#ifdef USE_NGTCP2

#include <ngtcp2/ngtcp2.h>
#include <nghttp3/nghttp3.h>
#include <openssl/ssl.h>

struct quic_handshake {
  char *buf;       /* pointer to the buffer */
  size_t alloclen; /* size of allocation */
  size_t len;      /* size of content in buffer */
  size_t nread;    /* how many bytes have been read */
};

struct quicsocket {
  struct connectdata *conn; /* point back to the connection */
  ngtcp2_conn *qconn;
  ngtcp2_cid dcid;
  ngtcp2_cid scid;
  uint32_t version;
  ngtcp2_settings settings;
  SSL_CTX *sslctx;
  SSL *ssl;
  struct quic_handshake client_crypto_data[3];
  /* the last TLS alert description generated by the local endpoint */
  uint8_t tls_alert;
  struct sockaddr_storage local_addr;
  socklen_t local_addrlen;

  nghttp3_conn *h3conn;
  nghttp3_conn_settings h3settings;
};

#include "urldata.h"

#endif

#endif /* HEADER_CURL_VQUIC_NGTCP2_H */
Added jni/curl/lib/vquic/quiche.c.
























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#ifdef USE_QUICHE
#include <quiche.h>
#include <openssl/err.h>
#include "urldata.h"
#include "sendf.h"
#include "strdup.h"
#include "rand.h"
#include "quic.h"
#include "strcase.h"
#include "multiif.h"
#include "connect.h"
#include "strerror.h"

/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"

#define DEBUG_HTTP3
/* #define DEBUG_QUICHE */
#ifdef DEBUG_HTTP3
#define H3BUGF(x) x
#else
#define H3BUGF(x) do { } WHILE_FALSE
#endif

#define QUIC_MAX_STREAMS (256*1024)
#define QUIC_MAX_DATA (1*1024*1024)
#define QUIC_IDLE_TIMEOUT 60 * 1000 /* milliseconds */

static CURLcode process_ingress(struct connectdata *conn,
                                curl_socket_t sockfd,
                                struct quicsocket *qs);

static CURLcode flush_egress(struct connectdata *conn, curl_socket_t sockfd,
                             struct quicsocket *qs);

static CURLcode http_request(struct connectdata *conn, const void *mem,
                             size_t len);
static Curl_recv h3_stream_recv;
static Curl_send h3_stream_send;


static int quiche_getsock(struct connectdata *conn, curl_socket_t *socks)
{
  struct SingleRequest *k = &conn->data->req;
  int bitmap = GETSOCK_BLANK;

  socks[0] = conn->sock[FIRSTSOCKET];

  /* in a HTTP/2 connection we can basically always get a frame so we should
     always be ready for one */
  bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);

  /* we're still uploading or the HTTP/2 layer wants to send data */
  if((k->keepon & (KEEP_SEND|KEEP_SEND_PAUSE)) == KEEP_SEND)
    bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);

  return bitmap;
}

static int quiche_perform_getsock(const struct connectdata *conn,
                                  curl_socket_t *socks)
{
  return quiche_getsock((struct connectdata *)conn, socks);
}

static CURLcode quiche_disconnect(struct connectdata *conn,
                                  bool dead_connection)
{
  struct quicsocket *qs = conn->quic;
  (void)dead_connection;
  quiche_h3_config_free(qs->h3config);
  quiche_h3_conn_free(qs->h3c);
  quiche_config_free(qs->cfg);
  quiche_conn_free(qs->conn);
  return CURLE_OK;
}

static unsigned int quiche_conncheck(struct connectdata *conn,
                                     unsigned int checks_to_perform)
{
  (void)conn;
  (void)checks_to_perform;
  return CONNRESULT_NONE;
}

static CURLcode quiche_do(struct connectdata *conn, bool *done)
{
  struct HTTP *stream = conn->data->req.protop;
  stream->h3req = FALSE; /* not sent */
  return Curl_http(conn, done);
}

static const struct Curl_handler Curl_handler_http3 = {
  "HTTPS",                              /* scheme */
  ZERO_NULL,                            /* setup_connection */
  quiche_do,                            /* do_it */
  Curl_http_done,                       /* done */
  ZERO_NULL,                            /* do_more */
  ZERO_NULL,                            /* connect_it */
  ZERO_NULL,                            /* connecting */
  ZERO_NULL,                            /* doing */
  quiche_getsock,                       /* proto_getsock */
  quiche_getsock,                       /* doing_getsock */
  ZERO_NULL,                            /* domore_getsock */
  quiche_perform_getsock,               /* perform_getsock */
  quiche_disconnect,                    /* disconnect */
  ZERO_NULL,                            /* readwrite */
  quiche_conncheck,                     /* connection_check */
  PORT_HTTP,                            /* defport */
  CURLPROTO_HTTPS,                      /* protocol */
  PROTOPT_SSL | PROTOPT_STREAM          /* flags */
};

#ifdef DEBUG_QUICHE
static void quiche_debug_log(const char *line, void *argp)
{
  (void)argp;
  fprintf(stderr, "%s\n", line);
}
#endif

CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd,
                           int sockindex,
                           const struct sockaddr *addr, socklen_t addrlen)
{
  CURLcode result;
  struct quicsocket *qs = &conn->hequic[sockindex];
  struct Curl_easy *data = conn->data;

#ifdef DEBUG_QUICHE
  /* initialize debug log callback only once */
  static int debug_log_init = 0;
  if(!debug_log_init) {
    quiche_enable_debug_logging(quiche_debug_log, NULL);
    debug_log_init = 1;
  }
#endif

  (void)addr;
  (void)addrlen;

  qs->cfg = quiche_config_new(QUICHE_PROTOCOL_VERSION);
  if(!qs->cfg) {
    failf(data, "can't create quiche config");
    return CURLE_FAILED_INIT;
  }

  quiche_config_set_idle_timeout(qs->cfg, QUIC_IDLE_TIMEOUT);
  quiche_config_set_initial_max_data(qs->cfg, QUIC_MAX_DATA);
  quiche_config_set_initial_max_stream_data_bidi_local(qs->cfg, QUIC_MAX_DATA);
  quiche_config_set_initial_max_stream_data_bidi_remote(qs->cfg,
                                                        QUIC_MAX_DATA);
  quiche_config_set_initial_max_stream_data_uni(qs->cfg, QUIC_MAX_DATA);
  quiche_config_set_initial_max_streams_bidi(qs->cfg, QUIC_MAX_STREAMS);
  quiche_config_set_initial_max_streams_uni(qs->cfg, QUIC_MAX_STREAMS);
  quiche_config_set_application_protos(qs->cfg,
                                       (uint8_t *)
                                       QUICHE_H3_APPLICATION_PROTOCOL,
                                       sizeof(QUICHE_H3_APPLICATION_PROTOCOL)
                                       - 1);

  result = Curl_rand(data, qs->scid, sizeof(qs->scid));
  if(result)
    return result;

  if(getenv("SSLKEYLOGFILE"))
    quiche_config_log_keys(qs->cfg);

  qs->conn = quiche_connect(conn->host.name, (const uint8_t *) qs->scid,
                            sizeof(qs->scid), qs->cfg);
  if(!qs->conn) {
    failf(data, "can't create quiche connection");
    return CURLE_OUT_OF_MEMORY;
  }

  result = flush_egress(conn, sockfd, qs);
  if(result)
    return result;

#if 0
  /* store the used address as a string */
  if(!Curl_addr2string((struct sockaddr*)addr,
                       conn->primary_ip, &conn->primary_port)) {
    char buffer[STRERROR_LEN];
    failf(data, "ssrem inet_ntop() failed with errno %d: %s",
          errno, Curl_strerror(errno, buffer, sizeof(buffer)));
    return CURLE_BAD_FUNCTION_ARGUMENT;
  }
  memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
#endif
  /* for connection reuse purposes: */
  conn->ssl[FIRSTSOCKET].state = ssl_connection_complete;

  infof(data, "Sent QUIC client Initial, ALPN: %s\n",
        QUICHE_H3_APPLICATION_PROTOCOL + 1);

  return CURLE_OK;
}

static CURLcode quiche_has_connected(struct connectdata *conn,
                                     int sockindex,
                                     int tempindex)
{
  CURLcode result;
  struct quicsocket *qs = conn->quic = &conn->hequic[tempindex];

  conn->recv[sockindex] = h3_stream_recv;
  conn->send[sockindex] = h3_stream_send;
  conn->handler = &Curl_handler_http3;
  conn->bits.multiplex = TRUE; /* at least potentially multiplexed */
  conn->httpversion = 30;
  conn->bundle->multiuse = BUNDLE_MULTIPLEX;

  qs->h3config = quiche_h3_config_new(0, 1024, 0, 0);
  if(!qs->h3config)
    return CURLE_OUT_OF_MEMORY;

  /* Create a new HTTP/3 connection on the QUIC connection. */
  qs->h3c = quiche_h3_conn_new_with_transport(qs->conn, qs->h3config);
  if(!qs->h3c) {
    result = CURLE_OUT_OF_MEMORY;
    goto fail;
  }
  if(conn->hequic[1-tempindex].cfg) {
    qs = &conn->hequic[1-tempindex];
    quiche_config_free(qs->cfg);
    quiche_conn_free(qs->conn);
    qs->cfg = NULL;
    qs->conn = NULL;
  }
  return CURLE_OK;
  fail:
  quiche_h3_config_free(qs->h3config);
  quiche_h3_conn_free(qs->h3c);
  return result;
}

/*
 * This function gets polled to check if this QUIC connection has connected.
 */
CURLcode Curl_quic_is_connected(struct connectdata *conn, int sockindex,
                                bool *done)
{
  CURLcode result;
  struct quicsocket *qs = &conn->hequic[sockindex];
  curl_socket_t sockfd = conn->tempsock[sockindex];

  result = process_ingress(conn, sockfd, qs);
  if(result)
    return result;

  result = flush_egress(conn, sockfd, qs);
  if(result)
    return result;

  if(quiche_conn_is_established(qs->conn)) {
    *done = TRUE;
    result = quiche_has_connected(conn, 0, sockindex);
    DEBUGF(infof(conn->data, "quiche established connection!\n"));
  }

  return result;
}

static CURLcode process_ingress(struct connectdata *conn, int sockfd,
                                struct quicsocket *qs)
{
  ssize_t recvd;
  struct Curl_easy *data = conn->data;
  uint8_t *buf = (uint8_t *)data->state.buffer;
  size_t bufsize = data->set.buffer_size;

  /* in case the timeout expired */
  quiche_conn_on_timeout(qs->conn);

  do {
    recvd = recv(sockfd, buf, bufsize, 0);
    if((recvd < 0) && ((errno == EAGAIN) || (errno == EWOULDBLOCK)))
      break;

    if(recvd < 0) {
      failf(conn->data, "quiche: recv() unexpectedly returned %d "
            "(errno: %d, socket %d)", recvd, SOCKERRNO, sockfd);
      return CURLE_RECV_ERROR;
    }

    recvd = quiche_conn_recv(qs->conn, buf, recvd);
    if(recvd == QUICHE_ERR_DONE)
      break;

    if(recvd < 0) {
      failf(conn->data, "quiche_conn_recv() == %d", recvd);
      return CURLE_RECV_ERROR;
    }
  } while(1);

  return CURLE_OK;
}

/*
 * flush_egress drains the buffers and sends off data.
 * Calls failf() on errors.
 */
static CURLcode flush_egress(struct connectdata *conn, int sockfd,
                             struct quicsocket *qs)
{
  ssize_t sent;
  static uint8_t out[1200];
  int64_t timeout_ns;

  do {
    sent = quiche_conn_send(qs->conn, out, sizeof(out));
    if(sent == QUICHE_ERR_DONE)
      break;

    if(sent < 0) {
      failf(conn->data, "quiche_conn_send returned %zd\n",
            sent);
      return CURLE_SEND_ERROR;
    }

    sent = send(sockfd, out, sent, 0);
    if(sent < 0) {
      failf(conn->data, "send() returned %zd\n", sent);
      return CURLE_SEND_ERROR;
    }
  } while(1);

  /* time until the next timeout event, as nanoseconds. */
  timeout_ns = quiche_conn_timeout_as_nanos(qs->conn);
  if(timeout_ns)
    /* expire uses milliseconds */
    Curl_expire(conn->data, (timeout_ns + 999999) / 1000000, EXPIRE_QUIC);

  return CURLE_OK;
}

struct h3h1header {
  char *dest;
  size_t destlen; /* left to use */
  size_t nlen; /* used */
};

static int cb_each_header(uint8_t *name, size_t name_len,
                          uint8_t *value, size_t value_len,
                          void *argp)
{
  struct h3h1header *headers = (struct h3h1header *)argp;
  size_t olen = 0;

  if((name_len == 7) && !strncmp(":status", (char *)name, 7)) {
    msnprintf(headers->dest,
              headers->destlen, "HTTP/3 %.*s\n",
              (int) value_len, value);
  }
  else {
    msnprintf(headers->dest,
              headers->destlen, "%.*s: %.*s\n",
              (int)name_len, name, (int) value_len, value);
  }
  olen = strlen(headers->dest);
  headers->destlen -= olen;
  headers->nlen += olen;
  headers->dest += olen;
  return 0;
}

static ssize_t h3_stream_recv(struct connectdata *conn,
                              int sockindex,
                              char *buf,
                              size_t buffersize,
                              CURLcode *curlcode)
{
  ssize_t recvd = -1;
  ssize_t rcode;
  struct quicsocket *qs = conn->quic;
  curl_socket_t sockfd = conn->sock[sockindex];
  quiche_h3_event *ev;
  int rc;
  struct h3h1header headers;
  struct HTTP *stream = conn->data->req.protop;
  headers.dest = buf;
  headers.destlen = buffersize;
  headers.nlen = 0;

  if(process_ingress(conn, sockfd, qs)) {
    infof(conn->data, "h3_stream_recv returns on ingress\n");
    *curlcode = CURLE_RECV_ERROR;
    return -1;
  }

  while(recvd < 0) {
    int64_t s = quiche_h3_conn_poll(qs->h3c, qs->conn, &ev);
    if(s < 0)
      /* nothing more to do */
      break;

    if(s != stream->stream3_id) {
      /* another transfer, ignore for now */
      infof(conn->data, "Got h3 for stream %u, expects %u\n",
            s, stream->stream3_id);
      continue;
    }

    switch(quiche_h3_event_type(ev)) {
    case QUICHE_H3_EVENT_HEADERS:
      rc = quiche_h3_event_for_each_header(ev, cb_each_header, &headers);
      if(rc) {
        /* what do we do about this? */
      }
      recvd = headers.nlen;
      break;
    case QUICHE_H3_EVENT_DATA:
      if(!stream->firstbody) {
        /* add a header-body separator CRLF */
        buf[0] = '\r';
        buf[1] = '\n';
        buf += 2;
        buffersize -= 2;
        stream->firstbody = TRUE;
        recvd = 2; /* two bytes already */
      }
      else
        recvd = 0;
      rcode = quiche_h3_recv_body(qs->h3c, qs->conn, s, (unsigned char *)buf,
                                  buffersize);
      if(rcode <= 0) {
        recvd = -1;
        break;
      }
      recvd += rcode;
      break;

    case QUICHE_H3_EVENT_FINISHED:
      if(quiche_conn_close(qs->conn, true, 0, NULL, 0) < 0) {
        ;
      }
      recvd = 0; /* end of stream */
      break;
    default:
      break;
    }

    quiche_h3_event_free(ev);
  }
  if(flush_egress(conn, sockfd, qs)) {
    *curlcode = CURLE_SEND_ERROR;
    return -1;
  }

  *curlcode = (-1 == recvd)? CURLE_AGAIN : CURLE_OK;
  if(recvd >= 0)
    /* Get this called again to drain the event queue */
    Curl_expire(conn->data, 0, EXPIRE_QUIC);
  return recvd;
}

static ssize_t h3_stream_send(struct connectdata *conn,
                              int sockindex,
                              const void *mem,
                              size_t len,
                              CURLcode *curlcode)
{
  ssize_t sent;
  struct quicsocket *qs = conn->quic;
  curl_socket_t sockfd = conn->sock[sockindex];
  struct HTTP *stream = conn->data->req.protop;

  if(!stream->h3req) {
    CURLcode result = http_request(conn, mem, len);
    if(result) {
      *curlcode = CURLE_SEND_ERROR;
      return -1;
    }
    sent = len;
  }
  else {
    H3BUGF(infof(conn->data, "Pass on %zd body bytes to quiche\n",
                 len));
    sent = quiche_h3_send_body(qs->h3c, qs->conn, stream->stream3_id,
                               (uint8_t *)mem, len, FALSE);
    if(sent < 0) {
      *curlcode = CURLE_SEND_ERROR;
      return -1;
    }
  }

  if(flush_egress(conn, sockfd, qs)) {
    *curlcode = CURLE_SEND_ERROR;
    return -1;
  }

  *curlcode = CURLE_OK;
  return sent;
}

/*
 * Store quiche version info in this buffer, Prefix with a space.  Return total
 * length written.
 */
int Curl_quic_ver(char *p, size_t len)
{
  return msnprintf(p, len, " quiche/%s", quiche_version());
}

/* Index where :authority header field will appear in request header
   field list. */
#define AUTHORITY_DST_IDX 3

static CURLcode http_request(struct connectdata *conn, const void *mem,
                             size_t len)
{
  /*
   */
  struct HTTP *stream = conn->data->req.protop;
  size_t nheader;
  size_t i;
  size_t authority_idx;
  char *hdbuf = (char *)mem;
  char *end, *line_end;
  int64_t stream3_id;
  quiche_h3_header *nva = NULL;
  struct quicsocket *qs = conn->quic;
  CURLcode result = CURLE_OK;
  struct Curl_easy *data = conn->data;

  stream->h3req = TRUE; /* senf off! */

  /* Calculate number of headers contained in [mem, mem + len). Assumes a
     correctly generated HTTP header field block. */
  nheader = 0;
  for(i = 1; i < len; ++i) {
    if(hdbuf[i] == '\n' && hdbuf[i - 1] == '\r') {
      ++nheader;
      ++i;
    }
  }
  if(nheader < 2)
    goto fail;

  /* We counted additional 2 \r\n in the first and last line. We need 3
     new headers: :method, :path and :scheme. Therefore we need one
     more space. */
  nheader += 1;
  nva = malloc(sizeof(quiche_h3_header) * nheader);
  if(!nva) {
    result = CURLE_OUT_OF_MEMORY;
    goto fail;
  }

  /* Extract :method, :path from request line
     We do line endings with CRLF so checking for CR is enough */
  line_end = memchr(hdbuf, '\r', len);
  if(!line_end) {
    result = CURLE_BAD_FUNCTION_ARGUMENT; /* internal error */
    goto fail;
  }

  /* Method does not contain spaces */
  end = memchr(hdbuf, ' ', line_end - hdbuf);
  if(!end || end == hdbuf)
    goto fail;
  nva[0].name = (unsigned char *)":method";
  nva[0].name_len = strlen((char *)nva[0].name);
  nva[0].value = (unsigned char *)hdbuf;
  nva[0].value_len = (size_t)(end - hdbuf);

  hdbuf = end + 1;

  /* Path may contain spaces so scan backwards */
  end = NULL;
  for(i = (size_t)(line_end - hdbuf); i; --i) {
    if(hdbuf[i - 1] == ' ') {
      end = &hdbuf[i - 1];
      break;
    }
  }
  if(!end || end == hdbuf)
    goto fail;
  nva[1].name = (unsigned char *)":path";
  nva[1].name_len = strlen((char *)nva[1].name);
  nva[1].value = (unsigned char *)hdbuf;
  nva[1].value_len = (size_t)(end - hdbuf);

  nva[2].name = (unsigned char *)":scheme";
  nva[2].name_len = strlen((char *)nva[2].name);
  if(conn->handler->flags & PROTOPT_SSL)
    nva[2].value = (unsigned char *)"https";
  else
    nva[2].value = (unsigned char *)"http";
  nva[2].value_len = strlen((char *)nva[2].value);


  authority_idx = 0;
  i = 3;
  while(i < nheader) {
    size_t hlen;

    hdbuf = line_end + 2;

    /* check for next CR, but only within the piece of data left in the given
       buffer */
    line_end = memchr(hdbuf, '\r', len - (hdbuf - (char *)mem));
    if(!line_end || (line_end == hdbuf))
      goto fail;

    /* header continuation lines are not supported */
    if(*hdbuf == ' ' || *hdbuf == '\t')
      goto fail;

    for(end = hdbuf; end < line_end && *end != ':'; ++end)
      ;
    if(end == hdbuf || end == line_end)
      goto fail;
    hlen = end - hdbuf;

    if(hlen == 4 && strncasecompare("host", hdbuf, 4)) {
      authority_idx = i;
      nva[i].name = (unsigned char *)":authority";
      nva[i].name_len = strlen((char *)nva[i].name);
    }
    else {
      nva[i].name = (unsigned char *)hdbuf;
      nva[i].name_len = (size_t)(end - hdbuf);
    }
    hdbuf = end + 1;
    while(*hdbuf == ' ' || *hdbuf == '\t')
      ++hdbuf;
    end = line_end;

#if 0 /* This should probably go in more or less like this */
    switch(inspect_header((const char *)nva[i].name, nva[i].namelen, hdbuf,
                          end - hdbuf)) {
    case HEADERINST_IGNORE:
      /* skip header fields prohibited by HTTP/2 specification. */
      --nheader;
      continue;
    case HEADERINST_TE_TRAILERS:
      nva[i].value = (uint8_t*)"trailers";
      nva[i].value_len = sizeof("trailers") - 1;
      break;
    default:
      nva[i].value = (unsigned char *)hdbuf;
      nva[i].value_len = (size_t)(end - hdbuf);
    }
#endif
    nva[i].value = (unsigned char *)hdbuf;
    nva[i].value_len = (size_t)(end - hdbuf);

    ++i;
  }

  /* :authority must come before non-pseudo header fields */
  if(authority_idx != 0 && authority_idx != AUTHORITY_DST_IDX) {
    quiche_h3_header authority = nva[authority_idx];
    for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
      nva[i] = nva[i - 1];
    }
    nva[i] = authority;
  }

  /* Warn stream may be rejected if cumulative length of headers is too
     large. */
#define MAX_ACC 60000  /* <64KB to account for some overhead */
  {
    size_t acc = 0;

    for(i = 0; i < nheader; ++i) {
      acc += nva[i].name_len + nva[i].value_len;

      H3BUGF(infof(data, "h3 [%.*s: %.*s]\n",
                   nva[i].name_len, nva[i].name,
                   nva[i].value_len, nva[i].value));
    }

    if(acc > MAX_ACC) {
      infof(data, "http_request: Warning: The cumulative length of all "
            "headers exceeds %zu bytes and that could cause the "
            "stream to be rejected.\n", MAX_ACC);
    }
  }

  switch(data->set.httpreq) {
  case HTTPREQ_POST:
  case HTTPREQ_POST_FORM:
  case HTTPREQ_POST_MIME:
  case HTTPREQ_PUT:
    if(data->state.infilesize != -1)
      stream->upload_left = data->state.infilesize;
    else
      /* data sending without specifying the data amount up front */
      stream->upload_left = -1; /* unknown, but not zero */

    stream3_id = quiche_h3_send_request(qs->h3c, qs->conn, nva, nheader,
                                        stream->upload_left ? FALSE: TRUE);
    if((stream3_id >= 0) && data->set.postfields) {
      ssize_t sent = quiche_h3_send_body(qs->h3c, qs->conn, stream3_id,
                                         (uint8_t *)data->set.postfields,
                                         stream->upload_left, TRUE);
      if(sent <= 0) {
        failf(data, "quiche_h3_send_body failed!");
        result = CURLE_SEND_ERROR;
      }
      stream->upload_left = 0; /* nothing left to send */
    }
    break;
  default:
    stream3_id = quiche_h3_send_request(qs->h3c, qs->conn, nva, nheader,
                                        TRUE);
    break;
  }

  Curl_safefree(nva);

  if(stream3_id < 0) {
    H3BUGF(infof(data, "quiche_h3_send_request returned %d\n",
                 stream3_id));
    result = CURLE_SEND_ERROR;
    goto fail;
  }

  infof(data, "Using HTTP/3 Stream ID: %x (easy handle %p)\n",
        stream3_id, (void *)data);
  stream->stream3_id = stream3_id;

  return CURLE_OK;

fail:
  free(nva);
  return result;
}

/*
 * Called from transfer.c:done_sending when we stop HTTP/3 uploading.
 */
CURLcode Curl_quic_done_sending(struct connectdata *conn)
{
  if(conn->handler == &Curl_handler_http3) {
    /* only for HTTP/3 transfers */
    ssize_t sent;
    struct HTTP *stream = conn->data->req.protop;
    struct quicsocket *qs = conn->quic;
    fprintf(stderr, "!!! Curl_quic_done_sending\n");
    stream->upload_done = TRUE;
    sent = quiche_h3_send_body(qs->h3c, qs->conn, stream->stream3_id,
                               NULL, 0, TRUE);
    if(sent < 0)
      return CURLE_SEND_ERROR;
  }

  return CURLE_OK;
}

#endif
Added jni/curl/lib/vquic/quiche.h.


































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#ifndef HEADER_CURL_VQUIC_QUICHE_H
#define HEADER_CURL_VQUIC_QUICHE_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#ifdef USE_QUICHE

#include <quiche.h>

struct quic_handshake {
  char *buf;       /* pointer to the buffer */
  size_t alloclen; /* size of allocation */
  size_t len;      /* size of content in buffer */
  size_t nread;    /* how many bytes have been read */
};

struct quicsocket {
  quiche_config *cfg;
  quiche_conn *conn;
  quiche_h3_conn *h3c;
  quiche_h3_config *h3config;
  uint8_t scid[QUICHE_MAX_CONN_ID_LEN];
  uint32_t version;
};

#endif

#endif /* HEADER_CURL_VQUIC_QUICHE_H */
Added jni/curl/lib/vssh/libssh.c.






















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 2017 - 2019 Red Hat, Inc.
 *
 * Authors: Nikos Mavrogiannopoulos, Tomas Mraz, Stanislav Zidek,
 *          Robert Kolcun, Andreas Schneider
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

#include "curl_setup.h"

#ifdef USE_LIBSSH

#include <limits.h>

#include <libssh/libssh.h>
#include <libssh/sftp.h>

#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif

#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_UTSNAME_H
#include <sys/utsname.h>
#endif
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
#ifdef __VMS
#include <in.h>
#include <inet.h>
#endif

#if (defined(NETWARE) && defined(__NOVELL_LIBC__))
#undef in_addr_t
#define in_addr_t unsigned long
#endif

#include <curl/curl.h>
#include "urldata.h"
#include "sendf.h"
#include "hostip.h"
#include "progress.h"
#include "transfer.h"
#include "escape.h"
#include "http.h"               /* for HTTP proxy tunnel stuff */
#include "ssh.h"
#include "url.h"
#include "speedcheck.h"
#include "getinfo.h"
#include "strdup.h"
#include "strcase.h"
#include "vtls/vtls.h"
#include "connect.h"
#include "strerror.h"
#include "inet_ntop.h"
#include "parsedate.h"          /* for the week day and month names */
#include "sockaddr.h"           /* required for Curl_sockaddr_storage */
#include "strtoofft.h"
#include "multiif.h"
#include "select.h"
#include "warnless.h"

/* for permission and open flags */
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"
#include "curl_path.h"

/* A recent macro provided by libssh. Or make our own. */
#ifndef SSH_STRING_FREE_CHAR
/* !checksrc! disable ASSIGNWITHINCONDITION 1 */
#define SSH_STRING_FREE_CHAR(x) \
    do { if((x) != NULL) { ssh_string_free_char(x); x = NULL; } } while(0)
#endif

/* Local functions: */
static CURLcode myssh_connect(struct connectdata *conn, bool *done);
static CURLcode myssh_multi_statemach(struct connectdata *conn,
                                      bool *done);
static CURLcode myssh_do_it(struct connectdata *conn, bool *done);

static CURLcode scp_done(struct connectdata *conn,
                         CURLcode, bool premature);
static CURLcode scp_doing(struct connectdata *conn, bool *dophase_done);
static CURLcode scp_disconnect(struct connectdata *conn,
                               bool dead_connection);

static CURLcode sftp_done(struct connectdata *conn,
                          CURLcode, bool premature);
static CURLcode sftp_doing(struct connectdata *conn,
                           bool *dophase_done);
static CURLcode sftp_disconnect(struct connectdata *conn, bool dead);
static
CURLcode sftp_perform(struct connectdata *conn,
                      bool *connected,
                      bool *dophase_done);

static void sftp_quote(struct connectdata *conn);
static void sftp_quote_stat(struct connectdata *conn);
static int myssh_getsock(struct connectdata *conn, curl_socket_t *sock);
static int myssh_perform_getsock(const struct connectdata *conn,
                                 curl_socket_t *sock);

static CURLcode myssh_setup_connection(struct connectdata *conn);

/*
 * SCP protocol handler.
 */

const struct Curl_handler Curl_handler_scp = {
  "SCP",                        /* scheme */
  myssh_setup_connection,       /* setup_connection */
  myssh_do_it,                  /* do_it */
  scp_done,                     /* done */
  ZERO_NULL,                    /* do_more */
  myssh_connect,                /* connect_it */
  myssh_multi_statemach,        /* connecting */
  scp_doing,                    /* doing */
  myssh_getsock,                /* proto_getsock */
  myssh_getsock,                /* doing_getsock */
  ZERO_NULL,                    /* domore_getsock */
  myssh_perform_getsock,        /* perform_getsock */
  scp_disconnect,               /* disconnect */
  ZERO_NULL,                    /* readwrite */
  ZERO_NULL,                    /* connection_check */
  PORT_SSH,                     /* defport */
  CURLPROTO_SCP,                /* protocol */
  PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY    /* flags */
};

/*
 * SFTP protocol handler.
 */

const struct Curl_handler Curl_handler_sftp = {
  "SFTP",                               /* scheme */
  myssh_setup_connection,               /* setup_connection */
  myssh_do_it,                          /* do_it */
  sftp_done,                            /* done */
  ZERO_NULL,                            /* do_more */
  myssh_connect,                        /* connect_it */
  myssh_multi_statemach,                /* connecting */
  sftp_doing,                           /* doing */
  myssh_getsock,                        /* proto_getsock */
  myssh_getsock,                        /* doing_getsock */
  ZERO_NULL,                            /* domore_getsock */
  myssh_perform_getsock,                /* perform_getsock */
  sftp_disconnect,                      /* disconnect */
  ZERO_NULL,                            /* readwrite */
  ZERO_NULL,                            /* connection_check */
  PORT_SSH,                             /* defport */
  CURLPROTO_SFTP,                       /* protocol */
  PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
  | PROTOPT_NOURLQUERY                  /* flags */
};

static CURLcode sftp_error_to_CURLE(int err)
{
  switch(err) {
    case SSH_FX_OK:
      return CURLE_OK;

    case SSH_FX_NO_SUCH_FILE:
    case SSH_FX_NO_SUCH_PATH:
      return CURLE_REMOTE_FILE_NOT_FOUND;

    case SSH_FX_PERMISSION_DENIED:
    case SSH_FX_WRITE_PROTECT:
      return CURLE_REMOTE_ACCESS_DENIED;

    case SSH_FX_FILE_ALREADY_EXISTS:
      return CURLE_REMOTE_FILE_EXISTS;

    default:
      break;
  }

  return CURLE_SSH;
}

#ifndef DEBUGBUILD
#define state(x,y) mystate(x,y)
#else
#define state(x,y) mystate(x,y, __LINE__)
#endif

/*
 * SSH State machine related code
 */
/* This is the ONLY way to change SSH state! */
static void mystate(struct connectdata *conn, sshstate nowstate
#ifdef DEBUGBUILD
                    , int lineno
#endif
  )
{
  struct ssh_conn *sshc = &conn->proto.sshc;
#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
  /* for debug purposes */
  static const char *const names[] = {
    "SSH_STOP",
    "SSH_INIT",
    "SSH_S_STARTUP",
    "SSH_HOSTKEY",
    "SSH_AUTHLIST",
    "SSH_AUTH_PKEY_INIT",
    "SSH_AUTH_PKEY",
    "SSH_AUTH_PASS_INIT",
    "SSH_AUTH_PASS",
    "SSH_AUTH_AGENT_INIT",
    "SSH_AUTH_AGENT_LIST",
    "SSH_AUTH_AGENT",
    "SSH_AUTH_HOST_INIT",
    "SSH_AUTH_HOST",
    "SSH_AUTH_KEY_INIT",
    "SSH_AUTH_KEY",
    "SSH_AUTH_GSSAPI",
    "SSH_AUTH_DONE",
    "SSH_SFTP_INIT",
    "SSH_SFTP_REALPATH",
    "SSH_SFTP_QUOTE_INIT",
    "SSH_SFTP_POSTQUOTE_INIT",
    "SSH_SFTP_QUOTE",
    "SSH_SFTP_NEXT_QUOTE",
    "SSH_SFTP_QUOTE_STAT",
    "SSH_SFTP_QUOTE_SETSTAT",
    "SSH_SFTP_QUOTE_SYMLINK",
    "SSH_SFTP_QUOTE_MKDIR",
    "SSH_SFTP_QUOTE_RENAME",
    "SSH_SFTP_QUOTE_RMDIR",
    "SSH_SFTP_QUOTE_UNLINK",
    "SSH_SFTP_QUOTE_STATVFS",
    "SSH_SFTP_GETINFO",
    "SSH_SFTP_FILETIME",
    "SSH_SFTP_TRANS_INIT",
    "SSH_SFTP_UPLOAD_INIT",
    "SSH_SFTP_CREATE_DIRS_INIT",
    "SSH_SFTP_CREATE_DIRS",
    "SSH_SFTP_CREATE_DIRS_MKDIR",
    "SSH_SFTP_READDIR_INIT",
    "SSH_SFTP_READDIR",
    "SSH_SFTP_READDIR_LINK",
    "SSH_SFTP_READDIR_BOTTOM",
    "SSH_SFTP_READDIR_DONE",
    "SSH_SFTP_DOWNLOAD_INIT",
    "SSH_SFTP_DOWNLOAD_STAT",
    "SSH_SFTP_CLOSE",
    "SSH_SFTP_SHUTDOWN",
    "SSH_SCP_TRANS_INIT",
    "SSH_SCP_UPLOAD_INIT",
    "SSH_SCP_DOWNLOAD_INIT",
    "SSH_SCP_DOWNLOAD",
    "SSH_SCP_DONE",
    "SSH_SCP_SEND_EOF",
    "SSH_SCP_WAIT_EOF",
    "SSH_SCP_WAIT_CLOSE",
    "SSH_SCP_CHANNEL_FREE",
    "SSH_SESSION_DISCONNECT",
    "SSH_SESSION_FREE",
    "QUIT"
  };


  if(sshc->state != nowstate) {
    infof(conn->data, "SSH %p state change from %s to %s (line %d)\n",
          (void *) sshc, names[sshc->state], names[nowstate],
          lineno);
  }
#endif

  sshc->state = nowstate;
}

/* Multiple options:
 * 1. data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5] is set with an MD5
 *    hash (90s style auth, not sure we should have it here)
 * 2. data->set.ssh_keyfunc callback is set. Then we do trust on first
 *    use. We even save on knownhosts if CURLKHSTAT_FINE_ADD_TO_FILE
 *    is returned by it.
 * 3. none of the above. We only accept if it is present on known hosts.
 *
 * Returns SSH_OK or SSH_ERROR.
 */
static int myssh_is_known(struct connectdata *conn)
{
  int rc;
  struct Curl_easy *data = conn->data;
  struct ssh_conn *sshc = &conn->proto.sshc;
  ssh_key pubkey;
  size_t hlen;
  unsigned char *hash = NULL;
  char *base64 = NULL;
  int vstate;
  enum curl_khmatch keymatch;
  struct curl_khkey foundkey;
  curl_sshkeycallback func =
    data->set.ssh_keyfunc;

  rc = ssh_get_publickey(sshc->ssh_session, &pubkey);
  if(rc != SSH_OK)
    return rc;

  if(data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5]) {
    rc = ssh_get_publickey_hash(pubkey, SSH_PUBLICKEY_HASH_MD5,
                                &hash, &hlen);
    if(rc != SSH_OK)
      goto cleanup;

    if(hlen != strlen(data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5]) ||
       memcmp(&data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5], hash, hlen)) {
      rc = SSH_ERROR;
      goto cleanup;
    }

    rc = SSH_OK;
    goto cleanup;
  }

  if(data->set.ssl.primary.verifyhost != TRUE) {
    rc = SSH_OK;
    goto cleanup;
  }

  vstate = ssh_is_server_known(sshc->ssh_session);
  switch(vstate) {
    case SSH_SERVER_KNOWN_OK:
      keymatch = CURLKHMATCH_OK;
      break;
    case SSH_SERVER_FILE_NOT_FOUND:
      /* fallthrough */
    case SSH_SERVER_NOT_KNOWN:
      keymatch = CURLKHMATCH_MISSING;
      break;
  default:
      keymatch = CURLKHMATCH_MISMATCH;
      break;
  }

  if(func) { /* use callback to determine action */
    rc = ssh_pki_export_pubkey_base64(pubkey, &base64);
    if(rc != SSH_OK)
      goto cleanup;

    foundkey.key = base64;
    foundkey.len = strlen(base64);

    switch(ssh_key_type(pubkey)) {
      case SSH_KEYTYPE_RSA:
        foundkey.keytype = CURLKHTYPE_RSA;
        break;
      case SSH_KEYTYPE_RSA1:
        foundkey.keytype = CURLKHTYPE_RSA1;
        break;
      case SSH_KEYTYPE_ECDSA:
        foundkey.keytype = CURLKHTYPE_ECDSA;
        break;
#if LIBSSH_VERSION_INT >= SSH_VERSION_INT(0,7,0)
      case SSH_KEYTYPE_ED25519:
        foundkey.keytype = CURLKHTYPE_ED25519;
        break;
#endif
      case SSH_KEYTYPE_DSS:
        foundkey.keytype = CURLKHTYPE_DSS;
        break;
      default:
        rc = SSH_ERROR;
        goto cleanup;
    }

    /* we don't have anything equivalent to knownkey. Always NULL */
    Curl_set_in_callback(data, true);
    rc = func(data, NULL, &foundkey, /* from the remote host */
              keymatch, data->set.ssh_keyfunc_userp);
    Curl_set_in_callback(data, false);

    switch(rc) {
      case CURLKHSTAT_FINE_ADD_TO_FILE:
        rc = ssh_write_knownhost(sshc->ssh_session);
        if(rc != SSH_OK) {
          goto cleanup;
        }
        break;
      case CURLKHSTAT_FINE:
        break;
      default: /* REJECT/DEFER */
        rc = SSH_ERROR;
        goto cleanup;
    }
  }
  else {
    if(keymatch != CURLKHMATCH_OK) {
      rc = SSH_ERROR;
      goto cleanup;
    }
  }
  rc = SSH_OK;

cleanup:
  if(hash)
    ssh_clean_pubkey_hash(&hash);
  ssh_key_free(pubkey);
  return rc;
}

#define MOVE_TO_ERROR_STATE(_r) { \
  state(conn, SSH_SESSION_DISCONNECT); \
  sshc->actualcode = _r; \
  rc = SSH_ERROR; \
  break; \
}

#define MOVE_TO_SFTP_CLOSE_STATE() { \
  state(conn, SSH_SFTP_CLOSE); \
  sshc->actualcode = sftp_error_to_CURLE(sftp_get_error(sshc->sftp_session)); \
  rc = SSH_ERROR; \
  break; \
}

#define MOVE_TO_LAST_AUTH \
  if(sshc->auth_methods & SSH_AUTH_METHOD_PASSWORD) { \
    rc = SSH_OK; \
    state(conn, SSH_AUTH_PASS_INIT); \
    break; \
  } \
  else { \
    MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED); \
  }

#define MOVE_TO_TERTIARY_AUTH \
  if(sshc->auth_methods & SSH_AUTH_METHOD_INTERACTIVE) { \
    rc = SSH_OK; \
    state(conn, SSH_AUTH_KEY_INIT); \
    break; \
  } \
  else { \
    MOVE_TO_LAST_AUTH; \
  }

#define MOVE_TO_SECONDARY_AUTH \
  if(sshc->auth_methods & SSH_AUTH_METHOD_GSSAPI_MIC) { \
    rc = SSH_OK; \
    state(conn, SSH_AUTH_GSSAPI); \
    break; \
  } \
  else { \
    MOVE_TO_TERTIARY_AUTH; \
  }

static
int myssh_auth_interactive(struct connectdata *conn)
{
  int rc;
  struct ssh_conn *sshc = &conn->proto.sshc;
  int nprompts;

restart:
  switch(sshc->kbd_state) {
    case 0:
      rc = ssh_userauth_kbdint(sshc->ssh_session, NULL, NULL);
      if(rc == SSH_AUTH_AGAIN)
        return SSH_AGAIN;

      if(rc != SSH_AUTH_INFO)
        return SSH_ERROR;

      nprompts = ssh_userauth_kbdint_getnprompts(sshc->ssh_session);
      if(nprompts == SSH_ERROR || nprompts != 1)
        return SSH_ERROR;

      rc = ssh_userauth_kbdint_setanswer(sshc->ssh_session, 0, conn->passwd);
      if(rc < 0)
        return SSH_ERROR;

    /* FALLTHROUGH */
    case 1:
      sshc->kbd_state = 1;

      rc = ssh_userauth_kbdint(sshc->ssh_session, NULL, NULL);
      if(rc == SSH_AUTH_AGAIN)
        return SSH_AGAIN;
      else if(rc == SSH_AUTH_SUCCESS)
        rc = SSH_OK;
      else if(rc == SSH_AUTH_INFO) {
        nprompts = ssh_userauth_kbdint_getnprompts(sshc->ssh_session);
        if(nprompts != 0)
          return SSH_ERROR;

        sshc->kbd_state = 2;
        goto restart;
      }
      else
        rc = SSH_ERROR;
      break;
    case 2:
      sshc->kbd_state = 2;

      rc = ssh_userauth_kbdint(sshc->ssh_session, NULL, NULL);
      if(rc == SSH_AUTH_AGAIN)
        return SSH_AGAIN;
      else if(rc == SSH_AUTH_SUCCESS)
        rc = SSH_OK;
      else
        rc = SSH_ERROR;

      break;
    default:
      return SSH_ERROR;
  }

  sshc->kbd_state = 0;
  return rc;
}

/*
 * ssh_statemach_act() runs the SSH state machine as far as it can without
 * blocking and without reaching the end.  The data the pointer 'block' points
 * to will be set to TRUE if the libssh function returns SSH_AGAIN
 * meaning it wants to be called again when the socket is ready
 */
static CURLcode myssh_statemach_act(struct connectdata *conn, bool *block)
{
  CURLcode result = CURLE_OK;
  struct Curl_easy *data = conn->data;
  struct SSHPROTO *protop = data->req.protop;
  struct ssh_conn *sshc = &conn->proto.sshc;
  curl_socket_t sock = conn->sock[FIRSTSOCKET];
  int rc = SSH_NO_ERROR, err;
  char *new_readdir_line;
  int seekerr = CURL_SEEKFUNC_OK;
  const char *err_msg;
  *block = 0;                   /* we're not blocking by default */

  do {

    switch(sshc->state) {
    case SSH_INIT:
      sshc->secondCreateDirs = 0;
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = CURLE_OK;

#if 0
      ssh_set_log_level(SSH_LOG_PROTOCOL);
#endif

      /* Set libssh to non-blocking, since everything internally is
         non-blocking */
      ssh_set_blocking(sshc->ssh_session, 0);

      state(conn, SSH_S_STARTUP);
      /* FALLTHROUGH */

    case SSH_S_STARTUP:
      rc = ssh_connect(sshc->ssh_session);
      if(rc == SSH_AGAIN)
        break;

      if(rc != SSH_OK) {
        failf(data, "Failure establishing ssh session");
        MOVE_TO_ERROR_STATE(CURLE_FAILED_INIT);
      }

      state(conn, SSH_HOSTKEY);

      /* FALLTHROUGH */
    case SSH_HOSTKEY:

      rc = myssh_is_known(conn);
      if(rc != SSH_OK) {
        MOVE_TO_ERROR_STATE(CURLE_PEER_FAILED_VERIFICATION);
      }

      state(conn, SSH_AUTHLIST);
      /* FALLTHROUGH */
    case SSH_AUTHLIST:{
        sshc->authed = FALSE;

        rc = ssh_userauth_none(sshc->ssh_session, NULL);
        if(rc == SSH_AUTH_AGAIN) {
          rc = SSH_AGAIN;
          break;
        }

        if(rc == SSH_AUTH_SUCCESS) {
          sshc->authed = TRUE;
          infof(data, "Authenticated with none\n");
          state(conn, SSH_AUTH_DONE);
          break;
        }
        else if(rc == SSH_AUTH_ERROR) {
          MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
        }

        sshc->auth_methods = ssh_userauth_list(sshc->ssh_session, NULL);
        if(sshc->auth_methods & SSH_AUTH_METHOD_PUBLICKEY) {
          state(conn, SSH_AUTH_PKEY_INIT);
          infof(data, "Authentication using SSH public key file\n");
        }
        else if(sshc->auth_methods & SSH_AUTH_METHOD_GSSAPI_MIC) {
          state(conn, SSH_AUTH_GSSAPI);
        }
        else if(sshc->auth_methods & SSH_AUTH_METHOD_INTERACTIVE) {
          state(conn, SSH_AUTH_KEY_INIT);
        }
        else if(sshc->auth_methods & SSH_AUTH_METHOD_PASSWORD) {
          state(conn, SSH_AUTH_PASS_INIT);
        }
        else {                  /* unsupported authentication method */
          MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
        }

        break;
      }
    case SSH_AUTH_PKEY_INIT:
      if(!(data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY)) {
        MOVE_TO_SECONDARY_AUTH;
      }

      /* Two choices, (1) private key was given on CMD,
       * (2) use the "default" keys. */
      if(data->set.str[STRING_SSH_PRIVATE_KEY]) {
        if(sshc->pubkey && !data->set.ssl.key_passwd) {
          rc = ssh_userauth_try_publickey(sshc->ssh_session, NULL,
                                          sshc->pubkey);
          if(rc == SSH_AUTH_AGAIN) {
            rc = SSH_AGAIN;
            break;
          }

          if(rc != SSH_OK) {
            MOVE_TO_SECONDARY_AUTH;
          }
        }

        rc = ssh_pki_import_privkey_file(data->
                                         set.str[STRING_SSH_PRIVATE_KEY],
                                         data->set.ssl.key_passwd, NULL,
                                         NULL, &sshc->privkey);
        if(rc != SSH_OK) {
          failf(data, "Could not load private key file %s",
                data->set.str[STRING_SSH_PRIVATE_KEY]);
          MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
          break;
        }

        state(conn, SSH_AUTH_PKEY);
        break;

      }
      else {
        rc = ssh_userauth_publickey_auto(sshc->ssh_session, NULL,
                                         data->set.ssl.key_passwd);
        if(rc == SSH_AUTH_AGAIN) {
          rc = SSH_AGAIN;
          break;
        }
        if(rc == SSH_AUTH_SUCCESS) {
          rc = SSH_OK;
          sshc->authed = TRUE;
          infof(data, "Completed public key authentication\n");
          state(conn, SSH_AUTH_DONE);
          break;
        }

        MOVE_TO_SECONDARY_AUTH;
      }
      break;
    case SSH_AUTH_PKEY:
      rc = ssh_userauth_publickey(sshc->ssh_session, NULL, sshc->privkey);
      if(rc == SSH_AUTH_AGAIN) {
        rc = SSH_AGAIN;
        break;
      }

      if(rc == SSH_AUTH_SUCCESS) {
        sshc->authed = TRUE;
        infof(data, "Completed public key authentication\n");
        state(conn, SSH_AUTH_DONE);
        break;
      }
      else {
        infof(data, "Failed public key authentication (rc: %d)\n", rc);
        MOVE_TO_SECONDARY_AUTH;
      }
      break;

    case SSH_AUTH_GSSAPI:
      if(!(data->set.ssh_auth_types & CURLSSH_AUTH_GSSAPI)) {
        MOVE_TO_TERTIARY_AUTH;
      }

      rc = ssh_userauth_gssapi(sshc->ssh_session);
      if(rc == SSH_AUTH_AGAIN) {
        rc = SSH_AGAIN;
        break;
      }

      if(rc == SSH_AUTH_SUCCESS) {
        rc = SSH_OK;
        sshc->authed = TRUE;
        infof(data, "Completed gssapi authentication\n");
        state(conn, SSH_AUTH_DONE);
        break;
      }

      MOVE_TO_TERTIARY_AUTH;
      break;

    case SSH_AUTH_KEY_INIT:
      if(data->set.ssh_auth_types & CURLSSH_AUTH_KEYBOARD) {
        state(conn, SSH_AUTH_KEY);
      }
      else {
        MOVE_TO_LAST_AUTH;
      }
      break;

    case SSH_AUTH_KEY:

      /* Authentication failed. Continue with keyboard-interactive now. */
      rc = myssh_auth_interactive(conn);
      if(rc == SSH_AGAIN) {
        break;
      }
      if(rc == SSH_OK) {
        sshc->authed = TRUE;
        infof(data, "completed keyboard interactive authentication\n");
      }
      state(conn, SSH_AUTH_DONE);
      break;

    case SSH_AUTH_PASS_INIT:
      if(!(data->set.ssh_auth_types & CURLSSH_AUTH_PASSWORD)) {
        /* Host key authentication is intentionally not implemented */
        MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
      }
      state(conn, SSH_AUTH_PASS);
      /* FALLTHROUGH */

    case SSH_AUTH_PASS:
      rc = ssh_userauth_password(sshc->ssh_session, NULL, conn->passwd);
      if(rc == SSH_AUTH_AGAIN) {
        rc = SSH_AGAIN;
        break;
      }

      if(rc == SSH_AUTH_SUCCESS) {
        sshc->authed = TRUE;
        infof(data, "Completed password authentication\n");
        state(conn, SSH_AUTH_DONE);
      }
      else {
        MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
      }
      break;

    case SSH_AUTH_DONE:
      if(!sshc->authed) {
        failf(data, "Authentication failure");
        MOVE_TO_ERROR_STATE(CURLE_LOGIN_DENIED);
        break;
      }

      /*
       * At this point we have an authenticated ssh session.
       */
      infof(data, "Authentication complete\n");

      Curl_pgrsTime(conn->data, TIMER_APPCONNECT);      /* SSH is connected */

      conn->sockfd = sock;
      conn->writesockfd = CURL_SOCKET_BAD;

      if(conn->handler->protocol == CURLPROTO_SFTP) {
        state(conn, SSH_SFTP_INIT);
        break;
      }
      infof(data, "SSH CONNECT phase done\n");
      state(conn, SSH_STOP);
      break;

    case SSH_SFTP_INIT:
      ssh_set_blocking(sshc->ssh_session, 1);

      sshc->sftp_session = sftp_new(sshc->ssh_session);
      if(!sshc->sftp_session) {
        failf(data, "Failure initializing sftp session: %s",
              ssh_get_error(sshc->ssh_session));
        MOVE_TO_ERROR_STATE(CURLE_COULDNT_CONNECT);
        break;
      }

      rc = sftp_init(sshc->sftp_session);
      if(rc != SSH_OK) {
        rc = sftp_get_error(sshc->sftp_session);
        failf(data, "Failure initializing sftp session: %s",
              ssh_get_error(sshc->ssh_session));
        MOVE_TO_ERROR_STATE(sftp_error_to_CURLE(rc));
        break;
      }
      state(conn, SSH_SFTP_REALPATH);
      /* FALLTHROUGH */
    case SSH_SFTP_REALPATH:
      /*
       * Get the "home" directory
       */
      sshc->homedir = sftp_canonicalize_path(sshc->sftp_session, ".");
      if(sshc->homedir == NULL) {
        MOVE_TO_ERROR_STATE(CURLE_COULDNT_CONNECT);
      }
      conn->data->state.most_recent_ftp_entrypath = sshc->homedir;

      /* This is the last step in the SFTP connect phase. Do note that while
         we get the homedir here, we get the "workingpath" in the DO action
         since the homedir will remain the same between request but the
         working path will not. */
      DEBUGF(infof(data, "SSH CONNECT phase done\n"));
      state(conn, SSH_STOP);
      break;

    case SSH_SFTP_QUOTE_INIT:

      result = Curl_getworkingpath(conn, sshc->homedir, &protop->path);
      if(result) {
        sshc->actualcode = result;
        state(conn, SSH_STOP);
        break;
      }

      if(data->set.quote) {
        infof(data, "Sending quote commands\n");
        sshc->quote_item = data->set.quote;
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        state(conn, SSH_SFTP_GETINFO);
      }
      break;

    case SSH_SFTP_POSTQUOTE_INIT:
      if(data->set.postquote) {
        infof(data, "Sending quote commands\n");
        sshc->quote_item = data->set.postquote;
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        state(conn, SSH_STOP);
      }
      break;

    case SSH_SFTP_QUOTE:
      /* Send any quote commands */
      sftp_quote(conn);
      break;

    case SSH_SFTP_NEXT_QUOTE:
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);

      sshc->quote_item = sshc->quote_item->next;

      if(sshc->quote_item) {
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        if(sshc->nextstate != SSH_NO_STATE) {
          state(conn, sshc->nextstate);
          sshc->nextstate = SSH_NO_STATE;
        }
        else {
          state(conn, SSH_SFTP_GETINFO);
        }
      }
      break;

    case SSH_SFTP_QUOTE_STAT:
      sftp_quote_stat(conn);
      break;

    case SSH_SFTP_QUOTE_SETSTAT:
      rc = sftp_setstat(sshc->sftp_session, sshc->quote_path2,
                        sshc->quote_attrs);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "Attempt to set SFTP stats failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        /* sshc->actualcode = sftp_error_to_CURLE(err);
         * we do not send the actual error; we return
         * the error the libssh2 backend is returning */
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_SYMLINK:
      rc = sftp_symlink(sshc->sftp_session, sshc->quote_path2,
                        sshc->quote_path1);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "symlink command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_MKDIR:
      rc = sftp_mkdir(sshc->sftp_session, sshc->quote_path1,
                      (mode_t)data->set.new_directory_perms);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        failf(data, "mkdir command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_RENAME:
      rc = sftp_rename(sshc->sftp_session, sshc->quote_path1,
                       sshc->quote_path2);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "rename command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_RMDIR:
      rc = sftp_rmdir(sshc->sftp_session, sshc->quote_path1);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        failf(data, "rmdir command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_UNLINK:
      rc = sftp_unlink(sshc->sftp_session, sshc->quote_path1);
      if(rc != 0 && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        failf(data, "rm command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_STATVFS:
    {
      sftp_statvfs_t statvfs;

      statvfs = sftp_statvfs(sshc->sftp_session, sshc->quote_path1);
      if(!statvfs && !sshc->acceptfail) {
        Curl_safefree(sshc->quote_path1);
        failf(data, "statvfs command failed: %s",
              ssh_get_error(sshc->ssh_session));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      else if(statvfs) {
        char *tmp = aprintf("statvfs:\n"
                            "f_bsize: %llu\n" "f_frsize: %llu\n"
                            "f_blocks: %llu\n" "f_bfree: %llu\n"
                            "f_bavail: %llu\n" "f_files: %llu\n"
                            "f_ffree: %llu\n" "f_favail: %llu\n"
                            "f_fsid: %llu\n" "f_flag: %llu\n"
                            "f_namemax: %llu\n",
                            statvfs->f_bsize, statvfs->f_frsize,
                            statvfs->f_blocks, statvfs->f_bfree,
                            statvfs->f_bavail, statvfs->f_files,
                            statvfs->f_ffree, statvfs->f_favail,
                            statvfs->f_fsid, statvfs->f_flag,
                            statvfs->f_namemax);
        sftp_statvfs_free(statvfs);

        if(!tmp) {
          result = CURLE_OUT_OF_MEMORY;
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          break;
        }

        result = Curl_client_write(conn, CLIENTWRITE_HEADER, tmp, strlen(tmp));
        free(tmp);
        if(result) {
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = result;
        }
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;
    }

    case SSH_SFTP_GETINFO:
      if(data->set.get_filetime) {
        state(conn, SSH_SFTP_FILETIME);
      }
      else {
        state(conn, SSH_SFTP_TRANS_INIT);
      }
      break;

    case SSH_SFTP_FILETIME:
    {
      sftp_attributes attrs;

      attrs = sftp_stat(sshc->sftp_session, protop->path);
      if(attrs != 0) {
        data->info.filetime = attrs->mtime;
        sftp_attributes_free(attrs);
      }

      state(conn, SSH_SFTP_TRANS_INIT);
      break;
    }

    case SSH_SFTP_TRANS_INIT:
      if(data->set.upload)
        state(conn, SSH_SFTP_UPLOAD_INIT);
      else {
        if(protop->path[strlen(protop->path)-1] == '/')
          state(conn, SSH_SFTP_READDIR_INIT);
        else
          state(conn, SSH_SFTP_DOWNLOAD_INIT);
      }
      break;

    case SSH_SFTP_UPLOAD_INIT:
    {
      int flags;

      if(data->state.resume_from != 0) {
        sftp_attributes attrs;

        if(data->state.resume_from < 0) {
          attrs = sftp_stat(sshc->sftp_session, protop->path);
          if(attrs != 0) {
            curl_off_t size = attrs->size;
            if(size < 0) {
              failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
              MOVE_TO_ERROR_STATE(CURLE_BAD_DOWNLOAD_RESUME);
            }
            data->state.resume_from = attrs->size;

            sftp_attributes_free(attrs);
          }
          else {
            data->state.resume_from = 0;
          }
        }
      }

      if(data->set.ftp_append)
        /* Try to open for append, but create if nonexisting */
        flags = O_WRONLY|O_CREAT|O_APPEND;
      else if(data->state.resume_from > 0)
        /* If we have restart position then open for append */
        flags = O_WRONLY|O_APPEND;
      else
        /* Clear file before writing (normal behaviour) */
        flags = O_WRONLY|O_CREAT|O_TRUNC;

      if(sshc->sftp_file)
        sftp_close(sshc->sftp_file);
      sshc->sftp_file =
        sftp_open(sshc->sftp_session, protop->path,
                  flags, (mode_t)data->set.new_file_perms);
      if(!sshc->sftp_file) {
        err = sftp_get_error(sshc->sftp_session);

        if(((err == SSH_FX_NO_SUCH_FILE || err == SSH_FX_FAILURE ||
             err == SSH_FX_NO_SUCH_PATH)) &&
             (data->set.ftp_create_missing_dirs &&
             (strlen(protop->path) > 1))) {
               /* try to create the path remotely */
               rc = 0;
               sshc->secondCreateDirs = 1;
               state(conn, SSH_SFTP_CREATE_DIRS_INIT);
               break;
        }
        else {
          MOVE_TO_SFTP_CLOSE_STATE();
        }
      }

      /* If we have a restart point then we need to seek to the correct
         position. */
      if(data->state.resume_from > 0) {
        /* Let's read off the proper amount of bytes from the input. */
        if(conn->seek_func) {
          Curl_set_in_callback(data, true);
          seekerr = conn->seek_func(conn->seek_client, data->state.resume_from,
                                    SEEK_SET);
          Curl_set_in_callback(data, false);
        }

        if(seekerr != CURL_SEEKFUNC_OK) {
          curl_off_t passed = 0;

          if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
            failf(data, "Could not seek stream");
            return CURLE_FTP_COULDNT_USE_REST;
          }
          /* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
          do {
            size_t readthisamountnow =
              (data->state.resume_from - passed > data->set.buffer_size) ?
              (size_t)data->set.buffer_size :
              curlx_sotouz(data->state.resume_from - passed);

            size_t actuallyread =
              data->state.fread_func(data->state.buffer, 1,
                                     readthisamountnow, data->state.in);

            passed += actuallyread;
            if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
              /* this checks for greater-than only to make sure that the
                 CURL_READFUNC_ABORT return code still aborts */
              failf(data, "Failed to read data");
              MOVE_TO_ERROR_STATE(CURLE_FTP_COULDNT_USE_REST);
            }
          } while(passed < data->state.resume_from);
        }

        /* now, decrease the size of the read */
        if(data->state.infilesize > 0) {
          data->state.infilesize -= data->state.resume_from;
          data->req.size = data->state.infilesize;
          Curl_pgrsSetUploadSize(data, data->state.infilesize);
        }

        rc = sftp_seek64(sshc->sftp_file, data->state.resume_from);
        if(rc != 0) {
          MOVE_TO_SFTP_CLOSE_STATE();
        }
      }
      if(data->state.infilesize > 0) {
        data->req.size = data->state.infilesize;
        Curl_pgrsSetUploadSize(data, data->state.infilesize);
      }
      /* upload data */
      Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);

      /* not set by Curl_setup_transfer to preserve keepon bits */
      conn->sockfd = conn->writesockfd;

      /* store this original bitmask setup to use later on if we can't
         figure out a "real" bitmask */
      sshc->orig_waitfor = data->req.keepon;

      /* we want to use the _sending_ function even when the socket turns
         out readable as the underlying libssh sftp send function will deal
         with both accordingly */
      conn->cselect_bits = CURL_CSELECT_OUT;

      /* since we don't really wait for anything at this point, we want the
         state machine to move on as soon as possible so we set a very short
         timeout here */
      Curl_expire(data, 0, EXPIRE_RUN_NOW);

      state(conn, SSH_STOP);
      break;
    }

    case SSH_SFTP_CREATE_DIRS_INIT:
      if(strlen(protop->path) > 1) {
        sshc->slash_pos = protop->path + 1; /* ignore the leading '/' */
        state(conn, SSH_SFTP_CREATE_DIRS);
      }
      else {
        state(conn, SSH_SFTP_UPLOAD_INIT);
      }
      break;

    case SSH_SFTP_CREATE_DIRS:
      sshc->slash_pos = strchr(sshc->slash_pos, '/');
      if(sshc->slash_pos) {
        *sshc->slash_pos = 0;

        infof(data, "Creating directory '%s'\n", protop->path);
        state(conn, SSH_SFTP_CREATE_DIRS_MKDIR);
        break;
      }
      state(conn, SSH_SFTP_UPLOAD_INIT);
      break;

    case SSH_SFTP_CREATE_DIRS_MKDIR:
      /* 'mode' - parameter is preliminary - default to 0644 */
      rc = sftp_mkdir(sshc->sftp_session, protop->path,
                      (mode_t)data->set.new_directory_perms);
      *sshc->slash_pos = '/';
      ++sshc->slash_pos;
      if(rc < 0) {
        /*
         * Abort if failure wasn't that the dir already exists or the
         * permission was denied (creation might succeed further down the
         * path) - retry on unspecific FAILURE also
         */
        err = sftp_get_error(sshc->sftp_session);
        if((err != SSH_FX_FILE_ALREADY_EXISTS) &&
           (err != SSH_FX_FAILURE) &&
           (err != SSH_FX_PERMISSION_DENIED)) {
          MOVE_TO_SFTP_CLOSE_STATE();
        }
        rc = 0; /* clear rc and continue */
      }
      state(conn, SSH_SFTP_CREATE_DIRS);
      break;

    case SSH_SFTP_READDIR_INIT:
      Curl_pgrsSetDownloadSize(data, -1);
      if(data->set.opt_no_body) {
        state(conn, SSH_STOP);
        break;
      }

      /*
       * This is a directory that we are trying to get, so produce a directory
       * listing
       */
      sshc->sftp_dir = sftp_opendir(sshc->sftp_session,
                                    protop->path);
      if(!sshc->sftp_dir) {
        failf(data, "Could not open directory for reading: %s",
              ssh_get_error(sshc->ssh_session));
        MOVE_TO_SFTP_CLOSE_STATE();
      }
      state(conn, SSH_SFTP_READDIR);
      break;

    case SSH_SFTP_READDIR:

      if(sshc->readdir_attrs)
        sftp_attributes_free(sshc->readdir_attrs);

      sshc->readdir_attrs = sftp_readdir(sshc->sftp_session, sshc->sftp_dir);
      if(sshc->readdir_attrs) {
        sshc->readdir_filename = sshc->readdir_attrs->name;
        sshc->readdir_longentry = sshc->readdir_attrs->longname;
        sshc->readdir_len = strlen(sshc->readdir_filename);

        if(data->set.ftp_list_only) {
          char *tmpLine;

          tmpLine = aprintf("%s\n", sshc->readdir_filename);
          if(tmpLine == NULL) {
            state(conn, SSH_SFTP_CLOSE);
            sshc->actualcode = CURLE_OUT_OF_MEMORY;
            break;
          }
          result = Curl_client_write(conn, CLIENTWRITE_BODY,
                                     tmpLine, sshc->readdir_len + 1);
          free(tmpLine);

          if(result) {
            state(conn, SSH_STOP);
            break;
          }
          /* since this counts what we send to the client, we include the
             newline in this counter */
          data->req.bytecount += sshc->readdir_len + 1;

          /* output debug output if that is requested */
          if(data->set.verbose) {
            Curl_debug(data, CURLINFO_DATA_OUT,
                       (char *)sshc->readdir_filename,
                       sshc->readdir_len);
          }
        }
        else {
          sshc->readdir_currLen = strlen(sshc->readdir_longentry);
          sshc->readdir_totalLen = 80 + sshc->readdir_currLen;
          sshc->readdir_line = calloc(sshc->readdir_totalLen, 1);
          if(!sshc->readdir_line) {
            state(conn, SSH_SFTP_CLOSE);
            sshc->actualcode = CURLE_OUT_OF_MEMORY;
            break;
          }

          memcpy(sshc->readdir_line, sshc->readdir_longentry,
                 sshc->readdir_currLen);
          if((sshc->readdir_attrs->flags & SSH_FILEXFER_ATTR_PERMISSIONS) &&
             ((sshc->readdir_attrs->permissions & S_IFMT) ==
              S_IFLNK)) {
            sshc->readdir_linkPath = malloc(PATH_MAX + 1);
            if(sshc->readdir_linkPath == NULL) {
              state(conn, SSH_SFTP_CLOSE);
              sshc->actualcode = CURLE_OUT_OF_MEMORY;
              break;
            }

            msnprintf(sshc->readdir_linkPath, PATH_MAX, "%s%s", protop->path,
                      sshc->readdir_filename);

            state(conn, SSH_SFTP_READDIR_LINK);
            break;
          }
          state(conn, SSH_SFTP_READDIR_BOTTOM);
          break;
        }
      }
      else if(sshc->readdir_attrs == NULL && sftp_dir_eof(sshc->sftp_dir)) {
        state(conn, SSH_SFTP_READDIR_DONE);
        break;
      }
      else {
        failf(data, "Could not open remote file for reading: %s",
              ssh_get_error(sshc->ssh_session));
        MOVE_TO_SFTP_CLOSE_STATE();
        break;
      }
      break;

    case SSH_SFTP_READDIR_LINK:
      if(sshc->readdir_link_attrs)
        sftp_attributes_free(sshc->readdir_link_attrs);

      sshc->readdir_link_attrs = sftp_lstat(sshc->sftp_session,
                                            sshc->readdir_linkPath);
      if(sshc->readdir_link_attrs == 0) {
        failf(data, "Could not read symlink for reading: %s",
              ssh_get_error(sshc->ssh_session));
        MOVE_TO_SFTP_CLOSE_STATE();
      }

      if(sshc->readdir_link_attrs->name == NULL) {
        sshc->readdir_tmp = sftp_readlink(sshc->sftp_session,
                                          sshc->readdir_linkPath);
        if(sshc->readdir_filename == NULL)
          sshc->readdir_len = 0;
        else
          sshc->readdir_len = strlen(sshc->readdir_tmp);
        sshc->readdir_longentry = NULL;
        sshc->readdir_filename = sshc->readdir_tmp;
      }
      else {
        sshc->readdir_len = strlen(sshc->readdir_link_attrs->name);
        sshc->readdir_filename = sshc->readdir_link_attrs->name;
        sshc->readdir_longentry = sshc->readdir_link_attrs->longname;
      }

      Curl_safefree(sshc->readdir_linkPath);

      /* get room for the filename and extra output */
      sshc->readdir_totalLen += 4 + sshc->readdir_len;
      new_readdir_line = Curl_saferealloc(sshc->readdir_line,
                                          sshc->readdir_totalLen);
      if(!new_readdir_line) {
        sshc->readdir_line = NULL;
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = CURLE_OUT_OF_MEMORY;
        break;
      }
      sshc->readdir_line = new_readdir_line;

      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
                                         sshc->readdir_currLen,
                                         sshc->readdir_totalLen -
                                         sshc->readdir_currLen,
                                         " -> %s",
                                         sshc->readdir_filename);

      sftp_attributes_free(sshc->readdir_link_attrs);
      sshc->readdir_link_attrs = NULL;
      sshc->readdir_filename = NULL;
      sshc->readdir_longentry = NULL;

      state(conn, SSH_SFTP_READDIR_BOTTOM);
      /* FALLTHROUGH */
    case SSH_SFTP_READDIR_BOTTOM:
      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
                                         sshc->readdir_currLen,
                                         sshc->readdir_totalLen -
                                         sshc->readdir_currLen, "\n");
      result = Curl_client_write(conn, CLIENTWRITE_BODY,
                                 sshc->readdir_line,
                                 sshc->readdir_currLen);

      if(!result) {

        /* output debug output if that is requested */
        if(data->set.verbose) {
          Curl_debug(data, CURLINFO_DATA_OUT, sshc->readdir_line,
                     sshc->readdir_currLen);
        }
        data->req.bytecount += sshc->readdir_currLen;
      }
      Curl_safefree(sshc->readdir_line);
      ssh_string_free_char(sshc->readdir_tmp);
      sshc->readdir_tmp = NULL;

      if(result) {
        state(conn, SSH_STOP);
      }
      else
        state(conn, SSH_SFTP_READDIR);
      break;

    case SSH_SFTP_READDIR_DONE:
      sftp_closedir(sshc->sftp_dir);
      sshc->sftp_dir = NULL;

      /* no data to transfer */
      Curl_setup_transfer(data, -1, -1, FALSE, -1);
      state(conn, SSH_STOP);
      break;

    case SSH_SFTP_DOWNLOAD_INIT:
      /*
       * Work on getting the specified file
       */
      if(sshc->sftp_file)
        sftp_close(sshc->sftp_file);

      sshc->sftp_file = sftp_open(sshc->sftp_session, protop->path,
                                  O_RDONLY, (mode_t)data->set.new_file_perms);
      if(!sshc->sftp_file) {
        failf(data, "Could not open remote file for reading: %s",
              ssh_get_error(sshc->ssh_session));

        MOVE_TO_SFTP_CLOSE_STATE();
      }

      state(conn, SSH_SFTP_DOWNLOAD_STAT);
      break;

    case SSH_SFTP_DOWNLOAD_STAT:
    {
      sftp_attributes attrs;
      curl_off_t size;

      attrs = sftp_fstat(sshc->sftp_file);
      if(!attrs ||
              !(attrs->flags & SSH_FILEXFER_ATTR_SIZE) ||
              (attrs->size == 0)) {
        /*
         * sftp_fstat didn't return an error, so maybe the server
         * just doesn't support stat()
         * OR the server doesn't return a file size with a stat()
         * OR file size is 0
         */
        data->req.size = -1;
        data->req.maxdownload = -1;
        Curl_pgrsSetDownloadSize(data, -1);
        size = 0;
      }
      else {
        size = attrs->size;

        sftp_attributes_free(attrs);

        if(size < 0) {
          failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
          return CURLE_BAD_DOWNLOAD_RESUME;
        }
        if(conn->data->state.use_range) {
          curl_off_t from, to;
          char *ptr;
          char *ptr2;
          CURLofft to_t;
          CURLofft from_t;

          from_t = curlx_strtoofft(conn->data->state.range, &ptr, 0, &from);
          if(from_t == CURL_OFFT_FLOW) {
            return CURLE_RANGE_ERROR;
          }
          while(*ptr && (ISSPACE(*ptr) || (*ptr == '-')))
            ptr++;
          to_t = curlx_strtoofft(ptr, &ptr2, 0, &to);
          if(to_t == CURL_OFFT_FLOW) {
            return CURLE_RANGE_ERROR;
          }
          if((to_t == CURL_OFFT_INVAL) /* no "to" value given */
             || (to >= size)) {
            to = size - 1;
          }
          if(from_t) {
            /* from is relative to end of file */
            from = size - to;
            to = size - 1;
          }
          if(from > size) {
            failf(data, "Offset (%"
                  CURL_FORMAT_CURL_OFF_T ") was beyond file size (%"
                  CURL_FORMAT_CURL_OFF_T ")", from, size);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
          if(from > to) {
            from = to;
            size = 0;
          }
          else {
            size = to - from + 1;
          }

          rc = sftp_seek64(sshc->sftp_file, from);
          if(rc != 0) {
            MOVE_TO_SFTP_CLOSE_STATE();
          }
        }
        data->req.size = size;
        data->req.maxdownload = size;
        Curl_pgrsSetDownloadSize(data, size);
      }

      /* We can resume if we can seek to the resume position */
      if(data->state.resume_from) {
        if(data->state.resume_from < 0) {
          /* We're supposed to download the last abs(from) bytes */
          if((curl_off_t)size < -data->state.resume_from) {
            failf(data, "Offset (%"
                  CURL_FORMAT_CURL_OFF_T ") was beyond file size (%"
                  CURL_FORMAT_CURL_OFF_T ")",
                  data->state.resume_from, size);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
          /* download from where? */
          data->state.resume_from += size;
        }
        else {
          if((curl_off_t)size < data->state.resume_from) {
            failf(data, "Offset (%" CURL_FORMAT_CURL_OFF_T
                  ") was beyond file size (%" CURL_FORMAT_CURL_OFF_T ")",
                  data->state.resume_from, size);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
        }
        /* Does a completed file need to be seeked and started or closed ? */
        /* Now store the number of bytes we are expected to download */
        data->req.size = size - data->state.resume_from;
        data->req.maxdownload = size - data->state.resume_from;
        Curl_pgrsSetDownloadSize(data,
                                 size - data->state.resume_from);

        rc = sftp_seek64(sshc->sftp_file, data->state.resume_from);
        if(rc != 0) {
          MOVE_TO_SFTP_CLOSE_STATE();
        }
      }
    }

    /* Setup the actual download */
    if(data->req.size == 0) {
      /* no data to transfer */
      Curl_setup_transfer(data, -1, -1, FALSE, -1);
      infof(data, "File already completely downloaded\n");
      state(conn, SSH_STOP);
      break;
    }
    Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);

    /* not set by Curl_setup_transfer to preserve keepon bits */
    conn->writesockfd = conn->sockfd;

    /* we want to use the _receiving_ function even when the socket turns
       out writableable as the underlying libssh recv function will deal
       with both accordingly */
    conn->cselect_bits = CURL_CSELECT_IN;

    if(result) {
      /* this should never occur; the close state should be entered
         at the time the error occurs */
      state(conn, SSH_SFTP_CLOSE);
      sshc->actualcode = result;
    }
    else {
      sshc->sftp_recv_state = 0;
      state(conn, SSH_STOP);
    }
    break;

    case SSH_SFTP_CLOSE:
      if(sshc->sftp_file) {
        sftp_close(sshc->sftp_file);
        sshc->sftp_file = NULL;
      }
      Curl_safefree(protop->path);

      DEBUGF(infof(data, "SFTP DONE done\n"));

      /* Check if nextstate is set and move .nextstate could be POSTQUOTE_INIT
         After nextstate is executed, the control should come back to
         SSH_SFTP_CLOSE to pass the correct result back  */
      if(sshc->nextstate != SSH_NO_STATE &&
         sshc->nextstate != SSH_SFTP_CLOSE) {
        state(conn, sshc->nextstate);
        sshc->nextstate = SSH_SFTP_CLOSE;
      }
      else {
        state(conn, SSH_STOP);
        result = sshc->actualcode;
      }
      break;

    case SSH_SFTP_SHUTDOWN:
      /* during times we get here due to a broken transfer and then the
         sftp_handle might not have been taken down so make sure that is done
         before we proceed */

      if(sshc->sftp_file) {
        sftp_close(sshc->sftp_file);
        sshc->sftp_file = NULL;
      }

      if(sshc->sftp_session) {
        sftp_free(sshc->sftp_session);
        sshc->sftp_session = NULL;
      }

      SSH_STRING_FREE_CHAR(sshc->homedir);
      conn->data->state.most_recent_ftp_entrypath = NULL;

      state(conn, SSH_SESSION_DISCONNECT);
      break;


    case SSH_SCP_TRANS_INIT:
      result = Curl_getworkingpath(conn, sshc->homedir, &protop->path);
      if(result) {
        sshc->actualcode = result;
        state(conn, SSH_STOP);
        break;
      }

      /* Functions from the SCP subsystem cannot handle/return SSH_AGAIN */
      ssh_set_blocking(sshc->ssh_session, 1);

      if(data->set.upload) {
        if(data->state.infilesize < 0) {
          failf(data, "SCP requires a known file size for upload");
          sshc->actualcode = CURLE_UPLOAD_FAILED;
          MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
        }

        sshc->scp_session =
          ssh_scp_new(sshc->ssh_session, SSH_SCP_WRITE, protop->path);
        state(conn, SSH_SCP_UPLOAD_INIT);
      }
      else {
        sshc->scp_session =
          ssh_scp_new(sshc->ssh_session, SSH_SCP_READ, protop->path);
        state(conn, SSH_SCP_DOWNLOAD_INIT);
      }

      if(!sshc->scp_session) {
        err_msg = ssh_get_error(sshc->ssh_session);
        failf(conn->data, "%s", err_msg);
        MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
      }

      break;

    case SSH_SCP_UPLOAD_INIT:

      rc = ssh_scp_init(sshc->scp_session);
      if(rc != SSH_OK) {
        err_msg = ssh_get_error(sshc->ssh_session);
        failf(conn->data, "%s", err_msg);
        MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
      }

      rc = ssh_scp_push_file(sshc->scp_session, protop->path,
                             data->state.infilesize,
                             (int)data->set.new_file_perms);
      if(rc != SSH_OK) {
        err_msg = ssh_get_error(sshc->ssh_session);
        failf(conn->data, "%s", err_msg);
        MOVE_TO_ERROR_STATE(CURLE_UPLOAD_FAILED);
      }

      /* upload data */
      Curl_setup_transfer(data, -1, data->req.size, FALSE, FIRSTSOCKET);

      /* not set by Curl_setup_transfer to preserve keepon bits */
      conn->sockfd = conn->writesockfd;

      /* store this original bitmask setup to use later on if we can't
         figure out a "real" bitmask */
      sshc->orig_waitfor = data->req.keepon;

      /* we want to use the _sending_ function even when the socket turns
         out readable as the underlying libssh scp send function will deal
         with both accordingly */
      conn->cselect_bits = CURL_CSELECT_OUT;

      state(conn, SSH_STOP);

      break;

    case SSH_SCP_DOWNLOAD_INIT:

      rc = ssh_scp_init(sshc->scp_session);
      if(rc != SSH_OK) {
        err_msg = ssh_get_error(sshc->ssh_session);
        failf(conn->data, "%s", err_msg);
        MOVE_TO_ERROR_STATE(CURLE_COULDNT_CONNECT);
      }
      state(conn, SSH_SCP_DOWNLOAD);
      /* FALLTHROUGH */

    case SSH_SCP_DOWNLOAD:{
        curl_off_t bytecount;

        rc = ssh_scp_pull_request(sshc->scp_session);
        if(rc != SSH_SCP_REQUEST_NEWFILE) {
          err_msg = ssh_get_error(sshc->ssh_session);
          failf(conn->data, "%s", err_msg);
          MOVE_TO_ERROR_STATE(CURLE_REMOTE_FILE_NOT_FOUND);
          break;
        }

        /* download data */
        bytecount = ssh_scp_request_get_size(sshc->scp_session);
        data->req.maxdownload = (curl_off_t) bytecount;
        Curl_setup_transfer(data, FIRSTSOCKET, bytecount, FALSE, -1);

        /* not set by Curl_setup_transfer to preserve keepon bits */
        conn->writesockfd = conn->sockfd;

        /* we want to use the _receiving_ function even when the socket turns
           out writableable as the underlying libssh recv function will deal
           with both accordingly */
        conn->cselect_bits = CURL_CSELECT_IN;

        state(conn, SSH_STOP);
        break;
      }
    case SSH_SCP_DONE:
      if(data->set.upload)
        state(conn, SSH_SCP_SEND_EOF);
      else
        state(conn, SSH_SCP_CHANNEL_FREE);
      break;

    case SSH_SCP_SEND_EOF:
      if(sshc->scp_session) {
        rc = ssh_scp_close(sshc->scp_session);
        if(rc == SSH_AGAIN) {
          /* Currently the ssh_scp_close handles waiting for EOF in
           * blocking way.
           */
          break;
        }
        if(rc != SSH_OK) {
          infof(data, "Failed to close libssh scp channel: %s\n",
                ssh_get_error(sshc->ssh_session));
        }
      }

      state(conn, SSH_SCP_CHANNEL_FREE);
      break;

    case SSH_SCP_CHANNEL_FREE:
      if(sshc->scp_session) {
        ssh_scp_free(sshc->scp_session);
        sshc->scp_session = NULL;
      }
      DEBUGF(infof(data, "SCP DONE phase complete\n"));

      ssh_set_blocking(sshc->ssh_session, 0);

      state(conn, SSH_SESSION_DISCONNECT);
      /* FALLTHROUGH */

    case SSH_SESSION_DISCONNECT:
      /* during weird times when we've been prematurely aborted, the channel
         is still alive when we reach this state and we MUST kill the channel
         properly first */
      if(sshc->scp_session) {
        ssh_scp_free(sshc->scp_session);
        sshc->scp_session = NULL;
      }

      ssh_disconnect(sshc->ssh_session);

      SSH_STRING_FREE_CHAR(sshc->homedir);
      conn->data->state.most_recent_ftp_entrypath = NULL;

      state(conn, SSH_SESSION_FREE);
      /* FALLTHROUGH */
    case SSH_SESSION_FREE:
      if(sshc->ssh_session) {
        ssh_free(sshc->ssh_session);
        sshc->ssh_session = NULL;
      }

      /* worst-case scenario cleanup */

      DEBUGASSERT(sshc->ssh_session == NULL);
      DEBUGASSERT(sshc->scp_session == NULL);

      if(sshc->readdir_tmp) {
        ssh_string_free_char(sshc->readdir_tmp);
        sshc->readdir_tmp = NULL;
      }

      if(sshc->quote_attrs)
        sftp_attributes_free(sshc->quote_attrs);

      if(sshc->readdir_attrs)
        sftp_attributes_free(sshc->readdir_attrs);

      if(sshc->readdir_link_attrs)
        sftp_attributes_free(sshc->readdir_link_attrs);

      if(sshc->privkey)
        ssh_key_free(sshc->privkey);
      if(sshc->pubkey)
        ssh_key_free(sshc->pubkey);

      Curl_safefree(sshc->rsa_pub);
      Curl_safefree(sshc->rsa);
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);
      Curl_safefree(sshc->readdir_line);
      Curl_safefree(sshc->readdir_linkPath);
      SSH_STRING_FREE_CHAR(sshc->homedir);

      /* the code we are about to return */
      result = sshc->actualcode;

      memset(sshc, 0, sizeof(struct ssh_conn));

      connclose(conn, "SSH session free");
      sshc->state = SSH_SESSION_FREE;   /* current */
      sshc->nextstate = SSH_NO_STATE;
      state(conn, SSH_STOP);
      break;

    case SSH_QUIT:
      /* fallthrough, just stop! */
    default:
      /* internal error */
      sshc->nextstate = SSH_NO_STATE;
      state(conn, SSH_STOP);
      break;

    }
  } while(!rc && (sshc->state != SSH_STOP));


  if(rc == SSH_AGAIN) {
    /* we would block, we need to wait for the socket to be ready (in the
       right direction too)! */
    *block = TRUE;
  }

  return result;
}


/* called by the multi interface to figure out what socket(s) to wait for and
   for what actions in the DO_DONE, PERFORM and WAITPERFORM states */
static int myssh_perform_getsock(const struct connectdata *conn,
                                 curl_socket_t *sock)
{
  int bitmap = GETSOCK_BLANK;
  sock[0] = conn->sock[FIRSTSOCKET];

  if(conn->waitfor & KEEP_RECV)
    bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);

  if(conn->waitfor & KEEP_SEND)
    bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);

  return bitmap;
}

/* Generic function called by the multi interface to figure out what socket(s)
   to wait for and for what actions during the DOING and PROTOCONNECT states*/
static int myssh_getsock(struct connectdata *conn,
                         curl_socket_t *sock)
{
  /* if we know the direction we can use the generic *_getsock() function even
     for the protocol_connect and doing states */
  return myssh_perform_getsock(conn, sock);
}

static void myssh_block2waitfor(struct connectdata *conn, bool block)
{
  struct ssh_conn *sshc = &conn->proto.sshc;

  /* If it didn't block, or nothing was returned by ssh_get_poll_flags
   * have the original set */
  conn->waitfor = sshc->orig_waitfor;

  if(block) {
    int dir = ssh_get_poll_flags(sshc->ssh_session);
    if(dir & SSH_READ_PENDING) {
      /* translate the libssh define bits into our own bit defines */
      conn->waitfor = KEEP_RECV;
    }
    else if(dir & SSH_WRITE_PENDING) {
      conn->waitfor = KEEP_SEND;
    }
  }
}

/* called repeatedly until done from multi.c */
static CURLcode myssh_multi_statemach(struct connectdata *conn,
                                      bool *done)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  bool block;    /* we store the status and use that to provide a ssh_getsock()
                    implementation */
  CURLcode result = myssh_statemach_act(conn, &block);

  *done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
  myssh_block2waitfor(conn, block);

  return result;
}

static CURLcode myssh_block_statemach(struct connectdata *conn,
                                      bool disconnect)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  CURLcode result = CURLE_OK;
  struct Curl_easy *data = conn->data;

  while((sshc->state != SSH_STOP) && !result) {
    bool block;
    timediff_t left = 1000;
    struct curltime now = Curl_now();

    result = myssh_statemach_act(conn, &block);
    if(result)
      break;

    if(!disconnect) {
      if(Curl_pgrsUpdate(conn))
        return CURLE_ABORTED_BY_CALLBACK;

      result = Curl_speedcheck(data, now);
      if(result)
        break;

      left = Curl_timeleft(data, NULL, FALSE);
      if(left < 0) {
        failf(data, "Operation timed out");
        return CURLE_OPERATION_TIMEDOUT;
      }
    }

    if(!result && block) {
      curl_socket_t fd_read = conn->sock[FIRSTSOCKET];
      /* wait for the socket to become ready */
      (void) Curl_socket_check(fd_read, CURL_SOCKET_BAD,
                               CURL_SOCKET_BAD, left > 1000 ? 1000 : left);
    }

  }

  return result;
}

/*
 * SSH setup connection
 */
static CURLcode myssh_setup_connection(struct connectdata *conn)
{
  struct SSHPROTO *ssh;

  conn->data->req.protop = ssh = calloc(1, sizeof(struct SSHPROTO));
  if(!ssh)
    return CURLE_OUT_OF_MEMORY;

  return CURLE_OK;
}

static Curl_recv scp_recv, sftp_recv;
static Curl_send scp_send, sftp_send;

/*
 * Curl_ssh_connect() gets called from Curl_protocol_connect() to allow us to
 * do protocol-specific actions at connect-time.
 */
static CURLcode myssh_connect(struct connectdata *conn, bool *done)
{
  struct ssh_conn *ssh;
  CURLcode result;
  curl_socket_t sock = conn->sock[FIRSTSOCKET];
  struct Curl_easy *data = conn->data;

  /* initialize per-handle data if not already */
  if(!data->req.protop)
    myssh_setup_connection(conn);

  /* We default to persistent connections. We set this already in this connect
     function to make the re-use checks properly be able to check this bit. */
  connkeep(conn, "SSH default");

  if(conn->handler->protocol & CURLPROTO_SCP) {
    conn->recv[FIRSTSOCKET] = scp_recv;
    conn->send[FIRSTSOCKET] = scp_send;
  }
  else {
    conn->recv[FIRSTSOCKET] = sftp_recv;
    conn->send[FIRSTSOCKET] = sftp_send;
  }

  ssh = &conn->proto.sshc;

  ssh->ssh_session = ssh_new();
  if(ssh->ssh_session == NULL) {
    failf(data, "Failure initialising ssh session");
    return CURLE_FAILED_INIT;
  }

  ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock);

  if(conn->user) {
    infof(data, "User: %s\n", conn->user);
    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user);
  }

  if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
    infof(data, "Known hosts: %s\n", data->set.str[STRING_SSH_KNOWNHOSTS]);
    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_KNOWNHOSTS,
                    data->set.str[STRING_SSH_KNOWNHOSTS]);
  }

  ssh_options_set(ssh->ssh_session, SSH_OPTIONS_HOST, conn->host.name);
  if(conn->remote_port)
    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_PORT,
                    &conn->remote_port);

  if(data->set.ssh_compression) {
    ssh_options_set(ssh->ssh_session, SSH_OPTIONS_COMPRESSION,
                    "zlib,zlib@openssh.com,none");
  }

  ssh->privkey = NULL;
  ssh->pubkey = NULL;

  if(data->set.str[STRING_SSH_PUBLIC_KEY]) {
    int rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
                                        &ssh->pubkey);
    if(rc != SSH_OK) {
      failf(data, "Could not load public key file");
      /* ignore */
    }
  }

  /* we do not verify here, we do it at the state machine,
   * after connection */

  state(conn, SSH_INIT);

  result = myssh_multi_statemach(conn, done);

  return result;
}

/* called from multi.c while DOing */
static CURLcode scp_doing(struct connectdata *conn, bool *dophase_done)
{
  CURLcode result;

  result = myssh_multi_statemach(conn, dophase_done);

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }
  return result;
}

/*
 ***********************************************************************
 *
 * scp_perform()
 *
 * This is the actual DO function for SCP. Get a file according to
 * the options previously setup.
 */

static
CURLcode scp_perform(struct connectdata *conn,
                     bool *connected, bool *dophase_done)
{
  CURLcode result = CURLE_OK;

  DEBUGF(infof(conn->data, "DO phase starts\n"));

  *dophase_done = FALSE;        /* not done yet */

  /* start the first command in the DO phase */
  state(conn, SSH_SCP_TRANS_INIT);

  result = myssh_multi_statemach(conn, dophase_done);

  *connected = conn->bits.tcpconnect[FIRSTSOCKET];

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }

  return result;
}

static CURLcode myssh_do_it(struct connectdata *conn, bool *done)
{
  CURLcode result;
  bool connected = 0;
  struct Curl_easy *data = conn->data;
  struct ssh_conn *sshc = &conn->proto.sshc;

  *done = FALSE;                /* default to false */

  data->req.size = -1;          /* make sure this is unknown at this point */

  sshc->actualcode = CURLE_OK;  /* reset error code */
  sshc->secondCreateDirs = 0;   /* reset the create dir attempt state
                                   variable */

  Curl_pgrsSetUploadCounter(data, 0);
  Curl_pgrsSetDownloadCounter(data, 0);
  Curl_pgrsSetUploadSize(data, -1);
  Curl_pgrsSetDownloadSize(data, -1);

  if(conn->handler->protocol & CURLPROTO_SCP)
    result = scp_perform(conn, &connected, done);
  else
    result = sftp_perform(conn, &connected, done);

  return result;
}

/* BLOCKING, but the function is using the state machine so the only reason
   this is still blocking is that the multi interface code has no support for
   disconnecting operations that takes a while */
static CURLcode scp_disconnect(struct connectdata *conn,
                               bool dead_connection)
{
  CURLcode result = CURLE_OK;
  struct ssh_conn *ssh = &conn->proto.sshc;
  (void) dead_connection;

  if(ssh->ssh_session) {
    /* only if there's a session still around to use! */

    state(conn, SSH_SESSION_DISCONNECT);

    result = myssh_block_statemach(conn, TRUE);
  }

  return result;
}

/* generic done function for both SCP and SFTP called from their specific
   done functions */
static CURLcode myssh_done(struct connectdata *conn, CURLcode status)
{
  CURLcode result = CURLE_OK;
  struct SSHPROTO *protop = conn->data->req.protop;

  if(!status) {
    /* run the state-machine */
    result = myssh_block_statemach(conn, FALSE);
  }
  else
    result = status;

  if(protop)
    Curl_safefree(protop->path);
  if(Curl_pgrsDone(conn))
    return CURLE_ABORTED_BY_CALLBACK;

  conn->data->req.keepon = 0;   /* clear all bits */
  return result;
}


static CURLcode scp_done(struct connectdata *conn, CURLcode status,
                         bool premature)
{
  (void) premature;             /* not used */

  if(!status)
    state(conn, SSH_SCP_DONE);

  return myssh_done(conn, status);

}

static ssize_t scp_send(struct connectdata *conn, int sockindex,
                        const void *mem, size_t len, CURLcode *err)
{
  int rc;
  (void) sockindex; /* we only support SCP on the fixed known primary socket */
  (void) err;

  rc = ssh_scp_write(conn->proto.sshc.scp_session, mem, len);

#if 0
  /* The following code is misleading, mostly added as wishful thinking
   * that libssh at some point will implement non-blocking ssh_scp_write/read.
   * Currently rc can only be number of bytes read or SSH_ERROR. */
  myssh_block2waitfor(conn, (rc == SSH_AGAIN) ? TRUE : FALSE);

  if(rc == SSH_AGAIN) {
    *err = CURLE_AGAIN;
    return 0;
  }
  else
#endif
  if(rc != SSH_OK) {
    *err = CURLE_SSH;
    return -1;
  }

  return len;
}

static ssize_t scp_recv(struct connectdata *conn, int sockindex,
                        char *mem, size_t len, CURLcode *err)
{
  ssize_t nread;
  (void) err;
  (void) sockindex; /* we only support SCP on the fixed known primary socket */

  /* libssh returns int */
  nread = ssh_scp_read(conn->proto.sshc.scp_session, mem, len);

#if 0
  /* The following code is misleading, mostly added as wishful thinking
   * that libssh at some point will implement non-blocking ssh_scp_write/read.
   * Currently rc can only be SSH_OK or SSH_ERROR. */

  myssh_block2waitfor(conn, (nread == SSH_AGAIN) ? TRUE : FALSE);
  if(nread == SSH_AGAIN) {
    *err = CURLE_AGAIN;
    nread = -1;
  }
#endif

  return nread;
}

/*
 * =============== SFTP ===============
 */

/*
 ***********************************************************************
 *
 * sftp_perform()
 *
 * This is the actual DO function for SFTP. Get a file/directory according to
 * the options previously setup.
 */

static
CURLcode sftp_perform(struct connectdata *conn,
                      bool *connected,
                      bool *dophase_done)
{
  CURLcode result = CURLE_OK;

  DEBUGF(infof(conn->data, "DO phase starts\n"));

  *dophase_done = FALSE; /* not done yet */

  /* start the first command in the DO phase */
  state(conn, SSH_SFTP_QUOTE_INIT);

  /* run the state-machine */
  result = myssh_multi_statemach(conn, dophase_done);

  *connected = conn->bits.tcpconnect[FIRSTSOCKET];

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }

  return result;
}

/* called from multi.c while DOing */
static CURLcode sftp_doing(struct connectdata *conn,
                           bool *dophase_done)
{
  CURLcode result = myssh_multi_statemach(conn, dophase_done);
  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }
  return result;
}

/* BLOCKING, but the function is using the state machine so the only reason
   this is still blocking is that the multi interface code has no support for
   disconnecting operations that takes a while */
static CURLcode sftp_disconnect(struct connectdata *conn, bool dead_connection)
{
  CURLcode result = CURLE_OK;
  (void) dead_connection;

  DEBUGF(infof(conn->data, "SSH DISCONNECT starts now\n"));

  if(conn->proto.sshc.ssh_session) {
    /* only if there's a session still around to use! */
    state(conn, SSH_SFTP_SHUTDOWN);
    result = myssh_block_statemach(conn, TRUE);
  }

  DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));

  return result;

}

static CURLcode sftp_done(struct connectdata *conn, CURLcode status,
                               bool premature)
{
  struct ssh_conn *sshc = &conn->proto.sshc;

  if(!status) {
    /* Post quote commands are executed after the SFTP_CLOSE state to avoid
       errors that could happen due to open file handles during POSTQUOTE
       operation */
    if(!premature && conn->data->set.postquote && !conn->bits.retry)
      sshc->nextstate = SSH_SFTP_POSTQUOTE_INIT;
    state(conn, SSH_SFTP_CLOSE);
  }
  return myssh_done(conn, status);
}

/* return number of sent bytes */
static ssize_t sftp_send(struct connectdata *conn, int sockindex,
                         const void *mem, size_t len, CURLcode *err)
{
  ssize_t nwrite;
  (void)sockindex;

  nwrite = sftp_write(conn->proto.sshc.sftp_file, mem, len);

  myssh_block2waitfor(conn, FALSE);

#if 0 /* not returned by libssh on write */
  if(nwrite == SSH_AGAIN) {
    *err = CURLE_AGAIN;
    nwrite = 0;
  }
  else
#endif
  if(nwrite < 0) {
    *err = CURLE_SSH;
    nwrite = -1;
  }

  return nwrite;
}

/*
 * Return number of received (decrypted) bytes
 * or <0 on error
 */
static ssize_t sftp_recv(struct connectdata *conn, int sockindex,
                         char *mem, size_t len, CURLcode *err)
{
  ssize_t nread;
  (void)sockindex;

  DEBUGASSERT(len < CURL_MAX_READ_SIZE);

  switch(conn->proto.sshc.sftp_recv_state) {
    case 0:
      conn->proto.sshc.sftp_file_index =
            sftp_async_read_begin(conn->proto.sshc.sftp_file,
                                  (uint32_t)len);
      if(conn->proto.sshc.sftp_file_index < 0) {
        *err = CURLE_RECV_ERROR;
        return -1;
      }

      /* FALLTHROUGH */
    case 1:
      conn->proto.sshc.sftp_recv_state = 1;

      nread = sftp_async_read(conn->proto.sshc.sftp_file,
                              mem, (uint32_t)len,
                              conn->proto.sshc.sftp_file_index);

      myssh_block2waitfor(conn, (nread == SSH_AGAIN)?TRUE:FALSE);

      if(nread == SSH_AGAIN) {
        *err = CURLE_AGAIN;
        return -1;
      }
      else if(nread < 0) {
        *err = CURLE_RECV_ERROR;
        return -1;
      }

      conn->proto.sshc.sftp_recv_state = 0;
      return nread;

    default:
      /* we never reach here */
      return -1;
  }
}

static void sftp_quote(struct connectdata *conn)
{
  const char *cp;
  struct Curl_easy *data = conn->data;
  struct SSHPROTO *protop = data->req.protop;
  struct ssh_conn *sshc = &conn->proto.sshc;
  CURLcode result;

  /*
   * Support some of the "FTP" commands
   */
  char *cmd = sshc->quote_item->data;
  sshc->acceptfail = FALSE;

  /* if a command starts with an asterisk, which a legal SFTP command never
     can, the command will be allowed to fail without it causing any
     aborts or cancels etc. It will cause libcurl to act as if the command
     is successful, whatever the server reponds. */

  if(cmd[0] == '*') {
    cmd++;
    sshc->acceptfail = TRUE;
  }

  if(strcasecompare("pwd", cmd)) {
    /* output debug output if that is requested */
    char *tmp = aprintf("257 \"%s\" is current directory.\n",
                        protop->path);
    if(!tmp) {
      sshc->actualcode = CURLE_OUT_OF_MEMORY;
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      return;
    }
    if(data->set.verbose) {
      Curl_debug(data, CURLINFO_HEADER_OUT, (char *) "PWD\n", 4);
      Curl_debug(data, CURLINFO_HEADER_IN, tmp, strlen(tmp));
    }
    /* this sends an FTP-like "header" to the header callback so that the
       current directory can be read very similar to how it is read when
       using ordinary FTP. */
    result = Curl_client_write(conn, CLIENTWRITE_HEADER, tmp, strlen(tmp));
    free(tmp);
    if(result) {
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = result;
    }
    else
      state(conn, SSH_SFTP_NEXT_QUOTE);
    return;
  }

  /*
   * the arguments following the command must be separated from the
   * command with a space so we can check for it unconditionally
   */
  cp = strchr(cmd, ' ');
  if(cp == NULL) {
    failf(data, "Syntax error in SFTP command. Supply parameter(s)!");
    state(conn, SSH_SFTP_CLOSE);
    sshc->nextstate = SSH_NO_STATE;
    sshc->actualcode = CURLE_QUOTE_ERROR;
    return;
  }

  /*
   * also, every command takes at least one argument so we get that
   * first argument right now
   */
  result = Curl_get_pathname(&cp, &sshc->quote_path1, sshc->homedir);
  if(result) {
    if(result == CURLE_OUT_OF_MEMORY)
      failf(data, "Out of memory");
    else
      failf(data, "Syntax error: Bad first parameter");
    state(conn, SSH_SFTP_CLOSE);
    sshc->nextstate = SSH_NO_STATE;
    sshc->actualcode = result;
    return;
  }

  /*
   * SFTP is a binary protocol, so we don't send text commands
   * to the server. Instead, we scan for commands used by
   * OpenSSH's sftp program and call the appropriate libssh
   * functions.
   */
  if(strncasecompare(cmd, "chgrp ", 6) ||
     strncasecompare(cmd, "chmod ", 6) ||
     strncasecompare(cmd, "chown ", 6)) {
    /* attribute change */

    /* sshc->quote_path1 contains the mode to set */
    /* get the destination */
    result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
    if(result) {
      if(result == CURLE_OUT_OF_MEMORY)
        failf(data, "Out of memory");
      else
        failf(data, "Syntax error in chgrp/chmod/chown: "
              "Bad second parameter");
      Curl_safefree(sshc->quote_path1);
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = result;
      return;
    }
    sshc->quote_attrs = NULL;
    state(conn, SSH_SFTP_QUOTE_STAT);
    return;
  }
  if(strncasecompare(cmd, "ln ", 3) ||
     strncasecompare(cmd, "symlink ", 8)) {
    /* symbolic linking */
    /* sshc->quote_path1 is the source */
    /* get the destination */
    result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
    if(result) {
      if(result == CURLE_OUT_OF_MEMORY)
        failf(data, "Out of memory");
      else
        failf(data, "Syntax error in ln/symlink: Bad second parameter");
      Curl_safefree(sshc->quote_path1);
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = result;
      return;
    }
    state(conn, SSH_SFTP_QUOTE_SYMLINK);
    return;
  }
  else if(strncasecompare(cmd, "mkdir ", 6)) {
    /* create dir */
    state(conn, SSH_SFTP_QUOTE_MKDIR);
    return;
  }
  else if(strncasecompare(cmd, "rename ", 7)) {
    /* rename file */
    /* first param is the source path */
    /* second param is the dest. path */
    result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
    if(result) {
      if(result == CURLE_OUT_OF_MEMORY)
        failf(data, "Out of memory");
      else
        failf(data, "Syntax error in rename: Bad second parameter");
      Curl_safefree(sshc->quote_path1);
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = result;
      return;
    }
    state(conn, SSH_SFTP_QUOTE_RENAME);
    return;
  }
  else if(strncasecompare(cmd, "rmdir ", 6)) {
    /* delete dir */
    state(conn, SSH_SFTP_QUOTE_RMDIR);
    return;
  }
  else if(strncasecompare(cmd, "rm ", 3)) {
    state(conn, SSH_SFTP_QUOTE_UNLINK);
    return;
  }
#ifdef HAS_STATVFS_SUPPORT
  else if(strncasecompare(cmd, "statvfs ", 8)) {
    state(conn, SSH_SFTP_QUOTE_STATVFS);
    return;
  }
#endif

  failf(data, "Unknown SFTP command");
  Curl_safefree(sshc->quote_path1);
  Curl_safefree(sshc->quote_path2);
  state(conn, SSH_SFTP_CLOSE);
  sshc->nextstate = SSH_NO_STATE;
  sshc->actualcode = CURLE_QUOTE_ERROR;
}

static void sftp_quote_stat(struct connectdata *conn)
{
  struct Curl_easy *data = conn->data;
  struct ssh_conn *sshc = &conn->proto.sshc;
  char *cmd = sshc->quote_item->data;
  sshc->acceptfail = FALSE;

  /* if a command starts with an asterisk, which a legal SFTP command never
     can, the command will be allowed to fail without it causing any
     aborts or cancels etc. It will cause libcurl to act as if the command
     is successful, whatever the server reponds. */

  if(cmd[0] == '*') {
    cmd++;
    sshc->acceptfail = TRUE;
  }

  /* We read the file attributes, store them in sshc->quote_attrs
   * and modify them accordingly to command. Then we switch to
   * QUOTE_SETSTAT state to write new ones.
   */

  if(sshc->quote_attrs)
    sftp_attributes_free(sshc->quote_attrs);
  sshc->quote_attrs = sftp_stat(sshc->sftp_session, sshc->quote_path2);
  if(sshc->quote_attrs == NULL) {
    Curl_safefree(sshc->quote_path1);
    Curl_safefree(sshc->quote_path2);
    failf(data, "Attempt to get SFTP stats failed: %d",
          sftp_get_error(sshc->sftp_session));
    state(conn, SSH_SFTP_CLOSE);
    sshc->nextstate = SSH_NO_STATE;
    sshc->actualcode = CURLE_QUOTE_ERROR;
    return;
  }

  /* Now set the new attributes... */
  if(strncasecompare(cmd, "chgrp", 5)) {
    sshc->quote_attrs->gid = (uint32_t)strtoul(sshc->quote_path1, NULL, 10);
    if(sshc->quote_attrs->gid == 0 && !ISDIGIT(sshc->quote_path1[0]) &&
        !sshc->acceptfail) {
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);
      failf(data, "Syntax error: chgrp gid not a number");
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = CURLE_QUOTE_ERROR;
      return;
    }
    sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_UIDGID;
  }
  else if(strncasecompare(cmd, "chmod", 5)) {
    mode_t perms;
    perms = (mode_t)strtoul(sshc->quote_path1, NULL, 8);
    /* permissions are octal */
    if(perms == 0 && !ISDIGIT(sshc->quote_path1[0])) {
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);
      failf(data, "Syntax error: chmod permissions not a number");
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = CURLE_QUOTE_ERROR;
      return;
    }
    sshc->quote_attrs->permissions = perms;
    sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_PERMISSIONS;
  }
  else if(strncasecompare(cmd, "chown", 5)) {
    sshc->quote_attrs->uid = (uint32_t)strtoul(sshc->quote_path1, NULL, 10);
    if(sshc->quote_attrs->uid == 0 && !ISDIGIT(sshc->quote_path1[0]) &&
        !sshc->acceptfail) {
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);
      failf(data, "Syntax error: chown uid not a number");
      state(conn, SSH_SFTP_CLOSE);
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = CURLE_QUOTE_ERROR;
      return;
    }
    sshc->quote_attrs->flags |= SSH_FILEXFER_ATTR_UIDGID;
  }

  /* Now send the completed structure... */
  state(conn, SSH_SFTP_QUOTE_SETSTAT);
  return;
}

CURLcode Curl_ssh_init(void)
{
  if(ssh_init()) {
    DEBUGF(fprintf(stderr, "Error: libssh_init failed\n"));
    return CURLE_FAILED_INIT;
  }
  return CURLE_OK;
}

void Curl_ssh_cleanup(void)
{
  (void)ssh_finalize();
}

size_t Curl_ssh_version(char *buffer, size_t buflen)
{
  return msnprintf(buffer, buflen, "libssh/%s", CURL_LIBSSH_VERSION);
}

#endif                          /* USE_LIBSSH */
Added jni/curl/lib/vssh/libssh2.c.




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

/* #define CURL_LIBSSH2_DEBUG */

#include "curl_setup.h"

#ifdef USE_LIBSSH2

#include <limits.h>

#include <libssh2.h>
#include <libssh2_sftp.h>

#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif

#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif
#ifdef HAVE_UTSNAME_H
#include <sys/utsname.h>
#endif
#ifdef HAVE_NETDB_H
#include <netdb.h>
#endif
#ifdef __VMS
#include <in.h>
#include <inet.h>
#endif

#if (defined(NETWARE) && defined(__NOVELL_LIBC__))
#undef in_addr_t
#define in_addr_t unsigned long
#endif

#include <curl/curl.h>
#include "urldata.h"
#include "sendf.h"
#include "hostip.h"
#include "progress.h"
#include "transfer.h"
#include "escape.h"
#include "http.h" /* for HTTP proxy tunnel stuff */
#include "ssh.h"
#include "url.h"
#include "speedcheck.h"
#include "getinfo.h"
#include "strdup.h"
#include "strcase.h"
#include "vtls/vtls.h"
#include "connect.h"
#include "strerror.h"
#include "inet_ntop.h"
#include "parsedate.h" /* for the week day and month names */
#include "sockaddr.h" /* required for Curl_sockaddr_storage */
#include "strtoofft.h"
#include "multiif.h"
#include "select.h"
#include "warnless.h"
#include "curl_path.h"

/* The last 3 #include files should be in this order */
#include "curl_printf.h"
#include "curl_memory.h"
#include "memdebug.h"

#if LIBSSH2_VERSION_NUM >= 0x010206
/* libssh2_sftp_statvfs and friends were added in 1.2.6 */
#define HAS_STATVFS_SUPPORT 1
#endif

#define sftp_libssh2_last_error(s) curlx_ultosi(libssh2_sftp_last_error(s))

#define sftp_libssh2_realpath(s,p,t,m) \
        libssh2_sftp_symlink_ex((s), (p), curlx_uztoui(strlen(p)), \
                                (t), (m), LIBSSH2_SFTP_REALPATH)


/* Local functions: */
static const char *sftp_libssh2_strerror(int err);
static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc);
static LIBSSH2_REALLOC_FUNC(my_libssh2_realloc);
static LIBSSH2_FREE_FUNC(my_libssh2_free);

static CURLcode ssh_connect(struct connectdata *conn, bool *done);
static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done);
static CURLcode ssh_do(struct connectdata *conn, bool *done);

static CURLcode scp_done(struct connectdata *conn,
                         CURLcode, bool premature);
static CURLcode scp_doing(struct connectdata *conn,
                          bool *dophase_done);
static CURLcode scp_disconnect(struct connectdata *conn, bool dead_connection);

static CURLcode sftp_done(struct connectdata *conn,
                          CURLcode, bool premature);
static CURLcode sftp_doing(struct connectdata *conn,
                           bool *dophase_done);
static CURLcode sftp_disconnect(struct connectdata *conn, bool dead);
static
CURLcode sftp_perform(struct connectdata *conn,
                      bool *connected,
                      bool *dophase_done);
static int ssh_getsock(struct connectdata *conn, curl_socket_t *sock);
static int ssh_perform_getsock(const struct connectdata *conn,
                               curl_socket_t *sock);
static CURLcode ssh_setup_connection(struct connectdata *conn);

/*
 * SCP protocol handler.
 */

const struct Curl_handler Curl_handler_scp = {
  "SCP",                                /* scheme */
  ssh_setup_connection,                 /* setup_connection */
  ssh_do,                               /* do_it */
  scp_done,                             /* done */
  ZERO_NULL,                            /* do_more */
  ssh_connect,                          /* connect_it */
  ssh_multi_statemach,                  /* connecting */
  scp_doing,                            /* doing */
  ssh_getsock,                          /* proto_getsock */
  ssh_getsock,                          /* doing_getsock */
  ZERO_NULL,                            /* domore_getsock */
  ssh_perform_getsock,                  /* perform_getsock */
  scp_disconnect,                       /* disconnect */
  ZERO_NULL,                            /* readwrite */
  ZERO_NULL,                            /* connection_check */
  PORT_SSH,                             /* defport */
  CURLPROTO_SCP,                        /* protocol */
  PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
  | PROTOPT_NOURLQUERY                  /* flags */
};


/*
 * SFTP protocol handler.
 */

const struct Curl_handler Curl_handler_sftp = {
  "SFTP",                               /* scheme */
  ssh_setup_connection,                 /* setup_connection */
  ssh_do,                               /* do_it */
  sftp_done,                            /* done */
  ZERO_NULL,                            /* do_more */
  ssh_connect,                          /* connect_it */
  ssh_multi_statemach,                  /* connecting */
  sftp_doing,                           /* doing */
  ssh_getsock,                          /* proto_getsock */
  ssh_getsock,                          /* doing_getsock */
  ZERO_NULL,                            /* domore_getsock */
  ssh_perform_getsock,                  /* perform_getsock */
  sftp_disconnect,                      /* disconnect */
  ZERO_NULL,                            /* readwrite */
  ZERO_NULL,                            /* connection_check */
  PORT_SSH,                             /* defport */
  CURLPROTO_SFTP,                       /* protocol */
  PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
  | PROTOPT_NOURLQUERY                  /* flags */
};

static void
kbd_callback(const char *name, int name_len, const char *instruction,
             int instruction_len, int num_prompts,
             const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts,
             LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses,
             void **abstract)
{
  struct connectdata *conn = (struct connectdata *)*abstract;

#ifdef CURL_LIBSSH2_DEBUG
  fprintf(stderr, "name=%s\n", name);
  fprintf(stderr, "name_len=%d\n", name_len);
  fprintf(stderr, "instruction=%s\n", instruction);
  fprintf(stderr, "instruction_len=%d\n", instruction_len);
  fprintf(stderr, "num_prompts=%d\n", num_prompts);
#else
  (void)name;
  (void)name_len;
  (void)instruction;
  (void)instruction_len;
#endif  /* CURL_LIBSSH2_DEBUG */
  if(num_prompts == 1) {
    responses[0].text = strdup(conn->passwd);
    responses[0].length = curlx_uztoui(strlen(conn->passwd));
  }
  (void)prompts;
  (void)abstract;
} /* kbd_callback */

static CURLcode sftp_libssh2_error_to_CURLE(int err)
{
  switch(err) {
    case LIBSSH2_FX_OK:
      return CURLE_OK;

    case LIBSSH2_FX_NO_SUCH_FILE:
    case LIBSSH2_FX_NO_SUCH_PATH:
      return CURLE_REMOTE_FILE_NOT_FOUND;

    case LIBSSH2_FX_PERMISSION_DENIED:
    case LIBSSH2_FX_WRITE_PROTECT:
    case LIBSSH2_FX_LOCK_CONFlICT:
      return CURLE_REMOTE_ACCESS_DENIED;

    case LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM:
    case LIBSSH2_FX_QUOTA_EXCEEDED:
      return CURLE_REMOTE_DISK_FULL;

    case LIBSSH2_FX_FILE_ALREADY_EXISTS:
      return CURLE_REMOTE_FILE_EXISTS;

    case LIBSSH2_FX_DIR_NOT_EMPTY:
      return CURLE_QUOTE_ERROR;

    default:
      break;
  }

  return CURLE_SSH;
}

static CURLcode libssh2_session_error_to_CURLE(int err)
{
  switch(err) {
    /* Ordered by order of appearance in libssh2.h */
    case LIBSSH2_ERROR_NONE:
      return CURLE_OK;

    /* This is the error returned by libssh2_scp_recv2
     * on unknown file */
    case LIBSSH2_ERROR_SCP_PROTOCOL:
      return CURLE_REMOTE_FILE_NOT_FOUND;

    case LIBSSH2_ERROR_SOCKET_NONE:
      return CURLE_COULDNT_CONNECT;

    case LIBSSH2_ERROR_ALLOC:
      return CURLE_OUT_OF_MEMORY;

    case LIBSSH2_ERROR_SOCKET_SEND:
      return CURLE_SEND_ERROR;

    case LIBSSH2_ERROR_HOSTKEY_INIT:
    case LIBSSH2_ERROR_HOSTKEY_SIGN:
    case LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED:
    case LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED:
      return CURLE_PEER_FAILED_VERIFICATION;

    case LIBSSH2_ERROR_PASSWORD_EXPIRED:
      return CURLE_LOGIN_DENIED;

    case LIBSSH2_ERROR_SOCKET_TIMEOUT:
    case LIBSSH2_ERROR_TIMEOUT:
      return CURLE_OPERATION_TIMEDOUT;

    case LIBSSH2_ERROR_EAGAIN:
      return CURLE_AGAIN;
  }

  return CURLE_SSH;
}

static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc)
{
  (void)abstract; /* arg not used */
  return malloc(count);
}

static LIBSSH2_REALLOC_FUNC(my_libssh2_realloc)
{
  (void)abstract; /* arg not used */
  return realloc(ptr, count);
}

static LIBSSH2_FREE_FUNC(my_libssh2_free)
{
  (void)abstract; /* arg not used */
  if(ptr) /* ssh2 agent sometimes call free with null ptr */
    free(ptr);
}

/*
 * SSH State machine related code
 */
/* This is the ONLY way to change SSH state! */
static void state(struct connectdata *conn, sshstate nowstate)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
#if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
  /* for debug purposes */
  static const char * const names[] = {
    "SSH_STOP",
    "SSH_INIT",
    "SSH_S_STARTUP",
    "SSH_HOSTKEY",
    "SSH_AUTHLIST",
    "SSH_AUTH_PKEY_INIT",
    "SSH_AUTH_PKEY",
    "SSH_AUTH_PASS_INIT",
    "SSH_AUTH_PASS",
    "SSH_AUTH_AGENT_INIT",
    "SSH_AUTH_AGENT_LIST",
    "SSH_AUTH_AGENT",
    "SSH_AUTH_HOST_INIT",
    "SSH_AUTH_HOST",
    "SSH_AUTH_KEY_INIT",
    "SSH_AUTH_KEY",
    "SSH_AUTH_GSSAPI",
    "SSH_AUTH_DONE",
    "SSH_SFTP_INIT",
    "SSH_SFTP_REALPATH",
    "SSH_SFTP_QUOTE_INIT",
    "SSH_SFTP_POSTQUOTE_INIT",
    "SSH_SFTP_QUOTE",
    "SSH_SFTP_NEXT_QUOTE",
    "SSH_SFTP_QUOTE_STAT",
    "SSH_SFTP_QUOTE_SETSTAT",
    "SSH_SFTP_QUOTE_SYMLINK",
    "SSH_SFTP_QUOTE_MKDIR",
    "SSH_SFTP_QUOTE_RENAME",
    "SSH_SFTP_QUOTE_RMDIR",
    "SSH_SFTP_QUOTE_UNLINK",
    "SSH_SFTP_QUOTE_STATVFS",
    "SSH_SFTP_GETINFO",
    "SSH_SFTP_FILETIME",
    "SSH_SFTP_TRANS_INIT",
    "SSH_SFTP_UPLOAD_INIT",
    "SSH_SFTP_CREATE_DIRS_INIT",
    "SSH_SFTP_CREATE_DIRS",
    "SSH_SFTP_CREATE_DIRS_MKDIR",
    "SSH_SFTP_READDIR_INIT",
    "SSH_SFTP_READDIR",
    "SSH_SFTP_READDIR_LINK",
    "SSH_SFTP_READDIR_BOTTOM",
    "SSH_SFTP_READDIR_DONE",
    "SSH_SFTP_DOWNLOAD_INIT",
    "SSH_SFTP_DOWNLOAD_STAT",
    "SSH_SFTP_CLOSE",
    "SSH_SFTP_SHUTDOWN",
    "SSH_SCP_TRANS_INIT",
    "SSH_SCP_UPLOAD_INIT",
    "SSH_SCP_DOWNLOAD_INIT",
    "SSH_SCP_DOWNLOAD",
    "SSH_SCP_DONE",
    "SSH_SCP_SEND_EOF",
    "SSH_SCP_WAIT_EOF",
    "SSH_SCP_WAIT_CLOSE",
    "SSH_SCP_CHANNEL_FREE",
    "SSH_SESSION_DISCONNECT",
    "SSH_SESSION_FREE",
    "QUIT"
  };

  /* a precaution to make sure the lists are in sync */
  DEBUGASSERT(sizeof(names)/sizeof(names[0]) == SSH_LAST);

  if(sshc->state != nowstate) {
    infof(conn->data, "SFTP %p state change from %s to %s\n",
          (void *)sshc, names[sshc->state], names[nowstate]);
  }
#endif

  sshc->state = nowstate;
}


#ifdef HAVE_LIBSSH2_KNOWNHOST_API
static int sshkeycallback(struct Curl_easy *easy,
                          const struct curl_khkey *knownkey, /* known */
                          const struct curl_khkey *foundkey, /* found */
                          enum curl_khmatch match,
                          void *clientp)
{
  (void)easy;
  (void)knownkey;
  (void)foundkey;
  (void)clientp;

  /* we only allow perfect matches, and we reject everything else */
  return (match != CURLKHMATCH_OK)?CURLKHSTAT_REJECT:CURLKHSTAT_FINE;
}
#endif

/*
 * Earlier libssh2 versions didn't have the ability to seek to 64bit positions
 * with 32bit size_t.
 */
#ifdef HAVE_LIBSSH2_SFTP_SEEK64
#define SFTP_SEEK(x,y) libssh2_sftp_seek64(x, (libssh2_uint64_t)y)
#else
#define SFTP_SEEK(x,y) libssh2_sftp_seek(x, (size_t)y)
#endif

/*
 * Earlier libssh2 versions didn't do SCP properly beyond 32bit sizes on 32bit
 * architectures so we check of the necessary function is present.
 */
#ifndef HAVE_LIBSSH2_SCP_SEND64
#define SCP_SEND(a,b,c,d) libssh2_scp_send_ex(a, b, (int)(c), (size_t)d, 0, 0)
#else
#define SCP_SEND(a,b,c,d) libssh2_scp_send64(a, b, (int)(c),            \
                                             (libssh2_uint64_t)d, 0, 0)
#endif

/*
 * libssh2 1.2.8 fixed the problem with 32bit ints used for sockets on win64.
 */
#ifdef HAVE_LIBSSH2_SESSION_HANDSHAKE
#define libssh2_session_startup(x,y) libssh2_session_handshake(x,y)
#endif

static CURLcode ssh_knownhost(struct connectdata *conn)
{
  CURLcode result = CURLE_OK;

#ifdef HAVE_LIBSSH2_KNOWNHOST_API
  struct Curl_easy *data = conn->data;

  if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
    /* we're asked to verify the host against a file */
    struct ssh_conn *sshc = &conn->proto.sshc;
    int rc;
    int keytype;
    size_t keylen;
    const char *remotekey = libssh2_session_hostkey(sshc->ssh_session,
                                                    &keylen, &keytype);
    int keycheck = LIBSSH2_KNOWNHOST_CHECK_FAILURE;
    int keybit = 0;

    if(remotekey) {
      /*
       * A subject to figure out is what host name we need to pass in here.
       * What host name does OpenSSH store in its file if an IDN name is
       * used?
       */
      struct libssh2_knownhost *host;
      enum curl_khmatch keymatch;
      curl_sshkeycallback func =
        data->set.ssh_keyfunc?data->set.ssh_keyfunc:sshkeycallback;
      struct curl_khkey knownkey;
      struct curl_khkey *knownkeyp = NULL;
      struct curl_khkey foundkey;

      keybit = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
        LIBSSH2_KNOWNHOST_KEY_SSHRSA:LIBSSH2_KNOWNHOST_KEY_SSHDSS;

#ifdef HAVE_LIBSSH2_KNOWNHOST_CHECKP
      keycheck = libssh2_knownhost_checkp(sshc->kh,
                                          conn->host.name,
                                          (conn->remote_port != PORT_SSH)?
                                          conn->remote_port:-1,
                                          remotekey, keylen,
                                          LIBSSH2_KNOWNHOST_TYPE_PLAIN|
                                          LIBSSH2_KNOWNHOST_KEYENC_RAW|
                                          keybit,
                                          &host);
#else
      keycheck = libssh2_knownhost_check(sshc->kh,
                                         conn->host.name,
                                         remotekey, keylen,
                                         LIBSSH2_KNOWNHOST_TYPE_PLAIN|
                                         LIBSSH2_KNOWNHOST_KEYENC_RAW|
                                         keybit,
                                         &host);
#endif

      infof(data, "SSH host check: %d, key: %s\n", keycheck,
            (keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH)?
            host->key:"<none>");

      /* setup 'knownkey' */
      if(keycheck <= LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
        knownkey.key = host->key;
        knownkey.len = 0;
        knownkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
          CURLKHTYPE_RSA : CURLKHTYPE_DSS;
        knownkeyp = &knownkey;
      }

      /* setup 'foundkey' */
      foundkey.key = remotekey;
      foundkey.len = keylen;
      foundkey.keytype = (keytype == LIBSSH2_HOSTKEY_TYPE_RSA)?
        CURLKHTYPE_RSA : CURLKHTYPE_DSS;

      /*
       * if any of the LIBSSH2_KNOWNHOST_CHECK_* defines and the
       * curl_khmatch enum are ever modified, we need to introduce a
       * translation table here!
       */
      keymatch = (enum curl_khmatch)keycheck;

      /* Ask the callback how to behave */
      Curl_set_in_callback(data, true);
      rc = func(data, knownkeyp, /* from the knownhosts file */
                &foundkey, /* from the remote host */
                keymatch, data->set.ssh_keyfunc_userp);
      Curl_set_in_callback(data, false);
    }
    else
      /* no remotekey means failure! */
      rc = CURLKHSTAT_REJECT;

    switch(rc) {
    default: /* unknown return codes will equal reject */
      /* FALLTHROUGH */
    case CURLKHSTAT_REJECT:
      state(conn, SSH_SESSION_FREE);
      /* FALLTHROUGH */
    case CURLKHSTAT_DEFER:
      /* DEFER means bail out but keep the SSH_HOSTKEY state */
      result = sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION;
      break;
    case CURLKHSTAT_FINE:
    case CURLKHSTAT_FINE_ADD_TO_FILE:
      /* proceed */
      if(keycheck != LIBSSH2_KNOWNHOST_CHECK_MATCH) {
        /* the found host+key didn't match but has been told to be fine
           anyway so we add it in memory */
        int addrc = libssh2_knownhost_add(sshc->kh,
                                          conn->host.name, NULL,
                                          remotekey, keylen,
                                          LIBSSH2_KNOWNHOST_TYPE_PLAIN|
                                          LIBSSH2_KNOWNHOST_KEYENC_RAW|
                                          keybit, NULL);
        if(addrc)
          infof(data, "Warning adding the known host %s failed!\n",
                conn->host.name);
        else if(rc == CURLKHSTAT_FINE_ADD_TO_FILE) {
          /* now we write the entire in-memory list of known hosts to the
             known_hosts file */
          int wrc =
            libssh2_knownhost_writefile(sshc->kh,
                                        data->set.str[STRING_SSH_KNOWNHOSTS],
                                        LIBSSH2_KNOWNHOST_FILE_OPENSSH);
          if(wrc) {
            infof(data, "Warning, writing %s failed!\n",
                  data->set.str[STRING_SSH_KNOWNHOSTS]);
          }
        }
      }
      break;
    }
  }
#else /* HAVE_LIBSSH2_KNOWNHOST_API */
  (void)conn;
#endif
  return result;
}

static CURLcode ssh_check_fingerprint(struct connectdata *conn)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  struct Curl_easy *data = conn->data;
  const char *pubkey_md5 = data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5];
  char md5buffer[33];

  const char *fingerprint = libssh2_hostkey_hash(sshc->ssh_session,
      LIBSSH2_HOSTKEY_HASH_MD5);

  if(fingerprint) {
    /* The fingerprint points to static storage (!), don't free() it. */
    int i;
    for(i = 0; i < 16; i++)
      msnprintf(&md5buffer[i*2], 3, "%02x", (unsigned char) fingerprint[i]);
    infof(data, "SSH MD5 fingerprint: %s\n", md5buffer);
  }

  /* Before we authenticate we check the hostkey's MD5 fingerprint
   * against a known fingerprint, if available.
   */
  if(pubkey_md5 && strlen(pubkey_md5) == 32) {
    if(!fingerprint || !strcasecompare(md5buffer, pubkey_md5)) {
      if(fingerprint)
        failf(data,
            "Denied establishing ssh session: mismatch md5 fingerprint. "
            "Remote %s is not equal to %s", md5buffer, pubkey_md5);
      else
        failf(data,
            "Denied establishing ssh session: md5 fingerprint not available");
      state(conn, SSH_SESSION_FREE);
      sshc->actualcode = CURLE_PEER_FAILED_VERIFICATION;
      return sshc->actualcode;
    }
    infof(data, "MD5 checksum match!\n");
    /* as we already matched, we skip the check for known hosts */
    return CURLE_OK;
  }
  return ssh_knownhost(conn);
}

/*
 * ssh_statemach_act() runs the SSH state machine as far as it can without
 * blocking and without reaching the end.  The data the pointer 'block' points
 * to will be set to TRUE if the libssh2 function returns LIBSSH2_ERROR_EAGAIN
 * meaning it wants to be called again when the socket is ready
 */

static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
{
  CURLcode result = CURLE_OK;
  struct Curl_easy *data = conn->data;
  struct SSHPROTO *sftp_scp = data->req.protop;
  struct ssh_conn *sshc = &conn->proto.sshc;
  curl_socket_t sock = conn->sock[FIRSTSOCKET];
  char *new_readdir_line;
  int rc = LIBSSH2_ERROR_NONE;
  int err;
  int seekerr = CURL_SEEKFUNC_OK;
  *block = 0; /* we're not blocking by default */

  do {

    switch(sshc->state) {
    case SSH_INIT:
      sshc->secondCreateDirs = 0;
      sshc->nextstate = SSH_NO_STATE;
      sshc->actualcode = CURLE_OK;

      /* Set libssh2 to non-blocking, since everything internally is
         non-blocking */
      libssh2_session_set_blocking(sshc->ssh_session, 0);

      state(conn, SSH_S_STARTUP);
      /* FALLTHROUGH */

    case SSH_S_STARTUP:
      rc = libssh2_session_startup(sshc->ssh_session, (int)sock);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc) {
        char *err_msg = NULL;
        (void)libssh2_session_last_error(sshc->ssh_session, &err_msg, NULL, 0);
        failf(data, "Failure establishing ssh session: %d, %s", rc, err_msg);

        state(conn, SSH_SESSION_FREE);
        sshc->actualcode = CURLE_FAILED_INIT;
        break;
      }

      state(conn, SSH_HOSTKEY);

      /* FALLTHROUGH */
    case SSH_HOSTKEY:
      /*
       * Before we authenticate we should check the hostkey's fingerprint
       * against our known hosts. How that is handled (reading from file,
       * whatever) is up to us.
       */
      result = ssh_check_fingerprint(conn);
      if(!result)
        state(conn, SSH_AUTHLIST);
      /* ssh_check_fingerprint sets state appropriately on error */
      break;

    case SSH_AUTHLIST:
      /*
       * Figure out authentication methods
       * NB: As soon as we have provided a username to an openssh server we
       * must never change it later. Thus, always specify the correct username
       * here, even though the libssh2 docs kind of indicate that it should be
       * possible to get a 'generic' list (not user-specific) of authentication
       * methods, presumably with a blank username. That won't work in my
       * experience.
       * So always specify it here.
       */
      sshc->authlist = libssh2_userauth_list(sshc->ssh_session,
                                             conn->user,
                                             curlx_uztoui(strlen(conn->user)));

      if(!sshc->authlist) {
        if(libssh2_userauth_authenticated(sshc->ssh_session)) {
          sshc->authed = TRUE;
          infof(data, "SSH user accepted with no authentication\n");
          state(conn, SSH_AUTH_DONE);
          break;
        }
        err = libssh2_session_last_errno(sshc->ssh_session);
        if(err == LIBSSH2_ERROR_EAGAIN)
          rc = LIBSSH2_ERROR_EAGAIN;
        else {
          state(conn, SSH_SESSION_FREE);
          sshc->actualcode = libssh2_session_error_to_CURLE(err);
        }
        break;
      }
      infof(data, "SSH authentication methods available: %s\n",
            sshc->authlist);

      state(conn, SSH_AUTH_PKEY_INIT);
      break;

    case SSH_AUTH_PKEY_INIT:
      /*
       * Check the supported auth types in the order I feel is most secure
       * with the requested type of authentication
       */
      sshc->authed = FALSE;

      if((data->set.ssh_auth_types & CURLSSH_AUTH_PUBLICKEY) &&
         (strstr(sshc->authlist, "publickey") != NULL)) {
        bool out_of_memory = FALSE;

        sshc->rsa_pub = sshc->rsa = NULL;

        if(data->set.str[STRING_SSH_PRIVATE_KEY])
          sshc->rsa = strdup(data->set.str[STRING_SSH_PRIVATE_KEY]);
        else {
          /* To ponder about: should really the lib be messing about with the
             HOME environment variable etc? */
          char *home = curl_getenv("HOME");

          /* If no private key file is specified, try some common paths. */
          if(home) {
            /* Try ~/.ssh first. */
            sshc->rsa = aprintf("%s/.ssh/id_rsa", home);
            if(!sshc->rsa)
              out_of_memory = TRUE;
            else if(access(sshc->rsa, R_OK) != 0) {
              Curl_safefree(sshc->rsa);
              sshc->rsa = aprintf("%s/.ssh/id_dsa", home);
              if(!sshc->rsa)
                out_of_memory = TRUE;
              else if(access(sshc->rsa, R_OK) != 0) {
                Curl_safefree(sshc->rsa);
              }
            }
            free(home);
          }
          if(!out_of_memory && !sshc->rsa) {
            /* Nothing found; try the current dir. */
            sshc->rsa = strdup("id_rsa");
            if(sshc->rsa && access(sshc->rsa, R_OK) != 0) {
              Curl_safefree(sshc->rsa);
              sshc->rsa = strdup("id_dsa");
              if(sshc->rsa && access(sshc->rsa, R_OK) != 0) {
                Curl_safefree(sshc->rsa);
                /* Out of guesses. Set to the empty string to avoid
                 * surprising info messages. */
                sshc->rsa = strdup("");
              }
            }
          }
        }

        /*
         * Unless the user explicitly specifies a public key file, let
         * libssh2 extract the public key from the private key file.
         * This is done by simply passing sshc->rsa_pub = NULL.
         */
        if(data->set.str[STRING_SSH_PUBLIC_KEY]
           /* treat empty string the same way as NULL */
           && data->set.str[STRING_SSH_PUBLIC_KEY][0]) {
          sshc->rsa_pub = strdup(data->set.str[STRING_SSH_PUBLIC_KEY]);
          if(!sshc->rsa_pub)
            out_of_memory = TRUE;
        }

        if(out_of_memory || sshc->rsa == NULL) {
          Curl_safefree(sshc->rsa);
          Curl_safefree(sshc->rsa_pub);
          state(conn, SSH_SESSION_FREE);
          sshc->actualcode = CURLE_OUT_OF_MEMORY;
          break;
        }

        sshc->passphrase = data->set.ssl.key_passwd;
        if(!sshc->passphrase)
          sshc->passphrase = "";

        if(sshc->rsa_pub)
          infof(data, "Using SSH public key file '%s'\n", sshc->rsa_pub);
        infof(data, "Using SSH private key file '%s'\n", sshc->rsa);

        state(conn, SSH_AUTH_PKEY);
      }
      else {
        state(conn, SSH_AUTH_PASS_INIT);
      }
      break;

    case SSH_AUTH_PKEY:
      /* The function below checks if the files exists, no need to stat() here.
       */
      rc = libssh2_userauth_publickey_fromfile_ex(sshc->ssh_session,
                                                  conn->user,
                                                  curlx_uztoui(
                                                    strlen(conn->user)),
                                                  sshc->rsa_pub,
                                                  sshc->rsa, sshc->passphrase);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }

      Curl_safefree(sshc->rsa_pub);
      Curl_safefree(sshc->rsa);

      if(rc == 0) {
        sshc->authed = TRUE;
        infof(data, "Initialized SSH public key authentication\n");
        state(conn, SSH_AUTH_DONE);
      }
      else {
        char *err_msg = NULL;
        (void)libssh2_session_last_error(sshc->ssh_session,
                                         &err_msg, NULL, 0);
        infof(data, "SSH public key authentication failed: %s\n", err_msg);
        state(conn, SSH_AUTH_PASS_INIT);
        rc = 0; /* clear rc and continue */
      }
      break;

    case SSH_AUTH_PASS_INIT:
      if((data->set.ssh_auth_types & CURLSSH_AUTH_PASSWORD) &&
         (strstr(sshc->authlist, "password") != NULL)) {
        state(conn, SSH_AUTH_PASS);
      }
      else {
        state(conn, SSH_AUTH_HOST_INIT);
        rc = 0; /* clear rc and continue */
      }
      break;

    case SSH_AUTH_PASS:
      rc = libssh2_userauth_password_ex(sshc->ssh_session, conn->user,
                                        curlx_uztoui(strlen(conn->user)),
                                        conn->passwd,
                                        curlx_uztoui(strlen(conn->passwd)),
                                        NULL);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc == 0) {
        sshc->authed = TRUE;
        infof(data, "Initialized password authentication\n");
        state(conn, SSH_AUTH_DONE);
      }
      else {
        state(conn, SSH_AUTH_HOST_INIT);
        rc = 0; /* clear rc and continue */
      }
      break;

    case SSH_AUTH_HOST_INIT:
      if((data->set.ssh_auth_types & CURLSSH_AUTH_HOST) &&
         (strstr(sshc->authlist, "hostbased") != NULL)) {
        state(conn, SSH_AUTH_HOST);
      }
      else {
        state(conn, SSH_AUTH_AGENT_INIT);
      }
      break;

    case SSH_AUTH_HOST:
      state(conn, SSH_AUTH_AGENT_INIT);
      break;

    case SSH_AUTH_AGENT_INIT:
#ifdef HAVE_LIBSSH2_AGENT_API
      if((data->set.ssh_auth_types & CURLSSH_AUTH_AGENT)
         && (strstr(sshc->authlist, "publickey") != NULL)) {

        /* Connect to the ssh-agent */
        /* The agent could be shared by a curl thread i believe
           but nothing obvious as keys can be added/removed at any time */
        if(!sshc->ssh_agent) {
          sshc->ssh_agent = libssh2_agent_init(sshc->ssh_session);
          if(!sshc->ssh_agent) {
            infof(data, "Could not create agent object\n");

            state(conn, SSH_AUTH_KEY_INIT);
            break;
          }
        }

        rc = libssh2_agent_connect(sshc->ssh_agent);
        if(rc == LIBSSH2_ERROR_EAGAIN)
          break;
        if(rc < 0) {
          infof(data, "Failure connecting to agent\n");
          state(conn, SSH_AUTH_KEY_INIT);
          rc = 0; /* clear rc and continue */
        }
        else {
          state(conn, SSH_AUTH_AGENT_LIST);
        }
      }
      else
#endif /* HAVE_LIBSSH2_AGENT_API */
        state(conn, SSH_AUTH_KEY_INIT);
      break;

    case SSH_AUTH_AGENT_LIST:
#ifdef HAVE_LIBSSH2_AGENT_API
      rc = libssh2_agent_list_identities(sshc->ssh_agent);

      if(rc == LIBSSH2_ERROR_EAGAIN)
        break;
      if(rc < 0) {
        infof(data, "Failure requesting identities to agent\n");
        state(conn, SSH_AUTH_KEY_INIT);
        rc = 0; /* clear rc and continue */
      }
      else {
        state(conn, SSH_AUTH_AGENT);
        sshc->sshagent_prev_identity = NULL;
      }
#endif
      break;

    case SSH_AUTH_AGENT:
#ifdef HAVE_LIBSSH2_AGENT_API
      /* as prev_identity evolves only after an identity user auth finished we
         can safely request it again as long as EAGAIN is returned here or by
         libssh2_agent_userauth */
      rc = libssh2_agent_get_identity(sshc->ssh_agent,
                                      &sshc->sshagent_identity,
                                      sshc->sshagent_prev_identity);
      if(rc == LIBSSH2_ERROR_EAGAIN)
        break;

      if(rc == 0) {
        rc = libssh2_agent_userauth(sshc->ssh_agent, conn->user,
                                    sshc->sshagent_identity);

        if(rc < 0) {
          if(rc != LIBSSH2_ERROR_EAGAIN) {
            /* tried and failed? go to next identity */
            sshc->sshagent_prev_identity = sshc->sshagent_identity;
          }
          break;
        }
      }

      if(rc < 0)
        infof(data, "Failure requesting identities to agent\n");
      else if(rc == 1)
        infof(data, "No identity would match\n");

      if(rc == LIBSSH2_ERROR_NONE) {
        sshc->authed = TRUE;
        infof(data, "Agent based authentication successful\n");
        state(conn, SSH_AUTH_DONE);
      }
      else {
        state(conn, SSH_AUTH_KEY_INIT);
        rc = 0; /* clear rc and continue */
      }
#endif
      break;

    case SSH_AUTH_KEY_INIT:
      if((data->set.ssh_auth_types & CURLSSH_AUTH_KEYBOARD)
         && (strstr(sshc->authlist, "keyboard-interactive") != NULL)) {
        state(conn, SSH_AUTH_KEY);
      }
      else {
        state(conn, SSH_AUTH_DONE);
      }
      break;

    case SSH_AUTH_KEY:
      /* Authentication failed. Continue with keyboard-interactive now. */
      rc = libssh2_userauth_keyboard_interactive_ex(sshc->ssh_session,
                                                    conn->user,
                                                    curlx_uztoui(
                                                      strlen(conn->user)),
                                                    &kbd_callback);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc == 0) {
        sshc->authed = TRUE;
        infof(data, "Initialized keyboard interactive authentication\n");
      }
      state(conn, SSH_AUTH_DONE);
      break;

    case SSH_AUTH_DONE:
      if(!sshc->authed) {
        failf(data, "Authentication failure");
        state(conn, SSH_SESSION_FREE);
        sshc->actualcode = CURLE_LOGIN_DENIED;
        break;
      }

      /*
       * At this point we have an authenticated ssh session.
       */
      infof(data, "Authentication complete\n");

      Curl_pgrsTime(conn->data, TIMER_APPCONNECT); /* SSH is connected */

      conn->sockfd = sock;
      conn->writesockfd = CURL_SOCKET_BAD;

      if(conn->handler->protocol == CURLPROTO_SFTP) {
        state(conn, SSH_SFTP_INIT);
        break;
      }
      infof(data, "SSH CONNECT phase done\n");
      state(conn, SSH_STOP);
      break;

    case SSH_SFTP_INIT:
      /*
       * Start the libssh2 sftp session
       */
      sshc->sftp_session = libssh2_sftp_init(sshc->ssh_session);
      if(!sshc->sftp_session) {
        char *err_msg = NULL;
        if(libssh2_session_last_errno(sshc->ssh_session) ==
           LIBSSH2_ERROR_EAGAIN) {
          rc = LIBSSH2_ERROR_EAGAIN;
          break;
        }

        (void)libssh2_session_last_error(sshc->ssh_session,
                                         &err_msg, NULL, 0);
        failf(data, "Failure initializing sftp session: %s", err_msg);
        state(conn, SSH_SESSION_FREE);
        sshc->actualcode = CURLE_FAILED_INIT;
        break;
      }
      state(conn, SSH_SFTP_REALPATH);
      break;

    case SSH_SFTP_REALPATH:
    {
      char tempHome[PATH_MAX];

      /*
       * Get the "home" directory
       */
      rc = sftp_libssh2_realpath(sshc->sftp_session, ".",
                                 tempHome, PATH_MAX-1);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc > 0) {
        /* It seems that this string is not always NULL terminated */
        tempHome[rc] = '\0';
        sshc->homedir = strdup(tempHome);
        if(!sshc->homedir) {
          state(conn, SSH_SFTP_CLOSE);
          sshc->actualcode = CURLE_OUT_OF_MEMORY;
          break;
        }
        conn->data->state.most_recent_ftp_entrypath = sshc->homedir;
      }
      else {
        /* Return the error type */
        err = sftp_libssh2_last_error(sshc->sftp_session);
        if(err)
          result = sftp_libssh2_error_to_CURLE(err);
        else
          /* in this case, the error wasn't in the SFTP level but for example
             a time-out or similar */
          result = CURLE_SSH;
        sshc->actualcode = result;
        DEBUGF(infof(data, "error = %d makes libcurl = %d\n",
                     err, (int)result));
        state(conn, SSH_STOP);
        break;
      }
    }
    /* This is the last step in the SFTP connect phase. Do note that while
       we get the homedir here, we get the "workingpath" in the DO action
       since the homedir will remain the same between request but the
       working path will not. */
    DEBUGF(infof(data, "SSH CONNECT phase done\n"));
    state(conn, SSH_STOP);
    break;

    case SSH_SFTP_QUOTE_INIT:

      result = Curl_getworkingpath(conn, sshc->homedir, &sftp_scp->path);
      if(result) {
        sshc->actualcode = result;
        state(conn, SSH_STOP);
        break;
      }

      if(data->set.quote) {
        infof(data, "Sending quote commands\n");
        sshc->quote_item = data->set.quote;
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        state(conn, SSH_SFTP_GETINFO);
      }
      break;

    case SSH_SFTP_POSTQUOTE_INIT:
      if(data->set.postquote) {
        infof(data, "Sending quote commands\n");
        sshc->quote_item = data->set.postquote;
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        state(conn, SSH_STOP);
      }
      break;

    case SSH_SFTP_QUOTE:
      /* Send any quote commands */
    {
      const char *cp;

      /*
       * Support some of the "FTP" commands
       *
       * 'sshc->quote_item' is already verified to be non-NULL before it
       * switched to this state.
       */
      char *cmd = sshc->quote_item->data;
      sshc->acceptfail = FALSE;

      /* if a command starts with an asterisk, which a legal SFTP command never
         can, the command will be allowed to fail without it causing any
         aborts or cancels etc. It will cause libcurl to act as if the command
         is successful, whatever the server reponds. */

      if(cmd[0] == '*') {
        cmd++;
        sshc->acceptfail = TRUE;
      }

      if(strcasecompare("pwd", cmd)) {
        /* output debug output if that is requested */
        char *tmp = aprintf("257 \"%s\" is current directory.\n",
                            sftp_scp->path);
        if(!tmp) {
          result = CURLE_OUT_OF_MEMORY;
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          break;
        }
        if(data->set.verbose) {
          Curl_debug(data, CURLINFO_HEADER_OUT, (char *)"PWD\n", 4);
          Curl_debug(data, CURLINFO_HEADER_IN, tmp, strlen(tmp));
        }
        /* this sends an FTP-like "header" to the header callback so that the
           current directory can be read very similar to how it is read when
           using ordinary FTP. */
        result = Curl_client_write(conn, CLIENTWRITE_HEADER, tmp, strlen(tmp));
        free(tmp);
        if(result) {
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = result;
        }
        else
          state(conn, SSH_SFTP_NEXT_QUOTE);
        break;
      }
      {
        /*
         * the arguments following the command must be separated from the
         * command with a space so we can check for it unconditionally
         */
        cp = strchr(cmd, ' ');
        if(cp == NULL) {
          failf(data, "Syntax error in SFTP command. Supply parameter(s)!");
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = CURLE_QUOTE_ERROR;
          break;
        }

        /*
         * also, every command takes at least one argument so we get that
         * first argument right now
         */
        result = Curl_get_pathname(&cp, &sshc->quote_path1, sshc->homedir);
        if(result) {
          if(result == CURLE_OUT_OF_MEMORY)
            failf(data, "Out of memory");
          else
            failf(data, "Syntax error: Bad first parameter");
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = result;
          break;
        }

        /*
         * SFTP is a binary protocol, so we don't send text commands
         * to the server. Instead, we scan for commands used by
         * OpenSSH's sftp program and call the appropriate libssh2
         * functions.
         */
        if(strncasecompare(cmd, "chgrp ", 6) ||
           strncasecompare(cmd, "chmod ", 6) ||
           strncasecompare(cmd, "chown ", 6) ) {
          /* attribute change */

          /* sshc->quote_path1 contains the mode to set */
          /* get the destination */
          result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
          if(result) {
            if(result == CURLE_OUT_OF_MEMORY)
              failf(data, "Out of memory");
            else
              failf(data, "Syntax error in chgrp/chmod/chown: "
                    "Bad second parameter");
            Curl_safefree(sshc->quote_path1);
            state(conn, SSH_SFTP_CLOSE);
            sshc->nextstate = SSH_NO_STATE;
            sshc->actualcode = result;
            break;
          }
          memset(&sshc->quote_attrs, 0, sizeof(LIBSSH2_SFTP_ATTRIBUTES));
          state(conn, SSH_SFTP_QUOTE_STAT);
          break;
        }
        if(strncasecompare(cmd, "ln ", 3) ||
           strncasecompare(cmd, "symlink ", 8)) {
          /* symbolic linking */
          /* sshc->quote_path1 is the source */
          /* get the destination */
          result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
          if(result) {
            if(result == CURLE_OUT_OF_MEMORY)
              failf(data, "Out of memory");
            else
              failf(data,
                    "Syntax error in ln/symlink: Bad second parameter");
            Curl_safefree(sshc->quote_path1);
            state(conn, SSH_SFTP_CLOSE);
            sshc->nextstate = SSH_NO_STATE;
            sshc->actualcode = result;
            break;
          }
          state(conn, SSH_SFTP_QUOTE_SYMLINK);
          break;
        }
        else if(strncasecompare(cmd, "mkdir ", 6)) {
          /* create dir */
          state(conn, SSH_SFTP_QUOTE_MKDIR);
          break;
        }
        else if(strncasecompare(cmd, "rename ", 7)) {
          /* rename file */
          /* first param is the source path */
          /* second param is the dest. path */
          result = Curl_get_pathname(&cp, &sshc->quote_path2, sshc->homedir);
          if(result) {
            if(result == CURLE_OUT_OF_MEMORY)
              failf(data, "Out of memory");
            else
              failf(data, "Syntax error in rename: Bad second parameter");
            Curl_safefree(sshc->quote_path1);
            state(conn, SSH_SFTP_CLOSE);
            sshc->nextstate = SSH_NO_STATE;
            sshc->actualcode = result;
            break;
          }
          state(conn, SSH_SFTP_QUOTE_RENAME);
          break;
        }
        else if(strncasecompare(cmd, "rmdir ", 6)) {
          /* delete dir */
          state(conn, SSH_SFTP_QUOTE_RMDIR);
          break;
        }
        else if(strncasecompare(cmd, "rm ", 3)) {
          state(conn, SSH_SFTP_QUOTE_UNLINK);
          break;
        }
#ifdef HAS_STATVFS_SUPPORT
        else if(strncasecompare(cmd, "statvfs ", 8)) {
          state(conn, SSH_SFTP_QUOTE_STATVFS);
          break;
        }
#endif

        failf(data, "Unknown SFTP command");
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
    }
    break;

    case SSH_SFTP_NEXT_QUOTE:
      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);

      sshc->quote_item = sshc->quote_item->next;

      if(sshc->quote_item) {
        state(conn, SSH_SFTP_QUOTE);
      }
      else {
        if(sshc->nextstate != SSH_NO_STATE) {
          state(conn, sshc->nextstate);
          sshc->nextstate = SSH_NO_STATE;
        }
        else {
          state(conn, SSH_SFTP_GETINFO);
        }
      }
      break;

    case SSH_SFTP_QUOTE_STAT:
    {
      char *cmd = sshc->quote_item->data;
      sshc->acceptfail = FALSE;

      /* if a command starts with an asterisk, which a legal SFTP command never
         can, the command will be allowed to fail without it causing any
         aborts or cancels etc. It will cause libcurl to act as if the command
         is successful, whatever the server reponds. */

      if(cmd[0] == '*') {
        cmd++;
        sshc->acceptfail = TRUE;
      }

      if(!strncasecompare(cmd, "chmod", 5)) {
        /* Since chown and chgrp only set owner OR group but libssh2 wants to
         * set them both at once, we need to obtain the current ownership
         * first.  This takes an extra protocol round trip.
         */
        rc = libssh2_sftp_stat_ex(sshc->sftp_session, sshc->quote_path2,
                                  curlx_uztoui(strlen(sshc->quote_path2)),
                                  LIBSSH2_SFTP_STAT,
                                  &sshc->quote_attrs);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc != 0 && !sshc->acceptfail) { /* get those attributes */
          err = sftp_libssh2_last_error(sshc->sftp_session);
          Curl_safefree(sshc->quote_path1);
          Curl_safefree(sshc->quote_path2);
          failf(data, "Attempt to get SFTP stats failed: %s",
                sftp_libssh2_strerror(err));
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = CURLE_QUOTE_ERROR;
          break;
        }
      }

      /* Now set the new attributes... */
      if(strncasecompare(cmd, "chgrp", 5)) {
        sshc->quote_attrs.gid = strtoul(sshc->quote_path1, NULL, 10);
        sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_UIDGID;
        if(sshc->quote_attrs.gid == 0 && !ISDIGIT(sshc->quote_path1[0]) &&
           !sshc->acceptfail) {
          Curl_safefree(sshc->quote_path1);
          Curl_safefree(sshc->quote_path2);
          failf(data, "Syntax error: chgrp gid not a number");
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = CURLE_QUOTE_ERROR;
          break;
        }
      }
      else if(strncasecompare(cmd, "chmod", 5)) {
        sshc->quote_attrs.permissions = strtoul(sshc->quote_path1, NULL, 8);
        sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_PERMISSIONS;
        /* permissions are octal */
        if(sshc->quote_attrs.permissions == 0 &&
           !ISDIGIT(sshc->quote_path1[0])) {
          Curl_safefree(sshc->quote_path1);
          Curl_safefree(sshc->quote_path2);
          failf(data, "Syntax error: chmod permissions not a number");
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = CURLE_QUOTE_ERROR;
          break;
        }
      }
      else if(strncasecompare(cmd, "chown", 5)) {
        sshc->quote_attrs.uid = strtoul(sshc->quote_path1, NULL, 10);
        sshc->quote_attrs.flags = LIBSSH2_SFTP_ATTR_UIDGID;
        if(sshc->quote_attrs.uid == 0 && !ISDIGIT(sshc->quote_path1[0]) &&
           !sshc->acceptfail) {
          Curl_safefree(sshc->quote_path1);
          Curl_safefree(sshc->quote_path2);
          failf(data, "Syntax error: chown uid not a number");
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = CURLE_QUOTE_ERROR;
          break;
        }
      }

      /* Now send the completed structure... */
      state(conn, SSH_SFTP_QUOTE_SETSTAT);
      break;
    }

    case SSH_SFTP_QUOTE_SETSTAT:
      rc = libssh2_sftp_stat_ex(sshc->sftp_session, sshc->quote_path2,
                                curlx_uztoui(strlen(sshc->quote_path2)),
                                LIBSSH2_SFTP_SETSTAT,
                                &sshc->quote_attrs);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "Attempt to set SFTP stats failed: %s",
              sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_SYMLINK:
      rc = libssh2_sftp_symlink_ex(sshc->sftp_session, sshc->quote_path1,
                                   curlx_uztoui(strlen(sshc->quote_path1)),
                                   sshc->quote_path2,
                                   curlx_uztoui(strlen(sshc->quote_path2)),
                                   LIBSSH2_SFTP_SYMLINK);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "symlink command failed: %s",
              sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_MKDIR:
      rc = libssh2_sftp_mkdir_ex(sshc->sftp_session, sshc->quote_path1,
                                 curlx_uztoui(strlen(sshc->quote_path1)),
                                 data->set.new_directory_perms);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        failf(data, "mkdir command failed: %s", sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_RENAME:
      rc = libssh2_sftp_rename_ex(sshc->sftp_session, sshc->quote_path1,
                                  curlx_uztoui(strlen(sshc->quote_path1)),
                                  sshc->quote_path2,
                                  curlx_uztoui(strlen(sshc->quote_path2)),
                                  LIBSSH2_SFTP_RENAME_OVERWRITE |
                                  LIBSSH2_SFTP_RENAME_ATOMIC |
                                  LIBSSH2_SFTP_RENAME_NATIVE);

      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        Curl_safefree(sshc->quote_path2);
        failf(data, "rename command failed: %s", sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_RMDIR:
      rc = libssh2_sftp_rmdir_ex(sshc->sftp_session, sshc->quote_path1,
                                 curlx_uztoui(strlen(sshc->quote_path1)));
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        failf(data, "rmdir command failed: %s", sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

    case SSH_SFTP_QUOTE_UNLINK:
      rc = libssh2_sftp_unlink_ex(sshc->sftp_session, sshc->quote_path1,
                                  curlx_uztoui(strlen(sshc->quote_path1)));
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        failf(data, "rm command failed: %s", sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;

#ifdef HAS_STATVFS_SUPPORT
    case SSH_SFTP_QUOTE_STATVFS:
    {
      LIBSSH2_SFTP_STATVFS statvfs;
      rc = libssh2_sftp_statvfs(sshc->sftp_session, sshc->quote_path1,
                                curlx_uztoui(strlen(sshc->quote_path1)),
                                &statvfs);

      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc != 0 && !sshc->acceptfail) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        Curl_safefree(sshc->quote_path1);
        failf(data, "statvfs command failed: %s", sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        sshc->nextstate = SSH_NO_STATE;
        sshc->actualcode = CURLE_QUOTE_ERROR;
        break;
      }
      else if(rc == 0) {
        char *tmp = aprintf("statvfs:\n"
                            "f_bsize: %llu\n" "f_frsize: %llu\n"
                            "f_blocks: %llu\n" "f_bfree: %llu\n"
                            "f_bavail: %llu\n" "f_files: %llu\n"
                            "f_ffree: %llu\n" "f_favail: %llu\n"
                            "f_fsid: %llu\n" "f_flag: %llu\n"
                            "f_namemax: %llu\n",
                            statvfs.f_bsize, statvfs.f_frsize,
                            statvfs.f_blocks, statvfs.f_bfree,
                            statvfs.f_bavail, statvfs.f_files,
                            statvfs.f_ffree, statvfs.f_favail,
                            statvfs.f_fsid, statvfs.f_flag,
                            statvfs.f_namemax);
        if(!tmp) {
          result = CURLE_OUT_OF_MEMORY;
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          break;
        }

        result = Curl_client_write(conn, CLIENTWRITE_HEADER, tmp, strlen(tmp));
        free(tmp);
        if(result) {
          state(conn, SSH_SFTP_CLOSE);
          sshc->nextstate = SSH_NO_STATE;
          sshc->actualcode = result;
        }
      }
      state(conn, SSH_SFTP_NEXT_QUOTE);
      break;
    }
#endif
    case SSH_SFTP_GETINFO:
    {
      if(data->set.get_filetime) {
        state(conn, SSH_SFTP_FILETIME);
      }
      else {
        state(conn, SSH_SFTP_TRANS_INIT);
      }
      break;
    }

    case SSH_SFTP_FILETIME:
    {
      LIBSSH2_SFTP_ATTRIBUTES attrs;

      rc = libssh2_sftp_stat_ex(sshc->sftp_session, sftp_scp->path,
                                curlx_uztoui(strlen(sftp_scp->path)),
                                LIBSSH2_SFTP_STAT, &attrs);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc == 0) {
        data->info.filetime = attrs.mtime;
      }

      state(conn, SSH_SFTP_TRANS_INIT);
      break;
    }

    case SSH_SFTP_TRANS_INIT:
      if(data->set.upload)
        state(conn, SSH_SFTP_UPLOAD_INIT);
      else {
        if(sftp_scp->path[strlen(sftp_scp->path)-1] == '/')
          state(conn, SSH_SFTP_READDIR_INIT);
        else
          state(conn, SSH_SFTP_DOWNLOAD_INIT);
      }
      break;

    case SSH_SFTP_UPLOAD_INIT:
    {
      unsigned long flags;
      /*
       * NOTE!!!  libssh2 requires that the destination path is a full path
       *          that includes the destination file and name OR ends in a "/"
       *          If this is not done the destination file will be named the
       *          same name as the last directory in the path.
       */

      if(data->state.resume_from != 0) {
        LIBSSH2_SFTP_ATTRIBUTES attrs;
        if(data->state.resume_from < 0) {
          rc = libssh2_sftp_stat_ex(sshc->sftp_session, sftp_scp->path,
                                    curlx_uztoui(strlen(sftp_scp->path)),
                                    LIBSSH2_SFTP_STAT, &attrs);
          if(rc == LIBSSH2_ERROR_EAGAIN) {
            break;
          }
          if(rc) {
            data->state.resume_from = 0;
          }
          else {
            curl_off_t size = attrs.filesize;
            if(size < 0) {
              failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
              return CURLE_BAD_DOWNLOAD_RESUME;
            }
            data->state.resume_from = attrs.filesize;
          }
        }
      }

      if(data->set.ftp_append)
        /* Try to open for append, but create if nonexisting */
        flags = LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_APPEND;
      else if(data->state.resume_from > 0)
        /* If we have restart position then open for append */
        flags = LIBSSH2_FXF_WRITE|LIBSSH2_FXF_APPEND;
      else
        /* Clear file before writing (normal behaviour) */
        flags = LIBSSH2_FXF_WRITE|LIBSSH2_FXF_CREAT|LIBSSH2_FXF_TRUNC;

      sshc->sftp_handle =
        libssh2_sftp_open_ex(sshc->sftp_session, sftp_scp->path,
                             curlx_uztoui(strlen(sftp_scp->path)),
                             flags, data->set.new_file_perms,
                             LIBSSH2_SFTP_OPENFILE);

      if(!sshc->sftp_handle) {
        rc = libssh2_session_last_errno(sshc->ssh_session);

        if(LIBSSH2_ERROR_EAGAIN == rc)
          break;

        if(LIBSSH2_ERROR_SFTP_PROTOCOL == rc)
          /* only when there was an SFTP protocol error can we extract
             the sftp error! */
          err = sftp_libssh2_last_error(sshc->sftp_session);
        else
          err = -1; /* not an sftp error at all */

        if(sshc->secondCreateDirs) {
          state(conn, SSH_SFTP_CLOSE);
          sshc->actualcode = err>= LIBSSH2_FX_OK?
            sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
          failf(data, "Creating the dir/file failed: %s",
                sftp_libssh2_strerror(err));
          break;
        }
        if(((err == LIBSSH2_FX_NO_SUCH_FILE) ||
            (err == LIBSSH2_FX_FAILURE) ||
            (err == LIBSSH2_FX_NO_SUCH_PATH)) &&
           (data->set.ftp_create_missing_dirs &&
            (strlen(sftp_scp->path) > 1))) {
          /* try to create the path remotely */
          rc = 0; /* clear rc and continue */
          sshc->secondCreateDirs = 1;
          state(conn, SSH_SFTP_CREATE_DIRS_INIT);
          break;
        }
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = err>= LIBSSH2_FX_OK?
          sftp_libssh2_error_to_CURLE(err):CURLE_SSH;
        if(!sshc->actualcode) {
          /* Sometimes, for some reason libssh2_sftp_last_error() returns
             zero even though libssh2_sftp_open() failed previously! We need
             to work around that! */
          sshc->actualcode = CURLE_SSH;
          err = -1;
        }
        failf(data, "Upload failed: %s (%d/%d)",
              err>= LIBSSH2_FX_OK?sftp_libssh2_strerror(err):"ssh error",
              err, rc);
        break;
      }

      /* If we have a restart point then we need to seek to the correct
         position. */
      if(data->state.resume_from > 0) {
        /* Let's read off the proper amount of bytes from the input. */
        if(conn->seek_func) {
          Curl_set_in_callback(data, true);
          seekerr = conn->seek_func(conn->seek_client, data->state.resume_from,
                                    SEEK_SET);
          Curl_set_in_callback(data, false);
        }

        if(seekerr != CURL_SEEKFUNC_OK) {
          curl_off_t passed = 0;

          if(seekerr != CURL_SEEKFUNC_CANTSEEK) {
            failf(data, "Could not seek stream");
            return CURLE_FTP_COULDNT_USE_REST;
          }
          /* seekerr == CURL_SEEKFUNC_CANTSEEK (can't seek to offset) */
          do {
            size_t readthisamountnow =
              (data->state.resume_from - passed > data->set.buffer_size) ?
              (size_t)data->set.buffer_size :
              curlx_sotouz(data->state.resume_from - passed);

            size_t actuallyread;
            Curl_set_in_callback(data, true);
            actuallyread = data->state.fread_func(data->state.buffer, 1,
                                                  readthisamountnow,
                                                  data->state.in);
            Curl_set_in_callback(data, false);

            passed += actuallyread;
            if((actuallyread == 0) || (actuallyread > readthisamountnow)) {
              /* this checks for greater-than only to make sure that the
                 CURL_READFUNC_ABORT return code still aborts */
              failf(data, "Failed to read data");
              return CURLE_FTP_COULDNT_USE_REST;
            }
          } while(passed < data->state.resume_from);
        }

        /* now, decrease the size of the read */
        if(data->state.infilesize > 0) {
          data->state.infilesize -= data->state.resume_from;
          data->req.size = data->state.infilesize;
          Curl_pgrsSetUploadSize(data, data->state.infilesize);
        }

        SFTP_SEEK(sshc->sftp_handle, data->state.resume_from);
      }
      if(data->state.infilesize > 0) {
        data->req.size = data->state.infilesize;
        Curl_pgrsSetUploadSize(data, data->state.infilesize);
      }
      /* upload data */
      Curl_setup_transfer(data, -1, -1, FALSE, FIRSTSOCKET);

      /* not set by Curl_setup_transfer to preserve keepon bits */
      conn->sockfd = conn->writesockfd;

      if(result) {
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = result;
      }
      else {
        /* store this original bitmask setup to use later on if we can't
           figure out a "real" bitmask */
        sshc->orig_waitfor = data->req.keepon;

        /* we want to use the _sending_ function even when the socket turns
           out readable as the underlying libssh2 sftp send function will deal
           with both accordingly */
        conn->cselect_bits = CURL_CSELECT_OUT;

        /* since we don't really wait for anything at this point, we want the
           state machine to move on as soon as possible so we set a very short
           timeout here */
        Curl_expire(data, 0, EXPIRE_RUN_NOW);

        state(conn, SSH_STOP);
      }
      break;
    }

    case SSH_SFTP_CREATE_DIRS_INIT:
      if(strlen(sftp_scp->path) > 1) {
        sshc->slash_pos = sftp_scp->path + 1; /* ignore the leading '/' */
        state(conn, SSH_SFTP_CREATE_DIRS);
      }
      else {
        state(conn, SSH_SFTP_UPLOAD_INIT);
      }
      break;

    case SSH_SFTP_CREATE_DIRS:
      sshc->slash_pos = strchr(sshc->slash_pos, '/');
      if(sshc->slash_pos) {
        *sshc->slash_pos = 0;

        infof(data, "Creating directory '%s'\n", sftp_scp->path);
        state(conn, SSH_SFTP_CREATE_DIRS_MKDIR);
        break;
      }
      state(conn, SSH_SFTP_UPLOAD_INIT);
      break;

    case SSH_SFTP_CREATE_DIRS_MKDIR:
      /* 'mode' - parameter is preliminary - default to 0644 */
      rc = libssh2_sftp_mkdir_ex(sshc->sftp_session, sftp_scp->path,
                                 curlx_uztoui(strlen(sftp_scp->path)),
                                 data->set.new_directory_perms);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      *sshc->slash_pos = '/';
      ++sshc->slash_pos;
      if(rc < 0) {
        /*
         * Abort if failure wasn't that the dir already exists or the
         * permission was denied (creation might succeed further down the
         * path) - retry on unspecific FAILURE also
         */
        err = sftp_libssh2_last_error(sshc->sftp_session);
        if((err != LIBSSH2_FX_FILE_ALREADY_EXISTS) &&
           (err != LIBSSH2_FX_FAILURE) &&
           (err != LIBSSH2_FX_PERMISSION_DENIED)) {
          result = sftp_libssh2_error_to_CURLE(err);
          state(conn, SSH_SFTP_CLOSE);
          sshc->actualcode = result?result:CURLE_SSH;
          break;
        }
        rc = 0; /* clear rc and continue */
      }
      state(conn, SSH_SFTP_CREATE_DIRS);
      break;

    case SSH_SFTP_READDIR_INIT:
      Curl_pgrsSetDownloadSize(data, -1);
      if(data->set.opt_no_body) {
        state(conn, SSH_STOP);
        break;
      }

      /*
       * This is a directory that we are trying to get, so produce a directory
       * listing
       */
      sshc->sftp_handle = libssh2_sftp_open_ex(sshc->sftp_session,
                                               sftp_scp->path,
                                               curlx_uztoui(
                                                 strlen(sftp_scp->path)),
                                               0, 0, LIBSSH2_SFTP_OPENDIR);
      if(!sshc->sftp_handle) {
        if(libssh2_session_last_errno(sshc->ssh_session) ==
           LIBSSH2_ERROR_EAGAIN) {
          rc = LIBSSH2_ERROR_EAGAIN;
          break;
        }
        err = sftp_libssh2_last_error(sshc->sftp_session);
        failf(data, "Could not open directory for reading: %s",
              sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        result = sftp_libssh2_error_to_CURLE(err);
        sshc->actualcode = result?result:CURLE_SSH;
        break;
      }
      sshc->readdir_filename = malloc(PATH_MAX + 1);
      if(!sshc->readdir_filename) {
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = CURLE_OUT_OF_MEMORY;
        break;
      }
      sshc->readdir_longentry = malloc(PATH_MAX + 1);
      if(!sshc->readdir_longentry) {
        Curl_safefree(sshc->readdir_filename);
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = CURLE_OUT_OF_MEMORY;
        break;
      }
      state(conn, SSH_SFTP_READDIR);
      break;

    case SSH_SFTP_READDIR:
      rc = libssh2_sftp_readdir_ex(sshc->sftp_handle,
                                   sshc->readdir_filename,
                                   PATH_MAX,
                                   sshc->readdir_longentry,
                                   PATH_MAX,
                                   &sshc->readdir_attrs);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc > 0) {
        sshc->readdir_len = (size_t) rc;
        sshc->readdir_filename[sshc->readdir_len] = '\0';

        if(data->set.ftp_list_only) {
          char *tmpLine;

          tmpLine = aprintf("%s\n", sshc->readdir_filename);
          if(tmpLine == NULL) {
            state(conn, SSH_SFTP_CLOSE);
            sshc->actualcode = CURLE_OUT_OF_MEMORY;
            break;
          }
          result = Curl_client_write(conn, CLIENTWRITE_BODY,
                                     tmpLine, sshc->readdir_len + 1);
          free(tmpLine);

          if(result) {
            state(conn, SSH_STOP);
            break;
          }
          /* since this counts what we send to the client, we include the
             newline in this counter */
          data->req.bytecount += sshc->readdir_len + 1;

          /* output debug output if that is requested */
          if(data->set.verbose) {
            Curl_debug(data, CURLINFO_DATA_OUT, sshc->readdir_filename,
                       sshc->readdir_len);
          }
        }
        else {
          sshc->readdir_currLen = strlen(sshc->readdir_longentry);
          sshc->readdir_totalLen = 80 + sshc->readdir_currLen;
          sshc->readdir_line = calloc(sshc->readdir_totalLen, 1);
          if(!sshc->readdir_line) {
            Curl_safefree(sshc->readdir_filename);
            Curl_safefree(sshc->readdir_longentry);
            state(conn, SSH_SFTP_CLOSE);
            sshc->actualcode = CURLE_OUT_OF_MEMORY;
            break;
          }

          memcpy(sshc->readdir_line, sshc->readdir_longentry,
                 sshc->readdir_currLen);
          if((sshc->readdir_attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) &&
             ((sshc->readdir_attrs.permissions & LIBSSH2_SFTP_S_IFMT) ==
              LIBSSH2_SFTP_S_IFLNK)) {
            sshc->readdir_linkPath = malloc(PATH_MAX + 1);
            if(sshc->readdir_linkPath == NULL) {
              Curl_safefree(sshc->readdir_filename);
              Curl_safefree(sshc->readdir_longentry);
              state(conn, SSH_SFTP_CLOSE);
              sshc->actualcode = CURLE_OUT_OF_MEMORY;
              break;
            }

            msnprintf(sshc->readdir_linkPath, PATH_MAX, "%s%s", sftp_scp->path,
                      sshc->readdir_filename);
            state(conn, SSH_SFTP_READDIR_LINK);
            break;
          }
          state(conn, SSH_SFTP_READDIR_BOTTOM);
          break;
        }
      }
      else if(rc == 0) {
        Curl_safefree(sshc->readdir_filename);
        Curl_safefree(sshc->readdir_longentry);
        state(conn, SSH_SFTP_READDIR_DONE);
        break;
      }
      else if(rc < 0) {
        err = sftp_libssh2_last_error(sshc->sftp_session);
        result = sftp_libssh2_error_to_CURLE(err);
        sshc->actualcode = result?result:CURLE_SSH;
        failf(data, "Could not open remote file for reading: %s :: %d",
              sftp_libssh2_strerror(err),
              libssh2_session_last_errno(sshc->ssh_session));
        Curl_safefree(sshc->readdir_filename);
        Curl_safefree(sshc->readdir_longentry);
        state(conn, SSH_SFTP_CLOSE);
        break;
      }
      break;

    case SSH_SFTP_READDIR_LINK:
      rc =
        libssh2_sftp_symlink_ex(sshc->sftp_session,
                                sshc->readdir_linkPath,
                                curlx_uztoui(strlen(sshc->readdir_linkPath)),
                                sshc->readdir_filename,
                                PATH_MAX, LIBSSH2_SFTP_READLINK);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      sshc->readdir_len = (size_t) rc;
      Curl_safefree(sshc->readdir_linkPath);

      /* get room for the filename and extra output */
      sshc->readdir_totalLen += 4 + sshc->readdir_len;
      new_readdir_line = Curl_saferealloc(sshc->readdir_line,
                                          sshc->readdir_totalLen);
      if(!new_readdir_line) {
        sshc->readdir_line = NULL;
        Curl_safefree(sshc->readdir_filename);
        Curl_safefree(sshc->readdir_longentry);
        state(conn, SSH_SFTP_CLOSE);
        sshc->actualcode = CURLE_OUT_OF_MEMORY;
        break;
      }
      sshc->readdir_line = new_readdir_line;

      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
                                         sshc->readdir_currLen,
                                         sshc->readdir_totalLen -
                                         sshc->readdir_currLen,
                                         " -> %s",
                                         sshc->readdir_filename);

      state(conn, SSH_SFTP_READDIR_BOTTOM);
      break;

    case SSH_SFTP_READDIR_BOTTOM:
      sshc->readdir_currLen += msnprintf(sshc->readdir_line +
                                         sshc->readdir_currLen,
                                         sshc->readdir_totalLen -
                                         sshc->readdir_currLen, "\n");
      result = Curl_client_write(conn, CLIENTWRITE_BODY,
                                 sshc->readdir_line,
                                 sshc->readdir_currLen);

      if(!result) {

        /* output debug output if that is requested */
        if(data->set.verbose) {
          Curl_debug(data, CURLINFO_DATA_OUT, sshc->readdir_line,
                     sshc->readdir_currLen);
        }
        data->req.bytecount += sshc->readdir_currLen;
      }
      Curl_safefree(sshc->readdir_line);
      if(result) {
        state(conn, SSH_STOP);
      }
      else
        state(conn, SSH_SFTP_READDIR);
      break;

    case SSH_SFTP_READDIR_DONE:
      if(libssh2_sftp_closedir(sshc->sftp_handle) ==
         LIBSSH2_ERROR_EAGAIN) {
        rc = LIBSSH2_ERROR_EAGAIN;
        break;
      }
      sshc->sftp_handle = NULL;
      Curl_safefree(sshc->readdir_filename);
      Curl_safefree(sshc->readdir_longentry);

      /* no data to transfer */
      Curl_setup_transfer(data, -1, -1, FALSE, -1);
      state(conn, SSH_STOP);
      break;

    case SSH_SFTP_DOWNLOAD_INIT:
      /*
       * Work on getting the specified file
       */
      sshc->sftp_handle =
        libssh2_sftp_open_ex(sshc->sftp_session, sftp_scp->path,
                             curlx_uztoui(strlen(sftp_scp->path)),
                             LIBSSH2_FXF_READ, data->set.new_file_perms,
                             LIBSSH2_SFTP_OPENFILE);
      if(!sshc->sftp_handle) {
        if(libssh2_session_last_errno(sshc->ssh_session) ==
           LIBSSH2_ERROR_EAGAIN) {
          rc = LIBSSH2_ERROR_EAGAIN;
          break;
        }
        err = sftp_libssh2_last_error(sshc->sftp_session);
        failf(data, "Could not open remote file for reading: %s",
              sftp_libssh2_strerror(err));
        state(conn, SSH_SFTP_CLOSE);
        result = sftp_libssh2_error_to_CURLE(err);
        sshc->actualcode = result?result:CURLE_SSH;
        break;
      }
      state(conn, SSH_SFTP_DOWNLOAD_STAT);
      break;

    case SSH_SFTP_DOWNLOAD_STAT:
    {
      LIBSSH2_SFTP_ATTRIBUTES attrs;

      rc = libssh2_sftp_stat_ex(sshc->sftp_session, sftp_scp->path,
                                curlx_uztoui(strlen(sftp_scp->path)),
                                LIBSSH2_SFTP_STAT, &attrs);
      if(rc == LIBSSH2_ERROR_EAGAIN) {
        break;
      }
      if(rc ||
         !(attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) ||
         (attrs.filesize == 0)) {
        /*
         * libssh2_sftp_open() didn't return an error, so maybe the server
         * just doesn't support stat()
         * OR the server doesn't return a file size with a stat()
         * OR file size is 0
         */
        data->req.size = -1;
        data->req.maxdownload = -1;
        Curl_pgrsSetDownloadSize(data, -1);
      }
      else {
        curl_off_t size = attrs.filesize;

        if(size < 0) {
          failf(data, "Bad file size (%" CURL_FORMAT_CURL_OFF_T ")", size);
          return CURLE_BAD_DOWNLOAD_RESUME;
        }
        if(conn->data->state.use_range) {
          curl_off_t from, to;
          char *ptr;
          char *ptr2;
          CURLofft to_t;
          CURLofft from_t;

          from_t = curlx_strtoofft(conn->data->state.range, &ptr, 0, &from);
          if(from_t == CURL_OFFT_FLOW)
            return CURLE_RANGE_ERROR;
          while(*ptr && (ISSPACE(*ptr) || (*ptr == '-')))
            ptr++;
          to_t = curlx_strtoofft(ptr, &ptr2, 0, &to);
          if(to_t == CURL_OFFT_FLOW)
            return CURLE_RANGE_ERROR;
          if((to_t == CURL_OFFT_INVAL) /* no "to" value given */
             || (to >= size)) {
            to = size - 1;
          }
          if(from_t) {
            /* from is relative to end of file */
            from = size - to;
            to = size - 1;
          }
          if(from > size) {
            failf(data, "Offset (%"
                  CURL_FORMAT_CURL_OFF_T ") was beyond file size (%"
                  CURL_FORMAT_CURL_OFF_T ")", from, attrs.filesize);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
          if(from > to) {
            from = to;
            size = 0;
          }
          else {
            size = to - from + 1;
          }

          SFTP_SEEK(conn->proto.sshc.sftp_handle, from);
        }
        data->req.size = size;
        data->req.maxdownload = size;
        Curl_pgrsSetDownloadSize(data, size);
      }

      /* We can resume if we can seek to the resume position */
      if(data->state.resume_from) {
        if(data->state.resume_from < 0) {
          /* We're supposed to download the last abs(from) bytes */
          if((curl_off_t)attrs.filesize < -data->state.resume_from) {
            failf(data, "Offset (%"
                  CURL_FORMAT_CURL_OFF_T ") was beyond file size (%"
                  CURL_FORMAT_CURL_OFF_T ")",
                  data->state.resume_from, attrs.filesize);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
          /* download from where? */
          data->state.resume_from += attrs.filesize;
        }
        else {
          if((curl_off_t)attrs.filesize < data->state.resume_from) {
            failf(data, "Offset (%" CURL_FORMAT_CURL_OFF_T
                  ") was beyond file size (%" CURL_FORMAT_CURL_OFF_T ")",
                  data->state.resume_from, attrs.filesize);
            return CURLE_BAD_DOWNLOAD_RESUME;
          }
        }
        /* Does a completed file need to be seeked and started or closed ? */
        /* Now store the number of bytes we are expected to download */
        data->req.size = attrs.filesize - data->state.resume_from;
        data->req.maxdownload = attrs.filesize - data->state.resume_from;
        Curl_pgrsSetDownloadSize(data,
                                 attrs.filesize - data->state.resume_from);
        SFTP_SEEK(sshc->sftp_handle, data->state.resume_from);
      }
    }

    /* Setup the actual download */
    if(data->req.size == 0) {
      /* no data to transfer */
      Curl_setup_transfer(data, -1, -1, FALSE, -1);
      infof(data, "File already completely downloaded\n");
      state(conn, SSH_STOP);
      break;
    }
    Curl_setup_transfer(data, FIRSTSOCKET, data->req.size, FALSE, -1);

    /* not set by Curl_setup_transfer to preserve keepon bits */
    conn->writesockfd = conn->sockfd;

    /* we want to use the _receiving_ function even when the socket turns
       out writableable as the underlying libssh2 recv function will deal
       with both accordingly */
    conn->cselect_bits = CURL_CSELECT_IN;

    if(result) {
      /* this should never occur; the close state should be entered
         at the time the error occurs */
      state(conn, SSH_SFTP_CLOSE);
      sshc->actualcode = result;
    }
    else {
      state(conn, SSH_STOP);
    }
    break;

    case SSH_SFTP_CLOSE:
      if(sshc->sftp_handle) {
        rc = libssh2_sftp_close(sshc->sftp_handle);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to close libssh2 file: %d %s\n", rc, err_msg);
        }
        sshc->sftp_handle = NULL;
      }

      Curl_safefree(sftp_scp->path);

      DEBUGF(infof(data, "SFTP DONE done\n"));

      /* Check if nextstate is set and move .nextstate could be POSTQUOTE_INIT
         After nextstate is executed, the control should come back to
         SSH_SFTP_CLOSE to pass the correct result back  */
      if(sshc->nextstate != SSH_NO_STATE &&
         sshc->nextstate != SSH_SFTP_CLOSE) {
        state(conn, sshc->nextstate);
        sshc->nextstate = SSH_SFTP_CLOSE;
      }
      else {
        state(conn, SSH_STOP);
        result = sshc->actualcode;
      }
      break;

    case SSH_SFTP_SHUTDOWN:
      /* during times we get here due to a broken transfer and then the
         sftp_handle might not have been taken down so make sure that is done
         before we proceed */

      if(sshc->sftp_handle) {
        rc = libssh2_sftp_close(sshc->sftp_handle);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session, &err_msg,
                                           NULL, 0);
          infof(data, "Failed to close libssh2 file: %d %s\n", rc, err_msg);
        }
        sshc->sftp_handle = NULL;
      }
      if(sshc->sftp_session) {
        rc = libssh2_sftp_shutdown(sshc->sftp_session);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          infof(data, "Failed to stop libssh2 sftp subsystem\n");
        }
        sshc->sftp_session = NULL;
      }

      Curl_safefree(sshc->homedir);
      conn->data->state.most_recent_ftp_entrypath = NULL;

      state(conn, SSH_SESSION_DISCONNECT);
      break;

    case SSH_SCP_TRANS_INIT:
      result = Curl_getworkingpath(conn, sshc->homedir, &sftp_scp->path);
      if(result) {
        sshc->actualcode = result;
        state(conn, SSH_STOP);
        break;
      }

      if(data->set.upload) {
        if(data->state.infilesize < 0) {
          failf(data, "SCP requires a known file size for upload");
          sshc->actualcode = CURLE_UPLOAD_FAILED;
          state(conn, SSH_SCP_CHANNEL_FREE);
          break;
        }
        state(conn, SSH_SCP_UPLOAD_INIT);
      }
      else {
        state(conn, SSH_SCP_DOWNLOAD_INIT);
      }
      break;

    case SSH_SCP_UPLOAD_INIT:
      /*
       * libssh2 requires that the destination path is a full path that
       * includes the destination file and name OR ends in a "/" .  If this is
       * not done the destination file will be named the same name as the last
       * directory in the path.
       */
      sshc->ssh_channel =
        SCP_SEND(sshc->ssh_session, sftp_scp->path, data->set.new_file_perms,
                 data->state.infilesize);
      if(!sshc->ssh_channel) {
        int ssh_err;
        char *err_msg = NULL;

        if(libssh2_session_last_errno(sshc->ssh_session) ==
           LIBSSH2_ERROR_EAGAIN) {
          rc = LIBSSH2_ERROR_EAGAIN;
          break;
        }

        ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
                                                   &err_msg, NULL, 0));
        failf(conn->data, "%s", err_msg);
        state(conn, SSH_SCP_CHANNEL_FREE);
        sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
        /* Map generic errors to upload failed */
        if(sshc->actualcode == CURLE_SSH ||
           sshc->actualcode == CURLE_REMOTE_FILE_NOT_FOUND)
          sshc->actualcode = CURLE_UPLOAD_FAILED;
        break;
      }

      /* upload data */
      Curl_setup_transfer(data, -1, data->req.size, FALSE, FIRSTSOCKET);

      /* not set by Curl_setup_transfer to preserve keepon bits */
      conn->sockfd = conn->writesockfd;

      if(result) {
        state(conn, SSH_SCP_CHANNEL_FREE);
        sshc->actualcode = result;
      }
      else {
        /* store this original bitmask setup to use later on if we can't
           figure out a "real" bitmask */
        sshc->orig_waitfor = data->req.keepon;

        /* we want to use the _sending_ function even when the socket turns
           out readable as the underlying libssh2 scp send function will deal
           with both accordingly */
        conn->cselect_bits = CURL_CSELECT_OUT;

        state(conn, SSH_STOP);
      }
      break;

    case SSH_SCP_DOWNLOAD_INIT:
    {
      curl_off_t bytecount;

      /*
       * We must check the remote file; if it is a directory no values will
       * be set in sb
       */

      /*
       * If support for >2GB files exists, use it.
       */

      /* get a fresh new channel from the ssh layer */
#if LIBSSH2_VERSION_NUM < 0x010700
      struct stat sb;
      memset(&sb, 0, sizeof(struct stat));
      sshc->ssh_channel = libssh2_scp_recv(sshc->ssh_session,
                                           sftp_scp->path, &sb);
#else
      libssh2_struct_stat sb;
      memset(&sb, 0, sizeof(libssh2_struct_stat));
      sshc->ssh_channel = libssh2_scp_recv2(sshc->ssh_session,
                                            sftp_scp->path, &sb);
#endif

      if(!sshc->ssh_channel) {
        int ssh_err;
        char *err_msg = NULL;

        if(libssh2_session_last_errno(sshc->ssh_session) ==
           LIBSSH2_ERROR_EAGAIN) {
          rc = LIBSSH2_ERROR_EAGAIN;
          break;
        }


        ssh_err = (int)(libssh2_session_last_error(sshc->ssh_session,
                                                   &err_msg, NULL, 0));
        failf(conn->data, "%s", err_msg);
        state(conn, SSH_SCP_CHANNEL_FREE);
        sshc->actualcode = libssh2_session_error_to_CURLE(ssh_err);
        break;
      }

      /* download data */
      bytecount = (curl_off_t)sb.st_size;
      data->req.maxdownload =  (curl_off_t)sb.st_size;
      Curl_setup_transfer(data, FIRSTSOCKET, bytecount, FALSE, -1);

      /* not set by Curl_setup_transfer to preserve keepon bits */
      conn->writesockfd = conn->sockfd;

      /* we want to use the _receiving_ function even when the socket turns
         out writableable as the underlying libssh2 recv function will deal
         with both accordingly */
      conn->cselect_bits = CURL_CSELECT_IN;

      if(result) {
        state(conn, SSH_SCP_CHANNEL_FREE);
        sshc->actualcode = result;
      }
      else
        state(conn, SSH_STOP);
    }
    break;

    case SSH_SCP_DONE:
      if(data->set.upload)
        state(conn, SSH_SCP_SEND_EOF);
      else
        state(conn, SSH_SCP_CHANNEL_FREE);
      break;

    case SSH_SCP_SEND_EOF:
      if(sshc->ssh_channel) {
        rc = libssh2_channel_send_eof(sshc->ssh_channel);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to send libssh2 channel EOF: %d %s\n",
                rc, err_msg);
        }
      }
      state(conn, SSH_SCP_WAIT_EOF);
      break;

    case SSH_SCP_WAIT_EOF:
      if(sshc->ssh_channel) {
        rc = libssh2_channel_wait_eof(sshc->ssh_channel);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to get channel EOF: %d %s\n", rc, err_msg);
        }
      }
      state(conn, SSH_SCP_WAIT_CLOSE);
      break;

    case SSH_SCP_WAIT_CLOSE:
      if(sshc->ssh_channel) {
        rc = libssh2_channel_wait_closed(sshc->ssh_channel);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Channel failed to close: %d %s\n", rc, err_msg);
        }
      }
      state(conn, SSH_SCP_CHANNEL_FREE);
      break;

    case SSH_SCP_CHANNEL_FREE:
      if(sshc->ssh_channel) {
        rc = libssh2_channel_free(sshc->ssh_channel);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to free libssh2 scp subsystem: %d %s\n",
                rc, err_msg);
        }
        sshc->ssh_channel = NULL;
      }
      DEBUGF(infof(data, "SCP DONE phase complete\n"));
#if 0 /* PREV */
      state(conn, SSH_SESSION_DISCONNECT);
#endif
      state(conn, SSH_STOP);
      result = sshc->actualcode;
      break;

    case SSH_SESSION_DISCONNECT:
      /* during weird times when we've been prematurely aborted, the channel
         is still alive when we reach this state and we MUST kill the channel
         properly first */
      if(sshc->ssh_channel) {
        rc = libssh2_channel_free(sshc->ssh_channel);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to free libssh2 scp subsystem: %d %s\n",
                rc, err_msg);
        }
        sshc->ssh_channel = NULL;
      }

      if(sshc->ssh_session) {
        rc = libssh2_session_disconnect(sshc->ssh_session, "Shutdown");
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to disconnect libssh2 session: %d %s\n",
                rc, err_msg);
        }
      }

      Curl_safefree(sshc->homedir);
      conn->data->state.most_recent_ftp_entrypath = NULL;

      state(conn, SSH_SESSION_FREE);
      break;

    case SSH_SESSION_FREE:
#ifdef HAVE_LIBSSH2_KNOWNHOST_API
      if(sshc->kh) {
        libssh2_knownhost_free(sshc->kh);
        sshc->kh = NULL;
      }
#endif

#ifdef HAVE_LIBSSH2_AGENT_API
      if(sshc->ssh_agent) {
        rc = libssh2_agent_disconnect(sshc->ssh_agent);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to disconnect from libssh2 agent: %d %s\n",
                rc, err_msg);
        }
        libssh2_agent_free(sshc->ssh_agent);
        sshc->ssh_agent = NULL;

        /* NB: there is no need to free identities, they are part of internal
           agent stuff */
        sshc->sshagent_identity = NULL;
        sshc->sshagent_prev_identity = NULL;
      }
#endif

      if(sshc->ssh_session) {
        rc = libssh2_session_free(sshc->ssh_session);
        if(rc == LIBSSH2_ERROR_EAGAIN) {
          break;
        }
        if(rc < 0) {
          char *err_msg = NULL;
          (void)libssh2_session_last_error(sshc->ssh_session,
                                           &err_msg, NULL, 0);
          infof(data, "Failed to free libssh2 session: %d %s\n", rc, err_msg);
        }
        sshc->ssh_session = NULL;
      }

      /* worst-case scenario cleanup */

      DEBUGASSERT(sshc->ssh_session == NULL);
      DEBUGASSERT(sshc->ssh_channel == NULL);
      DEBUGASSERT(sshc->sftp_session == NULL);
      DEBUGASSERT(sshc->sftp_handle == NULL);
#ifdef HAVE_LIBSSH2_KNOWNHOST_API
      DEBUGASSERT(sshc->kh == NULL);
#endif
#ifdef HAVE_LIBSSH2_AGENT_API
      DEBUGASSERT(sshc->ssh_agent == NULL);
#endif

      Curl_safefree(sshc->rsa_pub);
      Curl_safefree(sshc->rsa);

      Curl_safefree(sshc->quote_path1);
      Curl_safefree(sshc->quote_path2);

      Curl_safefree(sshc->homedir);

      Curl_safefree(sshc->readdir_filename);
      Curl_safefree(sshc->readdir_longentry);
      Curl_safefree(sshc->readdir_line);
      Curl_safefree(sshc->readdir_linkPath);

      /* the code we are about to return */
      result = sshc->actualcode;

      memset(sshc, 0, sizeof(struct ssh_conn));

      connclose(conn, "SSH session free");
      sshc->state = SSH_SESSION_FREE; /* current */
      sshc->nextstate = SSH_NO_STATE;
      state(conn, SSH_STOP);
      break;

    case SSH_QUIT:
      /* fallthrough, just stop! */
    default:
      /* internal error */
      sshc->nextstate = SSH_NO_STATE;
      state(conn, SSH_STOP);
      break;
    }

  } while(!rc && (sshc->state != SSH_STOP));

  if(rc == LIBSSH2_ERROR_EAGAIN) {
    /* we would block, we need to wait for the socket to be ready (in the
       right direction too)! */
    *block = TRUE;
  }

  return result;
}

/* called by the multi interface to figure out what socket(s) to wait for and
   for what actions in the DO_DONE, PERFORM and WAITPERFORM states */
static int ssh_perform_getsock(const struct connectdata *conn,
                               curl_socket_t *sock)
{
#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
  int bitmap = GETSOCK_BLANK;

  sock[0] = conn->sock[FIRSTSOCKET];

  if(conn->waitfor & KEEP_RECV)
    bitmap |= GETSOCK_READSOCK(FIRSTSOCKET);

  if(conn->waitfor & KEEP_SEND)
    bitmap |= GETSOCK_WRITESOCK(FIRSTSOCKET);

  return bitmap;
#else
  /* if we don't know the direction we can use the generic *_getsock()
     function even for the protocol_connect and doing states */
  return Curl_single_getsock(conn, sock);
#endif
}

/* Generic function called by the multi interface to figure out what socket(s)
   to wait for and for what actions during the DOING and PROTOCONNECT states*/
static int ssh_getsock(struct connectdata *conn,
                       curl_socket_t *sock)
{
#ifndef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
  (void)conn;
  (void)sock;
  /* if we don't know any direction we can just play along as we used to and
     not provide any sensible info */
  return GETSOCK_BLANK;
#else
  /* if we know the direction we can use the generic *_getsock() function even
     for the protocol_connect and doing states */
  return ssh_perform_getsock(conn, sock);
#endif
}

#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
/*
 * When one of the libssh2 functions has returned LIBSSH2_ERROR_EAGAIN this
 * function is used to figure out in what direction and stores this info so
 * that the multi interface can take advantage of it. Make sure to call this
 * function in all cases so that when it _doesn't_ return EAGAIN we can
 * restore the default wait bits.
 */
static void ssh_block2waitfor(struct connectdata *conn, bool block)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  int dir = 0;
  if(block) {
    dir = libssh2_session_block_directions(sshc->ssh_session);
    if(dir) {
      /* translate the libssh2 define bits into our own bit defines */
      conn->waitfor = ((dir&LIBSSH2_SESSION_BLOCK_INBOUND)?KEEP_RECV:0) |
        ((dir&LIBSSH2_SESSION_BLOCK_OUTBOUND)?KEEP_SEND:0);
    }
  }
  if(!dir)
    /* It didn't block or libssh2 didn't reveal in which direction, put back
       the original set */
    conn->waitfor = sshc->orig_waitfor;
}
#else
  /* no libssh2 directional support so we simply don't know */
#define ssh_block2waitfor(x,y) Curl_nop_stmt
#endif

/* called repeatedly until done from multi.c */
static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  CURLcode result = CURLE_OK;
  bool block; /* we store the status and use that to provide a ssh_getsock()
                 implementation */
  do {
    result = ssh_statemach_act(conn, &block);
    *done = (sshc->state == SSH_STOP) ? TRUE : FALSE;
    /* if there's no error, it isn't done and it didn't EWOULDBLOCK, then
       try again */
  } while(!result && !*done && !block);
  ssh_block2waitfor(conn, block);

  return result;
}

static CURLcode ssh_block_statemach(struct connectdata *conn,
                                    bool disconnect)
{
  struct ssh_conn *sshc = &conn->proto.sshc;
  CURLcode result = CURLE_OK;
  struct Curl_easy *data = conn->data;

  while((sshc->state != SSH_STOP) && !result) {
    bool block;
    timediff_t left = 1000;
    struct curltime now = Curl_now();

    result = ssh_statemach_act(conn, &block);
    if(result)
      break;

    if(!disconnect) {
      if(Curl_pgrsUpdate(conn))
        return CURLE_ABORTED_BY_CALLBACK;

      result = Curl_speedcheck(data, now);
      if(result)
        break;

      left = Curl_timeleft(data, NULL, FALSE);
      if(left < 0) {
        failf(data, "Operation timed out");
        return CURLE_OPERATION_TIMEDOUT;
      }
    }

#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
    if(!result && block) {
      int dir = libssh2_session_block_directions(sshc->ssh_session);
      curl_socket_t sock = conn->sock[FIRSTSOCKET];
      curl_socket_t fd_read = CURL_SOCKET_BAD;
      curl_socket_t fd_write = CURL_SOCKET_BAD;
      if(LIBSSH2_SESSION_BLOCK_INBOUND & dir)
        fd_read = sock;
      if(LIBSSH2_SESSION_BLOCK_OUTBOUND & dir)
        fd_write = sock;
      /* wait for the socket to become ready */
      (void)Curl_socket_check(fd_read, CURL_SOCKET_BAD, fd_write,
                              left>1000?1000:left); /* ignore result */
    }
#endif

  }

  return result;
}

/*
 * SSH setup and connection
 */
static CURLcode ssh_setup_connection(struct connectdata *conn)
{
  struct SSHPROTO *ssh;

  conn->data->req.protop = ssh = calloc(1, sizeof(struct SSHPROTO));
  if(!ssh)
    return CURLE_OUT_OF_MEMORY;

  return CURLE_OK;
}

static Curl_recv scp_recv, sftp_recv;
static Curl_send scp_send, sftp_send;

/*
 * Curl_ssh_connect() gets called from Curl_protocol_connect() to allow us to
 * do protocol-specific actions at connect-time.
 */
static CURLcode ssh_connect(struct connectdata *conn, bool *done)
{
#ifdef CURL_LIBSSH2_DEBUG
  curl_socket_t sock;
#endif
  struct ssh_conn *ssh;
  CURLcode result;
  struct Curl_easy *data = conn->data;

  /* initialize per-handle data if not already */
  if(!data->req.protop)
    ssh_setup_connection(conn);

  /* We default to persistent connections. We set this already in this connect
     function to make the re-use checks properly be able to check this bit. */
  connkeep(conn, "SSH default");

  if(conn->handler->protocol & CURLPROTO_SCP) {
    conn->recv[FIRSTSOCKET] = scp_recv;
    conn->send[FIRSTSOCKET] = scp_send;
  }
  else {
    conn->recv[FIRSTSOCKET] = sftp_recv;
    conn->send[FIRSTSOCKET] = sftp_send;
  }
  ssh = &conn->proto.sshc;

#ifdef CURL_LIBSSH2_DEBUG
  if(conn->user) {
    infof(data, "User: %s\n", conn->user);
  }
  if(conn->passwd) {
    infof(data, "Password: %s\n", conn->passwd);
  }
  sock = conn->sock[FIRSTSOCKET];
#endif /* CURL_LIBSSH2_DEBUG */

  ssh->ssh_session = libssh2_session_init_ex(my_libssh2_malloc,
                                             my_libssh2_free,
                                             my_libssh2_realloc, conn);
  if(ssh->ssh_session == NULL) {
    failf(data, "Failure initialising ssh session");
    return CURLE_FAILED_INIT;
  }

  if(data->set.ssh_compression) {
#if LIBSSH2_VERSION_NUM >= 0x010208
    if(libssh2_session_flag(ssh->ssh_session, LIBSSH2_FLAG_COMPRESS, 1) < 0)
#endif
      infof(data, "Failed to enable compression for ssh session\n");
  }

#ifdef HAVE_LIBSSH2_KNOWNHOST_API
  if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
    int rc;
    ssh->kh = libssh2_knownhost_init(ssh->ssh_session);
    if(!ssh->kh) {
      libssh2_session_free(ssh->ssh_session);
      return CURLE_FAILED_INIT;
    }

    /* read all known hosts from there */
    rc = libssh2_knownhost_readfile(ssh->kh,
                                    data->set.str[STRING_SSH_KNOWNHOSTS],
                                    LIBSSH2_KNOWNHOST_FILE_OPENSSH);
    if(rc < 0)
      infof(data, "Failed to read known hosts from %s\n",
            data->set.str[STRING_SSH_KNOWNHOSTS]);
  }
#endif /* HAVE_LIBSSH2_KNOWNHOST_API */

#ifdef CURL_LIBSSH2_DEBUG
  libssh2_trace(ssh->ssh_session, ~0);
  infof(data, "SSH socket: %d\n", (int)sock);
#endif /* CURL_LIBSSH2_DEBUG */

  state(conn, SSH_INIT);

  result = ssh_multi_statemach(conn, done);

  return result;
}

/*
 ***********************************************************************
 *
 * scp_perform()
 *
 * This is the actual DO function for SCP. Get a file according to
 * the options previously setup.
 */

static
CURLcode scp_perform(struct connectdata *conn,
                      bool *connected,
                      bool *dophase_done)
{
  CURLcode result = CURLE_OK;

  DEBUGF(infof(conn->data, "DO phase starts\n"));

  *dophase_done = FALSE; /* not done yet */

  /* start the first command in the DO phase */
  state(conn, SSH_SCP_TRANS_INIT);

  /* run the state-machine */
  result = ssh_multi_statemach(conn, dophase_done);

  *connected = conn->bits.tcpconnect[FIRSTSOCKET];

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }

  return result;
}

/* called from multi.c while DOing */
static CURLcode scp_doing(struct connectdata *conn,
                               bool *dophase_done)
{
  CURLcode result;
  result = ssh_multi_statemach(conn, dophase_done);

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }
  return result;
}

/*
 * The DO function is generic for both protocols. There was previously two
 * separate ones but this way means less duplicated code.
 */

static CURLcode ssh_do(struct connectdata *conn, bool *done)
{
  CURLcode result;
  bool connected = 0;
  struct Curl_easy *data = conn->data;
  struct ssh_conn *sshc = &conn->proto.sshc;

  *done = FALSE; /* default to false */

  data->req.size = -1; /* make sure this is unknown at this point */

  sshc->actualcode = CURLE_OK; /* reset error code */
  sshc->secondCreateDirs = 0;   /* reset the create dir attempt state
                                   variable */

  Curl_pgrsSetUploadCounter(data, 0);
  Curl_pgrsSetDownloadCounter(data, 0);
  Curl_pgrsSetUploadSize(data, -1);
  Curl_pgrsSetDownloadSize(data, -1);

  if(conn->handler->protocol & CURLPROTO_SCP)
    result = scp_perform(conn, &connected,  done);
  else
    result = sftp_perform(conn, &connected,  done);

  return result;
}

/* BLOCKING, but the function is using the state machine so the only reason
   this is still blocking is that the multi interface code has no support for
   disconnecting operations that takes a while */
static CURLcode scp_disconnect(struct connectdata *conn, bool dead_connection)
{
  CURLcode result = CURLE_OK;
  struct ssh_conn *ssh = &conn->proto.sshc;
  (void) dead_connection;

  if(ssh->ssh_session) {
    /* only if there's a session still around to use! */

    state(conn, SSH_SESSION_DISCONNECT);

    result = ssh_block_statemach(conn, TRUE);
  }

  return result;
}

/* generic done function for both SCP and SFTP called from their specific
   done functions */
static CURLcode ssh_done(struct connectdata *conn, CURLcode status)
{
  CURLcode result = CURLE_OK;
  struct SSHPROTO *sftp_scp = conn->data->req.protop;

  if(!status) {
    /* run the state-machine */
    result = ssh_block_statemach(conn, FALSE);
  }
  else
    result = status;

  if(sftp_scp)
    Curl_safefree(sftp_scp->path);
  if(Curl_pgrsDone(conn))
    return CURLE_ABORTED_BY_CALLBACK;

  conn->data->req.keepon = 0; /* clear all bits */
  return result;
}


static CURLcode scp_done(struct connectdata *conn, CURLcode status,
                         bool premature)
{
  (void)premature; /* not used */

  if(!status)
    state(conn, SSH_SCP_DONE);

  return ssh_done(conn, status);

}

static ssize_t scp_send(struct connectdata *conn, int sockindex,
                        const void *mem, size_t len, CURLcode *err)
{
  ssize_t nwrite;
  (void)sockindex; /* we only support SCP on the fixed known primary socket */

  /* libssh2_channel_write() returns int! */
  nwrite = (ssize_t)
    libssh2_channel_write(conn->proto.sshc.ssh_channel, mem, len);

  ssh_block2waitfor(conn, (nwrite == LIBSSH2_ERROR_EAGAIN)?TRUE:FALSE);

  if(nwrite == LIBSSH2_ERROR_EAGAIN) {
    *err = CURLE_AGAIN;
    nwrite = 0;
  }
  else if(nwrite < LIBSSH2_ERROR_NONE) {
    *err = libssh2_session_error_to_CURLE((int)nwrite);
    nwrite = -1;
  }

  return nwrite;
}

static ssize_t scp_recv(struct connectdata *conn, int sockindex,
                        char *mem, size_t len, CURLcode *err)
{
  ssize_t nread;
  (void)sockindex; /* we only support SCP on the fixed known primary socket */

  /* libssh2_channel_read() returns int */
  nread = (ssize_t)
    libssh2_channel_read(conn->proto.sshc.ssh_channel, mem, len);

  ssh_block2waitfor(conn, (nread == LIBSSH2_ERROR_EAGAIN)?TRUE:FALSE);
  if(nread == LIBSSH2_ERROR_EAGAIN) {
    *err = CURLE_AGAIN;
    nread = -1;
  }

  return nread;
}

/*
 * =============== SFTP ===============
 */

/*
 ***********************************************************************
 *
 * sftp_perform()
 *
 * This is the actual DO function for SFTP. Get a file/directory according to
 * the options previously setup.
 */

static
CURLcode sftp_perform(struct connectdata *conn,
                      bool *connected,
                      bool *dophase_done)
{
  CURLcode result = CURLE_OK;

  DEBUGF(infof(conn->data, "DO phase starts\n"));

  *dophase_done = FALSE; /* not done yet */

  /* start the first command in the DO phase */
  state(conn, SSH_SFTP_QUOTE_INIT);

  /* run the state-machine */
  result = ssh_multi_statemach(conn, dophase_done);

  *connected = conn->bits.tcpconnect[FIRSTSOCKET];

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }

  return result;
}

/* called from multi.c while DOing */
static CURLcode sftp_doing(struct connectdata *conn,
                           bool *dophase_done)
{
  CURLcode result = ssh_multi_statemach(conn, dophase_done);

  if(*dophase_done) {
    DEBUGF(infof(conn->data, "DO phase is complete\n"));
  }
  return result;
}

/* BLOCKING, but the function is using the state machine so the only reason
   this is still blocking is that the multi interface code has no support for
   disconnecting operations that takes a while */
static CURLcode sftp_disconnect(struct connectdata *conn, bool dead_connection)
{
  CURLcode result = CURLE_OK;
  (void) dead_connection;

  DEBUGF(infof(conn->data, "SSH DISCONNECT starts now\n"));

  if(conn->proto.sshc.ssh_session) {
    /* only if there's a session still around to use! */
    state(conn, SSH_SFTP_SHUTDOWN);
    result = ssh_block_statemach(conn, TRUE);
  }

  DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));

  return result;

}

static CURLcode sftp_done(struct connectdata *conn, CURLcode status,
                               bool premature)
{
  struct ssh_conn *sshc = &conn->proto.sshc;

  if(!status) {
    /* Post quote commands are executed after the SFTP_CLOSE state to avoid
       errors that could happen due to open file handles during POSTQUOTE
       operation */
    if(!premature && conn->data->set.postquote && !conn->bits.retry)
      sshc->nextstate = SSH_SFTP_POSTQUOTE_INIT;
    state(conn, SSH_SFTP_CLOSE);
  }
  return ssh_done(conn, status);
}

/* return number of sent bytes */
static ssize_t sftp_send(struct connectdata *conn, int sockindex,
                         const void *mem, size_t len, CURLcode *err)
{
  ssize_t nwrite;   /* libssh2_sftp_write() used to return size_t in 0.14
                       but is changed to ssize_t in 0.15. These days we don't
                       support libssh2 0.15*/
  (void)sockindex;

  nwrite = libssh2_sftp_write(conn->proto.sshc.sftp_handle, mem, len);

  ssh_block2waitfor(conn, (nwrite == LIBSSH2_ERROR_EAGAIN)?TRUE:FALSE);

  if(nwrite == LIBSSH2_ERROR_EAGAIN) {
    *err = CURLE_AGAIN;
    nwrite = 0;
  }
  else if(nwrite < LIBSSH2_ERROR_NONE) {
    *err = libssh2_session_error_to_CURLE((int)nwrite);
    nwrite = -1;
  }

  return nwrite;
}

/*
 * Return number of received (decrypted) bytes
 * or <0 on error
 */
static ssize_t sftp_recv(struct connectdata *conn, int sockindex,
                         char *mem, size_t len, CURLcode *err)
{
  ssize_t nread;
  (void)sockindex;

  nread = libssh2_sftp_read(conn->proto.sshc.sftp_handle, mem, len);

  ssh_block2waitfor(conn, (nread == LIBSSH2_ERROR_EAGAIN)?TRUE:FALSE);

  if(nread == LIBSSH2_ERROR_EAGAIN) {
    *err = CURLE_AGAIN;
    nread = -1;

  }
  else if(nread < 0) {
    *err = libssh2_session_error_to_CURLE((int)nread);
  }
  return nread;
}

static const char *sftp_libssh2_strerror(int err)
{
  switch(err) {
    case LIBSSH2_FX_NO_SUCH_FILE:
      return "No such file or directory";

    case LIBSSH2_FX_PERMISSION_DENIED:
      return "Permission denied";

    case LIBSSH2_FX_FAILURE:
      return "Operation failed";

    case LIBSSH2_FX_BAD_MESSAGE:
      return "Bad message from SFTP server";

    case LIBSSH2_FX_NO_CONNECTION:
      return "Not connected to SFTP server";

    case LIBSSH2_FX_CONNECTION_LOST:
      return "Connection to SFTP server lost";

    case LIBSSH2_FX_OP_UNSUPPORTED:
      return "Operation not supported by SFTP server";

    case LIBSSH2_FX_INVALID_HANDLE:
      return "Invalid handle";

    case LIBSSH2_FX_NO_SUCH_PATH:
      return "No such file or directory";

    case LIBSSH2_FX_FILE_ALREADY_EXISTS:
      return "File already exists";

    case LIBSSH2_FX_WRITE_PROTECT:
      return "File is write protected";

    case LIBSSH2_FX_NO_MEDIA:
      return "No media";

    case LIBSSH2_FX_NO_SPACE_ON_FILESYSTEM:
      return "Disk full";

    case LIBSSH2_FX_QUOTA_EXCEEDED:
      return "User quota exceeded";

    case LIBSSH2_FX_UNKNOWN_PRINCIPLE:
      return "Unknown principle";

    case LIBSSH2_FX_LOCK_CONFlICT:
      return "File lock conflict";

    case LIBSSH2_FX_DIR_NOT_EMPTY:
      return "Directory not empty";

    case LIBSSH2_FX_NOT_A_DIRECTORY:
      return "Not a directory";

    case LIBSSH2_FX_INVALID_FILENAME:
      return "Invalid filename";

    case LIBSSH2_FX_LINK_LOOP:
      return "Link points to itself";
  }
  return "Unknown error in libssh2";
}

CURLcode Curl_ssh_init(void)
{
#ifdef HAVE_LIBSSH2_INIT
  if(libssh2_init(0)) {
    DEBUGF(fprintf(stderr, "Error: libssh2_init failed\n"));
    return CURLE_FAILED_INIT;
  }
#endif
  return CURLE_OK;
}

void Curl_ssh_cleanup(void)
{
#ifdef HAVE_LIBSSH2_EXIT
  (void)libssh2_exit();
#endif
}

size_t Curl_ssh_version(char *buffer, size_t buflen)
{
  return msnprintf(buffer, buflen, "libssh2/%s", LIBSSH2_VERSION);
}

#endif /* USE_LIBSSH2 */
Changes to jni/curl/lib/vtls/mesalink.c.
68
69
70
71
72
73
74











75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  SSL *handle;
};

#define BACKEND connssl->backend

static Curl_recv mesalink_recv;
static Curl_send mesalink_send;












/*
 * This function loads all the client/CA certificates and CRLs. Setup the TLS
 * layer and do all necessary magic.
 */
static CURLcode
mesalink_connect_step1(struct connectdata *conn, int sockindex)
{
  char *ciphers;
  struct Curl_easy *data = conn->data;
  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
  const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
  const char *const ssl_cafile = SSL_CONN_CONFIG(CAfile);
  const char *const ssl_capath = SSL_CONN_CONFIG(CApath);
  struct in_addr addr4;
#ifdef ENABLE_IPV6
  struct in6_addr addr6;
#endif
  const char *const hostname =
    SSL_IS_PROXY() ? conn->http_proxy.host.name : conn->host.name;
  size_t hostname_len = strlen(hostname);







>
>
>
>
>
>
>
>
>
>
>











<
<
<







68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96



97
98
99
100
101
102
103
  SSL *handle;
};

#define BACKEND connssl->backend

static Curl_recv mesalink_recv;
static Curl_send mesalink_send;

static int do_file_type(const char *type)
{
  if(!type || !type[0])
    return SSL_FILETYPE_PEM;
  if(strcasecompare(type, "PEM"))
    return SSL_FILETYPE_PEM;
  if(strcasecompare(type, "DER"))
    return SSL_FILETYPE_ASN1;
  return -1;
}

/*
 * This function loads all the client/CA certificates and CRLs. Setup the TLS
 * layer and do all necessary magic.
 */
static CURLcode
mesalink_connect_step1(struct connectdata *conn, int sockindex)
{
  char *ciphers;
  struct Curl_easy *data = conn->data;
  struct ssl_connect_data *connssl = &conn->ssl[sockindex];



  struct in_addr addr4;
#ifdef ENABLE_IPV6
  struct in6_addr addr6;
#endif
  const char *const hostname =
    SSL_IS_PROXY() ? conn->http_proxy.host.name : conn->host.name;
  size_t hostname_len = strlen(hostname);
138
139
140
141
142
143
144

145
146
147
148

149
150
151
152

153

154
155
156
157
158
159
160
161
162
163
164
165
166





167


168

















169
170
171
172
173
174
175

  if(!BACKEND->ctx) {
    failf(data, "SSL: couldn't create a context!");
    return CURLE_OUT_OF_MEMORY;
  }

  SSL_CTX_set_verify(

    BACKEND->ctx, verifypeer ? SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);

  if(ssl_cafile || ssl_capath) {
    if(!SSL_CTX_load_verify_locations(BACKEND->ctx, ssl_cafile, ssl_capath)) {

      if(verifypeer) {
        failf(data,
              "error setting certificate verify locations:\n"
              "  CAfile: %s\n  CApath: %s",

              ssl_cafile ? ssl_cafile : "none",

              ssl_capath ? ssl_capath : "none");
        return CURLE_SSL_CACERT_BADFILE;
      }
      infof(data,
            "error setting certificate verify locations,"
            " continuing anyway:\n");
    }
    else {
      infof(data, "successfully set certificate verify locations:\n");
    }
    infof(data,
          "  CAfile: %s\n"
          "  CApath: %s\n",





          ssl_cafile ? ssl_cafile : "none",


          ssl_capath ? ssl_capath : "none");

















  }

  ciphers = SSL_CONN_CONFIG(cipher_list);
  if(ciphers) {
#ifdef MESALINK_HAVE_CIPHER
    if(!SSL_CTX_set_cipher_list(BACKEND->ctx, ciphers)) {
      failf(data, "failed setting cipher list: %s", ciphers);







>
|

|
|
>
|



>
|
>
|



|
|







>
>
>
>
>
|
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211

  if(!BACKEND->ctx) {
    failf(data, "SSL: couldn't create a context!");
    return CURLE_OUT_OF_MEMORY;
  }

  SSL_CTX_set_verify(
    BACKEND->ctx, SSL_CONN_CONFIG(verifypeer) ?
      SSL_VERIFY_PEER : SSL_VERIFY_NONE, NULL);

  if(SSL_CONN_CONFIG(CAfile) || SSL_CONN_CONFIG(CApath)) {
    if(!SSL_CTX_load_verify_locations(BACKEND->ctx, SSL_CONN_CONFIG(CAfile),
                                                    SSL_CONN_CONFIG(CApath))) {
      if(SSL_CONN_CONFIG(verifypeer)) {
        failf(data,
              "error setting certificate verify locations:\n"
              "  CAfile: %s\n  CApath: %s",
              SSL_CONN_CONFIG(CAfile) ?
              SSL_CONN_CONFIG(CAfile) : "none",
              SSL_CONN_CONFIG(CApath) ?
              SSL_CONN_CONFIG(CApath) : "none");
        return CURLE_SSL_CACERT_BADFILE;
      }
      infof(data,
          "error setting certificate verify locations,"
          " continuing anyway:\n");
    }
    else {
      infof(data, "successfully set certificate verify locations:\n");
    }
    infof(data,
          "  CAfile: %s\n"
          "  CApath: %s\n",
          SSL_CONN_CONFIG(CAfile)?
          SSL_CONN_CONFIG(CAfile): "none",
          SSL_CONN_CONFIG(CApath)?
          SSL_CONN_CONFIG(CApath): "none");
  }

  if(SSL_SET_OPTION(cert) && SSL_SET_OPTION(key)) {
    int file_type = do_file_type(SSL_SET_OPTION(cert_type));

    if(SSL_CTX_use_certificate_chain_file(BACKEND->ctx, SSL_SET_OPTION(cert),
                                     file_type) != 1) {
      failf(data, "unable to use client certificate (no key or wrong pass"
            " phrase?)");
      return CURLE_SSL_CONNECT_ERROR;
    }

    file_type = do_file_type(SSL_SET_OPTION(key_type));
    if(SSL_CTX_use_PrivateKey_file(BACKEND->ctx, SSL_SET_OPTION(key),
                                    file_type) != 1) {
      failf(data, "unable to set private key");
      return CURLE_SSL_CONNECT_ERROR;
    }
    infof(data,
          "client cert: %s\n",
          SSL_CONN_CONFIG(clientcert)?
          SSL_CONN_CONFIG(clientcert): "none");
  }

  ciphers = SSL_CONN_CONFIG(cipher_list);
  if(ciphers) {
#ifdef MESALINK_HAVE_CIPHER
    if(!SSL_CTX_set_cipher_list(BACKEND->ctx, ciphers)) {
      failf(data, "failed setting cipher list: %s", ciphers);
Changes to jni/curl/lib/vtls/nss.c.
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750





1751
1752
1753
1754
1755
1756
1757
static CURLcode nss_init_sslver(SSLVersionRange *sslver,
                                struct Curl_easy *data,
                                struct connectdata *conn)
{
  CURLcode result;
  const long min = SSL_CONN_CONFIG(version);
  const long max = SSL_CONN_CONFIG(version_max);

  /* map CURL_SSLVERSION_DEFAULT to NSS default */
  if(min == CURL_SSLVERSION_DEFAULT || max == CURL_SSLVERSION_MAX_DEFAULT) {
    /* map CURL_SSLVERSION_DEFAULT to NSS default */
    if(SSL_VersionRangeGetDefault(ssl_variant_stream, sslver) != SECSuccess)
      return CURLE_SSL_CONNECT_ERROR;
    /* ... but make sure we use at least TLSv1.0 according to libcurl API */
    if(sslver->min < SSL_LIBRARY_VERSION_TLS_1_0)
      sslver->min = SSL_LIBRARY_VERSION_TLS_1_0;
  }

  switch(min) {
  case CURL_SSLVERSION_TLSv1:
  case CURL_SSLVERSION_DEFAULT:





    break;
  default:
    result = nss_sslver_from_curl(&sslver->min, min);
    if(result) {
      failf(data, "unsupported min version passed via CURLOPT_SSLVERSION");
      return result;
    }







|
<
<
<
<
<
<
<
<
<




>
>
>
>
>







1730
1731
1732
1733
1734
1735
1736
1737









1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
static CURLcode nss_init_sslver(SSLVersionRange *sslver,
                                struct Curl_easy *data,
                                struct connectdata *conn)
{
  CURLcode result;
  const long min = SSL_CONN_CONFIG(version);
  const long max = SSL_CONN_CONFIG(version_max);
  SSLVersionRange vrange;










  switch(min) {
  case CURL_SSLVERSION_TLSv1:
  case CURL_SSLVERSION_DEFAULT:
    /* Bump our minimum TLS version if NSS has stricter requirements. */
    if(SSL_VersionRangeGetDefault(ssl_variant_stream, &vrange) != SECSuccess)
      return CURLE_SSL_CONNECT_ERROR;
    if(sslver->min < vrange.min)
      sslver->min = vrange.min;
    break;
  default:
    result = nss_sslver_from_curl(&sslver->min, min);
    if(result) {
      failf(data, "unsupported min version passed via CURLOPT_SSLVERSION");
      return result;
    }
Changes to jni/curl/lib/vtls/openssl.c.
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 ***************************************************************************/

/*
 * Source file for all OpenSSL-specific code for the TLS/SSL layer. No code
 * but vtls.c should ever call or use these functions.
 */

/*
 * The original SSLeay-using code for curl was written by Linas Vepstas and
 * Sampo Kellomaki 1998.
 */

#include "curl_setup.h"

#ifdef USE_OPENSSL

#include <limits.h>

#include "urldata.h"







<
<
<
<
<







21
22
23
24
25
26
27





28
29
30
31
32
33
34
 ***************************************************************************/

/*
 * Source file for all OpenSSL-specific code for the TLS/SSL layer. No code
 * but vtls.c should ever call or use these functions.
 */






#include "curl_setup.h"

#ifdef USE_OPENSSL

#include <limits.h>

#include "urldata.h"
392
393
394
395
396
397
398



399

400
401
402
403
404
405
406
  }
}

/* Return error string for last OpenSSL error
 */
static char *ossl_strerror(unsigned long error, char *buf, size_t size)
{



  ERR_error_string_n(error, buf, size);

  return buf;
}

/* Return an extra data index for the connection data.
 * This index can be used with SSL_get_ex_data() and SSL_set_ex_data().
 */
static int ossl_get_ssl_conn_index(void)







>
>
>

>







387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
  }
}

/* Return error string for last OpenSSL error
 */
static char *ossl_strerror(unsigned long error, char *buf, size_t size)
{
#ifdef OPENSSL_IS_BORINGSSL
  ERR_error_string_n((uint32_t)error, buf, size);
#else
  ERR_error_string_n(error, buf, size);
#endif
  return buf;
}

/* Return an extra data index for the connection data.
 * This index can be used with SSL_get_ex_data() and SSL_set_ex_data().
 */
static int ossl_get_ssl_conn_index(void)
1530
1531
1532
1533
1534
1535
1536




1537
1538

1539
1540
1541
1542
1543
1544
1545
      addrlen = sizeof(struct in_addr);
    }

  /* get a "list" of alternative names */
  altnames = X509_get_ext_d2i(server_cert, NID_subject_alt_name, NULL, NULL);

  if(altnames) {




    int numalts;
    int i;

    bool dnsmatched = FALSE;
    bool ipmatched = FALSE;

    /* get amount of alternatives, RFC2459 claims there MUST be at least
       one, but we don't depend on it... */
    numalts = sk_GENERAL_NAME_num(altnames);








>
>
>
>


>







1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
      addrlen = sizeof(struct in_addr);
    }

  /* get a "list" of alternative names */
  altnames = X509_get_ext_d2i(server_cert, NID_subject_alt_name, NULL, NULL);

  if(altnames) {
#ifdef OPENSSL_IS_BORINGSSL
    size_t numalts;
    size_t i;
#else
    int numalts;
    int i;
#endif
    bool dnsmatched = FALSE;
    bool ipmatched = FALSE;

    /* get amount of alternatives, RFC2459 claims there MUST be at least
       one, but we don't depend on it... */
    numalts = sk_GENERAL_NAME_num(altnames);

1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579

        switch(target) {
        case GEN_DNS: /* name/pattern comparison */
          /* The OpenSSL man page explicitly says: "In general it cannot be
             assumed that the data returned by ASN1_STRING_data() is null
             terminated or does not contain embedded nulls." But also that
             "The actual format of the data will depend on the actual string
             type itself: for example for and IA5String the data will be ASCII"

             Gisle researched the OpenSSL sources:
             "I checked the 0.9.6 and 0.9.8 sources before my patch and
             it always 0-terminates an IA5String."
          */
          if((altlen == strlen(altptr)) &&
             /* if this isn't true, there was an embedded zero in the name
                string and we cannot match it. */
             subj_alt_hostcheck(data, altptr, hostname, dispname)) {
            dnsmatched = TRUE;
          }







|

<
|
|







1565
1566
1567
1568
1569
1570
1571
1572
1573

1574
1575
1576
1577
1578
1579
1580
1581
1582

        switch(target) {
        case GEN_DNS: /* name/pattern comparison */
          /* The OpenSSL man page explicitly says: "In general it cannot be
             assumed that the data returned by ASN1_STRING_data() is null
             terminated or does not contain embedded nulls." But also that
             "The actual format of the data will depend on the actual string
             type itself: for example for an IA5String the data will be ASCII"


             It has been however verified that in 0.9.6 and 0.9.7, IA5String
             is always zero-terminated.
          */
          if((altlen == strlen(altptr)) &&
             /* if this isn't true, there was an embedded zero in the name
                string and we cannot match it. */
             subj_alt_hostcheck(data, altptr, hostname, dispname)) {
            dnsmatched = TRUE;
          }
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
    if(i >= 0) {
      ASN1_STRING *tmp =
        X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i));

      /* In OpenSSL 0.9.7d and earlier, ASN1_STRING_to_UTF8 fails if the input
         is already UTF-8 encoded. We check for this case and copy the raw
         string manually to avoid the problem. This code can be made
         conditional in the future when OpenSSL has been fixed. Work-around
         brought by Alexis S. L. Carvalho. */
      if(tmp) {
        if(ASN1_STRING_type(tmp) == V_ASN1_UTF8STRING) {
          j = ASN1_STRING_length(tmp);
          if(j >= 0) {
            peer_CN = OPENSSL_malloc(j + 1);
            if(peer_CN) {
              memcpy(peer_CN, ASN1_STRING_get0_data(tmp), j);







|
<







1632
1633
1634
1635
1636
1637
1638
1639

1640
1641
1642
1643
1644
1645
1646
    if(i >= 0) {
      ASN1_STRING *tmp =
        X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, i));

      /* In OpenSSL 0.9.7d and earlier, ASN1_STRING_to_UTF8 fails if the input
         is already UTF-8 encoded. We check for this case and copy the raw
         string manually to avoid the problem. This code can be made
         conditional in the future when OpenSSL has been fixed. */

      if(tmp) {
        if(ASN1_STRING_type(tmp) == V_ASN1_UTF8STRING) {
          j = ASN1_STRING_length(tmp);
          if(j >= 0) {
            peer_CN = OPENSSL_malloc(j + 1);
            if(peer_CN) {
              memcpy(peer_CN, ASN1_STRING_get0_data(tmp), j);
2150
2151
2152
2153
2154
2155
2156

2157
2158






















































































2159
2160
2161
2162
2163
2164
2165
2166
  case SSL2_VERSION:
    return "SSLv2";
  }
  return "unknown";
}
#endif


static CURLcode
set_ssl_version_min_max(long *ctx_options, struct connectdata *conn,






















































































                        int sockindex)
{
#if (OPENSSL_VERSION_NUMBER < 0x1000100FL) || !defined(TLS1_3_VERSION)
  /* convoluted #if condition just to avoid compiler warnings on unused
     variable */
  struct Curl_easy *data = conn->data;
#endif
  long ssl_version = SSL_CONN_CONFIG(version);







>

|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|







2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
  case SSL2_VERSION:
    return "SSLv2";
  }
  return "unknown";
}
#endif

#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* 1.1.0 */
static CURLcode
set_ssl_version_min_max(SSL_CTX *ctx, struct connectdata *conn)
{
  /* first, TLS min version... */
  long curl_ssl_version_min = SSL_CONN_CONFIG(version);
  long curl_ssl_version_max;

  /* convert cURL min SSL version option to OpenSSL constant */
  long ossl_ssl_version_min = 0;
  long ossl_ssl_version_max = 0;
  switch(curl_ssl_version_min) {
    case CURL_SSLVERSION_TLSv1: /* TLS 1.x */
    case CURL_SSLVERSION_TLSv1_0:
      ossl_ssl_version_min = TLS1_VERSION;
      break;
    case CURL_SSLVERSION_TLSv1_1:
      ossl_ssl_version_min = TLS1_1_VERSION;
      break;
    case CURL_SSLVERSION_TLSv1_2:
      ossl_ssl_version_min = TLS1_2_VERSION;
      break;
#ifdef TLS1_3_VERSION
    case CURL_SSLVERSION_TLSv1_3:
      ossl_ssl_version_min = TLS1_3_VERSION;
      break;
#endif
  }

  /* CURL_SSLVERSION_DEFAULT means that no option was selected.
    We don't want to pass 0 to SSL_CTX_set_min_proto_version as
    it would enable all versions down to the lowest supported by
    the library.
    So we skip this, and stay with the OS default
  */
  if(curl_ssl_version_min != CURL_SSLVERSION_DEFAULT) {
    if(!SSL_CTX_set_min_proto_version(ctx, ossl_ssl_version_min)) {
      return CURLE_SSL_CONNECT_ERROR;
    }
  }

  /* ... then, TLS max version */
  curl_ssl_version_max = SSL_CONN_CONFIG(version_max);

  /* convert cURL max SSL version option to OpenSSL constant */
  ossl_ssl_version_max = 0;
  switch(curl_ssl_version_max) {
    case CURL_SSLVERSION_MAX_TLSv1_0:
      ossl_ssl_version_max = TLS1_VERSION;
      break;
    case CURL_SSLVERSION_MAX_TLSv1_1:
      ossl_ssl_version_max = TLS1_1_VERSION;
      break;
    case CURL_SSLVERSION_MAX_TLSv1_2:
      ossl_ssl_version_max = TLS1_2_VERSION;
      break;
#ifdef TLS1_3_VERSION
    case CURL_SSLVERSION_MAX_TLSv1_3:
      ossl_ssl_version_max = TLS1_3_VERSION;
      break;
#endif
    case CURL_SSLVERSION_MAX_NONE:  /* none selected */
    case CURL_SSLVERSION_MAX_DEFAULT:  /* max selected */
    default:
      /* SSL_CTX_set_max_proto_version states that:
        setting the maximum to 0 will enable
        protocol versions up to the highest version
        supported by the library */
      ossl_ssl_version_max = 0;
      break;
  }

  if(!SSL_CTX_set_max_proto_version(ctx, ossl_ssl_version_max)) {
    return CURLE_SSL_CONNECT_ERROR;
  }

  return CURLE_OK;
}
#endif

#ifdef OPENSSL_IS_BORINGSSL
typedef uint32_t ctx_option_t;
#else
typedef long ctx_option_t;
#endif

#if (OPENSSL_VERSION_NUMBER < 0x10100000L) /* 1.1.0 */
static CURLcode
set_ssl_version_min_max_legacy(ctx_option_t *ctx_options,
                              struct connectdata *conn, int sockindex)
{
#if (OPENSSL_VERSION_NUMBER < 0x1000100FL) || !defined(TLS1_3_VERSION)
  /* convoluted #if condition just to avoid compiler warnings on unused
     variable */
  struct Curl_easy *data = conn->data;
#endif
  long ssl_version = SSL_CONN_CONFIG(version);
2224
2225
2226
2227
2228
2229
2230

2231
2232
2233
2234
2235
2236
2237
#else
      failf(data, OSSL_PACKAGE " was built without TLS 1.3 support");
      return CURLE_NOT_BUILT_IN;
#endif
  }
  return CURLE_OK;
}


/* The "new session" callback must return zero if the session can be removed
 * or non-zero if the session has been put into the session cache.
 */
static int ossl_new_session_cb(SSL *ssl, SSL_SESSION *ssl_sessionid)
{
  int res = 0;







>







2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
#else
      failf(data, OSSL_PACKAGE " was built without TLS 1.3 support");
      return CURLE_NOT_BUILT_IN;
#endif
  }
  return CURLE_OK;
}
#endif

/* The "new session" callback must return zero if the session can be removed
 * or non-zero if the session has been put into the session cache.
 */
static int ossl_new_session_cb(SSL *ssl, SSL_SESSION *ssl_sessionid)
{
  int res = 0;
2290
2291
2292
2293
2294
2295
2296
2297

2298
2299
2300
2301
2302
2303
2304
  CURLcode result = CURLE_OK;
  char *ciphers;
  struct Curl_easy *data = conn->data;
  SSL_METHOD_QUAL SSL_METHOD *req_method = NULL;
  X509_LOOKUP *lookup = NULL;
  curl_socket_t sockfd = conn->sock[sockindex];
  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
  long ctx_options = 0;

#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
  bool sni;
  const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
    conn->host.name;
#ifdef ENABLE_IPV6
  struct in6_addr addr;
#else







|
>







2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
  CURLcode result = CURLE_OK;
  char *ciphers;
  struct Curl_easy *data = conn->data;
  SSL_METHOD_QUAL SSL_METHOD *req_method = NULL;
  X509_LOOKUP *lookup = NULL;
  curl_socket_t sockfd = conn->sock[sockindex];
  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
  ctx_option_t ctx_options = 0;

#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
  bool sni;
  const char * const hostname = SSL_IS_PROXY() ? conn->http_proxy.host.name :
    conn->host.name;
#ifdef ENABLE_IPV6
  struct in6_addr addr;
#else
2453
2454
2455
2456
2457
2458
2459

2460




2461
2462
2463
2464
2465
2466
2467

2468
2469
2470
2471

2472
2473
2474
2475


2476
2477
2478
2479
2480
2481

2482

2483
2484
2485
2486

2487
2488
2489
2490




2491
2492
2493
2494


2495

2496


2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
  /* unless the user explicitly ask to allow the protocol vulnerability we
     use the work-around */
  if(!SSL_SET_OPTION(enable_beast))
    ctx_options &= ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
#endif

  switch(ssl_version) {

  case CURL_SSLVERSION_SSLv3:




    ctx_options |= SSL_OP_NO_SSLv2;
    ctx_options |= SSL_OP_NO_TLSv1;
#if OPENSSL_VERSION_NUMBER >= 0x1000100FL
    ctx_options |= SSL_OP_NO_TLSv1_1;
    ctx_options |= SSL_OP_NO_TLSv1_2;
#ifdef TLS1_3_VERSION
    ctx_options |= SSL_OP_NO_TLSv1_3;

#endif
#endif
    break;


  case CURL_SSLVERSION_DEFAULT:
  case CURL_SSLVERSION_TLSv1:
  case CURL_SSLVERSION_TLSv1_0:
  case CURL_SSLVERSION_TLSv1_1:


  case CURL_SSLVERSION_TLSv1_2:
  case CURL_SSLVERSION_TLSv1_3:
    /* asking for any TLS version as the minimum, means no SSL versions
       allowed */
    ctx_options |= SSL_OP_NO_SSLv2;
    ctx_options |= SSL_OP_NO_SSLv3;

    result = set_ssl_version_min_max(&ctx_options, conn, sockindex);

    if(result != CURLE_OK)
       return result;
    break;


  case CURL_SSLVERSION_SSLv2:
    ctx_options |= SSL_OP_NO_SSLv3;
    ctx_options |= SSL_OP_NO_TLSv1;
#if OPENSSL_VERSION_NUMBER >= 0x1000100FL




    ctx_options |= SSL_OP_NO_TLSv1_1;
    ctx_options |= SSL_OP_NO_TLSv1_2;
#ifdef TLS1_3_VERSION
    ctx_options |= SSL_OP_NO_TLSv1_3;


#endif

#endif


    break;

  default:
    failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
    return CURLE_SSL_CONNECT_ERROR;
  }

  SSL_CTX_set_options(BACKEND->ctx, ctx_options);

#ifdef HAS_NPN
  if(conn->bits.tls_enable_npn)
    SSL_CTX_set_next_proto_select_cb(BACKEND->ctx, select_next_proto_cb, conn);







>
|
>
>
>
>
|
|
|
|
|
|
|
>
|

|

>
|
|
|
|
>
>
|
|
<
<
|
|
>
|
>
|
|
|

>
|
|
|
|
>
>
>
>
|
|
|
<
>
>
|
>

>
>
|

|
|
|







2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577


2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598

2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
  /* unless the user explicitly ask to allow the protocol vulnerability we
     use the work-around */
  if(!SSL_SET_OPTION(enable_beast))
    ctx_options &= ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
#endif

  switch(ssl_version) {
    /* "--sslv2" option means SSLv2 only, disable all others */
    case CURL_SSLVERSION_SSLv2:
#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0 */
      SSL_CTX_set_min_proto_version(BACKEND->ctx, SSL2_VERSION);
      SSL_CTX_set_max_proto_version(BACKEND->ctx, SSL2_VERSION);
#else
      ctx_options |= SSL_OP_NO_SSLv3;
      ctx_options |= SSL_OP_NO_TLSv1;
#  if OPENSSL_VERSION_NUMBER >= 0x1000100FL
      ctx_options |= SSL_OP_NO_TLSv1_1;
      ctx_options |= SSL_OP_NO_TLSv1_2;
#    ifdef TLS1_3_VERSION
      ctx_options |= SSL_OP_NO_TLSv1_3;
#    endif
#  endif
#endif
      break;

    /* "--sslv3" option means SSLv3 only, disable all others */
    case CURL_SSLVERSION_SSLv3:
#if OPENSSL_VERSION_NUMBER >= 0x10100000L /* 1.1.0 */
      SSL_CTX_set_min_proto_version(BACKEND->ctx, SSL3_VERSION);
      SSL_CTX_set_max_proto_version(BACKEND->ctx, SSL3_VERSION);
#else
      ctx_options |= SSL_OP_NO_SSLv2;
      ctx_options |= SSL_OP_NO_TLSv1;
#  if OPENSSL_VERSION_NUMBER >= 0x1000100FL


      ctx_options |= SSL_OP_NO_TLSv1_1;
      ctx_options |= SSL_OP_NO_TLSv1_2;
#    ifdef TLS1_3_VERSION
      ctx_options |= SSL_OP_NO_TLSv1_3;
#    endif
#  endif
#endif
      break;

    /* "--tlsv<x.y>" options mean TLS >= version <x.y> */
    case CURL_SSLVERSION_DEFAULT:
    case CURL_SSLVERSION_TLSv1: /* TLS >= version 1.0 */
    case CURL_SSLVERSION_TLSv1_0: /* TLS >= version 1.0 */
    case CURL_SSLVERSION_TLSv1_1: /* TLS >= version 1.1 */
    case CURL_SSLVERSION_TLSv1_2: /* TLS >= version 1.2 */
    case CURL_SSLVERSION_TLSv1_3: /* TLS >= version 1.3 */
      /* asking for any TLS version as the minimum, means no SSL versions
        allowed */
      ctx_options |= SSL_OP_NO_SSLv2;
      ctx_options |= SSL_OP_NO_SSLv3;


#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) /* 1.1.0 */
      result = set_ssl_version_min_max(BACKEND->ctx, conn);
#else
      result = set_ssl_version_min_max_legacy(&ctx_options, conn, sockindex);
#endif
      if(result != CURLE_OK)
        return result;
      break;

    default:
      failf(data, "Unrecognized parameter passed via CURLOPT_SSLVERSION");
      return CURLE_SSL_CONNECT_ERROR;
  }

  SSL_CTX_set_options(BACKEND->ctx, ctx_options);

#ifdef HAS_NPN
  if(conn->bits.tls_enable_npn)
    SSL_CTX_set_next_proto_select_cb(BACKEND->ctx, select_next_proto_cb, conn);
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
    X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
                         X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);

    infof(data, "  CRLfile: %s\n", ssl_crlfile);
  }

  /* Try building a chain using issuers in the trusted store first to avoid
  problems with server-sent legacy intermediates.
  Newer versions of OpenSSL do alternate chain checking by default which
  gives us the same fix without as much of a performance hit (slight), so we
  prefer that if available.
  https://rt.openssl.org/Ticket/Display.html?id=3621&user=guest&pass=guest
  */
#if defined(X509_V_FLAG_TRUSTED_FIRST) && !defined(X509_V_FLAG_NO_ALT_CHAINS)
  if(verifypeer) {
    X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
                         X509_V_FLAG_TRUSTED_FIRST);
  }
#endif







|
|
|
|
|







2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
    X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
                         X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL);

    infof(data, "  CRLfile: %s\n", ssl_crlfile);
  }

  /* Try building a chain using issuers in the trusted store first to avoid
     problems with server-sent legacy intermediates.  Newer versions of
     OpenSSL do alternate chain checking by default which gives us the same
     fix without as much of a performance hit (slight), so we prefer that if
     available.
     https://rt.openssl.org/Ticket/Display.html?id=3621&user=guest&pass=guest
  */
#if defined(X509_V_FLAG_TRUSTED_FIRST) && !defined(X509_V_FLAG_NO_ALT_CHAINS)
  if(verifypeer) {
    X509_STORE_set_flags(SSL_CTX_get_cert_store(BACKEND->ctx),
                         X509_V_FLAG_TRUSTED_FIRST);
  }
#endif
3033
3034
3035
3036
3037
3038
3039






3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
    Curl_ssl_push_certinfo(data, certnum, namebuf, buf);

    BIO_free(bio_out);

  }
  return 0; /* all is fine */
}







static CURLcode get_cert_chain(struct connectdata *conn,
                               struct ssl_connect_data *connssl)

{
  CURLcode result;
  STACK_OF(X509) *sk;
  int i;
  struct Curl_easy *data = conn->data;
  int numcerts;
  BIO *mem;

  sk = SSL_get_peer_cert_chain(BACKEND->handle);
  if(!sk) {
    return CURLE_OUT_OF_MEMORY;
  }

  numcerts = sk_X509_num(sk);

  result = Curl_ssl_init_certinfo(data, numcerts);
  if(result) {
    return result;
  }

  mem = BIO_new(BIO_s_mem());

  for(i = 0; i < numcerts; i++) {
    ASN1_INTEGER *num;
    X509 *x = sk_X509_value(sk, i);
    EVP_PKEY *pubkey = NULL;
    int j;
    char *ptr;
    const ASN1_BIT_STRING *psig = NULL;








>
>
>
>
>
>









|









|






|







3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
    Curl_ssl_push_certinfo(data, certnum, namebuf, buf);

    BIO_free(bio_out);

  }
  return 0; /* all is fine */
}

#ifdef OPENSSL_IS_BORINGSSL
typedef size_t numcert_t;
#else
typedef int numcert_t;
#endif

static CURLcode get_cert_chain(struct connectdata *conn,
                               struct ssl_connect_data *connssl)

{
  CURLcode result;
  STACK_OF(X509) *sk;
  int i;
  struct Curl_easy *data = conn->data;
  numcert_t numcerts;
  BIO *mem;

  sk = SSL_get_peer_cert_chain(BACKEND->handle);
  if(!sk) {
    return CURLE_OUT_OF_MEMORY;
  }

  numcerts = sk_X509_num(sk);

  result = Curl_ssl_init_certinfo(data, (int)numcerts);
  if(result) {
    return result;
  }

  mem = BIO_new(BIO_s_mem());

  for(i = 0; i < (int)numcerts; i++) {
    ASN1_INTEGER *num;
    X509 *x = sk_X509_value(sk, i);
    EVP_PKEY *pubkey = NULL;
    int j;
    char *ptr;
    const ASN1_BIT_STRING *psig = NULL;

Changes to jni/curl/lib/vtls/vtls.c.
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553

  Curl_ssl->close_all(data);
}

#if defined(USE_OPENSSL) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \
  defined(USE_SECTRANSP) || defined(USE_POLARSSL) || defined(USE_NSS) || \
  defined(USE_MBEDTLS) || defined(USE_WOLFSSL)
int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks,
                     int numsocks)
{
  struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];

  if(!numsocks)
    return GETSOCK_BLANK;

  if(connssl->connecting_state == ssl_connect_2_writing) {
    /* write mode */
    socks[0] = conn->sock[FIRSTSOCKET];
    return GETSOCK_WRITESOCK(0);
  }
  if(connssl->connecting_state == ssl_connect_2_reading) {
    /* read mode */
    socks[0] = conn->sock[FIRSTSOCKET];
    return GETSOCK_READSOCK(0);
  }

  return GETSOCK_BLANK;
}
#else
int Curl_ssl_getsock(struct connectdata *conn,
                     curl_socket_t *socks,
                     int numsocks)
{
  (void)conn;
  (void)socks;
  (void)numsocks;
  return GETSOCK_BLANK;
}
/* USE_OPENSSL || USE_GNUTLS || USE_SCHANNEL || USE_SECTRANSP || USE_NSS */
#endif

void Curl_ssl_close(struct connectdata *conn, int sockindex)
{







|
<



<
<
<















|
<



<







511
512
513
514
515
516
517
518

519
520
521



522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537

538
539
540

541
542
543
544
545
546
547

  Curl_ssl->close_all(data);
}

#if defined(USE_OPENSSL) || defined(USE_GNUTLS) || defined(USE_SCHANNEL) || \
  defined(USE_SECTRANSP) || defined(USE_POLARSSL) || defined(USE_NSS) || \
  defined(USE_MBEDTLS) || defined(USE_WOLFSSL)
int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks)

{
  struct ssl_connect_data *connssl = &conn->ssl[FIRSTSOCKET];




  if(connssl->connecting_state == ssl_connect_2_writing) {
    /* write mode */
    socks[0] = conn->sock[FIRSTSOCKET];
    return GETSOCK_WRITESOCK(0);
  }
  if(connssl->connecting_state == ssl_connect_2_reading) {
    /* read mode */
    socks[0] = conn->sock[FIRSTSOCKET];
    return GETSOCK_READSOCK(0);
  }

  return GETSOCK_BLANK;
}
#else
int Curl_ssl_getsock(struct connectdata *conn,
                     curl_socket_t *socks)

{
  (void)conn;
  (void)socks;

  return GETSOCK_BLANK;
}
/* USE_OPENSSL || USE_GNUTLS || USE_SCHANNEL || USE_SECTRANSP || USE_NSS */
#endif

void Curl_ssl_close(struct connectdata *conn, int sockindex)
{
Changes to jni/curl/lib/vtls/vtls.h.
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
  conn->proxy_ssl_config.var : conn->ssl_config.var)

bool Curl_ssl_config_matches(struct ssl_primary_config* data,
                             struct ssl_primary_config* needle);
bool Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
                                   struct ssl_primary_config *dest);
void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc);
int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks,
                     int numsocks);

int Curl_ssl_backend(void);

#ifdef USE_SSL
int Curl_ssl_init(void);
void Curl_ssl_cleanup(void);
CURLcode Curl_ssl_connect(struct connectdata *conn, int sockindex);







|
<







139
140
141
142
143
144
145
146

147
148
149
150
151
152
153
  conn->proxy_ssl_config.var : conn->ssl_config.var)

bool Curl_ssl_config_matches(struct ssl_primary_config* data,
                             struct ssl_primary_config* needle);
bool Curl_clone_primary_ssl_config(struct ssl_primary_config *source,
                                   struct ssl_primary_config *dest);
void Curl_free_primary_ssl_config(struct ssl_primary_config* sslc);
int Curl_ssl_getsock(struct connectdata *conn, curl_socket_t *socks);


int Curl_ssl_backend(void);

#ifdef USE_SSL
int Curl_ssl_init(void);
void Curl_ssl_cleanup(void);
CURLcode Curl_ssl_connect(struct connectdata *conn, int sockindex);
Changes to jni/curl/packages/Makefile.in.
325
326
327
328
329
330
331



332
333

334
335
336
337
338
339
340
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --gnu packages/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \







|

|







438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --foreign packages/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
Changes to jni/curl/packages/OS400/README.OS400.
116
117
118
119
120
121
122

123
124
125
126
127
128
129
        CURLOPT_RANDOM_FILE
        CURLOPT_RANGE
        CURLOPT_REFERER
        CURLOPT_REQUEST_TARGET
        CURLOPT_RTSP_SESSION_UID
        CURLOPT_RTSP_STREAM_URI
        CURLOPT_RTSP_TRANSPORT

        CURLOPT_SERVICE_NAME
        CURLOPT_SOCKS5_GSSAPI_SERVICE
        CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
        CURLOPT_SSH_KNOWNHOSTS
        CURLOPT_SSH_PRIVATE_KEYFILE
        CURLOPT_SSH_PUBLIC_KEYFILE
        CURLOPT_SSLCERT







>







116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
        CURLOPT_RANDOM_FILE
        CURLOPT_RANGE
        CURLOPT_REFERER
        CURLOPT_REQUEST_TARGET
        CURLOPT_RTSP_SESSION_UID
        CURLOPT_RTSP_STREAM_URI
        CURLOPT_RTSP_TRANSPORT
        CURLOPT_SASL_AUTHZID
        CURLOPT_SERVICE_NAME
        CURLOPT_SOCKS5_GSSAPI_SERVICE
        CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
        CURLOPT_SSH_KNOWNHOSTS
        CURLOPT_SSH_PRIVATE_KEYFILE
        CURLOPT_SSH_PUBLIC_KEYFILE
        CURLOPT_SSLCERT
Changes to jni/curl/packages/OS400/ccsidcurl.c.
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
     We (try to) do it only once: there is no need to issue several times
     the same message; but since threadsafeness is not handled here,
     this may occur (and we don't care!). */

  if(testwarn) {
    testwarn = 0;

    if(
#ifdef USE_ALTSVC
       (int) STRING_LASTZEROTERMINATED != (int) STRING_ALTSVC + 1 ||
#else
       (int) STRING_LASTZEROTERMINATED != (int) STRING_DOH + 1 ||
#endif
       (int) STRING_LAST != (int) STRING_COPYPOSTFIELDS + 1)
      curl_mfprintf(stderr,
       "*** WARNING: curl_easy_setopt_ccsid() should be reworked ***\n");
  }

  data = (struct Curl_easy *) curl;
  va_start(arg, tag);







<
<
<
<
|
<







1137
1138
1139
1140
1141
1142
1143




1144

1145
1146
1147
1148
1149
1150
1151
     We (try to) do it only once: there is no need to issue several times
     the same message; but since threadsafeness is not handled here,
     this may occur (and we don't care!). */

  if(testwarn) {
    testwarn = 0;





    if((int) STRING_LASTZEROTERMINATED != (int) STRING_SASL_AUTHZID + 1 ||

       (int) STRING_LAST != (int) STRING_COPYPOSTFIELDS + 1)
      curl_mfprintf(stderr,
       "*** WARNING: curl_easy_setopt_ccsid() should be reworked ***\n");
  }

  data = (struct Curl_easy *) curl;
  va_start(arg, tag);
1209
1210
1211
1212
1213
1214
1215

1216
1217
1218
1219
1220
1221
1222
  case CURLOPT_RANDOM_FILE:
  case CURLOPT_RANGE:
  case CURLOPT_REFERER:
  case CURLOPT_REQUEST_TARGET:
  case CURLOPT_RTSP_SESSION_ID:
  case CURLOPT_RTSP_STREAM_URI:
  case CURLOPT_RTSP_TRANSPORT:

  case CURLOPT_SERVICE_NAME:
  case CURLOPT_SOCKS5_GSSAPI_SERVICE:
  case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:
  case CURLOPT_SSH_KNOWNHOSTS:
  case CURLOPT_SSH_PRIVATE_KEYFILE:
  case CURLOPT_SSH_PUBLIC_KEYFILE:
  case CURLOPT_SSLCERT:







>







1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
  case CURLOPT_RANDOM_FILE:
  case CURLOPT_RANGE:
  case CURLOPT_REFERER:
  case CURLOPT_REQUEST_TARGET:
  case CURLOPT_RTSP_SESSION_ID:
  case CURLOPT_RTSP_STREAM_URI:
  case CURLOPT_RTSP_TRANSPORT:
  case CURLOPT_SASL_AUTHZID:
  case CURLOPT_SERVICE_NAME:
  case CURLOPT_SOCKS5_GSSAPI_SERVICE:
  case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:
  case CURLOPT_SSH_KNOWNHOSTS:
  case CURLOPT_SSH_PRIVATE_KEYFILE:
  case CURLOPT_SSH_PUBLIC_KEYFILE:
  case CURLOPT_SSLCERT:
Changes to jni/curl/packages/OS400/ccsidcurl.h.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33


/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 *
 ***************************************************************************/

#ifndef __CURL_CCSIDCURL_H
#define __CURL_CCSIDCURL_H

#include "curl.h"
#include "easy.h"
#include "multi.h"


CURL_EXTERN char * curl_version_ccsid(unsigned int ccsid);
CURL_EXTERN char * curl_easy_escape_ccsid(CURL * handle,
>
>







|














<
<
<
<







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24




25
26
27
28
29
30
31
#ifndef CURLINC_CCSIDCURL_H
#define CURLINC_CCSIDCURL_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 *
 ***************************************************************************/




#include "curl.h"
#include "easy.h"
#include "multi.h"


CURL_EXTERN char * curl_version_ccsid(unsigned int ccsid);
CURL_EXTERN char * curl_easy_escape_ccsid(CURL * handle,
Changes to jni/curl/packages/OS400/curl.inc.in.
134
135
136
137
138
139
140


141
142
143
144
145
146
147
     d                 c                   X'00200000'
     d CURL_VERSION_MULTI_SSL...
     d                 c                   X'00400000'
     d CURL_VERSION_BROTLI...
     d                 c                   X'00800000'
     d CURL_VERSION_ALTSVC...
     d                 c                   X'01000000'


      *
     d CURL_HTTPPOST_FILENAME...
     d                 c                   X'00000001'
     d CURL_HTTPPOST_READFILE...
     d                 c                   X'00000002'
     d CURL_HTTPPOST_PTRNAME...
     d                 c                   X'00000004'







>
>







134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
     d                 c                   X'00200000'
     d CURL_VERSION_MULTI_SSL...
     d                 c                   X'00400000'
     d CURL_VERSION_BROTLI...
     d                 c                   X'00800000'
     d CURL_VERSION_ALTSVC...
     d                 c                   X'01000000'
     d CURL_VERSION_HTTP3...
     d                 c                   X'02000000'
      *
     d CURL_HTTPPOST_FILENAME...
     d                 c                   X'00000001'
     d CURL_HTTPPOST_READFILE...
     d                 c                   X'00000002'
     d CURL_HTTPPOST_PTRNAME...
     d                 c                   X'00000004'
1414
1415
1416
1417
1418
1419
1420


1421
1422
1423
1424
1425
1426
1427
     d                 c                   00285
     d  CURLOPT_ALTSVC_CTRL...
     d                 c                   00286
     d  CURLOPT_ALTSVC...
     d                 c                   10287
     d  CURLOPT_MAXAGE_CONN...
     d                 c                   00288


      *
      /if not defined(CURL_NO_OLDIES)
     d  CURLOPT_FILE   c                   10001
     d  CURLOPT_INFILE...
     d                 c                   10009
     d  CURLOPT_SSLKEYPASSWD...
     d                 c                   10026







>
>







1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
     d                 c                   00285
     d  CURLOPT_ALTSVC_CTRL...
     d                 c                   00286
     d  CURLOPT_ALTSVC...
     d                 c                   10287
     d  CURLOPT_MAXAGE_CONN...
     d                 c                   00288
     d  CURLOPT_SASL_AUTHZID...
     d                 c                   10289
      *
      /if not defined(CURL_NO_OLDIES)
     d  CURLOPT_FILE   c                   10001
     d  CURLOPT_INFILE...
     d                 c                   10009
     d  CURLOPT_SSLKEYPASSWD...
     d                 c                   10026
Changes to jni/curl/packages/vms/Makefile.in.
265
266
267
268
269
270
271



272
273

274
275
276
277
278
279
280
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu packages/vms/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --gnu packages/vms/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \







|

|







384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign packages/vms/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --foreign packages/vms/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
Added jni/curl/plan9/BUILD.PLAN9.txt.














































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Prerequirement
==============
This document describes how to compile, build and install curl and libcurl
from sources using mk. To build it, you will require to install latest
9legacy patches into Plan 9. Also Plan 9 still have no configuration option so
both zlib and libopenssl are required too.

The zlib that is available on Plan 9 can be downloaded from:

  https://github.com/madler/zlib/pull/398

LibreSSL Portable can be downloaded from:

  https://github.com/libressl-portable/portable/pull/510

Instruction
===========
First, you should construct namespace as like described below:

% bind -ac ../lib lib
% bind -ac ../src src
% bind -ac ../include include
% bind -ac .. .

Then you will see as shown below (excerpt):

  curl.git/
   |_plan9
   | |_BUILD.PLAN9.txt
   | |_CHANGES
   | |_CMake
   | |  :
   | |_mkfile
   | |_mkfile.proto
   | |_include
   | | |_Makefile.am
   | | |  :
   | | |_mkfile
   | |_lib
   | | |_CMakeLists.txt
   | | |  :
   | | |_mkfile
   | | |_mkfile.inc
   | |_src
   | | |_CMakeLists.txt
   | | |  :
   | | |_mkfile
   | | |_mkfile.inc
   |_lib
   |_src

After constructing namespace, you can run mk on plan9 directory.

% mk
% mk install
Added jni/curl/plan9/include/mkfile.




































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################

DIR=/sys/include/ape/curl
HFILES=`{ls curl/*.h}

all:V: $HFILES

install:V: all
	mkdir -p $DIR
	cp curl/*.h $DIR/

clean:V: $HFILES  # do nothing

nuke:V: clean
Added jni/curl/plan9/lib/mkfile.














































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################

<../mkfile.proto
<|mkfile.inc

CFLAGS=$CFLAGS -I../include -I. -c

OFILES=${CSOURCES:%.c=%.$O}
HFILES=$HHEADERS
LIB=/$objtype/lib/ape/libcurl.a

CLEANFILES=\
	${LIB_VAUTH_CFILES:%.c=%.$O}\
	${LIB_VTLS_CFILES:%.c=%.$O}\

</sys/src/cmd/mklib

%.$O: %.c
	$CC $CFLAGS -o $target $stem.c
Added jni/curl/plan9/lib/mkfile.inc.


















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/rc
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################

# rename $(VAR) -> $VAR
sed 's/\$\(([A-Z_]+)\)/$\1/g' Makefile.inc
Added jni/curl/plan9/mkfile.








































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################

</sys/src/ape/config

DIRS=\
	lib\
	src\
	include\

default:V: all

all install clean nuke:V:
	for(i in $DIRS) @{
		cd $i
		mk $target
	}
Added jni/curl/plan9/mkfile.proto.




























































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################

</sys/src/ape/config

CFLAGS=\
	-D__PLAN9__\
	-D_POSIX_SOURCE\
	-D_BSD_EXTENSION\
	-D_SUSV2_SOURCE\
	-D_REENTRANT_SOURCE\
Added jni/curl/plan9/src/mkfile.


























































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################

<../mkfile.proto
<|mkfile.inc

CFLAGS=$CFLAGS -I../include -I../lib -c

OFILES=${CURL_CFILES:%.c=%.$O}
HFILES=$CURL_HFILES

LIB=\
	/$objtype/lib/ape/libcurl.a\
	/$objtype/lib/ape/libssl.a\
	/$objtype/lib/ape/libcrypto.a\
	/$objtype/lib/ape/libz.a\

BIN=/$objtype/bin
TARG=curl

CLEANFILES=tool_hugehelp.c

</sys/src/cmd/mkone

tool_hugehelp.c:
	echo 'void hugehelp(void) {}' >$target
Added jni/curl/plan9/src/mkfile.inc.


















































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/rc
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################

# rename $(VAR) -> $VAR
sed 's/\$\(([A-Z_]+)\)/$\1/g' Makefile.inc
Changes to jni/curl/projects/Windows/VC10/lib/libcurl.vcxproj.
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
    <ClCompile Include="..\..\..\..\lib\smb.c" />
    <ClCompile Include="..\..\..\..\lib\smtp.c" />
    <ClCompile Include="..\..\..\..\lib\socks.c" />
    <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
    <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
    <ClCompile Include="..\..\..\..\lib\speedcheck.c" />
    <ClCompile Include="..\..\..\..\lib\splay.c" />
    <ClCompile Include="..\..\..\..\lib\ssh.c" />
    <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />
    <ClCompile Include="..\..\..\..\lib\strcase.c" />
    <ClCompile Include="..\..\..\..\lib\strdup.c" />
    <ClCompile Include="..\..\..\..\lib\strerror.c" />
    <ClCompile Include="..\..\..\..\lib\strtok.c" />
    <ClCompile Include="..\..\..\..\lib\strtoofft.c" />
    <ClCompile Include="..\..\..\..\lib\system_win32.c" />
    <ClCompile Include="..\..\..\..\lib\telnet.c" />







<
<







2413
2414
2415
2416
2417
2418
2419


2420
2421
2422
2423
2424
2425
2426
    <ClCompile Include="..\..\..\..\lib\smb.c" />
    <ClCompile Include="..\..\..\..\lib\smtp.c" />
    <ClCompile Include="..\..\..\..\lib\socks.c" />
    <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
    <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
    <ClCompile Include="..\..\..\..\lib\speedcheck.c" />
    <ClCompile Include="..\..\..\..\lib\splay.c" />


    <ClCompile Include="..\..\..\..\lib\strcase.c" />
    <ClCompile Include="..\..\..\..\lib\strdup.c" />
    <ClCompile Include="..\..\..\..\lib\strerror.c" />
    <ClCompile Include="..\..\..\..\lib\strtok.c" />
    <ClCompile Include="..\..\..\..\lib\strtoofft.c" />
    <ClCompile Include="..\..\..\..\lib\system_win32.c" />
    <ClCompile Include="..\..\..\..\lib\telnet.c" />
2536
2537
2538
2539
2540
2541
2542

2543
2544
2545
2546
2547
2548
2549
    <ClInclude Include="..\..\..\..\lib\non-ascii.h" />
    <ClInclude Include="..\..\..\..\lib\nonblock.h" />
    <ClInclude Include="..\..\..\..\lib\parsedate.h" />
    <ClInclude Include="..\..\..\..\lib\pingpong.h" />
    <ClInclude Include="..\..\..\..\lib\pop3.h" />
    <ClInclude Include="..\..\..\..\lib\progress.h" />
    <ClInclude Include="..\..\..\..\lib\psl.h" />

    <ClInclude Include="..\..\..\..\lib\rand.h" />
    <ClInclude Include="..\..\..\..\lib\rtsp.h" />
    <ClInclude Include="..\..\..\..\lib\select.h" />
    <ClInclude Include="..\..\..\..\lib\sendf.h" />
    <ClInclude Include="..\..\..\..\lib\setopt.h" />
    <ClInclude Include="..\..\..\..\lib\setup-vms.h" />
    <ClInclude Include="..\..\..\..\lib\share.h" />







>







2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
    <ClInclude Include="..\..\..\..\lib\non-ascii.h" />
    <ClInclude Include="..\..\..\..\lib\nonblock.h" />
    <ClInclude Include="..\..\..\..\lib\parsedate.h" />
    <ClInclude Include="..\..\..\..\lib\pingpong.h" />
    <ClInclude Include="..\..\..\..\lib\pop3.h" />
    <ClInclude Include="..\..\..\..\lib\progress.h" />
    <ClInclude Include="..\..\..\..\lib\psl.h" />
    <ClInclude Include="..\..\..\..\lib\quic.h" />
    <ClInclude Include="..\..\..\..\lib\rand.h" />
    <ClInclude Include="..\..\..\..\lib\rtsp.h" />
    <ClInclude Include="..\..\..\..\lib\select.h" />
    <ClInclude Include="..\..\..\..\lib\sendf.h" />
    <ClInclude Include="..\..\..\..\lib\setopt.h" />
    <ClInclude Include="..\..\..\..\lib\setup-vms.h" />
    <ClInclude Include="..\..\..\..\lib\share.h" />
Changes to jni/curl/projects/Windows/VC10/src/curl.vcxproj.
2658
2659
2660
2661
2662
2663
2664

2665
2666
2667
2668
2669
2670
2671
    <ClCompile Include="..\..\..\..\src\tool_metalink.c" />
    <ClCompile Include="..\..\..\..\src\tool_msgs.c" />
    <ClCompile Include="..\..\..\..\src\tool_operate.c" />
    <ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_panykey.c" />
    <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />

    <ClCompile Include="..\..\..\..\src\tool_setopt.c" />
    <ClCompile Include="..\..\..\..\src\tool_sleep.c" />
    <ClCompile Include="..\..\..\..\src\tool_strdup.c" />
    <ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
    <ClCompile Include="..\..\..\..\src\tool_util.c" />
    <ClCompile Include="..\..\..\..\src\tool_vms.c" />
    <ClCompile Include="..\..\..\..\src\tool_writeout.c" />







>







2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
    <ClCompile Include="..\..\..\..\src\tool_metalink.c" />
    <ClCompile Include="..\..\..\..\src\tool_msgs.c" />
    <ClCompile Include="..\..\..\..\src\tool_operate.c" />
    <ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_panykey.c" />
    <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />
    <ClCompile Include="..\..\..\..\src\tool_progress.c" />
    <ClCompile Include="..\..\..\..\src\tool_setopt.c" />
    <ClCompile Include="..\..\..\..\src\tool_sleep.c" />
    <ClCompile Include="..\..\..\..\src\tool_strdup.c" />
    <ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
    <ClCompile Include="..\..\..\..\src\tool_util.c" />
    <ClCompile Include="..\..\..\..\src\tool_vms.c" />
    <ClCompile Include="..\..\..\..\src\tool_writeout.c" />
2705
2706
2707
2708
2709
2710
2711

2712
2713
2714
2715
2716
2717
2718
    <ClInclude Include="..\..\..\..\src\tool_metalink.h" />
    <ClInclude Include="..\..\..\..\src\tool_msgs.h" />
    <ClInclude Include="..\..\..\..\src\tool_operate.h" />
    <ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_panykey.h" />
    <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />

    <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
    <ClInclude Include="..\..\..\..\src\tool_setopt.h" />
    <ClInclude Include="..\..\..\..\src\tool_setup.h" />
    <ClInclude Include="..\..\..\..\src\tool_sleep.h" />
    <ClInclude Include="..\..\..\..\src\tool_strdup.h" />
    <ClInclude Include="..\..\..\..\src\tool_urlglob.h" />
    <ClInclude Include="..\..\..\..\src\tool_util.h" />







>







2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
    <ClInclude Include="..\..\..\..\src\tool_metalink.h" />
    <ClInclude Include="..\..\..\..\src\tool_msgs.h" />
    <ClInclude Include="..\..\..\..\src\tool_operate.h" />
    <ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_panykey.h" />
    <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />
    <ClInclude Include="..\..\..\..\src\tool_progress.h" />
    <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
    <ClInclude Include="..\..\..\..\src\tool_setopt.h" />
    <ClInclude Include="..\..\..\..\src\tool_setup.h" />
    <ClInclude Include="..\..\..\..\src\tool_sleep.h" />
    <ClInclude Include="..\..\..\..\src\tool_strdup.h" />
    <ClInclude Include="..\..\..\..\src\tool_urlglob.h" />
    <ClInclude Include="..\..\..\..\src\tool_util.h" />
Changes to jni/curl/projects/Windows/VC11/lib/libcurl.vcxproj.
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
    <ClCompile Include="..\..\..\..\lib\smb.c" />
    <ClCompile Include="..\..\..\..\lib\smtp.c" />
    <ClCompile Include="..\..\..\..\lib\socks.c" />
    <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
    <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
    <ClCompile Include="..\..\..\..\lib\speedcheck.c" />
    <ClCompile Include="..\..\..\..\lib\splay.c" />
    <ClCompile Include="..\..\..\..\lib\ssh.c" />
    <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />
    <ClCompile Include="..\..\..\..\lib\strcase.c" />
    <ClCompile Include="..\..\..\..\lib\strdup.c" />
    <ClCompile Include="..\..\..\..\lib\strerror.c" />
    <ClCompile Include="..\..\..\..\lib\strtok.c" />
    <ClCompile Include="..\..\..\..\lib\strtoofft.c" />
    <ClCompile Include="..\..\..\..\lib\system_win32.c" />
    <ClCompile Include="..\..\..\..\lib\telnet.c" />







<
<







2469
2470
2471
2472
2473
2474
2475


2476
2477
2478
2479
2480
2481
2482
    <ClCompile Include="..\..\..\..\lib\smb.c" />
    <ClCompile Include="..\..\..\..\lib\smtp.c" />
    <ClCompile Include="..\..\..\..\lib\socks.c" />
    <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
    <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
    <ClCompile Include="..\..\..\..\lib\speedcheck.c" />
    <ClCompile Include="..\..\..\..\lib\splay.c" />


    <ClCompile Include="..\..\..\..\lib\strcase.c" />
    <ClCompile Include="..\..\..\..\lib\strdup.c" />
    <ClCompile Include="..\..\..\..\lib\strerror.c" />
    <ClCompile Include="..\..\..\..\lib\strtok.c" />
    <ClCompile Include="..\..\..\..\lib\strtoofft.c" />
    <ClCompile Include="..\..\..\..\lib\system_win32.c" />
    <ClCompile Include="..\..\..\..\lib\telnet.c" />
2592
2593
2594
2595
2596
2597
2598

2599
2600
2601
2602
2603
2604
2605
    <ClInclude Include="..\..\..\..\lib\non-ascii.h" />
    <ClInclude Include="..\..\..\..\lib\nonblock.h" />
    <ClInclude Include="..\..\..\..\lib\parsedate.h" />
    <ClInclude Include="..\..\..\..\lib\pingpong.h" />
    <ClInclude Include="..\..\..\..\lib\pop3.h" />
    <ClInclude Include="..\..\..\..\lib\progress.h" />
    <ClInclude Include="..\..\..\..\lib\psl.h" />

    <ClInclude Include="..\..\..\..\lib\rand.h" />
    <ClInclude Include="..\..\..\..\lib\rtsp.h" />
    <ClInclude Include="..\..\..\..\lib\select.h" />
    <ClInclude Include="..\..\..\..\lib\sendf.h" />
    <ClInclude Include="..\..\..\..\lib\setopt.h" />
    <ClInclude Include="..\..\..\..\lib\setup-vms.h" />
    <ClInclude Include="..\..\..\..\lib\share.h" />







>







2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
    <ClInclude Include="..\..\..\..\lib\non-ascii.h" />
    <ClInclude Include="..\..\..\..\lib\nonblock.h" />
    <ClInclude Include="..\..\..\..\lib\parsedate.h" />
    <ClInclude Include="..\..\..\..\lib\pingpong.h" />
    <ClInclude Include="..\..\..\..\lib\pop3.h" />
    <ClInclude Include="..\..\..\..\lib\progress.h" />
    <ClInclude Include="..\..\..\..\lib\psl.h" />
    <ClInclude Include="..\..\..\..\lib\quic.h" />
    <ClInclude Include="..\..\..\..\lib\rand.h" />
    <ClInclude Include="..\..\..\..\lib\rtsp.h" />
    <ClInclude Include="..\..\..\..\lib\select.h" />
    <ClInclude Include="..\..\..\..\lib\sendf.h" />
    <ClInclude Include="..\..\..\..\lib\setopt.h" />
    <ClInclude Include="..\..\..\..\lib\setup-vms.h" />
    <ClInclude Include="..\..\..\..\lib\share.h" />
Changes to jni/curl/projects/Windows/VC11/src/curl.vcxproj.
2714
2715
2716
2717
2718
2719
2720

2721
2722
2723
2724
2725
2726
2727
    <ClCompile Include="..\..\..\..\src\tool_metalink.c" />
    <ClCompile Include="..\..\..\..\src\tool_msgs.c" />
    <ClCompile Include="..\..\..\..\src\tool_operate.c" />
    <ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_panykey.c" />
    <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />

    <ClCompile Include="..\..\..\..\src\tool_setopt.c" />
    <ClCompile Include="..\..\..\..\src\tool_sleep.c" />
    <ClCompile Include="..\..\..\..\src\tool_strdup.c" />
    <ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
    <ClCompile Include="..\..\..\..\src\tool_util.c" />
    <ClCompile Include="..\..\..\..\src\tool_vms.c" />
    <ClCompile Include="..\..\..\..\src\tool_writeout.c" />







>







2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
    <ClCompile Include="..\..\..\..\src\tool_metalink.c" />
    <ClCompile Include="..\..\..\..\src\tool_msgs.c" />
    <ClCompile Include="..\..\..\..\src\tool_operate.c" />
    <ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_panykey.c" />
    <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />
    <ClCompile Include="..\..\..\..\src\tool_progress.c" />
    <ClCompile Include="..\..\..\..\src\tool_setopt.c" />
    <ClCompile Include="..\..\..\..\src\tool_sleep.c" />
    <ClCompile Include="..\..\..\..\src\tool_strdup.c" />
    <ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
    <ClCompile Include="..\..\..\..\src\tool_util.c" />
    <ClCompile Include="..\..\..\..\src\tool_vms.c" />
    <ClCompile Include="..\..\..\..\src\tool_writeout.c" />
2761
2762
2763
2764
2765
2766
2767

2768
2769
2770
2771
2772
2773
2774
    <ClInclude Include="..\..\..\..\src\tool_metalink.h" />
    <ClInclude Include="..\..\..\..\src\tool_msgs.h" />
    <ClInclude Include="..\..\..\..\src\tool_operate.h" />
    <ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_panykey.h" />
    <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />

    <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
    <ClInclude Include="..\..\..\..\src\tool_setopt.h" />
    <ClInclude Include="..\..\..\..\src\tool_setup.h" />
    <ClInclude Include="..\..\..\..\src\tool_sleep.h" />
    <ClInclude Include="..\..\..\..\src\tool_strdup.h" />
    <ClInclude Include="..\..\..\..\src\tool_urlglob.h" />
    <ClInclude Include="..\..\..\..\src\tool_util.h" />







>







2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
    <ClInclude Include="..\..\..\..\src\tool_metalink.h" />
    <ClInclude Include="..\..\..\..\src\tool_msgs.h" />
    <ClInclude Include="..\..\..\..\src\tool_operate.h" />
    <ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_panykey.h" />
    <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />
    <ClInclude Include="..\..\..\..\src\tool_progress.h" />
    <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
    <ClInclude Include="..\..\..\..\src\tool_setopt.h" />
    <ClInclude Include="..\..\..\..\src\tool_setup.h" />
    <ClInclude Include="..\..\..\..\src\tool_sleep.h" />
    <ClInclude Include="..\..\..\..\src\tool_strdup.h" />
    <ClInclude Include="..\..\..\..\src\tool_urlglob.h" />
    <ClInclude Include="..\..\..\..\src\tool_util.h" />
Changes to jni/curl/projects/Windows/VC12/lib/libcurl.vcxproj.
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
    <ClCompile Include="..\..\..\..\lib\smb.c" />
    <ClCompile Include="..\..\..\..\lib\smtp.c" />
    <ClCompile Include="..\..\..\..\lib\socks.c" />
    <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
    <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
    <ClCompile Include="..\..\..\..\lib\speedcheck.c" />
    <ClCompile Include="..\..\..\..\lib\splay.c" />
    <ClCompile Include="..\..\..\..\lib\ssh.c" />
    <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />
    <ClCompile Include="..\..\..\..\lib\strcase.c" />
    <ClCompile Include="..\..\..\..\lib\strdup.c" />
    <ClCompile Include="..\..\..\..\lib\strerror.c" />
    <ClCompile Include="..\..\..\..\lib\strtok.c" />
    <ClCompile Include="..\..\..\..\lib\strtoofft.c" />
    <ClCompile Include="..\..\..\..\lib\system_win32.c" />
    <ClCompile Include="..\..\..\..\lib\telnet.c" />







<
<







2469
2470
2471
2472
2473
2474
2475


2476
2477
2478
2479
2480
2481
2482
    <ClCompile Include="..\..\..\..\lib\smb.c" />
    <ClCompile Include="..\..\..\..\lib\smtp.c" />
    <ClCompile Include="..\..\..\..\lib\socks.c" />
    <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
    <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
    <ClCompile Include="..\..\..\..\lib\speedcheck.c" />
    <ClCompile Include="..\..\..\..\lib\splay.c" />


    <ClCompile Include="..\..\..\..\lib\strcase.c" />
    <ClCompile Include="..\..\..\..\lib\strdup.c" />
    <ClCompile Include="..\..\..\..\lib\strerror.c" />
    <ClCompile Include="..\..\..\..\lib\strtok.c" />
    <ClCompile Include="..\..\..\..\lib\strtoofft.c" />
    <ClCompile Include="..\..\..\..\lib\system_win32.c" />
    <ClCompile Include="..\..\..\..\lib\telnet.c" />
2592
2593
2594
2595
2596
2597
2598

2599
2600
2601
2602
2603
2604
2605
    <ClInclude Include="..\..\..\..\lib\non-ascii.h" />
    <ClInclude Include="..\..\..\..\lib\nonblock.h" />
    <ClInclude Include="..\..\..\..\lib\parsedate.h" />
    <ClInclude Include="..\..\..\..\lib\pingpong.h" />
    <ClInclude Include="..\..\..\..\lib\pop3.h" />
    <ClInclude Include="..\..\..\..\lib\progress.h" />
    <ClInclude Include="..\..\..\..\lib\psl.h" />

    <ClInclude Include="..\..\..\..\lib\rand.h" />
    <ClInclude Include="..\..\..\..\lib\rtsp.h" />
    <ClInclude Include="..\..\..\..\lib\select.h" />
    <ClInclude Include="..\..\..\..\lib\sendf.h" />
    <ClInclude Include="..\..\..\..\lib\setopt.h" />
    <ClInclude Include="..\..\..\..\lib\setup-vms.h" />
    <ClInclude Include="..\..\..\..\lib\share.h" />







>







2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
    <ClInclude Include="..\..\..\..\lib\non-ascii.h" />
    <ClInclude Include="..\..\..\..\lib\nonblock.h" />
    <ClInclude Include="..\..\..\..\lib\parsedate.h" />
    <ClInclude Include="..\..\..\..\lib\pingpong.h" />
    <ClInclude Include="..\..\..\..\lib\pop3.h" />
    <ClInclude Include="..\..\..\..\lib\progress.h" />
    <ClInclude Include="..\..\..\..\lib\psl.h" />
    <ClInclude Include="..\..\..\..\lib\quic.h" />
    <ClInclude Include="..\..\..\..\lib\rand.h" />
    <ClInclude Include="..\..\..\..\lib\rtsp.h" />
    <ClInclude Include="..\..\..\..\lib\select.h" />
    <ClInclude Include="..\..\..\..\lib\sendf.h" />
    <ClInclude Include="..\..\..\..\lib\setopt.h" />
    <ClInclude Include="..\..\..\..\lib\setup-vms.h" />
    <ClInclude Include="..\..\..\..\lib\share.h" />
Changes to jni/curl/projects/Windows/VC12/src/curl.vcxproj.
2714
2715
2716
2717
2718
2719
2720

2721
2722
2723
2724
2725
2726
2727
    <ClCompile Include="..\..\..\..\src\tool_metalink.c" />
    <ClCompile Include="..\..\..\..\src\tool_msgs.c" />
    <ClCompile Include="..\..\..\..\src\tool_operate.c" />
    <ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_panykey.c" />
    <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />

    <ClCompile Include="..\..\..\..\src\tool_setopt.c" />
    <ClCompile Include="..\..\..\..\src\tool_sleep.c" />
    <ClCompile Include="..\..\..\..\src\tool_strdup.c" />
    <ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
    <ClCompile Include="..\..\..\..\src\tool_util.c" />
    <ClCompile Include="..\..\..\..\src\tool_vms.c" />
    <ClCompile Include="..\..\..\..\src\tool_writeout.c" />







>







2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
    <ClCompile Include="..\..\..\..\src\tool_metalink.c" />
    <ClCompile Include="..\..\..\..\src\tool_msgs.c" />
    <ClCompile Include="..\..\..\..\src\tool_operate.c" />
    <ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_panykey.c" />
    <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />
    <ClCompile Include="..\..\..\..\src\tool_progress.c" />
    <ClCompile Include="..\..\..\..\src\tool_setopt.c" />
    <ClCompile Include="..\..\..\..\src\tool_sleep.c" />
    <ClCompile Include="..\..\..\..\src\tool_strdup.c" />
    <ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
    <ClCompile Include="..\..\..\..\src\tool_util.c" />
    <ClCompile Include="..\..\..\..\src\tool_vms.c" />
    <ClCompile Include="..\..\..\..\src\tool_writeout.c" />
2761
2762
2763
2764
2765
2766
2767

2768
2769
2770
2771
2772
2773
2774
    <ClInclude Include="..\..\..\..\src\tool_metalink.h" />
    <ClInclude Include="..\..\..\..\src\tool_msgs.h" />
    <ClInclude Include="..\..\..\..\src\tool_operate.h" />
    <ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_panykey.h" />
    <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />

    <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
    <ClInclude Include="..\..\..\..\src\tool_setopt.h" />
    <ClInclude Include="..\..\..\..\src\tool_setup.h" />
    <ClInclude Include="..\..\..\..\src\tool_sleep.h" />
    <ClInclude Include="..\..\..\..\src\tool_strdup.h" />
    <ClInclude Include="..\..\..\..\src\tool_urlglob.h" />
    <ClInclude Include="..\..\..\..\src\tool_util.h" />







>







2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
    <ClInclude Include="..\..\..\..\src\tool_metalink.h" />
    <ClInclude Include="..\..\..\..\src\tool_msgs.h" />
    <ClInclude Include="..\..\..\..\src\tool_operate.h" />
    <ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_panykey.h" />
    <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />
    <ClInclude Include="..\..\..\..\src\tool_progress.h" />
    <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
    <ClInclude Include="..\..\..\..\src\tool_setopt.h" />
    <ClInclude Include="..\..\..\..\src\tool_setup.h" />
    <ClInclude Include="..\..\..\..\src\tool_sleep.h" />
    <ClInclude Include="..\..\..\..\src\tool_strdup.h" />
    <ClInclude Include="..\..\..\..\src\tool_urlglob.h" />
    <ClInclude Include="..\..\..\..\src\tool_util.h" />
Changes to jni/curl/projects/Windows/VC14/lib/libcurl.vcxproj.
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
    <ClCompile Include="..\..\..\..\lib\smb.c" />
    <ClCompile Include="..\..\..\..\lib\smtp.c" />
    <ClCompile Include="..\..\..\..\lib\socks.c" />
    <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
    <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
    <ClCompile Include="..\..\..\..\lib\speedcheck.c" />
    <ClCompile Include="..\..\..\..\lib\splay.c" />
    <ClCompile Include="..\..\..\..\lib\ssh.c" />
    <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />
    <ClCompile Include="..\..\..\..\lib\strcase.c" />
    <ClCompile Include="..\..\..\..\lib\strdup.c" />
    <ClCompile Include="..\..\..\..\lib\strerror.c" />
    <ClCompile Include="..\..\..\..\lib\strtok.c" />
    <ClCompile Include="..\..\..\..\lib\strtoofft.c" />
    <ClCompile Include="..\..\..\..\lib\system_win32.c" />
    <ClCompile Include="..\..\..\..\lib\telnet.c" />







<
<







2469
2470
2471
2472
2473
2474
2475


2476
2477
2478
2479
2480
2481
2482
    <ClCompile Include="..\..\..\..\lib\smb.c" />
    <ClCompile Include="..\..\..\..\lib\smtp.c" />
    <ClCompile Include="..\..\..\..\lib\socks.c" />
    <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
    <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
    <ClCompile Include="..\..\..\..\lib\speedcheck.c" />
    <ClCompile Include="..\..\..\..\lib\splay.c" />


    <ClCompile Include="..\..\..\..\lib\strcase.c" />
    <ClCompile Include="..\..\..\..\lib\strdup.c" />
    <ClCompile Include="..\..\..\..\lib\strerror.c" />
    <ClCompile Include="..\..\..\..\lib\strtok.c" />
    <ClCompile Include="..\..\..\..\lib\strtoofft.c" />
    <ClCompile Include="..\..\..\..\lib\system_win32.c" />
    <ClCompile Include="..\..\..\..\lib\telnet.c" />
2592
2593
2594
2595
2596
2597
2598

2599
2600
2601
2602
2603
2604
2605
    <ClInclude Include="..\..\..\..\lib\non-ascii.h" />
    <ClInclude Include="..\..\..\..\lib\nonblock.h" />
    <ClInclude Include="..\..\..\..\lib\parsedate.h" />
    <ClInclude Include="..\..\..\..\lib\pingpong.h" />
    <ClInclude Include="..\..\..\..\lib\pop3.h" />
    <ClInclude Include="..\..\..\..\lib\progress.h" />
    <ClInclude Include="..\..\..\..\lib\psl.h" />

    <ClInclude Include="..\..\..\..\lib\rand.h" />
    <ClInclude Include="..\..\..\..\lib\rtsp.h" />
    <ClInclude Include="..\..\..\..\lib\select.h" />
    <ClInclude Include="..\..\..\..\lib\sendf.h" />
    <ClInclude Include="..\..\..\..\lib\setopt.h" />
    <ClInclude Include="..\..\..\..\lib\setup-vms.h" />
    <ClInclude Include="..\..\..\..\lib\share.h" />







>







2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
    <ClInclude Include="..\..\..\..\lib\non-ascii.h" />
    <ClInclude Include="..\..\..\..\lib\nonblock.h" />
    <ClInclude Include="..\..\..\..\lib\parsedate.h" />
    <ClInclude Include="..\..\..\..\lib\pingpong.h" />
    <ClInclude Include="..\..\..\..\lib\pop3.h" />
    <ClInclude Include="..\..\..\..\lib\progress.h" />
    <ClInclude Include="..\..\..\..\lib\psl.h" />
    <ClInclude Include="..\..\..\..\lib\quic.h" />
    <ClInclude Include="..\..\..\..\lib\rand.h" />
    <ClInclude Include="..\..\..\..\lib\rtsp.h" />
    <ClInclude Include="..\..\..\..\lib\select.h" />
    <ClInclude Include="..\..\..\..\lib\sendf.h" />
    <ClInclude Include="..\..\..\..\lib\setopt.h" />
    <ClInclude Include="..\..\..\..\lib\setup-vms.h" />
    <ClInclude Include="..\..\..\..\lib\share.h" />
Changes to jni/curl/projects/Windows/VC14/src/curl.vcxproj.
2714
2715
2716
2717
2718
2719
2720

2721
2722
2723
2724
2725
2726
2727
    <ClCompile Include="..\..\..\..\src\tool_metalink.c" />
    <ClCompile Include="..\..\..\..\src\tool_msgs.c" />
    <ClCompile Include="..\..\..\..\src\tool_operate.c" />
    <ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_panykey.c" />
    <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />

    <ClCompile Include="..\..\..\..\src\tool_setopt.c" />
    <ClCompile Include="..\..\..\..\src\tool_sleep.c" />
    <ClCompile Include="..\..\..\..\src\tool_strdup.c" />
    <ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
    <ClCompile Include="..\..\..\..\src\tool_util.c" />
    <ClCompile Include="..\..\..\..\src\tool_vms.c" />
    <ClCompile Include="..\..\..\..\src\tool_writeout.c" />







>







2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
    <ClCompile Include="..\..\..\..\src\tool_metalink.c" />
    <ClCompile Include="..\..\..\..\src\tool_msgs.c" />
    <ClCompile Include="..\..\..\..\src\tool_operate.c" />
    <ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_panykey.c" />
    <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />
    <ClCompile Include="..\..\..\..\src\tool_progress.c" />
    <ClCompile Include="..\..\..\..\src\tool_setopt.c" />
    <ClCompile Include="..\..\..\..\src\tool_sleep.c" />
    <ClCompile Include="..\..\..\..\src\tool_strdup.c" />
    <ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
    <ClCompile Include="..\..\..\..\src\tool_util.c" />
    <ClCompile Include="..\..\..\..\src\tool_vms.c" />
    <ClCompile Include="..\..\..\..\src\tool_writeout.c" />
2761
2762
2763
2764
2765
2766
2767

2768
2769
2770
2771
2772
2773
2774
    <ClInclude Include="..\..\..\..\src\tool_metalink.h" />
    <ClInclude Include="..\..\..\..\src\tool_msgs.h" />
    <ClInclude Include="..\..\..\..\src\tool_operate.h" />
    <ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_panykey.h" />
    <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />

    <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
    <ClInclude Include="..\..\..\..\src\tool_setopt.h" />
    <ClInclude Include="..\..\..\..\src\tool_setup.h" />
    <ClInclude Include="..\..\..\..\src\tool_sleep.h" />
    <ClInclude Include="..\..\..\..\src\tool_strdup.h" />
    <ClInclude Include="..\..\..\..\src\tool_urlglob.h" />
    <ClInclude Include="..\..\..\..\src\tool_util.h" />







>







2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
    <ClInclude Include="..\..\..\..\src\tool_metalink.h" />
    <ClInclude Include="..\..\..\..\src\tool_msgs.h" />
    <ClInclude Include="..\..\..\..\src\tool_operate.h" />
    <ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_panykey.h" />
    <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />
    <ClInclude Include="..\..\..\..\src\tool_progress.h" />
    <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
    <ClInclude Include="..\..\..\..\src\tool_setopt.h" />
    <ClInclude Include="..\..\..\..\src\tool_setup.h" />
    <ClInclude Include="..\..\..\..\src\tool_sleep.h" />
    <ClInclude Include="..\..\..\..\src\tool_strdup.h" />
    <ClInclude Include="..\..\..\..\src\tool_urlglob.h" />
    <ClInclude Include="..\..\..\..\src\tool_util.h" />
Changes to jni/curl/projects/Windows/VC15/lib/libcurl.vcxproj.
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
    <ClCompile Include="..\..\..\..\lib\smb.c" />
    <ClCompile Include="..\..\..\..\lib\smtp.c" />
    <ClCompile Include="..\..\..\..\lib\socks.c" />
    <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
    <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
    <ClCompile Include="..\..\..\..\lib\speedcheck.c" />
    <ClCompile Include="..\..\..\..\lib\splay.c" />
    <ClCompile Include="..\..\..\..\lib\ssh.c" />
    <ClCompile Include="..\..\..\..\lib\ssh-libssh.c" />
    <ClCompile Include="..\..\..\..\lib\strcase.c" />
    <ClCompile Include="..\..\..\..\lib\strdup.c" />
    <ClCompile Include="..\..\..\..\lib\strerror.c" />
    <ClCompile Include="..\..\..\..\lib\strtok.c" />
    <ClCompile Include="..\..\..\..\lib\strtoofft.c" />
    <ClCompile Include="..\..\..\..\lib\system_win32.c" />
    <ClCompile Include="..\..\..\..\lib\telnet.c" />







<
<







2441
2442
2443
2444
2445
2446
2447


2448
2449
2450
2451
2452
2453
2454
    <ClCompile Include="..\..\..\..\lib\smb.c" />
    <ClCompile Include="..\..\..\..\lib\smtp.c" />
    <ClCompile Include="..\..\..\..\lib\socks.c" />
    <ClCompile Include="..\..\..\..\lib\socks_gssapi.c" />
    <ClCompile Include="..\..\..\..\lib\socks_sspi.c" />
    <ClCompile Include="..\..\..\..\lib\speedcheck.c" />
    <ClCompile Include="..\..\..\..\lib\splay.c" />


    <ClCompile Include="..\..\..\..\lib\strcase.c" />
    <ClCompile Include="..\..\..\..\lib\strdup.c" />
    <ClCompile Include="..\..\..\..\lib\strerror.c" />
    <ClCompile Include="..\..\..\..\lib\strtok.c" />
    <ClCompile Include="..\..\..\..\lib\strtoofft.c" />
    <ClCompile Include="..\..\..\..\lib\system_win32.c" />
    <ClCompile Include="..\..\..\..\lib\telnet.c" />
2564
2565
2566
2567
2568
2569
2570

2571
2572
2573
2574
2575
2576
2577
    <ClInclude Include="..\..\..\..\lib\non-ascii.h" />
    <ClInclude Include="..\..\..\..\lib\nonblock.h" />
    <ClInclude Include="..\..\..\..\lib\parsedate.h" />
    <ClInclude Include="..\..\..\..\lib\pingpong.h" />
    <ClInclude Include="..\..\..\..\lib\pop3.h" />
    <ClInclude Include="..\..\..\..\lib\progress.h" />
    <ClInclude Include="..\..\..\..\lib\psl.h" />

    <ClInclude Include="..\..\..\..\lib\rand.h" />
    <ClInclude Include="..\..\..\..\lib\rtsp.h" />
    <ClInclude Include="..\..\..\..\lib\select.h" />
    <ClInclude Include="..\..\..\..\lib\sendf.h" />
    <ClInclude Include="..\..\..\..\lib\setopt.h" />
    <ClInclude Include="..\..\..\..\lib\setup-vms.h" />
    <ClInclude Include="..\..\..\..\lib\share.h" />







>







2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
    <ClInclude Include="..\..\..\..\lib\non-ascii.h" />
    <ClInclude Include="..\..\..\..\lib\nonblock.h" />
    <ClInclude Include="..\..\..\..\lib\parsedate.h" />
    <ClInclude Include="..\..\..\..\lib\pingpong.h" />
    <ClInclude Include="..\..\..\..\lib\pop3.h" />
    <ClInclude Include="..\..\..\..\lib\progress.h" />
    <ClInclude Include="..\..\..\..\lib\psl.h" />
    <ClInclude Include="..\..\..\..\lib\quic.h" />
    <ClInclude Include="..\..\..\..\lib\rand.h" />
    <ClInclude Include="..\..\..\..\lib\rtsp.h" />
    <ClInclude Include="..\..\..\..\lib\select.h" />
    <ClInclude Include="..\..\..\..\lib\sendf.h" />
    <ClInclude Include="..\..\..\..\lib\setopt.h" />
    <ClInclude Include="..\..\..\..\lib\setup-vms.h" />
    <ClInclude Include="..\..\..\..\lib\share.h" />
Changes to jni/curl/projects/Windows/VC15/src/curl.vcxproj.
2686
2687
2688
2689
2690
2691
2692

2693
2694
2695
2696
2697
2698
2699
    <ClCompile Include="..\..\..\..\src\tool_metalink.c" />
    <ClCompile Include="..\..\..\..\src\tool_msgs.c" />
    <ClCompile Include="..\..\..\..\src\tool_operate.c" />
    <ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_panykey.c" />
    <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />

    <ClCompile Include="..\..\..\..\src\tool_setopt.c" />
    <ClCompile Include="..\..\..\..\src\tool_sleep.c" />
    <ClCompile Include="..\..\..\..\src\tool_strdup.c" />
    <ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
    <ClCompile Include="..\..\..\..\src\tool_util.c" />
    <ClCompile Include="..\..\..\..\src\tool_vms.c" />
    <ClCompile Include="..\..\..\..\src\tool_writeout.c" />







>







2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
    <ClCompile Include="..\..\..\..\src\tool_metalink.c" />
    <ClCompile Include="..\..\..\..\src\tool_msgs.c" />
    <ClCompile Include="..\..\..\..\src\tool_operate.c" />
    <ClCompile Include="..\..\..\..\src\tool_operhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_panykey.c" />
    <ClCompile Include="..\..\..\..\src\tool_paramhlp.c" />
    <ClCompile Include="..\..\..\..\src\tool_parsecfg.c" />
    <ClCompile Include="..\..\..\..\src\tool_progress.c" />
    <ClCompile Include="..\..\..\..\src\tool_setopt.c" />
    <ClCompile Include="..\..\..\..\src\tool_sleep.c" />
    <ClCompile Include="..\..\..\..\src\tool_strdup.c" />
    <ClCompile Include="..\..\..\..\src\tool_urlglob.c" />
    <ClCompile Include="..\..\..\..\src\tool_util.c" />
    <ClCompile Include="..\..\..\..\src\tool_vms.c" />
    <ClCompile Include="..\..\..\..\src\tool_writeout.c" />
2733
2734
2735
2736
2737
2738
2739

2740
2741
2742
2743
2744
2745
2746
    <ClInclude Include="..\..\..\..\src\tool_metalink.h" />
    <ClInclude Include="..\..\..\..\src\tool_msgs.h" />
    <ClInclude Include="..\..\..\..\src\tool_operate.h" />
    <ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_panykey.h" />
    <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />

    <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
    <ClInclude Include="..\..\..\..\src\tool_setopt.h" />
    <ClInclude Include="..\..\..\..\src\tool_setup.h" />
    <ClInclude Include="..\..\..\..\src\tool_sleep.h" />
    <ClInclude Include="..\..\..\..\src\tool_strdup.h" />
    <ClInclude Include="..\..\..\..\src\tool_urlglob.h" />
    <ClInclude Include="..\..\..\..\src\tool_util.h" />







>







2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
    <ClInclude Include="..\..\..\..\src\tool_metalink.h" />
    <ClInclude Include="..\..\..\..\src\tool_msgs.h" />
    <ClInclude Include="..\..\..\..\src\tool_operate.h" />
    <ClInclude Include="..\..\..\..\src\tool_operhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_panykey.h" />
    <ClInclude Include="..\..\..\..\src\tool_paramhlp.h" />
    <ClInclude Include="..\..\..\..\src\tool_parsecfg.h" />
    <ClInclude Include="..\..\..\..\src\tool_progress.h" />
    <ClInclude Include="..\..\..\..\src\tool_sdecls.h" />
    <ClInclude Include="..\..\..\..\src\tool_setopt.h" />
    <ClInclude Include="..\..\..\..\src\tool_setup.h" />
    <ClInclude Include="..\..\..\..\src\tool_sleep.h" />
    <ClInclude Include="..\..\..\..\src\tool_strdup.h" />
    <ClInclude Include="..\..\..\..\src\tool_urlglob.h" />
    <ClInclude Include="..\..\..\..\src\tool_util.h" />
Changes to jni/curl/projects/Windows/VC6/lib/libcurl.dsp.
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\splay.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\ssh.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\ssh-libssh.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\strcase.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\strdup.c
# End Source File
# Begin Source File







<
<
<
<
<
<
<
<







1102
1103
1104
1105
1106
1107
1108








1109
1110
1111
1112
1113
1114
1115
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\splay.c
# End Source File
# Begin Source File









SOURCE=..\..\..\..\lib\strcase.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\strdup.c
# End Source File
# Begin Source File
1589
1590
1591
1592
1593
1594
1595




1596
1597
1598
1599
1600
1601
1602
SOURCE=..\..\..\..\lib\progress.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\psl.h
# End Source File
# Begin Source File





SOURCE=..\..\..\..\lib\rand.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\rtsp.h
# End Source File







>
>
>
>







1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
SOURCE=..\..\..\..\lib\progress.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\psl.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\quic.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\rand.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\lib\rtsp.h
# End Source File
Changes to jni/curl/projects/Windows/VC6/src/curl.dsp.
814
815
816
817
818
819
820




821
822
823
824
825
826
827
SOURCE=..\..\..\..\src\tool_paramhlp.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_parsecfg.c
# End Source File
# Begin Source File





SOURCE=..\..\..\..\src\tool_setopt.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_sleep.c
# End Source File







>
>
>
>







814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
SOURCE=..\..\..\..\src\tool_paramhlp.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_parsecfg.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_progress.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_setopt.c
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_sleep.c
# End Source File
998
999
1000
1001
1002
1003
1004




1005
1006
1007
1008
1009
1010
1011
SOURCE=..\..\..\..\src\tool_paramhlp.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_parsecfg.h
# End Source File
# Begin Source File





SOURCE=..\..\..\..\src\tool_sdecls.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_setopt.h
# End Source File







>
>
>
>







1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
SOURCE=..\..\..\..\src\tool_paramhlp.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_parsecfg.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_progress.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_sdecls.h
# End Source File
# Begin Source File

SOURCE=..\..\..\..\src\tool_setopt.h
# End Source File
Changes to jni/curl/projects/Windows/VC7.1/lib/libcurl.vcproj.
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
			<File
				RelativePath="..\..\..\..\lib\speedcheck.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\splay.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\ssh.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\ssh-libssh.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\strcase.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\strdup.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\strerror.c">







<
<
<
<
<
<







1534
1535
1536
1537
1538
1539
1540






1541
1542
1543
1544
1545
1546
1547
			<File
				RelativePath="..\..\..\..\lib\speedcheck.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\splay.c">
			</File>
			<File






				RelativePath="..\..\..\..\lib\strcase.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\strdup.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\strerror.c">
1825
1826
1827
1828
1829
1830
1831



1832
1833
1834
1835
1836
1837
1838
			</File>
			<File
				RelativePath="..\..\..\..\lib\progress.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\psl.h">
			</File>



			<File
				RelativePath="..\..\..\..\lib\rand.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\rtsp.h">
			</File>
			<File







>
>
>







1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
			</File>
			<File
				RelativePath="..\..\..\..\lib\progress.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\psl.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\quic.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\rand.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\rtsp.h">
			</File>
			<File
Changes to jni/curl/projects/Windows/VC7.1/src/curl.vcproj.
1462
1463
1464
1465
1466
1467
1468



1469
1470
1471
1472
1473
1474
1475
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.c">
			</File>



			<File
				RelativePath="..\..\..\..\src\tool_setopt.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sleep.c">
			</File>
			<File







>
>
>







1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_progress.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sleep.c">
			</File>
			<File
1601
1602
1603
1604
1605
1606
1607



1608
1609
1610
1611
1612
1613
1614
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.h">
			</File>



			<File
				RelativePath="..\..\..\..\src\tool_sdecls.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.h">
			</File>
			<File







>
>
>







1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_progress.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sdecls.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.h">
			</File>
			<File
Changes to jni/curl/projects/Windows/VC7/lib/libcurl.vcproj.
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
			<File
				RelativePath="..\..\..\..\lib\speedcheck.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\splay.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\ssh.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\ssh-libssh.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\strcase.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\strdup.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\strerror.c">







<
<
<
<
<
<







1388
1389
1390
1391
1392
1393
1394






1395
1396
1397
1398
1399
1400
1401
			<File
				RelativePath="..\..\..\..\lib\speedcheck.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\splay.c">
			</File>
			<File






				RelativePath="..\..\..\..\lib\strcase.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\strdup.c">
			</File>
			<File
				RelativePath="..\..\..\..\lib\strerror.c">
1679
1680
1681
1682
1683
1684
1685



1686
1687
1688
1689
1690
1691
1692
			</File>
			<File
				RelativePath="..\..\..\..\lib\progress.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\psl.h">
			</File>



			<File
				RelativePath="..\..\..\..\lib\rand.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\rtsp.h">
			</File>
			<File







>
>
>







1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
			</File>
			<File
				RelativePath="..\..\..\..\lib\progress.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\psl.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\quic.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\rand.h">
			</File>
			<File
				RelativePath="..\..\..\..\lib\rtsp.h">
			</File>
			<File
Changes to jni/curl/projects/Windows/VC7/src/curl.vcproj.
1316
1317
1318
1319
1320
1321
1322



1323
1324
1325
1326
1327
1328
1329
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.c">
			</File>



			<File
				RelativePath="..\..\..\..\src\tool_setopt.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sleep.c">
			</File>
			<File







>
>
>







1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_progress.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.c">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sleep.c">
			</File>
			<File
1455
1456
1457
1458
1459
1460
1461



1462
1463
1464
1465
1466
1467
1468
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.h">
			</File>



			<File
				RelativePath="..\..\..\..\src\tool_sdecls.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.h">
			</File>
			<File







>
>
>







1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_progress.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sdecls.h">
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.h">
			</File>
			<File
Changes to jni/curl/projects/Windows/VC8/lib/libcurl.vcproj.
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
			<File
				RelativePath="..\..\..\..\lib\speedcheck.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\splay.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\ssh.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\ssh-libssh.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\strcase.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\strdup.c"







<
<
<
<
<
<
<
<







3987
3988
3989
3990
3991
3992
3993








3994
3995
3996
3997
3998
3999
4000
			<File
				RelativePath="..\..\..\..\lib\speedcheck.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\splay.c"
			>








			</File>
			<File
				RelativePath="..\..\..\..\lib\strcase.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\strdup.c"
4375
4376
4377
4378
4379
4380
4381




4382
4383
4384
4385
4386
4387
4388
			<File
				RelativePath="..\..\..\..\lib\progress.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\psl.h"
			>




			</File>
			<File
				RelativePath="..\..\..\..\lib\rand.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\rtsp.h"







>
>
>
>







4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
			<File
				RelativePath="..\..\..\..\lib\progress.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\psl.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\quic.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\rand.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\rtsp.h"
Changes to jni/curl/projects/Windows/VC8/src/curl.vcproj.
4215
4216
4217
4218
4219
4220
4221




4222
4223
4224
4225
4226
4227
4228
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.c"
			>




			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sleep.c"







>
>
>
>







4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_progress.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sleep.c"
4399
4400
4401
4402
4403
4404
4405




4406
4407
4408
4409
4410
4411
4412
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.h"
			>




			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sdecls.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.h"







>
>
>
>







4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_progress.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sdecls.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.h"
Changes to jni/curl/projects/Windows/VC9/lib/libcurl.vcproj.
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
			<File
				RelativePath="..\..\..\..\lib\speedcheck.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\splay.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\ssh.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\ssh-libssh.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\strcase.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\strdup.c"







<
<
<
<
<
<
<
<







3928
3929
3930
3931
3932
3933
3934








3935
3936
3937
3938
3939
3940
3941
			<File
				RelativePath="..\..\..\..\lib\speedcheck.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\splay.c"
			>








			</File>
			<File
				RelativePath="..\..\..\..\lib\strcase.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\strdup.c"
4316
4317
4318
4319
4320
4321
4322




4323
4324
4325
4326
4327
4328
4329
			<File
				RelativePath="..\..\..\..\lib\progress.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\psl.h"
			>




			</File>
			<File
				RelativePath="..\..\..\..\lib\rand.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\rtsp.h"







>
>
>
>







4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
			<File
				RelativePath="..\..\..\..\lib\progress.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\psl.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\quic.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\rand.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\lib\rtsp.h"
Changes to jni/curl/projects/Windows/VC9/src/curl.vcproj.
4072
4073
4074
4075
4076
4077
4078




4079
4080
4081
4082
4083
4084
4085
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.c"
			>




			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sleep.c"







>
>
>
>







4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_progress.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.c"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sleep.c"
4256
4257
4258
4259
4260
4261
4262




4263
4264
4265
4266
4267
4268
4269
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.h"
			>




			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sdecls.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.h"







>
>
>
>







4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
			<File
				RelativePath="..\..\..\..\src\tool_paramhlp.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_parsecfg.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_progress.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_sdecls.h"
			>
			</File>
			<File
				RelativePath="..\..\..\..\src\tool_setopt.h"
Changes to jni/curl/projects/build-openssl.bat.
91
92
93
94
95
96
97













98
99
100
101
102
103
104
      if exist "%PF%\Microsoft Visual Studio\2017\Enterprise\VC" (
        set "VC_PATH=Microsoft Visual Studio\2017\Enterprise\VC"
      ) else if exist "%PF%\Microsoft Visual Studio\2017\Professional\VC" (
        set "VC_PATH=Microsoft Visual Studio\2017\Professional\VC"
      ) else (
        set "VC_PATH=Microsoft Visual Studio\2017\Community\VC"
      )













    ) else if /i "%~1%" == "x86" (
      set BUILD_PLATFORM=x86
    ) else if /i "%~1%" == "x64" (
      set BUILD_PLATFORM=x64
    ) else if /i "%~1%" == "debug" (
      set BUILD_CONFIG=debug
    ) else if /i "%~1%" == "release" (







>
>
>
>
>
>
>
>
>
>
>
>
>







91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
      if exist "%PF%\Microsoft Visual Studio\2017\Enterprise\VC" (
        set "VC_PATH=Microsoft Visual Studio\2017\Enterprise\VC"
      ) else if exist "%PF%\Microsoft Visual Studio\2017\Professional\VC" (
        set "VC_PATH=Microsoft Visual Studio\2017\Professional\VC"
      ) else (
        set "VC_PATH=Microsoft Visual Studio\2017\Community\VC"
      )
    ) else if /i "%~1" == "vc14.2" (
      set VC_VER=14.2
      set VC_DESC=VC14.2

      rem Determine the VC14.2 path based on the installed edition in descending
      rem order (Enterprise, then Professional and finally Community)
      if exist "%PF%\Microsoft Visual Studio\2019\Enterprise\VC" (
        set "VC_PATH=Microsoft Visual Studio\2019\Enterprise\VC"
      ) else if exist "%PF%\Microsoft Visual Studio\2019\Professional\VC" (
        set "VC_PATH=Microsoft Visual Studio\2019\Professional\VC"
      ) else (
        set "VC_PATH=Microsoft Visual Studio\2019\Community\VC"
      )
    ) else if /i "%~1%" == "x86" (
      set BUILD_PLATFORM=x86
    ) else if /i "%~1%" == "x64" (
      set BUILD_PLATFORM=x64
    ) else if /i "%~1%" == "debug" (
      set BUILD_CONFIG=debug
    ) else if /i "%~1%" == "release" (
198
199
200
201
202
203
204

205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223


224
225
226
227
228
229
230
    if "%VC_VER%" == "8.0" set VCVARS_PLATFORM=x86_amd64
    if "%VC_VER%" == "9.0" set VCVARS_PLATFORM=%BUILD_PLATFORM%
    if "%VC_VER%" == "10.0" set VCVARS_PLATFORM=%BUILD_PLATFORM%
    if "%VC_VER%" == "11.0" set VCVARS_PLATFORM=amd64
    if "%VC_VER%" == "12.0" set VCVARS_PLATFORM=amd64
    if "%VC_VER%" == "14.0" set VCVARS_PLATFORM=amd64
    if "%VC_VER%" == "14.1" set VCVARS_PLATFORM=amd64

  )

  if exist "%START_DIR%\ms\do_ms.bat" (
    set LEGACY_BUILD=TRUE
  ) else (
    set LEGACY_BUILD=FALSE
  )

:start
  echo.
  set SAVED_PATH=%CD%

  if "%VC_VER%" == "6.0" (
    call "%ABS_VC_PATH%\bin\vcvars32"
  ) else if "%VC_VER%" == "7.0" (
    call "%ABS_VC_PATH%\bin\vcvars32"
  ) else if "%VC_VER%" == "7.1" (
    call "%ABS_VC_PATH%\bin\vcvars32"
  ) else if "%VC_VER%" == "14.1" (


    call "%ABS_VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
  ) else (
    call "%ABS_VC_PATH%\vcvarsall" %VCVARS_PLATFORM%
  )

  echo.
  cd /d %SAVED_PATH%







>



















>
>







211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
    if "%VC_VER%" == "8.0" set VCVARS_PLATFORM=x86_amd64
    if "%VC_VER%" == "9.0" set VCVARS_PLATFORM=%BUILD_PLATFORM%
    if "%VC_VER%" == "10.0" set VCVARS_PLATFORM=%BUILD_PLATFORM%
    if "%VC_VER%" == "11.0" set VCVARS_PLATFORM=amd64
    if "%VC_VER%" == "12.0" set VCVARS_PLATFORM=amd64
    if "%VC_VER%" == "14.0" set VCVARS_PLATFORM=amd64
    if "%VC_VER%" == "14.1" set VCVARS_PLATFORM=amd64
    if "%VC_VER%" == "14.2" set VCVARS_PLATFORM=amd64
  )

  if exist "%START_DIR%\ms\do_ms.bat" (
    set LEGACY_BUILD=TRUE
  ) else (
    set LEGACY_BUILD=FALSE
  )

:start
  echo.
  set SAVED_PATH=%CD%

  if "%VC_VER%" == "6.0" (
    call "%ABS_VC_PATH%\bin\vcvars32"
  ) else if "%VC_VER%" == "7.0" (
    call "%ABS_VC_PATH%\bin\vcvars32"
  ) else if "%VC_VER%" == "7.1" (
    call "%ABS_VC_PATH%\bin\vcvars32"
  ) else if "%VC_VER%" == "14.1" (
    call "%ABS_VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
  ) else if "%VC_VER%" == "14.2" (
    call "%ABS_VC_PATH%\Auxiliary\Build\vcvarsall" %VCVARS_PLATFORM%
  ) else (
    call "%ABS_VC_PATH%\vcvarsall" %VCVARS_PLATFORM%
  )

  echo.
  cd /d %SAVED_PATH%
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579

        move !build_dir!\lib\*.lib "%OUTDIR%\LIB Release" 1>nul
        move !build_dir!\bin\*.exe "%OUTDIR%\LIB Release" 1>nul
      ) else if "%2" == "shared" (
        if not exist "%OUTDIR%\DLL Release" (
          mkdir "%OUTDIR%\DLL Release" 1>nul
        )
  
        move !build_dir!\lib\*.lib "%OUTDIR%\DLL Release" 1>nul
        move !build_dir!\bin\*.dll "%OUTDIR%\DLL Release" 1>nul
        move !build_dir!\bin\*.exe "%OUTDIR%\DLL Release" 1>nul
      ) else (
        exit /B 1
      )
    ) else (







|







581
582
583
584
585
586
587
588
589
590
591
592
593
594
595

        move !build_dir!\lib\*.lib "%OUTDIR%\LIB Release" 1>nul
        move !build_dir!\bin\*.exe "%OUTDIR%\LIB Release" 1>nul
      ) else if "%2" == "shared" (
        if not exist "%OUTDIR%\DLL Release" (
          mkdir "%OUTDIR%\DLL Release" 1>nul
        )

        move !build_dir!\lib\*.lib "%OUTDIR%\DLL Release" 1>nul
        move !build_dir!\bin\*.dll "%OUTDIR%\DLL Release" 1>nul
        move !build_dir!\bin\*.exe "%OUTDIR%\DLL Release" 1>nul
      ) else (
        exit /B 1
      )
    ) else (
601
602
603
604
605
606
607

608
609
610
611
612
613
614
  echo vc8       - Use Visual Studio 2005
  echo vc9       - Use Visual Studio 2008
  echo vc10      - Use Visual Studio 2010
  echo vc11      - Use Visual Studio 2012
  echo vc12      - Use Visual Studio 2013
  echo vc14      - Use Visual Studio 2015
  echo vc14.1    - Use Visual Studio 2017

  echo.
  echo Platform:
  echo.
  echo x86       - Perform a 32-bit build
  echo x64       - Perform a 64-bit build
  echo.
  echo Configuration:







>







617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
  echo vc8       - Use Visual Studio 2005
  echo vc9       - Use Visual Studio 2008
  echo vc10      - Use Visual Studio 2010
  echo vc11      - Use Visual Studio 2012
  echo vc12      - Use Visual Studio 2013
  echo vc14      - Use Visual Studio 2015
  echo vc14.1    - Use Visual Studio 2017
  echo vc14.2    - Use Visual Studio 2019
  echo.
  echo Platform:
  echo.
  echo x86       - Perform a 32-bit build
  echo x64       - Perform a 64-bit build
  echo.
  echo Configuration:
Changes to jni/curl/scripts/Makefile.in.
265
266
267
268
269
270
271



272
273

274
275
276
277
278
279
280
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --gnu scripts/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \







|

|







372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign scripts/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --foreign scripts/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
Changes to jni/curl/src/Makefile.am.
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE);     \
	echo '#else' >> $(HUGE);                                \
	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c >> $(HUGE);  \
	echo '#endif /* HAVE_LIBZ */' >> $(HUGE) )
else # HAVE_LIBZ
# This generates the tool_hugehelp.c file uncompressed only
$(HUGE): $(MANPAGE) $(MKHELP)
	$(HUGECMD)(echo '#include "tool_setup.h"' > $(HUGE):    \
	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE) )
endif

else # USE_MANUAL
# built-in manual has been disabled, make a blank file
$(HUGE):
	$(HUGECMD)(echo "/* built-in manual is disabled, blank function */" > $(HUGE); \







|







119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE);     \
	echo '#else' >> $(HUGE);                                \
	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c >> $(HUGE);  \
	echo '#endif /* HAVE_LIBZ */' >> $(HUGE) )
else # HAVE_LIBZ
# This generates the tool_hugehelp.c file uncompressed only
$(HUGE): $(MANPAGE) $(MKHELP)
	$(HUGECMD)(echo '#include "tool_setup.h"' > $(HUGE);    \
	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE) )
endif

else # USE_MANUAL
# built-in manual has been disabled, make a blank file
$(HUGE):
	$(HUGECMD)(echo "/* built-in manual is disabled, blank function */" > $(HUGE); \
Changes to jni/curl/src/Makefile.in.
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173

174
175
176
177
178
179
180
	tool_bname.c tool_cb_dbg.c tool_cb_hdr.c tool_cb_prg.c \
	tool_cb_rea.c tool_cb_see.c tool_cb_wrt.c tool_cfgable.c \
	tool_convert.c tool_dirhie.c tool_doswin.c tool_easysrc.c \
	tool_filetime.c tool_formparse.c tool_getparam.c \
	tool_getpass.c tool_help.c tool_helpers.c tool_homedir.c \
	tool_hugehelp.c tool_libinfo.c tool_main.c tool_metalink.c \
	tool_msgs.c tool_operate.c tool_operhlp.c tool_panykey.c \
	tool_paramhlp.c tool_parsecfg.c tool_strdup.c tool_setopt.c \
	tool_sleep.c tool_urlglob.c tool_util.c tool_vms.c \
	tool_writeout.c tool_xattr.c ../lib/strtoofft.c \
	../lib/nonblock.c ../lib/warnless.c ../lib/curl_ctype.c \
	slist_wc.h tool_binmode.h tool_bname.h tool_cb_dbg.h \
	tool_cb_hdr.h tool_cb_prg.h tool_cb_rea.h tool_cb_see.h \
	tool_cb_wrt.h tool_cfgable.h tool_convert.h tool_dirhie.h \
	tool_doswin.h tool_easysrc.h tool_filetime.h tool_formparse.h \
	tool_getparam.h tool_getpass.h tool_help.h tool_helpers.h \
	tool_homedir.h tool_hugehelp.h tool_libinfo.h tool_main.h \
	tool_metalink.h tool_msgs.h tool_operate.h tool_operhlp.h \
	tool_panykey.h tool_paramhlp.h tool_parsecfg.h tool_sdecls.h \
	tool_setopt.h tool_setup.h tool_sleep.h tool_strdup.h \
	tool_urlglob.h tool_util.h tool_version.h tool_vms.h \
	tool_writeout.h tool_xattr.h
am__objects_1 = libcurltool_la-slist_wc.lo \
	libcurltool_la-tool_binmode.lo libcurltool_la-tool_bname.lo \
	libcurltool_la-tool_cb_dbg.lo libcurltool_la-tool_cb_hdr.lo \
	libcurltool_la-tool_cb_prg.lo libcurltool_la-tool_cb_rea.lo \
	libcurltool_la-tool_cb_see.lo libcurltool_la-tool_cb_wrt.lo \
	libcurltool_la-tool_cfgable.lo libcurltool_la-tool_convert.lo \
	libcurltool_la-tool_dirhie.lo libcurltool_la-tool_doswin.lo \
	libcurltool_la-tool_easysrc.lo libcurltool_la-tool_filetime.lo \
	libcurltool_la-tool_formparse.lo \
	libcurltool_la-tool_getparam.lo libcurltool_la-tool_getpass.lo \
	libcurltool_la-tool_help.lo libcurltool_la-tool_helpers.lo \
	libcurltool_la-tool_homedir.lo libcurltool_la-tool_hugehelp.lo \
	libcurltool_la-tool_libinfo.lo libcurltool_la-tool_main.lo \
	libcurltool_la-tool_metalink.lo libcurltool_la-tool_msgs.lo \
	libcurltool_la-tool_operate.lo libcurltool_la-tool_operhlp.lo \
	libcurltool_la-tool_panykey.lo libcurltool_la-tool_paramhlp.lo \
	libcurltool_la-tool_parsecfg.lo libcurltool_la-tool_strdup.lo \

	libcurltool_la-tool_setopt.lo libcurltool_la-tool_sleep.lo \
	libcurltool_la-tool_urlglob.lo libcurltool_la-tool_util.lo \
	libcurltool_la-tool_vms.lo libcurltool_la-tool_writeout.lo \
	libcurltool_la-tool_xattr.lo
am__dirstamp = $(am__leading_dot)dirstamp
am__objects_2 = ../lib/libcurltool_la-strtoofft.lo \
	../lib/libcurltool_la-nonblock.lo \







|
|
|








|
|
|
|
















|
>







135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
	tool_bname.c tool_cb_dbg.c tool_cb_hdr.c tool_cb_prg.c \
	tool_cb_rea.c tool_cb_see.c tool_cb_wrt.c tool_cfgable.c \
	tool_convert.c tool_dirhie.c tool_doswin.c tool_easysrc.c \
	tool_filetime.c tool_formparse.c tool_getparam.c \
	tool_getpass.c tool_help.c tool_helpers.c tool_homedir.c \
	tool_hugehelp.c tool_libinfo.c tool_main.c tool_metalink.c \
	tool_msgs.c tool_operate.c tool_operhlp.c tool_panykey.c \
	tool_paramhlp.c tool_parsecfg.c tool_progress.c tool_strdup.c \
	tool_setopt.c tool_sleep.c tool_urlglob.c tool_util.c \
	tool_vms.c tool_writeout.c tool_xattr.c ../lib/strtoofft.c \
	../lib/nonblock.c ../lib/warnless.c ../lib/curl_ctype.c \
	slist_wc.h tool_binmode.h tool_bname.h tool_cb_dbg.h \
	tool_cb_hdr.h tool_cb_prg.h tool_cb_rea.h tool_cb_see.h \
	tool_cb_wrt.h tool_cfgable.h tool_convert.h tool_dirhie.h \
	tool_doswin.h tool_easysrc.h tool_filetime.h tool_formparse.h \
	tool_getparam.h tool_getpass.h tool_help.h tool_helpers.h \
	tool_homedir.h tool_hugehelp.h tool_libinfo.h tool_main.h \
	tool_metalink.h tool_msgs.h tool_operate.h tool_operhlp.h \
	tool_panykey.h tool_paramhlp.h tool_parsecfg.h tool_progress.h \
	tool_sdecls.h tool_setopt.h tool_setup.h tool_sleep.h \
	tool_strdup.h tool_urlglob.h tool_util.h tool_version.h \
	tool_vms.h tool_writeout.h tool_xattr.h
am__objects_1 = libcurltool_la-slist_wc.lo \
	libcurltool_la-tool_binmode.lo libcurltool_la-tool_bname.lo \
	libcurltool_la-tool_cb_dbg.lo libcurltool_la-tool_cb_hdr.lo \
	libcurltool_la-tool_cb_prg.lo libcurltool_la-tool_cb_rea.lo \
	libcurltool_la-tool_cb_see.lo libcurltool_la-tool_cb_wrt.lo \
	libcurltool_la-tool_cfgable.lo libcurltool_la-tool_convert.lo \
	libcurltool_la-tool_dirhie.lo libcurltool_la-tool_doswin.lo \
	libcurltool_la-tool_easysrc.lo libcurltool_la-tool_filetime.lo \
	libcurltool_la-tool_formparse.lo \
	libcurltool_la-tool_getparam.lo libcurltool_la-tool_getpass.lo \
	libcurltool_la-tool_help.lo libcurltool_la-tool_helpers.lo \
	libcurltool_la-tool_homedir.lo libcurltool_la-tool_hugehelp.lo \
	libcurltool_la-tool_libinfo.lo libcurltool_la-tool_main.lo \
	libcurltool_la-tool_metalink.lo libcurltool_la-tool_msgs.lo \
	libcurltool_la-tool_operate.lo libcurltool_la-tool_operhlp.lo \
	libcurltool_la-tool_panykey.lo libcurltool_la-tool_paramhlp.lo \
	libcurltool_la-tool_parsecfg.lo \
	libcurltool_la-tool_progress.lo libcurltool_la-tool_strdup.lo \
	libcurltool_la-tool_setopt.lo libcurltool_la-tool_sleep.lo \
	libcurltool_la-tool_urlglob.lo libcurltool_la-tool_util.lo \
	libcurltool_la-tool_vms.lo libcurltool_la-tool_writeout.lo \
	libcurltool_la-tool_xattr.lo
am__dirstamp = $(am__leading_dot)dirstamp
am__objects_2 = ../lib/libcurltool_la-strtoofft.lo \
	../lib/libcurltool_la-nonblock.lo \
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
	curl-tool_getparam.$(OBJEXT) curl-tool_getpass.$(OBJEXT) \
	curl-tool_help.$(OBJEXT) curl-tool_helpers.$(OBJEXT) \
	curl-tool_homedir.$(OBJEXT) curl-tool_hugehelp.$(OBJEXT) \
	curl-tool_libinfo.$(OBJEXT) curl-tool_main.$(OBJEXT) \
	curl-tool_metalink.$(OBJEXT) curl-tool_msgs.$(OBJEXT) \
	curl-tool_operate.$(OBJEXT) curl-tool_operhlp.$(OBJEXT) \
	curl-tool_panykey.$(OBJEXT) curl-tool_paramhlp.$(OBJEXT) \
	curl-tool_parsecfg.$(OBJEXT) curl-tool_strdup.$(OBJEXT) \
	curl-tool_setopt.$(OBJEXT) curl-tool_sleep.$(OBJEXT) \
	curl-tool_urlglob.$(OBJEXT) curl-tool_util.$(OBJEXT) \
	curl-tool_vms.$(OBJEXT) curl-tool_writeout.$(OBJEXT) \
	curl-tool_xattr.$(OBJEXT)
am__objects_7 = ../lib/curl-strtoofft.$(OBJEXT) \
	../lib/curl-nonblock.$(OBJEXT) ../lib/curl-warnless.$(OBJEXT) \
	../lib/curl-curl_ctype.$(OBJEXT)
am__objects_8 = $(am__objects_6) $(am__objects_7) $(am__objects_3)
am_curl_OBJECTS = $(am__objects_8)
curl_OBJECTS = $(am_curl_OBJECTS)
@USE_EXPLICIT_LIB_DEPS_FALSE@curl_DEPENDENCIES =  \







|
|
|
|
|







206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
	curl-tool_getparam.$(OBJEXT) curl-tool_getpass.$(OBJEXT) \
	curl-tool_help.$(OBJEXT) curl-tool_helpers.$(OBJEXT) \
	curl-tool_homedir.$(OBJEXT) curl-tool_hugehelp.$(OBJEXT) \
	curl-tool_libinfo.$(OBJEXT) curl-tool_main.$(OBJEXT) \
	curl-tool_metalink.$(OBJEXT) curl-tool_msgs.$(OBJEXT) \
	curl-tool_operate.$(OBJEXT) curl-tool_operhlp.$(OBJEXT) \
	curl-tool_panykey.$(OBJEXT) curl-tool_paramhlp.$(OBJEXT) \
	curl-tool_parsecfg.$(OBJEXT) curl-tool_progress.$(OBJEXT) \
	curl-tool_strdup.$(OBJEXT) curl-tool_setopt.$(OBJEXT) \
	curl-tool_sleep.$(OBJEXT) curl-tool_urlglob.$(OBJEXT) \
	curl-tool_util.$(OBJEXT) curl-tool_vms.$(OBJEXT) \
	curl-tool_writeout.$(OBJEXT) curl-tool_xattr.$(OBJEXT)
am__objects_7 = ../lib/curl-strtoofft.$(OBJEXT) \
	../lib/curl-nonblock.$(OBJEXT) ../lib/curl-warnless.$(OBJEXT) \
	../lib/curl-curl_ctype.$(OBJEXT)
am__objects_8 = $(am__objects_6) $(am__objects_7) $(am__objects_3)
am_curl_OBJECTS = $(am__objects_8)
curl_OBJECTS = $(am_curl_OBJECTS)
@USE_EXPLICIT_LIB_DEPS_FALSE@curl_DEPENDENCIES =  \
272
273
274
275
276
277
278

279
280
281
282
283
284
285
	./$(DEPDIR)/curl-tool_libinfo.Po ./$(DEPDIR)/curl-tool_main.Po \
	./$(DEPDIR)/curl-tool_metalink.Po \
	./$(DEPDIR)/curl-tool_msgs.Po ./$(DEPDIR)/curl-tool_operate.Po \
	./$(DEPDIR)/curl-tool_operhlp.Po \
	./$(DEPDIR)/curl-tool_panykey.Po \
	./$(DEPDIR)/curl-tool_paramhlp.Po \
	./$(DEPDIR)/curl-tool_parsecfg.Po \

	./$(DEPDIR)/curl-tool_setopt.Po ./$(DEPDIR)/curl-tool_sleep.Po \
	./$(DEPDIR)/curl-tool_strdup.Po \
	./$(DEPDIR)/curl-tool_urlglob.Po ./$(DEPDIR)/curl-tool_util.Po \
	./$(DEPDIR)/curl-tool_vms.Po ./$(DEPDIR)/curl-tool_writeout.Po \
	./$(DEPDIR)/curl-tool_xattr.Po \
	./$(DEPDIR)/libcurltool_la-slist_wc.Plo \
	./$(DEPDIR)/libcurltool_la-tool_binmode.Plo \







>







273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
	./$(DEPDIR)/curl-tool_libinfo.Po ./$(DEPDIR)/curl-tool_main.Po \
	./$(DEPDIR)/curl-tool_metalink.Po \
	./$(DEPDIR)/curl-tool_msgs.Po ./$(DEPDIR)/curl-tool_operate.Po \
	./$(DEPDIR)/curl-tool_operhlp.Po \
	./$(DEPDIR)/curl-tool_panykey.Po \
	./$(DEPDIR)/curl-tool_paramhlp.Po \
	./$(DEPDIR)/curl-tool_parsecfg.Po \
	./$(DEPDIR)/curl-tool_progress.Po \
	./$(DEPDIR)/curl-tool_setopt.Po ./$(DEPDIR)/curl-tool_sleep.Po \
	./$(DEPDIR)/curl-tool_strdup.Po \
	./$(DEPDIR)/curl-tool_urlglob.Po ./$(DEPDIR)/curl-tool_util.Po \
	./$(DEPDIR)/curl-tool_vms.Po ./$(DEPDIR)/curl-tool_writeout.Po \
	./$(DEPDIR)/curl-tool_xattr.Po \
	./$(DEPDIR)/libcurltool_la-slist_wc.Plo \
	./$(DEPDIR)/libcurltool_la-tool_binmode.Plo \
308
309
310
311
312
313
314

315
316
317
318
319
320
321
	./$(DEPDIR)/libcurltool_la-tool_metalink.Plo \
	./$(DEPDIR)/libcurltool_la-tool_msgs.Plo \
	./$(DEPDIR)/libcurltool_la-tool_operate.Plo \
	./$(DEPDIR)/libcurltool_la-tool_operhlp.Plo \
	./$(DEPDIR)/libcurltool_la-tool_panykey.Plo \
	./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo \
	./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo \

	./$(DEPDIR)/libcurltool_la-tool_setopt.Plo \
	./$(DEPDIR)/libcurltool_la-tool_sleep.Plo \
	./$(DEPDIR)/libcurltool_la-tool_strdup.Plo \
	./$(DEPDIR)/libcurltool_la-tool_urlglob.Plo \
	./$(DEPDIR)/libcurltool_la-tool_util.Plo \
	./$(DEPDIR)/libcurltool_la-tool_vms.Plo \
	./$(DEPDIR)/libcurltool_la-tool_writeout.Plo \







>







310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
	./$(DEPDIR)/libcurltool_la-tool_metalink.Plo \
	./$(DEPDIR)/libcurltool_la-tool_msgs.Plo \
	./$(DEPDIR)/libcurltool_la-tool_operate.Plo \
	./$(DEPDIR)/libcurltool_la-tool_operhlp.Plo \
	./$(DEPDIR)/libcurltool_la-tool_panykey.Plo \
	./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo \
	./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo \
	./$(DEPDIR)/libcurltool_la-tool_progress.Plo \
	./$(DEPDIR)/libcurltool_la-tool_setopt.Plo \
	./$(DEPDIR)/libcurltool_la-tool_sleep.Plo \
	./$(DEPDIR)/libcurltool_la-tool_strdup.Plo \
	./$(DEPDIR)/libcurltool_la-tool_urlglob.Plo \
	./$(DEPDIR)/libcurltool_la-tool_util.Plo \
	./$(DEPDIR)/libcurltool_la-tool_vms.Plo \
	./$(DEPDIR)/libcurltool_la-tool_writeout.Plo \
545
546
547
548
549
550
551



552
553

554
555
556
557
558
559
560
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
697
698
699
700
701
702
703

704
705
706
707
708
709
710
  tool_metalink.c \
  tool_msgs.c \
  tool_operate.c \
  tool_operhlp.c \
  tool_panykey.c \
  tool_paramhlp.c \
  tool_parsecfg.c \

  tool_strdup.c \
  tool_setopt.c \
  tool_sleep.c \
  tool_urlglob.c \
  tool_util.c \
  tool_vms.c \
  tool_writeout.c \







>







704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
  tool_metalink.c \
  tool_msgs.c \
  tool_operate.c \
  tool_operhlp.c \
  tool_panykey.c \
  tool_paramhlp.c \
  tool_parsecfg.c \
  tool_progress.c \
  tool_strdup.c \
  tool_setopt.c \
  tool_sleep.c \
  tool_urlglob.c \
  tool_util.c \
  tool_vms.c \
  tool_writeout.c \
738
739
740
741
742
743
744

745
746
747
748
749
750
751
  tool_metalink.h \
  tool_msgs.h \
  tool_operate.h \
  tool_operhlp.h \
  tool_panykey.h \
  tool_paramhlp.h \
  tool_parsecfg.h \

  tool_sdecls.h \
  tool_setopt.h \
  tool_setup.h \
  tool_sleep.h \
  tool_strdup.h \
  tool_urlglob.h \
  tool_util.h \







>







746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
  tool_metalink.h \
  tool_msgs.h \
  tool_operate.h \
  tool_operhlp.h \
  tool_panykey.h \
  tool_paramhlp.h \
  tool_parsecfg.h \
  tool_progress.h \
  tool_sdecls.h \
  tool_setopt.h \
  tool_setup.h \
  tool_sleep.h \
  tool_strdup.h \
  tool_urlglob.h \
  tool_util.h \
964
965
966
967
968
969
970

971
972
973
974
975
976
977
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_metalink.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_msgs.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_operate.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_operhlp.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_panykey.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_paramhlp.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_parsecfg.Po@am__quote@ # am--include-marker

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_setopt.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_sleep.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_strdup.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_urlglob.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_util.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_vms.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_writeout.Po@am__quote@ # am--include-marker







>







973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_metalink.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_msgs.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_operate.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_operhlp.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_panykey.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_paramhlp.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_parsecfg.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_progress.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_setopt.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_sleep.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_strdup.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_urlglob.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_util.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_vms.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curl-tool_writeout.Po@am__quote@ # am--include-marker
1003
1004
1005
1006
1007
1008
1009

1010
1011
1012
1013
1014
1015
1016
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_metalink.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_msgs.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_operate.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_operhlp.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_panykey.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo@am__quote@ # am--include-marker

@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_setopt.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_sleep.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_strdup.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_urlglob.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_util.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_vms.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_writeout.Plo@am__quote@ # am--include-marker







>







1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_metalink.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_msgs.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_operate.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_operhlp.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_panykey.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_progress.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_setopt.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_sleep.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_strdup.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_urlglob.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_util.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_vms.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcurltool_la-tool_writeout.Plo@am__quote@ # am--include-marker
1259
1260
1261
1262
1263
1264
1265







1266
1267
1268
1269
1270
1271
1272
libcurltool_la-tool_parsecfg.lo: tool_parsecfg.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-tool_parsecfg.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_parsecfg.Tpo -c -o libcurltool_la-tool_parsecfg.lo `test -f 'tool_parsecfg.c' || echo '$(srcdir)/'`tool_parsecfg.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_parsecfg.Tpo $(DEPDIR)/libcurltool_la-tool_parsecfg.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_parsecfg.c' object='libcurltool_la-tool_parsecfg.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-tool_parsecfg.lo `test -f 'tool_parsecfg.c' || echo '$(srcdir)/'`tool_parsecfg.c








libcurltool_la-tool_strdup.lo: tool_strdup.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-tool_strdup.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_strdup.Tpo -c -o libcurltool_la-tool_strdup.lo `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_strdup.Tpo $(DEPDIR)/libcurltool_la-tool_strdup.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_strdup.c' object='libcurltool_la-tool_strdup.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-tool_strdup.lo `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c








>
>
>
>
>
>
>







1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
libcurltool_la-tool_parsecfg.lo: tool_parsecfg.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-tool_parsecfg.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_parsecfg.Tpo -c -o libcurltool_la-tool_parsecfg.lo `test -f 'tool_parsecfg.c' || echo '$(srcdir)/'`tool_parsecfg.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_parsecfg.Tpo $(DEPDIR)/libcurltool_la-tool_parsecfg.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_parsecfg.c' object='libcurltool_la-tool_parsecfg.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-tool_parsecfg.lo `test -f 'tool_parsecfg.c' || echo '$(srcdir)/'`tool_parsecfg.c

libcurltool_la-tool_progress.lo: tool_progress.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-tool_progress.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_progress.Tpo -c -o libcurltool_la-tool_progress.lo `test -f 'tool_progress.c' || echo '$(srcdir)/'`tool_progress.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_progress.Tpo $(DEPDIR)/libcurltool_la-tool_progress.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_progress.c' object='libcurltool_la-tool_progress.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-tool_progress.lo `test -f 'tool_progress.c' || echo '$(srcdir)/'`tool_progress.c

libcurltool_la-tool_strdup.lo: tool_strdup.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -MT libcurltool_la-tool_strdup.lo -MD -MP -MF $(DEPDIR)/libcurltool_la-tool_strdup.Tpo -c -o libcurltool_la-tool_strdup.lo `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libcurltool_la-tool_strdup.Tpo $(DEPDIR)/libcurltool_la-tool_strdup.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_strdup.c' object='libcurltool_la-tool_strdup.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcurltool_la_CPPFLAGS) $(CPPFLAGS) $(libcurltool_la_CFLAGS) $(CFLAGS) -c -o libcurltool_la-tool_strdup.lo `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c

1777
1778
1779
1780
1781
1782
1783














1784
1785
1786
1787
1788
1789
1790
curl-tool_parsecfg.obj: tool_parsecfg.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_parsecfg.obj -MD -MP -MF $(DEPDIR)/curl-tool_parsecfg.Tpo -c -o curl-tool_parsecfg.obj `if test -f 'tool_parsecfg.c'; then $(CYGPATH_W) 'tool_parsecfg.c'; else $(CYGPATH_W) '$(srcdir)/tool_parsecfg.c'; fi`
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_parsecfg.Tpo $(DEPDIR)/curl-tool_parsecfg.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_parsecfg.c' object='curl-tool_parsecfg.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_parsecfg.obj `if test -f 'tool_parsecfg.c'; then $(CYGPATH_W) 'tool_parsecfg.c'; else $(CYGPATH_W) '$(srcdir)/tool_parsecfg.c'; fi`















curl-tool_strdup.o: tool_strdup.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_strdup.o -MD -MP -MF $(DEPDIR)/curl-tool_strdup.Tpo -c -o curl-tool_strdup.o `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_strdup.Tpo $(DEPDIR)/curl-tool_strdup.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_strdup.c' object='curl-tool_strdup.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_strdup.o `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c








>
>
>
>
>
>
>
>
>
>
>
>
>
>







1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
curl-tool_parsecfg.obj: tool_parsecfg.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_parsecfg.obj -MD -MP -MF $(DEPDIR)/curl-tool_parsecfg.Tpo -c -o curl-tool_parsecfg.obj `if test -f 'tool_parsecfg.c'; then $(CYGPATH_W) 'tool_parsecfg.c'; else $(CYGPATH_W) '$(srcdir)/tool_parsecfg.c'; fi`
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_parsecfg.Tpo $(DEPDIR)/curl-tool_parsecfg.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_parsecfg.c' object='curl-tool_parsecfg.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_parsecfg.obj `if test -f 'tool_parsecfg.c'; then $(CYGPATH_W) 'tool_parsecfg.c'; else $(CYGPATH_W) '$(srcdir)/tool_parsecfg.c'; fi`

curl-tool_progress.o: tool_progress.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_progress.o -MD -MP -MF $(DEPDIR)/curl-tool_progress.Tpo -c -o curl-tool_progress.o `test -f 'tool_progress.c' || echo '$(srcdir)/'`tool_progress.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_progress.Tpo $(DEPDIR)/curl-tool_progress.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_progress.c' object='curl-tool_progress.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_progress.o `test -f 'tool_progress.c' || echo '$(srcdir)/'`tool_progress.c

curl-tool_progress.obj: tool_progress.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_progress.obj -MD -MP -MF $(DEPDIR)/curl-tool_progress.Tpo -c -o curl-tool_progress.obj `if test -f 'tool_progress.c'; then $(CYGPATH_W) 'tool_progress.c'; else $(CYGPATH_W) '$(srcdir)/tool_progress.c'; fi`
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_progress.Tpo $(DEPDIR)/curl-tool_progress.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_progress.c' object='curl-tool_progress.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_progress.obj `if test -f 'tool_progress.c'; then $(CYGPATH_W) 'tool_progress.c'; else $(CYGPATH_W) '$(srcdir)/tool_progress.c'; fi`

curl-tool_strdup.o: tool_strdup.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT curl-tool_strdup.o -MD -MP -MF $(DEPDIR)/curl-tool_strdup.Tpo -c -o curl-tool_strdup.o `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/curl-tool_strdup.Tpo $(DEPDIR)/curl-tool_strdup.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='tool_strdup.c' object='curl-tool_strdup.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o curl-tool_strdup.o `test -f 'tool_strdup.c' || echo '$(srcdir)/'`tool_strdup.c

2196
2197
2198
2199
2200
2201
2202

2203
2204
2205
2206
2207
2208
2209
	-rm -f ./$(DEPDIR)/curl-tool_metalink.Po
	-rm -f ./$(DEPDIR)/curl-tool_msgs.Po
	-rm -f ./$(DEPDIR)/curl-tool_operate.Po
	-rm -f ./$(DEPDIR)/curl-tool_operhlp.Po
	-rm -f ./$(DEPDIR)/curl-tool_panykey.Po
	-rm -f ./$(DEPDIR)/curl-tool_paramhlp.Po
	-rm -f ./$(DEPDIR)/curl-tool_parsecfg.Po

	-rm -f ./$(DEPDIR)/curl-tool_setopt.Po
	-rm -f ./$(DEPDIR)/curl-tool_sleep.Po
	-rm -f ./$(DEPDIR)/curl-tool_strdup.Po
	-rm -f ./$(DEPDIR)/curl-tool_urlglob.Po
	-rm -f ./$(DEPDIR)/curl-tool_util.Po
	-rm -f ./$(DEPDIR)/curl-tool_vms.Po
	-rm -f ./$(DEPDIR)/curl-tool_writeout.Po







>







2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
	-rm -f ./$(DEPDIR)/curl-tool_metalink.Po
	-rm -f ./$(DEPDIR)/curl-tool_msgs.Po
	-rm -f ./$(DEPDIR)/curl-tool_operate.Po
	-rm -f ./$(DEPDIR)/curl-tool_operhlp.Po
	-rm -f ./$(DEPDIR)/curl-tool_panykey.Po
	-rm -f ./$(DEPDIR)/curl-tool_paramhlp.Po
	-rm -f ./$(DEPDIR)/curl-tool_parsecfg.Po
	-rm -f ./$(DEPDIR)/curl-tool_progress.Po
	-rm -f ./$(DEPDIR)/curl-tool_setopt.Po
	-rm -f ./$(DEPDIR)/curl-tool_sleep.Po
	-rm -f ./$(DEPDIR)/curl-tool_strdup.Po
	-rm -f ./$(DEPDIR)/curl-tool_urlglob.Po
	-rm -f ./$(DEPDIR)/curl-tool_util.Po
	-rm -f ./$(DEPDIR)/curl-tool_vms.Po
	-rm -f ./$(DEPDIR)/curl-tool_writeout.Po
2235
2236
2237
2238
2239
2240
2241

2242
2243
2244
2245
2246
2247
2248
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_metalink.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_msgs.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_operate.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_operhlp.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_panykey.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo

	-rm -f ./$(DEPDIR)/libcurltool_la-tool_setopt.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_sleep.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_strdup.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_urlglob.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_util.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_vms.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_writeout.Plo







>







2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_metalink.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_msgs.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_operate.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_operhlp.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_panykey.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_progress.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_setopt.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_sleep.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_strdup.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_urlglob.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_util.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_vms.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_writeout.Plo
2327
2328
2329
2330
2331
2332
2333

2334
2335
2336
2337
2338
2339
2340
	-rm -f ./$(DEPDIR)/curl-tool_metalink.Po
	-rm -f ./$(DEPDIR)/curl-tool_msgs.Po
	-rm -f ./$(DEPDIR)/curl-tool_operate.Po
	-rm -f ./$(DEPDIR)/curl-tool_operhlp.Po
	-rm -f ./$(DEPDIR)/curl-tool_panykey.Po
	-rm -f ./$(DEPDIR)/curl-tool_paramhlp.Po
	-rm -f ./$(DEPDIR)/curl-tool_parsecfg.Po

	-rm -f ./$(DEPDIR)/curl-tool_setopt.Po
	-rm -f ./$(DEPDIR)/curl-tool_sleep.Po
	-rm -f ./$(DEPDIR)/curl-tool_strdup.Po
	-rm -f ./$(DEPDIR)/curl-tool_urlglob.Po
	-rm -f ./$(DEPDIR)/curl-tool_util.Po
	-rm -f ./$(DEPDIR)/curl-tool_vms.Po
	-rm -f ./$(DEPDIR)/curl-tool_writeout.Po







>







2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
	-rm -f ./$(DEPDIR)/curl-tool_metalink.Po
	-rm -f ./$(DEPDIR)/curl-tool_msgs.Po
	-rm -f ./$(DEPDIR)/curl-tool_operate.Po
	-rm -f ./$(DEPDIR)/curl-tool_operhlp.Po
	-rm -f ./$(DEPDIR)/curl-tool_panykey.Po
	-rm -f ./$(DEPDIR)/curl-tool_paramhlp.Po
	-rm -f ./$(DEPDIR)/curl-tool_parsecfg.Po
	-rm -f ./$(DEPDIR)/curl-tool_progress.Po
	-rm -f ./$(DEPDIR)/curl-tool_setopt.Po
	-rm -f ./$(DEPDIR)/curl-tool_sleep.Po
	-rm -f ./$(DEPDIR)/curl-tool_strdup.Po
	-rm -f ./$(DEPDIR)/curl-tool_urlglob.Po
	-rm -f ./$(DEPDIR)/curl-tool_util.Po
	-rm -f ./$(DEPDIR)/curl-tool_vms.Po
	-rm -f ./$(DEPDIR)/curl-tool_writeout.Po
2366
2367
2368
2369
2370
2371
2372

2373
2374
2375
2376
2377
2378
2379
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_metalink.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_msgs.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_operate.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_operhlp.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_panykey.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo

	-rm -f ./$(DEPDIR)/libcurltool_la-tool_setopt.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_sleep.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_strdup.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_urlglob.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_util.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_vms.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_writeout.Plo







>







2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_metalink.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_msgs.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_operate.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_operhlp.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_panykey.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_paramhlp.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_parsecfg.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_progress.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_setopt.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_sleep.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_strdup.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_urlglob.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_util.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_vms.Plo
	-rm -f ./$(DEPDIR)/libcurltool_la-tool_writeout.Plo
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@	echo '#ifndef HAVE_LIBZ' >> $(HUGE);                    \
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE);     \
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@	echo '#else' >> $(HUGE);                                \
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c >> $(HUGE);  \
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@	echo '#endif /* HAVE_LIBZ */' >> $(HUGE) )
# This generates the tool_hugehelp.c file uncompressed only
@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@$(HUGE): $(MANPAGE) $(MKHELP)
@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@	$(HUGECMD)(echo '#include "tool_setup.h"' > $(HUGE):    \
@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE) )

# built-in manual has been disabled, make a blank file
@USE_MANUAL_FALSE@$(HUGE):
@USE_MANUAL_FALSE@	$(HUGECMD)(echo "/* built-in manual is disabled, blank function */" > $(HUGE); \
@USE_MANUAL_FALSE@	echo '#include "tool_hugehelp.h"' >> $(HUGE); \
@USE_MANUAL_FALSE@	echo "void hugehelp(void) {}" >>$(HUGE) )







|







2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@	echo '#ifndef HAVE_LIBZ' >> $(HUGE);                    \
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE);     \
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@	echo '#else' >> $(HUGE);                                \
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) -c >> $(HUGE);  \
@HAVE_LIBZ_TRUE@@USE_MANUAL_TRUE@	echo '#endif /* HAVE_LIBZ */' >> $(HUGE) )
# This generates the tool_hugehelp.c file uncompressed only
@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@$(HUGE): $(MANPAGE) $(MKHELP)
@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@	$(HUGECMD)(echo '#include "tool_setup.h"' > $(HUGE);    \
@HAVE_LIBZ_FALSE@@USE_MANUAL_TRUE@	$(NROFF) $(MANPAGE) | $(PERL) $(MKHELP) >> $(HUGE) )

# built-in manual has been disabled, make a blank file
@USE_MANUAL_FALSE@$(HUGE):
@USE_MANUAL_FALSE@	$(HUGECMD)(echo "/* built-in manual is disabled, blank function */" > $(HUGE); \
@USE_MANUAL_FALSE@	echo '#include "tool_hugehelp.h"' >> $(HUGE); \
@USE_MANUAL_FALSE@	echo "void hugehelp(void) {}" >>$(HUGE) )
Changes to jni/curl/src/Makefile.inc.
50
51
52
53
54
55
56

57
58
59
60
61
62
63
  tool_metalink.c \
  tool_msgs.c \
  tool_operate.c \
  tool_operhlp.c \
  tool_panykey.c \
  tool_paramhlp.c \
  tool_parsecfg.c \

  tool_strdup.c \
  tool_setopt.c \
  tool_sleep.c \
  tool_urlglob.c \
  tool_util.c \
  tool_vms.c \
  tool_writeout.c \







>







50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  tool_metalink.c \
  tool_msgs.c \
  tool_operate.c \
  tool_operhlp.c \
  tool_panykey.c \
  tool_paramhlp.c \
  tool_parsecfg.c \
  tool_progress.c \
  tool_strdup.c \
  tool_setopt.c \
  tool_sleep.c \
  tool_urlglob.c \
  tool_util.c \
  tool_vms.c \
  tool_writeout.c \
91
92
93
94
95
96
97

98
99
100
101
102
103
104
  tool_metalink.h \
  tool_msgs.h \
  tool_operate.h \
  tool_operhlp.h \
  tool_panykey.h \
  tool_paramhlp.h \
  tool_parsecfg.h \

  tool_sdecls.h \
  tool_setopt.h \
  tool_setup.h \
  tool_sleep.h \
  tool_strdup.h \
  tool_urlglob.h \
  tool_util.h \







>







92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  tool_metalink.h \
  tool_msgs.h \
  tool_operate.h \
  tool_operhlp.h \
  tool_panykey.h \
  tool_paramhlp.h \
  tool_parsecfg.h \
  tool_progress.h \
  tool_sdecls.h \
  tool_setopt.h \
  tool_setup.h \
  tool_sleep.h \
  tool_strdup.h \
  tool_urlglob.h \
  tool_util.h \
Changes to jni/curl/src/tool_cb_hdr.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
28
29
30
31
32
33
34

35
36
37
38
39
40
41
#include "curlx.h"

#include "tool_cfgable.h"
#include "tool_doswin.h"
#include "tool_msgs.h"
#include "tool_cb_hdr.h"
#include "tool_cb_wrt.h"


#include "memdebug.h" /* keep this as LAST include */

static char *parse_filename(const char *ptr, size_t len);

#ifdef WIN32
#define BOLD







>







28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "curlx.h"

#include "tool_cfgable.h"
#include "tool_doswin.h"
#include "tool_msgs.h"
#include "tool_cb_hdr.h"
#include "tool_cb_wrt.h"
#include "tool_operate.h"

#include "memdebug.h" /* keep this as LAST include */

static char *parse_filename(const char *ptr, size_t len);

#ifdef WIN32
#define BOLD
50
51
52
53
54
55
56

57
58
59
60
61
62
63
64
65
66

/*
** callback for CURLOPT_HEADERFUNCTION
*/

size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
{

  struct HdrCbData *hdrcbdata = userdata;
  struct OutStruct *outs = hdrcbdata->outs;
  struct OutStruct *heads = hdrcbdata->heads;
  const char *str = ptr;
  const size_t cb = size * nmemb;
  const char *end = (char *)ptr + cb;
  long protocol = 0;

  /*
   * Once that libcurl has called back tool_header_cb() the returned value







>
|
|
|







51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

/*
** callback for CURLOPT_HEADERFUNCTION
*/

size_t tool_header_cb(char *ptr, size_t size, size_t nmemb, void *userdata)
{
  struct per_transfer *per = userdata;
  struct HdrCbData *hdrcbdata = &per->hdrcbdata;
  struct OutStruct *outs = &per->outs;
  struct OutStruct *heads = &per->heads;
  const char *str = ptr;
  const size_t cb = size * nmemb;
  const char *end = (char *)ptr + cb;
  long protocol = 0;

  /*
   * Once that libcurl has called back tool_header_cb() the returned value
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  /*
   * This callback sets the filename where output shall be written when
   * curl options --remote-name (-O) and --remote-header-name (-J) have
   * been simultaneously given and additionally server returns an HTTP
   * Content-Disposition header specifying a filename property.
   */

  curl_easy_getinfo(outs->config->easy, CURLINFO_PROTOCOL, &protocol);
  if(hdrcbdata->honor_cd_filename &&
     (cb > 20) && checkprefix("Content-disposition:", str) &&
     (protocol & (CURLPROTO_HTTPS|CURLPROTO_HTTP))) {
    const char *p = str + 20;

    /* look for the 'filename=' parameter
       (encoded filenames (*=) are not supported) */







|







98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  /*
   * This callback sets the filename where output shall be written when
   * curl options --remote-name (-O) and --remote-header-name (-J) have
   * been simultaneously given and additionally server returns an HTTP
   * Content-Disposition header specifying a filename property.
   */

  curl_easy_getinfo(per->curl, CURLINFO_PROTOCOL, &protocol);
  if(hdrcbdata->honor_cd_filename &&
     (cb > 20) && checkprefix("Content-disposition:", str) &&
     (protocol & (CURLPROTO_HTTPS|CURLPROTO_HTTP))) {
    const char *p = str + 20;

    /* look for the 'filename=' parameter
       (encoded filenames (*=) are not supported) */
Changes to jni/curl/src/tool_cb_wrt.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
24
25
26
27
28
29
30

31
32
33
34
35
36
37
#define ENABLE_CURLX_PRINTF
/* use our own printf() functions */
#include "curlx.h"

#include "tool_cfgable.h"
#include "tool_msgs.h"
#include "tool_cb_wrt.h"


#include "memdebug.h" /* keep this as LAST include */

/* create a local file for writing, return TRUE on success */
bool tool_create_output_file(struct OutStruct *outs)
{
  struct GlobalConfig *global = outs->config->global;







>







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define ENABLE_CURLX_PRINTF
/* use our own printf() functions */
#include "curlx.h"

#include "tool_cfgable.h"
#include "tool_msgs.h"
#include "tool_cb_wrt.h"
#include "tool_operate.h"

#include "memdebug.h" /* keep this as LAST include */

/* create a local file for writing, return TRUE on success */
bool tool_create_output_file(struct OutStruct *outs)
{
  struct GlobalConfig *global = outs->config->global;
71
72
73
74
75
76
77

78
79
80
81
82
83
84
85
/*
** callback for CURLOPT_WRITEFUNCTION
*/

size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
{
  size_t rc;

  struct OutStruct *outs = userdata;
  struct OperationConfig *config = outs->config;
  size_t bytes = sz * nmemb;
  bool is_tty = config->global->isatty;
#ifdef WIN32
  CONSOLE_SCREEN_BUFFER_INFO console_info;
  intptr_t fhnd;
#endif







>
|







72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
** callback for CURLOPT_WRITEFUNCTION
*/

size_t tool_write_cb(char *buffer, size_t sz, size_t nmemb, void *userdata)
{
  size_t rc;
  struct per_transfer *per = userdata;
  struct OutStruct *outs = &per->outs;
  struct OperationConfig *config = outs->config;
  size_t bytes = sz * nmemb;
  bool is_tty = config->global->isatty;
#ifdef WIN32
  CONSOLE_SCREEN_BUFFER_INFO console_info;
  intptr_t fhnd;
#endif
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216

  if(bytes == rc)
    /* we added this amount of data to the output */
    outs->bytes += bytes;

  if(config->readbusy) {
    config->readbusy = FALSE;
    curl_easy_pause(config->easy, CURLPAUSE_CONT);
  }

  if(config->nobuffer) {
    /* output buffering disabled */
    int res = fflush(outs->stream);
    if(res)
      return failure;
  }

  return rc;
}







|











200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218

  if(bytes == rc)
    /* we added this amount of data to the output */
    outs->bytes += bytes;

  if(config->readbusy) {
    config->readbusy = FALSE;
    curl_easy_pause(per->curl, CURLPAUSE_CONT);
  }

  if(config->nobuffer) {
    /* output buffering disabled */
    int res = fflush(outs->stream);
    if(res)
      return failure;
  }

  return rc;
}
Changes to jni/curl/src/tool_cfgable.c.
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  config->proto_redir = CURLPROTO_ALL & /* All except FILE, SCP and SMB */
    ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB |
      CURLPROTO_SMBS);
  config->proto_redir_present = FALSE;
  config->proto_default = NULL;
  config->tcp_nodelay = TRUE; /* enabled by default */
  config->happy_eyeballs_timeout_ms = CURL_HET_DEFAULT;
  config->http09_allowed = TRUE;
}

static void free_config_fields(struct OperationConfig *config)
{
  struct getout *urlnode;

  Curl_safefree(config->random_file);







|







39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  config->proto_redir = CURLPROTO_ALL & /* All except FILE, SCP and SMB */
    ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB |
      CURLPROTO_SMBS);
  config->proto_redir_present = FALSE;
  config->proto_default = NULL;
  config->tcp_nodelay = TRUE; /* enabled by default */
  config->happy_eyeballs_timeout_ms = CURL_HET_DEFAULT;
  config->http09_allowed = FALSE;
}

static void free_config_fields(struct OperationConfig *config)
{
  struct getout *urlnode;

  Curl_safefree(config->random_file);
129
130
131
132
133
134
135

136
137
138
139
140
141
142
  Curl_safefree(config->hostpubmd5);
  Curl_safefree(config->engine);
  Curl_safefree(config->request_target);
  Curl_safefree(config->customrequest);
  Curl_safefree(config->krblevel);

  Curl_safefree(config->oauth_bearer);


  Curl_safefree(config->unix_socket_path);
  Curl_safefree(config->writeout);
  Curl_safefree(config->proto_default);

  curl_slist_free_all(config->quote);
  curl_slist_free_all(config->postquote);







>







129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
  Curl_safefree(config->hostpubmd5);
  Curl_safefree(config->engine);
  Curl_safefree(config->request_target);
  Curl_safefree(config->customrequest);
  Curl_safefree(config->krblevel);

  Curl_safefree(config->oauth_bearer);
  Curl_safefree(config->sasl_authzid);

  Curl_safefree(config->unix_socket_path);
  Curl_safefree(config->writeout);
  Curl_safefree(config->proto_default);

  curl_slist_free_all(config->quote);
  curl_slist_free_all(config->postquote);
Changes to jni/curl/src/tool_cfgable.h.
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  ERR_BINARY_TERMINAL = 1, /* binary to terminal detected */
  ERR_LAST
} curl_error;

struct GlobalConfig;

struct OperationConfig {
  CURL *easy;               /* A copy of the handle from GlobalConfig */
  bool remote_time;
  char *random_file;
  char *egd_file;
  char *useragent;
  char *cookie;             /* single line with specified cookies */
  char *cookiejar;          /* write to this file */
  char *cookiefile;         /* read from this file */







<







34
35
36
37
38
39
40

41
42
43
44
45
46
47
  ERR_BINARY_TERMINAL = 1, /* binary to terminal detected */
  ERR_LAST
} curl_error;

struct GlobalConfig;

struct OperationConfig {

  bool remote_time;
  char *random_file;
  char *egd_file;
  char *useragent;
  char *cookie;             /* single line with specified cookies */
  char *cookiejar;          /* write to this file */
  char *cookiefile;         /* read from this file */
93
94
95
96
97
98
99

100
101
102
103
104
105
106
  char *proxyuserpwd;
  char *proxy;
  int proxyver;             /* set to CURLPROXY_HTTP* define */
  char *noproxy;
  char *mail_from;
  struct curl_slist *mail_rcpt;
  char *mail_auth;

  bool sasl_ir;             /* Enable/disable SASL initial response */
  bool proxytunnel;
  bool ftp_append;          /* APPE on ftp */
  bool use_ascii;           /* select ascii or text transfer */
  bool autoreferer;         /* automatically set referer */
  bool failonerror;         /* fail on (HTTP) errors */
  bool show_headers;        /* show headers to data output */







>







92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  char *proxyuserpwd;
  char *proxy;
  int proxyver;             /* set to CURLPROXY_HTTP* define */
  char *noproxy;
  char *mail_from;
  struct curl_slist *mail_rcpt;
  char *mail_auth;
  char *sasl_authzid;       /* Authorisation identity (identity to use) */
  bool sasl_ir;             /* Enable/disable SASL initial response */
  bool proxytunnel;
  bool ftp_append;          /* APPE on ftp */
  bool use_ascii;           /* select ascii or text transfer */
  bool autoreferer;         /* automatically set referer */
  bool failonerror;         /* fail on (HTTP) errors */
  bool show_headers;        /* show headers to data output */
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254

  bool ssl_no_revoke;       /* disable SSL certificate revocation checks */
  /*bool proxy_ssl_no_revoke; */

  bool use_metalink;        /* process given URLs as metalink XML file */
  metalinkfile *metalinkfile_list; /* point to the first node */
  metalinkfile *metalinkfile_last; /* point to the last/current node */
#ifdef CURLDEBUG
  bool test_event_based;
#endif
  char *oauth_bearer;             /* OAuth 2.0 bearer token */
  bool nonpn;                     /* enable/disable TLS NPN extension */
  bool noalpn;                    /* enable/disable TLS ALPN extension */
  char *unix_socket_path;         /* path to Unix domain socket */
  bool abstract_unix_socket;      /* path to an abstract Unix domain socket */
  bool falsestart;
  bool path_as_is;







<
<
<







238
239
240
241
242
243
244



245
246
247
248
249
250
251

  bool ssl_no_revoke;       /* disable SSL certificate revocation checks */
  /*bool proxy_ssl_no_revoke; */

  bool use_metalink;        /* process given URLs as metalink XML file */
  metalinkfile *metalinkfile_list; /* point to the first node */
  metalinkfile *metalinkfile_last; /* point to the last/current node */



  char *oauth_bearer;             /* OAuth 2.0 bearer token */
  bool nonpn;                     /* enable/disable TLS NPN extension */
  bool noalpn;                    /* enable/disable TLS ALPN extension */
  char *unix_socket_path;         /* path to Unix domain socket */
  bool abstract_unix_socket;      /* path to an abstract Unix domain socket */
  bool falsestart;
  bool path_as_is;
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288





289
290
291
292
293
294
295
296
297
  bool disallow_username_in_url;  /* disallow usernames in URLs */
  struct GlobalConfig *global;
  struct OperationConfig *prev;
  struct OperationConfig *next;   /* Always last in the struct */
};

struct GlobalConfig {
  CURL *easy;                     /* Once we have one, we keep it here */
  int showerror;                  /* -1 == unset, default => show errors
                                      0 => -s is used to NOT show errors
                                      1 => -S has been used to show errors */
  bool mute;                      /* don't show messages, --silent given */
  bool noprogress;                /* don't show progress bar --silent given */
  bool isatty;                    /* Updated internally if output is a tty */
  FILE *errors;                   /* Error stream, defaults to stderr */
  bool errors_fopened;            /* Whether error stream isn't stderr */
  char *trace_dump;               /* file to dump the network trace to */
  FILE *trace_stream;
  bool trace_fopened;
  trace tracetype;
  bool tracetime;                 /* include timestamp? */
  int progressmode;               /* CURL_PROGRESS_BAR / CURL_PROGRESS_STATS */
  char *libcurl;                  /* Output libcurl code to this file name */
  bool fail_early;                /* exit on first transfer error */
  bool styled_output;             /* enable fancy output style detection */





  struct OperationConfig *first;
  struct OperationConfig *current;
  struct OperationConfig *last;   /* Always last in the struct */
};

void config_init(struct OperationConfig *config);
void config_free(struct OperationConfig *config);

#endif /* HEADER_CURL_TOOL_CFGABLE_H */







<

















>
>
>
>
>









261
262
263
264
265
266
267

268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
  bool disallow_username_in_url;  /* disallow usernames in URLs */
  struct GlobalConfig *global;
  struct OperationConfig *prev;
  struct OperationConfig *next;   /* Always last in the struct */
};

struct GlobalConfig {

  int showerror;                  /* -1 == unset, default => show errors
                                      0 => -s is used to NOT show errors
                                      1 => -S has been used to show errors */
  bool mute;                      /* don't show messages, --silent given */
  bool noprogress;                /* don't show progress bar --silent given */
  bool isatty;                    /* Updated internally if output is a tty */
  FILE *errors;                   /* Error stream, defaults to stderr */
  bool errors_fopened;            /* Whether error stream isn't stderr */
  char *trace_dump;               /* file to dump the network trace to */
  FILE *trace_stream;
  bool trace_fopened;
  trace tracetype;
  bool tracetime;                 /* include timestamp? */
  int progressmode;               /* CURL_PROGRESS_BAR / CURL_PROGRESS_STATS */
  char *libcurl;                  /* Output libcurl code to this file name */
  bool fail_early;                /* exit on first transfer error */
  bool styled_output;             /* enable fancy output style detection */
#ifdef CURLDEBUG
  bool test_event_based;
#endif
  bool parallel;
  long parallel_max;
  struct OperationConfig *first;
  struct OperationConfig *current;
  struct OperationConfig *last;   /* Always last in the struct */
};

void config_init(struct OperationConfig *config);
void config_free(struct OperationConfig *config);

#endif /* HEADER_CURL_TOOL_CFGABLE_H */
Changes to jni/curl/src/tool_getparam.c.
36
37
38
39
40
41
42

43
44
45
46
47
48
49
#include "tool_getparam.h"
#include "tool_helpers.h"
#include "tool_libinfo.h"
#include "tool_metalink.h"
#include "tool_msgs.h"
#include "tool_paramhlp.h"
#include "tool_parsecfg.h"


#include "memdebug.h" /* keep this as LAST include */

#ifdef MSDOS
#  define USE_WATT32
#endif








>







36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "tool_getparam.h"
#include "tool_helpers.h"
#include "tool_libinfo.h"
#include "tool_metalink.h"
#include "tool_msgs.h"
#include "tool_paramhlp.h"
#include "tool_parsecfg.h"
#include "tool_main.h"

#include "memdebug.h" /* keep this as LAST include */

#ifdef MSDOS
#  define USE_WATT32
#endif

173
174
175
176
177
178
179

180
181
182
183
184
185
186
187
  {"$D", "proto",                    ARG_STRING},
  {"$E", "proto-redir",              ARG_STRING},
  {"$F", "resolve",                  ARG_STRING},
  {"$G", "delegation",               ARG_STRING},
  {"$H", "mail-auth",                ARG_STRING},
  {"$I", "post303",                  ARG_BOOL},
  {"$J", "metalink",                 ARG_BOOL},

  {"$K", "sasl-ir",                  ARG_BOOL},
  {"$L", "test-event",               ARG_BOOL},
  {"$M", "unix-socket",              ARG_FILENAME},
  {"$N", "path-as-is",               ARG_BOOL},
  {"$O", "socks5-gssapi-service",    ARG_STRING},
         /* 'socks5-gssapi-service' merged with'proxy-service-name' and
            deprecated since 7.49.0 */
  {"$O", "proxy-service-name",       ARG_STRING},







>
|







174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
  {"$D", "proto",                    ARG_STRING},
  {"$E", "proto-redir",              ARG_STRING},
  {"$F", "resolve",                  ARG_STRING},
  {"$G", "delegation",               ARG_STRING},
  {"$H", "mail-auth",                ARG_STRING},
  {"$I", "post303",                  ARG_BOOL},
  {"$J", "metalink",                 ARG_BOOL},
  {"$6", "sasl-authzid",             ARG_STRING},
  {"$K", "sasl-ir",                  ARG_BOOL },
  {"$L", "test-event",               ARG_BOOL},
  {"$M", "unix-socket",              ARG_FILENAME},
  {"$N", "path-as-is",               ARG_BOOL},
  {"$O", "socks5-gssapi-service",    ARG_STRING},
         /* 'socks5-gssapi-service' merged with'proxy-service-name' and
            deprecated since 7.49.0 */
  {"$O", "proxy-service-name",       ARG_STRING},
195
196
197
198
199
200
201

202
203
204
205
206
207
208
  {"$Y", "suppress-connect-headers", ARG_BOOL},
  {"$Z", "compressed-ssh",           ARG_BOOL},
  {"$~", "happy-eyeballs-timeout-ms", ARG_STRING},
  {"0",   "http1.0",                 ARG_NONE},
  {"01",  "http1.1",                 ARG_NONE},
  {"02",  "http2",                   ARG_NONE},
  {"03",  "http2-prior-knowledge",   ARG_NONE},

  {"09",  "http0.9",                 ARG_BOOL},
  {"1",  "tlsv1",                    ARG_NONE},
  {"10",  "tlsv1.0",                 ARG_NONE},
  {"11",  "tlsv1.1",                 ARG_NONE},
  {"12",  "tlsv1.2",                 ARG_NONE},
  {"13",  "tlsv1.3",                 ARG_NONE},
  {"1A", "tls13-ciphers",            ARG_STRING},







>







197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  {"$Y", "suppress-connect-headers", ARG_BOOL},
  {"$Z", "compressed-ssh",           ARG_BOOL},
  {"$~", "happy-eyeballs-timeout-ms", ARG_STRING},
  {"0",   "http1.0",                 ARG_NONE},
  {"01",  "http1.1",                 ARG_NONE},
  {"02",  "http2",                   ARG_NONE},
  {"03",  "http2-prior-knowledge",   ARG_NONE},
  {"04",  "http3",                   ARG_NONE},
  {"09",  "http0.9",                 ARG_BOOL},
  {"1",  "tlsv1",                    ARG_NONE},
  {"10",  "tlsv1.0",                 ARG_NONE},
  {"11",  "tlsv1.1",                 ARG_NONE},
  {"12",  "tlsv1.2",                 ARG_NONE},
  {"13",  "tlsv1.3",                 ARG_NONE},
  {"1A", "tls13-ciphers",            ARG_STRING},
312
313
314
315
316
317
318


319
320
321
322
323
324
325
  {"w",  "write-out",                ARG_STRING},
  {"x",  "proxy",                    ARG_STRING},
  {"xa", "preproxy",                 ARG_STRING},
  {"X",  "request",                  ARG_STRING},
  {"Y",  "speed-limit",              ARG_STRING},
  {"y",  "speed-time",               ARG_STRING},
  {"z",  "time-cond",                ARG_STRING},


  {"#",  "progress-bar",             ARG_BOOL},
  {":",  "next",                     ARG_NONE},
};

/* Split the argument of -E to 'certname' and 'passphrase' separated by colon.
 * We allow ':' and '\' to be escaped by '\' so that we can use certificate
 * nicknames containing ':'.  See <https://sourceforge.net/p/curl/bugs/1196/>







>
>







315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
  {"w",  "write-out",                ARG_STRING},
  {"x",  "proxy",                    ARG_STRING},
  {"xa", "preproxy",                 ARG_STRING},
  {"X",  "request",                  ARG_STRING},
  {"Y",  "speed-limit",              ARG_STRING},
  {"y",  "speed-time",               ARG_STRING},
  {"z",  "time-cond",                ARG_STRING},
  {"Z",  "parallel",                 ARG_BOOL},
  {"Zb", "parallel-max",             ARG_STRING},
  {"#",  "progress-bar",             ARG_BOOL},
  {":",  "next",                     ARG_NONE},
};

/* Split the argument of -E to 'certname' and 'passphrase' separated by colon.
 * We allow ':' and '\' to be escaped by '\' so that we can use certificate
 * nicknames containing ':'.  See <https://sourceforge.net/p/curl/bugs/1196/>
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
        if(err)
          return err;
        break;
      case 'V': /* --retry-connrefused */
        config->retry_connrefused = toggle;
        break;
      case 'h': /* --retry-delay */
        err = str2unum(&config->retry_delay, nextarg);
        if(err)
          return err;
        break;
      case 'i': /* --retry-max-time */
        err = str2unum(&config->retry_maxtime, nextarg);
        if(err)
          return err;
        break;

      case 'k': /* --proxy-negotiate */
        if(curlinfo->features & CURL_VERSION_SPNEGO)
          config->proxynegotiate = toggle;







|




|







908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
        if(err)
          return err;
        break;
      case 'V': /* --retry-connrefused */
        config->retry_connrefused = toggle;
        break;
      case 'h': /* --retry-delay */
        err = str2unummax(&config->retry_delay, nextarg, LONG_MAX/1000);
        if(err)
          return err;
        break;
      case 'i': /* --retry-max-time */
        err = str2unummax(&config->retry_maxtime, nextarg, LONG_MAX/1000);
        if(err)
          return err;
        break;

      case 'k': /* --proxy-negotiate */
        if(curlinfo->features & CURL_VERSION_SPNEGO)
          config->proxynegotiate = toggle;
1095
1096
1097
1098
1099
1100
1101



1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
            config->use_metalink = toggle;
#else
          warnf(global, "--metalink option is ignored because the binary is "
                "built without the Metalink support.\n");
#endif
          break;
        }



      case 'K': /* --sasl-ir */
        config->sasl_ir = toggle;
        break;
      case 'L': /* --test-event */
#ifdef CURLDEBUG
        config->test_event_based = toggle;
#else
        warnf(global, "--test-event is ignored unless a debug build!\n");
#endif
        break;
      case 'M': /* --unix-socket */
        config->abstract_unix_socket = FALSE;
        GetStr(&config->unix_socket_path, nextarg);







>
>
>





|







1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
            config->use_metalink = toggle;
#else
          warnf(global, "--metalink option is ignored because the binary is "
                "built without the Metalink support.\n");
#endif
          break;
        }
      case '6': /* --sasl-authzid */
        GetStr(&config->sasl_authzid, nextarg);
        break;
      case 'K': /* --sasl-ir */
        config->sasl_ir = toggle;
        break;
      case 'L': /* --test-event */
#ifdef CURLDEBUG
        global->test_event_based = toggle;
#else
        warnf(global, "--test-event is ignored unless a debug build!\n");
#endif
        break;
      case 'M': /* --unix-socket */
        config->abstract_unix_socket = FALSE;
        GetStr(&config->unix_socket_path, nextarg);
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192




1193
1194
1195
1196
1197
1198
1199
        /* HTTP version 1.1 */
        config->httpversion = CURL_HTTP_VERSION_1_1;
        break;
      case '2':
        /* HTTP version 2.0 */
        config->httpversion = CURL_HTTP_VERSION_2_0;
        break;
      case '3':
        /* HTTP version 2.0 over clean TCP*/
        config->httpversion = CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE;
        break;




      case '9':
        /* Allow HTTP/0.9 responses! */
        config->http09_allowed = toggle;
        break;
      }
      break;
    case '1': /* --tlsv1* options */







|



>
>
>
>







1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
        /* HTTP version 1.1 */
        config->httpversion = CURL_HTTP_VERSION_1_1;
        break;
      case '2':
        /* HTTP version 2.0 */
        config->httpversion = CURL_HTTP_VERSION_2_0;
        break;
      case '3': /* --http2-prior-knowledge */
        /* HTTP version 2.0 over clean TCP*/
        config->httpversion = CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE;
        break;
      case '4': /* --http3 */
        /* HTTP version 3 go over QUIC - at once */
        config->httpversion = CURL_HTTP_VERSION_3;
        break;
      case '9':
        /* Allow HTTP/0.9 responses! */
        config->http09_allowed = toggle;
        break;
      }
      break;
    case '1': /* --tlsv1* options */
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
             get sent as a POST anyway */
          postdata = strdup("");
          if(!postdata)
            return PARAM_NO_MEM;
          size = 0;
        }
        else {
          char *enc = curl_easy_escape(config->easy, postdata, (int)size);
          Curl_safefree(postdata); /* no matter if it worked or not */
          if(enc) {
            /* now make a string with the name from above and append the
               encoded string */
            size_t outlen = nlen + strlen(enc) + 2;
            char *n = malloc(outlen);
            if(!n) {







|







1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
             get sent as a POST anyway */
          postdata = strdup("");
          if(!postdata)
            return PARAM_NO_MEM;
          size = 0;
        }
        else {
          char *enc = curl_easy_escape(NULL, postdata, (int)size);
          Curl_safefree(postdata); /* no matter if it worked or not */
          if(enc) {
            /* now make a string with the name from above and append the
               encoded string */
            size_t outlen = nlen + strlen(enc) + 2;
            char *n = malloc(outlen);
            if(!n) {
2122
2123
2124
2125
2126
2127
2128















2129
2130
2131
2132
2133
2134
2135
    case 'Y':
      /* low speed limit */
      err = str2unum(&config->low_speed_limit, nextarg);
      if(err)
        return err;
      if(!config->low_speed_time)
        config->low_speed_time = 30;















      break;
    case 'z': /* time condition coming up */
      switch(*nextarg) {
      case '+':
        nextarg++;
        /* FALLTHROUGH */
      default:







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
    case 'Y':
      /* low speed limit */
      err = str2unum(&config->low_speed_limit, nextarg);
      if(err)
        return err;
      if(!config->low_speed_time)
        config->low_speed_time = 30;
      break;
    case 'Z':
      switch(subletter) {
      case '\0':  /* --parallel */
        global->parallel = toggle;
        break;
      case 'b':   /* --parallel-max */
        err = str2unum(&global->parallel_max, nextarg);
        if(err)
          return err;
        if((global->parallel_max > MAX_PARALLEL) ||
           (global->parallel_max < 1))
          global->parallel_max = PARALLEL_DEFAULT;
        break;
      }
      break;
    case 'z': /* time condition coming up */
      switch(*nextarg) {
      case '+':
        nextarg++;
        /* FALLTHROUGH */
      default:
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
    hit = -1;

  } while(!longopt && !singleopt && *++parse && !*usedarg);

  return PARAM_OK;
}

ParameterError parse_args(struct GlobalConfig *config, int argc,
                          argv_item_t argv[])
{
  int i;
  bool stillflags;
  char *orig_opt = NULL;
  ParameterError result = PARAM_OK;
  struct OperationConfig *operation = config->first;

  for(i = 1, stillflags = TRUE; i < argc && !result; i++) {
    orig_opt = argv[i];

    if(stillflags && ('-' == argv[i][0])) {
      bool passarg;
      char *flag = argv[i];

      if(!strcmp("--", argv[i]))
        /* This indicates the end of the flags and thus enables the
           following (URL) argument to start with -. */
        stillflags = FALSE;
      else {
        char *nextarg = (i < (argc - 1)) ? argv[i + 1] : NULL;

        result = getparameter(flag, nextarg, &passarg, config, operation);
        if(result == PARAM_NEXT_OPERATION) {
          /* Reset result as PARAM_NEXT_OPERATION is only used here and not
             returned from this function */
          result = PARAM_OK;

          if(operation->url_list && operation->url_list->url) {
            /* Allocate the next config */
            operation->next = malloc(sizeof(struct OperationConfig));
            if(operation->next) {
              /* Initialise the newly created config */
              config_init(operation->next);

              /* Copy the easy handle */
              operation->next->easy = config->easy;

              /* Set the global config pointer */
              operation->next->global = config;

              /* Update the last operation pointer */
              config->last = operation->next;

              /* Move onto the new config */
              operation->next->prev = operation;
              operation = operation->next;
            }
            else
              result = PARAM_NO_MEM;
          }
        }
        else if(!result && passarg)
          i++; /* we're supposed to skip this */
      }
    }
    else {
      bool used;

      /* Just add the URL please */
      result = getparameter((char *)"--url", argv[i], &used, config,
                            operation);
    }
  }

  if(result && result != PARAM_HELP_REQUESTED &&
     result != PARAM_MANUAL_REQUESTED &&
     result != PARAM_VERSION_INFO_REQUESTED &&
     result != PARAM_ENGINES_REQUESTED) {
    const char *reason = param2text(result);

    if(orig_opt && strcmp(":", orig_opt))
      helpf(config->errors, "option %s: %s\n", orig_opt, reason);
    else
      helpf(config->errors, "%s\n", reason);
  }

  return result;
}







|






|















|





|

|
|

|

<
<
<

|

|
|


|
|













|
|










|

|




2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241



2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
    hit = -1;

  } while(!longopt && !singleopt && *++parse && !*usedarg);

  return PARAM_OK;
}

ParameterError parse_args(struct GlobalConfig *global, int argc,
                          argv_item_t argv[])
{
  int i;
  bool stillflags;
  char *orig_opt = NULL;
  ParameterError result = PARAM_OK;
  struct OperationConfig *config = global->first;

  for(i = 1, stillflags = TRUE; i < argc && !result; i++) {
    orig_opt = argv[i];

    if(stillflags && ('-' == argv[i][0])) {
      bool passarg;
      char *flag = argv[i];

      if(!strcmp("--", argv[i]))
        /* This indicates the end of the flags and thus enables the
           following (URL) argument to start with -. */
        stillflags = FALSE;
      else {
        char *nextarg = (i < (argc - 1)) ? argv[i + 1] : NULL;

        result = getparameter(flag, nextarg, &passarg, global, config);
        if(result == PARAM_NEXT_OPERATION) {
          /* Reset result as PARAM_NEXT_OPERATION is only used here and not
             returned from this function */
          result = PARAM_OK;

          if(config->url_list && config->url_list->url) {
            /* Allocate the next config */
            config->next = malloc(sizeof(struct OperationConfig));
            if(config->next) {
              /* Initialise the newly created config */
              config_init(config->next);




              /* Set the global config pointer */
              config->next->global = global;

              /* Update the last config pointer */
              global->last = config->next;

              /* Move onto the new config */
              config->next->prev = config;
              config = config->next;
            }
            else
              result = PARAM_NO_MEM;
          }
        }
        else if(!result && passarg)
          i++; /* we're supposed to skip this */
      }
    }
    else {
      bool used;

      /* Just add the URL please */
      result = getparameter((char *)"--url", argv[i], &used, global,
                            config);
    }
  }

  if(result && result != PARAM_HELP_REQUESTED &&
     result != PARAM_MANUAL_REQUESTED &&
     result != PARAM_VERSION_INFO_REQUESTED &&
     result != PARAM_ENGINES_REQUESTED) {
    const char *reason = param2text(result);

    if(orig_opt && strcmp(":", orig_opt))
      helpf(global->errors, "option %s: %s\n", orig_opt, reason);
    else
      helpf(global->errors, "%s\n", reason);
  }

  return result;
}
Changes to jni/curl/src/tool_help.c.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"
#ifdef HAVE_STRCASECMP
#include <strings.h>
#endif

#include "tool_panykey.h"
#include "tool_help.h"
#include "tool_libinfo.h"
#include "tool_version.h"







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"
#if defined(HAVE_STRCASECMP) && defined(HAVE_STRINGS_H)
#include <strings.h>
#endif

#include "tool_panykey.h"
#include "tool_help.h"
#include "tool_libinfo.h"
#include "tool_version.h"
187
188
189
190
191
192
193


194
195
196
197
198
199
200
   "Use HTTP 1.0"},
  {"    --http1.1",
   "Use HTTP 1.1"},
  {"    --http2",
   "Use HTTP 2"},
  {"    --http2-prior-knowledge",
   "Use HTTP 2 without HTTP/1.1 Upgrade"},


  {"    --ignore-content-length",
   "Ignore the size of the remote resource"},
  {"-i, --include",
   "Include protocol response headers in the output"},
  {"-k, --insecure",
   "Allow insecure server connections when using SSL"},
  {"    --interface <name>",







>
>







187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
   "Use HTTP 1.0"},
  {"    --http1.1",
   "Use HTTP 1.1"},
  {"    --http2",
   "Use HTTP 2"},
  {"    --http2-prior-knowledge",
   "Use HTTP 2 without HTTP/1.1 Upgrade"},
  {"    --http3",
   "Use HTTP v3"},
  {"    --ignore-content-length",
   "Ignore the size of the remote resource"},
  {"-i, --include",
   "Include protocol response headers in the output"},
  {"-k, --insecure",
   "Allow insecure server connections when using SSL"},
  {"    --interface <name>",
269
270
271
272
273
274
275




276
277
278
279
280
281
282
   "Use HTTP NTLM authentication"},
  {"    --ntlm-wb",
   "Use HTTP NTLM authentication with winbind"},
  {"    --oauth2-bearer <token>",
   "OAuth 2 Bearer Token"},
  {"-o, --output <file>",
   "Write to file instead of stdout"},




  {"    --pass <phrase>",
   "Pass phrase for the private key"},
  {"    --path-as-is",
   "Do not squash .. sequences in URL path"},
  {"    --pinnedpubkey <hashes>",
   "FILE/HASHES Public key to verify peer against"},
  {"    --post301",







>
>
>
>







271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
   "Use HTTP NTLM authentication"},
  {"    --ntlm-wb",
   "Use HTTP NTLM authentication with winbind"},
  {"    --oauth2-bearer <token>",
   "OAuth 2 Bearer Token"},
  {"-o, --output <file>",
   "Write to file instead of stdout"},
  {"-Z, --parallel",
   "Perform transfers in parallel"},
  {"    --parallel-max",
   "Maximum concurrency for parallel transfers"},
  {"    --pass <phrase>",
   "Pass phrase for the private key"},
  {"    --path-as-is",
   "Do not squash .. sequences in URL path"},
  {"    --pinnedpubkey <hashes>",
   "FILE/HASHES Public key to verify peer against"},
  {"    --post301",
381
382
383
384
385
386
387


388
389
390
391
392
393
394
   "Retry request if transient problems occur"},
  {"    --retry-connrefused",
   "Retry on connection refused (use with --retry)"},
  {"    --retry-delay <seconds>",
   "Wait time between retries"},
  {"    --retry-max-time <seconds>",
   "Retry only within this period"},


  {"    --sasl-ir",
   "Enable initial response in SASL authentication"},
  {"    --service-name <name>",
   "SPNEGO service name"},
  {"-S, --show-error",
   "Show error even when -s is used"},
  {"-s, --silent",







>
>







387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
   "Retry request if transient problems occur"},
  {"    --retry-connrefused",
   "Retry on connection refused (use with --retry)"},
  {"    --retry-delay <seconds>",
   "Wait time between retries"},
  {"    --retry-max-time <seconds>",
   "Retry only within this period"},
  {"    --sasl-authzid <identity> ",
   "Use this identity to act as during SASL PLAIN authentication"},
  {"    --sasl-ir",
   "Enable initial response in SASL authentication"},
  {"    --service-name <name>",
   "SPNEGO service name"},
  {"-S, --show-error",
   "Show error even when -s is used"},
  {"-s, --silent",
522
523
524
525
526
527
528

529
530
531
532
533
534
535
  {"NTLM_WB",        CURL_VERSION_NTLM_WB},
  {"SSL",            CURL_VERSION_SSL},
  {"libz",           CURL_VERSION_LIBZ},
  {"brotli",         CURL_VERSION_BROTLI},
  {"CharConv",       CURL_VERSION_CONV},
  {"TLS-SRP",        CURL_VERSION_TLSAUTH_SRP},
  {"HTTP2",          CURL_VERSION_HTTP2},

  {"UnixSockets",    CURL_VERSION_UNIX_SOCKETS},
  {"HTTPS-proxy",    CURL_VERSION_HTTPS_PROXY},
  {"MultiSSL",       CURL_VERSION_MULTI_SSL},
  {"PSL",            CURL_VERSION_PSL},
  {"alt-svc",        CURL_VERSION_ALTSVC},
};








>







530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
  {"NTLM_WB",        CURL_VERSION_NTLM_WB},
  {"SSL",            CURL_VERSION_SSL},
  {"libz",           CURL_VERSION_LIBZ},
  {"brotli",         CURL_VERSION_BROTLI},
  {"CharConv",       CURL_VERSION_CONV},
  {"TLS-SRP",        CURL_VERSION_TLSAUTH_SRP},
  {"HTTP2",          CURL_VERSION_HTTP2},
  {"HTTP3",          CURL_VERSION_HTTP3},
  {"UnixSockets",    CURL_VERSION_UNIX_SOCKETS},
  {"HTTPS-proxy",    CURL_VERSION_HTTPS_PROXY},
  {"MultiSSL",       CURL_VERSION_MULTI_SSL},
  {"PSL",            CURL_VERSION_PSL},
  {"alt-svc",        CURL_VERSION_ALTSVC},
};

598
599
600
601
602
603
604
605
606

607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622

623
  }
  if(strcmp(CURL_VERSION, curlinfo->version)) {
    printf("WARNING: curl and libcurl versions do not match. "
           "Functionality may be affected.\n");
  }
}

void tool_list_engines(CURL *curl)
{

  struct curl_slist *engines = NULL;

  /* Get the list of engines */
  curl_easy_getinfo(curl, CURLINFO_SSL_ENGINES, &engines);

  puts("Build-time engines:");
  if(engines) {
    for(; engines; engines = engines->next)
      printf("  %s\n", engines->data);
  }
  else {
    puts("  <none>");
  }

  /* Cleanup the list of engines */
  curl_slist_free_all(engines);

}







|

>
















>

607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
  }
  if(strcmp(CURL_VERSION, curlinfo->version)) {
    printf("WARNING: curl and libcurl versions do not match. "
           "Functionality may be affected.\n");
  }
}

void tool_list_engines(void)
{
  CURL *curl = curl_easy_init();
  struct curl_slist *engines = NULL;

  /* Get the list of engines */
  curl_easy_getinfo(curl, CURLINFO_SSL_ENGINES, &engines);

  puts("Build-time engines:");
  if(engines) {
    for(; engines; engines = engines->next)
      printf("  %s\n", engines->data);
  }
  else {
    puts("  <none>");
  }

  /* Cleanup the list of engines */
  curl_slist_free_all(engines);
  curl_easy_cleanup(curl);
}
Changes to jni/curl/src/tool_help.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef HEADER_CURL_TOOL_HELP_H
#define HEADER_CURL_TOOL_HELP_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"

void tool_help(void);
void tool_list_engines(CURL *curl);
void tool_version_info(void);

#endif /* HEADER_CURL_TOOL_HELP_H */









|
















|



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifndef HEADER_CURL_TOOL_HELP_H
#define HEADER_CURL_TOOL_HELP_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"

void tool_help(void);
void tool_list_engines(void);
void tool_version_info(void);

#endif /* HEADER_CURL_TOOL_HELP_H */
Changes to jni/curl/src/tool_hugehelp.c.
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
"              it  uses getpwuid() on Unix-like systems (which returns the home\n"
"              dir given the current user in your system). On Windows, it  then\n"
"              checks for the APPDATA variable, or as a last resort the '%USER-\n"
, stdout);
 fputs(
"              PROFILE%\\Application Data'.\n"
"\n"
"              2) On windows, if there is no _curlrc file in the home  dir,  it\n"
"              checks for one in the same dir the curl executable is placed. On\n"
"              Unix-like systems, it will simply try to load .curlrc  from  the\n"
"              determined home dir.\n"
"\n"
"              # --- Example file ---\n"
"              # this is a comment\n"
"              url = \"example.com\"\n"







|







464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
"              it  uses getpwuid() on Unix-like systems (which returns the home\n"
"              dir given the current user in your system). On Windows, it  then\n"
"              checks for the APPDATA variable, or as a last resort the '%USER-\n"
, stdout);
 fputs(
"              PROFILE%\\Application Data'.\n"
"\n"
"              2) On windows, if there is no .curlrc file in the home  dir,  it\n"
"              checks for one in the same dir the curl executable is placed. On\n"
"              Unix-like systems, it will simply try to load .curlrc  from  the\n"
"              determined home dir.\n"
"\n"
"              # --- Example file ---\n"
"              # this is a comment\n"
"              url = \"example.com\"\n"
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530



















1531
1532





1533
1534
1535
1536
1537

1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550


1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562

1563
1564
1565
1566
1567
1568
1569
1570
1571
1572


1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583


1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600


1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612


1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626


1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640


1641
1642
1643
1644
1645
1646
1647
1648
1649
1650

1651
1652
1653
1654
1655
1656


1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667


1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680


1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695


1696
1697
1698
1699
1700
1701


1702
1703
1704
1705
1706
1707
1708
1709
1710
1711


1712
1713
1714
1715
1716
1717
1718
1719
1720
1721


1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738


1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750


1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761


1762
1763
1764
1765


1766
1767
1768
1769
1770
1771
1772
1773
1774


1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790

1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802

1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816

1817
1818
1819
1820
1821
1822
1823
"              (HTTP) Tells curl to be fine with HTTP version 0.9 response.\n"
"\n"
"              HTTP/0.9  is  a completely headerless response and therefore you\n"
"              can also connect with this to non-HTTP servers and still  get  a\n"
"              response since curl will simply transparently downgrade - if al-\n"
"              lowed.\n"
"\n"
"              A future curl version will deny continuing if the response isn't\n"
"              at least HTTP/1.0 unless this option is used.\n"
"\n"
"       -0, --http1.0\n"
, stdout);
 fputs(
"              (HTTP)  Tells  curl to use HTTP version 1.0 instead of using its\n"
"              internally preferred HTTP version.\n"
"\n"
"              This option overrides --http1.1 and --http2.\n"
"\n"
"       --http1.1\n"
"              (HTTP) Tells curl to use HTTP version 1.1.\n"
"\n"
"              This option  overrides  -0,  --http1.0  and  --http2.  Added  in\n"
"              7.33.0.\n"
"\n"
"       --http2-prior-knowledge\n"
"              (HTTP)  Tells  curl  to  issue  its  non-TLS HTTP requests using\n"
, stdout);
 fputs(
"              HTTP/2 without HTTP/1.1 Upgrade.  It  requires  prior  knowledge\n"
"              that  the  server  supports HTTP/2 straight away. HTTPS requests\n"
"              will still do HTTP/2 the standard way with  negotiated  protocol\n"
"              version in the TLS handshake.\n"
"\n"
"              --http2-prior-knowledge requires that the underlying libcurl was\n"
"              built to support HTTP/2. This option overrides --http1.1 and -0,\n"
"              --http1.0 and --http2. Added in 7.49.0.\n"
"\n"
, stdout);
 fputs(
"       --http2\n"
"              (HTTP) Tells curl to use HTTP version 2.\n"
"\n"
"              See also --no-alpn. --http2 requires that the underlying libcurl\n"
"              was built to support HTTP/2. This option overrides --http1.1 and\n"



















"              -0, --http1.0 and --http2-prior-knowledge. Added in 7.33.0.\n"
"\n"





"       --ignore-content-length\n"
"              (FTP  HTTP)  For HTTP, Ignore the Content-Length header. This is\n"
"              particularly useful for servers running Apache 1.x,  which  will\n"
, stdout);
 fputs(

"              report  incorrect  Content-Length  for files larger than 2 giga-\n"
"              bytes.\n"
"\n"
"              For FTP (since 7.46.0), skip the RETR command to figure out  the\n"
"              size before downloading a file.\n"
"\n"
"       -i, --include\n"
"              Include  the  HTTP  response headers in the output. The HTTP re-\n"
"              sponse headers can include things  like  server  name,  cookies,\n"
"              date of the document, HTTP version and more...\n"
"\n"
, stdout);
 fputs(


"              To view the request headers, consider the -v, --verbose option.\n"
"\n"
"              See also -v, --verbose.\n"
"\n"
"       -k, --insecure\n"
"              (TLS) By default, every SSL connection curl makes is verified to\n"
"              be secure. This option allows curl to proceed and  operate  even\n"
"              for server connections otherwise considered insecure.\n"
"\n"
"              The  server  connection  is verified by making sure the server's\n"
, stdout);
 fputs(

"              certificate contains the right name  and  verifies  successfully\n"
"              using the cert store.\n"
"\n"
"              See this online resource for further details:\n"
"               https://curl.haxx.se/docs/sslcerts.html\n"
"              See also --proxy-insecure and --cacert.\n"
"\n"
"       --interface <name>\n"
"\n"
"              Perform  an operation using a specified interface. You can enter\n"


"              interface name, IP address or host name. An example  could  look\n"
"              like:\n"
"\n"
, stdout);
 fputs(
"               curl --interface eth0:1 https://www.example.com/\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"              On  Linux  it can be used to specify a VRF, but the binary needs\n"
"              to either have CAP_NET_RAW or to be run as root.  More  informa-\n"
"              tion   about  Linux  VRF:  https://www.kernel.org/doc/Documenta-\n"


"              tion/networking/vrf.txt\n"
"\n"
"              See also --dns-interface.\n"
"\n"
"       -4, --ipv4\n"
, stdout);
 fputs(
"              This option tells curl to resolve names to IPv4 addresses  only,\n"
"              and not for example try IPv6.\n"
"\n"
"              See  also  --http1.1  and  --http2.  This  option  overrides -6,\n"
"              --ipv6.\n"
"\n"
"       -6, --ipv6\n"
"              This option tells curl to resolve names to IPv6 addresses  only,\n"
"              and not for example try IPv4.\n"
"\n"


"              See  also  --http1.1  and  --http2.  This  option  overrides -4,\n"
"              --ipv4.\n"
"\n"
, stdout);
 fputs(
"       -j, --junk-session-cookies\n"
"              (HTTP) When curl is told to read cookies from a given file, this\n"
"              option will make it discard all \"session cookies\". This will ba-\n"
"              sically have the same effect as if a  new  session  is  started.\n"
"              Typical  browsers  always  discard  session cookies when they're\n"
"              closed down.\n"
"\n"


"              See also -b, --cookie and -c, --cookie-jar.\n"
"\n"
"       --keepalive-time <seconds>\n"
, stdout);
 fputs(
"              This option sets the time a connection needs to remain idle  be-\n"
"              fore  sending  keepalive  probes and the time between individual\n"
"              keepalive probes. It is currently effective on operating systems\n"
"              offering  the  TCP_KEEPIDLE  and  TCP_KEEPINTVL  socket  options\n"
"              (meaning Linux, recent AIX, HP-UX and more). This option has  no\n"
"              effect if --no-keepalive is used.\n"
"\n"
, stdout);
 fputs(


"              If this option is used several times, the last one will be used.\n"
"              If unspecified, the option defaults to 60 seconds.\n"
"\n"
"              Added in 7.18.0.\n"
"\n"
"       --key-type <type>\n"
"              (TLS) Private key file type. Specify which type your --key  pro-\n"
"              vided  private  key  is. DER, PEM, and ENG are supported. If not\n"
"              specified, PEM is assumed.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
, stdout);
 fputs(


"       --key <key>\n"
"              (TLS SSH) Private key file name. Allows you to provide your pri-\n"
"              vate  key in this separate file. For SSH, if not specified, curl\n"
"              tries  the  following  candidates  in  order:   '~/.ssh/id_rsa',\n"
"              '~/.ssh/id_dsa', './id_rsa', './id_dsa'.\n"
"\n"
"              If  curl is built against OpenSSL library, and the engine pkcs11\n"
"              is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
, stdout);
 fputs(

"              ify  a  private key located in a PKCS#11 device. A string begin-\n"
"              ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI.  If  a\n"
"              PKCS#11 URI is provided, then the --engine option will be set as\n"
"              \"pkcs11\" if none was provided and the --key-type option will  be\n"
"              set as \"ENG\" if none was provided.\n"
"\n"


"              If this option is used several times, the last one will be used.\n"
"\n"
"       --krb <level>\n"
, stdout);
 fputs(
"              (FTP)  Enable Kerberos authentication and use. The level must be\n"
"              entered and should be one of 'clear', 'safe', 'confidential', or\n"
"              'private'.  Should  you  use  a  level that is not one of these,\n"
"              'private' will instead be used.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"


"              --krb requires that the underlying libcurl was built to  support\n"
"              Kerberos.\n"
"\n"
"       --libcurl <file>\n"
, stdout);
 fputs(
"              Append  this  option  to any ordinary curl command line, and you\n"
"              will get a libcurl-using C source code written to the file  that\n"
"              does the equivalent of what your command-line operation does!\n"
"\n"
"              If  this  option is used several times, the last given file name\n"
"              will be used.\n"
"\n"


"              Added in 7.16.1.\n"
"\n"
"       --limit-rate <speed>\n"
"              Specify the maximum transfer rate you want curl  to  use  -  for\n"
, stdout);
 fputs(
"              both downloads and uploads. This feature is useful if you have a\n"
"              limited pipe and you'd like your transfer not to use your entire\n"
"              bandwidth. To make it slower than it otherwise would be.\n"
"\n"
"              The  given speed is measured in bytes/second, unless a suffix is\n"
"              appended.  Appending 'k' or 'K' will count the number  as  kilo-\n"
"              bytes,  'm' or 'M' makes it megabytes, while 'g' or 'G' makes it\n"
, stdout);
 fputs(


"              gigabytes. Examples: 200K, 3m and 1G.\n"
"\n"
"              If you also use the -Y, --speed-limit option, that  option  will\n"
"              take precedence and might cripple the rate-limiting slightly, to\n"
"              help keeping the speed-limit logic working.\n"
"\n"


"              If this option is used several times, the last one will be used.\n"
"\n"
"       -l, --list-only\n"
"              (FTP POP3) (FTP) When listing  an  FTP  directory,  this  switch\n"
, stdout);
 fputs(
"              forces  a  name-only view. This is especially useful if the user\n"
"              wants to machine-parse the contents of an  FTP  directory  since\n"
"              the normal directory view doesn't use a standard look or format.\n"
"              When used like this, the option causes a NLST command to be sent\n"


"              to the server instead of LIST.\n"
"\n"
"              Note:  Some  FTP  servers  list  only files in their response to\n"
, stdout);
 fputs(
"              NLST; they do not include sub-directories and symbolic links.\n"
"\n"
"              (POP3) When retrieving a specific email from POP3,  this  switch\n"
"              forces  a  LIST command to be performed instead of RETR. This is\n"
"              particularly useful if the user wants to see if a specific  mes-\n"


"              sage id exists on the server and what size it is.\n"
"\n"
"              Note:  When combined with -X, --request, this option can be used\n"
, stdout);
 fputs(
"              to send an UIDL command instead, so the user may use the email's\n"
"              unique  identifier  rather  than it's message id to make the re-\n"
"              quest.\n"
"\n"
"              Added in 7.21.5.\n"
"\n"
"       --local-port <num/range>\n"
"              Set a preferred single number or range (FROM-TO) of  local  port\n"
"              numbers to use for the connection(s).  Note that port numbers by\n"
"              nature are a scarce resource that will be busy at times so  set-\n"
, stdout);
 fputs(


"              ting  this range to something too narrow might cause unnecessary\n"
"              connection setup failures.\n"
"\n"
"              Added in 7.15.2.\n"
"\n"
"       --location-trusted\n"
"              (HTTP) Like -L, --location, but will allow sending  the  name  +\n"
"              password to all hosts that the site may redirect to. This may or\n"
"              may not introduce a security breach if the site redirects you to\n"
"              a  site  to which you'll send your authentication info (which is\n"
, stdout);
 fputs(


"              plaintext in the case of HTTP Basic authentication).\n"
"\n"
"              See also -u, --user.\n"
"\n"
"       -L, --location\n"
"              (HTTP) If the server reports that the requested page  has  moved\n"
"              to a different location (indicated with a Location: header and a\n"
"              3XX response code), this option will make curl redo the  request\n"
"              on  the  new  place.  If used together with -i, --include or -I,\n"
, stdout);
 fputs(


"              --head, headers from all requested pages will be shown. When au-\n"
"              thentication  is  used,  curl  only sends its credentials to the\n"
"              initial host. If a redirect takes curl to a different  host,  it\n"
"              won't  be  able to intercept the user+password. See also --loca-\n"


"              tion-trusted on how to change this. You can limit the amount  of\n"
"              redirects to follow by using the --max-redirs option.\n"
"\n"
, stdout);
 fputs(
"              When  curl follows a redirect and the request is not a plain GET\n"
"              (for example POST or PUT), it will do the following request with\n"
"              a GET if the HTTP response was 301, 302, or 303. If the response\n"
"              code was any other 3xx code, curl will re-send the following re-\n"


"              quest using the same unmodified method.\n"
"\n"
"              You  can  tell  curl to not change the non-GET request method to\n"
, stdout);
 fputs(
"              GET after a 30x response by  using  the  dedicated  options  for\n"
"              that: --post301, --post302 and --post303.\n"
"\n"
"       --login-options <options>\n"
"              (IMAP  POP3 SMTP) Specify the login options to use during server\n"
"              authentication.\n"
"\n"
"              You can use the login options to specify protocol  specific  op-\n"
"              tions  that  may  be used during authentication. At present only\n"
, stdout);
 fputs(

"              IMAP, POP3 and SMTP support login options. For more  information\n"
"              about  the  login options please see RFC 2384, RFC 5092 and IETF\n"
"              draft draft-earhart-url-smtp-00.txt\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.34.0.\n"
"\n"
"       --mail-auth <address>\n"
"              (SMTP) Specify a single address. This will be  used  to  specify\n"
, stdout);
 fputs(

"              the  authentication  address  (identity)  of a submitted message\n"
"              that is being relayed to another server.\n"
"\n"
"              See also --mail-rcpt and --mail-from. Added in 7.25.0.\n"
"\n"
"       --mail-from <address>\n"
"              (SMTP) Specify a single address that the given mail  should  get\n"
"              sent from.\n"
"\n"
"              See also --mail-rcpt and --mail-auth. Added in 7.20.0.\n"
"\n"
"       --mail-rcpt <address>\n"
, stdout);
 fputs(

"              (SMTP) Specify a single address, user name or mailing list name.\n"
"              Repeat this option several times to send to multiple recipients.\n"
"              When performing a mail transfer, the recipient should specify  a\n"
"              valid email address to send the mail to.\n"
"\n"
"              When  performing an address verification (VRFY command), the re-\n"
"              cipient should be specified as the user name or  user  name  and\n"







<
|




|







|



|


|
|
|











|
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|

>
>
>
>
>


<


>









<
<


>
>









<


>










>
>



<
<






>
>





<
<










>
>



<
<







>
>



<
<





<
<


>
>










<
<


>
>







<


>






>
>



<
<






>
>




<
<







>
>




<
<





<
<


>
>






>
>




<
<




>
>



<
<





>
>



<
<








<
<


>
>








<
<


>
>







<
<


>
>




>
>



<
<




>
>



<
<








<


>









<


>











<


>







1487
1488
1489
1490
1491
1492
1493

1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557

1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569


1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582

1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600


1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613


1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628


1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640


1641
1642
1643
1644
1645


1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659


1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670

1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684


1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696


1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709


1710
1711
1712
1713
1714


1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730


1731
1732
1733
1734
1735
1736
1737
1738
1739


1740
1741
1742
1743
1744
1745
1746
1747
1748
1749


1750
1751
1752
1753
1754
1755
1756
1757


1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769


1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780


1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793


1794
1795
1796
1797
1798
1799
1800
1801
1802


1803
1804
1805
1806
1807
1808
1809
1810

1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822

1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836

1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
"              (HTTP) Tells curl to be fine with HTTP version 0.9 response.\n"
"\n"
"              HTTP/0.9  is  a completely headerless response and therefore you\n"
"              can also connect with this to non-HTTP servers and still  get  a\n"
"              response since curl will simply transparently downgrade - if al-\n"
"              lowed.\n"
"\n"

"              Since curl 7.66.0, HTTP/0.9 is disabled by default.\n"
"\n"
"       -0, --http1.0\n"
, stdout);
 fputs(
"              (HTTP) Tells curl to use HTTP version 1.0 instead of  using  its\n"
"              internally preferred HTTP version.\n"
"\n"
"              This option overrides --http1.1 and --http2.\n"
"\n"
"       --http1.1\n"
"              (HTTP) Tells curl to use HTTP version 1.1.\n"
"\n"
"              This  option  overrides  -0,  --http1.0  and  --http2.  Added in\n"
"              7.33.0.\n"
"\n"
"       --http2-prior-knowledge\n"
"              (HTTP) Tells curl to  issue  its  non-TLS  HTTP  requests  using\n"
, stdout);
 fputs(
"              HTTP/2  without  HTTP/1.1  Upgrade.  It requires prior knowledge\n"
"              that the server supports HTTP/2 straight  away.  HTTPS  requests\n"
"              will  still  do HTTP/2 the standard way with negotiated protocol\n"
"              version in the TLS handshake.\n"
"\n"
"              --http2-prior-knowledge requires that the underlying libcurl was\n"
"              built to support HTTP/2. This option overrides --http1.1 and -0,\n"
"              --http1.0 and --http2. Added in 7.49.0.\n"
"\n"
, stdout);
 fputs(
"       --http2\n"
"              (HTTP) Tells curl to use HTTP version 2.\n"
"\n"
"              See also --http1.1 and --http3. --http2 requires that the under-\n"
"              lying libcurl was built to support HTTP/2. This option overrides\n"
"              --http1.1 and -0, --http1.0 and  --http2-prior-knowledge.  Added\n"
"              in 7.33.0.\n"
"\n"
"       --http3\n"
"              (HTTP) WARNING: this option is experiemental. Do not use in pro-\n"
"              duction.\n"
"\n"
, stdout);
 fputs(
"              Tells curl to use HTTP version 3 directly to the host  and  port\n"
"              number used in the URL. A normal HTTP/3 transaction will be done\n"
"              to a host and then get redirected via Alt-SVc, but  this  option\n"
"              allows  a  user to circumvent that when you know that the target\n"
"              speaks HTTP/3 on the given host and port.\n"
"\n"
"              This option will make curl fail if a QUIC connection  cannot  be\n"
, stdout);
 fputs(
"              established,  it cannot fall back to a lower HTTP version on its\n"
"              own.\n"
"\n"
"              See also --http1.1 and --http2. --http3 requires that the under-\n"
"              lying libcurl was built to support HTTP/3. This option overrides\n"
"              --http1.1 and -0, --http1.0 and --http2 and --http2-prior-knowl-\n"
"              edge. Added in 7.66.0.\n"
"\n"
"       --ignore-content-length\n"
"              (FTP  HTTP)  For HTTP, Ignore the Content-Length header. This is\n"

, stdout);
 fputs(
"              particularly useful for servers running Apache 1.x,  which  will\n"
"              report  incorrect  Content-Length  for files larger than 2 giga-\n"
"              bytes.\n"
"\n"
"              For FTP (since 7.46.0), skip the RETR command to figure out  the\n"
"              size before downloading a file.\n"
"\n"
"       -i, --include\n"
"              Include  the  HTTP  response headers in the output. The HTTP re-\n"
"              sponse headers can include things  like  server  name,  cookies,\n"


, stdout);
 fputs(
"              date of the document, HTTP version and more...\n"
"\n"
"              To view the request headers, consider the -v, --verbose option.\n"
"\n"
"              See also -v, --verbose.\n"
"\n"
"       -k, --insecure\n"
"              (TLS) By default, every SSL connection curl makes is verified to\n"
"              be secure. This option allows curl to proceed and  operate  even\n"
"              for server connections otherwise considered insecure.\n"
"\n"

, stdout);
 fputs(
"              The  server  connection  is verified by making sure the server's\n"
"              certificate contains the right name  and  verifies  successfully\n"
"              using the cert store.\n"
"\n"
"              See this online resource for further details:\n"
"               https://curl.haxx.se/docs/sslcerts.html\n"
"              See also --proxy-insecure and --cacert.\n"
"\n"
"       --interface <name>\n"
"\n"
"              Perform  an operation using a specified interface. You can enter\n"
, stdout);
 fputs(
"              interface name, IP address or host name. An example  could  look\n"
"              like:\n"
"\n"


"               curl --interface eth0:1 https://www.example.com/\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"              On  Linux  it can be used to specify a VRF, but the binary needs\n"
"              to either have CAP_NET_RAW or to be run as root.  More  informa-\n"
"              tion   about  Linux  VRF:  https://www.kernel.org/doc/Documenta-\n"
, stdout);
 fputs(
"              tion/networking/vrf.txt\n"
"\n"
"              See also --dns-interface.\n"
"\n"
"       -4, --ipv4\n"


"              This option tells curl to resolve names to IPv4 addresses  only,\n"
"              and not for example try IPv6.\n"
"\n"
"              See  also  --http1.1  and  --http2.  This  option  overrides -6,\n"
"              --ipv6.\n"
"\n"
"       -6, --ipv6\n"
"              This option tells curl to resolve names to IPv6 addresses  only,\n"
"              and not for example try IPv4.\n"
"\n"
, stdout);
 fputs(
"              See  also  --http1.1  and  --http2.  This  option  overrides -4,\n"
"              --ipv4.\n"
"\n"


"       -j, --junk-session-cookies\n"
"              (HTTP) When curl is told to read cookies from a given file, this\n"
"              option will make it discard all \"session cookies\". This will ba-\n"
"              sically have the same effect as if a  new  session  is  started.\n"
"              Typical  browsers  always  discard  session cookies when they're\n"
"              closed down.\n"
"\n"
, stdout);
 fputs(
"              See also -b, --cookie and -c, --cookie-jar.\n"
"\n"
"       --keepalive-time <seconds>\n"


"              This option sets the time a connection needs to remain idle  be-\n"
"              fore  sending  keepalive  probes and the time between individual\n"
"              keepalive probes. It is currently effective on operating systems\n"
"              offering  the  TCP_KEEPIDLE  and  TCP_KEEPINTVL  socket  options\n"
"              (meaning Linux, recent AIX, HP-UX and more). This option has  no\n"


, stdout);
 fputs(
"              effect if --no-keepalive is used.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"              If unspecified, the option defaults to 60 seconds.\n"
"\n"
"              Added in 7.18.0.\n"
"\n"
"       --key-type <type>\n"
"              (TLS) Private key file type. Specify which type your --key  pro-\n"
"              vided  private  key  is. DER, PEM, and ENG are supported. If not\n"
"              specified, PEM is assumed.\n"
"\n"


, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --key <key>\n"
"              (TLS SSH) Private key file name. Allows you to provide your pri-\n"
"              vate  key in this separate file. For SSH, if not specified, curl\n"
"              tries  the  following  candidates  in  order:   '~/.ssh/id_rsa',\n"
"              '~/.ssh/id_dsa', './id_rsa', './id_dsa'.\n"
"\n"
"              If  curl is built against OpenSSL library, and the engine pkcs11\n"

, stdout);
 fputs(
"              is available, then a PKCS#11 URI (RFC 7512) can be used to spec-\n"
"              ify  a  private key located in a PKCS#11 device. A string begin-\n"
"              ning with \"pkcs11:\" will be interpreted as a PKCS#11 URI.  If  a\n"
"              PKCS#11 URI is provided, then the --engine option will be set as\n"
"              \"pkcs11\" if none was provided and the --key-type option will  be\n"
"              set as \"ENG\" if none was provided.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --krb <level>\n"


"              (FTP)  Enable Kerberos authentication and use. The level must be\n"
"              entered and should be one of 'clear', 'safe', 'confidential', or\n"
"              'private'.  Should  you  use  a  level that is not one of these,\n"
"              'private' will instead be used.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
, stdout);
 fputs(
"              --krb requires that the underlying libcurl was built to  support\n"
"              Kerberos.\n"
"\n"
"       --libcurl <file>\n"


"              Append  this  option  to any ordinary curl command line, and you\n"
"              will get a libcurl-using C source code written to the file  that\n"
"              does the equivalent of what your command-line operation does!\n"
"\n"
"              If  this  option is used several times, the last given file name\n"
"              will be used.\n"
"\n"
, stdout);
 fputs(
"              Added in 7.16.1.\n"
"\n"
"       --limit-rate <speed>\n"
"              Specify the maximum transfer rate you want curl  to  use  -  for\n"


"              both downloads and uploads. This feature is useful if you have a\n"
"              limited pipe and you'd like your transfer not to use your entire\n"
"              bandwidth. To make it slower than it otherwise would be.\n"
"\n"
"              The  given speed is measured in bytes/second, unless a suffix is\n"


, stdout);
 fputs(
"              appended.  Appending 'k' or 'K' will count the number  as  kilo-\n"
"              bytes,  'm' or 'M' makes it megabytes, while 'g' or 'G' makes it\n"
"              gigabytes. Examples: 200K, 3m and 1G.\n"
"\n"
"              If you also use the -Y, --speed-limit option, that  option  will\n"
"              take precedence and might cripple the rate-limiting slightly, to\n"
"              help keeping the speed-limit logic working.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"       -l, --list-only\n"
"              (FTP POP3) (FTP) When listing  an  FTP  directory,  this  switch\n"


"              forces  a  name-only view. This is especially useful if the user\n"
"              wants to machine-parse the contents of an  FTP  directory  since\n"
"              the normal directory view doesn't use a standard look or format.\n"
"              When used like this, the option causes a NLST command to be sent\n"
, stdout);
 fputs(
"              to the server instead of LIST.\n"
"\n"
"              Note:  Some  FTP  servers  list  only files in their response to\n"


"              NLST; they do not include sub-directories and symbolic links.\n"
"\n"
"              (POP3) When retrieving a specific email from POP3,  this  switch\n"
"              forces  a  LIST command to be performed instead of RETR. This is\n"
"              particularly useful if the user wants to see if a specific  mes-\n"
, stdout);
 fputs(
"              sage id exists on the server and what size it is.\n"
"\n"
"              Note:  When combined with -X, --request, this option can be used\n"


"              to send an UIDL command instead, so the user may use the email's\n"
"              unique  identifier  rather  than it's message id to make the re-\n"
"              quest.\n"
"\n"
"              Added in 7.21.5.\n"
"\n"
"       --local-port <num/range>\n"
"              Set a preferred single number or range (FROM-TO) of  local  port\n"


, stdout);
 fputs(
"              numbers to use for the connection(s).  Note that port numbers by\n"
"              nature are a scarce resource that will be busy at times so  set-\n"
"              ting  this range to something too narrow might cause unnecessary\n"
"              connection setup failures.\n"
"\n"
"              Added in 7.15.2.\n"
"\n"
"       --location-trusted\n"
"              (HTTP) Like -L, --location, but will allow sending  the  name  +\n"
"              password to all hosts that the site may redirect to. This may or\n"


, stdout);
 fputs(
"              may not introduce a security breach if the site redirects you to\n"
"              a  site  to which you'll send your authentication info (which is\n"
"              plaintext in the case of HTTP Basic authentication).\n"
"\n"
"              See also -u, --user.\n"
"\n"
"       -L, --location\n"
"              (HTTP) If the server reports that the requested page  has  moved\n"
"              to a different location (indicated with a Location: header and a\n"


, stdout);
 fputs(
"              3XX response code), this option will make curl redo the  request\n"
"              on  the  new  place.  If used together with -i, --include or -I,\n"
"              --head, headers from all requested pages will be shown. When au-\n"
"              thentication  is  used,  curl  only sends its credentials to the\n"
"              initial host. If a redirect takes curl to a different  host,  it\n"
"              won't  be  able to intercept the user+password. See also --loca-\n"
, stdout);
 fputs(
"              tion-trusted on how to change this. You can limit the amount  of\n"
"              redirects to follow by using the --max-redirs option.\n"
"\n"


"              When  curl follows a redirect and the request is not a plain GET\n"
"              (for example POST or PUT), it will do the following request with\n"
"              a GET if the HTTP response was 301, 302, or 303. If the response\n"
"              code was any other 3xx code, curl will re-send the following re-\n"
, stdout);
 fputs(
"              quest using the same unmodified method.\n"
"\n"
"              You  can  tell  curl to not change the non-GET request method to\n"


"              GET after a 30x response by  using  the  dedicated  options  for\n"
"              that: --post301, --post302 and --post303.\n"
"\n"
"       --login-options <options>\n"
"              (IMAP  POP3 SMTP) Specify the login options to use during server\n"
"              authentication.\n"
"\n"
"              You can use the login options to specify protocol  specific  op-\n"

, stdout);
 fputs(
"              tions  that  may  be used during authentication. At present only\n"
"              IMAP, POP3 and SMTP support login options. For more  information\n"
"              about  the  login options please see RFC 2384, RFC 5092 and IETF\n"
"              draft draft-earhart-url-smtp-00.txt\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.34.0.\n"
"\n"
"       --mail-auth <address>\n"

, stdout);
 fputs(
"              (SMTP) Specify a single address. This will be  used  to  specify\n"
"              the  authentication  address  (identity)  of a submitted message\n"
"              that is being relayed to another server.\n"
"\n"
"              See also --mail-rcpt and --mail-from. Added in 7.25.0.\n"
"\n"
"       --mail-from <address>\n"
"              (SMTP) Specify a single address that the given mail  should  get\n"
"              sent from.\n"
"\n"
"              See also --mail-rcpt and --mail-auth. Added in 7.20.0.\n"
"\n"

, stdout);
 fputs(
"       --mail-rcpt <address>\n"
"              (SMTP) Specify a single address, user name or mailing list name.\n"
"              Repeat this option several times to send to multiple recipients.\n"
"              When performing a mail transfer, the recipient should specify  a\n"
"              valid email address to send the mail to.\n"
"\n"
"              When  performing an address verification (VRFY command), the re-\n"
"              cipient should be specified as the user name or  user  name  and\n"
2149
2150
2151
2152
2153
2154
2155

















2156
2157
2158
2159
2160
2161
2162

2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178


2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189


2190
2191
2192
2193
2194
2195
2196
2197

2198
2199













2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233


2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244


2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255


2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
, stdout);
 fputs(
"              will force the output to be done to stdout.\n"
"\n"
"              See  also  -O, --remote-name and --remote-name-all and -J, --re-\n"
"              mote-header-name.\n"
"\n"

















"       --pass <phrase>\n"
"              (SSH TLS) Passphrase for the private key\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --path-as-is\n"
"              Tell curl to not handle sequences of /../ or /./  in  the  given\n"

, stdout);
 fputs(
"              URL  path.  Normally curl will squash or merge them according to\n"
"              standards but with this option set you tell it not to do that.\n"
"\n"
"              Added in 7.42.0.\n"
"\n"
"       --pinnedpubkey <hashes>\n"
"              (TLS) Tells curl to  use  the  specified  public  key  file  (or\n"
"              hashes)  to  verify the peer. This can be a path to a file which\n"
"              contains a single public key in PEM or DER format, or any number\n"
, stdout);
 fputs(
"              of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
"              rated by ';'\n"
"\n"


"              When negotiating a TLS or SSL connection,  the  server  sends  a\n"
"              certificate  indicating  its identity. A public key is extracted\n"
"              from this certificate and if it does not exactly match the  pub-\n"
"              lic  key provided to this option, curl will abort the connection\n"
"              before sending or receiving any data.\n"
"\n"
, stdout);
 fputs(
"              PEM/DER support:\n"
"                7.39.0: OpenSSL, GnuTLS and GSKit\n"
"                7.43.0: NSS and wolfSSL\n"


"                7.47.0: mbedtls sha256 support:\n"
"                7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL\n"
"                7.47.0: mbedtls Other SSL backends not supported.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --post301\n"
"              (HTTP) Tells curl to respect RFC 7231/6.4.2 and not convert POST\n"

, stdout);
 fputs(













"              requests into GET requests when following a 301 redirection. The\n"
"              non-RFC behaviour is ubiquitous in web browsers,  so  curl  does\n"
"              the  conversion  by  default to maintain consistency. However, a\n"
"              server may require a POST to remain a POST after  such  a  redi-\n"
"              rection.  This  option is meaningful only when using -L, --loca-\n"
"              tion.\n"
"\n"
"              See also --post302 and --post303 and -L,  --location.  Added  in\n"
, stdout);
 fputs(
"              7.17.1.\n"
"\n"
"       --post302\n"
"              (HTTP) Tells curl to respect RFC 7231/6.4.3 and not convert POST\n"
"              requests into GET requests when following a 302 redirection. The\n"
"              non-RFC  behaviour  is  ubiquitous in web browsers, so curl does\n"
"              the conversion by default to maintain  consistency.  However,  a\n"
"              server  may  require  a POST to remain a POST after such a redi-\n"
, stdout);
 fputs(
"              rection. This option is meaningful only when using  -L,  --loca-\n"
"              tion.\n"
"\n"
"              See  also  --post301  and --post303 and -L, --location. Added in\n"
"              7.19.1.\n"
"\n"
"       --post303\n"
"              (HTTP) Tells curl to violate RFC 7231/6.4.4 and not convert POST\n"
"              requests  into  GET  requests when following 303 redirections. A\n"
"              server may require a POST to remain a POST after a 303 redirect-\n"
, stdout);
 fputs(
"              ion. This option is meaningful only when using -L, --location.\n"
"\n"


"              See  also  --post302  and --post301 and -L, --location. Added in\n"
"              7.26.0.\n"
"\n"
"       --preproxy [protocol://]host[:port]\n"
"              Use the specified SOCKS proxy before connecting to  an  HTTP  or\n"
"              HTTPS  -x,  --proxy.  In  such a case curl first connects to the\n"
"              SOCKS proxy and then connects (through SOCKS)  to  the  HTTP  or\n"
, stdout);
 fputs(
"              HTTPS proxy. Hence pre proxy.\n"
"\n"


"              The pre proxy string should be specified with a protocol:// pre-\n"
"              fix to  specify  alternative  proxy  protocols.  Use  socks4://,\n"
"              socks4a://,  socks5://  or  socks5h://  to  request the specific\n"
"              SOCKS version to be used. No protocol specified will  make  curl\n"
"              default to SOCKS4.\n"
"\n"
"              If  the  port number is not specified in the proxy string, it is\n"
, stdout);
 fputs(
"              assumed to be 1080.\n"
"\n"


"              User and password that might be provided in the proxy string are\n"
"              URL  decoded by curl. This allows you to pass in special charac-\n"
"              ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       -#, --progress-bar\n"
"              Make curl display transfer progress as a simple progress bar in-\n"
, stdout);
 fputs(
"              stead of the standard, more informational, meter.\n"
"\n"
"              This  progress  bar draws a single line of '#' characters across\n"
"              the screen and shows a percentage if the transfer size is known.\n"
"              For  transfers  without  a  known size, there will be space ship\n"
"              (-=o=-) that moves back and forth but only while data  is  being\n"
"              transferred, with a set of flying hash sign symbols on top.\n"
"\n"
"       --proto-default <protocol>\n"
, stdout);
 fputs(
"              Tells curl to use protocol for any URL missing a scheme name.\n"
"\n"
"              Example:\n"
"\n"
"               curl --proto-default https ftp.mozilla.org\n"
"\n"
"              An  unknown  or  unsupported  protocol causes error CURLE_UNSUP-\n"
"              PORTED_PROTOCOL (1).\n"
"\n"
"              This option does not change the default proxy protocol (http).\n"
"\n"
"              Without this option curl would make a guess based on  the  host,\n"
"              see --url for details.\n"
"\n"
, stdout);
 fputs(
"              Added in 7.45.0.\n"
"\n"
"       --proto-redir <protocols>\n"
"              Tells  curl to limit what protocols it may use on redirect. Pro-\n"
"              tocols denied by --proto are not overridden by this option.  See\n"
"              --proto for how protocols are represented.\n"
"\n"
"              Example, allow only HTTP and HTTPS on redirect:\n"
"\n"
"               curl --proto-redir -all,http,https http://example.com\n"
"\n"
"              By default curl will allow HTTP, HTTPS, FTP and FTPS on redirect\n"
, stdout);
 fputs(
"              (7.65.2).  Older versions of curl allowed all protocols on redi-\n"
"              rect  except several disabled for security reasons: Since 7.19.4\n"
"              FILE and SCP are disabled, and since 7.40.0  SMB  and  SMBS  are\n"
"              also  disabled.  Specifying all or +all enables all protocols on\n"
"              redirect, including those disabled for security.\n"
"\n"
"              Added in 7.20.2.\n"
"\n"
"       --proto <protocols>\n"
, stdout);
 fputs(
"              Tells curl to limit what protocols it may use in  the  transfer.\n"
"              Protocols  are evaluated left to right, are comma separated, and\n"
"              are each a protocol name or 'all', optionally prefixed  by  zero\n"
"              or more modifiers. Available modifiers are:\n"
"\n"
"              +  Permit this protocol in addition to protocols already permit-\n"
"                 ted (this is the default if no modifier is used).\n"
"\n"
, stdout);
 fputs(
"              -  Deny this protocol, removing it from the  list  of  protocols\n"
"                 already permitted.\n"
"\n"
"              =  Permit  only this protocol (ignoring the list already permit-\n"
"                 ted), though subject to later modification by subsequent  en-\n"
"                 tries in the comma separated list.\n"
"\n"
"              For example:\n"
"\n"
"              --proto -ftps  uses the default protocols, but disables ftps\n"
"\n"
"              --proto -all,https,+http\n"
, stdout);
 fputs(
"                             only enables http and https\n"
"\n"
"              --proto =http,https\n"
"                             also only enables http and https\n"
"\n"
"       Unknown protocols produce a warning. This allows scripts to safely rely\n"
"       on being able to disable potentially dangerous protocols, without rely-\n"
"       ing  upon  support  for that protocol being built into curl to avoid an\n"
"       error.\n"
"\n"
"       This option can be used multiple times, in which case the effect is the\n"
, stdout);
 fputs(
"       same as concatenating the protocols into one instance of the option.\n"
"\n"
"       See also --proto-redir and --proto-default. Added in 7.20.2.\n"
"\n"
"       --proxy-anyauth\n"
"              Tells  curl to pick a suitable authentication method when commu-\n"
"              nicating with the given HTTP proxy. This might  cause  an  extra\n"
"              request/response round-trip.\n"
"\n"
"              See also -x, --proxy and --proxy-basic and --proxy-digest. Added\n"
"              in 7.13.2.\n"
"\n"
"       --proxy-basic\n"
, stdout);
 fputs(
"              Tells curl to use HTTP Basic authentication  when  communicating\n"
"              with the given proxy. Use --basic for enabling HTTP Basic with a\n"
"              remote host. Basic is the  default  authentication  method  curl\n"
"              uses with proxies.\n"
"\n"
"              See also -x, --proxy and --proxy-anyauth and --proxy-digest.\n"
"\n"
"       --proxy-cacert <file>\n"
"              Same as --cacert but used in HTTPS proxy context.\n"
"\n"
, stdout);
 fputs(
"              See  also  --proxy-capath  and  --cacert  and  --capath  and -x,\n"
"              --proxy. Added in 7.52.0.\n"
"\n"
"       --proxy-capath <dir>\n"
"              Same as --capath but used in HTTPS proxy context.\n"
"\n"
"              See also --proxy-cacert and -x, --proxy and --capath.  Added  in\n"
"              7.52.0.\n"
"\n"
"       --proxy-cert-type <type>\n"
"              Same as --cert-type but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>






|
>


<





|
|

<
<



>
>
|
|
|
|


<
<



>
>








>


>
>
>
>
>
>
>
>
>
>
>
>
>
|






<


<
<
<
<
<
<
<
<
<
<
<
|
<
<




|

<
<


>
>
|



|
|
|
<
<


>
>

|
|
|


|
<
<


>
>

|












|

|
|











|




|







|
|










|
|
|







|
|
|







|


|
|
















|










|
|








|

|









|





|







2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205

2206
2207
2208
2209
2210
2211
2212
2213


2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224


2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260

2261
2262











2263


2264
2265
2266
2267
2268
2269


2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280


2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291


2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
, stdout);
 fputs(
"              will force the output to be done to stdout.\n"
"\n"
"              See  also  -O, --remote-name and --remote-name-all and -J, --re-\n"
"              mote-header-name.\n"
"\n"
"       --parallel-max\n"
"              When asked to do parallel transfers, using -Z, --parallel,  this\n"
"              option controls the maximum amount of transfers to do simultane-\n"
"              ously.\n"
"\n"
"              The default is 50.\n"
"\n"
"              See also -Z, --parallel. Added in 7.66.0.\n"
"\n"
"       -Z, --parallel\n"
, stdout);
 fputs(
"              Makes curl perform its transfers in parallel as compared to  the\n"
"              regular serial manner.\n"
"\n"
"              Added in 7.66.0.\n"
"\n"
"       --pass <phrase>\n"
"              (SSH TLS) Passphrase for the private key\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --path-as-is\n"
"              Tell  curl  to  not handle sequences of /../ or /./ in the given\n"
"              URL path. Normally curl will squash or merge them  according  to\n"
, stdout);
 fputs(

"              standards but with this option set you tell it not to do that.\n"
"\n"
"              Added in 7.42.0.\n"
"\n"
"       --pinnedpubkey <hashes>\n"
"              (TLS)  Tells  curl  to  use  the  specified  public key file (or\n"
"              hashes) to verify the peer. This can be a path to a  file  which\n"
"              contains a single public key in PEM or DER format, or any number\n"


"              of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
"              rated by ';'\n"
"\n"
, stdout);
 fputs(
"              When  negotiating  a  TLS  or SSL connection, the server sends a\n"
"              certificate indicating its identity. A public key  is  extracted\n"
"              from  this certificate and if it does not exactly match the pub-\n"
"              lic key provided to this option, curl will abort the  connection\n"
"              before sending or receiving any data.\n"
"\n"


"              PEM/DER support:\n"
"                7.39.0: OpenSSL, GnuTLS and GSKit\n"
"                7.43.0: NSS and wolfSSL\n"
, stdout);
 fputs(
"                7.47.0: mbedtls sha256 support:\n"
"                7.44.0: OpenSSL, GnuTLS, NSS and wolfSSL\n"
"                7.47.0: mbedtls Other SSL backends not supported.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --post301\n"
"              (HTTP) Tells curl to respect RFC 7231/6.4.2 and not convert POST\n"
"              requests into GET requests when following a 301 redirection. The\n"
, stdout);
 fputs(
"              non-RFC  behaviour  is  ubiquitous in web browsers, so curl does\n"
"              the conversion by default to maintain  consistency.  However,  a\n"
"              server  may  require  a POST to remain a POST after such a redi-\n"
"              rection. This option is meaningful only when using  -L,  --loca-\n"
"              tion.\n"
"\n"
"              See  also  --post302  and --post303 and -L, --location. Added in\n"
"              7.17.1.\n"
"\n"
"       --post302\n"
, stdout);
 fputs(
"              (HTTP) Tells curl to respect RFC 7231/6.4.3 and not convert POST\n"
"              requests into GET requests when following a 302 redirection. The\n"
"              non-RFC behaviour is ubiquitous in web browsers,  so  curl  does\n"
"              the  conversion  by  default to maintain consistency. However, a\n"
"              server may require a POST to remain a POST after  such  a  redi-\n"
"              rection.  This  option is meaningful only when using -L, --loca-\n"
"              tion.\n"
"\n"

, stdout);
 fputs(











"              See also --post301 and --post303 and -L,  --location.  Added  in\n"


"              7.19.1.\n"
"\n"
"       --post303\n"
"              (HTTP) Tells curl to violate RFC 7231/6.4.4 and not convert POST\n"
"              requests into GET requests when following  303  redirections.  A\n"
"              server may require a POST to remain a POST after a 303 redirect-\n"


"              ion. This option is meaningful only when using -L, --location.\n"
"\n"
, stdout);
 fputs(
"              See also --post302 and --post301 and -L,  --location.  Added  in\n"
"              7.26.0.\n"
"\n"
"       --preproxy [protocol://]host[:port]\n"
"              Use  the  specified  SOCKS proxy before connecting to an HTTP or\n"
"              HTTPS -x, --proxy. In such a case curl  first  connects  to  the\n"
"              SOCKS  proxy  and  then  connects (through SOCKS) to the HTTP or\n"


"              HTTPS proxy. Hence pre proxy.\n"
"\n"
, stdout);
 fputs(
"              The pre proxy string should be specified with a protocol:// pre-\n"
"              fix  to  specify  alternative  proxy  protocols.  Use socks4://,\n"
"              socks4a://, socks5:// or  socks5h://  to  request  the  specific\n"
"              SOCKS  version  to be used. No protocol specified will make curl\n"
"              default to SOCKS4.\n"
"\n"
"              If the port number is not specified in the proxy string,  it  is\n"


"              assumed to be 1080.\n"
"\n"
, stdout);
 fputs(
"              User and password that might be provided in the proxy string are\n"
"              URL decoded by curl. This allows you to pass in special  charac-\n"
"              ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       -#, --progress-bar\n"
"              Make curl display transfer progress as a simple progress bar in-\n"
, stdout);
 fputs(
"              stead of the standard, more informational, meter.\n"
"\n"
"              This progress bar draws a single line of '#'  characters  across\n"
"              the screen and shows a percentage if the transfer size is known.\n"
"              For transfers without a known size, there  will  be  space  ship\n"
"              (-=o=-)  that  moves back and forth but only while data is being\n"
"              transferred, with a set of flying hash sign symbols on top.\n"
"\n"
"       --proto-default <protocol>\n"
, stdout);
 fputs(
"              Tells curl to use protocol for any URL missing a scheme name.\n"
"\n"
"              Example:\n"
"\n"
"               curl --proto-default https ftp.mozilla.org\n"
"\n"
"              An unknown or unsupported  protocol  causes  error  CURLE_UNSUP-\n"
"              PORTED_PROTOCOL (1).\n"
"\n"
"              This option does not change the default proxy protocol (http).\n"
"\n"
"              Without  this  option curl would make a guess based on the host,\n"
"              see --url for details.\n"
"\n"
, stdout);
 fputs(
"              Added in 7.45.0.\n"
"\n"
"       --proto-redir <protocols>\n"
"              Tells curl to limit what protocols it may use on redirect.  Pro-\n"
"              tocols  denied by --proto are not overridden by this option. See\n"
"              --proto for how protocols are represented.\n"
"\n"
"              Example, allow only HTTP and HTTPS on redirect:\n"
"\n"
"               curl --proto-redir -all,http,https http://example.com\n"
"\n"
"              By default curl will allow HTTP, HTTPS, FTP and FTPS on redirect\n"
, stdout);
 fputs(
"              (7.65.2).  Older versions of curl allowed all protocols on redi-\n"
"              rect except several disabled for security reasons: Since  7.19.4\n"
"              FILE  and  SCP  are  disabled, and since 7.40.0 SMB and SMBS are\n"
"              also disabled. Specifying all or +all enables all  protocols  on\n"
"              redirect, including those disabled for security.\n"
"\n"
"              Added in 7.20.2.\n"
"\n"
"       --proto <protocols>\n"
, stdout);
 fputs(
"              Tells  curl  to limit what protocols it may use in the transfer.\n"
"              Protocols are evaluated left to right, are comma separated,  and\n"
"              are  each  a protocol name or 'all', optionally prefixed by zero\n"
"              or more modifiers. Available modifiers are:\n"
"\n"
"              +  Permit this protocol in addition to protocols already permit-\n"
"                 ted (this is the default if no modifier is used).\n"
"\n"
, stdout);
 fputs(
"              -  Deny  this  protocol,  removing it from the list of protocols\n"
"                 already permitted.\n"
"\n"
"              =  Permit only this protocol (ignoring the list already  permit-\n"
"                 ted),  though subject to later modification by subsequent en-\n"
"                 tries in the comma separated list.\n"
"\n"
"              For example:\n"
"\n"
"              --proto -ftps  uses the default protocols, but disables ftps\n"
"\n"
"              --proto -all,https,+http\n"
, stdout);
 fputs(
"                             only enables http and https\n"
"\n"
"              --proto =http,https\n"
"                             also only enables http and https\n"
"\n"
"       Unknown protocols produce a warning. This allows scripts to safely rely\n"
"       on being able to disable potentially dangerous protocols, without rely-\n"
"       ing upon support for that protocol being built into curl  to  avoid  an\n"
"       error.\n"
"\n"
"       This option can be used multiple times, in which case the effect is the\n"
, stdout);
 fputs(
"       same as concatenating the protocols into one instance of the option.\n"
"\n"
"       See also --proto-redir and --proto-default. Added in 7.20.2.\n"
"\n"
"       --proxy-anyauth\n"
"              Tells curl to pick a suitable authentication method when  commu-\n"
"              nicating  with  the  given HTTP proxy. This might cause an extra\n"
"              request/response round-trip.\n"
"\n"
"              See also -x, --proxy and --proxy-basic and --proxy-digest. Added\n"
"              in 7.13.2.\n"
"\n"
"       --proxy-basic\n"
, stdout);
 fputs(
"              Tells  curl  to use HTTP Basic authentication when communicating\n"
"              with the given proxy. Use --basic for enabling HTTP Basic with a\n"
"              remote  host.  Basic  is  the default authentication method curl\n"
"              uses with proxies.\n"
"\n"
"              See also -x, --proxy and --proxy-anyauth and --proxy-digest.\n"
"\n"
"       --proxy-cacert <file>\n"
"              Same as --cacert but used in HTTPS proxy context.\n"
"\n"
, stdout);
 fputs(
"              See also  --proxy-capath  and  --cacert  and  --capath  and  -x,\n"
"              --proxy. Added in 7.52.0.\n"
"\n"
"       --proxy-capath <dir>\n"
"              Same as --capath but used in HTTPS proxy context.\n"
"\n"
"              See  also  --proxy-cacert and -x, --proxy and --capath. Added in\n"
"              7.52.0.\n"
"\n"
"       --proxy-cert-type <type>\n"
"              Same as --cert-type but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
"\n"
"       --proxy-crlfile <file>\n"
"              Same as --crlfile but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --proxy-digest\n"
"              Tells  curl to use HTTP Digest authentication when communicating\n"
, stdout);
 fputs(
"              with the given proxy. Use --digest for enabling HTTP Digest with\n"
"              a remote host.\n"
"\n"
"              See also -x, --proxy and --proxy-anyauth and --proxy-basic.\n"
"\n"
"       --proxy-header <header/@file>\n"
"              (HTTP)  Extra header to include in the request when sending HTTP\n"
"              to a proxy. You may specify any number of extra headers. This is\n"
"              the  equivalent option to -H, --header but is for proxy communi-\n"
, stdout);
 fputs(
"              cation only like in CONNECT requests when you  want  a  separate\n"
"              header  sent  to  the proxy to what is sent to the actual remote\n"
"              host.\n"
"\n"
"              curl will make sure that each header  you  add/replace  is  sent\n"
"              with the proper end-of-line marker, you should thus not add that\n"
"              as a part of the header content: do not add newlines or carriage\n"
"              returns, they will only mess things up for you.\n"
"\n"
, stdout);
 fputs(
"              Headers  specified  with this option will not be included in re-\n"
"              quests that curl knows will not be sent to a proxy.\n"
"\n"
"              Starting in 7.55.0, this option can take an argument  in  @file-\n"
"              name  style, which then adds a header for each line in the input\n"
"              file. Using @- will make curl read the header file from stdin.\n"
"\n"
"              This option can be used  multiple  times  to  add/replace/remove\n"
"              multiple headers.\n"
"\n"
, stdout);
 fputs(
"              Added in 7.37.0.\n"
"       --proxy-insecure\n"
"              Same as -k, --insecure but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --proxy-key-type <type>\n"
"              Same as --key-type but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --proxy-key <key>\n"
"              Same as --key but used in HTTPS proxy context.\n"
"\n"
"       --proxy-negotiate\n"
"              Tells  curl  to  use HTTP Negotiate (SPNEGO) authentication when\n"
, stdout);
 fputs(
"              communicating with the given proxy. Use --negotiate for enabling\n"
"              HTTP Negotiate (SPNEGO) with a remote host.\n"
"\n"
"              See also --proxy-anyauth and --proxy-basic. Added in 7.17.1.\n"
"\n"
"       --proxy-ntlm\n"
"              Tells  curl  to  use HTTP NTLM authentication when communicating\n"
"              with the given proxy. Use --ntlm for enabling NTLM with a remote\n"
"              host.\n"
"\n"
"              See also --proxy-negotiate and --proxy-anyauth.\n"
"\n"
, stdout);
 fputs(
"       --proxy-pass <phrase>\n"
"              Same as --pass but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --proxy-pinnedpubkey <hashes>\n"
"              (TLS)  Tells  curl  to  use  the  specified  public key file (or\n"
"              hashes) to verify the proxy. This can be a path to a file  which\n"
"              contains a single public key in PEM or DER format, or any number\n"
"              of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
, stdout);
 fputs(
"              rated by ';'\n"
"\n"
"              When  negotiating  a  TLS  or SSL connection, the server sends a\n"
"              certificate indicating its identity. A public key  is  extracted\n"
"              from  this certificate and if it does not exactly match the pub-\n"
"              lic key provided to this option, curl will abort the  connection\n"
"              before sending or receiving any data.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
, stdout);
 fputs(
"       --proxy-service-name <name>\n"
"              This  option allows you to change the service name for proxy ne-\n"
"              gotiation.\n"
"\n"
"              Added in 7.43.0.\n"
"\n"
"       --proxy-ssl-allow-beast\n"
"              Same as --ssl-allow-beast but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --proxy-tls13-ciphers <ciphersuite list>\n"
"              (TLS) Specifies which cipher suites to use in the connection  to\n"
, stdout);
 fputs(
"              your HTTPS proxy when it negotiates TLS 1.3. The list of ciphers\n"
"              suites must specify valid ciphers. Read up  on  TLS  1.3  cipher\n"
"              suite details on this URL:\n"
"\n"
"               https://curl.haxx.se/docs/ssl-ciphers.html\n"
"\n"
"              This  option  is  currently  used only when curl is built to use\n"
"              OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
"              you  can try setting TLS 1.3 cipher suites by using the --proxy-\n"
, stdout);
 fputs(
"              ciphers option.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --proxy-tlsauthtype <type>\n"







|








|

|


|
|


|






|


|
|


|



















|








|













|
|






|
|
|
|







|










|



|




|

|







2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
"\n"
"       --proxy-crlfile <file>\n"
"              Same as --crlfile but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --proxy-digest\n"
"              Tells curl to use HTTP Digest authentication when  communicating\n"
, stdout);
 fputs(
"              with the given proxy. Use --digest for enabling HTTP Digest with\n"
"              a remote host.\n"
"\n"
"              See also -x, --proxy and --proxy-anyauth and --proxy-basic.\n"
"\n"
"       --proxy-header <header/@file>\n"
"              (HTTP) Extra header to include in the request when sending  HTTP\n"
"              to a proxy. You may specify any number of extra headers. This is\n"
"              the equivalent option to -H, --header but is for proxy  communi-\n"
, stdout);
 fputs(
"              cation  only  like  in CONNECT requests when you want a separate\n"
"              header sent to the proxy to what is sent to  the  actual  remote\n"
"              host.\n"
"\n"
"              curl  will  make  sure  that each header you add/replace is sent\n"
"              with the proper end-of-line marker, you should thus not add that\n"
"              as a part of the header content: do not add newlines or carriage\n"
"              returns, they will only mess things up for you.\n"
"\n"
, stdout);
 fputs(
"              Headers specified with this option will not be included  in  re-\n"
"              quests that curl knows will not be sent to a proxy.\n"
"\n"
"              Starting  in  7.55.0, this option can take an argument in @file-\n"
"              name style, which then adds a header for each line in the  input\n"
"              file. Using @- will make curl read the header file from stdin.\n"
"\n"
"              This  option  can  be  used multiple times to add/replace/remove\n"
"              multiple headers.\n"
"\n"
, stdout);
 fputs(
"              Added in 7.37.0.\n"
"       --proxy-insecure\n"
"              Same as -k, --insecure but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --proxy-key-type <type>\n"
"              Same as --key-type but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --proxy-key <key>\n"
"              Same as --key but used in HTTPS proxy context.\n"
"\n"
"       --proxy-negotiate\n"
"              Tells curl to use HTTP Negotiate  (SPNEGO)  authentication  when\n"
, stdout);
 fputs(
"              communicating with the given proxy. Use --negotiate for enabling\n"
"              HTTP Negotiate (SPNEGO) with a remote host.\n"
"\n"
"              See also --proxy-anyauth and --proxy-basic. Added in 7.17.1.\n"
"\n"
"       --proxy-ntlm\n"
"              Tells curl to use HTTP NTLM  authentication  when  communicating\n"
"              with the given proxy. Use --ntlm for enabling NTLM with a remote\n"
"              host.\n"
"\n"
"              See also --proxy-negotiate and --proxy-anyauth.\n"
"\n"
, stdout);
 fputs(
"       --proxy-pass <phrase>\n"
"              Same as --pass but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --proxy-pinnedpubkey <hashes>\n"
"              (TLS) Tells curl to  use  the  specified  public  key  file  (or\n"
"              hashes)  to verify the proxy. This can be a path to a file which\n"
"              contains a single public key in PEM or DER format, or any number\n"
"              of base64 encoded sha256 hashes preceded by 'sha256//' and sepa-\n"
, stdout);
 fputs(
"              rated by ';'\n"
"\n"
"              When negotiating a TLS or SSL connection,  the  server  sends  a\n"
"              certificate  indicating  its identity. A public key is extracted\n"
"              from this certificate and if it does not exactly match the  pub-\n"
"              lic  key provided to this option, curl will abort the connection\n"
"              before sending or receiving any data.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
, stdout);
 fputs(
"       --proxy-service-name <name>\n"
"              This option allows you to change the service name for proxy  ne-\n"
"              gotiation.\n"
"\n"
"              Added in 7.43.0.\n"
"\n"
"       --proxy-ssl-allow-beast\n"
"              Same as --ssl-allow-beast but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --proxy-tls13-ciphers <ciphersuite list>\n"
"              (TLS)  Specifies which cipher suites to use in the connection to\n"
, stdout);
 fputs(
"              your HTTPS proxy when it negotiates TLS 1.3. The list of ciphers\n"
"              suites  must  specify  valid  ciphers. Read up on TLS 1.3 cipher\n"
"              suite details on this URL:\n"
"\n"
"               https://curl.haxx.se/docs/ssl-ciphers.html\n"
"\n"
"              This option is currently used only when curl  is  built  to  use\n"
"              OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
"              you can try setting TLS 1.3 cipher suites by using the  --proxy-\n"
, stdout);
 fputs(
"              ciphers option.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --proxy-tlsauthtype <type>\n"
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037






3038
3039
3040
3041
3042






3043
3044







3045
3046
3047
3048
3049
3050
3051


3052
3053
3054
3055
3056
3057
3058
3059


3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077


3078
3079
3080
3081
3082
3083

3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097

3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108

3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125


3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139


3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157



3158
3159
3160
3161
3162
3163


3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176


3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188


3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199


3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212


3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223


3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240


3241
3242
3243
3244
3245
3246
3247
3248


3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267


3268
3269
3270
3271
3272
3273
3274


3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285


3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296


3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310


3311
3312
3313
3314
3315
3316




3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342

3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359

3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372

3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383

3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394


3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409


3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420

3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434


3435
3436
3437
3438
3439


3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453


3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466


3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479


3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492


3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505


3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518


3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532


3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545


3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558


3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572


3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588




3589
3590
3591
3592


3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605


3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622




3623
3624
3625


3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637


3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648


3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665



3666
3667
3668


3669
3670
3671
3672
3673
3674
3675
3676
3677
3678


3679
3680
3681
3682
3683


3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694


3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711


3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724


3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740


3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753


3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770


3771
3772
3773
3774
3775
3776
3777
3778
3779



3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802



3803
3804
3805
3806
3807
3808
3809
3810
3811



3812
3813
3814
3815
3816


3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834



3835
3836
3837
3838


3839
3840
3841
3842
3843
3844
3845
3846
3847
3848


3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860


3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872


3873
3874
3875
3876
3877


3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893


3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907


3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918


3919
3920
3921
3922
3923
3924



3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940


3941
3942
3943
3944
3945
3946
3947



3948
3949
3950
3951
3952
3953
3954
3955
3956



3957
3958
3959
3960
3961
3962
3963
3964
3965
3966



3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990



3991
3992
3993
3994
3995
3996


3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010


4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022


4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038



4039
4040
4041
4042
4043


4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056


4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077


4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093


4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107


4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118


4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132


4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146


4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158


4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173


4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186


4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202


4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216


4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235


4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256


4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277


4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294


4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314


4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
"\n"
"       --proxy-tlsv1\n"
"              Same as -1, --tlsv1 but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       -U, --proxy-user <user:password>\n"
"              Specify the user name and password to use for proxy  authentica-\n"
"              tion.\n"
"\n"
"              If  you use a Windows SSPI-enabled curl binary and do either Ne-\n"
"              gotiate or NTLM authentication then you can tell curl to  select\n"
, stdout);
 fputs(
"              the user name and password from your environment by specifying a\n"
"              single colon with this option: \"-U :\".\n"
"\n"
"              On systems where it works, curl will hide the given option argu-\n"
"              ment  from  process listings. This is not enough to protect cre-\n"
"              dentials from possibly getting seen by other users on  the  same\n"
"              system  as  they will still be visible for a brief moment before\n"
, stdout);
 fputs(
"              cleared. Such sensitive data should be retrieved from a file in-\n"
"              stead or similar and never used in clear text in a command line.\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       -x, --proxy [protocol://]host[:port]\n"
"              Use the specified proxy.\n"
"\n"
"              The  proxy string can be specified with a protocol:// prefix. No\n"
"              protocol specified or http:// will be treated as HTTP proxy. Use\n"
, stdout);
 fputs(
"              socks4://, socks4a://, socks5:// or socks5h:// to request a spe-\n"
"              cific SOCKS version to be used.  (The protocol support was added\n"
"              in curl 7.21.7)\n"
"\n"
"              HTTPS  proxy  support  via https:// protocol prefix was added in\n"
"              7.52.0 for OpenSSL, GnuTLS and NSS.\n"
"\n"
"              Unrecognized and unsupported  proxy  protocols  cause  an  error\n"
"              since  7.52.0.   Prior  versions may ignore the protocol and use\n"
, stdout);
 fputs(
"              http:// instead.\n"
"\n"
"              If the port number is not specified in the proxy string,  it  is\n"
"              assumed to be 1080.\n"
"\n"
"              This  option  overrides  existing environment variables that set\n"
"              the proxy to use. If there's an environment variable  setting  a\n"
"              proxy, you can set proxy to \"\" to override it.\n"
"\n"
"              All operations that are performed over an HTTP proxy will trans-\n"
, stdout);
 fputs(
"              parently be converted to HTTP. It means  that  certain  protocol\n"
"              specific operations might not be available. This is not the case\n"
"              if you can tunnel through the proxy, as one with the -p, --prox-\n"
"              ytunnel option.\n"
"\n"
"              User and password that might be provided in the proxy string are\n"
"              URL decoded by curl. This allows you to pass in special  charac-\n"
"              ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
, stdout);
 fputs(
"              The  proxy host can be specified the exact same way as the proxy\n"
"              environment variables, including the protocol  prefix  (http://)\n"
"              and the embedded user + password.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --proxy1.0 <host[:port]>\n"
"              Use  the  specified  HTTP  1.0  proxy. If the port number is not\n"
"              specified, it is assumed at port 1080.\n"
"\n"
, stdout);
 fputs(
"              The only difference between this and the HTTP proxy  option  -x,\n"
"              --proxy,  is that attempts to use CONNECT through the proxy will\n"
"              specify an HTTP 1.0 protocol instead of the default HTTP 1.1.\n"
"\n"
"       -p, --proxytunnel\n"
"              When an HTTP proxy is used -x, --proxy, this  option  will  make\n"
"              curl  tunnel through the proxy. The tunnel approach is made with\n"
"              the HTTP proxy CONNECT request and requires that the  proxy  al-\n"
, stdout);
 fputs(
"              lows direct connect to the remote port number curl wants to tun-\n"
"              nel through to.\n"
"\n"
"              To suppress proxy CONNECT response headers when curl is  set  to\n"
"              output headers use --suppress-connect-headers.\n"
"\n"
"              See also -x, --proxy.\n"
"\n"
"       --pubkey <key>\n"
"              (SFTP SCP) Public key file name. Allows you to provide your pub-\n"
"              lic key in this separate file.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"              (As of 7.39.0, curl attempts to automatically extract the public\n"
"              key  from the private key file, so passing this option is gener-\n"
"              ally not required. Note that this public key extraction requires\n"
"              libcurl  to  be linked against a copy of libssh2 1.2.8 or higher\n"
"              that is itself linked against OpenSSL.)\n"
"\n"
"       -Q, --quote\n"
, stdout);
 fputs(
"              (FTP SFTP) Send an arbitrary command to the remote FTP  or  SFTP\n"
"              server.  Quote commands are sent BEFORE the transfer takes place\n"
"              (just after the initial PWD command in an FTP  transfer,  to  be\n"
"              exact). To make commands take place after a successful transfer,\n"
"              prefix them with a dash '-'.  To make  commands  be  sent  after\n"
"              curl has changed the working directory, just before the transfer\n"
, stdout);
 fputs(
"              command(s), prefix the command with a '+'  (this  is  only  sup-\n"
"              ported for FTP). You may specify any number of commands.\n"
"\n"
"              If  the  server returns failure for one of the commands, the en-\n"
"              tire operation will be aborted. You must send syntactically cor-\n"
"              rect  FTP  commands as RFC 959 defines to FTP servers, or one of\n"
"              the commands listed below to SFTP servers.\n"
"\n"
, stdout);
 fputs(
"              Prefix the command with an asterisk (*) to  make  curl  continue\n"
"              even  if the command fails as by default curl will stop at first\n"
"              failure.\n"
"\n"
"              This option can be used multiple times.\n"
"\n"
"              SFTP is a binary protocol. Unlike for FTP, curl interprets  SFTP\n"
"              quote  commands  itself before sending them to the server.  File\n"
"              names may be quoted shell-style to embed spaces or special char-\n"
, stdout);
 fputs(
"              acters.   Following is the list of all supported SFTP quote com-\n"
"              mands:\n"
"\n"
"              chgrp group file\n"
"                     The chgrp command sets the group ID of the file named  by\n"
"                     the  file  operand to the group ID specified by the group\n"
"                     operand. The group operand is a decimal integer group ID.\n"
"\n"
"              chmod mode file\n"
"                     The chmod command modifies the  file  mode  bits  of  the\n"
, stdout);
 fputs(
"                     specified file. The mode operand is an octal integer mode\n"
"                     number.\n"
"\n"
"              chown user file\n"
"                     The chown command sets the owner of the file named by the\n"
"                     file  operand  to the user ID specified by the user oper-\n"
"                     and. The user operand is a decimal integer user ID.\n"
"\n"
"              ln source_file target_file\n"
"                     The ln and symlink commands create a symbolic link at the\n"
, stdout);
 fputs(
"                     target_file  location  pointing  to the source_file loca-\n"
"                     tion.\n"
"\n"
"              mkdir directory_name\n"
"                     The mkdir command creates the directory named by the  di-\n"
"                     rectory_name operand.\n"
"\n"
"              pwd    The pwd command returns the absolute pathname of the cur-\n"
"                     rent working directory.\n"
"\n"
"              rename source target\n"
, stdout);
 fputs(
"                     The rename command renames the file or directory named by\n"
"                     the  source  operand to the destination path named by the\n"
"                     target operand.\n"
"\n"
"              rm file\n"
"                     The rm command removes the file specified by the file op-\n"
"                     erand.\n"
"\n"
"              rmdir directory\n"
"                     The  rmdir  command removes the directory entry specified\n"
, stdout);
 fputs(
"                     by the directory operand, provided it is empty.\n"
"\n"
"              symlink source_file target_file\n"
"                     See ln.\n"
"\n"
"       --random-file <file>\n"
"              Specify the path name to file containing what will be considered\n"
"              as  random  data. The data may be used to seed the random engine\n"
"              for SSL connections.  See also the --egd-file option.\n"
"\n"
"       -r, --range <range>\n"
, stdout);
 fputs(
"              (HTTP FTP SFTP FILE) Retrieve a byte range (i.e. a partial docu-\n"
"              ment)  from  an  HTTP/1.1,  FTP  or SFTP server or a local FILE.\n"
"              Ranges can be specified in a number of ways.\n"
"\n"
"              0-499     specifies the first 500 bytes\n"
"\n"
"              500-999   specifies the second 500 bytes\n"
"\n"
"              -500      specifies the last 500 bytes\n"
"\n"
"              9500-     specifies the bytes from offset 9500 and forward\n"
"\n"
, stdout);
 fputs(
"              0-0,-1    specifies the first and last byte only(*)(HTTP)\n"
"\n"
"              100-199,500-599\n"
"                        specifies two separate 100-byte ranges(*) (HTTP)\n"
"\n"
"              (*) = NOTE that this will cause the server to reply with a  mul-\n"
"              tipart response!\n"
"\n"
"              Only  digit characters (0-9) are valid in the 'start' and 'stop'\n"
"              fields of the 'start-stop' range syntax. If a non-digit  charac-\n"
, stdout);
 fputs(
"              ter is given in the range, the server's response will be unspec-\n"
"              ified, depending on the server's configuration.\n"
"\n"
"              You should also be aware that many HTTP/1.1 servers do not  have\n"
"              this  feature  enabled, so that when you attempt to get a range,\n"
"              you'll instead get the whole document.\n"
"\n"
"              FTP and SFTP range downloads only  support  the  simple  'start-\n"
, stdout);
 fputs(
"              stop'  syntax  (optionally with one of the numbers omitted). FTP\n"
"              use depends on the extended FTP command SIZE.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --raw  (HTTP) When used, it disables all internal HTTP decoding of con-\n"
"              tent  or transfer encodings and instead makes them passed on un-\n"
"              altered, raw.\n"
"\n"
"              Added in 7.16.2.\n"
"\n"
"       -e, --referer <URL>\n"
, stdout);
 fputs(
"              (HTTP) Sends the \"Referrer Page\" information to the HTTP server.\n"
"              This can also be set with the -H, --header flag of course.  When\n"
"              used with -L, --location you  can  append  \";auto\"  to  the  -e,\n"
"              --referer  URL  to  make curl automatically set the previous URL\n"
"              when it follows a Location: header. The \";auto\"  string  can  be\n"
"              used alone, even if you don't set an initial -e, --referer.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"              See also -A, --user-agent and -H, --header.\n"
"\n"
"       -J, --remote-header-name\n"
"              (HTTP) This option tells the -O, --remote-name option to use the\n"
"              server-specified Content-Disposition  filename  instead  of  ex-\n"
"              tracting a filename from the URL.\n"
"\n"
"              If  the  server  specifies a file name and a file with that name\n"
, stdout);
 fputs(
"              already exists in the current working directory it will  not  be\n"
"              overwritten and an error will occur. If the server doesn't spec-\n"
"              ify a file name then this option has no effect.\n"
"\n"
"              There's no attempt to decode %-sequences (yet) in  the  provided\n"
"              file name, so this option may provide you with rather unexpected\n"
"              file names.\n"
"\n"
"              WARNING: Exercise judicious use of this  option,  especially  on\n"
, stdout);
 fputs(
"              Windows.  A  rogue  server  could  send you the name of a DLL or\n"
"              other file that could possibly be loaded automatically  by  Win-\n"
"              dows or some third party software.\n"
"\n"
"       --remote-name-all\n"
"              This  option changes the default action for all given URLs to be\n"
"              dealt with as if -O, --remote-name were used for each one. So if\n"
"              you want to disable that for a specific URL after --remote-name-\n"
, stdout);
 fputs(
"              all has been used, you must use \"-o -\" or --no-remote-name.\n"
"\n"
"              Added in 7.19.0.\n"
"\n"
"       -O, --remote-name\n"
"              Write output to a local file named like the remote file we  get.\n"
"              (Only  the file part of the remote file is used, the path is cut\n"
"              off.)\n"
"\n"
"              The file will be saved in the current working directory. If  you\n"
"              want  the  file  saved  in  a different directory, make sure you\n"
, stdout);
 fputs(
"              change the current working directory before invoking  curl  with\n"
"              this option.\n"
"\n"
"              The  remote  file  name  to use for saving is extracted from the\n"
"              given URL, nothing else, and if it already  exists  it  will  be\n"
"              overwritten.  If  you  want  the server to be able to choose the\n"
"              file name refer to -J, --remote-header-name which can be used in\n"
, stdout);
 fputs(
"              addition  to  this option. If the server chooses a file name and\n"
"              that name already exists it will not be overwritten.\n"
"\n"
"              There is no URL decoding done on the file name. If it has %20 or\n"
"              other  URL  encoded parts of the name, they will end up as-is as\n"
"              file name.\n"
"\n"
"              You may use this option as many times as the number of URLs  you\n"
"              have.\n"
"\n"
"       -R, --remote-time\n"
, stdout);
 fputs(
"              When  used,  this will make curl attempt to figure out the time-\n"
"              stamp of the remote file, and if that is available make the  lo-\n"
"              cal file get that same timestamp.\n"
"\n"
"       --request-target\n"
"              (HTTP)  Tells curl to use an alternative \"target\" (path) instead\n"
"              of using the path as provided in the  URL.  Particularly  useful\n"
"              when  wanting  to  issue  HTTP requests without leading slash or\n"
, stdout);
 fputs(
"              other data that doesn't follow the  regular  URL  pattern,  like\n"
"              \"OPTIONS *\".\n"
"\n"
"              Added in 7.55.0.\n"
"\n"
"       -X, --request <command>\n"
"              (HTTP) Specifies a custom request method to use when communicat-\n"
"              ing with the HTTP server.  The specified request method will  be\n"
"              used  instead  of  the  method otherwise used (which defaults to\n"
"              GET). Read the HTTP 1.1 specification for details  and  explana-\n"
, stdout);
 fputs(
"              tions.  Common  additional HTTP requests include PUT and DELETE,\n"
"              but related technologies like WebDAV offers PROPFIND, COPY, MOVE\n"
"              and more.\n"
"\n"
"              Normally  you  don't  need  this option. All sorts of GET, HEAD,\n"
"              POST and PUT requests are rather invoked by using dedicated com-\n"
"              mand line options.\n"
"\n"
"              This  option  only  changes the actual word used in the HTTP re-\n"
, stdout);
 fputs(
"              quest, it does not alter the way curl behaves. So for example if\n"
"              you  want  to make a proper HEAD request, using -X HEAD will not\n"
"              suffice. You need to use the -I, --head option.\n"
"\n"
"              The method string you set with -X, --request will  be  used  for\n"
"              all  requests,  which  if you for example use -L, --location may\n"
"              cause unintended side-effects when curl doesn't  change  request\n"
, stdout);
 fputs(
"              method according to the HTTP 30x response codes - and similar.\n"
"\n"
"              (FTP) Specifies a custom FTP command to use instead of LIST when\n"
"              doing file lists with FTP.\n"
"\n"
"              (POP3) Specifies a custom POP3 command to use instead of LIST or\n"
"              RETR. (Added in 7.26.0)\n"
"\n"
"              (IMAP)  Specifies  a custom IMAP command to use instead of LIST.\n"
"              (Added in 7.30.0)\n"
"\n"
, stdout);
 fputs(
"              (SMTP) Specifies a custom SMTP command to use instead of HELP or\n"
"              VRFY. (Added in 7.34.0)\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --resolve <host:port:address[,address]...>\n"
"              Provide  a custom address for a specific host and port pair. Us-\n"
"              ing this, you can make the curl requests(s) use a specified  ad-\n"
"              dress  and prevent the otherwise normally resolved address to be\n"
, stdout);
 fputs(
"              used. Consider it a sort of /etc/hosts alternative  provided  on\n"
"              the  command line. The port number should be the number used for\n"
"              the specific protocol the host will be used for.  It  means  you\n"
"              need several entries if you want to provide address for the same\n"
"              host but different ports.\n"
"\n"
"              By specifying '*' as host you can tell curl to resolve any  host\n"
, stdout);
 fputs(
"              and specific port pair to the specified address. Wildcard is re-\n"
"              solved last so any --resolve with a specific host and port  will\n"
"              be used first.\n"
"\n"
"              The provided address set by this option will be used even if -4,\n"
"              --ipv4 or -6, --ipv6 is set to make curl use another IP version.\n"
"              Support for providing the IP address within [brackets] was added\n"
"              in 7.57.0.\n"
"\n"
, stdout);
 fputs(
"              Support  for providing multiple IP addresses per entry was added\n"
"              in 7.59.0.\n"
"\n"
"              Support for resolving with wildcard was added in 7.64.0.\n"
"\n"
"              This option can be used many times to add many host names to re-\n"
"              solve.\n"
"\n"
"              Added in 7.21.3.\n"
"\n"
"       --retry-connrefused\n"
"              In  addition to the other conditions, consider ECONNREFUSED as a\n"
"              transient error too for --retry. This option  is  used  together\n"
, stdout);
 fputs(
"              with --retry.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --retry-delay <seconds>\n"
"              Make  curl  sleep  this  amount of time before each retry when a\n"
"              transfer has failed with a transient error (it changes  the  de-\n"
"              fault  backoff  time  algorithm between retries). This option is\n"
"              only interesting if --retry is also used. Setting this delay  to\n"
"              zero will make curl use the default backoff time.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.12.3.\n"
"\n"
"       --retry-max-time <seconds>\n"
"              The  retry timer is reset before the first transfer attempt. Re-\n"
"              tries will be done as usual (see --retry) as long as  the  timer\n"
"              hasn't reached this given limit. Notice that if the timer hasn't\n"
"              reached the limit, the request will be made and  while  perform-\n"
, stdout);
 fputs(
"              ing,  it may take longer than this given time period. To limit a\n"
"              single request's maximum time, use -m, --max-time.  Set this op-\n"
"              tion to zero to not timeout retries.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.12.3.\n"
"\n"
"       --retry <num>\n"
"              If  a  transient  error is returned when curl tries to perform a\n"
, stdout);
 fputs(
"              transfer, it will retry this number of times before  giving  up.\n"
"              Setting  the  number to 0 makes curl do no retries (which is the\n"
"              default). Transient error means either: a timeout,  an  FTP  4xx\n"
"              response code or an HTTP 408 or 5xx response code.\n"
"\n"
"              When  curl  is about to retry a transfer, it will first wait one\n"
"              second and then for all forthcoming retries it will  double  the\n"
, stdout);
 fputs(
"              waiting  time until it reaches 10 minutes which then will be the\n"
"              delay between the rest of the retries.  By  using  --retry-delay\n"
"              you   disable  this  exponential  backoff  algorithm.  See  also\n"
"              --retry-max-time to limit the total time allowed for retries.\n"
"\n"






"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.12.3.\n"
"\n"
"       --sasl-ir\n"






, stdout);
 fputs(







"              Enable initial response in SASL authentication.\n"
"\n"
"              Added in 7.31.0.\n"
"\n"
"       --service-name <name>\n"
"              This option allows you to change the service name for SPNEGO.\n"
"\n"


"              Examples:   --negotiate   --service-name   sockd    would    use\n"
"              sockd/server-name.\n"
"\n"
"              Added in 7.43.0.\n"
"       -S, --show-error\n"
"              When used with -s, --silent, it makes curl show an error message\n"
"              if it fails.\n"
"       -s, --silent\n"


, stdout);
 fputs(
"              Silent or quiet mode. Don't show progress meter  or  error  mes-\n"
"              sages.   Makes  Curl mute. It will still output the data you ask\n"
"              for, potentially even to the terminal/stdout unless you redirect\n"
"              it.\n"
"\n"
"              Use  -S,  --show-error  in  addition  to  this option to disable\n"
"              progress meter but still show error messages.\n"
"\n"
"              See also -v, --verbose and --stderr.\n"
"\n"
"       --socks4 <host[:port]>\n"
, stdout);
 fputs(
"              Use the specified SOCKS4 proxy. If the port number is not speci-\n"
"              fied, it is assumed at port 1080.\n"
"\n"


"              This  option  overrides any previous use of -x, --proxy, as they\n"
"              are mutually exclusive.\n"
"\n"
"              Since 7.21.7, this option is superfluous since you can specify a\n"
"              socks4 proxy with -x, --proxy using a socks4:// protocol prefix.\n"
"              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"

, stdout);
 fputs(
"              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
"              such a case curl first connects to the SOCKS proxy and then con-\n"
"              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.15.2.\n"
"\n"
"       --socks4a <host[:port]>\n"
"              Use the specified SOCKS4a proxy. If the port number is not spec-\n"
"              ified, it is assumed at port 1080.\n"
"\n"

, stdout);
 fputs(
"              This  option  overrides any previous use of -x, --proxy, as they\n"
"              are mutually exclusive.\n"
"\n"
"              Since 7.21.7, this option is superfluous since you can specify a\n"
"              socks4a  proxy with -x, --proxy using a socks4a:// protocol pre-\n"
"              fix.\n"
"\n"
"              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
"              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"

, stdout);
 fputs(
"              such a case curl first connects to the SOCKS proxy and then con-\n"
"              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.18.0.\n"
"\n"
"       --socks5-basic\n"
"              Tells curl to use username/password authentication when connect-\n"
"              ing to a SOCKS5 proxy.  The username/password authentication  is\n"
, stdout);
 fputs(
"              enabled  by  default.   Use --socks5-gssapi to force GSS-API au-\n"
"              thentication to SOCKS5 proxies.\n"
"\n"


"              Added in 7.55.0.\n"
"\n"
"       --socks5-gssapi-nec\n"
"              As part of the GSS-API negotiation a protection mode is  negoti-\n"
"              ated.  RFC  1961 says in section 4.3/4.4 it should be protected,\n"
"              but the NEC  reference  implementation  does  not.   The  option\n"
, stdout);
 fputs(
"              --socks5-gssapi-nec  allows the unprotected exchange of the pro-\n"
"              tection mode negotiation.\n"
"\n"
"              Added in 7.19.4.\n"
"\n"
"       --socks5-gssapi-service <name>\n"


"              The default service name for a socks server is rcmd/server-fqdn.\n"
"              This option allows you to change it.\n"
"\n"
"              Examples:   --socks5  proxy-name  --socks5-gssapi-service  sockd\n"
"              would use sockd/proxy-name --socks5 proxy-name  --socks5-gssapi-\n"
, stdout);
 fputs(
"              service  sockd/real-name  would  use  sockd/real-name  for cases\n"
"              where the proxy-name does not match the principal name.\n"
"\n"
"              Added in 7.19.4.\n"
"\n"
"       --socks5-gssapi\n"
"              Tells curl to use GSS-API authentication when  connecting  to  a\n"
"              SOCKS5  proxy.  The GSS-API authentication is enabled by default\n"
"              (if curl is compiled with GSS-API support).  Use  --socks5-basic\n"
, stdout);
 fputs(



"              to force username/password authentication to SOCKS5 proxies.\n"
"\n"
"              Added in 7.55.0.\n"
"\n"
"       --socks5-hostname <host[:port]>\n"
"              Use  the  specified  SOCKS5 proxy (and let the proxy resolve the\n"


"              host name). If the port number is not specified, it  is  assumed\n"
"              at port 1080.\n"
"\n"
"              This  option  overrides any previous use of -x, --proxy, as they\n"
"              are mutually exclusive.\n"
"\n"
, stdout);
 fputs(
"              Since 7.21.7, this option is superfluous since you can specify a\n"
"              socks5 hostname proxy with -x, --proxy using a socks5h:// proto-\n"
"              col prefix.\n"
"\n"
"              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"


"              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
"              such a case curl first connects to the SOCKS proxy and then con-\n"
"              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.18.0.\n"
"\n"
"       --socks5 <host[:port]>\n"
"              Use  the  specified SOCKS5 proxy - but resolve the host name lo-\n"


"              cally. If the port number is not specified,  it  is  assumed  at\n"
"              port 1080.\n"
"\n"
"              This  option  overrides any previous use of -x, --proxy, as they\n"
"              are mutually exclusive.\n"
"\n"
, stdout);
 fputs(
"              Since 7.21.7, this option is superfluous since you can specify a\n"
"              socks5 proxy with -x, --proxy using a socks5:// protocol prefix.\n"
"              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"


"              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
"              such a case curl first connects to the SOCKS proxy and then con-\n"
"              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"              This option (as well as --socks4) does not work with IPV6,  FTPS\n"
"              or LDAP.\n"
"\n"
"              Added in 7.18.0.\n"
"\n"
"       -Y, --speed-limit <speed>\n"


"              If a download is slower than this given speed (in bytes per sec-\n"
"              ond) for speed-time seconds it gets aborted. speed-time  is  set\n"
"              with -y, --speed-time and is 30 if not set.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"       -y, --speed-time <seconds>\n"
"              If a download is slower than speed-limit bytes per second during\n"
"              a speed-time period, the download gets aborted. If speed-time is\n"


"              used,  the  default  speed-limit  will  be 1 unless set with -Y,\n"
"              --speed-limit.\n"
"\n"
"              This option controls transfers and thus  will  not  affect  slow\n"
, stdout);
 fputs(
"              connects  etc.  If this is a concern for you, try the --connect-\n"
"              timeout option.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --ssl-allow-beast\n"
"              This option tells curl to not work around a security flaw in the\n"
"              SSL3  and TLS1.0 protocols known as BEAST.  If this option isn't\n"
"              used, the SSL layer may use workarounds known to cause  interop-\n"
, stdout);
 fputs(


"              erability problems with some older SSL implementations. WARNING:\n"
"              this option loosens the SSL security, and by using this flag you\n"
"              ask for exactly that.\n"
"\n"
"              Added in 7.25.0.\n"
"\n"
"       --ssl-no-revoke\n"
"              (Schannel) This option tells curl to disable certificate revoca-\n"


"              tion checks.  WARNING: this option loosens the SSL security, and\n"
"              by using this flag you ask for exactly that.\n"
"\n"
"              Added in 7.44.0.\n"
"\n"
, stdout);
 fputs(
"       --ssl-reqd\n"
"              (FTP IMAP POP3 SMTP) Require SSL/TLS for the connection.  Termi-\n"
"              nates the connection if the server doesn't support SSL/TLS.\n"
"\n"
"              This option was formerly known as --ftp-ssl-reqd.\n"
"\n"
"              Added in 7.20.0.\n"
"\n"
"       --ssl  (FTP IMAP POP3 SMTP) Try to use SSL/TLS for the connection.  Re-\n"
"              verts  to  a non-secure connection if the server doesn't support\n"
, stdout);
 fputs(


"              SSL/TLS.  See also --ftp-ssl-control and --ssl-reqd for  differ-\n"
"              ent levels of encryption required.\n"
"\n"
"              This  option  was formerly known as --ftp-ssl (Added in 7.11.0).\n"
"              That option name can still be used but will be removed in a  fu-\n"
"              ture version.\n"
"\n"


"              Added in 7.20.0.\n"
"\n"
"       -2, --sslv2\n"
"              (SSL)  Forces  curl to use SSL version 2 when negotiating with a\n"
, stdout);
 fputs(
"              remote SSL server. Sometimes curl is built  without  SSLv2  sup-\n"
"              port. SSLv2 is widely considered insecure (see RFC 6176).\n"
"\n"
"              See  also  --http1.1  and --http2. -2, --sslv2 requires that the\n"
"              underlying libcurl was built to support TLS. This  option  over-\n"


"              rides -3, --sslv3 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
"       -3, --sslv3\n"
"              (SSL)  Forces  curl to use SSL version 3 when negotiating with a\n"
, stdout);
 fputs(
"              remote SSL server. Sometimes curl is built  without  SSLv3  sup-\n"
"              port. SSLv3 is widely considered insecure (see RFC 7568).\n"
"\n"
"              See  also  --http1.1  and --http2. -3, --sslv3 requires that the\n"
"              underlying libcurl was built to support TLS. This  option  over-\n"


"              rides -2, --sslv2 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
"       --stderr\n"
"              Redirect  all writes to stderr to the specified file instead. If\n"
, stdout);
 fputs(
"              the file name is a plain '-', it is instead written to stdout.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              See also -v, --verbose and -s, --silent.\n"
"\n"
"       --styled-output\n"
"              Enables the automatic use of bold font styles when writing  HTTP\n"


"              headers  to  the terminal. Use --no-styled-output to switch them\n"
"              off.\n"
"\n"
"              Added in 7.61.0.\n"
"\n"
"       --suppress-connect-headers\n"




, stdout);
 fputs(
"              When -p, --proxytunnel is used and a  CONNECT  request  is  made\n"
"              don't  output  proxy  CONNECT  response  headers. This option is\n"
"              meant to be used with -D, --dump-header or -i,  --include  which\n"
"              are  used  to show protocol headers in the output. It has no ef-\n"
"              fect on debug options such as -v, --verbose or --trace,  or  any\n"
"              statistics.\n"
"\n"
, stdout);
 fputs(
"              See also -D, --dump-header and -i, --include and -p, --proxytun-\n"
"              nel.\n"
"\n"
"       --tcp-fastopen\n"
"              Enable use of TCP Fast Open (RFC7413).\n"
"\n"
"              Added in 7.49.0.\n"
"\n"
"       --tcp-nodelay\n"
"              Turn on the TCP_NODELAY option. See the curl_easy_setopt(3)  man\n"
"              page for details about this option.\n"
"\n"
"              Since  7.50.2,  curl sets this option by default and you need to\n"
, stdout);
 fputs(

"              explicitly switch it off if you don't want it on.\n"
"\n"
"              Added in 7.11.2.\n"
"\n"
"       -t, --telnet-option <opt=val>\n"
"              Pass options to the telnet protocol. Supported options are:\n"
"\n"
"              TTYPE=<term> Sets the terminal type.\n"
"\n"
"              XDISPLOC=<X display> Sets the X display location.\n"
"\n"
"              NEW_ENV=<var,val> Sets an environment variable.\n"
"\n"
"       --tftp-blksize <value>\n"
"              (TFTP) Set TFTP BLKSIZE option (must be >512). This is the block\n"
, stdout);
 fputs(

"              size that curl will try to use when transferring data to or from\n"
"              a TFTP server. By default 512 bytes will be used.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.20.0.\n"
"\n"
"       --tftp-no-options\n"
"              (TFTP) Tells curl not to send TFTP options requests.\n"
"\n"
"              This option improves interop with some legacy  servers  that  do\n"
, stdout);
 fputs(

"              not  acknowledge  or  properly implement TFTP options. When this\n"
"              option is used --tftp-blksize is ignored.\n"
"\n"
"              Added in 7.48.0.\n"
"\n"
"       -z, --time-cond <time>\n"
"              (HTTP FTP) Request a file that has been modified later than  the\n"
"              given  time  and date, or one that has been modified before that\n"
"              time. The <date expression> can be all sorts of date strings  or\n"
, stdout);
 fputs(

"              if it doesn't match any internal ones, it is taken as a filename\n"
"              and tries to get the modification date (mtime) from  <file>  in-\n"
"              stead. See the curl_getdate(3) man pages for date expression de-\n"
"              tails.\n"
"\n"
"              Start the date expression with a dash (-) to make it request for\n"
"              a  document that is older than the given date/time, default is a\n"
"              document that is newer than the specified date/time.\n"
"\n"
, stdout);
 fputs(


"              If this option is used several times, the last one will be used.\n"
"\n"
"       --tls-max <VERSION>\n"
"              (SSL) VERSION defines maximum supported TLS version. The minimum\n"
"              acceptable  version  is  set  by  tlsv1.0,  tlsv1.1,  tlsv1.2 or\n"
"              tlsv1.3.\n"
"\n"
"              default\n"
"                     Use up to recommended TLS version.\n"
"\n"
"              1.0    Use up to TLSv1.0.\n"
"              1.1    Use up to TLSv1.1.\n"
"              1.2    Use up to TLSv1.2.\n"
, stdout);
 fputs(


"              1.3    Use up to TLSv1.3.\n"
"\n"
"       See also --tlsv1.0 and --tlsv1.1 and --tlsv1.2 and --tlsv1.3. --tls-max\n"
"       requires that the underlying libcurl was built to support TLS. Added in\n"
"       7.54.0.\n"
"\n"
"       --tls13-ciphers <list of TLS 1.3 ciphersuites>\n"
"              (TLS) Specifies which cipher suites to use in the connection  if\n"
"              it  negotiates  TLS 1.3. The list of ciphers suites must specify\n"
, stdout);
 fputs(

"              valid ciphers. Read up on TLS 1.3 cipher suite details  on  this\n"
"              URL:\n"
"\n"
"               https://curl.haxx.se/docs/ssl-ciphers.html\n"
"\n"
"              This  option  is  currently  used only when curl is built to use\n"
"              OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
"              you can try setting TLS 1.3 cipher suites by using the --ciphers\n"
"              option.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
, stdout);
 fputs(


"       --tlsauthtype <type>\n"
"              Set TLS authentication type. Currently, the only  supported  op-\n"
"              tion  is  \"SRP\",  for  TLS-SRP  (RFC  5054).  If  --tlsuser  and\n"
"              --tlspassword are specified but --tlsauthtype is not, then  this\n"
"              option  defaults to \"SRP\".  This option works only if the under-\n"


"              lying libcurl is built  with  TLS-SRP  support,  which  requires\n"
"              OpenSSL or GnuTLS with TLS-SRP support.\n"
"\n"
, stdout);
 fputs(
"              Added in 7.21.4.\n"
"\n"
"       --tlspassword\n"
"              Set  password  for use with the TLS authentication method speci-\n"
"              fied with --tlsauthtype. Requires that --tlsuser also be set.\n"
"\n"
"              Added in 7.21.4.\n"
"       --tlsuser <name>\n"
"              Set username for use with the TLS authentication  method  speci-\n"


"              fied  with  --tlsauthtype.  Requires  that --tlspassword also is\n"
"              set.\n"
"\n"
"              Added in 7.21.4.\n"
"\n"
"       --tlsv1.0\n"
, stdout);
 fputs(
"              (TLS) Forces curl to use TLS version 1.0 or later when  connect-\n"
"              ing to a remote TLS server.\n"
"\n"
"              In  old  versions  of  curl  this option was documented to allow\n"
"              _only_ TLS 1.0, but behavior was inconsistent depending  on  the\n"


"              TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
"              sion.\n"
"\n"
"              Added in 7.34.0.\n"
"\n"
"       --tlsv1.1\n"
, stdout);
 fputs(
"              (TLS) Forces curl to use TLS version 1.1 or later when  connect-\n"
"              ing to a remote TLS server.\n"
"\n"
"              In  old  versions  of  curl  this option was documented to allow\n"
"              _only_ TLS 1.1, but behavior was inconsistent depending  on  the\n"


"              TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
"              sion.\n"
"\n"
"              Added in 7.34.0.\n"
"\n"
"       --tlsv1.2\n"
, stdout);
 fputs(
"              (TLS) Forces curl to use TLS version 1.2 or later when  connect-\n"
"              ing to a remote TLS server.\n"
"\n"
"              In  old  versions  of  curl  this option was documented to allow\n"
"              _only_ TLS 1.2, but behavior was inconsistent depending  on  the\n"


"              TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
"              sion.\n"
"\n"
"              Added in 7.34.0.\n"
"\n"
"       --tlsv1.3\n"
, stdout);
 fputs(
"              (TLS) Forces curl to use TLS version 1.3 or later when  connect-\n"
"              ing to a remote TLS server.\n"
"\n"
"              Note that TLS 1.3 is only supported by a subset of TLS backends.\n"
"              At the time of this writing, they are BoringSSL, NSS, and Secure\n"


"              Transport (on iOS 11 or later, and macOS 10.13 or later).\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       -1, --tlsv1\n"
"              (SSL)  Tells curl to use at least TLS version 1.x when negotiat-\n"
, stdout);
 fputs(
"              ing with a remote TLS server. That  means  TLS  version  1.0  or\n"
"              higher\n"
"\n"
"              See  also  --http1.1  and --http2. -1, --tlsv1 requires that the\n"
"              underlying libcurl was built to support TLS. This  option  over-\n"


"              rides --tlsv1.1 and --tlsv1.2 and --tlsv1.3.\n"
"\n"
"       --tr-encoding\n"
"              (HTTP) Request a compressed Transfer-Encoding response using one\n"
"              of the algorithms curl supports, and uncompress the  data  while\n"
, stdout);
 fputs(
"              receiving it.\n"
"\n"
"              Added in 7.21.6.\n"
"\n"
"       --trace-ascii <file>\n"
"              Enables a full trace dump of all incoming and outgoing data, in-\n"
"              cluding descriptive information, to the given output  file.  Use\n"


"              \"-\" as filename to have the output sent to stdout.\n"
"\n"
"              This is very similar to --trace, but leaves out the hex part and\n"
"              only shows the ASCII part of the dump. It makes  smaller  output\n"
, stdout);
 fputs(
"              that might be easier to read for untrained humans.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              This option overrides --trace and -v, --verbose.\n"
"\n"
"       --trace-time\n"


"              Prepends  a  time  stamp to each trace or verbose line that curl\n"
"              displays.\n"
"\n"
"              Added in 7.14.0.\n"
"\n"
"       --trace <file>\n"
"              Enables a full trace dump of all incoming and outgoing data, in-\n"
, stdout);
 fputs(
"              cluding  descriptive  information, to the given output file. Use\n"
"              \"-\" as filename to have the output sent to stdout.  Use  \"%\"  as\n"
"              filename to have the output sent to stderr.\n"
"\n"


"              If this option is used several times, the last one will be used.\n"
"\n"
"              This option overrides -v, --verbose and --trace-ascii.\n"
"\n"
"       --unix-socket <path>\n"
"              (HTTP) Connect through this Unix domain socket, instead of using\n"
, stdout);
 fputs(
"              the network.\n"
"\n"
"              Added in 7.40.0.\n"
"\n"
"       -T, --upload-file <file>\n"
"              This transfers the specified local file to the  remote  URL.  If\n"


"              there is no file part in the specified URL, curl will append the\n"
"              local file name. NOTE that you must use a trailing / on the last\n"
"              directory  to really prove to Curl that there is no file name or\n"
"              curl will think that your last directory name is the remote file\n"
, stdout);
 fputs(
"              name to use. That will most likely cause the upload operation to\n"
"              fail. If this is used on an HTTP(S) server, the PUT command will\n"
"              be used.\n"
"\n"
"              Use  the file name \"-\" (a single dash) to use stdin instead of a\n"
"              given file.  Alternately, the file name \".\"  (a  single  period)\n"
"              may  be  specified  instead  of \"-\" to use stdin in non-blocking\n"
"              mode to allow reading server output while  stdin  is  being  up-\n"
, stdout);
 fputs(




"              loaded.\n"
"\n"
"              You  can  specify one -T, --upload-file for each URL on the com-\n"
"              mand line. Each -T, --upload-file + URL pair specifies  what  to\n"


"              upload  and  to  where. curl also supports \"globbing\" of the -T,\n"
"              --upload-file argument, meaning that  you  can  upload  multiple\n"
"              files  to a single URL by using the same URL globbing style sup-\n"
"              ported in the URL, like this:\n"
"\n"
, stdout);
 fputs(
"               curl --upload-file \"{file1,file2}\" http://www.example.com\n"
"\n"
"              or even\n"
"\n"
"               curl -T \"img[1-1000].png\" ftp://ftp.example.com/upload/\n"
"\n"


"              When uploading to an SMTP server: the uploaded data  is  assumed\n"
"              to be RFC 5322 formatted. It has to feature the necessary set of\n"
"              headers and mail body formatted correctly by the  user  as  curl\n"
"              will not transcode nor encode it further in any way.\n"
"\n"
"       --url <url>\n"
, stdout);
 fputs(
"              Specify  a  URL  to  fetch. This option is mostly handy when you\n"
"              want to specify URL(s) in a config file.\n"
"\n"
"              If the given URL is missing a scheme name (such as \"http://\"  or\n"
"              \"ftp://\"  etc) then curl will make a guess based on the host. If\n"
"              the outermost sub-domain name matches  DICT,  FTP,  IMAP,  LDAP,\n"
"              POP3  or  SMTP  then  that protocol will be used, otherwise HTTP\n"
, stdout);
 fputs(




"              will be used. Since 7.45.0 guessing can be disabled by setting a\n"
"              default protocol, see --proto-default for details.\n"
"\n"


"              This  option  may  be used any number of times. To control where\n"
"              this URL is written, use the -o, --output or the  -O,  --remote-\n"
"              name options.\n"
"\n"
"       -B, --use-ascii\n"
"              (FTP  LDAP) Enable ASCII transfer. For FTP, this can also be en-\n"
, stdout);
 fputs(
"              forced by using a URL that  ends  with  \";type=A\".  This  option\n"
"              causes data sent to stdout to be in text mode for win32 systems.\n"
"\n"
"       -A, --user-agent <name>\n"


"              (HTTP) Specify the User-Agent string to send to the HTTP server.\n"
"              To encode blanks in the string, surround the string with  single\n"
"              quote  marks.  This header can also be set with the -H, --header\n"
"              or the --proxy-header options.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"       -u, --user <user:password>\n"
"              Specify the user name and password to use for server authentica-\n"


"              tion. Overrides -n, --netrc and --netrc-optional.\n"
"\n"
"              If  you  simply  specify  the  user name, curl will prompt for a\n"
"              password.\n"
"\n"
"              The user name and passwords are split up  on  the  first  colon,\n"
, stdout);
 fputs(
"              which  makes  it impossible to use a colon in the user name with\n"
"              this option. The password can, still.\n"
"\n"
"              On systems where it works, curl will hide the given option argu-\n"
"              ment  from  process listings. This is not enough to protect cre-\n"
"              dentials from possibly getting seen by other users on  the  same\n"
"              system  as  they will still be visible for a brief moment before\n"
, stdout);
 fputs(



"              cleared. Such sensitive data should be retrieved from a file in-\n"
"              stead or similar and never used in clear text in a command line.\n"
"              When  using  Kerberos  V5 with a Windows based server you should\n"


"              include the Windows domain name in the user name, in  order  for\n"
"              the  server  to  successfully  obtain  a Kerberos Ticket. If you\n"
"              don't then the initial authentication handshake may fail.\n"
"\n"
, stdout);
 fputs(
"              When using NTLM, the user name can be specified  simply  as  the\n"
"              user  name,  without the domain, if there is a single domain and\n"
"              forest in your setup for example.\n"
"\n"


"              To specify the domain name use either Down-Level Logon  Name  or\n"
"              UPN (User Principal Name) formats. For example, EXAMPLE\\user and\n"
"              user@example.com respectively.\n"
"\n"
"              If you use a Windows SSPI-enabled curl binary and  perform  Ker-\n"


, stdout);
 fputs(
"              beros  V5, Negotiate, NTLM or Digest authentication then you can\n"
"              tell curl to select the user name and password from  your  envi-\n"
"              ronment by specifying a single colon with this option: \"-u :\".\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       -v, --verbose\n"
"              Makes  curl  verbose  during the operation. Useful for debugging\n"
"              and seeing what's going on \"under the  hood\".  A  line  starting\n"


, stdout);
 fputs(
"              with  '>'  means  \"header  data\" sent by curl, '<' means \"header\n"
"              data\" received by curl that is hidden in  normal  cases,  and  a\n"
"              line starting with '*' means additional info provided by curl.\n"
"\n"
"              If you only want HTTP headers in the output, -i, --include might\n"
"              be the option you're looking for.\n"
"\n"
"              If you think this option still doesn't give you enough  details,\n"
, stdout);
 fputs(
"              consider using --trace or --trace-ascii instead.\n"
"\n"
"              Use -s, --silent to make curl really quiet.\n"
"\n"
"              See  also  -i,  --include.  This  option  overrides  --trace and\n"


"              --trace-ascii.\n"
"\n"
"       -V, --version\n"
"              Displays information about curl and the libcurl version it uses.\n"
"              The first line includes the full version of  curl,  libcurl  and\n"
"              other 3rd party libraries linked with the executable.\n"
"\n"
, stdout);
 fputs(
"              The  second  line (starts with \"Protocols:\") shows all protocols\n"
"              that libcurl reports to support.\n"
"\n"
"              The third line (starts with \"Features:\") shows specific features\n"


"              libcurl reports to offer. Available features include:\n"
"\n"
"              IPv6   You can use IPv6 with this.\n"
"\n"
"              krb4   Krb4 for FTP is supported.\n"
"\n"
"              SSL    SSL  versions of various protocols are supported, such as\n"
, stdout);
 fputs(
"                     HTTPS, FTPS, POP3S and so on.\n"
"\n"
"              libz   Automatic decompression of compressed files over HTTP  is\n"
"                     supported.\n"
"\n"
"              NTLM   NTLM authentication is supported.\n"
"\n"


"              Debug  This  curl  uses a libcurl built with Debug. This enables\n"
"                     more error-tracking and memory debugging etc.  For  curl-\n"
"                     developers only!\n"
"\n"
"              AsynchDNS\n"
, stdout);
 fputs(
"                     This  curl  uses asynchronous name resolves. Asynchronous\n"
"                     name resolves can be done using either the c-ares or  the\n"
"                     threaded resolver backends.\n"
"\n"
"              SPNEGO SPNEGO authentication is supported.\n"
"\n"


"              Largefile\n"
"                     This curl supports transfers of large files, files larger\n"
"                     than 2GB.\n"
"\n"
"              IDN    This curl supports IDN - international domain names.\n"
"\n"
"              GSS-API\n"
, stdout);
 fputs(
"                     GSS-API is supported.\n"
"\n"
"              SSPI   SSPI is supported.\n"
"\n"
"              TLS-SRP\n"
"                     SRP (Secure Remote Password) authentication is  supported\n"
"                     for TLS.\n"
"\n"


"              HTTP2  HTTP/2 support has been built-in.\n"
"\n"
"              UnixSockets\n"
"                     Unix sockets support is provided.\n"
"\n"
"              HTTPS-proxy\n"
"                     This curl is built to support HTTPS proxy.\n"
"\n"
"              Metalink\n"



, stdout);
 fputs(
"                     This  curl  supports  Metalink (both version 3 and 4 (RFC\n"
"                     5854)), which describes mirrors and  hashes.   curl  will\n"
"                     use mirrors for failover if there are errors (such as the\n"
"                     file or server not being available).\n"
"\n"
"              PSL    PSL is short for Public Suffix List and means  that  this\n"
"                     curl  has  been  built  with knowledge about \"public suf-\n"
"                     fixes\".\n"
"\n"
, stdout);
 fputs(
"              MultiSSL\n"
"                     This curl supports multiple TLS backends.\n"
"\n"
"       -w, --write-out <format>\n"
"              Make curl display information on stdout after a completed trans-\n"
"              fer.  The  format  is a string that may contain plain text mixed\n"
"              with any number of variables. The format can be specified  as  a\n"
"              literal  \"string\",  or  you can have curl read the format from a\n"
, stdout);
 fputs(



"              file with \"@filename\" and to tell curl to read the  format  from\n"
"              stdin you write \"@-\".\n"
"\n"
"              The  variables  present in the output format will be substituted\n"
"              by the value or text that curl thinks fit, as  described  below.\n"
"              All  variables are specified as %{variable_name} and to output a\n"
"              normal % you just write them as %%. You can output a newline  by\n"
, stdout);
 fputs(



"              using \\n, a carriage return with \\r and a tab space with \\t.\n"
"\n"
"              The  output  will be written to standard output, but this can be\n"
"              switched to standard error by using %{stderr}.\n"
"\n"


"              NOTE: The %-symbol is a special symbol in the win32-environment,\n"
"              where  all  occurrences of % must be doubled when using this op-\n"
"              tion.\n"
"\n"
"              The variables available are:\n"
"\n"
, stdout);
 fputs(
"              content_type   The Content-Type of the  requested  document,  if\n"
"                             there was any.\n"
"\n"
"              filename_effective\n"
"                             The  ultimate  filename  that curl writes out to.\n"
"                             This is only meaningful if curl is told to  write\n"
"                             to  a  file  with  the  -O,  --remote-name or -o,\n"
"                             --output option. It's most useful in  combination\n"
, stdout);
 fputs(



"                             with  the -J, --remote-header-name option. (Added\n"
"                             in 7.26.0)\n"
"\n"
"              ftp_entry_path The initial path curl ended up in when logging on\n"


"                             to the remote FTP server. (Added in 7.15.4)\n"
"\n"
"              http_code      The numerical response code that was found in the\n"
"                             last retrieved HTTP(S)  or  FTP(s)  transfer.  In\n"
, stdout);
 fputs(
"                             7.18.2  the alias response_code was added to show\n"
"                             the same info.\n"
"\n"
"              http_connect   The numerical code that was found in the last re-\n"


"                             sponse  (from a proxy) to a curl CONNECT request.\n"
"                             (Added in 7.12.4)\n"
"\n"
"              http_version   The  http  version  that  was  effectively  used.\n"
"                             (Added in 7.50.0)\n"
"\n"
, stdout);
 fputs(
"              local_ip       The  IP  address of the local end of the most re-\n"
"                             cently done connection - can be  either  IPv4  or\n"
"                             IPv6 (Added in 7.29.0)\n"
"\n"


"              local_port     The  local  port number of the most recently done\n"
"                             connection (Added in 7.29.0)\n"
"\n"
"              num_connects   Number of new connects made in the recent  trans-\n"
"                             fer. (Added in 7.12.3)\n"
"\n"
, stdout);
 fputs(
"              num_redirects  Number of redirects that were followed in the re-\n"
"                             quest. (Added in 7.12.3)\n"
"\n"
"              proxy_ssl_verify_result\n"


"                             The result of the HTTPS proxy's SSL peer certifi-\n"
"                             cate verification that was requested. 0 means the\n"
"                             verification was successful. (Added in 7.52.0)\n"
"\n"
"              redirect_url   When an HTTP request was made without -L, --loca-\n"


, stdout);
 fputs(
"                             tion  to follow redirects (or when --max-redir is\n"
"                             met), this variable will show the  actual  URL  a\n"
"                             redirect would have gone to. (Added in 7.18.2)\n"
"\n"
"              remote_ip      The  remote  IP address of the most recently done\n"
"                             connection - can be either IPv4 or IPv6 (Added in\n"
"                             7.29.0)\n"
"\n"
, stdout);
 fputs(
"              remote_port    The  remote port number of the most recently done\n"
"                             connection (Added in 7.29.0)\n"
"\n"
"              scheme         The URL scheme (sometimes called  protocol)  that\n"


"                             was effectively used (Added in 7.52.0)\n"
"\n"
"              size_download  The total amount of bytes that were downloaded.\n"
"\n"
"              size_header    The total amount of bytes of the downloaded head-\n"
"                             ers.\n"
"\n"
, stdout);
 fputs(
"              size_request   The total amount of bytes that were sent  in  the\n"
"                             HTTP request.\n"
"\n"
"              size_upload    The total amount of bytes that were uploaded.\n"
"\n"


"              speed_download The average download speed that curl measured for\n"
"                             the complete download. Bytes per second.\n"
"\n"
"              speed_upload   The average upload speed that curl  measured  for\n"
"                             the complete upload. Bytes per second.\n"
"\n"
, stdout);
 fputs(
"              ssl_verify_result\n"
"                             The  result of the SSL peer certificate verifica-\n"
"                             tion that was requested. 0 means the verification\n"


"                             was successful. (Added in 7.19.0)\n"
"\n"
"              stderr         From  this  point  on, the -w, --write-out output\n"
"                             will be written  to  standard  error.  (Added  in\n"
"                             7.63.0)\n"
"\n"



, stdout);
 fputs(
"              stdout         From  this  point  on, the -w, --write-out output\n"
"                             will be written to standard output.  This is  the\n"
"                             default,  but  can  be  used to switch back after\n"
"                             switching to stderr.  (Added in 7.63.0)\n"
"\n"
"              time_appconnect\n"
"                             The time, in seconds, it took from the start  un-\n"
"                             til  the SSL/SSH/etc connect/handshake to the re-\n"
, stdout);
 fputs(
"                             mote host was completed. (Added in 7.19.0)\n"
"\n"
"              time_connect   The time, in seconds, it took from the start  un-\n"
"                             til the TCP connect to the remote host (or proxy)\n"


"                             was completed.\n"
"\n"
"              time_namelookup\n"
"                             The time, in seconds, it took from the start  un-\n"
"                             til the name resolving was completed.\n"
"\n"
"              time_pretransfer\n"



, stdout);
 fputs(
"                             The  time, in seconds, it took from the start un-\n"
"                             til the file transfer was just  about  to  begin.\n"
"                             This includes all pre-transfer commands and nego-\n"
"                             tiations that are specific to the particular pro-\n"
"                             tocol(s) involved.\n"
"\n"
"              time_redirect  The time, in seconds, it took for all redirection\n"



, stdout);
 fputs(
"                             steps including name lookup, connect, pretransfer\n"
"                             and  transfer  before  the  final transaction was\n"
"                             started. time_redirect shows the complete  execu-\n"
"                             tion  time  for  multiple redirections. (Added in\n"
"                             7.12.3)\n"
"\n"
"              time_starttransfer\n"
"                             The time, in seconds, it took from the start  un-\n"



, stdout);
 fputs(
"                             til  the  first  byte was just about to be trans-\n"
"                             ferred. This includes time_pretransfer  and  also\n"
"                             the  time  the server needed to calculate the re-\n"
"                             sult.\n"
"\n"
"              time_total     The total time, in seconds, that the full  opera-\n"
"                             tion lasted.\n"
"\n"
"              url_effective  The URL that was fetched last. This is most mean-\n"
, stdout);
 fputs(
"                             ingful if you've told curl  to  follow  location:\n"
"                             headers.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --xattr\n"
"              When  saving  output  to a file, this option tells curl to store\n"
"              certain file metadata in extended  file  attributes.  Currently,\n"
"              the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
, stdout);
 fputs(



"              the content type is stored in the mime_type  attribute.  If  the\n"
"              file  system  does not support extended attributes, a warning is\n"
"              issued.\n"
"\n"
"FILES\n"
"       ~/.curlrc\n"


"              Default config file, see -K, --config for details.\n"
"\n"
"ENVIRONMENT\n"
"       The environment variables can be specified in lower case or upper case.\n"
"       The lower case version has precedence. http_proxy is an exception as it\n"
"       is only available in lower case.\n"
"\n"
, stdout);
 fputs(
"       Using an environment variable to set the proxy has the same  effect  as\n"
"       using the -x, --proxy option.\n"
"\n"
"       http_proxy [protocol://]<host>[:port]\n"
"              Sets the proxy server to use for HTTP.\n"


"       HTTPS_PROXY [protocol://]<host>[:port]\n"
"              Sets the proxy server to use for HTTPS.\n"
"\n"
"       [url-protocol]_PROXY [protocol://]<host>[:port]\n"
"              Sets  the proxy server to use for [url-protocol], where the pro-\n"
, stdout);
 fputs(
"              tocol is a protocol that curl supports and  as  specified  in  a\n"
"              URL. FTP, FTPS, POP3, IMAP, SMTP, LDAP etc.\n"
"\n"
"       ALL_PROXY [protocol://]<host>[:port]\n"
"              Sets  the  proxy  server to use if no protocol-specific proxy is\n"


"              set.\n"
"\n"
"       NO_PROXY <comma-separated list of hosts/domains>\n"
"              list of host names that shouldn't go through any proxy.  If  set\n"
"              to an asterisk '*' only, it matches all hosts. Each name in this\n"
, stdout);
 fputs(
"              list is matched as either a domain name which contains the host-\n"
"              name, or the hostname itself.\n"
"\n"
"              This  environment  variable  disables use of the proxy even when\n"
"              specified with the -x,  --proxy  option.  That  is  NO_PROXY=di-\n"
"              rect.example.com  curl  -x  http://proxy.example.com  http://di-\n"
"              rect.example.com  accesses  the   target   URL   directly,   and\n"
, stdout);
 fputs(



"              NO_PROXY=direct.example.com   curl  -x  http://proxy.example.com\n"
"              http://somewhere.example.com accesses the target URL through the\n"
"              proxy.\n"
"\n"
"              The  list  of  host  names  can also be include numerical IP ad-\n"


"              dresses, and IPv6 versions should then be given without  enclos-\n"
"              ing brackets.\n"
"\n"
"PROXY PROTOCOL PREFIXES\n"
"       Since  curl  version  7.21.7,  the proxy string may be specified with a\n"
, stdout);
 fputs(
"       protocol:// prefix to specify alternative proxy protocols.\n"
"\n"
"       If no protocol is specified in  the  proxy  string  or  if  the  string\n"
"       doesn't  match  a  supported  one, the proxy will be treated as an HTTP\n"
"       proxy.\n"
"\n"


"       The supported proxy protocol prefixes are as follows:\n"
"\n"
"       http://\n"
"              Makes it use it as an HTTP proxy. The default if no scheme  pre-\n"
"              fix is used.\n"
"\n"
"       https://\n"
"              Makes it treated as an HTTPS proxy.\n"
"\n"
, stdout);
 fputs(
"       socks4://\n"
"              Makes it the equivalent of --socks4\n"
"\n"
"       socks4a://\n"
"              Makes it the equivalent of --socks4a\n"
"\n"
"       socks5://\n"
"              Makes it the equivalent of --socks5\n"
"\n"
"       socks5h://\n"


"              Makes it the equivalent of --socks5-hostname\n"
"\n"
"EXIT CODES\n"
"       There  are a bunch of different error codes and their corresponding er-\n"
"       ror messages that may appear during bad conditions. At the time of this\n"
"       writing, the exit codes are:\n"
"\n"
, stdout);
 fputs(
"       1      Unsupported protocol. This build of curl has no support for this\n"
"              protocol.\n"
"\n"
"       2      Failed to initialize.\n"
"\n"
"       3      URL malformed. The syntax was not correct.\n"
"\n"


"       4      A feature or option that was needed to perform the  desired  re-\n"
"              quest  was not enabled or was explicitly disabled at build-time.\n"
"              To make curl able to do this, you probably need another build of\n"
"              libcurl!\n"
"\n"
, stdout);
 fputs(
"       5      Couldn't  resolve  proxy.  The given proxy host could not be re-\n"
"              solved.\n"
"\n"
"       6      Couldn't resolve host. The given remote host was not resolved.\n"
"\n"
"       7      Failed to connect to host.\n"
"\n"


"       8      Weird server reply. The server sent data curl couldn't parse.\n"
"\n"
"       9      FTP access denied. The server denied login or denied  access  to\n"
"              the  particular  resource or directory you wanted to reach. Most\n"
, stdout);
 fputs(
"              often you tried to change to a directory that doesn't  exist  on\n"
"              the server.\n"
"\n"
"       10     FTP  accept failed. While waiting for the server to connect back\n"
"              when an active FTP session is used, an error code was sent  over\n"


"              the control connection or similar.\n"
"\n"
"       11     FTP  weird PASS reply. Curl couldn't parse the reply sent to the\n"
"              PASS request.\n"
"\n"
, stdout);
 fputs(
"       12     During an active FTP session while waiting  for  the  server  to\n"
"              connect back to curl, the timeout expired.\n"
"\n"
"       13     FTP  weird PASV reply, Curl couldn't parse the reply sent to the\n"
"              PASV request.\n"
"\n"
"       14     FTP weird 227 format.  Curl  couldn't  parse  the  227-line  the\n"


"              server sent.\n"
"\n"
"       15     FTP  can't  get host. Couldn't resolve the host IP we got in the\n"
"              227-line.\n"
"\n"
, stdout);
 fputs(
"       16     HTTP/2 error. A problem was detected in the HTTP2 framing layer.\n"
"              This is somewhat generic and can be one out of several problems,\n"
"              see the error message for details.\n"
"\n"
"       17     FTP couldn't set binary. Couldn't change transfer method to  bi-\n"
"              nary.\n"
"\n"


"       18     Partial file. Only a part of the file was transferred.\n"
"\n"
"       19     FTP  couldn't download/access the given file, the RETR (or simi-\n"
"              lar) command failed.\n"
"\n"
, stdout);
 fputs(
"       21     FTP quote error. A quote command returned error from the server.\n"
"       22     HTTP page not retrieved. The requested url was not found or  re-\n"
"              turned  another  error  with  the  HTTP  error code being 400 or\n"
"              above. This return code only appears if -f, --fail is used.\n"
"\n"


"       23     Write error. Curl couldn't write data to a local  filesystem  or\n"
"              similar.\n"
"\n"
"       25     FTP  couldn't  STOR  file. The server denied the STOR operation,\n"
, stdout);
 fputs(
"              used for FTP uploading.\n"
"\n"
"       26     Read error. Various reading problems.\n"
"\n"
"       27     Out of memory. A memory allocation request failed.\n"
"\n"
"       28     Operation timeout. The specified time-out period was reached ac-\n"
"              cording to the conditions.\n"
"\n"


"       30     FTP  PORT  failed.  The PORT command failed. Not all FTP servers\n"
"              support the PORT command, try doing a transfer  using  PASV  in-\n"
"              stead!\n"
"\n"
, stdout);
 fputs(
"       31     FTP  couldn't use REST. The REST command failed. This command is\n"
"              used for resumed FTP transfers.\n"
"\n"
"       33     HTTP range error. The range \"command\" didn't work.\n"
"\n"
"       34     HTTP post error. Internal post-request generation error.\n"
"\n"


"       35     SSL connect error. The SSL handshaking failed.\n"
"\n"
"       36     Bad download resume. Couldn't continue an earlier aborted  down-\n"
"              load.\n"
"\n"
, stdout);
 fputs(
"       37     FILE couldn't read file. Failed to open the file. Permissions?\n"
"\n"
"       38     LDAP cannot bind. LDAP bind operation failed.\n"
"\n"
"       39     LDAP search failed.\n"
"\n"
"       41     Function not found. A required LDAP function was not found.\n"
"\n"
"       42     Aborted by callback. An application told curl to abort the oper-\n"


"              ation.\n"
"\n"
"       43     Internal error. A function was called with a bad parameter.\n"
"\n"
, stdout);
 fputs(
"       45     Interface error. A specified outgoing  interface  could  not  be\n"
"              used.\n"
"\n"
"       47     Too many redirects. When following redirects, curl hit the maxi-\n"
"              mum amount.\n"
"\n"
"       48     Unknown option specified to libcurl.  This  indicates  that  you\n"
"              passed  a weird option to curl that was passed on to libcurl and\n"


"              rejected. Read up in the manual!\n"
"\n"
"       49     Malformed telnet option.\n"
"\n"
, stdout);
 fputs(
"       51     The peer's SSL certificate or SSH MD5 fingerprint was not OK.\n"
"\n"
"       52     The server didn't reply anything, which here  is  considered  an\n"
"              error.\n"
"\n"
"       53     SSL crypto engine not found.\n"
"\n"
"       54     Cannot set SSL crypto engine as default.\n"
"\n"
"       55     Failed sending network data.\n"
"\n"
"       56     Failure in receiving network data.\n"
"\n"


"       58     Problem with the local certificate.\n"
"\n"
"       59     Couldn't use specified SSL cipher.\n"
"\n"
, stdout);
 fputs(
"       60     Peer  certificate cannot be authenticated with known CA certifi-\n"
"              cates.\n"
"\n"
"       61     Unrecognized transfer encoding.\n"
"\n"
"       62     Invalid LDAP URL.\n"
"\n"
"       63     Maximum file size exceeded.\n"
"\n"
"       64     Requested FTP SSL level failed.\n"
"\n"
"       65     Sending the data requires a rewind that failed.\n"
"\n"
"       66     Failed to initialise SSL Engine.\n"
"\n"


"       67     The user name, password, or similar was not  accepted  and  curl\n"
"              failed to log in.\n"
"\n"
, stdout);
 fputs(
"       68     File not found on TFTP server.\n"
"\n"
"       69     Permission problem on TFTP server.\n"
"\n"
"       70     Out of disk space on TFTP server.\n"
"\n"
"       71     Illegal TFTP operation.\n"
"\n"
"       72     Unknown TFTP transfer ID.\n"
"\n"
"       73     File already exists (TFTP).\n"
"\n"
"       74     No such user (TFTP).\n"
"\n"
"       75     Character conversion failed.\n"
"\n"


"       76     Character conversion functions required.\n"
"\n"
"       77     Problem with reading the SSL CA cert (path? access rights?).\n"
"\n"
, stdout);
 fputs(
"       78     The resource referenced in the URL does not exist.\n"
"\n"
"       79     An unspecified error occurred during the SSH session.\n"
"\n"
"       80     Failed to shut down the SSL connection.\n"
"\n"
"       82     Could  not  load  CRL  file,  missing  or wrong format (added in\n"
"              7.19.0).\n"
"\n"
"       83     Issuer check failed (added in 7.19.0).\n"
"\n"


"       84     The FTP PRET command failed\n"
"\n"
"       85     RTSP: mismatch of CSeq numbers\n"
"\n"
"       86     RTSP: mismatch of Session Identifiers\n"
"\n"
, stdout);
 fputs(
"       87     unable to parse FTP file list\n"
"\n"
"       88     FTP chunk callback reported error\n"
"\n"
"       89     No connection available, the session will be queued\n"
"\n"
"       90     SSL public key does not matched pinned public key\n"
"\n"
"       91     Invalid SSL certificate status.\n"
"\n"
"       92     Stream error in HTTP/2 framing layer.\n"
"\n"


"       XX     More error codes will appear here in future releases. The exist-\n"
"              ing ones are meant to never change.\n"
"\n"
"AUTHORS / CONTRIBUTORS\n"
, stdout);
 fputs(
"       Daniel  Stenberg is the main author, but the whole list of contributors\n"
"       is found in the separate THANKS file.\n"
"\n"
"WWW\n"
"       https://curl.haxx.se\n"
"\n"
"SEE ALSO\n"
"       ftp(1), wget(1)\n"







|


|
|






|
|
|









|







|


|
|




|


|
|





|





|




|
|





|




|
|



|
|
|





|












|

|





|
|
|

|



|


|

|




|
|




|
|



|



|
|



|







|






|



|









|







|









|






|

















|


|
|





|
|


|


|





|









|
|
|










|


|


|



|



|


|
|



|









|
|


|
|


|


|
|
|



|



|


|





|
|



|
|
|


|






|
|
|


|



|



|



|


|
|
|










|










|
|
|


|
|
|



|



|









|










|
|







|
|
|
|









|
|

|


|








|


|
|
|


|
|


|
|
|


>
>
>
>
>
>




|
>
>
>
>
>
>


>
>
>
>
>
>
>







>
>
|







>
>


<
<



|





<
<



>
>
|





>


<











>


<



|



|
>


<








|
<
<
|


>
>



|
|
|
<
<
|





>
>



|
|
<
<
|





<
<
<


>
>
>





|
>
>
|


|


<
<





>
>
|



<
<





|
>
>
|


|


<
<



>
>
|



<
<

|





>
>

|


<
<





>
>
|


|
<
<
|






<
<


>
>








>
>





<
<








<
<


>
>
|


|
|


>
>



|
<
<
|


|
|
>
>



|
<
<
|


|
|
>
>



|
<
<







|
>
>
|





>
>
>
>


<
<
<
<
|


<
<









|


<


>














<


>










<


>
|





|
|
<


>

|




|
<
<


>
>




|






<
<


>
>







|
<


>
|




|




<
<


>
>

|

|
|
>
>
|


<
<



|




|
>
>
|





<
<
|


|
|
>
>






<
<
|


|
|
>
>






<
<
|


|
|
>
>






<
<
|




>
>





|
<
<
|


|
|
>
>




|
<
<






|
>
>



|
<
<







>
>
|






<
<
|
|


>
>






<
<





|
>
>


|

<
<




<
<
<
<


>
>
>
>


|
|
>
>
|
|
|


<
<






>
>
|

|



<
<
|


<
<
<
<


>
>
>
>



>
>
|
|



|
<
<
|



>
>

|
|


<
<




>
>


|


|
<
<
|



<
<
<


>
>
>


|
>
>
|
|


<
<
|
|


>
>
|



|
>
>


<
<





|
|
>
>


<
<





|
<
<




|
>
>




|


<
<
|



>
>






|
<
<


|




>
>
|
|



<
<
|
|




>
>







<
<





|


>
>









>
>
>


<
<
<


|
|


<
<





<
<
<


>
>
>
|


|
<
<
<


>
>
>


|


>
>

|




<
<
|



|
<
<
<


>
>
>
|



>
>



|
<
<
|



>
>
|





<
<
|
|


>
>
|


|


<
<




>
>





>
>


<
<


|



<
<
|


|
>
>







<
<
|




>
>



|


<
<

|

>
>


|
|


>
>
>


<
<
<



|
|
<
<


|

>
>



|



>
>
>


<
<
<




>
>
>


<
<
<
|



|
>
>
>


<
<
<


|



<
<
|





<
<
<


>
>
>
|
|




>
>







<
<
|




>
>




|
<
<
|



|
>
>



|

<
<



|
<
<
<


>
>
>
|



|
>
>
|



|
<
<


|
|


>
>



|





<
<










>
>



|



<
<







>
>
|
|



<
<
|






>
>


|
|
<
<
|


|
|
>
>


|


<
<
|


|


|
>
>


|


<
<




|


>
>


|


<
<

|
|


>
>
|


|
<
<









>
>
|
|


<
<
|






>
>


|


<
<









>
>




<
<
|





|
|
>
>




<
<


|










>
>




<
<
|














>
>
|


<
<
















>
>




<
<






|




>
>






<
<












>
>




<
<
|







2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124


3125
3126
3127
3128
3129
3130
3131
3132
3133


3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147

3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161

3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172

3173
3174
3175
3176
3177
3178
3179
3180
3181


3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192


3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205


3206
3207
3208
3209
3210
3211



3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230


3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241


3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255


3256
3257
3258
3259
3260
3261
3262
3263
3264


3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277


3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288


3289
3290
3291
3292
3293
3294
3295


3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314


3315
3316
3317
3318
3319
3320
3321
3322


3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339


3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350


3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361


3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383




3384
3385
3386


3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398

3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415

3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428

3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439

3440
3441
3442
3443
3444
3445
3446
3447
3448
3449


3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464


3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476

3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489


3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503


3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520


3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533


3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546


3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559


3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572


3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584


3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597


3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613


3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625


3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637


3638
3639
3640
3641




3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658


3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672


3673
3674
3675




3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692


3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703


3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715


3716
3717
3718
3719



3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733


3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748


3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759


3760
3761
3762
3763
3764
3765


3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779


3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792


3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806


3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821


3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845



3846
3847
3848
3849
3850
3851


3852
3853
3854
3855
3856



3857
3858
3859
3860
3861
3862
3863
3864
3865



3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883


3884
3885
3886
3887
3888



3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903


3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915


3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927


3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942


3943
3944
3945
3946
3947
3948


3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961


3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974


3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990



3991
3992
3993
3994
3995


3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013



4014
4015
4016
4017
4018
4019
4020
4021
4022



4023
4024
4025
4026
4027
4028
4029
4030
4031
4032



4033
4034
4035
4036
4037
4038


4039
4040
4041
4042
4043
4044



4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064


4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076


4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088


4089
4090
4091
4092



4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109


4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126


4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145


4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159


4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172


4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184


4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198


4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212


4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223


4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238


4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252


4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267


4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281


4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300


4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320


4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342


4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361


4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379


4380
4381
4382
4383
4384
4385
4386
4387
"\n"
"       --proxy-tlsv1\n"
"              Same as -1, --tlsv1 but used in HTTPS proxy context.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       -U, --proxy-user <user:password>\n"
"              Specify  the user name and password to use for proxy authentica-\n"
"              tion.\n"
"\n"
"              If you use a Windows SSPI-enabled curl binary and do either  Ne-\n"
"              gotiate  or NTLM authentication then you can tell curl to select\n"
, stdout);
 fputs(
"              the user name and password from your environment by specifying a\n"
"              single colon with this option: \"-U :\".\n"
"\n"
"              On systems where it works, curl will hide the given option argu-\n"
"              ment from process listings. This is not enough to  protect  cre-\n"
"              dentials  from  possibly getting seen by other users on the same\n"
"              system as they will still be visible for a brief  moment  before\n"
, stdout);
 fputs(
"              cleared. Such sensitive data should be retrieved from a file in-\n"
"              stead or similar and never used in clear text in a command line.\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       -x, --proxy [protocol://]host[:port]\n"
"              Use the specified proxy.\n"
"\n"
"              The proxy string can be specified with a protocol:// prefix.  No\n"
"              protocol specified or http:// will be treated as HTTP proxy. Use\n"
, stdout);
 fputs(
"              socks4://, socks4a://, socks5:// or socks5h:// to request a spe-\n"
"              cific SOCKS version to be used.  (The protocol support was added\n"
"              in curl 7.21.7)\n"
"\n"
"              HTTPS proxy support via https:// protocol prefix  was  added  in\n"
"              7.52.0 for OpenSSL, GnuTLS and NSS.\n"
"\n"
"              Unrecognized  and  unsupported  proxy  protocols  cause an error\n"
"              since 7.52.0.  Prior versions may ignore the  protocol  and  use\n"
, stdout);
 fputs(
"              http:// instead.\n"
"\n"
"              If  the  port number is not specified in the proxy string, it is\n"
"              assumed to be 1080.\n"
"\n"
"              This option overrides existing environment  variables  that  set\n"
"              the  proxy  to use. If there's an environment variable setting a\n"
"              proxy, you can set proxy to \"\" to override it.\n"
"\n"
"              All operations that are performed over an HTTP proxy will trans-\n"
, stdout);
 fputs(
"              parently  be  converted  to HTTP. It means that certain protocol\n"
"              specific operations might not be available. This is not the case\n"
"              if you can tunnel through the proxy, as one with the -p, --prox-\n"
"              ytunnel option.\n"
"\n"
"              User and password that might be provided in the proxy string are\n"
"              URL  decoded by curl. This allows you to pass in special charac-\n"
"              ters such as @ by using %40 or pass in a colon with %3a.\n"
"\n"
, stdout);
 fputs(
"              The proxy host can be specified the exact same way as the  proxy\n"
"              environment  variables,  including the protocol prefix (http://)\n"
"              and the embedded user + password.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --proxy1.0 <host[:port]>\n"
"              Use the specified HTTP 1.0 proxy. If  the  port  number  is  not\n"
"              specified, it is assumed at port 1080.\n"
"\n"
, stdout);
 fputs(
"              The  only  difference between this and the HTTP proxy option -x,\n"
"              --proxy, is that attempts to use CONNECT through the proxy  will\n"
"              specify an HTTP 1.0 protocol instead of the default HTTP 1.1.\n"
"\n"
"       -p, --proxytunnel\n"
"              When  an  HTTP  proxy is used -x, --proxy, this option will make\n"
"              curl tunnel through the proxy. The tunnel approach is made  with\n"
"              the  HTTP  proxy CONNECT request and requires that the proxy al-\n"
, stdout);
 fputs(
"              lows direct connect to the remote port number curl wants to tun-\n"
"              nel through to.\n"
"\n"
"              To  suppress  proxy CONNECT response headers when curl is set to\n"
"              output headers use --suppress-connect-headers.\n"
"\n"
"              See also -x, --proxy.\n"
"\n"
"       --pubkey <key>\n"
"              (SFTP SCP) Public key file name. Allows you to provide your pub-\n"
"              lic key in this separate file.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"              (As of 7.39.0, curl attempts to automatically extract the public\n"
"              key from the private key file, so passing this option is  gener-\n"
"              ally not required. Note that this public key extraction requires\n"
"              libcurl to be linked against a copy of libssh2 1.2.8  or  higher\n"
"              that is itself linked against OpenSSL.)\n"
"\n"
"       -Q, --quote\n"
, stdout);
 fputs(
"              (FTP  SFTP)  Send an arbitrary command to the remote FTP or SFTP\n"
"              server. Quote commands are sent BEFORE the transfer takes  place\n"
"              (just  after  the  initial PWD command in an FTP transfer, to be\n"
"              exact). To make commands take place after a successful transfer,\n"
"              prefix  them  with  a  dash '-'.  To make commands be sent after\n"
"              curl has changed the working directory, just before the transfer\n"
, stdout);
 fputs(
"              command(s),  prefix  the  command  with a '+' (this is only sup-\n"
"              ported for FTP). You may specify any number of commands.\n"
"\n"
"              If the server returns failure for one of the commands,  the  en-\n"
"              tire operation will be aborted. You must send syntactically cor-\n"
"              rect FTP commands as RFC 959 defines to FTP servers, or  one  of\n"
"              the commands listed below to SFTP servers.\n"
"\n"
, stdout);
 fputs(
"              Prefix  the  command  with an asterisk (*) to make curl continue\n"
"              even if the command fails as by default curl will stop at  first\n"
"              failure.\n"
"\n"
"              This option can be used multiple times.\n"
"\n"
"              SFTP  is a binary protocol. Unlike for FTP, curl interprets SFTP\n"
"              quote commands itself before sending them to the  server.   File\n"
"              names may be quoted shell-style to embed spaces or special char-\n"
, stdout);
 fputs(
"              acters.  Following is the list of all supported SFTP quote  com-\n"
"              mands:\n"
"\n"
"              chgrp group file\n"
"                     The  chgrp command sets the group ID of the file named by\n"
"                     the file operand to the group ID specified by  the  group\n"
"                     operand. The group operand is a decimal integer group ID.\n"
"\n"
"              chmod mode file\n"
"                     The  chmod  command  modifies  the  file mode bits of the\n"
, stdout);
 fputs(
"                     specified file. The mode operand is an octal integer mode\n"
"                     number.\n"
"\n"
"              chown user file\n"
"                     The chown command sets the owner of the file named by the\n"
"                     file operand to the user ID specified by the  user  oper-\n"
"                     and. The user operand is a decimal integer user ID.\n"
"\n"
"              ln source_file target_file\n"
"                     The ln and symlink commands create a symbolic link at the\n"
, stdout);
 fputs(
"                     target_file location pointing to  the  source_file  loca-\n"
"                     tion.\n"
"\n"
"              mkdir directory_name\n"
"                     The  mkdir command creates the directory named by the di-\n"
"                     rectory_name operand.\n"
"\n"
"              pwd    The pwd command returns the absolute pathname of the cur-\n"
"                     rent working directory.\n"
"\n"
"              rename source target\n"
, stdout);
 fputs(
"                     The rename command renames the file or directory named by\n"
"                     the source operand to the destination path named  by  the\n"
"                     target operand.\n"
"\n"
"              rm file\n"
"                     The rm command removes the file specified by the file op-\n"
"                     erand.\n"
"\n"
"              rmdir directory\n"
"                     The rmdir command removes the directory  entry  specified\n"
, stdout);
 fputs(
"                     by the directory operand, provided it is empty.\n"
"\n"
"              symlink source_file target_file\n"
"                     See ln.\n"
"\n"
"       --random-file <file>\n"
"              Specify the path name to file containing what will be considered\n"
"              as random data. The data may be used to seed the  random  engine\n"
"              for SSL connections.  See also the --egd-file option.\n"
"\n"
"       -r, --range <range>\n"
, stdout);
 fputs(
"              (HTTP FTP SFTP FILE) Retrieve a byte range (i.e. a partial docu-\n"
"              ment) from an HTTP/1.1, FTP or SFTP  server  or  a  local  FILE.\n"
"              Ranges can be specified in a number of ways.\n"
"\n"
"              0-499     specifies the first 500 bytes\n"
"\n"
"              500-999   specifies the second 500 bytes\n"
"\n"
"              -500      specifies the last 500 bytes\n"
"\n"
"              9500-     specifies the bytes from offset 9500 and forward\n"
"\n"
, stdout);
 fputs(
"              0-0,-1    specifies the first and last byte only(*)(HTTP)\n"
"\n"
"              100-199,500-599\n"
"                        specifies two separate 100-byte ranges(*) (HTTP)\n"
"\n"
"              (*)  = NOTE that this will cause the server to reply with a mul-\n"
"              tipart response!\n"
"\n"
"              Only digit characters (0-9) are valid in the 'start' and  'stop'\n"
"              fields  of the 'start-stop' range syntax. If a non-digit charac-\n"
, stdout);
 fputs(
"              ter is given in the range, the server's response will be unspec-\n"
"              ified, depending on the server's configuration.\n"
"\n"
"              You  should also be aware that many HTTP/1.1 servers do not have\n"
"              this feature enabled, so that when you attempt to get  a  range,\n"
"              you'll instead get the whole document.\n"
"\n"
"              FTP  and  SFTP  range  downloads only support the simple 'start-\n"
, stdout);
 fputs(
"              stop' syntax (optionally with one of the numbers  omitted).  FTP\n"
"              use depends on the extended FTP command SIZE.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --raw  (HTTP) When used, it disables all internal HTTP decoding of con-\n"
"              tent or transfer encodings and instead makes them passed on  un-\n"
"              altered, raw.\n"
"\n"
"              Added in 7.16.2.\n"
"\n"
"       -e, --referer <URL>\n"
, stdout);
 fputs(
"              (HTTP) Sends the \"Referrer Page\" information to the HTTP server.\n"
"              This can also be set with the -H, --header flag of course.  When\n"
"              used  with  -L,  --location  you  can  append \";auto\" to the -e,\n"
"              --referer URL to make curl automatically set  the  previous  URL\n"
"              when  it  follows  a Location: header. The \";auto\" string can be\n"
"              used alone, even if you don't set an initial -e, --referer.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"              See also -A, --user-agent and -H, --header.\n"
"\n"
"       -J, --remote-header-name\n"
"              (HTTP) This option tells the -O, --remote-name option to use the\n"
"              server-specified  Content-Disposition  filename  instead  of ex-\n"
"              tracting a filename from the URL.\n"
"\n"
"              If the server specifies a file name and a file  with  that  name\n"
, stdout);
 fputs(
"              already  exists  in the current working directory it will not be\n"
"              overwritten and an error will occur. If the server doesn't spec-\n"
"              ify a file name then this option has no effect.\n"
"\n"
"              There's  no  attempt to decode %-sequences (yet) in the provided\n"
"              file name, so this option may provide you with rather unexpected\n"
"              file names.\n"
"\n"
"              WARNING:  Exercise  judicious  use of this option, especially on\n"
, stdout);
 fputs(
"              Windows. A rogue server could send you the  name  of  a  DLL  or\n"
"              other  file  that could possibly be loaded automatically by Win-\n"
"              dows or some third party software.\n"
"\n"
"       --remote-name-all\n"
"              This option changes the default action for all given URLs to  be\n"
"              dealt with as if -O, --remote-name were used for each one. So if\n"
"              you want to disable that for a specific URL after --remote-name-\n"
, stdout);
 fputs(
"              all has been used, you must use \"-o -\" or --no-remote-name.\n"
"\n"
"              Added in 7.19.0.\n"
"\n"
"       -O, --remote-name\n"
"              Write  output to a local file named like the remote file we get.\n"
"              (Only the file part of the remote file is used, the path is  cut\n"
"              off.)\n"
"\n"
"              The  file will be saved in the current working directory. If you\n"
"              want the file saved in a  different  directory,  make  sure  you\n"
, stdout);
 fputs(
"              change  the  current working directory before invoking curl with\n"
"              this option.\n"
"\n"
"              The remote file name to use for saving  is  extracted  from  the\n"
"              given  URL,  nothing  else,  and if it already exists it will be\n"
"              overwritten. If you want the server to be  able  to  choose  the\n"
"              file name refer to -J, --remote-header-name which can be used in\n"
, stdout);
 fputs(
"              addition to this option. If the server chooses a file  name  and\n"
"              that name already exists it will not be overwritten.\n"
"\n"
"              There is no URL decoding done on the file name. If it has %20 or\n"
"              other URL encoded parts of the name, they will end up  as-is  as\n"
"              file name.\n"
"\n"
"              You  may use this option as many times as the number of URLs you\n"
"              have.\n"
"\n"
"       -R, --remote-time\n"
, stdout);
 fputs(
"              When used, this will make curl attempt to figure out  the  time-\n"
"              stamp  of the remote file, and if that is available make the lo-\n"
"              cal file get that same timestamp.\n"
"\n"
"       --request-target\n"
"              (HTTP) Tells curl to use an alternative \"target\" (path)  instead\n"
"              of  using  the  path as provided in the URL. Particularly useful\n"
"              when wanting to issue HTTP requests  without  leading  slash  or\n"
, stdout);
 fputs(
"              other  data  that  doesn't  follow the regular URL pattern, like\n"
"              \"OPTIONS *\".\n"
"\n"
"              Added in 7.55.0.\n"
"\n"
"       -X, --request <command>\n"
"              (HTTP) Specifies a custom request method to use when communicat-\n"
"              ing  with the HTTP server.  The specified request method will be\n"
"              used instead of the method otherwise  used  (which  defaults  to\n"
"              GET).  Read  the HTTP 1.1 specification for details and explana-\n"
, stdout);
 fputs(
"              tions. Common additional HTTP requests include PUT  and  DELETE,\n"
"              but related technologies like WebDAV offers PROPFIND, COPY, MOVE\n"
"              and more.\n"
"\n"
"              Normally you don't need this option. All  sorts  of  GET,  HEAD,\n"
"              POST and PUT requests are rather invoked by using dedicated com-\n"
"              mand line options.\n"
"\n"
"              This option only changes the actual word used in  the  HTTP  re-\n"
, stdout);
 fputs(
"              quest, it does not alter the way curl behaves. So for example if\n"
"              you want to make a proper HEAD request, using -X HEAD  will  not\n"
"              suffice. You need to use the -I, --head option.\n"
"\n"
"              The  method  string  you set with -X, --request will be used for\n"
"              all requests, which if you for example use  -L,  --location  may\n"
"              cause  unintended  side-effects when curl doesn't change request\n"
, stdout);
 fputs(
"              method according to the HTTP 30x response codes - and similar.\n"
"\n"
"              (FTP) Specifies a custom FTP command to use instead of LIST when\n"
"              doing file lists with FTP.\n"
"\n"
"              (POP3) Specifies a custom POP3 command to use instead of LIST or\n"
"              RETR. (Added in 7.26.0)\n"
"\n"
"              (IMAP) Specifies a custom IMAP command to use instead  of  LIST.\n"
"              (Added in 7.30.0)\n"
"\n"
, stdout);
 fputs(
"              (SMTP) Specifies a custom SMTP command to use instead of HELP or\n"
"              VRFY. (Added in 7.34.0)\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --resolve <host:port:address[,address]...>\n"
"              Provide a custom address for a specific host and port pair.  Us-\n"
"              ing  this, you can make the curl requests(s) use a specified ad-\n"
"              dress and prevent the otherwise normally resolved address to  be\n"
, stdout);
 fputs(
"              used.  Consider  it a sort of /etc/hosts alternative provided on\n"
"              the command line. The port number should be the number used  for\n"
"              the  specific  protocol  the host will be used for. It means you\n"
"              need several entries if you want to provide address for the same\n"
"              host but different ports.\n"
"\n"
"              By  specifying '*' as host you can tell curl to resolve any host\n"
, stdout);
 fputs(
"              and specific port pair to the specified address. Wildcard is re-\n"
"              solved  last so any --resolve with a specific host and port will\n"
"              be used first.\n"
"\n"
"              The provided address set by this option will be used even if -4,\n"
"              --ipv4 or -6, --ipv6 is set to make curl use another IP version.\n"
"              Support for providing the IP address within [brackets] was added\n"
"              in 7.57.0.\n"
"\n"
, stdout);
 fputs(
"              Support for providing multiple IP addresses per entry was  added\n"
"              in 7.59.0.\n"
"\n"
"              Support for resolving with wildcard was added in 7.64.0.\n"
"\n"
"              This option can be used many times to add many host names to re-\n"
"              solve.\n"
"\n"
"              Added in 7.21.3.\n"
"\n"
"       --retry-connrefused\n"
"              In addition to the other conditions, consider ECONNREFUSED as  a\n"
"              transient  error  too  for --retry. This option is used together\n"
, stdout);
 fputs(
"              with --retry.\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       --retry-delay <seconds>\n"
"              Make curl sleep this amount of time before  each  retry  when  a\n"
"              transfer  has  failed with a transient error (it changes the de-\n"
"              fault backoff time algorithm between retries).  This  option  is\n"
"              only  interesting if --retry is also used. Setting this delay to\n"
"              zero will make curl use the default backoff time.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.12.3.\n"
"\n"
"       --retry-max-time <seconds>\n"
"              The retry timer is reset before the first transfer attempt.  Re-\n"
"              tries  will  be done as usual (see --retry) as long as the timer\n"
"              hasn't reached this given limit. Notice that if the timer hasn't\n"
"              reached  the  limit, the request will be made and while perform-\n"
, stdout);
 fputs(
"              ing, it may take longer than this given time period. To limit  a\n"
"              single request's maximum time, use -m, --max-time.  Set this op-\n"
"              tion to zero to not timeout retries.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.12.3.\n"
"\n"
"       --retry <num>\n"
"              If a transient error is returned when curl tries  to  perform  a\n"
, stdout);
 fputs(
"              transfer,  it  will retry this number of times before giving up.\n"
"              Setting the number to 0 makes curl do no retries (which  is  the\n"
"              default).  Transient  error  means either: a timeout, an FTP 4xx\n"
"              response code or an HTTP 408 or 5xx response code.\n"
"\n"
"              When curl is about to retry a transfer, it will first  wait  one\n"
"              second  and  then for all forthcoming retries it will double the\n"
, stdout);
 fputs(
"              waiting time until it reaches 10 minutes which then will be  the\n"
"              delay  between  the rest of the retries.  By using --retry-delay\n"
"              you  disable  this  exponential  backoff  algorithm.  See   also\n"
"              --retry-max-time to limit the total time allowed for retries.\n"
"\n"
"              Since  curl  7.66.0,  curl will comply with the Retry-After: re-\n"
"              sponse header if one was present to know when to issue the  next\n"
"              retry.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.12.3.\n"
"\n"
"       --sasl-authzid\n"
"              Use this authorisation identity (authzid), during SASL PLAIN au-\n"
"              thentication, in addition to the authentication identity  (auth-\n"
"              cid) as specified by -u, --user.\n"
"\n"
"              If  the  option  isn't specified, the server will derive the au-\n"
"              thzid from the authcid, but if specified, and depending  on  the\n"
, stdout);
 fputs(
"              server  implementation,  it may be used to access another user's\n"
"              inbox, that the user has been granted access  to,  or  a  shared\n"
"              mailbox for example.\n"
"\n"
"              Added in 7.66.0.\n"
"\n"
"       --sasl-ir\n"
"              Enable initial response in SASL authentication.\n"
"\n"
"              Added in 7.31.0.\n"
"\n"
"       --service-name <name>\n"
"              This option allows you to change the service name for SPNEGO.\n"
"\n"
, stdout);
 fputs(
"              Examples:    --negotiate    --service-name   sockd   would   use\n"
"              sockd/server-name.\n"
"\n"
"              Added in 7.43.0.\n"
"       -S, --show-error\n"
"              When used with -s, --silent, it makes curl show an error message\n"
"              if it fails.\n"
"       -s, --silent\n"
"              Silent  or  quiet  mode. Don't show progress meter or error mes-\n"
"              sages.  Makes Curl mute. It will still output the data  you  ask\n"
, stdout);
 fputs(


"              for, potentially even to the terminal/stdout unless you redirect\n"
"              it.\n"
"\n"
"              Use -S, --show-error in  addition  to  this  option  to  disable\n"
"              progress meter but still show error messages.\n"
"\n"
"              See also -v, --verbose and --stderr.\n"
"\n"
"       --socks4 <host[:port]>\n"


"              Use the specified SOCKS4 proxy. If the port number is not speci-\n"
"              fied, it is assumed at port 1080.\n"
"\n"
, stdout);
 fputs(
"              This option overrides any previous use of -x, --proxy,  as  they\n"
"              are mutually exclusive.\n"
"\n"
"              Since 7.21.7, this option is superfluous since you can specify a\n"
"              socks4 proxy with -x, --proxy using a socks4:// protocol prefix.\n"
"              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
"              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
, stdout);
 fputs(

"              such a case curl first connects to the SOCKS proxy and then con-\n"
"              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.15.2.\n"
"\n"
"       --socks4a <host[:port]>\n"
"              Use the specified SOCKS4a proxy. If the port number is not spec-\n"
"              ified, it is assumed at port 1080.\n"
"\n"
"              This option overrides any previous use of -x, --proxy,  as  they\n"
, stdout);
 fputs(

"              are mutually exclusive.\n"
"\n"
"              Since 7.21.7, this option is superfluous since you can specify a\n"
"              socks4a proxy with -x, --proxy using a socks4a:// protocol  pre-\n"
"              fix.\n"
"\n"
"              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
"              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
"              such a case curl first connects to the SOCKS proxy and then con-\n"
, stdout);
 fputs(

"              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.18.0.\n"
"\n"
"       --socks5-basic\n"
"              Tells curl to use username/password authentication when connect-\n"
"              ing  to a SOCKS5 proxy.  The username/password authentication is\n"


"              enabled by default.  Use --socks5-gssapi to  force  GSS-API  au-\n"
"              thentication to SOCKS5 proxies.\n"
"\n"
, stdout);
 fputs(
"              Added in 7.55.0.\n"
"\n"
"       --socks5-gssapi-nec\n"
"              As  part of the GSS-API negotiation a protection mode is negoti-\n"
"              ated. RFC 1961 says in section 4.3/4.4 it should  be  protected,\n"
"              but  the  NEC  reference  implementation  does  not.  The option\n"


"              --socks5-gssapi-nec allows the unprotected exchange of the  pro-\n"
"              tection mode negotiation.\n"
"\n"
"              Added in 7.19.4.\n"
"\n"
"       --socks5-gssapi-service <name>\n"
, stdout);
 fputs(
"              The default service name for a socks server is rcmd/server-fqdn.\n"
"              This option allows you to change it.\n"
"\n"
"              Examples:  --socks5  proxy-name  --socks5-gssapi-service   sockd\n"
"              would  use sockd/proxy-name --socks5 proxy-name --socks5-gssapi-\n"


"              service sockd/real-name  would  use  sockd/real-name  for  cases\n"
"              where the proxy-name does not match the principal name.\n"
"\n"
"              Added in 7.19.4.\n"
"\n"
"       --socks5-gssapi\n"



, stdout);
 fputs(
"              Tells  curl  to  use GSS-API authentication when connecting to a\n"
"              SOCKS5 proxy.  The GSS-API authentication is enabled by  default\n"
"              (if  curl is compiled with GSS-API support).  Use --socks5-basic\n"
"              to force username/password authentication to SOCKS5 proxies.\n"
"\n"
"              Added in 7.55.0.\n"
"\n"
"       --socks5-hostname <host[:port]>\n"
"              Use the specified SOCKS5 proxy (and let the  proxy  resolve  the\n"
, stdout);
 fputs(
"              host  name).  If the port number is not specified, it is assumed\n"
"              at port 1080.\n"
"\n"
"              This option overrides any previous use of -x, --proxy,  as  they\n"
"              are mutually exclusive.\n"
"\n"


"              Since 7.21.7, this option is superfluous since you can specify a\n"
"              socks5 hostname proxy with -x, --proxy using a socks5h:// proto-\n"
"              col prefix.\n"
"\n"
"              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
, stdout);
 fputs(
"              the same time -x, --proxy is used with an HTTP/HTTPS  proxy.  In\n"
"              such a case curl first connects to the SOCKS proxy and then con-\n"
"              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"


"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.18.0.\n"
"\n"
"       --socks5 <host[:port]>\n"
"              Use the specified SOCKS5 proxy - but resolve the host  name  lo-\n"
, stdout);
 fputs(
"              cally.  If  the  port  number is not specified, it is assumed at\n"
"              port 1080.\n"
"\n"
"              This option overrides any previous use of -x, --proxy,  as  they\n"
"              are mutually exclusive.\n"
"\n"


"              Since 7.21.7, this option is superfluous since you can specify a\n"
"              socks5 proxy with -x, --proxy using a socks5:// protocol prefix.\n"
"              Since 7.52.0, --preproxy can be used to specify a SOCKS proxy at\n"
, stdout);
 fputs(
"              the  same  time -x, --proxy is used with an HTTP/HTTPS proxy. In\n"
"              such a case curl first connects to the SOCKS proxy and then con-\n"
"              nects (through SOCKS) to the HTTP or HTTPS proxy.\n"
"\n"


"              If this option is used several times, the last one will be used.\n"
"              This  option (as well as --socks4) does not work with IPV6, FTPS\n"
"              or LDAP.\n"
"\n"
"              Added in 7.18.0.\n"
"\n"
"       -Y, --speed-limit <speed>\n"
, stdout);
 fputs(
"              If a download is slower than this given speed (in bytes per sec-\n"
"              ond)  for  speed-time seconds it gets aborted. speed-time is set\n"
"              with -y, --speed-time and is 30 if not set.\n"
"\n"


"              If this option is used several times, the last one will be used.\n"
"\n"
"       -y, --speed-time <seconds>\n"
"              If a download is slower than speed-limit bytes per second during\n"
"              a speed-time period, the download gets aborted. If speed-time is\n"
, stdout);
 fputs(
"              used, the default speed-limit will be  1  unless  set  with  -Y,\n"
"              --speed-limit.\n"
"\n"
"              This  option  controls  transfers  and thus will not affect slow\n"


"              connects etc. If this is a concern for you, try  the  --connect-\n"
"              timeout option.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --ssl-allow-beast\n"
"              This option tells curl to not work around a security flaw in the\n"


, stdout);
 fputs(
"              SSL3 and TLS1.0 protocols known as BEAST.  If this option  isn't\n"
"              used,  the SSL layer may use workarounds known to cause interop-\n"
"              erability problems with some older SSL implementations. WARNING:\n"
"              this option loosens the SSL security, and by using this flag you\n"
"              ask for exactly that.\n"
"\n"
"              Added in 7.25.0.\n"
"\n"
"       --ssl-no-revoke\n"
"              (Schannel) This option tells curl to disable certificate revoca-\n"
, stdout);
 fputs(
"              tion checks.  WARNING: this option loosens the SSL security, and\n"
"              by using this flag you ask for exactly that.\n"
"\n"
"              Added in 7.44.0.\n"
"\n"


"       --ssl-reqd\n"
"              (FTP IMAP POP3 SMTP) Require SSL/TLS for the connection.  Termi-\n"
"              nates the connection if the server doesn't support SSL/TLS.\n"
"\n"
"              This option was formerly known as --ftp-ssl-reqd.\n"
"\n"
"              Added in 7.20.0.\n"
"\n"


, stdout);
 fputs(
"       --ssl  (FTP IMAP POP3 SMTP) Try to use SSL/TLS for the connection.  Re-\n"
"              verts to a non-secure connection if the server  doesn't  support\n"
"              SSL/TLS.   See also --ftp-ssl-control and --ssl-reqd for differ-\n"
"              ent levels of encryption required.\n"
"\n"
"              This option was formerly known as --ftp-ssl (Added  in  7.11.0).\n"
"              That  option name can still be used but will be removed in a fu-\n"
"              ture version.\n"
"\n"
, stdout);
 fputs(
"              Added in 7.20.0.\n"
"\n"
"       -2, --sslv2\n"
"              (SSL) Forces curl to use SSL version 2 when negotiating  with  a\n"


"              remote  SSL  server.  Sometimes curl is built without SSLv2 sup-\n"
"              port. SSLv2 is widely considered insecure (see RFC 6176).\n"
"\n"
"              See also --http1.1 and --http2. -2, --sslv2  requires  that  the\n"
"              underlying  libcurl  was built to support TLS. This option over-\n"
, stdout);
 fputs(
"              rides -3, --sslv3 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
"       -3, --sslv3\n"
"              (SSL) Forces curl to use SSL version 3 when negotiating  with  a\n"


"              remote  SSL  server.  Sometimes curl is built without SSLv3 sup-\n"
"              port. SSLv3 is widely considered insecure (see RFC 7568).\n"
"\n"
"              See also --http1.1 and --http2. -3, --sslv3  requires  that  the\n"
"              underlying  libcurl  was built to support TLS. This option over-\n"
, stdout);
 fputs(
"              rides -2, --sslv2 and -1, --tlsv1 and --tlsv1.1 and --tlsv1.2.\n"
"\n"
"       --stderr\n"
"              Redirect all writes to stderr to the specified file instead.  If\n"


"              the file name is a plain '-', it is instead written to stdout.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              See also -v, --verbose and -s, --silent.\n"
"\n"
"       --styled-output\n"
"              Enables  the automatic use of bold font styles when writing HTTP\n"
, stdout);
 fputs(
"              headers to the terminal. Use --no-styled-output to  switch  them\n"
"              off.\n"
"\n"
"              Added in 7.61.0.\n"
"\n"
"       --suppress-connect-headers\n"
"              When  -p,  --proxytunnel  is  used and a CONNECT request is made\n"
"              don't output proxy CONNECT  response  headers.  This  option  is\n"
"              meant  to  be used with -D, --dump-header or -i, --include which\n"
"              are used to show protocol headers in the output. It has  no  ef-\n"
, stdout);
 fputs(




"              fect  on  debug options such as -v, --verbose or --trace, or any\n"
"              statistics.\n"
"\n"


"              See also -D, --dump-header and -i, --include and -p, --proxytun-\n"
"              nel.\n"
"\n"
"       --tcp-fastopen\n"
"              Enable use of TCP Fast Open (RFC7413).\n"
"\n"
"              Added in 7.49.0.\n"
"\n"
"       --tcp-nodelay\n"
"              Turn  on the TCP_NODELAY option. See the curl_easy_setopt(3) man\n"
"              page for details about this option.\n"
"\n"

, stdout);
 fputs(
"              Since 7.50.2, curl sets this option by default and you  need  to\n"
"              explicitly switch it off if you don't want it on.\n"
"\n"
"              Added in 7.11.2.\n"
"\n"
"       -t, --telnet-option <opt=val>\n"
"              Pass options to the telnet protocol. Supported options are:\n"
"\n"
"              TTYPE=<term> Sets the terminal type.\n"
"\n"
"              XDISPLOC=<X display> Sets the X display location.\n"
"\n"
"              NEW_ENV=<var,val> Sets an environment variable.\n"
"\n"
"       --tftp-blksize <value>\n"

, stdout);
 fputs(
"              (TFTP) Set TFTP BLKSIZE option (must be >512). This is the block\n"
"              size that curl will try to use when transferring data to or from\n"
"              a TFTP server. By default 512 bytes will be used.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              Added in 7.20.0.\n"
"\n"
"       --tftp-no-options\n"
"              (TFTP) Tells curl not to send TFTP options requests.\n"
"\n"

, stdout);
 fputs(
"              This  option  improves  interop with some legacy servers that do\n"
"              not acknowledge or properly implement TFTP  options.  When  this\n"
"              option is used --tftp-blksize is ignored.\n"
"\n"
"              Added in 7.48.0.\n"
"\n"
"       -z, --time-cond <time>\n"
"              (HTTP  FTP) Request a file that has been modified later than the\n"
"              given time and date, or one that has been modified  before  that\n"

, stdout);
 fputs(
"              time.  The <date expression> can be all sorts of date strings or\n"
"              if it doesn't match any internal ones, it is taken as a filename\n"
"              and  tries  to get the modification date (mtime) from <file> in-\n"
"              stead. See the curl_getdate(3) man pages for date expression de-\n"
"              tails.\n"
"\n"
"              Start the date expression with a dash (-) to make it request for\n"
"              a document that is older than the given date/time, default is  a\n"


, stdout);
 fputs(
"              document that is newer than the specified date/time.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --tls-max <VERSION>\n"
"              (SSL) VERSION defines maximum supported TLS version. The minimum\n"
"              acceptable version  is  set  by  tlsv1.0,  tlsv1.1,  tlsv1.2  or\n"
"              tlsv1.3.\n"
"\n"
"              default\n"
"                     Use up to recommended TLS version.\n"
"\n"
"              1.0    Use up to TLSv1.0.\n"


, stdout);
 fputs(
"              1.1    Use up to TLSv1.1.\n"
"              1.2    Use up to TLSv1.2.\n"
"              1.3    Use up to TLSv1.3.\n"
"\n"
"       See also --tlsv1.0 and --tlsv1.1 and --tlsv1.2 and --tlsv1.3. --tls-max\n"
"       requires that the underlying libcurl was built to support TLS. Added in\n"
"       7.54.0.\n"
"\n"
"       --tls13-ciphers <list of TLS 1.3 ciphersuites>\n"
"              (TLS)  Specifies which cipher suites to use in the connection if\n"

, stdout);
 fputs(
"              it negotiates TLS 1.3. The list of ciphers suites  must  specify\n"
"              valid  ciphers.  Read up on TLS 1.3 cipher suite details on this\n"
"              URL:\n"
"\n"
"               https://curl.haxx.se/docs/ssl-ciphers.html\n"
"\n"
"              This option is currently used only when curl  is  built  to  use\n"
"              OpenSSL 1.1.1 or later. If you are using a different SSL backend\n"
"              you can try setting TLS 1.3 cipher suites by using the --ciphers\n"
"              option.\n"
"\n"


, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --tlsauthtype <type>\n"
"              Set  TLS  authentication type. Currently, the only supported op-\n"
"              tion  is  \"SRP\",  for  TLS-SRP  (RFC  5054).  If  --tlsuser  and\n"
"              --tlspassword  are specified but --tlsauthtype is not, then this\n"
"              option defaults to \"SRP\".  This option works only if the  under-\n"
, stdout);
 fputs(
"              lying  libcurl  is  built  with  TLS-SRP support, which requires\n"
"              OpenSSL or GnuTLS with TLS-SRP support.\n"
"\n"


"              Added in 7.21.4.\n"
"\n"
"       --tlspassword\n"
"              Set password for use with the TLS authentication  method  speci-\n"
"              fied with --tlsauthtype. Requires that --tlsuser also be set.\n"
"\n"
"              Added in 7.21.4.\n"
"       --tlsuser <name>\n"
"              Set  username  for use with the TLS authentication method speci-\n"
, stdout);
 fputs(
"              fied with --tlsauthtype. Requires  that  --tlspassword  also  is\n"
"              set.\n"
"\n"
"              Added in 7.21.4.\n"
"\n"
"       --tlsv1.0\n"


"              (TLS)  Forces curl to use TLS version 1.0 or later when connect-\n"
"              ing to a remote TLS server.\n"
"\n"
"              In old versions of curl this  option  was  documented  to  allow\n"
"              _only_  TLS  1.0, but behavior was inconsistent depending on the\n"
, stdout);
 fputs(
"              TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
"              sion.\n"
"\n"
"              Added in 7.34.0.\n"
"\n"
"       --tlsv1.1\n"


"              (TLS)  Forces curl to use TLS version 1.1 or later when connect-\n"
"              ing to a remote TLS server.\n"
"\n"
"              In old versions of curl this  option  was  documented  to  allow\n"
"              _only_  TLS  1.1, but behavior was inconsistent depending on the\n"
, stdout);
 fputs(
"              TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
"              sion.\n"
"\n"
"              Added in 7.34.0.\n"
"\n"
"       --tlsv1.2\n"


"              (TLS)  Forces curl to use TLS version 1.2 or later when connect-\n"
"              ing to a remote TLS server.\n"
"\n"
"              In old versions of curl this  option  was  documented  to  allow\n"
"              _only_  TLS  1.2, but behavior was inconsistent depending on the\n"
, stdout);
 fputs(
"              TLS library. Use --tls-max if you want to set a maximum TLS ver-\n"
"              sion.\n"
"\n"
"              Added in 7.34.0.\n"
"\n"
"       --tlsv1.3\n"


"              (TLS)  Forces curl to use TLS version 1.3 or later when connect-\n"
"              ing to a remote TLS server.\n"
"\n"
"              Note that TLS 1.3 is only supported by a subset of TLS backends.\n"
"              At the time of this writing, they are BoringSSL, NSS, and Secure\n"
, stdout);
 fputs(
"              Transport (on iOS 11 or later, and macOS 10.13 or later).\n"
"\n"
"              Added in 7.52.0.\n"
"\n"
"       -1, --tlsv1\n"
"              (SSL) Tells curl to use at least TLS version 1.x when  negotiat-\n"


"              ing  with  a  remote  TLS  server. That means TLS version 1.0 or\n"
"              higher\n"
"\n"
"              See also --http1.1 and --http2. -1, --tlsv1  requires  that  the\n"
"              underlying  libcurl  was built to support TLS. This option over-\n"
, stdout);
 fputs(
"              rides --tlsv1.1 and --tlsv1.2 and --tlsv1.3.\n"
"\n"
"       --tr-encoding\n"
"              (HTTP) Request a compressed Transfer-Encoding response using one\n"
"              of  the  algorithms curl supports, and uncompress the data while\n"


"              receiving it.\n"
"\n"
"              Added in 7.21.6.\n"
"\n"
"       --trace-ascii <file>\n"
"              Enables a full trace dump of all incoming and outgoing data, in-\n"
"              cluding  descriptive  information, to the given output file. Use\n"
, stdout);
 fputs(
"              \"-\" as filename to have the output sent to stdout.\n"
"\n"
"              This is very similar to --trace, but leaves out the hex part and\n"
"              only  shows  the ASCII part of the dump. It makes smaller output\n"


"              that might be easier to read for untrained humans.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"              This option overrides --trace and -v, --verbose.\n"
"\n"
"       --trace-time\n"
, stdout);
 fputs(
"              Prepends a time stamp to each trace or verbose  line  that  curl\n"
"              displays.\n"
"\n"
"              Added in 7.14.0.\n"
"\n"
"       --trace <file>\n"
"              Enables a full trace dump of all incoming and outgoing data, in-\n"


"              cluding descriptive information, to the given output  file.  Use\n"
"              \"-\"  as  filename  to have the output sent to stdout. Use \"%\" as\n"
"              filename to have the output sent to stderr.\n"
"\n"
, stdout);
 fputs(
"              If this option is used several times, the last one will be used.\n"
"\n"
"              This option overrides -v, --verbose and --trace-ascii.\n"
"\n"
"       --unix-socket <path>\n"
"              (HTTP) Connect through this Unix domain socket, instead of using\n"


"              the network.\n"
"\n"
"              Added in 7.40.0.\n"
"\n"
"       -T, --upload-file <file>\n"
"              This  transfers  the  specified local file to the remote URL. If\n"
, stdout);
 fputs(
"              there is no file part in the specified URL, curl will append the\n"
"              local file name. NOTE that you must use a trailing / on the last\n"
"              directory to really prove to Curl that there is no file name  or\n"
"              curl will think that your last directory name is the remote file\n"


"              name to use. That will most likely cause the upload operation to\n"
"              fail. If this is used on an HTTP(S) server, the PUT command will\n"
"              be used.\n"
"\n"




, stdout);
 fputs(
"              Use the file name \"-\" (a single dash) to use stdin instead of  a\n"
"              given  file.   Alternately,  the file name \".\" (a single period)\n"
"              may be specified instead of \"-\" to  use  stdin  in  non-blocking\n"
"              mode  to  allow  reading  server output while stdin is being up-\n"
"              loaded.\n"
"\n"
"              You can specify one -T, --upload-file for each URL on  the  com-\n"
"              mand  line.  Each -T, --upload-file + URL pair specifies what to\n"
, stdout);
 fputs(
"              upload and to where. curl also supports \"globbing\"  of  the  -T,\n"
"              --upload-file  argument,  meaning  that  you can upload multiple\n"
"              files to a single URL by using the same URL globbing style  sup-\n"
"              ported in the URL, like this:\n"
"\n"


"               curl --upload-file \"{file1,file2}\" http://www.example.com\n"
"\n"
"              or even\n"
"\n"
"               curl -T \"img[1-1000].png\" ftp://ftp.example.com/upload/\n"
"\n"
, stdout);
 fputs(
"              When  uploading  to an SMTP server: the uploaded data is assumed\n"
"              to be RFC 5322 formatted. It has to feature the necessary set of\n"
"              headers  and  mail  body formatted correctly by the user as curl\n"
"              will not transcode nor encode it further in any way.\n"
"\n"
"       --url <url>\n"


"              Specify a URL to fetch. This option is  mostly  handy  when  you\n"
"              want to specify URL(s) in a config file.\n"
"\n"




, stdout);
 fputs(
"              If  the given URL is missing a scheme name (such as \"http://\" or\n"
"              \"ftp://\" etc) then curl will make a guess based on the host.  If\n"
"              the  outermost  sub-domain  name  matches DICT, FTP, IMAP, LDAP,\n"
"              POP3 or SMTP then that protocol will  be  used,  otherwise  HTTP\n"
"              will be used. Since 7.45.0 guessing can be disabled by setting a\n"
"              default protocol, see --proto-default for details.\n"
"\n"
, stdout);
 fputs(
"              This option may be used any number of times.  To  control  where\n"
"              this  URL  is written, use the -o, --output or the -O, --remote-\n"
"              name options.\n"
"\n"
"       -B, --use-ascii\n"
"              (FTP LDAP) Enable ASCII transfer. For FTP, this can also be  en-\n"


"              forced  by  using  a  URL  that ends with \";type=A\". This option\n"
"              causes data sent to stdout to be in text mode for win32 systems.\n"
"\n"
"       -A, --user-agent <name>\n"
, stdout);
 fputs(
"              (HTTP) Specify the User-Agent string to send to the HTTP server.\n"
"              To  encode blanks in the string, surround the string with single\n"
"              quote marks. This header can also be set with the  -H,  --header\n"
"              or the --proxy-header options.\n"
"\n"


"              If this option is used several times, the last one will be used.\n"
"\n"
"       -u, --user <user:password>\n"
"              Specify the user name and password to use for server authentica-\n"
, stdout);
 fputs(
"              tion. Overrides -n, --netrc and --netrc-optional.\n"
"\n"
"              If you simply specify the user name,  curl  will  prompt  for  a\n"
"              password.\n"
"\n"
"              The  user  name  and  passwords are split up on the first colon,\n"


"              which makes it impossible to use a colon in the user  name  with\n"
"              this option. The password can, still.\n"
"\n"
"              On systems where it works, curl will hide the given option argu-\n"



, stdout);
 fputs(
"              ment from process listings. This is not enough to  protect  cre-\n"
"              dentials  from  possibly getting seen by other users on the same\n"
"              system as they will still be visible for a brief  moment  before\n"
"              cleared. Such sensitive data should be retrieved from a file in-\n"
"              stead or similar and never used in clear text in a command line.\n"
"              When using Kerberos V5 with a Windows based  server  you  should\n"
, stdout);
 fputs(
"              include  the  Windows domain name in the user name, in order for\n"
"              the server to successfully obtain  a  Kerberos  Ticket.  If  you\n"
"              don't then the initial authentication handshake may fail.\n"
"\n"


"              When  using  NTLM,  the user name can be specified simply as the\n"
"              user name, without the domain, if there is a single  domain  and\n"
"              forest in your setup for example.\n"
"\n"
, stdout);
 fputs(
"              To  specify  the domain name use either Down-Level Logon Name or\n"
"              UPN (User Principal Name) formats. For example, EXAMPLE\\user and\n"
"              user@example.com respectively.\n"
"\n"
"              If  you  use a Windows SSPI-enabled curl binary and perform Ker-\n"
"              beros V5, Negotiate, NTLM or Digest authentication then you  can\n"
"              tell  curl  to select the user name and password from your envi-\n"
, stdout);
 fputs(


"              ronment by specifying a single colon with this option: \"-u :\".\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       -v, --verbose\n"
"              Makes curl verbose during the operation.  Useful  for  debugging\n"
"              and  seeing  what's  going  on \"under the hood\". A line starting\n"
"              with '>' means \"header data\" sent by  curl,  '<'  means  \"header\n"
"              data\"  received  by  curl  that is hidden in normal cases, and a\n"
, stdout);
 fputs(


"              line starting with '*' means additional info provided by curl.\n"
"\n"
"              If you only want HTTP headers in the output, -i, --include might\n"
"              be the option you're looking for.\n"
"\n"
"              If  you think this option still doesn't give you enough details,\n"


"              consider using --trace or --trace-ascii instead.\n"
"\n"
"              Use -s, --silent to make curl really quiet.\n"
"\n"
"              See also  -i,  --include.  This  option  overrides  --trace  and\n"
, stdout);
 fputs(
"              --trace-ascii.\n"
"\n"
"       -V, --version\n"
"              Displays information about curl and the libcurl version it uses.\n"
"              The  first  line  includes the full version of curl, libcurl and\n"
"              other 3rd party libraries linked with the executable.\n"
"\n"


"              The second line (starts with \"Protocols:\") shows  all  protocols\n"
"              that libcurl reports to support.\n"
"\n"
"              The third line (starts with \"Features:\") shows specific features\n"
, stdout);
 fputs(
"              libcurl reports to offer. Available features include:\n"
"\n"
"              IPv6   You can use IPv6 with this.\n"
"\n"
"              krb4   Krb4 for FTP is supported.\n"
"\n"
"              SSL    SSL versions of various protocols are supported, such  as\n"


"                     HTTPS, FTPS, POP3S and so on.\n"
"\n"
"              libz   Automatic  decompression of compressed files over HTTP is\n"
"                     supported.\n"
"\n"
"              NTLM   NTLM authentication is supported.\n"
"\n"
, stdout);
 fputs(
"              Debug  This curl uses a libcurl built with Debug.  This  enables\n"
"                     more  error-tracking  and memory debugging etc. For curl-\n"
"                     developers only!\n"
"\n"
"              AsynchDNS\n"


"                     This curl uses asynchronous name  resolves.  Asynchronous\n"
"                     name  resolves can be done using either the c-ares or the\n"
"                     threaded resolver backends.\n"
"\n"
"              SPNEGO SPNEGO authentication is supported.\n"
"\n"
, stdout);
 fputs(
"              Largefile\n"
"                     This curl supports transfers of large files, files larger\n"
"                     than 2GB.\n"
"\n"
"              IDN    This curl supports IDN - international domain names.\n"
"\n"
"              GSS-API\n"


"                     GSS-API is supported.\n"
"\n"
"              SSPI   SSPI is supported.\n"
"\n"
"              TLS-SRP\n"
"                     SRP  (Secure Remote Password) authentication is supported\n"
"                     for TLS.\n"
"\n"
, stdout);
 fputs(
"              HTTP2  HTTP/2 support has been built-in.\n"
"\n"
"              UnixSockets\n"
"                     Unix sockets support is provided.\n"
"\n"
"              HTTPS-proxy\n"
"                     This curl is built to support HTTPS proxy.\n"
"\n"
"              Metalink\n"
"                     This curl supports Metalink (both version 3  and  4  (RFC\n"
"                     5854)),  which  describes  mirrors and hashes.  curl will\n"
"                     use mirrors for failover if there are errors (such as the\n"
, stdout);
 fputs(



"                     file or server not being available).\n"
"\n"
"              PSL    PSL  is  short for Public Suffix List and means that this\n"
"                     curl has been built with  knowledge  about  \"public  suf-\n"
"                     fixes\".\n"
"\n"


"              MultiSSL\n"
"                     This curl supports multiple TLS backends.\n"
"\n"
"       -w, --write-out <format>\n"
"              Make curl display information on stdout after a completed trans-\n"



, stdout);
 fputs(
"              fer. The format is a string that may contain  plain  text  mixed\n"
"              with  any  number of variables. The format can be specified as a\n"
"              literal \"string\", or you can have curl read the  format  from  a\n"
"              file  with  \"@filename\" and to tell curl to read the format from\n"
"              stdin you write \"@-\".\n"
"\n"
"              The variables present in the output format will  be  substituted\n"



, stdout);
 fputs(
"              by  the  value or text that curl thinks fit, as described below.\n"
"              All variables are specified as %{variable_name} and to output  a\n"
"              normal  % you just write them as %%. You can output a newline by\n"
"              using \\n, a carriage return with \\r and a tab space with \\t.\n"
"\n"
"              The output will be written to standard output, but this  can  be\n"
"              switched to standard error by using %{stderr}.\n"
"\n"
, stdout);
 fputs(
"              NOTE: The %-symbol is a special symbol in the win32-environment,\n"
"              where all occurrences of % must be doubled when using  this  op-\n"
"              tion.\n"
"\n"
"              The variables available are:\n"
"\n"


"              content_type   The  Content-Type  of  the requested document, if\n"
"                             there was any.\n"
"\n"
"              filename_effective\n"
"                             The ultimate filename that curl  writes  out  to.\n"



, stdout);
 fputs(
"                             This  is only meaningful if curl is told to write\n"
"                             to a file  with  the  -O,  --remote-name  or  -o,\n"
"                             --output  option. It's most useful in combination\n"
"                             with the -J, --remote-header-name option.  (Added\n"
"                             in 7.26.0)\n"
"\n"
"              ftp_entry_path The initial path curl ended up in when logging on\n"
, stdout);
 fputs(
"                             to the remote FTP server. (Added in 7.15.4)\n"
"\n"
"              http_code      The numerical response code that was found in the\n"
"                             last  retrieved  HTTP(S)  or  FTP(s) transfer. In\n"


"                             7.18.2 the alias response_code was added to  show\n"
"                             the same info.\n"
"\n"
"              http_connect   The numerical code that was found in the last re-\n"
, stdout);
 fputs(
"                             sponse (from a proxy) to a curl CONNECT  request.\n"
"                             (Added in 7.12.4)\n"
"\n"
"              http_version   The  http  version  that  was  effectively  used.\n"
"                             (Added in 7.50.0)\n"
"\n"


"              local_ip       The IP address of the local end of the  most  re-\n"
"                             cently  done  connection  - can be either IPv4 or\n"
"                             IPv6 (Added in 7.29.0)\n"
"\n"
, stdout);
 fputs(
"              local_port     The local port number of the most  recently  done\n"
"                             connection (Added in 7.29.0)\n"
"\n"
"              num_connects   Number  of new connects made in the recent trans-\n"
"                             fer. (Added in 7.12.3)\n"
"\n"


"              num_redirects  Number of redirects that were followed in the re-\n"
"                             quest. (Added in 7.12.3)\n"
"\n"
"              proxy_ssl_verify_result\n"
, stdout);
 fputs(
"                             The result of the HTTPS proxy's SSL peer certifi-\n"
"                             cate verification that was requested. 0 means the\n"
"                             verification was successful. (Added in 7.52.0)\n"
"\n"
"              redirect_url   When an HTTP request was made without -L, --loca-\n"
"                             tion to follow redirects (or when --max-redir  is\n"
"                             met),  this  variable  will show the actual URL a\n"
, stdout);
 fputs(


"                             redirect would have gone to. (Added in 7.18.2)\n"
"\n"
"              remote_ip      The remote IP address of the most  recently  done\n"
"                             connection - can be either IPv4 or IPv6 (Added in\n"
"                             7.29.0)\n"
"\n"


"              remote_port    The remote port number of the most recently  done\n"
"                             connection (Added in 7.29.0)\n"
"\n"
"              scheme         The  URL  scheme (sometimes called protocol) that\n"
, stdout);
 fputs(
"                             was effectively used (Added in 7.52.0)\n"
"\n"
"              size_download  The total amount of bytes that were downloaded.\n"
"\n"
"              size_header    The total amount of bytes of the downloaded head-\n"
"                             ers.\n"
"\n"


"              size_request   The  total  amount of bytes that were sent in the\n"
"                             HTTP request.\n"
"\n"
"              size_upload    The total amount of bytes that were uploaded.\n"
"\n"
, stdout);
 fputs(
"              speed_download The average download speed that curl measured for\n"
"                             the complete download. Bytes per second.\n"
"\n"
"              speed_upload   The  average  upload speed that curl measured for\n"
"                             the complete upload. Bytes per second.\n"
"\n"


"              ssl_verify_result\n"
"                             The result of the SSL peer certificate  verifica-\n"
"                             tion that was requested. 0 means the verification\n"
, stdout);
 fputs(
"                             was successful. (Added in 7.19.0)\n"
"\n"
"              stderr         From this point on, the  -w,  --write-out  output\n"
"                             will  be  written  to  standard  error. (Added in\n"
"                             7.63.0)\n"
"\n"
"              stdout         From this point on, the  -w,  --write-out  output\n"
"                             will  be written to standard output.  This is the\n"
"                             default, but can be used  to  switch  back  after\n"
, stdout);
 fputs(



"                             switching to stderr.  (Added in 7.63.0)\n"
"\n"
"              time_appconnect\n"
"                             The  time, in seconds, it took from the start un-\n"
"                             til the SSL/SSH/etc connect/handshake to the  re-\n"


"                             mote host was completed. (Added in 7.19.0)\n"
"\n"
"              time_connect   The  time, in seconds, it took from the start un-\n"
"                             til the TCP connect to the remote host (or proxy)\n"
, stdout);
 fputs(
"                             was completed.\n"
"\n"
"              time_namelookup\n"
"                             The  time, in seconds, it took from the start un-\n"
"                             til the name resolving was completed.\n"
"\n"
"              time_pretransfer\n"
"                             The time, in seconds, it took from the start  un-\n"
"                             til  the  file  transfer was just about to begin.\n"
"                             This includes all pre-transfer commands and nego-\n"
, stdout);
 fputs(



"                             tiations that are specific to the particular pro-\n"
"                             tocol(s) involved.\n"
"\n"
"              time_redirect  The time, in seconds, it took for all redirection\n"
"                             steps including name lookup, connect, pretransfer\n"
"                             and transfer before  the  final  transaction  was\n"
"                             started.  time_redirect shows the complete execu-\n"
, stdout);
 fputs(



"                             tion time for multiple  redirections.  (Added  in\n"
"                             7.12.3)\n"
"\n"
"              time_starttransfer\n"
"                             The  time, in seconds, it took from the start un-\n"
"                             til the first byte was just about  to  be  trans-\n"
"                             ferred.  This  includes time_pretransfer and also\n"
"                             the time the server needed to calculate  the  re-\n"
, stdout);
 fputs(



"                             sult.\n"
"\n"
"              time_total     The  total time, in seconds, that the full opera-\n"
"                             tion lasted.\n"
"\n"
"              url_effective  The URL that was fetched last. This is most mean-\n"


"                             ingful  if  you've  told curl to follow location:\n"
"                             headers.\n"
"\n"
"              If this option is used several times, the last one will be used.\n"
"\n"
"       --xattr\n"



, stdout);
 fputs(
"              When saving output to a file, this option tells  curl  to  store\n"
"              certain  file  metadata  in extended file attributes. Currently,\n"
"              the URL is stored in the xdg.origin.url attribute and, for HTTP,\n"
"              the  content  type  is stored in the mime_type attribute. If the\n"
"              file system does not support extended attributes, a  warning  is\n"
"              issued.\n"
"\n"
"FILES\n"
"       ~/.curlrc\n"
, stdout);
 fputs(
"              Default config file, see -K, --config for details.\n"
"\n"
"ENVIRONMENT\n"
"       The environment variables can be specified in lower case or upper case.\n"
"       The lower case version has precedence. http_proxy is an exception as it\n"
"       is only available in lower case.\n"
"\n"


"       Using  an  environment variable to set the proxy has the same effect as\n"
"       using the -x, --proxy option.\n"
"\n"
"       http_proxy [protocol://]<host>[:port]\n"
"              Sets the proxy server to use for HTTP.\n"
, stdout);
 fputs(
"       HTTPS_PROXY [protocol://]<host>[:port]\n"
"              Sets the proxy server to use for HTTPS.\n"
"\n"
"       [url-protocol]_PROXY [protocol://]<host>[:port]\n"
"              Sets the proxy server to use for [url-protocol], where the  pro-\n"


"              tocol  is  a  protocol  that curl supports and as specified in a\n"
"              URL. FTP, FTPS, POP3, IMAP, SMTP, LDAP etc.\n"
"\n"
"       ALL_PROXY [protocol://]<host>[:port]\n"
"              Sets the proxy server to use if no  protocol-specific  proxy  is\n"
, stdout);
 fputs(
"              set.\n"
"\n"
"       NO_PROXY <comma-separated list of hosts/domains>\n"
"              list  of  host names that shouldn't go through any proxy. If set\n"
"              to an asterisk '*' only, it matches all hosts. Each name in this\n"


"              list is matched as either a domain name which contains the host-\n"
"              name, or the hostname itself.\n"
"\n"
"              This environment variable disables use of the  proxy  even  when\n"



, stdout);
 fputs(
"              specified  with  the  -x,  --proxy  option. That is NO_PROXY=di-\n"
"              rect.example.com  curl  -x  http://proxy.example.com  http://di-\n"
"              rect.example.com   accesses   the   target   URL  directly,  and\n"
"              NO_PROXY=direct.example.com  curl  -x   http://proxy.example.com\n"
"              http://somewhere.example.com accesses the target URL through the\n"
"              proxy.\n"
"\n"
"              The list of host names can also  be  include  numerical  IP  ad-\n"
, stdout);
 fputs(
"              dresses,  and IPv6 versions should then be given without enclos-\n"
"              ing brackets.\n"
"\n"
"PROXY PROTOCOL PREFIXES\n"
"       Since curl version 7.21.7, the proxy string may  be  specified  with  a\n"


"       protocol:// prefix to specify alternative proxy protocols.\n"
"\n"
"       If  no  protocol  is  specified  in  the  proxy string or if the string\n"
"       doesn't match a supported one, the proxy will be  treated  as  an  HTTP\n"
"       proxy.\n"
"\n"
, stdout);
 fputs(
"       The supported proxy protocol prefixes are as follows:\n"
"\n"
"       http://\n"
"              Makes  it use it as an HTTP proxy. The default if no scheme pre-\n"
"              fix is used.\n"
"\n"
"       https://\n"
"              Makes it treated as an HTTPS proxy.\n"
"\n"


"       socks4://\n"
"              Makes it the equivalent of --socks4\n"
"\n"
"       socks4a://\n"
"              Makes it the equivalent of --socks4a\n"
"\n"
"       socks5://\n"
"              Makes it the equivalent of --socks5\n"
"\n"
"       socks5h://\n"
, stdout);
 fputs(
"              Makes it the equivalent of --socks5-hostname\n"
"\n"
"EXIT CODES\n"
"       There are a bunch of different error codes and their corresponding  er-\n"
"       ror messages that may appear during bad conditions. At the time of this\n"
"       writing, the exit codes are:\n"
"\n"


"       1      Unsupported protocol. This build of curl has no support for this\n"
"              protocol.\n"
"\n"
"       2      Failed to initialize.\n"
"\n"
"       3      URL malformed. The syntax was not correct.\n"
"\n"
, stdout);
 fputs(
"       4      A  feature  or option that was needed to perform the desired re-\n"
"              quest was not enabled or was explicitly disabled at  build-time.\n"
"              To make curl able to do this, you probably need another build of\n"
"              libcurl!\n"
"\n"


"       5      Couldn't resolve proxy. The given proxy host could  not  be  re-\n"
"              solved.\n"
"\n"
"       6      Couldn't resolve host. The given remote host was not resolved.\n"
"\n"
"       7      Failed to connect to host.\n"
"\n"
, stdout);
 fputs(
"       8      Weird server reply. The server sent data curl couldn't parse.\n"
"\n"
"       9      FTP  access  denied. The server denied login or denied access to\n"
"              the particular resource or directory you wanted to  reach.  Most\n"


"              often  you  tried to change to a directory that doesn't exist on\n"
"              the server.\n"
"\n"
"       10     FTP accept failed. While waiting for the server to connect  back\n"
"              when  an active FTP session is used, an error code was sent over\n"
, stdout);
 fputs(
"              the control connection or similar.\n"
"\n"
"       11     FTP weird PASS reply. Curl couldn't parse the reply sent to  the\n"
"              PASS request.\n"
"\n"


"       12     During  an  active  FTP  session while waiting for the server to\n"
"              connect back to curl, the timeout expired.\n"
"\n"
"       13     FTP weird PASV reply, Curl couldn't parse the reply sent to  the\n"
"              PASV request.\n"
"\n"
"       14     FTP  weird  227  format.  Curl  couldn't  parse the 227-line the\n"
, stdout);
 fputs(
"              server sent.\n"
"\n"
"       15     FTP can't get host. Couldn't resolve the host IP we got  in  the\n"
"              227-line.\n"
"\n"


"       16     HTTP/2 error. A problem was detected in the HTTP2 framing layer.\n"
"              This is somewhat generic and can be one out of several problems,\n"
"              see the error message for details.\n"
"\n"
"       17     FTP  couldn't set binary. Couldn't change transfer method to bi-\n"
"              nary.\n"
"\n"
, stdout);
 fputs(
"       18     Partial file. Only a part of the file was transferred.\n"
"\n"
"       19     FTP couldn't download/access the given file, the RETR (or  simi-\n"
"              lar) command failed.\n"
"\n"


"       21     FTP quote error. A quote command returned error from the server.\n"
"       22     HTTP  page not retrieved. The requested url was not found or re-\n"
"              turned another error with the  HTTP  error  code  being  400  or\n"
"              above. This return code only appears if -f, --fail is used.\n"
"\n"
, stdout);
 fputs(
"       23     Write  error.  Curl couldn't write data to a local filesystem or\n"
"              similar.\n"
"\n"
"       25     FTP couldn't STOR file. The server denied  the  STOR  operation,\n"


"              used for FTP uploading.\n"
"\n"
"       26     Read error. Various reading problems.\n"
"\n"
"       27     Out of memory. A memory allocation request failed.\n"
"\n"
"       28     Operation timeout. The specified time-out period was reached ac-\n"
"              cording to the conditions.\n"
"\n"
, stdout);
 fputs(
"       30     FTP PORT failed. The PORT command failed. Not  all  FTP  servers\n"
"              support  the  PORT  command, try doing a transfer using PASV in-\n"
"              stead!\n"
"\n"


"       31     FTP couldn't use REST. The REST command failed. This command  is\n"
"              used for resumed FTP transfers.\n"
"\n"
"       33     HTTP range error. The range \"command\" didn't work.\n"
"\n"
"       34     HTTP post error. Internal post-request generation error.\n"
"\n"
, stdout);
 fputs(
"       35     SSL connect error. The SSL handshaking failed.\n"
"\n"
"       36     Bad  download resume. Couldn't continue an earlier aborted down-\n"
"              load.\n"
"\n"


"       37     FILE couldn't read file. Failed to open the file. Permissions?\n"
"\n"
"       38     LDAP cannot bind. LDAP bind operation failed.\n"
"\n"
"       39     LDAP search failed.\n"
"\n"
"       41     Function not found. A required LDAP function was not found.\n"
"\n"
"       42     Aborted by callback. An application told curl to abort the oper-\n"
, stdout);
 fputs(
"              ation.\n"
"\n"
"       43     Internal error. A function was called with a bad parameter.\n"
"\n"


"       45     Interface  error.  A  specified  outgoing interface could not be\n"
"              used.\n"
"\n"
"       47     Too many redirects. When following redirects, curl hit the maxi-\n"
"              mum amount.\n"
"\n"
"       48     Unknown  option  specified  to  libcurl. This indicates that you\n"
"              passed a weird option to curl that was passed on to libcurl  and\n"
, stdout);
 fputs(
"              rejected. Read up in the manual!\n"
"\n"
"       49     Malformed telnet option.\n"
"\n"


"       51     The peer's SSL certificate or SSH MD5 fingerprint was not OK.\n"
"\n"
"       52     The  server  didn't  reply anything, which here is considered an\n"
"              error.\n"
"\n"
"       53     SSL crypto engine not found.\n"
"\n"
"       54     Cannot set SSL crypto engine as default.\n"
"\n"
"       55     Failed sending network data.\n"
"\n"
"       56     Failure in receiving network data.\n"
"\n"
, stdout);
 fputs(
"       58     Problem with the local certificate.\n"
"\n"
"       59     Couldn't use specified SSL cipher.\n"
"\n"


"       60     Peer certificate cannot be authenticated with known CA  certifi-\n"
"              cates.\n"
"\n"
"       61     Unrecognized transfer encoding.\n"
"\n"
"       62     Invalid LDAP URL.\n"
"\n"
"       63     Maximum file size exceeded.\n"
"\n"
"       64     Requested FTP SSL level failed.\n"
"\n"
"       65     Sending the data requires a rewind that failed.\n"
"\n"
"       66     Failed to initialise SSL Engine.\n"
"\n"
, stdout);
 fputs(
"       67     The  user  name,  password, or similar was not accepted and curl\n"
"              failed to log in.\n"
"\n"


"       68     File not found on TFTP server.\n"
"\n"
"       69     Permission problem on TFTP server.\n"
"\n"
"       70     Out of disk space on TFTP server.\n"
"\n"
"       71     Illegal TFTP operation.\n"
"\n"
"       72     Unknown TFTP transfer ID.\n"
"\n"
"       73     File already exists (TFTP).\n"
"\n"
"       74     No such user (TFTP).\n"
"\n"
"       75     Character conversion failed.\n"
"\n"
, stdout);
 fputs(
"       76     Character conversion functions required.\n"
"\n"
"       77     Problem with reading the SSL CA cert (path? access rights?).\n"
"\n"


"       78     The resource referenced in the URL does not exist.\n"
"\n"
"       79     An unspecified error occurred during the SSH session.\n"
"\n"
"       80     Failed to shut down the SSL connection.\n"
"\n"
"       82     Could not load CRL file,  missing  or  wrong  format  (added  in\n"
"              7.19.0).\n"
"\n"
"       83     Issuer check failed (added in 7.19.0).\n"
"\n"
, stdout);
 fputs(
"       84     The FTP PRET command failed\n"
"\n"
"       85     RTSP: mismatch of CSeq numbers\n"
"\n"
"       86     RTSP: mismatch of Session Identifiers\n"
"\n"


"       87     unable to parse FTP file list\n"
"\n"
"       88     FTP chunk callback reported error\n"
"\n"
"       89     No connection available, the session will be queued\n"
"\n"
"       90     SSL public key does not matched pinned public key\n"
"\n"
"       91     Invalid SSL certificate status.\n"
"\n"
"       92     Stream error in HTTP/2 framing layer.\n"
"\n"
, stdout);
 fputs(
"       XX     More error codes will appear here in future releases. The exist-\n"
"              ing ones are meant to never change.\n"
"\n"
"AUTHORS / CONTRIBUTORS\n"


"       Daniel Stenberg is the main author, but the whole list of  contributors\n"
"       is found in the separate THANKS file.\n"
"\n"
"WWW\n"
"       https://curl.haxx.se\n"
"\n"
"SEE ALSO\n"
"       ftp(1), wget(1)\n"
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359

4360
4361
4362
4363
4364
4365
4366

4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386

4387
4388
4389
4390
4391
4392
4393
4394

4395
4396
4397
4398
4399
4400
4401

4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414

4415
4416
4417
4418
4419
4420

4421
4422

4423

4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468

4469
4470
4471
4472


4473
4474
4475
4476
4477
4478

4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499




4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525

4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543

4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557

4558


4559

4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589

4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610

4611
4612
4613
4614
4615
4616

4617
4618
4619
4620

4621
4622

4623
4624
4625
4626
4627

4628



4629



4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640

4641
4642
4643
4644
4645
4646

4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657



4658
4659
4660
4661
4662
4663

4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674

4675
4676
4677
4678
4679

4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700

4701

4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714

4715

4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740

4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755

4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768



4769
4770
4771
4772

4773
4774
4775



4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797

4798
4799
4800
4801
4802
4803

4804
4805
4806

4807
4808


4809

4810
4811
4812
4813

4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826

4827



4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840




4841
4842
4843

4844
4845
4846
4847
4848
4849
4850
4851

4852
4853
4854
4855


4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867

4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886

4887
4888
4889

4890
4891


4892
4893
4894
4895
4896
4897
4898

4899


4900

4901
4902

4903

4904
4905



4906
4907
4908
4909
4910
4911
4912
4913

4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926





4927
4928
4929
4930
4931



4932

4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947

4948

4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984

4985
4986
4987
4988
4989
4990
4991

4992
4993
4994
4995

4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053

5054
5055


5056
5057
5058
5059
5060
5061
5062


5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117

5118
5119
5120
5121
5122
5123


5124
5125
5126
5127
5128
5129
5130
5131
5132
5133
5134
5135
5136
5137
5138

5139
5140
5141
5142
5143

5144
5145
5146
5147
5148
5149
5150
5151

5152
5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176



5177
5178











5179
5180
5181

5182
5183
5184
5185
5186
5187
5188
5189
5190
5191
5192
5193
5194
5195
5196
5197
5198
5199
5200
5201
5202
5203
5204
5205
5206
5207
5208
5209
5210
5211
5212
5213
5214
5215
5216
5217
5218
5219
5220
5221
5222

5223
5224
5225
5226



5227
5228
5229
5230
5231
5232

5233
5234
5235
5236
5237
5238
5239

5240
5241
5242
5243
5244
5245
5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256


5257
5258
5259
5260
5261
5262

5263
5264

5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275

5276
5277
5278
5279

5280
5281
5282
5283
5284
5285
5286
5287
5288
5289
5290
5291

5292
5293
5294
5295


5296
5297

5298
5299

5300

5301

5302
5303
5304
5305

5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317


5318
5319
5320
5321
5322

5323
5324
5325
5326

5327
5328
5329
5330
5331
5332
5333
5334
5335
5336
5337
5338
5339
5340
5341
5342
5343
5344
5345
5346
5347
5348
5349
5350
5351
5352
5353
5354
5355
5356
5357
5358
5359
5360
5361

5362
5363
5364
5365

5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376

5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
5388
5389
5390
5391
5392
5393

5394
5395
5396
5397
5398
5399

5400
5401
5402
5403
5404
5405
5406
5407
5408
5409
5410

5411
5412
5413
5414
5415
5416


5417
5418

5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
5443
5444
5445

5446
5447
5448
5449
5450
5451

5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480



5481


5482


5483



5484

5485


5486

5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497

5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517

5518
5519
5520
5521
5522
5523
5524
5525
5526

5527
5528
5529
5530
5531
5532
5533

5534
5535
5536

5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557

5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587

5588
5589
5590
5591
5592
5593
5594
5595

5596
5597
5598

5599
5600
5601
5602
5603
5604

5605
5606
5607
5608

5609
5610
5611
5612
5613
5614
5615
5616
5617
5618
5619
5620
5621
5622
5623
5624
5625

5626
5627
5628


5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640

5641
5642
5643
5644
5645
5646
5647
5648
5649
5650
5651
5652
5653

5654
5655
5656
5657
5658
5659
5660
5661
5662
5663
5664
5665
5666
5667
5668
5669
5670

5671
5672
5673
5674
5675
5676
5677

5678
5679
5680
5681
5682

5683
5684
5685
5686
5687
5688
5689
5690

5691
5692
5693
5694
5695
5696


5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715

5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726

5727



5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740

5741
5742
5743
5744
5745
5746
5747

5748
5749
5750
5751
5752

5753
5754
5755
5756
5757
5758
5759
5760
5761
5762
5763
5764
5765
5766
5767
5768
5769

5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784
5785
5786
5787
5788

5789
5790
5791

5792
5793
5794
5795
5796
5797
5798
5799
5800
5801

5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813

5814
5815
5816
5817
5818
5819
5820
5821
5822
5823

5824
5825
5826
5827
5828
5829
5830
5831
5832
5833
5834
5835

5836
5837
5838
5839
5840
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850

5851
5852
5853

5854
5855
5856
5857
5858
5859
5860
5861
5862
5863
5864
5865
5866
5867
5868
5869

5870
5871
5872
5873
5874
5875
5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887
5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901

5902
5903
5904
5905
5906
5907
5908

5909
5910
5911

5912
5913
5914
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925

5926
5927
5928


5929
5930
5931
5932
5933
5934

5935
5936
5937
5938
5939
5940
5941
5942

5943


5944
5945
5946
5947
5948
5949
5950

5951
5952
5953
5954
5955
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971

5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996

5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007

6008
6009
6010

6011
6012

6013
6014
6015
6016
6017
6018
6019
6020
6021
6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034

6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
6050
6051
6052
6053

6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069

6070
6071



6072

6073

6074
6075

6076
6077
6078
6079
6080
6081
6082
6083

6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099

6100
6101

6102
6103
6104
6105
6106
6107

6108
6109
6110
6111
6112

6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139

6140
6141
6142
6143
6144
6145
6146
6147

6148
6149
6150
6151
6152
6153
6154
6155
6156

6157

6158
6159



6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170

6171
6172
6173
6174
6175

6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186

6187
6188
6189

6190
6191
6192

6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220

6221
6222
6223

6224
6225


6226
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237

6238
6239

6240
6241
6242
6243

6244
6245
6246

6247









6248
6249
6250
6251
6252
6253
6254
6255
6256
6257
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286

6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308

6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336

6337
6338









6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363


6364
6365
6366
6367
6368
6369

6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385

6386
6387
6388
6389

6390
6391
6392
6393

6394
6395


6396







6397
6398
6399

6400
6401
6402
6403
6404
6405

6406
6407
6408


6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448

6449


6450

6451
6452
6453





6454









6455
6456


6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492

6493
6494

6495
6496
6497
6498
6499
6500
6501
6502
6503

6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516

6517


6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531

6532

6533

6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545

6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557

6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577

6578
6579
6580
6581
6582


6583
6584
6585
6586
6587

6588
6589
6590
6591
6592
6593
6594
6595
6596
6597
6598

6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619

6620
6621
6622
6623
6624


6625
6626
6627
6628
6629
6630

6631
6632
6633
6634
6635
6636
6637
6638
6639
6640
6641
6642


6643
6644
6645
6646
6647
6648
6649
6650
6651
6652

6653

6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
6667
6668
6669

6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683

6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701

6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725


6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743

6744
6745
6746
6747
6748
6749

6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761
6762
6763
6764

6765
6766
6767
6768
6769
6770
6771
6772
6773
6774
6775
6776

6777
6778
6779
6780

6781
6782
6783
6784
6785
6786
6787
6788
6789

6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811
6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836
6837
6838
6839
6840
6841
6842
6843
6844
6845
6846

6847
6848
6849
6850
6851

6852
6853
6854
6855
6856
6857
6858
6859


6860
6861
6862
6863
6864
6865
6866
6867
6868
6869
6870
6871
6872

6873
6874
6875
6876
6877
6878

6879
6880
6881
6882
6883
6884
6885
6886
6887
6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903

6904
6905

6906


6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921

6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936
6937
6938
6939

6940


6941


6942


6943
6944
6945
6946
6947
6948
6949
6950
6951


6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964
6965

6966
6967
6968
6969
6970
6971

6972
6973
6974
6975
6976
6977
6978
6979
6980
6981
6982
6983
6984
6985
6986
6987
6988

6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005

7006
7007
7008
7009
7010


7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
7049
7050
7051
7052
7053
7054
7055
7056

7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071

7072
7073
7074
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091

7092
7093
7094
7095
7096
7097
7098
7099
7100

7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117

7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132

7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152
7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167

7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194

7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208

7209
7210
7211
7212
7213
7214
7215
7216
7217
7218

7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238

7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255

7256
7257
7258
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268

7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294

7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309


7310



7311
7312
7313
7314
7315
7316
7317
7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333

7334
7335
7336
7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367
7368
7369
7370
7371
7372
7373
7374
7375
7376
7377


7378
7379
7380
7381
7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392
7393

7394

7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413
7414
7415
7416
7417

7418
7419
7420
7421
7422
7423
7424
7425
7426

7427
7428
7429
7430
7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441

7442
7443
7444
7445
7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468

7469

7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487

7488
7489
7490
7491
7492
7493
7494
7495
7496
7497
7498


7499
7500
7501
7502
7503
7504
7505
7506

7507
7508
7509
7510
7511
7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522
7523
7524
7525
7526
7527
7528

7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541
7542
7543
7544
7545
7546
7547

7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558

7559
7560


7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590
7591
7592
7593
7594
7595
7596
7597

7598

7599
7600
7601
7602
7603

7604
7605
7606
7607
7608
7609
7610


7611
7612
7613
7614
7615



7616
7617
7618
7619


7620
7621
7622
7623
7624
7625
7626
7627
7628
7629

7630

7631
7632
7633
7634
7635

7636
7637
7638
7639
7640
7641
7642
7643
7644
7645



7646
7647
7648
7649
7650
7651
7652
7653
7654
7655
7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678

7679
7680





7681
7682
7683
7684
7685

7686
7687

7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701


7702
7703
7704


7705
7706
7707
7708
7709
7710
7711
7712
7713
7714

7715
7716
7717
7718
7719
7720
7721
7722
7723
7724
7725
7726
7727
7728
7729
7730
7731
7732
7733
7734
7735
7736
7737
7738
7739
7740
7741
7742
7743

7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755
7756
7757
7758
7759
7760
7761
7762

7763




7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777
7778
7779
7780
7781
7782
7783

7784
7785
7786
7787
7788
7789
7790
7791
7792
7793
7794
7795
7796
7797
7798
7799
7800
7801
7802
7803
7804
7805
7806
7807


7808



7809
7810
7811
7812


7813
7814
7815
7816
7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846

7847
7848
7849
7850
7851


7852
7853



7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868

7869
7870
7871
7872
7873
7874
7875
7876
7877
7878
7879
7880
7881
7882
7883
7884
7885
7886
7887
7888

7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917
7918
7919
7920
7921
7922
7923
7924
7925
7926
7927
7928


7929
7930




7931

7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947
7948
7949
7950
7951
7952
7953
7954
7955
7956
7957
7958
7959
7960
7961
7962
7963
7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990
7991

7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019

8020
8021
8022
8023
8024
8025
8026
8027
8028
8029

8030
8031
8032
8033
8034
8035

8036
8037
8038
8039
8040
8041
8042
8043


8044
8045


8046
8047
8048
8049
8050

8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064
8065
8066
8067
8068
8069

8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096

8097
8098
8099
8100
8101
8102
8103
8104
8105


8106
8107


8108

8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120



8121
8122
8123
8124
8125
8126
8127
8128

8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
8141
8142
8143
8144
8145
8146
8147

8148
8149

8150
8151
8152
8153
8154
8155

8156
8157
8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169

8170
8171
8172
8173
8174
8175
8176
8177
8178
8179

8180
8181
8182
8183
8184
8185
8186
8187
8188
8189
8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201
8202
8203
8204
8205
8206
8207
8208

8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228
8229
8230
8231
8232
8233

8234
8235
8236
8237
8238
8239
8240
8241
8242
8243
8244
8245
8246
8247
8248
8249
8250
8251
8252
8253
8254
8255
8256
8257
8258

8259
8260
8261

8262
8263
8264


8265
8266
8267
8268
8269
8270
8271
8272
8273
 */
#ifdef USE_MANUAL
#include "tool_hugehelp.h"
#include <zlib.h>
#include "memdebug.h" /* keep this as LAST include */
static const unsigned char hugehelpgz[] = {
  /* This mumbo-jumbo is the huge help text compressed with gzip.
     Thanks to this operation, the size of this data shrank from 167622
     to 47001 bytes. You can disable the use of compressed help
     texts by NOT passing -c to the mkhelp.pl tool. */
  0x1f, 0x8b, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xbd,
  0x7b, 0x77, 0xdc, 0xc6, 0xb1, 0x2f, 0xfa, 0xbf, 0x3f, 0x05, 0x36, 0xb3,
  0x72, 0x48, 0xee, 0xcc, 0x0c, 0x1f, 0x7a, 0x59, 0x8a, 0x9c, 0x6d, 0x45,
  0xa2, 0x6c, 0x6e, 0x53, 0x22, 0x0f, 0x87, 0xb2, 0x9d, 0x1b, 0x7b, 0x69,
  0x61, 0x66, 0x30, 0x24, 0xa2, 0x19, 0x60, 0x02, 0x60, 0xf8, 0xc8, 0x3e,
  0xb9, 0x9f, 0xfd, 0x76, 0xfd, 0xaa, 0xaa, 0xbb, 0x81, 0x6e, 0x0c, 0x69,
  0xc7, 0xf6, 0x79, 0xdd, 0xec, 0xb5, 0x2d, 0x89, 0x04, 0x1a, 0xfd, 0xa8,
  0xae, 0x77, 0xfd, 0x2a, 0x49, 0xee, 0xfb, 0xdf, 0x47, 0xfc, 0xff, 0x47,
  0xf3, 0x3f, 0xf3, 0xe7, 0x67, 0x49, 0x72, 0x56, 0x95, 0x7f, 0xcb, 0xa6,
  0x4d, 0xfc, 0xd9, 0x8f, 0x1f, 0xff, 0x47, 0xc2, 0xff, 0x67, 0xde, 0xf9,

  0xc1, 0xfc, 0xf9, 0xd9, 0xc6, 0xb1, 0xf7, 0x12, 0xf7, 0xc2, 0xff, 0xf8,
  0xb8, 0x9b, 0xdc, 0xf7, 0xc2, 0xff, 0x48, 0x76, 0xf0, 0xc2, 0x47, 0xf9,
  0xc2, 0x4b, 0xfa, 0xfb, 0xc7, 0x8f, 0x9b, 0x3f, 0xf2, 0x03, 0xcd, 0x8a,
  0xfe, 0xb3, 0x47, 0xef, 0xfd, 0xf0, 0x91, 0xfe, 0x6a, 0x7e, 0xf2, 0xd9,
  0x67, 0xef, 0x5f, 0xbd, 0x3b, 0xd2, 0x57, 0xa7, 0xeb, 0x6a, 0x91, 0x0c,
  0x93, 0xa6, 0x4a, 0x8b, 0x7a, 0x9e, 0x55, 0x49, 0x9a, 0x7c, 0x38, 0x3f,
  0xf9, 0xec, 0xb3, 0xf1, 0x5f, 0xde, 0x9f, 0x9e, 0x8d, 0x8f, 0xc7, 0xad,

  0xc7, 0xfe, 0x5a, 0xae, 0x9a, 0xbc, 0x2c, 0x6a, 0x33, 0x7d, 0xf3, 0x50,
  0xfd, 0xe3, 0x67, 0x9f, 0xbd, 0x39, 0x1a, 0xbf, 0x3e, 0x3f, 0x3e, 0xbb,
  0x38, 0x3e, 0x7d, 0xdf, 0x7a, 0x32, 0xc9, 0xeb, 0xc4, 0x0c, 0xd5, 0x94,
  0xe5, 0xc2, 0xfc, 0xc7, 0x8d, 0x3e, 0x4b, 0x9b, 0x34, 0x99, 0x57, 0xe5,
  0x32, 0x29, 0x2b, 0xfa, 0x45, 0x9a, 0xd4, 0x59, 0x75, 0x9d, 0x55, 0x83,
  0x64, 0x5d, 0xe7, 0xc5, 0x65, 0x52, 0x16, 0x59, 0x52, 0xce, 0x93, 0xe6,
  0x2a, 0xd3, 0xe1, 0xea, 0xf5, 0x6a, 0x55, 0x56, 0x4d, 0x36, 0x4b, 0x56,
  0x55, 0xd9, 0x94, 0xd3, 0x72, 0x51, 0x27, 0x3b, 0x6f, 0x8e, 0x5f, 0x5f,
  0x0c, 0x92, 0xb7, 0xc7, 0x27, 0x47, 0xe6, 0xbf, 0x17, 0x67, 0xf8, 0xcf,
  0x78, 0x90, 0x7c, 0x75, 0x7a, 0xf6, 0xf5, 0xd1, 0xf9, 0x20, 0xf9, 0xfa,
  0x82, 0x7e, 0x46, 0xff, 0x35, 0x3f, 0x4c, 0x8e, 0xdf, 0xbd, 0x3a, 0x1b,
  0xe8, 0x70, 0xf4, 0x0f, 0xfa, 0xe1, 0xc9, 0x1b, 0xf3, 0x43, 0xfe, 0x83,
  0xfe, 0x79, 0x76, 0x7a, 0xf6, 0x48, 0xfe, 0xa0, 0x7f, 0x9e, 0x5f, 0xbc,
  0x33, 0xbf, 0x3d, 0xbf, 0x18, 0x9b, 0xff, 0x8e, 0x5f, 0xd3, 0x7f, 0xf0,
  0x95, 0xf1, 0xbb, 0x3f, 0xe3, 0x3f, 0x63, 0x3b, 0xdc, 0xf8, 0x1d, 0xff,
  0x1c, 0x5f, 0xba, 0x38, 0x3a, 0x79, 0x7f, 0x74, 0x91, 0xa4, 0xc5, 0x2c,
  0xb9, 0x30, 0xcf, 0xef, 0x8e, 0x92, 0x8b, 0xab, 0x2c, 0x99, 0x96, 0xcb,
  0x25, 0xfd, 0xc8, 0xec, 0xc8, 0x2c, 0xab, 0xf3, 0xcb, 0xc2, 0x2c, 0xc5,
  0xac, 0xfc, 0xa6, 0xac, 0x3e, 0x25, 0xc9, 0x4d, 0xde, 0x5c, 0x95, 0xeb,
  0x46, 0x87, 0x5b, 0x9b, 0xdd, 0x48, 0xf2, 0xa2, 0xc9, 0xaa, 0x74, 0x4a,

  0x3b, 0x3d, 0xfa, 0xac, 0xb5, 0xab, 0xe5, 0xdc, 0xec, 0x61, 0x6d, 0x36,
  0x6d, 0xb2, 0xae, 0x17, 0x65, 0x3a, 0xa3, 0xad, 0x32, 0xaf, 0xcc, 0xd7,
  0x66, 0x93, 0xab, 0x7c, 0xfa, 0xa9, 0x4e, 0x16, 0xf9, 0xa7, 0x8c, 0x36,
  0xea, 0xf6, 0x4e, 0x37, 0x6e, 0xc0, 0x83, 0xa6, 0x6b, 0xb3, 0xa7, 0xc5,
  0x50, 0x87, 0x6b, 0xf2, 0x69, 0x4a, 0x1f, 0xc0, 0xce, 0x25, 0xeb, 0x15,
  0x8d, 0xc6, 0x3b, 0x96, 0xac, 0xca, 0xda, 0xbc, 0x34, 0x1e, 0x9f, 0x98,
  0x99, 0x17, 0x45, 0x86, 0x79, 0xd4, 0x03, 0xf3, 0x8f, 0xf2, 0x53, 0x9e,
  0x99, 0xbf, 0xcc, 0xf3, 0x45, 0x96, 0xf0, 0x89, 0xda, 0xe1, 0xe8, 0x68,

  0x93, 0x2a, 0xab, 0xd7, 0xcb, 0xcc, 0xec, 0xde, 0xbb, 0xac, 0x49, 0x17,
  0x79, 0xf1, 0xc9, 0xfc, 0x95, 0x16, 0xbe, 0x2c, 0xab, 0x6c, 0x94, 0xbc,
  0xaa, 0x93, 0xbb, 0x72, 0x6d, 0x16, 0xbc, 0x58, 0x98, 0x33, 0xcf, 0x92,
  0x49, 0xb6, 0x28, 0x6f, 0x06, 0x74, 0xd2, 0x49, 0xb1, 0x5e, 0x4e, 0xcc,
  0x00, 0xe5, 0xdc, 0x0d, 0x97, 0x36, 0x6b, 0x33, 0x1c, 0x3f, 0xbd, 0x4c,
  0xcd, 0x9a, 0xcc, 0xbb, 0x55, 0x72, 0x95, 0x99, 0x35, 0xd7, 0xab, 0xbc,
  0xf8, 0xb7, 0xf6, 0xbe, 0x98, 0xad, 0x5d, 0x95, 0x37, 0x59, 0x65, 0x76,

  0x76, 0x72, 0x97, 0x98, 0x4d, 0x98, 0x30, 0x11, 0xce, 0x0d, 0x91, 0x25,
  0xa9, 0x19, 0xc2, 0x12, 0xe0, 0xb0, 0xca, 0x16, 0x29, 0x11, 0x93, 0xfd,
  0xc6, 0xc8, 0x1c, 0x62, 0x66, 0xa9, 0x4d, 0x5e, 0xdd, 0x79, 0xb4, 0x8b,
  0x97, 0x67, 0x66, 0x25, 0xf9, 0xa2, 0x36, 0xc7, 0x40, 0x97, 0x42, 0x9e,
  0xa1, 0x43, 0x25, 0xfa, 0x37, 0xb4, 0x79, 0x57, 0x34, 0xe9, 0x2d, 0x3e,
  0x2f, 0xb4, 0x39, 0x9c, 0x65, 0xab, 0xac, 0x98, 0x65, 0x45, 0x33, 0x4a,
  0xfe, 0x52, 0xae, 0xb7, 0xcd, 0xb7, 0xe7, 0xb9, 0xd9, 0x83, 0x54, 0x86,
  0x32, 0x5f, 0x36, 0x44, 0x30, 0xad, 0xf2, 0x95, 0x77, 0x14, 0x65, 0x61,
  0xce, 0x3c, 0x39, 0x7f, 0xfb, 0x3a, 0x79, 0xf4, 0xfc, 0xf3, 0xa7, 0xee,
  0xcc, 0xcd, 0x00, 0xc9, 0x34, 0x2d, 0xcc, 0x8a, 0xb3, 0x69, 0x3e, 0xbf,
  0x4b, 0x96, 0xeb, 0x45, 0x93, 0xaf, 0xcc, 0xee, 0xd3, 0xe5, 0xa3, 0x0b,
  0xb4, 0x4a, 0xab, 0xa6, 0x26, 0x22, 0xc0, 0x0f, 0xb0, 0xf6, 0x9b, 0x2a,
  0x6f, 0xe8, 0x22, 0xe1, 0x77, 0x66, 0x86, 0x59, 0x53, 0xeb, 0x70, 0x44,

  0x6b, 0xe6, 0x3b, 0x13, 0x43, 0x5b, 0x66, 0x6b, 0xd3, 0xda, 0x7c, 0xf4,
  0xc5, 0x67, 0x8e, 0x83, 0x5c, 0x35, 0xcd, 0xea, 0xc5, 0xde, 0x5e, 0x9d,
  0x37, 0xd9, 0xe8, 0xbf, 0xcc, 0x3d, 0x1c, 0x34, 0x37, 0xe5, 0xa0, 0xb9,
  0xaa, 0xb2, 0xec, 0x9f, 0x23, 0x43, 0xc3, 0xf6, 0x49, 0xf3, 0xdd, 0x3b,
  0x99, 0xd8, 0x65, 0xd6, 0x98, 0x2f, 0xfc, 0x7d, 0x9d, 0x15, 0x34, 0xa2,
  0x99, 0x47, 0xba, 0x58, 0x5d, 0xa5, 0xe6, 0x38, 0x33, 0x43, 0x8d, 0x74,

  0xb3, 0x0d, 0xc1, 0xd0, 0xac, 0xf8, 0x6e, 0xff, 0xf5, 0xc7, 0xf0, 0xa3,
  0x73, 0x7c, 0xd3, 0xfc, 0x77, 0x94, 0xdd, 0xa6, 0x4b, 0xb3, 0x36, 0xfa,

  0xd4, 0x1e, 0x91, 0xd8, 0x5f, 0x0f, 0x86, 0x07, 0xfb, 0xfb, 0x3f, 0x8e,

  0x9a, 0xdb, 0xe6, 0x61, 0xcf, 0xef, 0xef, 0xbb, 0x37, 0xe8, 0xd1, 0x1d,
  0x5a, 0x6f, 0xb2, 0x30, 0x24, 0x43, 0x1f, 0xff, 0x47, 0x56, 0x95, 0xf5,
  0xee, 0xc3, 0x46, 0x4a, 0x87, 0xff, 0x68, 0x7f, 0xf7, 0x7d, 0x56, 0x83,
  0x66, 0xdc, 0x5a, 0x93, 0xb4, 0x32, 0x74, 0x5b, 0x36, 0x8e, 0x3d, 0x0d,
  0xcc, 0xa5, 0x6c, 0xec, 0xce, 0x98, 0x3b, 0x67, 0x9e, 0x36, 0x8c, 0x2d,
  0x5d, 0x10, 0x4f, 0xab, 0x93, 0x22, 0xbb, 0xb5, 0xb7, 0xdc, 0xdc, 0xfe,
  0x2c, 0x9d, 0x5e, 0x25, 0xa5, 0x21, 0xfe, 0x2a, 0x72, 0x04, 0xfe, 0x84,
  0xd2, 0x6a, 0x7a, 0x95, 0x5f, 0x9b, 0xdd, 0x78, 0xfe, 0xfc, 0xe9, 0xd0,
  0xfc, 0xe7, 0xf9, 0x8f, 0x7b, 0xd7, 0xe5, 0xc2, 0x6c, 0xce, 0xe3, 0x1f,
  0xf7, 0xe8, 0x88, 0xff, 0x2b, 0x1d, 0x4c, 0x06, 0xd3, 0x7f, 0x8e, 0xae,
  0x9a, 0xe5, 0xa2, 0x97, 0x70, 0xd2, 0xc2, 0xfc, 0xff, 0xb2, 0x5c, 0x17,
  0x8d, 0x25, 0x16, 0x43, 0x73, 0x8d, 0xc7, 0x9c, 0xcc, 0x75, 0x35, 0x77,
  0x94, 0x48, 0x9b, 0x68, 0x88, 0x6e, 0x9d, 0xb9, 0xa0, 0xee, 0x3a, 0x36,
  0xd3, 0x2b, 0x5a, 0xbf, 0xa1, 0x9e, 0x54, 0x36, 0xa1, 0xc9, 0x53, 0xba,
  0x99, 0x86, 0x41, 0x10, 0xc3, 0xc2, 0x58, 0xfc, 0xb5, 0xdc, 0x3c, 0x58,
  0x56, 0xb3, 0xac, 0x1a, 0x75, 0xa7, 0x61, 0xaf, 0xac, 0xf7, 0xcd, 0x44,
  0x25, 0x0a, 0xfd, 0x00, 0x13, 0x5b, 0xe6, 0xb7, 0x66, 0x04, 0x30, 0xcc,
  0x02, 0x13, 0xe7, 0xd1, 0x12, 0x9a, 0x31, 0x3e, 0xa3, 0xef, 0xbb, 0x2b,
  0x6b, 0xa6, 0xde, 0x5a, 0x3a, 0x3e, 0xea, 0x16, 0x9f, 0x98, 0xc3, 0x5b,
  0x99, 0xb7, 0xd6, 0xc4, 0x57, 0x71, 0xad, 0x69, 0x18, 0xc3, 0x10, 0x2e,
  0xcd, 0xb9, 0x98, 0xb3, 0x20, 0x2a, 0xa6, 0xa3, 0xba, 0x4b, 0xde, 0x1b,
  0x82, 0x61, 0x66, 0xe4, 0x11, 0xfb, 0x22, 0x6b, 0x9a, 0x7b, 0x8f, 0xc9,
  0x51, 0xec, 0x8b, 0x83, 0x80, 0x68, 0xfb, 0x9e, 0x37, 0x74, 0xf6, 0xe2,
  0xb0, 0xfd, 0xf0, 0x77, 0x86, 0x49, 0xbb, 0xeb, 0x62, 0xbe, 0xfe, 0x5f,
  0xff, 0xf4, 0xa8, 0xee, 0x86, 0x7e, 0x9b, 0x17, 0xd7, 0xe5, 0x27, 0xb3,
  0x45, 0x90, 0xa2, 0x69, 0x7b, 0x37, 0x89, 0x0f, 0x2d, 0x57, 0x8d, 0x15,
  0x4f, 0x44, 0x8e, 0xe6, 0x47, 0x93, 0x74, 0xb2, 0xb8, 0x4b, 0xae, 0xd2,
  0xeb, 0x8c, 0xd6, 0xbb, 0x32, 0x74, 0x4a, 0x3b, 0x60, 0xc4, 0xc6, 0x02,
  0x7c, 0x4c, 0x18, 0xc3, 0xac, 0x5c, 0x4f, 0x0c, 0x73, 0xf9, 0xfb, 0xba,
  0x6c, 0x78, 0x63, 0xd2, 0xeb, 0x32, 0x9f, 0xb5, 0x64, 0xf1, 0x55, 0x46,
  0x0c, 0x8d, 0x3e, 0x0c, 0x21, 0x65, 0x18, 0x2a, 0xcd, 0x14, 0x17, 0x2d,
  0x6f, 0x48, 0xdc, 0x19, 0x56, 0x98, 0x2e, 0xea, 0x32, 0x49, 0x2e, 0x4b,
  0xba, 0x25, 0x60, 0xc0, 0x20, 0x73, 0x73, 0x28, 0x57, 0x29, 0x49, 0x35,
  0x23, 0xc0, 0xec, 0x3d, 0xa8, 0x32, 0xf0, 0x62, 0x9c, 0x54, 0xba, 0x18,
  0xb0, 0xf4, 0xa2, 0x77, 0x64, 0xab, 0x92, 0xed, 0xff, 0xb6, 0x3d, 0x48,
  0xb6, 0xff, 0x63, 0x1b, 0xf4, 0xb0, 0xfd, 0xef, 0xdb, 0xee, 0x9c, 0x8d,
  0x32, 0x76, 0x9d, 0xcf, 0x32, 0x26, 0x89, 0xe3, 0xb3, 0xeb, 0xa7, 0xc9,
  0x3f, 0x48, 0x77, 0x30, 0xbc, 0x36, 0xbb, 0x55, 0x82, 0xd4, 0xb5, 0x99,
  0xb7, 0x13, 0xc3, 0x74, 0xd3, 0x15, 0x29, 0x11, 0x59, 0x35, 0x35, 0xd4,
  0x9b, 0x5e, 0x1a, 0x7a, 0x35, 0xb2, 0x58, 0x87, 0xa3, 0xf1, 0xe9, 0x15,
  0x5e, 0x96, 0x61, 0x90, 0x49, 0x91, 0x2e, 0xcd, 0x8d, 0x38, 0xa1, 0x19,
  0xe5, 0x45, 0x78, 0x98, 0x7f, 0x9d, 0x67, 0x9f, 0xef, 0xbf, 0x78, 0xf1,
  0xe8, 0xf7, 0x87, 0x4f, 0xb2, 0xe6, 0x6a, 0xff, 0xc7, 0x3d, 0xfb, 0xc8,
  0xf1, 0x1c, 0xdb, 0xae, 0xe4, 0xa7, 0x93, 0x30, 0x52, 0xde, 0x4a, 0x09,
  0xf3, 0xbe, 0xf9, 0x7b, 0x36, 0xcf, 0x6f, 0x07, 0xaa, 0x2f, 0xf1, 0x9d,

  0x4b, 0x0d, 0xa9, 0x99, 0xf3, 0x23, 0x16, 0xa1, 0xc3, 0x5d, 0xae, 0xb3,
  0xda, 0xec, 0xe4, 0xcd, 0x55, 0xda, 0x24, 0x76, 0x00, 0x3e, 0xd9, 0x65,
  0x7e, 0x79, 0xd5, 0x24, 0x37, 0x29, 0x09, 0x9b, 0xe3, 0x86, 0x87, 0x20,
  0x29, 0x6f, 0x44, 0xcc, 0x3c, 0x35, 0xb2, 0x82, 0xce, 0x10, 0x22, 0x7d,


  0xe2, 0x34, 0x8c, 0xc6, 0x90, 0x39, 0x1f, 0x88, 0x53, 0xa7, 0x26, 0x69,
  0x4d, 0x97, 0xb6, 0x30, 0xcc, 0xa1, 0x31, 0x3a, 0xc2, 0x9a, 0xfe, 0x75,
  0x65, 0xb4, 0x00, 0xec, 0x81, 0x4c, 0x14, 0x82, 0xf2, 0x2d, 0x1d, 0x27,
  0x9d, 0x8d, 0x15, 0x5e, 0xe6, 0x90, 0x06, 0x72, 0xcc, 0xf6, 0x8d, 0xda,
  0x5c, 0x38, 0xc3, 0x99, 0x2c, 0x65, 0x6c, 0x11, 0x93, 0xdd, 0xe2, 0x75,
  0x62, 0x8e, 0x69, 0x4d, 0x8a, 0x02, 0xab, 0x03, 0x66, 0xf2, 0xde, 0x62,

  0xcd, 0xa6, 0xa5, 0x9f, 0x48, 0x25, 0xe9, 0x28, 0x3e, 0x78, 0x6d, 0x56,
  0x1a, 0x22, 0x33, 0xb3, 0x35, 0xcc, 0x98, 0x56, 0x46, 0x2c, 0x16, 0xbb,
  0x02, 0x22, 0x37, 0x63, 0xd2, 0x0f, 0xf3, 0x86, 0x64, 0x0c, 0x74, 0x58,
  0x33, 0x5f, 0xb3, 0x29, 0x50, 0x44, 0x0d, 0xa3, 0xf6, 0xd6, 0x0f, 0xf1,
  0x68, 0x9e, 0x4d, 0xae, 0x8d, 0x96, 0x62, 0x14, 0xd2, 0xcc, 0xbe, 0x05,
  0x79, 0x3e, 0x25, 0xdd, 0x68, 0x61, 0xee, 0xcb, 0xb4, 0xac, 0x2a, 0xd2,
  0xf7, 0xe9, 0x04, 0x27, 0xcc, 0x44, 0x97, 0x99, 0x51, 0x23, 0xfc, 0xed,
  0xcc, 0x49, 0xa0, 0x19, 0xfe, 0x62, 0xf4, 0x12, 0x70, 0x10, 0xa3, 0x3f,
  0x80, 0xe7, 0x63, 0xe1, 0x98, 0x1d, 0x8d, 0x3d, 0x9d, 0x66, 0xab, 0xa6,
  0x8e, 0xad, 0x49, 0x0f, 0xdc, 0x4c, 0xa7, 0xca, 0x68, 0xe7, 0x7d, 0xa5,
  0x0b, 0xfb, 0x6a, 0x85, 0x3e, 0xf4, 0x2e, 0xd5, 0x63, 0x8c, 0x1e, 0x56,
  0xdb, 0x5d, 0x6b, 0x40, 0x1b, 0x86, 0x8d, 0x61, 0xcf, 0x97, 0x34, 0x51,
  0x7a, 0xb8, 0xe6, 0x9b, 0x0a, 0xd6, 0x4c, 0x07, 0xc9, 0x9a, 0x36, 0x7f,
  0x97, 0x44, 0x97, 0xd9, 0x4f, 0x3b, 0xb8, 0xf9, 0xaa, 0x3d, 0x53, 0xfa,
  0x3c, 0xa9, 0xf8, 0x46, 0x92, 0xcf, 0xea, 0x2b, 0xa3, 0x7c, 0xd5, 0x72,
  0xb3, 0xf3, 0xa5, 0xa1, 0x99, 0x6b, 0x3a, 0xdf, 0x55, 0x96, 0xcd, 0x46,
  0xc9, 0xe9, 0x9c, 0xb8, 0x6a, 0x65, 0x26, 0xdd, 0xe0, 0xd7, 0x24, 0x55,
  0xcc, 0xbe, 0xcd, 0xa0, 0xc4, 0xdb, 0xab, 0xc5, 0x53, 0xf1, 0xa4, 0x03,
  0x38, 0x79, 0x6a, 0x7e, 0x62, 0x66, 0xbb, 0x68, 0x8b, 0x20, 0xdc, 0x43,
  0xc3, 0xbd, 0x69, 0x7a, 0x93, 0x2c, 0x01, 0x25, 0x4e, 0xb2, 0xe6, 0x26,
  0xcb, 0xec, 0x70, 0x75, 0x66, 0xc4, 0x1e, 0x1d, 0x1a, 0x6b, 0x7e, 0x60,




  0x86, 0xb4, 0xb5, 0x67, 0xe7, 0xa7, 0x5f, 0x9d, 0x1f, 0x8d, 0xc7, 0xc9,
  0xbb, 0xa3, 0x8b, 0xa3, 0xf3, 0xd6, 0x4e, 0x17, 0x65, 0xb5, 0xc4, 0x89,
  0xce, 0xf2, 0x7a, 0xb5, 0x48, 0xef, 0xe8, 0xa8, 0xcd, 0x4a, 0x2e, 0x2b,
  0xba, 0x59, 0xcb, 0x8c, 0xa4, 0xc2, 0x6c, 0x0d, 0x4e, 0x66, 0xc4, 0x91,
  0x39, 0x3e, 0xd1, 0x78, 0x89, 0x99, 0x40, 0x4d, 0x2e, 0x2e, 0xdd, 0x4e,
  0x1b, 0x8e, 0x23, 0x92, 0x94, 0x44, 0xa9, 0x3d, 0x0f, 0x52, 0x3d, 0x61,
  0xdc, 0x0c, 0xdc, 0xcf, 0x78, 0x9b, 0x58, 0xb4, 0x19, 0x9a, 0xcd, 0x97,
  0x60, 0x76, 0xe6, 0x4f, 0xa7, 0x6d, 0x66, 0x73, 0xa3, 0x6a, 0x1b, 0xe9,
  0xca, 0x96, 0x42, 0x77, 0x4e, 0x3a, 0x5b, 0xab, 0x1f, 0x1b, 0x32, 0x24,
  0xd6, 0x4c, 0x03, 0xf2, 0x54, 0xf8, 0x0b, 0x96, 0x89, 0x19, 0x9d, 0x84,
  0x78, 0x9f, 0x3c, 0xb6, 0xa2, 0x29, 0x64, 0xe6, 0x64, 0x67, 0x3c, 0x7c,
  0xbd, 0x9e, 0xe3, 0x22, 0x27, 0x3b, 0x46, 0x33, 0x7f, 0x67, 0xac, 0x25,
  0x63, 0xb1, 0x0c, 0x92, 0xb3, 0x5d, 0xbc, 0x77, 0xb0, 0x7f, 0xf8, 0x98,
  0x19, 0xc1, 0x48, 0x87, 0x7b, 0xeb, 0x31, 0xe2, 0x83, 0x4f, 0x74, 0xbc,
  0xfc, 0x10, 0x0d, 0x3e, 0x4a, 0x0e, 0xde, 0xf1, 0x4f, 0x1e, 0x7f, 0xfe,
  0xe4, 0xd9, 0x53, 0xf9, 0x61, 0x9b, 0xc0, 0xed, 0xfc, 0x41, 0x1d, 0xb0,
  0xfc, 0xc8, 0x14, 0x34, 0x33, 0x31, 0xab, 0x5b, 0xe6, 0x85, 0xb9, 0x26,
  0xe6, 0x5a, 0x09, 0xaf, 0x22, 0x7a, 0x36, 0x93, 0x9f, 0x33, 0x67, 0x93,
  0x73, 0x6d, 0x9b, 0x94, 0xe6, 0x65, 0x43, 0xb2, 0x86, 0x97, 0xdb, 0x43,
  0x62, 0x35, 0xa1, 0xa1, 0x89, 0xa4, 0x13, 0x62, 0xb0, 0x64, 0x57, 0x19,
  0x05, 0x38, 0x8b, 0x7e, 0xcd, 0x4a, 0x45, 0xf3, 0x86, 0x99, 0x9b, 0x91,
  0x89, 0x24, 0xe6, 0xc2, 0x7d, 0x37, 0xac, 0x00, 0x1c, 0xf2, 0x26, 0xaf,
  0xc1, 0x1a, 0x6e, 0xca, 0xf5, 0xc2, 0x58, 0x31, 0xf4, 0xc0, 0x7a, 0x85,
  0x17, 0xcc, 0xa7, 0x56, 0x8e, 0x07, 0x18, 0x8d, 0x85, 0x68, 0xa7, 0x3b,
  0x8a, 0x99, 0x9a, 0xf9, 0xe7, 0xca, 0x90, 0x12, 0x4f, 0x67, 0xd4, 0x95,
  0x10, 0xe0, 0x7d, 0x01, 0x25, 0xd2, 0x9d, 0x07, 0xd3, 0x3e, 0x3b, 0x1d,

  0x5f, 0x90, 0x06, 0x70, 0xf6, 0xe1, 0xc2, 0x0c, 0x64, 0x54, 0x80, 0xba,
  0x31, 0x44, 0x49, 0x2f, 0x16, 0x19, 0x4c, 0x48, 0x1d, 0xce, 0xd0, 0x5e,
  0x0e, 0x46, 0x05, 0xb5, 0x46, 0x3f, 0xc9, 0x73, 0x64, 0x1b, 0x9b, 0xae,
  0xa0, 0x5a, 0xd8, 0x2c, 0xc3, 0xed, 0x3b, 0xc9, 0xce, 0x9f, 0x76, 0x0d,
  0xcd, 0x0e, 0x4b, 0xbb, 0x3b, 0xc3, 0xa1, 0xbc, 0x6a, 0xbe, 0x5d, 0xe7,
  0xcb, 0x7c, 0x91, 0x56, 0xde, 0xd4, 0x99, 0xa3, 0xd2, 0xfd, 0xb4, 0x7c,
  0x65, 0x6a, 0xa8, 0x06, 0xd3, 0x76, 0xa6, 0x24, 0xed, 0x21, 0xb8, 0x92,
  0x3b, 0xaa, 0x19, 0x29, 0x04, 0xd0, 0x98, 0x57, 0xb9, 0xdd, 0x3a, 0x3a,
  0x33, 0x62, 0x57, 0xad, 0x8d, 0xea, 0x9e, 0x5b, 0xb0, 0x71, 0x24, 0x91,
  0xe0, 0xa9, 0xb0, 0x5b, 0x97, 0x6c, 0x4d, 0xd2, 0x6a, 0x2b, 0xb1, 0xbc,
  0x98, 0xef, 0x26, 0xdd, 0x90, 0x2a, 0xbb, 0x5c, 0x9b, 0x15, 0x24, 0xbc,
  0xbb, 0xb4, 0xd2, 0xdf, 0x79, 0x2b, 0xd5, 0x01, 0x86, 0x13, 0x7a, 0x24,
  0xaf, 0xd9, 0xcc, 0x9c, 0x1b, 0xbb, 0x85, 0x2e, 0x8d, 0xea, 0xaf, 0xd0,
  0x68, 0x84, 0x62, 0x22, 0x04, 0xe3, 0xe9, 0xb5, 0xe6, 0xaa, 0x34, 0x99,
  0x61, 0x34, 0x60, 0xff, 0xf4, 0xe4, 0xd0, 0x1c, 0xd9, 0x70, 0x58, 0x9b,
  0xfd, 0x27, 0xdd, 0x7b, 0x25, 0x36, 0xfd, 0x29, 0x1c, 0x26, 0xd6, 0xb7,
  0x72, 0x2a, 0x3a, 0x30, 0xc4, 0x26, 0xbf, 0x0b, 0x16, 0x6a, 0x14, 0xd5,
  0x1b, 0xf3, 0xe1, 0xd4, 0x1c, 0x99, 0xb9, 0x70, 0xef, 0x68, 0xa3, 0xd8,

  0x37, 0x92, 0x58, 0xb5, 0x19, 0x94, 0x91, 0xd3, 0xbd, 0x4f, 0x9d, 0x2e,
  0x33, 0x9b, 0xe5, 0xf4, 0x5b, 0x73, 0xbf, 0x8c, 0x84, 0x5b, 0x67, 0xb0,
  0x3d, 0x64, 0x53, 0x97, 0x6e, 0x33, 0x61, 0xc6, 0xd6, 0x57, 0x25, 0x99,
  0x89, 0x5b, 0xcc, 0x8b, 0x87, 0xf4, 0xad, 0x2d, 0xc8, 0xf3, 0x65, 0xa2,
  0xdf, 0x92, 0x4f, 0x99, 0x75, 0xcc, 0x7c, 0xdd, 0x6c, 0x60, 0x04, 0xcd,
  0x9d, 0x67, 0x24, 0x80, 0x57, 0xf3, 0xdc, 0x2b, 0xab, 0xf0, 0x18, 0x91,
  0xba, 0x22, 0x65, 0x4a, 0x78, 0x38, 0x84, 0x21, 0xae, 0x6c, 0xcd, 0x53,
  0x1b, 0x98, 0xbd, 0xa5, 0x27, 0x2f, 0xaf, 0xf4, 0x51, 0x4f, 0xb0, 0xa6,
  0x66, 0x71, 0x24, 0x1c, 0xc8, 0x9e, 0x9e, 0x29, 0xdf, 0x2f, 0x2b, 0x66,
  0x66, 0x8b, 0xd2, 0xd0, 0xf2, 0x16, 0xab, 0xac, 0x32, 0x6d, 0x9a, 0x35,
  0xcd, 0x92, 0x76, 0x9c, 0xfd, 0x4c, 0xa5, 0x3d, 0x1b, 0x3b, 0x69, 0xd9,
  0xaf, 0xfa, 0xde, 0xa9, 0xb9, 0x8d, 0x1a, 0x63, 0x8f, 0x8c, 0xe8, 0xac,
  0x89, 0x8e, 0x75, 0xe7, 0x41, 0xde, 0x46, 0xd4, 0x6d, 0x37, 0x7c, 0x1f,
  0x61, 0x63, 0x75, 0x76, 0xbe, 0x06, 0xf9, 0x88, 0x20, 0xb3, 0x2b, 0x33,

  0x2b, 0x9a, 0xe5, 0x29, 0xe8, 0x84, 0x8f, 0x06, 0xca, 0x88, 0xb3, 0x08,


  0x23, 0x7a, 0xf0, 0x5d, 0xd7, 0xa0, 0x5b, 0x2c, 0x7c, 0x91, 0xa4, 0x73,

  0x1a, 0x9e, 0x9a, 0xb5, 0x9f, 0x60, 0x1d, 0xc3, 0xeb, 0x84, 0xae, 0x9f,
  0x31, 0x1b, 0xe8, 0x2e, 0x0e, 0x4f, 0x4f, 0xae, 0xbd, 0x6b, 0x44, 0x96,
  0x7b, 0x41, 0x7a, 0xca, 0x00, 0xde, 0x91, 0x49, 0x59, 0x1a, 0x33, 0xd9,
  0x2d, 0x8d, 0xe4, 0x41, 0x56, 0x10, 0xb5, 0xcb, 0x89, 0x1a, 0x96, 0xb0,
  0xb2, 0xfc, 0xf6, 0xce, 0x98, 0x4b, 0xe9, 0x65, 0x9a, 0x5b, 0x7a, 0x93,
  0x9b, 0x31, 0x4b, 0xf4, 0xe1, 0xa2, 0x94, 0xe7, 0xe9, 0xa8, 0x48, 0x05,
  0x12, 0xbe, 0xb5, 0xae, 0xf9, 0xfa, 0x98, 0x55, 0x19, 0xce, 0x03, 0xde,
  0x21, 0xe3, 0x92, 0xda, 0xa8, 0xc3, 0x4d, 0xa0, 0x28, 0x93, 0xce, 0x09,
  0xe6, 0x0b, 0x0d, 0xd2, 0x8c, 0xb8, 0x35, 0x4a, 0xbe, 0x2e, 0x6f, 0x32,
  0xf8, 0x0a, 0xa1, 0xdf, 0xe7, 0xe4, 0xed, 0x32, 0xaa, 0xe0, 0x4d, 0x96,
  0x2c, 0x8d, 0xea, 0x69, 0x76, 0x13, 0xda, 0x07, 0x7e, 0xe6, 0x99, 0x87,
  0x86, 0xc2, 0x6f, 0x78, 0x97, 0xec, 0x2a, 0xec, 0x51, 0xce, 0xf9, 0x4a,
  0x24, 0x3b, 0x50, 0x6f, 0xa6, 0xb4, 0x5b, 0xab, 0xc6, 0xad, 0xc2, 0x6e,
  0xc8, 0x4d, 0x5a, 0x7b, 0x97, 0x2b, 0x83, 0x69, 0xfa, 0x6c, 0x74, 0xf0,
  0x7c, 0xb4, 0x3f, 0x32, 0x86, 0x48, 0x76, 0x9d, 0x97, 0xeb, 0xda, 0x7c,
  0x9a, 0xa6, 0xe1, 0xde, 0xc9, 0xe8, 0x56, 0x36, 0xe5, 0xe5, 0xe5, 0x82,
  0x75, 0x9e, 0xbd, 0x72, 0x3e, 0x67, 0xdd, 0xc7, 0x68, 0x7a, 0x56, 0x7f,
  0x66, 0x0b, 0x88, 0x76, 0x46, 0xae, 0x1b, 0xb3, 0xd4, 0xd0, 0x44, 0x1e,
  0x39, 0xe7, 0xc5, 0x70, 0x98, 0x4e, 0xea, 0x86, 0x8c, 0xa9, 0xe1, 0xba,
  0xc8, 0x6f, 0x87, 0x75, 0x39, 0xfd, 0x64, 0x0e, 0xe5, 0xe5, 0x2a, 0x6d,
  0xae, 0xfe, 0xd4, 0x71, 0x09, 0xef, 0x90, 0x2c, 0xd9, 0x4d, 0x92, 0xd7,
  0xac, 0x56, 0xd2, 0x4e, 0x54, 0x7c, 0xdf, 0xcc, 0x69, 0xca, 0x28, 0xc9,
  0x07, 0x33, 0x8a, 0xa1, 0xe5, 0xa5, 0x39, 0xd4, 0x84, 0x07, 0x1b, 0x28,
  0x2b, 0xed, 0x0c, 0x07, 0x87, 0x23, 0x89, 0x11, 0xf8, 0xed, 0xcc, 0xd5,
  0x29, 0xab, 0x4f, 0x46, 0xd1, 0x7e, 0x6f, 0x4c, 0xc6, 0x17, 0xf4, 0x6f,
  0xc3, 0xc2, 0x1a, 0x6c, 0xb9, 0x48, 0x56, 0x33, 0x23, 0x66, 0xc6, 0x64,
  0x91, 0xa7, 0x93, 0x61, 0x67, 0x38, 0xf9, 0xbe, 0x7c, 0x34, 0x51, 0x5b,
  0x43, 0x49, 0x29, 0xd9, 0xfe, 0xd2, 0xd8, 0x7f, 0x57, 0x7c, 0xec, 0x18,
  0x90, 0xd7, 0x68, 0x28, 0xf4, 0xd2, 0x58, 0x10, 0x45, 0xd3, 0x1d, 0xee,
  0x0a, 0xa2, 0x9a, 0xa4, 0x0c, 0x1b, 0xbb, 0x20, 0x12, 0xf1, 0x00, 0x59,

  0xfb, 0x73, 0xf4, 0x59, 0xe7, 0xb5, 0x57, 0xee, 0x4c, 0x9f, 0x3c, 0x32,
  0x67, 0xea, 0x6f, 0xf4, 0xa2, 0x19, 0xd6, 0xd7, 0xd3, 0xe4, 0x25, 0xb4,
  0x6f, 0x22, 0xd3, 0xe8, 0x06, 0x8f, 0x77, 0x93, 0xef, 0x5e, 0x9d, 0xbf,
  0x3f, 0x7e, 0xff, 0xd5, 0x0b, 0xfe, 0xa8, 0x50, 0x9a, 0xf9, 0x5b, 0x76,
  0xbb, 0x22, 0x3f, 0x18, 0xcd, 0xd6, 0x88, 0xb2, 0x24, 0x79, 0x53, 0xc2,
  0x1e, 0x01, 0xc3, 0x24, 0x81, 0xd5, 0x19, 0xce, 0x88, 0x96, 0xd9, 0xba,
  0xe3, 0xfb, 0xb5, 0x0c, 0xdb, 0x0d, 0xcc, 0xd7, 0x93, 0x37, 0x59, 0xe7,
  0x68, 0xf8, 0x23, 0xbb, 0x8f, 0xa1, 0x2f, 0x8d, 0x48, 0x5a, 0xc2, 0xcc,
  0xd7, 0x99, 0x77, 0xbf, 0x54, 0x1a, 0x63, 0x97, 0xed, 0x7c, 0x33, 0xde,
  0xad, 0xb9, 0x36, 0xb4, 0x4b, 0x3a, 0xd8, 0xd4, 0xb0, 0xa3, 0x4c, 0x14,
  0x07, 0xb0, 0x3a, 0x98, 0x0d, 0xc2, 0xca, 0x46, 0xc9, 0xab, 0x79, 0xf7,
  0x28, 0x49, 0x77, 0x21, 0xad, 0x5e, 0xa5, 0xe0, 0xcc, 0x29, 0xc2, 0xec,
  0xe5, 0xe5, 0x11, 0x75, 0x98, 0xda, 0x9c, 0xcf, 0x4c, 0x25, 0x3d, 0x7d,
  0xa6, 0x33, 0x1c, 0x4c, 0x4f, 0xb0, 0x19, 0x52, 0x0a, 0x73, 0x3a, 0x50,
  0x32, 0xfd, 0x0c, 0xa3, 0x5e, 0x96, 0x33, 0xd8, 0x11, 0xc1, 0xfe, 0x8c,
  0xad, 0xc3, 0x67, 0x6b, 0xcb, 0xad, 0x3a, 0xd9, 0x21, 0xd7, 0x9f, 0xa1,
  0x82, 0xe2, 0xb2, 0xb9, 0xda, 0x75, 0x6e, 0x0d, 0x52, 0x53, 0xcc, 0x82,
  0xf7, 0xcc, 0x44, 0xb0, 0xee, 0xa2, 0x4b, 0xea, 0x70, 0x3b, 0x43, 0xf3,
  0xfc, 0xdb, 0xba, 0x6e, 0x60, 0x0d, 0x89, 0xf8, 0xe7, 0x95, 0x98, 0x99,
  0x2d, 0xb3, 0x65, 0x59, 0xdd, 0x05, 0x13, 0x39, 0x86, 0xf2, 0x41, 0x86,
  0xa7, 0x9c, 0x16, 0xd1, 0x01, 0xe4, 0xa3, 0xba, 0x04, 0xc9, 0x08, 0x20,

  0x9f, 0xba, 0xb5, 0x03, 0xa1, 0x34, 0x19, 0x06, 0x64, 0xec, 0x6f, 0xe7,
  0xb0, 0x55, 0x03, 0x0a, 0x8e, 0x1e, 0xb6, 0xed, 0xc5, 0x9a, 0x9a, 0x88,
  0x0b, 0x87, 0xfe, 0x7f, 0x91, 0x12, 0xd7, 0x29, 0xb2, 0xd6, 0x09, 0x41,
  0x7a, 0xf0, 0xd2, 0x36, 0x91, 0xfb, 0xd3, 0xc7, 0xa3, 0x83, 0x16, 0xb9,
  0x17, 0x77, 0x14, 0x28, 0x88, 0xf3, 0x90, 0x0b, 0xa3, 0x38, 0xd6, 0x3c,
  0x67, 0xb3, 0x8b, 0xf3, 0xfc, 0x72, 0x5d, 0x65, 0xac, 0xc1, 0x21, 0xb6,

  0xa0, 0x21, 0x05, 0x52, 0x8a, 0xae, 0x4a, 0x78, 0xe2, 0x8d, 0x30, 0xcd,
  0x16, 0xf3, 0x41, 0x67, 0x38, 0x98, 0x2f, 0xa0, 0x7e, 0x9a, 0x3e, 0x98,
  0xa6, 0x31, 0x53, 0x30, 0x58, 0x91, 0x89, 0x12, 0xbb, 0x34, 0x0c, 0x25,
  0x21, 0x57, 0x74, 0x32, 0x5d, 0xa4, 0xf9, 0x12, 0x64, 0x2a, 0xae, 0xd6,

  0x51, 0xec, 0x5a, 0x90, 0x81, 0x41, 0x6f, 0x4f, 0xc8, 0xf4, 0xad, 0x6a,
  0x92, 0xcc, 0x38, 0x55, 0xd5, 0x9c, 0xd9, 0xb0, 0xbc, 0xca, 0xa6, 0x9f,

  0x94, 0x79, 0xa9, 0xca, 0xd9, 0xa5, 0x63, 0x8a, 0x31, 0xc0, 0xbe, 0x36,
  0x4f, 0xad, 0x6b, 0xba, 0x26, 0x75, 0x9d, 0x93, 0xfb, 0x8c, 0xcc, 0xc1,
  0xf5, 0x14, 0x56, 0x22, 0x2e, 0x8c, 0xa1, 0x6e, 0xe5, 0x80, 0x89, 0x61,
  0xa9, 0xc5, 0x6c, 0xd8, 0x54, 0xf9, 0xaa, 0x6f, 0x76, 0x7c, 0x2a, 0x6d,
  0x05, 0xb5, 0x16, 0x8b, 0x1d, 0xc6, 0x30, 0x9b, 0xc7, 0xd3, 0xa4, 0xb3,

  0x9b, 0x5d, 0xa2, 0xc4, 0xde, 0x0e, 0xc8, 0x1f, 0x94, 0x1b, 0x7d, 0x81,



  0x8d, 0x25, 0xb8, 0x3b, 0x8d, 0x69, 0x24, 0x82, 0xcb, 0x58, 0x71, 0xf9,



  0x14, 0x4a, 0x50, 0x7e, 0x99, 0x51, 0x2c, 0xc7, 0xc8, 0xb2, 0x66, 0x61,
  0x54, 0xa3, 0x90, 0xc6, 0xcd, 0x6f, 0xb2, 0xcb, 0xb2, 0x21, 0x6d, 0x24,
  0x20, 0x93, 0x0f, 0xe0, 0xf3, 0x96, 0x26, 0x54, 0xed, 0xf7, 0x75, 0xb2,
  0x9c, 0xf5, 0x71, 0xf3, 0x69, 0x56, 0xfb, 0xc5, 0xe3, 0x50, 0x37, 0xe6,
  0x66, 0x75, 0x4f, 0xdd, 0x8c, 0x36, 0xcd, 0x60, 0x7b, 0x41, 0x71, 0x54,
  0xbd, 0x55, 0x15, 0x7e, 0x62, 0x09, 0xa4, 0x23, 0x37, 0x37, 0xf9, 0x34,
  0x53, 0x77, 0x9c, 0xf8, 0xa8, 0x17, 0x79, 0xc8, 0xea, 0x97, 0x74, 0x27,
  0xcd, 0x4b, 0xac, 0x93, 0x93, 0xf7, 0xe4, 0x26, 0x27, 0x9d, 0x5d, 0x98,
  0x1e, 0x54, 0x32, 0x11, 0x07, 0x69, 0x95, 0xc3, 0x55, 0x64, 0x86, 0x93,
  0x79, 0x7a, 0x16, 0xbd, 0x7f, 0xc7, 0x78, 0xde, 0x78, 0x5f, 0xcc, 0x18,
  0x67, 0xbe, 0xe0, 0x72, 0xcd, 0xd3, 0x7c, 0x11, 0xd9, 0x27, 0x30, 0xb2,

  0xcb, 0x0c, 0x5e, 0x35, 0x3e, 0x83, 0x35, 0x6d, 0x3a, 0xc5, 0xdd, 0x42,
  0x26, 0x95, 0x65, 0x6c, 0x4f, 0xc0, 0xf8, 0xb8, 0xbd, 0xb3, 0xdb, 0x0b,
  0xa5, 0x8d, 0xcf, 0x4e, 0xfe, 0xce, 0xc7, 0xe7, 0x5d, 0xcf, 0x94, 0x46,
  0x4d, 0x57, 0x14, 0x60, 0xea, 0xde, 0x50, 0x32, 0xbd, 0x28, 0x46, 0xb9,
  0xab, 0x1e, 0xe4, 0x4c, 0xfc, 0xe7, 0x36, 0xb6, 0x07, 0x86, 0x44, 0x3c,
  0x4d, 0xae, 0x30, 0x8f, 0x23, 0x1c, 0xb8, 0xcb, 0xcb, 0x8d, 0x7c, 0x35,

  0xe2, 0x18, 0x3c, 0xb4, 0x45, 0xb1, 0xa5, 0x61, 0x5f, 0x36, 0xc2, 0x44,
  0x1e, 0x5f, 0xe1, 0x75, 0x30, 0xb4, 0x70, 0x67, 0x63, 0xbc, 0x9c, 0x4c,
  0x3f, 0xd2, 0x93, 0x59, 0xca, 0x0c, 0x12, 0xd6, 0xeb, 0x98, 0x59, 0x4d,
  0xd9, 0x07, 0x2c, 0x3a, 0x04, 0x8b, 0x1a, 0x4c, 0x75, 0xbe, 0x48, 0x2f,
  0xe1, 0x5e, 0xbb, 0xec, 0xde, 0xd0, 0xa2, 0x94, 0x40, 0x5f, 0x5d, 0x1a,
  0xf6, 0x4e, 0xab, 0x16, 0xd7, 0x56, 0x9d, 0xec, 0x18, 0x22, 0x5b, 0xac,
  0x21, 0xee, 0x4f, 0xcd, 0xf2, 0xc6, 0xe3, 0xaf, 0x77, 0x7d, 0xf6, 0x86,
  0xdd, 0x7d, 0x08, 0x73, 0x23, 0xee, 0x04, 0x23, 0xfc, 0xcf, 0x7c, 0x1e,
  0x6d, 0x06, 0x67, 0xad, 0x3b, 0x5f, 0x93, 0x53, 0xba, 0xa4, 0x55, 0x90,
  0x2b, 0x74, 0x64, 0xaf, 0x3e, 0x3d, 0xa9, 0x1e, 0x59, 0x26, 0xec, 0x96,
  0x82, 0xb0, 0xae, 0xd7, 0x70, 0x4e, 0x41, 0x1e, 0x77, 0x87, 0x33, 0xcc,



  0xde, 0xb0, 0xa2, 0x75, 0x41, 0x7f, 0x5a, 0x1d, 0x3a, 0x87, 0x35, 0x47,
  0x67, 0x51, 0x91, 0x0b, 0x9c, 0xec, 0x60, 0xab, 0x83, 0x1a, 0x9e, 0xa2,
  0x63, 0xd3, 0x5e, 0x76, 0x2f, 0xa1, 0xd1, 0xd0, 0xc0, 0x6e, 0x8c, 0x08,
  0x35, 0x82, 0x99, 0x2e, 0x5c, 0x0f, 0xf7, 0xde, 0xa9, 0xd7, 0x86, 0xbf,
  0x90, 0xe9, 0x20, 0xcc, 0x83, 0xe8, 0xb1, 0x3b, 0x3b, 0x66, 0x2f, 0x46,
  0xd2, 0x78, 0x7c, 0x64, 0xf7, 0x97, 0xbe, 0x20, 0x38, 0x34, 0xff, 0x14,

  0x8d, 0xf8, 0xcd, 0x8c, 0x41, 0x06, 0x95, 0x2c, 0xd0, 0xc6, 0x2e, 0x4e,
  0xc6, 0xb1, 0xc3, 0x6c, 0xc7, 0xa7, 0xe8, 0x7d, 0x62, 0xb6, 0xe4, 0x46,
  0x64, 0xb7, 0x6a, 0x49, 0x46, 0x81, 0x17, 0xa3, 0xf2, 0xfd, 0x7d, 0xab,
  0x8c, 0x82, 0x59, 0x6c, 0x2f, 0x73, 0xf0, 0x9b, 0x18, 0x18, 0x09, 0x6b,
  0xd2, 0x4e, 0xac, 0x0b, 0xf5, 0xf5, 0x2b, 0x7f, 0x5c, 0xf8, 0x4c, 0xbb,
  0x17, 0xc1, 0xfb, 0xfd, 0x4e, 0xbd, 0x6b, 0x79, 0x98, 0x19, 0xe5, 0xec,
  0xe8, 0x1d, 0xec, 0xd7, 0xd4, 0xd0, 0xcd, 0x7b, 0x75, 0x57, 0x6a, 0x6c,
  0x7b, 0xb2, 0xce, 0x17, 0xad, 0x98, 0x80, 0x33, 0xb9, 0x11, 0x58, 0x66,
  0xd2, 0xc2, 0xd4, 0x38, 0xba, 0x95, 0xc3, 0x3d, 0xdc, 0x25, 0xb4, 0xe6,
  0x6e, 0x25, 0x9e, 0xed, 0x75, 0xdd, 0x72, 0x20, 0xa9, 0x5c, 0x5e, 0x34,
  0xd0, 0xb2, 0xc9, 0xae, 0xf5, 0xc6, 0x0c, 0x4e, 0x08, 0xd3, 0x22, 0x31,

  0x70, 0x59, 0xe4, 0xff, 0x10, 0x1d, 0x34, 0x2b, 0xae, 0xf3, 0xaa, 0x2c,
  0x48, 0xcb, 0x35, 0xa6, 0x6f, 0x95, 0x83, 0x2d, 0x93, 0xfa, 0x65, 0x18,
  0xc7, 0xf6, 0xeb, 0x0f, 0xe7, 0x27, 0x1f, 0x5f, 0xbf, 0xfa, 0xf8, 0xe7,
  0x0f, 0xef, 0xdf, 0x9c, 0x1c, 0x6d, 0x77, 0x86, 0x23, 0x9f, 0x5f, 0x2e,
  0x8e, 0xfa, 0x9a, 0x2c, 0x0f, 0x5c, 0x12, 0x33, 0x45, 0x1e, 0xf9, 0x32,

  0xbf, 0x36, 0x0c, 0x0d, 0x86, 0x04, 0x7c, 0xf4, 0xf8, 0x1b, 0xbc, 0x5a,
  0xb2, 0xe1, 0x9d, 0xe1, 0x26, 0x6b, 0xd2, 0xd3, 0x46, 0x2d, 0x6d, 0x59,
  0xaf, 0x8a, 0x58, 0xed, 0x3a, 0xc1, 0x88, 0x86, 0x4d, 0x5a, 0x54, 0x31,
  0x23, 0xf3, 0xc5, 0x33, 0x12, 0x3d, 0x77, 0xfd, 0xba, 0x31, 0x56, 0x92,
  0x06, 0x08, 0x8c, 0xd6, 0x56, 0x7e, 0xd2, 0x2c, 0x03, 0x63, 0x62, 0xbd,
  0x8a, 0x1c, 0x77, 0xed, 0x34, 0xd1, 0x59, 0xb2, 0x4d, 0x23, 0x19, 0xfa,
  0x1d, 0xca, 0x24, 0xa7, 0x55, 0x63, 0xec, 0x9b, 0x2c, 0xc7, 0xc5, 0xd0,
  0x28, 0x2a, 0xe9, 0xac, 0x70, 0xce, 0x05, 0x1a, 0xb6, 0xd1, 0x35, 0x69,
  0x0f, 0xa0, 0xdd, 0x67, 0xb7, 0x19, 0x6e, 0x9e, 0xbc, 0xf5, 0x7a, 0x5d,
  0xe1, 0x36, 0x7f, 0x67, 0xb4, 0x11, 0xe2, 0x7e, 0x6f, 0xe0, 0xdd, 0x33,
  0x2f, 0xe8, 0x43, 0x46, 0xcc, 0x74, 0x45, 0x5e, 0xb9, 0xa0, 0xb8, 0x6a,
  0x0a, 0x4f, 0x0a, 0xfc, 0x5e, 0x67, 0xaf, 0x2e, 0xbe, 0x8e, 0x2a, 0xb3,
  0x2e, 0xa5, 0x47, 0x48, 0x11, 0x8a, 0x79, 0xdd, 0xc8, 0x05, 0x79, 0x3f,
  0x1e, 0x27, 0x48, 0x18, 0x59, 0xe4, 0x93, 0x2a, 0xa5, 0x6f, 0xd2, 0x8f,
  0xe9, 0xa7, 0x86, 0xac, 0x3b, 0xc3, 0x9d, 0x7d, 0xf3, 0x7a, 0xfc, 0xbb,
  0x83, 0x03, 0xd2, 0xe2, 0xd7, 0x66, 0x5f, 0x76, 0xcc, 0x2b, 0x45, 0x6d,
  0x6e, 0xe6, 0x72, 0x54, 0x97, 0xbb, 0x10, 0xdb, 0xb5, 0xa8, 0x03, 0xe9,
  0xb5, 0x91, 0xb6, 0xa0, 0x23, 0x25, 0x6a, 0x73, 0x9c, 0xc1, 0x9e, 0x80,
  0xd1, 0x49, 0x36, 0x8d, 0xe1, 0x17, 0x46, 0x5e, 0x2f, 0x42, 0x85, 0x7c,
  0x27, 0x3f, 0x1d, 0x4b, 0x2e, 0x4a, 0x3a, 0x35, 0x7f, 0x25, 0x47, 0xc1,
  0x2e, 0xad, 0xac, 0x7d, 0xc3, 0x74, 0x55, 0x63, 0xd6, 0x46, 0x2f, 0xc8,

  0x7c, 0x41, 0x0a, 0x4d, 0xc8, 0x15, 0x8a, 0xee, 0xe5, 0x72, 0x69, 0x4a,

  0x20, 0x87, 0x49, 0x3a, 0xfd, 0x74, 0x93, 0x56, 0x33, 0xb6, 0x87, 0x0c,
  0xc5, 0x4c, 0xf2, 0x45, 0xde, 0xdc, 0xb1, 0x5d, 0xdb, 0xb5, 0xa9, 0x39,
  0x3e, 0x4a, 0x1b, 0x68, 0xee, 0xd1, 0xa5, 0x31, 0xf9, 0x49, 0xfb, 0x24,
  0x15, 0x3f, 0x6f, 0x7c, 0x93, 0x16, 0x2a, 0x52, 0x63, 0x55, 0x1c, 0xfb,
  0xed, 0x40, 0x3c, 0x36, 0x7c, 0x8f, 0x30, 0x4d, 0x47, 0xbb, 0xca, 0x06,
  0x7d, 0x26, 0xa5, 0xe4, 0x93, 0xd4, 0x77, 0x46, 0xca, 0x2f, 0x93, 0x88,
  0x8a, 0x88, 0xec, 0xa1, 0xe4, 0x9b, 0xec, 0xce, 0xd8, 0xcf, 0x79, 0xe1,
  0x38, 0x25, 0xdb, 0xf7, 0x19, 0x59, 0x77, 0xac, 0x8b, 0xe6, 0xea, 0x4c,
  0xcf, 0x24, 0x1e, 0xc2, 0x92, 0x24, 0x74, 0x20, 0xf0, 0xfb, 0xaa, 0x87,
  0xd3, 0x10, 0xdb, 0x75, 0x8b, 0x25, 0xe3, 0x4b, 0xe1, 0x21, 0x8e, 0xcd,
  0xcf, 0x8b, 0x22, 0x5b, 0xc8, 0xf1, 0x5d, 0x6c, 0x3a, 0x00, 0xfb, 0xac,
  0x99, 0xf2, 0x77, 0x7c, 0xa3, 0x3b, 0xc3, 0x3d, 0xe3, 0xe0, 0x7e, 0xda,
  0xa8, 0x4c, 0xd2, 0xac, 0x21, 0x63, 0x15, 0xed, 0xdb, 0x5f, 0x8d, 0x7a,

  0x3f, 0x13, 0xdc, 0xa6, 0xca, 0x1d, 0x7a, 0xfb, 0xcc, 0xd9, 0x29, 0x8a,

  0x43, 0xa6, 0x33, 0x96, 0x23, 0xfe, 0xa3, 0xd5, 0xac, 0x10, 0xc0, 0xe8,
  0x0c, 0xe7, 0x6b, 0xd9, 0x2a, 0xc3, 0x64, 0x1d, 0xdb, 0x46, 0x4f, 0x2d,
  0x2b, 0xf8, 0x8b, 0xaa, 0xd2, 0x9c, 0x75, 0xeb, 0x3c, 0x77, 0x58, 0xd9,
  0xe8, 0x5e, 0x13, 0xe1, 0xe6, 0xde, 0xc6, 0xec, 0xc6, 0x2e, 0x7a, 0xa0,
  0x99, 0x84, 0x26, 0x6b, 0xaf, 0xc5, 0xd9, 0x96, 0xd0, 0xe0, 0xd2, 0x2f,
  0x0d, 0x1b, 0xfb, 0xd7, 0x05, 0x34, 0x33, 0x43, 0x30, 0xbf, 0x50, 0x66,
  0x09, 0x2d, 0xb6, 0x04, 0xf5, 0x3b, 0x95, 0xc8, 0x34, 0x09, 0xeb, 0x82,
  0x5d, 0x71, 0xc2, 0x00, 0x2b, 0x8e, 0xec, 0x4b, 0x0e, 0xcd, 0x00, 0x72,
  0x07, 0x8a, 0xcb, 0xf1, 0xc5, 0x56, 0xb2, 0x93, 0x8d, 0x2e, 0xcd, 0x78,
  0x5b, 0x34, 0xce, 0xc1, 0x0b, 0xfa, 0xef, 0x21, 0xfe, 0xfb, 0x68, 0x4b,
  0x53, 0xfb, 0xfc, 0xad, 0x27, 0x69, 0xde, 0x95, 0x45, 0x1c, 0x8f, 0x73,
  0xc2, 0x7d, 0xc0, 0x3e, 0xe6, 0x3e, 0xc6, 0xc3, 0x3a, 0xeb, 0x09, 0xef,
  0x72, 0xa8, 0x6e, 0xe9, 0x36, 0x2c, 0xd9, 0x1f, 0x71, 0x9d, 0xb1, 0x43,
  0xc4, 0xac, 0x6c, 0x6a, 0xd4, 0x43, 0xb8, 0x11, 0xf5, 0x56, 0x4d, 0x3f,
  0x56, 0xd9, 0x55, 0x5a, 0x5f, 0x25, 0xeb, 0x86, 0x89, 0xd0, 0xd0, 0x6d,
  0x77, 0xb8, 0xd5, 0x22, 0x77, 0x9e, 0x36, 0xf9, 0xf4, 0x48, 0xed, 0x3e,
  0x77, 0x8a, 0x1c, 0x01, 0x59, 0x94, 0x37, 0xfa, 0xcc, 0x50, 0x72, 0xed,
  0x62, 0x6a, 0x81, 0x39, 0x4d, 0xf8, 0x4d, 0xe8, 0x31, 0x3f, 0x92, 0xbd,
  0x24, 0x6d, 0x92, 0x12, 0x01, 0x0d, 0x8b, 0x9b, 0x9b, 0x1d, 0x23, 0x8b,
  0x6e, 0x81, 0x73, 0x23, 0xdb, 0x15, 0xf3, 0x0e, 0x4c, 0x53, 0xd1, 0xf3,
  0xf2, 0xb9, 0x78, 0x6f, 0xe5, 0xdf, 0x90, 0xa7, 0xa2, 0x7d, 0xd5, 0x1c,
  0xed, 0xee, 0xaa, 0x5e, 0xf7, 0x93, 0xb6, 0x32, 0x48, 0xab, 0xe9, 0xc8,
  0x62, 0x39, 0x60, 0xa2, 0x74, 0x9d, 0x5f, 0xc2, 0xd6, 0x88, 0x39, 0x30,
  0xd8, 0x29, 0xf5, 0x2f, 0x5d, 0x12, 0x33, 0xe3, 0x21, 0xf9, 0x4b, 0xd7,
  0xf5, 0x03, 0xee, 0x88, 0xc7, 0x74, 0xf9, 0x1d, 0xeb, 0x2f, 0xe6, 0xa8,

  0xbe, 0xbf, 0x01, 0x5d, 0x2a, 0xbc, 0xf3, 0x08, 0xe3, 0xb5, 0x77, 0xb3,
  0xc6, 0x3c, 0xd0, 0xb9, 0xb8, 0x48, 0x76, 0xd2, 0x4f, 0xe9, 0x28, 0x39,
  0x7d, 0x3d, 0x3e, 0xa3, 0x4f, 0x18, 0xea, 0x28, 0x2e, 0xcd, 0x2c, 0x4e,
  0xc6, 0x9d, 0xe1, 0xb2, 0xdb, 0x26, 0x2b, 0xea, 0x98, 0x83, 0x32, 0xdc,
  0x66, 0x8d, 0x22, 0x68, 0x7a, 0x8d, 0x4c, 0xd6, 0x58, 0xfa, 0x88, 0x8b,
  0x53, 0x98, 0x97, 0x72, 0x30, 0x12, 0xbe, 0x6a, 0xc1, 0x87, 0x56, 0xe6,
  0xe6, 0xcf, 0x76, 0xad, 0xab, 0x66, 0xa0, 0xb4, 0x60, 0xc3, 0x85, 0xf5,
  0xfa, 0x92, 0x6c, 0x90, 0x5a, 0xed, 0x46, 0xfb, 0x05, 0xb3, 0x1b, 0xa1,
  0xaa, 0x20, 0xcb, 0xb6, 0x9e, 0x44, 0x63, 0x35, 0x51, 0x26, 0x15, 0x54,
  0xa4, 0xa2, 0x74, 0xa3, 0x52, 0x36, 0x05, 0xb2, 0x46, 0x73, 0x04, 0xd8,
  0xa6, 0x99, 0x51, 0x41, 0x67, 0x11, 0x25, 0x80, 0x0f, 0x45, 0x0d, 0xa7,
  0xb9, 0x64, 0x8a, 0x46, 0xfc, 0x3f, 0x18, 0x68, 0xca, 0x2a, 0x1a, 0x51,
  0x3d, 0x02, 0x15, 0x39, 0xf9, 0x49, 0x49, 0x61, 0x66, 0x53, 0x9d, 0xc6,
  0xb3, 0xf7, 0xff, 0xab, 0x62, 0x6d, 0x36, 0x3e, 0x22, 0x8d, 0x49, 0xa9,
  0x22, 0x31, 0x43, 0x1b, 0xb8, 0xc9, 0xb1, 0xf7, 0xf8, 0xa0, 0xed, 0xc7,

  0x06, 0xb1, 0x19, 0x03, 0x20, 0x4b, 0x5e, 0xd2, 0x7f, 0xef, 0xe5, 0xca,
  0x48, 0x5d, 0xc1, 0xf3, 0x12, 0xef, 0x64, 0xde, 0x29, 0xbe, 0x98, 0xa4,
  0xcd, 0xa0, 0x03, 0xe9, 0x05, 0x72, 0x1b, 0x11, 0xdf, 0x1b, 0x24, 0x6f,
  0x28, 0x21, 0xfb, 0xe8, 0xfd, 0x57, 0xa0, 0x81, 0xb3, 0x83, 0x43, 0x44,
  0x97, 0xac, 0xf5, 0x30, 0xc3, 0x47, 0x6a, 0x76, 0x24, 0x70, 0x74, 0x38,
  0x54, 0x7c, 0x21, 0x13, 0x06, 0x60, 0xa3, 0x14, 0x16, 0x44, 0xf6, 0xd0,
  0xec, 0xd7, 0x93, 0x5f, 0x81, 0x21, 0x7a, 0x34, 0x90, 0x1d, 0x14, 0xc7,
  0xcc, 0xa7, 0xec, 0xce, 0xfd, 0x0d, 0xbb, 0xea, 0x6d, 0xb5, 0x7b, 0xf8,
  0xa5, 0xb7, 0x49, 0x7f, 0x7d, 0x41, 0x19, 0x4a, 0x46, 0x4b, 0x9d, 0xfd,
  0xf8, 0xf3, 0x24, 0x62, 0x7c, 0xe7, 0x23, 0xce, 0x16, 0xf8, 0xb9, 0x34,
  0x17, 0x88, 0x43, 0xff, 0xcc, 0xe2, 0x25, 0x1d, 0x9e, 0x32, 0xe5, 0x89,
  0xe0, 0xd3, 0xc2, 0xaa, 0x24, 0x43, 0x4e, 0x00, 0x43, 0x42, 0x58, 0x77,
  0xef, 0xa7, 0xe5, 0x22, 0x90, 0x75, 0x2d, 0xc3, 0x15, 0xfa, 0xfc, 0xa1,



  0xc8, 0x37, 0x18, 0x73, 0xcc, 0x6c, 0x44, 0x8b, 0xee, 0x5e, 0x07, 0xab,
  0x53, 0x43, 0xfd, 0x72, 0x92, 0x91, 0xde, 0xe4, 0x17, 0x11, 0xe6, 0xc6,
  0xd4, 0x58, 0x53, 0x1a, 0x25, 0x4e, 0xe3, 0x8d, 0xa9, 0xff, 0xe6, 0x6c,
  0x75, 0x6f, 0xcd, 0xa1, 0x93, 0x9f, 0xc9, 0xee, 0xda, 0xc0, 0xf7, 0x34,

  0x19, 0x26, 0x57, 0xe5, 0xaa, 0x9f, 0x4b, 0x32, 0x69, 0x18, 0xc3, 0xe0,
  0x8c, 0x03, 0xf1, 0x46, 0x49, 0x66, 0x55, 0xcb, 0x97, 0xcf, 0xe4, 0x47,
  0x96, 0xe8, 0x96, 0xb7, 0x25, 0x5b, 0xb1, 0xa3, 0x68, 0x38, 0xf8, 0x29,



  0x57, 0x28, 0xbf, 0xa6, 0xad, 0x53, 0xda, 0x71, 0x8e, 0xcd, 0xb6, 0xea,
  0x5b, 0x16, 0xf4, 0x67, 0x41, 0x3e, 0xb1, 0x7f, 0x8b, 0x10, 0x64, 0x94,
  0x16, 0xc9, 0x37, 0x2e, 0xb1, 0x0f, 0x28, 0x30, 0x94, 0x04, 0x29, 0x59,
  0xe8, 0x8b, 0xbb, 0x07, 0x19, 0x74, 0xaa, 0x80, 0xa8, 0xdd, 0xe6, 0x19,
  0x73, 0x81, 0xb5, 0xd3, 0x25, 0x10, 0xc3, 0xc6, 0x1b, 0x4a, 0x29, 0x61,
  0xda, 0x25, 0xdf, 0x6b, 0x3e, 0xfd, 0x84, 0xc8, 0x8b, 0x48, 0x28, 0x7f,
  0x7d, 0x9a, 0xb7, 0xc7, 0x19, 0xa7, 0x91, 0x23, 0x80, 0x2d, 0x49, 0x4e,
  0x61, 0xa2, 0x49, 0x92, 0xce, 0x79, 0xc1, 0x3a, 0x5b, 0xaf, 0x97, 0xc1,
  0xcc, 0xf5, 0xe3, 0x9b, 0xe3, 0xf3, 0x64, 0x87, 0x34, 0xf0, 0xae, 0x91,
  0xab, 0xe2, 0x7d, 0x2f, 0x6b, 0xa6, 0x7b, 0xab, 0x4f, 0xf9, 0x9e, 0x31,
  0x36, 0x67, 0x93, 0x5d, 0x6b, 0x44, 0xe1, 0x73, 0x44, 0x85, 0xd6, 0x30,
  0x55, 0xcb, 0x14, 0xa6, 0x69, 0xe0, 0x7a, 0x74, 0xa6, 0x2a, 0x57, 0xb8,
  0x58, 0x1b, 0x95, 0xb7, 0x89, 0x09, 0x1a, 0x21, 0x1a, 0xce, 0x8e, 0x40,
  0x60, 0x27, 0x63, 0xbf, 0xb4, 0xb1, 0xb1, 0xbb, 0x77, 0x95, 0xb3, 0x1f,
  0xc5, 0x91, 0xc3, 0x0e, 0x1c, 0x4d, 0xd9, 0x13, 0x71, 0xe1, 0xb4, 0xdf,
  0x01, 0x25, 0x5b, 0xd2, 0xa6, 0xac, 0x48, 0x24, 0xcd, 0xc8, 0x0d, 0xd8,
  0x1d, 0x0e, 0x9a, 0xdc, 0xd6, 0x68, 0x6f, 0x2b, 0xb1, 0xe9, 0xa5, 0x66,
  0x97, 0x39, 0x7f, 0xda, 0x06, 0xbe, 0x0c, 0x89, 0xcd, 0xd7, 0xb5, 0xf5,
  0x63, 0xa6, 0xf6, 0xbc, 0x46, 0x31, 0x86, 0xea, 0x1d, 0xa7, 0xd5, 0xb9,
  0x8c, 0x6e, 0x8c, 0x9b, 0xe5, 0x5b, 0xeb, 0x32, 0x29, 0x1c, 0xd5, 0xd6,
  0x0f, 0x5b, 0x89, 0x97, 0x9e, 0xd8, 0xca, 0x52, 0xcc, 0x5d, 0x02, 0x91,
  0x27, 0x04, 0x8c, 0x44, 0xb6, 0x77, 0x78, 0x96, 0x2d, 0xf2, 0x65, 0x0e,

  0xdb, 0xcb, 0x9f, 0xc2, 0x30, 0x16, 0x20, 0x74, 0x53, 0xfa, 0x21, 0x9c,
  0x92, 0xa6, 0xfc, 0xa6, 0xf4, 0x6b, 0x33, 0x25, 0x78, 0xc4, 0x38, 0x23,
  0x33, 0x6e, 0x35, 0xb7, 0x27, 0x64, 0x93, 0x86, 0x37, 0x44, 0x8e, 0xed,
  0x5d, 0xea, 0x53, 0xe5, 0x9d, 0x4b, 0x44, 0x2f, 0x3d, 0x33, 0xb5, 0x64,
  0xf5, 0x69, 0x5a, 0x1f, 0x1c, 0x74, 0x05, 0x5d, 0xed, 0x28, 0x4a, 0xec,
  0xf7, 0xd4, 0x12, 0xe6, 0x87, 0xf3, 0xe3, 0x64, 0x87, 0x8a, 0x44, 0x9e,

  0x3d, 0x39, 0x38, 0xdc, 0xf5, 0x33, 0x4b, 0x94, 0x01, 0x84, 0x72, 0xf3,
  0x8e, 0x43, 0xb2, 0xde, 0x05, 0x5c, 0x94, 0xd3, 0x54, 0x34, 0x0e, 0x37,
  0xf4, 0x2c, 0xbb, 0xce, 0xa7, 0x54, 0xa3, 0x43, 0x01, 0x79, 0xe2, 0xc1,

  0x93, 0xcc, 0x4c, 0x32, 0xd8, 0x71, 0x97, 0xd1, 0xcb, 0xb3, 0x37, 0x26,
  0x92, 0xd5, 0x94, 0x29, 0x6f, 0xda, 0xd0, 0x40, 0x23, 0x7b, 0xe7, 0xcf,


  0x5a, 0xa2, 0x04, 0x69, 0x8f, 0x27, 0x88, 0xd6, 0xc5, 0x15, 0x34, 0xd0,

  0x31, 0x06, 0x2e, 0xf0, 0x33, 0x1c, 0xca, 0x66, 0x09, 0xeb, 0xb5, 0xb1,
  0x63, 0xca, 0x40, 0xe9, 0x1e, 0xa0, 0xcc, 0x69, 0x8b, 0x04, 0x49, 0x01,
  0xe1, 0x9e, 0xba, 0x41, 0xed, 0xee, 0xfb, 0x9a, 0x50, 0x7b, 0xd4, 0xd0,
  0x53, 0x0e, 0xc2, 0x31, 0x9a, 0x4b, 0x7c, 0xc8, 0xdf, 0xc8, 0xc9, 0xd4,

  0x66, 0x9f, 0x72, 0x3c, 0x74, 0xf6, 0xe2, 0x35, 0x9c, 0xb0, 0xa2, 0xa0,
  0xfc, 0x36, 0xd5, 0xc7, 0x03, 0x39, 0x6e, 0x5e, 0xdf, 0x53, 0x21, 0x04,
  0x29, 0xa4, 0xfe, 0x46, 0xf6, 0xfc, 0x18, 0xe6, 0x09, 0x4f, 0xcf, 0x27,
  0x71, 0xf4, 0x40, 0x29, 0xb6, 0x29, 0x1c, 0xa1, 0xaf, 0x58, 0x05, 0xbf,
  0x39, 0xa2, 0x69, 0x39, 0xeb, 0x98, 0xec, 0xb4, 0x09, 0x9e, 0xc0, 0x03,
  0xf7, 0xe3, 0x50, 0x25, 0x38, 0x5e, 0xdc, 0x93, 0x4d, 0x94, 0xca, 0xee,
  0xf5, 0x9f, 0xc4, 0x03, 0x63, 0x1e, 0x35, 0xb0, 0xc0, 0x9f, 0xc5, 0x01,
  0xef, 0xf1, 0x39, 0xbd, 0x0e, 0x24, 0x76, 0x6d, 0x95, 0x21, 0xa7, 0xab,
  0x51, 0xb2, 0x78, 0x82, 0x8d, 0x0b, 0x2d, 0x1a, 0x4a, 0x1b, 0x44, 0x4a,
  0x00, 0xe5, 0x7c, 0x75, 0xee, 0x26, 0x3b, 0x76, 0xcc, 0x75, 0xd9, 0x39,
  0xe1, 0x20, 0x65, 0x72, 0xf6, 0xf6, 0x7b, 0xe5, 0x96, 0x31, 0x03, 0x1e,
  0x8e, 0xa8, 0x3f, 0xda, 0xec, 0x30, 0x63, 0x51, 0x50, 0xa6, 0x5a, 0x2e,
  0x59, 0x9f, 0xec, 0x26, 0x42, 0x38, 0x7c, 0xd7, 0x25, 0x33, 0xd2, 0x56,

  0x6f, 0xbd, 0xc4, 0xef, 0xba, 0xb1, 0xa6, 0x92, 0x2d, 0x99, 0x3f, 0xfd,



  0xc0, 0xbf, 0x66, 0x1e, 0x6b, 0xfe, 0xd5, 0x5c, 0xad, 0x97, 0x13, 0x73,
  0x9e, 0x45, 0xf3, 0xa7, 0xad, 0x84, 0x83, 0xad, 0x73, 0xd9, 0xcf, 0x0d,
  0x66, 0x67, 0xae, 0xf5, 0x3a, 0xea, 0x5b, 0x6c, 0xed, 0x1a, 0xcf, 0x4e,
  0x6b, 0x07, 0x5c, 0x7e, 0x9e, 0x39, 0x3c, 0xf6, 0x65, 0x07, 0xaa, 0xde,
  0x07, 0x43, 0x9e, 0x3f, 0xbc, 0xfb, 0xcb, 0x0f, 0xcf, 0x1f, 0x3d, 0x4e,
  0x9f, 0xa5, 0xd3, 0xa7, 0xf3, 0xcf, 0xd3, 0x27, 0xb3, 0x27, 0xcf, 0x9e,
  0x1f, 0x7e, 0xfe, 0x24, 0x7d, 0xf6, 0x78, 0x9e, 0x3e, 0x3d, 0xc8, 0x0e,
  0x9e, 0xcf, 0x0f, 0x1f, 0xcd, 0x66, 0xf3, 0xec, 0xf3, 0xd9, 0xb3, 0x74,
  0x6b, 0x04, 0xf3, 0x4b, 0xa7, 0x1e, 0xb2, 0x5a, 0x0d, 0xbc, 0xa5, 0xc9,
  0xf8, 0xeb, 0x57, 0xc3, 0x83, 0xe4, 0x2a, 0xbb, 0xd5, 0x0b, 0xc6, 0x1e,
  0x4d, 0x9b, 0x75, 0x97, 0x49, 0x5e, 0x75, 0xff, 0x62, 0xb5, 0x50, 0x90,
  0xb2, 0xa6, 0xc9, 0x57, 0x02, 0x0d, 0x98, 0x77, 0x51, 0xb7, 0x95, 0xf3,
  0xea, 0xac, 0xff, 0xf0, 0x85, 0xfa, 0xec, 0x69, 0x5d, 0xdd, 0xcb, 0x7f,




  0x62, 0xde, 0x59, 0xbc, 0x4b, 0xa7, 0x46, 0x49, 0x32, 0x7b, 0x22, 0x0f,
  0x8e, 0x8d, 0x69, 0x6b, 0xd8, 0xf4, 0x20, 0x91, 0xbf, 0x90, 0x97, 0xd8,
  0x1b, 0xe3, 0xab, 0xaa, 0x5c, 0xaf, 0xce, 0xca, 0x45, 0x3e, 0xbd, 0xdb,

  0x34, 0x9c, 0xff, 0x58, 0xeb, 0x17, 0x47, 0xcc, 0xc2, 0xf3, 0x3a, 0xfb,
  0x0d, 0x4d, 0x2b, 0x8f, 0x1d, 0x3f, 0xc0, 0xb6, 0x1a, 0x4e, 0xf3, 0xd5,
  0x15, 0xc5, 0x79, 0x5f, 0x22, 0xcb, 0x8f, 0x42, 0x33, 0xfc, 0x83, 0xb8,
  0x4d, 0x35, 0x96, 0x1b, 0x59, 0xcb, 0x79, 0xea, 0xdb, 0xa2, 0x71, 0xe5,
  0x5a, 0x02, 0xa7, 0x6e, 0x2a, 0xc9, 0x2c, 0xcd, 0x03, 0x3f, 0x9e, 0xfb,
  0x10, 0xdf, 0x76, 0xd5, 0xb6, 0xd9, 0x79, 0x21, 0xbf, 0x1a, 0x25, 0xe7,
  0x88, 0x93, 0xaf, 0x57, 0x6c, 0x5e, 0xc0, 0x9f, 0xcf, 0xbf, 0xeb, 0x5e,
  0x34, 0x9a, 0xbc, 0x50, 0x0c, 0x17, 0xe2, 0x99, 0x1d, 0xfd, 0x70, 0x7e,

  0xf2, 0xa2, 0xbb, 0x4f, 0x28, 0x36, 0xaa, 0x5f, 0xec, 0xed, 0x21, 0xe4,
  0x73, 0x95, 0xde, 0xde, 0x8e, 0xea, 0x6c, 0x6f, 0x56, 0x4e, 0xeb, 0xbd,
  0xba, 0x5e, 0xe8, 0x6e, 0xb4, 0x6b, 0xff, 0x7e, 0x05, 0x6f, 0x6e, 0xb9,
  0x04, 0xdb, 0xca, 0x66, 0xc3, 0xba, 0x0e, 0x72, 0x83, 0xc6, 0xaf, 0x35,


  0xf3, 0xe0, 0x48, 0x72, 0xd2, 0x20, 0xe7, 0x86, 0x66, 0x77, 0xc7, 0xe3,
  0xaf, 0x13, 0x7d, 0x19, 0xdb, 0x6b, 0x43, 0xe2, 0x36, 0x2f, 0x67, 0x10,
  0x51, 0xc3, 0x52, 0x61, 0xd8, 0x7f, 0xf4, 0x1d, 0x3a, 0xa4, 0x4e, 0x97,
  0xfc, 0x87, 0xd4, 0xae, 0xe4, 0xcd, 0xc6, 0x44, 0xbe, 0xa7, 0x1d, 0x07,
  0x88, 0x5d, 0x44, 0x3c, 0xfe, 0xaf, 0x4e, 0xb0, 0x34, 0x71, 0x4f, 0x3a,
  0x8f, 0x50, 0xb7, 0x38, 0xdd, 0x50, 0xef, 0x65, 0x59, 0x19, 0xe1, 0xb1,
  0xac, 0x63, 0x5e, 0x50, 0xbd, 0xe5, 0x35, 0xab, 0x7d, 0x35, 0xe7, 0x22,
  0x9a, 0x61, 0x0a, 0x6f, 0x70, 0x73, 0x8c, 0xc8, 0x61, 0x1c, 0xf9, 0x87,
  0x15, 0x8d, 0x6f, 0xe9, 0xe1, 0xf5, 0x79, 0xd1, 0xd6, 0x85, 0x0b, 0x7e,
  0x40, 0x1c, 0x9b, 0xc9, 0x4a, 0x61, 0x59, 0x60, 0x21, 0x20, 0xf7, 0x1f,
  0x62, 0x82, 0x74, 0x88, 0xaa, 0x2a, 0x3d, 0xa5, 0x76, 0xf8, 0x0d, 0x8c,
  0x4b, 0x23, 0x1d, 0xf3, 0x4b, 0x0d, 0xaf, 0xf7, 0xe4, 0xd8, 0x91, 0xe8,

  0x6a, 0x90, 0xbb, 0x2c, 0xe5, 0xe0, 0x24, 0x14, 0x28, 0x85, 0x0d, 0xa9,
  0x25, 0x92, 0x9d, 0xc9, 0xe9, 0x40, 0xad, 0x2a, 0xf8, 0xe0, 0x26, 0x50,
  0xcd, 0x8f, 0x7b, 0x9c, 0xd2, 0xa8, 0xf4, 0x5e, 0x62, 0x78, 0x71, 0x5f,
  0x78, 0x89, 0x6d, 0xa4, 0x95, 0xc1, 0xcd, 0x60, 0x9e, 0xe9, 0x5a, 0x7b,
  0xc8, 0xb9, 0xb5, 0x3a, 0x5f, 0xac, 0xc4, 0xb5, 0xbb, 0x1e, 0x4d, 0xbd,
  0xd7, 0xbd, 0xcd, 0x51, 0x54, 0x9d, 0x22, 0xaf, 0x3f, 0x26, 0xda, 0x4b,
  0x2f, 0x48, 0x4b, 0x03, 0x86, 0x32, 0xaf, 0xb1, 0x69, 0x93, 0x5a, 0xa9,
  0x04, 0x85, 0xc0, 0x70, 0x20, 0x23, 0xf6, 0x28, 0xe3, 0x9c, 0x4a, 0xe9,
  0x17, 0xa5, 0x53, 0xb0, 0x0c, 0xe1, 0x19, 0x5e, 0x88, 0x6a, 0xc4, 0x51,
  0xc0, 0xb7, 0xb9, 0x26, 0x89, 0x93, 0x08, 0xb9, 0xb6, 0x8e, 0xb3, 0xbd,
  0xf8, 0x67, 0x10, 0x5f, 0x13, 0x8d, 0x91, 0x3b, 0x7e, 0x46, 0xe7, 0x17,
  0x73, 0x0d, 0x49, 0x56, 0x3e, 0x17, 0x3a, 0xe6, 0x28, 0xe1, 0x95, 0xa2,
  0x4f, 0x2e, 0x32, 0x50, 0xcf, 0x76, 0x5d, 0x4a, 0xca, 0x26, 0x4d, 0x94,
  0xe6, 0xc9, 0x73, 0xec, 0x92, 0xba, 0x2d, 0xe8, 0x6c, 0x19, 0x23, 0x69,
  0xed, 0x72, 0xf5, 0xeb, 0x30, 0x5a, 0xe9, 0x36, 0x33, 0x66, 0xbd, 0x06,
  0x75, 0x0f, 0x98, 0x48, 0x95, 0xe9, 0x17, 0x8a, 0xb2, 0x3b, 0x29, 0x9d,
  0x47, 0x2c, 0x1f, 0x55, 0x73, 0xfb, 0xbd, 0x09, 0x68, 0x8e, 0xbf, 0x3d,
  0xe5, 0x9e, 0xec, 0xcd, 0x2c, 0x71, 0x8f, 0x24, 0xce, 0xce, 0x74, 0xc7,
  0x08, 0x7f, 0x03, 0x2a, 0x36, 0x6a, 0x9e, 0xfa, 0x0b, 0x9a, 0xd3, 0x17,

  0xbb, 0x31, 0x3f, 0xb1, 0x1b, 0x49, 0x29, 0x8a, 0xee, 0xe9, 0xa2, 0xac,
  0x35, 0xfe, 0x42, 0xca, 0x05, 0xd7, 0xdd, 0x1a, 0x6e, 0xf0, 0x9d, 0xfc,
  0x80, 0x8f, 0xa6, 0x33, 0x1c, 0x3f, 0x35, 0x90, 0x29, 0xce, 0x9d, 0xb2,

  0x21, 0xb6, 0xaa, 0x2b, 0x16, 0x26, 0x6d, 0xc3, 0x5a, 0x93, 0x2f, 0x92,
  0x1f, 0x7e, 0x18, 0x24, 0xc6, 0x48, 0xee, 0x0c, 0xf7, 0x43, 0x63, 0x7e,


  0x6a, 0x68, 0xf1, 0x07, 0x2e, 0x58, 0xfa, 0xe1, 0x9a, 0x8c, 0x40, 0x72,
  0x30, 0xd7, 0x0b, 0x8a, 0x1e, 0xb1, 0x9a, 0xdd, 0xf6, 0xca, 0x71, 0x3d,
  0xf4, 0x86, 0xd4, 0x2c, 0x67, 0xb7, 0x73, 0x2a, 0xa6, 0x39, 0xb0, 0xf5,
  0xb2, 0x10, 0xeb, 0x84, 0x89, 0x13, 0xf7, 0x1e, 0x72, 0x60, 0xfb, 0x77,
  0xdb, 0x8e, 0x90, 0x62, 0x7b, 0x57, 0x65, 0x2c, 0xe9, 0x21, 0xaa, 0x72,
  0x4f, 0x4c, 0x69, 0xf5, 0x30, 0xcc, 0xcd, 0x84, 0xc3, 0xa5, 0xc4, 0x4c,
  0x4f, 0xc9, 0xb9, 0xce, 0x65, 0x60, 0x5d, 0x31, 0xee, 0x4c, 0x49, 0xaa,

  0x8d, 0x5b, 0x5d, 0xdd, 0xd5, 0x94, 0xc9, 0x21, 0xb3, 0x09, 0x6e, 0x4f,


  0x6f, 0x82, 0xb1, 0xec, 0x3d, 0x15, 0xf5, 0x10, 0x1f, 0x20, 0xe6, 0xd7,

  0x62, 0x9d, 0x66, 0x46, 0xdb, 0xc3, 0x6d, 0x1b, 0x0b, 0x93, 0x7c, 0x99,
  0x20, 0x97, 0xde, 0x26, 0x67, 0xbb, 0xe4, 0xc3, 0xe0, 0x93, 0x5e, 0x52,

  0x5c, 0xe9, 0xa7, 0x3b, 0xba, 0xe2, 0x76, 0xaa, 0x4e, 0xd5, 0x28, 0xbe,

  0x7c, 0x5f, 0xf8, 0x4f, 0xc4, 0xe1, 0x84, 0xb4, 0x48, 0x98, 0x1e, 0x3a,
  0x00, 0xbc, 0x21, 0x2e, 0x3c, 0x34, 0x1c, 0x02, 0x67, 0x64, 0xc5, 0xd8,



  0x20, 0x44, 0x12, 0xc8, 0x3c, 0xb8, 0xa3, 0x4a, 0xb0, 0xd5, 0x22, 0xe0,
  0xb7, 0x92, 0x0a, 0xa8, 0xc5, 0xd6, 0x74, 0xc1, 0x09, 0x90, 0xe2, 0xa6,
  0x10, 0x40, 0x81, 0x71, 0x09, 0xaf, 0xcc, 0x14, 0x39, 0x0c, 0x92, 0x2e,
  0x23, 0x35, 0x65, 0x11, 0x2b, 0x90, 0x64, 0x60, 0xa0, 0x03, 0xd1, 0x7c,
  0xbe, 0x48, 0xb6, 0xfa, 0x35, 0xa1, 0xad, 0xee, 0x1b, 0xc8, 0x80, 0x74,
  0x2e, 0x4e, 0xa9, 0x97, 0xc7, 0x44, 0x76, 0x24, 0x93, 0x6e, 0xf8, 0x77,
  0x4e, 0x68, 0xe3, 0x92, 0x2e, 0x91, 0xaf, 0xbb, 0x9c, 0x20, 0x5c, 0x47,
  0x22, 0xfb, 0x2e, 0xcb, 0xca, 0xa3, 0x0f, 0x97, 0xa7, 0x94, 0xc3, 0x7d,

  0x0d, 0xe9, 0xc5, 0xd2, 0xce, 0x7b, 0x3a, 0x08, 0xc5, 0xeb, 0xdb, 0x54,
  0x71, 0x42, 0xdf, 0x13, 0x97, 0xb4, 0x8a, 0x0e, 0x7b, 0xa3, 0x57, 0x0b,
  0xe0, 0x74, 0x68, 0xad, 0x0b, 0x54, 0xa2, 0x60, 0x77, 0x0e, 0x76, 0x6d,
  0x75, 0x24, 0xc0, 0x36, 0x38, 0x33, 0x5b, 0xf4, 0x84, 0xad, 0xab, 0x92,
  0x73, 0x89, 0xb6, 0x5e, 0x50, 0xe1, 0x9e, 0xdc, 0x46, 0xac, 0x51, 0x61,
  0x10, 0x3a, 0xc3, 0x21, 0x53, 0xeb, 0xeb, 0xd3, 0x77, 0x47, 0xed, 0x0c,
  0x5c, 0xfc, 0x24, 0xe6, 0x7c, 0x35, 0xec, 0xea, 0xad, 0xe1, 0x30, 0x4c,
  0x03, 0x69, 0xa0, 0xcd, 0x31, 0x6d, 0x99, 0x69, 0x5d, 0x66, 0xcd, 0xea,
  0x66, 0x9d, 0xcf, 0x76, 0x76, 0x89, 0x46, 0xa8, 0xdc, 0x64, 0x88, 0x1a,
  0x27, 0x36, 0x0d, 0xeb, 0x64, 0x87, 0x15, 0xf4, 0x2a, 0x6b, 0xd6, 0x55,
  0xc1, 0x0e, 0x73, 0x9a, 0x7b, 0xd7, 0xc8, 0x32, 0xd2, 0x99, 0x45, 0x9d,
  0xef, 0x1c, 0x10, 0xcc, 0x1c, 0x4e, 0x61, 0xe2, 0x01, 0x8d, 0xb9, 0x7b,
  0x6a, 0xf3, 0x3e, 0x70, 0xf0, 0x58, 0x4b, 0x20, 0xbf, 0xfc, 0x9d, 0x48,





  0x5e, 0x9d, 0x9d, 0xbd, 0x79, 0x75, 0xf1, 0xca, 0xae, 0x0d, 0x02, 0x1a,
  0xcc, 0x05, 0x1a, 0xb2, 0xe1, 0x43, 0xa4, 0x35, 0xd1, 0x93, 0xdb, 0xbf,
  0xff, 0x30, 0x3e, 0x3a, 0xef, 0x1e, 0xec, 0xd9, 0xf9, 0x29, 0x01, 0x12,
  0xfd, 0xfe, 0x87, 0x57, 0xab, 0xd5, 0x42, 0x83, 0x82, 0x6f, 0xd2, 0x26,
  0xdd, 0x0e, 0x6e, 0xf5, 0xe1, 0x2e, 0xcd, 0xef, 0xc6, 0xce, 0x6f, 0x2e,



  0x42, 0x0e, 0xa6, 0x7e, 0xf2, 0x91, 0x0e, 0xb4, 0x9a, 0x6a, 0xfa, 0xad,

  0xdd, 0x0d, 0x6c, 0x00, 0xb2, 0x67, 0xfb, 0x17, 0x52, 0x3a, 0x4e, 0xa6,
  0x89, 0x64, 0xba, 0x59, 0x0b, 0x63, 0x64, 0x67, 0xd3, 0x75, 0xa3, 0x24,
  0x0f, 0xfa, 0xa2, 0x2a, 0xee, 0xee, 0xbe, 0x04, 0xc7, 0xe3, 0xc2, 0x28,
  0xcc, 0x05, 0x00, 0x22, 0x60, 0x08, 0x0d, 0x29, 0xd2, 0x23, 0x99, 0x2d,
  0x73, 0xb1, 0x08, 0x4d, 0xcd, 0x32, 0x0e, 0xab, 0x00, 0x54, 0x80, 0xa7,
  0x14, 0x6c, 0xc8, 0xef, 0xcc, 0x6d, 0x1c, 0x26, 0x47, 0x52, 0xed, 0x86,
  0x85, 0x9b, 0x1f, 0x04, 0x0f, 0x35, 0xd6, 0x7c, 0x10, 0x76, 0x1f, 0xe7,
  0x15, 0x1e, 0xd0, 0xc6, 0x56, 0x57, 0x04, 0x70, 0x69, 0xab, 0x79, 0x88,
  0xa6, 0x4d, 0x9b, 0x0e, 0xeb, 0x69, 0x2b, 0x92, 0xf4, 0x34, 0x4c, 0x2f,
  0x89, 0xbc, 0xcc, 0xa3, 0x46, 0xbb, 0x36, 0x46, 0x13, 0xfd, 0x6b, 0xef,
  0x60, 0xb4, 0xbf, 0x15, 0x4e, 0x9e, 0x2e, 0x0b, 0x40, 0x52, 0x6c, 0x54,
  0x8d, 0xb8, 0x61, 0x53, 0x96, 0xf7, 0xce, 0x8f, 0x59, 0x98, 0xd1, 0x4f,
  0x57, 0x66, 0xfc, 0xe8, 0x54, 0x86, 0xa7, 0x41, 0x16, 0x08, 0x65, 0xee,
  0x56, 0xca, 0x14, 0x0d, 0x4f, 0x2c, 0xca, 0x1b, 0x5a, 0x89, 0x21, 0xb5,
  0xc5, 0xa2, 0x85, 0x66, 0xb3, 0x15, 0xdf, 0xe6, 0x02, 0xc0, 0x51, 0x59,

  0x77, 0xb7, 0xa3, 0x91, 0x6b, 0x55, 0x3e, 0x7d, 0x0d, 0xcf, 0xa6, 0xbc,

  0xc2, 0x8a, 0xb4, 0x94, 0xe0, 0x83, 0x09, 0x18, 0x2e, 0x17, 0xf0, 0xbd,
  0x85, 0x9f, 0x99, 0x31, 0xd4, 0xf4, 0x90, 0x21, 0x0d, 0x42, 0x5a, 0xe9,
  0x4b, 0xae, 0x55, 0x0f, 0x6c, 0xf9, 0x77, 0xe9, 0x6d, 0xbe, 0x5c, 0x2f,
  0xf1, 0x31, 0xa2, 0x6d, 0x79, 0x4c, 0xe2, 0x09, 0xf0, 0x2a, 0x72, 0x7a,
  0x0a, 0x88, 0x7c, 0xbb, 0x4e, 0x3c, 0x8b, 0x3e, 0x26, 0x64, 0x8c, 0x48,
  0x1e, 0xb9, 0xe5, 0x41, 0x59, 0x40, 0xc0, 0xa1, 0xee, 0x78, 0x03, 0x8c,
  0x7e, 0x90, 0x52, 0xce, 0x41, 0x5d, 0xda, 0x84, 0x9d, 0x08, 0x3b, 0x67,
  0xb0, 0x04, 0xd1, 0xe1, 0xbc, 0x7c, 0xd5, 0xac, 0xca, 0xcb, 0x99, 0xbd,
  0x37, 0xa4, 0x3f, 0xe6, 0xc5, 0xda, 0xec, 0x33, 0xfb, 0x92, 0x39, 0x08,
  0x41, 0xbf, 0x0a, 0x3c, 0x84, 0xc8, 0xaa, 0x1f, 0xa3, 0x58, 0x42, 0x53,
  0x50, 0x9f, 0x8d, 0x1e, 0x1d, 0x8e, 0xf6, 0x07, 0x2d, 0x83, 0x5e, 0x30,
  0x25, 0xcc, 0xed, 0x9a, 0xe6, 0x4b, 0x5b, 0x6f, 0x3a, 0xfa, 0xcd, 0x1c,
  0x37, 0xc8, 0x08, 0x5f, 0xa6, 0xb7, 0x38, 0xbe, 0xe8, 0xb1, 0x96, 0xc9,
  0xcb, 0xaf, 0x4f, 0xc7, 0x17, 0x07, 0x2f, 0xce, 0x4e, 0xcf, 0xcd, 0x7f,
  0xe9, 0xef, 0x87, 0xf8, 0xfb, 0x61, 0x60, 0x55, 0xbe, 0x95, 0x0c, 0x5a,
  0x2d, 0xd6, 0x81, 0x86, 0x02, 0x8d, 0x86, 0x77, 0x33, 0xf1, 0x06, 0x22,
  0xbd, 0x1c, 0x6c, 0x70, 0x6a, 0x2b, 0x1a, 0xbb, 0x47, 0xec, 0x7d, 0x4a,
  0x93, 0xec, 0x46, 0x49, 0x98, 0xc8, 0x97, 0x37, 0xaa, 0x4d, 0x49, 0x2d,
  0xbc, 0x56, 0xd9, 0x77, 0x7d, 0xdd, 0x5c, 0xc7, 0x2c, 0xf5, 0x39, 0x8a,
  0x57, 0x87, 0xdc, 0xb0, 0xf6, 0xaf, 0xa6, 0x0b, 0xa3, 0xdd, 0x67, 0x94,
  0x4b, 0x32, 0xcb, 0x38, 0xc0, 0x42, 0x3f, 0x89, 0x19, 0x26, 0xe6, 0xfa,
  0x49, 0xc9, 0x42, 0x90, 0x60, 0x08, 0x8a, 0xd4, 0xa8, 0x8e, 0x99, 0x8d,
  0x99, 0x63, 0x6e, 0x34, 0x71, 0xde, 0x8e, 0x22, 0x0b, 0x2a, 0x04, 0x18,
  0x47, 0xce, 0x77, 0x62, 0xa1, 0x48, 0x1f, 0xe5, 0xf6, 0xef, 0x4f, 0x2f,
  0x92, 0x74, 0x3e, 0x57, 0x6c, 0x00, 0x2a, 0x4b, 0x20, 0x8d, 0x75, 0x6f,
  0xc5, 0x92, 0x2c, 0x6d, 0x62, 0xa9, 0x1b, 0xa2, 0x8f, 0x5c, 0x9c, 0x8c,
  0xf7, 0xc8, 0x85, 0xc5, 0x49, 0x70, 0xe3, 0xf7, 0xc7, 0x83, 0x96, 0xaf,
  0xda, 0x4f, 0x7d, 0xd9, 0x25, 0x49, 0x19, 0x57, 0x28, 0x52, 0x4f, 0x16,
  0x3a, 0xc4, 0x19, 0x4a, 0xaa, 0xc3, 0x91, 0x6e, 0x49, 0x35, 0xd8, 0x16,
  0x8e, 0x76, 0x2b, 0xd1, 0xa8, 0x29, 0xec, 0xe2, 0xe5, 0xaa, 0xb9, 0x0b,
  0xeb, 0x45, 0xe1, 0xdb, 0x20, 0x1c, 0x16, 0x52, 0x3a, 0xb6, 0xc8, 0x2c,
  0xa1, 0x65, 0x61, 0x49, 0x5b, 0x23, 0x1e, 0xf6, 0x70, 0x0b, 0xa3, 0x62,
  0x50, 0xf3, 0x77, 0x1a, 0x13, 0x44, 0x3b, 0xc9, 0x62, 0xe9, 0xfd, 0xfc,
  0x21, 0x6f, 0xf0, 0xc4, 0x0e, 0x6f, 0x26, 0x66, 0xeb, 0xd4, 0x94, 0x3a,
  0x88, 0xc1, 0x94, 0x55, 0x7e, 0x49, 0x79, 0x02, 0xdd, 0xd2, 0x31, 0x37,
  0x91, 0xc0, 0x33, 0x45, 0xca, 0x58, 0xdd, 0x6c, 0x79, 0xae, 0x84, 0x26,

  0x48, 0xd0, 0x47, 0xda, 0x68, 0xa5, 0x26, 0x8d, 0x4e, 0x87, 0xf8, 0x4f,
  0x13, 0xd1, 0xe3, 0x59, 0xd9, 0x33, 0xab, 0x23, 0xb9, 0xe3, 0x82, 0x40,
  0x5a, 0xfa, 0xa3, 0x77, 0x09, 0x48, 0x38, 0xc7, 0x8d, 0x32, 0x70, 0x0e,
  0x1b, 0x75, 0x87, 0x63, 0xc4, 0x36, 0xc3, 0x11, 0xb4, 0xea, 0x63, 0xeb,
  0xe0, 0xf0, 0xd9, 0x68, 0xdf, 0xfc, 0x9f, 0x39, 0x14, 0xd1, 0x8f, 0x00,
  0x17, 0xe5, 0x60, 0x81, 0xec, 0x93, 0xd9, 0x6d, 0x97, 0x24, 0x59, 0x00,
  0x95, 0xd5, 0xe5, 0xd6, 0xc6, 0x1a, 0xd6, 0x96, 0x48, 0xa1, 0x83, 0xb4,

  0xe2, 0x24, 0x9d, 0xc9, 0x4f, 0xf4, 0x8e, 0x57, 0xeb, 0x45, 0x24, 0xad,
  0xcf, 0x73, 0x23, 0x93, 0x76, 0xb6, 0xb8, 0x16, 0x27, 0xf2, 0xd7, 0xc4,
  0x9b, 0xb8, 0x8e, 0x6f, 0xd4, 0x4a, 0x8a, 0x7a, 0xde, 0xf2, 0x09, 0xbe,
  0x16, 0x93, 0x0d, 0x9c, 0x79, 0x68, 0x2e, 0xc3, 0xcb, 0x72, 0x3e, 0xaf,

  0xb3, 0xa6, 0x2b, 0x80, 0x5e, 0xcb, 0x23, 0x7b, 0xe7, 0x00, 0x38, 0x04,
  0xa7, 0xd2, 0x8a, 0x9b, 0xa4, 0x0d, 0xcb, 0x93, 0x48, 0x16, 0x1a, 0xb3,
  0x2d, 0x1e, 0x6e, 0x14, 0x29, 0x32, 0xf0, 0x7f, 0xaf, 0x19, 0x22, 0x5c,
  0x15, 0xaf, 0x60, 0x2f, 0x28, 0xb7, 0x62, 0x1c, 0x17, 0x91, 0x74, 0x5d,
  0x54, 0x36, 0xbd, 0x12, 0x9f, 0xf2, 0xd5, 0x8a, 0xcc, 0x1b, 0x46, 0x38,
  0x03, 0xd9, 0xda, 0x00, 0x1a, 0xe2, 0xb8, 0x20, 0x65, 0xcd, 0x16, 0x34,
  0x4a, 0xf2, 0x54, 0x64, 0xfe, 0x24, 0x9b, 0x87, 0x41, 0x20, 0x4e, 0x6a,
  0xf4, 0x61, 0x6d, 0xa4, 0x46, 0x77, 0x46, 0x10, 0x36, 0x45, 0xaa, 0x2c,
  0x66, 0xee, 0x01, 0x3e, 0x48, 0xf1, 0xdf, 0x20, 0x72, 0xff, 0x5d, 0x71,
  0x96, 0xf5, 0xc3, 0x8d, 0x8f, 0xff, 0x9f, 0x23, 0x07, 0x42, 0x64, 0x51,
  0x7e, 0xb8, 0xdc, 0x25, 0x56, 0x3c, 0x64, 0x6e, 0xe1, 0xf0, 0xb5, 0x39,
  0xaf, 0x2d, 0x4c, 0xc5, 0xa5, 0x9a, 0x94, 0x9d, 0x72, 0x0c, 0xd8, 0x3d,
  0xa4, 0x49, 0x40, 0x1b, 0xda, 0xa3, 0xba, 0xff, 0x40, 0x34, 0x30, 0x46,
  0x25, 0xfb, 0x17, 0x65, 0x8d, 0xb8, 0x1d, 0x8d, 0x54, 0xcd, 0xf9, 0x35,
  0x27, 0xa2, 0x2c, 0xee, 0xe5, 0x05, 0xa9, 0x8c, 0xac, 0xc0, 0x04, 0x25,
  0x19, 0x5a, 0x07, 0xcb, 0x68, 0x27, 0xeb, 0xe6, 0x37, 0x8c, 0x9d, 0x54,
  0x44, 0xbf, 0x80, 0xb1, 0xf3, 0x88, 0x7a, 0xca, 0x44, 0x4d, 0x58, 0x9d,
  0xc3, 0xbf, 0x19, 0x2b, 0xfb, 0xa5, 0xba, 0x29, 0xfa, 0x80, 0x01, 0xd4,
  0xa9, 0x41, 0x45, 0x14, 0x30, 0xc2, 0x40, 0x1b, 0x16, 0x9f, 0x46, 0xb7,
  0x9a, 0x61, 0x75, 0x52, 0xe8, 0x32, 0x00, 0x02, 0xed, 0xde, 0xf9, 0x39,
  0x40, 0x6f, 0xbc, 0xf2, 0x6f, 0x5b, 0x3b, 0x39, 0xa2, 0x28, 0xd5, 0x82,
  0x47, 0xa8, 0x39, 0xb1, 0x52, 0xc6, 0x50, 0xa3, 0x21, 0x0f, 0x64, 0x6e,
  0x5e, 0x0c, 0xb9, 0xb8, 0x5a, 0x9f, 0x45, 0x30, 0x8d, 0x50, 0xdb, 0x84,
  0x1c, 0xf9, 0x88, 0xd8, 0x0c, 0x6f, 0x24, 0xb1, 0x02, 0x6a, 0x2d, 0x3e,
  0x1b, 0x73, 0xa3, 0xb3, 0x2f, 0x12, 0x0e, 0x44, 0xfe, 0x38, 0x39, 0xc8,
  0x3e, 0x19, 0xdd, 0xb9, 0x18, 0xd0, 0x4f, 0x51, 0x88, 0x6a, 0x2f, 0x19,
  0xfb, 0x36, 0x9a, 0x8c, 0x83, 0x16, 0x59, 0x44, 0x97, 0xf5, 0x9e, 0x95,
  0x47, 0x3d, 0x37, 0xca, 0xfb, 0xac, 0x91, 0xd4, 0x11, 0x9e, 0xbc, 0xd6,
  0x66, 0xa1, 0xbe, 0xeb, 0x78, 0xde, 0x19, 0x0e, 0x70, 0x71, 0x59, 0xd3,
  0xae, 0xd6, 0x97, 0x18, 0x2e, 0x63, 0x64, 0x91, 0x2f, 0x74, 0x60, 0xae,
  0xc1, 0x96, 0xfa, 0x65, 0x79, 0x05, 0xf1, 0xd4, 0x05, 0x9d, 0x0e, 0xb9,
  0x89, 0x9a, 0x59, 0x8c, 0x26, 0x59, 0xf7, 0xd5, 0x0b, 0x29, 0xd0, 0x81,
  0x7e, 0x3a, 0x04, 0x81, 0xa0, 0x21, 0x7a, 0xef, 0xbe, 0xa6, 0x89, 0x2b,
  0x91, 0xaa, 0x42, 0xaf, 0xaa, 0x94, 0x52, 0x68, 0xaa, 0x99, 0x7a, 0x46,
  0x74, 0xa2, 0x86, 0x0b, 0x8b, 0x5d, 0x74, 0x93, 0x82, 0xd2, 0xec, 0xf8,
  0xb1, 0xda, 0x07, 0x2f, 0xff, 0x71, 0x38, 0x71, 0xe4, 0xec, 0xe0, 0x73,
  0xa2, 0x69, 0x4a, 0xf2, 0x10, 0xd1, 0xbc, 0x11, 0x2c, 0xdb, 0x8d, 0x57,
  0x5c, 0x0a, 0x44, 0x1a, 0xbb, 0x29, 0xbc, 0x85, 0x37, 0x57, 0xe5, 0x22,
  0x8b, 0x85, 0x48, 0xbc, 0x92, 0x5f, 0x80, 0xbb, 0x50, 0x5a, 0x2f, 0xbc,
  0xcd, 0xd7, 0xc8, 0x18, 0x6e, 0x85, 0x4e, 0x8c, 0x7e, 0x97, 0xa5, 0x54,
  0x70, 0x64, 0x93, 0xe6, 0xaf, 0x07, 0x41, 0x1a, 0xbb, 0xb9, 0xe7, 0x93,
  0xb2, 0xb6, 0xf4, 0x42, 0x85, 0xb5, 0x24, 0x41, 0x6e, 0xd2, 0x0a, 0x8c,
  0x59, 0x50, 0xb2, 0x14, 0x40, 0xd4, 0xcf, 0x19, 0x24, 0x55, 0xb0, 0x5b,
  0xef, 0x90, 0x53, 0x31, 0xba, 0x21, 0x13, 0xa3, 0x00, 0x90, 0x9b, 0x16,
  0xb4, 0x43, 0x43, 0x0a, 0xfe, 0xd5, 0x15, 0xa0, 0x70, 0xa5, 0x62, 0xdd,
  0xdc, 0xc3, 0x2b, 0x92, 0xe9, 0x79, 0xb3, 0x4e, 0x9b, 0x87, 0x25, 0x6c,
  0xf7, 0xf1, 0x26, 0x66, 0x4e, 0x7e, 0x3e, 0x6a, 0x1f, 0x66, 0x43, 0x4f,
  0x14, 0xd1, 0x3f, 0xc8, 0x97, 0x74, 0xd7, 0xfe, 0xc7, 0x3d, 0x8c, 0xe9,
  0x0c, 0x88, 0x7e, 0x57, 0x6d, 0x48, 0x28, 0xd4, 0xe4, 0x8a, 0x3c, 0xd1,
  0xca, 0x37, 0x1e, 0x53, 0xc5, 0xfd, 0x71, 0x24, 0xd0, 0x8f, 0xe8, 0x98,
  0x99, 0xce, 0xe2, 0xce, 0x0d, 0xe8, 0x95, 0xcc, 0x6a, 0x86, 0xb7, 0x07,
  0x97, 0x67, 0xbf, 0x10, 0x64, 0x2d, 0x6d, 0x8d, 0x8d, 0x0a, 0xce, 0xdf,
  0x7c, 0xb1, 0xa5, 0xe8, 0xa3, 0x16, 0x4e, 0x49, 0xb8, 0x88, 0x14, 0x6d,
  0x69, 0xfd, 0x87, 0xfa, 0xea, 0xe9, 0xfa, 0x77, 0x87, 0x23, 0x28, 0xee,
  0x83, 0x2f, 0xbe, 0x7d, 0x75, 0xf2, 0xe1, 0xe8, 0xe0, 0x8f, 0x09, 0xfd,
  0xeb, 0x90, 0xff, 0x75, 0xb8, 0x15, 0x3b, 0x2e, 0xc3, 0xa8, 0xb6, 0xbf,
  0xd8, 0x4e, 0xea, 0xbb, 0xe5, 0xa4, 0x5c, 0xd8, 0x03, 0x93, 0xad, 0xd0,
  0x40, 0xda, 0x40, 0xa4, 0xb8, 0x2d, 0xdd, 0x16, 0x57, 0x79, 0x97, 0x65,

  0xd7, 0x92, 0x74, 0xa8, 0xec, 0x06, 0x11, 0x3c, 0xbf, 0x96, 0xb8, 0x41,
  0xa5, 0xb5, 0xf2, 0x30, 0x89, 0xe5, 0xf5, 0x25, 0x82, 0x42, 0x28, 0xe9,


  0xc5, 0xae, 0x23, 0x9c, 0x83, 0xc5, 0x8b, 0x83, 0x74, 0xf6, 0x19, 0x46,
  0x98, 0x6d, 0x66, 0xb8, 0x13, 0xae, 0x94, 0xc5, 0x9d, 0xe6, 0xd7, 0xc5,
  0x40, 0x20, 0x34, 0x8e, 0x3b, 0xc1, 0x1f, 0xd8, 0xae, 0x32, 0xcb, 0x7a,
  0xb1, 0x6a, 0x7a, 0xb7, 0x3b, 0xdc, 0x44, 0x74, 0x17, 0x0f, 0x9a, 0xeb,
  0x84, 0xd0, 0xc0, 0x86, 0x9a, 0x9e, 0xe1, 0x5c, 0x1d, 0x64, 0x8c, 0xce,
  0x48, 0xb3, 0x56, 0x7f, 0x46, 0xe2, 0x81, 0x3f, 0x5b, 0x18, 0x49, 0xc1,
  0x61, 0x4c, 0x5a, 0x21, 0x41, 0xf6, 0x35, 0x87, 0xd0, 0x2b, 0x0c, 0x04,


  0x63, 0x36, 0x07, 0xe9, 0x26, 0xcb, 0x20, 0x3b, 0xab, 0x30, 0x9a, 0xe4,
  0x8e, 0x61, 0xef, 0xbb, 0x3e, 0x26, 0x88, 0x1e, 0x9f, 0xb8, 0x25, 0x1a,
  0x1b, 0x51, 0xed, 0x89, 0x15, 0x5c, 0x5c, 0xb5, 0x04, 0x8d, 0xaa, 0x7c,
  0x5a, 0xe0, 0xcc, 0xf1, 0x59, 0x91, 0x1c, 0x3c, 0x0c, 0x93, 0x29, 0x65,
  0x6f, 0x2e, 0xd2, 0x00, 0x89, 0x06, 0x77, 0x4d, 0xe1, 0x30, 0x28, 0xd0,
  0x6f, 0x09, 0xdf, 0x7c, 0xff, 0x6e, 0x91, 0xed, 0xaa, 0x61, 0xa0, 0xc2,
  0x6e, 0xef, 0x5d, 0xf9, 0x0f, 0x33, 0xef, 0x54, 0x3e, 0x12, 0x93, 0x99,
  0x22, 0x02, 0x7b, 0x67, 0xee, 0xf8, 0x0b, 0x97, 0x89, 0xfb, 0x5c, 0xa3,
  0x65, 0x1b, 0x23, 0x08, 0x4c, 0x7a, 0x19, 0x52, 0xb5, 0x03, 0xd2, 0x11,
  0xed, 0x22, 0x90, 0xd0, 0x1e, 0xde, 0x8c, 0x21, 0xe5, 0x52, 0x32, 0x74,
  0x2c, 0x89, 0x89, 0xd8, 0xe9, 0xb2, 0xf0, 0xae, 0x4e, 0xd5, 0x23, 0x88,
  0x8e, 0x6e, 0xb3, 0x6a, 0x4a, 0x50, 0x13, 0x53, 0xa3, 0x97, 0x82, 0x9f,
  0xce, 0xc5, 0x3d, 0x45, 0xb9, 0x54, 0x92, 0x15, 0xdf, 0xc6, 0x85, 0x81,
  0xf8, 0x55, 0x3a, 0xeb, 0x25, 0x31, 0xe4, 0x3e, 0x4c, 0x0d, 0x61, 0x8c,
  0x2c, 0x04, 0x9e, 0x0a, 0xc8, 0x36, 0xfb, 0xd0, 0x22, 0x33, 0x84, 0x13,
  0x82, 0x8c, 0x3d, 0xec, 0xb0, 0xbe, 0xe8, 0x9d, 0xa6, 0x90, 0x0b, 0xe6,
  0xc2, 0x80, 0x66, 0x2e, 0x3a, 0x44, 0x50, 0x01, 0xc0, 0x85, 0xea, 0x4f,
  0x4f, 0xb4, 0xa7, 0x03, 0xfc, 0x0e, 0x44, 0x4b, 0x8a, 0x3b, 0x45, 0x93,
  0xda, 0x81, 0xd8, 0x64, 0xe5, 0x50, 0x31, 0x07, 0xa1, 0x79, 0x85, 0xc5,
  0xc8, 0x8b, 0xf2, 0x86, 0x62, 0x30, 0x6d, 0x04, 0x50, 0x05, 0xfb, 0xe1,
  0x9c, 0x3a, 0xe6, 0xcb, 0x43, 0xd2, 0x95, 0xf8, 0xb3, 0x23, 0x8d, 0xd6,
  0x46, 0x29, 0x40, 0xcb, 0x69, 0xbb, 0x95, 0x48, 0xa9, 0xcb, 0xa0, 0x68,
  0xd8, 0x99, 0xcc, 0xfa, 0x85, 0x03, 0xe0, 0x8a, 0x09, 0x36, 0xac, 0x78,
  0x52, 0x36, 0x57, 0x5e, 0x1e, 0x2a, 0x81, 0xfa, 0x91, 0x9f, 0x67, 0xbe,
  0x6e, 0x60, 0x04, 0xa8, 0x19, 0xd8, 0x48, 0xaa, 0xb1, 0x38, 0x8b, 0x82,
  0xac, 0x87, 0x4f, 0x04, 0xfe, 0x46, 0x4b, 0xb4, 0x00, 0xb6, 0x94, 0x40,
  0x5b, 0x20, 0x53, 0x9c, 0xe8, 0xd2, 0x18, 0xc0, 0xc0, 0x17, 0x34, 0xdf,
  0xa4, 0x44, 0xa5, 0xba, 0x26, 0x2c, 0x39, 0xa4, 0xa4, 0x9a, 0x8d, 0x0d,
  0x20, 0x27, 0x00, 0x92, 0x54, 0xf8, 0x47, 0xba, 0xc3, 0xf0, 0x37, 0x0e,
  0xb8, 0x89, 0x71, 0x31, 0xc8, 0x6a, 0x9f, 0xc8, 0xd1, 0xd4, 0xb8, 0xbf,
  0x44, 0x0f, 0x11, 0xa7, 0x88, 0xd5, 0x5f, 0x7b, 0x2e, 0xec, 0xbf, 0x6c,
  0xd4, 0x04, 0x46, 0x5e, 0x55, 0x33, 0x80, 0x2e, 0x20, 0x88, 0x6d, 0x62,
  0x3c, 0xb6, 0x3b, 0x64, 0x5c, 0xa9, 0x8b, 0xbf, 0xc5, 0xe2, 0xbc, 0xeb,
  0xd5, 0x0c, 0x6a, 0x9f, 0xbe, 0x03, 0x45, 0xc9, 0x03, 0xc2, 0xac, 0x4b,
  0xb9, 0x8d, 0x18, 0x9e, 0x98, 0x8c, 0xe3, 0x32, 0x31, 0x90, 0x9c, 0xee,
  0xfd, 0xf7, 0x03, 0x2c, 0x2d, 0xa4, 0x36, 0xf6, 0xe1, 0x2c, 0x7d, 0xde,
  0x60, 0x5e, 0x84, 0xf0, 0x1d, 0x1a, 0xda, 0xaf, 0x63, 0x81, 0x4a, 0x15,
  0xe0, 0x86, 0xc3, 0xff, 0x6d, 0x5d, 0x4c, 0x3b, 0x32, 0xaa, 0x1c, 0x78,
  0x78, 0x9c, 0x12, 0x95, 0xb5, 0x12, 0xa2, 0x4b, 0xf4, 0xf8, 0x90, 0xc0,
  0xdf, 0x50, 0x45, 0x28, 0x55, 0x6f, 0x90, 0x78, 0x5b, 0x78, 0x25, 0xb4,
  0x57, 0xb9, 0x39, 0xa1, 0x6a, 0x7a, 0x05, 0x24, 0x01, 0xf8, 0x91, 0x32,
  0x75, 0x8e, 0x06, 0x8a, 0xb0, 0x78, 0xfe, 0x31, 0xac, 0xe8, 0x62, 0x39,
  0xb1, 0x23, 0x42, 0x0b, 0x29, 0x0b, 0x65, 0xd2, 0x7d, 0xf3, 0x0c, 0x33,
  0xbb, 0xae, 0x68, 0xcf, 0xb3, 0x45, 0xed, 0x04, 0xa4, 0x7d, 0xc7, 0x49,
  0x4a, 0x18, 0xe1, 0x05, 0x7c, 0xb2, 0x2c, 0x8a, 0xf3, 0xe8, 0x0d, 0xc7,
  0x4c, 0x8c, 0x9a, 0x23, 0x93, 0x21, 0xbb, 0x92, 0xe8, 0xe4, 0x4e, 0x31,
  0x66, 0x64, 0x84, 0x2e, 0xcc, 0x4c, 0x20, 0x79, 0x4a, 0xbb, 0x6f, 0x02,
  0x60, 0xa3, 0x5b, 0x95, 0x2b, 0xde, 0x3a, 0x93, 0x0a, 0x39, 0x32, 0xa8,
  0x7c, 0x1a, 0x7d, 0x40, 0x28, 0xfe, 0x35, 0x1c, 0xce, 0x9b, 0x20, 0x5d,
  0xcb, 0x3b, 0xeb, 0x36, 0x09, 0x2c, 0xe6, 0x82, 0xd1, 0xf3, 0x4e, 0xd1,
  0xf8, 0xae, 0xa9, 0x86, 0x27, 0x39, 0x79, 0xcb, 0x5e, 0xbc, 0xd7, 0xe7,
  0xf4, 0xb7, 0xdc, 0x22, 0x14, 0xa1, 0x0e, 0x17, 0x8d, 0x3d, 0x38, 0x41,
  0xf6, 0xdd, 0xb7, 0xdd, 0x32, 0xcc, 0x9d, 0xd3, 0xf1, 0xde, 0xa3, 0xe7,
  0xfb, 0xbb, 0x91, 0x9c, 0x65, 0xf3, 0x0d, 0x1f, 0xa7, 0xf0, 0xf1, 0xfe,
  0x68, 0x7f, 0xb7, 0x33, 0x1b, 0xda, 0xee, 0x0d, 0x00, 0x2a, 0x8a, 0xae,

  0x6e, 0x85, 0x06, 0x92, 0x91, 0x5d, 0xb1, 0x96, 0xe4, 0x4d, 0xfb, 0xc5,
  0xa4, 0xe7, 0xd9, 0xb5, 0x21, 0xb5, 0x68, 0xfe, 0xda, 0x49, 0x5e, 0x8b,
  0x61, 0x43, 0x92, 0x4c, 0x65, 0x0b, 0x55, 0x6b, 0xb7, 0x73, 0x82, 0xf1,
  0x08, 0x09, 0x4b, 0xce, 0x75, 0x88, 0x44, 0x5b, 0x6a, 0x33, 0xa9, 0x0a,
  0x89, 0x79, 0x88, 0xe9, 0xff, 0xea, 0xce, 0x96, 0x57, 0x2d, 0xb4, 0xc7,
  0x67, 0xfe, 0x99, 0x92, 0xa6, 0x3f, 0x4c, 0xeb, 0x69, 0x9e, 0xb3, 0x3d,


  0xd3, 0x63, 0xc6, 0x68, 0xc6, 0x23, 0x30, 0xe4, 0x50, 0x49, 0x9d, 0xa7,
  0x1c, 0xaa, 0x75, 0x40, 0xa5, 0xc1, 0xb0, 0xa4, 0xac, 0x1a, 0x12, 0xdb,
  0x34, 0xae, 0xd8, 0xf0, 0xd4, 0xac, 0x45, 0xb0, 0x95, 0xad, 0x7e, 0x59,
  0x77, 0xd5, 0x28, 0x73, 0x17, 0x18, 0xae, 0x6c, 0x55, 0x85, 0xf5, 0x7d,
  0x94, 0x9b, 0x89, 0x8c, 0xe7, 0xb4, 0xa9, 0x4b, 0xda, 0xa7, 0xd8, 0xa6,
  0xc2, 0x43, 0x01, 0x74, 0x5a, 0x6b, 0x40, 0xd9, 0xbb, 0x2f, 0xf9, 0x40,
  0x5f, 0x0e, 0x5c, 0xba, 0x4e, 0xcb, 0x00, 0x4a, 0x23, 0x8a, 0x20, 0x83,
  0xeb, 0x27, 0x08, 0x8f, 0x73, 0x25, 0x15, 0x2d, 0x44, 0x5a, 0x4c, 0xc0,
  0xed, 0xc1, 0x39, 0x22, 0xd2, 0x60, 0x82, 0x60, 0x88, 0xec, 0x6e, 0x45,
  0xc0, 0xa5, 0x06, 0x66, 0x7d, 0x80, 0xee, 0x04, 0x05, 0x15, 0xd9, 0x0d,
  0x71, 0xe3, 0x5a, 0x54, 0x89, 0xaa, 0xca, 0xc9, 0x6f, 0x64, 0x93, 0x0b,
  0x58, 0x1d, 0xa3, 0x2c, 0x4c, 0x12, 0xce, 0xb3, 0x48, 0x6d, 0xf7, 0x14,
  0xb7, 0xb3, 0xb6, 0x39, 0xdb, 0x05, 0xe0, 0x27, 0x09, 0x5f, 0x2e, 0xd8,
  0x1b, 0xf4, 0x07, 0xc0, 0xe4, 0x14, 0x74, 0xb6, 0x69, 0xa7, 0x7f, 0x90,
  0xd6, 0xce, 0xf9, 0xcd, 0x0c, 0x6f, 0x56, 0xb6, 0x0c, 0xcc, 0xba, 0x3f,

  0x5c, 0xb2, 0x77, 0x3b, 0xbc, 0xb9, 0xb9, 0x19, 0xd2, 0x85, 0xa3, 0x9c,
  0x1c, 0x29, 0xb3, 0x18, 0xb5, 0xc0, 0xa3, 0x61, 0x57, 0xb2, 0xc9, 0x49,
  0x4c, 0x24, 0x8c, 0x6f, 0x78, 0x29, 0x52, 0xd5, 0x24, 0x6f, 0x50, 0xcf,
  0x27, 0xc4, 0x85, 0xd7, 0xa4, 0xae, 0x4e, 0xa6, 0x03, 0x0d, 0x47, 0x1d,
  0x51, 0x91, 0xdb, 0xe7, 0xd6, 0x42, 0xf0, 0x53, 0xd3, 0x26, 0xa3, 0xfa,

  0x75, 0xf3, 0x89, 0xe5, 0x8b, 0x64, 0xf8, 0x75, 0xb2, 0xf5, 0x5a, 0x56,
  0x7b, 0x61, 0x9e, 0x78, 0xd1, 0x5e, 0x0b, 0x3f, 0x1c, 0x06, 0x73, 0xcc,
  0xbb, 0x5b, 0x0f, 0x83, 0x4f, 0xec, 0xbd, 0xc8, 0xe8, 0xae, 0xe2, 0xb2,
  0x66, 0x9a, 0x88, 0xb3, 0x8e, 0xd2, 0x5e, 0xd8, 0xad, 0xc5, 0x98, 0x67,
  0x58, 0x7a, 0x5a, 0x4b, 0x27, 0x9e, 0x09, 0xdf, 0xf0, 0x0d, 0xd7, 0xb1,
  0x4a, 0x6f, 0xee, 0xbf, 0xe3, 0xde, 0x4d, 0x14, 0xea, 0x5d, 0xc0, 0xd5,
  0xe5, 0xe1, 0x11, 0x93, 0x7f, 0xc7, 0x26, 0x61, 0x46, 0x66, 0x2a, 0x7d,
  0x30, 0x5c, 0x31, 0x15, 0x1b, 0xa6, 0xa2, 0x97, 0x7e, 0xb9, 0xa1, 0x0e,

  0xcd, 0x39, 0x85, 0xdd, 0x2a, 0x5a, 0x91, 0x8f, 0x0e, 0xac, 0x29, 0x96,
  0x65, 0xa9, 0xea, 0x01, 0x8c, 0xc6, 0xad, 0x6e, 0x60, 0x2f, 0xa7, 0xd0,
  0x32, 0x3b, 0xf6, 0xbc, 0x65, 0x0a, 0x02, 0x6e, 0x2c, 0xbd, 0x93, 0xe3,
  0x1c, 0x74, 0x55, 0x15, 0xa0, 0x4c, 0x5c, 0x56, 0x59, 0x45, 0x84, 0x8e,
  0x2c, 0xf8, 0xa1, 0xa6, 0x30, 0xc7, 0x84, 0xb5, 0x61, 0x28, 0xaf, 0xbf,
  0x3a, 0x46, 0x36, 0xb7, 0x61, 0xa4, 0x85, 0x80, 0x38, 0xf0, 0xfc, 0xb9,
  0xe5, 0x91, 0x35, 0x6a, 0x2f, 0x89, 0x95, 0x70, 0x49, 0x64, 0x9a, 0xc4,
  0x00, 0x50, 0xd5, 0xe6, 0x48, 0xd4, 0xb8, 0x90, 0xa4, 0x55, 0xb1, 0x11,
  0xe4, 0xf2, 0xda, 0xf0, 0x6e, 0xea, 0x4a, 0x04, 0xa2, 0xfb, 0x85, 0xaf,
  0x2b, 0xd8, 0x48, 0x5a, 0x4b, 0x04, 0x17, 0xca, 0x5a, 0x90, 0x3e, 0xee,
  0xe8, 0x95, 0x5b, 0x48, 0x65, 0x61, 0xde, 0x9b, 0x7c, 0x3e, 0xde, 0xe1,
  0x0d, 0x67, 0xd2, 0xf1, 0xa4, 0xd8, 0xad, 0xcb, 0x7c, 0x8f, 0x01, 0xd7,
  0x62, 0x91, 0x2f, 0x2d, 0xe6, 0xb9, 0xb5, 0x89, 0x91, 0x86, 0x19, 0xff,
  0x27, 0x49, 0x28, 0xc8, 0x5d, 0xc3, 0xf3, 0x48, 0xf3, 0xd0, 0x7a, 0x49,
  0x7f, 0x34, 0x85, 0xf2, 0x93, 0x84, 0xd8, 0xf8, 0x70, 0x64, 0xff, 0x7d,
  0x41, 0xda, 0xd2, 0x97, 0xe2, 0xa8, 0xa2, 0x3c, 0xf8, 0xda, 0xb3, 0x46,
  0xa4, 0x58, 0x16, 0x73, 0xd7, 0x1a, 0x21, 0xda, 0x86, 0xf8, 0x70, 0x1c,
  0xe1, 0xf4, 0x76, 0x8f, 0x29, 0x8e, 0x60, 0xe7, 0x6b, 0x6e, 0x23, 0xf6,
  0x6f, 0xdd, 0xcd, 0xfb, 0xe2, 0xfe, 0xdd, 0xfb, 0xa9, 0xdb, 0xb7, 0x79,
  0xf7, 0xb8, 0x7d, 0x83, 0x26, 0xcb, 0x7e, 0xe1, 0x39, 0xe8, 0x90, 0xec,
  0xc1, 0xd6, 0x97, 0x75, 0xd4, 0xb5, 0xb9, 0x8c, 0x67, 0x64, 0x7e, 0xf1,
  0x4b, 0x9d, 0x3a, 0x88, 0x11, 0x16, 0x3d, 0x4d, 0x3e, 0x3e, 0x1c, 0x87,
  0x15, 0x71, 0xf6, 0x3e, 0xf6, 0xa2, 0xe8, 0xe1, 0x18, 0x41, 0xf0, 0x8b,
  0xa7, 0x0d, 0x13, 0xf3, 0x04, 0x69, 0x9e, 0xc3, 0xf8, 0x70, 0x5a, 0x08,
  0x28, 0x8a, 0x78, 0xb0, 0xbe, 0x2f, 0x55, 0xf0, 0x3f, 0x7c, 0x71, 0x48,



  0x2b, 0x72, 0x2d, 0x03, 0xfd, 0x8c, 0x10, 0x0e, 0xc1, 0xec, 0x84, 0x7e,
  0x43, 0xbd, 0x3e, 0x02, 0x03, 0xc9, 0x2d, 0xa4, 0x54, 0x25, 0xd8, 0x1d,











  0xb4, 0x37, 0x8c, 0xa0, 0xee, 0x20, 0x0c, 0xf4, 0x94, 0xf3, 0xde, 0x33,
  0xd6, 0xb3, 0xa3, 0xb6, 0x0c, 0xd1, 0xb3, 0xfb, 0x3f, 0x69, 0x7d, 0xa0,
  0x67, 0x47, 0x06, 0x14, 0x61, 0xa8, 0x19, 0xc3, 0x1b, 0x49, 0xf7, 0x09,

  0xaa, 0x15, 0x48, 0xc4, 0xf7, 0xcc, 0x0e, 0xe8, 0x03, 0xa4, 0x14, 0x51,
  0xbc, 0x75, 0x21, 0x70, 0xa1, 0x0c, 0xf3, 0xfe, 0x85, 0x53, 0x66, 0x86,
  0xb4, 0xc8, 0xa1, 0x90, 0xec, 0x08, 0x44, 0xb8, 0x81, 0x52, 0x2d, 0x65,
  0xc6, 0x89, 0x32, 0x20, 0xbf, 0x7e, 0xd1, 0xa8, 0xf8, 0xaa, 0x22, 0xdb,
  0x5b, 0x92, 0xf2, 0xe0, 0xf3, 0x96, 0xa4, 0x74, 0xef, 0x6c, 0x92, 0x91,
  0xe3, 0x8c, 0x13, 0xd2, 0x7c, 0x07, 0x26, 0x5e, 0xe2, 0x2a, 0x6b, 0x6a,
  0xe4, 0x11, 0xa6, 0x36, 0xd1, 0xab, 0x41, 0xd1, 0x31, 0xe7, 0x16, 0x79,
  0xb5, 0x93, 0x48, 0x30, 0xa7, 0xa8, 0x99, 0x58, 0x47, 0xc9, 0xa4, 0x2a,
  0x6f, 0x6a, 0xa8, 0xa3, 0x6a, 0xa0, 0xa6, 0x9c, 0x02, 0x7b, 0x15, 0x94,
  0x44, 0x9b, 0xed, 0x5d, 0x58, 0x1c, 0xd8, 0xaf, 0x2f, 0xde, 0x9d, 0x70,
  0x63, 0x07, 0xae, 0xce, 0xa5, 0x22, 0x24, 0x99, 0xf3, 0x7a, 0xb2, 0x34,
  0x96, 0xb4, 0xd1, 0x4e, 0x1a, 0x66, 0x65, 0xca, 0x1d, 0x83, 0x12, 0x62,
  0x84, 0xf4, 0x24, 0x20, 0xbc, 0x8a, 0xc5, 0x67, 0x44, 0x91, 0xf4, 0x70,
  0xa8, 0x3c, 0x0d, 0xf8, 0xa7, 0xeb, 0xba, 0xc6, 0x4e, 0x46, 0x46, 0x0c,
  0xf4, 0xa8, 0xb7, 0x74, 0x14, 0xf4, 0x48, 0x70, 0xfb, 0x3c, 0x35, 0x0d,
  0xfd, 0xc7, 0x00, 0x29, 0x6d, 0x3d, 0x34, 0xa4, 0x75, 0xd9, 0xe6, 0x23,
  0x40, 0xcd, 0x4a, 0xdb, 0x9a, 0x56, 0x50, 0x56, 0x6b, 0x35, 0x2f, 0xd7,
  0x46, 0xc4, 0x57, 0xbe, 0x48, 0x0f, 0x21, 0x7d, 0x48, 0x02, 0x49, 0xeb,
  0x8a, 0x9c, 0x79, 0xac, 0x55, 0x0f, 0x22, 0x39, 0xf7, 0xa2, 0x90, 0xa8,
  0x37, 0xdf, 0x86, 0x36, 0x5b, 0xa6, 0x9e, 0xf6, 0x4b, 0xa0, 0xb1, 0xbd,
  0x1b, 0x1c, 0x51, 0x12, 0x19, 0xa1, 0x0a, 0xc5, 0x14, 0x38, 0x4d, 0x43,
  0x6c, 0x66, 0x74, 0xb4, 0x03, 0x4b, 0xe1, 0x1c, 0x0f, 0xd4, 0xbb, 0xa8,
  0x82, 0xed, 0x9a, 0x89, 0xd4, 0xae, 0x7f, 0x84, 0xda, 0xcb, 0x00, 0xea,
  0x02, 0x34, 0x17, 0x1a, 0x48, 0x94, 0x6d, 0x7f, 0x57, 0xe8, 0x7f, 0x14,
  0xff, 0xd7, 0xc0, 0x0b, 0xaf, 0xe5, 0xe4, 0x81, 0xf2, 0xe3, 0x85, 0x2e,
  0xb2, 0xbe, 0xcc, 0xaa, 0x4b, 0x2e, 0x43, 0x60, 0x48, 0xd8, 0x28, 0x8a,
  0x45, 0x9a, 0x78, 0x28, 0x6d, 0x49, 0xf2, 0xdf, 0x86, 0x2c, 0x51, 0xe1,
  0xaa, 0x5a, 0x53, 0xfd, 0x8b, 0xf8, 0xd3, 0xb7, 0x87, 0x33, 0x66, 0x2b,
  0xb3, 0xb4, 0x30, 0x3b, 0x61, 0x6e, 0x6c, 0x98, 0x1f, 0xb3, 0x58, 0x7c,
  0xb1, 0x28, 0xd7, 0xf5, 0xdd, 0x76, 0x22, 0xbd, 0x7c, 0xa4, 0xfd, 0x45,
  0x23, 0xb9, 0x3c, 0x74, 0x96, 0xe6, 0x7c, 0xd7, 0xc5, 0x27, 0x15, 0x8a,
  0x54, 0xa9, 0x50, 0xb3, 0xa3, 0xb6, 0x33, 0xdc, 0xb6, 0xf7, 0xb1, 0xff,
  0xe6, 0x8f, 0x1d, 0xdd, 0x65, 0xb8, 0xff, 0xd9, 0x70, 0x7e, 0x98, 0xe5,
  0xec, 0x42, 0x32, 0x31, 0xb3, 0x39, 0x69, 0x45, 0xea, 0xec, 0x80, 0x24,
  0x3c, 0x18, 0x86, 0x57, 0x43, 0x0e, 0x2e, 0x75, 0x03, 0xfc, 0xa6, 0xa7,
  0xf8, 0xc4, 0x49, 0x1e, 0x0e, 0x28, 0x39, 0xe4, 0x3c, 0x86, 0x30, 0xb1,
  0xbd, 0x6f, 0xfc, 0x12, 0xb8, 0x51, 0x72, 0x66, 0xf6, 0x2b, 0x80, 0x9a,
  0xa0, 0x48, 0xb6, 0x1d, 0x2e, 0x6d, 0x81, 0x9e, 0xce, 0xcb, 0x72, 0x92,
  0x56, 0xdb, 0xb2, 0xf7, 0x40, 0x55, 0x37, 0x03, 0xce, 0xd8, 0xf9, 0x42,
  0x67, 0x3d, 0x9c, 0x0d, 0xa2, 0x37, 0x9a, 0x74, 0x06, 0xbc, 0x3b, 0xd2,
  0xa2, 0x0e, 0xfd, 0x39, 0x05, 0xc8, 0xcb, 0xc5, 0xcc, 0x6e, 0x85, 0xff,

  0xd5, 0xc8, 0xa1, 0xa1, 0x36, 0xc1, 0xb9, 0x02, 0xd4, 0x13, 0x80, 0xf2,
  0x16, 0x75, 0x16, 0x58, 0xa7, 0x3e, 0xa1, 0xb8, 0x13, 0x6c, 0x08, 0x25,
  0x4e, 0xc4, 0x61, 0x5b, 0x24, 0x48, 0x62, 0x4d, 0x70, 0x8f, 0x39, 0xd0,
  0x8c, 0x62, 0x3c, 0xc6, 0xf1, 0x94, 0xd0, 0xe1, 0xee, 0xb3, 0x2f, 0xc9,



  0x56, 0xdd, 0x90, 0xe9, 0xe6, 0x73, 0x0d, 0x4f, 0x8e, 0x39, 0x63, 0xae,
  0x2b, 0xdc, 0x36, 0xb8, 0x76, 0x1d, 0x2e, 0x2e, 0xd8, 0xab, 0xf0, 0x57,
  0x76, 0x82, 0x0c, 0x8f, 0x35, 0x8b, 0x8e, 0xff, 0x79, 0x01, 0xc4, 0x66,
  0x38, 0x27, 0x87, 0x11, 0xd2, 0x6c, 0x59, 0x97, 0xd9, 0x22, 0xbb, 0xe4,
  0xd5, 0xbe, 0x3c, 0x39, 0xfa, 0xf6, 0xe8, 0x24, 0x10, 0x9b, 0x5f, 0x8d,
  0xc7, 0x7b, 0x9f, 0xb2, 0x6a, 0x82, 0xa6, 0xac, 0x14, 0xb8, 0x48, 0xf0,

  0x9c, 0x4d, 0xf0, 0xf2, 0x64, 0xc9, 0x8d, 0x83, 0x6c, 0x91, 0x44, 0xef,
  0xc0, 0x67, 0x43, 0x19, 0xbc, 0xfc, 0x49, 0x81, 0x79, 0x47, 0xc9, 0x91,
  0xe4, 0x12, 0x42, 0x36, 0x4e, 0xab, 0x6c, 0xc6, 0x3d, 0x4b, 0xc3, 0x2c,
  0x42, 0x20, 0x7b, 0x50, 0x5f, 0x0e, 0x3a, 0x54, 0xce, 0x24, 0x47, 0x00,
  0xcb, 0x2e, 0x22, 0x78, 0x63, 0x85, 0xea, 0xf9, 0xe4, 0x8d, 0x7c, 0x53,
  0xea, 0x51, 0x69, 0x97, 0x18, 0xd8, 0x8d, 0xad, 0x94, 0xd3, 0x6f, 0x86,
  0xaf, 0xc6, 0xc3, 0x37, 0x47, 0x27, 0x47, 0x5f, 0xbd, 0xba, 0x38, 0xb2,

  0x78, 0xe6, 0x75, 0xd6, 0xa3, 0x82, 0x89, 0xfe, 0xf5, 0x8d, 0x6c, 0x0b,
  0xd6, 0x4f, 0x58, 0xf8, 0x4d, 0xce, 0x0d, 0x59, 0x14, 0xf2, 0x9f, 0x3b,
  0x6b, 0x93, 0x55, 0xd4, 0x70, 0x9e, 0x60, 0x7c, 0x38, 0x73, 0x2f, 0x16,
  0x4b, 0x99, 0x6a, 0xb0, 0x82, 0x74, 0x71, 0x43, 0x8d, 0xd9, 0x3e, 0x14,
  0x94, 0x4a, 0x9f, 0xdb, 0x52, 0x52, 0x5e, 0xbd, 0xef, 0x11, 0x72, 0x3b,
  0xdb, 0x3a, 0x60, 0x20, 0xd3, 0xf7, 0xf8, 0x0b, 0xb4, 0x0c, 0x1c, 0xf1,
  0xe3, 0x37, 0x78, 0xb2, 0x83, 0x31, 0xee, 0xa0, 0xd1, 0x89, 0xc1, 0xc8,
  0xaf, 0x22, 0x80, 0x25, 0x44, 0x40, 0xf5, 0xf4, 0x2a, 0x5b, 0x8a, 0x2a,
  0x4b, 0xa9, 0x09, 0x08, 0x82, 0x73, 0x4d, 0xa5, 0xe0, 0x05, 0x71, 0x0a,
  0xd9, 0x24, 0x63, 0xc8, 0x05, 0x60, 0xa4, 0x11, 0x5d, 0xc7, 0x52, 0x7d,
  0x6f, 0xa8, 0xe3, 0x00, 0xc5, 0x5a, 0x28, 0x6d, 0x07, 0x05, 0xc6, 0x23,
  0x24, 0x18, 0x7a, 0x79, 0x03, 0x61, 0x9e, 0x00, 0x77, 0x0f, 0xec, 0xde,
  0x59, 0x0b, 0x60, 0x6e, 0xd1, 0xd6, 0x4b, 0xb8, 0xce, 0xf0, 0x23, 0x6e,
  0x5e, 0x22, 0x3a, 0x37, 0x4d, 0xf2, 0x67, 0x3a, 0xaa, 0xa5, 0x3c, 0x41,
  0xca, 0x0d, 0xc9, 0x8d, 0x05, 0x33, 0x38, 0x9e, 0xb5, 0x1d, 0x65, 0x1a,
  0xd2, 0x8d, 0xd5, 0x9b, 0x2e, 0xb3, 0x07, 0x86, 0x56, 0x9f, 0xc9, 0xe9,
  0xe0, 0x47, 0xd2, 0x88, 0xc0, 0xa6, 0x78, 0x44, 0x5d, 0xf9, 0x8e, 0x63,


  0xb4, 0x7b, 0x15, 0x10, 0x46, 0xbc, 0xfe, 0x35, 0xec, 0x28, 0x61, 0x4b,
  0xed, 0x86, 0xd9, 0x2a, 0x00, 0xec, 0xde, 0x79, 0xab, 0xf8, 0xfb, 0x56,
  0xb7, 0xf4, 0x7b, 0xad, 0x79, 0xad, 0x91, 0x8e, 0xce, 0xce, 0xb9, 0xbb,
  0xfa, 0x09, 0xfd, 0x45, 0x22, 0x6f, 0x75, 0x0c, 0xff, 0x4e, 0xba, 0x7f,
  0x50, 0x32, 0x4a, 0x86, 0xd0, 0x8d, 0x0d, 0xa6, 0x6b, 0x32, 0x22, 0xe7,
  0x9f, 0x0a, 0xd0, 0xba, 0x5c, 0x07, 0x6c, 0x71, 0x90, 0xfc, 0x6f, 0x1b,

  0x74, 0xd2, 0x4c, 0x68, 0x0a, 0x82, 0x50, 0x84, 0x49, 0x70, 0x0e, 0xad,
  0x06, 0x48, 0x4e, 0xe9, 0x97, 0xa4, 0x6f, 0xb2, 0x5c, 0x6b, 0xfa, 0x38,

  0x2f, 0xb7, 0x40, 0x10, 0x95, 0x88, 0x86, 0xa5, 0x37, 0x93, 0x0a, 0xed,
  0x5c, 0x53, 0x33, 0x95, 0x51, 0x67, 0xa9, 0x68, 0xc8, 0x45, 0xb0, 0x9b,
  0x61, 0x3c, 0x04, 0xad, 0xc8, 0xc4, 0x11, 0x27, 0x59, 0xe9, 0x58, 0xb0,
  0xe6, 0xda, 0x0f, 0x24, 0xc7, 0x80, 0x2c, 0x08, 0xb4, 0x1d, 0xe2, 0x7a,
  0x01, 0x24, 0x1f, 0x04, 0x1a, 0xbe, 0xd4, 0x24, 0x68, 0x26, 0x5a, 0x76,
  0x27, 0x61, 0x73, 0x56, 0x08, 0xe7, 0x12, 0x9e, 0x4c, 0x01, 0x28, 0x0b,
  0xd3, 0x66, 0xc2, 0x1a, 0x0c, 0xb2, 0xfa, 0xae, 0xd2, 0x22, 0x72, 0xe7,
  0xcc, 0xc6, 0xdb, 0x9e, 0x68, 0x58, 0xa5, 0x1c, 0x5b, 0x44, 0x89, 0x27,
  0xda, 0xe8, 0xc2, 0x5a, 0x19, 0x43, 0xcf, 0x30, 0xb0, 0x9c, 0xe2, 0x1a,
  0x32, 0x15, 0xde, 0x19, 0x34, 0x06, 0x12, 0x7a, 0x2b, 0x63, 0x54, 0x25,
  0xcc, 0xc5, 0x45, 0x5b, 0x5a, 0x24, 0xd8, 0x5f, 0xf4, 0x6d, 0x3d, 0xf3,

  0xa8, 0xb0, 0xf1, 0x50, 0x75, 0xa9, 0xc7, 0x70, 0xbb, 0x04, 0x07, 0xc7,
  0x07, 0x61, 0x5f, 0x74, 0x33, 0x50, 0x32, 0x2e, 0xba, 0x30, 0xdf, 0xc6,
  0x74, 0xc9, 0x0d, 0x64, 0x23, 0xb2, 0x44, 0x3c, 0xc1, 0xf7, 0xdf, 0x60,
  0x72, 0xf4, 0x1d, 0xbc, 0x80, 0x7b, 0x4f, 0xd0, 0x43, 0x97, 0xda, 0xe3,

  0x89, 0x49, 0x79, 0x92, 0x99, 0xef, 0xe5, 0xd4, 0x03, 0xcf, 0x0f, 0x03,
  0x84, 0x69, 0xce, 0xb5, 0x21, 0x40, 0x54, 0x05, 0x94, 0xec, 0x00, 0xa2,
  0x77, 0x29, 0x97, 0x22, 0x4b, 0xfc, 0x06, 0x92, 0x20, 0x08, 0x58, 0x0c,
  0x67, 0x03, 0x89, 0x67, 0x22, 0xbd, 0xb1, 0xac, 0xc2, 0x12, 0xd8, 0xa9,
  0xc5, 0x5a, 0xd2, 0x27, 0xd3, 0xfa, 0x3a, 0x7e, 0xc3, 0xeb, 0xeb, 0xe8,
  0x0d, 0x7f, 0xc0, 0x3d, 0x77, 0xf6, 0xd6, 0xd1, 0xd9, 0xf8, 0xdb, 0xa4,
  0x07, 0x34, 0x82, 0x3b, 0xb9, 0xf0, 0x15, 0x77, 0xab, 0x23, 0xa2, 0xf7,
  0xaf, 0x79, 0xff, 0x3d, 0x8f, 0xc6, 0x07, 0x82, 0x7b, 0x6e, 0xbe, 0x2f,
  0x97, 0xfb, 0xec, 0xd5, 0xf8, 0x5b, 0xef, 0x5a, 0x7b, 0x24, 0x10, 0x2b,
  0xc6, 0xb4, 0x99, 0xed, 0x14, 0x24, 0x66, 0xd2, 0xa1, 0xc1, 0xa2, 0xf4,
  0x5e, 0x5f, 0x3f, 0x84, 0xde, 0xcd, 0x4c, 0x02, 0x7a, 0x0f, 0xf6, 0x78,
  0x13, 0xbd, 0xfb, 0x07, 0xd5, 0x4e, 0x9a, 0xf5, 0xa8, 0xbd, 0xe0, 0x2e,

  0xda, 0x54, 0xe0, 0xd1, 0x47, 0xe6, 0x14, 0x48, 0x14, 0xd2, 0x0e, 0x53,
  0x09, 0x31, 0xcf, 0x9f, 0x46, 0xe8, 0xe6, 0x85, 0x80, 0xd0, 0xf5, 0x3c,
  0xe3, 0x94, 0xde, 0x47, 0xe8, 0x9a, 0x52, 0x9c, 0x31, 0x91, 0xfb, 0x34,
  0x1e, 0xd2, 0xb7, 0x47, 0xb5, 0x7e, 0x19, 0x78, 0xb8, 0x43, 0x9a, 0x69,


  0xe6, 0xa0, 0x0c, 0x1c, 0x90, 0x43, 0x04, 0x5c, 0x44, 0x41, 0x19, 0xb8,
  0x20, 0x36, 0x74, 0xe7, 0xdb, 0xd2, 0xfc, 0x56, 0xf5, 0x43, 0xa5, 0x1a,

  0x36, 0x37, 0x56, 0x23, 0xa1, 0x0d, 0xf7, 0x80, 0x0f, 0x28, 0x30, 0x0f,
  0x6e, 0x64, 0x0b, 0x3d, 0x28, 0x8b, 0x56, 0xa7, 0xd7, 0x19, 0xe5, 0x79,

  0x00, 0x86, 0xac, 0x7b, 0x4f, 0x49, 0xcd, 0x83, 0x36, 0x40, 0x8a, 0xca,

  0x30, 0x2f, 0x86, 0x61, 0x1a, 0xb4, 0x1f, 0xda, 0x6a, 0x5a, 0xd8, 0xb4,

  0x54, 0xa2, 0x08, 0x85, 0x57, 0x82, 0x1c, 0xa4, 0x8c, 0xc2, 0xd2, 0x94,
  0x98, 0x00, 0x7b, 0x25, 0x23, 0x05, 0xb5, 0x51, 0x84, 0xb5, 0x76, 0xbb,
  0x97, 0xa6, 0x6c, 0x39, 0xe3, 0x9e, 0x76, 0x50, 0x8c, 0x67, 0x45, 0x3d,
  0x74, 0x1d, 0xda, 0x5f, 0xda, 0xbf, 0x06, 0xf6, 0xc5, 0x9b, 0xf7, 0x63,

  0x8a, 0x5c, 0x65, 0xa8, 0x35, 0x50, 0x33, 0xb8, 0xce, 0xb8, 0x3e, 0xe4,
  0x12, 0x9c, 0xc3, 0x3c, 0x62, 0x0b, 0xfe, 0x6c, 0x53, 0xc4, 0x97, 0x51,
  0x87, 0x10, 0x3e, 0x11, 0x14, 0xea, 0xa5, 0x5c, 0x70, 0x63, 0x6c, 0x3b,
  0xc4, 0xc5, 0x69, 0x05, 0x6e, 0x6e, 0x5a, 0xd1, 0x0e, 0xcf, 0x53, 0x04,
  0xe3, 0x48, 0xcb, 0xf2, 0x68, 0x1a, 0xbb, 0xda, 0x9e, 0x79, 0xc5, 0x88,
  0xec, 0x82, 0x41, 0x66, 0x3b, 0x5c, 0x15, 0x9d, 0xae, 0xf4, 0xdd, 0xc5,
  0x0a, 0x66, 0x92, 0xe4, 0x8c, 0xed, 0x6e, 0x34, 0x1e, 0x69, 0x03, 0x57,
  0xd7, 0x8f, 0x87, 0xf4, 0xb0, 0xa4, 0x1f, 0xda, 0x9f, 0x3e, 0xc5, 0x4f,
  0x47, 0xc1, 0x46, 0x07, 0x25, 0x34, 0xd2, 0x41, 0xd5, 0xa2, 0xe3, 0x52,
  0x76, 0x63, 0x31, 0xa3, 0xce, 0x1b, 0x38, 0x7b, 0x6d, 0xa4, 0x40, 0x68,
  0x89, 0x8c, 0x79, 0xe8, 0x9a, 0xb7, 0x25, 0x01, 0x4e, 0x8b, 0xd1, 0x6d,
  0xea, 0xd6, 0xa1, 0x3f, 0x7a, 0x14, 0x39, 0x74, 0x3b, 0xe7, 0x97, 0xb2,


  0xcc, 0xf8, 0x91, 0xb7, 0xa4, 0xcb, 0x24, 0xe7, 0xfe, 0x56, 0x2f, 0xf3,
  0xd5, 0x50, 0xdf, 0x62, 0xe1, 0xb1, 0x4c, 0x3f, 0x89, 0x48, 0x7f, 0x2c,
  0x74, 0x30, 0x0c, 0x60, 0x56, 0xb8, 0xdd, 0x32, 0xba, 0x52, 0xbb, 0x75,
  0xb6, 0x88, 0x46, 0xf4, 0xad, 0xc6, 0x82, 0xb6, 0x12, 0x51, 0xf0, 0x77,
  0x62, 0x35, 0x5f, 0x9a, 0x9d, 0xed, 0xfb, 0x78, 0xb4, 0xbe, 0x03, 0x33,

  0xb1, 0xef, 0xde, 0x73, 0x7e, 0x8e, 0xc8, 0x36, 0x9f, 0x9f, 0xee, 0xd9,
  0xff, 0x1a, 0xe7, 0xf7, 0xf4, 0x57, 0x39, 0xbf, 0xa7, 0xff, 0xcb, 0x9c,
  0xdf, 0xd3, 0x7f, 0xf9, 0xfc, 0x1e, 0x07, 0xe7, 0xf7, 0xf4, 0x7f, 0x95,
  0xf3, 0xd3, 0xfe, 0x6a, 0x7a, 0x7a, 0x59, 0x70, 0x7e, 0x63, 0x49, 0x1b,

  0x51, 0x60, 0x3e, 0xda, 0x69, 0x7d, 0x8b, 0x83, 0x34, 0x92, 0xe8, 0xc8,
  0x5e, 0x70, 0xcd, 0xb5, 0x65, 0x68, 0xc8, 0x9e, 0x86, 0x25, 0x23, 0x2d,
  0xab, 0xd0, 0x41, 0x8f, 0xcf, 0x12, 0x3b, 0x01, 0xef, 0x18, 0x1c, 0xd0,
  0x16, 0x14, 0xb4, 0xa8, 0x8b, 0xba, 0x26, 0xbf, 0xa5, 0x59, 0x3f, 0x97,
  0x57, 0xd6, 0xae, 0x28, 0x38, 0x86, 0xa4, 0x65, 0x36, 0xee, 0xc5, 0x4b,
  0xda, 0xae, 0x21, 0x3f, 0xfe, 0xa7, 0x68, 0xb1, 0x1b, 0x3a, 0x36, 0xbb,
  0x29, 0xc5, 0xc2, 0x12, 0xde, 0xd6, 0xb9, 0x73, 0xb3, 0xd1, 0x2c, 0xef,
  0xd0, 0x62, 0x67, 0xd6, 0x55, 0x75, 0xec, 0x09, 0xde, 0x7f, 0x64, 0xe5,
  0x15, 0x70, 0x7c, 0x5e, 0x7e, 0x38, 0x0f, 0x7d, 0x6f, 0x66, 0xa9, 0x21,
  0x34, 0xa2, 0x39, 0xae, 0x21, 0xd9, 0xf6, 0x43, 0xa0, 0xc4, 0x9b, 0xdb,
  0x78, 0xfa, 0xf5, 0xae, 0xe7, 0x04, 0x42, 0xd0, 0xa2, 0x8c, 0xf5, 0xbb,
  0xe3, 0xb2, 0x5b, 0x5b, 0x5a, 0x5e, 0x0f, 0x3a, 0x3d, 0x2e, 0x6d, 0xda,
  0xbb, 0x53, 0x52, 0xe0, 0x1d, 0x91, 0x82, 0xdd, 0x2a, 0xe8, 0x6f, 0x49,
  0xca, 0x60, 0x5e, 0x0b, 0x6a, 0x1c, 0xc1, 0x68, 0xa8, 0x1c, 0xc4, 0xcc,
  0x7e, 0xcb, 0x8c, 0xbf, 0xa7, 0x87, 0xad, 0x5d, 0x7d, 0x03, 0x5d, 0x71,
  0xbd, 0x5c, 0x49, 0x69, 0xf1, 0x3d, 0xa5, 0x95, 0x09, 0x77, 0x63, 0x44,
  0xd9, 0x24, 0xbb, 0xf7, 0xa5, 0xca, 0x48, 0x2d, 0x73, 0x5b, 0x5a, 0x21,
  0xe6, 0x7b, 0x2f, 0x30, 0x5a, 0x14, 0x8b, 0xea, 0xa2, 0x9b, 0x20, 0xc5,
  0x15, 0x31, 0x8a, 0xaf, 0x4e, 0x5c, 0xd2, 0xd3, 0x9a, 0xa5, 0xd0, 0x01,
  0x20, 0x00, 0xfc, 0xd5, 0x18, 0x38, 0x37, 0xa2, 0x84, 0x54, 0x60, 0x45,
  0x73, 0x66, 0x74, 0x41, 0xf3, 0xaa, 0x19, 0x66, 0x24, 0x55, 0x56, 0xb5,
  0x17, 0xa7, 0xb6, 0x85, 0x21, 0x00, 0x77, 0x8a, 0x55, 0x07, 0x20, 0xd8,
  0x03, 0xf5, 0x56, 0xb2, 0xfa, 0x04, 0xba, 0xc3, 0x62, 0x33, 0x15, 0xd7,
  0x5a, 0x7b, 0xd3, 0x6a, 0x51, 0x32, 0x9c, 0x84, 0xe1, 0x80, 0x56, 0x09,
  0xe0, 0xbf, 0x81, 0x36, 0x7a, 0xca, 0x32, 0x58, 0x35, 0xf3, 0x1c, 0x13,
  0x91, 0x9b, 0xe4, 0x57, 0x7d, 0x44, 0x5d, 0x01, 0x64, 0xe8, 0xe8, 0x02,
  0xa5, 0x5f, 0x05, 0x37, 0x01, 0x69, 0xbb, 0xa4, 0x3a, 0x46, 0x12, 0x67,
  0xff, 0x06, 0x09, 0x85, 0x02, 0x30, 0x10, 0x3d, 0xc6, 0x56, 0x0a, 0x38,
  0xe7, 0x16, 0x5f, 0x65, 0x7e, 0xd5, 0xb4, 0x85, 0xa0, 0xe4, 0x28, 0x05,
  0x27, 0x2f, 0x9a, 0x5d, 0x94, 0x4c, 0xd8, 0xa0, 0xe1, 0x10, 0x50, 0x11,
  0x64, 0xea, 0x5b, 0x82, 0xe2, 0xb4, 0x16, 0xe8, 0x59, 0x6e, 0xb9, 0x0c,
  0xd0, 0x9b, 0xdf, 0xae, 0x4a, 0xd9, 0xcb, 0x0c, 0xf7, 0x59, 0x54, 0x76,
  0xc9, 0xe1, 0xff, 0x4d, 0x59, 0xc8, 0x1d, 0xc0, 0x35, 0x6e, 0x26, 0x6e,
  0x21, 0xd7, 0xe0, 0x11, 0x2c, 0x9a, 0xaa, 0x5c, 0xdd, 0x25, 0x5f, 0xa5,
  0xb4, 0x2c, 0xa8, 0xf5, 0x69, 0xb6, 0x0c, 0x4a, 0xd3, 0xb8, 0xbd, 0xb8,

  0xa8, 0xd9, 0xdc, 0x6a, 0x5c, 0x57, 0x08, 0xbb, 0x80, 0xb7, 0xc5, 0x10,
  0xab, 0xd9, 0x2f, 0x72, 0x26, 0x4b, 0xd9, 0x08, 0xa7, 0x5e, 0x8f, 0xc7,
  0x27, 0xa1, 0x2d, 0xa7, 0x8d, 0x8d, 0x36, 0x62, 0x12, 0x60, 0xb4, 0x61,
  0x37, 0x3a, 0x22, 0x83, 0xbf, 0x8c, 0x72, 0x0e, 0x59, 0x77, 0xb6, 0x50,

  0xcc, 0x0e, 0xc5, 0x91, 0x9f, 0x56, 0x77, 0x2b, 0x32, 0xbe, 0xa4, 0x08,
  0x97, 0xaf, 0x39, 0xcd, 0x8f, 0x41, 0x60, 0x37, 0x96, 0x3d, 0x7f, 0xa8,
  0x3d, 0x2c, 0x75, 0xc8, 0x52, 0x8a, 0xdf, 0x13, 0x28, 0x32, 0x81, 0x5b,
  0x89, 0x6c, 0x25, 0xa9, 0x33, 0x03, 0x9a, 0x4b, 0x6f, 0x8f, 0x33, 0xe9,
  0x5c, 0xd6, 0xe9, 0x8e, 0xc1, 0xe6, 0x0c, 0x59, 0x5a, 0x84, 0x88, 0x88,
  0x70, 0xca, 0xae, 0xca, 0x77, 0x79, 0x43, 0xaa, 0xf6, 0xba, 0x37, 0xc3,
  0x36, 0x4f, 0x48, 0x09, 0xe1, 0xa1, 0x08, 0xa0, 0x64, 0x38, 0xcb, 0xe3,
  0x60, 0x7f, 0xff, 0x5e, 0x8c, 0x20, 0xb1, 0x56, 0x37, 0x42, 0x05, 0x11,
  0x3b, 0xe4, 0x00, 0x87, 0xad, 0x69, 0x4f, 0x73, 0x29, 0x58, 0xea, 0xa2,
  0xaa, 0x99, 0x4f, 0x5a, 0xc8, 0x1e, 0x77, 0x05, 0x99, 0xad, 0x32, 0x94,
  0x16, 0x00, 0x83, 0xcc, 0xdd, 0x3e, 0xc2, 0x1c, 0xeb, 0x17, 0xad, 0x77,

  0xa2, 0x2d, 0xa5, 0x69, 0x42, 0xf4, 0x92, 0xe8, 0x9f, 0xa3, 0xe4, 0xcf,
  0x77, 0xce, 0x6e, 0x07, 0x43, 0x64, 0x7f, 0x30, 0x66, 0xc5, 0x7e, 0x7e,
  0x9e, 0xff, 0x68, 0x13, 0xeb, 0x8f, 0xe3, 0x00, 0xfd, 0x1b, 0x33, 0x16,
  0x0c, 0x6b, 0xb8, 0xdd, 0xaa, 0xc6, 0xa8, 0x80, 0x13, 0x89, 0x3b, 0xac,
  0xec, 0x6a, 0x8d, 0xfe, 0xd1, 0x6d, 0xb2, 0xe4, 0xf5, 0x4b, 0x62, 0x2e,
  0xb8, 0x11, 0xcf, 0xb9, 0x8d, 0xea, 0xd4, 0xce, 0x42, 0x7d, 0xd6, 0x56,
  0x53, 0xa8, 0xb4, 0x7a, 0x88, 0x02, 0xea, 0x2e, 0x6a, 0x04, 0xd5, 0x5c,
  0x13, 0xef, 0x82, 0xaf, 0xa1, 0x2c, 0x3c, 0x0f, 0x0c, 0xa1, 0x89, 0x71,
  0xe6, 0x8f, 0xd6, 0x5a, 0x75, 0x40, 0x6c, 0x7d, 0xc6, 0xaa, 0xc8, 0xfb,
  0x7a, 0xd3, 0x67, 0xa5, 0x87, 0x5d, 0x65, 0xcb, 0xeb, 0x3a, 0xae, 0x1c,
  0xf6, 0xe5, 0x84, 0xb0, 0x18, 0x9c, 0x41, 0xec, 0xdc, 0x84, 0x5c, 0x28,
  0x8e, 0xec, 0x08, 0x68, 0x82, 0xac, 0x3a, 0x1a, 0x8d, 0x65, 0x90, 0x48,
  0x27, 0x72, 0x4a, 0x18, 0xe7, 0x53, 0x8e, 0xaa, 0xb7, 0x0e, 0x56, 0x8d,
  0xfb, 0x8c, 0xf1, 0x4a, 0x6a, 0x07, 0x07, 0x47, 0x4c, 0x9b, 0x7b, 0xa6,
  0x99, 0x51, 0x6b, 0x9b, 0x1a, 0x16, 0x7a, 0x44, 0xbd, 0x0a, 0x6d, 0xf3,
  0x24, 0x21, 0xd4, 0xd4, 0x6b, 0x78, 0xaf, 0x79, 0x78, 0x8b, 0xc0, 0xc6,
  0x77, 0x92, 0x2b, 0xd7, 0xc9, 0x4f, 0x26, 0x15, 0xb8, 0x01, 0xdb, 0xa0,

  0xe8, 0x38, 0x81, 0x37, 0x26, 0x38, 0x1c, 0x94, 0xc0, 0xaf, 0x2b, 0x2f,
  0x46, 0xbe, 0x75, 0x95, 0x9b, 0x53, 0x2d, 0xb6, 0x00, 0x0c, 0xb9, 0x9e,
  0x30, 0xe6, 0x68, 0xa3, 0x1f, 0x0d, 0x16, 0xbb, 0x5e, 0x78, 0x8e, 0xd9,
  0x78, 0x9b, 0xf1, 0x56, 0xc2, 0xf7, 0x20, 0x69, 0x5d, 0x08, 0xd5, 0x27,
  0x39, 0x6c, 0xef, 0x8a, 0xef, 0xf9, 0xdc, 0xa2, 0xde, 0x5c, 0x57, 0x88,
  0x47, 0x37, 0x1f, 0x9d, 0xb9, 0x06, 0x7e, 0x5b, 0x1c, 0xe7, 0x68, 0x4e,

  0x97, 0xe4, 0xc4, 0x61, 0x5d, 0x95, 0x76, 0x39, 0xda, 0xb4, 0x84, 0x0e,
  0x42, 0x20, 0x5b, 0x22, 0x98, 0xc2, 0x92, 0xda, 0x97, 0xde, 0xa1, 0xea,
  0xc8, 0x7e, 0x1a, 0xd4, 0x1d, 0x00, 0xc0, 0x11, 0x18, 0x62, 0x09, 0xcd,
  0x5f, 0xe8, 0x98, 0xb6, 0x70, 0x5a, 0xe5, 0xab, 0x86, 0xf3, 0x11, 0x24,
  0xb9, 0x7a, 0x23, 0x70, 0x8e, 0xf9, 0xdb, 0xe5, 0xa2, 0x9c, 0xa4, 0x7c,
  0x47, 0x6c, 0x6e, 0x93, 0x7a, 0x3c, 0x5b, 0x80, 0xc5, 0xc4, 0xde, 0x88,
  0x3c, 0x23, 0x0d, 0x17, 0xcc, 0x92, 0x87, 0x2f, 0xd0, 0x1d, 0x9e, 0x02,
  0xa1, 0x9b, 0x3e, 0x68, 0x3f, 0xc1, 0xf0, 0x7f, 0xc3, 0xf9, 0x40, 0x6e,
  0xaf, 0x56, 0x65, 0x23, 0x35, 0xac, 0xf6, 0xee, 0x54, 0xa0, 0x73, 0x01,
  0x46, 0x61, 0xb6, 0xce, 0xda, 0x99, 0x62, 0xdb, 0x12, 0x26, 0x96, 0x96,
  0x76, 0xc8, 0x56, 0xb2, 0x9d, 0x0a, 0x24, 0x1c, 0x1b, 0xcd, 0x82, 0x22,

  0x80, 0x60, 0xc9, 0x5a, 0x1a, 0x18, 0xe3, 0xe3, 0x06, 0x15, 0x1a, 0x05,
  0x49, 0x25, 0x37, 0x39, 0xcd, 0xbe, 0xf5, 0xf6, 0x8a, 0x81, 0x15, 0x42,
  0x8a, 0x9f, 0xb3, 0x42, 0x08, 0xff, 0x25, 0x9f, 0xc9, 0x86, 0x9d, 0xf1,
  0x51, 0xc6, 0xdb, 0x26, 0x82, 0xfd, 0x74, 0x5c, 0x3c, 0x81, 0xad, 0xd5,
  0x64, 0x34, 0x90, 0x7f, 0x7f, 0xc7, 0x10, 0x8b, 0x54, 0xbf, 0xa5, 0x48,
  0x3c, 0x00, 0x36, 0xa6, 0xb6, 0xf3, 0x63, 0x5e, 0x10, 0xaf, 0xcc, 0xa3,


  0x9b, 0x42, 0x39, 0x6e, 0x8b, 0x3b, 0xce, 0xa2, 0xc1, 0x99, 0x43, 0xdf,
  0x95, 0x98, 0x81, 0x12, 0x54, 0xd6, 0x4c, 0xbd, 0x5f, 0xce, 0xb2, 0x74,

  0x11, 0xeb, 0x96, 0x41, 0x13, 0x26, 0x47, 0x37, 0xb3, 0x36, 0x82, 0x49,
  0x29, 0x24, 0x64, 0x22, 0x39, 0xd6, 0x9c, 0x65, 0x28, 0xc6, 0x81, 0x9d,
  0x21, 0x6e, 0x55, 0x44, 0xbb, 0xa6, 0xfe, 0x3d, 0x78, 0x00, 0xb5, 0xc3,
  0x53, 0x41, 0x24, 0x40, 0xc0, 0xd3, 0x95, 0xe0, 0x10, 0xa6, 0x1b, 0x25,
  0x24, 0xea, 0x03, 0xa0, 0x00, 0xe4, 0xc3, 0x77, 0x87, 0x13, 0x47, 0x2a,
  0xd7, 0x85, 0x42, 0xc8, 0x68, 0xd9, 0x06, 0x4d, 0x8c, 0x73, 0x60, 0x88,
  0x49, 0xee, 0xca, 0x3d, 0x44, 0x9e, 0x85, 0x70, 0x8e, 0x55, 0x78, 0xd2,
  0xd7, 0x99, 0x66, 0x46, 0xc1, 0x94, 0xe1, 0x03, 0x68, 0x6c, 0xb1, 0x2c,
  0x8d, 0x26, 0x7c, 0x86, 0x99, 0xcc, 0xe1, 0x61, 0x8f, 0xe9, 0x25, 0x7d,
  0xd2, 0x85, 0xc6, 0x70, 0xd9, 0xeb, 0x74, 0x9e, 0x29, 0x70, 0xaa, 0xb0,
  0xef, 0x72, 0x6a, 0xb6, 0x10, 0x41, 0x5a, 0x80, 0x12, 0x91, 0x76, 0x14,
  0x58, 0xd0, 0xcc, 0x35, 0x89, 0x4b, 0x5a, 0x91, 0x4b, 0x17, 0x41, 0xd8,
  0x6d, 0xbd, 0xc8, 0x57, 0xea, 0x9f, 0x1e, 0x24, 0x99, 0x64, 0x15, 0x2d,
  0xee, 0xe4, 0x54, 0xd6, 0xc3, 0x88, 0xe9, 0x65, 0x9b, 0xb9, 0x0b, 0xfc,
  0xed, 0x82, 0x14, 0xff, 0x9d, 0xce, 0xe8, 0x8f, 0xf7, 0x0f, 0x30, 0xd9,
  0xc7, 0xfb, 0xcf, 0x76, 0xdb, 0x52, 0x79, 0x51, 0x67, 0x43, 0x24, 0xad,
  0xc5, 0xb5, 0x53, 0x6e, 0x55, 0xe7, 0xfc, 0xea, 0xd0, 0x44, 0xe9, 0x25,
  0xc9, 0x74, 0x9b, 0xad, 0x2b, 0x35, 0xe5, 0xa8, 0x89, 0x21, 0x19, 0xa6,
  0xf5, 0x15, 0xa1, 0x2e, 0x06, 0x52, 0xde, 0xbd, 0x03, 0xa3, 0x0d, 0xb1,
  0x1b, 0xde, 0xa7, 0x14, 0xaf, 0x4a, 0x83, 0x34, 0xde, 0x07, 0x3c, 0x47,
  0x56, 0x29, 0x07, 0x18, 0x62, 0xed, 0x4c, 0x15, 0xc9, 0x81, 0x93, 0xc4,
  0x24, 0x7c, 0xd7, 0x6e, 0x37, 0x6c, 0xf9, 0xce, 0xdb, 0xbc, 0xc8, 0xeb,
  0x2b, 0xb4, 0x29, 0xae, 0xeb, 0xf4, 0x32, 0x0b, 0x0b, 0xdc, 0x0d, 0x43,
  0x32, 0x26, 0x13, 0xb7, 0xd1, 0xab, 0x80, 0x4c, 0x4f, 0xa9, 0x61, 0xbc,
  0xef, 0x52, 0xb0, 0x22, 0x3d, 0xf6, 0x80, 0x8c, 0xe6, 0x96, 0x19, 0xa3,
  0x97, 0xbc, 0xf6, 0x1a, 0x40, 0xf6, 0xf5, 0x7f, 0xa4, 0x6e, 0x64, 0x80,
  0xc8, 0xe2, 0xde, 0x40, 0xdc, 0x1c, 0x28, 0xd6, 0xf5, 0xc5, 0xa8, 0xda,

  0xe6, 0x70, 0x4f, 0xc7, 0x86, 0x05, 0xb9, 0x5e, 0xc5, 0x48, 0x01, 0x34,
  0x3f, 0xfb, 0xde, 0xe8, 0xa2, 0xa3, 0xe7, 0xf6, 0xc7, 0xbb, 0x0f, 0x6b,
  0x18, 0x79, 0xd8, 0xd1, 0xcd, 0x28, 0x17, 0x57, 0x22, 0x11, 0x30, 0x55,
  0xbe, 0xe0, 0x7f, 0xc4, 0x7d, 0x1d, 0xa8, 0x6b, 0x35, 0x56, 0xe4, 0xbb,
  0x57, 0x80, 0x94, 0x72, 0x08, 0xcf, 0x5e, 0xda, 0x6e, 0xab, 0x46, 0x0f,
  0xdd, 0x33, 0x49, 0x55, 0x8d, 0x02, 0xfc, 0x59, 0x4c, 0x5e, 0xce, 0x20,

  0x74, 0x51, 0x37, 0xd5, 0xe5, 0x8c, 0xe0, 0x6d, 0xc8, 0x30, 0x25, 0xe8,
  0x9d, 0xe4, 0x24, 0xe3, 0x66, 0x39, 0xc9, 0xf6, 0x97, 0xdb, 0x91, 0x6a,
  0xbe, 0xed, 0x97, 0x1e, 0xc2, 0x78, 0xed, 0x1a, 0x71, 0x6d, 0xff, 0x91,
  0x92, 0x92, 0x09, 0x4c, 0x85, 0xbf, 0x29, 0x67, 0xc0, 0xf9, 0xb5, 0xf1,
  0xb0, 0xbe, 0xa6, 0xf4, 0x09, 0x3e, 0x60, 0x3b, 0x79, 0x88, 0x1b, 0x5f,
  0x13, 0xf6, 0x7a, 0x67, 0xdd, 0xaa, 0xcf, 0x6d, 0x07, 0xd5, 0x7e, 0x94,
  0xba, 0xcf, 0x68, 0x3d, 0xd2, 0x1d, 0xdc, 0xb5, 0x31, 0xe5, 0x39, 0xf1,
  0x64, 0xe0, 0xab, 0x9c, 0x4e, 0x73, 0xd2, 0x5c, 0x70, 0xf5, 0xcd, 0x2f,
  0x2f, 0x2f, 0xa3, 0x29, 0x4e, 0x66, 0x0b, 0xe8, 0xe0, 0x69, 0xcd, 0xf3,
  0x2c, 0x6d, 0xa0, 0x6f, 0x90, 0x9c, 0xef, 0x4f, 0x9e, 0x76, 0xba, 0x7b,
  0xe4, 0x19, 0x6f, 0x15, 0x2f, 0xfd, 0xfa, 0x94, 0x38, 0x15, 0x80, 0x08,
  0x98, 0x06, 0x08, 0xd1, 0x13, 0x3f, 0xb3, 0xde, 0xae, 0x79, 0x6a, 0x88,
  0xe2, 0x4e, 0x42, 0xcb, 0x0b, 0xd4, 0x13, 0x30, 0x07, 0xc9, 0x96, 0x01,
  0x0f, 0x5b, 0x68, 0x6a, 0x2e, 0x67, 0xb0, 0x53, 0x2f, 0x11, 0x4e, 0x76,
  0xa6, 0x7d, 0x66, 0x79, 0xe0, 0x92, 0xde, 0x13, 0x6d, 0xa8, 0xe1, 0x72,
  0xd9, 0xbb, 0x5e, 0x11, 0x3f, 0xb3, 0x5d, 0x54, 0x15, 0xb5, 0x01, 0x91,
  0x9c, 0x2f, 0x0c, 0xc3, 0xf3, 0x55, 0x26, 0x7e, 0x31, 0x63, 0xd7, 0x47,
  0x09, 0x13, 0xc2, 0x70, 0xa3, 0x3d, 0x5c, 0x12, 0xae, 0x28, 0x98, 0x12,
  0x8c, 0x0d, 0x98, 0x4c, 0x99, 0x50, 0x93, 0xb6, 0xc3, 0x47, 0x9f, 0x7f,
  0x3e, 0x8a, 0xe2, 0x9c, 0x72, 0x79, 0xb6, 0x21, 0x42, 0xda, 0x29, 0x87,
  0x89, 0x39, 0xb0, 0xe8, 0xc6, 0xf4, 0x7d, 0xa2, 0x30, 0x94, 0x8f, 0x95,
  0x4b, 0x82, 0x2e, 0x22, 0xe6, 0xb8, 0x5e, 0x84, 0xe6, 0x3d, 0x42, 0x8f,
  0x4b, 0x52, 0x2b, 0x84, 0x8b, 0x41, 0xbd, 0x22, 0xae, 0xb1, 0xcc, 0x7b,
  0x54, 0xba, 0x4c, 0xd2, 0xf3, 0x38, 0x95, 0x53, 0xa0, 0x01, 0x25, 0x9f,
  0x94, 0xd3, 0x7e, 0x8d, 0xd6, 0x80, 0x1c, 0x77, 0xce, 0xfa, 0xe0, 0xed,
  0xd8, 0xee, 0x29, 0x07, 0xdd, 0x4e, 0x34, 0xfa, 0x39, 0xc9, 0x2c, 0xbe,
  0x02, 0x77, 0xde, 0xea, 0x20, 0xe0, 0x70, 0xc9, 0x78, 0x41, 0x35, 0x61,
  0xd4, 0xe9, 0xc2, 0x7c, 0xa0, 0x33, 0x1c, 0x2a, 0xa4, 0x2f, 0xb3, 0x26,
  0xac, 0x63, 0xf2, 0xb2, 0x7b, 0x37, 0x0c, 0x1e, 0xb3, 0x89, 0xa4, 0x0c,



  0x2b, 0x79, 0x39, 0x92, 0x48, 0xc2, 0x2c, 0x9f, 0xeb, 0x25, 0xb5, 0xdd,


  0x21, 0xbe, 0xc4, 0x69, 0xbc, 0x94, 0xad, 0x97, 0xb2, 0xc4, 0x2f, 0xa3,


  0x18, 0x67, 0x92, 0x62, 0x0c, 0xc0, 0xad, 0xa6, 0x31, 0x6a, 0xb5, 0xe3,



  0xdd, 0xc8, 0x22, 0xe7, 0x5e, 0x04, 0x5c, 0xbb, 0xc3, 0x1b, 0xcc, 0x79,

  0x9b, 0x8b, 0x18, 0xc8, 0xc6, 0x4b, 0x3b, 0xa8, 0xb4, 0x3a, 0xa1, 0x44,


  0x7e, 0x9a, 0x4a, 0x6c, 0x27, 0x14, 0xa7, 0x9c, 0xf8, 0x83, 0x79, 0x3a,

  0xb0, 0x7a, 0xe8, 0x5d, 0x6f, 0x9f, 0xc2, 0xb3, 0xf7, 0x23, 0x6b, 0x82,
  0xa8, 0xc1, 0x5b, 0xec, 0x12, 0xc0, 0xfd, 0xe8, 0x8c, 0xac, 0xd4, 0x68,
  0xc2, 0xf1, 0xee, 0xdc, 0xb4, 0x54, 0x57, 0xc9, 0x0d, 0xca, 0xba, 0x2c,
  0x33, 0x9e, 0x25, 0x60, 0x35, 0x74, 0x57, 0xc9, 0x57, 0xd9, 0x54, 0xeb,
  0x29, 0x29, 0x96, 0x30, 0xca, 0xf1, 0xa9, 0x58, 0x37, 0x2e, 0x75, 0xaf,
  0xda, 0x15, 0xa3, 0x67, 0x1e, 0xce, 0x0b, 0xbb, 0x2c, 0x80, 0x80, 0x6c,
  0xe1, 0x09, 0x5e, 0x24, 0x67, 0xa8, 0x0e, 0xa3, 0x7d, 0x5c, 0x33, 0xb8,
  0x5b, 0xea, 0xfc, 0x1f, 0xac, 0x94, 0x49, 0x6a, 0xaf, 0xc2, 0xa3, 0xc1,
  0xc1, 0x91, 0x11, 0x60, 0x7f, 0xf2, 0x86, 0xba, 0x8c, 0xb2, 0x28, 0x27,
  0x7a, 0x0b, 0xf8, 0xb4, 0x9f, 0xd8, 0xce, 0x12, 0x89, 0xd4, 0xb8, 0x2a,
  0xbb, 0x5c, 0x93, 0x94, 0xc3, 0x3e, 0xed, 0x28, 0x1c, 0xaa, 0x3e, 0xb1,

  0xca, 0x57, 0xe8, 0x64, 0x62, 0xec, 0xb9, 0x20, 0x57, 0xde, 0xbc, 0xc5,
  0xfd, 0x43, 0xd7, 0x85, 0xd9, 0xae, 0x66, 0x4d, 0x31, 0x48, 0xc1, 0x83,
  0x31, 0xfc, 0xeb, 0x6f, 0x70, 0xfd, 0x95, 0xb2, 0x74, 0xee, 0xbd, 0x31,
  0xb3, 0xa6, 0x77, 0x36, 0x0f, 0x6c, 0x97, 0x0c, 0x99, 0x2f, 0x00, 0x32,
  0xa3, 0x54, 0x92, 0x46, 0x19, 0x00, 0x37, 0x9a, 0x23, 0x47, 0xcc, 0x1f,
  0x29, 0x4e, 0x39, 0xcd, 0x1c, 0x8c, 0x2b, 0x36, 0x05, 0x55, 0xd5, 0xc1,
  0xad, 0x06, 0x22, 0xa2, 0xea, 0x4e, 0x3e, 0x4e, 0xa6, 0x34, 0x3b, 0x19,
  0x30, 0xf2, 0x2b, 0x97, 0x37, 0x09, 0xe8, 0x4f, 0x5a, 0x73, 0xf9, 0x44,
  0x1d, 0x36, 0x60, 0x85, 0x10, 0x60, 0xad, 0xfa, 0x6f, 0xd6, 0xe0, 0x25,
  0xce, 0x17, 0x81, 0x4f, 0x02, 0x6e, 0xec, 0x0b, 0xce, 0xd3, 0x40, 0x3b,
  0x3b, 0x61, 0x68, 0x36, 0x2e, 0x21, 0xe5, 0x51, 0xac, 0x22, 0x6e, 0x1b,
  0xd6, 0x49, 0x7b, 0xbf, 0x2d, 0x17, 0x37, 0x86, 0xd9, 0xe3, 0xec, 0x7c,
  0xb0, 0x6a, 0xbe, 0x26, 0x16, 0xe9, 0xd2, 0xf2, 0x10, 0x52, 0xa9, 0xaa,
  0xd4, 0x70, 0xcc, 0xbf, 0xad, 0x2e, 0x7b, 0x40, 0x15, 0xb9, 0x67, 0x8e,
  0xb1, 0x15, 0xc2, 0x26, 0x5d, 0xa0, 0xc3, 0xe1, 0xdb, 0x44, 0xe6, 0xf3,
  0xc5, 0x97, 0xad, 0xe1, 0xb4, 0x71, 0x85, 0x8f, 0xcb, 0x2e, 0x18, 0x1f,
  0xd3, 0xcb, 0xfc, 0x9e, 0x4d, 0xe0, 0xa6, 0x06, 0x36, 0x9d, 0xb8, 0xbe,
  0x2a, 0x33, 0x39, 0xbb, 0x02, 0x26, 0xb0, 0xed, 0xc1, 0x64, 0xd6, 0x55,
  0x47, 0x3b, 0x6a, 0xa8, 0xc6, 0xdb, 0x3f, 0x6d, 0xc8, 0xf5, 0xff, 0x2c,
  0xaf, 0x0a, 0xfa, 0x07, 0x7d, 0x81, 0x3e, 0xf0, 0xc5, 0xc1, 0x41, 0x74,

  0xe6, 0xbd, 0xf3, 0xe5, 0x09, 0xeb, 0x8c, 0x49, 0x18, 0x49, 0x8a, 0xa8,
  0xc7, 0xdb, 0x5a, 0xa6, 0xff, 0x08, 0x55, 0x73, 0xa1, 0x9b, 0x0d, 0x77,
  0x08, 0x78, 0x64, 0xde, 0xab, 0x9c, 0x7e, 0x17, 0x65, 0x89, 0xb9, 0x95,
  0x0f, 0x8b, 0x10, 0xdc, 0xc2, 0xe8, 0x6a, 0x74, 0x24, 0xfd, 0x8b, 0xdf,
  0xa2, 0x58, 0xd0, 0xdd, 0x17, 0x2f, 0xaf, 0xd6, 0x97, 0x19, 0xf8, 0x66,
  0x73, 0xdb, 0x6c, 0x3d, 0x68, 0xe5, 0xe4, 0xa5, 0x60, 0x37, 0x05, 0xa7,
  0x58, 0x37, 0x5e, 0xb2, 0x11, 0x6a, 0x16, 0x5a, 0x2a, 0x04, 0xa7, 0x62,
  0x92, 0xa5, 0xa4, 0xa1, 0xae, 0x6e, 0x5d, 0x11, 0x2b, 0xa3, 0x03, 0xde,
  0x34, 0xc1, 0xbd, 0x70, 0x95, 0xf6, 0x1b, 0x56, 0x70, 0x93, 0x4d, 0xbe,

  0xf8, 0x92, 0x7c, 0x5b, 0xb7, 0xe8, 0x1f, 0xc0, 0x5a, 0x2d, 0x6d, 0xdd,
  0x1e, 0xda, 0x09, 0x24, 0xde, 0x22, 0xba, 0x83, 0x94, 0x55, 0xff, 0xb0,
  0x5e, 0x9d, 0x93, 0x37, 0xe4, 0xbc, 0x2c, 0x37, 0x8e, 0xa8, 0xbe, 0x1b,
  0xec, 0x89, 0x97, 0xcc, 0xc8, 0x29, 0x7e, 0xae, 0x86, 0x93, 0x09, 0x02,
  0x72, 0xa6, 0x25, 0x2e, 0x63, 0x35, 0xf5, 0xe4, 0x21, 0x93, 0x7e, 0xe6,
  0x2a, 0x71, 0xbe, 0x18, 0xa0, 0xcc, 0x27, 0xde, 0x31, 0xc6, 0xad, 0x81,
  0xaf, 0x23, 0x20, 0x90, 0xe8, 0xaf, 0x7f, 0xb4, 0xaf, 0xd3, 0x7f, 0xcc,

  0x6d, 0x06, 0x22, 0xf7, 0x86, 0xd5, 0x50, 0x28, 0x50, 0xdf, 0xd9, 0x43,
  0xf8, 0xc9, 0x36, 0x82, 0xda, 0x1e, 0xb0, 0xa2, 0xfd, 0xc7, 0x6d, 0xb8,
  0x71, 0x35, 0x48, 0x8d, 0xf6, 0x4c, 0xe0, 0x71, 0xb3, 0x32, 0x50, 0x6b,

  0x29, 0x1b, 0x93, 0xfb, 0x37, 0x61, 0xf6, 0x3d, 0x13, 0xa7, 0x99, 0xeb,
  0xd4, 0x7f, 0xd8, 0xb2, 0x93, 0xff, 0x61, 0xcb, 0x4d, 0xff, 0x87, 0x2d,
  0xb7, 0x80, 0x1f, 0xb6, 0x08, 0x86, 0x92, 0x16, 0x11, 0x1a, 0xc4, 0x3f,
  0xf5, 0xd0, 0xb7, 0xf9, 0xab, 0xee, 0xa3, 0xde, 0x37, 0xbd, 0x4f, 0x6e,
  0x6d, 0x6f, 0xda, 0x34, 0x3f, 0x36, 0x84, 0xba, 0x98, 0xee, 0x1e, 0x1a,
  0x76, 0xdd, 0xda, 0x26, 0xb7, 0x2d, 0x64, 0x9c, 0x05, 0x1d, 0xbc, 0xbd,
  0x07, 0x68, 0xc7, 0x5d, 0x73, 0x2a, 0xaf, 0xe9, 0x82, 0x45, 0xb1, 0xd4,
  0x73, 0xd0, 0xde, 0xcf, 0x81, 0x3c, 0xb2, 0xaf, 0x07, 0xf2, 0xe7, 0xbf,
  0x9b, 0x2f, 0x40, 0xff, 0xc7, 0x18, 0x72, 0xab, 0x01, 0x60, 0x23, 0x79,
  0x79, 0x48, 0x98, 0x2e, 0x38, 0x6a, 0xc9, 0xe2, 0x6f, 0xce, 0x95, 0x46,
  0x4c, 0x12, 0x41, 0x2e, 0xfd, 0x32, 0x47, 0xab, 0x32, 0xb3, 0xaa, 0x05,
  0x5b, 0xa8, 0x7b, 0x24, 0x15, 0x90, 0xfb, 0x8a, 0x0e, 0x62, 0x35, 0x4c,
  0x74, 0x31, 0x5e, 0xa5, 0x0f, 0x1b, 0xef, 0x43, 0x3f, 0x49, 0x93, 0x22,
  0xbe, 0x28, 0xab, 0xfa, 0x8b, 0xad, 0x8a, 0x3a, 0xbf, 0x26, 0x97, 0x95,
  0xd1, 0x60, 0xff, 0x48, 0xa4, 0xb5, 0x36, 0x87, 0xe5, 0xee, 0xe9, 0xed,
  0x70, 0x79, 0x67, 0xe6, 0xbd, 0xfd, 0x93, 0x28, 0xc3, 0x63, 0x69, 0x33,
  0x44, 0xe9, 0x0d, 0x73, 0x5c, 0x26, 0xdd, 0x3c, 0x05, 0xbe, 0xba, 0xde,
  0xa5, 0x94, 0xdf, 0x7f, 0x11, 0x83, 0xb9, 0x0b, 0x16, 0xe2, 0x71, 0x5e,
  0x98, 0x6a, 0x5f, 0x9c, 0x7e, 0xf3, 0x47, 0x1d, 0xe0, 0x87, 0xad, 0xef,
  0x87, 0xfc, 0x53, 0xd4, 0x0b, 0xbf, 0x48, 0x4e, 0xbf, 0x21, 0xea, 0xfe,
  0x69, 0x0c, 0x6c, 0xd3, 0x07, 0xbe, 0xe4, 0xbf, 0x80, 0xb2, 0x37, 0x0d,

  0x7b, 0xe1, 0xf2, 0x24, 0xbe, 0xa0, 0x06, 0xc6, 0xa8, 0x33, 0x82, 0x15,
  0xbe, 0x5a, 0x51, 0xe5, 0x90, 0xd6, 0xc7, 0x36, 0x5c, 0x1f, 0x8b, 0xa8,
  0x51, 0x3a, 0x29, 0x39, 0x45, 0xba, 0x09, 0xb1, 0xb1, 0x81, 0xcd, 0x8b,
  0xb3, 0x15, 0xdf, 0xd5, 0x0a, 0x8e, 0x0b, 0xa8, 0xc3, 0xed, 0x34, 0x83,
  0x76, 0x2d, 0xe3, 0x20, 0x39, 0x8a, 0x34, 0x41, 0x70, 0xe0, 0x46, 0xfc,
  0x37, 0xe8, 0x65, 0xb6, 0x37, 0x37, 0x35, 0x54, 0x4b, 0xab, 0x4c, 0x3b,
  0xe4, 0x48, 0x4f, 0x3f, 0x04, 0x98, 0x0c, 0xc1, 0x44, 0x42, 0x01, 0x12,
  0x9d, 0x94, 0x44, 0xf4, 0x79, 0xb9, 0x90, 0x2e, 0xee, 0xb5, 0xa1, 0x7a,
  0x3e, 0x60, 0xdb, 0x46, 0xcf, 0x68, 0x1c, 0xb4, 0x15, 0x12, 0xa9, 0x90,
  0xcf, 0x46, 0x54, 0x0e, 0x89, 0x26, 0xb2, 0x37, 0x4e, 0x9a, 0xb6, 0x01,
  0x30, 0x8c, 0x09, 0xff, 0x8f, 0x64, 0xf4, 0x4f, 0x32, 0x38, 0x9f, 0x6c,
  0x55, 0xe6, 0x50, 0x9c, 0xc3, 0x11, 0x0f, 0x4e, 0x62, 0xef, 0x8d, 0x5e,
  0x1c, 0x4e, 0x83, 0xd0, 0x52, 0x4d, 0xca, 0x13, 0xfb, 0x9a, 0x54, 0x42,
  0x49, 0x64, 0xd7, 0xce, 0x36, 0x24, 0x5e, 0xe2, 0x8b, 0xc5, 0x1d, 0x56,
  0x35, 0x22, 0xbc, 0x6d, 0xc9, 0xef, 0xc4, 0x97, 0xac, 0x8f, 0xa5, 0xa2,
  0x6f, 0xc9, 0x61, 0x8d, 0x82, 0x17, 0xbe, 0x97, 0xa4, 0xa0, 0xe1, 0xc1,
  0x0b, 0xaf, 0x4b, 0x11, 0xff, 0x2c, 0x3e, 0xbc, 0x0f, 0x02, 0xa3, 0x01,
  0xe2, 0x5a, 0xb6, 0x7f, 0xc3, 0xf8, 0x87, 0x76, 0xfc, 0xcf, 0x22, 0xb8,
  0x2b, 0x8c, 0x8c, 0x12, 0xff, 0xec, 0x85, 0x4b, 0x02, 0x54, 0x2f, 0xaa,
  0xf5, 0x64, 0xb4, 0x7c, 0x08, 0x0a, 0xf9, 0xcc, 0x98, 0x2c, 0x1c, 0x6e,
  0x08, 0x9b, 0x3c, 0x30, 0x5c, 0x25, 0xcc, 0x40, 0xac, 0xc3, 0x6c, 0x63,
  0xd7, 0x44, 0x64, 0x51, 0x2f, 0x84, 0x55, 0x2e, 0x09, 0x82, 0x75, 0xf6,
  0xc2, 0xf5, 0xbc, 0x64, 0x10, 0x89, 0xdc, 0xcf, 0xaf, 0x77, 0x75, 0xb4,
  0x41, 0x59, 0x63, 0x0b, 0xe0, 0x38, 0xf8, 0x94, 0x61, 0xc5, 0x0c, 0xbd,
  0xe4, 0x35, 0x64, 0xdc, 0xde, 0xd9, 0x16, 0xa7, 0x0a, 0x7d, 0x88, 0x5a,
  0x45, 0x22, 0x11, 0x0a, 0xc5, 0xd8, 0x29, 0x30, 0x33, 0xc4, 0x97, 0x33,
  0x8c, 0x68, 0x1d, 0x2f, 0xc0, 0xda, 0xed, 0x9d, 0x60, 0xa0, 0x20, 0xe0,
  0x04, 0xa9, 0xdd, 0xcc, 0xa0, 0x5e, 0x2d, 0x70, 0xa0, 0xd0, 0x48, 0xf6,
  0xb6, 0x58, 0x06, 0x63, 0xdb, 0xd4, 0x65, 0x2b, 0xa6, 0xc9, 0xf6, 0x17,
  0xbb, 0xdb, 0x76, 0x69, 0xfd, 0x66, 0x51, 0xd0, 0xf1, 0x51, 0x83, 0x90,

  0xb6, 0x0f, 0x2c, 0x3c, 0x4b, 0x4b, 0xca, 0x7d, 0xc8, 0x86, 0x38, 0xd0,
  0x28, 0x82, 0x5e, 0xdd, 0x88, 0xb7, 0x13, 0x89, 0xe5, 0xb8, 0x9d, 0x8c,
  0xf5, 0xc2, 0x24, 0x9e, 0x2e, 0x1a, 0x4a, 0xd5, 0x47, 0x31, 0x05, 0xa3,
  0xfd, 0xd5, 0x2f, 0x3c, 0x7d, 0x3c, 0x72, 0x3d, 0x29, 0x90, 0x83, 0x26,
  0x0a, 0xe2, 0x12, 0xf1, 0x3c, 0x1a, 0x9b, 0x54, 0xef, 0xed, 0x2f, 0x76,
  0x58, 0x60, 0x39, 0x7f, 0x9a, 0xf7, 0xed, 0xed, 0xe4, 0x87, 0x78, 0x5d,
  0x6b, 0xc2, 0xef, 0x7a, 0x16, 0x82, 0x90, 0xed, 0x7d, 0x6f, 0x24, 0x2f,
  0x27, 0xe5, 0xec, 0xee, 0x4f, 0x08, 0x3b, 0xc9, 0x2b, 0x2f, 0xf7, 0xf0,

  0xa3, 0x8e, 0xca, 0xdc, 0x37, 0x10, 0x46, 0x31, 0x47, 0x85, 0x3f, 0xbf,
  0xa4, 0xc7, 0xd5, 0x62, 0xd8, 0x4e, 0x46, 0x23, 0xc3, 0x84, 0xea, 0x25,
  0xda, 0x71, 0x6d, 0x10, 0x2c, 0x8c, 0x77, 0x07, 0x11, 0x4b, 0x4a, 0x8a,

  0x40, 0x96, 0xc0, 0xb3, 0xa3, 0x56, 0x36, 0x3b, 0x21, 0xf9, 0x57, 0xd5,
  0x17, 0xa3, 0xe4, 0x95, 0xcd, 0x92, 0xc9, 0x22, 0x18, 0xd9, 0x74, 0x8d,
  0x59, 0x76, 0x78, 0x25, 0xe1, 0x9f, 0x4f, 0x72, 0x71, 0xb3, 0xcf, 0xca,
  0x16, 0xee, 0x26, 0x63, 0x3a, 0x18, 0xe1, 0x1e, 0x47, 0x4a, 0x9b, 0x96,
  0x15, 0xc7, 0x88, 0xd8, 0x9d, 0x6e, 0xed, 0x17, 0x99, 0xda, 0xf0, 0x48,
  0x80, 0xb9, 0x94, 0x8d, 0x0e, 0x92, 0x67, 0xf6, 0x4b, 0x11, 0xac, 0x7a,

  0xb6, 0xf8, 0xeb, 0xe4, 0xf3, 0x21, 0x3d, 0xe5, 0x75, 0x8b, 0x15, 0xba,
  0x6f, 0x67, 0x70, 0x0c, 0x44, 0x29, 0x1c, 0x22, 0x31, 0x29, 0x52, 0x90,
  0x03, 0x49, 0x30, 0x49, 0xeb, 0xec, 0xe9, 0x63, 0x55, 0x2f, 0x79, 0x97,
  0x6a, 0xf5, 0xdf, 0xb6, 0x9c, 0xb0, 0x2c, 0x87, 0xbc, 0x05, 0x75, 0x2f,

  0x02, 0x0a, 0x8b, 0x49, 0x39, 0xa3, 0xe6, 0x5f, 0x9c, 0x83, 0x4b, 0xd2,
  0xd4, 0x28, 0x92, 0x97, 0x0d, 0x2a, 0x8a, 0x9e, 0x3d, 0xf5, 0x26, 0x7d,
  0x8f, 0xbb, 0xa2, 0xc3, 0x49, 0x65, 0x85, 0xdd, 0x15, 0xa9, 0xbd, 0x6e,
  0xbe, 0x1b, 0xdc, 0x4b, 0xf2, 0x75, 0x30, 0xf0, 0x98, 0xac, 0xd1, 0x3a,
  0x18, 0xef, 0xbb, 0x46, 0xfe, 0x25, 0xf8, 0xa3, 0x12, 0x4e, 0xf7, 0xd3,
  0x1b, 0x89, 0xda, 0x33, 0x91, 0xf4, 0x7d, 0x9e, 0x04, 0x13, 0xf6, 0xfd,
  0x74, 0x4d, 0x41, 0x84, 0xf9, 0xba, 0x82, 0xf4, 0x91, 0xc7, 0x58, 0x49,
  0xd0, 0x3a, 0x25, 0xd1, 0xd3, 0xdf, 0xbd, 0x7a, 0xff, 0xe1, 0xd5, 0xc9,
  0xc3, 0xbb, 0x02, 0xb5, 0x1a, 0xcd, 0xdd, 0x93, 0x03, 0xeb, 0x83, 0x19,
  0x74, 0xa0, 0x7e, 0xe2, 0x50, 0x06, 0x41, 0xd4, 0x81, 0xa0, 0x0d, 0xba,
  0xd9, 0x7a, 0x54, 0x34, 0x46, 0x74, 0x45, 0x49, 0x22, 0x71, 0x08, 0x20,
  0xce, 0xf3, 0x95, 0x10, 0xb9, 0x97, 0xb9, 0x99, 0xd6, 0xd2, 0x93, 0x71,
  0x4b, 0xdf, 0xa7, 0xd7, 0xb7, 0x24, 0x79, 0xdc, 0xd6, 0x89, 0xc7, 0xa8,
  0xdc, 0xd6, 0xb6, 0xdb, 0xd4, 0x2b, 0x6d, 0x6a, 0x2d, 0x02, 0xad, 0xe5,
  0x7d, 0x2b, 0xe7, 0x73, 0x97, 0x3d, 0xdb, 0x8d, 0xf0, 0xbd, 0x7e, 0xdd,
  0x5f, 0x72, 0xfb, 0x6b, 0xa2, 0xa5, 0x76, 0x32, 0xd2, 0xb1, 0x8d, 0x8e,
  0xbb, 0x0f, 0x9b, 0x92, 0xab, 0xd1, 0x5f, 0xca, 0xdc, 0xe2, 0xbb, 0x6a,

  0x26, 0xe8, 0x23, 0x07, 0xa8, 0x8a, 0x8b, 0x76, 0xb3, 0xe3, 0xa3, 0x73,
  0x6c, 0xd6, 0xd9, 0xab, 0xf1, 0xd8, 0xca, 0xc2, 0x5a, 0xd2, 0x12, 0x06,
  0x81, 0x31, 0x06, 0x35, 0xd2, 0x6f, 0x7b, 0x32, 0x4a, 0x6c, 0xa7, 0x58,


  0x49, 0xe7, 0x44, 0xec, 0xc7, 0xd8, 0x7c, 0x17, 0xeb, 0xa5, 0xb9, 0x30,
  0x46, 0xe3, 0x9d, 0x6d, 0xd7, 0x12, 0x8a, 0xed, 0x12, 0x1e, 0x71, 0x2e,
  0xd1, 0xa4, 0x70, 0xd6, 0x44, 0x7b, 0x74, 0xf6, 0x63, 0x8d, 0x21, 0x11,
  0x97, 0xe7, 0xe0, 0xb5, 0x0f, 0x71, 0x3b, 0x88, 0x3b, 0xd3, 0xb7, 0xc6,
  0xc7, 0x17, 0x47, 0x66, 0xfb, 0x3e, 0x5c, 0x7c, 0xbd, 0x25, 0xa9, 0x0b,
  0x5d, 0x14, 0x0c, 0x38, 0xed, 0xa9, 0xc5, 0xeb, 0xb5, 0xad, 0x96, 0xad,
  0xd8, 0x91, 0x62, 0xac, 0x85, 0x98, 0x06, 0xee, 0x3e, 0x3a, 0xda, 0x70,
  0x4a, 0x4f, 0x46, 0x4f, 0xba, 0xa7, 0xd4, 0x0f, 0x57, 0xcd, 0x00, 0xc6,
  0x01, 0xb9, 0x0b, 0x2a, 0x32, 0x65, 0x4f, 0xed, 0xb9, 0xe6, 0x29, 0x08,
  0xb2, 0x01, 0x5d, 0x27, 0xe5, 0x52, 0xf8, 0x00, 0x3d, 0x4f, 0xa1, 0x04,
  0xbd, 0xb8, 0x38, 0xb0, 0x9b, 0x2d, 0xdc, 0x90, 0x78, 0x7b, 0x39, 0x1c,
  0x6a, 0x4e, 0x2c, 0xad, 0x66, 0xb6, 0x2c, 0x34, 0xd4, 0x0f, 0x35, 0xd7,

  0x8f, 0x5a, 0x32, 0x19, 0x12, 0xd0, 0x96, 0x2c, 0xad, 0x6a, 0xdd, 0xb0,
  0xb7, 0x82, 0xcb, 0xe7, 0x8b, 0x83, 0x69, 0xc3, 0x8b, 0x8e, 0x2e, 0x2d,
  0x16, 0x15, 0x7a, 0x63, 0xf6, 0x63, 0x1c, 0xff, 0x99, 0xf6, 0x55, 0xf2,
  0x45, 0x5e, 0xf2, 0x9f, 0x71, 0x7a, 0x87, 0xc8, 0xad, 0xca, 0x05, 0x3b,
  0x10, 0xe5, 0x0d, 0x4e, 0xe2, 0xe4, 0x62, 0x17, 0xa9, 0xc3, 0xa8, 0x90,
  0x70, 0x28, 0x21, 0x1a, 0x34, 0x35, 0x0f, 0xdb, 0x6e, 0xed, 0x8c, 0x77,
  0xad, 0xa7, 0xf5, 0x02, 0x11, 0x45, 0x8c, 0x16, 0xa9, 0x62, 0xf2, 0x90,
  0x15, 0x45, 0xbd, 0x8c, 0xa1, 0xfb, 0x78, 0xb7, 0x37, 0xb4, 0x98, 0xc0,
  0xa8, 0xa7, 0x37, 0xb3, 0x1e, 0xac, 0x3a, 0xb8, 0xb5, 0x90, 0x44, 0x06,
  0x1b, 0x90, 0x6b, 0xa6, 0x5e, 0x7f, 0xf7, 0xc6, 0x6b, 0xb6, 0xa3, 0x79,
  0x6a, 0x4c, 0x2f, 0xa2, 0x90, 0xf6, 0xa1, 0xc1, 0x65, 0x2e, 0xd9, 0x72,
  0x84, 0xa0, 0xea, 0x2c, 0xcb, 0x56, 0x16, 0xda, 0x3c, 0x47, 0x8d, 0x4d,
  0x5e, 0x23, 0x88, 0x2a, 0xb0, 0xf2, 0x68, 0x27, 0xd7, 0x33, 0x3b, 0x61,

  0x1d, 0xda, 0x22, 0x12, 0xf6, 0x0e, 0x35, 0x0f, 0xa3, 0x30, 0xee, 0xc1,
  0xb3, 0x47, 0x9f, 0x1b, 0xd9, 0x7c, 0x07, 0xac, 0x71, 0xb7, 0x65, 0x8c,
  0x05, 0xdc, 0x8f, 0xf3, 0x27, 0x46, 0x8d, 0xa6, 0xf7, 0x0a, 0x9c, 0x42,
  0x52, 0x93, 0x19, 0x01, 0x07, 0x95, 0x14, 0x37, 0x87, 0x58, 0x34, 0x66,
  0x13, 0x65, 0xc3, 0x24, 0xe9, 0x0e, 0xfb, 0xc4, 0x09, 0x62, 0x23, 0x8f,
  0x80, 0xa9, 0x41, 0x09, 0x75, 0x52, 0x33, 0x2c, 0xe5, 0xfc, 0xe8, 0xe2,
  0xdc, 0xfc, 0x31, 0xbe, 0x38, 0x3d, 0xef, 0x41, 0x66, 0x6c, 0x18, 0xa6,
  0x83, 0x36, 0x4d, 0xd3, 0x55, 0xb0, 0xcd, 0x6d, 0xd4, 0x36, 0x64, 0x42,
  0x33, 0xdb, 0xa9, 0xa3, 0x40, 0x5f, 0x1e, 0xde, 0x57, 0x3d, 0x6a, 0x2d,
  0x74, 0x6e, 0xe4, 0xc3, 0xc6, 0x85, 0xf1, 0x99, 0x6f, 0xa6, 0x10, 0x2c,
  0x98, 0x88, 0x91, 0x56, 0x6c, 0x19, 0x3d, 0x66, 0x6b, 0x8c, 0x36, 0x72,
  0xfe, 0x3b, 0x18, 0x7b, 0x6d, 0x4f, 0xdd, 0x83, 0x66, 0xc8, 0xa9, 0xb9,
  0xdc, 0x9c, 0xc5, 0x75, 0x6b, 0x37, 0x9c, 0x56, 0xa1, 0x00, 0xb6, 0x92,
  0x1d, 0x38, 0x90, 0x45, 0x2f, 0xb9, 0x87, 0x7e, 0x8d, 0x2e, 0xb4, 0xeb,
  0x16, 0x5c, 0x97, 0xcb, 0x8c, 0x3d, 0xfc, 0x9c, 0x9c, 0xab, 0xcc, 0x89,
  0x65, 0x0b, 0xe3, 0xd2, 0x26, 0x31, 0x3c, 0x0c, 0x0b, 0x21, 0x46, 0xa7,
  0xbc, 0x6d, 0x11, 0x05, 0x4a, 0xa1, 0x0e, 0x3e, 0x97, 0xcc, 0x58, 0xaa,

  0x0d, 0xb0, 0xd9, 0xb6, 0x75, 0x56, 0x1e, 0xb6, 0x58, 0x9b, 0x79, 0x1f,
  0x74, 0x99, 0x0c, 0x81, 0x32, 0xc4, 0x39, 0x0b, 0xfa, 0xe8, 0x69, 0x71,
  0x3d, 0x12, 0xad, 0x34, 0xc7, 0x06, 0xba, 0x84, 0xdf, 0x3f, 0xf4, 0x4c,
  0x9e, 0x8a, 0x86, 0xd5, 0x50, 0xbd, 0x48, 0x60, 0x1e, 0x96, 0xb6, 0xe5,
  0xc8, 0x39, 0x44, 0xb3, 0xee, 0x32, 0xdd, 0x96, 0x3e, 0x17, 0xb2, 0x59,
  0x55, 0xda, 0x12, 0xd7, 0x91, 0x29, 0x40, 0xa3, 0xe8, 0x6d, 0xfb, 0xd5,
  0x87, 0x12, 0xdd, 0xd5, 0x60, 0x90, 0x6e, 0xe5, 0x9c, 0x0c, 0xe8, 0x91,

  0x1d, 0x45, 0xd0, 0x49, 0x3e, 0x14, 0x82, 0x1c, 0x53, 0x18, 0xdb, 0x02,
  0xf9, 0x0f, 0x33, 0xbb, 0x69, 0x04, 0xa8, 0x44, 0x69, 0x5b, 0x2c, 0xb4,
  0x66, 0x25, 0x2b, 0xf4, 0xc0, 0x74, 0x0e, 0x21, 0xc2, 0xe0, 0x43, 0x46,
  0x36, 0x81, 0x4a, 0x1a, 0x19, 0xcf, 0xd9, 0x25, 0xd3, 0xa6, 0xbb, 0x52,
  0xa0, 0x3c, 0x04, 0x0b, 0x3d, 0xf3, 0x0f, 0x8d, 0x59, 0x1a, 0xac, 0x1f,

  0xc7, 0x0b, 0x1a, 0x06, 0x5b, 0x60, 0x44, 0x05, 0xf5, 0x0a, 0x08, 0xac,
  0x45, 0x11, 0x2d, 0xcd, 0x62, 0x48, 0x8b, 0x75, 0xb1, 0xa0, 0x1c, 0xf1,
  0x36, 0x54, 0x84, 0xaa, 0x81, 0xa3, 0x0d, 0x55, 0xac, 0x3e, 0xb2, 0x44,
  0x8b, 0x24, 0xdb, 0xf5, 0xfa, 0xed, 0xd5, 0xf5, 0x56, 0xfe, 0x82, 0x40,
  0xcf, 0xe9, 0xc8, 0x14, 0x91, 0x52, 0x69, 0x2b, 0x2f, 0x72, 0x42, 0x12,
  0x2a, 0xab, 0x3d, 0xaa, 0x52, 0x21, 0xcc, 0x3e, 0x63, 0x55, 0x96, 0x0b,
  0xb4, 0xf6, 0x51, 0xd5, 0x2d, 0xd6, 0x90, 0x19, 0x2a, 0x18, 0x63, 0xf0,
  0x98, 0xc1, 0xdb, 0x95, 0xfb, 0x5e, 0xb3, 0x3a, 0x92, 0xa6, 0x1e, 0x6c,

  0xc4, 0x28, 0xd6, 0x0e, 0x8e, 0x33, 0x42, 0x90, 0xf1, 0xd8, 0x56, 0xc7,
  0xb4, 0x35, 0xa9, 0x36, 0x17, 0xc1, 0xb9, 0x42, 0xe5, 0x43, 0xfe, 0x7d,
  0x4f, 0x2d, 0x9f, 0x36, 0x76, 0x01, 0x38, 0x94, 0xd9, 0x95, 0x01, 0x67,
  0x87, 0xb4, 0x6f, 0x26, 0x2c, 0x87, 0xf6, 0xd7, 0xea, 0xac, 0x59, 0xaf,
  0x42, 0x39, 0xef, 0xaa, 0x4f, 0xed, 0x88, 0x1a, 0x14, 0xf5, 0xa6, 0x48,
  0xa8, 0x0a, 0x6e, 0xfb, 0x7d, 0x74, 0xfe, 0xee, 0x6d, 0x84, 0x26, 0x10,


  0x48, 0xf7, 0x3e, 0x24, 0x00, 0x15, 0x2f, 0xd4, 0x20, 0x38, 0xd9, 0x32,
  0xfa, 0xc5, 0xfe, 0x16, 0x03, 0x2d, 0x48, 0xd9, 0x16, 0x47, 0xd9, 0xed,
  0xdb, 0x66, 0x5f, 0xbc, 0xf9, 0x86, 0x77, 0x46, 0xeb, 0x51, 0xa4, 0x64,
  0x91, 0x4e, 0x67, 0x87, 0x7a, 0xd1, 0xe3, 0xfe, 0xee, 0x7e, 0xd6, 0xbb,
  0xf4, 0x0d, 0xb3, 0xda, 0x3a, 0x78, 0x7e, 0x38, 0x3a, 0x78, 0xfa, 0xf9,
  0xe8, 0x00, 0x9d, 0x6c, 0xbd, 0xb9, 0xb9, 0x8e, 0xab, 0xde, 0x40, 0x91,
  0x7e, 0xbe, 0x49, 0x3f, 0xa2, 0x2f, 0x7f, 0x61, 0x79, 0x37, 0xa2, 0xe7,
  0x46, 0xdc, 0x55, 0x27, 0xf8, 0xc6, 0xd2, 0xe8, 0x34, 0x79, 0x11, 0xc4,
  0x41, 0x86, 0x2e, 0xab, 0x88, 0x69, 0x71, 0x95, 0x13, 0x19, 0x29, 0xca,
  0xa6, 0xb7, 0x4f, 0xda, 0x10, 0xd0, 0x36, 0x38, 0xc1, 0xed, 0x8c, 0xcf,
  0x48, 0x59, 0xfa, 0x54, 0xd4, 0x48, 0xc7, 0xd5, 0xed, 0xf7, 0x03, 0xb6,
  0xf9, 0x93, 0xad, 0x3e, 0x82, 0x70, 0xb1, 0x97, 0xae, 0x0b, 0xd3, 0x05,
  0x88, 0xa7, 0x2e, 0x4a, 0x90, 0x80, 0xbe, 0xf0, 0x83, 0xaa, 0x71, 0xdb,
  0x80, 0xb8, 0x2f, 0x64, 0x00, 0x7e, 0xe4, 0x2a, 0x71, 0xfc, 0x4a, 0x62,
  0x8c, 0x6c, 0xeb, 0x44, 0x3b, 0x70, 0x4e, 0x16, 0x66, 0x89, 0x99, 0xb4,
  0x0e, 0x47, 0xef, 0xfc, 0xe1, 0x0f, 0x8e, 0x23, 0x71, 0x5b, 0x75, 0xf4,
  0xf2, 0x78, 0x02, 0xa8, 0x56, 0x8e, 0x55, 0x73, 0x57, 0x80, 0xad, 0x17,
  0x7f, 0x85, 0x73, 0xf8, 0xc7, 0xe1, 0x5f, 0xcd, 0x3f, 0x7f, 0xdc, 0xd2,
  0x4b, 0xcd, 0xb0, 0x5c, 0xae, 0x60, 0xc4, 0xc1, 0x1f, 0xe2, 0x80, 0x06,

  0x49, 0xbb, 0x2d, 0x2d, 0x34, 0x83, 0x8b, 0xd7, 0x67, 0x7c, 0x19, 0x2b,
  0x0e, 0x7b, 0x83, 0x9a, 0x89, 0x0f, 0x41, 0xad, 0x27, 0x16, 0x8e, 0x8e,
  0x1a, 0x4c, 0x27, 0x76, 0x2f, 0xbd, 0x57, 0x06, 0x2e, 0xa9, 0xe1, 0x86,
  0x39, 0x40, 0x6a, 0xf4, 0xdb, 0x4b, 0xf2, 0xaf, 0x70, 0x49, 0xba, 0xe1,
  0xbb, 0xaa, 0x48, 0x4b, 0xc7, 0x60, 0x02, 0xf6, 0x32, 0x6c, 0xc0, 0x5e,
  0x87, 0x1b, 0x33, 0xa5, 0x41, 0x22, 0xf0, 0xb7, 0x5c, 0x1b, 0xd1, 0x08,
  0x96, 0xa2, 0xd9, 0x06, 0xb3, 0x51, 0xca, 0x6d, 0xab, 0xbc, 0xfe, 0x44,
  0xeb, 0x93, 0x32, 0x1f, 0x2f, 0x57, 0x88, 0xe6, 0xf3, 0x99, 0xd5, 0xfa,
  0xee, 0x14, 0xb2, 0xc6, 0x16, 0xee, 0x79, 0x3b, 0xeb, 0xa4, 0x83, 0x1e,
  0xbb, 0x02, 0x51, 0x46, 0x61, 0xb7, 0xe4, 0xb1, 0x2a, 0x7b, 0x00, 0x1a,
  0x9c, 0xa4, 0xc2, 0x9c, 0x19, 0x3d, 0xd7, 0x92, 0x86, 0x07, 0xcd, 0x44,

  0x25, 0xed, 0x44, 0x2c, 0x24, 0xfd, 0x76, 0xbb, 0x52, 0x8b, 0x3a, 0xd4,



  0x90, 0xa3, 0x98, 0xe1, 0xa1, 0x2c, 0xbe, 0x19, 0x7a, 0x66, 0x51, 0xf9,
  0x44, 0x65, 0xa6, 0x31, 0x1b, 0x68, 0x6d, 0x3e, 0xdf, 0x0c, 0x0a, 0xf2,
  0xaa, 0x4e, 0xf7, 0x59, 0xd4, 0x56, 0xc0, 0x45, 0x73, 0xca, 0xe8, 0x82,
  0x7d, 0xea, 0xb4, 0xf9, 0xd8, 0x75, 0xfa, 0xd3, 0x70, 0x6b, 0xed, 0xa8,
  0x76, 0x53, 0xa0, 0x3d, 0x72, 0x12, 0x1a, 0x34, 0x98, 0xfe, 0x32, 0x06,
  0xd1, 0xeb, 0x09, 0xd5, 0xc3, 0xfd, 0xd0, 0x95, 0x42, 0x4d, 0x9f, 0xb1,
  0xc9, 0xc3, 0x7c, 0x75, 0xff, 0x06, 0x2a, 0xcc, 0x17, 0x1d, 0x69, 0x8b,
  0xb3, 0x58, 0x09, 0x53, 0xaf, 0x2f, 0x2f, 0x81, 0x89, 0x11, 0x66, 0xe6,
  0xa1, 0x62, 0x51, 0x0a, 0x07, 0xa4, 0x9f, 0x81, 0x61, 0xe4, 0x98, 0xb9,
  0xee, 0x86, 0x2b, 0x8b, 0x14, 0x86, 0x53, 0xbb, 0xce, 0x24, 0xbd, 0xa5,
  0xb3, 0xd4, 0xcb, 0x4e, 0xae, 0xb7, 0xd3, 0x64, 0xaa, 0x6c, 0xa8, 0x13,
  0xed, 0xf2, 0x41, 0x4a, 0x0d, 0x0a, 0x32, 0x60, 0x99, 0x23, 0xc2, 0xd7,
  0xd0, 0xcf, 0xfb, 0x36, 0xba, 0x1b, 0xc9, 0xc3, 0x46, 0xfd, 0x71, 0x18,

  0x8e, 0x27, 0x9f, 0x0b, 0x88, 0x1f, 0xa3, 0xb0, 0x55, 0x16, 0xd5, 0x8a,
  0xf5, 0x4a, 0xe1, 0x47, 0x5d, 0xa9, 0x39, 0xc7, 0x76, 0x6c, 0xf2, 0x0b,
  0x38, 0x56, 0xe8, 0x6b, 0x4b, 0x8f, 0x47, 0x87, 0xc1, 0xc1, 0xd6, 0x8b,
  0xe1, 0x74, 0x3a, 0x1d, 0x42, 0x0f, 0x78, 0xc9, 0xca, 0xc9, 0x9e, 0x28,
  0x07, 0x3d, 0x3e, 0x83, 0x71, 0x26, 0xfb, 0xfd, 0xfa, 0xf5, 0x6b, 0xd1,
  0x63, 0x2e, 0xae, 0x3a, 0x1a, 0x85, 0x05, 0x9c, 0x12, 0x8d, 0x2a, 0xd6,
  0xe6, 0xb0, 0xbe, 0x5a, 0x37, 0x33, 0x74, 0x43, 0x26, 0x96, 0xa1, 0xac,

  0xd7, 0xd6, 0xc8, 0x76, 0x50, 0x41, 0xa9, 0x29, 0xfd, 0xc0, 0x65, 0x26,
  0x9a, 0xb1, 0x83, 0xa3, 0x59, 0x71, 0x03, 0x14, 0xbc, 0x28, 0x63, 0x77,
  0x5b, 0xac, 0xf2, 0x54, 0x7d, 0xe8, 0x2e, 0x9d, 0x60, 0x1d, 0xcb, 0x64,
  0xd3, 0x51, 0xf0, 0xd9, 0x34, 0x97, 0x0c, 0xb0, 0x54, 0xbe, 0xd5, 0x1d,
  0xfb, 0x9e, 0xf3, 0x90, 0xad, 0x6e, 0x1f, 0xc9, 0xd3, 0xde, 0x23, 0x89,

  0x6e, 0x3e, 0x59, 0x55, 0xb4, 0xed, 0x3b, 0xaf, 0x81, 0x28, 0xfa, 0x5a,
  0x2e, 0xc4, 0xeb, 0x2b, 0xca, 0xdf, 0x5a, 0xd0, 0xe1, 0x98, 0x29, 0xd7,
  0xcc, 0x04, 0x44, 0x7e, 0x8c, 0xc7, 0x27, 0x7b, 0x17, 0x27, 0xe3, 0x20,
  0xe3, 0xfd, 0x8e, 0x5c, 0xc6, 0xdc, 0x44, 0xbb, 0xe5, 0xf2, 0xe4, 0x2d,
  0x02, 0x38, 0x74, 0x39, 0x6f, 0x53, 0x38, 0x7f, 0x25, 0x8a, 0x77, 0xb2,
  0x2e, 0xb4, 0x18, 0xc6, 0xca, 0xee, 0x22, 0x2b, 0x50, 0x44, 0x4e, 0x22,
  0x1c, 0x37, 0x00, 0x09, 0xb1, 0x75, 0xf2, 0xfe, 0xd5, 0x05, 0x95, 0xb7,
  0x34, 0x92, 0xe2, 0x41, 0x2e, 0xa0, 0xd0, 0x33, 0x7e, 0x63, 0x71, 0x09,
  0x10, 0xb5, 0x49, 0xa7, 0xae, 0x19, 0x8a, 0x2a, 0xeb, 0x7c, 0x7c, 0xb5,
  0x12, 0xde, 0xa6, 0xed, 0x37, 0x5b, 0x2a, 0xd2, 0xa1, 0x4b, 0xf3, 0xdd,
  0xd3, 0x38, 0x88, 0x9e, 0x06, 0x6f, 0x40, 0xfc, 0x3a, 0x9c, 0x0b, 0x2b,
  0xd7, 0x8d, 0x96, 0x2a, 0x7e, 0x9d, 0xfe, 0xa2, 0xbc, 0xcc, 0xc9, 0x13,
  0x88, 0xf3, 0xf2, 0x03, 0x6f, 0x81, 0x9b, 0x94, 0x77, 0xa7, 0xe6, 0x52,
  0x9c, 0x36, 0x80, 0x2d, 0x5f, 0x11, 0x92, 0x13, 0x76, 0x4f, 0x6d, 0x1f,
  0x26, 0x2d, 0x81, 0x0c, 0x2b, 0x0c, 0x81, 0x9d, 0x97, 0x4f, 0x8d, 0x89,
  0x30, 0xa5, 0xec, 0x0f, 0x94, 0x03, 0xd6, 0xed, 0x14, 0xdb, 0xbc, 0x05,
  0xcb, 0xa7, 0x1e, 0xd2, 0x3a, 0x8c, 0x55, 0x40, 0x53, 0x90, 0x15, 0x6e,

  0xf4, 0xc3, 0x3f, 0x6d, 0x09, 0x8f, 0xaf, 0xc8, 0x22, 0xbb, 0x0c, 0x84,
  0xae, 0x45, 0xa1, 0x88, 0x20, 0xff, 0x41, 0x45, 0x45, 0x79, 0xbf, 0xf4,
  0x36, 0xf6, 0x21, 0xdd, 0x37, 0xa1, 0x77, 0x0f, 0xba, 0xed, 0xcc, 0x18,
  0x95, 0xb0, 0x0d, 0x56, 0xdd, 0x82, 0x06, 0xd2, 0x44, 0xdf, 0xce, 0x70,
  0x5f, 0x1d, 0xb9, 0xf6, 0x09, 0x1d, 0xfc, 0xa0, 0x56, 0x6b, 0x05, 0x8e,
  0x43, 0x52, 0x0c, 0xea, 0x86, 0xba, 0xb0, 0xde, 0xf4, 0x18, 0x39, 0xac,
  0xc4, 0x5e, 0x38, 0x34, 0x76, 0xbe, 0x1f, 0xac, 0x05, 0x66, 0x36, 0x4b,
  0x95, 0xa0, 0x67, 0x34, 0x40, 0xff, 0x1f, 0xdb, 0xae, 0x3b, 0xd0, 0x28,
  0xe2, 0x87, 0x50, 0xe9, 0x10, 0x02, 0x08, 0xbb, 0xd0, 0xd3, 0xc0, 0x4d,
  0xd8, 0x7d, 0x37, 0x6c, 0xef, 0xc1, 0xcb, 0xdb, 0x3c, 0x9f, 0xaf, 0x8f,
  0x5e, 0xbd, 0xb1, 0x30, 0x02, 0xbf, 0x05, 0xb2, 0xb0, 0xf3, 0x6a, 0x4e,
  0x32, 0xee, 0x02, 0xb1, 0x56, 0x47, 0x09, 0x4e, 0x47, 0x09, 0x15, 0xb4,
  0x62, 0xd4, 0xb5, 0x3a, 0xe3, 0x1b, 0xd2, 0xdb, 0x0c, 0xa1, 0xd7, 0x33,
  0xe2, 0x67, 0x1f, 0x88, 0xc7, 0x9a, 0x34, 0x65, 0xae, 0xad, 0xf2, 0x08,
  0xf9, 0x12, 0x84, 0xbc, 0x28, 0x27, 0xe5, 0x7c, 0xbe, 0x41, 0xba, 0x33,
  0x3c, 0x24, 0x6a, 0xa0, 0x98, 0x60, 0xb6, 0x68, 0x1b, 0xe9, 0xbd, 0x09,
  0xcd, 0xde, 0x1c, 0xa9, 0xb9, 0x6a, 0x5b, 0x52, 0x98, 0x00, 0x95, 0x3c,
  0xb8, 0x1b, 0xed, 0xc2, 0x74, 0xb5, 0x19, 0xd4, 0xc4, 0x43, 0x61, 0x3e,
  0xbb, 0x63, 0x34, 0x4d, 0xc8, 0x02, 0xfb, 0xd7, 0xc9, 0x7f, 0xfd, 0xf3,

  0xaf, 0x3f, 0x46, 0xba, 0x1b, 0x90, 0xc3, 0xef, 0x8a, 0x2b, 0x0b, 0xcd,
  0xd3, 0x4b, 0x41, 0x6d, 0xb1, 0x38, 0xf1, 0x9c, 0x68, 0xc2, 0xf1, 0x8c,
  0xa6, 0xce, 0x16, 0xf3, 0x91, 0x97, 0x53, 0x19, 0x8a, 0x45, 0x32, 0xa1,

  0xf4, 0x83, 0xe8, 0x56, 0x47, 0xa5, 0xe0, 0x5c, 0xbe, 0x4b, 0xc8, 0xdd,
  0x68, 0x11, 0xe4, 0x52, 0xa6, 0x2d, 0xb2, 0x2f, 0x9f, 0x44, 0x80, 0x1f,
  0xe3, 0xda, 0xf8, 0x74, 0x83, 0xe9, 0x1f, 0xce, 0x8f, 0xad, 0xab, 0xd3,
  0xe7, 0xca, 0x57, 0x86, 0x52, 0xef, 0x86, 0xd9, 0x5d, 0x36, 0x31, 0x5c,
  0xa2, 0x56, 0xe0, 0x87, 0xe1, 0xb2, 0x4e, 0x5e, 0x2e, 0x0d, 0x8d, 0xe7,
  0x3d, 0x90, 0x1d, 0x5f, 0xd3, 0x6b, 0x89, 0xbe, 0x66, 0xf1, 0x4b, 0x2f,
  0xcb, 0xca, 0xec, 0xd0, 0x52, 0xaa, 0x71, 0xa5, 0x24, 0xb9, 0xed, 0xcc,
  0x48, 0x50, 0x60, 0x12, 0xb8, 0x03, 0xae, 0x1f, 0x8b, 0xc6, 0x0d, 0x30,
  0x36, 0x0f, 0x28, 0x0c, 0xca, 0xfa, 0xda, 0x28, 0x8f, 0x66, 0xf6, 0xc6,
  0xc8, 0x26, 0x6b, 0xbd, 0x1e, 0x08, 0x49, 0x55, 0x8a, 0x23, 0x17, 0x85,

  0x11, 0xb0, 0x65, 0x88, 0x6c, 0x61, 0x19, 0xa6, 0xe3, 0xaf, 0xc8, 0x76,
  0x31, 0xf5, 0xd1, 0xdf, 0xa4, 0x77, 0x71, 0xb8, 0xaf, 0xba, 0x00, 0x76,
  0x83, 0x26, 0x2e, 0x7b, 0x95, 0x0a, 0x36, 0x72, 0xed, 0x2f, 0xec, 0x7b,
  0x62, 0xad, 0xa9, 0x1c, 0x5c, 0xca, 0x65, 0x3a, 0xb3, 0x85, 0xf4, 0x3e,
  0x74, 0x20, 0xca, 0x10, 0x53, 0xaa, 0x8b, 0xcc, 0x16, 0x23, 0xe9, 0xaa,
  0x8d, 0xb4, 0x2a, 0x37, 0x26, 0x18, 0x6e, 0x17, 0xd7, 0xa5, 0xa6, 0x14,
  0x01, 0xae, 0x86, 0x15, 0x87, 0x3e, 0xca, 0xca, 0xc5, 0xf3, 0x10, 0x8d,
  0xf5, 0x5e, 0x08, 0x5e, 0xce, 0x25, 0xcc, 0x7e, 0xb1, 0x1f, 0x00, 0x96,
  0x8c, 0xde, 0x61, 0x0c, 0x43, 0x42, 0x6f, 0x23, 0xbd, 0x82, 0x78, 0x08,
  0x1f, 0xf8, 0x91, 0x1c, 0x78, 0x67, 0x38, 0x8a, 0xb5, 0x3c, 0x7d, 0xf2,
  0xe4, 0x09, 0xc7, 0x5a, 0xb6, 0x8e, 0xf1, 0xe1, 0xf3, 0xa3, 0xd7, 0xa7,
  0xef, 0xde, 0x1d, 0xbd, 0x7f, 0x73, 0xf4, 0x46, 0x33, 0x3e, 0xbc, 0x95,

  0x38, 0xea, 0x08, 0x57, 0x44, 0x59, 0x82, 0x66, 0x9f, 0x0f, 0x9e, 0xec,
  0x0f, 0x0f, 0x9f, 0xec, 0x27, 0x86, 0x16, 0x53, 0x5b, 0xa7, 0x96, 0x2e,
  0x52, 0xb2, 0x6f, 0xaf, 0xd6, 0x46, 0x55, 0x23, 0x68, 0xcf, 0x86, 0x30,
  0x37, 0xe0, 0x7a, 0x25, 0x6f, 0x4f, 0xd6, 0x90, 0x1d, 0x1d, 0xc9, 0x0c,
  0x18, 0x6d, 0x59, 0x90, 0x36, 0x17, 0xb0, 0x14, 0xdd, 0x07, 0x04, 0x7a,
  0xb8, 0x4f, 0x1f, 0x1a, 0x25, 0x6f, 0x8d, 0xf6, 0x31, 0x2f, 0x6f, 0x99,
  0x16, 0x5f, 0x5f, 0x19, 0xa5, 0x34, 0x0b, 0x43, 0x95, 0xed, 0xf7, 0xe9,
  0xf5, 0x47, 0xfc, 0xfa, 0x6f, 0x18, 0xa3, 0x7f, 0xf2, 0xbc, 0x6d, 0x58,
  0x9a, 0x8b, 0x0c, 0x54, 0x78, 0x2d, 0x49, 0xec, 0xc1, 0xf7, 0x1f, 0xb3,
  0x39, 0xfe, 0xf5, 0xab, 0x33, 0x7a, 0xda, 0x98, 0xe5, 0xa7, 0xdf, 0xff,

  0xc5, 0x95, 0x79, 0x5e, 0x1f, 0x68, 0x36, 0xa3, 0x54, 0xb2, 0xa2, 0x11,
  0x5f, 0x11, 0x06, 0xbd, 0x9d, 0x32, 0x6b, 0x0d, 0x42, 0x15, 0x32, 0x58,
  0x21, 0x65, 0xa0, 0x9a, 0xad, 0xe3, 0x1e, 0x59, 0x72, 0x68, 0x55, 0x2d,
  0x57, 0x3c, 0x56, 0xd7, 0x6f, 0x58, 0x39, 0x4d, 0xe3, 0x36, 0xe7, 0xbe,
  0x0f, 0x79, 0x31, 0xe3, 0xc6, 0xb4, 0x2d, 0xc7, 0x6c, 0x53, 0xad, 0xb3,
  0x98, 0xd7, 0x74, 0x23, 0xc6, 0x0e, 0x29, 0xb5, 0x55, 0xbe, 0x4c, 0xab,
  0x9c, 0xdb, 0xcf, 0x13, 0x81, 0xdf, 0x70, 0xaf, 0x4c, 0x4e, 0x95, 0x42,
  0xec, 0xcb, 0x81, 0xc9, 0x96, 0x41, 0xda, 0xa9, 0xed, 0xe5, 0x40, 0x44,
  0xcc, 0xb0, 0x46, 0x12, 0xa3, 0xe4, 0xcd, 0xda, 0x08, 0x43, 0xd7, 0xb6,
  0xff, 0xad, 0x42, 0xd1, 0x07, 0x3a, 0x97, 0xbc, 0x3d, 0x3e, 0x39, 0xda,
  0x4d, 0xde, 0x66, 0x8d, 0x94, 0x38, 0x69, 0x86, 0x31, 0x89, 0xfc, 0x7f,
  0x83, 0x82, 0x65, 0x41, 0x09, 0xa5, 0x46, 0x38, 0x9a, 0x0b, 0x26, 0x3e,

  0x38, 0x28, 0x1b, 0x5a, 0x2f, 0xc5, 0x87, 0x83, 0x25, 0x52, 0x3c, 0x4e,
  0x73, 0xcb, 0x34, 0xbe, 0x29, 0x27, 0x1f, 0xc9, 0xbb, 0x55, 0x9c, 0x87,
  0x91, 0x87, 0x78, 0x56, 0xfa, 0x29, 0x04, 0x34, 0x69, 0xc9, 0x79, 0xd6,
  0x78, 0x71, 0x5e, 0xaf, 0x16, 0xc4, 0x0d, 0xa2, 0x28, 0x2f, 0x8b, 0xcc,
  0x55, 0xf6, 0x81, 0xf2, 0xb9, 0x53, 0xbc, 0x18, 0x3d, 0x60, 0xa8, 0xb4,
  0x5e, 0x6f, 0xe3, 0xbe, 0xd6, 0x8d, 0xa3, 0xb4, 0x13, 0xfe, 0x73, 0xef,
  0xcb, 0x28, 0xf8, 0x98, 0x36, 0xb2, 0x40, 0xcf, 0x5c, 0x79, 0x03, 0x14,
  0xc5, 0x3d, 0xd4, 0x45, 0xc8, 0xab, 0xda, 0xd9, 0xa2, 0x84, 0x88, 0xfa,
  0x0a, 0xdf, 0x9d, 0x9a, 0xbb, 0x7f, 0x91, 0x3e, 0x4d, 0xaa, 0x3f, 0x50,
  0x09, 0xb8, 0x93, 0x2e, 0xdc, 0xa5, 0xd7, 0x66, 0x19, 0x27, 0xb1, 0x96,
  0x68, 0xcc, 0x95, 0xa5, 0x25, 0x2f, 0x6b, 0x53, 0x94, 0xad, 0x9f, 0x6a,
  0xba, 0xbe, 0xce, 0x97, 0x1e, 0xbb, 0x12, 0xf0, 0x6a, 0xf8, 0x52, 0xb8,
  0x8a, 0xac, 0x8e, 0xba, 0xfc, 0xa5, 0xbc, 0x4d, 0x42, 0x7b, 0x68, 0xa9,
  0xca, 0x4e, 0x19, 0xd6, 0xa1, 0xd7, 0xa4, 0xd0, 0x71, 0x65, 0x17, 0xfa,
  0x10, 0x54, 0x8c, 0x97, 0x19, 0xd1, 0x96, 0xe4, 0xeb, 0x3e, 0x0b, 0xea,

  0xea, 0xec, 0xfe, 0x67, 0xda, 0x96, 0x68, 0xa8, 0x2e, 0x9a, 0xbd, 0x83,
  0x4e, 0x49, 0x7d, 0x3f, 0xa8, 0xea, 0x7d, 0xfa, 0x29, 0x47, 0x21, 0xe2,
  0x1a, 0xea, 0x5c, 0x5a, 0x68, 0xbd, 0x15, 0x4f, 0xd3, 0xe2, 0xbc, 0x1b,

  0x72, 0x1b, 0xa1, 0x9c, 0x21, 0xae, 0x7d, 0x32, 0x64, 0x19, 0x39, 0x0d,
  0x08, 0x85, 0x55, 0xe7, 0xb3, 0x40, 0x45, 0x83, 0xbd, 0x2d, 0xaa, 0xa8,
  0x51, 0x3d, 0x24, 0x74, 0xc5, 0x08, 0x2e, 0x74, 0x86, 0x86, 0xcb, 0x70,
  0xf9, 0xdd, 0x08, 0xc4, 0xd8, 0x76, 0x95, 0x31, 0x34, 0xfd, 0xc8, 0x58,
  0xa2, 0x4b, 0x2a, 0x09, 0x50, 0xfc, 0x66, 0x5a, 0xb2, 0x6c, 0x8f, 0xe1,
  0x6d, 0x97, 0xf9, 0x75, 0x2c, 0xcb, 0x82, 0xf2, 0x23, 0x64, 0x62, 0xc8,
  0xd2, 0x70, 0xed, 0x62, 0x35, 0xed, 0xd8, 0x86, 0xb4, 0xd9, 0x2f, 0x4d,
  0x38, 0x80, 0xb2, 0xb3, 0xc1, 0x0d, 0x5e, 0x90, 0xc6, 0x4a, 0x80, 0x5e,
  0x05, 0x37, 0xe8, 0xfd, 0xda, 0x68, 0x3e, 0x2f, 0xb6, 0x2c, 0xa2, 0x3a,
  0xfc, 0xaa, 0xe0, 0x8e, 0x2d, 0xca, 0x91, 0x96, 0xd1, 0xc3, 0x68, 0xdf,
  0x31, 0xd1, 0xdc, 0x1b, 0x65, 0x5c, 0xb6, 0xe0, 0x26, 0x4c, 0x6b, 0xb6,
  0x05, 0x30, 0x5c, 0x31, 0x1a, 0x22, 0xc6, 0xd3, 0x94, 0xbe, 0x1f, 0xbe,
  0xc6, 0xc7, 0x87, 0x5f, 0x63, 0xb8, 0x3f, 0x6e, 0x59, 0x87, 0x6f, 0xf7,
  0x57, 0x2f, 0xc2, 0x46, 0xc1, 0xce, 0x6f, 0xc8, 0x86, 0xc7, 0x5a, 0xab,
  0x32, 0x90, 0x48, 0x22, 0x13, 0xe4, 0x1e, 0x5c, 0xe6, 0x8a, 0xec, 0xe9,
  0x81, 0x23, 0x9a, 0x52, 0x87, 0x5d, 0x36, 0x6d, 0xca, 0x81, 0x91, 0x22,

  0x2b, 0x80, 0xe9, 0xcc, 0x86, 0xe5, 0x7c, 0x88, 0x0c, 0x69, 0xc3, 0xfc,
  0x3f, 0x51, 0x32, 0x92, 0x77, 0xeb, 0x00, 0x10, 0x02, 0xec, 0xed, 0xd9,
  0x2c, 0xa6, 0x9a, 0x73, 0x21, 0x23, 0x69, 0x1d, 0x42, 0xf8, 0x5a, 0x68,
  0xc1, 0x07, 0xf9, 0x42, 0xbc, 0xf2, 0x78, 0xdd, 0x76, 0xa1, 0x22, 0x64,
  0x2e, 0x29, 0x88, 0x08, 0xfc, 0x69, 0x28, 0x8f, 0x18, 0xb0, 0xf6, 0x8e,
  0x55, 0xc3, 0x86, 0x5b, 0xb2, 0x2b, 0x17, 0xfe, 0xe7, 0xf5, 0x0a, 0x2a,
  0x2b, 0x21, 0x76, 0x06, 0xde, 0x17, 0x2d, 0x12, 0x01, 0x16, 0xa7, 0x11,
  0xfe, 0x4f, 0x46, 0xfb, 0x83, 0x20, 0x50, 0xdf, 0xc0, 0xd8, 0x2f, 0x5c,
  0x96, 0x90, 0x79, 0x18, 0x3c, 0x72, 0x18, 0xab, 0xae, 0xad, 0x9b, 0x3b,
  0xe2, 0xd7, 0xb6, 0x98, 0x16, 0xa9, 0xc5, 0xae, 0xee, 0xc1, 0xe5, 0xf4,
  0x60, 0x0b, 0x85, 0x6d, 0x72, 0x15, 0x6d, 0x0c, 0xe2, 0x54, 0x32, 0xb6,
  0xbe, 0x1c, 0x76, 0xdb, 0x64, 0xda, 0x6e, 0x67, 0x7e, 0xf5, 0x86, 0xd7,
  0xb7, 0xac, 0xd7, 0xd3, 0x04, 0x34, 0xd1, 0x57, 0xda, 0xfa, 0x66, 0x68,
  0x36, 0x55, 0x3a, 0xba, 0x0e, 0x33, 0xfa, 0x21, 0x03, 0x76, 0x28, 0x70,
  0x68, 0xdd, 0xbf, 0x67, 0x0c, 0xb2, 0xfb, 0x8c, 0x76, 0xcc, 0xb6, 0x16,
  0xd0, 0x1e, 0x3a, 0x4e, 0x3e, 0x80, 0x6c, 0xbd, 0xbb, 0xd4, 0xdd, 0x33,
  0xe2, 0x2a, 0xc4, 0x09, 0x0a, 0xcd, 0xf9, 0x46, 0x43, 0xf6, 0xdb, 0xbb,
  0xde, 0xd4, 0xe2, 0x9e, 0x9c, 0x5f, 0x5c, 0x9b, 0xb7, 0xa4, 0xd8, 0x0f,
  0xdf, 0x9b, 0x63, 0x78, 0x91, 0xfc, 0x67, 0x99, 0x71, 0xcd, 0xea, 0x3d,
  0x25, 0xab, 0xdf, 0xbd, 0x3a, 0x7f, 0x7f, 0xfc, 0xfe, 0xab, 0x17, 0x96,
  0xc7, 0x11, 0xbf, 0xeb, 0xf6, 0xb4, 0xb0, 0xbc, 0x1b, 0xbf, 0x65, 0xe4,
  0x56, 0xf2, 0xfe, 0xf4, 0x61, 0x6c, 0x53, 0x2c, 0x13, 0xec, 0x99, 0x9d,
  0x97, 0x55, 0xc6, 0x71, 0x11, 0xb6, 0x45, 0xb5, 0x72, 0x42, 0xca, 0x35,
  0x21, 0x2a, 0xd1, 0xb8, 0x2d, 0x02, 0xd8, 0x30, 0x3c, 0xa1, 0x33, 0x59,
  0x94, 0xad, 0x1e, 0x51, 0x44, 0x94, 0x0b, 0x1c, 0x7f, 0xe9, 0x53, 0x00,
  0x5b, 0xcc, 0xda, 0x51, 0x9d, 0x9d, 0x3e, 0x91, 0xe0, 0x2d, 0x63, 0x64,
  0xab, 0xe7, 0xd5, 0xf6, 0xc7, 0x91, 0x26, 0x17, 0x35, 0x8e, 0xac, 0xce,
  0xe1, 0x6c, 0xb0, 0x5b, 0xa2, 0x39, 0x5e, 0x11, 0x3f, 0x88, 0xc0, 0x4b,
  0xa7, 0x6b, 0xbe, 0x2f, 0x8c, 0x4e, 0x26, 0x3f, 0x75, 0x75, 0x19, 0x76,
  0x07, 0x1e, 0x9c, 0xe6, 0xec, 0xf2, 0x9c, 0x59, 0x9f, 0x67, 0x03, 0xd1,
  0x63, 0x59, 0xe6, 0x4f, 0x12, 0x25, 0x51, 0x1c, 0x92, 0x45, 0xe6, 0xaa,
  0x92, 0xac, 0xae, 0x73, 0xc5, 0xba, 0xce, 0x62, 0x15, 0x80, 0xed, 0x51,

  0x9a, 0x79, 0x42, 0xbf, 0x51, 0xa7, 0x0e, 0x05, 0xaf, 0x20, 0x81, 0xd5,
  0x2c, 0x69, 0x81, 0xdb, 0xd9, 0xd6, 0x90, 0xcc, 0xd4, 0x43, 0x79, 0x4a,
  0x78, 0x4f, 0x19, 0xe3, 0x8d, 0xf9, 0x15, 0x30, 0xe6, 0xeb, 0x66, 0x8f,
  0x57, 0xeb, 0xc9, 0x72, 0xf6, 0x24, 0x79, 0x69, 0xfe, 0x13, 0x28, 0x59,
  0xc8, 0x19, 0x1d, 0xbf, 0x36, 0x8a, 0x16, 0x25, 0xb8, 0x90, 0xbc, 0x60,
  0xc8, 0x1b, 0xaf, 0x8b, 0xc4, 0xa3, 0x43, 0x33, 0xd3, 0xdb, 0x54, 0xa1,
  0x2d, 0x8d, 0x46, 0x78, 0x99, 0x37, 0x9c, 0xa7, 0xd7, 0x83, 0x1b, 0xe4,

  0xa5, 0x36, 0xe0, 0xcc, 0x0f, 0x0e, 0x3f, 0x4f, 0xa8, 0xf8, 0xe0, 0xdd,
  0x9b, 0x27, 0xc9, 0xf4, 0x2a, 0x9b, 0x7e, 0xaa, 0xd7, 0x4b, 0x65, 0xc7,
  0xb4, 0xa7, 0xc6, 0x3c, 0xa0, 0x79, 0x06, 0x88, 0x0f, 0x66, 0xe2, 0x8b,

  0x7c, 0x4a, 0xa5, 0x7f, 0x83, 0x56, 0x74, 0x6a, 0xae, 0xd1, 0x29, 0xcf,
  0x0e, 0xb5, 0x62, 0x03, 0xe9, 0x02, 0x9c, 0x53, 0x13, 0x09, 0x5e, 0x98,
  0x3d, 0x30, 0x1f, 0xaf, 0xb9, 0x9b, 0xf5, 0x46, 0x97, 0xed, 0xb3, 0xb6,
  0xd7, 0x9b, 0x2e, 0xf6, 0xfe, 0xe8, 0x79, 0x4f, 0x7f, 0x8e, 0x56, 0x6b,
  0x0e, 0xaa, 0x55, 0xb2, 0xd5, 0x76, 0xb0, 0x07, 0x48, 0xcb, 0xa7, 0x49,
  0x12, 0x20, 0x94, 0x86, 0xf1, 0x82, 0x8f, 0xd3, 0x93, 0x7b, 0xf4, 0x84,
  0xf4, 0x96, 0x43, 0x16, 0x5b, 0x06, 0x4c, 0x0a, 0x26, 0x2d, 0xa4, 0x09,
  0xd9, 0x28, 0xa0, 0x45, 0x38, 0x43, 0x08, 0x36, 0x54, 0xda, 0x6c, 0xfd,
  0xb7, 0xba, 0x6c, 0x1c, 0x8b, 0x91, 0x12, 0x5a, 0x0f, 0xcd, 0x41, 0x6b,
  0x09, 0x81, 0xd7, 0x46, 0x36, 0x45, 0x40, 0x64, 0xf6, 0xbb, 0x1c, 0x97,
  0x76, 0xc7, 0x51, 0x33, 0x1a, 0x21, 0x9c, 0xe7, 0xd4, 0x25, 0x96, 0x2d,
  0xea, 0xf2, 0xa6, 0xb8, 0xac, 0xc8, 0x3f, 0x82, 0xa2, 0xb0, 0x34, 0x16,
  0xcb, 0x88, 0x99, 0xc5, 0xc9, 0x7c, 0x0d, 0x4b, 0x08, 0xc3, 0xeb, 0xae,
  0x09, 0x7a, 0xa6, 0xd1, 0xd1, 0xa5, 0xa2, 0x11, 0xc2, 0xa0, 0x03, 0x8f,

  0x8a, 0x84, 0xb0, 0xa0, 0x6b, 0x18, 0x71, 0x2d, 0x43, 0x0e, 0xd8, 0xda,
  0x83, 0xd1, 0xbe, 0xe6, 0x5a, 0x45, 0x6c, 0x79, 0xef, 0xac, 0xf7, 0x07,
  0x72, 0xde, 0xe6, 0x8d, 0x1e, 0xa3, 0xc4, 0x07, 0x5f, 0x93, 0x24, 0x99,


  0xd6, 0x41, 0xd3, 0xb7, 0x3c, 0x85, 0x9b, 0xb3, 0x25, 0xcc, 0xad, 0xe9,
  0x49, 0xe3, 0x33, 0x3b, 0x26, 0x8e, 0xb0, 0x6c, 0xd6, 0x1a, 0x68, 0x23,
  0xf3, 0xf2, 0xbb, 0xc0, 0xf1, 0x74, 0x0f, 0x24, 0x9e, 0x43, 0xff, 0x3a,
  0xec, 0x52, 0xaf, 0xf9, 0xf5, 0x43, 0xa8, 0x37, 0xb2, 0x96, 0x83, 0x8d,
  0xd3, 0x68, 0x95, 0x7c, 0xec, 0x0f, 0xdc, 0xe7, 0xf6, 0x6d, 0x6b, 0x05,
  0x9e, 0x8f, 0xde, 0xaf, 0x30, 0xbc, 0x1d, 0x62, 0xe7, 0xe3, 0x0d, 0xaa,

  0x9b, 0x29, 0xab, 0x21, 0xe9, 0xfe, 0x8b, 0x6c, 0x16, 0xe8, 0x62, 0xb1,
  0xc3, 0x00, 0xcf, 0xce, 0xeb, 0x9a, 0x94, 0x64, 0xd2, 0x8f, 0x41, 0xe8,
  0x14, 0x7f, 0xc2, 0x92, 0xac, 0x73, 0x20, 0x96, 0xff, 0x0f, 0x22, 0x39,
  0xb4, 0xaa, 0xbe, 0xd0, 0xcc, 0x41, 0xf2, 0x61, 0x05, 0x4a, 0xa6, 0x48,
  0x79, 0xe3, 0xf7, 0x7d, 0xc0, 0xe4, 0x18, 0xa9, 0x25, 0x36, 0x3b, 0xaf,
  0x2d, 0x84, 0x62, 0x35, 0x4a, 0xe1, 0x67, 0xad, 0x9f, 0xaa, 0xa9, 0xa2,
  0xd6, 0x75, 0x9b, 0x63, 0xd0, 0x7f, 0x9d, 0x63, 0x0c, 0x1f, 0x98, 0x2f,
  0xa8, 0xd1, 0x58, 0x65, 0x80, 0x56, 0x52, 0x3e, 0xa1, 0xac, 0x73, 0x2c,

  0xc8, 0xf6, 0xfe, 0xa3, 0x22, 0x96, 0xb8, 0x1b, 0x49, 0x0f, 0x57, 0xd4,


  0xc1, 0x0e, 0x42, 0x60, 0x10, 0x49, 0x8a, 0x1e, 0xc7, 0x83, 0x7b, 0x29,
  0x04, 0x40, 0x60, 0x9d, 0x6e, 0x18, 0xbc, 0x9a, 0xd1, 0xc3, 0x88, 0x7b,
  0x7f, 0x10, 0x9d, 0x1d, 0x91, 0x9b, 0x4f, 0xfc, 0x2d, 0x54, 0xbd, 0xe7,
  0x11, 0xe2, 0xfa, 0x59, 0x77, 0xe1, 0x70, 0x53, 0x3c, 0xd5, 0x58, 0x6b,
  0xe9, 0x62, 0x65, 0x74, 0x26, 0xf9, 0xc2, 0x83, 0xf6, 0xa7, 0x7b, 0xcc,
  0xb1, 0x6e, 0x21, 0x3f, 0x61, 0x7f, 0xba, 0x7b, 0xe3, 0xf3, 0x32, 0x7f,
  0x7f, 0xba, 0x67, 0xb9, 0xb1, 0x91, 0x05, 0xd7, 0xad, 0x6b, 0x8b, 0xf8,

  0x21, 0xd7, 0xe6, 0xc5, 0xca, 0x52, 0x12, 0xb9, 0x91, 0x8a, 0x3b, 0x37,
  0x48, 0x8e, 0x19, 0x53, 0x19, 0x89, 0x11, 0xf2, 0xfa, 0x09, 0x97, 0xf6,
  0x89, 0xcb, 0x4d, 0xdd, 0x8d, 0x91, 0xe2, 0xdf, 0x7c, 0x4a, 0xc8, 0x4e,
  0xce, 0xd9, 0x47, 0xca, 0xba, 0x8a, 0xab, 0x6a, 0x0d, 0x6f, 0x66, 0xf2,
  0x6a, 0x45, 0xd5, 0x79, 0x86, 0x47, 0xdd, 0xba, 0xd6, 0xac, 0x91, 0xa6,
  0xe9, 0x46, 0x83, 0xa3, 0x8d, 0x24, 0xe7, 0x91, 0x24, 0xfd, 0x76, 0xa7,
  0x83, 0xd1, 0x19, 0x79, 0x6d, 0x41, 0x69, 0xee, 0x15, 0xeb, 0xac, 0x87,
  0xc9, 0x65, 0x7e, 0x19, 0x20, 0xba, 0x4f, 0xee, 0x9a, 0x48, 0x05, 0x0a,
  0xad, 0x9a, 0x76, 0x61, 0xa7, 0x96, 0x04, 0xb7, 0xc7, 0x4f, 0x47, 0xfb,
  0xbb, 0x03, 0xea, 0x7d, 0xbd, 0xc2, 0x0e, 0x50, 0x89, 0x80, 0xd5, 0xeb,
  0xa8, 0x42, 0x26, 0xbf, 0x24, 0x61, 0x07, 0xc7, 0x42, 0x24, 0x13, 0x84,
  0x1c, 0x6b, 0x92, 0x61, 0xa5, 0xe9, 0x4b, 0x82, 0x74, 0xd9, 0xae, 0x8e,
  0xcb, 0x07, 0x68, 0x7a, 0x05, 0xb7, 0x58, 0xd7, 0x6f, 0x2d, 0xce, 0x32,
  0xd7, 0xeb, 0xde, 0x93, 0xe4, 0xaa, 0x6c, 0x0b, 0x0f, 0x90, 0xee, 0x00,
  0x88, 0x29, 0x08, 0xb7, 0x0c, 0xc2, 0xa2, 0xed, 0x17, 0xa7, 0x70, 0xaa,
  0xf0, 0x17, 0xc4, 0xf6, 0x65, 0x0b, 0xc3, 0x72, 0x3c, 0x32, 0x50, 0xc9,
  0x95, 0xc8, 0x4d, 0x1e, 0x06, 0x21, 0xa2, 0x97, 0x75, 0x7b, 0x39, 0x8c,
  0xda, 0xd6, 0x85, 0x53, 0x5c, 0xd9, 0xd1, 0x68, 0x14, 0xa9, 0xa4, 0xbf,
  0xce, 0xb3, 0x9b, 0x96, 0x17, 0x50, 0x66, 0x36, 0xb0, 0xbd, 0x19, 0xd8,
  0xf8, 0xbc, 0xa6, 0x1d, 0x32, 0x43, 0x4e, 0x4a, 0xdb, 0x66, 0x7d, 0xc3,
  0x45, 0xf6, 0x9f, 0xf6, 0xb6, 0xf9, 0x13, 0x6f, 0x73, 0x1d, 0x2b, 0x45,

  0x63, 0x4c, 0x56, 0x07, 0x25, 0x3f, 0x20, 0x63, 0xac, 0xba, 0x4b, 0xd0,
  0x33, 0xc0, 0x29, 0xa9, 0xe0, 0x2b, 0x9c, 0xfa, 0x9c, 0xd7, 0x0c, 0x89,
  0xca, 0x90, 0x26, 0x61, 0xa0, 0x8a, 0x3f, 0xd3, 0xbe, 0xf3, 0xe2, 0xa0,
  0x53, 0xee, 0x64, 0x58, 0xfb, 0x94, 0x6c, 0x60, 0x08, 0x59, 0xc5, 0x41,
  0x87, 0x15, 0x18, 0xc9, 0x7a, 0x90, 0x13, 0xf1, 0x9a, 0x26, 0x78, 0x41,
  0x7a, 0xd7, 0xc9, 0x22, 0xd1, 0x05, 0xc6, 0x43, 0x4d, 0x7a, 0xae, 0x7e,
  0x00, 0xc8, 0x5f, 0xc9, 0xe4, 0x4e, 0xbb, 0x42, 0x89, 0x1b, 0xc8, 0x41,
  0xbd, 0x76, 0xd5, 0x53, 0x57, 0x1a, 0xe7, 0xe0, 0x7c, 0x9c, 0x43, 0x8d,
  0x71, 0xc3, 0xb0, 0x32, 0x19, 0xbc, 0xf6, 0x31, 0x7a, 0x83, 0x2a, 0x67,
  0xd7, 0xb7, 0x84, 0x06, 0xe6, 0xde, 0x22, 0xd1, 0x23, 0x66, 0xd5, 0x8f,
  0x0b, 0xee, 0xa9, 0xfb, 0xcd, 0x9a, 0x62, 0xde, 0xb8, 0xfb, 0x52, 0x38,
  0x2b, 0xb5, 0xb2, 0x5d, 0x1c, 0x05, 0x8b, 0x46, 0x45, 0xbb, 0x3f, 0xba,
  0x4a, 0x6f, 0x6f, 0x47, 0x75, 0xb6, 0x67, 0xa8, 0xb6, 0xde, 0xab, 0xeb,
  0x05, 0x7d, 0xb4, 0x06, 0xf0, 0xd3, 0xc6, 0xc6, 0x7a, 0xb7, 0x77, 0x96,
  0x80, 0x84, 0x19, 0x4f, 0x53, 0x7a, 0xb5, 0xc5, 0x6c, 0x5d, 0x67, 0x3d,
  0xee, 0x4d, 0xd1, 0xcd, 0x56, 0x64, 0xcc, 0x5b, 0xa0, 0x37, 0xfb, 0x85,
  0x7e, 0xcc, 0x1a, 0x5c, 0x5e, 0x88, 0x1d, 0xc7, 0x41, 0x79, 0x13, 0xca,
  0x6d, 0xd5, 0x97, 0x55, 0x2e, 0x77, 0xd5, 0x8b, 0xca, 0x98, 0x4d, 0xb1,
  0xb9, 0xd7, 0x46, 0x3e, 0x38, 0x44, 0x0f, 0x6e, 0x36, 0x43, 0x4a, 0x7c,
  0xf9, 0x29, 0x82, 0x36, 0xd3, 0xe7, 0x31, 0xf1, 0x96, 0x46, 0x59, 0xea,
  0x2f, 0x1c, 0xb6, 0xd9, 0xcd, 0xcd, 0xcd, 0x68, 0x93, 0xcb, 0xe4, 0x5f,
  0x0e, 0xbf, 0xb5, 0x87, 0x3b, 0x35, 0x54, 0x7b, 0x62, 0xec, 0x88, 0xdb,
  0xc4, 0x83, 0x97, 0xb0, 0x7d, 0x48, 0x34, 0x26, 0x90, 0x7c, 0x7b, 0xfe,
  0xd6, 0xf6, 0xe0, 0xd5, 0xc2, 0x7e, 0x72, 0x3a, 0xd5, 0xa1, 0x7b, 0x3c,
  0xcb, 0x19, 0xf2, 0x83, 0xf0, 0x6a, 0x5f, 0xbf, 0x3a, 0xfb, 0xf8, 0xfe,

  0xe8, 0xe2, 0xe3, 0xf9, 0xab, 0xef, 0x68, 0x0b, 0xd9, 0x20, 0x34, 0xf2,
  0x8a, 0x5c, 0x91, 0x55, 0x59, 0x52, 0x3f, 0xad, 0x77, 0xa8, 0x58, 0xca,
  0x0b, 0x20, 0x3b, 0x44, 0x3b, 0x3c, 0x5b, 0xb8, 0x1a, 0x99, 0xa7, 0x99,
  0xcb, 0x8b, 0xa4, 0xb5, 0x5f, 0x9f, 0x8c, 0xe5, 0x90, 0x2d, 0x46, 0x65,
  0x75, 0x49, 0x54, 0xb8, 0xf7, 0x46, 0xf8, 0x67, 0x74, 0xb8, 0x3d, 0x09,
  0xa8, 0x12, 0xfa, 0xd1, 0x75, 0x35, 0x27, 0xb0, 0x84, 0x87, 0xb6, 0x47,
  0xf3, 0x48, 0xf3, 0x31, 0x18, 0xe0, 0xea, 0xfa, 0xf1, 0x06, 0x63, 0xa0,
  0xdd, 0xa4, 0x52, 0xda, 0x4b, 0x81, 0x82, 0x60, 0x76, 0xfa, 0x61, 0x72,
  0x2e, 0x0c, 0x5b, 0xdc, 0x0d, 0x22, 0xb5, 0xd7, 0x00, 0xf3, 0x2e, 0x6d,
  0x15, 0x3b, 0x6a, 0x6b, 0x28, 0xbe, 0xbf, 0xb1, 0xbb, 0xb6, 0xd5, 0x83,
  0xba, 0x66, 0x47, 0x5f, 0x85, 0xfa, 0xf0, 0x69, 0xa8, 0x4b, 0x52, 0xbf,

  0x37, 0x6f, 0xcd, 0x4f, 0x65, 0xcd, 0x4f, 0xff, 0xa5, 0x35, 0x3f, 0xfd,
  0x17, 0xd6, 0xfc, 0xf8, 0x17, 0x5e, 0xf3, 0xe3, 0xe8, 0x9a, 0xbd, 0xaf,
  0x0c, 0xff, 0x46, 0x6b, 0xfe, 0xdb, 0xba, 0xf8, 0x34, 0x34, 0xf3, 0x25,

  0x29, 0x2c, 0xed, 0x9d, 0xea, 0xb8, 0xca, 0xdc, 0xea, 0xf1, 0x01, 0xb7,
  0xa2, 0xc3, 0x36, 0xf5, 0xda, 0x55, 0xa5, 0x52, 0x2d, 0xca, 0xd1, 0xc5,

  0xde, 0xa6, 0xdc, 0x9e, 0xd7, 0x39, 0xa7, 0x52, 0xc3, 0x7a, 0x4a, 0xb6,
  0x0d, 0x39, 0xc6, 0xb6, 0x64, 0x36, 0x3a, 0xec, 0x96, 0xb6, 0x7c, 0xc0,
  0x4d, 0x4f, 0x43, 0x88, 0x95, 0x29, 0x0c, 0x6b, 0xdc, 0x49, 0x1b, 0x7e,
  0x73, 0x2d, 0xa1, 0xf3, 0xb9, 0x85, 0x9f, 0xd1, 0x81, 0x39, 0x24, 0x41,
  0xee, 0xe6, 0x90, 0x67, 0x5c, 0xdc, 0xad, 0x68, 0x40, 0x23, 0x9b, 0x2b,
  0x23, 0x83, 0x39, 0x06, 0xce, 0xfd, 0xca, 0xed, 0x24, 0x93, 0xce, 0x04,
  0xc5, 0xd1, 0x7a, 0x95, 0xdd, 0x6d, 0x07, 0x0a, 0xc3, 0x74, 0x51, 0x12,
  0xbf, 0x21, 0xbd, 0x6e, 0x83, 0x26, 0x32, 0x71, 0xbd, 0xb5, 0x58, 0x5e,
  0x74, 0x9a, 0x6d, 0xf9, 0x72, 0xe3, 0x53, 0x96, 0xad, 0xd2, 0x05, 0xaa,
  0xfa, 0x29, 0xec, 0xda, 0xd7, 0xa3, 0xa7, 0x95, 0x97, 0xa5, 0x39, 0xcb,
  0x78, 0xa3, 0x95, 0xf4, 0x02, 0x3e, 0xc7, 0x07, 0x49, 0x49, 0xfa, 0x49,
  0x3e, 0x43, 0x99, 0x5d, 0xbc, 0x65, 0x83, 0xc3, 0x83, 0xb7, 0x93, 0x80,
  0xe1, 0x39, 0x11, 0xf8, 0x09, 0xfb, 0x09, 0x85, 0xb0, 0xa2, 0xac, 0x80,
  0xeb, 0x9c, 0xb2, 0x81, 0xba, 0xb0, 0xa7, 0xf6, 0x7d, 0x7e, 0x1d, 0x80,
  0x36, 0x2d, 0xd0, 0x76, 0x3e, 0x40, 0x7a, 0xa2, 0xb4, 0xf2, 0x8f, 0xd4,
  0x0d, 0xb4, 0x30, 0x0c, 0x48, 0x4a, 0xb1, 0x5b, 0x59, 0xff, 0xbd, 0x78,
  0x7d, 0xf6, 0xf1, 0x9b, 0xa3, 0xa3, 0xb3, 0xe3, 0x37, 0x27, 0x47, 0x72,
  0x61, 0xec, 0x8f, 0xde, 0x5f, 0x7c, 0x7b, 0xa2, 0x2d, 0xaa, 0x94, 0x16,
  0x03, 0x82, 0x17, 0xc4, 0x71, 0x66, 0xca, 0x03, 0x74, 0xe2, 0x29, 0x9a,
  0xe4, 0xd5, 0xf1, 0xf7, 0x46, 0x6b, 0x3d, 0x1b, 0x7e, 0xf8, 0x3e, 0x68,
  0x83, 0xe0, 0xa5, 0xb7, 0xf7, 0xb6, 0x27, 0x37, 0x84, 0x08, 0xdb, 0xd1,
  0xad, 0xbd, 0x2f, 0xdb, 0xe7, 0x17, 0x16, 0x83, 0xd4, 0x5b, 0xb9, 0xb0,

  0x0a, 0x03, 0xbf, 0xa8, 0xad, 0x46, 0xbc, 0x8c, 0x9a, 0xa7, 0xfb, 0xda,
  0xc1, 0x69, 0xa3, 0xbf, 0xf4, 0xf3, 0xb6, 0xcd, 0xf8, 0x29, 0xbb, 0x03,
  0x7c, 0x5c, 0xf2, 0x92, 0xfe, 0x1b, 0xef, 0xb0, 0x75, 0x56, 0xe5, 0xd7,
  0xa4, 0xff, 0x99, 0x67, 0x39, 0x9a, 0x44, 0x8f, 0x8e, 0x6c, 0xbf, 0x31,
  0x89, 0x68, 0xd1, 0x20, 0x08, 0x7a, 0x63, 0x50, 0x10, 0x56, 0x10, 0x15,
  0xcd, 0x67, 0xec, 0xeb, 0xe0, 0xf1, 0x30, 0xa0, 0xd9, 0x9e, 0x51, 0xf2,
  0xe6, 0xe8, 0x7c, 0x90, 0x9c, 0x1d, 0xbd, 0xe3, 0x1c, 0xf9, 0xa3, 0xf7,
  0x5f, 0x71, 0x0b, 0x36, 0xed, 0xac, 0x85, 0x20, 0x6c, 0x98, 0x27, 0xe6,
  0xed, 0x89, 0x79, 0x17, 0x49, 0x71, 0x75, 0x6d, 0xa4, 0xeb, 0xaf, 0x88,
  0xdd, 0xc1, 0x6b, 0x7b, 0x69, 0xfe, 0x13, 0xdb, 0x2a, 0x63, 0x47, 0x7c,
  0x1d, 0xd9, 0x2e, 0x51, 0xcc, 0x6c, 0xd8, 0x5e, 0x8c, 0x02, 0xda, 0x0d,
  0xde, 0x31, 0xb3, 0x21, 0x61, 0x00, 0x59, 0x37, 0x08, 0x66, 0x1f, 0xd0,
  0x4b, 0xb8, 0x6f, 0xa7, 0x84, 0xff, 0xc8, 0x8a, 0x35, 0x9f, 0x1b, 0x10,
  0x5d, 0x02, 0x0b, 0xd9, 0x6d, 0x46, 0xac, 0x30, 0xb3, 0xca, 0xb9, 0x07,
  0x6a, 0x07, 0x14, 0xcb, 0x6c, 0x77, 0x3e, 0xe3, 0xe2, 0x6f, 0x8a, 0x5d,
  0x95, 0x15, 0xc5, 0x8e, 0xa9, 0xea, 0xfa, 0xff, 0xdd, 0x1b, 0xd5, 0xf5,
  0xd5, 0x5e, 0x3e, 0xfb, 0x58, 0xd5, 0xe9, 0x76, 0x57, 0x16, 0x79, 0xbf,
  0x9e, 0xd1, 0xaf, 0x93, 0xed, 0x91, 0x7d, 0x54, 0xfe, 0x4e, 0x3f, 0x8f,
  0x96, 0x21, 0xab, 0x08, 0x62, 0xf7, 0x89, 0xa6, 0x92, 0x69, 0xe7, 0xb6,

  0x45, 0x3e, 0xa9, 0x8c, 0x02, 0xe7, 0x1a, 0x0f, 0x48, 0x23, 0xb6, 0xd5,
  0xa7, 0x69, 0x7d, 0x70, 0x10, 0x69, 0xe3, 0xae, 0xd5, 0x55, 0x03, 0x4d,
  0x09, 0x3c, 0xfb, 0xe6, 0xf5, 0xf8, 0x77, 0x07, 0x07, 0xc8, 0xc0, 0xdc,
  0xa1, 0x4c, 0xb9, 0x67, 0x4f, 0x0e, 0x0e, 0x77, 0x63, 0xea, 0x63, 0x90,
  0x52, 0x40, 0xcd, 0xf3, 0x52, 0x47, 0x9f, 0xb4, 0xfb, 0x88, 0xb0, 0x49,
  0xbe, 0xb5, 0x1d, 0x7a, 0x96, 0x51, 0x7e, 0x12, 0x8a, 0xca, 0x38, 0x92,
  0x82, 0xb4, 0xad, 0x20, 0xea, 0x6b, 0x21, 0x58, 0xb6, 0x78, 0xf6, 0x2f,
  0xb6, 0x2c, 0x55, 0xf9, 0xe9, 0xab, 0x08, 0x7d, 0x7b, 0xb3, 0x1e, 0xf1,
  0x3e, 0x75, 0x3d, 0xfb, 0xfe, 0xba, 0x90, 0x63, 0xe5, 0x30, 0x6e, 0x58,
  0x7c, 0xb9, 0xae, 0x75, 0x9d, 0xd8, 0x24, 0x85, 0x26, 0x03, 0xef, 0x9e,
  0xcc, 0x69, 0x8b, 0xe9, 0x87, 0x08, 0x3e, 0x75, 0x83, 0xda, 0xdd, 0xf7,
  0x18, 0x84, 0x3f, 0x68, 0x18, 0xf1, 0xe3, 0x6f, 0x24, 0x5b, 0xe6, 0xee,
  0xc6, 0x87, 0xfc, 0x55, 0xef, 0x64, 0x35, 0x49, 0x5e, 0x2e, 0xcc, 0x8b,
  0x8b, 0x9e, 0xaa, 0x9f, 0x23, 0xee, 0xf4, 0xf3, 0x4d, 0x56, 0x4d, 0xb2,
  0xaa, 0xac, 0x3b, 0x05, 0x0a, 0xda, 0x50, 0x9e, 0x7d, 0x2a, 0x18, 0x47,
  0x33, 0x35, 0x82, 0x9e, 0x7e, 0x0d, 0xac, 0x6f, 0x81, 0x97, 0x6e, 0x43,

  0x82, 0x6c, 0xa3, 0x4c, 0x82, 0x2e, 0x00, 0xb5, 0xb6, 0xa1, 0x3f, 0xd1,
  0x60, 0x9e, 0xfa, 0x50, 0xe4, 0xe9, 0x62, 0x9b, 0x1a, 0x8e, 0x74, 0xaf,



  0x91, 0x50, 0xda, 0xf6, 0x88, 0x6a, 0x5f, 0xd8, 0x58, 0x43, 0x02, 0x06,

  0x2a, 0x3d, 0xd3, 0x44, 0xe6, 0xa2, 0xa9, 0xa5, 0x74, 0xcd, 0x5d, 0x06,

  0x52, 0x1d, 0x34, 0x61, 0xb1, 0xc3, 0xb5, 0x51, 0x5b, 0xfa, 0x92, 0x1b,
  0x7f, 0x61, 0x31, 0xc5, 0xc7, 0xf0, 0x93, 0xfb, 0xf6, 0x5a, 0x77, 0x7b,

  0x67, 0x38, 0x3d, 0x2b, 0xff, 0x9c, 0xf5, 0xfd, 0x68, 0x17, 0xcc, 0x57,
  0x5c, 0x98, 0xda, 0x81, 0x39, 0x00, 0x20, 0x3a, 0x55, 0x53, 0xcc, 0xd8,
  0x30, 0x94, 0xc2, 0x3b, 0x17, 0xb3, 0x65, 0x4e, 0x13, 0xc6, 0xe5, 0xb0,
  0x54, 0xb4, 0x2e, 0xd0, 0x69, 0x0f, 0xd9, 0x78, 0x7f, 0x9d, 0x88, 0x37,
  0x02, 0x25, 0x19, 0x37, 0x15, 0x01, 0x35, 0x16, 0x0e, 0xee, 0x75, 0x91,
  0xf5, 0xe2, 0xf7, 0x28, 0x98, 0xa3, 0x39, 0xa4, 0x85, 0xb4, 0x55, 0xd3,
  0x44, 0xa8, 0x4a, 0xe7, 0x34, 0x94, 0x38, 0xb2, 0x3a, 0x0c, 0xe8, 0xbd,
  0x7f, 0xbb, 0x17, 0xcd, 0xe1, 0xbe, 0xb3, 0x73, 0x2a, 0x7d, 0xac, 0x42,

  0xfb, 0xc1, 0x30, 0x55, 0x9d, 0x0a, 0x23, 0x24, 0x2b, 0x0f, 0x21, 0x93,
  0x5e, 0x1a, 0x7e, 0x9a, 0x05, 0x38, 0x3d, 0xe3, 0x56, 0x69, 0xb7, 0x74,
  0x9b, 0xd4, 0xea, 0x1d, 0xbc, 0x67, 0xbb, 0xee, 0xba, 0xa8, 0x10, 0x68,
  0x7f, 0x08, 0x95, 0xb5, 0xeb, 0x6e, 0xa3, 0x4e, 0x09, 0xae, 0x42, 0x14,
  0xb7, 0x16, 0x38, 0xd8, 0x8a, 0xaf, 0xa2, 0x09, 0x9a, 0xbc, 0x1d, 0xe4,
  0x8b, 0x96, 0xd4, 0x3f, 0x18, 0x17, 0x69, 0xe0, 0x03, 0x41, 0xae, 0x35,
  0x37, 0x1f, 0x10, 0x22, 0xd8, 0x9e, 0xb1, 0x67, 0x14, 0x47, 0x62, 0xa7,
  0x4a, 0x17, 0x4f, 0xc2, 0x0c, 0x0c, 0xd8, 0x6e, 0x6e, 0x74, 0x60, 0x2a,
  0x4c, 0xcc, 0x10, 0x37, 0xf9, 0xac, 0xb9, 0x42, 0x3b, 0x10, 0xb5, 0x8c,
  0x6a, 0x29, 0x49, 0x26, 0x27, 0x75, 0x1e, 0x16, 0xdc, 0x4c, 0x7a, 0x1c,
  0x78, 0x7c, 0x60, 0xd8, 0xd4, 0x84, 0xb1, 0x79, 0xc8, 0x51, 0x87, 0x73,
  0x80, 0x53, 0x7b, 0x8f, 0x55, 0x3d, 0x8b, 0x4a, 0x91, 0x9a, 0x5b, 0x34,
  0xa7, 0x4e, 0x1f, 0x81, 0xb9, 0xa6, 0x95, 0x31, 0x23, 0xbd, 0x21, 0x44,
  0xc3, 0xdb, 0x9f, 0x18, 0x8f, 0xfb, 0x9b, 0x6d, 0x6d, 0x68, 0x49, 0x88,
  0x6b, 0x5e, 0xf2, 0x3e, 0xf1, 0xf2, 0xe4, 0x53, 0x1e, 0x82, 0xc4, 0xe3,
  0xeb, 0x03, 0xc3, 0x6b, 0x96, 0x3c, 0xc2, 0xbb, 0x6d, 0x75, 0x94, 0x52,

  0xad, 0xf6, 0x65, 0x2a, 0xbf, 0x67, 0x9c, 0x86, 0xed, 0x4b, 0x7e, 0xe8,
  0x2b, 0xf7, 0x50, 0x67, 0x38, 0xf2, 0xda, 0xb3, 0x97, 0x5e, 0xf3, 0x78,

  0xea, 0x17, 0x94, 0x1b, 0xfe, 0xcd, 0x20, 0x79, 0xb4, 0xc4, 0xa1, 0x1c,
  0x7c, 0x15, 0x63, 0x5c, 0xdc, 0x9e, 0xb4, 0x2e, 0x6d, 0xa5, 0xee, 0xf0,
  0x2f, 0x64, 0x72, 0x61, 0xc3, 0x98, 0x2e, 0x6d, 0x11, 0x0a, 0x07, 0xf8,
  0x94, 0x1f, 0x44, 0x82, 0x0e, 0x48, 0xe3, 0x5a, 0x91, 0x91, 0x30, 0xcb,
  0x14, 0xa0, 0x78, 0x09, 0xef, 0x26, 0x25, 0x6a, 0xac, 0xa4, 0x12, 0x9f,
  0xc8, 0x75, 0x68, 0xd1, 0x0f, 0xeb, 0x05, 0x3d, 0x80, 0x0e, 0x3d, 0x65,

  0x90, 0xd4, 0xb9, 0x58, 0xc1, 0x40, 0xb2, 0x4d, 0xb4, 0xbc, 0x49, 0x51,
  0x41, 0xdd, 0x34, 0x11, 0x1f, 0xcf, 0xaf, 0x28, 0x12, 0x17, 0xc8, 0x0e,
  0xca, 0xeb, 0x66, 0x18, 0x81, 0x9a, 0x44, 0x0c, 0xe8, 0xec, 0xf4, 0xec,
  0xd1, 0xae, 0x8f, 0xc7, 0x27, 0x75, 0xd9, 0xdc, 0x6e, 0x0e, 0x51, 0x22,
  0x5b, 0xb3, 0x3d, 0x50, 0x76, 0xc3, 0x15, 0x42, 0xa1, 0x6d, 0x39, 0x15,

  0xb0, 0x2a, 0x62, 0x2e, 0xf8, 0x22, 0x5c, 0xfe, 0x2e, 0x47, 0xdd, 0x6b,
  0xc4, 0xe6, 0x2e, 0xa6, 0x22, 0xb3, 0x7d, 0x16, 0x22, 0x5a, 0xd4, 0x9c,
  0xcb, 0x0a, 0x30, 0x88, 0x21, 0xea, 0x8e, 0xda, 0xad, 0x0c, 0x28, 0x67,
  0x3a, 0x98, 0x65, 0xc2, 0x39, 0x0f, 0x91, 0x6c, 0x12, 0x29, 0xf0, 0x71,
  0x4f, 0x22, 0x20, 0xa1, 0x75, 0x58, 0x00, 0x36, 0x71, 0xf1, 0x59, 0xf2,
  0x96, 0x12, 0xd5, 0x32, 0x9c, 0xeb, 0xa8, 0xb7, 0x05, 0xb5, 0x85, 0xd4,
  0x6f, 0x59, 0x64, 0xd2, 0x30, 0x29, 0x4d, 0xde, 0x9f, 0x8c, 0x2f, 0xfc,
  0x20, 0x12, 0xf4, 0xb0, 0x20, 0x8b, 0xb2, 0x8d, 0x29, 0xe5, 0xa5, 0x22,
  0x9c, 0x1c, 0x8f, 0x2f, 0x46, 0x31, 0xb0, 0x78, 0xa3, 0x9d, 0x8f, 0x29,
  0xd3, 0xbf, 0x55, 0xa3, 0x9f, 0x70, 0x63, 0x62, 0xce, 0x71, 0xe4, 0xe8,
  0x18, 0x47, 0x8b, 0xf2, 0xca, 0xaf, 0x47, 0xef, 0x0e, 0x67, 0xa6, 0xf8,
  0x47, 0xce, 0x90, 0x94, 0xec, 0x4a, 0x8d, 0x12, 0xd5, 0xeb, 0xc9, 0xd0,
  0x03, 0x71, 0x63, 0x7d, 0x07, 0xdd, 0x81, 0x0c, 0xf5, 0x1a, 0x09, 0xf5,
  0x29, 0xb4, 0x31, 0x77, 0x98, 0xa0, 0xb0, 0x3f, 0x02, 0xbe, 0xd7, 0x72,
  0x75, 0x4f, 0x93, 0x0c, 0x60, 0x9f, 0x70, 0x32, 0xd1, 0xb3, 0x0f, 0x26,
  0x2a, 0xda, 0x8a, 0xce, 0x4e, 0x4a, 0x43, 0xb9, 0x76, 0xba, 0x34, 0x85,
  0xed, 0x7e, 0x4a, 0x9c, 0xd2, 0x23, 0x41, 0x47, 0x74, 0x75, 0x96, 0xb1,
  0xcb, 0xc9, 0x4e, 0xbb, 0x17, 0x7f, 0x34, 0x9f, 0x31, 0x04, 0x5f, 0xdd,
  0xc6, 0xe0, 0xe3, 0x7a, 0x6b, 0x62, 0x3a, 0xdc, 0x7b, 0x84, 0x54, 0xb7,
  0xbe, 0x93, 0x64, 0x9f, 0x5c, 0x2b, 0x35, 0x6e, 0xf8, 0x3d, 0x27, 0x5b,
  0x22, 0x50, 0x36, 0xe8, 0x03, 0x87, 0x0a, 0xc9, 0x48, 0xfb, 0xc0, 0x7c,
  0x38, 0x7e, 0x73, 0x62, 0x77, 0x4b, 0x76, 0x07, 0xd9, 0x7b, 0x76, 0xad,
  0x94, 0x51, 0xaf, 0x6c, 0x13, 0x67, 0x12, 0x04, 0x7d, 0xd6, 0x45, 0xfe,
  0x77, 0x64, 0x66, 0x40, 0x77, 0x9d, 0xe7, 0x40, 0x12, 0x42, 0xd3, 0xf0,
  0x44, 0x25, 0xd9, 0x76, 0x6d, 0x9b, 0x68, 0xe5, 0x33, 0x9b, 0x79, 0xce,
  0x31, 0xbe, 0x68, 0xea, 0xe3, 0x46, 0xd0, 0x86, 0x83, 0x36, 0xb2, 0x22,
  0x00, 0x56, 0x05, 0x07, 0xc9, 0x08, 0xa4, 0x3d, 0x54, 0x4e, 0x05, 0xca,

  0x05, 0x74, 0x33, 0x97, 0x8f, 0xd3, 0xc6, 0xf7, 0x28, 0x2b, 0xa9, 0xb7,
  0xda, 0x79, 0x7b, 0x7e, 0xfa, 0x6e, 0x78, 0x71, 0x8a, 0x2e, 0xdb, 0x30,
  0xe7, 0x16, 0x49, 0x12, 0xd1, 0x37, 0xf9, 0xbd, 0xda, 0x6f, 0x16, 0xde,
  0x4e, 0x5d, 0xdb, 0xa9, 0x77, 0xb5, 0x97, 0x37, 0x44, 0x0a, 0xa6, 0xa7,
  0x6f, 0x05, 0x9d, 0x13, 0x0a, 0xd6, 0x44, 0x52, 0x74, 0x67, 0x24, 0xbf,
  0xe3, 0xd4, 0x8b, 0x63, 0xe1, 0x7d, 0xe5, 0xdc, 0x93, 0x75, 0x7d, 0x97,
  0x48, 0x59, 0x1b, 0xc1, 0xa5, 0xc1, 0x96, 0x0a, 0xa3, 0x03, 0xb6, 0xed,
  0xaf, 0x05, 0x49, 0xa1, 0x82, 0x1f, 0xae, 0x28, 0x69, 0x4a, 0x73, 0x7d,

  0xd3, 0xaa, 0x2a, 0x6f, 0x54, 0x70, 0x49, 0xd9, 0xa9, 0x99, 0x3a, 0x1d,
  0x52, 0x75, 0xd7, 0x0b, 0x2c, 0x21, 0x58, 0x49, 0xda, 0xb4, 0x78, 0xa3,
  0xfa, 0xf7, 0xa4, 0x5d, 0xee, 0xaf, 0xc9, 0xa7, 0xc3, 0xa6, 0x5a, 0xd7,
  0x61, 0xff, 0x73, 0x71, 0x3b, 0x9f, 0x10, 0x9b, 0x6c, 0x67, 0xab, 0x0e,
  0x04, 0xcc, 0x8d, 0xb0, 0x3f, 0xd0, 0x66, 0xca, 0xfa, 0x25, 0xe1, 0x9f,
  0xe0, 0x98, 0xe2, 0x1f, 0x82, 0x1b, 0x2c, 0x28, 0xaf, 0xa4, 0xd1, 0x53,
  0x07, 0x49, 0x64, 0xac, 0xba, 0x16, 0x80, 0x79, 0xc3, 0xad, 0xff, 0x34,
  0xa1, 0x14, 0x38, 0x4e, 0x60, 0x06, 0xf4, 0xd3, 0x40, 0x97, 0x54, 0x80,
  0x96, 0x9c, 0x8a, 0xe3, 0x67, 0xeb, 0x29, 0x8e, 0x89, 0x22, 0x7e, 0xd4,

  0x59, 0x70, 0xc2, 0x90, 0x91, 0x5a, 0x5f, 0x4e, 0x43, 0xbb, 0x4c, 0x5d,

  0x76, 0xe0, 0x74, 0xb5, 0xac, 0x84, 0x1f, 0x73, 0xed, 0x92, 0x48, 0x99,
  0xa4, 0x54, 0xa0, 0x8c, 0x15, 0xcb, 0xaa, 0x6b, 0x73, 0x52, 0x54, 0x49,



  0xdb, 0xb5, 0x86, 0xec, 0x8a, 0xf0, 0xba, 0x81, 0x54, 0x2c, 0x41, 0x7f,
  0x02, 0xd5, 0x23, 0x02, 0x46, 0xd0, 0xfd, 0xcf, 0x69, 0x6d, 0xf8, 0x52,
  0x7b, 0xbc, 0xdd, 0x0d, 0xee, 0xe9, 0xb5, 0xe6, 0x74, 0x7b, 0xa7, 0xd7,
  0x3a, 0x90, 0xf8, 0xc9, 0x1d, 0xb7, 0xca, 0xeb, 0x39, 0x35, 0xc3, 0xdb,
  0x71, 0x61, 0x51, 0xc0, 0x7c, 0x43, 0x9a, 0x6c, 0x8a, 0x46, 0xbb, 0xd7,
  0x31, 0xe6, 0x94, 0xda, 0x56, 0x72, 0x4d, 0xa2, 0x1f, 0x4d, 0x76, 0xb4,
  0xe8, 0xcc, 0x16, 0x41, 0x9c, 0xc8, 0xaf, 0x5e, 0xd8, 0xaa, 0x38, 0xe2,
  0x69, 0x9d, 0xe1, 0x1e, 0x7d, 0xff, 0x7d, 0xbb, 0xf5, 0xeb, 0x6e, 0x5f,
  0x1d, 0xbe, 0xa4, 0xc3, 0xcf, 0x98, 0xf7, 0xe9, 0x84, 0x83, 0x92, 0x1e,
  0x25, 0x3b, 0x0a, 0x31, 0x20, 0x81, 0x98, 0x1d, 0x30, 0xe2, 0x29, 0x32,
  0x26, 0xe0, 0x95, 0xd6, 0x79, 0xb4, 0x52, 0x38, 0x50, 0xa1, 0x7f, 0x1c,

  0xc9, 0x72, 0x02, 0xc3, 0xd5, 0xdc, 0x0b, 0x8e, 0xa9, 0x20, 0x1d, 0xd6,
  0xdf, 0x2e, 0xd7, 0x1d, 0xbc, 0xbe, 0xa2, 0xd8, 0x82, 0x60, 0xc4, 0x6e,
  0xee, 0x4f, 0x6b, 0x31, 0xfb, 0x6c, 0xd5, 0x17, 0xe4, 0x3d, 0x23, 0xda,
  0x53, 0x16, 0xdd, 0xb4, 0xca, 0xc4, 0xdb, 0xa0, 0xfd, 0x47, 0x82, 0x28,
  0x32, 0xe1, 0x85, 0xf0, 0xe5, 0x81, 0x53, 0x35, 0xf5, 0xee, 0x8b, 0x83,

  0x7a, 0xeb, 0x9c, 0x98, 0x64, 0x80, 0x87, 0xda, 0xfb, 0x4d, 0x09, 0x74,
  0x3f, 0xb4, 0x7d, 0x01, 0x62, 0x55, 0xc9, 0x8e, 0x2d, 0xe9, 0x5c, 0xca,
  0xf2, 0xe6, 0x0f, 0x7a, 0x73, 0x47, 0x7e, 0xf0, 0x92, 0xa8, 0x20, 0x16,
  0x02, 0x55, 0x66, 0x42, 0xe7, 0x42, 0xb0, 0xa2, 0x54, 0xcb, 0xac, 0xdd,
  0x90, 0xc8, 0x53, 0xac, 0x31, 0x72, 0x56, 0xa7, 0x51, 0x04, 0x6f, 0x7b,
  0x92, 0x07, 0xc9, 0x44, 0x7a, 0x65, 0x29, 0x87, 0x07, 0x4e, 0x4f, 0x07,
  0x89, 0xc5, 0xce, 0x2d, 0x63, 0x94, 0x0e, 0xf1, 0x58, 0xdd, 0x97, 0x6e,
  0x22, 0xa0, 0xc7, 0x68, 0x81, 0xcc, 0x9d, 0x1b, 0xfc, 0x3d, 0x53, 0x37,
  0x99, 0x05, 0x5c, 0x90, 0x1a, 0x17, 0x69, 0x01, 0xf0, 0xd5, 0xd1, 0x45,
  0xf7, 0x6a, 0xf9, 0x91, 0x43, 0xc0, 0x1b, 0x98, 0x7f, 0x9f, 0x7d, 0xb8,
  0xd8, 0x75, 0xed, 0xed, 0x85, 0x5c, 0xfd, 0x14, 0x79, 0x29, 0x9d, 0x0b,

  0xab, 0x00, 0x18, 0x50, 0x40, 0xf8, 0x94, 0x24, 0x03, 0xc9, 0xcd, 0x20,
  0x1f, 0xcb, 0xa3, 0xfd, 0x03, 0x63, 0x47, 0xed, 0x1f, 0xa2, 0xd7, 0xed,
  0xa3, 0xfd, 0x47, 0xb6, 0x06, 0x5b, 0x9f, 0x0a, 0x11, 0xf2, 0xf9, 0x45,

  0xb8, 0x4c, 0x40, 0xf7, 0x8f, 0x6e, 0x6f, 0xf1, 0xe3, 0x76, 0x66, 0xf7,
  0xd0, 0x56, 0x43, 0xf9, 0xd3, 0x8c, 0xca, 0x7d, 0x6f, 0xbf, 0x11, 0xd9,
  0x5b, 0x17, 0x5c, 0x7b, 0x88, 0x5e, 0xc2, 0x04, 0x59, 0x30, 0xea, 0x6f,

  0xac, 0xe3, 0x75, 0x09, 0x13, 0x60, 0x26, 0xbf, 0x33, 0x96, 0x21, 0x16,
  0x1f, 0xec, 0x42, 0x00, 0x10, 0x02, 0xd6, 0x4c, 0xcf, 0x08, 0x54, 0x8c,
  0xd9, 0x83, 0x5b, 0xb7, 0x43, 0xb6, 0x5b, 0xa3, 0x30, 0x00, 0x23, 0xe8,
  0x84, 0x1d, 0xd9, 0x3c, 0xfe, 0x88, 0x13, 0x82, 0xf8, 0xdf, 0x0b, 0x4a,
  0x13, 0x31, 0x77, 0x02, 0xfb, 0xab, 0x7f, 0x3d, 0x94, 0x54, 0x11, 0xfe,
  0xd7, 0xa3, 0xb6, 0xa4, 0x24, 0xf7, 0xb0, 0x0e, 0xfa, 0x52, 0xfe, 0x12,
  0xf8, 0x2a, 0xd1, 0xe2, 0x14, 0xba, 0x31, 0x9a, 0x53, 0xec, 0xb6, 0xfc,
  0x27, 0x18, 0xc3, 0x4e, 0x4c, 0xb4, 0x14, 0x69, 0x1e, 0xcd, 0x2c, 0xba,
  0x4b, 0x1b, 0x2d, 0xf9, 0x30, 0xea, 0xeb, 0x3d, 0xa6, 0x9a, 0x60, 0x30,
  0xbe, 0x26, 0x58, 0xd8, 0x62, 0x65, 0x4f, 0x25, 0x2e, 0x57, 0xb1, 0xbb,
  0x5b, 0x6b, 0x36, 0x2d, 0x09, 0x57, 0xeb, 0x6c, 0x97, 0x39, 0x76, 0xa6,
  0x93, 0xbc, 0x6a, 0xd0, 0x8a, 0x16, 0x7e, 0xb0, 0xd0, 0x44, 0xa5, 0xad,
  0x18, 0xf0, 0x56, 0xa0, 0xc5, 0x33, 0xf5, 0xea, 0xd0, 0x34, 0xcb, 0xd6,
  0x4c, 0x39, 0x10, 0xb2, 0xf4, 0x13, 0x35, 0x22, 0x12, 0x4d, 0x92, 0x34,
  0x70, 0xcc, 0xed, 0x85, 0xae, 0x28, 0xf3, 0x3c, 0x83, 0xda, 0x2f, 0x8d,
  0x68, 0x1f, 0x0f, 0xf0, 0xb7, 0x27, 0xfb, 0xcf, 0xf9, 0x44, 0x8f, 0x8f,
  0x2e, 0xde, 0x76, 0x9d, 0x79, 0x95, 0x21, 0x28, 0xfe, 0xef, 0x30, 0x4b,
  0xab, 0x2b, 0x63, 0x5c, 0x10, 0x4a, 0xcb, 0x90, 0xa0, 0xff, 0x87, 0xfb,
  0xfb, 0xb1, 0xbc, 0x8d, 0x5f, 0xb1, 0x32, 0xfd, 0xd1, 0xe3, 0x76, 0x48,
  0x8f, 0x54, 0xfa, 0x21, 0x6d, 0x77, 0x3f, 0x88, 0x68, 0x9b, 0xbc, 0x52,
  0xd5, 0x9d, 0xe5, 0xf1, 0x56, 0xc0, 0x3e, 0x4b, 0x2c, 0x1a, 0x6d, 0xd2,
  0xc5, 0xe0, 0xf3, 0x4c, 0xec, 0xae, 0x7a, 0x63, 0xb3, 0x93, 0x8c, 0x98,
  0x87, 0x4c, 0x6a, 0xee, 0x76, 0x13, 0x6e, 0x61, 0xc7, 0x9d, 0xa6, 0x1a,
  0xd7, 0x4c, 0x3c, 0x5a, 0xb3, 0x5b, 0x4b, 0xd9, 0x52, 0x95, 0x11, 0xda,
  0x13, 0xab, 0x7d, 0xd2, 0xb1, 0xe7, 0x7e, 0xc4, 0x2a, 0x6c, 0x41, 0x35,
  0x5d, 0x49, 0xfd, 0x1a, 0xff, 0x9b, 0x44, 0x71, 0x2b, 0x7f, 0xf6, 0xf0,
  0x49, 0x64, 0xe3, 0x20, 0xb0, 0x7f, 0xe6, 0xc6, 0x39, 0xe5, 0x88, 0xfd,
  0x77, 0x30, 0x78, 0x6d, 0x95, 0x4d, 0x88, 0x24, 0x54, 0x6b, 0x47, 0xd9,

  0x9f, 0xbc, 0x16, 0xda, 0xed, 0xd1, 0x26, 0xdc, 0x3b, 0xf7, 0xd6, 0xcf,
  0x5c, 0xcb, 0xc0, 0x35, 0x5d, 0x20, 0xe9, 0xb1, 0x94, 0x9e, 0x52, 0xf0,
  0x33, 0x20, 0xa0, 0xd9, 0xc5, 0xa4, 0xc8, 0x56, 0x19, 0x16, 0xef, 0xe7,

  0x2d, 0x78, 0xc4, 0x6d, 0x6d, 0x54, 0xb2, 0x15, 0xb5, 0x16, 0xcb, 0x08,
  0xd1, 0x7c, 0x45, 0x60, 0x03, 0x75, 0xd4, 0xcf, 0xd2, 0xea, 0x1b, 0x8f,


  0xcd, 0x54, 0x97, 0xec, 0x40, 0xc4, 0x98, 0xbc, 0xae, 0x7b, 0xac, 0x3c,
  0x2b, 0x50, 0x1a, 0xaf, 0xd3, 0x05, 0x99, 0xeb, 0x18, 0xc3, 0x1e, 0x56,
  0xe9, 0x8a, 0x7a, 0x79, 0xf0, 0xb2, 0x47, 0xfc, 0xfb, 0xf3, 0x28, 0xec,
  0xfb, 0x9c, 0xf0, 0xa8, 0xca, 0xec, 0xb7, 0xe7, 0x6f, 0xff, 0xa2, 0x76,
  0xf7, 0xee, 0xa0, 0xc7, 0x12, 0xee, 0x4c, 0x77, 0x92, 0x79, 0x89, 0x80,
  0x52, 0x7d, 0xde, 0xda, 0x75, 0xfe, 0x97, 0xcb, 0xb2, 0x0c, 0x82, 0x0a,
  0x48, 0xfa, 0xd8, 0xa1, 0x30, 0x9b, 0x79, 0x6e, 0x2c, 0x26, 0xdd, 0xa3,
  0xd1, 0x13, 0xf8, 0x43, 0xde, 0xbe, 0x7e, 0xf2, 0xe8, 0xf0, 0xc0, 0x58,
  0xad, 0x3b, 0x1d, 0x6e, 0xb1, 0xfb, 0xd9, 0x83, 0x76, 0xdb, 0x9e, 0x77,
  0x76, 0xbb, 0x22, 0xda, 0xdb, 0x39, 0xfa, 0xfe, 0xec, 0x7d, 0xb0, 0x46,
  0xb3, 0xa6, 0x20, 0x90, 0xda, 0xb7, 0x46, 0xa7, 0x0b, 0xb4, 0xc6, 0xd7,
  0xfc, 0x63, 0xf4, 0xca, 0x8d, 0x84, 0x2a, 0xdf, 0x56, 0x39, 0xe9, 0xb8,

  0x5b, 0xb4, 0x25, 0x5b, 0x27, 0x65, 0x31, 0x33, 0xa2, 0xff, 0x94, 0xd0,
  0xc1, 0xb2, 0x2d, 0xa3, 0xab, 0xdf, 0xbb, 0xba, 0xfe, 0x6b, 0xf2, 0x6e,

  0x80, 0xab, 0x52, 0x84, 0x19, 0x2e, 0xef, 0xf0, 0x43, 0x80, 0xb1, 0x12,
  0xae, 0x02, 0x97, 0xac, 0xad, 0x2f, 0x33, 0x76, 0xef, 0x92, 0x69, 0xd6,
  0xbe, 0x6d, 0xb7, 0xe8, 0x85, 0x02, 0x8f, 0xcf, 0x4b, 0x38, 0xb4, 0xfb,
  0x62, 0x21, 0xcc, 0x2d, 0x35, 0x1a, 0xc2, 0x3e, 0xa2, 0x1d, 0x75, 0xeb,

  0xef, 0x7a, 0xcd, 0xa4, 0x81, 0x1b, 0xc8, 0xb1, 0x0e, 0xd2, 0xdb, 0x22,
  0x3c, 0x17, 0x8f, 0x39, 0xbb, 0x22, 0x6f, 0xa7, 0xc4, 0xe3, 0x26, 0xa2,
  0x0e, 0x7d, 0xd0, 0x86, 0x4d, 0x8b, 0xf9, 0xc0, 0x91, 0x41, 0x80, 0x66,

  0x5f, 0x69, 0xd1, 0x86, 0x98, 0xa4, 0x3a, 0x6a, 0xb6, 0x7e, 0xb2, 0x5b,









  0xf4, 0x6f, 0x34, 0x2a, 0xe2, 0xd3, 0x47, 0x91, 0x92, 0x30, 0x5e, 0x8a,
  0x20, 0x4b, 0x88, 0x9b, 0xc9, 0xa2, 0xe0, 0xbe, 0x75, 0x6a, 0xef, 0x20,
  0x1a, 0x87, 0x88, 0x85, 0xa4, 0x38, 0x2a, 0x21, 0xd6, 0x59, 0x27, 0x2e,
  0xe1, 0xc7, 0x21, 0x70, 0x53, 0x28, 0x12, 0x21, 0x51, 0x86, 0xd0, 0x50,
  0xf1, 0x22, 0x13, 0xfd, 0xa1, 0x89, 0x0d, 0xc1, 0x88, 0xae, 0x09, 0x6a,
  0x43, 0x13, 0x2d, 0xe2, 0x7b, 0xf2, 0x79, 0x84, 0xf8, 0xde, 0x9f, 0x5e,
  0x1c, 0xbd, 0x10, 0x74, 0x21, 0x85, 0xe1, 0x50, 0x33, 0x81, 0x13, 0xd3,
  0xb8, 0x87, 0x34, 0x97, 0x29, 0x91, 0x90, 0xd5, 0x53, 0x1f, 0xc4, 0xae,
  0x3c, 0x72, 0xc4, 0xe9, 0x9a, 0xb0, 0x97, 0xb7, 0xe9, 0x05, 0xe7, 0x44,
  0x95, 0xb1, 0x58, 0x06, 0x4c, 0x4f, 0x74, 0xfe, 0x21, 0x28, 0x03, 0x2a,
  0xf7, 0x51, 0x0c, 0xcf, 0xf2, 0x36, 0x20, 0x21, 0x16, 0x65, 0x6c, 0x70,
  0xd9, 0x84, 0xc5, 0x29, 0xb5, 0x72, 0x0c, 0xfb, 0x0f, 0x22, 0x42, 0xf7,
  0x56, 0x7a, 0x58, 0xc3, 0x1e, 0xb1, 0x08, 0x7f, 0x9b, 0x44, 0x9c, 0x0b,
  0x24, 0x76, 0x2f, 0x95, 0x18, 0x67, 0xe4, 0x05, 0xfc, 0x53, 0x2f, 0xc2,
  0x4e, 0xe3, 0xdd, 0x27, 0xa5, 0x13, 0x73, 0x8f, 0xd4, 0x4a, 0x23, 0xab,
  0xd2, 0x9a, 0x29, 0x02, 0x9f, 0x11, 0x86, 0xaf, 0xc1, 0x02, 0xdb, 0x6e,
  0x11, 0xd7, 0x68, 0x5d, 0xd5, 0x35, 0x24, 0xee, 0xd0, 0xce, 0x6a, 0xc0,
  0x12, 0xda, 0x42, 0x0f, 0x08, 0xa4, 0x5f, 0xde, 0x2c, 0x4a, 0x35, 0x89,
  0xbe, 0xa9, 0x11, 0xdc, 0x7e, 0x05, 0x02, 0x74, 0x3e, 0x58, 0xb3, 0x39,
  0xd7, 0x98, 0x9b, 0x8f, 0x3c, 0xd9, 0xef, 0xb1, 0x65, 0x59, 0xe5, 0x1d,
  0x67, 0x6d, 0x41, 0x6b, 0xde, 0x18, 0x1e, 0x58, 0x27, 0x6c, 0x8e, 0xba,
  0x5a, 0x01, 0x92, 0xfa, 0xf5, 0x42, 0x4c, 0xcb, 0x81, 0x9c, 0xd1, 0xc6,
  0x3c, 0xc6, 0x77, 0x1a, 0xf6, 0xa5, 0x87, 0xf2, 0x42, 0x53, 0xd4, 0x58,
  0x53, 0xe2, 0x28, 0x9e, 0xe2, 0x65, 0x9a, 0x9b, 0x59, 0x52, 0xf4, 0xdc,
  0x05, 0xbf, 0x23, 0x2d, 0xba, 0xa9, 0xee, 0x2d, 0x49, 0x7c, 0xf0, 0x23,
  0x2d, 0x39, 0x92, 0x83, 0xa1, 0x5d, 0x87, 0xbf, 0x6d, 0x42, 0xa5, 0xc3,
  0xc9, 0xdf, 0xca, 0x89, 0x38, 0x61, 0xc8, 0x72, 0x8c, 0x81, 0x88, 0xcc,
  0x91, 0x3f, 0xbf, 0x36, 0x54, 0x36, 0x5b, 0xb3, 0x5f, 0x95, 0x26, 0x24,
  0x99, 0xd8, 0xdc, 0x75, 0x96, 0x02, 0x1e, 0xc9, 0x25, 0x20, 0xfc, 0x38,
  0x15, 0x54, 0xd1, 0xb1, 0xc3, 0xfa, 0xc8, 0xc3, 0x2e, 0x50, 0x44, 0x3a,
  0x25, 0x6f, 0x88, 0x19, 0x5c, 0xea, 0xb2, 0x19, 0xeb, 0xcb, 0x25, 0xac,
  0xa7, 0xd3, 0x66, 0x2d, 0x1b, 0xdf, 0x9d, 0x5d, 0xa9, 0x5e, 0x52, 0xf3,
  0x2e, 0x10, 0xa8, 0x91, 0x85, 0x34, 0x35, 0x94, 0x97, 0x4e, 0xef, 0x54,
  0x5f, 0x70, 0xc2, 0x55, 0xb0, 0xe4, 0x1c, 0x5e, 0x75, 0xb0, 0x58, 0x3b,
  0x09, 0x8a, 0x76, 0xe6, 0x75, 0x4f, 0xa3, 0x88, 0x5f, 0xd4, 0x4e, 0xf1,
  0xdb, 0xfd, 0xb0, 0xd3, 0x59, 0x31, 0xef, 0x5a, 0x57, 0x3d, 0x6b, 0x52,
  0xda, 0xe5, 0x8d, 0x2d, 0xcb, 0x9c, 0x4b, 0xc0, 0x56, 0xd6, 0x20, 0x32,
  0x08, 0x54, 0x2a, 0xaa, 0xb1, 0x41, 0x1c, 0x5c, 0x7b, 0xdd, 0x1c, 0x87,
  0x7a, 0xc4, 0x3b, 0xf9, 0x0a, 0xf3, 0xc3, 0x1d, 0x30, 0x2b, 0x2d, 0x60,

  0x62, 0x3b, 0xf3, 0x31, 0x67, 0x8c, 0x25, 0x4f, 0x3e, 0x7f, 0xf2, 0x78,
  0x57, 0xfb, 0xa6, 0x6a, 0x16, 0xe2, 0x6e, 0xac, 0xf9, 0x18, 0x6e, 0x9c,
  0xc0, 0xb9, 0x43, 0xaf, 0xc9, 0xa9, 0x3d, 0x1f, 0x03, 0x05, 0x88, 0x63,
  0x33, 0xe7, 0x7e, 0x3d, 0xe4, 0x62, 0x47, 0xe7, 0x2b, 0x66, 0xca, 0x41,
  0xfe, 0x00, 0x7d, 0x2c, 0xe3, 0x97, 0x77, 0xc0, 0xe1, 0xd3, 0xda, 0x31,
  0x6f, 0x57, 0x19, 0xc4, 0xa8, 0xe2, 0x50, 0xd2, 0x34, 0xf5, 0x6d, 0x17,
  0x35, 0xaf, 0x31, 0x09, 0x2a, 0xe9, 0xe7, 0xd0, 0x54, 0x45, 0xf5, 0xb8,
  0xa2, 0x66, 0xd0, 0xa5, 0x27, 0x17, 0xd8, 0x37, 0xc2, 0xb5, 0x5d, 0x2c,
  0x78, 0x62, 0x18, 0xb9, 0x28, 0x71, 0xaf, 0x39, 0x43, 0xaa, 0xbd, 0x8f,
  0x8c, 0xba, 0x48, 0x94, 0xa2, 0xef, 0x4b, 0x82, 0x94, 0x9c, 0x49, 0xb4,
  0x92, 0x78, 0x99, 0x2d, 0xb5, 0x31, 0x0d, 0xab, 0x1e, 0xa5, 0x64, 0x37,
  0xb0, 0x2b, 0x42, 0x5b, 0xd1, 0x4b, 0xbe, 0x70, 0x1f, 0xe6, 0x87, 0xba,
  0x41, 0x52, 0x85, 0x27, 0x68, 0xcd, 0xac, 0xb7, 0xbe, 0x45, 0xa9, 0x4d,
  0x51, 0x40, 0xba, 0x65, 0x2d, 0xfa, 0x77, 0x4b, 0x95, 0x61, 0x45, 0x1b,
  0x7f, 0xb5, 0xb3, 0x11, 0x3d, 0xb3, 0x87, 0x25, 0xc5, 0x90, 0x5d, 0xf0,
  0xa5, 0x84, 0x7d, 0x29, 0x17, 0xc9, 0x0e, 0x26, 0xbc, 0xb7, 0xb7, 0x7b,
  0xff, 0xa4, 0xe5, 0xc9, 0xfb, 0x26, 0x79, 0xc6, 0x8e, 0x0d, 0x0f, 0xc9,
  0x7e, 0xee, 0xcd, 0x81, 0xbe, 0x49, 0x27, 0xc6, 0x70, 0xf3, 0x9c, 0x44,
  0xc8, 0x89, 0x33, 0xa4, 0x42, 0x50, 0x8d, 0x72, 0xe8, 0xc4, 0xd7, 0xac,
  0x34, 0x5e, 0x60, 0x7b, 0xed, 0x62, 0xf6, 0x32, 0x92, 0x98, 0xb0, 0x10,
  0x4a, 0x8d, 0x02, 0xb4, 0xd3, 0x2b, 0x43, 0x84, 0xa1, 0xbe, 0xe9, 0xa6,
  0xe5, 0x2d, 0x0e, 0x26, 0x6e, 0x3e, 0x48, 0x3c, 0x37, 0x3b, 0xdf, 0x42,

  0xf5, 0x41, 0xb0, 0x3b, 0x3e, 0x52, 0x1b, 0xa1, 0x4f, 0xdb, 0x0c, 0x4b,
  0x6e, 0xe2, 0x3c, 0x0a, 0xc0, 0x58, 0xf9, 0x49, 0xaf, 0x15, 0x77, 0x48,
  0x9d, 0x2d, 0xc4, 0x02, 0x1e, 0xd0, 0x70, 0xd4, 0x4f, 0x6e, 0xcd, 0x0c,
  0x85, 0xca, 0xcd, 0xa2, 0xa5, 0x17, 0x98, 0x0e, 0x46, 0xd3, 0x0d, 0x18,
  0x2f, 0xe6, 0x66, 0xe9, 0x9b, 0x7b, 0xa2, 0x03, 0x07, 0x64, 0xc2, 0x3f,
  0x6d, 0x6d, 0xe6, 0x80, 0xef, 0x28, 0x10, 0x38, 0x62, 0xba, 0x3a, 0x1a,
  0xb6, 0x85, 0xb5, 0xdf, 0x76, 0x0f, 0x37, 0xa6, 0xe0, 0xd9, 0x1c, 0x3c,
  0xf8, 0x79, 0x25, 0x0b, 0x2f, 0x94, 0xb3, 0xea, 0x6b, 0xd3, 0x41, 0xdb,
  0xbe, 0x86, 0x67, 0x6d, 0x5f, 0x83, 0xad, 0x63, 0x8f, 0x6b, 0x68, 0x9c,
  0x7c, 0x59, 0x27, 0xef, 0xf5, 0xb1, 0x64, 0x67, 0x7c, 0xf6, 0xfe, 0xe8,
  0xab, 0xd3, 0xdd, 0xfb, 0x7c, 0x94, 0x6d, 0xfe, 0x6f, 0xd7, 0x95, 0x6a,
  0x96, 0xb0, 0x4c, 0x1f, 0xd6, 0xc9, 0x57, 0xe3, 0xf1, 0xf0, 0xd5, 0xd9,
  0x31, 0x1a, 0xec, 0x8d, 0xcd, 0x9f, 0x3d, 0x30, 0xd0, 0x23, 0xa0, 0x90,
  0x0f, 0xbf, 0x95, 0xda, 0xd1, 0x5a, 0x93, 0x04, 0xe1, 0x01, 0xa4, 0xc3,
  0x14, 0xe0, 0x36, 0xde, 0x23, 0x8b, 0x04, 0x80, 0xe1, 0xbb, 0x26, 0xcf,
  0xd9, 0xf1, 0x1e, 0x3e, 0x45, 0x9f, 0xc4, 0x82, 0x7a, 0xdc, 0x07, 0xeb,
  0xb0, 0xb7, 0x1e, 0x69, 0x3e, 0x48, 0x31, 0x05, 0x83, 0xd6, 0x64, 0x70,
  0x63, 0xf9, 0x91, 0x38, 0x71, 0x01, 0xbb, 0x78, 0xe9, 0x0d, 0xb9, 0xc2,
  0xa8, 0xb6, 0x42, 0xf1, 0x1a, 0x3b, 0xae, 0x37, 0x98, 0x68, 0x8c, 0xca,
  0x85, 0xc6, 0xe9, 0x63, 0x8d, 0xae, 0x76, 0x9d, 0x22, 0xdb, 0xc3, 0x75,
  0x92, 0xbc, 0xd8, 0x96, 0x9e, 0xd5, 0x45, 0xb9, 0xbe, 0xbc, 0x62, 0x03,
  0xab, 0xed, 0x87, 0x00, 0x2f, 0xd7, 0xe8, 0xab, 0x85, 0x8d, 0x37, 0x93,
  0x0c, 0x48, 0x10, 0xef, 0xa8, 0xde, 0x53, 0x65, 0x14, 0x1c, 0x62, 0xf5,
  0x86, 0x93, 0x2e, 0x66, 0xbf, 0x09, 0xfc, 0xf2, 0x06, 0x0d, 0x64, 0xc2,
  0x81, 0x53, 0xb8, 0xd1, 0x8a, 0x66, 0xb1, 0x94, 0xbf, 0xa6, 0xc5, 0x1d,
  0xdc, 0xa5, 0xe2, 0xbf, 0x47, 0xfd, 0xa7, 0xa5, 0xe9, 0x36, 0xa1, 0x37,
  0xd5, 0x14, 0x86, 0x3e, 0xa7, 0xa0, 0x72, 0xe1, 0xe7, 0x26, 0x9a, 0x45,
  0x3b, 0xed, 0xa5, 0x11, 0xd3, 0x30, 0xed, 0x86, 0xc5, 0x40, 0x47, 0x19,

  0x18, 0x73, 0x58, 0xc2, 0x64, 0xa2, 0x08, 0x0b, 0x11, 0x44, 0x58, 0x11,
  0xba, 0xcf, 0xed, 0xa4, 0x93, 0xba, 0x5c, 0xac, 0x1b, 0xe8, 0x02, 0xe4,









  0x14, 0xa5, 0xe2, 0x9a, 0x5d, 0x90, 0xae, 0x84, 0x2f, 0xcd, 0xa8, 0x89,
  0x97, 0x80, 0x9a, 0xc4, 0xea, 0x00, 0x5c, 0x67, 0xc4, 0x91, 0x0b, 0x01,
  0x70, 0x14, 0x51, 0xfc, 0x13, 0xb4, 0xb3, 0x3c, 0x16, 0x86, 0x5a, 0x21,
  0x2d, 0xe9, 0xba, 0x8c, 0xf7, 0xec, 0x36, 0xe7, 0xa7, 0x67, 0xd5, 0xda,
  0x1d, 0xf5, 0xae, 0x13, 0xeb, 0x6e, 0x25, 0xaa, 0x3b, 0xad, 0x31, 0xc6,
  0xd9, 0x7a, 0x33, 0x95, 0x35, 0x5b, 0x60, 0x42, 0xb7, 0x64, 0x72, 0x67,
  0x3f, 0xc6, 0xdf, 0x49, 0x91, 0xcb, 0x63, 0x15, 0xe1, 0x87, 0x82, 0xb1,
  0xb8, 0xc3, 0x18, 0x6d, 0x4a, 0x46, 0x69, 0x7f, 0xa9, 0x33, 0xf4, 0xb7,
  0x19, 0xe7, 0x9d, 0xf1, 0x11, 0xe3, 0x34, 0x5a, 0x87, 0xcc, 0x5a, 0x7e,
  0xb7, 0x9f, 0x16, 0x6d, 0xc4, 0x08, 0x4f, 0x04, 0x04, 0x4c, 0xa1, 0x74,
  0xbb, 0x2a, 0x55, 0x8f, 0xc8, 0xdf, 0x96, 0x72, 0x27, 0x3f, 0x7e, 0xd9,
  0xfb, 0x86, 0x2d, 0x05, 0x2a, 0x37, 0x37, 0xdb, 0x74, 0xa7, 0x33, 0x7a,
  0xc0, 0x86, 0xb8, 0xf5, 0xbb, 0x1f, 0x06, 0x96, 0x9d, 0x8d, 0x17, 0xd7,
  0x40, 0xc3, 0xb3, 0x8b, 0x32, 0x9c, 0xff, 0xa3, 0xfc, 0x85, 0xee, 0xc0,
  0x77, 0x79, 0x61, 0x34, 0xc3, 0x7a, 0x57, 0x89, 0x33, 0x2f, 0x62, 0x30,
  0x0a, 0xc4, 0x3b, 0xb6, 0x6b, 0x63, 0x89, 0x19, 0x8e, 0xe3, 0x12, 0xf5,
  0x48, 0x71, 0xe6, 0x80, 0x4d, 0xc0, 0x8a, 0xbc, 0x9e, 0x8a, 0x77, 0xab,
  0xa0, 0x7e, 0x66, 0x6a, 0x99, 0x0e, 0xc6, 0x00, 0x6e, 0xaa, 0x31, 0x0b,
  0x8a, 0xfc, 0x76, 0x64, 0x83, 0xfb, 0x16, 0xf8, 0xc9, 0x0f, 0x6e, 0x1a,
  0x46, 0x18, 0x69, 0xa7, 0x0d, 0xce, 0xd6, 0x0d, 0x61, 0xd1, 0xee, 0x62,
  0x9d, 0x3b, 0x4f, 0x76, 0x93, 0x79, 0xb3, 0xda, 0x39, 0xd8, 0x65, 0xf8,
  0x6c, 0x69, 0xe3, 0x5c, 0x3a, 0x71, 0x1f, 0x7a, 0x71, 0x28, 0xb7, 0x30,
  0x79, 0x6d, 0x3f, 0x8b, 0xe0, 0x26, 0x21, 0x49, 0xa1, 0x8a, 0x6f, 0x2e,
  0x37, 0x98, 0x37, 0xcc, 0xf6, 0x7e, 0x45, 0x1a, 0x73, 0x64, 0xef, 0xb8,
  0x16, 0x7f, 0x45, 0xa0, 0x92, 0xa8, 0x6c, 0x34, 0x16, 0x84, 0x6b, 0xc0,


  0x29, 0x6d, 0x88, 0xa4, 0xf4, 0xd9, 0xec, 0xdc, 0x62, 0x36, 0x24, 0x1e,
  0x72, 0x59, 0x95, 0x46, 0x44, 0x56, 0x11, 0xe8, 0x3d, 0xb1, 0x29, 0x2e,
  0x50, 0x7d, 0x73, 0x9d, 0x57, 0x65, 0x01, 0x74, 0xc3, 0xeb, 0xb4, 0xca,
  0x11, 0xe6, 0xdf, 0xfa, 0xfa, 0xf4, 0xdd, 0xd1, 0x96, 0xef, 0x14, 0x99,
  0xe7, 0xe2, 0x47, 0xc7, 0xf9, 0x75, 0xbd, 0xd4, 0x7a, 0x9a, 0x31, 0xa7,
  0xa1, 0x11, 0xe9, 0x53, 0x56, 0xfb, 0x00, 0xc4, 0x00, 0x94, 0xaa, 0xcc,

  0x46, 0xc8, 0x8d, 0x2a, 0x29, 0x49, 0x00, 0xd2, 0xd2, 0x4d, 0x29, 0x0c,
  0x49, 0x40, 0xb1, 0xc6, 0x1b, 0x6a, 0x1a, 0xa2, 0xf9, 0x46, 0xe9, 0x37,
  0x15, 0x4b, 0xbc, 0xc6, 0x63, 0xa4, 0xe6, 0x6b, 0x47, 0x06, 0xe7, 0x62,
  0xef, 0x8a, 0xc7, 0xe5, 0x1d, 0x59, 0x36, 0xdb, 0x6d, 0x01, 0xb8, 0x5d,
  0x93, 0x31, 0xde, 0x6c, 0xeb, 0xf6, 0x22, 0x5d, 0xd4, 0xf1, 0xf8, 0xb0,
  0xd9, 0x6b, 0xcf, 0xd7, 0x99, 0xaa, 0xf9, 0x13, 0x6e, 0x74, 0x1e, 0xdc,
  0xdd, 0xbe, 0x17, 0x7c, 0xfb, 0x6e, 0xbb, 0xd6, 0x5d, 0x88, 0x7f, 0x93,
  0xba, 0x02, 0xb1, 0x76, 0x9f, 0xd8, 0x76, 0x94, 0x9e, 0xe0, 0xed, 0x43,
  0xaf, 0xa2, 0xf9, 0x7c, 0x39, 0x65, 0x24, 0x22, 0x1b, 0x57, 0xed, 0x60,
  0xcd, 0xaa, 0x96, 0x54, 0x78, 0x1d, 0x23, 0x31, 0x5a, 0x2f, 0xd6, 0xa1,
  0x11, 0xdc, 0x48, 0xa3, 0x52, 0xc8, 0xb7, 0xdc, 0xe8, 0x06, 0x37, 0x85,
  0x8b, 0x22, 0xcb, 0x97, 0x06, 0x7e, 0x35, 0x75, 0x1f, 0xfa, 0xa9, 0x4b,
  0x46, 0xb1, 0x7a, 0x09, 0xc3, 0x7f, 0x32, 0x80, 0xa4, 0x05, 0x8c, 0x52,
  0x10, 0xcd, 0x50, 0x3f, 0xb6, 0x3b, 0xa9, 0x8e, 0x6d, 0x54, 0x2c, 0x99,
  0xbf, 0xb1, 0x39, 0x63, 0x23, 0xfe, 0x8c, 0xd2, 0x01, 0x85, 0x83, 0x3a,
  0x1f, 0xa4, 0xc8, 0xb2, 0xc9, 0xa2, 0x30, 0x4f, 0xee, 0x3e, 0x9a, 0xa5,

  0x09, 0x86, 0x7b, 0xbd, 0xae, 0xae, 0x51, 0xf5, 0x2a, 0xad, 0x7f, 0x38,
  0x35, 0xd8, 0x9d, 0x87, 0x9c, 0x43, 0x44, 0xca, 0x7b, 0x33, 0xa4, 0xb4,
  0xcd, 0x6a, 0x2d, 0x38, 0xdf, 0x5f, 0xf1, 0x2c, 0xec, 0x04, 0xad, 0xa5,
  0x43, 0x00, 0x28, 0xac, 0xc5, 0x06, 0x49, 0xfa, 0x65, 0x0d, 0xc8, 0xce,

  0xa6, 0x4a, 0xa7, 0xee, 0x2f, 0xc3, 0xb4, 0x9e, 0xe6, 0xb9, 0xb6, 0x92,
  0xa1, 0xf8, 0x60, 0x46, 0xe9, 0xb0, 0x51, 0x7c, 0x1c, 0x77, 0x1e, 0xb6,
  0x89, 0xc3, 0xac, 0x64, 0xf7, 0x2e, 0xe7, 0x9c, 0xa4, 0xdc, 0x65, 0x8c,
  0x32, 0x58, 0x50, 0x1a, 0x27, 0xc1, 0xc3, 0x58, 0x77, 0x1d, 0xad, 0xb4,

  0xe9, 0x31, 0x6d, 0x8d, 0xf5, 0x7d, 0xe0, 0x9b, 0xdf, 0xba, 0x09, 0x43,
  0xc2, 0x1a, 0xaf, 0x1b, 0x36, 0x25, 0x6f, 0x6e, 0x0e, 0xfd, 0x67, 0x36,


  0x45, 0xc3, 0x9f, 0x76, 0x8c, 0x13, 0x46, 0x7b, 0x8a, 0x99, 0x26, 0xe3,







  0xdd, 0x56, 0xaf, 0xbd, 0x57, 0x27, 0x67, 0xef, 0x81, 0xb0, 0x45, 0xa0,
  0xcd, 0x45, 0xcd, 0x59, 0x0a, 0xf4, 0x33, 0x4a, 0x60, 0x87, 0x50, 0x20,
  0xa8, 0x44, 0xc2, 0x4b, 0x0e, 0xcb, 0xab, 0x81, 0x4b, 0x0f, 0xf3, 0x21,

  0x66, 0x5f, 0x71, 0x7a, 0x5b, 0x91, 0x78, 0x05, 0x8e, 0xcc, 0xe0, 0xd5,
  0xbe, 0xe8, 0x2e, 0xc7, 0x7c, 0xd5, 0x7d, 0x5b, 0x01, 0xde, 0x6d, 0x21,
  0x52, 0xfb, 0x5d, 0x0b, 0x32, 0x56, 0x2a, 0xa2, 0x58, 0xc0, 0xcf, 0x9b,
  0xcc, 0x42, 0x99, 0x89, 0x5d, 0x67, 0x61, 0x18, 0xb5, 0x79, 0x0e, 0x27,
  0x69, 0x00, 0xb8, 0x42, 0xeb, 0xe3, 0xeb, 0xcd, 0x88, 0x06, 0x66, 0x63,
  0x8b, 0x55, 0xd1, 0x06, 0xf3, 0xb2, 0xdb, 0x1d, 0x35, 0x42, 0xbb, 0xf3,

  0xda, 0x5c, 0x17, 0xa6, 0x53, 0xa5, 0x9e, 0x3d, 0x1b, 0x0e, 0xf8, 0xfd,
  0x80, 0xbf, 0x3a, 0x59, 0x13, 0x87, 0xe8, 0x7c, 0x41, 0x8e, 0x97, 0x95,
  0x26, 0x7e, 0x82, 0xbe, 0x27, 0xee, 0x2f, 0x46, 0x52, 0xa2, 0x1a, 0xce,


  0x2c, 0x5d, 0x1a, 0xb5, 0xa0, 0xd0, 0x42, 0x01, 0xf2, 0xfc, 0x52, 0x3e,
  0x67, 0x77, 0xc2, 0xeb, 0x54, 0x38, 0x96, 0x22, 0x69, 0x83, 0x0b, 0x74,
  0xea, 0x07, 0xf8, 0x33, 0xc4, 0x49, 0xfd, 0xe1, 0x63, 0x35, 0x61, 0x78,
  0xdd, 0xe2, 0x1e, 0x48, 0xdc, 0x46, 0xbb, 0x0e, 0x32, 0x66, 0x31, 0x0f,
  0x61, 0x1b, 0x0f, 0x53, 0xd3, 0x9c, 0xab, 0x75, 0xf1, 0xc9, 0x4c, 0x21,
  0x2c, 0x87, 0xd6, 0x64, 0x5f, 0xc2, 0xdd, 0xe7, 0x6e, 0x9d, 0xf4, 0x17,
  0x6e, 0xfd, 0x6a, 0x47, 0x20, 0xb8, 0xe4, 0x6b, 0x72, 0xe4, 0x85, 0x1d,
  0xdf, 0x63, 0xb3, 0x9b, 0xd9, 0xfb, 0x91, 0x36, 0x6e, 0x03, 0xa3, 0xe9,
  0xec, 0x7a, 0xd2, 0xae, 0xcf, 0xb5, 0xa1, 0x46, 0x4f, 0xa4, 0x48, 0x14,
  0x5b, 0x01, 0xa4, 0x50, 0x91, 0xa4, 0xa9, 0x5e, 0x01, 0x3b, 0x5c, 0x83,
  0xec, 0xc9, 0x64, 0xc3, 0x37, 0x81, 0xdd, 0xe2, 0x35, 0xbe, 0x89, 0xcc,
  0xa4, 0x5d, 0x9b, 0xdf, 0x47, 0x07, 0xac, 0xa4, 0xc0, 0x91, 0x65, 0x88,
  0xc0, 0x95, 0xf2, 0x4b, 0x26, 0x8a, 0xd5, 0xd9, 0xa8, 0x25, 0xa5, 0xdf,
  0x13, 0x2f, 0xc2, 0xb7, 0x5c, 0x29, 0x57, 0x56, 0x58, 0x22, 0x5b, 0xd2,
  0x45, 0x95, 0xd0, 0xce, 0x6f, 0xb8, 0x4b, 0x6e, 0x21, 0xde, 0x46, 0xd9,
  0x1f, 0x76, 0x36, 0xa9, 0x78, 0x10, 0x37, 0x7c, 0x1f, 0x32, 0xc3, 0xf7,
  0x6d, 0x5e, 0xe8, 0x56, 0x1a, 0xd4, 0x51, 0x47, 0x6e, 0xf4, 0xbd, 0x3c,
  0x90, 0x86, 0xa7, 0x04, 0xfb, 0xb3, 0xf7, 0x61, 0x95, 0xb7, 0xb8, 0xff,
  0x26, 0xa8, 0xcf, 0xbe, 0x8f, 0x0b, 0x5a, 0xd3, 0x5d, 0x7e, 0xd6, 0xe3,
  0xda, 0xfa, 0xf9, 0x2c, 0xb0, 0x8d, 0x23, 0x18, 0xe1, 0x80, 0x45, 0xc0,
  0x00, 0x85, 0xee, 0x7e, 0x1d, 0x16, 0x48, 0x9f, 0x94, 0x09, 0xe7, 0xb3,
  0x28, 0x82, 0x83, 0x3d, 0x59, 0x69, 0x48, 0x29, 0x01, 0x0b, 0x3a, 0x0b,
  0xc5, 0x8e, 0x39, 0x7e, 0x63, 0x48, 0x8c, 0x54, 0x55, 0x6a, 0x4f, 0xfc,
  0xe7, 0xbe, 0xa3, 0x45, 0xc7, 0x7b, 0x0d, 0xe9, 0xc2, 0xbc, 0x9f, 0x91,
  0x31, 0xef, 0xc1, 0x7a, 0x11, 0xce, 0xdf, 0xc8, 0x23, 0x75, 0x0e, 0xb7,
  0x6b, 0xf3, 0x8b, 0x9e, 0x16, 0x03, 0x19, 0xd0, 0xca, 0x00, 0x68, 0x7b,
  0xb5, 0x26, 0x00, 0x40, 0x12, 0x77, 0xdc, 0xb0, 0x46, 0x7a, 0x2a, 0x55,
  0x19, 0xcd, 0xb9, 0x3d, 0xe1, 0x00, 0xa8, 0x8e, 0x9d, 0xd8, 0x75, 0x66,
  0xae, 0x21, 0xd7, 0x09, 0x4d, 0xaa, 0xf2, 0x53, 0xc6, 0x34, 0x07, 0xc3,
  0x02, 0xc8, 0x4b, 0xac, 0x47, 0x89, 0x2f, 0xd6, 0x70, 0x39, 0xc6, 0xa3,
  0xa7, 0x7c, 0x85, 0x20, 0xe8, 0xca, 0xcd, 0xf1, 0x04, 0xb2, 0xc1, 0xf1,
  0xc2, 0x1c, 0xaf, 0x03, 0x2c, 0x41, 0x21, 0xe4, 0xf9, 0xb8, 0xa6, 0x04,
  0xf4, 0x16, 0xbf, 0xf7, 0x96, 0x0e, 0x88, 0x9c, 0x37, 0x5c, 0x7d, 0xff,
  0xe6, 0x8b, 0x83, 0xa6, 0xff, 0xde, 0xdb, 0x53, 0xf7, 0xef, 0x7d, 0xe4,
  0x44, 0x1f, 0xde, 0xf3, 0xce, 0xd0, 0x12, 0x1c, 0x60, 0xc9, 0x4b, 0x43,
  0x54, 0xec, 0x0a, 0xa3, 0x50, 0x56, 0xd7, 0xcb, 0x85, 0xde, 0x8d, 0x43,
  0xb5, 0x38, 0x66, 0x9c, 0xc6, 0x03, 0x6b, 0x8d, 0xb4, 0x70, 0xae, 0x6a,
  0x98, 0xb9, 0x5e, 0xaa, 0x82, 0xdd, 0x3e, 0x60, 0x15, 0xc9, 0x50, 0x4c,
  0xe4, 0x8a, 0x3b, 0xff, 0x0d, 0xd7, 0xc0, 0x42, 0x07, 0xa7, 0xe3, 0x01,
  0x68, 0x4f, 0x5e, 0x3b, 0x25, 0xf3, 0xdf, 0x29, 0x0d, 0xd8, 0x68, 0xb4,

  0x0d, 0xe5, 0x81, 0xe1, 0x5b, 0x81, 0xca, 0xc9, 0x7d, 0xcc, 0x6c, 0x9d,


  0x08, 0x17, 0x79, 0x5b, 0x4c, 0x1a, 0x42, 0x3e, 0xf6, 0x35, 0x03, 0x06,

  0x96, 0x4f, 0x8e, 0xc8, 0x5a, 0x89, 0x18, 0x82, 0xec, 0xb0, 0xc8, 0x6d,
  0x95, 0x5d, 0x2e, 0xb8, 0xd4, 0x9c, 0xb4, 0x25, 0x86, 0x75, 0xaa, 0xd9,
  0x58, 0xbc, 0x78, 0x1f, 0x2b, 0x2f, 0x82, 0xb5, 0xce, 0x09, 0x4f, 0x62,





  0x9d, 0xe9, 0x0f, 0x6c, 0x03, 0xb3, 0x56, 0xb6, 0x0c, 0x1b, 0x28, 0x62,









  0xb1, 0x46, 0xba, 0x90, 0x61, 0x2a, 0x89, 0xf7, 0x98, 0xff, 0xca, 0x8b,
  0xcf, 0xf7, 0x07, 0x62, 0xd3, 0x50, 0x94, 0xcb, 0x7f, 0x86, 0x5c, 0x53,


  0x11, 0x2d, 0x82, 0x1e, 0x33, 0x3f, 0xb5, 0x4f, 0x86, 0x1c, 0x50, 0x50,
  0x33, 0x9f, 0x3c, 0xa2, 0x50, 0x77, 0xdc, 0x95, 0xc4, 0xec, 0xce, 0x77,
  0x1e, 0x58, 0xef, 0x41, 0x1d, 0xc5, 0xdf, 0x9d, 0x79, 0x92, 0x47, 0x4e,
  0xe3, 0x58, 0xc2, 0xa4, 0xdb, 0xe8, 0x75, 0x16, 0x75, 0x44, 0xcc, 0xf2,
  0x3a, 0xe2, 0xbb, 0xe0, 0x04, 0x36, 0x21, 0x38, 0xdb, 0x82, 0x0e, 0x0d,
  0x78, 0x98, 0xb4, 0x71, 0x8a, 0xe6, 0xc2, 0x6c, 0xa1, 0x7f, 0x86, 0xce,
  0xda, 0xec, 0xfe, 0xc6, 0x7b, 0xf2, 0x7c, 0xf4, 0xb8, 0x75, 0x4f, 0x9a,
  0xc5, 0x72, 0x78, 0x33, 0xb9, 0x27, 0xe4, 0x71, 0x71, 0xf2, 0x0e, 0x29,
  0x1f, 0xca, 0x6e, 0xd0, 0x04, 0x42, 0xbd, 0xcf, 0xe4, 0xd7, 0x61, 0x17,
  0x21, 0x61, 0xfa, 0x62, 0x22, 0x0f, 0xc9, 0xac, 0xb5, 0x35, 0xa3, 0x62,
  0xee, 0x2b, 0xe4, 0x9d, 0x19, 0x92, 0xdd, 0xd8, 0xab, 0xd5, 0x22, 0x8f,
  0x16, 0xf6, 0x68, 0x66, 0x6d, 0x76, 0x9b, 0x4d, 0xd7, 0x08, 0x4f, 0x93,
  0x72, 0x48, 0x18, 0x52, 0x9b, 0xfd, 0xe6, 0x9e, 0xaf, 0x5c, 0xbc, 0xe3,
  0xe6, 0x07, 0xdd, 0xcd, 0xe8, 0xae, 0x9d, 0x17, 0x1f, 0x38, 0xcd, 0xb8,
  0xbe, 0x3d, 0xf6, 0xbb, 0x20, 0x44, 0x8c, 0x7c, 0x7e, 0x12, 0x88, 0x86,
  0xa4, 0xf2, 0xcb, 0x82, 0x55, 0x8e, 0x77, 0xf9, 0xb4, 0x2a, 0xeb, 0x72,
  0xce, 0x99, 0x6a, 0x9e, 0x79, 0x74, 0x7c, 0x3c, 0x4e, 0x6e, 0xb2, 0x89,
  0x96, 0xc4, 0x8e, 0x42, 0x1f, 0x32, 0x78, 0x08, 0x05, 0x46, 0xaa, 0x3c,
  0x6b, 0x68, 0xcb, 0x34, 0x14, 0x4a, 0x10, 0x51, 0x68, 0x89, 0x25, 0x00,
  0x2a, 0x50, 0xdf, 0xa9, 0xab, 0xe0, 0x82, 0x05, 0xd3, 0x2a, 0x2b, 0x23,
  0xf1, 0x70, 0x9e, 0x80, 0x8a, 0x15, 0xa6, 0x13, 0xc8, 0xf0, 0x49, 0x2a,
  0x0d, 0x9b, 0xd8, 0x33, 0x60, 0xd8, 0x0e, 0x69, 0x28, 0xe2, 0x51, 0xf9,
  0x44, 0xae, 0xb2, 0xa0, 0x56, 0x65, 0x92, 0x51, 0x8b, 0x43, 0x8a, 0xf2,
  0xb7, 0x9d, 0x76, 0xc5, 0xac, 0xac, 0x90, 0x81, 0xe4, 0xb5, 0x52, 0x41,
  0xd3, 0xc1, 0x75, 0x85, 0xa2, 0x2b, 0xc0, 0x97, 0x86, 0xfc, 0xf4, 0xe6,
  0x8a, 0xc3, 0xb5, 0x7a, 0x0a, 0x24, 0x9c, 0x50, 0x65, 0xcb, 0xa5, 0x3d,
  0x02, 0xd8, 0x4f, 0xf3, 0x77, 0xe2, 0xc6, 0x3b, 0x8d, 0x28, 0xd4, 0xa1,
  0x9c, 0x87, 0x2b, 0x29, 0x95, 0x1c, 0x85, 0x37, 0xf9, 0x65, 0x4f, 0x67,
  0x4d, 0x0b, 0xee, 0x00, 0xe1, 0x84, 0x1b, 0x8b, 0xd9, 0x88, 0xc8, 0xac,
  0xf8, 0x8e, 0x26, 0x41, 0xbb, 0x58, 0x54, 0x3d, 0x85, 0x0e, 0xd8, 0x1e,
  0xea, 0xeb, 0xc3, 0xc4, 0xf0, 0xf4, 0xc6, 0x4e, 0x3c, 0x09, 0x92, 0xa5,
  0xb1, 0xfd, 0xfe, 0x48, 0x81, 0xf9, 0x89, 0xa1, 0xa4, 0xf6, 0x54, 0xec,
  0x0d, 0xf0, 0x50, 0xc7, 0x5b, 0x5a, 0x9f, 0x6a, 0x79, 0x01, 0x00, 0x85,
  0xe7, 0x2a, 0x88, 0x2b, 0x7d, 0x7d, 0x50, 0xd2, 0x88, 0x64, 0x45, 0xf2,
  0x51, 0xbc, 0x60, 0xac, 0xed, 0x28, 0x4f, 0xc7, 0xd3, 0x8e, 0x74, 0xf9,
  0x57, 0xb7, 0xa4, 0x1f, 0x1c, 0x0e, 0x27, 0x59, 0x4a, 0xcd, 0x5d, 0x5e,

  0x36, 0xa4, 0x30, 0xc5, 0x2b, 0x53, 0x7a, 0x0a, 0x53, 0xfe, 0xcc, 0x6f,
  0x5e, 0x40, 0xd3, 0xa2, 0xa3, 0x3d, 0x7d, 0xf5, 0xe1, 0xe2, 0xeb, 0x24,

  0x39, 0x24, 0x60, 0xf9, 0x87, 0x54, 0xa6, 0x80, 0x23, 0xb4, 0x46, 0xd1,
  0x5b, 0x8d, 0x1e, 0xb1, 0xc5, 0xdf, 0xd6, 0x45, 0xbb, 0x77, 0x44, 0xcc,
  0x37, 0x0f, 0xf9, 0x29, 0xa2, 0x97, 0xcb, 0xa4, 0x5b, 0x99, 0xd5, 0xda,
  0x59, 0x88, 0x4f, 0x64, 0x38, 0xe4, 0xea, 0x39, 0x73, 0xb5, 0xef, 0x09,
  0x63, 0xd6, 0x71, 0x78, 0x0e, 0x99, 0xad, 0x4c, 0x57, 0xf1, 0x83, 0x34,
  0x5e, 0x8a, 0x56, 0x2e, 0xe4, 0xe0, 0x6f, 0xba, 0x9d, 0x41, 0xcf, 0xdf,
  0xbe, 0xee, 0x0c, 0xf7, 0xf4, 0xd9, 0x93, 0xfd, 0x5f, 0x31, 0x49, 0xaf,
  0x24, 0xef, 0x88, 0x78, 0x11, 0xa2, 0xa8, 0x39, 0xdf, 0x55, 0x54, 0xb6,
  0xaa, 0x7e, 0x86, 0x52, 0x1e, 0xf2, 0xcb, 0xea, 0xeb, 0x66, 0x46, 0xd9,

  0x5a, 0x16, 0x75, 0xa3, 0x52, 0x75, 0xff, 0xbf, 0xfe, 0x19, 0x96, 0xd5,
  0xfe, 0xf5, 0x47, 0xf6, 0x13, 0xcf, 0xd1, 0x4f, 0xcf, 0x25, 0xfa, 0x2b,
  0x9b, 0xa9, 0x9d, 0x44, 0xa6, 0x1b, 0xbd, 0xfd, 0xbb, 0x6d, 0xdb, 0xf5,
  0x06, 0x3a, 0x7f, 0xb4, 0x28, 0x5b, 0x85, 0xa7, 0xcc, 0x4d, 0x0f, 0x16,
  0xa0, 0xe4, 0xa9, 0xa7, 0x0e, 0x28, 0x34, 0x95, 0x6d, 0x0a, 0x36, 0xeb,
  0xeb, 0x59, 0xa5, 0xcd, 0x5b, 0x04, 0xbe, 0x4b, 0xdd, 0xe4, 0xe4, 0xce,
  0xe6, 0xdc, 0x2a, 0xcc, 0x9f, 0x54, 0x51, 0x94, 0x2f, 0xe7, 0x45, 0x8f,
  0xef, 0x52, 0x12, 0x88, 0xfe, 0xcb, 0x9c, 0xc0, 0xa0, 0xb9, 0x29, 0xff,
  0xd9, 0xf6, 0x63, 0x1a, 0x0d, 0x83, 0x66, 0xfc, 0xf1, 0x77, 0x07, 0x54,
  0x11, 0xb4, 0xd5, 0x1d, 0xc2, 0x7c, 0x74, 0x8d, 0xd2, 0x23, 0x3e, 0x55,
  0xab, 0x20, 0x6d, 0x02, 0xe7, 0xd5, 0x0f, 0x52, 0xb1, 0xf1, 0x80, 0xf4,
  0xc6, 0x7f, 0x8e, 0xe8, 0xbf, 0x7f, 0x3d, 0x18, 0x3e, 0xf9, 0xd1, 0x7e,
  0xf4, 0x77, 0x07, 0x1f, 0x7f, 0x77, 0xb8, 0x15, 0x2d, 0xab, 0x73, 0xb5,

  0xff, 0x5e, 0x86, 0x22, 0xa9, 0xb3, 0xc5, 0x9d, 0x94, 0x69, 0x48, 0x84,


  0xd1, 0xb5, 0xd9, 0x43, 0xd3, 0xde, 0x10, 0x1f, 0x89, 0xfc, 0x56, 0x1d,
  0x4d, 0x55, 0xfb, 0xec, 0x29, 0x73, 0xb8, 0x29, 0xf9, 0x65, 0xf1, 0xa9,
  0x70, 0xfd, 0x9f, 0xd6, 0x0f, 0x04, 0xbc, 0x90, 0xa0, 0x98, 0x7c, 0xda,
  0x20, 0xb4, 0x14, 0x85, 0xd8, 0x08, 0x77, 0x43, 0xd2, 0xa2, 0x8c, 0x34,
  0x4b, 0x93, 0xce, 0xa6, 0x4f, 0x26, 0xf6, 0x27, 0x45, 0x16, 0x14, 0x62,
  0xa5, 0x8c, 0x11, 0x95, 0x09, 0xd8, 0x5d, 0x62, 0xb9, 0x82, 0x79, 0xd3,
  0x86, 0xad, 0x25, 0x9a, 0x85, 0xd9, 0xbb, 0x76, 0xcd, 0xd4, 0x35, 0xb8,
  0xcb, 0x2d, 0xfe, 0xb6, 0xd6, 0x5e, 0xda, 0x4e, 0xa0, 0x98, 0x91, 0xf2,
  0xda, 0xc5, 0x5e, 0xf0, 0x33, 0x89, 0xbb, 0xa0, 0xbe, 0x1f, 0x32, 0xae,
  0x2e, 0x63, 0x91, 0xbc, 0x74, 0x42, 0x4d, 0xf0, 0x5a, 0x3d, 0x85, 0x6c,
  0x83, 0x98, 0x89, 0x43, 0x9b, 0x4a, 0xeb, 0x9e, 0x0d, 0xf1, 0xb7, 0xc2,
  0xdb, 0x04, 0xd9, 0x28, 0x6c, 0xce, 0x06, 0xa7, 0x2e, 0x17, 0xc5, 0x52,
  0xf6, 0x68, 0x93, 0x0d, 0xbd, 0xaa, 0x58, 0x54, 0xe1, 0xe2, 0xa7, 0x5e,
  0x86, 0x9b, 0x84, 0xf5, 0x86, 0x41, 0x2c, 0xd2, 0x10, 0xd1, 0xec, 0xce,

  0x70, 0x42, 0x06, 0x76, 0xb5, 0x38, 0x91, 0xea, 0x21, 0x10, 0x5e, 0x63,

  0xe8, 0x6c, 0x7b, 0xb8, 0x9d, 0xec, 0xa0, 0x72, 0x1e, 0x66, 0x5d, 0x32,

  0x4b, 0xeb, 0xab, 0xdd, 0x98, 0x17, 0xd2, 0x39, 0xfe, 0x1c, 0xa3, 0x9a,
  0x88, 0xeb, 0x81, 0x24, 0x26, 0x73, 0xa8, 0x4d, 0xde, 0xea, 0x53, 0x06,
  0xd5, 0xa0, 0x24, 0xc1, 0xa1, 0x8d, 0x24, 0xb7, 0x7e, 0x32, 0x24, 0x63,
  0x11, 0x3f, 0xfd, 0x4f, 0x7e, 0x36, 0x88, 0x63, 0xd0, 0x93, 0x9c, 0xe5,
  0x35, 0xe4, 0x02, 0x28, 0x27, 0x44, 0x29, 0x7e, 0x97, 0xbc, 0x5c, 0x5d,
  0x55, 0x46, 0xf3, 0x0b, 0xeb, 0xac, 0xc6, 0x5f, 0x27, 0x8c, 0xa3, 0x69,
  0x9e, 0xe2, 0x67, 0x2c, 0x71, 0x78, 0x50, 0x83, 0xbf, 0x22, 0x3e, 0x1e,
  0x25, 0x90, 0x0c, 0xd3, 0x7a, 0x18, 0x68, 0x39, 0x17, 0x7e, 0x36, 0x2d,
  0xe9, 0x9c, 0x64, 0x88, 0x50, 0xe2, 0x22, 0xc5, 0xd3, 0x8a, 0x29, 0x5a,
  0x81, 0x27, 0x7b, 0xa3, 0xd1, 0x1e, 0x31, 0xab, 0x3d, 0xf3, 0x87, 0x06,
  0xef, 0x05, 0xa1, 0xaa, 0xdb, 0x30, 0x8b, 0xc2, 0x81, 0xf4, 0x31, 0x00,
  0x65, 0x48, 0x7b, 0x49, 0xaf, 0x05, 0xd1, 0xdf, 0xd7, 0x48, 0x3e, 0xad,

  0x8c, 0x2e, 0x59, 0x71, 0x15, 0xef, 0xb2, 0x25, 0x1f, 0x83, 0x36, 0x55,
  0xec, 0x52, 0xaf, 0x05, 0x2f, 0xa2, 0xd3, 0x7a, 0x8d, 0x4c, 0x3a, 0x78,
  0x5e, 0x68, 0x11, 0x79, 0xa3, 0x28, 0x5d, 0xa8, 0x9f, 0x4e, 0x37, 0xda,
  0x72, 0x8f, 0x0f, 0xdb, 0x3e, 0x8f, 0x55, 0x5e, 0x18, 0xeb, 0xc2, 0x68,
  0xc5, 0x00, 0xf7, 0xa4, 0xec, 0xbb, 0xb0, 0x7e, 0x87, 0x1d, 0x69, 0xed,
  0xb8, 0x2b, 0x3b, 0x92, 0x99, 0xb7, 0x59, 0x6d, 0x43, 0xb5, 0x6b, 0x46,
  0x37, 0xe5, 0x08, 0xfe, 0x4e, 0x20, 0x28, 0xf9, 0x23, 0xbb, 0x2c, 0x2d,
  0x25, 0x3f, 0x17, 0x04, 0x91, 0xd9, 0x66, 0x1b, 0xa2, 0xc7, 0xa4, 0x9c,
  0xff, 0x03, 0xc5, 0x1d, 0xa3, 0xc5, 0x3c, 0x1e, 0xd6, 0xdd, 0x60, 0x9d,
  0x24, 0xae, 0x29, 0x17, 0xad, 0x99, 0xf0, 0x51, 0xcd, 0xbe, 0xbf, 0x39,
  0x3a, 0x17, 0xd5, 0x04, 0xce, 0x07, 0xd7, 0x4f, 0x35, 0x6c, 0x37, 0x4c,
  0x46, 0xcc, 0xd3, 0xc7, 0xb6, 0xc1, 0x79, 0x7d, 0x95, 0x1e, 0x3e, 0x79,

  0x2a, 0xd3, 0x56, 0xb4, 0x2c, 0xc8, 0xec, 0x6d, 0xfe, 0xd5, 0xde, 0x1e,
  0x07, 0xca, 0xc9, 0x2c, 0x0d, 0x78, 0x42, 0x2a, 0x6d, 0xda, 0xb7, 0xff,
  0xb8, 0x1d, 0x4d, 0x91, 0x53, 0xa5, 0x95, 0x4d, 0x77, 0x72, 0x3b, 0x23,
  0x8d, 0xcf, 0x6f, 0xca, 0x30, 0xe8, 0x36, 0xe9, 0x41, 0xd9, 0x4a, 0xa0,
  0x31, 0xf8, 0xfd, 0x0a, 0xb4, 0xab, 0x31, 0x37, 0x72, 0x6c, 0xea, 0x44,
  0x2b, 0x51, 0x09, 0xb9, 0xd3, 0xdf, 0x9f, 0x9a, 0x7b, 0xc9, 0x4e, 0x43,
  0x10, 0x13, 0x49, 0x77, 0xa3, 0xd3, 0xf0, 0x06, 0x96, 0xbc, 0x4f, 0x02,
  0xbe, 0x26, 0x58, 0x3f, 0x22, 0x3c, 0x8d, 0xb7, 0xb0, 0x37, 0x06, 0x33,
  0x35, 0x5f, 0x08, 0x32, 0x14, 0x94, 0x2e, 0x2c, 0xd0, 0x26, 0x8c, 0x79,
  0x2f, 0x31, 0xd0, 0xdd, 0x16, 0x23, 0x0a, 0xaa, 0xa6, 0x83, 0x41, 0x13,
  0x58, 0x8d, 0xc0, 0x75, 0x56, 0xf8, 0x14, 0x24, 0x86, 0x4d, 0xb3, 0x9c,
  0x81, 0x97, 0xcc, 0xd9, 0x52, 0xc4, 0x27, 0xb8, 0x07, 0x86, 0x14, 0xf6,
  0x88, 0x0e, 0xc4, 0xce, 0x08, 0x1a, 0x28, 0x90, 0x7f, 0xf9, 0xf9, 0x68,
  0xff, 0x85, 0x42, 0xb2, 0x0e, 0x92, 0xaf, 0x8a, 0x35, 0x1d, 0x09, 0xad,
  0xfa, 0xab, 0xf1, 0x37, 0x41, 0x71, 0x15, 0xbd, 0xf1, 0xf8, 0x11, 0xbd,
  0xf1, 0x7e, 0xcc, 0x4f, 0xdd, 0x94, 0x8b, 0xb9, 0x79, 0x33, 0xf6, 0xdc,
  0x33, 0x7a, 0xce, 0x50, 0xdc, 0xac, 0x59, 0xd4, 0x4a, 0x54, 0x1b, 0x66,
  0xf2, 0xf8, 0x71, 0x64, 0x26, 0x83, 0x9f, 0xfc, 0xa1, 0x53, 0xb8, 0xe8,
  0x88, 0xa0, 0x26, 0xe9, 0xf4, 0x13, 0x28, 0x07, 0x69, 0xe7, 0x16, 0x60,
  0xf8, 0xd7, 0x64, 0xbe, 0x0c, 0x14, 0xf0, 0x90, 0x3e, 0x46, 0x15, 0x70,

  0xd2, 0x1a, 0xd4, 0x9f, 0x3f, 0x3b, 0x7c, 0x74, 0xb0, 0xf7, 0x74, 0xf4,
  0x78, 0x74, 0x68, 0xd3, 0xc0, 0x0c, 0x1d, 0x5c, 0x53, 0xd7, 0x0c, 0x8a,
  0xba, 0x47, 0x5c, 0xd5, 0x48, 0x80, 0xc8, 0x0b, 0x33, 0x8e, 0x07, 0x8b,
  0x20, 0xe8, 0xe6, 0x2e, 0x01, 0x84, 0x40, 0x10, 0x0e, 0xfc, 0x7a, 0xa2,
  0x51, 0xa4, 0x41, 0x20, 0x61, 0x2b, 0xd0, 0x24, 0xc4, 0x2d, 0x61, 0x4c,


  0x75, 0xda, 0x81, 0x49, 0x6e, 0xac, 0xdb, 0xa6, 0x5c, 0xc3, 0xfb, 0x4d,
  0xae, 0x16, 0xc5, 0x58, 0x17, 0x75, 0x46, 0x3a, 0x51, 0x97, 0x59, 0xac,
  0xa3, 0x9f, 0xcc, 0x9e, 0x13, 0x6e, 0x39, 0x8a, 0x6e, 0xbb, 0xb9, 0x93,
  0xdf, 0x94, 0xd8, 0x17, 0x37, 0x38, 0x31, 0x96, 0x47, 0x31, 0xa5, 0x3e,
  0x5b, 0xc6, 0x2a, 0xb8, 0x26, 0x17, 0x6f, 0xac, 0x3f, 0xb8, 0x14, 0x18,

  0xaa, 0x8b, 0x5e, 0x52, 0x11, 0x1c, 0x10, 0xba, 0xfc, 0x80, 0x8b, 0x1b,
  0xb4, 0xb0, 0x94, 0xeb, 0xa8, 0x02, 0xee, 0xa4, 0xfb, 0x10, 0xf4, 0x31,
  0x17, 0x1c, 0x71, 0xaa, 0x30, 0x62, 0x6f, 0x34, 0x83, 0xbf, 0xd1, 0x36,
  0xba, 0x4a, 0xb1, 0x98, 0xb3, 0x64, 0x93, 0x33, 0x2d, 0x8a, 0x16, 0xc1,
  0xff, 0x3a, 0x19, 0x24, 0xad, 0xa6, 0x9e, 0x1b, 0x1a, 0xb1, 0x75, 0xfb,
  0x1e, 0xca, 0xa8, 0x3f, 0x9b, 0xca, 0x1e, 0xfd, 0xf2, 0x54, 0x76, 0xf8,
  0x50, 0x2a, 0xf3, 0xc8, 0x8c, 0x9d, 0x36, 0x1b, 0x08, 0x8d, 0x1a, 0x25,
  0xd2, 0x3a, 0x7a, 0xa8, 0xcc, 0x23, 0x32, 0x17, 0x9e, 0x6c, 0x91, 0x58,
  0x9b, 0xc6, 0x1c, 0x91, 0xf5, 0x51, 0x19, 0x83, 0x59, 0x28, 0x9d, 0xdd,
  0x43, 0x68, 0xec, 0x13, 0xdb, 0x4c, 0x65, 0x17, 0x6d, 0xbe, 0xb2, 0x81,
  0xc6, 0x7c, 0x82, 0x78, 0x30, 0x95, 0x39, 0x07, 0x15, 0xf3, 0x9d, 0xa4,

  0x87, 0xd0, 0x7c, 0x3a, 0x53, 0xd5, 0x28, 0xa4, 0xb2, 0xe7, 0x31, 0x2a,
  0x7b, 0xf4, 0x10, 0x2a, 0x33, 0xe7, 0xb9, 0x20, 0x59, 0xd9, 0xa2, 0xb2,
  0xc7, 0x3f, 0x89, 0xca, 0x98, 0xcc, 0x40, 0x67, 0xbd, 0x84, 0x46, 0x4b,
  0x6a, 0x17, 0x47, 0xbe, 0xfa, 0x57, 0xb9, 0x45, 0xda, 0x1a, 0x34, 0x28,
  0x19, 0xfc, 0x69, 0x67, 0xd8, 0xd9, 0xea, 0x07, 0x9c, 0xd8, 0x61, 0xfb,
  0xc4, 0x0e, 0x7e, 0xda, 0x89, 0x1d, 0x76, 0xc2, 0x79, 0x46, 0x53, 0x63,
  0x2f, 0xeb, 0x5f, 0xd5, 0xd9, 0xfd, 0x62, 0x6f, 0xef, 0x47, 0xf8, 0x0c,
  0x5e, 0x90, 0xec, 0xfb, 0x31, 0xe8, 0x79, 0x9b, 0x75, 0xca, 0x0a, 0xc7,
  0xa7, 0xaf, 0xbf, 0x19, 0x8b, 0xab, 0x56, 0x14, 0x0e, 0x55, 0x48, 0xd8,
  0xa9, 0x05, 0x28, 0x4e, 0xee, 0x59, 0x16, 0xa8, 0xb9, 0xdc, 0x2b, 0x31,
  0x19, 0xde, 0x0e, 0xac, 0xcf, 0x94, 0x8a, 0xd5, 0x8a, 0x44, 0xaf, 0x0a,
  0x80, 0xcd, 0x18, 0x5e, 0x09, 0x76, 0xb2, 0x0c, 0xdd, 0x83, 0x5f, 0xe5,
  0xcf, 0x45, 0x8c, 0xf4, 0xc2, 0xbd, 0xb2, 0xd3, 0x5c, 0x55, 0x28, 0x62,
  0xc0, 0x63, 0xa2, 0x5b, 0x7b, 0x1d, 0xd5, 0x7a, 0x66, 0x27, 0xb3, 0xfa,
  0x1a, 0xe0, 0xaf, 0xab, 0x2a, 0xeb, 0xe9, 0x33, 0x7d, 0x71, 0xe5, 0xfd,
  0x56, 0x3d, 0x47, 0x31, 0x90, 0x03, 0x01, 0x33, 0xf3, 0xf6, 0x9b, 0xde,
  0x0b, 0x52, 0xc6, 0xf2, 0x5b, 0x1f, 0x52, 0x85, 0xa8, 0x00, 0x4d, 0x46,
  0x1b, 0xed, 0xca, 0x71, 0x7b, 0xe7, 0xba, 0x42, 0x72, 0xbe, 0x4e, 0xc6,
  0x8d, 0x2f, 0xea, 0xc7, 0x66, 0xc8, 0xae, 0x1f, 0x82, 0x7f, 0x91, 0xd2,
  0x6f, 0xe4, 0x1f, 0x4f, 0xe8, 0xc3, 0xf0, 0x71, 0xf2, 0x3f, 0xaf, 0xf0,
  0x6f, 0xfa, 0xa4, 0x22, 0x26, 0x79, 0xe7, 0x3c, 0x8d, 0x6e, 0xb4, 0xb2,

  0x52, 0x36, 0xb7, 0xb9, 0x92, 0xff, 0x7d, 0xe9, 0x2a, 0xc8, 0xfc, 0x35,
  0x93, 0xeb, 0x0d, 0xc5, 0x90, 0xb1, 0xb2, 0x03, 0x8f, 0x11, 0x63, 0xe4,
  0xc7, 0x3d, 0xee, 0xfb, 0x2c, 0xf1, 0x61, 0x15, 0xb5, 0x4e, 0xde, 0x6f,
  0x96, 0xe5, 0x22, 0x84, 0x72, 0x04, 0x03, 0x46, 0xd8, 0x0c, 0x13, 0x5a,
  0xa9, 0x11, 0x84, 0xcc, 0xfc, 0x60, 0xff, 0xf3, 0xd0, 0xc9, 0xfa, 0x41,


  0x2b, 0xb8, 0x1c, 0xb2, 0x20, 0xd2, 0x00, 0x90, 0x4b, 0x3d, 0x71, 0x75,
  0x0b, 0xb1, 0x8f, 0x46, 0x8a, 0xbc, 0x60, 0xfb, 0xce, 0x32, 0xb6, 0x96,
  0x26, 0x6c, 0xf6, 0x86, 0x49, 0xb4, 0x28, 0x5a, 0xad, 0x21, 0xd7, 0x04,
  0x12, 0x57, 0x62, 0xd9, 0x01, 0x7f, 0x47, 0x7b, 0x6d, 0x09, 0xb1, 0x7c,
  0xe9, 0x70, 0xcb, 0x7e, 0xff, 0x78, 0x9f, 0xce, 0x54, 0x07, 0xa1, 0x66,
  0x30, 0x0b, 0x75, 0x8d, 0xff, 0xfe, 0x51, 0x3a, 0xfa, 0x0d, 0x71, 0x87,

  0x9e, 0xb4, 0xad, 0xe8, 0xdf, 0x0d, 0xf8, 0x86, 0x5f, 0x12, 0x38, 0xca,
  0x70, 0x92, 0x56, 0x91, 0x7a, 0x01, 0x91, 0xdd, 0x8a, 0xa9, 0xa1, 0x88,
  0x14, 0xfa, 0x16, 0xb7, 0x42, 0x90, 0x1c, 0x70, 0xfb, 0x43, 0x33, 0x54,
  0x12, 0x76, 0x57, 0xb0, 0xfe, 0x69, 0xbf, 0xb9, 0xea, 0x80, 0x91, 0xa0,
  0x3c, 0x20, 0xa8, 0x74, 0x31, 0xa0, 0xc8, 0x55, 0x04, 0x2e, 0x88, 0x95,
  0x3d, 0xfb, 0x15, 0x7c, 0x66, 0x56, 0xa5, 0x37, 0x9e, 0x0d, 0xcd, 0x58,
  0xec, 0x73, 0xb8, 0xa9, 0x6d, 0xca, 0x81, 0xf9, 0x3d, 0x45, 0x20, 0x63,
  0xda, 0x47, 0x3d, 0xad, 0xa8, 0x6d, 0x8e, 0x74, 0x07, 0xc0, 0x48, 0x2b,
  0x42, 0xc3, 0x33, 0x9a, 0xc7, 0x65, 0xa6, 0x95, 0x82, 0x76, 0xd5, 0x0a,
  0x05, 0x01, 0xfc, 0x87, 0x51, 0x2c, 0x09, 0xd7, 0x65, 0xda, 0xd8, 0x76,
  0xb7, 0xa4, 0xc4, 0x32, 0x60, 0x04, 0xbd, 0xae, 0x75, 0x9b, 0x16, 0x4c,
  0x70, 0x45, 0x5d, 0xdb, 0xea, 0xab, 0xbc, 0xdb, 0xca, 0x7c, 0x67, 0xf8,


  0x45, 0xf9, 0xc5, 0x70, 0x57, 0x48, 0xbc, 0xbc, 0xce, 0x6a, 0x58, 0x42,
  0x98, 0x2a, 0x45, 0x27, 0xaf, 0xe0, 0x62, 0x11, 0xe1, 0x85, 0xf2, 0x44,
  0x4a, 0x16, 0x84, 0x36, 0x06, 0x87, 0x78, 0xd0, 0x4e, 0x84, 0x27, 0x56,
  0x51, 0x68, 0x52, 0xf8, 0x1d, 0xb9, 0x63, 0xcc, 0x5e, 0xcd, 0x39, 0x9f,
  0x09, 0x25, 0x8c, 0x14, 0xb5, 0x15, 0xdc, 0x60, 0xf6, 0x02, 0x97, 0xab,
  0xb6, 0x6c, 0xa2, 0x6a, 0x58, 0xe5, 0x0d, 0x2f, 0x95, 0xad, 0xfc, 0xe9,
  0xde, 0x5c, 0x77, 0xcb, 0x80, 0xe6, 0xe2, 0xc4, 0xa0, 0xcb, 0x87, 0xda,
  0x07, 0x46, 0x1c, 0x9e, 0x5e, 0x65, 0x4b, 0x69, 0xbb, 0xd2, 0x53, 0x39,
  0xdc, 0x5b, 0x66, 0xdb, 0x9e, 0x13, 0x27, 0x83, 0xcd, 0x9b, 0xd5, 0x68,
  0x59, 0xfe, 0xc3, 0xec, 0x71, 0x4a, 0x7d, 0xdc, 0x82, 0x2b, 0x41, 0x25,

  0x7e, 0x05, 0x1f, 0x0a, 0x83, 0xf6, 0x14, 0xd6, 0xb0, 0x74, 0x2c, 0x5c,

  0x91, 0xa1, 0x51, 0xe2, 0x9d, 0xbc, 0x36, 0x33, 0x3e, 0xfa, 0xf8, 0xe1,
  0xfd, 0xf8, 0xc3, 0x59, 0x97, 0xb0, 0xcf, 0x4e, 0xcf, 0x2f, 0x8e, 0xde,
  0x7c, 0x3c, 0x3b, 0x3f, 0xbd, 0x38, 0x7d, 0x7d, 0x7a, 0x92, 0xec, 0x1c,
  0xec, 0x6e, 0xac, 0x68, 0xb2, 0x2e, 0x08, 0x0f, 0x1b, 0x4f, 0xe7, 0xcf,
  0x3c, 0xcb, 0x4e, 0x61, 0x87, 0xd6, 0x13, 0x8e, 0xf6, 0x9d, 0xd0, 0x56,
  0x0b, 0x6b, 0x18, 0x7e, 0x08, 0x08, 0x37, 0x70, 0xf5, 0x34, 0xb9, 0x5c,
  0xf3, 0x65, 0x94, 0xd8, 0xb6, 0x96, 0x7b, 0xd4, 0x4d, 0x20, 0x8a, 0xb2,
  0x4c, 0x22, 0x6c, 0x5e, 0x31, 0xcc, 0x46, 0x77, 0xdc, 0x93, 0xae, 0xce,
  0x42, 0x67, 0x00, 0x05, 0xcc, 0x51, 0x45, 0x1d, 0x27, 0x0b, 0x4b, 0x17,
  0x0c, 0xa1, 0x01, 0xdc, 0x65, 0xfb, 0x0a, 0x40, 0xe9, 0x25, 0xe2, 0x51,
  0x16, 0x56, 0xa5, 0x1b, 0x25, 0x67, 0x61, 0x6f, 0x22, 0x79, 0x63, 0x96,
  0x15, 0xd2, 0x20, 0x53, 0xe6, 0x81, 0x80, 0x17, 0x3a, 0x6f, 0x70, 0xf8,
  0xd5, 0x3c, 0x40, 0xbf, 0xf5, 0xf6, 0x0a, 0x25, 0x96, 0x59, 0x10, 0x45,
  0xe4, 0xb7, 0x19, 0x5d, 0xe2, 0xc6, 0x9b, 0x13, 0x8d, 0x47, 0x4a, 0x19,
  0xb0, 0xef, 0x22, 0x1c, 0xf6, 0x48, 0xc3, 0x29, 0x8c, 0x8c, 0x81, 0x3b,
  0x09, 0xfd, 0x45, 0x31, 0x55, 0xc6, 0xfe, 0x5a, 0xee, 0x21, 0x64, 0xde,

  0x44, 0xf2, 0x6d, 0x0f, 0xe8, 0xec, 0x07, 0x4c, 0xd0, 0x12, 0x45, 0xda,
  0x90, 0x50, 0xef, 0x12, 0x00, 0x7d, 0x8f, 0x14, 0x26, 0xc4, 0x05, 0x53,
  0x98, 0xc8, 0xc0, 0x62, 0xbd, 0xbc, 0xed, 0x4c, 0xab, 0xcb, 0x7e, 0x9e,
  0x8d, 0x9e, 0x3e, 0x19, 0x1d, 0x12, 0x50, 0xc1, 0xe9, 0x82, 0xa2, 0x2e,
  0xa2, 0x59, 0xc0, 0xbf, 0x8c, 0x0f, 0x08, 0x2a, 0x0b, 0x52, 0xb6, 0xdc,
  0x5e, 0xc9, 0x88, 0x31, 0x5b, 0x2a, 0xd1, 0x02, 0x4a, 0x15, 0x65, 0x5a,
  0xcb, 0x2e, 0x6d, 0x54, 0x05, 0xca, 0x97, 0x90, 0x30, 0xcc, 0x77, 0x5e,
  0xd8, 0xb4, 0x25, 0xca, 0xe3, 0xe9, 0xf2, 0x5a, 0x2a, 0x8b, 0x07, 0xcc,
  0xe0, 0xeb, 0x33, 0xce, 0x69, 0xb4, 0x65, 0xf1, 0x60, 0xe5, 0xda, 0x26,
  0x78, 0x9f, 0x22, 0xda, 0xe3, 0x77, 0x7f, 0x96, 0x20, 0x92, 0xf9, 0xdb,
  0x38, 0x56, 0xee, 0xcd, 0xea, 0xbc, 0x8e, 0x31, 0x4a, 0xfc, 0x00, 0x08,
  0x2d, 0xcf, 0x4c, 0xef, 0x0f, 0xf4, 0xa7, 0xa6, 0x0d, 0x77, 0x97, 0xdc,
  0x03, 0xfd, 0x32, 0xf0, 0x2a, 0xd7, 0xcd, 0x7d, 0xad, 0xb3, 0xf8, 0x8a,
  0x47, 0x9b, 0xd1, 0xaf, 0x0e, 0x83, 0x8b, 0x76, 0xef, 0x15, 0x7b, 0xe8,

  0x0d, 0xb3, 0xa1, 0x01, 0x95, 0x0e, 0x5d, 0x99, 0x76, 0x66, 0xdf, 0x62,
  0xb0, 0x0b, 0x2a, 0x99, 0xe1, 0xec, 0xc1, 0x6c, 0x0e, 0xdd, 0x10, 0x75,
  0x6c, 0x03, 0xfc, 0x12, 0x21, 0x30, 0x9b, 0xe3, 0xc4, 0x27, 0x11, 0x03,
  0xcc, 0x48, 0xa7, 0xbe, 0xae, 0x6d, 0x81, 0xd3, 0xb6, 0xcd, 0xa6, 0x52,
  0xc7, 0x1d, 0xa9, 0xa4, 0x5c, 0xdc, 0x01, 0x28, 0x3c, 0xbf, 0xd5, 0x2c,
  0xe2, 0x7f, 0x64, 0x55, 0x19, 0x86, 0x63, 0xa1, 0x3c, 0x28, 0x80, 0x15,
  0x99, 0x92, 0x8a, 0xb0, 0xe1, 0x7e, 0x48, 0x5f, 0x0d, 0xee, 0xdc, 0x1f,
  0xd0, 0xee, 0x95, 0x01, 0x69, 0xb9, 0x35, 0x93, 0x20, 0x2c, 0x00, 0x2c,
  0x2e, 0xd7, 0x10, 0x9a, 0xc7, 0x03, 0x16, 0x54, 0x77, 0x77, 0xc7, 0x25,
  0x7b, 0x81, 0x89, 0x09, 0xf5, 0x6f, 0x46, 0xe6, 0x8c, 0xcb, 0x12, 0xd7,
  0xdb, 0x88, 0xd6, 0x4a, 0x0e, 0x64, 0x4b, 0xf4, 0xb9, 0x90, 0xa7, 0x0f,
  0x93, 0xe4, 0x4d, 0x56, 0xdc, 0xb5, 0x27, 0x34, 0x00, 0x4e, 0x06, 0xdc,
  0xc3, 0x79, 0xe3, 0x4a, 0xb9, 0xb5, 0x79, 0xc0, 0xdc, 0x33, 0x38, 0xc2,
  0x29, 0xb5, 0xe7, 0x1c, 0xe3, 0x5c, 0x5f, 0xd8, 0x6d, 0xd0, 0x14, 0x1b,
  0x7f, 0x33, 0x76, 0x80, 0xc8, 0xa0, 0x51, 0x40, 0x7c, 0xf2, 0x21, 0xdb,
  0x00, 0x9c, 0x39, 0x58, 0x75, 0xf5, 0x7a, 0xf2, 0x37, 0x06, 0xf6, 0x4e,
  0xc8, 0xb3, 0x50, 0xc9, 0x2e, 0x48, 0x5a, 0x9c, 0x39, 0x55, 0xf3, 0x00,
  0x07, 0xae, 0x88, 0x39, 0x14, 0xb1, 0xe1, 0x10, 0x9c, 0x54, 0x48, 0xed,

  0x36, 0x85, 0x61, 0x46, 0xd1, 0x5a, 0xa8, 0xac, 0x47, 0x65, 0xd0, 0xfb,
  0x33, 0x9c, 0x13, 0x4f, 0xe5, 0x74, 0xab, 0x8e, 0xf0, 0xe5, 0xbd, 0xe4,
  0x1c, 0x3f, 0x9b, 0x71, 0x4a, 0x8f, 0xf7, 0x8e, 0xa5, 0x9c, 0xba, 0x1e,
  0xfc, 0x81, 0xfe, 0x08, 0xd7, 0xd0, 0x22, 0x59, 0xda, 0x65, 0x65, 0x23,
  0xf4, 0x38, 0x18, 0x13, 0x5e, 0xef, 0xfb, 0xc0, 0x17, 0x4e, 0x0c, 0x6c,
  0x1e, 0x1b, 0x5c, 0xec, 0x21, 0x1f, 0xf8, 0x50, 0x28, 0x80, 0x99, 0x52,
  0xf7, 0xca, 0x22, 0xaa, 0xdf, 0xa4, 0x55, 0x81, 0x8c, 0x72, 0xdf, 0x0e,
  0x22, 0xdc, 0x8b, 0x95, 0x74, 0x5b, 0x48, 0xe7, 0x94, 0x8c, 0x5b, 0x65,
  0x0e, 0x00, 0x96, 0x8e, 0x92, 0xe1, 0x6d, 0x04, 0x51, 0x5a, 0x53, 0x43,
  0x57, 0x65, 0xc3, 0xd8, 0xd6, 0x94, 0xbd, 0x4b, 0x9a, 0x4e, 0x45, 0x0e,
  0x42, 0x6f, 0x93, 0x55, 0x45, 0xa6, 0xd1, 0xec, 0xe1, 0xc3, 0x8f, 0xb6,
  0x5e, 0x95, 0x85, 0x4b, 0xfc, 0x97, 0xe0, 0xab, 0xc7, 0xc6, 0xe4, 0x8b,
  0x9c, 0x82, 0x05, 0xa7, 0x93, 0x85, 0xc1, 0xbe, 0x2e, 0x73, 0x42, 0xb3,
  0xd1, 0xe1, 0xa0, 0xbd, 0x39, 0x2a, 0xb9, 0x88, 0x77, 0x67, 0x70, 0x79,
  0x2f, 0x62, 0x5f, 0xb9, 0xb4, 0xe0, 0xb4, 0x6e, 0x55, 0xfb, 0xe4, 0xad,
  0x04, 0x61, 0x24, 0x48, 0x18, 0x1b, 0x88, 0xd0, 0xd5, 0x0c, 0x4d, 0x16,
  0x1c, 0xba, 0x12, 0xe3, 0x53, 0x19, 0x2e, 0x4d, 0x0f, 0x29, 0x6b, 0x05,
  0x59, 0x3d, 0x53, 0x8b, 0x3c, 0xd4, 0x05, 0xb0, 0x6e, 0xb7, 0xb4, 0xb6,
  0xba, 0x80, 0x4d, 0xe3, 0x74, 0x6a, 0xee, 0xe8, 0x1e, 0x19, 0x71, 0x7b,
  0xa7, 0x89, 0x63, 0x9b, 0x55, 0xb0, 0x15, 0x4a, 0x79, 0xcd, 0x3e, 0xe7,
  0x0d, 0x4e, 0xac, 0x93, 0xb8, 0xaa, 0x09, 0x9d, 0xd2, 0xf3, 0x62, 0xb9,
  0x0e, 0x1b, 0xe6, 0x49, 0xb0, 0xce, 0xe6, 0xe9, 0x30, 0x98, 0x13, 0xb4,
  0x1f, 0xf1, 0xd2, 0x30, 0xa2, 0x3f, 0x6c, 0x74, 0xe9, 0x72, 0x00, 0xf7,
  0x13, 0xe2, 0x77, 0x71, 0x3f, 0xe2, 0x9e, 0x45, 0x72, 0x31, 0x04, 0x53,


  0xcc, 0x86, 0x86, 0x09, 0xac, 0x36, 0xf8, 0xe7, 0x6f, 0x07, 0xba, 0xe8,
  0x56, 0xc6, 0xab, 0x0f, 0x1d, 0xc1, 0x3f, 0xe1, 0xc4, 0x3a, 0xd9, 0xbb,
  0x30, 0x63, 0xdc, 0x68, 0x1a, 0x8f, 0x62, 0x3b, 0x19, 0xcb, 0xdc, 0x0b,
  0x2d, 0x9c, 0x5e, 0x9c, 0x7f, 0x2d, 0xe8, 0xc2, 0x06, 0xea, 0x86, 0xf5,
  0xa5, 0x39, 0xf1, 0xf6, 0xc9, 0xce, 0x7d, 0xe0, 0x7a, 0x2a, 0x8c, 0x89,
  0x32, 0xd9, 0x42, 0x72, 0xa5, 0xbd, 0x6f, 0xb1, 0x29, 0x17, 0xec, 0x23,
  0xb0, 0x95, 0x18, 0x33, 0x9e, 0x9f, 0x13, 0xa1, 0x64, 0x59, 0x5d, 0x30,
  0x49, 0x39, 0xeb, 0x98, 0x2f, 0x08, 0x7c, 0x12, 0x1f, 0xa2, 0x89, 0xe5,
  0x1b, 0x51, 0x0b, 0x7a, 0x0e, 0x23, 0x06, 0xd8, 0x31, 0xeb, 0xa4, 0xa1,
  0xea, 0xcf, 0xb9, 0x73, 0x7b, 0x3c, 0xf9, 0x6d, 0x2c, 0xf7, 0x4d, 0xfb,
  0xbb, 0x83, 0x4f, 0x6b, 0xe6, 0xa1, 0xe7, 0x1c, 0xe4, 0xc6, 0x43, 0xb7,
  0xcd, 0x3d, 0xee, 0x5b, 0xf9, 0x1e, 0xc2, 0xf5, 0xda, 0xe7, 0x59, 0x06,
  0x76, 0xff, 0x74, 0xbf, 0x35, 0xab, 0x8b, 0x31, 0x69, 0x3a, 0xab, 0x7e,
  0x2f, 0x4b, 0xfb, 0x2b, 0x2f, 0xcd, 0x8d, 0xde, 0xb4, 0x28, 0x3c, 0xf4,
  0x73, 0x16, 0xe5, 0x18, 0x87, 0xdb, 0x42, 0x99, 0x73, 0xe7, 0x44, 0xf8,
  0x23, 0x1b, 0x63, 0x55, 0x3d, 0x4b, 0x30, 0x63, 0x6e, 0x68, 0x3d, 0xeb,
  0x2d, 0xc3, 0x3e, 0xf8, 0x53, 0x57, 0x72, 0xff, 0x36, 0x82, 0x34, 0xe8,
  0xbf, 0x7f, 0x7d, 0x01, 0x37, 0xe0, 0xec, 0xc7, 0xde, 0x79, 0x1c, 0x0d,

  0x64, 0x2e, 0xbf, 0xc2, 0x34, 0xf2, 0xd5, 0x15, 0xe9, 0x96, 0x2f, 0x63,
  0xa5, 0x36, 0xde, 0x46, 0xc8, 0x63, 0xbf, 0xfc, 0xf7, 0xab, 0x85, 0x03,
  0xb5, 0xd9, 0xf0, 0x7d, 0x79, 0xec, 0x17, 0xff, 0x3e, 0xdf, 0xdd, 0xcd,
  0xc2, 0xc5, 0x72, 0xc5, 0x37, 0x92, 0xd0, 0xdc, 0xe6, 0x38, 0x4e, 0xaa,
  0xfc, 0x0c, 0xa6, 0x28, 0x39, 0xd2, 0x21, 0x57, 0x94, 0x6f, 0x45, 0x3b,
  0x2f, 0xf8, 0x6c, 0xf1, 0x17, 0xe1, 0x60, 0x60, 0xcd, 0xe1, 0xe6, 0x48,

  0x2b, 0x94, 0x97, 0xfc, 0xe7, 0xde, 0x97, 0xb1, 0x33, 0x52, 0x2c, 0xd4,
  0x23, 0x12, 0x83, 0xda, 0x3c, 0x05, 0xdd, 0x38, 0x18, 0x2b, 0x40, 0x54,
  0x5e, 0xdb, 0x49, 0x82, 0x36, 0x4b, 0xb3, 0x46, 0xe8, 0xd5, 0x58, 0xc7,
  0x16, 0xd9, 0x21, 0x4a, 0x1b, 0x25, 0x0b, 0x4f, 0xe3, 0x14, 0x2e, 0x67,
  0x88, 0x14, 0x8f, 0xcc, 0xfb, 0x60, 0xdd, 0xd7, 0x7c, 0x8b, 0x8b, 0x81,
  0xbc, 0xbe, 0x97, 0x0e, 0xb5, 0xf4, 0xeb, 0x81, 0x74, 0x4c, 0x31, 0xc3,
  0x11, 0x59, 0x49, 0xde, 0xa4, 0xd2, 0x13, 0x8e, 0x33, 0x84, 0x76, 0xe1,
  0x74, 0x78, 0xd2, 0x4d, 0x17, 0x9c, 0x9e, 0x9b, 0xbc, 0x3e, 0x7d, 0xff,
  0xfe, 0xe8, 0x75, 0x37, 0x1e, 0x0d, 0xd8, 0x0a, 0x54, 0x20, 0xa0, 0x41,
  0x8f, 0xa8, 0xfa, 0x41, 0xbf, 0x3e, 0x7c, 0x9d, 0xc1, 0xd8, 0x6d, 0xc8,
  0x88, 0x67, 0x80, 0x6e, 0x3e, 0xa9, 0x20, 0xb3, 0x72, 0x21, 0x83, 0x87,
  0xd9, 0xc9, 0x14, 0x10, 0xa9, 0xee, 0x0a, 0xe8, 0xc1, 0xf9, 0x50, 0xe0,
  0x4c, 0xa3, 0x5e, 0x8e, 0xac, 0x81, 0xc2, 0x7e, 0xd5, 0x19, 0x60, 0xba,
  0xc6, 0x60, 0xdc, 0x93, 0xf4, 0x65, 0xa9, 0x8b, 0x0b, 0xbb, 0xc6, 0x59,
  0x5a, 0x66, 0x94, 0x2f, 0x2a, 0x13, 0x19, 0x96, 0x73, 0x6e, 0x1d, 0xba,

  0x4c, 0xab, 0x4f, 0x14, 0xcf, 0xf6, 0x0a, 0x46, 0x50, 0x30, 0x08, 0xc0,
  0xe1, 0xd9, 0x2c, 0x56, 0x87, 0x0e, 0xaf, 0xbb, 0x66, 0xc8, 0xa3, 0x20,
  0x8d, 0x27, 0x24, 0xed, 0xf6, 0x5e, 0x68, 0x25, 0x1f, 0xbd, 0x5e, 0x64,
  0x37, 0xf4, 0x19, 0x06, 0xdf, 0xa0, 0x62, 0xf2, 0x10, 0xbf, 0x9f, 0x31,
  0xa3, 0x39, 0xaa, 0x70, 0x27, 0x75, 0xec, 0x74, 0x56, 0x4b, 0x46, 0xc8,
  0x07, 0x08, 0x2f, 0xb5, 0x9c, 0xe2, 0x2a, 0x90, 0x60, 0xaf, 0xbe, 0x56,
  0x20, 0x3d, 0x2f, 0xa5, 0x2e, 0xc8, 0xfd, 0xb3, 0x98, 0x39, 0x93, 0xac,
  0x05, 0xaf, 0xd7, 0x87, 0x45, 0xc2, 0xbb, 0x8d, 0x63, 0x20, 0x6b, 0xa5,
  0x6e, 0x0d, 0xa0, 0x47, 0x9b, 0xf6, 0x44, 0xfe, 0xc6, 0x04, 0x8c, 0x0d,
  0xa3, 0x19, 0x2c, 0xec, 0x49, 0x17, 0xe2, 0x15, 0xe8, 0x47, 0x70, 0x92,
  0x12, 0xec, 0xd9, 0xe5, 0x9a, 0x0b, 0xde, 0xc8, 0x1d, 0x82, 0xcb, 0x1a,
  0xa8, 0xb9, 0x48, 0x83, 0x46, 0x25, 0xd8, 0x40, 0x9b, 0xa7, 0xa3, 0xfb,

  0xcf, 0x8c, 0x9a, 0x9a, 0xea, 0xe6, 0x2b, 0x92, 0x09, 0x07, 0x21, 0xe4,
  0x02, 0xe7, 0xc5, 0x6a, 0xdd, 0x04, 0x81, 0x44, 0x82, 0x74, 0xe2, 0x6a,
  0xfe, 0x2f, 0x87, 0x61, 0xfb, 0xa3, 0x74, 0xe6, 0x9f, 0x29, 0x18, 0x38,
  0x2c, 0xff, 0xba, 0x31, 0xd7, 0x7f, 0xa3, 0x67, 0xd9, 0xb7, 0x68, 0x9c,

  0x49, 0x23, 0x79, 0xe2, 0x1c, 0xf9, 0x75, 0xc4, 0xba, 0x07, 0xd7, 0x42,
  0x97, 0x16, 0xec, 0x5b, 0xca, 0x22, 0x36, 0x21, 0x77, 0x00, 0x56, 0xb0,
  0xc3, 0xfd, 0x8c, 0x95, 0x43, 0x8e, 0xad, 0xac, 0x4f, 0x28, 0x7d, 0xe2,
  0x8e, 0x4c, 0xfc, 0xd0, 0x2f, 0x2f, 0x99, 0x6c, 0xf7, 0xeb, 0x7b, 0x74,
  0x14, 0xfb, 0xdc, 0xaf, 0x31, 0x83, 0x68, 0xbf, 0xf9, 0xd6, 0xb7, 0x1f,
  0xfe, 0xd9, 0x00, 0xdf, 0x6e, 0x83, 0xd4, 0xb5, 0x29, 0xae, 0x90, 0x85,
  0xf7, 0xc2, 0x37, 0x82, 0xe7, 0x06, 0x79, 0xa9, 0x9e, 0x44, 0xde, 0x28,
  0x83, 0x5d, 0xdd, 0x92, 0x2f, 0x86, 0x23, 0x01, 0xfb, 0xd8, 0x44, 0x24,
  0x04, 0xf5, 0x30, 0x91, 0x7c, 0xaf, 0x08, 0x6e, 0x95, 0x7d, 0x76, 0xf3,

  0xac, 0x6c, 0xd9, 0xd7, 0xc3, 0x37, 0x8e, 0x6a, 0xde, 0x7e, 0x49, 0x75,
  0x05, 0xb5, 0x66, 0x2d, 0x65, 0x05, 0x9f, 0x68, 0x6d, 0xc2, 0x43, 0xa4,
  0x52, 0xb0, 0x25, 0xdd, 0xda, 0xb1, 0xd6, 0x46, 0x85, 0xbb, 0xb0, 0x29,
  0xeb, 0xdd, 0x91, 0x27, 0x9e, 0xfa, 0xc5, 0xaf, 0xc5, 0xc3, 0x53, 0xb6,
  0xe3, 0x27, 0xd3, 0x97, 0xb5, 0x4d, 0xc3, 0x31, 0x3c, 0x74, 0x6f, 0xca,
  0x36, 0x25, 0x37, 0x79, 0x09, 0xdb, 0x9e, 0x5f, 0xa2, 0x2f, 0x63, 0xfb,
  0xff, 0xc4, 0x94, 0xed, 0x56, 0xce, 0x36, 0xa9, 0x57, 0x94, 0x22, 0x1c,
  0x4b, 0xdb, 0xf6, 0x20, 0x36, 0x38, 0x67, 0x7b, 0x53, 0xca, 0xb6, 0x97,
  0xb1, 0xbd, 0x21, 0x61, 0x9b, 0x01, 0x4b, 0x37, 0xa5, 0x6c, 0xff, 0xcc,
  0x9c, 0xed, 0x9e, 0x94, 0xed, 0x9f, 0x9c, 0xb1, 0xfd, 0x0b, 0xa7, 0x6c,
  0xff, 0x92, 0xd9, 0xc8, 0xb8, 0x3d, 0x74, 0x1e, 0xf9, 0x54, 0x4a, 0x61,
  0x5e, 0xde, 0x0b, 0x63, 0xda, 0x4e, 0x60, 0xf1, 0xe2, 0xcc, 0x32, 0x0e,
  0xab, 0x34, 0x4e, 0x71, 0x2f, 0x02, 0x9d, 0x47, 0x48, 0x25, 0x92, 0x01,
  0xe7, 0xc7, 0x81, 0x1f, 0xc5, 0x6e, 0x7a, 0x5d, 0x2f, 0x86, 0x98, 0x00,
  0xd5, 0xa8, 0x06, 0x56, 0xa2, 0xe3, 0x33, 0x9d, 0xe7, 0x7e, 0x79, 0x96,
  0xd3, 0x2c, 0xea, 0x83, 0x47, 0xce, 0x56, 0x97, 0xbf, 0xac, 0xa9, 0x7e,
  0x32, 0x66, 0xb7, 0x33, 0xf7, 0x19, 0x0b, 0x87, 0x51, 0x50, 0x0c, 0x7e,
  0x0b, 0x3e, 0xd2, 0xcc, 0xb6, 0x71, 0xb3, 0x11, 0x09, 0xdb, 0x95, 0x35,
  0x2c, 0x86, 0x41, 0xc1, 0xb4, 0xbf, 0x0e, 0x88, 0x10, 0x2a, 0x7b, 0x51,
  0xa6, 0x5d, 0xe3, 0x0a, 0x1e, 0x8c, 0x1e, 0x71, 0x45, 0xad, 0x42, 0x72,
  0xc8, 0x3c, 0x03, 0x14, 0x1c, 0x4c, 0x00, 0x18, 0xc4, 0x6a, 0xda, 0x71,
  0x93, 0x24, 0x79, 0x7e, 0x94, 0x9c, 0x93, 0xea, 0x68, 0x14, 0x75, 0x44,
  0xfb, 0x71, 0xbb, 0xcd, 0xd8, 0x89, 0xfc, 0x3e, 0x36, 0x5c, 0x1b, 0xf8,
  0xd2, 0xd0, 0xcf, 0x87, 0xf3, 0x93, 0x30, 0x3e, 0x8d, 0xe8, 0xc1, 0x8b,
  0xbd, 0x3d, 0x24, 0x48, 0x5d, 0xa5, 0xb7, 0xb7, 0xa3, 0x3a, 0xdb, 0x9b,
  0x95, 0xd3, 0x7a, 0x8f, 0x4e, 0x50, 0xbf, 0x7e, 0xd5, 0x2c, 0x17, 0x9f,
  0xdd, 0x07, 0xad, 0xab, 0x75, 0x9c, 0x8b, 0x3b, 0xa9, 0xf4, 0x76, 0xd9,
  0x97, 0xb8, 0x95, 0xb9, 0x57, 0x56, 0xbd, 0x0e, 0xba, 0x1d, 0x4a, 0x55,
  0x81, 0x59, 0x95, 0xf9, 0x3f, 0xf4, 0x79, 0xa0, 0xa8, 0x52, 0xa4, 0xd0,
  0xd5, 0xef, 0x85, 0xe9, 0xd5, 0x10, 0x84, 0x07, 0xc4, 0x3d, 0x0a, 0x1a,
  0xc2, 0xb1, 0xcc, 0x1a, 0x30, 0x31, 0x39, 0x91, 0xce, 0xb1, 0x77, 0xba,
  0x50, 0x32, 0x79, 0x85, 0xad, 0xa2, 0x40, 0x67, 0x3d, 0x7d, 0x29, 0x7f,
  0x71, 0x96, 0x60, 0xa8, 0x9b, 0xa4, 0xfc, 0x43, 0x94, 0x5d, 0xff, 0xd1,
  0x5f, 0xe3, 0x96, 0xd9, 0x84, 0xbc, 0x97, 0x9c, 0x6d, 0xb7, 0x71, 0x26,
  0xf6, 0xe1, 0x5f, 0x63, 0x26, 0x28, 0xea, 0x8e, 0xf2, 0xc7, 0xd6, 0x1c,
  0xf0, 0xd8, 0xaf, 0xf1, 0xfd, 0xeb, 0x83, 0xbe, 0xcf, 0xa2, 0xf1, 0x24,
  0x9e, 0xf8, 0x05, 0x3f, 0xfc, 0xc1, 0x3a, 0xab, 0xb8, 0x06, 0xfe, 0x25,
  0xfd, 0xf7, 0x85, 0xee, 0x70, 0x5f, 0x47, 0xab, 0x0d, 0x68, 0xe1, 0x5e,
  0x33, 0xed, 0x00, 0xeb, 0xe1, 0x41, 0x19, 0xed, 0xc7, 0x0c, 0xc8, 0x2e,
  0x20, 0x42, 0x82, 0x24, 0x0c, 0x80, 0xf7, 0xa1, 0xc2, 0x90, 0x31, 0xe4,
  0x06, 0x63, 0xa0, 0x30, 0xa2, 0x85, 0x42, 0xf2, 0xbc, 0xef, 0x11, 0x43,
  0xc8, 0x10, 0x88, 0x69, 0xe5, 0x8d, 0x3a, 0x8d, 0x70, 0x8d, 0xfd, 0xda,
  0x48, 0x73, 0xb1, 0x16, 0x61, 0x5a, 0xcb, 0x7d, 0x38, 0xe9, 0xe0, 0xd9,
  0x3e, 0x72, 0xcd, 0xc4, 0xfa, 0xd1, 0xc0, 0x57, 0xba, 0x4c, 0x54, 0x31,
  0x34, 0x17, 0x0e, 0xec, 0xc0, 0x5e, 0xf1, 0x17, 0xc9, 0xd6, 0xf0, 0x43,
  0xf2, 0x62, 0x2b, 0xd8, 0xa2, 0xd3, 0x42, 0xfa, 0x4c, 0xc0, 0xe9, 0x55,
  0xa1, 0x70, 0x1a, 0xad, 0x6b, 0x7c, 0xd5, 0xe4, 0x8a, 0x00, 0x6e, 0x9c,
  0x39, 0x61, 0x31, 0xda, 0x2f, 0x83, 0x20, 0x1c, 0x3b, 0x2f, 0x58, 0x89,
  0xd2, 0xae, 0x2a, 0x24, 0x4a, 0xc8, 0x6d, 0xe3, 0x20, 0x97, 0xa1, 0x3e,
  0x31, 0x62, 0xbc, 0x24, 0x36, 0x50, 0x34, 0x73, 0x1a, 0xba, 0x5f, 0x6c,
  0x3f, 0x62, 0x8c, 0xb8, 0x2a, 0xeb, 0x3a, 0x9f, 0x18, 0x1e, 0x7d, 0x29,
  0xfc, 0xb1, 0xce, 0x38, 0x9d, 0x8a, 0x1b, 0x3b, 0xd2, 0x5e, 0xd6, 0x2e,
  0xb9, 0xac, 0x0e, 0xa1, 0x98, 0x78, 0xa5, 0x16, 0xa5, 0x5e, 0xdc, 0x4b,
  0x66, 0x76, 0xcc, 0xda, 0xae, 0x73, 0x1a, 0x9e, 0x09, 0x2e, 0x4d, 0x26,
  0x55, 0x9e, 0xcd, 0x93, 0x65, 0xc9, 0x5b, 0x0f, 0xc5, 0xab, 0xcb, 0x64,
  0x17, 0x04, 0xe4, 0x40, 0x9d, 0x89, 0x29, 0xd3, 0xb6, 0x26, 0xa0, 0x3b,
  0xe4, 0x5f, 0x23, 0xfb, 0xd1, 0xe5, 0x76, 0x57, 0x19, 0x65, 0x0e, 0x5c,

  0x67, 0x72, 0xac, 0xa9, 0xf6, 0xfb, 0xe8, 0xc9, 0x49, 0xad, 0x2c, 0x1e,
  0x30, 0xaa, 0x1d, 0x80, 0x21, 0x63, 0xf1, 0x2c, 0xe8, 0x8b, 0x89, 0xb6,
  0xf6, 0x4e, 0x5b, 0xa5, 0xde, 0xa3, 0x5f, 0x8d, 0xc7, 0x7b, 0x5e, 0xe8,
  0x9f, 0x5d, 0x07, 0xd0, 0x9f, 0x15, 0xdf, 0x4e, 0x8d, 0x0e, 0xe0, 0x37,
  0xe2, 0xf9, 0xf0, 0x73, 0x42, 0xe2, 0x7e, 0xdf, 0xd5, 0x72, 0x22, 0xa9,

  0xe5, 0x94, 0x40, 0xc7, 0xf9, 0x6a, 0x76, 0x75, 0x0d, 0x6a, 0xd1, 0x01,
  0xec, 0xe1, 0xc7, 0x86, 0x3f, 0x04, 0x22, 0xde, 0xa5, 0xcb, 0xb7, 0x12,
  0xe4, 0x5d, 0x7e, 0x3c, 0x9d, 0x95, 0xcb, 0x8e, 0x47, 0x41, 0x08, 0xbb,
  0xc8, 0x53, 0x9a, 0x41, 0x28, 0x93, 0x09, 0xb7, 0xb8, 0x3f, 0x37, 0xde,
  0xe8, 0x7c, 0x5e, 0xac, 0xde, 0x21, 0x0d, 0x92, 0x83, 0x35, 0x1e, 0x25,
  0xc6, 0x0d, 0x05, 0xe6, 0xfc, 0xb3, 0xa0, 0x73, 0x9c, 0xd4, 0x4e, 0x08,
  0xe3, 0xb4, 0xd9, 0x0b, 0xd7, 0x79, 0x6a, 0x75, 0x28, 0xf7, 0x2d, 0xde,
  0x51, 0xf7, 0xa9, 0xbe, 0x38, 0x1c, 0x23, 0xb4, 0x44, 0x2a, 0x3b, 0xdf,


  0x8f, 0xc7, 0x61, 0x8a, 0x7c, 0x61, 0x8c, 0x93, 0xf2, 0xb2, 0xc8, 0xff,
  0x21, 0x2d, 0x7d, 0xba, 0x99, 0xad, 0xad, 0x1a, 0x85, 0x76, 0x40, 0x9e,
  0x12, 0x25, 0x42, 0xfe, 0x46, 0x4e, 0x6d, 0x11, 0x3b, 0x48, 0x08, 0x23,
  0xc8, 0x23, 0x97, 0x0c, 0x48, 0x71, 0x06, 0xee, 0xdb, 0xd2, 0x4a, 0x7a,
  0x50, 0x7c, 0x95, 0xcf, 0x42, 0x45, 0x92, 0xf6, 0x40, 0xb0, 0x4a, 0xe2,
  0x2a, 0x52, 0xf6, 0x33, 0x0a, 0x0a, 0x88, 0x83, 0xfe, 0xac, 0x92, 0x82,
  0xb6, 0x82, 0xea, 0xc1, 0xa1, 0x65, 0xb7, 0xcc, 0x41, 0xa3, 0x30, 0x66,
  0xe2, 0x9c, 0xae, 0xb3, 0x98, 0x78, 0xb1, 0x71, 0x08, 0xb4, 0x6c, 0x78,
  0x00, 0x26, 0x9a, 0x55, 0x3d, 0x03, 0xf1, 0x12, 0x41, 0x44, 0xb3, 0xa3,
  0x3f, 0x00, 0x0a, 0x8d, 0xdc, 0xf8, 0x0a, 0x64, 0x2d, 0x53, 0x46, 0x7b,
  0x07, 0xee, 0x1a, 0x9a, 0x31, 0x7e, 0x19, 0x4d, 0xcb, 0x5d, 0x49, 0xbe,
  0xb0, 0xd1, 0xc6, 0x83, 0xab, 0x54, 0x14, 0xf7, 0x89, 0x16, 0xed, 0x35,
  0xbc, 0xb7, 0xf4, 0xf6, 0x88, 0xd0, 0xba, 0xa8, 0xa8, 0xca, 0x02, 0x29,

  0x91, 0x25, 0x8f, 0xea, 0x3d, 0xa5, 0x89, 0x2e, 0x69, 0x39, 0x50, 0x71,
  0x3b, 0x45, 0xce, 0x12, 0x11, 0x1f, 0xbf, 0x6d, 0x96, 0xd5, 0x96, 0x61,
  0x0c, 0x59, 0x19, 0x90, 0x96, 0x20, 0x99, 0x40, 0x0d, 0x58, 0x1b, 0xa3,
  0x8c, 0xc0, 0x46, 0xb9, 0xb4, 0xc8, 0x9e, 0xc9, 0x80, 0xb8, 0x0f, 0xb3,
  0x5c, 0xf1, 0xd4, 0x0d, 0x57, 0xca, 0x65, 0xbb, 0x8b, 0xbd, 0x93, 0x41,
  0x7a, 0x74, 0xf9, 0x5f, 0xa1, 0x12, 0xe5, 0xe7, 0x14, 0xa2, 0xfc, 0xca,

  0x95, 0x28, 0x9e, 0xa4, 0x20, 0xb1, 0x13, 0xca, 0x09, 0xa4, 0x45, 0x91,
  0x4b, 0x86, 0xf3, 0xa0, 0x6e, 0x52, 0xdb, 0xee, 0x02, 0x6f, 0x75, 0x86,
  0x8b, 0xde, 0xa4, 0x76, 0x8e, 0xac, 0xc7, 0x41, 0x94, 0x3f, 0x72, 0x0a,
  0x3c, 0x35, 0xda, 0x8a, 0xc0, 0xc2, 0x60, 0x02, 0x54, 0x32, 0x3e, 0xcb,
  0x04, 0xcf, 0xe9, 0x0f, 0xae, 0xdb, 0xc4, 0xaf, 0x6d, 0x80, 0x1d, 0x18,
  0xde, 0xfc, 0xd2, 0x93, 0xc7, 0x7f, 0x8a, 0x08, 0xe4, 0xc0, 0x69, 0xc9,
  0x75, 0x6d, 0xf4, 0x6a, 0x1b, 0x35, 0x31, 0xc2, 0xf4, 0xe2, 0x17, 0x06,
  0xcd, 0x2d, 0x19, 0x19, 0x4f, 0xd8, 0x1b, 0xa5, 0xc5, 0xd1, 0xcb, 0x3d,
  0x0c, 0x4e, 0x70, 0x39, 0xd5, 0x20, 0x36, 0xfc, 0x7c, 0x92, 0x35, 0x37,
  0xa4, 0xc5, 0x61, 0x37, 0x74, 0x1b, 0x3d, 0x1e, 0x60, 0xf9, 0x61, 0x6f,
  0xbe, 0xcb, 0x40, 0x00, 0x51, 0x89, 0xa3, 0x30, 0xe8, 0xab, 0xf5, 0x8c,
  0x68, 0x5c, 0x37, 0xb8, 0x7e, 0xb1, 0xf6, 0x31, 0x2e, 0x44, 0xcd, 0xdf,
  0xa7, 0x7d, 0xf1, 0x72, 0x71, 0x5b, 0x15, 0x43, 0x9a, 0xb9, 0x24, 0x0f,
  0xfa, 0x3e, 0x7e, 0x7b, 0x8d, 0xe5, 0xda, 0xc6, 0xbc, 0x9f, 0x6d, 0x36,
  0xa7, 0x87, 0xef, 0xe9, 0x59, 0x83, 0x0e, 0x18, 0x9d, 0x2b, 0x90, 0x8b,
  0x85, 0x86, 0x7b, 0xb9, 0x0c, 0xbb, 0x72, 0xe4, 0xb7, 0xe9, 0xca, 0xfc,
  0x8c, 0x42, 0x82, 0x00, 0x20, 0x9d, 0x65, 0xb1, 0xbc, 0x84, 0xce, 0xe6,
  0x77, 0xe2, 0xe2, 0x38, 0x9f, 0x10, 0x9a, 0xdd, 0x1a, 0x67, 0xb1, 0x96,
  0x1a, 0xb5, 0x20, 0xfd, 0xa8, 0x7b, 0x4a, 0x83, 0xe0, 0x12, 0x6c, 0xf1,
  0x29, 0x4d, 0x10, 0x8c, 0x0b, 0x29, 0xdf, 0x0c, 0xe1, 0x8e, 0x5b, 0x6b,
  0x0c, 0xbb, 0x6d, 0x5f, 0x30, 0xfa, 0x1d, 0xea, 0xb1, 0xba, 0xf3, 0x97,
  0x1c, 0x3e, 0x6d, 0xb3, 0xd6, 0x72, 0xf2, 0x40, 0x96, 0x85, 0x2e, 0x33,
  0x01, 0x0b, 0xd2, 0x57, 0x04, 0x32, 0x57, 0x3e, 0x60, 0xdb, 0x51, 0xf6,
  0x45, 0x26, 0x63, 0x39, 0x1c, 0xad, 0x5b, 0x2b, 0xb1, 0x87, 0x48, 0x6c,
  0x6e, 0x67, 0x4c, 0x75, 0x11, 0xe3, 0xd7, 0x67, 0xbb, 0xc9, 0x59, 0x27,

  0xac, 0x80, 0xa2, 0x24, 0x12, 0xa6, 0x3e, 0x23, 0x96, 0xf6, 0x5f, 0x8c,
  0x89, 0xd8, 0xef, 0x82, 0xce, 0xe5, 0x92, 0x59, 0xe4, 0x4f, 0x84, 0x7e,

  0x7f, 0x71, 0xc6, 0xd4, 0x59, 0xcb, 0x2b, 0x14, 0x69, 0x30, 0x28, 0x88,


  0x98, 0x94, 0xfe, 0x2d, 0x35, 0x26, 0x74, 0x49, 0xa5, 0x76, 0xdc, 0x70,
  0x47, 0x9c, 0xf2, 0xea, 0x4c, 0x5f, 0x04, 0xa9, 0x8e, 0x0c, 0x8a, 0xa3,
  0x99, 0xe7, 0x1e, 0xfc, 0x91, 0xb4, 0xbe, 0xab, 0x59, 0x2e, 0x75, 0xa0,
  0xe9, 0x69, 0x15, 0x97, 0x59, 0x11, 0x76, 0xba, 0xc0, 0x47, 0x49, 0x90,
  0x0b, 0x51, 0xcf, 0x46, 0x5d, 0x94, 0x75, 0x2f, 0x6c, 0x20, 0x93, 0xcb,
  0x4b, 0x87, 0xce, 0xdd, 0x87, 0xc8, 0x48, 0x26, 0xff, 0x04, 0x05, 0x80,
  0x9f, 0x88, 0x27, 0x5e, 0x52, 0xa0, 0xa6, 0x81, 0x8c, 0x5b, 0xdd, 0xd1,
  0x76, 0x98, 0x07, 0xeb, 0xfa, 0xea, 0xd0, 0x70, 0x8e, 0xc3, 0xd1, 0xe7,
  0x30, 0x51, 0x8c, 0xb0, 0x8e, 0xc0, 0xb7, 0x72, 0xee, 0x88, 0xb4, 0xc8,
  0xec, 0x8c, 0x26, 0x5a, 0xf8, 0xc8, 0x29, 0xfe, 0xc3, 0xff, 0x4e, 0x94,
  0xf6, 0xf7, 0x75, 0x18, 0xbf, 0xdb, 0x01, 0x41, 0xbd, 0x05, 0xf6, 0x22,
  0xb5, 0x60, 0x41, 0xa6, 0xc1, 0x24, 0x6f, 0x00, 0xa3, 0xae, 0x36, 0x64,
  0xfb, 0x62, 0xbe, 0xe5, 0x92, 0xe7, 0x04, 0xaf, 0x45, 0x6b, 0xe2, 0x8d,
  0x0a, 0xfe, 0xdf, 0xe9, 0x5b, 0x3a, 0x00, 0xd7, 0x26, 0x21, 0x1b, 0xe2,
  0xcf, 0x47, 0x6f, 0x4f, 0xcf, 0x8f, 0xda, 0xf5, 0x8a, 0x0d, 0x1a, 0x3e,

  0x21, 0xd8, 0xdf, 0x9d, 0x1d, 0x50, 0xd0, 0x5c, 0x23, 0xd1, 0xbc, 0xc8,
  0xc9, 0xe8, 0x4f, 0xce, 0xbe, 0x7b, 0x63, 0x27, 0x97, 0x83, 0x69, 0x62,
  0x52, 0x3a, 0xe2, 0x40, 0xf7, 0xb9, 0x2b, 0xda, 0x49, 0x09, 0xa0, 0x06,
  0x44, 0xd2, 0xd0, 0xd8, 0x4e, 0x0f, 0x49, 0x16, 0x9c, 0x1a, 0xa3, 0xa5,
  0xfa, 0xc0, 0xdc, 0xae, 0x6b, 0x2a, 0xbd, 0xb7, 0xc3, 0x06, 0x7a, 0x2f,
  0x44, 0x3f, 0xd0, 0xa6, 0xc4, 0x16, 0x25, 0xa4, 0x31, 0x82, 0x1f, 0x1b,
  0x25, 0xf6, 0x23, 0xee, 0x2b, 0x40, 0x10, 0xe4, 0x6c, 0x20, 0x7c, 0x25,
  0xc6, 0xb0, 0xa9, 0xd7, 0x36, 0xc7, 0x41, 0x58, 0xde, 0x91, 0xc3, 0x85,
  0x68, 0xd6, 0xf6, 0x3a, 0x1a, 0x30, 0x32, 0x9c, 0x84, 0x7b, 0xfc, 0x7d,
  0x8c, 0x44, 0xc8, 0xcd, 0x67, 0x77, 0xea, 0xdd, 0x81, 0x37, 0x53, 0xbb,
  0x6d, 0x32, 0xe1, 0xed, 0x3f, 0x6c, 0x27, 0x52, 0x10, 0x02, 0x86, 0xc7,
  0x0d, 0x6a, 0x7a, 0x7a, 0x1c, 0xba, 0x9e, 0x57, 0xbb, 0xf7, 0xe5, 0x6f,
  0xe9, 0xa2, 0xfb, 0xeb, 0xb1, 0x25, 0x74, 0x27, 0x49, 0x3d, 0x68, 0x3e,
  0xb9, 0x66, 0x80, 0x4b, 0xb0, 0x0e, 0x11, 0xa7, 0x3a, 0x0e, 0x33, 0x96,
  0xb0, 0xf8, 0xa2, 0x21, 0xd8, 0x05, 0xd7, 0x07, 0x47, 0x19, 0x0e, 0x22,
  0x66, 0x8a, 0x74, 0xce, 0xb1, 0x08, 0xa2, 0xee, 0xfa, 0xae, 0x68, 0xe8,
  0xa2, 0x32, 0x4f, 0x99, 0x96, 0x55, 0xbc, 0x00, 0x0c, 0xc4, 0xe4, 0x68,
  0xb7, 0x06, 0xd6, 0xc4, 0xf3, 0x27, 0xcf, 0x49, 0xb8, 0x23, 0x47, 0x49,

  0xfa, 0x40, 0x09, 0x22, 0x30, 0xe2, 0xa7, 0x3c, 0xe7, 0x28, 0x72, 0x88,


  0x8c, 0x23, 0x9d, 0x7b, 0x27, 0xd9, 0x82, 0x3b, 0x4f, 0x8d, 0xbd, 0x21,


  0x42, 0x30, 0xa5, 0xbe, 0x13, 0x23, 0x8c, 0x3e, 0x43, 0x3b, 0x79, 0xfd,


  0x29, 0xd9, 0xf9, 0x77, 0x6e, 0xd3, 0xe7, 0xaa, 0xe3, 0x39, 0xf8, 0x9b,
  0x17, 0xeb, 0x80, 0xf2, 0xd1, 0x6a, 0x3d, 0x6f, 0xed, 0x29, 0xb6, 0x1c,
  0xcb, 0x9b, 0xc4, 0x8a, 0xf2, 0xea, 0xa6, 0x5c, 0x91, 0xd2, 0x06, 0xf8,
  0x84, 0x48, 0xa7, 0x50, 0x73, 0x58, 0x0f, 0x4e, 0xf2, 0x69, 0x97, 0x2d,
  0x84, 0x12, 0x91, 0x76, 0x02, 0x20, 0xca, 0xe2, 0x6e, 0x55, 0xe5, 0x6a,
  0x94, 0x7c, 0x28, 0x90, 0x89, 0x27, 0x64, 0x27, 0x62, 0x22, 0x2f, 0xcc,
  0x0e, 0x18, 0x9a, 0x26, 0x28, 0x8f, 0x08, 0x13, 0x02, 0x9f, 0xf3, 0xef,
  0x9d, 0xb0, 0xc9, 0x4e, 0x88, 0x14, 0xf7, 0xd6, 0x62, 0x5e, 0x0b, 0xdf,
  0x7a, 0x1b, 0xf6, 0x54, 0xe3, 0x9e, 0x50, 0x44, 0xea, 0x66, 0x39, 0x18,


  0x9b, 0x42, 0xe0, 0xd9, 0x62, 0x31, 0x64, 0xd0, 0x6d, 0x02, 0x21, 0x26,
  0xe5, 0x9e, 0x8b, 0xa4, 0x91, 0xc0, 0xe6, 0x97, 0xe0, 0x07, 0x92, 0x05,
  0xb5, 0xde, 0x23, 0xd4, 0x00, 0x29, 0xd8, 0x88, 0xa4, 0xbd, 0x6b, 0x64,
  0x8d, 0x0a, 0xf7, 0x9c, 0x3f, 0x04, 0xbb, 0xf3, 0x77, 0xe5, 0xa7, 0xb1,
  0x2e, 0x48, 0x21, 0x8c, 0xe5, 0xf4, 0xea, 0xb2, 0x5a, 0x71, 0x27, 0xb6,
  0x58, 0x9b, 0x38, 0x4f, 0xeb, 0xe6, 0x27, 0x95, 0x24, 0xea, 0xac, 0xe1,
  0xa9, 0xf0, 0xab, 0xc7, 0x6f, 0x5a, 0x1d, 0x9d, 0x69, 0x27, 0x50, 0xe7,
  0x16, 0x1f, 0x4e, 0xfa, 0x68, 0xda, 0x56, 0xeb, 0x4e, 0x72, 0xd8, 0xd1,
  0x9c, 0x89, 0x31, 0xb9, 0x73, 0xbf, 0x89, 0x0f, 0x27, 0x63, 0xb0, 0xa6,
  0xca, 0x23, 0xe8, 0xb0, 0xa0, 0x15, 0xed, 0x39, 0x4e, 0xd4, 0x70, 0x99,
  0x55, 0xf6, 0x23, 0x61, 0x92, 0xe4, 0xd5, 0xb2, 0x9c, 0x51, 0x51, 0x57,
  0x76, 0xef, 0x5e, 0xd0, 0x83, 0xba, 0x17, 0x52, 0x0b, 0x57, 0xfb, 0xeb,
  0xc2, 0x20, 0x86, 0x4a, 0x89, 0xf2, 0x04, 0xdf, 0x33, 0x3e, 0x9c, 0x5b,
  0xa8, 0x76, 0x46, 0xcc, 0xf8, 0x65, 0x7f, 0x09, 0x45, 0x52, 0x4e, 0x1b,

  0x6f, 0x05, 0xf4, 0x40, 0x7c, 0x38, 0x66, 0xac, 0x91, 0x95, 0x51, 0x81,
  0x14, 0x2c, 0xca, 0xfb, 0x56, 0x46, 0x0f, 0x06, 0xa7, 0x6c, 0x7e, 0xc8,
  0xec, 0xba, 0x73, 0xc4, 0x7c, 0x38, 0xf1, 0xe1, 0xda, 0x07, 0xac, 0x27,
  0x8c, 0x39, 0xc4, 0x0e, 0x58, 0x30, 0x8f, 0x43, 0x0d, 0xcb, 0xd9, 0xc7,
  0xbc, 0x3b, 0xf6, 0xc1, 0xde, 0x03, 0x96, 0x6f, 0x04, 0xbb, 0xb0, 0x28,
  0x8c, 0x76, 0xb7, 0xae, 0xa6, 0xd9, 0x47, 0xcc, 0xad, 0x49, 0xab, 0xcb,

  0xac, 0xf9, 0xb8, 0x79, 0x43, 0x16, 0x82, 0xa6, 0x70, 0xb7, 0x44, 0x6b,
  0x63, 0xcb, 0x2b, 0x04, 0x8d, 0x34, 0x15, 0x74, 0x01, 0xa3, 0xe0, 0x71,
  0xfb, 0xe8, 0xa6, 0x7f, 0x43, 0xbc, 0xef, 0x71, 0x83, 0x04, 0x36, 0xcc,
  0x56, 0x65, 0x5e, 0xb0, 0xbf, 0x4c, 0x79, 0x8c, 0x37, 0xc7, 0x18, 0xf2,
  0xd2, 0xa6, 0x70, 0xd5, 0xf2, 0x13, 0x95, 0x58, 0x59, 0x25, 0xe0, 0x63,
  0xa4, 0x99, 0x84, 0xb7, 0x38, 0x7e, 0x5a, 0x4f, 0x9b, 0x97, 0x24, 0x25,
  0x84, 0xb6, 0x01, 0xa6, 0x7f, 0xd0, 0x54, 0x54, 0xdc, 0x33, 0x1b, 0xff,
  0x83, 0xf6, 0x46, 0x76, 0x67, 0xb7, 0xba, 0x99, 0x59, 0x20, 0x9b, 0x1b,
  0x77, 0x81, 0x54, 0xb4, 0x23, 0xb3, 0x59, 0x9b, 0xcc, 0x52, 0x06, 0x13,
  0x0f, 0x36, 0x57, 0xc4, 0xe4, 0xde, 0x4f, 0x17, 0x4d, 0xa8, 0xff, 0x04,
  0x1f, 0xaf, 0xd0, 0x2d, 0x57, 0x76, 0x57, 0x0e, 0xa3, 0x7f, 0x6b, 0xe4,
  0x69, 0x37, 0x45, 0xe6, 0xee, 0x96, 0xfe, 0xcb, 0x2a, 0xb2, 0x47, 0x1b,
  0xd8, 0x9d, 0x7c, 0xb6, 0xcb, 0xf0, 0x66, 0x19, 0xb9, 0x65, 0x99, 0x12,
  0x90, 0xb3, 0x75, 0xff, 0xbd, 0xe2, 0x99, 0xf7, 0xee, 0x71, 0xb5, 0xbc,
  0xe7, 0x8a, 0x9b, 0x07, 0xdc, 0xaa, 0x18, 0x89, 0xc3, 0xae, 0x2a, 0xb8,
  0x95, 0xd2, 0x4c, 0xb7, 0x67, 0xe7, 0xfb, 0x66, 0xd0, 0xa2, 0xc1, 0xfe,
  0x99, 0xc8, 0x93, 0xd1, 0xe9, 0xb8, 0xcd, 0x35, 0xa7, 0x5b, 0xdd, 0xb9,

  0x99, 0xc5, 0x87, 0x93, 0xe9, 0xba, 0xb7, 0x64, 0x7b, 0x06, 0x9e, 0xef,
  0x92, 0x3b, 0x4f, 0x18, 0xb3, 0x31, 0xa4, 0x0d, 0xbd, 0xde, 0x3f, 0x89,
  0x3d, 0x90, 0x7d, 0xbe, 0x28, 0x7c, 0x8b, 0x9c, 0xbe, 0x68, 0x24, 0xef,
  0x86, 0x52, 0x16, 0x2f, 0x62, 0x6d, 0x8f, 0x9b, 0xfb, 0x97, 0x22, 0xee,
  0x8a, 0x84, 0x3c, 0x24, 0xaa, 0xa2, 0x73, 0x91, 0x28, 0xa9, 0x00, 0x8c,
  0x9b, 0x51, 0x4f, 0x88, 0x30, 0x6f, 0x3e, 0xe1, 0x6f, 0x26, 0x9c, 0xb7,
  0x85, 0x6d, 0x45, 0xec, 0x50, 0xd4, 0x10, 0xed, 0x8f, 0x5a, 0x67, 0x62,
  0x27, 0xc8, 0xe3, 0xdc, 0x66, 0x22, 0x6c, 0x0a, 0xdb, 0x49, 0x9e, 0xab,
  0x47, 0x9e, 0x1b, 0x82, 0x73, 0x45, 0xb2, 0xcb, 0x99, 0xdf, 0x62, 0xd9,
  0x5b, 0x7e, 0x35, 0xe0, 0x2d, 0xb8, 0x34, 0x8b, 0xc7, 0x1f, 0xd1, 0x22,
  0x91, 0x44, 0x0d, 0x49, 0xa0, 0x1e, 0xec, 0x26, 0xe7, 0x12, 0xda, 0x24,
  0xa5, 0xee, 0xae, 0xc1, 0x04, 0xcd, 0x00, 0x3b, 0xf9, 0xc8, 0x08, 0x43,
  0x2e, 0x0a, 0x20, 0x05, 0x89, 0xe0, 0xdb, 0x63, 0x81, 0xe2, 0x5d, 0x8d,
  0x14, 0x2b, 0x04, 0xd8, 0xde, 0xc1, 0xe8, 0x60, 0x90, 0x58, 0xdb, 0xd3,
  0xd3, 0x9d, 0x91, 0xbc, 0x28, 0xd0, 0xd1, 0xf4, 0xe9, 0xae, 0x9f, 0xe1,
  0x9c, 0x3e, 0x5c, 0x87, 0x5e, 0x61, 0xb8, 0x96, 0x9d, 0xc1, 0x72, 0x93,
  0xde, 0x85, 0x8a, 0xe9, 0xfe, 0xf0, 0xf1, 0xf3, 0xe7, 0x2d, 0x79, 0x5e,

  0x7b, 0xd0, 0xdb, 0x4f, 0xf6, 0xf7, 0xb1, 0xb6, 0xa0, 0x26, 0xda, 0xfc,
  0x62, 0xf8, 0x1c, 0x2f, 0xb6, 0x5f, 0xab, 0x33, 0x73, 0x04, 0xb3, 0xfe,
  0xf7, 0x86, 0xf4, 0x9b, 0xc8, 0xe7, 0xe0, 0x4f, 0xe9, 0x7d, 0xeb, 0x39,
  0x7d, 0x2e, 0xf2, 0x16, 0x1e, 0xe6, 0x6d, 0x2c, 0xe7, 0x73, 0xf2, 0x64,
  0xd1, 0x93, 0x8a, 0xcc, 0x73, 0x93, 0x56, 0xb3, 0x70, 0xb9, 0xfb, 0x83,


  0xe1, 0x41, 0xdf, 0x72, 0x11, 0x4d, 0x46, 0x02, 0x1c, 0x9d, 0x27, 0x19,
  0x8a, 0xc6, 0x00, 0xe1, 0x02, 0xa1, 0xee, 0x40, 0x07, 0x66, 0x46, 0x07,
  0xcf, 0x9f, 0x0f, 0x68, 0x66, 0x4f, 0x9e, 0x3f, 0xef, 0x2d, 0x08, 0xf7,
  0x3e, 0x73, 0x53, 0x3a, 0xf7, 0x13, 0xbd, 0xee, 0x88, 0xa6, 0x26, 0x3b,
  0x27, 0xfe, 0x1d, 0xfa, 0xcd, 0x17, 0xc9, 0xfb, 0xd3, 0x8b, 0x23, 0xcf,
  0x31, 0x83, 0xeb, 0xc5, 0x11, 0x43, 0x2f, 0x45, 0x14, 0x21, 0xd8, 0x15,
  0x3a, 0x3f, 0xc1, 0xf0, 0x25, 0x9b, 0x24, 0x34, 0x26, 0x51, 0xac, 0xa2,
  0x3e, 0xc1, 0x7f, 0x0b, 0x33, 0x22, 0xc8, 0x38, 0x9e, 0xe5, 0x97, 0x79,
  0xe3, 0xc3, 0x36, 0xed, 0x98, 0xd3, 0xde, 0x85, 0x8b, 0x83, 0x13, 0xdd,
  0x24, 0x9a, 0xb2, 0x5d, 0x53, 0x79, 0x07, 0x67, 0xc2, 0x6e, 0x93, 0x35,
  0xb5, 0x1d, 0x14, 0x58, 0x64, 0x8b, 0x59, 0xad, 0x82, 0x90, 0x1f, 0x1f,
  0xe2, 0x41, 0xb9, 0x2d, 0x30, 0x57, 0xb9, 0xaf, 0x74, 0x0a, 0x50, 0x4b,
  0xfe, 0x74, 0x7f, 0x3c, 0x05, 0xee, 0x2c, 0x24, 0x62, 0x68, 0x61, 0x16,
  0x8d, 0xe3, 0xa7, 0xca, 0x6e, 0xd7, 0xce, 0xe5, 0x69, 0xbd, 0x73, 0x05,
  0x9d, 0x43, 0x80, 0x47, 0xc8, 0x4e, 0xfc, 0x59, 0xb6, 0xd2, 0x94, 0xd2,
  0xa2, 0x3d, 0x8e, 0xa1, 0xe5, 0x79, 0x7e, 0xb9, 0xae, 0xe2, 0xe9, 0x97,
  0x7f, 0x71, 0x65, 0x42, 0x0a, 0x32, 0x9f, 0xde, 0xa4, 0x5a, 0x9e, 0x84,
  0xbe, 0x00, 0x7a, 0xaf, 0xd5, 0x08, 0xd6, 0x72, 0x20, 0xb4, 0x00, 0x08,
  0x2c, 0x69, 0xf2, 0x4e, 0xcc, 0x8d, 0x26, 0x43, 0x4e, 0x02, 0x6d, 0x15,
  0x08, 0xb7, 0x9e, 0x74, 0x83, 0x93, 0x0c, 0x1b, 0x71, 0x21, 0xd2, 0x79,
  0x93, 0x38, 0x4d, 0x65, 0x0b, 0xc2, 0x9c, 0xba, 0xed, 0x85, 0xf3, 0xdd,
  0xd3, 0x93, 0xf0, 0xb6, 0x5c, 0x95, 0x5e, 0x4f, 0x89, 0x10, 0xb4, 0x41,
  0x40, 0x69, 0xc0, 0x7d, 0xf8, 0x88, 0x66, 0x46, 0x85, 0x5e, 0x94, 0x29,
  0x1d, 0xa3, 0x7a, 0x4e, 0x38, 0x9a, 0xce, 0xda, 0x01, 0x23, 0x8e, 0xe9,
  0xd9, 0x06, 0x59, 0x1d, 0x74, 0xd4, 0x72, 0xca, 0x84, 0xe5, 0xed, 0x40,
  0x45, 0x40, 0xa4, 0x9e, 0x1b, 0x84, 0xf9, 0x94, 0xf9, 0x08, 0x23, 0x64,
  0xec, 0x8e, 0x92, 0xd0, 0xec, 0x25, 0x82, 0xe7, 0xd3, 0xb2, 0x9d, 0x11,
  0xd0, 0x63, 0x91, 0x84, 0x24, 0x4d, 0x58, 0xc5, 0xf1, 0xf8, 0xf8, 0xff,
  0x39, 0xfa, 0x35, 0xa3, 0x4e, 0x55, 0x7a, 0x63, 0x0b, 0x07, 0xbf, 0x63,
  0xc0, 0x4a, 0x89, 0x06, 0x59, 0xa4, 0x8a, 0x74, 0x21, 0x46, 0x3c, 0x35,
  0xa3, 0x87, 0xf4, 0x40, 0x5c, 0x51, 0x5a, 0xa8, 0x1a, 0xc2, 0x0a, 0x69,
  0x9b, 0xbc, 0x66, 0x04, 0xaf, 0xa0, 0x4e, 0x43, 0x24, 0xa3, 0xa3, 0xe4,
  0x8b, 0x9d, 0x80, 0x7c, 0x90, 0x4b, 0xb8, 0x12, 0x61, 0xd9, 0x93, 0xb7,
  0x97, 0x11, 0xa5, 0xc2, 0x70, 0x01, 0x20, 0x11, 0x69, 0x52, 0x66, 0xae,
  0xf7, 0xf4, 0xb0, 0xf3, 0x2b, 0xed, 0x33, 0x06, 0xf0, 0xa7, 0x00, 0x55,
  0x95, 0xbc, 0xfc, 0x70, 0x7e, 0xd2, 0x53, 0x2e, 0x39, 0xc6, 0x19, 0xd0,
  0x66, 0x6d, 0x9d, 0x67, 0x40, 0x33, 0xab, 0x92, 0xb3, 0xf4, 0x32, 0xdb,
  0xf2, 0x01, 0xe4, 0x54, 0x55, 0xc4, 0xf2, 0xc5, 0xff, 0x10, 0x73, 0xa7,
  0xf8, 0x6d, 0x1a, 0x88, 0x89, 0xbb, 0xb0, 0xb0, 0x5f, 0xe3, 0x38, 0x5f,
  0xa4, 0xb2, 0x77, 0xeb, 0x8a, 0x02, 0xfa, 0xd8, 0xf9, 0x48, 0xeb, 0x21,
  0x7e, 0xbd, 0x8d, 0xfa, 0xe9, 0x32, 0x4c, 0x29, 0x12, 0x84, 0x46, 0xdc,
  0x5b, 0x7f, 0x24, 0xf7, 0xfb, 0x96, 0x87, 0x74, 0x39, 0xcc, 0xc2, 0x20,
  0x9b, 0x6e, 0x05, 0x63, 0x14, 0x5a, 0x57, 0x14, 0xbb, 0xf2, 0x5b, 0xee,
  0xfb, 0x5a, 0x2e, 0xd8, 0xaa, 0xca, 0x08, 0x8f, 0x17, 0x19, 0xbc, 0x41,
  0x6b, 0x29, 0x4e, 0x3b, 0x66, 0x08, 0x56, 0xb2, 0xff, 0x4e, 0x64, 0x7e,
  0x2f, 0x24, 0xd2, 0xc2, 0x6a, 0x90, 0x9d, 0x9a, 0xc4, 0xa9, 0x79, 0xe2,

  0x93, 0x2c, 0xb6, 0xd8, 0x74, 0x41, 0x0d, 0x54, 0xd8, 0xfb, 0x25, 0xa1,
  0xf7, 0x59, 0x49, 0x3d, 0x37, 0xd0, 0xa3, 0xbb, 0xb0, 0xfe, 0xe4, 0xd6,
  0xc9, 0xfe, 0xea, 0x50, 0x87, 0x2e, 0x00, 0xf4, 0x6a, 0x20, 0x5d, 0x81,
  0x86, 0x86, 0x3a, 0x0a, 0xa9, 0x84, 0xf7, 0x8e, 0xd5, 0xa3, 0xbd, 0xff,
  0xf4, 0x1a, 0x4d, 0x78, 0xcd, 0x22, 0x7a, 0x10, 0x73, 0xbd, 0xe9, 0x36,
  0xa8, 0x52, 0x01, 0xc1, 0x04, 0xcd, 0x2a, 0x5c, 0xc1, 0xac, 0x48, 0xcb,
  0xa8, 0x3b, 0x7f, 0xe8, 0x94, 0xa6, 0xd7, 0x5c, 0xb9, 0x39, 0x7c, 0x93,
  0x1b, 0x19, 0x52, 0x33, 0x00, 0x11, 0x94, 0x5c, 0xae, 0x3d, 0xd4, 0x6b,
  0x08, 0xdf, 0x48, 0x16, 0xa4, 0x2b, 0x70, 0x94, 0x04, 0x89, 0xcf, 0xf6,
  0x1d, 0x1b, 0xb2, 0x31, 0x14, 0x71, 0xaf, 0xb3, 0xd8, 0x53, 0x18, 0x52,
  0xe7, 0xaf, 0x90, 0x9e, 0xe1, 0xdc, 0xc3, 0x80, 0x6f, 0x87, 0x91, 0x08,
  0x91, 0xdd, 0x51, 0x58, 0x20, 0x64, 0xcd, 0x38, 0xbc, 0x1e, 0xe9, 0xd9,
  0x13, 0x98, 0x9a, 0xb6, 0x5b, 0x32, 0x4b, 0xa5, 0x80, 0xc4, 0x28, 0x2f,
  0xc5, 0x36, 0x4e, 0xe1, 0xd8, 0x09, 0x83, 0xf0, 0x71, 0x69, 0xea, 0xd4,
  0x0c, 0x6c, 0xe3, 0xe6, 0xda, 0x0b, 0x56, 0x7a, 0xbe, 0xc4, 0x05, 0xee,

  0x5d, 0x6b, 0x55, 0x48, 0x1a, 0xf5, 0x09, 0x8f, 0x62, 0x03, 0x45, 0x29,
  0x08, 0x2f, 0xb1, 0x10, 0x3a, 0xf2, 0x77, 0xcc, 0x13, 0x9e, 0x0c, 0xe4,
  0x7c, 0x8d, 0xe4, 0xf7, 0x43, 0xd7, 0x79, 0x63, 0xe7, 0x2e, 0x33, 0xfa,
  0xb5, 0x05, 0xd5, 0x52, 0x43, 0x2a, 0x52, 0xfd, 0x99, 0x70, 0x37, 0xc9,
  0xba, 0x55, 0x98, 0x02, 0x13, 0xc4, 0x8b, 0x2c, 0xf2, 0x96, 0x1b, 0x2d,
  0x00, 0x89, 0x96, 0x45, 0x76, 0x4b, 0x18, 0xe0, 0xfd, 0xc3, 0x85, 0x4a,
  0xf6, 0x77, 0xaf, 0xce, 0xdf, 0x1f, 0xbf, 0xff, 0xea, 0x45, 0x72, 0x74,
  0x9b, 0x55, 0x53, 0xea, 0x7b, 0xfc, 0xb7, 0xf5, 0x2c, 0x9f, 0x82, 0x4d,
  0x48, 0x3f, 0x59, 0x3f, 0xe4, 0x6d, 0xac, 0x80, 0x4c, 0xfc, 0xab, 0x24,
  0x70, 0x83, 0x42, 0x18, 0xc9, 0xe5, 0x25, 0xe0, 0x08, 0x63, 0x45, 0x95,
  0x97, 0x6b, 0x8f, 0x7c, 0xa6, 0xdc, 0xe7, 0x0e, 0xb1, 0x00, 0xc4, 0x48,
  0xaf, 0x64, 0xaf, 0xc9, 0xe9, 0x9a, 0xbc, 0x39, 0x39, 0x09, 0xa1, 0x7c,
  0x39, 0x81, 0x94, 0x2d, 0x47, 0x94, 0xfa, 0x62, 0x08, 0x9b, 0x6f, 0x4a,
  0xb1, 0x3c, 0x23, 0xfe, 0xb9, 0xcb, 0x9d, 0xc7, 0xf0, 0x00, 0x06, 0xf6,
  0x5d, 0x98, 0xc9, 0x89, 0x34, 0x63, 0x24, 0x07, 0xe2, 0x84, 0xf3, 0x6a,
  0x06, 0x5b, 0xc8, 0x70, 0xc8, 0x72, 0xde, 0x90, 0x7e, 0xd4, 0x92, 0xa4,
  0xed, 0x2e, 0x32, 0x9b, 0x92, 0xc2, 0x38, 0x66, 0xd4, 0xc6, 0x89, 0x92,
  0x90, 0x24, 0x72, 0x56, 0x0d, 0x41, 0xb2, 0x62, 0x88, 0xd6, 0x43, 0x48,
  0x35, 0x0b, 0x12, 0x6a, 0x53, 0xdb, 0x4d, 0xb9, 0x26, 0x6e, 0x19, 0xb2,
  0x8b, 0x9b, 0xac, 0x12, 0xd3, 0xd3, 0x16, 0x11, 0x1b, 0x66, 0x37, 0x4a,

  0xc6, 0xa5, 0x79, 0x3e, 0x52, 0xb5, 0xa0, 0x3d, 0xfa, 0x5a, 0xcd, 0xbe,
  0x39, 0x85, 0xd6, 0xe6, 0x55, 0xa1, 0x7f, 0x11, 0x62, 0x6e, 0xed, 0xf5,
  0x46, 0xfa, 0x03, 0x13, 0xfd, 0x4f, 0x32, 0xab, 0x50, 0xdc, 0x69, 0x68,
  0x87, 0x88, 0x64, 0x6b, 0x68, 0xd8, 0xe9, 0x16, 0xed, 0x2c, 0xba, 0x16,
  0x7b, 0x23, 0xdd, 0xd3, 0x7b, 0xd3, 0x4f, 0x53, 0xef, 0x2e, 0xf8, 0x9e,
  0x96, 0x66, 0x6a, 0x75, 0x7a, 0x8e, 0x53, 0x69, 0x2c, 0x65, 0x63, 0xa5,
  0xcc, 0x93, 0x32, 0xb4, 0x20, 0x0e, 0x02, 0xe0, 0x6c, 0x4e, 0x58, 0x77,
  0x8c, 0x5f, 0x28, 0xef, 0xbf, 0x2e, 0xf2, 0x66, 0xe0, 0xbc, 0x0b, 0xa4,
  0x15, 0x04, 0xe5, 0xda, 0xc6, 0xc6, 0x1b, 0xed, 0xc6, 0xf2, 0x6a, 0x84,

  0x2f, 0x0a, 0x90, 0x6b, 0x7a, 0xed, 0xf2, 0xbd, 0x7a, 0x39, 0xdf, 0x48,
  0xf3, 0xe3, 0xbb, 0x32, 0x1a, 0x90, 0x07, 0x9e, 0x3f, 0x9c, 0x87, 0x03,
  0x33, 0xf1, 0x8b, 0x59, 0xbc, 0x68, 0xa5, 0xc3, 0x25, 0x08, 0x87, 0xf3,
  0x0a, 0xbe, 0xfa, 0x99, 0xb0, 0x44, 0x6d, 0xf2, 0xe2, 0xba, 0xfc, 0xc4,
  0xf2, 0x9e, 0x5b, 0x1b, 0xc6, 0x52, 0x54, 0xf2, 0xde, 0xb2, 0x16, 0xf6,
  0x4b, 0xf1, 0xae, 0xca, 0xdc, 0x59, 0x64, 0x79, 0x95, 0x04, 0x66, 0x31,
  0x12, 0x8c, 0xb1, 0x25, 0x80, 0x56, 0x3c, 0x75, 0xf3, 0xfd, 0xf5, 0x2e,
  0x0d, 0xb4, 0x01, 0x75, 0x92, 0x2d, 0xea, 0x6c, 0xe0, 0x55, 0x03, 0xaa,
  0xb0, 0x51, 0x69, 0x83, 0xe4, 0x4f, 0xed, 0x24, 0xd7, 0x2f, 0x49, 0x46,
  0xae, 0x36, 0xc1, 0xdb, 0x6e, 0x67, 0xc4, 0x22, 0xb8, 0xc9, 0x51, 0xa7,
  0xe9, 0x55, 0x59, 0x46, 0xc5, 0xb6, 0x93, 0x21, 0x50, 0x69, 0x00, 0x88,
  0xd1, 0xa3, 0x3f, 0xb4, 0x5b, 0x1b, 0x4a, 0x32, 0x79, 0xf7, 0xee, 0x29,
  0xd4, 0xa0, 0x68, 0x83, 0x1e, 0x40, 0x69, 0x5b, 0xba, 0xf1, 0x84, 0x02,
  0xd9, 0x1c, 0x4b, 0x5e, 0xe0, 0xdf, 0x75, 0xe4, 0x71, 0xd3, 0x42, 0x4f,
  0xf0, 0x37, 0x25, 0x2a, 0xec, 0x38, 0x01, 0xcd, 0xa5, 0x25, 0x82, 0x6e,
  0x60, 0x34, 0x15, 0xed, 0x80, 0x06, 0xe6, 0x99, 0x37, 0x60, 0x20, 0xbf,
  0x3f, 0xdc, 0xef, 0x63, 0xf2, 0xac, 0xc6, 0x6a, 0x95, 0x2b, 0x5d, 0x47,

  0x6b, 0x9c, 0xb3, 0x20, 0x74, 0x85, 0x01, 0x24, 0x40, 0xd6, 0xab, 0x04,
  0xad, 0xaf, 0xa8, 0x69, 0x5a, 0xcf, 0xfe, 0x47, 0xad, 0xe2, 0x9f, 0xdb,
  0x2a, 0xaf, 0xaf, 0x57, 0x9e, 0xe3, 0x5f, 0xe7, 0xde, 0x19, 0xd3, 0x48,
  0xd1, 0xf2, 0x5a, 0xe6, 0x25, 0x9e, 0xab, 0xc4, 0xd3, 0xd9, 0x9d, 0xde,
  0x00, 0xcb, 0x1e, 0xcc, 0x8e, 0x73, 0x0c, 0xf2, 0x90, 0x25, 0x1b, 0x9b,
  0x76, 0xb9, 0x8a, 0x30, 0x2c, 0x7b, 0x09, 0x34, 0x4b, 0x25, 0x75, 0x68,
  0x97, 0xa9, 0xb0, 0x47, 0xc3, 0x39, 0x43, 0xf4, 0x15, 0xe1, 0xa4, 0x6c,
  0x8c, 0xa7, 0x92, 0xad, 0x89, 0x1d, 0xa1, 0x2f, 0xb5, 0x05, 0x23, 0xb2,
  0xce, 0x86, 0x51, 0x6f, 0xbf, 0x62, 0xd6, 0x84, 0xe0, 0x67, 0xb0, 0xa4,
  0x1c, 0x18, 0xfe, 0x16, 0xbf, 0xbe, 0x95, 0xec, 0x10, 0x57, 0xdd, 0x55,
  0xed, 0x35, 0xac, 0x7f, 0x76, 0x35, 0x75, 0x60, 0xbf, 0x69, 0x1d, 0x64,
  0xce, 0x42, 0x7b, 0x4d, 0x8c, 0x91, 0x57, 0x19, 0x05, 0x60, 0xbd, 0x48,
  0x2b, 0xa9, 0x1c, 0x9c, 0xaf, 0x17, 0x31, 0x33, 0x07, 0x37, 0x5b, 0x63,
  0x43, 0x66, 0x8b, 0xea, 0xb5, 0xf6, 0x12, 0x70, 0x38, 0x33, 0x02, 0x3a,
  0xb8, 0x30, 0x33, 0x42, 0x41, 0xcb, 0x82, 0x5b, 0x9c, 0x45, 0x29, 0x17,

  0xae, 0x61, 0xec, 0x99, 0x2a, 0x98, 0x6c, 0x45, 0xf1, 0xdc, 0xaa, 0xec,
  0x92, 0xa6, 0xe4, 0xda, 0xa8, 0xd1, 0x16, 0x50, 0x33, 0xef, 0x3c, 0x48,
  0x1a, 0xdc, 0x3a, 0x3d, 0xbb, 0x38, 0x3e, 0x7d, 0x3f, 0x4e, 0xfe, 0x7d,
  0x6b, 0x63, 0x79, 0x57, 0x1b, 0x58, 0xf9, 0xfb, 0x81, 0x3b, 0x93, 0xe4,
  0xa5, 0xf8, 0x19, 0xfa, 0x6c, 0x63, 0x4f, 0x83, 0x9f, 0x1a, 0xe9, 0x6d,
  0xd8, 0xab, 0xbe, 0x29, 0xd8, 0x6e, 0x72, 0x58, 0x1d, 0x24, 0x83, 0x40,
  0x5b, 0xf6, 0x61, 0x1f, 0x7c, 0x1b, 0x9a, 0x79, 0xbd, 0x33, 0x59, 0x3a,
  0xa3, 0xf7, 0x70, 0x60, 0xc6, 0x22, 0x69, 0xd9, 0x2f, 0xd8, 0x3b, 0x79,
  0x0b, 0xdb, 0x7c, 0x43, 0xba, 0x29, 0x1e, 0xdc, 0x91, 0x46, 0xf4, 0xac,
  0x68, 0xd5, 0x61, 0x86, 0xe0, 0x57, 0x47, 0x17, 0xbb, 0x52, 0xe8, 0x6a,
  0xe7, 0x07, 0x4f, 0x97, 0xa8, 0x3d, 0xa9, 0xd5, 0xcc, 0xb4, 0xb4, 0x95,
  0x81, 0xdc, 0x8c, 0xf6, 0xbc, 0x48, 0x8b, 0x68, 0x09, 0x1b, 0x69, 0xb4,
  0xaf, 0xcd, 0x76, 0x10, 0x1f, 0x56, 0x8e, 0xac, 0xde, 0x13, 0xaf, 0x7f,
  0x0e, 0xe3, 0x32, 0x9d, 0x7d, 0xb8, 0xc0, 0x80, 0x6f, 0x8e, 0x4e, 0x8e,
  0x2e, 0x8e, 0xba, 0x96, 0xfb, 0x84, 0xc1, 0x2c, 0x51, 0xea, 0xd2, 0x64,
  0xd3, 0xab, 0xa2, 0x5c, 0x94, 0x97, 0xb9, 0x34, 0x08, 0x4d, 0xbe, 0xcb,
  0x26, 0x6f, 0x5e, 0x7d, 0x4b, 0xfa, 0x04, 0x79, 0x9c, 0xce, 0xce, 0x4f,
  0xcf, 0xde, 0x1e, 0xbf, 0x7f, 0x33, 0x48, 0x5e, 0x9f, 0x9e, 0xfd, 0x65,
  0x90, 0xbc, 0x3b, 0xfd, 0xf6, 0x28, 0x92, 0xe2, 0x4c, 0x08, 0xb7, 0x01,
  0xc5, 0xd8, 0x56, 0x7d, 0x2c, 0xce, 0xd8, 0xf4, 0x46, 0x5b, 0xf0, 0x8e,
  0x18, 0xa1, 0x1a, 0x80, 0xba, 0x14, 0x7e, 0x6b, 0xf6, 0x6e, 0x90, 0x7c,
  0x7d, 0xf4, 0xea, 0xcd, 0x20, 0x00, 0x30, 0x1f, 0xf3, 0xaa, 0x68, 0x75,
  0x76, 0xc9, 0x80, 0xbd, 0x66, 0xeb, 0x03, 0x3a, 0x02, 0x07, 0xb9, 0xf8,
  0xca, 0x1a, 0x82, 0x45, 0x91, 0xfe, 0xac, 0x2f, 0x73, 0x42, 0x90, 0xf8,
  0x7b, 0x5b, 0xf2, 0xb6, 0xca, 0x2e, 0xa0, 0xae, 0xf9, 0x8a, 0xb6, 0xc0,
  0x35, 0x21, 0xb3, 0x5e, 0xeb, 0xb0, 0xec, 0x71, 0xf7, 0x20, 0x06, 0x0d,
  0x5a, 0x48, 0x01, 0x60, 0x47, 0xec, 0x7a, 0x4c, 0xa5, 0xa3, 0x21, 0x7a,
  0x16, 0x19, 0x33, 0x89, 0xb4, 0xea, 0xb9, 0x43, 0x89, 0x8d, 0x6b, 0xd8,
  0xaa, 0x22, 0x94, 0x0a, 0xa6, 0x2e, 0xc0, 0x4d, 0xb4, 0x7d, 0xba, 0x45,
  0x03, 0xed, 0x18, 0xf3, 0x3d, 0xff, 0x58, 0x65, 0x6c, 0x50, 0x69, 0x3d,
  0x37, 0x84, 0x99, 0x71, 0xca, 0x14, 0xce, 0xc8, 0xb9, 0x05, 0x92, 0xe1,
  0xb1, 0x3a, 0x25, 0x36, 0x29, 0x58, 0x72, 0x59, 0xc4, 0x31, 0x03, 0xa0,
  0x28, 0x75, 0x58, 0xb5, 0x79, 0x84, 0x6b, 0xa8, 0xcb, 0xf7, 0x6e, 0x1e,
  0xf0, 0x35, 0xd2, 0xf7, 0xed, 0x19, 0x0f, 0x04, 0xe8, 0xc2, 0xd6, 0x4f,
  0xf8, 0xfb, 0x82, 0xec, 0xdb, 0xb6, 0x3f, 0xcb, 0x48, 0xd8, 0x40, 0xb8,

  0xd0, 0x63, 0x86, 0x93, 0x14, 0xe2, 0x10, 0xa5, 0xc0, 0xdb, 0x90, 0x2d,
  0x69, 0x3f, 0xe7, 0x57, 0xd9, 0xa7, 0xaa, 0xa6, 0x3a, 0x85, 0x78, 0x0b,
  0xf9, 0x56, 0x0b, 0x66, 0x7b, 0xf0, 0x8f, 0xf6, 0x6f, 0x9d, 0x8f, 0x9d,
  0x74, 0x89, 0x3a, 0x19, 0x0a, 0xde, 0x37, 0x8a, 0xf7, 0x82, 0xad, 0xdb,
  0x79, 0xdb, 0xc3, 0x18, 0x7d, 0xaf, 0xad, 0xad, 0xe8, 0xb7, 0xd9, 0xe6,
  0x27, 0xc7, 0xe6, 0x3a, 0x44, 0xa0, 0x71, 0x66, 0x25, 0x1a, 0x0d, 0x23,
  0xcd, 0x20, 0x57, 0x51, 0x42, 0x63, 0x85, 0x1f, 0xa6, 0xce, 0xdb, 0xd1,
  0x2f, 0xa3, 0x25, 0xf7, 0x3d, 0x9f, 0x0e, 0xce, 0xec, 0xfc, 0xe8, 0xe2,
  0x7c, 0x94, 0xec, 0xf8, 0x98, 0xaf, 0x4f, 0x47, 0xfb, 0x61, 0xd0, 0x86,
  0x9a, 0x7e, 0xef, 0x26, 0xde, 0x67, 0xdd, 0x77, 0xd1, 0x0f, 0x7c, 0xf3,
  0x77, 0xc3, 0x3c, 0x62, 0x0f, 0xe9, 0x69, 0x3f, 0xf6, 0x3d, 0xbf, 0xb5,
  0x78, 0x6b, 0x95, 0xf4, 0x8b, 0x0d, 0x5f, 0xfb, 0xfa, 0xe8, 0xe4, 0x2c,
  0x5c, 0xe5, 0xb7, 0xe7, 0x6f, 0xff, 0xd2, 0x5e, 0xe5, 0xa3, 0xc7, 0x91,
  0xaf, 0xfe, 0x92, 0x0e, 0xf5, 0xac, 0x2e, 0x17, 0x46, 0x5f, 0x41, 0x15,
  0x07, 0x8a, 0x38, 0x5e, 0x18, 0x01, 0x40, 0xb9, 0xe6, 0x7f, 0x1d, 0xc8,
  0x5f, 0x7e, 0x1c, 0x8d, 0x46, 0x7f, 0x0a, 0x51, 0xd1, 0xe1, 0xa3, 0x71,
  0xeb, 0x95, 0x87, 0xbb, 0x26, 0x38, 0xaa, 0x66, 0x50, 0x26, 0x44, 0x91,
  0x8b, 0x55, 0x9a, 0x57, 0x54, 0xf2, 0x18, 0x13, 0xb8, 0xb4, 0x22, 0x57,
  0xe8, 0x65, 0xb5, 0x39, 0x01, 0x04, 0xe3, 0xcb, 0xba, 0x53, 0xef, 0x4a,
  0x55, 0xb5, 0x57, 0x4f, 0x92, 0xce, 0x02, 0x47, 0x08, 0x37, 0x47, 0xc1,
  0x67, 0x2b, 0x72, 0xd0, 0xb2, 0xa2, 0xe9, 0x04, 0x6d, 0xa1, 0xc2, 0x43,
  0x96, 0x3f, 0xb3, 0xd3, 0x8f, 0x79, 0x2f, 0xb8, 0x4e, 0xf2, 0xb5, 0x44,
  0xd4, 0x61, 0x7f, 0x41, 0xa2, 0xa0, 0xcf, 0x6c, 0xd6, 0x4c, 0xf7, 0x68,
  0x91, 0x75, 0xd0, 0x0b, 0x89, 0x95, 0xb8, 0xd0, 0x89, 0x24, 0x58, 0x2b,
  0x5e, 0x09, 0x2d, 0x67, 0xb7, 0x78, 0x35, 0x09, 0xae, 0x8a, 0xd7, 0xd3,
  0xd5, 0xd5, 0x39, 0x12, 0xeb, 0xe1, 0xa2, 0xdb, 0x6d, 0x2b, 0x47, 0x80,
  0x9e, 0x56, 0xd6, 0x4d, 0xeb, 0xe0, 0xe9, 0x6d, 0xb2, 0x01, 0x9b, 0x44,

  0x0b, 0xd5, 0x42, 0xb5, 0x1f, 0xdc, 0x59, 0x29, 0x89, 0xf2, 0x28, 0x80,
  0x3e, 0x3e, 0x6f, 0xf9, 0x5c, 0xd4, 0x43, 0xe7, 0x9f, 0x39, 0xa6, 0x11,
  0xfa, 0x35, 0x30, 0x07, 0x46, 0x12, 0x57, 0x03, 0x9e, 0x16, 0x1a, 0xca,
  0xc3, 0x3f, 0xb7, 0xaa, 0xcc, 0xb7, 0xff, 0x7d, 0x9b, 0x54, 0x61, 0xbc,
  0x1d, 0xad, 0x6d, 0x57, 0xba, 0x25, 0xc3, 0x06, 0x8f, 0x45, 0xf4, 0x06,
  0xb7, 0x2b, 0x4a, 0x7b, 0x36, 0x5d, 0xca, 0x52, 0x8f, 0x2c, 0x61, 0x94,
  0x7c, 0x97, 0x2f, 0x66, 0xd3, 0xb4, 0x42, 0x7a, 0x58, 0x28, 0x5e, 0x85,
  0x4a, 0x70, 0x9d, 0xea, 0x12, 0x5f, 0x75, 0x77, 0x47, 0x7b, 0xc9, 0xc4,
  0x69, 0x3e, 0x56, 0xf4, 0x63, 0xcf, 0x83, 0x82, 0xdf, 0x3d, 0x4d, 0xbb,
  0x84, 0x7e, 0x74, 0x8f, 0x49, 0xda, 0xb5, 0x5b, 0x78, 0xb4, 0x8f, 0x56,
  0xe3, 0x10, 0xc3, 0xc7, 0x61, 0x2c, 0x25, 0x5f, 0x5d, 0x3f, 0x86, 0xfb,
  0xea, 0xe9, 0x80, 0xff, 0xf5, 0x94, 0xc1, 0x21, 0x1b, 0x2b, 0xdc, 0xb1,
  0xad, 0x6c, 0xc6, 0xb0, 0xd6, 0x7f, 0x7c, 0xa6, 0x15, 0xae, 0x5d, 0x9e,
  0x38, 0x96, 0x28, 0xa4, 0xe0, 0x23, 0x98, 0x59, 0xaa, 0x01, 0x63, 0xde,

  0xd1, 0xd9, 0xd2, 0x96, 0x18, 0xfe, 0xf5, 0xd7, 0x49, 0x45, 0xb0, 0x23,
  0x4d, 0xfd, 0xe3, 0xa6, 0x7a, 0x62, 0xa3, 0xf3, 0x3f, 0x1b, 0x85, 0x75,
  0x5b, 0x63, 0x1f, 0xfa, 0xdc, 0x7d, 0xc9, 0xe6, 0xfb, 0xba, 0xcf, 0x51,
  0x86, 0x3f, 0xc2, 0x76, 0x94, 0xf5, 0xb3, 0xf9, 0x43, 0xcf, 0x37, 0x7c,
  0x68, 0x0e, 0x60, 0x23, 0x3a, 0x53, 0x6b, 0x00, 0xdc, 0x28, 0x55, 0xf8,
  0x35, 0xca, 0x66, 0x9c, 0xa7, 0x8f, 0x47, 0xfb, 0x0f, 0xcf, 0x50, 0x76,
  0xd6, 0x37, 0x79, 0xf6, 0x66, 0xf2, 0x13, 0x90, 0x89, 0xa4, 0x88, 0x95,
  0x7d, 0x34, 0xb7, 0xb1, 0x33, 0x06, 0xc1, 0xe6, 0xb4, 0x78, 0xb9, 0x59,
  0x3f, 0x4a, 0x84, 0x2a, 0x63, 0x1c, 0xd6, 0xc1, 0x0e, 0x1c, 0x7b, 0xda,
  0xbd, 0xde, 0x04, 0x3e, 0x6d, 0x4a, 0x1d, 0xc1, 0x8f, 0x09, 0x7f, 0x41,

  0xf9, 0xdc, 0x11, 0xd5, 0x31, 0x9d, 0x1f, 0xbd, 0xfd, 0x30, 0x3e, 0x7a,
  0x03, 0xb8, 0xcd, 0x58, 0x3f, 0xa5, 0x9c, 0x6e, 0x34, 0x47, 0x26, 0x9a,
  0x92, 0x95, 0x4a, 0x99, 0x48, 0xbb, 0xe1, 0x20, 0xf7, 0xc8, 0x84, 0x42,
  0xd6, 0x94, 0xc6, 0x30, 0x0e, 0xeb, 0x4e, 0x58, 0x95, 0x93, 0x77, 0x7f,
  0x02, 0xee, 0x08, 0xaf, 0x7a, 0x96, 0x51, 0x73, 0xae, 0x97, 0x9c, 0x05,
  0x13, 0x80, 0xaa, 0xbd, 0xf3, 0xb2, 0xd8, 0xeb, 0x45, 0x96, 0xad, 0x34,
  0xe8, 0x9f, 0x2e, 0xcb, 0x75, 0xc1, 0x9e, 0x51, 0x73, 0x3e, 0xea, 0x0f,
  0x84, 0xf7, 0x19, 0xe3, 0xb2, 0xfa, 0x96, 0xf6, 0x74, 0x92, 0x82, 0xd3,
  0x87, 0xf2, 0xd5, 0x1d, 0x60, 0x40, 0x77, 0x53, 0x76, 0xf2, 0xc6, 0xaa,
  0xf5, 0x0a, 0x3f, 0x1e, 0x74, 0xd5, 0x63, 0x38, 0x72, 0x42, 0xe8, 0x31,
  0x86, 0x11, 0x63, 0x55, 0x92, 0x96, 0x7a, 0x59, 0x56, 0x66, 0xd0, 0xa5,
  0x2d, 0x56, 0x64, 0x44, 0x87, 0x7a, 0xb7, 0xdb, 0xca, 0xb1, 0x6b, 0xb6,
  0x93, 0x2d, 0x81, 0x08, 0x78, 0xc6, 0xf5, 0xdb, 0xc4, 0x15, 0x78, 0x9b,
  0xe0, 0x31, 0xa1, 0xe8, 0x20, 0x8b, 0xb4, 0xb1, 0x54, 0x5d, 0x63, 0x2f,
  0x78, 0x07, 0x43, 0x73, 0x93, 0xba, 0x8e, 0x74, 0x9d, 0x39, 0xaa, 0xba,
  0x6b, 0x34, 0x40, 0xa7, 0x4e, 0x33, 0xff, 0x2d, 0xbb, 0xb9, 0x1d, 0x1c,
  0xc6, 0x6e, 0xc0, 0x32, 0xbd, 0x85, 0x8b, 0xaa, 0x97, 0x1c, 0xc4, 0x61,
  0x4b, 0x1b, 0x42, 0xcf, 0x55, 0xcc, 0xf3, 0xc1, 0x61, 0x5d, 0xe9, 0x0b,
  0x27, 0x26, 0xd9, 0xa3, 0x16, 0xff, 0x15, 0x19, 0xde, 0x61, 0xe8, 0x11,
  0x50, 0x59, 0x32, 0x67, 0x78, 0x09, 0x53, 0x5a, 0x24, 0xd9, 0x6f, 0x3b,

  0xdc, 0x58, 0x0a, 0x1f, 0xdb, 0xa5, 0x1f, 0x2f, 0x4a, 0x8a, 0x51, 0x2a,
  0x31, 0xe0, 0xf3, 0x21, 0x64, 0x1f, 0x99, 0x09, 0x15, 0x51, 0x21, 0x32,
  0xf0, 0x6c, 0xe2, 0x0d, 0x9a, 0xd9, 0xa0, 0x58, 0x8c, 0xf0, 0xcb, 0xd8,
  0x05, 0x36, 0xb7, 0x3e, 0xb4, 0x4a, 0xde, 0x0c, 0x72, 0x58, 0x75, 0x9c,
  0x8c, 0x07, 0x18, 0xb4, 0x61, 0x95, 0x65, 0xda, 0xa8, 0xcd, 0x84, 0x9f,
  0x80, 0x7b, 0xa9, 0x69, 0x8d, 0x7c, 0x44, 0x55, 0x63, 0xb0, 0x01, 0x72,
  0x35, 0xa2, 0xb6, 0x89, 0x56, 0x04, 0x43, 0x33, 0x2d, 0xfc, 0xc9, 0xe2,
  0x04, 0xcc, 0x20, 0x79, 0x39, 0x43, 0x55, 0x14, 0x77, 0xe2, 0xe9, 0x81,
  0x8f, 0x91, 0xd9, 0x6c, 0x93, 0xab, 0xf2, 0x36, 0x5f, 0xae, 0x97, 0x78,
  0x7d, 0xc0, 0x06, 0xd8, 0x92, 0xa4, 0x96, 0x1e, 0x2a, 0xb2, 0x0b, 0x6d,
  0xdb, 0xaf, 0x98, 0x33, 0x83, 0x58, 0x1b, 0x88, 0xb6, 0xe1, 0x94, 0x1f,
  0x7a, 0x8b, 0x5b, 0x6c, 0xe0, 0xa0, 0xfe, 0xa7, 0xd3, 0x67, 0xf2, 0xd2,
  0x28, 0x74, 0x7f, 0x8a, 0x44, 0xa3, 0x53, 0x9f, 0xa7, 0x0a, 0xff, 0x00,
  0x65, 0x52, 0xaa, 0x73, 0x36, 0xf3, 0x4c, 0x49, 0xa6, 0x38, 0xd2, 0xc4,
  0xf8, 0x90, 0x7a, 0x39, 0xd4, 0xc0, 0x3a, 0xbe, 0x85, 0xdc, 0x69, 0xa1,
  0xce, 0xf7, 0xcb, 0x42, 0x49, 0x88, 0x9e, 0xce, 0x4d, 0x3a, 0x8f, 0x04,
  0x32, 0x5f, 0xe1, 0x19, 0x40, 0xb4, 0xf2, 0xbe, 0xf9, 0xfc, 0xbe, 0x24,

  0xc5, 0x88, 0x7d, 0x4b, 0x1e, 0x73, 0xd9, 0x65, 0x75, 0x63, 0xb5, 0x7b,
  0x85, 0xd8, 0x70, 0x20, 0xd8, 0x06, 0x31, 0xb2, 0x0e, 0xbb, 0x64, 0xb5,
  0x94, 0xa1, 0x90, 0x5e, 0x10, 0x3b, 0xe5, 0xb3, 0x1b, 0x70, 0xb2, 0x26,
  0x32, 0x34, 0x1f, 0xdf, 0xde, 0x06, 0x14, 0xee, 0x19, 0xc4, 0x8c, 0x37,
  0xc9, 0xd6, 0xf2, 0xe3, 0x7d, 0x94, 0x39, 0x3e, 0xb9, 0xed, 0x18, 0xcd,
  0xa3, 0x38, 0x38, 0x24, 0xcb, 0x07, 0x62, 0x91, 0x93, 0x92, 0xa3, 0x70,
  0xbc, 0x69, 0x69, 0x64, 0x3b, 0x99, 0x3b, 0xdc, 0xa4, 0x39, 0x08, 0x22,
  0x48, 0x6d, 0x40, 0x2e, 0xa6, 0x6d, 0xf6, 0xaa, 0x51, 0x52, 0x34, 0x2d,
  0x34, 0x9a, 0x3f, 0x6d, 0xa5, 0xee, 0x93, 0xcd, 0x03, 0x98, 0x95, 0x6b,
  0x40, 0x61, 0x84, 0xdb, 0x45, 0x5f, 0xe1, 0xdd, 0xa7, 0x2b, 0x65, 0xe4,
  0x55, 0xbe, 0xa0, 0xd7, 0xf8, 0x62, 0xd7, 0xc9, 0x81, 0x39, 0x85, 0xbc,
  0x58, 0x37, 0x16, 0xae, 0x0f, 0xdf, 0xb4, 0xb0, 0x33, 0x91, 0xdd, 0x5f,
  0x20, 0xd1, 0x57, 0x2b, 0xe0, 0xe9, 0xf6, 0xd5, 0x5e, 0x74, 0x90, 0x6f,

  0x09, 0x34, 0x72, 0xdb, 0xd3, 0xd9, 0x97, 0xb2, 0x31, 0x57, 0x91, 0x0d,
  0xc3, 0x8a, 0x5c, 0xcd, 0x6e, 0xcd, 0x6e, 0x33, 0x8a, 0x92, 0x27, 0xd8,
  0xac, 0x48, 0x1b, 0x79, 0x5d, 0x28, 0x22, 0x99, 0x3f, 0x2d, 0x26, 0x6e,
  0x9b, 0x78, 0x81, 0xcf, 0x95, 0x8d, 0x5c, 0x49, 0xdb, 0x7c, 0x8d, 0xb5,
  0xb6, 0xff, 0xe9, 0x57, 0xbb, 0x4e, 0xeb, 0xc5, 0x30, 0xef, 0xf2, 0xf2,
  0x23, 0xe4, 0x12, 0xda, 0x5c, 0x20, 0x4b, 0x85, 0x66, 0x88, 0xf1, 0xab,
  0xf1, 0x49, 0x07, 0xcb, 0x6b, 0x23, 0xd0, 0xf4, 0x41, 0x5b, 0xed, 0x79,
  0x20, 0x1a, 0xe6, 0x4f, 0x06, 0xc3, 0x64, 0x74, 0xe2, 0xbe, 0x06, 0x7f,
  0xf5, 0x0b, 0x7c, 0xdc, 0x61, 0xee, 0x06, 0x53, 0x61, 0xfc, 0x22, 0xd4,
  0x6c, 0x70, 0x27, 0x46, 0x36, 0xa0, 0x23, 0x18, 0x47, 0xb3, 0x3d, 0x49,
  0x01, 0xba, 0x2f, 0x92, 0xce, 0x10, 0x9b, 0xba, 0xf2, 0x31, 0x49, 0x03,
  0xea, 0x54, 0x3a, 0x8c, 0xc1, 0xf5, 0xd8, 0xa4, 0x40, 0xd1, 0x27, 0x6b,
  0x3c, 0x4d, 0x09, 0x41, 0xec, 0x1d, 0xf5, 0xf8, 0x15, 0x8d, 0xe1, 0xf2,
  0x6a, 0x08, 0xe8, 0x3d, 0x84, 0x85, 0xe7, 0x70, 0xeb, 0x9c, 0x9b, 0x41,
  0xea, 0x0c, 0xbc, 0x31, 0xbb, 0x7c, 0x32, 0xe7, 0x5e, 0x01, 0x55, 0xf2,
  0xf7, 0x75, 0x9e, 0x35, 0x28, 0xba, 0x1a, 0x25, 0x6f, 0x38, 0x2d, 0x4c,
  0x3a, 0x2a, 0x72, 0xe7, 0x56, 0xb4, 0x77, 0xe5, 0x52, 0x67, 0xfe, 0x3e,
  0x4d, 0x20, 0xb0, 0x00, 0xcc, 0x84, 0x50, 0xcd, 0xf7, 0x0e, 0xb3, 0x4e,
  0x5e, 0xd3, 0xb4, 0x97, 0xe6, 0xa6, 0x03, 0x6b, 0xc6, 0x43, 0x11, 0xd3,
  0xbc, 0x01, 0xcd, 0xe4, 0x47, 0xb2, 0x6a, 0xfd, 0x29, 0xcc, 0xd5, 0x1f,
  0xb4, 0x3a, 0x52, 0xc1, 0x66, 0x14, 0x43, 0xa0, 0xa1, 0x76, 0x66, 0x45,
  0xba, 0xd8, 0xab, 0x9b, 0x19, 0x71, 0xbf, 0x75, 0xb1, 0xa0, 0x79, 0xd2,
  0x48, 0x3d, 0xfd, 0x11, 0x23, 0x78, 0x3b, 0xc0, 0xfb, 0xa0, 0x13, 0x6a,
  0x1d, 0x91, 0xc4, 0xf0, 0xfb, 0x22, 0xbd, 0x5e, 0x16, 0x47, 0x08, 0xfe,
  0xe3, 0xef, 0x16, 0xb9, 0x11, 0x78, 0xbd, 0xd8, 0xcb, 0xd6, 0xb9, 0x6d,
  0x82, 0x42, 0xb8, 0xa6, 0xf3, 0x32, 0x84, 0x36, 0x29, 0x6b, 0x05, 0x89,

  0x36, 0x8b, 0x34, 0xaf, 0xb7, 0xee, 0x13, 0xa0, 0xb6, 0xee, 0x45, 0x33,
  0x89, 0xb4, 0x19, 0x7f, 0x7c, 0x2f, 0x8c, 0x09, 0xbf, 0x11, 0x36, 0xd3,
  0xfe, 0xc9, 0x40, 0x26, 0x71, 0xa4, 0x26, 0x32, 0x26, 0x6d, 0xf2, 0xa3,
  0x64, 0x35, 0xb5, 0x50, 0x3d, 0x38, 0xe6, 0x7b, 0x17, 0x69, 0x45, 0x68,
  0x88, 0x69, 0x2d, 0x18, 0x08, 0xd3, 0x85, 0x61, 0xf6, 0x11, 0x83, 0x53,
  0x7b, 0x50, 0x12, 0xdc, 0xd7, 0xa0, 0xcb, 0x4e, 0xeb, 0x35, 0x69, 0x20,
  0x8b, 0x35, 0x7d, 0x99, 0x91, 0xb2, 0x2c, 0x52, 0x93, 0x96, 0x6e, 0x47,
  0xd1, 0xcd, 0x2c, 0x1e, 0x0a, 0xdd, 0x51, 0x0f, 0xe8, 0x4d, 0xb1, 0x4b,
  0x2d, 0x06, 0x5a, 0x17, 0x2c, 0x6c, 0xd4, 0x33, 0x3b, 0xb2, 0x0a, 0x07,
  0x7e, 0xeb, 0x78, 0xdf, 0x00, 0xa7, 0x62, 0x16, 0x9d, 0x4e, 0xbb, 0x1d,
  0x7b, 0x0c, 0xbd, 0xca, 0x86, 0x86, 0x5b, 0x33, 0x53, 0xd9, 0xa1, 0x95,
  0xd2, 0x48, 0x30, 0xf7, 0xd1, 0xce, 0xd0, 0x22, 0x3e, 0x88, 0x7b, 0x3c,
  0xa4, 0x5f, 0x7c, 0x6f, 0x87, 0xf8, 0x10, 0x89, 0x24, 0xd6, 0x31, 0xde,
  0x8f, 0x0f, 0x94, 0x2d, 0xb8, 0xdd, 0xdf, 0x54, 0x1e, 0x3e, 0x69, 0x37,
  0x0e, 0x13, 0xe8, 0xba, 0x9f, 0x75, 0xa1, 0xd2, 0x87, 0xdd, 0xa8, 0x9e,


  0xaa, 0x82, 0xff, 0x3b, 0x6f, 0x54, 0x9a, 0x3c, 0xec, 0x4e, 0xa5, 0xdd,



  0x4b, 0x15, 0xb2, 0xa5, 0xdb, 0xde, 0x19, 0xff, 0x82, 0xb7, 0x8c, 0xaf,
  0xd9, 0x4f, 0xba, 0x67, 0x4a, 0x14, 0xff, 0x37, 0xdf, 0xb2, 0xcf, 0x3b,
  0x5a, 0x20, 0x70, 0x20, 0x1f, 0xd8, 0x9f, 0x8f, 0x92, 0xc1, 0x49, 0xd7,
  0xda, 0xb3, 0x90, 0x6d, 0xf1, 0x06, 0x0f, 0x0c, 0x31, 0x14, 0x0b, 0xd1,
  0x94, 0x7a, 0xb2, 0x4f, 0x2c, 0xcf, 0xd3, 0xf2, 0xea, 0x8d, 0x03, 0x87,
  0x4e, 0x2a, 0x05, 0xc2, 0x45, 0x2e, 0xab, 0x6d, 0xe9, 0x98, 0x48, 0xb3,
  0x08, 0x59, 0xd6, 0xa5, 0x11, 0xed, 0xab, 0x3c, 0xe1, 0x8e, 0xd4, 0x86,
  0x00, 0xbf, 0x1a, 0x8f, 0x87, 0xaf, 0xce, 0x8e, 0xcd, 0xe8, 0xc3, 0x90,
  0xa2, 0x3c, 0x44, 0xdc, 0xd2, 0x9f, 0x64, 0xcc, 0x2e, 0xe8, 0x4f, 0x37,
  0x69, 0x7f, 0xda, 0x28, 0xba, 0xdd, 0x6d, 0x7d, 0x55, 0xb7, 0x92, 0x29,
  0x75, 0x4a, 0xb6, 0xb1, 0x00, 0x29, 0xdb, 0x8a, 0x2d, 0x8b, 0x78, 0x31,
  0xd9, 0xa4, 0xc4, 0x65, 0xf8, 0x89, 0x20, 0xf7, 0x14, 0x48, 0x22, 0x00,
  0x01, 0x49, 0x0e, 0x9e, 0x3f, 0x3d, 0x30, 0xd7, 0xe2, 0x8e, 0x01, 0xee,
  0xe4, 0xfd, 0xc7, 0xa3, 0x47, 0x7b, 0x8f, 0x47, 0x8f, 0x89, 0xab, 0xb9,
  0xa8, 0x90, 0x8c, 0x6f, 0xb8, 0x5d, 0x24, 0xfb, 0x82, 0xa6, 0xf5, 0xfe,
  0xe8, 0x75, 0xc2, 0x09, 0x7a, 0x80, 0x3b, 0x4b, 0x50, 0x2b, 0x44, 0x75,
  0x47, 0x72, 0x1e, 0x48, 0x12, 0x20, 0x46, 0x3a, 0x52, 0x77, 0x18, 0x13,
  0x6b, 0x60, 0x8c, 0x05, 0xdb, 0x91, 0xa8, 0x2d, 0x81, 0x02, 0xfc, 0xc2,
  0xce, 0x84, 0xf8, 0x1d, 0x9b, 0x15, 0xb2, 0x33, 0xab, 0x48, 0xbb, 0x72,
  0x7f, 0x4f, 0xbc, 0x1d, 0xbb, 0x27, 0x8d, 0xf6, 0x71, 0xff, 0xf9, 0xa8,
  0xf9, 0xd2, 0x63, 0x00, 0x39, 0x0f, 0x65, 0x60, 0xe7, 0x08, 0x3f, 0xd4,
  0xf4, 0x42, 0xf2, 0xb3, 0x4c, 0x97, 0xd6, 0x24, 0x99, 0xff, 0x7d, 0x56,
  0x8c, 0x7e, 0xaa, 0x3d, 0x15, 0x51, 0x88, 0xdb, 0x66, 0x13, 0xcf, 0x5d,

  0x18, 0xb5, 0x98, 0x4b, 0x7d, 0x2b, 0x62, 0x13, 0xa9, 0xeb, 0x09, 0x00,
  0x01, 0xd0, 0x5d, 0x66, 0x03, 0xca, 0x1b, 0xc8, 0x8e, 0xbe, 0x69, 0xf0,
  0x48, 0x09, 0x86, 0xfb, 0xd6, 0x5e, 0x95, 0xa5, 0x0b, 0x79, 0x51, 0x4c,
  0x37, 0x20, 0xa3, 0x06, 0xbf, 0x9c, 0xa3, 0x8d, 0x56, 0x1d, 0x00, 0x51,
  0x31, 0x92, 0xb3, 0x85, 0x81, 0xe3, 0xa7, 0x6d, 0x3a, 0x8a, 0xd7, 0xb0,
  0xa2, 0x32, 0xe2, 0x24, 0x5f, 0xa5, 0x8b, 0xe4, 0x01, 0x39, 0xd4, 0xfd,
  0x87, 0x7f, 0x2f, 0xbf, 0x73, 0xec, 0x22, 0xe4, 0x72, 0xb6, 0x60, 0x59,
  0x13, 0xe5, 0xba, 0x52, 0x55, 0x38, 0x48, 0x8b, 0xcf, 0xf5, 0x0c, 0x48,
  0x49, 0xbd, 0xc2, 0xce, 0x1c, 0xda, 0x4d, 0x37, 0x51, 0x20, 0x9f, 0x5b,
  0xe4, 0xb7, 0x69, 0xb9, 0x5c, 0xb9, 0x98, 0x81, 0x0e, 0x2a, 0xd5, 0x7d,
  0xd4, 0x6e, 0x9e, 0xcd, 0xa8, 0x4d, 0xcc, 0xdd, 0xb2, 0xc4, 0x7b, 0x59,
  0xef, 0x2f, 0xc1, 0x0c, 0x49, 0x85, 0x63, 0x3f, 0xc3, 0x4f, 0xc5, 0x7a,
  0xf4, 0x85, 0x45, 0xb2, 0x83, 0x80, 0xb7, 0xad, 0xd6, 0xa2, 0x1f, 0x69,
  0x08, 0x35, 0xf4, 0x52, 0xd9, 0xe8, 0xd8, 0xee, 0xe8, 0x21, 0xa0, 0xb8,
  0x03, 0xc1, 0xbf, 0xb5, 0x90, 0xb7, 0x01, 0x9f, 0xfd, 0xbf, 0x42, 0x0d,
  0x7c, 0x92, 0xd8, 0xb3, 0x7a, 0x88, 0x36, 0xc8, 0x08, 0xd2, 0xdc, 0x57,
  0x39, 0x80, 0xf8, 0x72, 0x26, 0xd7, 0xff, 0xaf, 0x0d, 0xfe, 0xef, 0xa4,
  0x0d, 0xfe, 0xe4, 0x5b, 0xda, 0xba, 0xa4, 0x43, 0xc9, 0xe0, 0xb4, 0xf7,
  0xd2, 0xdd, 0xc4, 0x78, 0x62, 0xf5, 0xe2, 0xee, 0x81, 0x17, 0xb4, 0x7b,
  0x43, 0x93, 0x90, 0x14, 0xfe, 0xef, 0xb8, 0xa2, 0x0f, 0xba, 0x99, 0xff,
  0xbf, 0xef, 0xe3, 0x7f, 0xb5, 0x7b, 0xd8, 0xaf, 0x0d, 0xee, 0x18, 0x22,
  0xbb, 0xa1, 0xec, 0x24, 0xee, 0xe9, 0x04, 0x3b, 0x7b, 0xd7, 0x69, 0x3e,
  0x54, 0x77, 0xc4, 0x7b, 0x77, 0x7c, 0xf6, 0xed, 0x53, 0x46, 0x1a, 0x19,
  0x77, 0x83, 0xf6, 0x55, 0x72, 0xf2, 0xe6, 0xd5, 0xd9, 0x4f, 0xb8, 0xed,
  0x7f, 0x81, 0x17, 0x7a, 0x95, 0x65, 0xb3, 0x21, 0xc7, 0x47, 0x5e, 0xe2,
  0x1f, 0x91, 0xc0, 0x62, 0x6a, 0x91, 0x04, 0x40, 0xb6, 0x14, 0x36, 0x09,
  0xc3, 0xb5, 0x78, 0xd9, 0xa8, 0x29, 0x85, 0x60, 0x7b, 0xac, 0xd0, 0xfa,
  0x2c, 0xf0, 0xb1, 0x94, 0xc5, 0x6c, 0x97, 0x0b, 0x9a, 0xf0, 0x65, 0x90,
  0x8a, 0x44, 0xd9, 0xe9, 0x7e, 0x5f, 0x12, 0xfa, 0x97, 0x05, 0x48, 0xf4,
  0x9e, 0x51, 0xc4, 0xdb, 0x68, 0xd2, 0xc7, 0x9d, 0x5b, 0x0a, 0x87, 0x76,
  0x18, 0xa5, 0xeb, 0xd1, 0x3e, 0xf9, 0xdf, 0xc1, 0x45, 0xb2, 0xe6, 0x57,
  0x44, 0x15, 0xe8, 0x7e, 0xbe, 0x2f, 0x6d, 0x60, 0xe3, 0x56, 0xfa, 0x27,
  0xd1, 0xda, 0x41, 0x8a, 0x04, 0xce, 0xd6, 0x55, 0xd8, 0x2d, 0x31, 0xf5,
  0xf7, 0x87, 0x03, 0xe5, 0x3c, 0x5f, 0xfb, 0x89, 0xf6, 0x6e, 0x9a, 0xcf,
  0x7b, 0x2f, 0x04, 0x16, 0xb5, 0xad, 0xbd, 0xf1, 0x5b, 0xdc, 0xfb, 0xb3,
  0x72, 0x99, 0xd1, 0x07, 0xea, 0xdd, 0x77, 0x29, 0xd4, 0x7f, 0x09, 0xb3,
  0xc6, 0xbc, 0x77, 0x37, 0xa7, 0x3a, 0x95, 0x45, 0x53, 0x51, 0x2b, 0x05,
  0x8d, 0x92, 0x2a, 0xa2, 0xb6, 0xe1, 0x8b, 0x7e, 0x8d, 0x73, 0x8a, 0x8c,
  0xe8, 0x04, 0xbb, 0x16, 0xb6, 0x15, 0xe4, 0xfb, 0x9d, 0x64, 0xcd, 0x74,
  0xe4, 0xce, 0x16, 0x50, 0x6d, 0xe6, 0x97, 0x53, 0xa3, 0xe4, 0x6a, 0xef,
  0xdd, 0x41, 0xc2, 0x81, 0x6c, 0x32, 0x79, 0x7a, 0x7c, 0x15, 0x1a, 0xf1,
  0xff, 0xf5, 0xdb, 0x50, 0x6d, 0xee, 0xf3, 0x16, 0x96, 0xca, 0xab, 0x79,
  0x62, 0xd9, 0x42, 0x6a, 0xd8, 0x19, 0x2a, 0xcc, 0xd1, 0x0c, 0x36, 0x6f,
  0xee, 0x08, 0x6d, 0xe1, 0x46, 0x92, 0xfd, 0xbb, 0xfc, 0x7e, 0x7c, 0xf2,


  0x88, 0x33, 0x1b, 0x2f, 0x4e, 0xc6, 0x3e, 0x4e, 0x78, 0x8d, 0xfe, 0xc0,
  0xa8, 0xf4, 0xfa, 0xf3, 0xd1, 0xab, 0xf1, 0xc5, 0x28, 0xb2, 0xc6, 0x30,
  0x31, 0xc4, 0x15, 0x7e, 0x12, 0x80, 0xd3, 0x22, 0xbd, 0x23, 0x94, 0x40,
  0xa9, 0x1f, 0xa3, 0xb9, 0xf1, 0xd4, 0x74, 0x6c, 0x32, 0x73, 0xb9, 0x53,
  0x06, 0x52, 0x8b, 0xc2, 0xd4, 0x0b, 0xb3, 0x77, 0x93, 0x7c, 0x41, 0x2b,
  0x30, 0xd3, 0x32, 0xc6, 0xd0, 0x52, 0x92, 0xc3, 0x51, 0x8d, 0x5c, 0x2e,
  0x28, 0xa3, 0x8c, 0xbe, 0xd3, 0xf6, 0x44, 0x50, 0xe2, 0xa5, 0x94, 0x68,
  0xf7, 0x17, 0x5c, 0x1a, 0xbd, 0xa3, 0xa4, 0x36, 0x37, 0x76, 0xae, 0xba,
  0x57, 0x5c, 0x0d, 0xe6, 0x35, 0x26, 0xa3, 0x4e, 0xdc, 0x04, 0x56, 0x11,
  0xa6, 0xb5, 0xa6, 0xf5, 0x27, 0xcd, 0xec, 0x47, 0xfb, 0x44, 0x4a, 0x9e,
  0xd9, 0x98, 0x5b, 0xd7, 0xb5, 0x84, 0xcc, 0x41, 0xa3, 0xf6, 0x97, 0xaa,
  0x40, 0x82, 0x24, 0x70, 0x72, 0x00, 0x14, 0xd9, 0x62, 0x77, 0xc3, 0x89,
  0x6b, 0x80, 0xdc, 0x6f, 0xef, 0x48, 0xa3, 0xc5, 0x7b, 0x4a, 0x25, 0xd3,
  0xab, 0xcc, 0x48, 0x91, 0x91, 0x57, 0xc1, 0xfe, 0xe0, 0x0d, 0xf9, 0x2c,
  0x80, 0x39, 0x8b, 0x6c, 0xcf, 0x4f, 0xde, 0x90, 0xc7, 0x8f, 0xc3, 0x0d,
  0xa9, 0xb2, 0xbf, 0xcf, 0x62, 0x98, 0xcf, 0xc8, 0xb4, 0x47, 0x9a, 0x3f,

  0xa7, 0xc7, 0x9f, 0x33, 0x70, 0x35, 0x4d, 0x75, 0x8f, 0x5a, 0xb7, 0x68,

  0xbe, 0xb0, 0x03, 0x0d, 0x23, 0x03, 0x9b, 0x02, 0x90, 0x61, 0xdb, 0x69,
  0x45, 0x17, 0xf4, 0xfa, 0x0c, 0xe6, 0x71, 0xd8, 0x03, 0xc9, 0xe2, 0x94,
  0x8f, 0x6c, 0x64, 0x59, 0x94, 0xcd, 0x89, 0x06, 0x20, 0x54, 0x4b, 0x67,
  0xef, 0xce, 0x70, 0x38, 0x6f, 0x56, 0x76, 0x61, 0x1b, 0xa9, 0x63, 0x3f,
  0xd8, 0x8c, 0x9e, 0xa5, 0x5f, 0x54, 0xda, 0x08, 0x65, 0xf3, 0xea, 0xc3,
  0xac, 0x32, 0xea, 0x2e, 0xa2, 0x1d, 0xab, 0x01, 0xd0, 0x24, 0xed, 0xa2,
  0x1f, 0xba, 0x11, 0x21, 0xf3, 0xc0, 0xb6, 0xb4, 0x3a, 0xe8, 0xea, 0x7a,
  0x85, 0x85, 0x6b, 0x70, 0x54, 0x76, 0x00, 0x33, 0x95, 0xc4, 0xed, 0xe0,
  0xb6, 0x17, 0x54, 0x3e, 0x78, 0x9d, 0x2d, 0x50, 0x56, 0x95, 0x15, 0xd3,
  0xea, 0x6e, 0xe5, 0x83, 0x94, 0xcf, 0xee, 0xd1, 0xe0, 0xef, 0x39, 0x81,
  0x56, 0x0d, 0xc4, 0x81, 0xe1, 0x75, 0xbb, 0xa1, 0xfe, 0x95, 0x2a, 0x83,
  0x67, 0xe3, 0x04, 0x8a, 0x77, 0xe3, 0xa7, 0x44, 0x93, 0x21, 0xa3, 0x8c,
  0x9b, 0x71, 0x02, 0x05, 0x99, 0x2d, 0x99, 0x87, 0x0e, 0x64, 0xda, 0x5a,
  0x9b, 0xf1, 0xfc, 0xe0, 0x93, 0x3f, 0x1c, 0xf0, 0x7e, 0x5d, 0x1f, 0x06,
  0x3c, 0x61, 0x7c, 0xb2, 0x4b, 0x30, 0xbc, 0x15, 0xc1, 0x62, 0xb4, 0xdc,
  0x52, 0x74, 0x61, 0xb5, 0x11, 0xd3, 0x21, 0x7b, 0xa3, 0xfc, 0xb6, 0xb4,
  0xac, 0x64, 0x07, 0x29, 0x4e, 0x28, 0x81, 0xe5, 0xbb, 0xce, 0xa5, 0x88,
  0x63, 0xc3, 0x57, 0x39, 0x7f, 0xab, 0xdd, 0x36, 0xd2, 0x56, 0x77, 0xd2,
  0xd3, 0xd7, 0x87, 0xbd, 0x80, 0xdb, 0x23, 0xf9, 0x3d, 0x4a, 0x75, 0x67,
  0x19, 0x30, 0xab, 0x15, 0x33, 0x30, 0xb1, 0xcd, 0xc9, 0x91, 0xbf, 0x48,
  0xde, 0xe9, 0xa7, 0x07, 0xcf, 0x9e, 0xee, 0x46, 0x83, 0xec, 0x4c, 0x4c,
  0x54, 0xc2, 0xd5, 0x34, 0x2b, 0x2a, 0x44, 0x14, 0x32, 0xa2, 0x7f, 0x1e,
  0x8e, 0xfc, 0x3d, 0x0a, 0xbb, 0x38, 0x74, 0x45, 0x52, 0x31, 0x23, 0x82,

  0xa0, 0x6d, 0x50, 0x54, 0x7b, 0x22, 0x14, 0xdb, 0x0f, 0x53, 0xef, 0x38,
  0x08, 0x39, 0x34, 0x09, 0x03, 0xc4, 0x6d, 0x98, 0x88, 0xc3, 0x47, 0x3a,
  0x81, 0x47, 0x3c, 0x33, 0xaf, 0x0d, 0x21, 0xcf, 0x14, 0x7f, 0x1f, 0xb5,
  0xff, 0xe5, 0x07, 0x33, 0xdd, 0x00, 0x3f, 0xef, 0x94, 0x1f, 0xfd, 0xda,
  0xa7, 0xfc, 0xe8, 0x9e, 0x53, 0x7e, 0xf4, 0xd0, 0x53, 0x7e, 0xf6, 0xe4,
  0xe9, 0xe7, 0x3f, 0xef, 0x94, 0xbd, 0x4d, 0xfe, 0x9f, 0x73, 0xca, 0x1e,
  0x99, 0xfd, 0xbc, 0x53, 0x96, 0xa4, 0x90, 0x6e, 0xe1, 0x99, 0x24, 0xbf,
  0x70, 0xd9, 0x20, 0x61, 0x06, 0x70, 0xe6, 0x25, 0x3f, 0x1c, 0x16, 0x94,
  0x48, 0x97, 0x3d, 0xee, 0xee, 0x65, 0xd4, 0xb0, 0x88, 0x91, 0xed, 0x00,

  0x0c, 0xa0, 0xdf, 0xae, 0x16, 0xd4, 0x24, 0x6a, 0x7b, 0xb8, 0xad, 0xa1,
  0x6b, 0x2d, 0x13, 0x53, 0xfc, 0x1f, 0xfe, 0x9a, 0x39, 0xec, 0xdf, 0x10,
  0x3d, 0x2a, 0xcc, 0x99, 0xf1, 0xb2, 0x9e, 0xda, 0x9b, 0x76, 0xb7, 0x30,
  0x66, 0x02, 0x67, 0x20, 0x45, 0xb3, 0xdf, 0xa4, 0x9e, 0x55, 0x21, 0x6c,
  0xd4, 0x4b, 0x33, 0x31, 0x3a, 0xa1, 0x11, 0x01, 0x05, 0xe5, 0xf4, 0xdc,
  0x2d, 0x32, 0xa9, 0x94, 0xa4, 0x35, 0xc3, 0x27, 0x4f, 0xa6, 0x7c, 0xd7,
  0x25, 0x2c, 0x3d, 0x51, 0x2c, 0x70, 0x98, 0xe6, 0x2c, 0xd9, 0x1e, 0xf3,
  0x65, 0x7b, 0x3a, 0xd8, 0x39, 0x73, 0x51, 0x38, 0xee, 0xb0, 0x8c, 0x80,
  0x9a, 0x6c, 0xe0, 0xf4, 0x4f, 0xbb, 0x09, 0x77, 0x3d, 0x3d, 0x58, 0x62,
  0x09, 0x68, 0x41, 0x3b, 0x1e, 0x7b, 0x34, 0x0c, 0x27, 0x65, 0x5b, 0xc4,
  0xd8, 0x34, 0x6c, 0xd8, 0xc7, 0x94, 0x83, 0x1d, 0x14, 0x5c, 0xa2, 0x64,
  0x54, 0xd6, 0xa3, 0x3d, 0x6f, 0xbc, 0xd7, 0x25, 0xa1, 0x50, 0x37, 0xe7,
  0x9e, 0xda, 0x00, 0xca, 0xaf, 0x6d, 0xbc, 0xf6, 0x7f, 0x62, 0xfd, 0xbd,
  0xa1, 0xe9, 0xce, 0xd6, 0xcb, 0x95, 0x42, 0xbe, 0x51, 0x19, 0x47, 0x8e,
  0x34, 0x2e, 0xad, 0xfa, 0x8e, 0xb6, 0x83, 0x27, 0x37, 0x9a, 0xad, 0xea,

  0xb0, 0x19, 0x6e, 0xec, 0xb3, 0xd2, 0xd3, 0x92, 0xba, 0x65, 0x5e, 0x01,
  0x12, 0xd7, 0x2c, 0xd6, 0x54, 0x90, 0x7a, 0x40, 0xf7, 0xcc, 0x4c, 0x7b,
  0x96, 0x4d, 0xd6, 0x97, 0x5a, 0x39, 0x6d, 0xdb, 0x78, 0xb5, 0x69, 0x12,
  0x85, 0x26, 0x84, 0xa4, 0x92, 0x0d, 0x38, 0x8d, 0x2e, 0x2d, 0xee, 0x42,
  0x10, 0x89, 0x86, 0x5a, 0xd8, 0x4d, 0x37, 0x25, 0x87, 0x05, 0x4b, 0x07,
  0xb1, 0xe7, 0x03, 0x6f, 0xe9, 0xf8, 0x49, 0xeb, 0x44, 0x23, 0x2d, 0x82,
  0x7c, 0x52, 0x69, 0xa6, 0xab, 0xe1, 0x3c, 0x25, 0x08, 0xc6, 0xa0, 0x80,
  0x56, 0x12, 0x42, 0xe5, 0x0e, 0x5c, 0xbc, 0x3e, 0x4b, 0xde, 0xa6, 0xd2,
  0x56, 0x25, 0xd9, 0x31, 0x1c, 0xf8, 0xd9, 0xe3, 0x83, 0x47, 0xbb, 0x1b,
  0xf5, 0xf0, 0x36, 0xac, 0x10, 0xbe, 0x55, 0x94, 0xb1, 0xc4, 0xdc, 0x8b,
  0xb5, 0x31, 0x9a, 0x05, 0xae, 0xc4, 0x7c, 0xe8, 0xe3, 0xfb, 0xd3, 0x37,
  0x47, 0x27, 0xaf, 0xfe, 0x62, 0x0b, 0xe3, 0x69, 0x0f, 0xb4, 0xc2, 0xf2,
  0xa3, 0xb1, 0x5e, 0xef, 0x3e, 0xd6, 0x99, 0x99, 0x72, 0xb3, 0xf3, 0x68,
  0x17, 0x05, 0xec, 0x41, 0xf3, 0xbb, 0xcb, 0xac, 0x85, 0x2a, 0x20, 0x59,
  0xd2, 0x1b, 0x80, 0x71, 0xc6, 0xb6, 0x77, 0xe2, 0xfe, 0xc8, 0xb0, 0x67,
  0x49, 0xbb, 0x64, 0x80, 0x78, 0x47, 0xa4, 0x5e, 0x87, 0x88, 0x54, 0xb0,
  0xb3, 0xa4, 0x44, 0x3c, 0x68, 0xb1, 0xb2, 0x5a, 0xe4, 0xd3, 0x9c, 0xac,
  0x15, 0xb9, 0xd5, 0x94, 0x7d, 0x3d, 0x9f, 0xb7, 0xe1, 0xf7, 0x50, 0xa4,
  0x88, 0xb4, 0xec, 0x8d, 0xce, 0xb4, 0x36, 0xef, 0x6f, 0x20, 0x2c, 0xb2,
  0x45, 0x91, 0x35, 0x43, 0x99, 0xd6, 0x4b, 0xf3, 0xe7, 0x17, 0xd7, 0xe9,
  0x22, 0x28, 0x7d, 0xa5, 0xde, 0x71, 0x4a, 0x9b, 0x36, 0x79, 0x92, 0xde,
  0xf4, 0x5a, 0x4b, 0x8c, 0x6d, 0x87, 0x05, 0x7d, 0xd2, 0x5c, 0x95, 0xa0,
  0x93, 0xc2, 0xc5, 0xc5, 0x5f, 0xce, 0x8e, 0xbe, 0x78, 0x49, 0x6c, 0xec,
  0x4f, 0x94, 0x63, 0x5f, 0xb7, 0xb8, 0x5a, 0x42, 0xbd, 0xaa, 0x83, 0x35,
  0x7c, 0xff, 0xe6, 0x78, 0x7c, 0x76, 0x72, 0xfa, 0xfa, 0x8b, 0x97, 0xdf,
  0x93, 0x4d, 0x69, 0x84, 0xc7, 0x9d, 0xf7, 0xae, 0xfd, 0x99, 0x05, 0x8b,
  0x0f, 0x81, 0x13, 0x8e, 0xbe, 0xfb, 0x78, 0xf4, 0xfe, 0xdb, 0x2f, 0x5e,

  0x5e, 0xa7, 0xd5, 0x80, 0xd6, 0xc7, 0x6f, 0xf7, 0xb4, 0x66, 0x6c, 0x91,

  0x1a, 0x29, 0xe7, 0x93, 0xc5, 0xa7, 0x3a, 0xff, 0x47, 0x96, 0x98, 0xd7,
  0x17, 0xeb, 0x10, 0xae, 0xf9, 0x42, 0xda, 0xfd, 0x18, 0xe9, 0x4d, 0xe6,
  0xd0, 0x9f, 0x4f, 0xbe, 0x21, 0x48, 0x50, 0xeb, 0x28, 0x5d, 0x72, 0x7f,
  0x99, 0xe4, 0x4f, 0x4f, 0x0e, 0x0e, 0x77, 0x5d, 0x57, 0x43, 0x40, 0x0a,
  0x9b, 0x19, 0x7f, 0x0a, 0xaa, 0x43, 0xfe, 0xa1, 0xd0, 0x68, 0xb6, 0x77,
  0x48, 0xe3, 0x2c, 0x2a, 0x48, 0x0c, 0xf5, 0x3a, 0x01, 0x17, 0x80, 0xc1,
  0x4a, 0x4a, 0x62, 0x08, 0x84, 0xae, 0x14, 0x78, 0xdc, 0x2e, 0xde, 0x7a,
  0x60, 0x1e, 0x7f, 0x76, 0x84, 0x67, 0xa6, 0x23, 0x5e, 0xbb, 0x8d, 0xf2,
  0xf1, 0x57, 0x8c, 0xe5, 0x74, 0x4d, 0x4a, 0x6c, 0xb6, 0x11, 0x68, 0x42,
  0x3f, 0xf1, 0x7d, 0xf6, 0x62, 0xde, 0xa8, 0x74, 0x29, 0x19, 0x7e, 0x0e,
  0xab, 0x54, 0xc2, 0xd3, 0xda, 0xe9, 0x8d, 0x06, 0x71, 0xbe, 0xa4, 0x02,
  0x4b, 0x2a, 0x47, 0x60, 0xe7, 0x8e, 0xe7, 0xba, 0x59, 0x64, 0x97, 0xe9,
  0xf4, 0x2e, 0xb1, 0x40, 0xba, 0xd2, 0xdc, 0x72, 0xd6, 0xbd, 0x9d, 0xec,
  0xe3, 0x9b, 0x92, 0x2d, 0x67, 0x24, 0x30, 0xe1, 0x1b, 0x10, 0x57, 0x66,
  0xcc, 0x08, 0x2a, 0x48, 0x53, 0xbf, 0x4f, 0x6b, 0x76, 0x23, 0x96, 0x97,
  0xb4, 0xa9, 0x5d, 0xe9, 0xdc, 0xde, 0xe2, 0x0e, 0xf5, 0x11, 0xd9, 0xa0,
  0xe7, 0xea, 0xc6, 0x3d, 0x7d, 0xdc, 0xf6, 0x98, 0xff, 0x03, 0x97, 0x9c,
  0xd0, 0x86, 0xe0, 0x94, 0x7d, 0x49, 0x7f, 0xed, 0xc5, 0x1b, 0x67, 0xaf,

  0x05, 0x77, 0xd5, 0x75, 0x08, 0x7d, 0x16, 0x26, 0x4e, 0x1a, 0x78, 0x50,
  0x49, 0x70, 0xa3, 0x2e, 0xe0, 0x5e, 0x2c, 0x2f, 0xad, 0xe8, 0x23, 0x4f,
  0xb0, 0x79, 0xdc, 0xf6, 0xf4, 0xe9, 0x19, 0xd2, 0x16, 0xa1, 0x85, 0x21,
  0x1a, 0x14, 0x40, 0x51, 0x2a, 0xc2, 0x4b, 0x1a, 0x88, 0x38, 0x22, 0xa9,
  0x24, 0x66, 0xa3, 0xfe, 0xa4, 0x41, 0x9f, 0xd4, 0x87, 0x3b, 0xc1, 0x43,
  0x0c, 0x99, 0x41, 0x4a, 0x74, 0x15, 0xcd, 0x6e, 0x57, 0xbf, 0x01, 0x27,
  0x68, 0x50, 0x40, 0xcd, 0xc2, 0xe7, 0x9a, 0x49, 0xd6, 0xaa, 0x95, 0x52,
  0xad, 0x17, 0x8c, 0x74, 0x07, 0xb0, 0x19, 0x6b, 0x47, 0xa9, 0x95, 0x49,
  0x0a, 0x7b, 0xcc, 0xab, 0x92, 0x64, 0x04, 0xcc, 0x67, 0x67, 0x49, 0xcb,
  0xd8, 0x15, 0x10, 0x76, 0xc6, 0xbc, 0x4f, 0xfa, 0x1a, 0x53, 0x77, 0xc4,
  0x94, 0x19, 0x95, 0xc6, 0x20, 0x11, 0x65, 0x24, 0x14, 0x64, 0x12, 0x97,


  0x9f, 0x77, 0xb6, 0x23, 0x52, 0x65, 0xd9, 0x70, 0x12, 0x7f, 0x57, 0x44,
  0x11, 0x78, 0xb2, 0x26, 0xce, 0xb7, 0x46, 0xf0, 0xbb, 0x6e, 0xed, 0x0c,
  0x77, 0x6d, 0xa9, 0x74, 0xde, 0x58, 0xa5, 0x2d, 0x02, 0x2d, 0x92, 0x58,
  0x84, 0x67, 0x0b, 0x51, 0xc5, 0xbe, 0x4f, 0x89, 0xb7, 0x68, 0x33, 0x73,
  0xfa, 0xda, 0x1e, 0xd7, 0xb8, 0x29, 0x0f, 0xca, 0xc3, 0x12, 0xdb, 0x60,
  0xac, 0x22, 0xbb, 0xf1, 0xc7, 0x72, 0x66, 0x87, 0x1d, 0xef, 0xd7, 0xf4,
  0x76, 0x1b, 0x9b, 0x89, 0xea, 0x72, 0x92, 0x97, 0xdf, 0x1e, 0x9d, 0x8f,
  0x8f, 0x4f, 0xdf, 0xff, 0x29, 0x6a, 0x0e, 0xcb, 0x2f, 0x6d, 0x43, 0x2b,

  0xad, 0xe8, 0x73, 0x5d, 0x87, 0xc8, 0x0b, 0xa6, 0xbe, 0x16, 0x06, 0x77,
  0xc9, 0x0b, 0x7a, 0x24, 0xe8, 0x66, 0x34, 0xcd, 0x56, 0x0d, 0x97, 0x15,
  0xa9, 0x29, 0xed, 0x3a, 0x27, 0x52, 0xe2, 0x20, 0x1b, 0x71, 0xfb, 0x03,
  0xfd, 0xdb, 0x81, 0xfd, 0xdb, 0x61, 0x48, 0xed, 0xfc, 0x8b, 0x47, 0xc1,
  0x06, 0xc5, 0x13, 0x76, 0xbc, 0x78, 0xf9, 0x7a, 0xc5, 0xb5, 0x60, 0x84,
  0xd9, 0xc0, 0x08, 0x2f, 0xfe, 0x02, 0x02, 0x7c, 0x7a, 0x6a, 0x6c, 0xea,
  0xbf, 0x68, 0x1e, 0xbe, 0x3e, 0xf0, 0x2a, 0x58, 0xec, 0x73, 0x07, 0xb1,
  0xe7, 0x0e, 0xc2, 0xe7, 0x0e, 0x63, 0xcf, 0x1d, 0x86, 0xcf, 0x3d, 0x8a,
  0x3d, 0xe7, 0xad, 0xd7, 0x73, 0xfc, 0xc9, 0xc6, 0x6d, 0xb2, 0x8c, 0x5b,
  0xff, 0x7a, 0x34, 0x72, 0xc7, 0xff, 0x99, 0xf5, 0x56, 0x74, 0x5b, 0x72,
  0xfe, 0x24, 0xc3, 0xfe, 0x55, 0xa7, 0xe3, 0xb7, 0xd1, 0x12, 0x3b, 0x2e,
  0x66, 0xf3, 0xbd, 0x83, 0x47, 0xc3, 0x69, 0xbe, 0xba, 0x22, 0xb9, 0xf3,
  0x52, 0x3b, 0x58, 0xd1, 0xe6, 0xd3, 0x62, 0xe5, 0x17, 0x6b, 0xb2, 0xc8,
  0x43, 0x3d, 0xe4, 0x64, 0xec, 0xc3, 0xb2, 0x08, 0x12, 0x21, 0xde, 0x48,
  0xf8, 0x15, 0x07, 0xca, 0xd2, 0xf5, 0x2f, 0x87, 0x70, 0x48, 0x79, 0x93,
  0x58, 0xef, 0x0d, 0x39, 0x7a, 0x64, 0x0a, 0x4c, 0xbc, 0x3a, 0x2f, 0x9d,
  0xa8, 0x0c, 0xcf, 0x9d, 0xe1, 0x38, 0xf4, 0xde, 0x75, 0xed, 0x02, 0xca,
  0x5f, 0x9e, 0x17, 0x28, 0x2f, 0xea, 0x40, 0x55, 0x74, 0xd6, 0xc6, 0x43,
  0x39, 0x18, 0x2f, 0x14, 0xcf, 0x84, 0xa2, 0xf2, 0xc3, 0xf9, 0x49, 0xa0,
  0x5a, 0xda, 0x6e, 0xeb, 0xe8, 0xa4, 0x7c, 0x95, 0xde, 0xde, 0x8e, 0xea,
  0x6c, 0xcf, 0xf0, 0x93, 0x7a, 0x0f, 0x0e, 0x5f, 0xf9, 0xf6, 0x55, 0xb3,
  0x5c, 0x6c, 0x76, 0xd4, 0xe6, 0xec, 0xd7, 0x92, 0xc6, 0xd7, 0xcc, 0x3b,

  0x50, 0x61, 0xde, 0x6a, 0x66, 0x6a, 0x8f, 0x38, 0x2c, 0xf5, 0x92, 0x8e,
  0x91, 0xe8, 0x57, 0x7b, 0x40, 0x92, 0x0f, 0x12, 0x13, 0xe1, 0x4c, 0xc4,
  0x21, 0x00, 0xfb, 0xca, 0x99, 0x0f, 0x0e, 0x23, 0x84, 0x5e, 0xa0, 0xb2,
  0xc1, 0x2c, 0x08, 0x67, 0x58, 0x34, 0x90, 0xea, 0xce, 0x76, 0x0d, 0x8f,
  0xed, 0x5a, 0xed, 0x07, 0x3e, 0x10, 0x2b, 0xe4, 0x25, 0x47, 0xd5, 0x8c,
  0x5f, 0x99, 0x69, 0x52, 0x4a, 0x1e, 0x29, 0xf3, 0x46, 0xe5, 0x30, 0xff,
  0xfd, 0x53, 0x58, 0x5c, 0x8b, 0x15, 0x74, 0x13, 0xf7, 0x48, 0xfb, 0xa7,
  0x92, 0x2f, 0xde, 0x7a, 0xfe, 0x5a, 0xab, 0x11, 0x00, 0xd0, 0x65, 0xe2,
  0x25, 0xd0, 0x38, 0xb6, 0xad, 0xf1, 0xf9, 0xd9, 0xd6, 0x80, 0xf3, 0x35,
  0xe9, 0x0b, 0x43, 0xf3, 0xef, 0x04, 0x56, 0x26, 0xb5, 0x11, 0x79, 0xf2,
  0x78, 0x57, 0xf0, 0x40, 0x31, 0x47, 0x34, 0xc0, 0x8a, 0x84, 0x8f, 0xf0,
  0x4b, 0x97, 0x5c, 0x58, 0xb5, 0x1a, 0xfe, 0x18, 0xfb, 0xaf, 0xbd, 0x40,
  0xce, 0xfa, 0x19, 0x70, 0x16, 0xc7, 0x06, 0xb5, 0xce, 0x87, 0xb7, 0xe3,
  0x79, 0x8e, 0x3a, 0x11, 0x9a, 0xb2, 0xfa, 0x24, 0x7d, 0x0f, 0x24, 0xca,
  0x01, 0xe6, 0x12, 0x74, 0x99, 0x6d, 0x31, 0x9b, 0xb6, 0x77, 0xd4, 0x5b,
  0xb3, 0x6c, 0x98, 0xc3, 0xfa, 0xea, 0x69, 0xa5, 0xaa, 0xb4, 0x6a, 0x36,
  0xec, 0xab, 0x62, 0x4d, 0x87, 0x82, 0x81, 0x74, 0x1c, 0x19, 0xe6, 0x1e,
  0x4c, 0x8e, 0xc7, 0x9d, 0xd3, 0xd7, 0xcd, 0x8b, 0x1c, 0xbb, 0x6b, 0x9e,
  0x8e, 0x43, 0x82, 0x4d, 0xa3, 0xb8, 0x83, 0x11, 0x92, 0x50, 0x0c, 0xb4,

  0xbe, 0x6a, 0x32, 0xc5, 0xd0, 0xf0, 0x4e, 0x64, 0xa4, 0xc1, 0x37, 0x61,
  0xd3, 0xee, 0xac, 0x3d, 0xdc, 0xff, 0xfb, 0x17, 0xe4, 0xaf, 0x07, 0x6f,
  0x47, 0x13, 0xae, 0x69, 0x49, 0x9a, 0x90, 0xfa, 0xa0, 0x05, 0xe9, 0x8a,
  0x36, 0x2c, 0x49, 0x8e, 0xb2, 0xb3, 0x28, 0xb7, 0x2a, 0x6f, 0x59, 0x8e,
  0x4a, 0x69, 0x69, 0x01, 0xe9, 0x3d, 0x68, 0xa1, 0xad, 0x95, 0x92, 0x88,
  0x8c, 0x0a, 0x16, 0x71, 0xf8, 0xfb, 0xfe, 0x7e, 0x4f, 0x25, 0x80, 0x0a,
  0xa0, 0x8c, 0xae, 0x9d, 0x6e, 0xdc, 0x5b, 0x55, 0x21, 0xae, 0x7f, 0x1a,
  0x45, 0xfb, 0x35, 0x44, 0xd0, 0x5b, 0xc8, 0x65, 0xaa, 0x5f, 0x91, 0x2e,
  0x81, 0xd2, 0xfa, 0xb7, 0x13, 0xdc, 0x54, 0xc5, 0x91, 0x13, 0xc0, 0x90,
  0xa1, 0xd0, 0x19, 0xee, 0x23, 0xdd, 0xad, 0x8f, 0xc2, 0x3a, 0x8d, 0x06,
  0x45, 0x77, 0x19, 0xf0, 0x80, 0x39, 0x81, 0xcc, 0xa7, 0x80, 0x7b, 0xa4,

  0x48, 0x41, 0x8d, 0xf6, 0x18, 0xae, 0x53, 0x8b, 0x08, 0xa1, 0x2e, 0x97,
  0xa7, 0x71, 0xcc, 0x35, 0xa4, 0xd6, 0xbe, 0xea, 0x8d, 0x55, 0x6d, 0xb1,


  0x03, 0x1e, 0x85, 0xf6, 0x08, 0x56, 0x29, 0x94, 0x6d, 0x0b, 0x74, 0xff,
  0xfb, 0xaa, 0xa1, 0x43, 0x55, 0x81, 0x34, 0x98, 0x9f, 0x77, 0x58, 0x07,
  0xff, 0x7b, 0x1d, 0xd6, 0xc1, 0xff, 0x19, 0x87, 0x75, 0xf8, 0xf3, 0x0e,
  0xeb, 0xf0, 0x7f, 0xaf, 0xc3, 0x3a, 0xfc, 0x3f, 0xe3, 0xb0, 0x1e, 0xfd,
  0xbc, 0xc3, 0x7a, 0xf4, 0xcb, 0x1f, 0x96, 0xeb, 0x94, 0xae, 0x5a, 0x5f,
  0x2e, 0x7a, 0x82, 0xd3, 0x8a, 0x26, 0x77, 0x68, 0xb2, 0x3d, 0xa1, 0x0d,
  0x11, 0x83, 0x41, 0x94, 0xc9, 0xba, 0x6b, 0x35, 0xbd, 0x72, 0x18, 0xd4,
  0xb6, 0x19, 0x84, 0xc4, 0xa0, 0x04, 0x93, 0x9b, 0x54, 0x9e, 0x3f, 0x97,
  0xe4, 0x42, 0x31, 0x9a, 0xc1, 0x20, 0x79, 0x3f, 0x1e, 0x73, 0xda, 0xd1,
  0x18, 0xa1, 0xd3, 0xee, 0x61, 0x91, 0x33, 0x12, 0x36, 0xce, 0x0e, 0xa9,
  0x8d, 0xa7, 0x66, 0x86, 0x8e, 0xbb, 0xf0, 0x7b, 0xcb, 0x74, 0x4a, 0x3f,
  0xde, 0x1f, 0x1d, 0xb8, 0xdd, 0xd9, 0xfd, 0x09, 0x80, 0x57, 0x2e, 0xae,
  0x19, 0x0f, 0x46, 0x47, 0xa0, 0xa9, 0x81, 0xf4, 0x5c, 0x37, 0x9d, 0xc3,
  0xb9, 0x6d, 0x47, 0xa5, 0x7b, 0x41, 0x90, 0x63, 0xa7, 0xc2, 0xe9, 0x17,
  0x8a, 0x22, 0x48, 0xbf, 0x70, 0x16, 0x3a, 0x0c, 0xe0, 0xc0, 0xfa, 0x96,
  0x5e, 0xf3, 0x3f, 0x23, 0xb2, 0xec, 0x05, 0x72, 0xff, 0xe7, 0x44, 0x96,
  0x1f, 0x64, 0x1f, 0xfb, 0x57, 0xa6, 0x1a, 0x6a, 0x07, 0xa9, 0x38, 0x4e,
  0xb5, 0xf3, 0x2c, 0x52, 0x29, 0x10, 0x10, 0xec, 0x66, 0x4c, 0x3a, 0x94,
  0x69, 0x73, 0x24, 0xef, 0xba, 0xe0, 0x1e, 0x9b, 0x31, 0x21, 0xce, 0x8c,
  0x54, 0xda, 0x59, 0x58, 0x15, 0x05, 0xb6, 0xe0, 0x55, 0xd6, 0x4c, 0x6f,
  0xeb, 0x42, 0x3f, 0x22, 0xb9, 0xa1, 0xe4, 0x22, 0x67, 0x90, 0xa7, 0xb0,
  0x41, 0x79, 0xc6, 0x10, 0x40, 0xf9, 0x7d, 0x9a, 0xd2, 0xd3, 0xf6, 0x7a,
  0xd3, 0x69, 0x36, 0x4c, 0xeb, 0x69, 0x9e, 0xc7, 0x5b, 0x58, 0x6a, 0x1c,
  0x38, 0x4d, 0xe6, 0x6b, 0x78, 0xf0, 0xcd, 0xf3, 0x09, 0xc5, 0xdc, 0xb4,
  0x21, 0x35, 0x71, 0x44, 0xa0, 0xe2, 0xd0, 0x84, 0xcb, 0x75, 0x73, 0x59,
  0xaa, 0x33, 0x7f, 0x10, 0x71, 0x0c, 0x52, 0x54, 0x8e, 0x11, 0x98, 0xeb,
  0x69, 0x95, 0xaf, 0x00, 0xb8, 0xe9, 0x35, 0xbf, 0x1a, 0xd8, 0xce, 0xd0,
  0xf0, 0xb4, 0x69, 0xe8, 0x94, 0x7b, 0x25, 0x13, 0x07, 0xed, 0xe2, 0x92,
  0x0f, 0xb7, 0xc8, 0xad, 0x69, 0xbb, 0x06, 0x99, 0xb7, 0x09, 0x25, 0xd9,
  0x8b, 0x5a, 0x92, 0x57, 0xbd, 0xd9, 0x10, 0x86, 0xd7, 0x30, 0x86, 0x21,
  0xa1, 0x3b, 0x45, 0xe2, 0x45, 0x63, 0x04, 0x0d, 0x50, 0x4e, 0x18, 0x6c,
  0x9d, 0x1c, 0xec, 0x8a, 0x7a, 0x7f, 0x95, 0xdd, 0x72, 0x21, 0x69, 0x68,
  0x72, 0x31, 0x37, 0xbb, 0xd2, 0x22, 0xcb, 0x57, 0xe3, 0xd7, 0xc7, 0xc7,
  0xad, 0xa2, 0x53, 0xda, 0x3a, 0x44, 0x52, 0x19, 0xcd, 0x24, 0xa9, 0x09,
  0xcc, 0x14, 0x70, 0x22, 0xb1, 0x28, 0x3c, 0x37, 0xc5, 0x33, 0xd7, 0x0f,
  0x91, 0x17, 0xc3, 0x08, 0x72, 0x6d, 0x59, 0x98, 0x72, 0x8a, 0xd7, 0xba,
  0x30, 0xd3, 0xcc, 0x09, 0x61, 0xea, 0x6a, 0xbd, 0x4c, 0x8b, 0x5f, 0x1f,

  0x46, 0xc7, 0x37, 0xf4, 0x5c, 0x29, 0x87, 0xec, 0x16, 0xdf, 0x2b, 0x3f,

  0xd6, 0x1b, 0xd2, 0x5a, 0xa4, 0x01, 0xc1, 0x59, 0x25, 0xed, 0xe9, 0x00,
  0xa3, 0x05, 0x7f, 0x3b, 0x37, 0x11, 0xa0, 0x16, 0xea, 0x84, 0xe7, 0xc7,
  0x83, 0x9b, 0xe5, 0x6a, 0x04, 0x19, 0xf0, 0xdc, 0x36, 0xb8, 0xd4, 0x75,
  0x0a, 0x72, 0x18, 0x6d, 0x63, 0xb5, 0xdc, 0x41, 0x57, 0x54, 0xe2, 0x0b,
  0xbf, 0xe5, 0x0d, 0x68, 0x5d, 0x81, 0xfb, 0xef, 0x00, 0x5f, 0x81, 0x5f,

  0xe2, 0x06, 0x48, 0x21, 0xd1, 0xd6, 0xef, 0xb7, 0x92, 0x78, 0x8b, 0x8a,
  0x07, 0x8c, 0xd3, 0x02, 0x60, 0xf9, 0x6d, 0x29, 0x2d, 0x82, 0x08, 0xe3,
  0x31, 0x31, 0xff, 0x4c, 0xd7, 0x45, 0x7e, 0x8b, 0x8a, 0x0e, 0xa3, 0x4a,
  0xbc, 0xa4, 0x0e, 0x0d, 0x3d, 0xad, 0x07, 0x5e, 0xb3, 0x62, 0x93, 0x68,
  0x7d, 0x0a, 0x56, 0xf1, 0xc1, 0xbc, 0x6c, 0x14, 0xc6, 0x25, 0xe5, 0xf7,
  0xf0, 0x18, 0x03, 0x1f, 0x03, 0x1a, 0x6c, 0x3d, 0x92, 0x1f, 0x54, 0x64,
  0x0d, 0xb9, 0x3f, 0x36, 0x46, 0xb6, 0xda, 0xd1, 0xc2, 0x0b, 0xf4, 0x7a,


  0x5b, 0x51, 0xd1, 0xc0, 0x86, 0x4e, 0xc2, 0xd8, 0x0c, 0x97, 0xa4, 0xdf,
  0x0e, 0x20, 0x78, 0xed, 0x86, 0x84, 0x74, 0x6c, 0x4b, 0x1b, 0xee, 0x3f,
  0x11, 0x4b, 0x65, 0xb2, 0x7d, 0x52, 0x5c, 0x93, 0xa1, 0xbc, 0x1b, 0x99,
  0x40, 0x23, 0x1b, 0x17, 0xbe, 0x95, 0x2e, 0x80, 0xa1, 0xec, 0xee, 0xf4,
  0x3b, 0x1a, 0x79, 0xad, 0x57, 0x5b, 0xdd, 0x98, 0x80, 0xc6, 0x96, 0x2f,



  0x88, 0xfc, 0xf7, 0x34, 0xbd, 0x61, 0x11, 0xe6, 0xde, 0xbb, 0x26, 0x3f,
  0xc2, 0xeb, 0xa8, 0xd2, 0x0b, 0x41, 0x4e, 0xfa, 0x37, 0x90, 0x94, 0x54,
  0x89, 0x68, 0xaf, 0x82, 0x7b, 0x76, 0x75, 0xd5, 0x17, 0x2f, 0xfe, 0x7c,
  0x45, 0x5d, 0x9f, 0x75, 0x5e, 0x15, 0x13, 0x62, 0xbb, 0xaf, 0xb7, 0x86,


  0xb4, 0xbd, 0xc6, 0x25, 0x41, 0x5e, 0x33, 0x5f, 0x8f, 0x75, 0x9d, 0x89,
  0x2e, 0xc5, 0x08, 0x9b, 0x54, 0x6a, 0x47, 0x8d, 0x12, 0x28, 0x4f, 0xcf,
  0x76, 0x99, 0xe5, 0x83, 0xe5, 0xf6, 0xd4, 0x52, 0xd3, 0x1b, 0x20, 0x88,
  0xe6, 0x8b, 0x91, 0x5f, 0x35, 0x21, 0x6e, 0x5a, 0x2d, 0xd6, 0xda, 0x31,
  0xca, 0x3a, 0x6b, 0x6e, 0x7c, 0x79, 0xa8, 0xc9, 0x81, 0x22, 0x50, 0xf7,
  0xc3, 0x13, 0xc7, 0xe1, 0x9d, 0xda, 0x19, 0x6c, 0xc4, 0x3a, 0x76, 0x52,
  0x85, 0x71, 0xa4, 0x60, 0xd9, 0xae, 0xaa, 0x9d, 0xe6, 0x8a, 0xe7, 0x85,
  0x4f, 0xef, 0x69, 0x34, 0x38, 0x2a, 0x72, 0xf9, 0x95, 0xa0, 0x67, 0x67,
  0xea, 0xea, 0xf4, 0xbe, 0x31, 0x32, 0x5c, 0xc6, 0x7c, 0x44, 0xbf, 0x22,
  0xc5, 0x32, 0xbb, 0x41, 0xcf, 0x85, 0x3b, 0xc6, 0xfd, 0xf7, 0xea, 0x8f,

  0xfd, 0xa6, 0x1b, 0x34, 0xd5, 0xce, 0xd4, 0x90, 0x57, 0x8d, 0xc4, 0x83,

  0xf0, 0x26, 0x02, 0xa4, 0x40, 0x4d, 0x3c, 0x08, 0x4b, 0xb4, 0x4a, 0x91,
  0xbe, 0xd0, 0xcc, 0xcd, 0x04, 0x2a, 0x93, 0x87, 0x83, 0xcf, 0x75, 0x92,
  0x09, 0x84, 0x62, 0xe0, 0xa9, 0x44, 0x27, 0xb7, 0x68, 0xd3, 0x1e, 0xee,
  0x32, 0xa9, 0x55, 0x7a, 0xc4, 0xd3, 0xc2, 0x0b, 0x6d, 0x9b, 0xa2, 0x51,
  0x9f, 0x95, 0x52, 0x43, 0x16, 0xfd, 0x7d, 0x27, 0x46, 0xc9, 0x11, 0x3d,

  0x1d, 0x0e, 0xf4, 0x07, 0x8c, 0x00, 0x30, 0x6c, 0xd7, 0xf0, 0x90, 0x7b,
  0x87, 0x87, 0x74, 0x25, 0x94, 0xc7, 0xb8, 0xa0, 0x94, 0x75, 0x87, 0x12,
  0xff, 0x91, 0x74, 0xf4, 0x21, 0xb5, 0x5d, 0x75, 0xcd, 0x64, 0xeb, 0x72,
  0x51, 0x4e, 0x26, 0x66, 0xf1, 0x5b, 0xaa, 0xa5, 0x98, 0x6f, 0x07, 0xbe,
  0x64, 0x7f, 0x26, 0x69, 0x75, 0x09, 0x4b, 0x7a, 0x00, 0x33, 0x82, 0x1d,
  0xf5, 0x34, 0x0b, 0xd7, 0x31, 0x54, 0x3f, 0xaf, 0x90, 0xcf, 0x11, 0x39,
  0xc3, 0xd9, 0x80, 0x96, 0x00, 0x69, 0x6d, 0x2d, 0xbf, 0x3f, 0x0a, 0x1a,
  0xe9, 0xa7, 0x3a, 0x3d, 0xce, 0x36, 0xec, 0x4b, 0x97, 0x75, 0x7d, 0x36,
  0xc0, 0xb6, 0xa4, 0xe5, 0x5a, 0x5e, 0x87, 0xf1, 0x15, 0x6c, 0x41, 0x7b,
  0x41, 0x5b, 0xff, 0x45, 0x7f, 0x1c, 0x0c, 0xe8, 0xbf, 0x87, 0xff, 0xdc,



  0x42, 0x08, 0xe6, 0xc5, 0xde, 0xde, 0xcd, 0xcd, 0xcd, 0x48, 0x1a, 0x4a,
  0x8c, 0xcc, 0x91, 0x7d, 0x16, 0x56, 0xfe, 0x11, 0x0e, 0x5b, 0xcf, 0x07,
  0x2e, 0x92, 0xad, 0x7c, 0x79, 0xf9, 0xd7, 0x83, 0xe1, 0xc1, 0xfe, 0xfe,
  0xfe, 0x8f, 0xa3, 0x15, 0xed, 0xef, 0x1c, 0xc3, 0x9a, 0xff, 0xfa, 0xc3,
  0xee, 0xf1, 0x4c, 0xf6, 0xa2, 0xd0, 0x96, 0xfc, 0x3b, 0xb5, 0xb2, 0x0b,
  0x6e, 0x4e, 0xc0, 0xa4, 0xfc, 0xc2, 0x63, 0x31, 0x1c, 0x47, 0x4e, 0x37,
  0xd5, 0xd1, 0x73, 0xea, 0x20, 0x85, 0x10, 0x9e, 0x3c, 0x3a, 0x3c, 0x4c,
  0x58, 0xe1, 0xe0, 0xf2, 0x34, 0x4e, 0x65, 0x20, 0x64, 0x02, 0xe9, 0xa4,
  0xcc, 0xb2, 0x6c, 0x4a, 0x00, 0x6d, 0x1c, 0xac, 0x31, 0x94, 0xd1, 0x93,
  0xd2, 0xc9, 0x86, 0x71, 0x6e, 0x04, 0x79, 0x39, 0xbb, 0x73, 0xa3, 0x1a,
  0x12, 0xaf, 0x88, 0xb1, 0x52, 0x33, 0x44, 0xae, 0xf9, 0x4a, 0x24, 0x4e,
  0x21, 0xd9, 0xd6, 0x41, 0x39, 0xa1, 0xb4, 0xf8, 0x82, 0x94, 0x03, 0x1c,
  0x68, 0x51, 0x4a, 0x3f, 0x5f, 0x44, 0xee, 0xe7, 0xeb, 0x4a, 0xba, 0xb9,
  0x20, 0xd1, 0xe1, 0x26, 0xbd, 0x6b, 0x09, 0x7b, 0xb3, 0xe3, 0x2f, 0xcd,
  0x7f, 0x02, 0xbf, 0xb6, 0x5c, 0x4d, 0x52, 0x2d, 0x6d, 0x3b, 0xda, 0x79,
  0xd6, 0x4c, 0xaf, 0xba, 0xe9, 0x96, 0xe0, 0xe0, 0x66, 0xb6, 0x57, 0x66,
  0x41, 0x77, 0xb6, 0x71, 0x74, 0xac, 0xd3, 0x9d, 0x57, 0x97, 0x6b, 0x86,
  0xa4, 0xc6, 0x06, 0x28, 0x4d, 0xe0, 0xc6, 0xd7, 0xcc, 0x14, 0xa3, 0xca,
  0x51, 0xe6, 0xfa, 0xc3, 0xe1, 0x7b, 0x79, 0xad, 0x65, 0xc3, 0xd3, 0xab,
  0x6c, 0x29, 0x1c, 0x73, 0x47, 0x73, 0x26, 0xb7, 0x84, 0x06, 0xb7, 0x22,
  0x16, 0xf9, 0xd6, 0x5c, 0x7f, 0x65, 0x56, 0xb2, 0x2b, 0x85, 0xb7, 0x56,
  0xcc, 0x49, 0xcf, 0x97, 0xcb, 0x35, 0x19, 0x8e, 0x93, 0x54, 0xe4, 0x89,
  0xd6, 0x83, 0xf7, 0x64, 0x36, 0x1b, 0xb6, 0x98, 0x55, 0x10, 0x62, 0xf5,
  0x7a, 0x32, 0x14, 0xcd, 0x07, 0x33, 0x42, 0x72, 0x09, 0xdd, 0xd6, 0x37,
  0xc7, 0xaf, 0x2f, 0xb8, 0x04, 0xd6, 0xfc, 0x97, 0xaa, 0x65, 0xcc, 0x1f,
  0x54, 0xf9, 0x1a, 0x36, 0xe4, 0x39, 0x7b, 0xc4, 0x29, 0x44, 0x20, 0x56,
  0x1b, 0x51, 0x4a, 0x5d, 0x9a, 0x5d, 0x4b, 0xf5, 0x1b, 0x78, 0xed, 0x1d,
  0x22, 0xb9, 0xc3, 0x2d, 0x2d, 0xd1, 0x56, 0x4e, 0x3f, 0x7e, 0x32, 0xda,
  0xe7, 0x25, 0xd2, 0x1e, 0x4a, 0x06, 0x8d, 0x54, 0x6a, 0xc1, 0x8d, 0xa4,
  0x11, 0xc6, 0x34, 0x9e, 0x33, 0x60, 0xa7, 0x32, 0x48, 0x18, 0xe7, 0x99,
  0xa1, 0x14, 0xf4, 0xb7, 0x5e, 0xb6, 0xe4, 0x3d, 0xe5, 0x30, 0x2a, 0xbb,
  0x24, 0x47, 0xf8, 0xae, 0x8b, 0xd1, 0x0b, 0x04, 0x65, 0xad, 0xd2, 0x01,
  0x13, 0x8e, 0x95, 0xcb, 0x09, 0x4d, 0x48, 0xde, 0xf8, 0xc0, 0x75, 0xd8,

  0x29, 0x49, 0x0a, 0x88, 0xcc, 0x92, 0xea, 0x23, 0x74, 0xa4, 0x74, 0x2d,
  0xdd, 0x62, 0xfa, 0x49, 0xd0, 0xba, 0x68, 0xf8, 0x67, 0xe9, 0x29, 0xcc,





  0x7a, 0x72, 0xac, 0xf4, 0x0b, 0x67, 0xb9, 0xab, 0x69, 0xae, 0x6c, 0xba,
  0xaa, 0xca, 0x39, 0x22, 0x87, 0x21, 0x9f, 0x7c, 0xd3, 0xed, 0x3e, 0x9d,
  0x05, 0x36, 0x0e, 0xf0, 0x4d, 0xbc, 0xea, 0xbe, 0x14, 0xcb, 0x63, 0x11,
  0xc1, 0x86, 0x1e, 0x47, 0x86, 0xb6, 0xfe, 0x48, 0x21, 0xa1, 0x2f, 0x5e,
  0xd9, 0x08, 0x62, 0x1c, 0xca, 0x08, 0xea, 0x54, 0xcd, 0xfc, 0xad, 0x6d,

  0xcc, 0x08, 0x4f, 0x23, 0xbe, 0x9f, 0xdd, 0x32, 0x66, 0x27, 0x4e, 0xee,
  0x26, 0x2f, 0x1e, 0x1d, 0x26, 0xf5, 0x9d, 0xd1, 0x20, 0x96, 0xfe, 0x26,

  0x74, 0x1b, 0x2b, 0x47, 0x43, 0x61, 0xad, 0x8e, 0x64, 0xcc, 0xba, 0x3e,
  0xd0, 0x2b, 0xaf, 0xf0, 0x8a, 0x74, 0x31, 0xd2, 0x7c, 0xbd, 0x07, 0x74,
  0xeb, 0x2e, 0x95, 0x89, 0x4d, 0x16, 0x69, 0xf1, 0xc9, 0x66, 0x55, 0xf3,
  0x40, 0x03, 0x6a, 0x82, 0xc9, 0x85, 0xa4, 0xee, 0x87, 0xb2, 0x3d, 0x2c,
  0x18, 0x83, 0x6e, 0x51, 0x50, 0xec, 0x97, 0x69, 0x85, 0x1a, 0x43, 0x6c,
  0x9b, 0xa4, 0x3f, 0x3f, 0xa8, 0x25, 0x78, 0x28, 0xc2, 0x38, 0xc6, 0xce,
  0xb8, 0x3f, 0x9a, 0x43, 0xde, 0xd3, 0xf9, 0xea, 0x97, 0x8b, 0xad, 0xaf,
  0xf5, 0x24, 0x0c, 0xd7, 0x36, 0xff, 0x7d, 0xa1, 0x01, 0xc0, 0x3e, 0xfe,
  0xdd, 0x08, 0x56, 0x99, 0xeb, 0xec, 0x6c, 0x43, 0x86, 0x7e, 0xab, 0x4e,
  0x56, 0xf1, 0x5c, 0xa8, 0x32, 0x16, 0x61, 0x1f, 0x25, 0xa7, 0xce, 0x9c,
  0x2c, 0x06, 0xc0, 0xc4, 0x6d, 0xaa, 0xa9, 0x18, 0x93, 0xf8, 0xbb, 0xa4,
  0x6e, 0xa6, 0x8b, 0x68, 0xeb, 0x69, 0x68, 0x39, 0x35, 0x65, 0x45, 0xde,
  0x39, 0xdd, 0xcf, 0x13, 0x71, 0xdc, 0x15, 0xd2, 0xf1, 0x63, 0xb3, 0xb5,
  0xd4, 0x3e, 0x11, 0xd0, 0x55, 0x41, 0x66, 0x36, 0x2f, 0x22, 0xda, 0x48,


  0x24, 0xbe, 0xde, 0x5a, 0x22, 0xf9, 0x0b, 0x23, 0x13, 0xd7, 0x2b, 0x1b,
  0x7a, 0x48, 0x04, 0xa4, 0x81, 0xd0, 0x5f, 0xca, 0x62, 0x10, 0xe0, 0x3b,
  0x21, 0x76, 0x2e, 0x4e, 0x27, 0xca, 0x0a, 0x5c, 0x4a, 0xaf, 0xe2, 0xcc,


  0xba, 0x9a, 0xf9, 0x4d, 0x25, 0x4f, 0xf7, 0xf1, 0x7b, 0x5a, 0xaa, 0x72,
  0xcf, 0x13, 0x3d, 0x0c, 0x43, 0x83, 0x03, 0xae, 0xe5, 0x0b, 0x96, 0x74,
  0x5a, 0xe8, 0x8d, 0x14, 0xb8, 0xa9, 0x9c, 0x0b, 0xa9, 0x6b, 0x7f, 0xaf,
  0xae, 0xa8, 0x39, 0x8d, 0xe7, 0xfd, 0x10, 0xcc, 0x2e, 0xa3, 0x6f, 0x06,
  0xfa, 0x32, 0xa0, 0xd6, 0x39, 0x13, 0xd1, 0xec, 0x30, 0xe9, 0x2a, 0xc8,
  0xe7, 0xa1, 0x84, 0x49, 0x97, 0x9e, 0x4c, 0x1a, 0x45, 0x56, 0xb0, 0x5d,
  0x5f, 0x2a, 0xf8, 0x5a, 0x32, 0x0d, 0xb1, 0x13, 0x67, 0x0c, 0xad, 0x5b,
  0xf3, 0x88, 0xb6, 0x91, 0xf3, 0xa5, 0x48, 0x91, 0x9a, 0xd2, 0x3c, 0x0d,
  0x43, 0xe3, 0xa6, 0x1b, 0xb4, 0x39, 0xb5, 0xdb, 0xf9, 0x48, 0xf3, 0x1c,
  0x5e, 0x69, 0xa2, 0xed, 0x02, 0xee, 0x7c, 0xc8, 0x5f, 0x73, 0x1b, 0xae,

  0x73, 0xde, 0x7b, 0x86, 0x33, 0x9b, 0x54, 0x79, 0x36, 0x37, 0xdc, 0x0b,
  0x4b, 0xe2, 0x14, 0xd2, 0xc0, 0x6b, 0x94, 0xa5, 0x15, 0xc4, 0x1f, 0x69,
  0x07, 0x54, 0x40, 0x9c, 0xc3, 0x71, 0xc4, 0x3c, 0xd1, 0x82, 0xcb, 0x31,
  0x98, 0xf6, 0xb5, 0x36, 0xa8, 0x4d, 0xb5, 0xa4, 0x29, 0x9a, 0x9f, 0x89,
  0x7e, 0xd3, 0xe2, 0xf1, 0x24, 0x02, 0x2b, 0xe8, 0x16, 0xdb, 0x86, 0x75,
  0xf8, 0x22, 0xb3, 0x55, 0xd1, 0x6e, 0xbc, 0xae, 0x47, 0x3d, 0x1d, 0x44,
  0x61, 0x3f, 0x7d, 0x93, 0x55, 0x46, 0xfc, 0x95, 0x66, 0xdd, 0xdf, 0x3e,
  0xd1, 0x28, 0x84, 0x34, 0xdf, 0x16, 0x65, 0x44, 0x6e, 0x29, 0x1a, 0xc1,
  0x61, 0xea, 0x41, 0xf8, 0x82, 0x8b, 0x37, 0x68, 0x6f, 0xf5, 0x4d, 0x5f,
  0x21, 0xe9, 0x52, 0xe8, 0x00, 0x20, 0xc5, 0x86, 0xfa, 0x48, 0xbd, 0x8c,
  0x77, 0x59, 0xb2, 0xad, 0xbe, 0x49, 0xfd, 0x33, 0x1a, 0x16, 0x51, 0x0b,
  0xb9, 0xf3, 0xa8, 0x53, 0xf8, 0xa4, 0x49, 0xb9, 0x51, 0xb1, 0x9d, 0xf9,
  0x45, 0x4e, 0x0e, 0x1f, 0xcd, 0x73, 0x8a, 0x96, 0xf5, 0x48, 0x17, 0x76,
  0x87, 0x0f, 0xde, 0x49, 0x8f, 0x20, 0x2d, 0xb2, 0xbe, 0x22, 0x45, 0x8c,
  0xf4, 0x03, 0x18, 0xf9, 0x71, 0xf5, 0x1e, 0x9b, 0xf6, 0xfe, 0xe2, 0xe4,
  0xdd, 0xa0, 0x73, 0xed, 0x44, 0xa5, 0xf1, 0x2c, 0x62, 0x65, 0x39, 0x42,
  0x53, 0x21, 0x26, 0x40, 0x95, 0xc8, 0x7e, 0xd8, 0x12, 0x43, 0xc6, 0xa4,
  0xa0, 0xad, 0x1b, 0x48, 0x32, 0x4e, 0x25, 0xa5, 0x6b, 0x6a, 0xf6, 0xf3,
  0xbe, 0x86, 0x9e, 0x6c, 0x22, 0xc2, 0x1a, 0x67, 0x0f, 0x57, 0x89, 0x91,
  0x27, 0x86, 0xd9, 0x78, 0x0d, 0xf6, 0x42, 0x8e, 0xe5, 0xb4, 0x62, 0xf7,
  0x55, 0x5e, 0x0a, 0xb1, 0x17, 0x6e, 0x0c, 0x90, 0xbc, 0x29, 0x6f, 0x8a,
  0xe1, 0x09, 0x55, 0x1f, 0x27, 0x27, 0xe5, 0x25, 0xdd, 0xa0, 0xf7, 0x80,
  0x8f, 0x0a, 0x4e, 0xed, 0xc3, 0xd9, 0xfb, 0x64, 0x87, 0xe4, 0x6e, 0x72,
  0x66, 0x31, 0xe7, 0xe8, 0xd1, 0x5d, 0x31, 0x31, 0x6a, 0x56, 0x49, 0x64,
  0x36, 0x83, 0xe4, 0xe8, 0xfb, 0x57, 0xef, 0xce, 0x4e, 0x8e, 0x7e, 0xe0,
  0x04, 0x99, 0x60, 0x39, 0xf4, 0xe3, 0x2f, 0x3d, 0x9b, 0x0b, 0x11, 0x1a,
  0x4a, 0x1a, 0x34, 0x33, 0x89, 0x02, 0xce, 0x10, 0x75, 0x32, 0x5b, 0x54,
  0x12, 0x1c, 0x8f, 0xcf, 0x8e, 0x87, 0x8a, 0x16, 0xc7, 0x3d, 0x19, 0xf3,
  0x82, 0xcc, 0x23, 0x98, 0xd8, 0xda, 0xce, 0x81, 0xa8, 0x68, 0x18, 0x38,

  0x65, 0xe4, 0x3e, 0x0c, 0x92, 0xf7, 0x9a, 0x8a, 0x38, 0xc0, 0xa1, 0xd3,
  0x1d, 0x7c, 0x93, 0x5f, 0x22, 0xa2, 0xd4, 0xc9, 0x21, 0x13, 0x03, 0x84,
  0xe8, 0x20, 0xc0, 0x62, 0xf4, 0xba, 0x69, 0xd5, 0xd9, 0x82, 0x9d, 0x97,
  0xbd, 0xf2, 0x91, 0x59, 0x24, 0x4e, 0x11, 0x75, 0x22, 0x41, 0xa8, 0x4c,
  0xea, 0x46, 0x26, 0xad, 0x36, 0x5e, 0x96, 0x42, 0x58, 0x2a, 0x88, 0x2e,
  0x61, 0xd9, 0xfe, 0x8b, 0x64, 0x6b, 0xb8, 0x4e, 0x5e, 0x6c, 0xfd, 0x8a,
  0x2a, 0x82, 0xef, 0xe9, 0x8d, 0x34, 0x05, 0xd2, 0xa2, 0x5d, 0x1b, 0x14,
  0x10, 0xa8, 0x16, 0xb6, 0x66, 0xd4, 0xe1, 0x06, 0x9f, 0xb9, 0xb9, 0xe9,
  0xa2, 0xd0, 0x4f, 0xd6, 0x97, 0x97, 0x11, 0x38, 0x17, 0xea, 0x38, 0x96,
  0xc1, 0xfd, 0x43, 0xde, 0x94, 0xed, 0x3a, 0x61, 0x1f, 0xbe, 0x99, 0xff,
  0x16, 0xe2, 0x92, 0xcc, 0x43, 0xae, 0xca, 0x72, 0x46, 0xaa, 0xea, 0xab,
  0x84, 0x03, 0x10, 0x14, 0xa5, 0xa8, 0x9a, 0x70, 0x38, 0xd6, 0xde, 0xb6,
  0xff, 0xb4, 0x6d, 0xa3, 0xac, 0x5b, 0xa2, 0x57, 0x81, 0x5f, 0x6f, 0xb1,
  0x12, 0x3b, 0xe1, 0xc6, 0x9e, 0x83, 0x64, 0xfb, 0xe5, 0xb6, 0x3c, 0xb7,
  0x15, 0x55, 0xd1, 0xf8, 0x1d, 0x8e, 0xf0, 0xb1, 0x56, 0x3d, 0xb5, 0x2e,
  0x50, 0x52, 0xfe, 0xf2, 0xd9, 0x2c, 0x83, 0xd8, 0x96, 0xde, 0x78, 0x09,
  0x23, 0x3c, 0x0e, 0xc4, 0xf7, 0xd3, 0x55, 0x39, 0x30, 0x75, 0x9d, 0x39,
  0xcf, 0x95, 0x5a, 0xb6, 0xf1, 0x0c, 0xbc, 0x0e, 0xb2, 0x14, 0x92, 0x70,
  0xbd, 0xcc, 0xe4, 0xab, 0x7d, 0x37, 0x85, 0xd3, 0x4a, 0xc9, 0x38, 0x86,

  0x26, 0x1c, 0x2d, 0x20, 0x1c, 0x74, 0x6a, 0xf3, 0x10, 0xd7, 0x0a, 0xdd,




  0x97, 0x7c, 0x7c, 0x20, 0x1e, 0x33, 0xf2, 0x76, 0x45, 0xd8, 0x65, 0xdc,
  0xe2, 0x9d, 0x5a, 0xe0, 0xf5, 0x7c, 0x5f, 0x3d, 0xbb, 0x8e, 0xf0, 0x58,
  0xd4, 0x6a, 0x81, 0x04, 0x69, 0x13, 0x78, 0x50, 0x74, 0x01, 0xb5, 0xed,
  0x06, 0x21, 0x9a, 0x0d, 0x77, 0xd0, 0x92, 0xde, 0xa8, 0x43, 0x1b, 0x7a,
  0x6a, 0xc7, 0x4a, 0xb5, 0x4a, 0x38, 0xe6, 0x66, 0xf5, 0xcb, 0x6d, 0xdb,
  0x5d, 0xda, 0xc4, 0x95, 0x8d, 0x06, 0x03, 0x1b, 0x2b, 0xb5, 0x5b, 0xf5,
  0x9b, 0xa3, 0x7e, 0x08, 0x35, 0x3f, 0xf0, 0x16, 0x26, 0x7f, 0x46, 0xc3,
  0x22, 0xdf, 0xca, 0xad, 0xaa, 0x43, 0x3b, 0xeb, 0x8d, 0x04, 0xce, 0xfc,
  0x68, 0x94, 0x94, 0x0a, 0xb2, 0xd7, 0xb0, 0xd0, 0x56, 0x44, 0x1c, 0x9f,
  0xd7, 0xb4, 0x81, 0x1c, 0xde, 0xfd, 0x7a, 0x14, 0x51, 0x61, 0x59, 0x27,
  0x05, 0xc9, 0xc9, 0x6a, 0xd8, 0xbd, 0x8e, 0x50, 0x9a, 0xbe, 0xaf, 0x19,
  0x3b, 0xe8, 0x3d, 0xcd, 0x43, 0xc7, 0x42, 0xab, 0x90, 0x1f, 0x8f, 0x2a,
  0x6e, 0xc1, 0x7e, 0x27, 0x89, 0x35, 0xdc, 0x9e, 0xb8, 0xf8, 0xa4, 0x19,
  0x94, 0x34, 0x78, 0x76, 0x9b, 0x4d, 0xd7, 0x4d, 0xbb, 0x04, 0xce, 0x9b,
  0x93, 0x22, 0x3b, 0xf1, 0xb4, 0x76, 0x70, 0x15, 0x04, 0xf0, 0x66, 0xeb,
  0x4c, 0x61, 0x79, 0x5e, 0x6c, 0xed, 0x4a, 0x1c, 0x37, 0x65, 0x0d, 0x9e,
  0x7f, 0x1c, 0x8b, 0xcf, 0xea, 0x9c, 0xab, 0x8c, 0xdd, 0xa9, 0x2e, 0x59,
  0x21, 0xfa, 0x79, 0x43, 0xa4, 0xd5, 0x2c, 0xf6, 0xed, 0xb7, 0xec, 0x7b,
  0xf3, 0x3e, 0x6d, 0xdb, 0x12, 0x8a, 0x5b, 0xae, 0x0e, 0xae, 0x72, 0xf0,
  0x65, 0xb4, 0x67, 0x1e, 0x25, 0xaf, 0x6c, 0x6f, 0x75, 0x7d, 0x55, 0xf7,

  0x3f, 0x70, 0x87, 0x1e, 0x9f, 0x5d, 0x3f, 0x15, 0x6f, 0x36, 0xa9, 0x1c,
  0x24, 0xf3, 0xf0, 0x23, 0xcb, 0xf1, 0x83, 0x55, 0x7c, 0xaa, 0x26, 0x8f,
  0xcd, 0x1f, 0xdf, 0xd0, 0x1f, 0x73, 0x76, 0x0b, 0x08, 0xa8, 0x1e, 0xfb,
  0x61, 0x43, 0xd2, 0x1e, 0x9f, 0xd8, 0x3f, 0x6c, 0xa2, 0x96, 0x39, 0x75,
  0xaa, 0x54, 0x24, 0x08, 0x3e, 0x07, 0x86, 0x04, 0xd3, 0x46, 0xc7, 0x19,
  0x68, 0xfd, 0x70, 0xbc, 0xbe, 0x03, 0x88, 0x71, 0x03, 0x20, 0xb2, 0x0d,
  0xe0, 0x73, 0x1a, 0x33, 0x23, 0x2f, 0x63, 0xf5, 0xa3, 0x66, 0xab, 0xfe,
  0x41, 0x71, 0x38, 0x5b, 0xca, 0x3e, 0xcb, 0x34, 0xb7, 0x42, 0x48, 0xd0,
  0xcb, 0xe7, 0x60, 0xef, 0x34, 0x5d, 0x33, 0x66, 0x67, 0x61, 0x42, 0xaa,
  0x05, 0xca, 0xeb, 0x5b, 0x32, 0x84, 0xbb, 0xfc, 0x11, 0x62, 0xce, 0xf6,
  0xbf, 0xf7, 0x06, 0xf5, 0xd3, 0x72, 0xe1, 0xf9, 0x2a, 0xc0, 0xf9, 0x91,
  0xda, 0xc3, 0xe6, 0x8c, 0x18, 0x9c, 0x0e, 0x1e, 0x16, 0x5b, 0x87, 0x15,
  0x93, 0x9e, 0x79, 0x2e, 0xd1, 0x1a, 0x8f, 0x9a, 0x6e, 0x80, 0x2b, 0x7c,
  0xd2, 0x68, 0xf5, 0x32, 0x5b, 0x52, 0xe0, 0xcb, 0xca, 0x45, 0xc1, 0xf0,
  0x22, 0xc5, 0x0a, 0x1f, 0x1f, 0xc6, 0x87, 0x9b, 0x91, 0xfe, 0x46, 0x22,
  0x96, 0xd3, 0xb7, 0xfe, 0x2d, 0x88, 0x76, 0xd6, 0x77, 0xc5, 0xf4, 0xea,
  0xcd, 0xfb, 0x71, 0xfc, 0xf5, 0x70, 0x71, 0x78, 0xde, 0xe8, 0x21, 0x44,
  0x0c, 0x50, 0x60, 0x04, 0xc4, 0xd2, 0x28, 0x79, 0xaf, 0xbc, 0xdf, 0xc5,
  0x87, 0x6b, 0xbd, 0x60, 0x3d, 0x81, 0xa4, 0x58, 0x30, 0x13, 0x17, 0xcd,
  0x13, 0x61, 0x97, 0x61, 0x4a, 0x57, 0x81, 0x96, 0x17, 0x2a, 0xd0, 0xf6,
  0x4e, 0x53, 0xc0, 0x08, 0x1d, 0xe2, 0x31, 0x64, 0xe5, 0x25, 0xa0, 0x75,
  0xe9, 0x1a, 0x0d, 0x77, 0xf4, 0x8f, 0x9f, 0x72, 0xcc, 0x27, 0xc6, 0xa2,
  0xcd, 0x22, 0xc1, 0x45, 0x7f, 0x87, 0x5a, 0x09, 0x41, 0x5e, 0xf0, 0xd7,
  0xd0, 0xea, 0x82, 0x5e, 0x67, 0x32, 0x1d, 0x08, 0xb5, 0xe2, 0x47, 0x55,


  0xdf, 0x92, 0xcc, 0xa6, 0x1c, 0x7e, 0xf5, 0xe7, 0x50, 0x7a, 0xbe, 0x79,



  0xdf, 0xf3, 0x39, 0xfa, 0xcd, 0x50, 0xab, 0x09, 0x45, 0x23, 0xf0, 0x54,
  0xfa, 0x70, 0x2f, 0x04, 0x0b, 0x39, 0x3e, 0x01, 0x05, 0x4a, 0xbe, 0x87,
  0x4b, 0x98, 0x27, 0xe4, 0x8f, 0x8d, 0x0f, 0x4a, 0x4e, 0x7f, 0xfc, 0x53,
  0x94, 0xec, 0xbf, 0xc3, 0x09, 0x7e, 0xc9, 0x39, 0x07, 0x71, 0xcf, 0x44,


  0x13, 0xde, 0x8d, 0x1c, 0x91, 0xfb, 0x4c, 0x7c, 0x38, 0xe2, 0x6f, 0x31,
  0x48, 0x2a, 0xe2, 0x0b, 0x87, 0xfc, 0xc7, 0xde, 0xa1, 0x4d, 0x4e, 0xb3,
  0x05, 0xa1, 0xb8, 0xa4, 0x46, 0x80, 0x87, 0x0a, 0x42, 0x91, 0xdf, 0x8e,
  0x91, 0x4f, 0xd0, 0x43, 0xcd, 0x48, 0x3c, 0xe0, 0x8c, 0x03, 0xbb, 0x07,
  0x34, 0x51, 0xd5, 0xc4, 0xa2, 0x33, 0x19, 0xb3, 0xfb, 0xee, 0x3e, 0x62,
  0xca, 0x23, 0xf9, 0x74, 0x9b, 0x70, 0x37, 0xdf, 0x19, 0x25, 0x89, 0x84,
  0xeb, 0xfd, 0xd7, 0xd8, 0xd2, 0x8d, 0x7d, 0x27, 0xd9, 0x99, 0x18, 0x89,
  0xed, 0xe1, 0xe8, 0x10, 0xbf, 0x79, 0x8c, 0x12, 0x96, 0xf8, 0x70, 0x4f,
  0x3e, 0x7f, 0xf2, 0x78, 0x77, 0x77, 0x20, 0xae, 0x2a, 0xce, 0x8e, 0x99,
  0x50, 0x31, 0x56, 0x4e, 0x7c, 0x8b, 0xe3, 0x4c, 0xb4, 0xc1, 0x57, 0xdc,
  0x57, 0x89, 0xbf, 0x1b, 0x89, 0x80, 0x3b, 0x83, 0xcf, 0xbe, 0x4a, 0x87,
  0x48, 0x26, 0x38, 0x38, 0xba, 0x35, 0x83, 0x53, 0xe5, 0x89, 0xb5, 0x0b,
  0xba, 0xf4, 0x72, 0x05, 0x38, 0x52, 0x9c, 0x87, 0x91, 0xdc, 0x4a, 0x1c,
  0x2f, 0x4e, 0x55, 0xd2, 0x86, 0x89, 0xa0, 0x67, 0x2c, 0xf6, 0xe8, 0x0f,
  0xa2, 0xe7, 0x2b, 0x6d, 0x54, 0x7b, 0xb6, 0x9e, 0x2c, 0x8c, 0x04, 0x1a,
  0xaf, 0xe7, 0x73, 0x73, 0xd6, 0x27, 0xb9, 0xb4, 0x1c, 0x16, 0x5b, 0x81,
  0xdd, 0xe4, 0x91, 0xfa, 0x1b, 0x3f, 0xb8, 0x08, 0x4a, 0x63, 0x52, 0x6b,
  0xd5, 0xcd, 0xb8, 0x12, 0x6e, 0xd6, 0xdb, 0xb6, 0x56, 0xfc, 0xad, 0x7a,
  0x3d, 0x1f, 0xf6, 0x2d, 0xec, 0x36, 0xab, 0x43, 0x33, 0xee, 0x1d, 0xc5,
  0x6d, 0x8d, 0xc0, 0x7e, 0x30, 0x7f, 0xb2, 0xbd, 0x7d, 0xdb, 0x29, 0xbb,
  0x56, 0xef, 0xbc, 0x21, 0xbd, 0x13, 0x18, 0x3c, 0x14, 0xcd, 0x48, 0x5e,
  0xb2, 0x86, 0x19, 0xed, 0xf6, 0xca, 0x2d, 0x09, 0x05, 0x0c, 0xc1, 0xd7,
  0x45, 0xa1, 0xd6, 0xc3, 0xef, 0x9f, 0xce, 0x29, 0x31, 0x99, 0x93, 0x30,
  0x17, 0x19, 0x32, 0xba, 0x89, 0x3f, 0x86, 0xa8, 0x24, 0x95, 0xe0, 0xbf,
  0x8b, 0xd7, 0x20, 0x11, 0xe7, 0x87, 0x38, 0xf1, 0x91, 0x5e, 0x97, 0x02,
  0x58, 0x09, 0x4e, 0x20, 0xc6, 0xf3, 0xe1, 0x58, 0x82, 0xd9, 0x97, 0x59,
  0xcc, 0xb0, 0x6b, 0x87, 0x78, 0x14, 0x6c, 0xa1, 0x66, 0x3f, 0xa8, 0x7c,
  0x25, 0xf4, 0xdd, 0xd0, 0x71, 0x85, 0x96, 0x58, 0x03, 0x9b, 0x38, 0xd9,
  0xe2, 0xf9, 0x6c, 0x09, 0x1c, 0x8a, 0xd6, 0xc9, 0x21, 0x01, 0x4b, 0x0d,
  0x07, 0x56, 0xbd, 0x65, 0x7c, 0xf6, 0xee, 0x45, 0x62, 0xea, 0xa2, 0x4a,
  0x7e, 0xa9, 0x79, 0x5c, 0x5b, 0x89, 0xf4, 0xb0, 0xef, 0x74, 0xe0, 0x96,
  0xe1, 0xec, 0xae, 0x44, 0x10, 0x17, 0x38, 0x33, 0x02, 0x49, 0xea, 0x74,
  0x6a, 0x66, 0xd0, 0xe1, 0x56, 0x5c, 0x9f, 0xb6, 0x7b, 0x40, 0x8e, 0xd8,
  0x0c, 0xc6, 0x6d, 0xcb, 0xf0, 0xd3, 0xaf, 0xa8, 0x9d, 0x4f, 0xe9, 0xdd,

  0x4d, 0xde, 0xac, 0x43, 0xa6, 0x2b, 0x91, 0x62, 0xe0, 0x53, 0x20, 0x34,
  0x41, 0x27, 0xe1, 0x40, 0x24, 0x60, 0xe5, 0x51, 0xb2, 0x5b, 0x03, 0x70,
  0x68, 0xcb, 0x24, 0xa8, 0x17, 0x89, 0x51, 0x48, 0x6e, 0x82, 0x0c, 0x71,
  0x02, 0x30, 0x75, 0xb3, 0x6b, 0x57, 0xc0, 0x99, 0x01, 0x7e, 0xff, 0x5f,
  0xfa, 0xcb, 0x8f, 0xb4, 0x59, 0xff, 0xd4, 0xcd, 0x92, 0x69, 0xa7, 0x01,


  0x4c, 0x02, 0xcc, 0xeb, 0xdf, 0x63, 0x53, 0xfe, 0x46, 0x49, 0x4d, 0xbc,
  0x33, 0x04, 0x50, 0x84, 0xe1, 0x7e, 0x3f, 0xb2, 0x6a, 0xb4, 0x0e, 0x41,



  0x65, 0xdf, 0xec, 0x2c, 0x98, 0xdc, 0x05, 0x2e, 0x29, 0xa2, 0xc1, 0x1f,
  0x8a, 0x01, 0xa0, 0x96, 0x8d, 0x45, 0x47, 0x28, 0x2d, 0xdc, 0x31, 0x94,
  0x8f, 0xf1, 0x87, 0x4a, 0x30, 0x87, 0x8c, 0x2d, 0x63, 0x26, 0x4e, 0x76,
  0x1e, 0xff, 0x3c, 0x6e, 0x58, 0xd8, 0x74, 0x59, 0xdd, 0xe7, 0x16, 0x08,
  0x95, 0x19, 0x89, 0x9a, 0x61, 0xab, 0x29, 0x3e, 0x51, 0xfc, 0x17, 0x26,
  0xd5, 0xee, 0xd9, 0x03, 0xa3, 0x45, 0x20, 0xa8, 0xf5, 0x55, 0x6e, 0xda,
  0x66, 0x83, 0x7a, 0xbf, 0xff, 0x2f, 0x4e, 0x04, 0xfc, 0x67, 0xa8, 0xfb,
  0x9e, 0x5e, 0x1c, 0xbd, 0xc0, 0x94, 0x7e, 0x3f, 0xac, 0xef, 0x96, 0x93,
  0x72, 0x21, 0xb7, 0x8e, 0xf6, 0xde, 0x6c, 0xa0, 0xfe, 0x8c, 0x69, 0x04,
  0xb1, 0xba, 0xa1, 0x07, 0x60, 0x32, 0x88, 0xf6, 0xa6, 0x80, 0x1d, 0x96,
  0x94, 0x53, 0x2e, 0x68, 0xa5, 0xda, 0x05, 0x73, 0xfb, 0x7e, 0x9f, 0x28,
  0x2a, 0x09, 0xb7, 0xe0, 0x94, 0x46, 0xab, 0x1e, 0x68, 0x66, 0xbc, 0xc8,
  0x32, 0xba, 0x7f, 0x1e, 0xa1, 0x58, 0xeb, 0x29, 0x06, 0xfd, 0x42, 0xcc,
  0xc2, 0x4c, 0xf3, 0x23, 0xaa, 0x26, 0xf9, 0xd5, 0xd7, 0xfc, 0xa3, 0xe1,
  0x05, 0xfd, 0x48, 0x72, 0x68, 0x14, 0x6a, 0x80, 0xa8, 0x53, 0x2b, 0x4f,

  0x06, 0x91, 0x02, 0xe5, 0x24, 0x96, 0x9a, 0x87, 0x9e, 0xe5, 0x45, 0x28,
  0x91, 0xf5, 0x5e, 0x7f, 0xcc, 0x80, 0xc8, 0x9b, 0x5f, 0x67, 0x9b, 0x47,
  0x03, 0x5d, 0x10, 0x67, 0x5e, 0xa2, 0xe3, 0xa3, 0x4d, 0xef, 0xf4, 0x91,
  0x59, 0x18, 0x17, 0x8d, 0xa3, 0xa9, 0xa3, 0xfb, 0x86, 0xe3, 0xa8, 0x0a,
  0xdc, 0x3d, 0x92, 0xfa, 0x43, 0xce, 0x35, 0xaf, 0x43, 0x46, 0x43, 0xe5,
  0x38, 0xc8, 0x37, 0xa2, 0x71, 0xef, 0x59, 0x2b, 0x00, 0x32, 0x99, 0x71,
  0x89, 0xd7, 0x2c, 0x12, 0xdf, 0x96, 0xac, 0x3e, 0x0a, 0x85, 0x6f, 0x1e,
  0xce, 0xc5, 0xc9, 0x25, 0x32, 0x75, 0x8c, 0xae, 0xc4, 0x25, 0x67, 0x1f,
  0x62, 0x9e, 0xa8, 0x63, 0x59, 0x92, 0xdf, 0x36, 0x12, 0x67, 0x4e, 0x62,
  0x6e, 0x3c, 0x44, 0x47, 0xff, 0x73, 0xe0, 0xa6, 0xc3, 0xbe, 0xad, 0xa1,
  0x17, 0x66, 0x1f, 0x09, 0xe4, 0xe5, 0xe6, 0xe1, 0x38, 0xff, 0xfe, 0xe9,
  0x68, 0x7f, 0x37, 0x38, 0xd4, 0x66, 0xf5, 0xd1, 0x10, 0x47, 0x75, 0xf7,
  0x91, 0xb2, 0x54, 0x71, 0x66, 0x1a, 0x55, 0xc0, 0x0f, 0xb0, 0xb5, 0x8c,
  0x5e, 0xb0, 0x5e, 0xd1, 0x38, 0x20, 0xf2, 0x45, 0xc9, 0x26, 0xdb, 0x7d,
  0xcb, 0x90, 0x08, 0xb5, 0x24, 0x34, 0xfa, 0x20, 0x3a, 0x3b, 0xed, 0x1e,
  0x70, 0x8f, 0x83, 0x89, 0x51, 0x06, 0xca, 0x47, 0x84, 0xae, 0x2d, 0x31,
  0x19, 0xc9, 0x97, 0x55, 0xf9, 0xd4, 0x6f, 0x88, 0x8a, 0x07, 0x40, 0x4f,
  0x8c, 0x0c, 0x4a, 0xb1, 0xec, 0x28, 0x08, 0x72, 0xe7, 0x7f, 0xf0, 0xff,
  0xba, 0x88, 0x95, 0x26, 0x3b, 0x42, 0x04, 0x9a, 0x69, 0x52, 0x5e, 0x8d,
  0x97, 0x7f, 0x10, 0xa2, 0xd4, 0x77, 0xfe, 0x07, 0x94, 0xf5, 0xc3, 0x44,

  0xca, 0x2a, 0xf2, 0xb4, 0xb6, 0x33, 0xe4, 0x25, 0xe0, 0x4a, 0x61, 0xc1,
  0x82, 0x77, 0x76, 0xef, 0x3d, 0xe4, 0x0c, 0x34, 0x52, 0x40, 0x46, 0x3d,
  0x3b, 0xc3, 0x89, 0xc3, 0xdd, 0x9d, 0xe9, 0xdf, 0x10, 0x5d, 0xf3, 0x70,
  0xf3, 0xb7, 0x15, 0x18, 0x6e, 0x47, 0xa2, 0x78, 0xd0, 0xce, 0x77, 0x39,
  0x5b, 0x0e, 0xc4, 0xa0, 0x20, 0x72, 0xc2, 0x62, 0xee, 0xb9, 0xb5, 0x3b,
  0xed, 0xde, 0xb7, 0x3d, 0xe7, 0x6c, 0x8b, 0x80, 0x98, 0x69, 0xd0, 0xcf,
  0xbc, 0xca, 0x20, 0xd6, 0x4a, 0x69, 0x3d, 0x89, 0x65, 0x3d, 0x0a, 0x2a,
  0xf0, 0x13, 0x3e, 0xff, 0x64, 0x3f, 0x42, 0xff, 0x48, 0x1f, 0xfe, 0x98,
  0xaf, 0x7c, 0x9e, 0x75, 0x7c, 0x86, 0xb6, 0xa3, 0xa8, 0x7d, 0x11, 0x86,
  0xca, 0x59, 0xc6, 0x94, 0x74, 0x21, 0x3f, 0xc0, 0xcd, 0xbe, 0x77, 0x33,
  0xa7, 0x0c, 0x7f, 0x00, 0x87, 0x80, 0x87, 0x14, 0x31, 0x54, 0x25, 0x4d,
  0xfd, 0x03, 0xe4, 0xf5, 0x7a, 0x1c, 0x09, 0x44, 0x25, 0x11, 0x77, 0x99,
  0xbf, 0xa4, 0xc3, 0xe7, 0xbd, 0x4b, 0x82, 0x81, 0x65, 0x97, 0xc4, 0xf3,
  0x6f, 0x75, 0xda, 0x68, 0x2f, 0xc4, 0x9b, 0xe9, 0x3d, 0x4b, 0x72, 0xcb,
  0xb8, 0x77, 0x26, 0xe6, 0x4b, 0x1f, 0x1d, 0x46, 0x7b, 0xf2, 0xde, 0x7e,
  0xd8, 0x28, 0x26, 0x0e, 0xbc, 0x1d, 0x2d, 0xe4, 0x73, 0x6d, 0x29, 0x3d,
  0x45, 0x68, 0x3d, 0xaa, 0x51, 0x27, 0x11, 0x05, 0xbb, 0x43, 0x5f, 0x8f,
  0xa2, 0x73, 0xd0, 0x4e, 0xb4, 0xb5, 0x3f, 0x07, 0xf7, 0x43, 0xbe, 0x2e,
  0x24, 0xfa, 0xe6, 0xa5, 0x74, 0x87, 0xb6, 0xd3, 0xb9, 0x67, 0x0e, 0x7c,
  0x05, 0xee, 0x9f, 0x05, 0x6e, 0xd1, 0xc7, 0xba, 0x5e, 0x10, 0xa9, 0xe7,
  0xf3, 0x3b, 0x33, 0xa5, 0xba, 0x17, 0x3c, 0xc6, 0x17, 0xa0, 0xfc, 0x9c,
  0x1e, 0x96, 0x67, 0x30, 0x6f, 0xd7, 0xf0, 0x69, 0xae, 0x32, 0x4a, 0xbe,
  0x61, 0x70, 0xf0, 0xfb, 0x88, 0x91, 0xc4, 0x30, 0x3e, 0xef, 0xe2, 0x7c,
  0xc2, 0x27, 0xac, 0xba, 0x30, 0xa2, 0xde, 0xec, 0xb0, 0x05, 0xef, 0x65,
  0xa1, 0xad, 0x91, 0x68, 0x10, 0x17, 0xda, 0x6e, 0x6f, 0x08, 0x15, 0x22,
  0x06, 0x1b, 0xa2, 0xbb, 0xff, 0x11, 0x16, 0x25, 0xc7, 0xa3, 0xb5, 0xff,
  0xba, 0xe2, 0x24, 0xd1, 0xa0, 0x20, 0x0e, 0x8d, 0x28, 0x0f, 0x4f, 0x48,
  0x16, 0x2e, 0x22, 0xe0, 0xe7, 0x49, 0x0c, 0xcc, 0x02, 0xdd, 0xae, 0x24,
  0x0d, 0x5b, 0xcf, 0x7a, 0xa7, 0x94, 0x9a, 0xd2, 0x21, 0x5a, 0x85, 0xe3,
  0x17, 0xbd, 0x2e, 0x56, 0x97, 0xee, 0xd1, 0xec, 0x4a, 0xf2, 0x99, 0x2a,
  0x6a, 0x92, 0x53, 0x41, 0xd0, 0x95, 0x50, 0x1b, 0xd2, 0x29, 0x75, 0x85,
  0x91, 0x3c, 0xcf, 0x74, 0xf3, 0x70, 0x3a, 0x1b, 0x69, 0x97, 0x06, 0x53,
  0xeb, 0x12, 0xc0, 0x5e, 0x65, 0x87, 0x94, 0x8c, 0x50, 0x89, 0xec, 0x1c,
  0x09, 0x53, 0xcb, 0xb2, 0x2e, 0xfc, 0x92, 0x0b, 0xc3, 0xb9, 0x3a, 0x8c,
  0xeb, 0x5f, 0xb8, 0xde, 0x96, 0x4b, 0x09, 0x93, 0x02, 0x8f, 0x2a, 0xab,
  0x0e, 0x17, 0xba, 0x4f, 0x30, 0x46, 0x19, 0x83, 0xac, 0x41, 0x79, 0x94,
  0xbf, 0x86, 0xdf, 0x98, 0x45, 0x49, 0xfa, 0xab, 0x7f, 0xe5, 0xe8, 0x08,
  0xe5, 0xc7, 0x3b, 0xb5, 0xc3, 0x51, 0xa6, 0x5a, 0xb9, 0x59, 0x62, 0xe3,
  0x05, 0xbb, 0x49, 0x0c, 0x69, 0xad, 0xab, 0xc6, 0x19, 0x0a, 0xf6, 0x45,
  0x16, 0xc2, 0xd1, 0xf7, 0xde, 0x0d, 0x82, 0xaa, 0xfb, 0x68, 0xbb, 0x79,


  0x70, 0xe0, 0x06, 0x0d, 0xec, 0xd3, 0xa5, 0x91, 0xe7, 0x60, 0x06, 0x0c,
  0x3a, 0xe8, 0x18, 0x97, 0x3e, 0x1d, 0xf1, 0xd1, 0x61, 0x34, 0x8d, 0x01,




  0x6f, 0x1a, 0x4d, 0xab, 0x04, 0xed, 0x50, 0x08, 0xa5, 0xde, 0x73, 0xd3,

  0x08, 0x0d, 0x28, 0xfa, 0x45, 0x8b, 0x50, 0xfb, 0xa0, 0xf9, 0xc3, 0x70,
  0x87, 0x8a, 0x7c, 0x2f, 0xdf, 0xf1, 0x59, 0x44, 0xfc, 0xd3, 0x9a, 0xff,
  0xff, 0xb0, 0x4f, 0x6b, 0x0e, 0x7b, 0x38, 0x16, 0x35, 0x32, 0x71, 0xe7,
  0x40, 0x63, 0xa5, 0x94, 0x48, 0x70, 0xe9, 0xb5, 0x5a, 0xe1, 0xf6, 0x37,
  0xce, 0xa0, 0x31, 0xbc, 0xb3, 0x5e, 0x13, 0x46, 0xf6, 0xfc, 0x3e, 0x59,
  0x2e, 0x95, 0x18, 0xf0, 0x20, 0xd9, 0xf1, 0x08, 0x5c, 0xb2, 0xdd, 0x03,
  0xa6, 0x67, 0x56, 0x76, 0x89, 0xfe, 0xac, 0xe4, 0x87, 0xdd, 0x39, 0xb9,
  0x49, 0xfd, 0xc4, 0x59, 0xf1, 0x78, 0x0f, 0x99, 0xd3, 0x4f, 0x97, 0x6b,
  0x1d, 0xc1, 0xd6, 0x15, 0x65, 0x2d, 0x59, 0xf5, 0x10, 0x66, 0x7f, 0x8f,
  0x28, 0x6b, 0x49, 0xab, 0xfb, 0xef, 0x6c, 0x9f, 0x28, 0x3b, 0x88, 0xb2,
  0x10, 0x86, 0xf4, 0xd6, 0xff, 0xbd, 0x45, 0xca, 0x0b, 0x84, 0x85, 0x61,
  0x66, 0x39, 0xd1, 0x35, 0x0a, 0x2b, 0xc9, 0x96, 0xeb, 0x38, 0x22, 0xa3,
  0x75, 0xb7, 0x49, 0x3c, 0x03, 0x5d, 0x1d, 0x2a, 0x9c, 0x45, 0xa6, 0x7e,
  0x11, 0x76, 0x8c, 0x8c, 0xac, 0xa2, 0xfb, 0x00, 0x86, 0xfc, 0xf4, 0x51,
  0x7c, 0x0d, 0x40, 0x85, 0xff, 0x6d, 0xd6, 0x10, 0x3a, 0x85, 0x46, 0xce,
  0xbe, 0xbf, 0x9f, 0x03, 0x48, 0x9e, 0xfc, 0x80, 0xfb, 0xd6, 0x72, 0xcd,
  0xcf, 0x44, 0x11, 0xa5, 0x1d, 0x76, 0x37, 0x39, 0x82, 0xd9, 0x59, 0x7b,
  0x8f, 0xc5, 0x83, 0xc7, 0x35, 0xb1, 0x9a, 0x0b, 0x4c, 0xdb, 0x96, 0x43,
  0x74, 0xcb, 0x48, 0x2c, 0x7c, 0x4c, 0x57, 0x2b, 0x91, 0x36, 0xf7, 0x93,
  0x3c, 0xc3, 0x36, 0x72, 0x8f, 0x5e, 0xea, 0x13, 0x05, 0x84, 0xcc, 0xa6,
  0x2c, 0x3f, 0xb1, 0x4b, 0x95, 0x53, 0xb0, 0xa9, 0x16, 0x32, 0x09, 0x91,
  0xa2, 0x03, 0x92, 0x5f, 0x24, 0x7a, 0x6f, 0xf6, 0xc6, 0xe3, 0xaf, 0xf7,
  0xb2, 0x66, 0xaa, 0x62, 0x6f, 0xcf, 0xa5, 0xff, 0x59, 0xf3, 0xfb, 0x9e,
  0xe1, 0x20, 0x78, 0xd1, 0xaf, 0x8f, 0x88, 0xdf, 0xfa, 0xb5, 0x1f, 0x40,
  0xfb, 0xd8, 0x84, 0xb6, 0x2d, 0xfa, 0x0b, 0x2f, 0x53, 0x60, 0xa8, 0x75,
  0x75, 0x1d, 0x97, 0x02, 0x26, 0x4d, 0x3a, 0x1d, 0x9b, 0xa9, 0xf7, 0xdf,
  0x6c, 0xb7, 0xb8, 0xe8, 0x52, 0xc8, 0xb3, 0x42, 0x29, 0x3f, 0xeb, 0xd5,
  0x6f, 0x7e, 0x9e, 0x28, 0x7b, 0x72, 0xe1, 0x64, 0x24, 0x48, 0xdd, 0x3f,
  0xe1, 0x15, 0x39, 0x31, 0xd8, 0x4f, 0xf1, 0x00, 0xa6, 0xfb, 0xe0, 0x29,
  0x3f, 0x78, 0xc6, 0x5c, 0xf9, 0x2b, 0x33, 0xc0, 0x84, 0xe1, 0x9c, 0x96,
  0x10, 0x10, 0x98, 0xd5, 0x24, 0xbb, 0xcc, 0x8b, 0x07, 0x39, 0xf7, 0x34,
  0x4b, 0x87, 0xd3, 0x5e, 0xb2, 0xa1, 0x1d, 0x57, 0x12, 0x80, 0x6b, 0xc9,
  0x15, 0xbe, 0x2c, 0xef, 0x9d, 0x5d, 0x2a, 0x40, 0xdb, 0x24, 0x16, 0x3c,
  0xdf, 0xfb, 0x54, 0xe9, 0x87, 0xf2, 0x78, 0xf2, 0xe9, 0x9a, 0xf2, 0x8f,
  0x23, 0x1d, 0xa7, 0x03, 0x37, 0x96, 0x51, 0xf8, 0xb8, 0xd6, 0xea, 0x9a,
  0xc2, 0xf2, 0x3d, 0x67, 0x61, 0xf5, 0xfa, 0xfb, 0xc8, 0x83, 0x12, 0xaf,
  0x17, 0x0b, 0x6b, 0x07, 0xdc, 0x2b, 0x92, 0x8c, 0x38, 0x5b, 0xe9, 0xf6,
  0x10, 0x5d, 0x48, 0x57, 0x4d, 0x22, 0xd3, 0x81, 0x5e, 0x8c, 0x41, 0xf2,
  0x60, 0x52, 0xe0, 0xb2, 0x4c, 0xdd, 0x5b, 0xc5, 0x0d, 0xd6, 0x44, 0x7e,
  0x40, 0x88, 0xd3, 0x2f, 0xd3, 0xa9, 0x9a, 0x76, 0xf7, 0xcd, 0x2e, 0xe5,
  0x4e, 0x73, 0xed, 0x4d, 0x70, 0x48, 0x14, 0x56, 0xa1, 0xe0, 0xec, 0xa8,
  0x87, 0xd9, 0x6e, 0xb9, 0xb6, 0x8c, 0x76, 0xd1, 0x3d, 0x6f, 0xbf, 0xea,
  0xd1, 0xc3, 0x2d, 0x90, 0xa8, 0x41, 0x8e, 0xb9, 0x62, 0xe6, 0x0f, 0xbf,
  0x3e, 0xbf, 0x06, 0x03, 0xd7, 0xca, 0x09, 0xd2, 0x4a, 0xdd, 0xf5, 0x11,
  0x8c, 0x7c, 0x54, 0xd3, 0x3c, 0xd0, 0x15, 0x82, 0x0c, 0xfd, 0xf6, 0x35,
  0xea, 0x32, 0x08, 0x4d, 0xca, 0x5c, 0xd4, 0xe5, 0xfd, 0x5a, 0xa0, 0x9c,
  0x80, 0xd7, 0x28, 0x8a, 0xd0, 0xf5, 0x59, 0xc0, 0x1a, 0x5b, 0x88, 0xae,
  0x0e, 0x87, 0x9f, 0x1e, 0xe0, 0x52, 0x34, 0x07, 0x18, 0xbf, 0x31, 0xac,
  0x9b, 0xb7, 0x35, 0xf5, 0x70, 0x97, 0x2d, 0x50, 0x2c, 0x32, 0xf7, 0x38,
  0xbf, 0xf6, 0x21, 0x44, 0x44, 0x0e, 0xcf, 0xc8, 0x5d, 0x45, 0xdf, 0x02,
  0x35, 0xca, 0x9c, 0xc9, 0xe7, 0x9c, 0xa6, 0x19, 0xc7, 0x9f, 0xe8, 0x75,
  0x57, 0xcc, 0x01, 0x23, 0x94, 0xf4, 0xc9, 0xe1, 0x7d, 0xae, 0x76, 0x8d,
  0x4a, 0x50, 0x06, 0x29, 0x60, 0x03, 0x16, 0x33, 0x05, 0x05, 0xa3, 0xfa,
  0x4f, 0xf6, 0x48, 0x58, 0xa0, 0xfd, 0x17, 0x9b, 0x87, 0xd3, 0xfe, 0x1c,
  0xbf, 0x22, 0xd2, 0xe8, 0x6d, 0x6a, 0xee, 0x40, 0xb4, 0xaa, 0xa2, 0x4e,
  0xaf, 0x19, 0x61, 0x4c, 0x82, 0x7b, 0x70, 0x02, 0x13, 0xc7, 0x6f, 0x37,
  0xb5, 0x6d, 0x77, 0xac, 0xab, 0x9b, 0x48, 0x09, 0x89, 0xd1, 0xea, 0x29,
  0xba, 0x0d, 0x69, 0x61, 0x2c, 0xea, 0x14, 0xb5, 0x23, 0xe6, 0x07, 0xd9,
  0x6d, 0xc3, 0xc1, 0x05, 0x09, 0xc4, 0xd0, 0x54, 0x72, 0xa3, 0xd5, 0x21,
  0xcf, 0xc2, 0x81, 0x98, 0x46, 0xaa, 0x2a, 0xa4, 0x68, 0x11, 0x5f, 0xb3,

  0xfe, 0xba, 0xdb, 0xd9, 0xe5, 0xa8, 0xac, 0x72, 0x92, 0x37, 0x48, 0x1a,
  0xd5, 0xd1, 0x88, 0xf0, 0x07, 0xe0, 0x26, 0x64, 0x3d, 0xc6, 0x86, 0x93,
  0xc0, 0x5a, 0xa2, 0x70, 0xa4, 0xed, 0x71, 0x97, 0x20, 0x56, 0xc4, 0xdc,
  0xec, 0x98, 0x82, 0x82, 0x1a, 0x6a, 0xab, 0xbc, 0x12, 0x2d, 0xc2, 0xb1,
  0xed, 0x5c, 0x35, 0xe9, 0xc5, 0x2e, 0xd9, 0xad, 0x95, 0xa2, 0xb0, 0x37,
  0x69, 0x85, 0x62, 0xf6, 0xc0, 0x17, 0x95, 0xd7, 0xf5, 0x1a, 0x07, 0xf6,
  0xf6, 0xf8, 0xe4, 0xc8, 0x66, 0xb5, 0xfd, 0xbf, 0x7b, 0x23, 0xda, 0xf0,
  0x6a, 0x1a, 0xe4, 0xf0, 0x71, 0x0d, 0xa9, 0x57, 0x10, 0x2c, 0x45, 0xa6,
  0xdf, 0x0c, 0xb8, 0xf3, 0x25, 0x7e, 0xdc, 0xaa, 0x30, 0x3d, 0x7a, 0xff,
  0xed, 0xf1, 0xf9, 0xe9, 0xfb, 0x77, 0x47, 0xef, 0x2f, 0x3e, 0xf3, 0xd8,
  0x5d, 0xac, 0xaf, 0x43, 0x1d, 0xa6, 0x17, 0xe4, 0x14, 0x0e, 0xba, 0x41,
  0x09, 0x20, 0xf7, 0x57, 0x31, 0xeb, 0x94, 0x7f, 0x8d, 0xfc, 0xe1, 0xbc,
  0x87, 0xd4, 0xb3, 0x4f, 0x89, 0x24, 0x2b, 0x72, 0xec, 0xcc, 0x28, 0xaa,
  0x3a, 0xe2, 0x58, 0x80, 0xed, 0x1d, 0x4c, 0xad, 0x25, 0x6e, 0x09, 0xca,
  0x1b, 0xa9, 0xc0, 0xd4, 0x27, 0xf6, 0x33, 0xbb, 0x25, 0x1c, 0x05, 0x74,
  0xb1, 0xd2, 0xd6, 0x24, 0x1c, 0x71, 0x7f, 0xe0, 0x12, 0xd0, 0x78, 0x8f,
  0x0a, 0xc5, 0xbe, 0x73, 0x6d, 0xe5, 0xaf, 0xd2, 0xda, 0xc5, 0x5e, 0xc4,
  0x71, 0xe3, 0x03, 0xd5, 0x78, 0xb8, 0xc0, 0x5e, 0x9b, 0xe3, 0x2e, 0x16,
  0xb0, 0xb7, 0x8a, 0xbf, 0xaa, 0xb7, 0xe8, 0xc5, 0xde, 0xde, 0x8f, 0xe8,
  0xaf, 0xfd, 0x27, 0x69, 0xb0, 0x1d, 0x42, 0xa0, 0xd6, 0xde, 0x44, 0x84,
  0xe3, 0x7a, 0xd5, 0x85, 0x44, 0xb7, 0x76, 0x3b, 0xe1, 0x06, 0xfe, 0x78,
  0x76, 0x7e, 0xfa, 0xfd, 0x5f, 0x7e, 0xe1, 0x4f, 0x78, 0xc9, 0x66, 0x7f,
  0xa5, 0x1c, 0x4c, 0x1d, 0xfc, 0xc7, 0x9f, 0xf5, 0xb5, 0x8d, 0x9f, 0x6b,
  0x8f, 0x3f, 0x90, 0x50, 0xbb, 0xbc, 0x11, 0x04, 0xce, 0x51, 0xb8, 0xcd,
  0x7d, 0xaf, 0xb4, 0x8c, 0xdb, 0x79, 0x38, 0x6c, 0x22, 0x10, 0xcb, 0xb7,
  0xba, 0x83, 0xe5, 0x11, 0x3a, 0x64, 0x01, 0x4d, 0x83, 0x8a, 0x62, 0x97,
  0xc1, 0x3b, 0x90, 0xb2, 0x72, 0xaa, 0x1b, 0x1f, 0xa0, 0x1e, 0x19, 0x19,
  0xa9, 0x76, 0x3f, 0x5e, 0x9d, 0x9c, 0xfc, 0xfc, 0x4d, 0xd0, 0x0e, 0x4c,

  0xed, 0x6d, 0x40, 0x9b, 0x62, 0xbb, 0xa0, 0xa1, 0xd5, 0x51, 0xf5, 0x0a,
  0x6c, 0x42, 0xa2, 0x7d, 0x7f, 0x2a, 0xb3, 0x79, 0x09, 0xe5, 0x78, 0x58,
  0x67, 0x46, 0xa5, 0x4d, 0x29, 0xe2, 0xaf, 0xc0, 0xe2, 0x34, 0xb1, 0x7a,
  0x8f, 0x13, 0x27, 0x03, 0xa4, 0x73, 0xff, 0x21, 0xce, 0xaa, 0xe4, 0xfd,
  0xe4, 0xa2, 0x38, 0x94, 0x2d, 0x94, 0x16, 0x95, 0x88, 0xbb, 0xa5, 0x4b,
  0xc3, 0xee, 0x79, 0xac, 0x21, 0x33, 0xe3, 0x43, 0x90, 0xbc, 0xad, 0xf2,
  0xfa, 0x13, 0x8a, 0x3a, 0xe8, 0x86, 0x42, 0x43, 0xd2, 0x1a, 0x7e, 0x52,
  0x79, 0x31, 0x27, 0x01, 0x19, 0x71, 0xf5, 0x74, 0x79, 0x1d, 0x9b, 0x1d,
  0x09, 0xdd, 0x94, 0x45, 0x31, 0xb9, 0x51, 0xd9, 0x09, 0x9d, 0xb6, 0x8a,
  0xbb, 0x04, 0x9f, 0x9d, 0x33, 0xa8, 0x6a, 0x0b, 0x33, 0x10, 0x2b, 0x4b,

  0x1f, 0x68, 0xb9, 0x31, 0x3d, 0xc0, 0x9f, 0x6e, 0xea, 0x6c, 0x31, 0xef,
  0xa9, 0xb0, 0xf7, 0x19, 0x86, 0xe3, 0x18, 0x5a, 0xe4, 0x6f, 0x7b, 0xc6,
  0x3b, 0x02, 0x27, 0x30, 0x0e, 0x44, 0x16, 0x42, 0x7f, 0x9d, 0x50, 0xa2,
  0x2b, 0x89, 0xbe, 0x45, 0x8a, 0x81, 0x90, 0x84, 0xc6, 0xf1, 0x05, 0x1b,
  0x91, 0x3e, 0xae, 0x67, 0xfb, 0xc5, 0x2c, 0x2c, 0x98, 0x32, 0x2c, 0xc9,
  0xc7, 0xef, 0xd0, 0x9c, 0xbc, 0xe1, 0x6d, 0xa2, 0xc0, 0x21, 0x7c, 0x52,

  0xad, 0x67, 0xe4, 0x37, 0x0f, 0x19, 0x2e, 0x85, 0xe7, 0x2b, 0x53, 0xba,
  0x4d, 0x1a, 0xca, 0xed, 0x6d, 0x12, 0x89, 0x6c, 0x08, 0x62, 0x11, 0x9d,
  0x6c, 0xac, 0x4e, 0xc2, 0x9b, 0x78, 0x38, 0xf2, 0x03, 0x66, 0x1a, 0x89,
  0x0d, 0x9b, 0xc7, 0xc8, 0x09, 0xcf, 0x08, 0x32, 0xfe, 0x78, 0x76, 0xa2,
  0x00, 0xe2, 0xe4, 0x59, 0xb2, 0x1e, 0xa7, 0x50, 0x5a, 0x59, 0x2c, 0x08,
  0x17, 0x4f, 0x5f, 0x02, 0xc1, 0xa1, 0x18, 0x04, 0x17, 0x42, 0x6e, 0x44,
  0xab, 0xaa, 0x5d, 0x4b, 0x87, 0x5c, 0xac, 0x1d, 0xd1, 0x96, 0xa0, 0x96,
  0x17, 0x79, 0xfc, 0x02, 0xa2, 0x88, 0x50, 0x89, 0xad, 0x3a, 0x90, 0x5a,


  0x59, 0x54, 0xd7, 0x4d, 0xb4, 0xca, 0xd8, 0x36, 0x64, 0x34, 0x22, 0x70,
  0x51, 0xd6, 0x31, 0x38, 0xcd, 0x09, 0xa5, 0xcd, 0x67, 0x68, 0xc5, 0xc3,


  0x57, 0xde, 0xfc, 0xf7, 0xe2, 0xf4, 0xf5, 0xe9, 0x89, 0xf9, 0xcb, 0xd1,
  0xdb, 0xe3, 0xef, 0x9d, 0x56, 0x20, 0x9d, 0xb3, 0x6c, 0x6d, 0x1a, 0xc7,
  0xcf, 0x01, 0xbd, 0xf8, 0x6c, 0xd0, 0x62, 0xc7, 0x9c, 0x84, 0x48, 0xf9,
  0x87, 0x2d, 0x61, 0xde, 0xee, 0x2f, 0xe9, 0xf1, 0x39, 0x92, 0xd3, 0x94,
  0x31, 0xea, 0xe1, 0x8f, 0xa4, 0x02, 0xbd, 0x44, 0x5a, 0x34, 0x8f, 0x6a,

  0x6b, 0x29, 0xdc, 0x26, 0x1f, 0xb7, 0x58, 0x1c, 0x34, 0x2b, 0x5f, 0x73,
  0x68, 0x33, 0x47, 0x9e, 0x14, 0x92, 0x30, 0xf2, 0xb9, 0x16, 0xcf, 0x36,
  0x7e, 0x0f, 0x74, 0xad, 0xa9, 0x92, 0xae, 0x33, 0x94, 0xc1, 0xe3, 0xa3,
  0xda, 0x17, 0xd9, 0xc0, 0x5b, 0xa4, 0x2a, 0xbc, 0x4d, 0x95, 0x81, 0x31,
  0x22, 0xaf, 0xa9, 0x85, 0xf2, 0xd1, 0xa1, 0x08, 0x22, 0x05, 0x37, 0x5c,
  0x7b, 0x4d, 0xb2, 0x01, 0x92, 0xca, 0x87, 0xdc, 0x0a, 0x52, 0xe4, 0x3d,
  0x88, 0x1f, 0xa1, 0xd6, 0x68, 0xb9, 0x20, 0x97, 0x29, 0xd1, 0x1f, 0x6e,
  0x12, 0xca, 0x52, 0xe9, 0xab, 0xb6, 0x99, 0x0b, 0xb6, 0x4b, 0x83, 0x52,
  0xab, 0xd0, 0xb4, 0xa2, 0x33, 0x10, 0x65, 0xbf, 0xad, 0x71, 0xd4, 0x1b,
  0x3e, 0x1d, 0x6e, 0x40, 0x90, 0x75, 0x4d, 0x59, 0xdf, 0xf5, 0xe3, 0x4d,
  0x63, 0x90, 0x46, 0xf8, 0xf7, 0x75, 0x7e, 0x9d, 0xa2, 0xb6, 0xcc, 0x5c,
  0x95, 0xe1, 0x90, 0x5f, 0xea, 0x8c, 0x91, 0xfe, 0xac, 0x41, 0xd2, 0xf6,
  0x28, 0x4f, 0x7e, 0xce, 0x20, 0x4f, 0x3a, 0x63, 0x5c, 0xfd, 0xac, 0x41,
  0x86, 0x2a, 0x20, 0x8c, 0x62, 0xfc, 0xfd, 0xf1, 0x45, 0xf2, 0xfa, 0xf4,
  0x8d, 0xbb, 0x60, 0x17, 0x92, 0x0f, 0x48, 0x24, 0x90, 0x4c, 0xd6, 0x85,
  0xa1, 0x41, 0xea, 0x97, 0x64, 0x1b, 0x50, 0x70, 0x9e, 0x22, 0x25, 0xe1,
  0x68, 0x37, 0xfb, 0x2c, 0xaf, 0x18, 0x8e, 0x88, 0x12, 0x6b, 0xe0, 0xbd,
  0xf1, 0x6a, 0x74, 0xe9, 0xe1, 0x25, 0x01, 0x1d, 0x5d, 0xaa, 0xfc, 0xa5,
  0x1b, 0x49, 0x58, 0x77, 0x69, 0xa5, 0x25, 0xa5, 0x93, 0x94, 0xf0, 0x8c,

  0x0a, 0xae, 0x8d, 0xa4, 0xa2, 0x94, 0x10, 0x7a, 0x58, 0x87, 0xf3, 0x11,
  0x88, 0x8d, 0xee, 0x9c, 0x37, 0x3a, 0x13, 0x3f, 0x93, 0xf0, 0x40, 0x73,
  0xfd, 0x5b, 0x94, 0x2e, 0x0d, 0xe8, 0x20, 0xfc, 0x28, 0xa9, 0x1b, 0x89,
  0x2e, 0xe0, 0x23, 0xd2, 0x76, 0x51, 0xcd, 0x17, 0x6e, 0x43, 0x1d, 0x48,
  0x6c, 0x3b, 0x84, 0xfd, 0xce, 0xa1, 0x84, 0x12, 0x8c, 0x8a, 0xce, 0x5e,
  0x03, 0xc9, 0x2b, 0xcb, 0xff, 0xe1, 0x29, 0xe8, 0x8f, 0xac, 0x3e, 0x66,
  0x56, 0xbe, 0x40, 0x67, 0xe7, 0x19, 0xdf, 0x88, 0xfa, 0xce, 0x08, 0xf5,
  0x5b, 0x18, 0xe4, 0x64, 0x3d, 0x09, 0xa2, 0x93, 0x7b, 0xf3, 0xb1, 0x68,
  0x65, 0x16, 0x36, 0xaa, 0xac, 0xac, 0x3d, 0xaa, 0x96, 0xbc, 0xf3, 0x58,
  0x68, 0x85, 0x34, 0x43, 0xd9, 0x66, 0x75, 0x8e, 0x70, 0x58, 0x78, 0xbd,
  0x24, 0x66, 0xa9, 0x5f, 0xd5, 0x8a, 0x6b, 0x41, 0xe0, 0xf6, 0x3a, 0x09,
  0x5a, 0xb4, 0x1f, 0xf3, 0x29, 0xec, 0xd7, 0x90, 0xbb, 0x28, 0x05, 0x75,
  0xe9, 0xae, 0x02, 0x53, 0x6d, 0x8e, 0x59, 0x89, 0x0d, 0x1c, 0x20, 0x95,
  0x97, 0x9a, 0xde, 0xa7, 0x04, 0xf6, 0x80, 0xde, 0x85, 0x69, 0xc1, 0x95,
  0x86, 0x7a, 0x02, 0xf1, 0x9a, 0x3b, 0x57, 0xf3, 0xf4, 0x84, 0xff, 0x78,
  0xad, 0x3a, 0x9b, 0xd6, 0x0d, 0x25, 0x56, 0x5d, 0xbb, 0xb0, 0x70, 0x16,
  0x62, 0xe2, 0x90, 0x78, 0x9b, 0x42, 0x0e, 0x71, 0x1d, 0x41, 0x64, 0x13,
  0xea, 0x8e, 0x8f, 0xf3, 0x69, 0xe7, 0x2b, 0xfa, 0x11, 0x46, 0x74, 0x72,
  0x5f, 0xf0, 0x7d, 0xf2, 0xba, 0x83, 0xf2, 0xac, 0x37, 0xda, 0xb3, 0x2e,
  0x5d, 0x78, 0x9e, 0x7d, 0x8c, 0x68, 0x9f, 0xfc, 0x5c, 0x7c, 0x11, 0x19,
  0x15, 0x2d, 0x8a, 0xe6, 0x5c, 0x65, 0xab, 0x85, 0xf0, 0x4c, 0xf9, 0x09,
  0x42, 0xc7, 0xf0, 0x27, 0x60, 0x97, 0xa7, 0x3a, 0x4b, 0xa3, 0x0e, 0xfb,
  0xa6, 0xe0, 0x73, 0xf9, 0xac, 0xe1, 0xbb, 0xac, 0x39, 0x10, 0xea, 0x46,
  0x6e, 0xa9, 0x4d, 0x7a, 0xa1, 0xe3, 0x47, 0x94, 0xde, 0x68, 0x64, 0x53,
  0x69, 0xff, 0xad, 0x6f, 0x84, 0x48, 0x77, 0x2c, 0xbe, 0x9c, 0x2f, 0x19,
  0xeb, 0x5d, 0x57, 0x5c, 0xb6, 0xeb, 0xd0, 0x1d, 0x15, 0x6e, 0x9d, 0x17,
  0x5c, 0x11, 0x22, 0xdf, 0x28, 0x79, 0x57, 0x06, 0xe8, 0x93, 0xe5, 0xbc,

  0x91, 0xca, 0x7b, 0xca, 0x4c, 0xe4, 0xdd, 0xb9, 0x4a, 0x8b, 0x4b, 0x46,
  0x14, 0xf4, 0x06, 0x04, 0x89, 0x5b, 0x61, 0x68, 0xae, 0x3a, 0xd4, 0x97,
  0x22, 0x32, 0xbb, 0x2e, 0x1e, 0xfa, 0xc1, 0xbe, 0xdd, 0x07, 0xe9, 0x94,
  0x85, 0xf2, 0x14, 0xda, 0x88, 0xef, 0x00, 0x4b, 0x78, 0x93, 0x72, 0x2b,
  0x5d, 0xed, 0x37, 0xef, 0x4c, 0x16, 0x3d, 0x28, 0x0a, 0xac, 0x85, 0x79,
  0xd2, 0xc8, 0xdf, 0x49, 0xd9, 0xa9, 0xc6, 0x99, 0x9e, 0x5c, 0xde, 0x28,
  0xd2, 0x6a, 0x00, 0x33, 0xdc, 0xb2, 0x47, 0x0e, 0xb3, 0x42, 0xbb, 0xa6,
  0xca, 0x98, 0x1e, 0x8f, 0x0c, 0xc1, 0x56, 0x79, 0xd9, 0x1c, 0x0e, 0x34,
  0xc4, 0x5b, 0xcf, 0x81, 0x5b, 0xcf, 0x0d, 0x28, 0xe5, 0xec, 0xd5, 0x78,


  0xac, 0x74, 0xf2, 0x3a, 0x24, 0x09, 0xf1, 0x59, 0x12, 0x9a, 0x85, 0x02,
  0x3a, 0x85, 0xaa, 0xa2, 0x8c, 0xd1, 0x49, 0x32, 0x38, 0x60, 0x9e, 0xf6,


  0x86, 0x19, 0x73, 0x7c, 0xb9, 0x37, 0xad, 0x4d, 0x64, 0x0f, 0x76, 0x07,

  0x05, 0xe4, 0xb3, 0x68, 0xba, 0x0a, 0xc7, 0x2b, 0x69, 0x9b, 0x51, 0x8e,
  0xac, 0x3c, 0x9e, 0x74, 0x43, 0xc3, 0x77, 0xf2, 0x56, 0xcf, 0xc2, 0x83,
  0x47, 0x91, 0x45, 0x7f, 0xcb, 0xab, 0x1a, 0xfc, 0x2b, 0x8b, 0xfe, 0x36,
  0xb2, 0xe8, 0xc7, 0xf6, 0x5b, 0xfc, 0xa9, 0xc3, 0xc3, 0x67, 0x52, 0x55,
  0xc1, 0x3e, 0x3a, 0x2a, 0xfa, 0xb7, 0x0c, 0x88, 0xbf, 0xc6, 0x2b, 0x36,
  0x0f, 0x0e, 0xb9, 0xfe, 0x20, 0xfc, 0x96, 0x77, 0x79, 0xbd, 0x4f, 0x3d,
  0x71, 0xcb, 0x32, 0xaa, 0x37, 0x8d, 0x47, 0x5a, 0x3d, 0xf3, 0x99, 0x80,
  0xfd, 0xa8, 0x31, 0x47, 0x7a, 0xf8, 0x0d, 0x65, 0x50, 0x35, 0xf1, 0xd4,
  0x5f, 0x9d, 0x86, 0xf7, 0x9d, 0xa7, 0xd6, 0x8d, 0xb2, 0x77, 0xa8, 0x21,
  0xf4, 0x57, 0xe0, 0xc5, 0x8b, 0x6c, 0xc9, 0xfd, 0x1a, 0x32, 0x02, 0xeb,
  0x71, 0x1e, 0x40, 0xae, 0xb9, 0x9b, 0x57, 0x29, 0xd0, 0x96, 0x17, 0xe9,
  0x5d, 0x04, 0x6c, 0x4b, 0x3c, 0xc5, 0x6c, 0xae, 0x98, 0xfb, 0x79, 0x99,



  0x15, 0x64, 0x29, 0x40, 0x11, 0x10, 0xb7, 0x19, 0xf9, 0x61, 0x11, 0x35,
  0x9f, 0x5b, 0x57, 0xad, 0x7c, 0x35, 0x80, 0x03, 0xa8, 0xa5, 0x81, 0x21,
  0xdf, 0x19, 0xd1, 0x12, 0xe2, 0xd8, 0x70, 0x07, 0xcf, 0xec, 0xbe, 0xd9,
  0x93, 0x20, 0xcf, 0x16, 0x63, 0x84, 0x78, 0x5b, 0xa7, 0xcc, 0x44, 0x03,
  0x02, 0xd2, 0x47, 0x07, 0x51, 0xba, 0x3c, 0xb4, 0x9a, 0x2b, 0x4f, 0x41,
  0x3c, 0x60, 0x6e, 0x7c, 0x46, 0xbc, 0x4e, 0x00, 0x77, 0x47, 0xc9, 0x29,
  0xbc, 0x70, 0x2d, 0x90, 0x71, 0xae, 0x04, 0x4a, 0x5d, 0xd1, 0x68, 0x9b,
  0x70, 0x9f, 0x7b, 0x27, 0xac, 0xb3, 0xd2, 0xec, 0x97, 0x3d, 0x61, 0xb3,

  0x0e, 0x82, 0x49, 0x7d, 0xcd, 0x59, 0x72, 0x7e, 0x74, 0x71, 0x8e, 0x40,
  0x2f, 0x31, 0x80, 0x00, 0x24, 0x35, 0xad, 0x76, 0x2d, 0x48, 0x90, 0x70,
  0x33, 0xa7, 0x87, 0x38, 0x06, 0xc1, 0xf8, 0x65, 0xf6, 0xbc, 0xf9, 0x9f,
  0xfa, 0x1e, 0x57, 0xbf, 0x64, 0x5a, 0x6b, 0xe2, 0x42, 0x3a, 0x6d, 0x64,
  0xb5, 0xc3, 0x43, 0x97, 0x85, 0x84, 0xde, 0xc6, 0x2c, 0xe5, 0x24, 0x93,
  0x7c, 0x24, 0x49, 0x9b, 0x5a, 0x7d, 0xa1, 0xad, 0x04, 0xe8, 0x21, 0x4e,
  0xc6, 0x2e, 0xab, 0x98, 0xde, 0x21, 0x9f, 0xb6, 0x0a, 0x80, 0x4c, 0xc2,
  0x2f, 0x4c, 0xe0, 0x6a, 0x70, 0x8f, 0x83, 0x72, 0x0d, 0xe0, 0xe3, 0xfd,
  0xfd, 0x30, 0x6f, 0x38, 0x9d, 0x18, 0xa6, 0x2a, 0xda, 0x9c, 0x54, 0xf5,
  0xe0, 0x15, 0xf6, 0x9a, 0x42, 0xbd, 0xac, 0xc9, 0xd6, 0x18, 0xce, 0xc9,
  0x8d, 0x49, 0x3b, 0x16, 0x1a, 0x15, 0x87, 0xcc, 0x63, 0xbe, 0x43, 0x99,
  0x91, 0xec, 0x59, 0x9b, 0xb3, 0x70, 0x05, 0x92, 0xf6, 0xce, 0x4d, 0x35,
  0xc9, 0x18, 0x35, 0xc1, 0xe2, 0xfd, 0x0e, 0x66, 0x16, 0xf0, 0xef, 0xc3,
  0x27, 0x11, 0x8a, 0x48, 0xc6, 0x17, 0xa7, 0xe7, 0x8a, 0xbd, 0x1f, 0xca,
  0x67, 0x64, 0x3e, 0xd0, 0x13, 0x16, 0x6a, 0x65, 0x10, 0x42, 0xee, 0xcc,
  0x2c, 0x3e, 0x80, 0x85, 0x31, 0xf5, 0xbe, 0xca, 0x1c, 0x00, 0x2d, 0xf4,
  0x64, 0x6d, 0xdf, 0x0a, 0x20, 0x80, 0x42, 0xf6, 0xea, 0xbd, 0xf4, 0x5e,
  0xe2, 0x6b, 0x76, 0xca, 0xf7, 0x97, 0xeb, 0xd7, 0x89, 0x8e, 0xa4, 0x92,
  0x9d, 0x10, 0x7f, 0x25, 0x1d, 0xd6, 0x76, 0xfa, 0xec, 0xd2, 0x22, 0x5f,

  0xa2, 0x53, 0x07, 0xc9, 0xcc, 0x1c, 0x5e, 0x16, 0x69, 0x2d, 0x63, 0x74,
  0x9b, 0x25, 0x3e, 0xc1, 0x90, 0xc5, 0x92, 0xd8, 0x94, 0xb2, 0x2f, 0x6c,

  0x1a, 0xc0, 0xba, 0x97, 0x95, 0x82, 0xb4, 0x8a, 0xe0, 0x54, 0x63, 0xc1,
  0xe9, 0xd9, 0x9e, 0xd4, 0x3f, 0x3b, 0x3d, 0xbf, 0x48, 0xac, 0xd0, 0xc7,
  0x97, 0xf1, 0xa3, 0xce, 0x05, 0xa2, 0x96, 0x29, 0xf0, 0xd9, 0xb9, 0xb2,
  0x8d, 0xc0, 0x21, 0x29, 0x36, 0x41, 0xd3, 0x19, 0x62, 0x80, 0x36, 0x7b,
  0xb3, 0x92, 0xb1, 0x7c, 0x5c, 0xf8, 0x51, 0x50, 0xba, 0x20, 0x67, 0xfa,
  0x90, 0xc1, 0x9c, 0x72, 0xfb, 0xe8, 0x20, 0x42, 0x19, 0x64, 0x45, 0x9f,

  0x1f, 0x8d, 0x2f, 0x78, 0xc7, 0xe8, 0x6f, 0xc1, 0xbc, 0xb9, 0x40, 0x54,
  0x7e, 0x18, 0x18, 0x2a, 0x96, 0x32, 0x28, 0x01, 0xcd, 0x58, 0x1b, 0x18,
  0xdf, 0x16, 0xb8, 0x7b, 0x3b, 0xf6, 0xc8, 0xcb, 0x36, 0x04, 0xd7, 0x14,
  0x3a, 0xc1, 0x05, 0xc7, 0x0f, 0xb6, 0xe4, 0x23, 0x5b, 0x46, 0x31, 0xe3,
  0x0b, 0xd1, 0x82, 0x5f, 0x7f, 0xf4, 0xd8, 0xe3, 0x14, 0x24, 0xa7, 0x64,
  0x80, 0x63, 0x6d, 0x93, 0x4b, 0x3f, 0x1c, 0x2a, 0xa9, 0x40, 0x58, 0x30,
  0x51, 0xf0, 0x73, 0x6e, 0x9c, 0x27, 0x52, 0xa2, 0x7e, 0x62, 0x55, 0x05,
  0x6f, 0x2a, 0xf4, 0x63, 0xcd, 0xf8, 0x81, 0xda, 0xd6, 0x21, 0xb9, 0x47,
  0x4c, 0xe9, 0x7f, 0x36, 0x84, 0x6e, 0xb3, 0x16, 0x79, 0xe9, 0xbe, 0x5c,
  0x30, 0xba, 0x56, 0x5e, 0xac, 0x33, 0xe8, 0x68, 0x69, 0xb5, 0xa0, 0x56,
  0x0f, 0x86, 0x87, 0x54, 0x52, 0x40, 0x76, 0x53, 0xc4, 0x60, 0xa9, 0xbd,
  0x6f, 0x88, 0xfc, 0x39, 0x3e, 0x39, 0x72, 0x27, 0xc5, 0x7d, 0x22, 0x70,
  0x83, 0x9d, 0xae, 0x4f, 0xad, 0xed, 0xad, 0x98, 0x18, 0x25, 0x67, 0xd4,
  0xb3, 0x1c, 0x7a, 0x53, 0xfd, 0x1f, 0x6e, 0x34, 0xbe, 0x24, 0xf0, 0xc0,

  0x1b, 0xb1, 0x09, 0x33, 0x25, 0x2f, 0xcc, 0xc1, 0xe2, 0x27, 0xf4, 0x57,
  0x0f, 0xd3, 0x3c, 0x58, 0xee, 0x73, 0xf7, 0x72, 0x6d, 0x96, 0x62, 0x0c,
  0xf4, 0xee, 0x23, 0x8f, 0x85, 0xae, 0x8c, 0xf5, 0x8e, 0x21, 0x2c, 0x6f,
  0xa6, 0xbb, 0x2c, 0xad, 0x62, 0x66, 0x3c, 0xc2, 0x5c, 0x9f, 0x69, 0xf1,
  0x70, 0x6f, 0x28, 0x16, 0x06, 0xaf, 0x26, 0xb6, 0x81, 0x10, 0xa5, 0x09,
  0x93, 0x22, 0x67, 0xc6, 0x2a, 0x88, 0xd3, 0x2e, 0x6c, 0xae, 0xbd, 0x0d,
  0x03, 0x13, 0xaf, 0x9c, 0xe8, 0xb5, 0xa1, 0x95, 0x74, 0x37, 0xb7, 0xd3,
  0x80, 0xfd, 0x31, 0x53, 0xa2, 0x25, 0x1b, 0x2b, 0xbf, 0x5a, 0xb3, 0x93,
  0xfc, 0x64, 0x01, 0xbd, 0x23, 0xa7, 0x01, 0xc5, 0x03, 0x8c, 0x80, 0xf7,
  0x95, 0xff, 0xc7, 0x4f, 0xdc, 0x50, 0x73, 0xaa, 0xe9, 0xb4, 0x63, 0x39,

  0xde, 0x63, 0xbb, 0x48, 0x30, 0x02, 0x03, 0x1e, 0x13, 0x8b, 0x91, 0x9b,
  0x75, 0x4f, 0x22, 0xe8, 0x6f, 0xfe, 0x9e, 0x3c, 0x13, 0xd3, 0x97, 0x6c,
  0xdf, 0xe2, 0xce, 0xe5, 0xde, 0x4b, 0xd3, 0x6e, 0xf6, 0x9b, 0x71, 0xa3,
  0x1a, 0xf9, 0x8d, 0x80, 0x30, 0x5e, 0x89, 0x5f, 0x86, 0x5a, 0x51, 0x05,
  0x88, 0x8b, 0xeb, 0xa5, 0xe4, 0xf0, 0x7a, 0x5f, 0xfa, 0x5c, 0x3c, 0x19,
  0x54, 0x79, 0x6e, 0xf1, 0x1a, 0x3d, 0x2e, 0x5a, 0xaa, 0xc5, 0x6c, 0x61,
  0x8c, 0x0c, 0xf1, 0x20, 0xb7, 0xd4, 0xd6, 0xba, 0x87, 0x18, 0x7b, 0x84,
  0x5d, 0x06, 0x51, 0x2c, 0xea, 0xae, 0x3a, 0x15, 0x4a, 0x0f, 0xfa, 0x8a,
  0x36, 0x5c, 0x9e, 0xe3, 0x5f, 0x29, 0x40, 0x4a, 0xe8, 0x12, 0xaf, 0xb2,
  0xbf, 0x41, 0x91, 0x74, 0xfd, 0x5a, 0x35, 0xa6, 0x9c, 0x16, 0xeb, 0xd4,
  0xb3, 0xe5, 0x1f, 0x3f, 0x17, 0x0f, 0x95, 0xb8, 0x41, 0x28, 0xac, 0x5e,
  0x64, 0x4d, 0x10, 0x5e, 0x7c, 0x72, 0x60, 0x7d, 0x95, 0x94, 0x31, 0x2b,
  0x75, 0x20, 0x7e, 0xde, 0xac, 0x61, 0x6e, 0xe3, 0xf1, 0xd7, 0xc9, 0xbb,
  0x37, 0x4f, 0x28, 0x9d, 0xe7, 0x32, 0xab, 0x56, 0x15, 0xa5, 0x70, 0x2a,
  0x0d, 0x9f, 0x7e, 0xe3, 0x0d, 0x76, 0xe8, 0x1c, 0x9f, 0x22, 0x62, 0x73,
  0xb9, 0xbd, 0x64, 0x2b, 0x98, 0xf3, 0xa3, 0xba, 0xe7, 0x4b, 0x45, 0x46,
  0x60, 0xef, 0x17, 0xa0, 0x17, 0x04, 0xac, 0x8a, 0x95, 0x96, 0xcf, 0xba,
  0x49, 0xe1, 0x2d, 0x06, 0xf6, 0xe4, 0x91, 0x63, 0x60, 0xd5, 0xdd, 0x8a,
  0x3a, 0xab, 0x14, 0x97, 0x64, 0x17, 0x44, 0x6e, 0xd4, 0x13, 0x66, 0x9a,
  0xaf, 0xf9, 0xde, 0x93, 0x12, 0x1b, 0xbe, 0x06, 0xf5, 0x1c, 0xfe, 0x52,
  0xef, 0xbd, 0x27, 0xbe, 0x57, 0xa1, 0x96, 0xde, 0x68, 0xd2, 0x12, 0x03,
  0x3a, 0x8a, 0xf7, 0xec, 0x53, 0xfb, 0x2c, 0x39, 0x8e, 0xf2, 0xc2, 0x6b,
  0x61, 0xd4, 0xf3, 0x86, 0x28, 0xbf, 0x6a, 0x20, 0x68, 0x24, 0x87, 0x35,
  0x1e, 0x6f, 0xef, 0xbd, 0x57, 0x9e, 0xb7, 0x9d, 0x26, 0xe8, 0x1f, 0x60,
  0x49, 0x13, 0x8b, 0x42, 0x67, 0x59, 0xcf, 0xcd, 0xc2, 0x32, 0xfa, 0x8c,
  0xd2, 0xa0, 0x5b, 0xe7, 0xa9, 0x4c, 0x30, 0xf3, 0x31, 0x44, 0xf4, 0xae,
  0x33, 0xed, 0xbf, 0x7e, 0xd5, 0x57, 0x04, 0x04, 0x6a, 0xf7, 0x3e, 0x72,
  0x20, 0x77, 0x86, 0xfa, 0x52, 0x5f, 0x16, 0xf9, 0x3f, 0x14, 0xbe, 0x80,
  0x04, 0xb4, 0xb6, 0x9f, 0xf2, 0x1e, 0x3f, 0x14, 0x86, 0xc1, 0xbd, 0x87,

  0xc1, 0x14, 0x29, 0x78, 0xea, 0x1e, 0x78, 0x24, 0x54, 0xcb, 0xdd, 0xe3,
  0xa0, 0xfd, 0x53, 0x12, 0x3e, 0x42, 0xf7, 0x59, 0x2b, 0xad, 0xfe, 0xe9,
  0x63, 0xd1, 0xb9, 0x54, 0x39, 0x26, 0xc9, 0x4b, 0x1b, 0xb1, 0x00, 0x24,
  0x63, 0x97, 0x4d, 0x3f, 0x15, 0xb1, 0x27, 0x47, 0x29, 0xbd, 0xd6, 0x53,
  0xd7, 0xcc, 0x8b, 0xfe, 0x7a, 0x93, 0x17, 0x92, 0xea, 0x1e, 0xbc, 0xfe,
  0xb4, 0xc7, 0xfd, 0x58, 0xb3, 0xcc, 0x3c, 0x02, 0x2d, 0x79, 0xcf, 0x3f,
  0xb3, 0x37, 0xc1, 0x03, 0xf7, 0x54, 0x20, 0xc3, 0x81, 0x0f, 0x58, 0xaa,
  0x17, 0x49, 0xfc, 0x27, 0x99, 0x76, 0x3a, 0x88, 0x20, 0xcb, 0xcf, 0xed,
  0xe7, 0x17, 0xe5, 0x65, 0xe2, 0x63, 0xb2, 0x3c, 0x65, 0x92, 0x7a, 0x8b,
  0x76, 0x15, 0xce, 0x3a, 0x28, 0x92, 0x0b, 0xaf, 0x4c, 0xd6, 0x3d, 0xfd,
  0x5c, 0x68, 0x43, 0xe5, 0xa5, 0x35, 0x56, 0xfb, 0xde, 0x78, 0xb6, 0xef,
  0x2b, 0xab, 0x33, 0x8a, 0xca, 0x72, 0x19, 0x7f, 0xef, 0x0b, 0x4c, 0x19,
  0xc7, 0x46, 0x8c, 0x5c, 0x1a, 0xa2, 0xc6, 0x33, 0x0e, 0xca, 0xd0, 0x3d,
  0x76, 0xd8, 0x62, 0xba, 0x17, 0xbe, 0xfa, 0x94, 0x1c, 0xbf, 0xf1, 0x1e,
  0x7c, 0xe4, 0x16, 0x98, 0x2e, 0x48, 0x1b, 0xb8, 0x63, 0x47, 0x55, 0x9d,
  0xec, 0xd0, 0x5b, 0x1e, 0x66, 0xc9, 0x33, 0xa6, 0x8c, 0xf7, 0x25, 0x83,
  0x6e, 0x61, 0xff, 0x83, 0x67, 0x98, 0x1c, 0x5e, 0x5f, 0x19, 0xa9, 0x36,
  0x6d, 0x90, 0x13, 0x5a, 0x68, 0x84, 0xab, 0x7b, 0xf6, 0xcf, 0x9e, 0x6e,
  0x78, 0x56, 0x84, 0x66, 0x6d, 0x45, 0xbd, 0xf7, 0xde, 0xb3, 0xf0, 0x9a,
  0xab, 0x39, 0xa0, 0x55, 0x0a, 0x72, 0xd3, 0x92, 0x1d, 0x2a, 0x8f, 0xfe,
  0x0f, 0xf5, 0x0c, 0x56, 0x84, 0x27, 0x58, 0xff, 0x87, 0x3f, 0xdf, 0xcf,
  0xfd, 0x1a, 0x3e, 0xf6, 0x09, 0x56, 0x19, 0xc2, 0x04, 0xd3, 0x56, 0xbb,
  0x08, 0x97, 0x21, 0x84, 0xdd, 0xf1, 0x46, 0xe0, 0x33, 0x37, 0x7a, 0xc4,
  0xba, 0x70, 0x9c, 0x83, 0x0d, 0x40, 0xc1, 0x22, 0x98, 0xf9, 0xb8, 0x93,
  0xc4, 0xf3, 0xc5, 0x0b, 0xe5, 0xf9, 0x50, 0xf7, 0x3b, 0xd7, 0xa0, 0xbe,

  0x5a, 0xb3, 0xc5, 0x6d, 0x57, 0xe4, 0x1c, 0x6c, 0xde, 0x6b, 0x87, 0x8e,
  0x7b, 0x89, 0xd8, 0xe7, 0x82, 0x93, 0xd7, 0x14, 0x05, 0x66, 0xb3, 0xdc,
  0x36, 0x11, 0x80, 0x7b, 0xbc, 0x2a, 0xd9, 0x67, 0x48, 0x60, 0x1b, 0x3b,
  0x69, 0x3c, 0x35, 0x53, 0x92, 0xc8, 0xbd, 0xcf, 0x88, 0x6a, 0x43, 0x29,
  0x4e, 0xe6, 0x94, 0xae, 0xb2, 0xe9, 0x27, 0xbd, 0x32, 0x76, 0x8c, 0xc8,
  0x5b, 0x8f, 0xed, 0xd6, 0x12, 0xf5, 0x9d, 0x9d, 0x1f, 0x75, 0x8d, 0x00,
  0xf7, 0x28, 0x53, 0xcd, 0xf9, 0xc5, 0xf8, 0xec, 0x05, 0xcd, 0x97, 0xc3,
  0x86, 0xe6, 0x42, 0xbc, 0x1e, 0x67, 0x7f, 0x97, 0x32, 0xb3, 0xda, 0x3d,
  0xfd, 0xb4, 0xe7, 0xe9, 0xb1, 0x38, 0xf7, 0x8e, 0x81, 0xd4, 0x6c, 0xce,
  0xc1, 0x7f, 0x89, 0x89, 0x66, 0x5d, 0xa8, 0x7f, 0x9f, 0x5d, 0x60, 0x34,
  0x33, 0x70, 0x43, 0x0a, 0x2d, 0xbb, 0x87, 0x3f, 0x77, 0x9e, 0x9a, 0xab,
  0x75, 0xf1, 0xc9, 0xea, 0x8b, 0x82, 0xa3, 0xa7, 0x07, 0xec, 0x5e, 0x78,
  0xae, 0x57, 0xc3, 0xf3, 0x83, 0xda, 0xbc, 0xa7, 0x81, 0x78, 0x28, 0xc4,
  0xf5, 0x28, 0xf1, 0x4e, 0xc3, 0x5f, 0xd7, 0xde, 0x1e, 0x3c, 0xdf, 0xb7,
  0xe2, 0x57, 0x10, 0x79, 0x3e, 0x65, 0x77, 0x8e, 0xea, 0x34, 0xc7, 0x62,
  0x95, 0x17, 0xe4, 0x82, 0x70, 0x8f, 0xb8, 0x01, 0x0e, 0x5a, 0x42, 0xa0,
  0xab, 0x6e, 0xd4, 0x4d, 0xda, 0xac, 0x3d, 0x11, 0xf3, 0x9c, 0x69, 0x67,
  0x4c, 0x51, 0xc7, 0xa5, 0xd0, 0x6b, 0x5e, 0xa8, 0xb7, 0xad, 0xe3, 0x42,
  0xd3, 0x97, 0xbe, 0xff, 0x9e, 0xe5, 0x88, 0x05, 0x8b, 0x93, 0xd0, 0x95,
  0x6d, 0xfe, 0x64, 0xf8, 0x2e, 0x03, 0x08, 0xd3, 0x15, 0x46, 0xc0, 0xa7,
  0xca, 0xa8, 0x3d, 0xa5, 0xa2, 0xdf, 0xe0, 0xf2, 0xc4, 0xa2, 0xe7, 0x65,
  0x21, 0x31, 0x5b, 0x4a, 0xde, 0x84, 0xe7, 0x93, 0xc1, 0xa6, 0xd9, 0x17,
  0x66, 0x66, 0xf0, 0xea, 0xc3, 0xc5, 0xd7, 0xa7, 0xe7, 0xe3, 0x64, 0x8f,
  0x4a, 0xdb, 0x2f, 0xce, 0x8f, 0xff, 0xfc, 0xe1, 0xc2, 0xfc, 0x53, 0x47,
  0x7a, 0x93, 0x16, 0xb9, 0x91, 0x4e, 0x66, 0x39, 0x59, 0x61, 0x88, 0xe5,

  0x52, 0x9b, 0x34, 0x31, 0x74, 0xb1, 0x91, 0xc7, 0x65, 0xa5, 0x88, 0x26,
  0x94, 0x8f, 0x52, 0xca, 0x89, 0x33, 0xaa, 0x5f, 0xc1, 0x19, 0x7e, 0xa5,
  0xb3, 0x9c, 0xf3, 0x4e, 0x51, 0xbe, 0xa6, 0xed, 0x24, 0x17, 0x5f, 0xbf,

  0x7a, 0xff, 0xcd, 0x58, 0x3b, 0x78, 0x7c, 0xf7, 0xdd, 0x77, 0xdd, 0xe0,
  0x2e, 0xf4, 0xd8, 0xab, 0xf4, 0xf6, 0x76, 0x54, 0x67, 0x9f, 0x7d, 0x36,
  0x3e, 0x3a, 0x4a, 0x5e, 0x9d, 0x8c, 0x4f, 0x3f, 0x73, 0x38, 0x0e, 0x3b,


  0x07, 0x84, 0x60, 0x75, 0x99, 0x35, 0xe6, 0x2f, 0x9f, 0x7d, 0xf6, 0xff,
  0x01, 0xdb, 0xb6, 0x69, 0xbe, 0xc6, 0x8e, 0x02, 0x00,
};
#define BUF_SIZE 0x10000
static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
{
  (void) opaque;
  /* not a typo, keep it calloc() */
  return (voidpf) calloc(items, size);







|
|


|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
<
|
>
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
<
|
<
|
>
|
|
>
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
>
|
|
|
|
>
>
|
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
|
|
<
<
<
|
|
|
|
|
|
|
<
|
|
|
>
|
|
|
<
|
<
<
<
|
|
|
|
|
|
>
|
>
>
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
<
|
<
|
>
|
<
<
<
|
<
>
|
|
<
<
>
|
|
>
|
<
<
|
<
>
|
>
>
>
|
>
>
>
|
|
|
|
|
|
|
|
<
|
|
>
|
|
|
<
|
|
>
|
|
|
|
|
|
|
|
|
|
|
>
>
>
|
|
|
|
|
|
>
|
|
|
|
<
|
|
|
|
|
|
>
|
|
<
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
|
|
|
>
|
>
|
|
|
|
|
|
|
|
|
<
|
<
|
>
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
<
|
<
|
|
|
|
>
|
<
<
<
<
|
|
|
<
<
|
|
<
>
>
>
|
|
<
|
>
|
|
|
>
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
<
|
|
>
|
<
|
<
|
<
>
|
|
|
>
|
|
>
>
|
>
|
<
|
|
>
<
|
<
|
<
<
|
|
|
|
|
|
|
>
|
>
>
>
|
|
|
|
|
|
|
<
<
<
<
|
|
>
>
>
>
|
|
|
>
|
|
|
|
|
<
|
|
>
|
|
|
|
>
>
|
|
<
<
|
|
|
|
|
|
<
|
>
|
|
|
|
|
<
|
<
|
|
<
<
|
<
|
|
|
<
<
>
|
<
|
>
|
<
>
>
|
|
|
<
<
<
|
>
|
>
>
|
>
|
<
>
|
>
|
|
>
>
>
|
|
|
|
|
|
|
|
>
|
|
<
|
<
|
<
<
<
<
|
|
|
>
>
>
>
>
|
|
|
|
|
>
>
>
|
>
|
|
|
|
|
|
|
|
|
|
|
<
<
|
|
>
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
<
|
>
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
>
>
|
|
|
|
|
|
|
>
>
|
|
<
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
<
|
>
>
|
<
|
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
|
|
|
>
|
<
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
<
<
<
<
|
<
|
<
<
<
<
<
|
<
|
<
<
>
>
>
|
|
>
>
>
>
>
>
>
>
>
>
>
<
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
|
<
|
|
|
>
|
<
|
|
>
>
>
|
|
|
|
|
|
>
|
|
<
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
>
|
|
<
|
|
|
>
|
<
>
|
<
|
|
|
|
|
|
|
<
|
>
|
|
<
|
>
|
|
|
|
|
|
<
<
|
<
|
|
>
|
|
<
|
>
>
|
<
>
|
|
>
|
>
|
>
|
<
|
|
>
|
<
|
|
|
|
|
|
|
<
|
|
>
>
|
<
|
|
|
>
|
|
<
|
>
|
<
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
|
|
>
|
|
<
|
|
|
|
<
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
<
|
|
>
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
>
>
|
|
>
|
<
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
<
|
|
>
|
|
|
<
|
<
<
<
<
<
<
|
<
|
<
|
<
<
<
<
|
|
|
|
|
|
|
|
<
>
>
>
|
>
>
|
>
>
|
>
>
>
|
>
|
>
>
|
>
|
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
<
|
>
|
<
|
>
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
|
|
|
|
|
|
|
>
|
<
|
|
|
|
<
|
>
|
|
|
>
|
|
|
<
|
|
>
|
<
|
|
>
|
|
|
|
|
|
|
|
|
|
|
<
<
|
|
|
<
>
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
<
|
>
|
|
|
|
|
>
|
|
<
<
|
<
|
|
>
|
|
|
<
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
>
|
>
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
>
|
|
<
<
|
>
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
<
<
>
|
|
<
>
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
<
|
>
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
>
>
|
|
<
|
<
|
>
|
<
|
|
|
|
|
|
>
|
>
>
|
|
<
|
<
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
>
|
|
|
>
|
|
>
|
<
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
<
<
|
<
|
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
>
>
>
|
>
|
>
|
<
>
|
|
<
|
<
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
>
|
|
|
|
|
|
>
|
<
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
<
|
|
|
|
>
|
|
<
|
|
|
|
|
|
>
|
>
|
<
>
>
>
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
>
|
<
|
>
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
<
<
<
|
>
|
|
<
>
|
<
>
>
|
|
<
|
|
|
|
|
|
|
|
|
>
|
<
>
|
|
<
|
>
|
|
<
>
|
>
>
>
>
>
>
>
>
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
|
<
<
<
<
|
|
|
<
<
<
|
<
>
|
|
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
<
|
|
>
>
|
|
|
|
|
|
>
|
<
|
|
<
<
<
|
<
|
<
<
<
<
<
<
>
|
|
<
|
>
|
|
|
<
>
|
|
>
>
|
>
>
>
>
>
>
>
|
|
|
>
<
<
<
|
|
|
>
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
<
<
<
<
<
<
<
|
|
|
<
<
|
<
<
>
|
>
>
|
>
|
|
|
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
|
<
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
|
|
>
|
|
>
|
|
<
<
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
|
>
|
>
>
|
|
<
<
|
|
|
|
|
|
<
<
|
|
>
|
>
|
>
|
<
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
<
|
<
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
>
>
|
|
|
|
|
>
|
<
|
|
|
|
|
<
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
|
>
>
|
|
<
<
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
<
|
|
<
|
>
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
<
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
|
|
|
|
|
|
|
<
|
|
>
|
<
|
|
>
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
<
|
|
>
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
<
<
<
|
|
|
<
>
|
|
>
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
>
>
|
>
>
|
>
>
|
|
<
|
<
<
|
<
|
>
>
|
|
|
<
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
<
|
>
|
|
|
|
|
|
|
|
<
<
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
>
>
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
<
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
<
|
|
|
>
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
>
>
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
<
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
|
|
<
|
|
>
|
|
>
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
>
|
<
|
|
<
>
|
<
|
|
<
|
|
>
>
|
<
|
|
|
>
>
>
|
<
|
<
>
>
|
|
|
|
|
|
|
|
<
|
>
|
>
|
|
<
<
|
>
|
|
|
|
|
|
|
|
|
|
>
>
>
|
|
<
<
<
<
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
>
>
>
>
>
|
|
<
|
|
>
|
<
>
|
|
<
|
|
|
|
|
|
<
|
<
|
|
>
>
|
|
|
>
>
|
|
|
<
<
<
<
<
|
<
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
>
>
>
>
|
|
|
<
|
|
<
|
<
<
<
|
<
|
<
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
>
>
>
|
<
<
|
>
>
|
|
|
|
|
|
<
|
<
<
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
>
>
|
<
>
>
>
|
|
|
<
<
<
<
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
>
|
|
>
>
>
>
|
>
|
|
<
|
|
|
<
<
|
<
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
>
|
<
|
|
|
|
|
|
>
>
|
|
>
>
|
|
|
<
<
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
>
>
|
|
>
>
|
>
|
|
|
|
|
|
|
|
<
<
<
|
>
>
>
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
<
<
|
|
<
|
<
|
>
|
|
>
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
<
|
|
>
|
|
<
|
|
|
|
|
<
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<
|
<
<
<
>
|
|
|
>
|
<
|
>
>
|
|







4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420

4421
4422
4423

4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443

4444
4445
4446
4447
4448
4449
4450
4451

4452
4453
4454
4455
4456
4457
4458

4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471

4472
4473
4474
4475

4476

4477
4478
4479
4480
4481
4482
4483
4484

4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501

4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522

4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541

4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586

4587
4588
4589
4590
4591
4592
4593



4594
4595
4596
4597
4598
4599
4600

4601
4602
4603
4604
4605
4606
4607

4608



4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647

4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664




4665

4666
4667
4668



4669

4670
4671
4672


4673
4674
4675
4676
4677


4678

4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695

4696
4697
4698
4699
4700
4701

4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729

4730
4731
4732
4733
4734
4735
4736
4737
4738

4739
4740
4741
4742
4743

4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756


4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771

4772

4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803

4804
4805
4806
4807
4808
4809

4810

4811
4812
4813
4814
4815
4816




4817
4818
4819


4820
4821

4822
4823
4824
4825
4826

4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850

4851
4852

4853
4854
4855
4856

4857

4858

4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870

4871
4872
4873

4874

4875


4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894




4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909

4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920


4921
4922
4923
4924
4925
4926

4927
4928
4929
4930
4931
4932
4933

4934

4935
4936


4937

4938
4939
4940


4941
4942

4943
4944
4945

4946
4947
4948
4949
4950



4951
4952
4953
4954
4955
4956
4957
4958

4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977

4978

4979




4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008


5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028


5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049

5050
5051
5052

5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114

5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132

5133

5134
5135
5136
5137
5138
5139
5140
5141
5142
5143
5144
5145
5146
5147
5148
5149
5150
5151
5152

5153
5154
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
5170
5171
5172
5173
5174
5175
5176
5177
5178
5179
5180
5181
5182
5183
5184
5185
5186
5187

5188
5189
5190
5191

5192
5193
5194
5195
5196
5197
5198
5199
5200
5201

5202
5203
5204
5205
5206
5207
5208
5209
5210
5211

5212
5213
5214
5215
5216
5217
5218
5219

5220
5221
5222
5223
5224
5225




5226

5227





5228

5229


5230
5231
5232
5233
5234
5235
5236
5237
5238
5239
5240
5241
5242
5243
5244
5245

5246
5247
5248
5249
5250
5251
5252
5253
5254
5255
5256
5257
5258
5259
5260
5261
5262
5263
5264
5265
5266
5267
5268
5269
5270
5271
5272
5273
5274
5275
5276
5277
5278
5279
5280
5281
5282


5283

5284
5285
5286
5287
5288

5289
5290
5291
5292
5293
5294
5295
5296
5297
5298
5299
5300
5301
5302

5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
5315
5316
5317
5318
5319
5320
5321
5322

5323
5324
5325
5326
5327

5328
5329
5330
5331
5332

5333
5334

5335
5336
5337
5338
5339
5340
5341

5342
5343
5344
5345

5346
5347
5348
5349
5350
5351
5352
5353


5354

5355
5356
5357
5358
5359

5360
5361
5362
5363

5364
5365
5366
5367
5368
5369
5370
5371
5372

5373
5374
5375
5376

5377
5378
5379
5380
5381
5382
5383

5384
5385
5386
5387
5388

5389
5390
5391
5392
5393
5394

5395
5396
5397

5398
5399
5400

5401
5402
5403
5404
5405
5406
5407
5408
5409
5410
5411
5412
5413
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426

5427
5428
5429
5430
5431
5432
5433
5434
5435
5436

5437
5438
5439
5440

5441
5442
5443
5444
5445
5446
5447
5448
5449
5450
5451
5452
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465

5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481

5482
5483
5484
5485
5486
5487
5488
5489
5490
5491

5492

5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513

5514
5515
5516
5517
5518

5519
5520
5521
5522
5523
5524

5525






5526

5527

5528




5529
5530
5531
5532
5533
5534
5535
5536

5537
5538
5539
5540
5541
5542
5543
5544
5545
5546
5547
5548
5549
5550
5551
5552
5553
5554
5555
5556
5557
5558
5559
5560
5561
5562
5563
5564
5565
5566
5567
5568
5569
5570

5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583
5584
5585
5586
5587
5588
5589
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599

5600
5601
5602

5603
5604
5605

5606
5607
5608
5609
5610
5611
5612
5613
5614
5615
5616
5617

5618
5619
5620
5621
5622
5623
5624
5625

5626
5627
5628
5629
5630
5631
5632
5633
5634
5635
5636
5637
5638
5639
5640
5641
5642
5643
5644
5645
5646
5647
5648


5649
5650
5651
5652
5653
5654
5655
5656
5657

5658
5659
5660
5661

5662
5663
5664
5665
5666
5667
5668
5669
5670

5671
5672
5673
5674

5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688


5689
5690
5691

5692
5693
5694
5695
5696
5697
5698
5699
5700
5701
5702
5703
5704
5705
5706
5707
5708
5709
5710
5711
5712
5713
5714
5715
5716
5717
5718
5719
5720
5721
5722
5723
5724
5725
5726

5727
5728
5729
5730
5731
5732
5733
5734
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746

5747
5748
5749
5750
5751
5752
5753
5754
5755
5756


5757

5758
5759
5760
5761
5762
5763

5764
5765
5766
5767
5768
5769
5770
5771
5772
5773
5774
5775
5776
5777
5778
5779
5780
5781
5782
5783
5784

5785
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799
5800
5801
5802
5803
5804
5805
5806
5807
5808
5809
5810
5811
5812
5813
5814
5815
5816
5817

5818
5819
5820
5821
5822
5823
5824
5825


5826
5827
5828
5829
5830
5831
5832
5833
5834

5835
5836
5837
5838
5839
5840
5841

5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854
5855
5856
5857
5858

5859


5860
5861
5862

5863
5864
5865
5866
5867
5868
5869
5870
5871
5872
5873
5874
5875

5876
5877
5878
5879
5880
5881
5882
5883
5884
5885
5886
5887

5888
5889
5890
5891
5892
5893
5894
5895
5896
5897
5898
5899
5900
5901
5902
5903
5904
5905
5906

5907
5908
5909
5910
5911
5912
5913
5914
5915
5916
5917
5918
5919
5920

5921
5922
5923
5924
5925
5926
5927
5928
5929
5930
5931
5932
5933
5934
5935
5936
5937
5938
5939
5940

5941
5942
5943
5944
5945
5946
5947
5948
5949
5950
5951
5952
5953
5954
5955
5956
5957
5958


5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971

5972
5973
5974
5975
5976
5977
5978

5979
5980
5981
5982
5983
5984
5985

5986
5987
5988
5989
5990
5991
5992
5993
5994
5995

5996
5997
5998
5999
6000
6001
6002
6003
6004

6005

6006
6007
6008

6009
6010
6011
6012
6013
6014
6015
6016
6017
6018
6019
6020

6021

6022
6023
6024
6025
6026
6027
6028
6029
6030
6031
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043

6044
6045
6046
6047
6048
6049


6050
6051
6052
6053
6054
6055
6056
6057
6058
6059
6060
6061
6062
6063
6064
6065
6066
6067
6068
6069
6070

6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088

6089

6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109

6110
6111


6112

6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126

6127
6128
6129
6130
6131
6132
6133
6134
6135
6136
6137
6138
6139
6140
6141

6142
6143
6144
6145
6146
6147
6148
6149

6150
6151
6152

6153

6154

6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170
6171
6172
6173
6174

6175
6176
6177
6178
6179
6180
6181
6182
6183

6184

6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217

6218
6219
6220
6221
6222
6223
6224

6225
6226
6227
6228
6229
6230
6231
6232
6233
6234

6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
6245
6246

6247
6248
6249
6250
6251
6252
6253
6254
6255
6256

6257
6258
6259
6260
6261
6262
6263
6264
6265
6266

6267
6268
6269

6270
6271
6272
6273
6274
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292






6293
6294
6295
6296

6297
6298

6299
6300
6301
6302

6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313

6314
6315
6316

6317
6318
6319
6320

6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333

6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371

6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405


6406




6407
6408
6409



6410

6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441

6442
6443

6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455

6456
6457



6458

6459






6460
6461
6462

6463
6464
6465
6466
6467

6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484



6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515










6516
6517
6518


6519


6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544

6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577



6578
6579
6580
6581
6582
6583
6584
6585


6586
6587
6588
6589
6590
6591
6592
6593

6594
6595
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609


6610
6611
6612
6613
6614
6615


6616
6617
6618
6619
6620
6621
6622
6623

6624
6625
6626
6627
6628
6629
6630
6631

6632
6633
6634
6635
6636
6637

6638

6639
6640
6641
6642
6643
6644
6645

6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661

6662
6663
6664
6665
6666
6667
6668
6669
6670
6671
6672
6673
6674
6675
6676
6677

6678
6679
6680
6681
6682

6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710

6711
6712
6713
6714
6715
6716



6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737

6738
6739

6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
6753
6754
6755
6756
6757
6758
6759
6760
6761

6762
6763
6764
6765
6766
6767
6768
6769
6770
6771

6772
6773
6774
6775
6776
6777
6778
6779
6780
6781
6782
6783
6784
6785
6786
6787
6788
6789
6790
6791
6792
6793

6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
6808
6809
6810
6811


6812
6813
6814
6815
6816
6817
6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831
6832
6833
6834
6835
6836

6837
6838
6839
6840
6841
6842

6843
6844
6845
6846
6847
6848
6849
6850
6851

6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863

6864
6865
6866
6867

6868
6869
6870
6871
6872
6873
6874
6875
6876
6877

6878
6879
6880
6881
6882
6883
6884
6885
6886
6887

6888
6889
6890
6891
6892
6893
6894
6895
6896
6897
6898
6899
6900
6901
6902
6903
6904
6905
6906
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918

6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935
6936


6937
6938
6939
6940
6941
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955
6956
6957
6958
6959
6960
6961
6962
6963
6964

6965
6966

6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
6977
6978
6979
6980

6981
6982
6983
6984
6985



6986
6987
6988

6989
6990
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041

7042


7043

7044
7045
7046
7047
7048
7049

7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062

7063

7064
7065
7066
7067
7068
7069
7070
7071
7072
7073


7074
7075
7076
7077
7078
7079
7080
7081
7082

7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
7095

7096
7097
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
7111
7112
7113
7114
7115
7116
7117
7118
7119
7120
7121
7122
7123
7124
7125
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151
7152

7153
7154
7155
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
7166
7167
7168
7169
7170
7171
7172
7173
7174
7175
7176
7177
7178
7179
7180
7181
7182
7183
7184
7185
7186
7187
7188
7189

7190
7191
7192
7193

7194
7195
7196
7197
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210

7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259

7260

7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
7298
7299
7300
7301
7302
7303
7304
7305
7306

7307
7308
7309
7310
7311
7312
7313
7314
7315
7316
7317

7318
7319
7320
7321
7322
7323
7324
7325
7326
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336

7337
7338
7339
7340
7341
7342
7343
7344
7345
7346
7347
7348
7349
7350
7351
7352
7353
7354
7355
7356
7357
7358
7359
7360
7361
7362
7363
7364
7365
7366
7367

7368
7369
7370
7371
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381

7382
7383
7384
7385
7386
7387
7388
7389
7390
7391
7392

7393
7394
7395
7396
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
7412
7413

7414
7415
7416
7417
7418
7419
7420
7421
7422
7423
7424
7425
7426
7427
7428
7429
7430

7431
7432
7433
7434
7435
7436
7437
7438
7439
7440
7441
7442
7443
7444
7445



7446
7447
7448
7449
7450
7451
7452
7453
7454
7455
7456
7457
7458
7459
7460
7461
7462
7463
7464
7465
7466
7467
7468
7469
7470
7471
7472
7473
7474
7475
7476
7477
7478
7479
7480
7481
7482
7483
7484
7485
7486
7487
7488
7489
7490

7491
7492
7493
7494
7495

7496
7497
7498
7499
7500
7501
7502
7503
7504
7505
7506

7507
7508
7509
7510
7511

7512
7513
7514
7515
7516
7517
7518
7519
7520
7521
7522

7523
7524
7525
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
7541

7542
7543
7544
7545
7546
7547
7548
7549
7550
7551
7552
7553
7554
7555
7556
7557
7558
7559
7560
7561
7562
7563
7564
7565
7566
7567
7568
7569
7570
7571
7572
7573
7574
7575
7576
7577
7578
7579
7580
7581
7582
7583
7584
7585
7586
7587
7588
7589
7590

7591
7592
7593
7594
7595
7596
7597
7598
7599
7600
7601
7602
7603
7604
7605
7606
7607
7608
7609
7610
7611

7612
7613
7614
7615
7616
7617
7618
7619
7620
7621
7622
7623
7624
7625
7626

7627
7628

7629
7630
7631

7632
7633
7634
7635
7636
7637
7638
7639
7640
7641
7642
7643
7644
7645
7646
7647
7648
7649
7650

7651
7652
7653
7654
7655

7656
7657
7658
7659
7660
7661
7662
7663
7664
7665
7666
7667
7668
7669
7670
7671
7672
7673
7674
7675
7676
7677
7678
7679
7680
7681
7682
7683
7684
7685
7686
7687
7688
7689
7690
7691
7692
7693
7694
7695
7696
7697
7698
7699
7700
7701
7702
7703

7704
7705

7706
7707

7708
7709

7710
7711
7712
7713
7714

7715
7716
7717
7718
7719
7720
7721

7722

7723
7724
7725
7726
7727
7728
7729
7730
7731
7732

7733
7734
7735
7736
7737
7738


7739
7740
7741
7742
7743
7744
7745
7746
7747
7748
7749
7750
7751
7752
7753
7754
7755






7756
7757
7758
7759
7760
7761
7762
7763
7764
7765
7766
7767
7768
7769
7770
7771
7772
7773
7774
7775
7776
7777

7778
7779
7780
7781
7782
7783
7784
7785
7786
7787
7788
7789

7790
7791
7792
7793

7794
7795
7796

7797
7798
7799
7800
7801
7802

7803

7804
7805
7806
7807
7808
7809
7810
7811
7812
7813
7814
7815





7816

7817
7818
7819
7820
7821
7822
7823
7824
7825
7826
7827
7828
7829
7830
7831
7832
7833
7834
7835
7836
7837
7838
7839
7840
7841
7842
7843
7844
7845
7846
7847
7848
7849
7850
7851
7852
7853
7854
7855
7856
7857
7858
7859
7860
7861
7862
7863
7864
7865
7866
7867
7868
7869
7870
7871
7872
7873
7874
7875

7876
7877

7878



7879

7880

7881
7882
7883
7884
7885
7886
7887
7888
7889
7890
7891
7892
7893
7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
7909
7910
7911
7912
7913
7914
7915
7916
7917


7918
7919
7920
7921
7922
7923
7924
7925
7926

7927




7928
7929
7930
7931
7932
7933
7934
7935
7936
7937
7938
7939
7940
7941
7942
7943
7944
7945
7946
7947

7948
7949
7950
7951
7952
7953
7954
7955
7956
7957

7958
7959
7960
7961
7962
7963




7964
7965
7966
7967
7968
7969
7970
7971
7972
7973
7974
7975
7976
7977
7978
7979
7980
7981
7982
7983
7984
7985
7986
7987
7988
7989
7990

7991
7992
7993
7994
7995
7996
7997
7998
7999
8000
8001
8002
8003

8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
8015
8016
8017
8018
8019
8020
8021
8022
8023
8024
8025
8026
8027
8028
8029
8030
8031
8032
8033
8034
8035
8036
8037
8038
8039
8040
8041
8042
8043

8044
8045
8046


8047


8048
8049
8050
8051
8052
8053
8054
8055
8056
8057
8058
8059
8060
8061
8062
8063
8064

8065
8066
8067
8068
8069
8070
8071
8072
8073
8074
8075
8076
8077
8078
8079
8080
8081
8082
8083
8084
8085
8086
8087
8088
8089
8090
8091
8092
8093
8094
8095
8096
8097
8098
8099
8100
8101
8102
8103
8104
8105
8106
8107
8108
8109
8110
8111
8112
8113
8114
8115
8116
8117
8118
8119
8120
8121
8122

8123
8124
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137

8138
8139
8140
8141
8142

8143
8144
8145
8146
8147
8148
8149
8150
8151
8152
8153
8154
8155
8156
8157


8158
8159
8160
8161
8162
8163
8164
8165
8166
8167
8168
8169
8170
8171
8172
8173

8174
8175
8176
8177
8178
8179
8180
8181
8182
8183
8184
8185
8186
8187
8188
8189

8190
8191
8192
8193
8194
8195
8196
8197
8198
8199
8200
8201

8202
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
8219
8220
8221
8222
8223
8224
8225
8226
8227
8228



8229
8230
8231
8232
8233
8234
8235
8236
8237
8238
8239
8240
8241
8242
8243

8244
8245
8246
8247
8248
8249
8250
8251


8252
8253

8254

8255
8256
8257
8258
8259
8260
8261
8262
8263

8264
8265
8266
8267
8268
8269
8270
8271
8272
8273
8274
8275
8276

8277
8278
8279
8280
8281

8282
8283
8284
8285
8286

8287
8288
8289
8290
8291
8292
8293
8294
8295
8296
8297
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319
8320

8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341
8342
8343
8344
8345
8346
8347
8348
8349
8350
8351
8352
8353
8354
8355
8356
8357
8358
8359
8360
8361
8362
8363

8364



8365
8366
8367
8368
8369
8370

8371
8372
8373
8374
8375
8376
8377
8378
8379
8380
8381
8382
 */
#ifdef USE_MANUAL
#include "tool_hugehelp.h"
#include <zlib.h>
#include "memdebug.h" /* keep this as LAST include */
static const unsigned char hugehelpgz[] = {
  /* This mumbo-jumbo is the huge help text compressed with gzip.
     Thanks to this operation, the size of this data shrank from 169779
     to 47597 bytes. You can disable the use of compressed help
     texts by NOT passing -c to the mkhelp.pl tool. */
  0x1f, 0x8b, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0xed, 0xbd,
  0x6b, 0x77, 0xdb, 0x46, 0x96, 0x2e, 0xfc, 0x3d, 0xbf, 0x02, 0xcd, 0x5e,
  0x7d, 0x24, 0x4d, 0x93, 0xd4, 0xdd, 0x8e, 0x15, 0x39, 0x13, 0x45, 0x96,
  0x63, 0x4d, 0x64, 0x49, 0x23, 0xca, 0x49, 0xfa, 0x24, 0x59, 0x5e, 0x20,
  0x09, 0x52, 0x68, 0x91, 0x00, 0x1b, 0x00, 0x75, 0xe9, 0x9e, 0x3e, 0xbf,
  0xfd, 0xdd, 0xd7, 0xaa, 0x02, 0xaa, 0x40, 0x29, 0xe9, 0x38, 0x73, 0x2e,
  0x6f, 0xcf, 0x9a, 0xd8, 0x96, 0x80, 0x42, 0x5d, 0x76, 0xed, 0xfb, 0x7e,
  0x76, 0x14, 0x3d, 0xf5, 0xbf, 0x8f, 0xf4, 0xff, 0x1f, 0xe1, 0x7f, 0xf0,
  0xe7, 0x67, 0x51, 0x74, 0x59, 0xe4, 0x7f, 0x4d, 0x46, 0x55, 0xf8, 0xd9,
  0x8f, 0x1f, 0xff, 0x2b, 0xe2, 0xff, 0x83, 0x77, 0x7e, 0x82, 0x3f, 0x3f,
  0x5b, 0x39, 0xf6, 0x66, 0x64, 0x5f, 0xf8, 0xaf, 0x8f, 0x1b, 0xd1, 0x53,
  0x2f, 0xfc, 0x57, 0xb4, 0x4e, 0x2f, 0x7c, 0x94, 0x2f, 0x1c, 0xe2, 0xdf,

  0x3f, 0x7e, 0x5c, 0xfd, 0x91, 0x9f, 0x70, 0x56, 0xf8, 0x9f, 0x4d, 0x7c,
  0xef, 0xa7, 0x8f, 0xf8, 0x57, 0xf8, 0xc9, 0x67, 0x9f, 0x9d, 0x1f, 0xbd,
  0x3f, 0xd1, 0x57, 0x47, 0xcb, 0x62, 0x16, 0xf5, 0xa2, 0xaa, 0x88, 0xb3,

  0x72, 0x92, 0x14, 0x51, 0x1c, 0x7d, 0xb8, 0x3a, 0xfb, 0xec, 0xb3, 0xc1,
  0x5f, 0xce, 0x2f, 0x2e, 0x07, 0xa7, 0x83, 0xda, 0x63, 0x3f, 0xe6, 0x8b,
  0x2a, 0xcd, 0xb3, 0x12, 0xa6, 0x0f, 0x0f, 0x95, 0x3f, 0x7f, 0xf6, 0xd9,
  0x9b, 0x93, 0xc1, 0xf1, 0xd5, 0xe9, 0xe5, 0xf5, 0xe9, 0xc5, 0x79, 0xed,
  0xc9, 0x28, 0x2d, 0x23, 0x18, 0xaa, 0xca, 0xf3, 0x19, 0xfc, 0xc7, 0x8e,
  0x3e, 0x8e, 0xab, 0x38, 0x9a, 0x14, 0xf9, 0x3c, 0xca, 0x0b, 0xfc, 0x45,
  0x1c, 0x95, 0x49, 0x71, 0x97, 0x14, 0xdd, 0x68, 0x59, 0xa6, 0xd9, 0x34,
  0xca, 0xb3, 0x24, 0xca, 0x27, 0x51, 0x75, 0x93, 0xe8, 0x70, 0xe5, 0x72,
  0xb1, 0xc8, 0x8b, 0x2a, 0x19, 0x47, 0x8b, 0x22, 0xaf, 0xf2, 0x51, 0x3e,
  0x2b, 0xa3, 0xf5, 0x37, 0xa7, 0xc7, 0xd7, 0xdd, 0xe8, 0xed, 0xe9, 0xd9,
  0x09, 0xfc, 0xf7, 0xfa, 0x92, 0xfe, 0x33, 0xe8, 0x46, 0xdf, 0x5c, 0x5c,
  0xbe, 0x3b, 0xb9, 0xea, 0x46, 0xef, 0xae, 0xf1, 0x67, 0xf8, 0x5f, 0xf8,
  0x61, 0x74, 0xfa, 0xfe, 0xe8, 0xb2, 0xab, 0xc3, 0xe1, 0x3f, 0xf0, 0x87,
  0x67, 0x6f, 0xe0, 0x87, 0xfc, 0x07, 0xfe, 0xf3, 0xf2, 0xe2, 0x72, 0x57,
  0xfe, 0xc0, 0x7f, 0x5e, 0x5d, 0xbf, 0x87, 0xdf, 0x5e, 0x5d, 0x0f, 0xe0,
  0xbf, 0x83, 0x63, 0xfc, 0x0f, 0x7d, 0x65, 0xf0, 0xfe, 0x6b, 0xfa, 0xcf,
  0xc0, 0x0c, 0x37, 0x78, 0xcf, 0x3f, 0xa7, 0x2f, 0x5d, 0x9f, 0x9c, 0x9d,
  0x9f, 0x5c, 0x47, 0x71, 0x36, 0x8e, 0xae, 0xe1, 0xf9, 0x8d, 0x7e, 0x74,
  0x7d, 0x93, 0x44, 0xa3, 0x7c, 0x3e, 0xc7, 0x1f, 0xc1, 0x8e, 0x8c, 0x93,
  0x32, 0x9d, 0x66, 0xb0, 0x14, 0x58, 0xf9, 0x7d, 0x5e, 0xdc, 0x46, 0xd1,

  0x7d, 0x5a, 0xdd, 0xe4, 0xcb, 0x4a, 0x87, 0x5b, 0xc2, 0x6e, 0x44, 0x69,
  0x56, 0x25, 0x45, 0x3c, 0xc2, 0x9d, 0xee, 0x7f, 0x56, 0xdb, 0xd5, 0x7c,
  0x02, 0x7b, 0x58, 0xc2, 0xa6, 0x0d, 0x97, 0xe5, 0x2c, 0x8f, 0xc7, 0xb8,
  0x55, 0xf0, 0xca, 0x64, 0x09, 0x9b, 0x5c, 0xa4, 0xa3, 0xdb, 0x32, 0x9a,
  0xa5, 0xb7, 0x09, 0x6e, 0xd4, 0xc3, 0xa3, 0x6e, 0x5c, 0x97, 0x07, 0x8d,
  0x97, 0xb0, 0xa7, 0x59, 0x4f, 0x87, 0xab, 0xd2, 0x51, 0x8c, 0x1f, 0xa0,
  0x9d, 0x8b, 0x96, 0x0b, 0x1c, 0x8d, 0x77, 0x2c, 0x5a, 0xe4, 0x25, 0xbc,
  0x34, 0x18, 0x9c, 0xc1, 0xcc, 0xb3, 0x2c, 0xa1, 0x79, 0x94, 0x5d, 0xf8,

  0x47, 0x7e, 0x9b, 0x26, 0xf0, 0x97, 0x49, 0x3a, 0x4b, 0x22, 0x3e, 0x51,
  0x33, 0x1c, 0x1e, 0x6d, 0x54, 0x24, 0xe5, 0x72, 0x9e, 0xc0, 0xee, 0xbd,
  0x4f, 0xaa, 0x78, 0x96, 0x66, 0xb7, 0xf0, 0x57, 0x5c, 0xf8, 0x3c, 0x2f,
  0x92, 0x7e, 0x74, 0x54, 0x46, 0x8f, 0xf9, 0x12, 0x16, 0x3c, 0x9b, 0xc1,
  0x99, 0x27, 0xd1, 0x30, 0x99, 0xe5, 0xf7, 0x5d, 0x3c, 0xe9, 0x28, 0x5b,
  0xce, 0x87, 0x30, 0x40, 0x3e, 0xb1, 0xc3, 0xc5, 0xd5, 0x12, 0x86, 0xe3,
  0xa7, 0xe7, 0x31, 0xac, 0x09, 0xde, 0x2d, 0xa2, 0x9b, 0x04, 0xd6, 0x5c,

  0x2e, 0xd2, 0xec, 0x0f, 0xf5, 0x7d, 0x81, 0xad, 0x5d, 0xe4, 0xf7, 0x49,
  0x01, 0x3b, 0x3b, 0x7c, 0x8c, 0x60, 0x13, 0x86, 0x4c, 0x84, 0x13, 0x20,
  0xb2, 0x28, 0x86, 0x21, 0x0c, 0x01, 0xf6, 0x8a, 0x64, 0x16, 0x23, 0x31,
  0x99, 0x6f, 0xf4, 0xe1, 0x10, 0x13, 0x43, 0x6d, 0xf2, 0xea, 0xfa, 0xee,
  0x06, 0xbd, 0x3c, 0x86, 0x95, 0xa4, 0xb3, 0x12, 0x8e, 0x01, 0x2f, 0x85,
  0x3c, 0x83, 0x87, 0x8a, 0xf4, 0x0f, 0xb4, 0xf9, 0x98, 0x55, 0xf1, 0x03,
  0x7d, 0x5e, 0x68, 0xb3, 0x37, 0x4e, 0x16, 0x49, 0x36, 0x4e, 0xb2, 0xaa,
  0x1f, 0xfd, 0x25, 0x5f, 0xae, 0xc1, 0xb7, 0x27, 0x29, 0xec, 0x41, 0x2c,
  0x43, 0xc1, 0x97, 0x81, 0x08, 0x46, 0x45, 0xba, 0x70, 0x8e, 0x22, 0xcf,
  0xe0, 0xcc, 0xa3, 0xab, 0xb7, 0xc7, 0xd1, 0xee, 0xab, 0xcf, 0x5f, 0xd8,
  0x33, 0x87, 0x01, 0xa2, 0x51, 0x9c, 0xc1, 0x8a, 0x93, 0x51, 0x3a, 0x79,
  0x8c, 0xe6, 0xcb, 0x59, 0x95, 0x2e, 0x60, 0xf7, 0xf1, 0xf2, 0xe1, 0x05,
  0x5a, 0xc4, 0x45, 0x55, 0x22, 0x11, 0xd0, 0x0f, 0x68, 0xed, 0xf7, 0x45,

  0x5a, 0xe1, 0x45, 0xa2, 0xdf, 0xc1, 0x0c, 0x93, 0xaa, 0xd4, 0xe1, 0x90,
  0xd6, 0xe0, 0x3b, 0x43, 0xa0, 0x2d, 0xd8, 0xda, 0xb8, 0x84, 0x8f, 0x1e,
  0x7c, 0x66, 0x39, 0xc8, 0x4d, 0x55, 0x2d, 0x0e, 0x36, 0x37, 0xcb, 0xb4,
  0x4a, 0xfa, 0xff, 0x80, 0x7b, 0xd8, 0xad, 0xee, 0xf3, 0x6e, 0x75, 0x53,

  0x24, 0xc9, 0x3f, 0xfb, 0x40, 0xc3, 0xe6, 0x49, 0xf8, 0xee, 0xa3, 0x4c,

  0x6c, 0x9a, 0x54, 0xf0, 0x85, 0xbf, 0x2d, 0x93, 0x0c, 0x47, 0x84, 0x79,
  0xc4, 0xb3, 0xc5, 0x4d, 0x0c, 0xc7, 0x99, 0x00, 0x35, 0xe2, 0xcd, 0x06,
  0x82, 0xc1, 0x59, 0xf1, 0xdd, 0xfe, 0xf1, 0x67, 0xff, 0xa3, 0x13, 0xfa,
  0x26, 0xfc, 0xb7, 0x9f, 0x3c, 0xc4, 0x73, 0x58, 0x1b, 0x7e, 0x6a, 0x13,
  0x49, 0xec, 0xc7, 0xed, 0xde, 0xf6, 0xd6, 0xd6, 0xcf, 0xfd, 0xea, 0xa1,
  0x7a, 0xde, 0xf3, 0x5b, 0x5b, 0xf6, 0x0d, 0x7c, 0x74, 0x1d, 0xd7, 0x1b,
  0xcd, 0x80, 0x64, 0xf0, 0xe3, 0x7f, 0x4f, 0x8a, 0xbc, 0xdc, 0x78, 0xde,
  0x48, 0x71, 0xef, 0xef, 0xf5, 0xef, 0x9e, 0x27, 0x25, 0xd1, 0x8c, 0x5d,

  0x6b, 0x14, 0x17, 0x40, 0xb7, 0x79, 0x65, 0xd9, 0x53, 0x17, 0x2e, 0x65,
  0x65, 0x76, 0x06, 0xee, 0x1c, 0x3c, 0x0d, 0x8c, 0x2d, 0x9e, 0x21, 0x4f,
  0x2b, 0xa3, 0x2c, 0x79, 0x30, 0xb7, 0x1c, 0x6e, 0x7f, 0x12, 0x8f, 0x6e,
  0xa2, 0x1c, 0x88, 0xbf, 0x08, 0x1c, 0x81, 0x3b, 0xa1, 0xb8, 0x18, 0xdd,
  0xa4, 0x77, 0xb0, 0x1b, 0xaf, 0x5e, 0xbd, 0xe8, 0xc1, 0x7f, 0x5e, 0xfd,
  0xbc, 0x79, 0x97, 0xcf, 0x60, 0x73, 0xf6, 0x7e, 0xde, 0xc4, 0x23, 0xfe,
  0x47, 0xdc, 0x1d, 0x76, 0x47, 0xff, 0xec, 0xdf, 0x54, 0xf3, 0x59, 0x2b,
  0xe1, 0xc4, 0x19, 0xfc, 0xff, 0x3c, 0x5f, 0x66, 0x95, 0x21, 0x16, 0xa0,
  0xb9, 0xca, 0x61, 0x4e, 0x70, 0x5d, 0xe1, 0x8e, 0x22, 0x69, 0x23, 0x0d,
  0xe1, 0xad, 0x83, 0x0b, 0x6a, 0xaf, 0x63, 0x35, 0xba, 0xc1, 0xf5, 0x03,
  0xf5, 0xc4, 0xb2, 0x09, 0x55, 0x1a, 0xe3, 0xcd, 0x04, 0x06, 0x81, 0x0c,
  0x8b, 0xc6, 0xe2, 0xaf, 0xa5, 0xf0, 0x60, 0x5e, 0x8c, 0x93, 0xa2, 0xdf,
  0x9c, 0x86, 0xb9, 0xb2, 0xce, 0x37, 0x23, 0x95, 0x28, 0xf8, 0x03, 0x9a,
  0xd8, 0x3c, 0x7d, 0x80, 0x11, 0x88, 0x61, 0x66, 0x34, 0x71, 0x1e, 0x2d,
  0xc2, 0x19, 0xd3, 0x67, 0xf4, 0x7d, 0x7b, 0x65, 0x61, 0xea, 0xb5, 0xa5,
  0xd3, 0x47, 0xed, 0xe2, 0x23, 0x38, 0xbc, 0x05, 0xbc, 0xb5, 0x44, 0xbe,
  0x4a, 0xd7, 0x1a, 0x87, 0x01, 0x86, 0x30, 0x85, 0x73, 0x81, 0xb3, 0x40,

  0x2a, 0xc6, 0xa3, 0x7a, 0x8c, 0xce, 0x81, 0x60, 0x98, 0x19, 0x39, 0xc4,
  0x3e, 0x4b, 0xaa, 0xea, 0xc9, 0x63, 0xb2, 0x14, 0x7b, 0xb0, 0xed, 0x11,
  0x6d, 0xdb, 0xf3, 0x40, 0x67, 0x07, 0x3b, 0xf5, 0x87, 0xbf, 0x07, 0x26,
  0x6d, 0xaf, 0x0b, 0x7c, 0xfd, 0x1f, 0xff, 0x74, 0xa8, 0xee, 0x1e, 0x7f,
  0x9b, 0x66, 0x77, 0xf9, 0x2d, 0x6c, 0x11, 0x49, 0xd1, 0xb8, 0xbe, 0x9b,
  0xc8, 0x87, 0xe6, 0x8b, 0xca, 0x88, 0x27, 0x24, 0x47, 0xf8, 0xd1, 0x30,
  0x1e, 0xce, 0x1e, 0xa3, 0x9b, 0xf8, 0x2e, 0xc1, 0xf5, 0x2e, 0x80, 0x4e,
  0x71, 0x07, 0x40, 0x6c, 0xcc, 0x88, 0x8f, 0x09, 0x63, 0x18, 0xe7, 0xcb,
  0x21, 0x30, 0x97, 0xbf, 0x2d, 0xf3, 0x8a, 0x37, 0x26, 0xbe, 0xcb, 0xd3,
  0x71, 0x4d, 0x16, 0xdf, 0x24, 0xc8, 0xd0, 0xf0, 0xc3, 0x24, 0xa4, 0x80,
  0xa1, 0xe2, 0x4c, 0xe9, 0xa2, 0xa5, 0x15, 0x8a, 0x3b, 0x60, 0x85, 0xf1,
  0xac, 0xcc, 0xa3, 0x68, 0x9a, 0xe3, 0x2d, 0x21, 0x06, 0x4c, 0x64, 0x0e,
  0x87, 0x72, 0x13, 0xa3, 0x54, 0x03, 0x01, 0x66, 0xee, 0x41, 0x91, 0x10,
  0x2f, 0xa6, 0x93, 0x8a, 0x67, 0x5d, 0x96, 0x5e, 0xf8, 0x8e, 0x6c, 0x55,
  0xb4, 0xf6, 0x3f, 0xd6, 0xba, 0xd1, 0xda, 0xbf, 0xaf, 0x11, 0x3d, 0xac,
  0xfd, 0xdb, 0x9a, 0x3d, 0x67, 0x50, 0xc6, 0xee, 0xd2, 0x71, 0xc2, 0x24,
  0x71, 0x7a, 0x79, 0xf7, 0x22, 0xfa, 0x3b, 0xea, 0x0e, 0xc0, 0x6b, 0x93,
  0x07, 0x25, 0x48, 0x5d, 0x1b, 0xbc, 0x1d, 0x01, 0xd3, 0x8d, 0x17, 0xa8,
  0x44, 0x24, 0xc5, 0x08, 0xa8, 0x37, 0x9e, 0x02, 0xbd, 0x82, 0x2c, 0xd6,
  0xe1, 0x70, 0x7c, 0x7c, 0x85, 0x97, 0x05, 0x0c, 0x32, 0xca, 0xe2, 0x39,
  0xdc, 0x88, 0x33, 0x9c, 0x51, 0x9a, 0xf9, 0x87, 0xf9, 0xe3, 0x24, 0xf9,

  0x7c, 0xeb, 0xe0, 0x60, 0xf7, 0x4f, 0x3b, 0xfb, 0x49, 0x75, 0xb3, 0xf5,
  0xf3, 0xa6, 0x79, 0xe4, 0x74, 0x42, 0xdb, 0xae, 0xe4, 0xa7, 0x93, 0x00,
  0x29, 0x6f, 0xa4, 0x04, 0xbc, 0x0f, 0x7f, 0x4f, 0x26, 0xe9, 0x43, 0x57,
  0xf5, 0x25, 0xbe, 0x73, 0x31, 0x90, 0x1a, 0x9c, 0x1f, 0xb2, 0x08, 0x1d,
  0x6e, 0xba, 0x4c, 0x4a, 0xd8, 0xc9, 0xfb, 0x9b, 0xb8, 0x8a, 0xcc, 0x00,
  0x7c, 0xb2, 0xf3, 0x74, 0x7a, 0x53, 0x45, 0xf7, 0x31, 0x0a, 0x9b, 0xd3,
  0x8a, 0x87, 0x40, 0x29, 0x0f, 0x22, 0x66, 0x12, 0x83, 0xac, 0xc0, 0x33,
  0x24, 0x91, 0x3e, 0xb4, 0x1a, 0x46, 0x05, 0x64, 0xce, 0x07, 0x62, 0xd5,
  0xa9, 0x61, 0x5c, 0xe2, 0xa5, 0xcd, 0x80, 0x39, 0x54, 0xa0, 0x23, 0x2c,
  0xf1, 0x5f, 0x37, 0xa0, 0x05, 0xd0, 0x1e, 0xc8, 0x44, 0x49, 0x50, 0xbe,
  0xc5, 0xe3, 0xc4, 0xb3, 0x31, 0xc2, 0x0b, 0x0e, 0xa9, 0x2b, 0xc7, 0x6c,
  0xde, 0x28, 0xe1, 0xc2, 0x01, 0x67, 0x32, 0x94, 0xd1, 0x41, 0x26, 0xdb,
  0xe1, 0x75, 0xd2, 0x1c, 0xe3, 0x12, 0x15, 0x05, 0x56, 0x07, 0x60, 0xf2,
  0xce, 0x62, 0x61, 0xd3, 0xe2, 0x5b, 0x54, 0x49, 0x1a, 0x8a, 0x0f, 0xbd,
  0x36, 0xce, 0x81, 0xc8, 0x60, 0xb6, 0xc0, 0x8c, 0x71, 0x65, 0xc8, 0x62,
  0x69, 0x57, 0x88, 0xc8, 0x61, 0x4c, 0xfc, 0x61, 0x5a, 0xa1, 0x8c, 0x21,
  0x1d, 0x16, 0xe6, 0x0b, 0x9b, 0x42, 0x8a, 0x28, 0x30, 0x6a, 0x67, 0xfd,
  0x24, 0x1e, 0xe1, 0xd9, 0xe8, 0x0e, 0xb4, 0x14, 0x50, 0x48, 0x13, 0xf3,
  0x16, 0xc9, 0xf3, 0x11, 0xea, 0x46, 0x33, 0xb8, 0x2f, 0xa3, 0xbc, 0x28,

  0x50, 0xdf, 0xc7, 0x13, 0x1c, 0x32, 0x13, 0x9d, 0x27, 0xa0, 0x46, 0xb8,
  0xdb, 0x99, 0xa2, 0x40, 0x03, 0xfe, 0x02, 0x7a, 0x09, 0x71, 0x10, 0xd0,
  0x1f, 0x88, 0xe7, 0xd3, 0xc2, 0x69, 0x76, 0x38, 0xf6, 0x68, 0x94, 0x2c,
  0xaa, 0x32, 0xb4, 0x26, 0x3d, 0x70, 0x98, 0x4e, 0x91, 0xe0, 0xce, 0xbb,
  0x4a, 0x17, 0xed, 0xab, 0x11, 0xfa, 0xa4, 0x77, 0xa9, 0x1e, 0x03, 0x7a,
  0x58, 0x69, 0x76, 0xad, 0x22, 0xda, 0x00, 0x36, 0x46, 0x7b, 0x3e, 0xc7,
  0x89, 0xe2, 0xc3, 0x25, 0xdf, 0x54, 0x62, 0xcd, 0x78, 0x90, 0xac, 0x69,
  0xf3, 0x77, 0x51, 0x74, 0xc1, 0x7e, 0x9a, 0xc1, 0xe1, 0xab, 0xe6, 0x4c,
  0xf1, 0xf3, 0xa8, 0xe2, 0x83, 0x24, 0x1f, 0x97, 0x37, 0xa0, 0x7c, 0x95,
  0x72, 0xb3, 0xd3, 0x39, 0xd0, 0xcc, 0x1d, 0x9e, 0xef, 0x22, 0x49, 0xc6,
  0xfd, 0xe8, 0x62, 0x82, 0x5c, 0xb5, 0x80, 0x49, 0x57, 0xf4, 0x6b, 0x94,
  0x2a, 0xb0, 0x6f, 0x63, 0x52, 0xe2, 0xcd, 0xd5, 0xe2, 0xa9, 0x38, 0xd2,
  0x81, 0x38, 0x79, 0x0c, 0x3f, 0x81, 0xd9, 0xce, 0xea, 0x22, 0x88, 0xee,
  0x21, 0x70, 0x6f, 0x9c, 0xde, 0x30, 0x89, 0x88, 0x12, 0x87, 0x49, 0x75,
  0x9f, 0x24, 0x66, 0xb8, 0x32, 0x01, 0xb1, 0x87, 0x87, 0xc6, 0x9a, 0x1f,
  0x31, 0x43, 0xdc, 0xda, 0xcb, 0xab, 0x8b, 0x6f, 0xae, 0x4e, 0x06, 0x83,
  0xe8, 0xfd, 0xc9, 0xf5, 0xc9, 0x55, 0x6d, 0xa7, 0xb3, 0xbc, 0x98, 0xd3,
  0x89, 0x8e, 0xd3, 0x72, 0x31, 0x8b, 0x1f, 0xf1, 0xa8, 0x61, 0x25, 0xd3,
  0x02, 0x6f, 0xd6, 0x3c, 0x41, 0xa9, 0x30, 0x5e, 0x12, 0x27, 0x03, 0x71,
  0x04, 0xc7, 0x27, 0x1a, 0x2f, 0x32, 0x13, 0x52, 0x93, 0xb3, 0xa9, 0xdd,
  0x69, 0xe0, 0x38, 0x22, 0x49, 0x51, 0x94, 0x9a, 0xf3, 0x40, 0xd5, 0x93,
  0x8c, 0x9b, 0xae, 0xfd, 0x19, 0x6f, 0x13, 0x8b, 0x36, 0xa0, 0xd9, 0x74,
  0x4e, 0xcc, 0x0e, 0xfe, 0xb4, 0xda, 0x66, 0x32, 0x01, 0x55, 0x1b, 0xa4,
  0x2b, 0x5b, 0x0a, 0xcd, 0x39, 0xe9, 0x6c, 0x8d, 0x7e, 0x0c, 0x64, 0x88,
  0xac, 0x19, 0x07, 0xe4, 0xa9, 0xf0, 0x17, 0x0c, 0x13, 0x03, 0x9d, 0x04,
  0x79, 0x9f, 0x3c, 0xb6, 0xc0, 0x29, 0x24, 0x70, 0xb2, 0x63, 0x1e, 0xbe,
  0x5c, 0x4e, 0xe8, 0x22, 0x47, 0xeb, 0xa0, 0x99, 0xbf, 0x07, 0x6b, 0x09,
  0x2c, 0x96, 0x6e, 0x74, 0xb9, 0x41, 0xef, 0x6d, 0x6f, 0xed, 0xec, 0x31,
  0x23, 0xe8, 0xeb, 0x70, 0x6f, 0x1d, 0x46, 0xbc, 0x7d, 0x8b, 0xc7, 0xcb,
  0x0f, 0xe1, 0xe0, 0xfd, 0x68, 0xfb, 0x3d, 0xff, 0x64, 0xef, 0xf3, 0xfd,
  0x97, 0x2f, 0xe4, 0x87, 0x75, 0x02, 0x37, 0xf3, 0x27, 0xea, 0x20, 0xcb,
  0x0f, 0x4d, 0x41, 0x98, 0x09, 0xac, 0x6e, 0x9e, 0x66, 0x70, 0x4d, 0xe0,
  0x5a, 0x09, 0xaf, 0x42, 0x7a, 0x86, 0xc9, 0x4f, 0x98, 0xb3, 0xc9, 0xb9,
  0xd6, 0x4d, 0x4a, 0x78, 0x19, 0x48, 0x16, 0x78, 0xb9, 0x39, 0x24, 0x56,
  0x13, 0x2a, 0x9c, 0x48, 0x3c, 0x44, 0x06, 0x8b, 0x76, 0x15, 0x28, 0xc0,
  0x49, 0xf0, 0x6b, 0x46, 0x2a, 0xc2, 0x1b, 0x30, 0x37, 0x90, 0x89, 0x28,
  0xe6, 0xfc, 0x7d, 0x07, 0x56, 0x40, 0x1c, 0xf2, 0x3e, 0x2d, 0x89, 0x35,
  0xdc, 0xe7, 0xcb, 0x19, 0x58, 0x31, 0xf8, 0xc0, 0x72, 0x41, 0x2f, 0xc0,
  0xa7, 0x16, 0x96, 0x07, 0x80, 0xc6, 0x82, 0xb4, 0xd3, 0x1c, 0x05, 0xa6,
  0x06, 0xff, 0x5c, 0x00, 0x29, 0xf1, 0x74, 0xfa, 0x4d, 0x09, 0x41, 0xbc,
  0xcf, 0xa3, 0x44, 0xbc, 0xf3, 0xc4, 0xb4, 0x2f, 0x2f, 0x06, 0xd7, 0xa8,
  0x01, 0x5c, 0x7e, 0xb8, 0x86, 0x81, 0x40, 0x05, 0x28, 0x2b, 0x20, 0x4a,
  0x7c, 0x31, 0x4b, 0xc8, 0x84, 0xd4, 0xe1, 0x80, 0xf6, 0x52, 0x62, 0x54,
  0xa4, 0xd6, 0xe8, 0x27, 0x79, 0x8e, 0x6c, 0x63, 0xe3, 0x15, 0x54, 0x0b,
  0x9b, 0x65, 0xb8, 0x79, 0x27, 0x5a, 0xff, 0x72, 0x03, 0x68, 0xb6, 0x97,

  0x9b, 0xdd, 0xe9, 0xf5, 0xe4, 0x55, 0xf8, 0x76, 0x99, 0xce, 0xd3, 0x59,
  0x5c, 0x38, 0x53, 0x67, 0x8e, 0x8a, 0xf7, 0xd3, 0xf0, 0x95, 0x11, 0x50,
  0x0d, 0x4d, 0xdb, 0x9a, 0x92, 0xb8, 0x87, 0xc4, 0x95, 0xec, 0x51, 0x8d,
  0x51, 0x21, 0x20, 0x8d, 0x79, 0x91, 0x9a, 0xad, 0xc3, 0x33, 0x43, 0x76,
  0x55, 0xdb, 0xa8, 0xe6, 0xb9, 0x79, 0x1b, 0x87, 0x12, 0x89, 0x3c, 0x15,
  0x66, 0xeb, 0xa2, 0xce, 0x30, 0x2e, 0x3a, 0x91, 0xe1, 0xc5, 0x7c, 0x37,
  0xf1, 0x86, 0x14, 0xc9, 0x74, 0x09, 0x2b, 0x88, 0x78, 0x77, 0x71, 0xa5,



  0x7f, 0x74, 0x56, 0xaa, 0x03, 0xf4, 0x86, 0xf8, 0x48, 0x5a, 0xb2, 0x99,
  0x39, 0x01, 0xbb, 0x05, 0x2f, 0x8d, 0xea, 0xaf, 0xa4, 0xd1, 0x08, 0xc5,
  0x04, 0x08, 0xc6, 0xd1, 0x6b, 0xe1, 0xaa, 0x54, 0x09, 0x30, 0x1a, 0x62,
  0xff, 0xf8, 0x64, 0x0f, 0x8e, 0xac, 0xd7, 0x2b, 0x61, 0xff, 0x51, 0xf7,
  0x5e, 0x88, 0x4d, 0x7f, 0x41, 0x0e, 0x13, 0xe3, 0x5b, 0xb9, 0x10, 0x1d,
  0x98, 0xc4, 0x26, 0xbf, 0x4b, 0x2c, 0x14, 0x14, 0xd5, 0x7b, 0xf8, 0x70,
  0x0c, 0x47, 0x06, 0x17, 0xee, 0x3d, 0x6e, 0x14, 0xfb, 0x46, 0x22, 0xa3,

  0x36, 0x13, 0x65, 0xa4, 0x78, 0xef, 0x63, 0xab, 0xcb, 0x8c, 0xc7, 0x29,
  0xfe, 0x16, 0xee, 0x17, 0x48, 0xb8, 0x65, 0x42, 0xb6, 0x87, 0x6c, 0xea,
  0xdc, 0x6e, 0x26, 0x99, 0xb1, 0xe5, 0x4d, 0x8e, 0x66, 0x62, 0x87, 0x79,
  0x71, 0x0f, 0xbf, 0xd5, 0x21, 0x79, 0x3e, 0x8f, 0xf4, 0x5b, 0xf2, 0x29,
  0x58, 0xc7, 0xd8, 0xd5, 0xcd, 0xba, 0x20, 0x68, 0x1e, 0x1d, 0x23, 0x81,
  0x78, 0x35, 0xcf, 0xbd, 0x30, 0x0a, 0x0f, 0x88, 0xd4, 0x05, 0x2a, 0x53,
  0xc2, 0xc3, 0x49, 0x18, 0xd2, 0x95, 0x2d, 0x79, 0x6a, 0x5d, 0xd8, 0x5b,

  0x7c, 0x72, 0x7a, 0xa3, 0x8f, 0x3a, 0x82, 0x35, 0x86, 0xc5, 0xa1, 0x70,



  0x40, 0x7b, 0x7a, 0xac, 0x7c, 0x3f, 0x2f, 0x98, 0x99, 0xcd, 0x72, 0xa0,
  0xe5, 0x0e, 0xab, 0xac, 0x32, 0x6d, 0x9c, 0x35, 0xce, 0x12, 0x77, 0x9c,
  0xfd, 0x4c, 0xb9, 0x39, 0x1b, 0x33, 0x69, 0xd9, 0xaf, 0xf2, 0xc9, 0xa9,
  0xd9, 0x8d, 0x1a, 0xd0, 0x1e, 0x81, 0xe8, 0x2c, 0x91, 0x8e, 0x75, 0xe7,
  0x89, 0xbc, 0x41, 0xd4, 0xad, 0x55, 0x7c, 0x1f, 0xc9, 0xc6, 0x6a, 0xec,
  0x7c, 0x49, 0xe4, 0x23, 0x82, 0xcc, 0xac, 0x0c, 0x56, 0x34, 0x4e, 0x63,
  0xa2, 0x13, 0x3e, 0x1a, 0x52, 0x46, 0xac, 0x45, 0x18, 0xd0, 0x83, 0x1f,
  0x9b, 0x06, 0xdd, 0x6c, 0xe6, 0x8a, 0x24, 0x9d, 0x53, 0xef, 0x02, 0xd6,
  0x7e, 0x46, 0xeb, 0xe8, 0xdd, 0x45, 0x78, 0xfd, 0xc0, 0x6c, 0xc0, 0xbb,
  0xd8, 0xbb, 0x38, 0xbb, 0x73, 0xae, 0x11, 0x5a, 0xee, 0x19, 0xea, 0x29,
  0x5d, 0xf2, 0x8e, 0x0c, 0xf3, 0x1c, 0xcc, 0x64, 0xbb, 0x34, 0x94, 0x07,
  0x49, 0x86, 0xd4, 0x2e, 0x27, 0x0a, 0x2c, 0x61, 0x61, 0xf8, 0xed, 0x23,
  0x98, 0x4b, 0xf1, 0x34, 0x4e, 0x0d, 0xbd, 0xc9, 0xcd, 0x18, 0x47, 0xfa,
  0x70, 0x96, 0xcb, 0xf3, 0x78, 0x54, 0xa8, 0x02, 0x09, 0xdf, 0x5a, 0x96,
  0x7c, 0x7d, 0x60, 0x55, 0xc0, 0x79, 0x88, 0x77, 0xc8, 0xb8, 0xa8, 0x36,
  0xea, 0x70, 0x43, 0x52, 0x94, 0x51, 0xe7, 0x24, 0xe6, 0x4b, 0x1a, 0x24,
  0x8c, 0xd8, 0xe9, 0x47, 0xef, 0xf2, 0xfb, 0x84, 0x7c, 0x85, 0xa4, 0xdf,
  0xa7, 0xe8, 0xed, 0x02, 0x55, 0xf0, 0x3e, 0x89, 0xe6, 0xa0, 0x7a, 0xc2,
  0x6e, 0x92, 0xf6, 0x41, 0x3f, 0x73, 0xcc, 0x43, 0xa0, 0xf0, 0x7b, 0xde,
  0x25, 0xb3, 0x0a, 0x73, 0x94, 0x13, 0xbe, 0x12, 0xd1, 0x3a, 0xa9, 0x37,
  0x23, 0xdc, 0xad, 0x45, 0x65, 0x57, 0x61, 0x36, 0xe4, 0x3e, 0x2e, 0x9d,
  0xcb, 0x95, 0x90, 0x69, 0xfa, 0xb2, 0xbf, 0xfd, 0xaa, 0xbf, 0xd5, 0x07,
  0x43, 0x24, 0xb9, 0x4b, 0xf3, 0x65, 0x09, 0x9f, 0xc6, 0x69, 0xd8, 0x77,
  0x12, 0xbc, 0x95, 0x55, 0x3e, 0x9d, 0xce, 0x58, 0xe7, 0xd9, 0xcc, 0x27,
  0x13, 0xd6, 0x7d, 0x40, 0xd3, 0x33, 0xfa, 0x33, 0x5b, 0x40, 0xb8, 0x33,
  0x72, 0xdd, 0x98, 0xa5, 0xfa, 0x26, 0x72, 0xdf, 0x3a, 0x2f, 0x7a, 0xbd,
  0x78, 0x58, 0x56, 0x68, 0x4c, 0xf5, 0x96, 0x59, 0xfa, 0xd0, 0x2b, 0xf3,
  0xd1, 0x2d, 0x1c, 0xca, 0xe1, 0x22, 0xae, 0x6e, 0xbe, 0x6c, 0xb8, 0x84,
  0xd7, 0x51, 0x96, 0x6c, 0x44, 0xd1, 0x31, 0xab, 0x95, 0xb8, 0x13, 0x05,
  0xdf, 0x37, 0x38, 0x4d, 0x19, 0x25, 0xfa, 0x00, 0xa3, 0x00, 0x2d, 0xcf,
  0xe1, 0x50, 0x23, 0x1e, 0xac, 0xab, 0xac, 0xb4, 0x31, 0x1c, 0x39, 0x1c,
  0x51, 0x8c, 0x90, 0xdf, 0x0e, 0xae, 0x4e, 0x5e, 0xdc, 0x82, 0xa2, 0x7d,
  0x0e, 0x26, 0xe3, 0x01, 0xfe, 0x1b, 0x58, 0x58, 0x45, 0x5b, 0x2e, 0x92,
  0x15, 0x66, 0xc4, 0xcc, 0x18, 0x2d, 0xf2, 0x78, 0xd8, 0x6b, 0x0c, 0x27,
  0xdf, 0x97, 0x8f, 0x46, 0x6a, 0x6b, 0x28, 0x29, 0x45, 0x6b, 0x5f, 0x81,
  0xfd, 0x77, 0xc3, 0xc7, 0x4e, 0x03, 0xf2, 0x1a, 0x81, 0x42, 0xa7, 0x60,
  0x41, 0x64, 0x55, 0x73, 0xb8, 0x1b, 0x12, 0xd5, 0x28, 0x65, 0xd8, 0xd8,
  0x25, 0x22, 0x11, 0x0f, 0x90, 0xb1, 0x3f, 0xfb, 0x9f, 0x35, 0x5e, 0x3b,
  0xb2, 0x67, 0xba, 0xbf, 0x0b, 0x67, 0xea, 0x6e, 0xf4, 0xac, 0xea, 0x95,

  0x77, 0xa3, 0xe8, 0x90, 0xb4, 0x6f, 0x24, 0xd3, 0xe0, 0x06, 0x0f, 0x36,
  0xa2, 0xef, 0x8f, 0xae, 0xce, 0x4f, 0xcf, 0xbf, 0x39, 0xe0, 0x8f, 0x0a,
  0xa5, 0xc1, 0xdf, 0x92, 0x87, 0x05, 0xfa, 0xc1, 0x70, 0xb6, 0x20, 0xca,
  0xa2, 0xe8, 0x4d, 0x4e, 0xf6, 0x08, 0x31, 0x4c, 0x14, 0x58, 0x8d, 0xe1,
  0x40, 0xb4, 0x8c, 0x97, 0x0d, 0xdf, 0xaf, 0x61, 0xd8, 0x76, 0x60, 0xbe,
  0x9e, 0xbc, 0xc9, 0x3a, 0x47, 0xe0, 0x8f, 0xec, 0x3e, 0x26, 0x7d, 0xa9,
  0x8f, 0xd2, 0x92, 0xcc, 0x7c, 0x9d, 0x79, 0xf3, 0x4b, 0x39, 0x18, 0xbb,
  0x6c, 0xe7, 0xc3, 0x78, 0x0f, 0x70, 0x6d, 0x70, 0x97, 0x74, 0xb0, 0x11,
  0xb0, 0xa3, 0x44, 0x14, 0x07, 0x62, 0x75, 0x64, 0x36, 0x08, 0x2b, 0xeb,
  0x47, 0x47, 0x93, 0xe6, 0x51, 0xa2, 0xee, 0x82, 0x5a, 0xbd, 0x4a, 0xc1,
  0xb1, 0x55, 0x84, 0xd9, 0xcb, 0xcb, 0x23, 0xea, 0x30, 0x25, 0x9c, 0xcf,
  0x58, 0x25, 0x3d, 0x7e, 0xa6, 0x31, 0x1c, 0x99, 0x9e, 0xc4, 0x66, 0x50,
  0x29, 0x4c, 0xf1, 0x40, 0xd1, 0xf4, 0x03, 0x46, 0x3d, 0xcf, 0xc7, 0x64,
  0x47, 0x78, 0xfb, 0x33, 0x30, 0x0e, 0x9f, 0x4e, 0xc7, 0xae, 0x3a, 0x5a,
  0x47, 0xd7, 0x1f, 0x50, 0x41, 0x36, 0xad, 0x6e, 0x36, 0xac, 0x5b, 0x03,
  0xd5, 0x14, 0x58, 0xf0, 0x26, 0x4c, 0x84, 0xd6, 0x9d, 0x35, 0x49, 0x9d,
  0xdc, 0xce, 0xa4, 0x79, 0xfe, 0x75, 0x59, 0x56, 0x64, 0x0d, 0x89, 0xf8,




  0xe7, 0x95, 0xc0, 0xcc, 0xe6, 0xc9, 0x3c, 0x2f, 0x1e, 0xbd, 0x89, 0x9c,

  0x92, 0xf2, 0x81, 0x86, 0xa7, 0x9c, 0x16, 0xd2, 0x01, 0xc9, 0x47, 0x75,
  0x09, 0xa2, 0x11, 0x80, 0x3e, 0x75, 0x63, 0x07, 0x92, 0xd2, 0x04, 0x0c,
  0x08, 0xec, 0x6f, 0xeb, 0xb0, 0x55, 0x03, 0x8a, 0x1c, 0x3d, 0x6c, 0xdb,



  0x8b, 0x35, 0x35, 0x14, 0x17, 0x0e, 0xfe, 0xff, 0x2c, 0x46, 0xae, 0x93,

  0x25, 0xb5, 0x13, 0x22, 0xe9, 0xc1, 0x4b, 0x5b, 0x45, 0xee, 0x2f, 0xf6,
  0xfa, 0xdb, 0x35, 0x72, 0xcf, 0x1e, 0x31, 0x50, 0x10, 0xe6, 0x21, 0xd7,
  0xa0, 0x38, 0x96, 0x3c, 0x67, 0xd8, 0xc5, 0x49, 0x3a, 0x5d, 0x16, 0x09,


  0x6b, 0x70, 0x14, 0x5b, 0xd0, 0x90, 0x02, 0x2a, 0x45, 0x37, 0x39, 0x79,
  0xe2, 0x41, 0x98, 0x26, 0xb3, 0x49, 0xb7, 0x31, 0x1c, 0x99, 0x2f, 0x44,
  0xfd, 0x38, 0x7d, 0x62, 0x9a, 0x60, 0xa6, 0xd0, 0x60, 0x59, 0x22, 0x4a,
  0xec, 0x1c, 0x18, 0x4a, 0x84, 0xae, 0xe8, 0x68, 0x34, 0x8b, 0xd3, 0x39,
  0x91, 0xa9, 0xb8, 0x5a, 0xfb, 0xa1, 0x6b, 0x81, 0x06, 0x06, 0xbe, 0x3d,


  0x44, 0xd3, 0xb7, 0x28, 0x51, 0x32, 0xd3, 0xa9, 0xaa, 0xe6, 0xcc, 0x86,

  0xe5, 0x4d, 0x32, 0xba, 0x55, 0xe6, 0xa5, 0x2a, 0x67, 0x93, 0x8e, 0x31,
  0xc6, 0x40, 0xf6, 0x35, 0x3c, 0xb5, 0x2c, 0xf1, 0x9a, 0x94, 0x65, 0x8a,
  0xee, 0x33, 0x34, 0x07, 0x97, 0x23, 0xb2, 0x12, 0xe9, 0xc2, 0x00, 0x75,
  0x2b, 0x07, 0x8c, 0x80, 0xa5, 0x66, 0xe3, 0x5e, 0x55, 0xa4, 0x8b, 0xb6,
  0xd9, 0xf1, 0xa9, 0xd4, 0x15, 0xd4, 0x52, 0x2c, 0x76, 0x32, 0x86, 0xd9,
  0x3c, 0x1e, 0x45, 0x8d, 0xdd, 0x6c, 0x12, 0x25, 0xed, 0x6d, 0x17, 0xfd,
  0x41, 0x29, 0xe8, 0x0b, 0x6c, 0x2c, 0x91, 0xbb, 0x13, 0x4c, 0x23, 0x11,
  0x5c, 0x60, 0xc5, 0xa5, 0x23, 0x52, 0x82, 0xd2, 0x69, 0x82, 0xb1, 0x1c,
  0x90, 0x65, 0xd5, 0x0c, 0x54, 0x23, 0x9f, 0xc6, 0xe1, 0x37, 0xc9, 0x34,
  0xaf, 0x50, 0x1b, 0xf1, 0xc8, 0xe4, 0x03, 0xf1, 0x79, 0x43, 0x13, 0xaa,
  0xf6, 0xbb, 0x3a, 0x59, 0xca, 0xfa, 0x38, 0x7c, 0x9a, 0xd5, 0x7e, 0xf1,
  0x38, 0x94, 0x15, 0xdc, 0xac, 0xe6, 0xa9, 0xc3, 0x68, 0xa3, 0x84, 0x6c,
  0x2f, 0x52, 0x1c, 0x55, 0x6f, 0x55, 0x85, 0x1f, 0x59, 0x02, 0xea, 0xc8,
  0xd5, 0x7d, 0x3a, 0x4a, 0xd4, 0x1d, 0x27, 0x3e, 0xea, 0x59, 0xea, 0xb3,
  0xfa, 0x39, 0xde, 0x49, 0x78, 0x89, 0x75, 0x72, 0xf4, 0x9e, 0xdc, 0xa7,
  0xa8, 0xb3, 0x0b, 0xd3, 0x23, 0x95, 0x4c, 0xc4, 0x41, 0x5c, 0xa4, 0xe4,
  0x2a, 0x82, 0xe1, 0x64, 0x9e, 0x8e, 0x45, 0xef, 0xde, 0x31, 0x9e, 0x37,

  0xbd, 0x2f, 0x66, 0x8c, 0x35, 0x5f, 0xe8, 0x72, 0x4d, 0xe2, 0x74, 0x16,
  0xd8, 0x27, 0x62, 0x64, 0xd3, 0x84, 0xbc, 0x6a, 0x7c, 0x06, 0x4b, 0xdc,
  0x74, 0x8c, 0xbb, 0xf9, 0x4c, 0x2a, 0x49, 0xd8, 0x9e, 0x20, 0xe3, 0xe3,
  0xe1, 0xd1, 0x6c, 0x2f, 0x29, 0x6d, 0x7c, 0x76, 0xf2, 0x77, 0x3e, 0x3e,
  0xe7, 0x7a, 0xc6, 0x38, 0x6a, 0xbc, 0xc0, 0x00, 0x53, 0xf3, 0x86, 0xa2,
  0xe9, 0x85, 0x31, 0xca, 0x0d, 0xf5, 0x20, 0x27, 0xe2, 0x3f, 0x37, 0xb1,

  0x3d, 0x62, 0x48, 0xc8, 0xd3, 0xe4, 0x0a, 0xf3, 0x38, 0xc2, 0x81, 0x9b,
  0xbc, 0x1c, 0xe4, 0x2b, 0x88, 0x63, 0xe2, 0xa1, 0x35, 0x8a, 0xcd, 0x81,
  0x7d, 0x99, 0x08, 0x13, 0x7a, 0x7c, 0x85, 0xd7, 0x91, 0xa1, 0x45, 0x77,
  0x36, 0xc4, 0xcb, 0xd1, 0xf4, 0x43, 0x3d, 0x99, 0xa5, 0x4c, 0x37, 0x62,
  0xbd, 0x8e, 0x99, 0xd5, 0x88, 0x7d, 0xc0, 0xa2, 0x43, 0xb0, 0xa8, 0xa1,
  0xa9, 0x4e, 0x66, 0xf1, 0x94, 0xdc, 0x6b, 0xd3, 0xe6, 0x0d, 0xcd, 0x72,
  0x09, 0xf4, 0x95, 0x39, 0xb0, 0x77, 0x5c, 0xb5, 0xb8, 0xb6, 0xca, 0x68,
  0x1d, 0x88, 0x6c, 0xb6, 0x24, 0x71, 0x7f, 0x01, 0xcb, 0x1b, 0x0c, 0xde,
  0x6d, 0xb8, 0xec, 0x8d, 0x76, 0xf7, 0x39, 0xcc, 0x0d, 0xb9, 0x13, 0x19,
  0xe1, 0x5f, 0xf3, 0x79, 0xd4, 0x19, 0x9c, 0xb1, 0xee, 0x5c, 0x4d, 0x4e,
  0xe9, 0x12, 0x57, 0x81, 0xae, 0xd0, 0xbe, 0xb9, 0xfa, 0xf8, 0xa4, 0x7a,
  0x64, 0x99, 0xb0, 0x6b, 0x0a, 0xc2, 0xb2, 0x5c, 0x92, 0x73, 0x8a, 0xe4,
  0x71, 0x73, 0x38, 0x60, 0xf6, 0xc0, 0x8a, 0x96, 0x19, 0xfe, 0x69, 0x74,
  0xe8, 0x94, 0xac, 0x39, 0x3c, 0x8b, 0x02, 0x5d, 0xe0, 0x68, 0x07, 0x1b,
  0x1d, 0x14, 0x78, 0x8a, 0x8e, 0x8d, 0x7b, 0xd9, 0xbc, 0x84, 0xa0, 0xa1,
  0x11, 0xbb, 0x01, 0x11, 0x0a, 0x82, 0x19, 0x2f, 0x5c, 0x0b, 0xf7, 0x5e,
  0x2f, 0x97, 0xc0, 0x5f, 0xd0, 0x74, 0x10, 0xe6, 0x81, 0xf4, 0xd8, 0x9c,
  0x1d, 0xb3, 0x17, 0x90, 0x34, 0x0e, 0x1f, 0xd9, 0xf8, 0xad, 0x2f, 0x08,
  0x1d, 0x9a, 0x7b, 0x8a, 0x20, 0x7e, 0x13, 0x30, 0xc8, 0x48, 0x25, 0xf3,
  0xb4, 0xb1, 0xeb, 0xb3, 0x41, 0xe8, 0x30, 0xeb, 0xf1, 0x29, 0x7c, 0x1f,
  0x99, 0x2d, 0xba, 0x11, 0xd9, 0xad, 0x9a, 0xa3, 0x51, 0xe0, 0xc4, 0xa8,
  0x5c, 0x7f, 0xdf, 0x22, 0xc1, 0x60, 0x16, 0xdb, 0xcb, 0x1c, 0xfc, 0x46,
  0x06, 0x86, 0xc2, 0x1a, 0xb5, 0x13, 0xe3, 0x42, 0x3d, 0x3e, 0x72, 0xc7,
  0x25, 0x9f, 0x69, 0xf3, 0x22, 0x38, 0xbf, 0x5f, 0x2f, 0x37, 0x0c, 0x0f,
  0x83, 0x51, 0x2e, 0x4f, 0xde, 0x93, 0xfd, 0x1a, 0x03, 0xdd, 0x9c, 0xab,
  0xbb, 0x52, 0x63, 0xdb, 0xc3, 0x65, 0x3a, 0xab, 0xc5, 0x04, 0xac, 0xc9,
  0x4d, 0x81, 0x65, 0x26, 0x2d, 0x9a, 0x1a, 0x47, 0xb7, 0x52, 0x72, 0x0f,
  0x37, 0x09, 0xad, 0x7a, 0x5c, 0x88, 0x67, 0x7b, 0x59, 0xd6, 0x1c, 0x48,

  0x2a, 0x97, 0x67, 0x15, 0x69, 0xd9, 0x68, 0xd7, 0x3a, 0x63, 0x7a, 0x27,
  0x44, 0xd3, 0x42, 0x31, 0x30, 0xcd, 0xd2, 0xbf, 0x8b, 0x0e, 0x9a, 0x64,
  0x77, 0x69, 0x91, 0x67, 0xa8, 0xe5, 0x82, 0xe9, 0x5b, 0xa4, 0xc4, 0x96,
  0x51, 0xfd, 0x02, 0xc6, 0xb1, 0x76, 0xfc, 0xe1, 0xea, 0xec, 0xe3, 0xf1,
  0xd1, 0xc7, 0xaf, 0x3f, 0x9c, 0xbf, 0x39, 0x3b, 0x59, 0x6b, 0x0c, 0x87,
  0x3e, 0xbf, 0x54, 0x1c, 0xf5, 0x25, 0x5a, 0x1e, 0x74, 0x49, 0x60, 0x8a,
  0x3c, 0xf2, 0x34, 0xbd, 0x03, 0x86, 0x46, 0x86, 0x04, 0xf9, 0xe8, 0xe9,
  0x6f, 0xe4, 0xd5, 0x92, 0x0d, 0x6f, 0x0c, 0x37, 0x5c, 0xa2, 0x9e, 0xd6,
  0xaf, 0x69, 0xcb, 0x7a, 0x55, 0xc4, 0x6a, 0xd7, 0x09, 0x06, 0x34, 0x6c,

  0xd4, 0xa2, 0xb2, 0x31, 0x9a, 0x2f, 0x8e, 0x91, 0xe8, 0xb8, 0xeb, 0x97,
  0x15, 0x58, 0x49, 0x1a, 0x20, 0x00, 0xad, 0x2d, 0xbf, 0xd5, 0x2c, 0x03,
  0x30, 0xb1, 0x8e, 0x02, 0xc7, 0x5d, 0x5a, 0x4d, 0x74, 0x1c, 0xad, 0xe1,
  0x48, 0x40, 0xbf, 0x3d, 0x99, 0xe4, 0xa8, 0xa8, 0xc0, 0xbe, 0x49, 0x52,
  0xba, 0x18, 0x1a, 0x45, 0x45, 0x9d, 0x95, 0x9c, 0x73, 0x9e, 0x86, 0x0d,

  0xba, 0x26, 0xee, 0x01, 0x69, 0xf7, 0xc9, 0x43, 0x42, 0x37, 0x4f, 0xde,
  0x3a, 0x5e, 0x16, 0x74, 0x9b, 0xbf, 0x07, 0x6d, 0x04, 0xb9, 0xdf, 0x1b,
  0xf2, 0xee, 0xc1, 0x0b, 0xfa, 0x10, 0x88, 0x99, 0xa6, 0xc8, 0xcb, 0x67,
  0x18, 0x57, 0x8d, 0xc9, 0x93, 0x42, 0x7e, 0xaf, 0xcb, 0xa3, 0xeb, 0x77,
  0x41, 0x65, 0xd6, 0xa6, 0xf4, 0x08, 0x29, 0x92, 0x62, 0x5e, 0x56, 0x72,
  0x41, 0xce, 0x07, 0x83, 0x88, 0x12, 0x46, 0x66, 0xe9, 0xb0, 0x88, 0xf1,
  0x9b, 0xf8, 0x63, 0xfc, 0x29, 0x90, 0x75, 0x63, 0xb8, 0xcb, 0x6f, 0x8f,
  0x07, 0x7f, 0xdc, 0xde, 0x46, 0x2d, 0x7e, 0x09, 0xfb, 0xb2, 0x0e, 0xaf,
  0x64, 0x25, 0xdc, 0xcc, 0x79, 0xbf, 0xcc, 0x37, 0x48, 0x6c, 0x97, 0xa2,
  0x0e, 0xc4, 0x77, 0x20, 0x6d, 0x89, 0x8e, 0x94, 0xa8, 0xe1, 0x38, 0xbd,
  0x3d, 0x21, 0x46, 0x27, 0xd9, 0x34, 0xc0, 0x2f, 0x40, 0x5e, 0xcf, 0x7c,
  0x85, 0x7c, 0x3d, 0xbd, 0x18, 0x48, 0x2e, 0x4a, 0x3c, 0x82, 0xbf, 0xa2,
  0xa3, 0x60, 0x03, 0x57, 0x56, 0xbf, 0x61, 0xba, 0xaa, 0x01, 0x6b, 0xa3,


  0xd7, 0x68, 0xbe, 0x50, 0x0a, 0x8d, 0xcf, 0x15, 0xb2, 0xe6, 0xe5, 0xb2,
  0x69, 0x4a, 0x44, 0x0e, 0xc3, 0x78, 0x74, 0x7b, 0x1f, 0x17, 0x63, 0xb6,
  0x87, 0x80, 0x62, 0x86, 0xe9, 0x2c, 0xad, 0x1e, 0xd9, 0xae, 0x6d, 0xda,
  0xd4, 0x1c, 0x1f, 0xc5, 0x0d, 0x84, 0x7b, 0x34, 0x05, 0x93, 0x1f, 0xb5,
  0x4f, 0x54, 0xf1, 0xd3, 0xca, 0x35, 0x69, 0x49, 0x45, 0xaa, 0x8c, 0x8a,
  0x63, 0xbe, 0xed, 0x89, 0xc7, 0x8a, 0xef, 0x11, 0x4d, 0xd3, 0xd2, 0xae,
  0xb2, 0x41, 0x97, 0x49, 0x29, 0xf9, 0x44, 0xe5, 0x23, 0x48, 0xf9, 0x79,
  0x14, 0x50, 0x11, 0x29, 0x7b, 0x28, 0xfa, 0x36, 0x79, 0x04, 0xfb, 0x39,
  0xcd, 0x2c, 0xa7, 0x64, 0xfb, 0x3e, 0x41, 0xeb, 0x8e, 0x75, 0xd1, 0x54,
  0x9d, 0xe9, 0x89, 0xc4, 0x43, 0x58, 0x92, 0xf8, 0x0e, 0x04, 0x7e, 0x5f,
  0xf5, 0x70, 0x1c, 0x62, 0xad, 0xac, 0xb1, 0x64, 0xfa, 0x92, 0x7f, 0x88,
  0x03, 0xf8, 0x79, 0x96, 0x25, 0x33, 0x39, 0xbe, 0xeb, 0x55, 0x07, 0x60,
  0x9e, 0x85, 0x29, 0x7f, 0xcf, 0x37, 0xba, 0x31, 0xdc, 0x4b, 0x0e, 0xee,
  0xc7, 0x95, 0xca, 0x24, 0xcd, 0x1a, 0x02, 0xab, 0x68, 0xcb, 0xfc, 0xaa,
  0xdf, 0xfa, 0x19, 0xef, 0x36, 0x15, 0xf6, 0xd0, 0xeb, 0x67, 0xce, 0x4e,

  0x51, 0x3a, 0x64, 0x3c, 0x63, 0x39, 0xe2, 0x2f, 0x8c, 0x66, 0x45, 0x01,

  0x8c, 0xc6, 0x70, 0xae, 0x96, 0xad, 0x32, 0x4c, 0xd6, 0xb1, 0x06, 0x7a,
  0x6a, 0x5e, 0x90, 0xbf, 0xa8, 0xc8, 0xe1, 0xac, 0x6b, 0xe7, 0xb9, 0xce,
  0xca, 0x46, 0xf3, 0x9a, 0x08, 0x37, 0x77, 0x36, 0x66, 0x23, 0x74, 0xd1,
  0x3d, 0xcd, 0xc4, 0x37, 0x59, 0x5b, 0x2d, 0xce, 0xba, 0x84, 0x26, 0x2e,
  0x7d, 0x08, 0x6c, 0xec, 0x5f, 0x17, 0xd0, 0xcc, 0x0c, 0x89, 0xf9, 0xf9,
  0x32, 0x4b, 0x68, 0xb1, 0x26, 0xa8, 0xdf, 0xab, 0x44, 0xc6, 0x49, 0x18,
  0x17, 0xec, 0x82, 0x13, 0x06, 0x58, 0x71, 0x64, 0x5f, 0xb2, 0x6f, 0x06,
  0xa0, 0x3b, 0x50, 0x5c, 0x8e, 0x07, 0x9d, 0x68, 0x3d, 0xe9, 0x4f, 0x61,
  0xbc, 0x0e, 0x8e, 0xb3, 0x7d, 0x80, 0xff, 0xdd, 0xa1, 0xff, 0xee, 0x76,
  0x34, 0xb5, 0xcf, 0xdd, 0x7a, 0x94, 0xe6, 0x4d, 0x59, 0xc4, 0xf1, 0x38,
  0x2b, 0xdc, 0xbb, 0xec, 0x63, 0x6e, 0x63, 0x3c, 0xac, 0xb3, 0x9e, 0xf1,
  0x2e, 0xfb, 0xea, 0x96, 0x6e, 0xc3, 0x9c, 0xfd, 0x11, 0x77, 0x09, 0x3b,
  0x44, 0x60, 0x65, 0x23, 0x50, 0x0f, 0xc9, 0x8d, 0xa8, 0xb7, 0x6a, 0xf4,
  0xb1, 0x48, 0x6e, 0xe2, 0xf2, 0x26, 0x5a, 0x56, 0x4c, 0x84, 0x40, 0xb7,
  0xcd, 0xe1, 0x16, 0xb3, 0xd4, 0x7a, 0xda, 0xe4, 0xd3, 0x7d, 0xb5, 0xfb,
  0xec, 0x29, 0x72, 0x04, 0x64, 0x96, 0xdf, 0xeb, 0x33, 0x3d, 0xc9, 0xb5,
  0x0b, 0xa9, 0x05, 0x70, 0x9a, 0xe4, 0x37, 0xc1, 0xc7, 0xdc, 0x48, 0xf6,
  0x1c, 0xb5, 0x49, 0x4c, 0x04, 0x04, 0x16, 0x37, 0x81, 0x1d, 0x43, 0x8b,
  0x6e, 0x46, 0xe7, 0x86, 0xb6, 0x2b, 0xcd, 0xdb, 0x33, 0x4d, 0x45, 0xcf,
  0x4b, 0x27, 0xe2, 0xbd, 0x95, 0x7f, 0x93, 0x3c, 0x15, 0xed, 0xab, 0xe4,
  0x68, 0x77, 0x53, 0xf5, 0x7a, 0x9a, 0xb4, 0x95, 0x41, 0x1a, 0x4d, 0x47,
  0x16, 0xcb, 0x01, 0x13, 0xa5, 0xeb, 0x74, 0x4a, 0xb6, 0x46, 0xc8, 0x81,
  0xc1, 0x4e, 0xa9, 0x7f, 0xe9, 0x92, 0xc0, 0x8c, 0x7b, 0xe8, 0x2f, 0x5d,
  0x96, 0xcf, 0xb8, 0x23, 0x0e, 0xd3, 0xe5, 0x77, 0x8c, 0xbf, 0x98, 0xa3,
  0xfa, 0xee, 0x06, 0x34, 0xa9, 0xf0, 0xd1, 0x21, 0x8c, 0x63, 0xe7, 0x66,
  0x0d, 0x78, 0xa0, 0x2b, 0x71, 0x91, 0xac, 0xc7, 0xb7, 0x71, 0x3f, 0xba,
  0x38, 0x1e, 0x5c, 0xe2, 0x27, 0x80, 0x3a, 0xb2, 0x29, 0xcc, 0xe2, 0x6c,
  0xd0, 0x18, 0x2e, 0x79, 0xa8, 0x92, 0xac, 0x0c, 0x39, 0x28, 0xfd, 0x6d,
  0xd6, 0x28, 0x82, 0xa6, 0xd7, 0xc8, 0x64, 0xc1, 0xd2, 0xa7, 0xb8, 0x38,
  0x86, 0x79, 0x31, 0x07, 0x23, 0xe2, 0xab, 0xe6, 0x7d, 0x68, 0x01, 0x37,
  0x7f, 0xbc, 0x61, 0x5c, 0x35, 0x5d, 0xa5, 0x05, 0x13, 0x2e, 0x2c, 0x97,

  0x53, 0xb4, 0x41, 0x4a, 0xb5, 0x1b, 0xcd, 0x17, 0x60, 0x37, 0x7c, 0x55,
  0x41, 0x96, 0x6d, 0x3c, 0x89, 0x60, 0x35, 0x61, 0x26, 0x15, 0xa9, 0x48,
  0x59, 0x6e, 0x47, 0xc5, 0x6c, 0x0a, 0xca, 0x1a, 0x4d, 0x29, 0xc0, 0x36,
  0x4a, 0x40, 0x05, 0x1d, 0x07, 0x94, 0x00, 0x3e, 0x14, 0x35, 0x9c, 0x26,
  0x92, 0x29, 0x1a, 0xf0, 0xff, 0xd0, 0x40, 0x23, 0x56, 0xd1, 0x90, 0xea,
  0x29, 0x50, 0x91, 0xa2, 0x9f, 0x14, 0x15, 0x66, 0x36, 0xd5, 0x71, 0x3c,

  0x73, 0xff, 0xbf, 0xc9, 0x96, 0xb0, 0xf1, 0x01, 0x69, 0x8c, 0x4a, 0x15,

  0x8a, 0x19, 0xdc, 0xc0, 0x55, 0x8e, 0xbd, 0xbd, 0xed, 0xba, 0x1f, 0x9b,
  0x88, 0x0d, 0x0c, 0x80, 0x24, 0x3a, 0xc4, 0xff, 0x3e, 0xc9, 0x95, 0x29,
  0x75, 0x85, 0x9e, 0x97, 0x78, 0x27, 0xf3, 0x4e, 0xf1, 0xc5, 0x44, 0x75,
  0x06, 0xed, 0x49, 0x2f, 0x22, 0xb7, 0x3e, 0xf2, 0xbd, 0x6e, 0xf4, 0x06,
  0x13, 0xb2, 0x4f, 0xce, 0xbf, 0x21, 0x1a, 0xb8, 0xdc, 0xde, 0xa1, 0xe8,
  0x92, 0xb1, 0x1e, 0xc6, 0xf4, 0x91, 0x92, 0x1d, 0x09, 0x1c, 0x1d, 0xf6,




  0x15, 0x5f, 0x92, 0x09, 0x5d, 0x62, 0xa3, 0x18, 0x16, 0xa4, 0xec, 0xa1,
  0xf1, 0xa7, 0x93, 0x5f, 0x9e, 0x21, 0x7a, 0xd2, 0x95, 0x1d, 0x14, 0xc7,
  0xcc, 0x6d, 0xf2, 0x68, 0xff, 0x46, 0xbb, 0xea, 0x6c, 0xb5, 0x7d, 0xf8,


  0xd0, 0xd9, 0xa4, 0x1f, 0x0f, 0x30, 0x43, 0x09, 0xb4, 0xd4, 0xf1, 0xcf,
  0xbf, 0x4e, 0x22, 0x86, 0x77, 0x3e, 0xe0, 0x6c, 0x21, 0x3f, 0x97, 0xe6,

  0x02, 0x71, 0xe8, 0x9f, 0x59, 0xbc, 0xa4, 0xc3, 0x63, 0xa6, 0x3c, 0x12,
  0x7c, 0x9c, 0x19, 0x95, 0xa4, 0xc7, 0x09, 0x60, 0x94, 0x10, 0xd6, 0xdc,
  0xfb, 0x51, 0x3e, 0xf3, 0x64, 0x5d, 0xcd, 0x70, 0x25, 0x7d, 0x7e, 0x47,
  0xe4, 0x1b, 0x19, 0x73, 0xcc, 0x6c, 0x44, 0x8b, 0x6e, 0x5e, 0x07, 0xa3,
  0x53, 0x93, 0xfa, 0x65, 0x25, 0x23, 0xbe, 0xc9, 0x2f, 0x52, 0x98, 0x9b,

  0xa6, 0xc6, 0x9a, 0x52, 0x3f, 0xb2, 0x1a, 0x6f, 0x48, 0xfd, 0x87, 0xb3,
  0xd5, 0xbd, 0x85, 0x43, 0x47, 0x3f, 0x93, 0xd9, 0xb5, 0xae, 0xeb, 0x69,
  0x02, 0x26, 0x57, 0xa4, 0xaa, 0x9f, 0x4b, 0x32, 0xa9, 0x1f, 0xc3, 0xe0,
  0x8c, 0x03, 0xf1, 0x46, 0x49, 0x66, 0x55, 0xcd, 0x97, 0xcf, 0xe4, 0x87,
  0x96, 0x68, 0xc7, 0xd9, 0x92, 0x4e, 0xe8, 0x28, 0x2a, 0x0e, 0x7e, 0xca,
  0x15, 0x4a, 0xef, 0x70, 0xeb, 0x94, 0x76, 0xac, 0x63, 0xb3, 0xae, 0xfa,
  0xe6, 0x19, 0xfe, 0x99, 0xa1, 0x4f, 0xec, 0x0f, 0x01, 0x82, 0x0c, 0xd2,
  0x22, 0xfa, 0xc6, 0x25, 0xf6, 0x41, 0x0a, 0x0c, 0x26, 0x41, 0x4a, 0x16,
  0xfa, 0xec, 0xf1, 0x59, 0x06, 0x9d, 0x2a, 0x20, 0x6a, 0xb7, 0x39, 0xc6,
  0x9c, 0x67, 0xed, 0x34, 0x09, 0x04, 0xd8, 0x78, 0x85, 0x29, 0x25, 0x4c,
  0xbb, 0xe8, 0x7b, 0x4d, 0x47, 0xb7, 0x14, 0x79, 0x11, 0x09, 0xe5, 0xae,
  0x4f, 0xf3, 0xf6, 0x38, 0xe3, 0x34, 0x70, 0x04, 0x64, 0x4b, 0xa2, 0x53,
  0x18, 0x69, 0x12, 0xa5, 0x73, 0x9a, 0xb1, 0xce, 0xd6, 0xea, 0x65, 0x80,
  0xb9, 0x7e, 0x7c, 0x73, 0x7a, 0x15, 0xad, 0xa3, 0x06, 0xde, 0x34, 0x72,
  0x55, 0xbc, 0x6f, 0x26, 0xd5, 0x68, 0x73, 0x71, 0x9b, 0x6e, 0x82, 0xb1,
  0x39, 0x1e, 0x6e, 0x18, 0x23, 0x8a, 0x3e, 0x87, 0x54, 0x68, 0x0c, 0x53,
  0xb5, 0x4c, 0xc9, 0x34, 0xf5, 0x5c, 0x8f, 0xd6, 0x54, 0xe5, 0x0a, 0x17,
  0x63, 0xa3, 0xf2, 0x36, 0x31, 0x41, 0x53, 0x88, 0x86, 0xb3, 0x23, 0x28,
  0xb0, 0x93, 0xb0, 0x5f, 0x1a, 0x6c, 0xec, 0xe6, 0x5d, 0xe5, 0xec, 0x47,
  0x71, 0xe4, 0xb0, 0x03, 0x47, 0x53, 0xf6, 0x44, 0x5c, 0x58, 0xed, 0xb7,
  0x8b, 0xc9, 0x96, 0xb8, 0x29, 0x0b, 0x14, 0x49, 0x63, 0x74, 0x03, 0x36,
  0x87, 0x23, 0x4d, 0xae, 0xd3, 0xdf, 0xec, 0x44, 0x26, 0xbd, 0x14, 0x76,
  0x99, 0xf3, 0xa7, 0x4d, 0xe0, 0x0b, 0x48, 0x6c, 0xb2, 0x2c, 0x8d, 0x1f,
  0x33, 0x36, 0xe7, 0xd5, 0x0f, 0x31, 0x54, 0xe7, 0x38, 0x8d, 0xce, 0x05,

  0xba, 0x31, 0xdd, 0x2c, 0xd7, 0x5a, 0x97, 0x49, 0xd1, 0x51, 0x75, 0x7e,
  0xea, 0x44, 0x4e, 0x7a, 0x62, 0x2d, 0x4b, 0x31, 0xb5, 0x09, 0x44, 0x8e,

  0x10, 0x00, 0x89, 0x6c, 0xee, 0xf0, 0x38, 0x99, 0xa5, 0xf3, 0x94, 0x6c,
  0x2f, 0x77, 0x0a, 0xbd, 0x50, 0x80, 0xd0, 0x4e, 0xe9, 0x27, 0x7f, 0x4a,
  0x9a, 0xf2, 0x1b, 0xe3, 0xaf, 0x61, 0x4a, 0xe4, 0x11, 0xe3, 0x8c, 0xcc,
  0xb0, 0xd5, 0x5c, 0x9f, 0x90, 0x49, 0x1a, 0x5e, 0x11, 0x39, 0x36, 0x77,

  0xa9, 0x4d, 0x95, 0xb7, 0x2e, 0x11, 0xbd, 0xf4, 0xcc, 0xd4, 0xa2, 0xc5,

  0xed, 0xa8, 0xdc, 0xde, 0x6e, 0x0a, 0xba, 0xd2, 0x52, 0x94, 0xd8, 0xef,

  0xb1, 0x21, 0xcc, 0x0f, 0x57, 0xa7, 0xd1, 0x3a, 0x16, 0x89, 0xbc, 0xdc,
  0xdf, 0xde, 0xd9, 0x70, 0x33, 0x4b, 0x94, 0x01, 0xf8, 0x72, 0xf3, 0x91,
  0x43, 0xb2, 0xce, 0x05, 0x9c, 0xe5, 0xa3, 0x58, 0x34, 0x0e, 0x3b, 0xf4,
  0x38, 0xb9, 0x4b, 0x47, 0x58, 0xa3, 0x83, 0x01, 0x79, 0xe4, 0xc1, 0xc3,
  0x04, 0x26, 0xe9, 0xed, 0xb8, 0xcd, 0xe8, 0xe5, 0xd9, 0x83, 0x89, 0x64,
  0x34, 0x65, 0xcc, 0x9b, 0x06, 0x1a, 0xa8, 0x64, 0xef, 0xdc, 0x59, 0x4b,
  0x94, 0x20, 0x6e, 0xf1, 0x04, 0xe1, 0xba, 0xb8, 0x82, 0x86, 0x74, 0x8c,
  0xae, 0x0d, 0xfc, 0xf4, 0x7a, 0xb2, 0x59, 0xc2, 0x7a, 0x4d, 0xec, 0x18,
  0x33, 0x50, 0x9a, 0x07, 0x28, 0x73, 0xea, 0xa0, 0x20, 0xc9, 0x48, 0xb8,
  0xc7, 0x76, 0x50, 0xb3, 0xfb, 0xae, 0x26, 0x54, 0x1f, 0xd5, 0xf7, 0x94,
  0x13, 0xe1, 0x80, 0xe6, 0x12, 0x1e, 0xf2, 0x77, 0x72, 0x32, 0xd5, 0xd9,
  0xa7, 0x1c, 0x0f, 0x9e, 0xbd, 0x78, 0x0d, 0x87, 0xac, 0x28, 0x28, 0xbf,

  0x8d, 0xf5, 0x71, 0x4f, 0x8e, 0xc3, 0xeb, 0x9b, 0x2a, 0x84, 0x48, 0x0a,
  0xa9, 0xbf, 0x91, 0x3d, 0x3f, 0xc0, 0x3c, 0xc9, 0xd3, 0x73, 0x2b, 0x8e,
  0x1e, 0x52, 0x8a, 0x4d, 0x0a, 0x87, 0xef, 0x2b, 0x56, 0xc1, 0x0f, 0x47,

  0x34, 0xca, 0xc7, 0x0d, 0x93, 0x1d, 0x37, 0xc1, 0x11, 0x78, 0xc4, 0xfd,

  0x38, 0x54, 0x49, 0x1c, 0x2f, 0xec, 0xc9, 0x46, 0x4a, 0x65, 0xf7, 0xfa,


  0x2f, 0xe2, 0x81, 0x21, 0x8f, 0x1a, 0xb1, 0xc0, 0x5f, 0xc5, 0x01, 0x9f,
  0xf0, 0x39, 0x1d, 0x7b, 0x12, 0xbb, 0x34, 0xca, 0x90, 0xd5, 0xd5, 0x30,
  0x59, 0x3c, 0xa2, 0x8d, 0xf3, 0x2d, 0x1a, 0x4c, 0x1b, 0xa4, 0x94, 0x00,
  0xcc, 0xf9, 0x6a, 0xdc, 0x4d, 0x76, 0xec, 0xc0, 0x75, 0x59, 0x3f, 0xe3,
  0x20, 0x65, 0x74, 0xf9, 0xf6, 0x07, 0xe5, 0x96, 0x21, 0x03, 0x9e, 0x1c,
  0x51, 0x5f, 0x98, 0xec, 0x30, 0xb0, 0x28, 0x30, 0x53, 0x2d, 0x95, 0xac,
  0x4f, 0x76, 0x13, 0x51, 0x38, 0x7c, 0xc3, 0x26, 0x33, 0xe2, 0x56, 0x77,
  0x0e, 0xe9, 0x77, 0xcd, 0x58, 0x53, 0xce, 0x96, 0xcc, 0x97, 0x3f, 0xf1,
  0xaf, 0x99, 0xc7, 0xc2, 0xbf, 0xaa, 0x9b, 0xe5, 0x7c, 0x08, 0xe7, 0x99,
  0x55, 0x5f, 0x76, 0x22, 0x0e, 0xb6, 0x4e, 0x64, 0x3f, 0x57, 0x98, 0x9d,
  0xa9, 0xd6, 0xeb, 0xa8, 0x6f, 0xb1, 0xb6, 0x6b, 0x3c, 0x3b, 0xad, 0x1d,
  0xb0, 0xf9, 0x79, 0x70, 0x78, 0xec, 0xcb, 0xf6, 0x54, 0xbd, 0x0f, 0x40,
  0x9e, 0x3f, 0xbd, 0xff, 0xcb, 0x4f, 0xaf, 0x76, 0xf7, 0xe2, 0x97, 0xf1,
  0xe8, 0xc5, 0xe4, 0xf3, 0x78, 0x7f, 0xbc, 0xff, 0xf2, 0xd5, 0xce, 0xe7,
  0xfb, 0xf1, 0xcb, 0xbd, 0x49, 0xfc, 0x62, 0x3b, 0xd9, 0x7e, 0x35, 0xd9,
  0xd9, 0x1d, 0x8f, 0x27, 0xc9, 0xe7, 0xe3, 0x97, 0x71, 0xa7, 0x4f, 0xe6,
  0x97, 0x4e, 0xdd, 0x67, 0xb5, 0x1a, 0x78, 0x8b, 0xa3, 0xc1, 0xbb, 0xa3,
  0xde, 0x76, 0x74, 0x93, 0x3c, 0xe8, 0x05, 0x63, 0x8f, 0xa6, 0xc9, 0xba,
  0x4b, 0x24, 0xaf, 0xba, 0x7d, 0xb1, 0x5a, 0x28, 0x88, 0x59, 0xd3, 0xe8,




  0x2b, 0x21, 0x0d, 0x98, 0x77, 0x51, 0xb7, 0x95, 0xf3, 0xea, 0x8c, 0xff,
  0xf0, 0x40, 0x7d, 0xf6, 0xb8, 0xae, 0xe6, 0xe5, 0x3f, 0x83, 0x77, 0x66,
  0xef, 0xe3, 0x11, 0x28, 0x49, 0xb0, 0x27, 0xf2, 0xe0, 0x00, 0x4c, 0x5b,
  0x60, 0xd3, 0xdd, 0x48, 0xfe, 0x82, 0x5e, 0x62, 0x67, 0x8c, 0x6f, 0x8a,
  0x7c, 0xb9, 0xb8, 0xcc, 0x67, 0xe9, 0xe8, 0x71, 0xd5, 0x70, 0xee, 0x63,
  0xb5, 0x5f, 0x9c, 0x30, 0x0b, 0x4f, 0xcb, 0xe4, 0x77, 0x34, 0xad, 0x1c,
  0x76, 0xfc, 0x0c, 0xdb, 0xaa, 0x37, 0x4a, 0x17, 0x37, 0x18, 0xe7, 0x3d,
  0xa4, 0x2c, 0x3f, 0x0c, 0xcd, 0xf0, 0x0f, 0xc2, 0x36, 0xd5, 0x40, 0x6e,
  0x64, 0x29, 0xe7, 0xa9, 0x6f, 0x8b, 0xc6, 0x95, 0x6a, 0x09, 0x9c, 0xba,
  0xa9, 0x24, 0xb3, 0x34, 0xf5, 0xfc, 0x78, 0xf6, 0x43, 0x7c, 0xdb, 0x55,
  0xdb, 0x66, 0xe7, 0x85, 0xfc, 0xaa, 0x1f, 0x5d, 0x51, 0x9c, 0x7c, 0xb9,
  0x60, 0xf3, 0x82, 0xfc, 0xf9, 0xfc, 0xbb, 0xe6, 0x45, 0xc3, 0xc9, 0x0b,
  0xc5, 0x70, 0x21, 0x1e, 0xec, 0xe8, 0x87, 0xab, 0xb3, 0x83, 0xe6, 0x3e,
  0x51, 0xb1, 0x51, 0x79, 0xb0, 0xb9, 0x49, 0x21, 0x9f, 0x9b, 0xf8, 0xe1,
  0xa1, 0x5f, 0x26, 0x9b, 0xe3, 0x7c, 0x54, 0x6e, 0x96, 0xe5, 0x4c, 0x77,

  0xa3, 0x5e, 0xfb, 0xf7, 0x09, 0xbc, 0xb9, 0xf9, 0x9c, 0xd8, 0x56, 0x32,
  0xee, 0x95, 0xa5, 0x97, 0x1b, 0x34, 0x38, 0xd6, 0xcc, 0x83, 0x13, 0xc9,
  0x49, 0x23, 0x39, 0xd7, 0x83, 0xdd, 0x1d, 0x0c, 0xde, 0x45, 0xfa, 0x32,
  0x6d, 0xaf, 0x09, 0x89, 0x9b, 0xbc, 0x9c, 0x6e, 0x40, 0x0d, 0x8b, 0x85,
  0x61, 0x7f, 0xe1, 0x3a, 0x74, 0x50, 0x9d, 0xce, 0xf9, 0x0f, 0xa9, 0x5d,
  0x49, 0xab, 0x95, 0x89, 0x7c, 0x2f, 0x1a, 0x0e, 0x10, 0xb3, 0x88, 0x70,
  0xfc, 0x5f, 0x9d, 0x60, 0x71, 0x64, 0x9f, 0xb4, 0x1e, 0xa1, 0x66, 0x71,
  0x3a, 0x50, 0xef, 0x34, 0x2f, 0x40, 0x78, 0xcc, 0xcb, 0x90, 0x17, 0x54,
  0x6f, 0x79, 0xc9, 0x6a, 0x5f, 0xc9, 0xb9, 0x88, 0x30, 0x4c, 0xe6, 0x0c,
  0x0e, 0xc7, 0x48, 0x39, 0x8c, 0x7d, 0xf7, 0xb0, 0x82, 0xf1, 0x2d, 0x3d,
  0xbc, 0x36, 0x2f, 0xda, 0x32, 0xb3, 0xc1, 0x0f, 0x12, 0xc7, 0x30, 0x59,


  0x29, 0x2c, 0xf3, 0x2c, 0x04, 0xca, 0xfd, 0x27, 0x31, 0x81, 0x3a, 0x44,
  0x51, 0xe4, 0x8e, 0x52, 0xdb, 0xfb, 0x96, 0x8c, 0x4b, 0x90, 0x8e, 0xe9,
  0x54, 0xc3, 0xeb, 0x2d, 0x39, 0x76, 0x28, 0xba, 0x2a, 0xca, 0x5d, 0x96,
  0x72, 0x70, 0x14, 0x0a, 0x98, 0xc2, 0x46, 0xa9, 0x25, 0x92, 0x9d, 0xc9,
  0xe9, 0x40, 0xb5, 0x2a, 0x78, 0xef, 0x26, 0x60, 0xcd, 0x8f, 0x7d, 0x1c,
  0xd3, 0xa8, 0xf4, 0x5e, 0xd2, 0xf0, 0xe2, 0xbe, 0x70, 0x12, 0xdb, 0x50,

  0x2b, 0x23, 0x37, 0x03, 0x3c, 0xd3, 0xb4, 0xf6, 0x28, 0xe7, 0xd6, 0xe8,
  0x7c, 0xa1, 0x12, 0xd7, 0xe6, 0x7a, 0x34, 0xf5, 0x5e, 0xf7, 0x36, 0xa5,
  0xa2, 0xea, 0x98, 0xf2, 0xfa, 0x43, 0xa2, 0x3d, 0x77, 0x82, 0xb4, 0x38,
  0xa0, 0x2f, 0xf3, 0x2a, 0x93, 0x36, 0xa9, 0x95, 0x4a, 0xa4, 0x10, 0x00,
  0x07, 0x02, 0xb1, 0x87, 0x19, 0xe7, 0x58, 0x4a, 0x3f, 0xcb, 0xad, 0x82,
  0x05, 0x84, 0x07, 0xbc, 0x90, 0xaa, 0x11, 0xfb, 0x1e, 0xdf, 0xe6, 0x9a,
  0x24, 0x4e, 0x22, 0xe4, 0xda, 0x3a, 0xce, 0xf6, 0xe2, 0x9f, 0x91, 0xf8,

  0x1a, 0x6a, 0x8c, 0xdc, 0xf2, 0x33, 0x3c, 0xbf, 0x90, 0x6b, 0x48, 0xb2,

  0xf2, 0xb9, 0xd0, 0x31, 0xa5, 0x12, 0x5e, 0x29, 0xfa, 0xe4, 0x22, 0x03,
  0xf5, 0x6c, 0x97, 0xb9, 0xa4, 0x6c, 0xe2, 0x44, 0x71, 0x9e, 0x3c, 0xc7,


  0x26, 0xa9, 0x9b, 0x82, 0xce, 0x9a, 0x31, 0x12, 0x97, 0x36, 0x57, 0xbf,

  0xf4, 0xa3, 0x95, 0x76, 0x33, 0x43, 0xd6, 0xab, 0x57, 0xf7, 0x40, 0x13,
  0x29, 0x12, 0xfd, 0x42, 0x96, 0x37, 0x27, 0xa5, 0xf3, 0x08, 0xe5, 0xa3,
  0x6a, 0x6e, 0xbf, 0x33, 0x01, 0xcd, 0xf1, 0x37, 0xa7, 0xdc, 0x92, 0xbd,


  0x99, 0x44, 0xf6, 0x91, 0xc8, 0xda, 0x99, 0xf6, 0x18, 0xc9, 0xdf, 0x40,
  0x15, 0x1b, 0x25, 0x4f, 0xfd, 0x00, 0xe7, 0xf4, 0x7a, 0x23, 0xe4, 0x27,

  0xb6, 0x23, 0x29, 0x45, 0xe1, 0x3d, 0x9d, 0xe5, 0xa5, 0xc6, 0x5f, 0x50,
  0xb9, 0xe0, 0xba, 0x5b, 0xe0, 0x06, 0xdf, 0xcb, 0x0f, 0xf8, 0x68, 0x1a,
  0xc3, 0xf1, 0x53, 0x5d, 0x99, 0xe2, 0xc4, 0x2a, 0x1b, 0x62, 0xab, 0xda,

  0x62, 0x61, 0xd4, 0x36, 0x8c, 0x35, 0x79, 0x10, 0xfd, 0xf4, 0x53, 0x37,
  0x02, 0x23, 0xb9, 0x31, 0xdc, 0x4f, 0x15, 0xfc, 0x14, 0x68, 0xf1, 0x27,
  0x2e, 0x58, 0xfa, 0xe9, 0x0e, 0x8d, 0x40, 0x74, 0x30, 0x97, 0x33, 0x8c,
  0x1e, 0xb1, 0x9a, 0x5d, 0xf7, 0xca, 0x71, 0x3d, 0xf4, 0x8a, 0xd4, 0x2c,
  0x6b, 0xb7, 0x73, 0x2a, 0x26, 0x1c, 0xd8, 0x72, 0x9e, 0x89, 0x75, 0xc2,



  0xc4, 0x49, 0xf7, 0x9e, 0xe4, 0xc0, 0xda, 0x1f, 0xd7, 0x2c, 0x21, 0x85,
  0xf6, 0xae, 0x48, 0x58, 0xd2, 0x93, 0xa8, 0x4a, 0x1d, 0x31, 0xa5, 0xd5,
  0xc3, 0x64, 0x6e, 0x46, 0x1c, 0x2e, 0x45, 0x66, 0x7a, 0x81, 0xce, 0x75,
  0x2e, 0x03, 0x6b, 0x8a, 0x71, 0x6b, 0x4a, 0x62, 0x6d, 0xdc, 0xe2, 0xe6,
  0xb1, 0xc4, 0x4c, 0x0e, 0x99, 0x8d, 0x77, 0x7b, 0x5a, 0x13, 0x8c, 0x65,
  0xef, 0xb1, 0xa8, 0x07, 0xf9, 0x00, 0x32, 0xbf, 0x1a, 0xeb, 0x84, 0x19,
  0xad, 0xf5, 0xd6, 0x4c, 0x2c, 0x4c, 0xf2, 0x65, 0xbc, 0x5c, 0x7a, 0x93,
  0x9c, 0x6d, 0x93, 0x0f, 0xbd, 0x4f, 0x3a, 0x49, 0x71, 0xb9, 0x9b, 0xee,

  0x68, 0x8b, 0xdb, 0xb1, 0x3a, 0x55, 0xa3, 0xf8, 0xf2, 0x7d, 0xe1, 0x3f,
  0x01, 0x87, 0x13, 0xa5, 0x45, 0x92, 0xe9, 0xa1, 0x03, 0x90, 0x37, 0xc4,
  0x86, 0x87, 0x7a, 0x3d, 0xc2, 0x19, 0x59, 0x30, 0x36, 0x08, 0x92, 0x04,
  0x65, 0x1e, 0x3c, 0x62, 0x25, 0xd8, 0x62, 0xe6, 0xf1, 0x5b, 0x49, 0x05,
  0xd4, 0x62, 0x6b, 0xbc, 0xe0, 0x08, 0x48, 0x71, 0x9f, 0x09, 0xa0, 0xc0,
  0x20, 0x27, 0xaf, 0xcc, 0x88, 0x72, 0x18, 0x24, 0x5d, 0x46, 0x6a, 0xca,
  0x02, 0x56, 0x20, 0xca, 0x40, 0x4f, 0x07, 0xc2, 0xf9, 0xbc, 0x8e, 0x3a,
  0xed, 0x9a, 0x50, 0xa7, 0xf9, 0x06, 0x65, 0x40, 0x5a, 0x17, 0xa7, 0xd4,
  0xcb, 0xd3, 0x44, 0xd6, 0x25, 0x93, 0xae, 0xf7, 0x37, 0x4e, 0x68, 0xe3,
  0x92, 0x2e, 0x91, 0xaf, 0x1b, 0x9c, 0x20, 0x5c, 0x06, 0x22, 0xfb, 0x36,
  0xcb, 0xca, 0xa1, 0x0f, 0x9b, 0xa7, 0x94, 0x92, 0xfb, 0x9a, 0xa4, 0x17,
  0x4b, 0x3b, 0xe7, 0x69, 0x2f, 0x14, 0xaf, 0x6f, 0x63, 0xc5, 0x09, 0x7e,
  0x4f, 0x5c, 0xd2, 0x2a, 0x3a, 0xcc, 0x8d, 0x5e, 0xcc, 0x08, 0xa7, 0x43,
  0x6b, 0x5d, 0x48, 0x25, 0xf2, 0x76, 0x67, 0x7b, 0xc3, 0x54, 0x47, 0x12,
  0xd8, 0x06, 0x67, 0x66, 0x8b, 0x9e, 0xd0, 0xb9, 0xc9, 0x39, 0x97, 0xa8,
  0x73, 0x80, 0x85, 0x7b, 0x72, 0x1b, 0x69, 0x8d, 0x0a, 0x83, 0xd0, 0x18,
  0x8e, 0x32, 0xb5, 0xde, 0x5d, 0xbc, 0x3f, 0xa9, 0x67, 0xe0, 0xd2, 0x4f,
  0x42, 0xce, 0x57, 0x60, 0x57, 0x6f, 0x81, 0xc3, 0x30, 0x0d, 0xc4, 0x9e,
  0x36, 0xc7, 0xb4, 0x05, 0xd3, 0x9a, 0x26, 0xd5, 0xe2, 0x7e, 0x99, 0x8e,

  0xd7, 0x37, 0x90, 0x46, 0xb0, 0xdc, 0xa4, 0x47, 0x35, 0x4e, 0x6c, 0x1a,

  0x96, 0xd1, 0x3a, 0x2b, 0xe8, 0x45, 0x52, 0x2d, 0x8b, 0x8c, 0x1d, 0xe6,




  0x38, 0xf7, 0xa6, 0x91, 0x05, 0xd2, 0x99, 0x45, 0x9d, 0xeb, 0x1c, 0x10,
  0xcc, 0x1c, 0x4e, 0x61, 0xe2, 0x01, 0xc1, 0xdc, 0xbd, 0x30, 0x79, 0x1f,
  0x74, 0xf0, 0xb4, 0x16, 0x4f, 0x7e, 0xb9, 0x3b, 0x11, 0x1d, 0x5d, 0x5e,
  0xbe, 0x39, 0xba, 0x3e, 0x32, 0x6b, 0x23, 0x01, 0x4d, 0xcc, 0x85, 0x34,
  0x64, 0xe0, 0x43, 0xa8, 0x35, 0xe1, 0x93, 0x6b, 0x7f, 0xfa, 0x30, 0x38,
  0xb9, 0x6a, 0x1e, 0xec, 0xe5, 0xd5, 0x05, 0x02, 0x12, 0xfd, 0xe9, 0xa7,
  0xa3, 0xc5, 0x62, 0xa6, 0x41, 0xc1, 0x37, 0x71, 0x15, 0xaf, 0x79, 0xb7,
  0x7a, 0x67, 0x03, 0xe7, 0x77, 0x6f, 0xe6, 0x37, 0x11, 0x21, 0x47, 0xa6,
  0x7e, 0xd4, 0xc7, 0x03, 0x2d, 0x46, 0x9a, 0x7e, 0x6b, 0x76, 0x83, 0x36,
  0x80, 0xb2, 0x67, 0xdb, 0x17, 0x92, 0x5b, 0x4e, 0xa6, 0x89, 0x64, 0xba,
  0x59, 0x33, 0x30, 0xb2, 0x93, 0xd1, 0xb2, 0x52, 0x92, 0x27, 0xfa, 0xc2,
  0x2a, 0xee, 0xe6, 0xbe, 0x78, 0xc7, 0x63, 0xc3, 0x28, 0xcc, 0x05, 0x08,
  0x44, 0x00, 0x08, 0x8d, 0x52, 0xa4, 0x75, 0xb6, 0xcc, 0xc5, 0x02, 0x34,
  0x35, 0x4e, 0x38, 0xac, 0x42, 0xa0, 0x02, 0x3c, 0x25, 0x6f, 0x43, 0xfe,
  0x08, 0xb7, 0xb1, 0x17, 0x9d, 0x48, 0xb5, 0x1b, 0x2d, 0x1c, 0x7e, 0xe0,
  0x3d, 0x54, 0x19, 0xf3, 0x41, 0xd8, 0x7d, 0x98, 0x57, 0x38, 0x40, 0x1b,
  0x9d, 0xa6, 0x08, 0xe0, 0xd2, 0x56, 0x78, 0x08, 0xa7, 0x8d, 0x9b, 0x4e,
  0xd6, 0x53, 0x27, 0x90, 0xf4, 0xd4, 0x8b, 0xa7, 0x48, 0x5e, 0xf0, 0x28,
  0x68, 0xd7, 0x60, 0x34, 0xe1, 0xbf, 0x36, 0xb7, 0xfb, 0x5b, 0x1d, 0x7f,
  0xf2, 0x78, 0x59, 0x08, 0x24, 0xc5, 0x44, 0xd5, 0x90, 0x1b, 0x56, 0x79,
  0xfe, 0xe4, 0xfc, 0x98, 0x85, 0x81, 0x7e, 0xba, 0x80, 0xf1, 0x83, 0x53,
  0xe9, 0x5d, 0x78, 0x59, 0x20, 0x98, 0xb9, 0x5b, 0x28, 0x53, 0x04, 0x9e,
  0x98, 0xe5, 0xf7, 0xb8, 0x12, 0x20, 0xb5, 0xd9, 0xac, 0x86, 0x66, 0xd3,
  0x09, 0x6f, 0x73, 0x46, 0xc0, 0x51, 0x49, 0x73, 0xb7, 0x83, 0x91, 0x6b,
  0x55, 0x3e, 0x5d, 0x0d, 0xcf, 0xa4, 0xbc, 0x92, 0x15, 0x69, 0x28, 0xc1,
  0x05, 0x13, 0x00, 0x2e, 0xe7, 0xf1, 0xbd, 0x99, 0x9b, 0x99, 0xd1, 0xd3,
  0xf4, 0x90, 0x1e, 0x0e, 0x82, 0x5a, 0xe9, 0x21, 0xd7, 0xaa, 0x7b, 0xb6,
  0xfc, 0xfb, 0xf8, 0x21, 0x9d, 0x2f, 0xe7, 0xf4, 0x31, 0xa4, 0x6d, 0x79,
  0x4c, 0xe2, 0x09, 0xe4, 0x55, 0xe4, 0xf4, 0x14, 0x22, 0xf2, 0xb5, 0x32,


  0x72, 0x2c, 0xfa, 0x90, 0x90, 0x01, 0x91, 0xdc, 0xb7, 0xcb, 0x23, 0x65,
  0x81, 0x02, 0x0e, 0x65, 0xc3, 0x1b, 0x00, 0xfa, 0x41, 0x8c, 0x39, 0x07,
  0x65, 0x6e, 0x12, 0x76, 0x02, 0xec, 0x9c, 0xc1, 0x12, 0x44, 0x87, 0x73,
  0xf2, 0x55, 0x93, 0x22, 0xcd, 0xc7, 0xe6, 0xde, 0xa0, 0xfe, 0x98, 0x66,
  0x4b, 0xd8, 0x67, 0xf6, 0x25, 0x73, 0x10, 0x02, 0x7f, 0xe5, 0x79, 0x08,
  0x29, 0xab, 0x7e, 0x40, 0xc5, 0x12, 0x9a, 0x82, 0xfa, 0xb2, 0xbf, 0xbb,
  0xd3, 0xdf, 0xea, 0xd6, 0x0c, 0x7a, 0xc1, 0x94, 0x80, 0xdb, 0x35, 0x4a,
  0xe7, 0xa6, 0xde, 0xb4, 0xff, 0xbb, 0x39, 0x6e, 0x28, 0x23, 0x7c, 0x1e,
  0x3f, 0xd0, 0xf1, 0x05, 0x8f, 0x35, 0x8f, 0x0e, 0xdf, 0x5d, 0x0c, 0xae,
  0xb7, 0x0f, 0x2e, 0x2f, 0xae, 0xe0, 0xbf, 0xf8, 0xf7, 0x1d, 0xfa, 0xfb,
  0x8e, 0x67, 0x55, 0xbe, 0x95, 0x0c, 0x5a, 0x2d, 0xd6, 0x21, 0x0d, 0x85,
  0x34, 0x1a, 0xde, 0xcd, 0xc8, 0x19, 0x08, 0xf5, 0x72, 0x62, 0x83, 0x23,
  0x53, 0xd1, 0xd8, 0x3c, 0x62, 0xe7, 0x53, 0x9a, 0x64, 0xd7, 0x8f, 0xfc,
  0x44, 0xbe, 0xb4, 0x52, 0x6d, 0x4a, 0x6a, 0xe1, 0xb5, 0xca, 0xbe, 0xe9,
  0xeb, 0xe6, 0x3a, 0x66, 0xa9, 0xcf, 0x51, 0xbc, 0x3a, 0xca, 0x0d, 0xab,
  0xff, 0x6a, 0x34, 0x03, 0xed, 0x3e, 0xc1, 0x5c, 0x92, 0x71, 0xc2, 0x01,
  0x16, 0xfc, 0x49, 0xc8, 0x30, 0x81, 0xeb, 0x27, 0x25, 0x0b, 0x5e, 0x82,
  0x21, 0x51, 0xa4, 0x46, 0x75, 0x60, 0x36, 0x30, 0xc7, 0x14, 0x34, 0x71,
  0xde, 0x8e, 0x2c, 0xf1, 0x2a, 0x04, 0x18, 0x47, 0xce, 0x75, 0x62, 0x51,
  0x91, 0x3e, 0x95, 0xdb, 0x9f, 0x5f, 0x5c, 0x47, 0xf1, 0x64, 0xa2, 0xd8,


  0x00, 0x58, 0x96, 0x80, 0x1a, 0xeb, 0xe6, 0x82, 0x25, 0x59, 0x5c, 0x85,
  0x52, 0x37, 0x44, 0x1f, 0xb9, 0x3e, 0x1b, 0x6c, 0xa2, 0x0b, 0x8b, 0x93,
  0xe0, 0x06, 0xe7, 0xa7, 0xdd, 0x9a, 0xaf, 0xda, 0x4d, 0x7d, 0xd9, 0x40,
  0x49, 0x19, 0x56, 0x28, 0x62, 0x47, 0x16, 0x5a, 0xc4, 0x19, 0x4c, 0xaa,
  0xa3, 0x23, 0xed, 0x48, 0x35, 0x58, 0x87, 0x8e, 0xb6, 0x13, 0x69, 0xd4,
  0x94, 0xec, 0xe2, 0xf9, 0xa2, 0x7a, 0xf4, 0xeb, 0x45, 0xc9, 0xb7, 0x81,
  0x38, 0x2c, 0xa8, 0x74, 0x74, 0xd0, 0x2c, 0xc1, 0x65, 0xd1, 0x92, 0x3a,
  0x7d, 0x1e, 0x76, 0xa7, 0x43, 0xa3, 0xd2, 0xa0, 0xf0, 0x77, 0x1c, 0x93,
  0x88, 0x76, 0x98, 0x84, 0xd2, 0xfb, 0xf9, 0x43, 0xce, 0xe0, 0x91, 0x19,
  0x1e, 0x26, 0x66, 0xea, 0xd4, 0x94, 0x3a, 0x90, 0xc1, 0xe4, 0x45, 0x3a,
  0xc5, 0x3c, 0x81, 0x66, 0xe9, 0x98, 0x9d, 0x88, 0xe7, 0x99, 0x42, 0x65,
  0xac, 0xac, 0x3a, 0x8e, 0x2b, 0xa1, 0xf2, 0x12, 0xf4, 0x29, 0x6d, 0xb4,
  0x50, 0x93, 0x46, 0xa7, 0x83, 0xfc, 0xa7, 0x0a, 0xe8, 0xf1, 0xac, 0xec,
  0xc1, 0xea, 0x50, 0xee, 0xd8, 0x20, 0x90, 0x96, 0xfe, 0xe8, 0x5d, 0x22,
  0x24, 0x9c, 0xd3, 0x4a, 0x19, 0x38, 0x87, 0x8d, 0x9a, 0xc3, 0x31, 0x62,
  0x1b, 0x70, 0x04, 0xad, 0xfa, 0xe8, 0x6c, 0xef, 0xbc, 0xec, 0x6f, 0xc1,
  0xff, 0xc1, 0xa1, 0x88, 0x7e, 0x44, 0x70, 0x51, 0x16, 0x16, 0xc8, 0x3c,
  0x99, 0x3c, 0x34, 0x49, 0x92, 0x05, 0x50, 0x5e, 0x4c, 0x3b, 0x2b, 0x6b,
  0x58, 0x6b, 0x22, 0x05, 0x0f, 0xd2, 0x88, 0x93, 0x78, 0x2c, 0x3f, 0xd1,
  0x3b, 0x5e, 0x2c, 0x67, 0x81, 0xb4, 0x3e, 0xc7, 0x8d, 0x8c, 0xda, 0xd9,
  0xec, 0x4e, 0x9c, 0xc8, 0xef, 0x90, 0x37, 0x71, 0x1d, 0x5f, 0xbf, 0x96,

  0x14, 0xf5, 0xaa, 0xe6, 0x13, 0x3c, 0x16, 0x93, 0x8d, 0x38, 0x73, 0x0f,
  0x2e, 0xc3, 0x61, 0x3e, 0x99, 0x94, 0x49, 0xd5, 0x14, 0x40, 0xc7, 0xf2,
  0xc8, 0xe6, 0x15, 0x01, 0x1c, 0x12, 0xa7, 0xd2, 0x8a, 0x9b, 0xa8, 0x0e,

  0xcb, 0x13, 0x49, 0x16, 0x1a, 0xb3, 0x2d, 0x1e, 0xae, 0x1f, 0x28, 0x32,
  0x70, 0x7f, 0xaf, 0x19, 0x22, 0x5c, 0x15, 0xaf, 0x60, 0x2f, 0x54, 0x6e,
  0xc5, 0x38, 0x2e, 0x22, 0xe9, 0x9a, 0xa8, 0x6c, 0x7a, 0x25, 0x6e, 0xd3,
  0xc5, 0x02, 0xcd, 0x1b, 0x46, 0x38, 0x23, 0xb2, 0x35, 0x01, 0x34, 0x8a,
  0xe3, 0x12, 0x29, 0x6b, 0xb6, 0x20, 0x28, 0xc9, 0x23, 0x91, 0xf9, 0xc3,
  0x64, 0xe2, 0x07, 0x81, 0x38, 0xa9, 0xd1, 0x85, 0xb5, 0x91, 0x1a, 0xdd,
  0x31, 0x42, 0xd8, 0x64, 0xb1, 0xb2, 0x98, 0x89, 0x03, 0xf8, 0x20, 0xc5,
  0x7f, 0xdd, 0xc0, 0xfd, 0xb7, 0xc5, 0x59, 0xc6, 0x0f, 0x37, 0x38, 0xfd,
  0x9f, 0x27, 0x16, 0x84, 0xc8, 0xa0, 0xfc, 0x70, 0xb9, 0x4b, 0xa8, 0x78,
  0x08, 0x6e, 0x61, 0xef, 0x18, 0xce, 0xab, 0x43, 0x53, 0xb1, 0xa9, 0x26,
  0x79, 0xa3, 0x1c, 0x83, 0xec, 0x1e, 0xd4, 0x24, 0x48, 0x1b, 0xda, 0xc4,
  0xba, 0x7f, 0x4f, 0x34, 0x30, 0x46, 0x25, 0xfb, 0x17, 0x65, 0x8d, 0x74,
  0x3b, 0x2a, 0xa9, 0x9a, 0x73, 0x6b, 0x4e, 0x44, 0x59, 0xdc, 0x4c, 0x33,
  0x54, 0x19, 0x59, 0x81, 0xf1, 0x4a, 0x32, 0xb4, 0x0e, 0x96, 0xd1, 0x4e,
  0x96, 0xd5, 0xef, 0x18, 0x3b, 0x29, 0x90, 0x7e, 0x09, 0xc6, 0xce, 0x21,
  0xea, 0x11, 0x13, 0x35, 0x62, 0x75, 0xf6, 0xfe, 0x0a, 0x56, 0xf6, 0xa1,
  0xba, 0x29, 0xda, 0x80, 0x01, 0xd4, 0xa9, 0x81, 0x45, 0x14, 0x64, 0x84,
  0x11, 0x6d, 0x18, 0x7c, 0x1a, 0xdd, 0x6a, 0x86, 0xd5, 0x89, 0x49, 0x97,
  0x21, 0x20, 0xd0, 0xe6, 0x9d, 0x9f, 0x10, 0xe8, 0x8d, 0x53, 0xfe, 0x6d,
  0x6a, 0x27, 0xfb, 0x18, 0xa5, 0x9a, 0xf1, 0x08, 0x25, 0x27, 0x56, 0xca,
  0x18, 0x6a, 0x34, 0xa4, 0x9e, 0xcc, 0x4d, 0xb3, 0x1e, 0x17, 0x57, 0xeb,
  0xb3, 0x14, 0x4c, 0x43, 0xd4, 0x36, 0x21, 0x47, 0x3e, 0x22, 0x36, 0xc3,
  0x2b, 0x49, 0xac, 0x20, 0xb5, 0x96, 0x3e, 0x1b, 0x72, 0xa3, 0xb3, 0x2f,
  0x92, 0x1c, 0x88, 0xfc, 0x71, 0x74, 0x90, 0xdd, 0x82, 0xee, 0x9c, 0x75,
  0xf1, 0xa7, 0x54, 0x88, 0x6a, 0x2e, 0x19, 0xfb, 0x36, 0xaa, 0x84, 0x83,
  0x16, 0x49, 0x40, 0x97, 0x75, 0x9e, 0x95, 0x47, 0x1d, 0x37, 0xca, 0x79,
  0x52, 0x49, 0xea, 0x08, 0x4f, 0x5e, 0x6b, 0xb3, 0xa8, 0xbe, 0xeb, 0x74,
  0xd2, 0x18, 0x8e, 0xe0, 0xe2, 0x92, 0xaa, 0x5e, 0xad, 0x2f, 0x31, 0x5c,
  0xc6, 0xc8, 0x42, 0x5f, 0x68, 0x17, 0xae, 0x41, 0x47, 0xfd, 0xb2, 0xbc,
  0x82, 0x70, 0xea, 0x82, 0x4e, 0x07, 0xdd, 0x44, 0xd5, 0x38, 0x44, 0x93,
  0xac, 0xfb, 0xea, 0x85, 0x14, 0xe8, 0x40, 0x37, 0x1d, 0x02, 0x41, 0xd0,
  0x28, 0x7a, 0x6f, 0xbf, 0xa6, 0x89, 0x2b, 0x81, 0xaa, 0x42, 0xa7, 0xaa,
  0x14, 0x53, 0x68, 0x8a, 0xb1, 0x7a, 0x46, 0x74, 0xa2, 0xc0, 0x85, 0xc5,
  0x2e, 0xba, 0x8f, 0x89, 0xd2, 0xcc, 0xf8, 0xa1, 0xda, 0x07, 0x27, 0xff,
  0xb1, 0x37, 0xb4, 0xe4, 0x6c, 0xe1, 0x73, 0x82, 0x69, 0x4a, 0xf2, 0x10,
  0xd2, 0x3c, 0x08, 0x96, 0xb5, 0xca, 0x29, 0x2e, 0x25, 0x44, 0x1a, 0xb3,
  0x29, 0xbc, 0x85, 0xf7, 0x37, 0xf9, 0x2c, 0x09, 0x85, 0x48, 0x9c, 0x92,
  0x5f, 0x02, 0x77, 0xc1, 0xb4, 0x5e, 0xf2, 0x36, 0xdf, 0x51, 0xc6, 0x70,
  0x2d, 0x74, 0x02, 0xfa, 0x5d, 0x12, 0x63, 0xc1, 0x91, 0x49, 0x9a, 0xbf,
  0xeb, 0x7a, 0x69, 0xec, 0x70, 0xcf, 0x87, 0x79, 0x69, 0xe8, 0x05, 0x0b,
  0x6b, 0x51, 0x82, 0xdc, 0xc7, 0x05, 0x31, 0x66, 0x41, 0xc9, 0x52, 0x00,
  0x51, 0x37, 0x67, 0x10, 0x55, 0xc1, 0x66, 0xbd, 0x43, 0x8a, 0xc5, 0xe8,
  0x40, 0x26, 0xa0, 0x00, 0xa0, 0x9b, 0x96, 0x68, 0x07, 0x87, 0x14, 0xfc,
  0xab, 0x1b, 0x82, 0xc2, 0x95, 0x8a, 0x75, 0xb8, 0x87, 0x37, 0x28, 0xd3,
  0xd3, 0x6a, 0x19, 0x57, 0xcf, 0x4b, 0xd8, 0x6e, 0xe3, 0x4d, 0xcc, 0x9c,
  0xdc, 0x7c, 0xd4, 0x36, 0xcc, 0x86, 0x96, 0x28, 0xa2, 0x7b, 0x90, 0x87,
  0x78, 0xd7, 0xfe, 0xeb, 0x09, 0xc6, 0x74, 0x49, 0x88, 0x7e, 0x37, 0x75,
  0x48, 0x28, 0xaa, 0xc9, 0x15, 0x79, 0xa2, 0x95, 0x6f, 0x3c, 0xa6, 0x8a,
  0xfb, 0xd3, 0x40, 0xa0, 0x9f, 0xa2, 0x63, 0x30, 0x9d, 0xd9, 0xa3, 0x1d,
  0xd0, 0x29, 0x99, 0xd5, 0x0c, 0x6f, 0x07, 0x2e, 0xcf, 0x7c, 0xc1, 0xcb,
  0x5a, 0xea, 0x0c, 0x40, 0x05, 0xe7, 0x6f, 0x1e, 0x74, 0x14, 0x7d, 0xd4,
  0xc0, 0x29, 0x09, 0x17, 0x91, 0xa2, 0x2d, 0xad, 0xff, 0x50, 0x5f, 0x3d,
  0x5e, 0xff, 0xe6, 0x70, 0x08, 0xc5, 0xbd, 0xfd, 0xfa, 0xbb, 0xa3, 0xb3,
  0x0f, 0x27, 0xdb, 0x5f, 0x44, 0xf8, 0xaf, 0x1d, 0xfe, 0xd7, 0x4e, 0x27,
  0x74, 0x5c, 0xc0, 0xa8, 0xd6, 0x5e, 0xaf, 0x45, 0xe5, 0xe3, 0x7c, 0x98,
  0xcf, 0xcc, 0x81, 0xc9, 0x56, 0x68, 0x20, 0xad, 0x2b, 0x52, 0xdc, 0x94,
  0x6e, 0x8b, 0xab, 0xbc, 0xc9, 0xb2, 0x4b, 0x49, 0x3a, 0x54, 0x76, 0x43,
  0x11, 0x3c, 0xb7, 0x96, 0xb8, 0xa2, 0x4a, 0x6b, 0xe5, 0x61, 0x12, 0xcb,
  0x6b, 0x4b, 0x04, 0x25, 0xa1, 0xa4, 0x17, 0xbb, 0x0c, 0x70, 0x0e, 0x16,
  0x2f, 0x16, 0xd2, 0xd9, 0x65, 0x18, 0x7e, 0xb6, 0x19, 0x70, 0x27, 0xba,
  0x52, 0x06, 0x77, 0x9a, 0x5f, 0x17, 0x03, 0x01, 0xd1, 0x38, 0x1e, 0x05,
  0x7f, 0x60, 0xad, 0x48, 0x0c, 0xeb, 0xa5, 0x55, 0xe3, 0xbb, 0xcd, 0xe1,

  0x86, 0xa2, 0xbb, 0x38, 0xd0, 0x5c, 0x67, 0x88, 0x06, 0xd6, 0xd3, 0xf4,
  0x0c, 0xeb, 0xea, 0x40, 0x63, 0x74, 0x8c, 0x9a, 0xb5, 0xfa, 0x33, 0x22,
  0x07, 0xfc, 0xd9, 0xc0, 0x48, 0x0a, 0x0e, 0x63, 0x54, 0x0b, 0x09, 0xb2,
  0xaf, 0xd9, 0x87, 0x5e, 0x61, 0x20, 0x18, 0xd8, 0x1c, 0x4a, 0x37, 0x99,
  0x7b, 0xd9, 0x59, 0x19, 0x68, 0x92, 0xeb, 0xc0, 0xde, 0x37, 0x5c, 0x4c,
  0x10, 0x3d, 0x3e, 0x71, 0x4b, 0x54, 0x26, 0xa2, 0xda, 0x12, 0x2b, 0xb8,
  0xbe, 0xa9, 0x09, 0x1a, 0x55, 0xf9, 0xb4, 0xc0, 0x99, 0xe3, 0xb3, 0x22,
  0x39, 0x78, 0x18, 0x26, 0x53, 0xcc, 0xde, 0x9c, 0xc5, 0x1e, 0x12, 0x0d,
  0xdd, 0x35, 0x85, 0xc3, 0xc0, 0x40, 0xbf, 0x21, 0x7c, 0xf8, 0xfe, 0xe3,
  0x2c, 0xd9, 0x50, 0xc3, 0x40, 0x85, 0xdd, 0xe6, 0xfb, 0xfc, 0xef, 0x30,
  0xef, 0x58, 0x3e, 0x12, 0x92, 0x99, 0x22, 0x02, 0x5b, 0x67, 0x6e, 0xf9,
  0x0b, 0x97, 0x89, 0xbb, 0x5c, 0xa3, 0x66, 0x1b, 0x53, 0x10, 0x18, 0xf5,
  0x32, 0x4a, 0xd5, 0xf6, 0x48, 0x47, 0xb4, 0x0b, 0x4f, 0x42, 0x3b, 0x78,
  0x33, 0x40, 0xca, 0xb9, 0x64, 0xe8, 0x18, 0x12, 0x13, 0xb1, 0xd3, 0x64,
  0xe1, 0x4d, 0x9d, 0xaa, 0x45, 0x10, 0x9d, 0x3c, 0x24, 0xc5, 0x08, 0xa1,
  0x26, 0x46, 0xa0, 0x97, 0x12, 0x3f, 0x9d, 0x88, 0x7b, 0x0a, 0x73, 0xa9,
  0x24, 0x2b, 0xbe, 0x8e, 0x0b, 0x43, 0xe2, 0x57, 0xe9, 0xac, 0x95, 0xc4,
  0x28, 0xf7, 0x61, 0x04, 0x84, 0xd1, 0x37, 0x10, 0x78, 0x2a, 0x20, 0xeb,

  0xec, 0x43, 0x8b, 0xcc, 0x28, 0x9c, 0xe0, 0x65, 0xec, 0xd1, 0x0e, 0xeb,

  0x8b, 0xce, 0x69, 0x0a, 0xb9, 0xd0, 0x5c, 0x18, 0xd0, 0xcc, 0x46, 0x87,
  0x10, 0x2a, 0x80, 0x70, 0xa1, 0xda, 0xd3, 0x13, 0xcd, 0xe9, 0x10, 0x7e,
  0x07, 0x45, 0x4b, 0xb2, 0x47, 0x45, 0x93, 0x5a, 0x27, 0xb1, 0xc9, 0xca,
  0xa1, 0x62, 0x0e, 0x92, 0xe6, 0xe5, 0x17, 0x23, 0xcf, 0xf2, 0x7b, 0x8c,
  0xc1, 0xd4, 0x11, 0x40, 0x15, 0xec, 0x87, 0x73, 0xea, 0x98, 0x2f, 0xf7,
  0x50, 0x57, 0xe2, 0xcf, 0xf6, 0x35, 0x5a, 0x1b, 0xa4, 0x00, 0x2d, 0xa7,
  0x6d, 0x56, 0x22, 0xc5, 0x36, 0x83, 0xa2, 0x62, 0x67, 0x32, 0xeb, 0x17,
  0x16, 0x80, 0x2b, 0x24, 0xd8, 0x68, 0xc5, 0xc3, 0xbc, 0xba, 0x71, 0xf2,
  0x50, 0x11, 0xd4, 0x0f, 0xfd, 0x3c, 0x93, 0x65, 0x45, 0x46, 0x80, 0x9a,
  0x81, 0x95, 0xa4, 0x1a, 0x8b, 0xb3, 0xc8, 0xcb, 0x7a, 0xb8, 0x45, 0xf0,
  0x37, 0x5c, 0xa2, 0x01, 0xb0, 0xc5, 0x04, 0xda, 0x8c, 0x32, 0xc5, 0x91,
  0x2e, 0xc1, 0x00, 0x26, 0x7c, 0x41, 0xf8, 0x26, 0x26, 0x2a, 0x95, 0x25,
  0x62, 0xc9, 0x51, 0x4a, 0x2a, 0x6c, 0xac, 0x07, 0x39, 0x41, 0x20, 0x49,
  0x99, 0x7b, 0xa4, 0xeb, 0x0c, 0x7f, 0x63, 0x81, 0x9b, 0x18, 0x17, 0x03,
  0xad, 0xf6, 0xa1, 0x1c, 0x4d, 0x49, 0xf7, 0x17, 0xe9, 0x21, 0xe0, 0x14,
  0x31, 0xfa, 0x6b, 0xcb, 0x85, 0xfd, 0x97, 0x8d, 0x1a, 0xcf, 0xc8, 0x2b,
  0x4a, 0x06, 0xd0, 0x25, 0x08, 0x62, 0x93, 0x18, 0x4f, 0xdb, 0xed, 0x33,
  0xae, 0xd8, 0xc6, 0xdf, 0x42, 0x71, 0xde, 0xe5, 0x62, 0x4c, 0x6a, 0x9f,
  0xbe, 0x43, 0x8a, 0x92, 0x03, 0x84, 0x59, 0xe6, 0x72, 0x1b, 0x69, 0x78,

  0x64, 0x32, 0x96, 0xcb, 0x84, 0x40, 0x72, 0x9a, 0xf7, 0xdf, 0x0d, 0xb0,
  0xd4, 0x90, 0xda, 0xd8, 0x87, 0x33, 0x77, 0x79, 0x03, 0xbc, 0x48, 0xc2,
  0xb7, 0x07, 0xb4, 0x5f, 0x86, 0x02, 0x95, 0x2a, 0xc0, 0x81, 0xc3, 0xff,
  0x75, 0x99, 0x8d, 0x1a, 0x32, 0x2a, 0xef, 0x3a, 0x78, 0x9c, 0x12, 0x95,
  0x35, 0x12, 0xa2, 0x49, 0xf4, 0xf4, 0x21, 0x81, 0xbf, 0xc1, 0x8a, 0x50,
  0xac, 0xde, 0x40, 0xf1, 0x36, 0x73, 0x4a, 0x68, 0x6f, 0x52, 0x38, 0xa1,
  0x62, 0x74, 0x43, 0x48, 0x02, 0xe4, 0x47, 0x4a, 0xd4, 0x39, 0xea, 0x29,
  0xc2, 0xe2, 0xf9, 0xa7, 0x61, 0x45, 0x17, 0x4b, 0x91, 0x1d, 0x21, 0x5a,
  0x48, 0x9e, 0x29, 0x93, 0x6e, 0x9b, 0xa7, 0x9f, 0xd9, 0x75, 0x83, 0x7b,
  0x9e, 0xcc, 0x4a, 0x2b, 0x20, 0xcd, 0x3b, 0x56, 0x52, 0x92, 0x11, 0x9e,
  0x91, 0x4f, 0x96, 0x45, 0x71, 0x1a, 0xbc, 0xe1, 0x34, 0x13, 0x50, 0x73,
  0x64, 0x32, 0x68, 0x57, 0x22, 0x9d, 0x3c, 0x2a, 0xc6, 0x8c, 0x8c, 0xd0,
  0x84, 0x99, 0xf1, 0x24, 0x4f, 0x6e, 0xf6, 0x4d, 0x00, 0x6c, 0x74, 0xab,
  0x52, 0xc5, 0x5b, 0x67, 0x52, 0x41, 0x47, 0x06, 0x96, 0x4f, 0x53, 0x1f,
  0x10, 0x8c, 0x7f, 0xf5, 0x7a, 0x93, 0xca, 0x4b, 0xd7, 0x72, 0xce, 0xba,
  0x4e, 0x02, 0xb3, 0x89, 0x60, 0xf4, 0xbc, 0x57, 0x34, 0xbe, 0x3b, 0xac,
  0xe1, 0x89, 0xce, 0xde, 0xb2, 0x17, 0xef, 0xf8, 0x0a, 0xff, 0x96, 0x1a,
  0x84, 0x22, 0xaa, 0xc3, 0xa5, 0xc6, 0x1e, 0x9c, 0x20, 0xfb, 0xfe, 0xbb,
  0x66, 0x19, 0xe6, 0xfa, 0xc5, 0x60, 0x73, 0xf7, 0xd5, 0xd6, 0x46, 0x20,
  0x67, 0x19, 0xbe, 0xe1, 0xe2, 0x14, 0xee, 0x6d, 0xf5, 0xb7, 0x36, 0x1a,
  0xb3, 0xc1, 0xed, 0x5e, 0x01, 0xa0, 0xa2, 0xe8, 0xea, 0x46, 0x68, 0x50,
  0x32, 0xb2, 0x2d, 0xd6, 0x92, 0xbc, 0x69, 0xb7, 0x98, 0xf4, 0x2a, 0xb9,
  0x03, 0x52, 0x0b, 0xe6, 0xaf, 0x9d, 0xa5, 0xa5, 0x18, 0x36, 0x28, 0xc9,
  0x54, 0xb6, 0x60, 0xb5, 0x76, 0x3d, 0x27, 0x98, 0x1e, 0x41, 0x61, 0xc9,
  0xb9, 0x0e, 0x81, 0x68, 0x4b, 0x09, 0x93, 0x2a, 0x28, 0x31, 0x8f, 0x62,
  0xfa, 0x9f, 0xdc, 0xd9, 0x72, 0x54, 0x43, 0x7b, 0x7c, 0xe9, 0x9e, 0x29,
  0x6a, 0xfa, 0xbd, 0xb8, 0x1c, 0xa5, 0x29, 0xdb, 0x33, 0x2d, 0x66, 0x8c,
  0x66, 0x3c, 0x12, 0x86, 0x1c, 0x55, 0x52, 0xa7, 0x31, 0x87, 0x6a, 0x2d,
  0x50, 0xa9, 0x37, 0x2c, 0x2a, 0xab, 0x40, 0x62, 0xab, 0xc6, 0x15, 0x1b,
  0x1e, 0x9b, 0xb5, 0x08, 0xb6, 0xb2, 0xd1, 0x2f, 0xcb, 0xa6, 0x1a, 0x05,
  0x77, 0x81, 0xe1, 0xca, 0x16, 0x85, 0x5f, 0xdf, 0x87, 0xb9, 0x99, 0x94,
  0xf1, 0x1c, 0x57, 0x65, 0x8e, 0xfb, 0x14, 0xda, 0x54, 0xf2, 0x50, 0x10,
  0x3a, 0xad, 0x31, 0xa0, 0xcc, 0xdd, 0x97, 0x7c, 0xa0, 0xaf, 0xba, 0x36,
  0x5d, 0xa7, 0x66, 0x00, 0xc5, 0x01, 0x45, 0x90, 0xc1, 0xf5, 0x23, 0x0a,
  0x8f, 0x73, 0x25, 0x15, 0x2e, 0x44, 0x5a, 0x4c, 0x90, 0xdb, 0x83, 0x73,

  0x44, 0xa4, 0xc1, 0x04, 0xc2, 0x10, 0x99, 0xdd, 0x0a, 0x80, 0x4b, 0x75,
  0x61, 0x7d, 0x04, 0xdd, 0x49, 0x14, 0x94, 0x25, 0xf7, 0xc8, 0x8d, 0x4b,
  0x51, 0x25, 0x8a, 0x22, 0x45, 0xbf, 0x91, 0x49, 0x2e, 0x60, 0x75, 0x0c,
  0xb3, 0x30, 0x51, 0x38, 0x8f, 0x03, 0xb5, 0xdd, 0x23, 0xba, 0x9d, 0xa5,

  0xc9, 0xd9, 0xce, 0x08, 0x7e, 0x12, 0xf1, 0xe5, 0xbc, 0xbd, 0xa1, 0xfe,
  0x00, 0x34, 0x39, 0x05, 0x9d, 0xad, 0xea, 0xe9, 0x1f, 0xa8, 0xb5, 0x73,
  0x7e, 0x33, 0xc3, 0x9b, 0xe5, 0x35, 0x03, 0xb3, 0x6c, 0x0f, 0x97, 0x6c,
  0x3e, 0xf4, 0xee, 0xef, 0xef, 0x7b, 0x78, 0xe1, 0x30, 0x27, 0x47, 0xca,
  0x2c, 0xfa, 0x35, 0xf0, 0x68, 0xb2, 0x2b, 0xd9, 0xe4, 0x44, 0x26, 0xe2,
  0xc7, 0x37, 0x9c, 0x14, 0xa9, 0x62, 0x98, 0x56, 0x54, 0xcf, 0x27, 0xc4,
  0x45, 0xaf, 0x49, 0x5d, 0x9d, 0x4c, 0x87, 0x34, 0x1c, 0x75, 0x44, 0x05,
  0x6e, 0x9f, 0x5d, 0x0b, 0xc2, 0x4f, 0x8d, 0xaa, 0x04, 0xeb, 0xd7, 0xe1,
  0x13, 0xf3, 0x83, 0xa8, 0xf7, 0x2e, 0xea, 0x1c, 0xcb, 0x6a, 0xaf, 0xe1,
  0x89, 0x83, 0xfa, 0x5a, 0xf8, 0x61, 0x3f, 0x98, 0x03, 0xef, 0x76, 0x9e,

  0x07, 0x9f, 0xd8, 0x7a, 0x91, 0xa9, 0xbb, 0x8a, 0xcd, 0x9a, 0xa9, 0x02,
  0xce, 0x3a, 0x4c, 0x7b, 0x61, 0xb7, 0x16, 0x63, 0x9e, 0xd1, 0xd2, 0xe3,
  0x52, 0x3a, 0xf1, 0x0c, 0xf9, 0x86, 0xaf, 0xb8, 0x8e, 0x45, 0x7c, 0xff,
  0xf4, 0x1d, 0x77, 0x6e, 0xa2, 0x50, 0xef, 0x8c, 0x5c, 0x5d, 0x0e, 0x1e,
  0x31, 0xfa, 0x77, 0x4c, 0x12, 0x66, 0x60, 0xa6, 0xd2, 0x07, 0xc3, 0x16,
  0x53, 0xb1, 0x61, 0x2a, 0x7a, 0xe9, 0x57, 0x2b, 0xea, 0xd0, 0xac, 0x53,
  0xd8, 0xae, 0xa2, 0x16, 0xf9, 0x68, 0xc0, 0x9a, 0xd2, 0xb2, 0x0c, 0x55,
  0x3d, 0x83, 0xd1, 0xd8, 0xd5, 0x75, 0xcd, 0xe5, 0x14, 0x5a, 0x66, 0xc7,
  0x9e, 0xb3, 0x4c, 0x41, 0xc0, 0x0d, 0xa5, 0x77, 0x72, 0x9c, 0x03, 0xaf,
  0xaa, 0x02, 0x94, 0x89, 0xcb, 0x2a, 0x29, 0x90, 0xd0, 0x29, 0x0b, 0xbe,

  0xa7, 0x29, 0xcc, 0x21, 0x61, 0x0d, 0x0c, 0xe5, 0xf8, 0x9b, 0x53, 0xca,
  0xe6, 0x06, 0x46, 0x9a, 0x09, 0x88, 0x03, 0xcf, 0x9f, 0x5b, 0x1e, 0x19,
  0xa3, 0x76, 0x8a, 0xac, 0x84, 0x4b, 0x22, 0xe3, 0x28, 0x04, 0x80, 0xaa,
  0x36, 0x47, 0xa4, 0xc6, 0x85, 0x24, 0xad, 0x8a, 0x8d, 0x20, 0x97, 0xd7,
  0x84, 0x77, 0x63, 0x5b, 0x22, 0x10, 0xdc, 0x2f, 0xfa, 0xba, 0x82, 0x8d,
  0xc4, 0xa5, 0x44, 0x70, 0x49, 0x59, 0xf3, 0xd2, 0xc7, 0x2d, 0xbd, 0x72,
  0x0b, 0xa9, 0xc4, 0xcf, 0x7b, 0x93, 0xcf, 0x87, 0x3b, 0xbc, 0xd1, 0x99,
  0x34, 0x3c, 0x29, 0x66, 0xeb, 0x12, 0xd7, 0x63, 0xc0, 0xb5, 0x58, 0xe8,

  0x4b, 0x0b, 0x79, 0x6e, 0x4d, 0x62, 0x24, 0x30, 0xe3, 0xff, 0x40, 0x09,
  0x45, 0x72, 0x17, 0x78, 0x1e, 0x6a, 0x1e, 0x5a, 0x2f, 0xe9, 0x8e, 0xa6,
  0x50, 0x7e, 0x92, 0x10, 0x1b, 0x1e, 0x0e, 0xed, 0xbf, 0xd7, 0xa8, 0x2d,
  0x7d, 0x25, 0x8e, 0x2a, 0xcc, 0x83, 0x2f, 0x1d, 0x6b, 0x44, 0x8a, 0x65,
  0x69, 0xee, 0x5a, 0x23, 0x84, 0xdb, 0x10, 0x1e, 0x8e, 0x23, 0x9c, 0xce,
  0xee, 0x31, 0xc5, 0x21, 0xec, 0x7c, 0xc9, 0x6d, 0xc4, 0xfe, 0xd0, 0xdc,




  0xbc, 0xd7, 0x4f, 0xef, 0xde, 0x2f, 0xdd, 0xbe, 0xd5, 0xbb, 0xc7, 0xed,

  0x1b, 0x34, 0x59, 0xf6, 0xb5, 0xe3, 0xa0, 0xa3, 0x64, 0x0f, 0xb6, 0xbe,





  0x8c, 0xa3, 0xae, 0xce, 0x65, 0x1c, 0x23, 0xf3, 0xf5, 0x6f, 0x75, 0xea,

  0x44, 0x8c, 0x64, 0xd1, 0xe3, 0xe4, 0xc3, 0xc3, 0x71, 0x58, 0x91, 0xce,


  0xde, 0xc5, 0x5e, 0x14, 0x3d, 0x9c, 0x46, 0x10, 0xfc, 0xe2, 0x51, 0xc5,
  0xc4, 0x3c, 0xa4, 0x34, 0xcf, 0x5e, 0x78, 0x38, 0x2d, 0x04, 0x14, 0x45,
  0xdc, 0x5b, 0xdf, 0x57, 0x2a, 0xf8, 0x9f, 0xbf, 0x38, 0x4a, 0x2b, 0xb2,
  0x2d, 0x03, 0xdd, 0x8c, 0x10, 0x0e, 0xc1, 0xac, 0xfb, 0x7e, 0x43, 0xbd,
  0x3e, 0x02, 0x03, 0xc9, 0x2d, 0xa4, 0x54, 0x25, 0xd8, 0xe8, 0xd6, 0x37,
  0x0c, 0xa1, 0xee, 0x48, 0x18, 0xe8, 0x29, 0xa7, 0xad, 0x67, 0xac, 0x67,
  0x87, 0x6d, 0x19, 0x82, 0x67, 0xf7, 0x7f, 0xd3, 0xfa, 0x88, 0x9e, 0x2d,
  0x19, 0x60, 0x84, 0xa1, 0x64, 0x0c, 0x6f, 0x4a, 0xba, 0x8f, 0xa8, 0x5a,
  0x01, 0x45, 0x7c, 0xcb, 0xec, 0x08, 0x7d, 0x00, 0x95, 0x22, 0x8c, 0xb7,
  0xce, 0x04, 0x2e, 0x94, 0x61, 0xde, 0x5f, 0x5b, 0x65, 0xa6, 0x87, 0x8b,
  0xec, 0x09, 0xc9, 0xf6, 0x89, 0x08, 0x57, 0x50, 0xaa, 0xa1, 0xcc, 0x30,
  0x51, 0x7a, 0xe4, 0xd7, 0x2e, 0x1a, 0x15, 0x5f, 0x55, 0x64, 0x7b, 0x4d,
  0x52, 0x6e, 0x7f, 0x5e, 0x93, 0x94, 0xf6, 0x9d, 0x55, 0x32, 0x72, 0x90,
  0x70, 0x42, 0x9a, 0xeb, 0xc0, 0xa4, 0x97, 0xb8, 0xca, 0x1a, 0x1b, 0x79,
  0xf8, 0xa9, 0x4d, 0xf8, 0xaa, 0x57, 0x74, 0xcc, 0xb9, 0x45, 0x4e, 0xed,
  0x24, 0x25, 0x98, 0x63, 0xd4, 0x4c, 0xac, 0xa3, 0x68, 0x58, 0xe4, 0xf7,

  0x25, 0xa9, 0xa3, 0x6a, 0xa0, 0xc6, 0x9c, 0x02, 0x7b, 0xe3, 0x95, 0x44,
  0xc3, 0xf6, 0xce, 0x0c, 0x0e, 0xec, 0xbb, 0xeb, 0xf7, 0x67, 0xdc, 0xd8,
  0x81, 0xab, 0x73, 0xb1, 0x08, 0x49, 0xe6, 0xbc, 0x1c, 0xce, 0xc1, 0x92,
  0x06, 0xed, 0xa4, 0x62, 0x56, 0xa6, 0xdc, 0xd1, 0x2b, 0x21, 0xa6, 0x90,
  0x9e, 0x04, 0x84, 0x17, 0xa1, 0xf8, 0x8c, 0x28, 0x92, 0x0e, 0x0e, 0x95,
  0xa3, 0x01, 0xff, 0x72, 0x5d, 0x17, 0xec, 0x64, 0xca, 0x88, 0x21, 0x3d,
  0xea, 0x2d, 0x1e, 0x05, 0x3e, 0xe2, 0xdd, 0x3e, 0x47, 0x4d, 0xa3, 0xfe,
  0x63, 0x04, 0x29, 0x6d, 0x3c, 0x34, 0xa8, 0x75, 0x99, 0xe6, 0x23, 0x84,
  0x9a, 0x15, 0xd7, 0x35, 0x2d, 0xaf, 0xac, 0xd6, 0x68, 0x5e, 0xb6, 0x8d,
  0x88, 0xab, 0x7c, 0xa1, 0x1e, 0x82, 0xfa, 0x90, 0x04, 0x92, 0x96, 0x05,
  0x3a, 0xf3, 0x58, 0xab, 0xee, 0x06, 0x72, 0xee, 0x45, 0x21, 0x51, 0x6f,
  0xbe, 0x09, 0x6d, 0xd6, 0x4c, 0x3d, 0xed, 0x97, 0x80, 0x63, 0x3b, 0x37,
  0x38, 0xa0, 0x24, 0x32, 0x42, 0x15, 0x15, 0x53, 0xd0, 0x69, 0x02, 0xb1,
  0xc1, 0xe8, 0xd4, 0x0e, 0x2c, 0x26, 0xe7, 0xb8, 0xa7, 0xde, 0x05, 0x15,
  0x6c, 0xdb, 0x4c, 0xa4, 0xb4, 0xfd, 0x23, 0xd4, 0x5e, 0x26, 0xa0, 0x2e,
  0x82, 0xe6, 0xa2, 0x06, 0x12, 0x79, 0xdd, 0xdf, 0xe5, 0xfb, 0x1f, 0xc5,
  0xff, 0xd5, 0x75, 0xc2, 0x6b, 0x29, 0x7a, 0xa0, 0xdc, 0x78, 0xa1, 0x8d,
  0xac, 0xcf, 0x93, 0x62, 0xca, 0x65, 0x08, 0x0c, 0x09, 0x1b, 0x44, 0xb1,
  0x88, 0x23, 0x07, 0xa5, 0x2d, 0x8a, 0xfe, 0x47, 0x8f, 0x25, 0x2a, 0xb9,
  0xaa, 0x96, 0x58, 0xff, 0x22, 0xfe, 0xf4, 0xb5, 0xde, 0x98, 0xd9, 0xca,
  0x38, 0xce, 0x60, 0x27, 0xe0, 0xc6, 0xfa, 0xf9, 0x31, 0xb3, 0xd9, 0xeb,
  0x59, 0xbe, 0x2c, 0x1f, 0xd7, 0x22, 0xe9, 0xe5, 0x23, 0xed, 0x2f, 0x2a,
  0xc9, 0xe5, 0xc1, 0xb3, 0x84, 0xf3, 0x5d, 0x66, 0xb7, 0x2a, 0x14, 0xb1,
  0x52, 0xa1, 0x64, 0x47, 0x6d, 0x63, 0xb8, 0x35, 0xe7, 0x63, 0xff, 0xc3,
  0x1d, 0x3b, 0xb8, 0xcb, 0xe4, 0xfe, 0x67, 0xc3, 0xf9, 0x79, 0x96, 0xb3,
  0x0d, 0xc9, 0x84, 0xcc, 0xe6, 0xa8, 0x16, 0xa9, 0x33, 0x03, 0xa2, 0xf0,
  0x60, 0x18, 0x5e, 0x0d, 0x39, 0xd8, 0xd4, 0x0d, 0xe2, 0x37, 0x2d, 0xc5,
  0x27, 0x56, 0xf2, 0x70, 0x40, 0xc9, 0x22, 0xe7, 0x31, 0x84, 0x89, 0xe9,
  0x7d, 0xe3, 0x96, 0xc0, 0xf5, 0xa3, 0x4b, 0xd8, 0x2f, 0x0f, 0x6a, 0x02,
  0x23, 0xd9, 0x66, 0xb8, 0xb8, 0x06, 0x7a, 0x3a, 0xc9, 0xf3, 0x61, 0x5c,
  0xac, 0xc9, 0xde, 0x13, 0xaa, 0x3a, 0x0c, 0x38, 0x66, 0xe7, 0x0b, 0x9e,
  0x75, 0x6f, 0xdc, 0x0d, 0xde, 0x68, 0xd4, 0x19, 0xe8, 0xdd, 0xbe, 0x16,
  0x75, 0xe8, 0xcf, 0x31, 0x40, 0x9e, 0xcf, 0xc6, 0x66, 0x2b, 0xdc, 0xaf,
  0x06, 0x0e, 0x8d, 0x6a, 0x13, 0xac, 0x2b, 0x40, 0x3d, 0x01, 0x54, 0xde,
  0xa2, 0xce, 0x02, 0xe3, 0xd4, 0x47, 0x14, 0x77, 0x84, 0x0d, 0xc1, 0xc4,
  0x89, 0x30, 0x6c, 0x8b, 0x04, 0x49, 0x8c, 0x09, 0xee, 0x30, 0x07, 0x9c,
  0x51, 0x88, 0xc7, 0x58, 0x9e, 0xe2, 0x3b, 0xdc, 0x5d, 0xf6, 0x25, 0xd9,


  0xaa, 0x2b, 0x32, 0xdd, 0x5c, 0xae, 0xe1, 0xc8, 0x31, 0x6b, 0xcc, 0x35,

  0x85, 0xdb, 0x0a, 0xd7, 0xae, 0xc5, 0xc5, 0x25, 0xf6, 0x2a, 0xfc, 0x95,
  0x9d, 0x20, 0xbd, 0x53, 0xcd, 0xa2, 0xe3, 0x7f, 0x5e, 0x13, 0x62, 0x33,
  0x39, 0x27, 0x7b, 0x01, 0xd2, 0xac, 0x59, 0x97, 0xc9, 0x2c, 0x99, 0xf2,
  0x6a, 0x0f, 0xcf, 0x4e, 0xbe, 0x3b, 0x39, 0xf3, 0xc4, 0xe6, 0x37, 0x83,
  0xc1, 0xe6, 0x6d, 0x52, 0x0c, 0xa9, 0x29, 0x2b, 0x06, 0x2e, 0x22, 0x7a,

  0xce, 0x24, 0x78, 0x39, 0xb2, 0xe4, 0xde, 0x42, 0xb6, 0x48, 0xa2, 0xb7,
  0xe7, 0xb3, 0xc1, 0x0c, 0x5e, 0xfe, 0xa4, 0xc0, 0xbc, 0x53, 0xc9, 0x91,
  0xe4, 0x12, 0x92, 0x6c, 0x1c, 0x15, 0xc9, 0x98, 0x7b, 0x96, 0xfa, 0x59,
  0x84, 0x84, 0xec, 0x81, 0x7d, 0x39, 0xf0, 0x50, 0x39, 0x93, 0x9c, 0x02,
  0x58, 0x66, 0x11, 0xde, 0x1b, 0x0b, 0xaa, 0x9e, 0x8f, 0xde, 0xc8, 0x37,
  0xa5, 0x1e, 0x15, 0x77, 0x89, 0x81, 0xdd, 0xd8, 0x4a, 0xb9, 0xf8, 0xb6,
  0x77, 0x34, 0xe8, 0xbd, 0x39, 0x39, 0x3b, 0xf9, 0xe6, 0xe8, 0xfa, 0xc4,
  0xe0, 0x99, 0x97, 0x49, 0x8b, 0x0a, 0x26, 0xfa, 0xd7, 0xb7, 0xb2, 0x2d,
  0xb4, 0x7e, 0xc4, 0xc2, 0xaf, 0x52, 0x6e, 0xc8, 0xa2, 0x90, 0xff, 0xdc,
  0x59, 0x1b, 0xad, 0xa2, 0x8a, 0xf3, 0x04, 0xc3, 0xc3, 0xc1, 0xbd, 0x98,
  0xcd, 0x65, 0xaa, 0xde, 0x0a, 0xe2, 0xd9, 0x3d, 0x36, 0x66, 0xfb, 0x90,
  0x61, 0x2a, 0x7d, 0x6a, 0x4a, 0x49, 0x79, 0xf5, 0xae, 0x47, 0xc8, 0xee,
  0x6c, 0xed, 0x80, 0x09, 0x99, 0xbe, 0xc5, 0x5f, 0xa0, 0x65, 0xe0, 0x14,
  0x3f, 0x7e, 0x43, 0x4f, 0x36, 0x30, 0xc6, 0x2d, 0x34, 0x3a, 0x32, 0x18,

  0xf9, 0x55, 0x00, 0xb0, 0x04, 0x09, 0xa8, 0x1c, 0xdd, 0x24, 0x73, 0x51,
  0x65, 0x31, 0x35, 0x81, 0x82, 0xe0, 0x5c, 0x53, 0x29, 0x78, 0x41, 0x9c,
  0x42, 0x36, 0x4c, 0x18, 0x72, 0x81, 0x30, 0xd2, 0x90, 0xae, 0x43, 0xa9,
  0xbe, 0xf7, 0xd8, 0x71, 0x00, 0x63, 0x2d, 0x98, 0xb6, 0x43, 0x05, 0xc6,
  0x7d, 0x4a, 0x30, 0x74, 0xf2, 0x06, 0xfc, 0x3c, 0x01, 0xee, 0x1e, 0xd8,
  0xbc, 0xb3, 0x06, 0xc0, 0xdc, 0xa0, 0xad, 0xe7, 0xe4, 0x3a, 0xa3, 0x1f,
  0x71, 0xf3, 0x12, 0xd1, 0xb9, 0x71, 0x92, 0xbf, 0xd2, 0x51, 0x2d, 0xe5,
  0x09, 0x52, 0x6e, 0x88, 0x6e, 0x2c, 0x32, 0x83, 0xc3, 0x59, 0xdb, 0x41,
  0xa6, 0x21, 0xdd, 0x58, 0x9d, 0xe9, 0x32, 0x7b, 0x60, 0x68, 0xf5, 0xb1,
  0x9c, 0x0e, 0xfd, 0x48, 0x1a, 0x11, 0x98, 0x14, 0x8f, 0xa0, 0x2b, 0xdf,
  0x72, 0x8c, 0x7a, 0xaf, 0x02, 0xc4, 0x88, 0xd7, 0xbf, 0xfa, 0x1d, 0x25,
  0x4c, 0xa9, 0x5d, 0x2f, 0x59, 0x78, 0x80, 0xdd, 0xeb, 0x6f, 0x15, 0x7f,
  0xdf, 0xe8, 0x96, 0x6e, 0xaf, 0x35, 0xa7, 0x35, 0xd2, 0xc9, 0xe5, 0x15,
  0x77, 0x57, 0x3f, 0xc3, 0xbf, 0x48, 0xe4, 0xad, 0x0c, 0xe1, 0xdf, 0x49,
  0xf7, 0x0f, 0x4c, 0x46, 0x49, 0x28, 0x74, 0x63, 0x82, 0xe9, 0x9a, 0x8c,
  0xc8, 0xf9, 0xa7, 0x02, 0xb4, 0x2e, 0xd7, 0x81, 0xb6, 0xd8, 0x4b, 0xfe,
  0x37, 0x0d, 0x3a, 0x71, 0x26, 0x38, 0x05, 0x41, 0x28, 0xa2, 0x49, 0x70,
  0x0e, 0xad, 0x06, 0x48, 0x2e, 0xf0, 0x97, 0xa8, 0x6f, 0xb2, 0x5c, 0xab,
  0xda, 0x38, 0x2f, 0xb7, 0x40, 0x10, 0x95, 0x08, 0x87, 0xc5, 0x37, 0xa3,
  0x82, 0xda, 0xb9, 0xc6, 0x30, 0x95, 0x7e, 0x63, 0xa9, 0xd4, 0x90, 0x0b,

  0x61, 0x37, 0xfd, 0x78, 0x08, 0xb5, 0x22, 0x13, 0x47, 0x9c, 0x64, 0xa5,
  0xd3, 0x82, 0x35, 0xd7, 0xbe, 0x2b, 0x39, 0x06, 0x68, 0x41, 0x50, 0xdb,
  0x21, 0xae, 0x17, 0xa0, 0xe4, 0x03, 0x4f, 0xc3, 0x97, 0x9a, 0x04, 0xcd,
  0x44, 0x4b, 0x1e, 0x25, 0x6c, 0xce, 0x0a, 0xe1, 0x44, 0xc2, 0x93, 0x31,
  0x01, 0xca, 0x92, 0x69, 0x33, 0x64, 0x0d, 0x86, 0xb2, 0xfa, 0x6e, 0xe2,

  0x2c, 0x70, 0xe7, 0x60, 0xe3, 0x4d, 0x4f, 0x34, 0x5a, 0xa5, 0x1c, 0x5b,
  0x40, 0x89, 0x47, 0xda, 0x68, 0xc2, 0x5a, 0x81, 0xa1, 0x07, 0x0c, 0x2c,
  0xc5, 0xb8, 0x86, 0x4c, 0x85, 0x77, 0x86, 0x1a, 0x03, 0x09, 0xbd, 0xe5,
  0x21, 0xaa, 0x12, 0xe6, 0x62, 0xa3, 0x2d, 0x35, 0x12, 0x6c, 0x2f, 0xfa,
  0x36, 0x9e, 0x79, 0xaa, 0xb0, 0x71, 0x50, 0x75, 0xb1, 0xc7, 0x70, 0xbd,

  0x04, 0x87, 0x8e, 0x8f, 0x84, 0x7d, 0xd6, 0xcc, 0x40, 0x49, 0xb8, 0xe8,
  0x02, 0xbe, 0x4d, 0xd3, 0x45, 0x37, 0x90, 0x89, 0xc8, 0x22, 0xf1, 0x78,

  0xdf, 0x7f, 0x43, 0x93, 0xc3, 0xef, 0xd0, 0x0b, 0x74, 0xef, 0x11, 0x7a,
  0x68, 0xaa, 0x3d, 0x9e, 0x98, 0x94, 0x87, 0x09, 0x7c, 0x2f, 0xc5, 0x1e,
  0x78, 0x6e, 0x18, 0xc0, 0x4f, 0x73, 0x2e, 0x81, 0x00, 0xa9, 0x2a, 0x20,
  0x67, 0x07, 0x10, 0xbe, 0x8b, 0xb9, 0x14, 0x49, 0xe4, 0x36, 0x90, 0x24,
  0x82, 0x20, 0x8b, 0xe1, 0xb2, 0x2b, 0xf1, 0x4c, 0x4a, 0x6f, 0xcc, 0x0b,
  0xbf, 0x04, 0x76, 0x64, 0xb0, 0x96, 0xf4, 0xc9, 0xb8, 0xbc, 0x0b, 0xdf,
  0xf0, 0xf2, 0x2e, 0x78, 0xc3, 0x9f, 0x71, 0xcf, 0xad, 0xbd, 0x75, 0x72,

  0x39, 0xf8, 0x2e, 0x6a, 0x01, 0x8d, 0xe0, 0x4e, 0x2e, 0x7c, 0xc5, 0xed,
  0xea, 0x90, 0xe8, 0xdd, 0x6b, 0xde, 0x7e, 0xcf, 0x83, 0xf1, 0x01, 0xef,
  0x9e, 0xc3, 0xf7, 0xe5, 0x72, 0x5f, 0x1e, 0x0d, 0xbe, 0x73, 0xae, 0xb5,
  0x43, 0x02, 0xa1, 0x62, 0x4c, 0x93, 0xd9, 0x8e, 0x41, 0x62, 0x26, 0x1d,

  0x1c, 0x2c, 0x48, 0xef, 0xe5, 0xdd, 0x73, 0xe8, 0x1d, 0x66, 0xe2, 0xd1,
  0xbb, 0xb7, 0xc7, 0xab, 0xe8, 0xdd, 0x3d, 0xa8, 0x7a, 0xd2, 0xac, 0x43,
  0xed, 0x19, 0x77, 0xd1, 0xc6, 0x02, 0x8f, 0x36, 0x32, 0xc7, 0x40, 0xa2,
  0x90, 0xb6, 0x9f, 0x4a, 0x48, 0xf3, 0xfc, 0x65, 0x84, 0x0e, 0x2f, 0x78,
  0x84, 0xae, 0xe7, 0x19, 0xa6, 0xf4, 0x36, 0x42, 0xd7, 0x94, 0xe2, 0x84,
  0x89, 0xdc, 0xa5, 0x71, 0x9f, 0xbe, 0x1d, 0xaa, 0x75, 0xcb, 0xc0, 0xfd,
  0x1d, 0xd2, 0x4c, 0x33, 0x0b, 0x65, 0x60, 0x81, 0x1c, 0x02, 0xe0, 0x22,
  0x0a, 0xca, 0xc0, 0x05, 0xb1, 0xbe, 0x3b, 0xdf, 0x94, 0xe6, 0xd7, 0xaa,


  0x1f, 0x0a, 0xd5, 0xb0, 0xb9, 0xb1, 0x1a, 0x0a, 0x6d, 0x72, 0x0f, 0xb8,

  0x80, 0x02, 0x13, 0xef, 0x46, 0xd6, 0xd0, 0x83, 0x92, 0x60, 0x75, 0x7a,
  0x99, 0x60, 0x9e, 0x07, 0xc1, 0x90, 0x35, 0xef, 0x29, 0xaa, 0x79, 0xa4,
  0x0d, 0xa0, 0xa2, 0xd2, 0x4b, 0xb3, 0x9e, 0x9f, 0x06, 0xed, 0x86, 0xb6,
  0xaa, 0x1a, 0x36, 0x2d, 0x96, 0x28, 0x92, 0xc2, 0x2b, 0x41, 0x0e, 0x54,
  0x46, 0xc9, 0xd2, 0x94, 0x98, 0x00, 0x7b, 0x25, 0x03, 0x05, 0xb5, 0x41,

  0x84, 0xb5, 0x7a, 0xbb, 0x97, 0x2a, 0xaf, 0x39, 0xe3, 0x5e, 0x34, 0x50,
  0x8c, 0xc7, 0x59, 0xd9, 0xb3, 0x1d, 0xda, 0x0f, 0xcd, 0x5f, 0x3d, 0xfb,
  0xe2, 0xcd, 0xf9, 0x00, 0x23, 0x57, 0x09, 0xd5, 0x1a, 0xa8, 0x19, 0x5c,
  0x26, 0x5c, 0x1f, 0x32, 0x25, 0xce, 0x01, 0x8f, 0x98, 0x82, 0x3f, 0xd3,

  0x14, 0xf1, 0x30, 0xe8, 0x10, 0xa2, 0x4f, 0x78, 0x85, 0x7a, 0x31, 0x17,
  0xdc, 0x80, 0x6d, 0x47, 0x71, 0x71, 0x5c, 0x81, 0x9d, 0x9b, 0x56, 0xb4,
  0x93, 0xe7, 0x29, 0x80, 0x71, 0xa4, 0x65, 0x79, 0x38, 0x8d, 0x0d, 0x6d,
  0xcf, 0xbc, 0x60, 0x44, 0x76, 0xc1, 0x20, 0x33, 0x1d, 0xae, 0xb2, 0x46,
  0x57, 0xfa, 0xe6, 0x62, 0x05, 0x33, 0x49, 0x72, 0xc6, 0x36, 0x56, 0x1a,
  0x8f, 0xb8, 0x81, 0x8b, 0xbb, 0xbd, 0x1e, 0x3e, 0x2c, 0xe9, 0x87, 0xe6,
  0xa7, 0x2f, 0xe8, 0xa7, 0x7d, 0x6f, 0xa3, 0xbd, 0x12, 0x1a, 0xe9, 0xa0,
  0x6a, 0xd0, 0x71, 0x31, 0xbb, 0x31, 0x1b, 0x63, 0xe7, 0x0d, 0x3a, 0x7b,
  0x6d, 0xa4, 0x80, 0x68, 0x89, 0x8c, 0x79, 0x68, 0x9b, 0xb7, 0x45, 0x1e,

  0x4e, 0x0b, 0xe8, 0x36, 0x65, 0xed, 0xd0, 0x77, 0x77, 0x03, 0x87, 0x6e,
  0xe6, 0x7c, 0x28, 0xcb, 0x0c, 0x1f, 0x79, 0x4d, 0xba, 0x0c, 0x53, 0xee,
  0x6f, 0x75, 0x98, 0x2e, 0x7a, 0xfa, 0x16, 0x0b, 0x8f, 0x79, 0x7c, 0x2b,
  0x22, 0x7d, 0x4f, 0xe8, 0xa0, 0xe7, 0xc1, 0xac, 0x70, 0xbb, 0x65, 0xea,

  0x4a, 0x6d, 0xd7, 0x59, 0x23, 0x1a, 0xd1, 0xb7, 0x2a, 0x03, 0xda, 0x8a,
  0x44, 0xc1, 0xdf, 0x09, 0xd5, 0x7c, 0x69, 0x76, 0xb6, 0xeb, 0xe3, 0xd1,
  0xfa, 0x0e, 0x9a, 0x89, 0x79, 0xf7, 0x89, 0xf3, 0xb3, 0x44, 0xb6, 0xfa,
  0xfc, 0x74, 0xcf, 0xfe, 0xf7, 0x38, 0xbf, 0x17, 0x9f, 0xe4, 0xfc, 0x5e,
  0xfc, 0x6f, 0x73, 0x7e, 0x2f, 0xfe, 0xe5, 0xf3, 0xdb, 0xf3, 0xce, 0xef,
  0xc5, 0xff, 0x2e, 0xe7, 0xa7, 0xfd, 0xd5, 0xf4, 0xf4, 0x12, 0xef, 0xfc,
  0x06, 0x92, 0x36, 0xa2, 0xc0, 0x7c, 0xb8, 0xd3, 0xfa, 0x16, 0x07, 0x69,

  0x24, 0xd1, 0x91, 0xbd, 0xe0, 0x9a, 0x6b, 0xcb, 0xd0, 0x90, 0x2d, 0x0d,
  0x4b, 0xfa, 0x5a, 0x56, 0xa1, 0x83, 0x9e, 0x5e, 0x46, 0x66, 0x02, 0xce,
  0x31, 0x58, 0xa0, 0x2d, 0x52, 0xd0, 0x82, 0x2e, 0xea, 0x12, 0xfd, 0x96,
  0xb0, 0x7e, 0x2e, 0xaf, 0x2c, 0x6d, 0x51, 0x70, 0x08, 0x49, 0x0b, 0x36,
  0xee, 0xe0, 0x10, 0xb7, 0xab, 0xc7, 0x8f, 0x7f, 0x19, 0x2c, 0x76, 0xa3,

  0x8e, 0xcd, 0x76, 0x4a, 0xa1, 0xb0, 0x84, 0xb3, 0x75, 0xf6, 0xdc, 0x4c,
  0x34, 0xcb, 0x39, 0xb4, 0xd0, 0x99, 0x35, 0x55, 0x1d, 0x73, 0x82, 0x4f,
  0x1f, 0x59, 0x7e, 0x43, 0x38, 0x3e, 0x87, 0x1f, 0xae, 0x7c, 0xdf, 0x1b,
  0x2c, 0xd5, 0x87, 0x46, 0x84, 0xe3, 0xea, 0xa1, 0x6d, 0xdf, 0x23, 0x94,
  0x78, 0xb8, 0x8d, 0x17, 0xef, 0x36, 0x1c, 0x27, 0x10, 0x05, 0x2d, 0xf2,
  0x50, 0xbf, 0x3b, 0x2e, 0xbb, 0x35, 0xa5, 0xe5, 0x65, 0xb7, 0xd1, 0xe3,

  0xd2, 0xa4, 0xbd, 0x5b, 0x25, 0x85, 0xbc, 0x23, 0x52, 0xb0, 0x5b, 0x78,
  0xfd, 0x2d, 0x51, 0x19, 0x4c, 0x4b, 0x41, 0x8d, 0x43, 0x18, 0x0d, 0x95,
  0x83, 0x34, 0xb3, 0xdf, 0x33, 0xe3, 0xef, 0xc5, 0x4e, 0x6d, 0x57, 0xdf,

  0x90, 0xae, 0xb8, 0x9c, 0x2f, 0xa4, 0xb4, 0xf8, 0x89, 0xd2, 0xca, 0x88,
  0xbb, 0x31, 0x52, 0xd9, 0x24, 0xbb, 0xf7, 0xa5, 0xca, 0x48, 0x2d, 0x73,
  0x53, 0x5a, 0x21, 0xe6, 0x7b, 0x2b, 0x30, 0x5a, 0x10, 0x8b, 0xea, 0xba,

  0x99, 0x20, 0xc5, 0x15, 0x31, 0x8a, 0xaf, 0x8e, 0x5c, 0xd2, 0xd1, 0x9a,
  0xa5, 0xd0, 0x81, 0x40, 0x00, 0xf8, 0xab, 0x21, 0x70, 0x6e, 0x8a, 0x12,
  0x62, 0x81, 0x15, 0xce, 0x99, 0xd1, 0x05, 0xe1, 0x55, 0x18, 0xa6, 0x2f,
  0x55, 0x56, 0xa5, 0x13, 0xa7, 0x36, 0x85, 0x21, 0x04, 0xee, 0x14, 0xaa,
  0x0e, 0xa0, 0x60, 0x0f, 0xa9, 0xb7, 0x92, 0xd5, 0x27, 0xd0, 0x1d, 0x06,
  0x9b, 0x29, 0xbb, 0xd3, 0xda, 0x9b, 0x5a, 0x8b, 0x92, 0xde, 0xd0, 0x0f,
  0x07, 0xd4, 0x4a, 0x00, 0xff, 0x40, 0xb4, 0xd1, 0x52, 0x96, 0xc1, 0xaa,
  0x99, 0xe3, 0x98, 0x08, 0xdc, 0x24, 0xb7, 0xea, 0x23, 0xe8, 0x0a, 0x40,
  0x43, 0x47, 0x17, 0x28, 0xfd, 0x2a, 0xb8, 0x09, 0x48, 0xdd, 0x25, 0xd5,
  0x30, 0x92, 0x38, 0xfb, 0xd7, 0x4b, 0x28, 0x14, 0x80, 0x81, 0xe0, 0x31,
  0xd6, 0x52, 0xc0, 0x39, 0xb7, 0xf8, 0x26, 0x71, 0xab, 0xa6, 0x0d, 0x04,
  0x25, 0x47, 0x29, 0x38, 0x79, 0x11, 0x76, 0x51, 0x32, 0x61, 0xbd, 0x86,
  0x43, 0x84, 0x8a, 0x20, 0x53, 0xef, 0x08, 0x8a, 0xd3, 0x52, 0xa0, 0x67,
  0xb9, 0xe5, 0x32, 0x81, 0xde, 0xfc, 0x7e, 0x55, 0xca, 0x4e, 0x66, 0xb8,
  0xcb, 0xa2, 0x92, 0x29, 0x87, 0xff, 0x57, 0x65, 0x21, 0x37, 0x00, 0xd7,
  0xb8, 0x99, 0xb8, 0x81, 0x5c, 0x23, 0x8f, 0x60, 0x56, 0x15, 0xf9, 0xe2,
  0x31, 0xfa, 0x26, 0xc6, 0x65, 0x91, 0x5a, 0x1f, 0x27, 0x73, 0xaf, 0x34,
  0x8d, 0xdb, 0x8b, 0x8b, 0x9a, 0xcd, 0xad, 0xc6, 0x75, 0x85, 0x64, 0x17,
  0xf0, 0xb6, 0x00, 0xb1, 0xc2, 0x7e, 0xa1, 0x33, 0x59, 0xca, 0x46, 0x38,
  0xf5, 0x7a, 0x30, 0x38, 0xf3, 0x6d, 0x39, 0x6d, 0x6c, 0xb4, 0x12, 0x93,
  0x80, 0x46, 0xeb, 0x35, 0xa3, 0x23, 0x32, 0xf8, 0x61, 0x90, 0x73, 0xc8,
  0xba, 0x93, 0x99, 0x62, 0x76, 0x28, 0x8e, 0xfc, 0xa8, 0x78, 0x5c, 0xa0,
  0xf1, 0x25, 0x45, 0xb8, 0x7c, 0xcd, 0x71, 0x7e, 0x0c, 0x02, 0xbb, 0xb2,
  0xec, 0xf9, 0x43, 0xe9, 0x60, 0xa9, 0x93, 0x2c, 0xc5, 0xf8, 0x3d, 0x82,
  0x22, 0x23, 0xb8, 0x95, 0xc8, 0x56, 0x94, 0x3a, 0x63, 0x42, 0x73, 0x69,
  0xed, 0x71, 0x26, 0x9d, 0xcb, 0x1a, 0xdd, 0x31, 0xd8, 0x9c, 0x41, 0x4b,

  0x0b, 0x11, 0x11, 0x29, 0x9c, 0xb2, 0xa1, 0xf2, 0x5d, 0xde, 0x90, 0xaa,
  0xbd, 0xe6, 0xcd, 0x30, 0xcd, 0x13, 0x62, 0x44, 0x78, 0xc8, 0x3c, 0x28,
  0x19, 0xce, 0xf2, 0xd8, 0xde, 0xda, 0x7a, 0x12, 0x23, 0x48, 0xac, 0xd5,
  0x95, 0x50, 0x41, 0xc8, 0x0e, 0x39, 0xc0, 0x61, 0x6a, 0xda, 0xe3, 0x54,
  0x0a, 0x96, 0x9a, 0xa8, 0x6a, 0xf0, 0x49, 0x03, 0xd9, 0x63, 0xaf, 0x20,
  0xb3, 0x55, 0x86, 0xd2, 0x22, 0xc0, 0x20, 0xb8, 0xdb, 0x27, 0x34, 0xc7,
  0xf2, 0xa0, 0xf6, 0x4e, 0xb0, 0xa5, 0x34, 0x4e, 0x08, 0x5f, 0x12, 0xfd,
  0xb3, 0x1f, 0x7d, 0xfd, 0x68, 0xed, 0x76, 0x62, 0x88, 0xec, 0x0f, 0xa6,
  0x59, 0xb1, 0x9f, 0x9f, 0xe7, 0xdf, 0x5f, 0xc5, 0xfa, 0xc3, 0x38, 0x40,
  0x7f, 0x60, 0xc6, 0x42, 0xc3, 0x02, 0xb7, 0x5b, 0x94, 0x34, 0x2a, 0xc1,

  0x89, 0x84, 0x1d, 0x56, 0x66, 0xb5, 0xa0, 0x7f, 0x34, 0x9b, 0x2c, 0x39,
  0xfd, 0x92, 0x98, 0x0b, 0xae, 0xc4, 0x73, 0xae, 0xa3, 0x3a, 0xd5, 0xb3,
  0x50, 0x5f, 0xd6, 0xd5, 0x14, 0x2c, 0xad, 0xee, 0x51, 0x01, 0x75, 0x13,
  0x35, 0x02, 0x6b, 0xae, 0x91, 0x77, 0x91, 0xaf, 0x21, 0xcf, 0x1c, 0x0f,

  0x0c, 0xa2, 0x89, 0x71, 0xe6, 0x8f, 0xd6, 0x5a, 0x35, 0x40, 0x6c, 0x5d,
  0xc6, 0xaa, 0xc8, 0xfb, 0x7a, 0xd3, 0xc7, 0xb9, 0x83, 0x5d, 0x65, 0xca,
  0xeb, 0x1a, 0xae, 0x1c, 0xf6, 0xe5, 0xf8, 0xb0, 0x18, 0x9c, 0x41, 0x6c,
  0xdd, 0x84, 0x5c, 0x28, 0x4e, 0xd9, 0x11, 0xa4, 0x09, 0xb2, 0xea, 0x08,
  0x1a, 0x4b, 0x37, 0x92, 0x4e, 0xe4, 0x98, 0x30, 0xce, 0xa7, 0x1c, 0x54,
  0x6f, 0x2d, 0xac, 0x1a, 0xf7, 0x19, 0xe3, 0x95, 0x94, 0x16, 0x0e, 0x0e,
  0x99, 0x36, 0xf7, 0x4c, 0x83, 0x51, 0x4b, 0x93, 0x1a, 0xe6, 0x7b, 0x44,
  0x9d, 0x0a, 0x6d, 0x78, 0x12, 0x11, 0x6a, 0xca, 0x25, 0x79, 0xaf, 0x79,
  0x78, 0x83, 0xc0, 0xc6, 0x77, 0x92, 0x2b, 0xd7, 0xd1, 0x4f, 0x26, 0x15,
  0xb8, 0x1e, 0xdb, 0xc0, 0xe8, 0x38, 0x82, 0x37, 0x46, 0x74, 0x38, 0x54,
  0x02, 0xbf, 0x2c, 0x9c, 0x18, 0x79, 0xe7, 0x26, 0x85, 0x53, 0xcd, 0x3a,
  0x04, 0x0c, 0xb9, 0x1c, 0x32, 0xe6, 0x68, 0xa5, 0x1f, 0xf5, 0x16, 0xbb,
  0x9c, 0x39, 0x8e, 0xd9, 0x70, 0x9b, 0xf1, 0x5a, 0xc2, 0x77, 0x37, 0xaa,
  0x5d, 0x08, 0xd5, 0x27, 0x39, 0x6c, 0x6f, 0x8b, 0xef, 0xf9, 0xdc, 0x82,
  0xde, 0x5c, 0x5b, 0x88, 0x87, 0x37, 0x9f, 0x3a, 0x73, 0x75, 0xdd, 0xb6,
  0x38, 0xd6, 0xd1, 0x1c, 0xcf, 0xd1, 0x89, 0xc3, 0xba, 0x2a, 0xee, 0x72,
  0xb0, 0x69, 0x09, 0x1e, 0x84, 0x40, 0xb6, 0x04, 0x30, 0x85, 0x25, 0xb5,
  0x2f, 0x7e, 0xa4, 0xaa, 0x23, 0xf3, 0x69, 0xa2, 0x6e, 0x0f, 0x00, 0x0e,
  0xc1, 0x10, 0x73, 0xd2, 0xfc, 0x85, 0x8e, 0x71, 0x0b, 0x47, 0x45, 0xba,
  0xa8, 0x38, 0x1f, 0x41, 0x92, 0xab, 0x57, 0x02, 0xe7, 0xc0, 0xdf, 0xa6,
  0xb3, 0x7c, 0x18, 0xf3, 0x1d, 0x31, 0xb9, 0x4d, 0xea, 0xf1, 0xac, 0x01,
  0x16, 0x23, 0x7b, 0x43, 0xf2, 0x0c, 0x34, 0x5c, 0x80, 0x25, 0xf7, 0x0e,
  0xa8, 0x3b, 0x3c, 0x06, 0x42, 0x57, 0x7d, 0xd0, 0x7c, 0x82, 0xe1, 0xff,
  0x7a, 0x93, 0xae, 0xdc, 0x5e, 0xad, 0xca, 0xa6, 0xd4, 0xb0, 0xd2, 0xb9,
  0x53, 0x9e, 0xce, 0x45, 0x30, 0x0a, 0xe3, 0x65, 0x52, 0xcf, 0x14, 0x5b,

  0x93, 0x30, 0xb1, 0xb4, 0xb4, 0xa3, 0x6c, 0x25, 0xd3, 0xa9, 0x40, 0xc2,
  0xb1, 0xc1, 0x2c, 0x28, 0x04, 0x08, 0x96, 0xac, 0xa5, 0x2e, 0x18, 0x1f,
  0xf7, 0x54, 0xa1, 0x91, 0xa1, 0x54, 0xb2, 0x93, 0xd3, 0xec, 0x5b, 0x67,
  0xaf, 0x18, 0x58, 0xc1, 0xa7, 0xf8, 0x09, 0x2b, 0x84, 0xe4, 0xbf, 0xe4,
  0x33, 0x59, 0xb1, 0x33, 0x2e, 0xca, 0x78, 0xdd, 0x44, 0x30, 0x9f, 0x0e,
  0x8b, 0x27, 0x62, 0x6b, 0x25, 0x1a, 0x0d, 0xe8, 0xdf, 0x5f, 0x07, 0x62,
  0x91, 0xea, 0xb7, 0x98, 0x12, 0x0f, 0x08, 0x1b, 0x53, 0xdb, 0xf9, 0x31,
  0x2f, 0x08, 0x57, 0xe6, 0xe1, 0x4d, 0xc1, 0x1c, 0xb7, 0xd9, 0x23, 0x67,
  0xd1, 0xd0, 0x99, 0x93, 0xbe, 0x2b, 0x31, 0x03, 0x25, 0xa8, 0xa4, 0x1a,
  0x39, 0xbf, 0x1c, 0x27, 0xf1, 0x2c, 0xd4, 0x2d, 0x03, 0x27, 0x8c, 0x8e,
  0x6e, 0x66, 0x6d, 0x08, 0x93, 0x92, 0x49, 0xc8, 0x44, 0x72, 0xac, 0x39,
  0xcb, 0x50, 0x8c, 0x03, 0x33, 0x43, 0xba, 0x55, 0x01, 0xed, 0x1a, 0xfb,
  0xf7, 0xd0, 0x03, 0x54, 0x3b, 0x3c, 0x12, 0x44, 0x02, 0x0a, 0x78, 0xda,
  0x12, 0x1c, 0xc4, 0x74, 0xc3, 0x84, 0x44, 0x7d, 0x80, 0x28, 0x80, 0xf2,
  0xe1, 0x9b, 0xc3, 0x89, 0x23, 0x95, 0xeb, 0x42, 0x49, 0xc8, 0x68, 0xd9,
  0x06, 0x4e, 0x8c, 0x73, 0x60, 0x90, 0x49, 0x6e, 0xc8, 0x3d, 0xa4, 0x3c,

  0x0b, 0xe1, 0x1c, 0x0b, 0xff, 0xa4, 0xef, 0x12, 0xcd, 0x8c, 0x22, 0x53,
  0x86, 0x0f, 0xa0, 0x32, 0xc5, 0xb2, 0x38, 0x9a, 0xf0, 0x19, 0x66, 0x32,
  0x3b, 0x3b, 0x2d, 0xa6, 0x97, 0xf4, 0x49, 0x17, 0x1a, 0xa3, 0xcb, 0x5e,
  0xc6, 0x93, 0x44, 0x81, 0x53, 0x85, 0x7d, 0xe7, 0x23, 0xd8, 0x42, 0x0a,
  0xd2, 0x12, 0x28, 0x11, 0x6a, 0x47, 0x9e, 0x05, 0xcd, 0x5c, 0x13, 0xb9,
  0xa4, 0x11, 0xb9, 0x78, 0x11, 0x84, 0xdd, 0x96, 0xb3, 0x74, 0xa1, 0xfe,
  0xe9, 0x6e, 0x94, 0x48, 0x56, 0xd1, 0xec, 0x51, 0x4e, 0x65, 0xd9, 0x0b,
  0x98, 0x5e, 0xa6, 0x99, 0xbb, 0xc0, 0xdf, 0xce, 0x50, 0xf1, 0x5f, 0x6f,
  0x8c, 0xbe, 0xb7, 0xb5, 0x4d, 0x93, 0xdd, 0xdb, 0x7a, 0xb9, 0x51, 0x97,
  0xca, 0xb3, 0x32, 0xe9, 0x51, 0xd2, 0x5a, 0x58, 0x3b, 0xe5, 0x56, 0x75,

  0xd6, 0xaf, 0x4e, 0x9a, 0x28, 0xbe, 0x24, 0x99, 0x6e, 0xe3, 0x65, 0xa1,

  0xa6, 0x1c, 0x36, 0x31, 0x44, 0xc3, 0xb4, 0xbc, 0x41, 0xd4, 0x45, 0x4f,
  0xca, 0xdb, 0x77, 0xc8, 0x68, 0xa3, 0xd8, 0x0d, 0xef, 0x53, 0x4c, 0xaf,
  0x4a, 0x83, 0x34, 0xde, 0x07, 0x7a, 0x0e, 0xad, 0x52, 0x0e, 0x30, 0x84,
  0xda, 0x99, 0x2a, 0x92, 0x03, 0x27, 0x89, 0x49, 0xf8, 0xae, 0xde, 0x6e,
  0xd8, 0xf0, 0x9d, 0xb7, 0x69, 0x96, 0x96, 0x37, 0xd4, 0xa6, 0xb8, 0x2c,
  0xe3, 0x69, 0xe2, 0x17, 0xb8, 0x03, 0x43, 0x02, 0x93, 0x89, 0xdb, 0xe8,
  0x15, 0x84, 0x4c, 0x8f, 0xa9, 0x61, 0xbc, 0xef, 0x52, 0xb0, 0x22, 0x3d,
  0xf6, 0x08, 0x19, 0xcd, 0x2e, 0x33, 0x44, 0x2f, 0x69, 0xe9, 0x34, 0x80,
  0x6c, 0xeb, 0xff, 0x88, 0xdd, 0xc8, 0x08, 0x22, 0x8b, 0x7b, 0x03, 0x71,
  0x73, 0xa0, 0x50, 0xd7, 0x17, 0x50, 0xb5, 0xe1, 0x70, 0x2f, 0x06, 0xc0,
  0x82, 0x6c, 0xaf, 0x62, 0x4a, 0x01, 0x84, 0x9f, 0xfd, 0x00, 0xba, 0x68,
  0xff, 0x95, 0xf9, 0xf1, 0xc6, 0xf3, 0x1a, 0x46, 0xee, 0x34, 0x74, 0x33,
  0xcc, 0xc5, 0x95, 0x48, 0x04, 0x99, 0x2a, 0xaf, 0xf9, 0x1f, 0x61, 0x5f,
  0x07, 0xd5, 0xb5, 0x82, 0x15, 0xf9, 0xfe, 0x88, 0x20, 0xa5, 0x2c, 0xc2,
  0xb3, 0x93, 0xb6, 0x5b, 0xab, 0xd1, 0xa3, 0xee, 0x99, 0xa8, 0xaa, 0x06,
  0x01, 0xfe, 0x0c, 0x26, 0x2f, 0x67, 0x10, 0xda, 0xa8, 0x9b, 0xea, 0x72,
  0x20, 0x78, 0x2b, 0x34, 0x4c, 0x11, 0x7a, 0x27, 0x3a, 0x4b, 0xb8, 0x59,
  0x4e, 0xb4, 0xf6, 0xd5, 0x5a, 0xa0, 0x9a, 0x6f, 0xed, 0xd0, 0x41, 0x18,
  0x2f, 0x6d, 0x23, 0xae, 0xb5, 0x2f, 0x30, 0x29, 0x19, 0xc1, 0x54, 0xf8,
  0x9b, 0x72, 0x06, 0x9c, 0x5f, 0x1b, 0x0e, 0xeb, 0x6b, 0x4a, 0x9f, 0xe0,
  0x03, 0xd6, 0x93, 0x87, 0xb8, 0xf1, 0x35, 0x62, 0xaf, 0x37, 0xd6, 0xad,

  0xfa, 0xdc, 0x9a, 0x57, 0xed, 0x87, 0xa9, 0xfb, 0x8c, 0xd6, 0x23, 0xdd,
  0xc1, 0x6d, 0x1b, 0x53, 0x9e, 0x13, 0x4f, 0x86, 0x7c, 0x95, 0xa3, 0x51,
  0x8a, 0x9a, 0x0b, 0x5d, 0x7d, 0xf8, 0xe5, 0x74, 0x1a, 0x4c, 0x71, 0x82,
  0x2d, 0xc0, 0x83, 0xc7, 0x35, 0x4f, 0x92, 0xb8, 0x22, 0x7d, 0x03, 0xe5,
  0x7c, 0x7b, 0xf2, 0xb4, 0xd5, 0xdd, 0x03, 0xcf, 0x38, 0xab, 0x38, 0x74,

  0xeb, 0x53, 0xc2, 0x54, 0x40, 0x44, 0xc0, 0x34, 0x80, 0x88, 0x9e, 0xf4,
  0x33, 0xe3, 0xed, 0x9a, 0xc4, 0x40, 0x14, 0x8f, 0x12, 0x5a, 0x9e, 0x51,
  0x3d, 0x01, 0x73, 0x90, 0x64, 0xee, 0xf1, 0xb0, 0x99, 0xa6, 0xe6, 0x72,
  0x06, 0x3b, 0xf6, 0x12, 0xe1, 0x64, 0x67, 0xdc, 0x67, 0x96, 0x07, 0x36,
  0xe9, 0x3d, 0xd2, 0x86, 0x1a, 0x36, 0x97, 0xbd, 0xe9, 0x15, 0x71, 0x33,
  0xdb, 0x45, 0x55, 0x51, 0x1b, 0x90, 0x92, 0xf3, 0x85, 0x61, 0x38, 0xbe,

  0xca, 0xc8, 0x2d, 0x66, 0x6c, 0xfa, 0x28, 0xc9, 0x84, 0x00, 0x6e, 0xb4,






  0x49, 0x97, 0x84, 0x2b, 0x0a, 0x46, 0x08, 0x63, 0x43, 0x4c, 0x26, 0x8f,

  0xb0, 0x49, 0xdb, 0xce, 0xee, 0xe7, 0x9f, 0xf7, 0x83, 0x38, 0xa7, 0x5c,

  0x9e, 0x0d, 0x44, 0x88, 0x3b, 0x65, 0x31, 0x31, 0xbb, 0x06, 0xdd, 0x18,




  0xbf, 0x8f, 0x14, 0x46, 0xe5, 0x63, 0xf9, 0x1c, 0xa1, 0x8b, 0x90, 0x39,
  0x2e, 0x67, 0xbe, 0x79, 0x4f, 0xa1, 0xc7, 0x39, 0xaa, 0x15, 0xc2, 0xc5,
  0x48, 0xbd, 0x42, 0xae, 0x31, 0x4f, 0x5b, 0x54, 0xba, 0x44, 0xd2, 0xf3,
  0x38, 0x95, 0x53, 0xa0, 0x01, 0x25, 0x9f, 0x94, 0xd3, 0x7e, 0x41, 0x6b,
  0xa0, 0x1c, 0x77, 0xce, 0xfa, 0xe0, 0xed, 0x58, 0x6b, 0x29, 0x07, 0x5d,
  0x8b, 0x34, 0xfa, 0x39, 0x4c, 0x0c, 0xbe, 0x02, 0x77, 0xde, 0x6a, 0x20,
  0xe0, 0x70, 0xc9, 0x78, 0x86, 0x35, 0x61, 0xd8, 0xe9, 0x02, 0x3e, 0xd0,
  0x18, 0x8e, 0x2a, 0xa4, 0xa7, 0x49, 0xe5, 0xd7, 0x31, 0x39, 0xd9, 0xbd,

  0x2b, 0x06, 0x0f, 0xd9, 0x44, 0x52, 0x86, 0x15, 0x1d, 0xf6, 0x25, 0x92,
  0x30, 0x4e, 0x27, 0x7a, 0x49, 0x4d, 0x77, 0x88, 0xaf, 0xe8, 0x34, 0x0e,
  0x65, 0xeb, 0xa5, 0x2c, 0xf1, 0xab, 0x20, 0xc6, 0x99, 0xa4, 0x18, 0x13,
  0xe0, 0x56, 0x55, 0x81, 0x5a, 0x6d, 0x79, 0x37, 0x65, 0x91, 0x73, 0x2f,
  0x02, 0xae, 0xdd, 0xe1, 0x0d, 0xe6, 0xbc, 0xcd, 0x59, 0x08, 0x64, 0xe3,
  0xd0, 0x0c, 0x2a, 0xad, 0x4e, 0x30, 0x91, 0x1f, 0xa7, 0x12, 0xda, 0x09,
  0xc5, 0x29, 0x47, 0xfe, 0x00, 0x4f, 0x7b, 0x56, 0x0f, 0xbe, 0xeb, 0xec,
  0x93, 0x7f, 0xf6, 0x6e, 0x64, 0x4d, 0x10, 0x35, 0x78, 0x8b, 0x6d, 0x02,
  0xb8, 0x1b, 0x9d, 0x91, 0x95, 0x82, 0x26, 0x1c, 0xee, 0xce, 0x8d, 0x4b,
  0xb5, 0x95, 0xdc, 0x44, 0x59, 0xd3, 0x3c, 0xe1, 0x59, 0x12, 0xac, 0x86,
  0xee, 0x2a, 0xfa, 0x2a, 0xab, 0x62, 0x39, 0x42, 0xc5, 0x92, 0x8c, 0x72,
  0xfa, 0x54, 0xa8, 0x1b, 0x97, 0xba, 0x57, 0xcd, 0x8a, 0xa9, 0x67, 0x1e,
  0x9d, 0x17, 0xed, 0xb2, 0x00, 0x02, 0xb2, 0x85, 0x27, 0x78, 0x91, 0x9c,
  0xa1, 0xda, 0x0b, 0xf6, 0x71, 0x4d, 0xc8, 0xdd, 0x52, 0xa6, 0x7f, 0x67,
  0xa5, 0x4c, 0x52, 0x7b, 0x15, 0x1e, 0x8d, 0x1c, 0x1c, 0x09, 0x02, 0xf6,
  0x47, 0x6f, 0xb0, 0xcb, 0x28, 0x8b, 0x72, 0xa4, 0x37, 0x8f, 0x4f, 0xbb,
  0x89, 0xed, 0x2c, 0x91, 0x50, 0x8d, 0x2b, 0x92, 0xe9, 0x12, 0xa5, 0x1c,
  0xed, 0xd3, 0xba, 0xc2, 0xa1, 0xea, 0x13, 0x8b, 0x74, 0x41, 0x9d, 0x4c,
  0xc0, 0x9e, 0xf3, 0x72, 0xe5, 0xe1, 0x2d, 0xee, 0x1f, 0xba, 0xcc, 0x60,
  0xbb, 0xaa, 0x25, 0xc6, 0x20, 0x05, 0x0f, 0x06, 0xf8, 0xd7, 0x5f, 0xc9,
  0xf5, 0x97, 0xcb, 0xd2, 0xb9, 0xf7, 0xc6, 0xd8, 0x98, 0xde, 0xc9, 0xc4,
  0xb3, 0x5d, 0x12, 0xca, 0x7c, 0x21, 0x20, 0x33, 0x4c, 0x25, 0xa9, 0x94,
  0x01, 0x70, 0xa3, 0x39, 0x74, 0xc4, 0x7c, 0x81, 0x71, 0xca, 0x51, 0x62,
  0x61, 0x5c, 0x69, 0x53, 0xa8, 0xaa, 0xda, 0xbb, 0xd5, 0x84, 0x88, 0xa8,
  0xba, 0x93, 0x8b, 0x93, 0x29, 0xcd, 0x4e, 0xba, 0x8c, 0xfc, 0xca, 0xe5,
  0x4d, 0x02, 0xfa, 0x13, 0x97, 0x5c, 0x3e, 0x51, 0xfa, 0x0d, 0x58, 0x49,
  0x08, 0xb0, 0x56, 0xfd, 0x57, 0x63, 0xf0, 0x22, 0xe7, 0x0b, 0xc0, 0x27,
  0x11, 0x6e, 0xec, 0x01, 0xe7, 0x69, 0x50, 0x3b, 0x3b, 0x61, 0x68, 0x26,
  0x2e, 0x21, 0xe5, 0x51, 0xac, 0x22, 0xae, 0x01, 0xeb, 0xc4, 0xbd, 0x5f,
  0x93, 0x8b, 0x1b, 0xc2, 0xec, 0xb1, 0x76, 0x3e, 0xb1, 0x6a, 0xbe, 0x26,
  0x06, 0xe9, 0xd2, 0xf0, 0x10, 0x54, 0xa9, 0x8a, 0x18, 0x38, 0xe6, 0x5f,
  0x17, 0xd3, 0x16, 0x50, 0x45, 0xee, 0x99, 0x03, 0xb6, 0x82, 0xdf, 0xa4,
  0x8b, 0xe8, 0xb0, 0xf7, 0x36, 0x92, 0xf9, 0xbc, 0xfe, 0xaa, 0x36, 0x9c,
  0x36, 0xae, 0x70, 0x71, 0xd9, 0x05, 0xe3, 0x63, 0x34, 0x4d, 0x9f, 0xd8,

  0x04, 0x6e, 0x6a, 0x60, 0xd2, 0x89, 0xcb, 0x9b, 0x3c, 0x91, 0xb3, 0xcb,
  0xc8, 0x04, 0x36, 0x3d, 0x98, 0x60, 0x5d, 0x65, 0xb0, 0xa3, 0x86, 0x6a,
  0xbc, 0xed, 0xd3, 0x26, 0xb9, 0xfe, 0x1f, 0xf9, 0x4d, 0x86, 0xff, 0xc0,
  0x2f, 0xe0, 0x07, 0x5e, 0x6f, 0x6f, 0x07, 0x67, 0xde, 0x3a, 0x5f, 0x9e,
  0xb0, 0xce, 0x18, 0x85, 0x91, 0xa4, 0x88, 0x3a, 0xbc, 0xad, 0x66, 0xfa,
  0xf7, 0xa9, 0x6a, 0xce, 0x77, 0xb3, 0xd1, 0x1d, 0x22, 0x3c, 0x32, 0xe7,
  0x55, 0x4e, 0xbf, 0x0b, 0xb2, 0xc4, 0xd4, 0xc8, 0x87, 0x99, 0x0f, 0x6e,
  0x01, 0xba, 0x1a, 0x1e, 0x49, 0xfb, 0xe2, 0x3b, 0x18, 0x0b, 0x7a, 0x7c,
  0x7d, 0x78, 0xb3, 0x9c, 0x26, 0xc4, 0x37, 0xab, 0x87, 0xaa, 0xf3, 0xac,
  0x95, 0xa3, 0x97, 0x82, 0xdd, 0x14, 0x9c, 0x62, 0x5d, 0x39, 0xc9, 0x46,
  0x54, 0xb3, 0x50, 0x53, 0x21, 0x38, 0x15, 0x13, 0x2d, 0x25, 0x0d, 0x75,
  0x35, 0xeb, 0x8a, 0x58, 0x19, 0xed, 0xf2, 0xa6, 0x09, 0xee, 0x85, 0xad,
  0xb4, 0x5f, 0xb1, 0x82, 0xfb, 0x64, 0xf8, 0xfa, 0x2b, 0xf4, 0x6d, 0x3d,
  0x50, 0xff, 0x00, 0xd6, 0x6a, 0x71, 0xeb, 0x36, 0xa9, 0x9d, 0x40, 0xe4,
  0x2c, 0xa2, 0x39, 0x48, 0x5e, 0xb4, 0x0f, 0xeb, 0xd4, 0x39, 0x39, 0x43,
  0x4e, 0xf2, 0x7c, 0xe5, 0x88, 0xea, 0xbb, 0xa1, 0x3d, 0x71, 0x92, 0x19,
  0x39, 0xc5, 0xcf, 0xd6, 0x70, 0x32, 0x41, 0x90, 0x9c, 0xa9, 0x89, 0xcb,
  0x50, 0x4d, 0x3d, 0x7a, 0xc8, 0xa4, 0x9f, 0xb9, 0x4a, 0x9c, 0xd7, 0x5d,
  0x2a, 0xf3, 0x09, 0x77, 0x8c, 0xb1, 0x6b, 0xe0, 0xeb, 0x48, 0x10, 0x48,
  0xf8, 0xd7, 0x2f, 0xcc, 0xeb, 0xf8, 0x1f, 0xb8, 0xcd, 0x84, 0xc8, 0xbd,
  0x62, 0x35, 0x18, 0x0a, 0xd4, 0x77, 0x36, 0x29, 0xfc, 0x64, 0x1a, 0x41,
  0xad, 0x75, 0x59, 0xd1, 0xfe, 0x62, 0x8d, 0xdc, 0xb8, 0x1a, 0xa4, 0xa6,
  0xf6, 0x4c, 0xc4, 0xe3, 0xc6, 0xb9, 0xa7, 0xd6, 0x62, 0x36, 0x26, 0xf7,
  0x6f, 0xa2, 0xd9, 0xb7, 0x4c, 0x1c, 0x67, 0xae, 0x53, 0xff, 0xa9, 0x63,
  0x26, 0xff, 0x53, 0xc7, 0x4e, 0xff, 0xa7, 0x8e, 0x5d, 0xc0, 0x4f, 0x1d,
  0x84, 0xa1, 0xc4, 0x45, 0xf8, 0x06, 0xf1, 0x2f, 0x3d, 0xf4, 0x35, 0xfe,
  0xaa, 0xfd, 0xa8, 0xf3, 0x4d, 0xe7, 0x93, 0x9d, 0xb5, 0x55, 0x9b, 0xe6,
  0xc6, 0x86, 0xa8, 0x2e, 0xa6, 0xb9, 0x87, 0xc0, 0xae, 0x6b, 0xdb, 0x64,
  0xb7, 0x05, 0x8d, 0x33, 0xaf, 0x83, 0xb7, 0xf3, 0x00, 0xee, 0xb8, 0x6d,

  0x4e, 0xe5, 0x34, 0x5d, 0x30, 0x28, 0x96, 0x7a, 0x0e, 0xda, 0xfb, 0xd9,
  0x93, 0x47, 0xe6, 0x75, 0x4f, 0xfe, 0xfc, 0x27, 0x7c, 0x81, 0xf4, 0x7f,
  0x1a, 0x43, 0x6e, 0x35, 0x01, 0xd8, 0x48, 0x5e, 0x1e, 0x25, 0x4c, 0x67,

  0x1c, 0xb5, 0x64, 0xf1, 0x37, 0xe1, 0x4a, 0x23, 0x26, 0x09, 0x2f, 0x97,
  0x7e, 0x9e, 0x52, 0xab, 0x32, 0x58, 0xd5, 0x8c, 0x2d, 0xd4, 0x4d, 0x94,
  0x0a, 0x94, 0xfb, 0x4a, 0x1d, 0xc4, 0x4a, 0x32, 0xd1, 0xc5, 0x78, 0x95,

  0x3e, 0x6c, 0xbc, 0x0f, 0xed, 0x24, 0x8d, 0x8a, 0xf8, 0x2c, 0x2f, 0xca,
  0xd7, 0x9d, 0x02, 0x3b, 0xbf, 0x46, 0xd3, 0x02, 0x34, 0xd8, 0x2f, 0x90,
  0xb4, 0x96, 0x70, 0x58, 0xf6, 0x9e, 0x3e, 0xf4, 0xe6, 0x8f, 0x30, 0xef,
  0xb5, 0x5f, 0x44, 0x19, 0x0e, 0x4b, 0x1b, 0x53, 0x94, 0x1e, 0x98, 0xe3,
  0x3c, 0x6a, 0xe6, 0x29, 0xf0, 0xd5, 0x75, 0x2e, 0xa5, 0xfc, 0xfe, 0x75,
  0x08, 0xe6, 0xce, 0x5b, 0x88, 0xc3, 0x79, 0xc9, 0x54, 0x7b, 0x7d, 0xf1,
  0xed, 0x17, 0x3a, 0xc0, 0x4f, 0x9d, 0x1f, 0x7a, 0xfc, 0x53, 0xaa, 0x17,
  0x3e, 0x88, 0x2e, 0xbe, 0x45, 0xea, 0xfe, 0x65, 0x0c, 0x6c, 0xd5, 0x07,
  0xbe, 0xe2, 0xbf, 0x10, 0x65, 0xaf, 0x1a, 0xf6, 0xda, 0xe6, 0x49, 0xbc,
  0xc6, 0x06, 0xc6, 0x54, 0x67, 0x44, 0x56, 0xf8, 0x62, 0x81, 0x95, 0x43,
  0x5a, 0x1f, 0x5b, 0x71, 0x7d, 0x2c, 0x45, 0x8d, 0xe2, 0x61, 0xce, 0x29,
  0xd2, 0x95, 0x8f, 0x8d, 0x4d, 0xd8, 0xbc, 0x74, 0xb6, 0xe2, 0xbb, 0x5a,

  0x90, 0xe3, 0x82, 0xd4, 0xe1, 0x7a, 0x9a, 0x41, 0xbd, 0x96, 0xb1, 0x1b,
  0x9d, 0x04, 0x9a, 0x20, 0x58, 0x70, 0x23, 0xfe, 0x1b, 0xe9, 0x65, 0xa6,
  0x37, 0x37, 0x36, 0x54, 0x8b, 0x8b, 0x44, 0x3b, 0xe4, 0x48, 0x4f, 0x3f,
  0x0a, 0x30, 0x01, 0xc1, 0x04, 0x42, 0x01, 0x12, 0x9d, 0x94, 0x44, 0xf4,
  0x49, 0x3e, 0x93, 0x2e, 0xee, 0x25, 0x50, 0x3d, 0x1f, 0xb0, 0x69, 0xa3,
  0x07, 0x1a, 0x07, 0x6e, 0x85, 0x44, 0x2a, 0xe4, 0xb3, 0x01, 0x95, 0x43,
  0xa2, 0x89, 0xec, 0x8d, 0x93, 0xa6, 0x6d, 0x04, 0x18, 0xc6, 0x84, 0xff,
  0x05, 0x1a, 0xfd, 0xc3, 0x84, 0x9c, 0x4f, 0xa6, 0x2a, 0xb3, 0x27, 0xce,

  0xe1, 0x80, 0x07, 0x27, 0x32, 0xf7, 0x46, 0x2f, 0x0e, 0xa7, 0x41, 0x68,
  0xa9, 0x26, 0xe6, 0x89, 0xbd, 0x43, 0x95, 0x50, 0x12, 0xd9, 0xb5, 0xb3,
  0x0d, 0x8a, 0x97, 0xf0, 0x62, 0xe9, 0x0e, 0xab, 0x1a, 0xe1, 0xdf, 0xb6,
  0xe8, 0x8f, 0xe2, 0x4b, 0xd6, 0xc7, 0x62, 0xd1, 0xb7, 0xe4, 0xb0, 0xfa,
  0xde, 0x0b, 0x3f, 0x48, 0x52, 0x50, 0x6f, 0xfb, 0xc0, 0xe9, 0x52, 0xc4,
  0x3f, 0x0b, 0x0f, 0xef, 0x82, 0xc0, 0x68, 0x80, 0xb8, 0x94, 0xed, 0x5f,
  0x31, 0xfe, 0x8e, 0x19, 0xff, 0xb3, 0x00, 0xee, 0x0a, 0x23, 0xa3, 0x84,
  0x3f, 0x7b, 0x6d, 0x93, 0x00, 0xd5, 0x8b, 0x6a, 0x3c, 0x19, 0x35, 0x1f,
  0x82, 0x42, 0x3e, 0x33, 0x26, 0x0b, 0x87, 0x1b, 0xfc, 0x26, 0x0f, 0x0c,
  0x57, 0x49, 0x66, 0x20, 0xad, 0x03, 0xb6, 0xb1, 0x69, 0x22, 0xb2, 0xa8,
  0x17, 0xc2, 0xca, 0xe7, 0x08, 0xc1, 0x3a, 0x3e, 0xb0, 0x3d, 0x2f, 0x19,
  0x44, 0x22, 0x75, 0xf3, 0xeb, 0x6d, 0x1d, 0xad, 0x57, 0xd6, 0x58, 0x03,
  0x38, 0xf6, 0x3e, 0x05, 0xac, 0x98, 0xa1, 0x97, 0x9c, 0x86, 0x8c, 0x6b,
  0xeb, 0x6b, 0xe2, 0x54, 0xc1, 0x0f, 0x61, 0xab, 0x48, 0x4a, 0x84, 0xa2,
  0x62, 0xec, 0x98, 0x30, 0x33, 0xc4, 0x97, 0xd3, 0x0b, 0x68, 0x1d, 0x07,
  0xc4, 0xda, 0xcd, 0x9d, 0x60, 0xa0, 0x20, 0xc2, 0x09, 0x52, 0xbb, 0x99,
  0x41, 0xbd, 0x6a, 0xe0, 0x40, 0xbe, 0x91, 0xec, 0x6c, 0xb1, 0x0c, 0xc6,
  0xb6, 0xa9, 0xcd, 0x56, 0x8c, 0xa3, 0xb5, 0xd7, 0x1b, 0x6b, 0x66, 0x69,
  0xed, 0x66, 0x91, 0xd7, 0xf1, 0x51, 0x83, 0x90, 0xa6, 0x0f, 0x2c, 0x79,
  0x96, 0xe6, 0x98, 0xfb, 0x90, 0xf4, 0xe8, 0x40, 0x83, 0x08, 0x7a, 0x65,
  0x25, 0xde, 0x4e, 0x4a, 0x2c, 0xa7, 0xdb, 0xc9, 0x58, 0x2f, 0x4c, 0xe2,
  0xf1, 0xac, 0xc2, 0x54, 0x7d, 0x2a, 0xa6, 0x60, 0xb4, 0xbf, 0xf2, 0xc0,
  0xd1, 0xc7, 0x03, 0xd7, 0x13, 0x03, 0x39, 0xd4, 0x44, 0x41, 0x5c, 0x22,


  0x8e, 0x47, 0x63, 0x95, 0xea, 0xbd, 0xf6, 0x7a, 0x9d, 0x05, 0x96, 0xf5,
  0xa7, 0x39, 0xdf, 0x5e, 0x8b, 0x7e, 0x0a, 0xd7, 0xb5, 0x46, 0xfc, 0xae,
  0x63, 0x21, 0x08, 0xd9, 0x3e, 0xf5, 0x46, 0x74, 0x38, 0xcc, 0xc7, 0x8f,
  0x5f, 0x52, 0xd8, 0x49, 0x5e, 0x39, 0xdc, 0xa4, 0x1f, 0x35, 0x54, 0xe6,
  0xb6, 0x81, 0x68, 0x14, 0x38, 0x2a, 0xfa, 0xf3, 0x2b, 0x7c, 0x5c, 0x2d,
  0x86, 0xb5, 0xa8, 0xdf, 0x07, 0x26, 0x54, 0xce, 0xa9, 0x1d, 0xd7, 0x0a,
  0xc1, 0xc2, 0x78, 0x77, 0x24, 0x62, 0x51, 0x49, 0x11, 0xc8, 0x12, 0xf2,
  0xec, 0xa8, 0x95, 0xcd, 0x4e, 0x48, 0xfe, 0x55, 0xf1, 0xba, 0x1f, 0x1d,
  0x99, 0x2c, 0x99, 0x24, 0x80, 0x91, 0x8d, 0xd7, 0x98, 0x65, 0x87, 0x53,

  0x12, 0xfe, 0xf9, 0x30, 0x15, 0x37, 0xfb, 0x38, 0xaf, 0xe1, 0x6e, 0x32,
  0xa6, 0x03, 0x08, 0xf7, 0x30, 0x52, 0xda, 0x28, 0x2f, 0x38, 0x46, 0xc4,
  0xee, 0x74, 0x63, 0xbf, 0xc8, 0xd4, 0x7a, 0x27, 0x02, 0xcc, 0xa5, 0x6c,
  0xb4, 0x1b, 0xbd, 0x34, 0x5f, 0x0a, 0x60, 0xd5, 0xb3, 0xc5, 0x5f, 0x46,

  0x9f, 0xf7, 0xf0, 0x29, 0xa7, 0x5b, 0xac, 0xd0, 0x7d, 0x3d, 0x83, 0xa3,
  0x2b, 0x4a, 0x61, 0x8f, 0x12, 0x93, 0x02, 0x05, 0x39, 0x24, 0x09, 0x86,
  0x71, 0x99, 0xbc, 0xd8, 0x53, 0xf5, 0x92, 0x77, 0xa9, 0x54, 0xff, 0x6d,
  0xcd, 0x09, 0xcb, 0x72, 0xc8, 0x59, 0x50, 0xf3, 0x22, 0x50, 0x61, 0x31,
  0x2a, 0x67, 0xd8, 0xfc, 0x8b, 0x73, 0x70, 0x51, 0x9a, 0x82, 0x22, 0x39,
  0xad, 0xa8, 0xa2, 0xe8, 0xe5, 0x0b, 0x67, 0xd2, 0x4f, 0xb8, 0x2b, 0x1a,
  0x9c, 0x54, 0x56, 0xd8, 0x5c, 0x91, 0xda, 0xeb, 0xf0, 0x5d, 0xef, 0x5e,
  0xa2, 0xaf, 0x83, 0x81, 0xc7, 0x64, 0x8d, 0xc6, 0xc1, 0xf8, 0xd4, 0x35,
  0x72, 0x2f, 0xc1, 0x17, 0x4a, 0x38, 0xcd, 0x4f, 0xaf, 0x24, 0x6a, 0xc7,

  0x44, 0xd2, 0xf7, 0x79, 0x12, 0x4c, 0xd8, 0x4f, 0xd3, 0x35, 0x06, 0x11,
  0x26, 0xcb, 0x82, 0xa4, 0x8f, 0x3c, 0xc6, 0x4a, 0x82, 0xd6, 0x29, 0x89,
  0x9e, 0xfe, 0xfe, 0xe8, 0xfc, 0xc3, 0xd1, 0xd9, 0xf3, 0xbb, 0x02, 0xd5,
  0x1a, 0xcd, 0x3d, 0x91, 0x03, 0xeb, 0x82, 0x19, 0x34, 0xa0, 0x7e, 0xc2,

  0x50, 0x06, 0x5e, 0xd4, 0x01, 0xa1, 0x0d, 0x9a, 0xd9, 0x7a, 0x58, 0x34,
  0x86, 0x74, 0x85, 0x49, 0x22, 0x61, 0x08, 0x20, 0xce, 0xf3, 0x95, 0x10,
  0xb9, 0x93, 0xb9, 0x19, 0x97, 0xd2, 0x93, 0xb1, 0xa3, 0xef, 0xe3, 0xeb,
  0x1d, 0x49, 0x1e, 0x37, 0x75, 0xe2, 0x21, 0x2a, 0x37, 0xb5, 0xed, 0x26,
  0xf5, 0x4a, 0x9b, 0x5a, 0x8b, 0x40, 0xab, 0x79, 0xdf, 0xf2, 0xc9, 0xc4,
  0x66, 0xcf, 0x36, 0x23, 0x7c, 0xc7, 0xc7, 0xed, 0x25, 0xb7, 0x9f, 0x12,
  0x2d, 0xb5, 0x91, 0x91, 0x4e, 0xdb, 0x68, 0xb9, 0x7b, 0xaf, 0xca, 0xb9,
  0x1a, 0xfd, 0x50, 0xe6, 0x16, 0xde, 0x55, 0x98, 0xa0, 0x8b, 0x1c, 0xa0,
  0x2a, 0x2e, 0xb5, 0x9b, 0x1d, 0x9c, 0x5c, 0xd1, 0x66, 0x5d, 0x1e, 0x0d,
  0x06, 0x46, 0x16, 0x96, 0x92, 0x96, 0xd0, 0xf5, 0x8c, 0x31, 0x52, 0x23,
  0xdd, 0xb6, 0x27, 0xfd, 0xc8, 0x74, 0x8a, 0x95, 0x74, 0x4e, 0x8a, 0xfd,
  0x80, 0xcd, 0x77, 0xbd, 0x9c, 0xc3, 0x85, 0x01, 0x8d, 0x77, 0xbc, 0x56,
  0x4a, 0x28, 0xb6, 0x49, 0x78, 0xc8, 0xb9, 0x44, 0x93, 0xa2, 0xb3, 0x46,
  0xda, 0xc3, 0xb3, 0x1f, 0x68, 0x0c, 0x09, 0xb9, 0x3c, 0x07, 0xaf, 0x5d,


  0x88, 0xdb, 0x6e, 0xd8, 0x99, 0xde, 0x19, 0x9c, 0x5e, 0x9f, 0xc0, 0xf6,
  0x7d, 0xb8, 0x7e, 0xd7, 0x91, 0xd4, 0x85, 0x26, 0x0a, 0x06, 0x39, 0xed,
  0xb1, 0xc5, 0xeb, 0x9d, 0xa9, 0x96, 0x2d, 0xd8, 0x91, 0x02, 0xd6, 0x42,

  0x48, 0x03, 0xb7, 0x1f, 0xed, 0xaf, 0x38, 0xa5, 0xfd, 0xfe, 0x7e, 0xf3,
  0x94, 0xda, 0xe1, 0xaa, 0x19, 0xc0, 0xd8, 0x23, 0x77, 0x41, 0x45, 0xc6,
  0xec, 0xa9, 0x4d, 0xdb, 0x3c, 0x85, 0x82, 0x6c, 0x84, 0xae, 0x13, 0x73,
  0x29, 0xbc, 0x87, 0x9e, 0xa7, 0x50, 0x82, 0x4e, 0x5c, 0x9c, 0xb0, 0x9b,
  0x0d, 0xdc, 0x90, 0x78, 0x7b, 0x39, 0x1c, 0x0a, 0x27, 0x16, 0x17, 0x63,
  0x53, 0x16, 0xea, 0xeb, 0x87, 0x9a, 0xeb, 0x87, 0x2d, 0x99, 0x80, 0x04,
  0xb4, 0x25, 0x4b, 0xad, 0x5a, 0xd7, 0xef, 0xad, 0x60, 0xf3, 0xf9, 0xc2,
  0x60, 0xda, 0xe4, 0x45, 0xa7, 0x2e, 0x2d, 0x06, 0x15, 0x7a, 0x65, 0xf6,
  0x63, 0x18, 0xff, 0x19, 0xf7, 0x55, 0xf2, 0x45, 0x0e, 0xf9, 0xcf, 0x30,
  0xbd, 0x93, 0xc8, 0x2d, 0xf2, 0x19, 0x3b, 0x10, 0xe5, 0x0d, 0x4e, 0xe2,
  0xe4, 0x62, 0x17, 0xa9, 0xc3, 0x28, 0x28, 0xe1, 0x50, 0x42, 0x34, 0xd4,
  0xd4, 0xdc, 0x6f, 0xbb, 0xb5, 0x3e, 0xd8, 0x30, 0x9e, 0xd6, 0x6b, 0x8a,
  0x28, 0xd2, 0x68, 0x81, 0x2a, 0x26, 0x07, 0x59, 0x51, 0xd4, 0xcb, 0x10,
  0xba, 0x8f, 0x73, 0x7b, 0x7d, 0x8b, 0x89, 0x18, 0xf5, 0xe8, 0x7e, 0xdc,
  0x82, 0x55, 0x47, 0x6e, 0x2d, 0x4a, 0x22, 0x23, 0x1b, 0x90, 0x6b, 0xa6,
  0x8e, 0xbf, 0x7f, 0xe3, 0x34, 0xdb, 0xd1, 0x3c, 0x35, 0xa6, 0x17, 0x51,
  0x48, 0xdb, 0xd0, 0xe0, 0x12, 0x9b, 0x6c, 0xd9, 0xa7, 0xa0, 0xea, 0x38,
  0x49, 0x16, 0x06, 0xda, 0x3c, 0xa5, 0x1a, 0x9b, 0xb4, 0xa4, 0x20, 0xaa,
  0xc0, 0xca, 0x53, 0x3b, 0xb9, 0x96, 0xd9, 0x09, 0xeb, 0xd0, 0x16, 0x91,
  0x64, 0xef, 0x60, 0xf3, 0x30, 0x0c, 0xe3, 0x6e, 0xbf, 0xdc, 0xfd, 0x1c,
  0x64, 0xf3, 0x23, 0x61, 0x8d, 0xdb, 0x2d, 0x63, 0x2c, 0xe0, 0x76, 0x9c,
  0x3f, 0x31, 0x6a, 0x34, 0xbd, 0x57, 0xe0, 0x14, 0xa2, 0x12, 0xcd, 0x08,
  0x72, 0x50, 0x49, 0x71, 0xb3, 0x8f, 0x45, 0x03, 0x9b, 0x28, 0x1b, 0x26,
  0x49, 0x77, 0xb4, 0x4f, 0x9c, 0x20, 0xd6, 0x77, 0x08, 0x18, 0x1b, 0x94,
  0x60, 0x27, 0x35, 0x60, 0x29, 0x57, 0x27, 0xd7, 0x57, 0xf0, 0xc7, 0xe0,
  0xfa, 0xe2, 0xaa, 0x05, 0x99, 0xb1, 0x62, 0x98, 0x0e, 0xdc, 0x34, 0x4d,
  0x57, 0xa1, 0x6d, 0xae, 0xa3, 0xb6, 0x51, 0x26, 0x34, 0xb3, 0x9d, 0x32,
  0x08, 0xf4, 0xe5, 0xe0, 0x7d, 0x95, 0xfd, 0xda, 0x42, 0x27, 0x20, 0x1f,
  0x56, 0x2e, 0x8c, 0xcf, 0x7c, 0x35, 0x85, 0xd0, 0x82, 0x91, 0x18, 0x71,
  0xc5, 0x86, 0xd1, 0xd3, 0x6c, 0xc1, 0x68, 0x43, 0xe7, 0xbf, 0x85, 0xb1,
  0xd7, 0xf6, 0xd4, 0x2d, 0x68, 0x86, 0x9c, 0x9a, 0xcb, 0xcd, 0x59, 0x6c,
  0xb7, 0x76, 0xe0, 0xb4, 0x0a, 0x05, 0xd0, 0x89, 0xd6, 0xc9, 0x81, 0x2c,
  0x7a, 0xc9, 0x13, 0xf4, 0x0b, 0xba, 0xd0, 0x86, 0x5d, 0x70, 0x99, 0xcf,
  0x13, 0xf6, 0xf0, 0x73, 0x72, 0xae, 0x32, 0x27, 0x96, 0x2d, 0x8c, 0x4b,
  0x1b, 0x85, 0xf0, 0x30, 0x0c, 0x84, 0x18, 0x9e, 0xf2, 0x9a, 0x41, 0x14,

  0xc8, 0x85, 0x3a, 0xf8, 0x5c, 0x12, 0xb0, 0x54, 0x2b, 0xc2, 0x66, 0x5b,
  0xd3, 0x59, 0x39, 0xd8, 0x62, 0x75, 0xe6, 0xbd, 0xdd, 0x64, 0x32, 0x08,
  0xca, 0x10, 0xe6, 0x2c, 0xd4, 0x47, 0x4f, 0x8b, 0xeb, 0x29, 0xd1, 0x4a,
  0x73, 0x6c, 0x48, 0x97, 0x70, 0xfb, 0x87, 0x5e, 0xca, 0x53, 0xc1, 0xb0,
  0x1a, 0x55, 0x2f, 0x22, 0x98, 0x87, 0xa1, 0x6d, 0x39, 0x72, 0x0e, 0xd1,
  0x2c, 0x9b, 0x4c, 0xb7, 0xa6, 0xcf, 0xf9, 0x6c, 0x56, 0x95, 0xb6, 0xc8,
  0x76, 0x64, 0xf2, 0xd0, 0x28, 0x5a, 0xdb, 0x7e, 0xb5, 0xa1, 0x44, 0x37,
  0x35, 0x18, 0x4a, 0xb7, 0xb2, 0x4e, 0x06, 0xea, 0x91, 0x1d, 0x44, 0xd0,
  0x89, 0x3e, 0x64, 0x82, 0x1c, 0x93, 0x81, 0x6d, 0x41, 0xf9, 0x0f, 0x63,
  0xb3, 0x69, 0x08, 0xa8, 0x84, 0x69, 0x5b, 0x2c, 0xb4, 0xc6, 0x39, 0x2b,
  0xf4, 0x84, 0xe9, 0xec, 0x43, 0x84, 0x91, 0x0f, 0x99, 0xb2, 0x09, 0x54,
  0xd2, 0xc8, 0x78, 0xd6, 0x2e, 0x19, 0x55, 0xcd, 0x95, 0x12, 0xca, 0x83,
  0xb7, 0xd0, 0x4b, 0xf7, 0xd0, 0x98, 0xa5, 0x91, 0xf5, 0x63, 0x79, 0x41,
  0xc5, 0x60, 0x0b, 0x8c, 0xa8, 0xa0, 0x5e, 0x01, 0x81, 0xb5, 0xc8, 0x82,
  0xa5, 0x59, 0x0c, 0x69, 0xb1, 0xcc, 0x66, 0x98, 0x23, 0x5e, 0x87, 0x8a,
  0x50, 0x35, 0xb0, 0xbf, 0xa2, 0x8a, 0xd5, 0x45, 0x96, 0xa8, 0x91, 0x64,
  0xbd, 0x5e, 0xbf, 0xbe, 0xba, 0xd6, 0xca, 0x5f, 0x22, 0xd0, 0x2b, 0x3c,
  0x32, 0x45, 0xa4, 0x54, 0xda, 0x4a, 0xb3, 0x14, 0x91, 0x84, 0xf2, 0x62,
  0x13, 0xab, 0x54, 0x10, 0xb3, 0x0f, 0xac, 0xca, 0x7c, 0x46, 0xad, 0x7d,
  0x54, 0x75, 0x0b, 0x35, 0x64, 0x26, 0x15, 0x8c, 0x31, 0x78, 0x60, 0xf0,

  0x7a, 0xe5, 0xbe, 0xd3, 0xac, 0x0e, 0xa5, 0xa9, 0x03, 0x1b, 0xd1, 0x0f,
  0xb5, 0x83, 0xe3, 0x8c, 0x10, 0xca, 0x78, 0xac, 0xab, 0x63, 0xda, 0x9a,
  0x54, 0x9b, 0x8b, 0xd0, 0xb9, 0x92, 0xca, 0x47, 0xf9, 0xf7, 0x2d, 0xb5,
  0x7c, 0xda, 0xd8, 0x85, 0xc0, 0xa1, 0x60, 0x57, 0xba, 0x9c, 0x1d, 0x52,
  0xbf, 0x99, 0x64, 0x39, 0xd4, 0xbf, 0x56, 0x26, 0xd5, 0x72, 0xe1, 0xcb,
  0x79, 0x5b, 0x7d, 0x6a, 0x46, 0xd4, 0xa0, 0xa8, 0x33, 0x45, 0x44, 0x55,
  0xb0, 0xdb, 0xef, 0xa2, 0xf3, 0x37, 0x6f, 0x23, 0x69, 0x02, 0x9e, 0x74,
  0x6f, 0x43, 0x02, 0x50, 0xf1, 0x82, 0x0d, 0x82, 0xa3, 0x0e, 0xe8, 0x17,
  0x5b, 0x1d, 0x06, 0x5a, 0x90, 0xb2, 0x2d, 0x8e, 0xb2, 0x9b, 0xb7, 0x61,
  0x5f, 0x9c, 0xf9, 0xfa, 0x77, 0x46, 0xeb, 0x51, 0xa4, 0x64, 0x11, 0x4f,


  0x67, 0x1d, 0x7b, 0xd1, 0xd3, 0xfd, 0xdd, 0xf8, 0xac, 0x75, 0xe9, 0x2b,

  0x66, 0xd5, 0xd9, 0x7e, 0xb5, 0xd3, 0xdf, 0x7e, 0xf1, 0x79, 0x7f, 0x9b,
  0x3a, 0xd9, 0x3a, 0x73, 0xb3, 0x1d, 0x57, 0x9d, 0x81, 0x02, 0xfd, 0x7c,
  0xa3, 0x76, 0x44, 0x5f, 0xfe, 0xc2, 0xfc, 0xb1, 0x8f, 0xcf, 0xf5, 0xb9,
  0xab, 0x8e, 0xf7, 0x8d, 0x39, 0xe8, 0x34, 0x69, 0xe6, 0xc5, 0x41, 0x7a,
  0x36, 0xab, 0x88, 0x69, 0x71, 0x91, 0x22, 0x19, 0x29, 0xca, 0xa6, 0xb3,
  0x4f, 0xda, 0x10, 0xd0, 0x34, 0x38, 0xa1, 0xdb, 0x19, 0x9e, 0x91, 0xb2,

  0xf4, 0x91, 0xa8, 0x91, 0x96, 0xab, 0x9b, 0xef, 0x7b, 0x6c, 0xf3, 0x17,
  0x5b, 0x7d, 0x08, 0xe1, 0x62, 0x2e, 0x5d, 0x13, 0xa6, 0x8b, 0x20, 0x9e,
  0x9a, 0x28, 0x41, 0x02, 0xfa, 0xc2, 0x0f, 0xaa, 0xc6, 0x6d, 0x02, 0xe2,
  0xae, 0x90, 0x21, 0xf0, 0x23, 0x5b, 0x89, 0xe3, 0x56, 0x12, 0xd3, 0xc8,
  0xa6, 0x4e, 0xb4, 0x01, 0xe7, 0x64, 0x60, 0x96, 0x98, 0x49, 0xeb, 0x70,
  0xf8, 0xce, 0x9f, 0xff, 0x6c, 0x39, 0x12, 0xb7, 0x55, 0xa7, 0x5e, 0x1e,
  0xfb, 0x04, 0xd5, 0xca, 0xb1, 0x6a, 0xee, 0x0a, 0xd0, 0x39, 0xf8, 0x91,
  0x9c, 0xc3, 0x3f, 0xf7, 0x7e, 0x84, 0x7f, 0xfe, 0xdc, 0xd1, 0x4b, 0xcd,
  0xb0, 0x5c, 0xb6, 0x60, 0xc4, 0xc2, 0x1f, 0xd2, 0x01, 0x75, 0xa3, 0x7a,
  0x5b, 0x5a, 0xd2, 0x0c, 0xae, 0x8f, 0x2f, 0xf9, 0x32, 0x16, 0x1c, 0xf6,
  0x26, 0x6a, 0x46, 0x3e, 0x44, 0x6a, 0x3d, 0xb2, 0x70, 0xea, 0xa8, 0xc1,
  0x74, 0x62, 0xf6, 0xd2, 0x79, 0xa5, 0x6b, 0x93, 0x1a, 0xee, 0x99, 0x03,
  0xc4, 0xa0, 0xdf, 0x4e, 0xd1, 0xbf, 0xc2, 0x25, 0xe9, 0xc0, 0x77, 0x55,
  0x91, 0x96, 0x8e, 0xc1, 0x08, 0xec, 0x05, 0x6c, 0xc0, 0x5c, 0x87, 0x7b,
  0x98, 0x52, 0x37, 0x12, 0xf8, 0x5b, 0xae, 0x8d, 0xa8, 0x04, 0x4b, 0x11,
  0xb6, 0x01, 0x36, 0x4a, 0xb9, 0x6d, 0x91, 0x96, 0xb7, 0xb8, 0x3e, 0x29,
  0xf3, 0x71, 0x72, 0x85, 0x70, 0x3e, 0x9f, 0x19, 0xad, 0xef, 0x51, 0x21,
  0x6b, 0x4c, 0xe1, 0x9e, 0xb3, 0xb3, 0x56, 0x3a, 0xe8, 0xb1, 0x2b, 0x10,
  0x65, 0x10, 0x76, 0x4b, 0x1e, 0x2b, 0x92, 0x67, 0xa0, 0xc1, 0x49, 0x2a,
  0xcc, 0x25, 0xe8, 0xb9, 0x86, 0x34, 0x1c, 0x68, 0x26, 0x2c, 0x69, 0x47,
  0x62, 0x41, 0xe9, 0xb7, 0xd1, 0x94, 0x5a, 0xd8, 0xa1, 0x06, 0x1d, 0xc5,

  0x0c, 0x0f, 0x65, 0xf0, 0xcd, 0xa8, 0x67, 0x16, 0x96, 0x4f, 0x14, 0x30,
  0x8d, 0x71, 0x57, 0x6b, 0xf3, 0xf9, 0x66, 0x60, 0x90, 0x57, 0x75, 0xba,
  0xcf, 0x82, 0xb6, 0x02, 0x5d, 0x34, 0xab, 0x8c, 0xce, 0xd8, 0xa7, 0x8e,
  0x9b, 0x4f, 0xbb, 0x8e, 0x7f, 0x02, 0xb7, 0xd6, 0x8e, 0x6a, 0xf7, 0x19,
  0xb5, 0x47, 0x8e, 0x7c, 0x83, 0x86, 0xa6, 0x3f, 0x0f, 0x41, 0xf4, 0x3a,
  0x42, 0x75, 0x67, 0xcb, 0x77, 0xa5, 0x60, 0xd3, 0x67, 0xda, 0xe4, 0x5e,
  0xba, 0x78, 0x7a, 0x03, 0x15, 0xe6, 0x0b, 0x8f, 0xb4, 0xc6, 0x59, 0x8c,
  0x84, 0x29, 0x97, 0xd3, 0x29, 0x61, 0x62, 0xf8, 0x99, 0x79, 0x54, 0xb1,
  0x28, 0x85, 0x03, 0xd2, 0xcf, 0x00, 0x18, 0x39, 0xcd, 0x5c, 0x77, 0xc3,
  0x96, 0x45, 0x0a, 0xc3, 0x29, 0x6d, 0x67, 0x92, 0xd6, 0xd2, 0x59, 0xec,
  0x65, 0x27, 0xd7, 0xdb, 0x6a, 0x32, 0x45, 0xd2, 0xd3, 0x89, 0x36, 0xf9,
  0x20, 0xa6, 0x06, 0x79, 0x19, 0xb0, 0xcc, 0x11, 0xc9, 0xd7, 0xd0, 0xce,
  0xfb, 0x56, 0xba, 0x1b, 0xd1, 0xc3, 0x86, 0xfd, 0x71, 0x18, 0x8e, 0x27,
  0x9d, 0x08, 0x88, 0x1f, 0xa3, 0xb0, 0x15, 0x06, 0xd5, 0x8a, 0xf5, 0x4a,
  0xe1, 0x47, 0x4d, 0xa9, 0x39, 0xa1, 0xed, 0x58, 0xe5, 0x17, 0xb0, 0xac,
  0xd0, 0xd5, 0x96, 0xf6, 0xfa, 0x3b, 0xde, 0xc1, 0x96, 0xb3, 0xde, 0x68,
  0x34, 0xea, 0x91, 0x1e, 0x70, 0xc8, 0xca, 0xc9, 0xa6, 0x28, 0x07, 0x2d,
  0x3e, 0x83, 0x41, 0x22, 0xfb, 0x7d, 0x7c, 0x7c, 0x2c, 0x7a, 0xcc, 0xf5,
  0x4d, 0x43, 0xa3, 0x30, 0x80, 0x53, 0xa2, 0x51, 0x85, 0xda, 0x1c, 0x96,
  0x37, 0xcb, 0x6a, 0x4c, 0xdd, 0x90, 0x91, 0x65, 0x28, 0xeb, 0x35, 0x35,
  0xb2, 0x0d, 0x54, 0x50, 0x6c, 0x4a, 0xdf, 0xb5, 0x99, 0x89, 0x30, 0xb6,
  0x77, 0x34, 0x0b, 0x6e, 0x80, 0x42, 0x2f, 0xca, 0xd8, 0xcd, 0x16, 0xab,
  0x3c, 0x55, 0x17, 0xba, 0x4b, 0x27, 0x58, 0x86, 0x32, 0xd9, 0x74, 0x14,
  0xfa, 0x6c, 0x9c, 0x4a, 0x06, 0x58, 0x2c, 0xdf, 0x6a, 0x8e, 0xfd, 0xc4,
  0x79, 0xc8, 0x56, 0xd7, 0x8f, 0xe4, 0x45, 0xeb, 0x91, 0x04, 0x37, 0x1f,
  0xad, 0x2a, 0xdc, 0xf6, 0xf5, 0x63, 0x42, 0x14, 0x3d, 0x96, 0x0b, 0x71,
  0x7c, 0x83, 0xf9, 0x5b, 0x33, 0x3c, 0x1c, 0x98, 0x72, 0xc9, 0x4c, 0x40,
  0xe4, 0xc7, 0x60, 0x70, 0xb6, 0x79, 0x7d, 0x36, 0xf0, 0x32, 0xde, 0x1f,
  0xd1, 0x65, 0xcc, 0x4d, 0xb4, 0x6b, 0x2e, 0x4f, 0xde, 0x22, 0x02, 0x87,
  0xce, 0x27, 0x75, 0x0a, 0xe7, 0xaf, 0x04, 0xf1, 0x4e, 0x96, 0x99, 0x16,
  0xc3, 0x18, 0xd9, 0x9d, 0x25, 0x19, 0x15, 0x91, 0xa3, 0x08, 0xa7, 0x1b,
  0x40, 0x09, 0xb1, 0x65, 0x74, 0x7e, 0x74, 0x8d, 0xe5, 0x2d, 0x95, 0xa4,
  0x78, 0xa0, 0x0b, 0xc8, 0xf7, 0x8c, 0xdf, 0x1b, 0x5c, 0x02, 0x8a, 0xda,

  0xc4, 0x23, 0xdb, 0x0c, 0x45, 0x95, 0x75, 0x3e, 0xbe, 0x52, 0x09, 0x6f,
  0xd5, 0xf6, 0xc3, 0x96, 0x8a, 0x74, 0x68, 0xd2, 0x7c, 0xf3, 0x34, 0xb6,
  0x83, 0xa7, 0xc1, 0x1b, 0x10, 0xbe, 0x0e, 0x57, 0xc2, 0xca, 0x75, 0xa3,
  0xa5, 0x8a, 0x5f, 0xa7, 0x3f, 0xcb, 0xa7, 0x29, 0x7a, 0x02, 0xe9, 0xbc,
  0xdc, 0xc0, 0x9b, 0xe7, 0x26, 0xe5, 0xdd, 0x29, 0xb9, 0x14, 0xa7, 0x0e,
  0x60, 0xcb, 0x57, 0x04, 0xe5, 0x84, 0xd9, 0x53, 0xd3, 0x87, 0x49, 0x4b,
  0x20, 0xfd, 0x0a, 0x43, 0xc2, 0xce, 0x4b, 0x47, 0x60, 0x22, 0x8c, 0x30,
  0xfb, 0x83, 0xca, 0x01, 0xcb, 0x7a, 0x8a, 0x6d, 0x5a, 0x83, 0xe5, 0x53,


  0x0f, 0x69, 0xe9, 0xc7, 0x2a, 0x48, 0x53, 0x90, 0x15, 0xae, 0xf4, 0xc3,
  0xbf, 0xa8, 0x09, 0x8f, 0x6f, 0xd0, 0x22, 0x9b, 0x7a, 0x42, 0xd7, 0xa0,
  0x50, 0x04, 0x90, 0xff, 0x48, 0x45, 0xa5, 0xf2, 0x7e, 0xe9, 0x6d, 0xec,
  0x42, 0xba, 0xaf, 0x42, 0xef, 0xee, 0x36, 0xdb, 0x99, 0x31, 0x2a, 0x61,
  0x1d, 0xac, 0xba, 0x06, 0x0d, 0xa4, 0x89, 0xbe, 0x8d, 0xe1, 0xbe, 0x39,
  0xb1, 0xed, 0x13, 0x1a, 0xf8, 0x41, 0xb5, 0xd6, 0x0a, 0x1c, 0x87, 0xc4,
  0x18, 0xd4, 0x3d, 0x76, 0x61, 0xbd, 0x6f, 0x31, 0x72, 0x58, 0x89, 0xbd,
  0xb6, 0x68, 0xec, 0x7c, 0x3f, 0x58, 0x0b, 0x4c, 0x4c, 0x96, 0x2a, 0x42,
  0xcf, 0x68, 0x80, 0xfe, 0xdf, 0xd7, 0x6c, 0x77, 0xa0, 0x7e, 0xc0, 0x0f,

  0xa1, 0xd2, 0xc1, 0x07, 0x10, 0xb6, 0xa1, 0xa7, 0xae, 0x9d, 0xb0, 0xfd,
  0xae, 0xdf, 0xde, 0x83, 0x97, 0xb7, 0x7a, 0x3e, 0xef, 0x4e, 0x8e, 0xde,
  0x18, 0x18, 0x81, 0xdf, 0x03, 0x59, 0xd8, 0x7a, 0x35, 0x87, 0x09, 0x77,
  0x81, 0x58, 0xaa, 0xa3, 0x84, 0x4e, 0x47, 0x09, 0x95, 0x68, 0x05, 0xd4,
  0xb5, 0x32, 0xe1, 0x1b, 0xd2, 0xda, 0x0c, 0xa1, 0xd5, 0x33, 0xe2, 0x66,
  0x1f, 0x88, 0xc7, 0x1a, 0x35, 0x65, 0xae, 0xad, 0x72, 0x08, 0x79, 0x4a,
  0x84, 0x3c, 0xcb, 0x87, 0xf9, 0x64, 0xb2, 0x42, 0xba, 0x33, 0x3c, 0x24,

  0xd5, 0x40, 0x31, 0xc1, 0x74, 0x70, 0x1b, 0xf1, 0xbd, 0x21, 0xce, 0x1e,
  0x8e, 0x14, 0xae, 0x5a, 0x47, 0x0a, 0x13, 0x48, 0x25, 0xf7, 0xee, 0x46,
  0xbd, 0x30, 0x5d, 0x6d, 0x06, 0x35, 0xf1, 0xa8, 0x30, 0x9f, 0xdd, 0x31,
  0x9a, 0x26, 0x64, 0x80, 0xfd, 0xcb, 0xe8, 0x1f, 0xff, 0xfc, 0xf1, 0xe7,
  0x40, 0x77, 0x03, 0x74, 0xf8, 0xdd, 0x70, 0x65, 0x21, 0x3c, 0x3d, 0x17,
  0xd4, 0x16, 0x83, 0x13, 0xcf, 0x89, 0x26, 0x1c, 0xcf, 0xa8, 0xca, 0x64,
  0x36, 0xe9, 0x3b, 0x39, 0x95, 0xbe, 0x58, 0x44, 0x13, 0x4a, 0x3f, 0x48,
  0xdd, 0xea, 0xb0, 0x14, 0x9c, 0xcb, 0x77, 0x11, 0xb9, 0x9b, 0x5a, 0x04,
  0xd9, 0x94, 0x69, 0x83, 0xec, 0xcb, 0x27, 0xe1, 0xe1, 0xc7, 0xd8, 0x36,
  0x3e, 0xcd, 0x60, 0xfa, 0x87, 0xab, 0x53, 0xe3, 0xea, 0x74, 0xb9, 0xf2,
  0x0d, 0x50, 0xea, 0x63, 0x2f, 0x79, 0x4c, 0x86, 0xc0, 0x25, 0x4a, 0x05,
  0x7e, 0xe8, 0xcd, 0xcb, 0xe8, 0x70, 0x0e, 0x34, 0x9e, 0xb6, 0x40, 0x76,
  0xbc, 0xc3, 0xd7, 0x22, 0x7d, 0xcd, 0xe0, 0x97, 0x4e, 0xf3, 0x02, 0x76,
  0x68, 0x2e, 0xd5, 0xb8, 0x52, 0x92, 0x5c, 0x77, 0x66, 0x44, 0x54, 0x60,
  0xe2, 0xb9, 0x03, 0xee, 0xf6, 0x44, 0xe3, 0x26, 0x30, 0x36, 0x07, 0x28,
  0x8c, 0x94, 0xf5, 0x25, 0x28, 0x8f, 0x30, 0x7b, 0x30, 0xb2, 0xd1, 0x5a,
  0x2f, 0xbb, 0x42, 0x52, 0x85, 0xe2, 0xc8, 0x05, 0x61, 0x04, 0x4c, 0x19,

  0x22, 0x5b, 0x58, 0xc0, 0x74, 0xdc, 0x15, 0x99, 0x2e, 0xa6, 0x2e, 0xfa,


  0x9b, 0xf4, 0x2e, 0xf6, 0xf7, 0x55, 0x17, 0xc0, 0x6e, 0xd0, 0xc8, 0x66,
  0xaf, 0x62, 0xc1, 0x46, 0xaa, 0xfd, 0x85, 0x5d, 0x4f, 0xac, 0x31, 0x95,
  0xbd, 0x4b, 0x39, 0x8f, 0xc7, 0xa6, 0x90, 0xde, 0x85, 0x0e, 0xa4, 0x32,

  0xc4, 0x18, 0xeb, 0x22, 0x93, 0x59, 0x5f, 0xba, 0x6a, 0x53, 0x5a, 0x95,
  0x1d, 0x93, 0x18, 0x6e, 0x13, 0xd7, 0xa5, 0xc4, 0x14, 0x01, 0xae, 0x86,
  0x15, 0x87, 0x3e, 0x95, 0x95, 0x8b, 0xe7, 0x21, 0x18, 0xeb, 0xbd, 0x16,
  0xbc, 0x9c, 0x29, 0x99, 0xfd, 0x62, 0x3f, 0x10, 0x58, 0x32, 0xf5, 0x0e,
  0x63, 0x18, 0x12, 0x7c, 0x9b, 0xd2, 0x2b, 0x90, 0x87, 0xf0, 0x81, 0x9f,
  0xc8, 0x81, 0x37, 0x86, 0xc3, 0x58, 0xcb, 0x8b, 0xfd, 0xfd, 0x7d, 0x8e,
  0xb5, 0x74, 0x4e, 0xe9, 0xc3, 0x57, 0x27, 0xc7, 0x17, 0xef, 0xdf, 0x9f,
  0x9c, 0xbf, 0x39, 0x79, 0xa3, 0x19, 0x1f, 0xce, 0x4a, 0x2c, 0x75, 0xf8,
  0x2b, 0xc2, 0x2c, 0x41, 0xd8, 0xe7, 0xed, 0xfd, 0xad, 0xde, 0xce, 0xfe,
  0x56, 0x04, 0xb4, 0x18, 0x9b, 0x3a, 0xb5, 0x78, 0x16, 0xa3, 0x7d, 0x7b,
  0xb3, 0x04, 0x55, 0x0d, 0xa1, 0x3d, 0x2b, 0xc4, 0xdc, 0x20, 0xd7, 0x2b,
  0x7a, 0x7b, 0x92, 0x0a, 0xed, 0xe8, 0x40, 0x66, 0x40, 0xbf, 0x63, 0x40,
  0xda, 0x6c, 0xc0, 0x52, 0x74, 0x1f, 0x22, 0xd0, 0x9d, 0x2d, 0xfc, 0x50,

  0x3f, 0x7a, 0x0b, 0xda, 0xc7, 0x24, 0x7f, 0x60, 0x5a, 0x3c, 0xbe, 0x01,
  0xa5, 0x34, 0xf1, 0x43, 0x95, 0xf5, 0xf7, 0xf1, 0xf5, 0x5d, 0x7e, 0xfd,
  0x77, 0x8c, 0xd1, 0xef, 0xbf, 0xaa, 0x1b, 0x96, 0x70, 0x91, 0x09, 0x15,
  0x5e, 0x4b, 0x12, 0x5b, 0xf0, 0xfd, 0x07, 0x6c, 0x8e, 0xbf, 0x3b, 0xba,
  0xc4, 0xa7, 0xc1, 0x2c, 0xbf, 0xf8, 0xe1, 0x2f, 0xb6, 0xcc, 0xf3, 0x6e,
  0x5b, 0xb3, 0x19, 0xa5, 0x92, 0x95, 0x1a, 0xf1, 0x65, 0x7e, 0xd0, 0xdb,
  0x2a, 0xb3, 0xc6, 0x20, 0x54, 0x21, 0x43, 0x2b, 0xc4, 0x0c, 0x54, 0xd8,
  0x3a, 0xee, 0x91, 0x25, 0x87, 0x56, 0x94, 0x72, 0xc5, 0x43, 0x75, 0xfd,
  0xc0, 0xca, 0x71, 0x1a, 0x0f, 0x29, 0xf7, 0x7d, 0x48, 0xb3, 0x31, 0x37,
  0xa6, 0xad, 0x39, 0x66, 0xab, 0x62, 0x99, 0x84, 0xbc, 0xa6, 0x2b, 0x31,
  0x76, 0x50, 0xa9, 0x2d, 0xd2, 0x79, 0x5c, 0xa4, 0xdc, 0x7e, 0x1e, 0x09,
  0xfc, 0x9e, 0x7b, 0x65, 0x72, 0xaa, 0x14, 0xc5, 0xbe, 0x2c, 0x98, 0x6c,

  0xee, 0xa5, 0x9d, 0x9a, 0x5e, 0x0e, 0x48, 0xc4, 0x0c, 0x6b, 0x24, 0x31,
  0x4a, 0xde, 0xac, 0x95, 0x30, 0x74, 0x75, 0xfb, 0xdf, 0x28, 0x14, 0x6d,
  0xa0, 0x73, 0xd1, 0xdb, 0xd3, 0xb3, 0x93, 0x8d, 0xe8, 0x6d, 0x52, 0x49,
  0x89, 0x93, 0x66, 0x18, 0xa3, 0xc8, 0xff, 0x03, 0x29, 0x58, 0x06, 0x94,
  0x50, 0x6a, 0x84, 0x83, 0xb9, 0x60, 0xe2, 0x83, 0x23, 0x65, 0x43, 0xeb,
  0xa5, 0xf8, 0x70, 0x68, 0x89, 0x18, 0x8f, 0xd3, 0xdc, 0x32, 0x8d, 0x6f,
  0xca, 0xc9, 0x07, 0xf2, 0x6e, 0x15, 0xe7, 0xa1, 0xef, 0x20, 0x9e, 0xe5,
  0x6e, 0x0a, 0x01, 0x4e, 0x5a, 0x72, 0x9e, 0x35, 0x5e, 0x9c, 0x96, 0x8b,
  0x19, 0x72, 0x83, 0x20, 0xca, 0xcb, 0x2c, 0xb1, 0x95, 0x7d, 0x44, 0xf9,
  0xdc, 0x29, 0x5e, 0x8c, 0x1e, 0x62, 0xa8, 0xb8, 0x5e, 0x67, 0xe3, 0xde,
  0xe9, 0xc6, 0x61, 0xda, 0x09, 0xff, 0xb9, 0xf9, 0x55, 0x10, 0x7c, 0x4c,
  0x1b, 0x59, 0x50, 0xcf, 0x5c, 0x79, 0x83, 0x28, 0x8a, 0x7b, 0xa8, 0x8b,
  0x90, 0x57, 0xb5, 0xb3, 0x46, 0x09, 0x01, 0xf5, 0x95, 0x7c, 0x77, 0x6a,
  0xee, 0xfe, 0x45, 0xfa, 0x34, 0xa9, 0xfe, 0x80, 0x25, 0xe0, 0x56, 0xba,
  0x70, 0x97, 0x5e, 0x93, 0x65, 0x1c, 0x85, 0x5a, 0xa2, 0x31, 0x57, 0x96,
  0x96, 0xbc, 0xac, 0x4d, 0x61, 0xb6, 0x7e, 0xac, 0xe9, 0xfa, 0x3a, 0x5f,
  0x7c, 0xec, 0x46, 0xc0, 0xab, 0xc9, 0x97, 0xc2, 0x55, 0x64, 0x65, 0xd0,
  0xe5, 0x2f, 0xe5, 0x6d, 0x12, 0xda, 0xa3, 0x96, 0xaa, 0xec, 0x94, 0x61,
  0x1d, 0x7a, 0x89, 0x0a, 0x1d, 0x57, 0x76, 0x51, 0x1f, 0x82, 0x82, 0xf1,

  0x32, 0x03, 0xda, 0x92, 0x7c, 0xdd, 0x65, 0x41, 0x4d, 0x9d, 0xdd, 0xfd,
  0x4c, 0xdd, 0x12, 0xf5, 0xd5, 0x45, 0xd8, 0x3b, 0xd2, 0x29, 0xb1, 0xef,
  0x07, 0x56, 0xbd, 0x8f, 0x6e, 0x53, 0x2a, 0x44, 0x5c, 0x92, 0x3a, 0x17,
  0x67, 0x5a, 0x6f, 0xc5, 0xd3, 0x34, 0x38, 0xef, 0x40, 0x6e, 0x7d, 0x2a,
  0x67, 0x08, 0x6b, 0x9f, 0x0c, 0x59, 0x86, 0x4e, 0x03, 0x44, 0x61, 0xd5,
  0xf9, 0xcc, 0xa8, 0xa2, 0xc1, 0xdc, 0x16, 0x55, 0xd4, 0xb0, 0x1e, 0x92,
  0x74, 0xc5, 0x00, 0x2e, 0x74, 0x42, 0x0d, 0x97, 0xc9, 0xe5, 0x77, 0x2f,
  0x10, 0x63, 0x6b, 0x45, 0xc2, 0xd0, 0xf4, 0x7d, 0xb0, 0x44, 0xe7, 0x58,
  0x12, 0xa0, 0xf8, 0xcd, 0xb8, 0x64, 0xd9, 0x1e, 0xe0, 0x6d, 0xd3, 0xf4,
  0x2e, 0x94, 0x65, 0x81, 0xf9, 0x11, 0x32, 0x31, 0xca, 0xd2, 0xb0, 0xed,
  0x62, 0x35, 0xed, 0xd8, 0x84, 0xb4, 0xd9, 0x2f, 0x8d, 0x38, 0x80, 0xb2,
  0xb3, 0xde, 0x0d, 0x9e, 0xa1, 0xc6, 0x8a, 0x80, 0x5e, 0x19, 0x37, 0xe8,
  0x7d, 0x07, 0x9a, 0xcf, 0x41, 0xc7, 0x20, 0xaa, 0x93, 0x5f, 0x95, 0xb8,
  0x63, 0x8d, 0x72, 0xa4, 0x65, 0x74, 0x2f, 0xd8, 0x77, 0x4c, 0x34, 0xf7,

  0x4a, 0x19, 0x97, 0x29, 0xb8, 0xf1, 0xd3, 0x9a, 0x4d, 0x01, 0x0c, 0x57,
  0x8c, 0xfa, 0x88, 0xf1, 0x38, 0xa5, 0x1f, 0x7a, 0xc7, 0xf4, 0xf1, 0xde,
  0x3b, 0x1a, 0xee, 0x8b, 0x8e, 0x71, 0xf8, 0x36, 0x7f, 0x75, 0xe0, 0x37,
  0x0a, 0xb6, 0x7e, 0x43, 0x36, 0x3c, 0x96, 0x5a, 0x95, 0x41, 0x89, 0x24,
  0x32, 0x41, 0xee, 0xc1, 0x05, 0x57, 0x64, 0x53, 0x0f, 0x9c, 0xa2, 0x29,
  0xa5, 0xdf, 0x65, 0xd3, 0xa4, 0x1c, 0x80, 0x14, 0x59, 0x10, 0x98, 0xce,
  0xb8, 0x97, 0x4f, 0x7a, 0x94, 0x21, 0x0d, 0xcc, 0xff, 0x16, 0x93, 0x91,
  0x9c, 0x5b, 0x47, 0x00, 0x21, 0x84, 0xbd, 0x3d, 0x1e, 0x87, 0x54, 0x73,
  0x2e, 0x64, 0x44, 0xad, 0x43, 0x08, 0x5f, 0x0b, 0x2d, 0xf8, 0x20, 0x0f,
  0xc4, 0x2b, 0x4f, 0xaf, 0x9b, 0x2e, 0x54, 0x88, 0xcc, 0x25, 0x05, 0x11,
  0x9e, 0x3f, 0x8d, 0xca, 0x23, 0xba, 0xac, 0xbd, 0xd3, 0xaa, 0xc9, 0x86,
  0x9b, 0xb3, 0x2b, 0x97, 0xfc, 0xcf, 0xcb, 0x05, 0xa9, 0xac, 0x88, 0xd8,
  0xe9, 0x79, 0x5f, 0xb4, 0x48, 0x84, 0xb0, 0x38, 0x41, 0xf8, 0xef, 0xf7,
  0xb7, 0xba, 0x5e, 0xa0, 0xbe, 0x22, 0x63, 0x3f, 0xb3, 0x59, 0x42, 0xf0,
  0x30, 0xf1, 0xc8, 0x5e, 0xa8, 0xba, 0xb6, 0xac, 0x1e, 0x91, 0x5f, 0x9b,
  0x62, 0x5a, 0x4a, 0x2d, 0xb6, 0x75, 0x0f, 0x36, 0xa7, 0x87, 0xb6, 0x50,
  0xd8, 0x26, 0x57, 0xd1, 0x86, 0x20, 0x4e, 0x25, 0x63, 0xeb, 0xab, 0x5e,
  0xb3, 0x4d, 0xa6, 0xe9, 0x76, 0xe6, 0x56, 0x6f, 0x38, 0x7d, 0xcb, 0x5a,
  0x3d, 0x4d, 0x84, 0x26, 0x7a, 0xa4, 0xad, 0x6f, 0x7a, 0xb0, 0xa9, 0xd2,
  0xd1, 0xb5, 0x97, 0xe0, 0x0f, 0x19, 0xb0, 0x43, 0x81, 0x43, 0xcb, 0xf6,

  0x3d, 0x63, 0x90, 0xdd, 0x97, 0xb8, 0x63, 0xa6, 0xb5, 0x80, 0xf6, 0xd0,
  0xb1, 0xf2, 0x81, 0xc8, 0xd6, 0xb9, 0x4b, 0xcd, 0x3d, 0x43, 0xae, 0x82,
  0x9c, 0x20, 0xd3, 0x9c, 0x6f, 0x6a, 0xc8, 0xfe, 0xf0, 0xd8, 0x9a, 0x5a,
  0xdc, 0x92, 0xf3, 0x4b, 0xd7, 0xe6, 0x2d, 0x2a, 0xf6, 0xbd, 0x73, 0x38,
  0x86, 0x83, 0xe8, 0x3f, 0xf2, 0x84, 0x6b, 0x56, 0x9f, 0x28, 0x59, 0xfd,
  0xfe, 0xe8, 0xea, 0xfc, 0xf4, 0xfc, 0x9b, 0x03, 0xc3, 0xe3, 0x90, 0xdf,
  0x35, 0x7b, 0x5a, 0x18, 0xde, 0x4d, 0xbf, 0x65, 0xe4, 0x56, 0xf4, 0xfe,
  0xb4, 0x61, 0x6c, 0x63, 0x2c, 0x93, 0xd8, 0x33, 0x3b, 0x2f, 0x8b, 0x84,
  0xe3, 0x22, 0x6c, 0x8b, 0x6a, 0xe5, 0x84, 0x94, 0x6b, 0x92, 0xa8, 0xa4,
  0xc6, 0x6d, 0x01, 0xc0, 0x86, 0xde, 0x19, 0x9e, 0xc9, 0x2c, 0xaf, 0xf5,
  0x88, 0x42, 0xa2, 0x9c, 0xd1, 0xf1, 0xe7, 0x2e, 0x05, 0xb0, 0xc5, 0xac,
  0x1d, 0xd5, 0xd9, 0xe9, 0x13, 0x08, 0xde, 0x32, 0x46, 0xb6, 0x7a, 0x5e,
  0x4d, 0x7f, 0x1c, 0x69, 0x72, 0x51, 0xd2, 0x91, 0x95, 0x29, 0x39, 0x1b,
  0xcc, 0x96, 0x68, 0x8e, 0x57, 0xc0, 0x0f, 0x22, 0xf0, 0xd2, 0xf1, 0x92,
  0xef, 0x0b, 0xa3, 0x93, 0xc9, 0x4f, 0x6d, 0x5d, 0x86, 0xd9, 0x81, 0x67,
  0xa7, 0x39, 0xdb, 0x3c, 0x67, 0xd6, 0xe7, 0xd9, 0x40, 0x74, 0x58, 0x16,
  0xfc, 0x89, 0xa2, 0x24, 0x88, 0x43, 0x32, 0x4b, 0x6c, 0x55, 0x92, 0xd1,
  0x75, 0x6e, 0x58, 0xd7, 0x99, 0x2d, 0x3c, 0xb0, 0x3d, 0x4c, 0x33, 0x8f,


  0xf0, 0x37, 0xea, 0xd4, 0xc1, 0xe0, 0x15, 0x49, 0x60, 0x35, 0x4b, 0x6a,
  0xe0, 0x76, 0xa6, 0x35, 0x24, 0x33, 0x75, 0x5f, 0x9e, 0x22, 0xde, 0x53,
  0xc2, 0x78, 0x63, 0x6e, 0x05, 0x0c, 0x7c, 0x1d, 0xf6, 0x78, 0xb1, 0x1c,
  0xce, 0xc7, 0xfb, 0xd1, 0x21, 0xfc, 0xc7, 0x53, 0xb2, 0x28, 0x67, 0x74,
  0x70, 0x0c, 0x8a, 0x16, 0x26, 0xb8, 0xa0, 0xbc, 0x60, 0xc8, 0x1b, 0xa7,
  0x8b, 0xc4, 0xee, 0x0e, 0xcc, 0xf4, 0x21, 0x56, 0x68, 0x4b, 0xd0, 0x08,
  0xa7, 0x69, 0xc5, 0x79, 0x7a, 0x2d, 0xb8, 0x41, 0x4e, 0x6a, 0x03, 0x9d,
  0xf9, 0xf6, 0xce, 0xe7, 0x11, 0x16, 0x1f, 0xbc, 0x7f, 0xb3, 0x1f, 0x8d,
  0x6e, 0x92, 0xd1, 0x6d, 0xb9, 0x9c, 0x2b, 0x3b, 0xc6, 0x3d, 0x05, 0xf3,
  0x00, 0xe7, 0xe9, 0x21, 0x3e, 0xc0, 0xc4, 0x67, 0xe9, 0x08, 0x4b, 0xff,
  0xba, 0xb5, 0xe8, 0xd4, 0x44, 0xa3, 0x53, 0x8e, 0x1d, 0x6a, 0xc4, 0x06,
  0xa5, 0x0b, 0x70, 0x4e, 0x4d, 0x20, 0x78, 0x01, 0x7b, 0x00, 0x1f, 0x2f,
  0xb9, 0x9b, 0xf5, 0x4a, 0x97, 0xed, 0xcb, 0xba, 0xd7, 0x1b, 0x2f, 0xf6,

  0x56, 0xff, 0x55, 0x4b, 0x7f, 0x8e, 0x5a, 0x6b, 0x0e, 0xac, 0x55, 0x32,
  0xd5, 0x76, 0x64, 0x0f, 0xa0, 0x96, 0x8f, 0x93, 0x44, 0x40, 0x28, 0x0d,
  0xe3, 0x79, 0x1f, 0xc7, 0x27, 0x37, 0xf1, 0x09, 0xe9, 0x2d, 0x47, 0x59,
  0x6c, 0x09, 0x61, 0x52, 0x30, 0x69, 0x51, 0x9a, 0x90, 0x89, 0x02, 0x1a,
  0x84, 0x33, 0x0a, 0xc1, 0xfa, 0x4a, 0x9b, 0xa9, 0xff, 0x56, 0x97, 0x8d,
  0x65, 0x31, 0x52, 0x42, 0xeb, 0xa0, 0x39, 0x68, 0x2d, 0x21, 0xe1, 0xb5,
  0xa1, 0x4d, 0xe1, 0x11, 0x99, 0xf9, 0x2e, 0xc7, 0xa5, 0xed, 0x71, 0x94,

  0x8c, 0x46, 0x48, 0xce, 0x73, 0xec, 0x12, 0xcb, 0x16, 0x75, 0x7e, 0x9f,
  0x4d, 0x0b, 0xf4, 0x8f, 0x50, 0x51, 0x58, 0x1c, 0x8a, 0x65, 0x84, 0x10,
  0x4c, 0xed, 0xd8, 0x60, 0x71, 0xbd, 0x40, 0x4e, 0x6f, 0x76, 0x05, 0xf3,
  0xed, 0x39, 0x88, 0xcd, 0x15, 0xcb, 0x6c, 0xb3, 0x3b, 0x47, 0xb4, 0xd5,
  0x95, 0x63, 0xda, 0xee, 0x6f, 0x3d, 0xe7, 0x98, 0x90, 0x88, 0x6a, 0xa7,
  0x03, 0xef, 0xb9, 0x5a, 0xb2, 0x26, 0x91, 0x03, 0xb1, 0xb7, 0x64, 0xdf,
  0xc1, 0x42, 0xc5, 0x7f, 0x95, 0x8c, 0x6b, 0x43, 0xad, 0xe4, 0x39, 0x6e,

  0xf3, 0x36, 0x9e, 0xee, 0xb6, 0x84, 0x61, 0xf0, 0x5f, 0x3b, 0x4d, 0xa2,
  0x83, 0x5f, 0xff, 0xca, 0xd5, 0x6c, 0xff, 0x82, 0x52, 0x8d, 0xad, 0xae,
  0xfd, 0xde, 0x96, 0x69, 0x89, 0xc0, 0x13, 0xb2, 0xf7, 0xa2, 0x31, 0x9c,
  0x0f, 0x79, 0x4f, 0x2f, 0x60, 0xb9, 0x4b, 0x5e, 0xf4, 0x50, 0x65, 0x87,
  0xc3, 0xf2, 0x54, 0xa8, 0xe0, 0xf4, 0xe1, 0x78, 0x4b, 0x54, 0x6c, 0x51,
  0xa7, 0x25, 0xe2, 0xa4, 0x98, 0x11, 0xa3, 0x9a, 0x19, 0x93, 0x3e, 0x98,
  0xb6, 0x4f, 0x04, 0xb2, 0xe3, 0xa8, 0xe8, 0xf4, 0x03, 0xdc, 0xd4, 0xe8,
  0xc3, 0x82, 0x68, 0x10, 0x63, 0xdc, 0x95, 0x05, 0xfe, 0xa7, 0xd9, 0x45,
  0x6d, 0xb3, 0xb3, 0xd8, 0x5f, 0x1a, 0x93, 0xa7, 0x62, 0xcd, 0x52, 0xbf,
  0x53, 0x62, 0x15, 0x2c, 0xaa, 0xfc, 0xd2, 0x22, 0x8e, 0x01, 0xf1, 0xed,

  0x24, 0x43, 0xb0, 0xbe, 0x7a, 0xb1, 0x40, 0xd5, 0x94, 0x51, 0x6a, 0xd9,
  0xf4, 0x08, 0x8f, 0xce, 0xea, 0xbe, 0xf6, 0xec, 0xb3, 0xf0, 0xf4, 0x01,
  0xff, 0x4a, 0x6a, 0xbb, 0x84, 0x37, 0x80, 0xfd, 0xbc, 0x00, 0x50, 0xf0,
  0x38, 0x9e, 0xdd, 0x02, 0xc1, 0xc3, 0xef, 0x6a, 0x34, 0xb1, 0xe0, 0xb5,
  0xf4, 0x9f, 0x47, 0xdc, 0x5b, 0xdd, 0xe0, 0xec, 0x90, 0xda, 0x5c, 0xe2,
  0xaf, 0x81, 0xe1, 0xbd, 0x0a, 0x10, 0xd7, 0xaf, 0xba, 0x0b, 0x3b, 0xab,
  0xc2, 0xa0, 0xfe, 0x1d, 0xdc, 0xed, 0xeb, 0xd7, 0xda, 0xf6, 0xca, 0x63,
  0x67, 0xad, 0xed, 0x23, 0x9e, 0xb7, 0x5b, 0x2d, 0x7b, 0x63, 0xf6, 0xae,
  0xb1, 0x5b, 0x6d, 0x47, 0xab, 0x57, 0xd5, 0xe3, 0x57, 0x2d, 0x57, 0x75,

  0x37, 0xbc, 0x9b, 0x46, 0x43, 0x6d, 0xf8, 0x3c, 0xd1, 0x65, 0x56, 0xa4,

  0x64, 0x12, 0xc7, 0xb3, 0x7e, 0xf4, 0xc6, 0xe6, 0xb4, 0x10, 0xf0, 0x9e,
  0x67, 0xac, 0x8e, 0x97, 0x2d, 0x99, 0x1f, 0xab, 0x4f, 0x6b, 0x57, 0x92,
  0x7a, 0x6c, 0xe2, 0x02, 0xc9, 0x74, 0x29, 0xca, 0xca, 0x3d, 0x40, 0x4c,

  0xf1, 0xdc, 0x68, 0xf8, 0x52, 0xc2, 0x74, 0x98, 0x9a, 0x25, 0x01, 0x18,
  0xda, 0xfa, 0x5d, 0x37, 0x66, 0x6e, 0xd4, 0x6b, 0x2c, 0x21, 0x08, 0x79,
  0x8a, 0xe8, 0x8b, 0x9a, 0xde, 0x4e, 0x12, 0x51, 0x15, 0x4a, 0xf8, 0xc8,
  0x5d, 0x1a, 0x47, 0x47, 0xb3, 0xaa, 0x37, 0xf8, 0x6e, 0xc4, 0x11, 0xb6,
  0x5a, 0x78, 0xca, 0x6b, 0xf2, 0x4a, 0x5e, 0x15, 0xea, 0xcf, 0x55, 0x4a,
  0xd2, 0x6a, 0x5a, 0x8c, 0x96, 0x73, 0xc2, 0x40, 0x25, 0xb2, 0x32, 0x7d,
  0x22, 0xf0, 0x20, 0x2d, 0xa5, 0x71, 0xba, 0xbd, 0x0f, 0x7e, 0x18, 0xdf,
  0x96, 0xba, 0x24, 0x29, 0xd2, 0xe1, 0x3a, 0x0c, 0x33, 0xe7, 0x7a, 0x7b,
  0xb5, 0x80, 0x08, 0x6a, 0x58, 0x76, 0x0c, 0xd3, 0x8b, 0x28, 0x30, 0xff,
  0xf9, 0xe1, 0xf4, 0xb8, 0xe6, 0xdd, 0xe7, 0x38, 0x4a, 0xb4, 0x32, 0x5a,
  0xc1, 0xb0, 0xb2, 0xf2, 0xe4, 0x04, 0x75, 0x58, 0xcd, 0xc6, 0xd5, 0xc4,
  0xb9, 0xda, 0xf1, 0xe6, 0x59, 0x40, 0xa4, 0x82, 0xbe, 0xf0, 0xcb, 0xee,

  0xe8, 0x8e, 0xde, 0xd1, 0xdd, 0xdf, 0xfa, 0x8e, 0xee, 0xfe, 0x36, 0x77,

  0x54, 0x39, 0x88, 0xf3, 0x77, 0xf7, 0xba, 0x7a, 0x66, 0x29, 0x5d, 0x5f,
  0xd7, 0xe1, 0x5c, 0xcf, 0x19, 0xe8, 0x31, 0x78, 0x44, 0x4f, 0xfc, 0x16,
  0x3d, 0x2e, 0x90, 0x0d, 0xd5, 0x86, 0x45, 0xe2, 0x38, 0x55, 0xf0, 0xc7,
  0x6e, 0x74, 0xca, 0xc0, 0xe6, 0x94, 0x9d, 0x24, 0xaf, 0x9f, 0x71, 0x7d,
  0xad, 0xf8, 0xbd, 0xd5, 0xe7, 0x1f, 0xa8, 0xc0, 0x4f, 0x47, 0x08, 0xaf,
  0x66, 0x3d, 0xee, 0x68, 0x31, 0xab, 0xce, 0x58, 0x2c, 0x29, 0xa4, 0x10,
  0x1d, 0x2d, 0xb0, 0x44, 0x16, 0x34, 0x8e, 0x07, 0xdb, 0x1f, 0x19, 0x49,
  0xcc, 0xcf, 0x45, 0xc2, 0x4d, 0x46, 0x0f, 0xae, 0x64, 0xde, 0x37, 0xa7,
  0x43, 0xa3, 0x33, 0xfc, 0xe1, 0x0c, 0x89, 0xbf, 0x60, 0xc3, 0x71, 0x07,
  0x08, 0x7c, 0xea, 0xb5, 0x55, 0x18, 0x3e, 0x56, 0x81, 0x32, 0x30, 0x5c,
  0x35, 0xee, 0xc2, 0x7a, 0x29, 0x59, 0xa6, 0x7b, 0xb0, 0x8f, 0x1b, 0x5d,
  0x6c, 0x40, 0xbf, 0xa0, 0x1d, 0xc0, 0x3a, 0x1d, 0x63, 0x5c, 0x61, 0x99,
  0x5a, 0x3a, 0x45, 0x8f, 0x55, 0xce, 0xd7, 0xd8, 0xb3, 0x68, 0xd0, 0xbb,
  0x2d, 0x69, 0x8e, 0x9a, 0x43, 0x28, 0x70, 0xb3, 0xf5, 0x12, 0xd5, 0xb4,
  0x4b, 0x9d, 0xe7, 0xc8, 0x37, 0xdd, 0x0c, 0x1e, 0x89, 0xc7, 0x9a, 0xed,
  0x5f, 0xd5, 0x69, 0x14, 0xd6, 0x5f, 0x2c, 0x5e, 0x61, 0x5c, 0xd2, 0xa2,
  0x83, 0x02, 0x7b, 0xf4, 0x64, 0xa0, 0xd7, 0x4f, 0xfd, 0xc5, 0x11, 0x79,
  0x36, 0xf9, 0x0b, 0xe2, 0x80, 0x62, 0x33, 0xdf, 0x40, 0x44, 0xa3, 0x97,
  0x08, 0xfd, 0xf9, 0xdc, 0x69, 0xa5, 0xeb, 0xc3, 0xea, 0x19, 0xdf, 0xb3,
  0x05, 0x8a, 0xae, 0xdd, 0x58, 0x05, 0x77, 0xee, 0xf7, 0xfb, 0x01, 0x38,
  0x8b, 0xbb, 0x34, 0xb9, 0xaf, 0xb9, 0xe2, 0x65, 0x66, 0x5d, 0xd3, 0x20,
  0x85, 0x3d, 0x40, 0x77, 0xb8, 0x43, 0x30, 0xe4, 0x10, 0x91, 0x34, 0x5b,

  0xca, 0x49, 0xec, 0x95, 0x77, 0x9f, 0x76, 0xb6, 0xf9, 0x96, 0xb7, 0xb9,
  0x0c, 0xd5, 0x83, 0x32, 0x30, 0xb2, 0xed, 0xe7, 0xd0, 0x45, 0x8f, 0x48,
  0xf1, 0x18, 0x51, 0xe3, 0x0e, 0xcb, 0xd3, 0xe8, 0xfa, 0x73, 0xfd, 0x41,
  0x5a, 0x32, 0x2e, 0x31, 0xe3, 0x0a, 0xf9, 0xd1, 0x62, 0xfe, 0x4c, 0x9d,
  0x1f, 0x08, 0x3f, 0x57, 0xe9, 0x05, 0x62, 0x6f, 0x84, 0x8e, 0x28, 0x12,
  0x4e, 0xda, 0x8c, 0x80, 0x5c, 0x31, 0x81, 0xd4, 0x23, 0x39, 0x11, 0xa7,


  0x73, 0x89, 0x93, 0x29, 0x63, 0xdb, 0xc9, 0x44, 0xba, 0xc0, 0x70, 0xbc,
  0x57, 0xcf, 0xd5, 0xe5, 0xd3, 0xee, 0x4a, 0xc0, 0x3a, 0x92, 0xd6, 0x6c,
  0xe2, 0x8b, 0xb5, 0x78, 0xcb, 0x4d, 0x1b, 0xd1, 0xd6, 0xa7, 0x5a, 0x4c,
  0x2d, 0xeb, 0xd5, 0x66, 0xf0, 0x3e, 0x5a, 0x99, 0x0c, 0x5e, 0xba, 0x40,
  0xd9, 0x1e, 0xd4, 0x80, 0x6d, 0x1e, 0x84, 0x03, 0x73, 0x83, 0x9f, 0xe0,
  0x11, 0xb3, 0x5e, 0xc1, 0xa8, 0x17, 0xd8, 0x82, 0x6a, 0x89, 0x89, 0x27,
  0x74, 0xf7, 0xa5, 0x7a, 0x5d, 0x0a, 0xd6, 0x9b, 0x60, 0x26, 0x06, 0x12,
  0x0e, 0x77, 0xbf, 0x7f, 0x13, 0x3f, 0x3c, 0xf4, 0xcb, 0x64, 0x13, 0xa8,
  0xb6, 0xdc, 0x2c, 0xcb, 0x19, 0x7e, 0xb4, 0x24, 0xf4, 0xb5, 0x95, 0xdd,
  0x2d, 0x1f, 0x1e, 0x0d, 0x01, 0x09, 0x73, 0x1e, 0xc5, 0xf8, 0x6a, 0x8d,
  0xd9, 0xda, 0xf6, 0x96, 0xdc, 0x20, 0xa6, 0x99, 0x32, 0xcc, 0xc0, 0xd3,
  0x04, 0xa1, 0xee, 0x56, 0xdb, 0x32, 0x6b, 0xb0, 0xc9, 0x59, 0x66, 0x1c,
  0x8b, 0xa7, 0x8f, 0x50, 0xd3, 0x45, 0x5b, 0x69, 0x87, 0xdc, 0x55, 0x27,
  0x34, 0x0a, 0x9b, 0x62, 0x0a, 0x20, 0x40, 0x3e, 0x58, 0x58, 0x1d, 0xee,
  0xf8, 0x84, 0x96, 0x74, 0x7e, 0x1b, 0x80, 0x7c, 0x6a, 0x73, 0x5b, 0x3a,
  0x4b, 0xc3, 0x52, 0x91, 0x03, 0x0b, 0x30, 0x78, 0x7f, 0x7f, 0xdf, 0x5f,
  0xe5, 0xb7, 0xfc, 0x97, 0x63, 0xe0, 0xf5, 0xe1, 0x2e, 0x80, 0x6a, 0xcf,
  0xd2, 0x6c, 0xf9, 0x10, 0x39, 0x18, 0x2f, 0xa6, 0x19, 0x90, 0x06, 0xe6,
  0xa2, 0xef, 0xae, 0xde, 0x9a, 0x46, 0xd8, 0x8a, 0xae, 0x81, 0x9e, 0xdf,
  0xd2, 0xd7, 0xda, 0x92, 0x94, 0x71, 0x77, 0x10, 0x34, 0xfa, 0xf8, 0xe8,
  0xf2, 0xe3, 0xf9, 0xc9, 0xf5, 0xc7, 0xab, 0xa3, 0xef, 0x71, 0x0b, 0xd9,

  0x2b, 0x03, 0xf2, 0x0a, 0xe3, 0x01, 0x45, 0x9e, 0x63, 0x53, 0xbb, 0xf7,
  0x54, 0x36, 0x98, 0x66, 0x04, 0xaf, 0x12, 0x6c, 0xb3, 0x6e, 0x30, 0xa3,
  0x64, 0x9e, 0x30, 0x97, 0x83, 0xa8, 0xb6, 0x5f, 0xb7, 0x49, 0x91, 0x25,
  0xb3, 0x7e, 0x5e, 0x4c, 0x91, 0x0a, 0x37, 0xdf, 0x08, 0xff, 0x0c, 0x0e,
  0xb7, 0x29, 0x59, 0x0d, 0x08, 0x41, 0x76, 0x57, 0x4c, 0x10, 0xb1, 0xe4,
  0xb9, 0x3d, 0x0a, 0x1d, 0xd2, 0xdc, 0x23, 0x06, 0xb8, 0xb8, 0xdb, 0x5b,
  0xa1, 0xde, 0xd5, 0x3b, 0xc5, 0x4a, 0x8f, 0x37, 0xa2, 0x20, 0xf2, 0xfd,
  0xb8, 0xb9, 0x2a, 0x5c, 0x9d, 0x39, 0x7b, 0xec, 0x06, 0x00, 0x10, 0x48,
  0x9d, 0xcb, 0x0d, 0x94, 0x04, 0x15, 0xb8, 0x61, 0x92, 0xcd, 0xca, 0x16,
  0xf7, 0x46, 0x2b, 0x6a, 0xfa, 0x10, 0xda, 0x7c, 0x0f, 0xbd, 0x17, 0xbe,
  0x65, 0x88, 0x4d, 0x17, 0x9d, 0x35, 0xbf, 0x90, 0x35, 0xbf, 0xf8, 0x97,
  0xd6, 0xfc, 0xe2, 0x5f, 0x58, 0xf3, 0xde, 0x6f, 0xbc, 0xe6, 0xbd, 0xe0,
  0x9a, 0x9d, 0xaf, 0xf4, 0xfe, 0x8a, 0x6b, 0xfe, 0xeb, 0x32, 0xbb, 0xed,
  0xc1, 0x7c, 0x51, 0x0a, 0x4b, 0x8f, 0xb5, 0xb2, 0xc5, 0x64, 0x73, 0x1b,
  0xed, 0x90, 0x6f, 0xdf, 0x02, 0x0c, 0x3b, 0x3d, 0xe3, 0x62, 0x31, 0x15,
  0x38, 0xc4, 0x5f, 0xf9, 0x4d, 0x2d, 0x3c, 0x03, 0x21, 0xc5, 0x7a, 0xdf,
  0x72, 0x84, 0x7e, 0x0a, 0xd4, 0xec, 0x3b, 0x32, 0x1b, 0x1d, 0xb6, 0xa3,
  0x7d, 0x57, 0xe8, 0xa6, 0xc7, 0x3e, 0xce, 0xd1, 0x88, 0xdc, 0x64, 0x74,

  0x27, 0x4d, 0x0c, 0xdc, 0xf6, 0x65, 0x27, 0xa3, 0x83, 0x31, 0xa0, 0x74,

  0x60, 0x8e, 0x0b, 0x62, 0xcc, 0xc7, 0xe7, 0x19, 0xd7, 0x8f, 0x0b, 0x1c,
  0x10, 0x64, 0x73, 0x01, 0x32, 0x98, 0x13, 0x51, 0xa8, 0x99, 0x78, 0x64,
  0x26, 0x19, 0x35, 0x26, 0x28, 0xd1, 0x8e, 0x9b, 0xe4, 0x71, 0xcd, 0x53,
  0x18, 0x46, 0xb3, 0x1c, 0xf9, 0xcd, 0x78, 0xb5, 0xf1, 0x31, 0xb4, 0x0d,
  0xee, 0x58, 0x5e, 0x34, 0x3a, 0xde, 0xb9, 0x72, 0xe3, 0x36, 0x49, 0x16,
  0xf1, 0x8c, 0xa0, 0x35, 0x30, 0xf7, 0xa1, 0xad, 0x51, 0x56, 0x2d, 0x39,
  0x52, 0x0b, 0x07, 0xe8, 0x8d, 0x5a, 0xe6, 0x19, 0xf1, 0x39, 0x3e, 0x48,
  0xac, 0x94, 0x89, 0xd2, 0x31, 0xd5, 0xba, 0x86, 0xfb, 0xa6, 0xd8, 0xa6,
  0x0c, 0x66, 0x12, 0xd8, 0x7a, 0x23, 0x1f, 0x0a, 0x06, 0x8c, 0xf9, 0x84,
  0xe2, 0xc8, 0x61, 0x6a, 0xce, 0x5d, 0x8a, 0x29, 0x79, 0x4d, 0xec, 0x61,
  0xf3, 0x3e, 0xbf, 0x4e, 0xa8, 0x52, 0xb5, 0xce, 0x09, 0x7c, 0x80, 0xf8,
  0x44, 0x6e, 0xe4, 0x1f, 0xaa, 0x1b, 0xd4, 0x47, 0xd4, 0x23, 0x29, 0x05,
  0x50, 0x66, 0xfd, 0xf7, 0xfa, 0xf8, 0xf2, 0xe3, 0xb7, 0x27, 0x27, 0x97,
  0xa7, 0x6f, 0xce, 0x4e, 0xe4, 0xc2, 0x98, 0x1f, 0x9d, 0x5f, 0x7f, 0x77,
  0xa6, 0x7d, 0xe2, 0x94, 0x16, 0x3d, 0x82, 0x17, 0xd8, 0x7f, 0x66, 0xca,
  0x5d, 0x6a, 0x87, 0x05, 0x86, 0xf4, 0xd1, 0xe9, 0x0f, 0xa0, 0xb5, 0x5e,
  0xf6, 0x3e, 0xfc, 0xe0, 0xf5, 0x22, 0x71, 0x6a, 0x4c, 0xfc, 0x66, 0x02,
  0xb6, 0xe4, 0x84, 0x7a, 0xba, 0xdb, 0xb5, 0xb7, 0xa5, 0xdc, 0xfd, 0xc6,
  0x62, 0x10, 0x1b, 0x9c, 0x67, 0x46, 0x61, 0xe0, 0x17, 0xb5, 0xdf, 0x8f,
  0x93, 0xd6, 0xf6, 0x62, 0x4b, 0xdb, 0xa8, 0xad, 0x0c, 0x5a, 0x7c, 0x5e,

  0xb7, 0x19, 0x6f, 0x93, 0x47, 0xc2, 0x70, 0x8c, 0x0e, 0xf1, 0xbf, 0xe1,
  0x36, 0x77, 0x97, 0x45, 0x7a, 0x87, 0xfa, 0x1f, 0x3c, 0xcb, 0x21, 0x5d,


  0x7c, 0xb4, 0x6f, 0x9a, 0xfe, 0x49, 0x58, 0x19, 0x07, 0xa1, 0xcc, 0x13,

  0x1a, 0x34, 0x0a, 0x79, 0x7b, 0x08, 0x19, 0x07, 0x7f, 0xc3, 0xe3, 0xd1,
  0x80, 0xb0, 0x3d, 0xfd, 0xe8, 0xcd, 0xc9, 0x55, 0x37, 0xba, 0x3c, 0x79,
  0xcf, 0x85, 0x2a, 0x27, 0xe7, 0xdf, 0x70, 0x1f, 0x44, 0x6d, 0x6f, 0x47,
  0x99, 0x10, 0x7e, 0xb2, 0xa6, 0xb3, 0x27, 0xf0, 0x2e, 0x65, 0xa6, 0x96,
  0x25, 0x48, 0xd7, 0x4f, 0x08, 0xa0, 0xc3, 0x6b, 0x3b, 0x84, 0xff, 0x84,
  0xb6, 0x0a, 0xec, 0x88, 0x77, 0x81, 0xed, 0x12, 0xc5, 0xcc, 0xe4, 0xce,
  0x88, 0x51, 0x80, 0xbb, 0xc1, 0x3b, 0x06, 0x1b, 0xe2, 0x67, 0x71, 0xe8,
  0x06, 0x91, 0xd9, 0x47, 0x10, 0x42, 0xdc, 0x3c, 0x57, 0x62, 0xf0, 0x68,
  0xc5, 0xc2, 0xe7, 0xba, 0x48, 0x97, 0x04, 0x48, 0x6e, 0x37, 0x23, 0x54,
  0x1d, 0x5d, 0xa4, 0xdc, 0x88, 0xb8, 0x81, 0x4c, 0x07, 0xdb, 0x9d, 0x8e,
  0x19, 0x81, 0x01, 0x03, 0xc8, 0x79, 0x81, 0x09, 0x1c, 0x08, 0x7d, 0xf0,
  0xbf, 0x36, 0xfb, 0x65, 0x79, 0xb3, 0x99, 0x8e, 0x3f, 0x16, 0x65, 0xbc,
  0xd6, 0x94, 0x45, 0xce, 0xaf, 0xc7, 0xf8, 0xeb, 0x68, 0xad, 0x6f, 0x1e,
  0x95, 0xbf, 0xe3, 0xcf, 0x83, 0x58, 0x00, 0x2a, 0x82, 0xd8, 0xb5, 0xa2,

  0xf9, 0x9c, 0xda, 0x3e, 0x71, 0x96, 0x0e, 0x0b, 0x50, 0xe0, 0x6c, 0xf7,
  0x0f, 0xe9, 0x86, 0xb8, 0xb8, 0x1d, 0x95, 0xdb, 0xdb, 0x3e, 0x1a, 0xbd,
  0x29, 0x71, 0xec, 0x6a, 0x5e, 0xee, 0xe5, 0xb7, 0xc7, 0x83, 0x3f, 0x6e,
  0x6f, 0x53, 0x1a, 0xf4, 0x3a, 0xa6, 0xab, 0xbe, 0xdc, 0xdf, 0xde, 0xd9,
  0x08, 0xa9, 0x8f, 0x5e, 0x5e, 0x0f, 0x76, 0xb0, 0x8c, 0x2d, 0x7d, 0xe2,
  0xee, 0x53, 0x98, 0x5b, 0x8a, 0x1e, 0xcc, 0xd0, 0xe3, 0x04, 0x93, 0x04,
  0xa9, 0xb2, 0x93, 0xc3, 0x99, 0x94, 0x3b, 0xe9, 0xa5, 0x5e, 0x18, 0x1c,
  0xa4, 0x0e, 0xcf, 0xfe, 0xa0, 0x63, 0xa8, 0xca, 0xcd, 0x21, 0xa7, 0xfc,
  0x13, 0x67, 0xd6, 0x7d, 0xde, 0xa7, 0x66, 0x78, 0xcd, 0x5d, 0x17, 0x25,
  0x3a, 0x5a, 0xa0, 0x29, 0x16, 0x5f, 0xb6, 0x75, 0x64, 0x23, 0x41, 0x00,
  0xf3, 0x03, 0x3c, 0x5f, 0xbd, 0xcc, 0xa9, 0xc3, 0xf4, 0x83, 0x04, 0x1f,
  0xdb, 0x41, 0xcd, 0xee, 0x3b, 0x0c, 0xc2, 0x1d, 0xd4, 0x77, 0xf6, 0xf1,
  0x37, 0xa2, 0x0e, 0xdc, 0xdd, 0xf0, 0x90, 0x9f, 0xf4, 0x4e, 0x16, 0xc3,
  0xe8, 0x70, 0x06, 0x2f, 0xce, 0x5a, 0x4a, 0xef, 0x4e, 0xb8, 0xdd, 0xd6,
  0xb7, 0x49, 0x31, 0x4c, 0x8a, 0xbc, 0x6c, 0x54, 0x09, 0xd1, 0x6a, 0xa5,

  0xee, 0x17, 0x6b, 0x02, 0x60, 0x1c, 0x4d, 0x97, 0xf2, 0x1a, 0x6b, 0x56,
  0x64, 0x7d, 0x0b, 0xc6, 0x7b, 0x1d, 0x97, 0x67, 0x8d, 0x6a, 0x95, 0xf0,
  0x02, 0x60, 0x7f, 0x29, 0xfc, 0x13, 0xb8, 0xf1, 0x84, 0x9a, 0xc1, 0xa4,
  0xf1, 0x6c, 0x0d, 0xbb, 0xfe, 0x34, 0xaf, 0x91, 0x50, 0xda, 0x5a, 0x1f,
  0x0b, 0xd0, 0xd8, 0x58, 0xa3, 0x2c, 0x28, 0x2a, 0xb7, 0x8e, 0x23, 0x99,
  0x8b, 0xe6, 0x77, 0xe3, 0x35, 0xb7, 0x69, 0x80, 0xa5, 0xd7, 0x09, 0xc9,
  0x0c, 0x57, 0x87, 0x4e, 0x6a, 0xcb, 0x30, 0xfe, 0x8d, 0xc5, 0x14, 0x1f,
  0xc3, 0x2f, 0x6e, 0x9e, 0x6d, 0xfa, 0x65, 0x37, 0x86, 0xd3, 0xb3, 0x72,

  0xcf, 0x59, 0xdf, 0x0f, 0xb6, 0xa2, 0x3d, 0xe2, 0xea, 0xf0, 0x06, 0xd6,
  0x08, 0x75, 0x25, 0xc0, 0x92, 0xa6, 0x31, 0x1b, 0x86, 0x52, 0xfd, 0x6a,
  0x13, 0x27, 0x98, 0xd3, 0xf8, 0xc1, 0x71, 0x5a, 0x2a, 0xf5, 0x0f, 0xd1,

  0x69, 0xf7, 0xd8, 0x78, 0x3f, 0x8e, 0xc4, 0x1b, 0x41, 0x75, 0x51, 0xf7,

  0x05, 0xa2, 0xa5, 0x66, 0x16, 0x73, 0x79, 0x96, 0xb4, 0x82, 0x68, 0x29,

  0xa2, 0x2a, 0x1c, 0xd2, 0x4c, 0x7a, 0x1b, 0x6a, 0x36, 0x62, 0xa1, 0x73,
  0xea, 0x49, 0x32, 0x87, 0x3a, 0x0c, 0xf0, 0xbd, 0x3f, 0x3c, 0x09, 0xa9,
  0xf2, 0xd4, 0xd9, 0x59, 0x95, 0x3e, 0x04, 0x93, 0xf0, 0x6c, 0xac, 0xb8,
  0x46, 0x99, 0x1f, 0x55, 0x0c, 0xf4, 0x48, 0x26, 0x1d, 0x02, 0x3f, 0x4d,
  0x3c, 0xb0, 0xac, 0x41, 0x0d, 0x5f, 0x41, 0x5a, 0xbe, 0x6a, 0x09, 0x1d,
  0xbd, 0x67, 0x5a, 0x5f, 0x9b, 0x26, 0x65, 0x4c, 0xfb, 0x3d, 0x52, 0x59,
  0x9b, 0xee, 0x36, 0x6c, 0x57, 0x62, 0xcb, 0xb4, 0xe9, 0xd6, 0x12, 0x18,
  0xbd, 0x82, 0x1c, 0x69, 0x96, 0x34, 0x6f, 0x07, 0xfa, 0xa2, 0x25, 0xff,
  0x96, 0x8c, 0x8b, 0xd8, 0xf3, 0x81, 0x50, 0xc1, 0x03, 0x77, 0x00, 0x11,
  0x22, 0x58, 0x1b, 0xb3, 0x67, 0x94, 0x8e, 0xc4, 0x4c, 0x15, 0x2f, 0x9e,
  0x84, 0xa1, 0xb8, 0x6b, 0x02, 0xdc, 0x68, 0xcf, 0x54, 0x18, 0xc2, 0x10,
  0xf7, 0xe9, 0xb8, 0xba, 0xa1, 0x9e, 0x3c, 0x6a, 0x19, 0x95, 0x82, 0x0b,
  0x80, 0x4e, 0xea, 0xd4, 0xaf, 0x7a, 0x1b, 0xb6, 0x38, 0xf0, 0xf8, 0xc0,
  0x68, 0x53, 0x23, 0x06, 0xc8, 0x42, 0x47, 0x1d, 0x9d, 0x03, 0x39, 0xb5,
  0x37, 0x59, 0xd5, 0x33, 0xd0, 0x30, 0x31, 0xdc, 0xa2, 0x09, 0xb6, 0xdb,
  0xf1, 0xcc, 0x35, 0x2d, 0x4f, 0xeb, 0xeb, 0x0d, 0x41, 0x1a, 0x5e, 0xbb,
  0x65, 0x50, 0xfc, 0x6f, 0xd7, 0xb4, 0xab, 0xec, 0x32, 0xab, 0xdc, 0x0a,
  0x1a, 0xe4, 0xe5, 0xd1, 0x6d, 0xea, 0x77, 0x6a, 0xa0, 0xaf, 0x77, 0x81,
  0xd7, 0xcc, 0x79, 0x84, 0xf7, 0x6b, 0xea, 0x28, 0x45, 0xc0, 0x84, 0x69,
  0x2c, 0xbf, 0x67, 0xb0, 0x94, 0xb5, 0x29, 0x3f, 0xf4, 0x8d, 0x7d, 0xa8,

  0x31, 0x1c, 0x7a, 0xed, 0xd9, 0x4b, 0xaf, 0xc9, 0x74, 0xe5, 0x01, 0x16,
  0x68, 0x7c, 0xdb, 0x8d, 0x76, 0xe7, 0x74, 0x28, 0xdb, 0xdf, 0x84, 0x18,
  0x17, 0xf7, 0x08, 0x2e, 0x73, 0x53, 0x2e, 0xdf, 0xfb, 0x0b, 0x9a, 0x5c,
  0xb4, 0x61, 0x4c, 0x97, 0xa6, 0x12, 0x8c, 0xeb, 0x51, 0x94, 0x1f, 0x04,
  0x82, 0x0e, 0x94, 0x4b, 0xb9, 0x40, 0x23, 0x61, 0x9c, 0x28, 0x4a, 0xf8,
  0x9c, 0xbc, 0x9b, 0x98, 0x2d, 0xb5, 0x10, 0x38, 0x0c, 0x24, 0xd7, 0x9e,
  0x81, 0x20, 0x2d, 0x67, 0xf8, 0x00, 0xb5, 0xc9, 0xca, 0xbd, 0xcc, 0xea,
  0xd9, 0x82, 0x0c, 0x24, 0xd3, 0xc9, 0xce, 0x99, 0x14, 0x56, 0xb5, 0x8e,
  0x22, 0xf1, 0xf1, 0x7c, 0x42, 0x91, 0x38, 0xa3, 0x14, 0xbd, 0xb4, 0xac,

  0x7a, 0x01, 0xbc, 0x57, 0x8a, 0x01, 0x5d, 0x5e, 0x5c, 0xee, 0x6e, 0xb8,

  0xa0, 0x98, 0x02, 0x8e, 0xc0, 0x3d, 0x1f, 0x29, 0x4a, 0x64, 0x80, 0x13,
  0xba, 0xca, 0x6e, 0xb8, 0x4c, 0xcf, 0xb7, 0x2d, 0x47, 0x82, 0x18, 0x87,
  0xcc, 0x85, 0xbe, 0x48, 0x2e, 0x7f, 0x5b, 0x28, 0xe2, 0x74, 0x43, 0xb4,
  0x17, 0x53, 0xe1, 0x11, 0x3f, 0xf3, 0x61, 0x65, 0x4a, 0x4e, 0x28, 0x27,
  0x44, 0x96, 0x1e, 0x15, 0xff, 0xd5, 0xfb, 0x89, 0x60, 0xe1, 0x82, 0x37,
  0xcb, 0x88, 0x13, 0x8f, 0x02, 0x29, 0x5d, 0x12, 0xe4, 0xb5, 0x4f, 0x52,
  0x40, 0x42, 0x8b, 0x21, 0x09, 0x5d, 0xc8, 0xe6, 0x5a, 0xa0, 0xb7, 0x14,
  0xa9, 0x96, 0x31, 0x95, 0xfb, 0xad, 0x7d, 0xe0, 0x4d, 0x5f, 0x8b, 0x9a,
  0x45, 0x26, 0x5d, 0xcb, 0xe2, 0xe8, 0xfc, 0x6c, 0x70, 0xed, 0x06, 0x91,
  0x48, 0x0f, 0xf3, 0x52, 0x99, 0xeb, 0xc0, 0x6e, 0x4e, 0x6a, 0xd1, 0xd9,
  0xe9, 0xe0, 0xba, 0x1f, 0xea, 0xd8, 0x00, 0xda, 0xf9, 0x00, 0xcb, 0x6d,
  0x6a, 0x40, 0x19, 0x11, 0x77, 0x07, 0xe7, 0x44, 0x63, 0x8e, 0x8e, 0x71,
  0xb4, 0x28, 0x2d, 0x5c, 0x50, 0x88, 0xe6, 0x70, 0x30, 0xc5, 0x2f, 0x38,
  0x4d, 0x59, 0x52, 0x9c, 0x35, 0x4a, 0x54, 0x2e, 0x87, 0x3d, 0x07, 0x49,
  0x91, 0xf5, 0x1d, 0x6a, 0xd1, 0x05, 0xd4, 0x0b, 0x12, 0xea, 0xd6, 0xb7,
  0x31, 0xd7, 0x99, 0xa0, 0x68, 0x7f, 0x04, 0x01, 0xb3, 0xe6, 0xea, 0x1e,
  0x45, 0x09, 0x21, 0xee, 0x92, 0x93, 0x09, 0x9f, 0x7d, 0x36, 0x51, 0xe1,
  0x56, 0x34, 0x76, 0x52, 0xba, 0x3a, 0xd6, 0x6b, 0x16, 0x30, 0x6c, 0xf7,
  0x4b, 0xe2, 0x94, 0x0e, 0x09, 0x5a, 0xa2, 0x2b, 0x93, 0x84, 0x5d, 0x4e,
  0x66, 0xda, 0xad, 0x20, 0xc0, 0xe9, 0x98, 0x71, 0x30, 0xcb, 0x3a, 0x10,
  0x26, 0x83, 0x1e, 0x20, 0xd3, 0xe1, 0x06, 0x40, 0xa8, 0xba, 0xb5, 0x9d,
  0x24, 0xfb, 0xe4, 0x6a, 0xf9, 0xa9, 0xbd, 0x1f, 0x38, 0xe3, 0x99, 0x02,
  0x65, 0xdd, 0x36, 0x84, 0x36, 0x9f, 0x8c, 0xb4, 0x19, 0xd3, 0x87, 0xd3,
  0x37, 0x67, 0x66, 0xb7, 0x64, 0x77, 0x28, 0x85, 0xd6, 0xac, 0x15, 0xcb,
  0x5a, 0x94, 0x6d, 0xd2, 0x99, 0x78, 0x41, 0x9f, 0x65, 0x96, 0xfe, 0x8d,
  0x52, 0xad, 0x48, 0x77, 0x9d, 0xa4, 0x04, 0xe7, 0x15, 0x93, 0xeb, 0x5c,
  0x25, 0xd9, 0x5a, 0x69, 0x3a, 0xd9, 0xa5, 0x63, 0x53, 0xfe, 0xc1, 0x31,
  0xbe, 0x60, 0xfe, 0xf1, 0x4a, 0xe4, 0x94, 0xed, 0x3a, 0xbc, 0x29, 0xa1,
  0x1c, 0x0b, 0x18, 0x19, 0x08, 0xa4, 0x4d, 0x2a, 0x5f, 0xf4, 0x94, 0x0b,
  0xd2, 0xcd, 0x6c, 0x76, 0x5d, 0x1d, 0x64, 0x27, 0x2f, 0xa4, 0xe8, 0x71,
  0xfd, 0xed, 0xd5, 0xc5, 0xfb, 0xde, 0xf5, 0x05, 0xb5, 0xba, 0x27, 0x73,
  0x6e, 0xb6, 0x22, 0x45, 0xa4, 0x34, 0x7d, 0x52, 0x2d, 0x4a, 0x89, 0xf8,
  0xda, 0xd6, 0xcb, 0x0d, 0x29, 0xf4, 0x61, 0x91, 0x42, 0xd3, 0xd3, 0xb7,

  0xbc, 0xf6, 0x25, 0x19, 0x6b, 0x22, 0x31, 0xb5, 0x48, 0x45, 0xbf, 0xe3,
  0xc8, 0x89, 0x63, 0x71, 0x4a, 0x87, 0x70, 0xee, 0xe1, 0xb2, 0x7c, 0x8c,
  0xa4, 0xb6, 0x14, 0x31, 0x0b, 0xc9, 0x96, 0xf2, 0xa3, 0x03, 0xa6, 0xf7,
  0xb6, 0x41, 0x2a, 0xc2, 0xaa, 0x3b, 0x2e, 0xeb, 0xaa, 0x72, 0xb8, 0xbe,
  0x71, 0x51, 0xe4, 0xf7, 0x2a, 0xb8, 0xa4, 0xf6, 0x1b, 0xa6, 0x8e, 0x87,
  0x54, 0x3c, 0xb6, 0xa2, 0xbb, 0x08, 0x60, 0x99, 0x76, 0x0e, 0x5f, 0xa9,
  0xfe, 0xed, 0xd7, 0x31, 0x37, 0x34, 0x03, 0xbc, 0x57, 0x15, 0x4b, 0x2c,

  0x29, 0x0d, 0xbb, 0x9d, 0xcf, 0x90, 0x4d, 0xd6, 0x53, 0xc6, 0xbb, 0x82,
  0xa8, 0x88, 0x00, 0x3c, 0xd4, 0xeb, 0xcd, 0xf8, 0x25, 0xc9, 0x3f, 0xc1,
  0x31, 0xc5, 0x3f, 0x7b, 0x37, 0x58, 0xa0, 0x96, 0x51, 0xa3, 0xc7, 0x36,
  0xae, 0x94, 0x36, 0x6e, 0x73, 0xf1, 0xd2, 0x8a, 0xfb, 0x6f, 0x6a, 0x12,
  0x0e, 0x81, 0xa9, 0x11, 0x33, 0xc0, 0x9f, 0x7a, 0xba, 0xa4, 0xa2, 0x24,
  0xa5, 0x88, 0x50, 0x31, 0x5e, 0x8e, 0xe8, 0x98, 0x30, 0xe2, 0x87, 0xed,
  0x3d, 0x87, 0x8c, 0xdb, 0xaa, 0x20, 0x0f, 0x38, 0xb4, 0x4d, 0x97, 0x67,
  0x07, 0x4e, 0x53, 0xcb, 0x8a, 0xf8, 0x31, 0xdb, 0xb3, 0x0c, 0x95, 0x49,
  0xcc, 0x7d, 0x4d, 0x58, 0xb1, 0x2c, 0x9a, 0x36, 0x27, 0x46, 0x95, 0xb4,
  0x67, 0xb2, 0xcf, 0xae, 0x10, 0x34, 0x9f, 0xe0, 0xc2, 0x25, 0xe8, 0x8f,

  0xc8, 0x96, 0x48, 0xc0, 0x14, 0x74, 0xff, 0x3a, 0x2e, 0x81, 0x2f, 0xd5,
  0xc7, 0xdb, 0x58, 0xe1, 0x9e, 0x5e, 0x6a, 0x61, 0x85, 0x73, 0x7a, 0xb5,
  0x03, 0x09, 0x9f, 0xdc, 0x69, 0x0d, 0xe3, 0x82, 0x53, 0x33, 0x9c, 0x1d,
  0x17, 0x16, 0x45, 0xc0, 0x8b, 0x94, 0xab, 0x1e, 0x53, 0xb7, 0xeb, 0xbb,
  0x10, 0x73, 0x8a, 0x4d, 0x3f, 0xc7, 0x2a, 0xd2, 0x8f, 0x46, 0xeb, 0x5a,
  0xf9, 0x69, 0x2a, 0x91, 0xce, 0xe4, 0x57, 0x07, 0xa6, 0x34, 0x15, 0x79,
  0x5a, 0x63, 0xb8, 0xdd, 0x1f, 0x7e, 0xa8, 0xf7, 0x5f, 0xde, 0x68, 0x03,
  0xc3, 0x90, 0x9a, 0x94, 0x31, 0xf3, 0x3e, 0x9d, 0xb0, 0x57, 0x57, 0xa7,
  0x64, 0x87, 0x21, 0x06, 0xca, 0xe2, 0x67, 0x07, 0x8c, 0x78, 0x8a, 0xc0,
  0x04, 0xbc, 0xd1, 0x62, 0xab, 0x5a, 0x0a, 0x07, 0xc1, 0x64, 0x9c, 0x06,
  0x72, 0x16, 0x89, 0xe1, 0x6a, 0xee, 0x05, 0xc7, 0x54, 0x28, 0x27, 0xdd,
  0xdd, 0xae, 0xd2, 0x3a, 0x67, 0x6e, 0x30, 0xb6, 0x20, 0x40, 0xcd, 0xab,

  0x9b, 0x44, 0x1b, 0xe0, 0x4c, 0x53, 0x7a, 0x49, 0xf2, 0x9e, 0xdb, 0x4a,
  0x60, 0x5a, 0xec, 0xa8, 0x48, 0xc4, 0xdb, 0xa0, 0x4d, 0x80, 0xbc, 0x28,
  0x32, 0x82, 0xf6, 0xf0, 0xe5, 0x21, 0xa7, 0x6a, 0xec, 0xdc, 0x17, 0x8b,
  0xb7, 0xd8, 0x38, 0x31, 0x29, 0xc3, 0xf0, 0xb5, 0xf7, 0xfb, 0x9c, 0x20,
  0x36, 0xa9, 0xf7, 0x12, 0xc1, 0xc6, 0xe5, 0xec, 0xd8, 0x92, 0xf6, 0xc1,
  0x2c, 0x6f, 0xfe, 0xac, 0x37, 0xb7, 0xef, 0x06, 0x2f, 0x91, 0x0a, 0x42,
  0x21, 0x50, 0x65, 0x26, 0x78, 0x2e, 0x88, 0xed, 0x8b, 0xb9, 0x70, 0xda,
  0x92, 0x0c, 0x3d, 0xc5, 0x1a, 0x23, 0x67, 0x75, 0x9a, 0x90, 0x28, 0xe6,
  0x64, 0xbc, 0xf8, 0x40, 0xd3, 0xf6, 0xca, 0x62, 0x0e, 0x0f, 0x39, 0x3d,
  0x2d, 0x2e, 0x1d, 0x3b, 0xb7, 0xc0, 0x28, 0xed, 0xd1, 0x63, 0x65, 0x5b,

  0xba, 0x89, 0x20, 0x8f, 0x53, 0x0e, 0x1c, 0xb7, 0x4f, 0x71, 0xf7, 0x4c,
  0xdd, 0x64, 0x06, 0xf5, 0x44, 0x0a, 0xcd, 0xa4, 0x0f, 0xc7, 0x37, 0x27,
  0xd7, 0xcd, 0xab, 0xe5, 0x46, 0x0e, 0x09, 0x63, 0x04, 0xfe, 0x7d, 0xf9,
  0xe1, 0x7a, 0x83, 0x9a, 0x93, 0x29, 0x60, 0x70, 0x55, 0x6b, 0x3a, 0x63,
  0xea, 0x57, 0xfd, 0x52, 0x1c, 0x46, 0xf5, 0x10, 0x3e, 0x25, 0xc9, 0x40,
  0x72, 0x33, 0xd0, 0xc7, 0xb2, 0xbb, 0xb5, 0x0d, 0x76, 0xd4, 0xd6, 0x0e,
  0x35, 0x9c, 0xde, 0xdd, 0xda, 0x35, 0x40, 0x08, 0xfa, 0x94, 0xdf, 0xa6,
  0x82, 0x5f, 0x24, 0x97, 0x09, 0xd1, 0xfd, 0xee, 0xc3, 0x03, 0xfd, 0xb8,
  0x5e, 0x5e, 0xd1, 0x33, 0x25, 0x89, 0xee, 0x34, 0x83, 0x72, 0xdf, 0xd9,
  0x6f, 0x8a, 0xec, 0x2d, 0x33, 0x2e, 0x00, 0xa6, 0x86, 0xde, 0x88, 0x1b,

  0xd2, 0x6f, 0xef, 0x6e, 0xe5, 0xb4, 0xea, 0x13, 0x74, 0x34, 0xb7, 0x3d,
  0x1d, 0x10, 0x8b, 0x8b, 0x38, 0x23, 0x28, 0x24, 0x1e, 0x6b, 0xc6, 0x67,
  0x04, 0xaf, 0x09, 0xf6, 0xe0, 0xc1, 0xee, 0x90, 0x69, 0x99, 0x2a, 0x0c,

  0x00, 0x04, 0x9d, 0xb0, 0x23, 0x53, 0x4c, 0x13, 0x70, 0x42, 0x20, 0xff,
  0x3b, 0xc0, 0x34, 0x11, 0xb8, 0x13, 0xb4, 0xbf, 0xfa, 0x57, 0xcd, 0xe3,
  0xe3, 0x7f, 0xed, 0xd6, 0x25, 0x25, 0xba, 0x87, 0x75, 0xd0, 0x43, 0xf9,
  0x8b, 0xe7, 0xab, 0xa4, 0x3e, 0xc3, 0xa4, 0x1b, 0x53, 0x87, 0x98, 0x8d,
  0x9a, 0xff, 0x84, 0xc6, 0x30, 0x13, 0x13, 0x2d, 0x45, 0x3a, 0xb8, 0x33,
  0x8b, 0x6e, 0xd2, 0x46, 0x4d, 0x3e, 0xf4, 0xdb, 0x1a, 0x00, 0xaa, 0x26,
  0xe8, 0x8d, 0xaf, 0x09, 0x16, 0x06, 0x31, 0xc0, 0x51, 0x89, 0xf3, 0x45,
  0xe8, 0xee, 0x96, 0x0a, 0xfe, 0x80, 0xc2, 0xd5, 0x38, 0xdb, 0x65, 0x8e,
  0x8d, 0xe9, 0x44, 0x47, 0x15, 0xf5, 0x83, 0x26, 0x3f, 0x98, 0x6f, 0xa2,
  0xe2, 0x56, 0x74, 0x79, 0x2b, 0xa8, 0xcf, 0x3a, 0x36, 0xcc, 0xd1, 0x14,
  0xcc, 0xda, 0x4c, 0x39, 0x10, 0x32, 0x77, 0x13, 0x35, 0x42, 0x19, 0xb6,
  0x43, 0x4d, 0xde, 0x8b, 0x1a, 0x0b, 0x85, 0x7b, 0x88, 0xa2, 0x15, 0xd5,
  0x7e, 0xe9, 0x06, 0xbd, 0xd7, 0xa5, 0xbf, 0xed, 0x6f, 0xbd, 0xe2, 0x13,
  0x3d, 0x3d, 0xb9, 0x7e, 0xdb, 0x74, 0xe6, 0x15, 0x40, 0x50, 0xfc, 0xdf,
  0x5e, 0x12, 0x17, 0x37, 0x60, 0x5c, 0x20, 0x54, 0x52, 0x0f, 0xfb, 0x6f,
  0xf4, 0xb6, 0xb6, 0x42, 0x79, 0x1b, 0x9f, 0x10, 0x1e, 0x62, 0x77, 0xaf,
  0x1e, 0xd2, 0x43, 0x95, 0xbe, 0x87, 0xdb, 0xdd, 0x8e, 0xe4, 0x5b, 0x27,
  0xaf, 0x58, 0x75, 0x67, 0x79, 0xbc, 0x16, 0xb0, 0x4f, 0x22, 0x03, 0x09,
  0x1d, 0x35, 0x81, 0x30, 0x1d, 0x13, 0xbb, 0xa9, 0xde, 0x98, 0xec, 0x24,
  0x10, 0xf3, 0x24, 0x93, 0xaa, 0xc7, 0x8d, 0x88, 0xfb, 0x48, 0x72, 0xbb,
  0xb7, 0x8a, 0x18, 0x00, 0x59, 0x10, 0xc1, 0xc2, 0xf9, 0x52, 0x6a, 0x07,
  0x8b, 0x04, 0x21, 0xd7, 0x58, 0xed, 0x93, 0xb6, 0x59, 0x4f, 0xc3, 0xc6,
  0xd1, 0x16, 0x14, 0xa3, 0x85, 0x14, 0x91, 0xf2, 0xbf, 0x51, 0x14, 0xd7,






  0xf2, 0x67, 0x77, 0xf6, 0x03, 0x1b, 0x47, 0x02, 0xfb, 0x57, 0x6e, 0x9c,
  0x55, 0x8e, 0xd8, 0x7f, 0x47, 0x06, 0xaf, 0x29, 0x75, 0x0b, 0x64, 0x6a,
  0x6b, 0x5b, 0xe7, 0x5f, 0xbc, 0x16, 0xdc, 0xed, 0xfe, 0x2a, 0xf0, 0x49,
  0xfb, 0xd6, 0xaf, 0x5c, 0x4b, 0xd7, 0x76, 0x3e, 0x41, 0xe9, 0x31, 0x97,

  0xc6, 0x6e, 0xe4, 0x67, 0xa0, 0x80, 0x66, 0x13, 0x18, 0x26, 0x59, 0x24,
  0xb4, 0x78, 0x37, 0x6f, 0xc1, 0x21, 0x6e, 0x63, 0xa3, 0xa2, 0xad, 0xa8,

  0x05, 0x91, 0x20, 0x44, 0xd3, 0x05, 0x22, 0x7e, 0x94, 0x41, 0x3f, 0x8b,
  0x98, 0xf9, 0xec, 0x47, 0xa0, 0xcd, 0x54, 0x97, 0x6c, 0x57, 0xc4, 0x98,
  0xbc, 0xae, 0x7b, 0xac, 0x3c, 0xcb, 0x53, 0x1a, 0xef, 0xe2, 0x19, 0x9a,
  0xeb, 0x34, 0x86, 0x39, 0xac, 0xdc, 0x56, 0xd6, 0xf3, 0xe0, 0x79, 0x8b,

  0xf8, 0x77, 0xe7, 0x91, 0x99, 0xf7, 0x39, 0xe1, 0x51, 0x95, 0xd9, 0xef,
  0xae, 0xde, 0xfe, 0x45, 0xed, 0xee, 0x8d, 0x6e, 0x8b, 0x25, 0xdc, 0x98,
  0xee, 0x30, 0x71, 0x12, 0x01, 0x05, 0x02, 0xa2, 0xb6, 0xeb, 0xfc, 0x2f,
  0x9b, 0x65, 0xe9, 0x05, 0x15, 0x28, 0xe9, 0x63, 0x1d, 0xc3, 0x6c, 0xf0,
  0xdc, 0x40, 0x4c, 0xba, 0xdd, 0xfe, 0x3e, 0xf9, 0x43, 0xde, 0x1e, 0xef,
  0xef, 0xee, 0x6c, 0x83, 0xd5, 0xba, 0xde, 0xe0, 0x16, 0x1b, 0x9f, 0x3d,
  0x6b, 0xb7, 0xcd, 0x79, 0x27, 0x0f, 0x0b, 0xa4, 0xbd, 0xf5, 0x93, 0x1f,
  0x2e, 0xcf, 0xbd, 0x35, 0xc2, 0x9a, 0xbc, 0x40, 0x6a, 0xdb, 0x1a, 0xad,
  0x2e, 0x50, 0x1b, 0x5f, 0xf3, 0x8f, 0xa9, 0x61, 0x75, 0x20, 0x54, 0xf9,
  0xb6, 0x48, 0x51, 0xc7, 0xed, 0xe0, 0x96, 0x74, 0xce, 0xf2, 0x6c, 0x0c,
  0xa2, 0xff, 0x02, 0x21, 0xfa, 0x92, 0x0e, 0xe8, 0xea, 0x4f, 0xae, 0xae,

  0xfd, 0x9a, 0xbc, 0xef, 0xd2, 0x55, 0xc9, 0xfc, 0x0c, 0x97, 0xf7, 0xf4,
  0x43, 0x42, 0x44, 0x46, 0x70, 0x13, 0xae, 0x31, 0x59, 0x4e, 0x13, 0x76,
  0xef, 0xa2, 0x69, 0x56, 0xbf, 0x6d, 0x0f, 0xd4, 0x90, 0x88, 0x3c, 0x3e,

  0x87, 0xe4, 0xd0, 0x6e, 0x8b, 0x85, 0x30, 0xb7, 0xd4, 0x68, 0x08, 0xfb,
  0x88, 0xd6, 0xd5, 0xad, 0xbf, 0xe1, 0x74, 0x74, 0x27, 0xf0, 0x4e, 0x8e,
  0x75, 0xa0, 0xde, 0x16, 0xe0, 0xb9, 0xf4, 0x98, 0xb5, 0x2b, 0xd2, 0x7a,
  0x4a, 0x3c, 0xdd, 0x44, 0x02, 0x83, 0xe8, 0xd6, 0xb1, 0x0b, 0x43, 0x3e,

  0x70, 0xca, 0x20, 0xa0, 0x8e, 0x7b, 0x71, 0x56, 0xc7, 0x79, 0x45, 0x30,
  0x03, 0xb6, 0x7e, 0x92, 0x07, 0x6a, 0xa2, 0x0a, 0x2a, 0xe2, 0x8b, 0x5d,
  0x5f, 0x1e, 0xc9, 0x52, 0x04, 0xde, 0x45, 0xdc, 0x4c, 0x06, 0x8a, 0xfa,
  0xad, 0x55, 0x7b, 0xbb, 0xc1, 0x38, 0x44, 0x28, 0x24, 0xc5, 0x51, 0x09,
  0xb1, 0xce, 0x1a, 0x71, 0x09, 0x37, 0x0e, 0x41, 0x37, 0x05, 0x23, 0x11,
  0x12, 0x65, 0xf0, 0x0d, 0x15, 0x27, 0x32, 0xd1, 0x1e, 0x9a, 0x58, 0x11,
  0x8c, 0x68, 0x9a, 0xa0, 0x26, 0x34, 0x51, 0x23, 0xbe, 0xfd, 0xcf, 0x03,
  0xc4, 0x77, 0x7e, 0x71, 0x7d, 0x72, 0x20, 0x10, 0x5f, 0x8a, 0x85, 0xa3,
  0x66, 0x02, 0x27, 0xa6, 0x71, 0x23, 0x77, 0xae, 0x39, 0x44, 0x21, 0xab,
  0xa7, 0xde, 0x0d, 0x5d, 0x79, 0xca, 0x11, 0xc7, 0x6b, 0xc2, 0x5e, 0xde,
  0xaa, 0x15, 0x21, 0x97, 0x4a, 0xfd, 0xc5, 0x32, 0x60, 0x7a, 0xc2, 0xf3,
  0xf7, 0x91, 0x51, 0x08, 0x3e, 0x83, 0x10, 0x29, 0x58, 0xde, 0x7a, 0x24,
  0xc4, 0xa2, 0x8c, 0x0d, 0x2e, 0x93, 0xb0, 0x38, 0xc2, 0x7e, 0xaa, 0x7e,

  0x13, 0x50, 0x8a, 0xd0, 0xbd, 0x95, 0x46, 0xf2, 0x64, 0x8f, 0x18, 0x98,
  0xcd, 0x55, 0x22, 0xce, 0x06, 0x12, 0x9b, 0x97, 0x4a, 0x8c, 0x33, 0xf4,
  0x02, 0x7e, 0xd9, 0x0a, 0x73, 0x55, 0x39, 0xf7, 0x49, 0xe9, 0x04, 0xee,
  0x91, 0x5a, 0x69, 0x68, 0x55, 0x1a, 0x33, 0x45, 0x30, 0x6c, 0xfc, 0xf0,
  0x35, 0xb1, 0xc0, 0xba, 0x5b, 0x44, 0xb5, 0xb4, 0xae, 0x51, 0xd7, 0x28,
  0x71, 0x27, 0xa1, 0xb2, 0x2c, 0x36, 0xc0, 0x49, 0x5b, 0x68, 0x41, 0x62,
  0x75, 0x31, 0x06, 0x44, 0xa9, 0x46, 0xd1, 0x37, 0x02, 0xc1, 0xed, 0x56,
  0x20, 0x90, 0xce, 0x47, 0xd6, 0x6c, 0xca, 0x40, 0x0f, 0xf0, 0x91, 0xfd,
  0xad, 0x16, 0x5b, 0x96, 0x55, 0xde, 0x41, 0x52, 0x17, 0xb4, 0xf0, 0x46,
  0x6f, 0xdb, 0x38, 0x61, 0x53, 0x2a, 0x6e, 0x17, 0x34, 0xb7, 0x4f, 0x17,
  0x62, 0x9a, 0x77, 0xe5, 0x8c, 0x56, 0xe6, 0x31, 0xbe, 0xd7, 0xb0, 0x2f,
  0x3e, 0x94, 0x66, 0x9a, 0xa2, 0xc6, 0x9a, 0x12, 0x47, 0xf1, 0x14, 0xb4,
  0x16, 0x6e, 0x66, 0x8e, 0xd1, 0x73, 0x1b, 0xfc, 0xf6, 0x8d, 0x39, 0x74,
  0x52, 0xf4, 0xa3, 0xc8, 0x45, 0x20, 0xd3, 0x92, 0x23, 0x39, 0x18, 0xdc,
  0x75, 0xf2, 0xb7, 0x0d, 0xb1, 0x7e, 0x3f, 0xfa, 0x6b, 0x3e, 0x14, 0x27,
  0x0c, 0x5a, 0x8e, 0x21, 0x24, 0x9f, 0x09, 0xe5, 0xcf, 0x2f, 0x81, 0xca,
  0xc6, 0x4b, 0xf6, 0xab, 0xe2, 0x84, 0x24, 0x13, 0x9b, 0x5b, 0x3f, 0x63,
  0xc0, 0x23, 0x9a, 0x12, 0x8e, 0x26, 0xa7, 0x82, 0x6a, 0x21, 0xba, 0x5f,
  0xed, 0xbc, 0xd3, 0x44, 0x6b, 0x89, 0x47, 0xe8, 0x0d, 0x81, 0xc1, 0x05,
  0x1c, 0x81, 0x01, 0xf7, 0x6c, 0xc2, 0x7a, 0x3c, 0xaa, 0x96, 0xb2, 0xf1,
  0xcd, 0xd9, 0xe5, 0xea, 0x25, 0x85, 0x77, 0x09, 0x06, 0x9e, 0xb2, 0x90,
  0x46, 0x40, 0x79, 0xf1, 0xe8, 0x51, 0xf5, 0x05, 0x2b, 0x5c, 0x05, 0xd0,
  0xd1, 0x82, 0xc6, 0xfb, 0x35, 0x9e, 0x3a, 0x09, 0x8c, 0x76, 0xa6, 0x65,
  0x4b, 0xb7, 0x96, 0xdf, 0xd4, 0x4e, 0x71, 0x7b, 0x6e, 0xb1, 0xd3, 0x59,
  0x81, 0x27, 0x6b, 0x57, 0x3d, 0xa9, 0x62, 0xdc, 0xe5, 0x95, 0xc5, 0xe8,
  0xd6, 0x25, 0x60, 0x2a, 0x6b, 0x28, 0x32, 0x48, 0xf5, 0x8c, 0x58, 0x63,
  0x43, 0x71, 0x70, 0x6d, 0x38, 0x75, 0xea, 0xeb, 0x11, 0xef, 0xe5, 0x2b,
  0xcc, 0x0f, 0xd7, 0x89, 0x59, 0xd9, 0x8a, 0x52, 0x1c, 0x66, 0x8f, 0x33,
  0xc6, 0xa2, 0xfd, 0xcf, 0xf7, 0xf7, 0x36, 0xb4, 0x79, 0xb1, 0x66, 0x21,
  0x6e, 0x84, 0x3a, 0x00, 0xd2, 0x8d, 0x93, 0x9e, 0x0a, 0xa4, 0xd7, 0xa4,
  0xd8, 0x23, 0x93, 0xd1, 0x3a, 0xc4, 0xb1, 0x99, 0x72, 0xd3, 0x2c, 0x74,
  0xb1, 0x53, 0xfb, 0x39, 0x66, 0xca, 0x5e, 0xfe, 0x00, 0x7e, 0x2c, 0xe1,
  0x97, 0xd7, 0x89, 0xc3, 0xc7, 0xa5, 0x65, 0xde, 0xb6, 0x32, 0x88, 0xa1,
  0xfd, 0x49, 0x49, 0xd3, 0xd4, 0xb7, 0x0d, 0x2a, 0x5f, 0x0f, 0x96, 0x95,
  0x73, 0xfa, 0x39, 0x69, 0xaa, 0xa2, 0x7a, 0xdc, 0x60, 0x47, 0xf6, 0xdc,
  0x91, 0x0b, 0xec, 0x1b, 0xe1, 0xda, 0x2e, 0x16, 0x3c, 0x21, 0xa0, 0x6a,
  0xc2, 0x99, 0x28, 0x39, 0x43, 0xaa, 0xbe, 0x8f, 0x0c, 0x7d, 0x4a, 0xe0,
  0x0b, 0xf2, 0xbe, 0x24, 0x48, 0xc9, 0x99, 0x30, 0xe2, 0xae, 0x27, 0x90,

  0xe7, 0xda, 0x1d, 0x8a, 0x55, 0x8f, 0xbc, 0xb0, 0xa5, 0xb9, 0x1c, 0xa4,
  0x61, 0x71, 0x49, 0xf9, 0xc2, 0x6d, 0xc0, 0x3b, 0xea, 0x06, 0x89, 0x15,
  0x23, 0xa4, 0x36, 0xb3, 0xd6, 0xfa, 0x16, 0xa5, 0x36, 0x85, 0xe2, 0x69,
  0x96, 0xb5, 0xe8, 0xdf, 0x0d, 0x55, 0xfa, 0x15, 0x6d, 0xfc, 0xd5, 0xc6,
  0x46, 0xb4, 0xcc, 0x9e, 0x2c, 0x29, 0xc6, 0xcd, 0x23, 0x5f, 0x8a, 0xdf,
  0x1c, 0x76, 0x16, 0xad, 0xd3, 0x84, 0x37, 0x37, 0x37, 0x9e, 0x9e, 0xb4,
  0x3c, 0xf9, 0xd4, 0x24, 0x2f, 0xd9, 0xb1, 0xe1, 0xb4, 0x93, 0x98, 0x38,
  0x73, 0xc0, 0x6f, 0x3a, 0x70, 0x19, 0x5d, 0xa6, 0x48, 0x72, 0x30, 0x67,
  0x88, 0x79, 0x1a, 0x3f, 0xfa, 0x4e, 0x7c, 0xcd, 0x4a, 0xe3, 0x05, 0xd6,
  0xd7, 0xae, 0xf5, 0xc8, 0x04, 0xe7, 0x27, 0x2c, 0x04, 0x53, 0xa3, 0x08,
  0x5f, 0xed, 0x08, 0x88, 0xd0, 0xd7, 0x37, 0xed, 0xb4, 0x9c, 0xc5, 0x91,
  0x89, 0x9b, 0x76, 0x23, 0xc7, 0xcd, 0xce, 0xb7, 0x50, 0x7d, 0x10, 0xec,
  0x8e, 0x0f, 0xd4, 0x46, 0xe8, 0xd3, 0x26, 0xc3, 0x92, 0x3b, 0xa9, 0xf7,
  0x3d, 0x44, 0x64, 0x7e, 0xd2, 0x76, 0xf3, 0x0e, 0xf4, 0x52, 0x70, 0x5d,
  0xa4, 0x32, 0x20, 0x70, 0xd4, 0x5b, 0xbb, 0x66, 0xc6, 0x23, 0xe6, 0x8e,
  0xed, 0xd2, 0x90, 0x4f, 0x07, 0xc3, 0xe9, 0x7a, 0x8c, 0x97, 0xe6, 0x66,
  0xe8, 0x9b, 0x76, 0x8c, 0xc1, 0x78, 0x86, 0xfc, 0xd3, 0xda, 0x66, 0x76,
  0xf9, 0x8e, 0x12, 0x0c, 0x4e, 0x48, 0x57, 0xa7, 0xae, 0x89, 0x3e, 0x92,
  0x83, 0xd9, 0xc3, 0x95, 0x29, 0x78, 0x26, 0x07, 0x8f, 0xfc, 0xbc, 0x92,
  0x85, 0xe7, 0xcb, 0x59, 0xf5, 0xb5, 0xe9, 0xa0, 0x75, 0x5f, 0xc3, 0xcb,
  0xba, 0xaf, 0xc1, 0x80, 0x52, 0x84, 0x35, 0x34, 0x4e, 0xbe, 0x2c, 0xa3,
  0x73, 0x7d, 0x2c, 0x5a, 0x1f, 0x5c, 0x9e, 0x9f, 0x7c, 0x73, 0xb1, 0xf1,
  0x94, 0x8f, 0xb2, 0xce, 0xff, 0xcd, 0xba, 0x62, 0xcd, 0x12, 0x96, 0xe9,
  0x93, 0x75, 0xf2, 0xcd, 0x60, 0xd0, 0x3b, 0xba, 0x3c, 0xa5, 0x2e, 0x97,
  0x03, 0xf8, 0xb3, 0x05, 0x8b, 0xbd, 0x4f, 0xad, 0x00, 0x7a, 0xdf, 0x49,
  0xed, 0x68, 0xa9, 0x49, 0x82, 0xe4, 0x01, 0xc4, 0xc3, 0x14, 0xf4, 0x44,
  0xde, 0x23, 0x03, 0xed, 0x41, 0xc3, 0x37, 0x4d, 0x9e, 0xcb, 0xd3, 0x4d,
  0xfa, 0x14, 0x7e, 0x92, 0x16, 0xd4, 0xe2, 0x3e, 0x58, 0xfa, 0x0d, 0x2e,
  0x51, 0xf3, 0xa1, 0x14, 0x53, 0x62, 0xd0, 0x9a, 0x0c, 0x0e, 0x96, 0x1f,
  0x8a, 0x13, 0x1b, 0xb0, 0x0b, 0x97, 0xde, 0xa0, 0x2b, 0x0c, 0x6b, 0x2b,
  0x14, 0x34, 0xb5, 0xe1, 0x7a, 0x23, 0x13, 0x8d, 0xa1, 0xf1, 0x66, 0x08,
  0x3f, 0x32, 0xd0, 0xe8, 0x6a, 0xd3, 0x29, 0xb2, 0xd6, 0x5b, 0x46, 0xd1,
  0xc1, 0x9a, 0x34, 0x8e, 0xcf, 0xf2, 0xe5, 0xf4, 0x86, 0x0d, 0xac, 0xba,
  0x1f, 0x82, 0x78, 0xb9, 0x46, 0x5f, 0x4d, 0xef, 0x06, 0x98, 0xa4, 0x47,


  0x82, 0xf4, 0x8e, 0xea, 0x3d, 0x45, 0x82, 0xc1, 0x21, 0x56, 0x6f, 0x38,




  0xe9, 0x62, 0xfc, 0xbb, 0x60, 0xa0, 0xaf, 0xd0, 0x40, 0x86, 0x1c, 0x38,
  0x25, 0x37, 0x5a, 0x56, 0xcd, 0xe6, 0xf2, 0xd7, 0x38, 0x7b, 0x24, 0x77,
  0xa9, 0xf8, 0xef, 0xa9, 0xfe, 0xd3, 0xd0, 0x74, 0x9d, 0xd0, 0xab, 0x62,



  0x44, 0x86, 0x3e, 0xa7, 0xa0, 0x72, 0xe1, 0xe7, 0x2a, 0x9a, 0xa5, 0x9e,

  0xf6, 0x73, 0x10, 0xd3, 0x64, 0xda, 0xf5, 0xb2, 0xae, 0x8e, 0xd2, 0x05,
  0x73, 0x58, 0xc2, 0x64, 0xa2, 0x08, 0x0b, 0x11, 0x04, 0x58, 0x11, 0xb5,
  0x80, 0x5c, 0x8f, 0x87, 0x65, 0x3e, 0x5b, 0x56, 0xa4, 0x0b, 0xa0, 0x53,
  0x14, 0x8b, 0x6b, 0x36, 0x88, 0x74, 0x25, 0x7c, 0x09, 0xa3, 0x46, 0x4e,
  0x02, 0x6a, 0x14, 0xaa, 0x03, 0xb0, 0xed, 0x49, 0xfb, 0x36, 0x04, 0xc0,
  0x51, 0x44, 0xf1, 0x4f, 0xe0, 0xce, 0xf2, 0x58, 0x34, 0xd4, 0x82, 0xd2,
  0x92, 0xee, 0x14, 0xec, 0xcd, 0x3f, 0x3f, 0x3d, 0xab, 0xda, 0xee, 0xa8,
  0x77, 0x1d, 0x59, 0x77, 0x2d, 0x51, 0xdd, 0x6a, 0x8d, 0x21, 0xce, 0xd6,
  0x9a, 0xa9, 0xac, 0xd9, 0x02, 0x43, 0xbc, 0x25, 0xc3, 0x47, 0xf3, 0x31,
  0xfe, 0x4e, 0x4c, 0xb9, 0x3c, 0x46, 0x11, 0x7e, 0x2e, 0xb4, 0x92, 0x3d,
  0x8c, 0xfe, 0xaa, 0x64, 0x94, 0xfa, 0x97, 0x1a, 0x43, 0x7f, 0x97, 0x70,
  0xde, 0x19, 0x1f, 0x31, 0x9d, 0x46, 0xed, 0x90, 0x59, 0xcb, 0x6f, 0x36,
  0xb5, 0xc3, 0x8d, 0xe8, 0xd3, 0x13, 0x1e, 0x01, 0x63, 0x28, 0xdd, 0xac,
  0x4a, 0xd5, 0x23, 0xf4, 0xb7, 0xc5, 0xdc, 0x4e, 0x93, 0x5f, 0x76, 0xbe,
  0x61, 0x4a, 0x81, 0xf2, 0xd5, 0x1d, 0x6f, 0xed, 0xe9, 0xf4, 0x9f, 0xb1,
  0x21, 0x76, 0xfd, 0xf6, 0x87, 0x9e, 0x65, 0x67, 0xe2, 0xc5, 0x25, 0x41,
  0x52, 0x9a, 0x45, 0x01, 0xe7, 0xff, 0x28, 0x7f, 0xc1, 0x3b, 0xf0, 0x7d,
  0x9a, 0x81, 0x66, 0x58, 0x6e, 0x28, 0x71, 0xa6, 0x59, 0x08, 0x46, 0x01,
  0x79, 0xc7, 0x5a, 0x09, 0x96, 0x18, 0x70, 0x1c, 0x9b, 0xa8, 0x87, 0x8a,
  0x33, 0x07, 0x6c, 0x3c, 0x56, 0xe4, 0x34, 0x36, 0x7d, 0x5c, 0x78, 0xf5,
  0x33, 0x23, 0xc3, 0x74, 0x68, 0x0c, 0x02, 0x2f, 0x06, 0xb3, 0x20, 0x4b,
  0x1f, 0xfa, 0x26, 0xb8, 0x6f, 0xd0, 0xd7, 0xdc, 0xe0, 0x26, 0x30, 0xc2,
  0x40, 0x4f, 0x7b, 0xe2, 0x6c, 0xcd, 0x10, 0x16, 0xee, 0x2e, 0xad, 0x73,
  0x7d, 0x7f, 0x23, 0x9a, 0x54, 0x8b, 0xf5, 0xed, 0x0d, 0xc6, 0xb0, 0x97,
  0x5e, 0xea, 0xb9, 0x15, 0xf7, 0xbe, 0x17, 0x07, 0x73, 0x0b, 0xa3, 0x63,
  0xf3, 0x59, 0x0a, 0x6e, 0x22, 0x9c, 0x1b, 0x55, 0xf1, 0x4d, 0xe4, 0x06,
  0xf3, 0x86, 0x99, 0x06, 0xcc, 0x94, 0xc6, 0x1c, 0xd8, 0x3b, 0xae, 0xc5,
  0x5f, 0x20, 0xb2, 0x2b, 0x55, 0x36, 0x82, 0x05, 0x61, 0xbb, 0xe0, 0x4a,
  0x2f, 0x30, 0x29, 0x7d, 0x86, 0x9d, 0x9b, 0x8d, 0x7b, 0xc8, 0x43, 0xa6,
  0x45, 0x0e, 0x22, 0xb2, 0x08, 0xe0, 0x5f, 0x8a, 0x4d, 0x71, 0x4d, 0xd5,
  0x37, 0x77, 0x69, 0x91, 0x67, 0x04, 0x31, 0x7a, 0x17, 0x17, 0x29, 0x85,

  0xf9, 0x3b, 0xef, 0x2e, 0xde, 0x9f, 0x74, 0x5c, 0xa7, 0xc8, 0x24, 0x15,
  0x3f, 0x3a, 0x9d, 0x5f, 0xd3, 0x4b, 0xad, 0xa7, 0x19, 0x72, 0x1a, 0x82,

  0x48, 0x1f, 0xb1, 0xda, 0x47, 0x40, 0x0c, 0x04, 0x15, 0x97, 0x98, 0x08,
  0x39, 0xa8, 0x92, 0x92, 0x04, 0x20, 0x7d, 0x15, 0x95, 0xc2, 0x28, 0x09,
  0x28, 0xd4, 0xfd, 0x46, 0x4d, 0x43, 0xea, 0x80, 0x93, 0xbb, 0x9d, 0xfd,
  0x22, 0xa7, 0xfb, 0x1f, 0xaa, 0xf9, 0xda, 0x16, 0xc5, 0xba, 0xd8, 0x9b,
  0xe2, 0x71, 0xfe, 0x88, 0x96, 0xcd, 0x5a, 0x5d, 0x00, 0xae, 0x95, 0x68,
  0x8c, 0x57, 0x6b, 0xba, 0xbd, 0x94, 0x2e, 0x6a, 0x79, 0xbc, 0xdf, 0x71,
  0xb9, 0xe5, 0xeb, 0x4c, 0xd5, 0xfc, 0x09, 0x3b, 0x3a, 0x0f, 0x6e, 0x6f,
  0xdf, 0x01, 0xdf, 0xbe, 0x87, 0xea, 0x49, 0x7c, 0xa4, 0xd8, 0x16, 0x88,
  0xd5, 0x9b, 0x35, 0xd7, 0xa3, 0xf4, 0xd8, 0x63, 0xc2, 0xf7, 0x2a, 0xc2,
  0xe7, 0xf3, 0x11, 0xc3, 0x8a, 0x99, 0xb8, 0x6a, 0x03, 0xf0, 0x59, 0xb5,
  0xa4, 0xcc, 0x69, 0xdb, 0x4a, 0xa3, 0xb5, 0x02, 0x8e, 0x82, 0xe0, 0xa6,
  0x34, 0x2a, 0xc5, 0x5d, 0x4c, 0x0b, 0xc4, 0xf0, 0xb1, 0x51, 0x64, 0xf9,

  0x52, 0xd7, 0xad, 0xa6, 0x6e, 0x83, 0x20, 0xb6, 0xc9, 0x28, 0x46, 0x2f,
  0x61, 0x0c, 0x5e, 0x46, 0x71, 0x35, 0xf8, 0x6f, 0x8a, 0x64, 0xeb, 0xeb,



  0xc7, 0x66, 0x27, 0xd5, 0xb1, 0x4d, 0x15, 0x4b, 0xf0, 0x37, 0x36, 0x67,

  0x4c, 0xc4, 0x9f, 0x51, 0x3a, 0x48, 0xe1, 0xc0, 0xf6, 0x23, 0x31, 0x65,






  0xd9, 0x24, 0x61, 0xd0, 0x36, 0x73, 0x1f, 0x61, 0x69, 0xd2, 0x48, 0xa1,
  0x5c, 0x16, 0x77, 0x54, 0xf5, 0x2a, 0xfd, 0xb7, 0x38, 0x35, 0xd8, 0x9e,
  0x87, 0x9c, 0x43, 0x40, 0xca, 0x3b, 0x33, 0xc4, 0xb4, 0xcd, 0x42, 0x90,

  0xb1, 0xa2, 0x6f, 0x78, 0x16, 0x66, 0x82, 0xc6, 0xd2, 0x41, 0x00, 0x14,
  0xd6, 0x62, 0xbd, 0x24, 0xfd, 0xbc, 0x24, 0xdc, 0xdc, 0xaa, 0x88, 0x47,
  0xf6, 0x2f, 0xbd, 0xb8, 0x1c, 0xa5, 0xa9, 0xf6, 0x73, 0xc2, 0xf8, 0x60,
  0x82, 0xe9, 0xb0, 0x41, 0x7c, 0x1c, 0x7b, 0x1e, 0xa6, 0x93, 0xca, 0x38,
  0x67, 0xf7, 0x2e, 0xe7, 0x9c, 0xc4, 0xdc, 0xea, 0x0f, 0x33, 0x58, 0xa8,

  0x34, 0x4e, 0x82, 0x87, 0xa1, 0x16, 0x57, 0x5a, 0x69, 0xd3, 0x62, 0xda,
  0x82, 0xf5, 0xbd, 0xed, 0x9a, 0xdf, 0xba, 0x09, 0x3d, 0x44, 0xa9, 0x2a,
  0x2b, 0x36, 0x25, 0xef, 0xef, 0x77, 0xdc, 0x67, 0x56, 0x45, 0xc3, 0x1b,
  0xa0, 0x48, 0x59, 0xde, 0x8b, 0x67, 0x8b, 0x60, 0x8a, 0xdb, 0x60, 0xa3,
  0xd6, 0xf0, 0xf2, 0xe8, 0xec, 0xf2, 0x9c, 0xf0, 0xf2, 0x10, 0x39, 0x3d,
  0x2b, 0x39, 0x4b, 0x01, 0x7f, 0x86, 0x09, 0xec, 0x19, 0xc3, 0x4a, 0x52,
  0xd2, 0xc8, 0xd8, 0x2f, 0xaf, 0xa6, 0xe6, 0x10, 0x64, 0x3e, 0x84, 0xec,
  0x2b, 0x4e, 0x6f, 0xcb, 0x22, 0xa7, 0xc0, 0x91, 0x19, 0xbc, 0xda, 0x17,
  0xcd, 0xe5, 0xc0, 0x57, 0xed, 0xb7, 0xb5, 0xcb, 0x82, 0x29, 0x44, 0xaa,
  0xbf, 0x6b, 0x00, 0x03, 0xf3, 0x48, 0xe0, 0x01, 0x3d, 0x7e, 0x5e, 0x25,
  0x06, 0x9b, 0x50, 0xec, 0x3a, 0x83, 0x85, 0xaa, 0x1d, 0xac, 0x38, 0x49,
  0x83, 0x80, 0x2b, 0xb4, 0x3e, 0xbe, 0x5c, 0x8d, 0x68, 0x00, 0x1b, 0x9b,
  0x2d, 0xb2, 0x26, 0xde, 0x96, 0x6c, 0x77, 0xd0, 0x08, 0xf5, 0xc0, 0xdf,
  0x56, 0xd6, 0x85, 0xe9, 0x54, 0xb1, 0x71, 0xd6, 0x8a, 0x03, 0x3e, 0xef,
  0xf2, 0x57, 0x87, 0x4b, 0xe4, 0x10, 0x8d, 0x2f, 0xc8, 0xf1, 0xb2, 0xd2,
  0xc4, 0x4f, 0xe0, 0xf7, 0xc4, 0xfd, 0xc5, 0x48, 0x4a, 0x58, 0xc3, 0x99,
  0xc4, 0x73, 0x50, 0x0b, 0x32, 0x2d, 0x14, 0x40, 0xcf, 0x2f, 0xe6, 0x73,



  0x36, 0x27, 0xbc, 0x8c, 0x85, 0x63, 0x29, 0x9c, 0x3d, 0x71, 0x81, 0x46,
  0xfd, 0x00, 0x7f, 0x06, 0x39, 0xa9, 0x3b, 0x7c, 0xa8, 0x26, 0x8c, 0x5e,
  0x37, 0xb8, 0x07, 0x12, 0xb7, 0xd1, 0xd6, 0x9f, 0x0c, 0x1c, 0xce, 0x43,
  0x98, 0xee, 0xdf, 0xd8, 0xb9, 0xea, 0x66, 0x99, 0xdd, 0xc2, 0x14, 0xfc,
  0x72, 0x68, 0x4d, 0xf6, 0xc5, 0xe6, 0x17, 0xdc, 0x32, 0x17, 0xff, 0xc2,
  0xfd, 0x97, 0xcd, 0x08, 0x88, 0x59, 0x7e, 0x87, 0x8e, 0x3c, 0x01, 0xf1,
  0x76, 0x94, 0xd3, 0xd0, 0xec, 0xc6, 0xe6, 0x7e, 0xc0, 0xac, 0xcc, 0x06,
  0x06, 0xd3, 0xd9, 0xf5, 0xa4, 0x6d, 0xb3, 0x79, 0xa0, 0x46, 0x47, 0xa4,
  0x48, 0x14, 0x5b, 0x01, 0xa4, 0xa8, 0x22, 0x49, 0x53, 0xbd, 0x3c, 0x76,
  0xb8, 0x24, 0xb2, 0x47, 0x93, 0x8d, 0xbe, 0x49, 0xd8, 0x2d, 0x4e, 0xf7,
  0xa9, 0xc0, 0x4c, 0xea, 0xb5, 0xf9, 0x6d, 0x74, 0xc0, 0x4a, 0x0a, 0x39,
  0xb2, 0x80, 0x08, 0x6c, 0x29, 0xbf, 0x64, 0xa2, 0x18, 0x9d, 0x0d, 0xfb,
  0xc2, 0xba, 0x8d, 0x29, 0x03, 0x7c, 0xcb, 0x96, 0x72, 0x25, 0x99, 0x21,
  0xb2, 0x79, 0x10, 0x78, 0xf6, 0x93, 0xef, 0x92, 0x5d, 0x88, 0xb3, 0x51,
  0xe6, 0x87, 0x8d, 0x4d, 0xca, 0x9e, 0xc5, 0x0d, 0xcf, 0x7d, 0x66, 0x78,
  0x5e, 0xe7, 0x85, 0x76, 0xa5, 0x5e, 0x1d, 0x75, 0xe0, 0x46, 0x3f, 0xc9,
  0x03, 0x71, 0x78, 0x4c, 0xb0, 0xbf, 0x3c, 0xf7, 0xab, 0xbc, 0xc5, 0xfd,
  0x37, 0xa4, 0xfa, 0xec, 0xa7, 0xb8, 0xa0, 0x31, 0xdd, 0xe5, 0x67, 0x2d,
  0xae, 0xad, 0x5f, 0xcf, 0x02, 0xd5, 0xa2, 0x12, 0x56, 0xe7, 0x73, 0xc0,
  0xcc, 0x63, 0x80, 0x42, 0x77, 0x9f, 0x86, 0x05, 0xe2, 0x27, 0x65, 0xc2,
  0xe9, 0x38, 0x88, 0xe0, 0x60, 0x4e, 0x56, 0xba, 0xc2, 0x4a, 0xc0, 0x02,
  0xcf, 0x42, 0xb1, 0x63, 0x4e, 0xdf, 0x00, 0x89, 0xa1, 0xaa, 0x8a, 0x3d,
  0xc2, 0xbf, 0x6e, 0x3b, 0xda, 0x78, 0x66, 0x73, 0x70, 0xd8, 0xbc, 0x47,
  0x78, 0x4c, 0x17, 0xd6, 0x0b, 0x71, 0xfe, 0xfa, 0x0e, 0xa9, 0x73, 0xb8,
  0x5d, 0x3b, 0xd0, 0xb4, 0xf4, 0xf9, 0x48, 0x08, 0xad, 0x8c, 0x50, 0xa5,
  0x6f, 0x96, 0x08, 0x00, 0x88, 0xe2, 0x8e, 0xbb, 0x46, 0x49, 0x63, 0xb3,
  0x22, 0xc1, 0x39, 0xd7, 0x27, 0xec, 0x01, 0xd5, 0xb1, 0x13, 0xbb, 0x4c,
  0xe0, 0x1a, 0x72, 0x9d, 0xd0, 0xb0, 0xc8, 0x6f, 0x13, 0xa6, 0x39, 0x32,
  0x2c, 0x08, 0x79, 0x89, 0xf5, 0x28, 0xf1, 0xc5, 0x02, 0x97, 0xe3, 0xa6,
  0x10, 0x98, 0xaf, 0xe0, 0x05, 0x5d, 0xb9, 0x43, 0xa5, 0x40, 0x36, 0x58,
  0x5e, 0x98, 0xd2, 0xeb, 0x04, 0x96, 0xa0, 0x7d, 0x1c, 0xf8, 0xb8, 0x46,










  0x08, 0xf4, 0x16, 0xbe, 0xf7, 0x86, 0x0e, 0x90, 0x9c, 0x57, 0x5c, 0x7d,
  0xf7, 0xe6, 0x8b, 0x83, 0xa6, 0xfd, 0xde, 0x9b, 0x53, 0x77, 0xef, 0x7d,
  0xe0, 0x44, 0x9f, 0xdf, 0x78, 0x12, 0x68, 0x89, 0x1c, 0x60, 0xd1, 0x21,


  0x10, 0x15, 0xbb, 0xc2, 0x30, 0x94, 0xd5, 0xf4, 0x72, 0x51, 0x03, 0xd5,


  0x9e, 0x5a, 0x1c, 0x63, 0x4e, 0xe3, 0x21, 0x6b, 0x0d, 0xb5, 0x70, 0xae,
  0x6a, 0x18, 0x5b, 0xf0, 0x57, 0x69, 0xa0, 0xd0, 0x65, 0x15, 0xc9, 0x07,
  0x54, 0xa5, 0x32, 0x30, 0xe3, 0xbf, 0xe1, 0x1a, 0x58, 0xd2, 0xc1, 0xf1,
  0x78, 0x08, 0xb4, 0x27, 0x2d, 0xad, 0x92, 0xf9, 0x6f, 0x98, 0x06, 0x0c,
  0x1a, 0x6d, 0x85, 0x79, 0x60, 0xf4, 0x2d, 0x4f, 0xe5, 0xe4, 0x66, 0x82,
  0xa6, 0x4e, 0x84, 0x8b, 0xbc, 0x0d, 0x26, 0x0d, 0xc2, 0x8f, 0xbb, 0x9a,
  0x01, 0x77, 0x77, 0x88, 0x4e, 0xd0, 0x5a, 0x09, 0x18, 0x82, 0xec, 0xb0,
  0x48, 0x4d, 0x95, 0x5d, 0x2a, 0xe0, 0xf0, 0x9c, 0xb4, 0x25, 0x86, 0x75,
  0xac, 0xd9, 0x58, 0xbc, 0x78, 0x17, 0x2b, 0x2f, 0xd0, 0xf0, 0x80, 0x13,
  0x9e, 0xc4, 0x3a, 0xd3, 0x1f, 0x98, 0x2e, 0x82, 0xb5, 0x6c, 0x19, 0x36,
  0x50, 0xc4, 0x62, 0x0d, 0xb4, 0x02, 0xa4, 0xa9, 0x44, 0xce, 0x63, 0xee,
  0x2b, 0x07, 0x9f, 0x6f, 0x75, 0xc5, 0xa6, 0xc1, 0x28, 0x97, 0xfb, 0x0c,
  0xa1, 0xd2, 0xfa, 0x5a, 0x04, 0x3e, 0x06, 0x3f, 0x35, 0x4f, 0xb6, 0x20,
  0xb0, 0xbf, 0xec, 0xef, 0xef, 0x62, 0xa8, 0x3b, 0xec, 0x4a, 0x62, 0x76,
  0xe7, 0x3a, 0x0f, 0x8c, 0xf7, 0xa0, 0x0c, 0x65, 0x7b, 0x3a, 0x77, 0xcb,
  0x9c, 0xc6, 0xa9, 0x84, 0x49, 0xd7, 0xa8, 0xe1, 0x60, 0xd0, 0x11, 0x31,
  0x4e, 0xcb, 0x80, 0xef, 0x82, 0x13, 0xd8, 0x84, 0xe0, 0x4c, 0x1f, 0x48,
  0xea, 0x82, 0xc5, 0xa4, 0x4d, 0xa7, 0x08, 0x17, 0xa6, 0x43, 0x4d, 0x6c,
  0x74, 0xd6, 0xb0, 0xfb, 0x2b, 0xef, 0xc9, 0xab, 0xfe, 0x5e, 0xed, 0x9e,
  0x54, 0xb3, 0x79, 0xef, 0x7e, 0xf8, 0x44, 0xc8, 0xe3, 0xfa, 0xec, 0x3d,
  0xa5, 0x7c, 0x28, 0xbb, 0xa1, 0x4e, 0x2c, 0xea, 0x7d, 0x46, 0xbf, 0x0e,
  0xbb, 0x08, 0x11, 0xa1, 0x9b, 0x26, 0xf2, 0x9c, 0xcc, 0x5a, 0x53, 0x33,
  0x2a, 0xe6, 0xbe, 0x42, 0xde, 0xc1, 0x90, 0xec, 0xc6, 0x5e, 0x2c, 0x66,
  0x69, 0xb0, 0xb0, 0x47, 0x33, 0x6b, 0x93, 0x87, 0x64, 0xb4, 0xa4, 0xf0,
  0x34, 0x2a, 0x87, 0x88, 0x21, 0xb5, 0xda, 0x6f, 0xee, 0xf8, 0xca, 0xc5,

  0x3b, 0x0e, 0x3f, 0x68, 0x6e, 0x46, 0x73, 0xed, 0xbc, 0x78, 0xcf, 0x69,
  0xc6, 0xf5, 0xed, 0xa1, 0xdf, 0x79, 0x21, 0x62, 0xca, 0xe7, 0x47, 0x81,
  0x08, 0x24, 0x95, 0x4e, 0x33, 0x56, 0x39, 0xde, 0xa7, 0xa3, 0x22, 0x2f,
  0xf3, 0x09, 0x67, 0xaa, 0x39, 0xe6, 0xd1, 0xe9, 0xe9, 0x20, 0xba, 0x4f,
  0x86, 0x5a, 0x12, 0xdb, 0xf7, 0x7d, 0xc8, 0xc4, 0x43, 0x30, 0x30, 0x52,
  0xa4, 0x49, 0x85, 0x5b, 0xa6, 0xa1, 0x50, 0x84, 0x88, 0xa2, 0xbe, 0x74,
  0x02, 0xa0, 0x42, 0xea, 0x3b, 0xb6, 0xf6, 0x9c, 0xb1, 0x60, 0x5a, 0x24,
  0x79, 0x20, 0x1e, 0xce, 0x13, 0x50, 0xb1, 0xc2, 0x74, 0x42, 0x32, 0x7c,
  0x18, 0x4b, 0xd7, 0x34, 0xf6, 0x0c, 0x00, 0xdb, 0x41, 0x0d, 0x45, 0x3c,
  0x2a, 0xb7, 0xe8, 0x2a, 0xf3, 0x6a, 0x55, 0x86, 0x09, 0xf6, 0x19, 0xc5,
  0x28, 0x7f, 0xdd, 0x69, 0x97, 0x8d, 0xf3, 0x82, 0x32, 0x90, 0x9c, 0x7e,
  0x46, 0xd4, 0xf9, 0x73, 0x59, 0x50, 0xd1, 0x15, 0xc1, 0x97, 0xfa, 0xfc,
  0xf4, 0xfe, 0x86, 0xc3, 0xb5, 0x7a, 0x0a, 0x28, 0x9c, 0xa8, 0xca, 0x96,
  0x4b, 0x7b, 0xa4, 0x6b, 0x06, 0xce, 0xdf, 0x8a, 0x1b, 0xe7, 0x34, 0x82,
  0x50, 0x87, 0x72, 0x1e, 0xb6, 0xa4, 0x54, 0x72, 0x14, 0xde, 0xa4, 0xd3,
  0x96, 0xf6, 0xb6, 0x06, 0xdc, 0x81, 0x84, 0x13, 0xdd, 0x58, 0x9a, 0x8d,
  0x88, 0xcc, 0x82, 0xef, 0x68, 0xe4, 0xf5, 0x6c, 0xa6, 0xaa, 0x27, 0xdf,
  0x01, 0xdb, 0x42, 0x7d, 0x6d, 0x98, 0x18, 0x8e, 0xde, 0xd8, 0x88, 0x27,
  0x91, 0x64, 0xa9, 0x4c, 0xd3, 0x4d, 0x54, 0x60, 0x7e, 0x61, 0x28, 0xa9,
  0x3e, 0x15, 0x73, 0x03, 0xac, 0xd2, 0x57, 0xd7, 0xfa, 0x54, 0xcb, 0xf3,
  0x00, 0x28, 0x1c, 0x57, 0x41, 0x58, 0xe9, 0x6b, 0x03, 0xce, 0xa7, 0x48,
  0x56, 0x20, 0x1f, 0xc5, 0x09, 0xc6, 0xca, 0xbf, 0xc7, 0x74, 0x3c, 0xf5,
  0x48, 0x97, 0x7b, 0x75, 0x73, 0xfc, 0xc1, 0x4e, 0x6f, 0x98, 0xc4, 0xd8,
  0x61, 0xe9, 0xb0, 0x42, 0x85, 0x29, 0x5c, 0x99, 0xd2, 0x52, 0x98, 0xf2,
  0x35, 0xbf, 0x79, 0x4d, 0x9a, 0x16, 0x1e, 0xed, 0xc5, 0xd1, 0x87, 0xeb,
  0x77, 0x51, 0xb4, 0x83, 0x5d, 0x22, 0x9e, 0x53, 0x99, 0x42, 0x1c, 0xa1,
  0x36, 0x8a, 0xde, 0x6a, 0x6a, 0xd4, 0x9c, 0xfd, 0x75, 0x99, 0xd5, 0x1b,
  0xb8, 0x84, 0x7c, 0xf3, 0x24, 0x3f, 0x45, 0xf4, 0x72, 0x99, 0x74, 0x2d,
  0xb3, 0x5a, 0xdb, 0x7b, 0xf1, 0x89, 0xf4, 0x7a, 0x5c, 0x3d, 0x07, 0x57,
  0xfb, 0x89, 0x30, 0x66, 0x19, 0x86, 0xe7, 0x90, 0xd9, 0xca, 0x74, 0x15,
  0x3f, 0x48, 0xe3, 0xa5, 0xd4, 0x4f, 0x09, 0x1d, 0xfc, 0x55, 0xb3, 0x3d,
  0xef, 0xd5, 0xdb, 0xe3, 0xc6, 0x70, 0x2f, 0x5e, 0xee, 0x6f, 0x7d, 0xc2,
  0x24, 0xbd, 0x1c, 0xbd, 0x23, 0xe2, 0x45, 0x08, 0xa2, 0xe6, 0x7c, 0x5f,



  0x60, 0xd9, 0xaa, 0xfa, 0x19, 0x72, 0x79, 0xc8, 0x2d, 0xab, 0x2f, 0xab,
  0x31, 0x66, 0x6b, 0x19, 0xd4, 0x8d, 0x42, 0xd5, 0xfd, 0x7f, 0xfc, 0xd3,
  0x2f, 0xab, 0xfd, 0xf1, 0x67, 0xf6, 0x13, 0x4f, 0xa8, 0xa9, 0xa5, 0x4d,
  0xf4, 0x57, 0x36, 0x53, 0x5a, 0x89, 0x8c, 0x37, 0x7a, 0xed, 0x8f, 0x6b,
  0xa6, 0xf5, 0x14, 0xe9, 0xfc, 0x61, 0xdc, 0x7e, 0x11, 0x9e, 0x32, 0x37,
  0x3d, 0x58, 0x02, 0x25, 0x8f, 0x1d, 0x75, 0x40, 0xa1, 0xa9, 0x4c, 0x67,
  0xbe, 0x71, 0x5b, 0xe3, 0x38, 0xed, 0xa0, 0x24, 0xf0, 0x5d, 0xea, 0x26,
  0x47, 0x77, 0x36, 0xe7, 0x56, 0xd1, 0xfc, 0x51, 0x15, 0xa5, 0xf2, 0xe5,


  0x34, 0x6b, 0xf1, 0x5d, 0x4a, 0x02, 0xd1, 0x3f, 0xe0, 0x04, 0xba, 0xd5,
  0x7d, 0xfe, 0xcf, 0xba, 0x1f, 0x13, 0x34, 0x0c, 0x9c, 0xf1, 0xc7, 0x3f,
  0x6e, 0x63, 0x45, 0x50, 0xa7, 0x39, 0x44, 0x4e, 0x0d, 0x09, 0xcc, 0xa9,
  0x1a, 0x05, 0x69, 0x15, 0x38, 0xaf, 0x7e, 0x10, 0x8b, 0x8d, 0xbb, 0xa8,
  0x37, 0xfe, 0xb3, 0x8f, 0xff, 0xfd, 0x71, 0xbb, 0xb7, 0xff, 0xb3, 0xf9,
  0xe8, 0x1f, 0xb7, 0x3f, 0xfe, 0x71, 0xa7, 0x13, 0x2c, 0xab, 0xb3, 0xb5,
  0xff, 0x4e, 0x86, 0x22, 0xaa, 0xb3, 0xd9, 0xa3, 0x94, 0x69, 0x48, 0x84,
  0xd1, 0xf6, 0xba, 0xa4, 0xce, 0xd9, 0x3e, 0x3e, 0x12, 0xfa, 0xad, 0x1a,

  0x9a, 0xaa, 0x36, 0xbb, 0x54, 0xe6, 0x70, 0x9f, 0xf3, 0xcb, 0xe2, 0x53,
  0xe1, 0xfa, 0x3f, 0xad, 0x1f, 0xf0, 0x78, 0x21, 0x42, 0x31, 0xb9, 0xb4,
  0x81, 0x68, 0x29, 0x0a, 0xb1, 0xe1, 0xef, 0x86, 0xa4, 0x45, 0x81, 0x34,
  0x8b, 0xa3, 0xc6, 0xa6, 0x0f, 0x87, 0xe6, 0x27, 0x59, 0xe2, 0x15, 0x62,
  0xc5, 0x8c, 0x11, 0x95, 0x08, 0xd8, 0x5d, 0x64, 0xb8, 0x02, 0xbc, 0x69,
  0xc2, 0xd6, 0x12, 0xcd, 0xa2, 0xd9, 0xdb, 0x9e, 0xe9, 0xd8, 0xba, 0xbb,
  0xc9, 0x2d, 0xfe, 0xba, 0xd4, 0x86, 0xf6, 0x56, 0xa0, 0xc0, 0x48, 0x69,
  0x69, 0x63, 0x2f, 0xf4, 0x33, 0x89, 0xbb, 0x50, 0x7d, 0x3f, 0xc9, 0xb8,
  0x32, 0x0f, 0x45, 0xf2, 0xe2, 0x21, 0x76, 0xa2, 0xac, 0x35, 0xf6, 0x32,
  0x5d, 0x9a, 0x86, 0x16, 0x6d, 0x2a, 0x2e, 0x5b, 0x36, 0xc4, 0xdd, 0x0a,
  0x67, 0x13, 0x64, 0xa3, 0x68, 0x73, 0x56, 0x38, 0x75, 0xb9, 0x28, 0x16,
  0xb3, 0x47, 0xab, 0xa4, 0xe7, 0x54, 0xc5, 0x52, 0x15, 0x2e, 0xfd, 0xd4,
  0xc9, 0x70, 0x93, 0xb0, 0x5e, 0xcf, 0x8b, 0x45, 0x02, 0x11, 0x8d, 0x1f,
  0x81, 0x13, 0x32, 0xb0, 0xab, 0xc1, 0x89, 0x54, 0x0f, 0x81, 0xf0, 0x1a,
  0xa0, 0xb3, 0xb5, 0xde, 0x5a, 0xb4, 0x4e, 0x95, 0xf3, 0x64, 0xd6, 0x45,
  0xe3, 0xb8, 0xbc, 0xd9, 0x08, 0x79, 0x21, 0xad, 0xe3, 0xcf, 0x32, 0x2a,


  0xe9, 0xcc, 0x41, 0x12, 0x93, 0x39, 0xd4, 0x2a, 0x6f, 0xf5, 0x05, 0x83,
  0x6a, 0x60, 0x92, 0x60, 0xcf, 0x44, 0x92, 0x6b, 0x3f, 0xe9, 0xa1, 0xb1,
  0x48, 0x3f, 0xfd, 0x0f, 0x7e, 0xd6, 0x8b, 0x63, 0xe0, 0x93, 0x9c, 0xe5,
  0xd5, 0xe3, 0x02, 0x28, 0x2b, 0x44, 0xb5, 0x97, 0x37, 0xe6, 0x43, 0x87,
  0x52, 0x80, 0xe2, 0xf2, 0x96, 0x03, 0xa5, 0xe3, 0xdc, 0xf4, 0xfd, 0xb6,
  0x7e, 0x94, 0xae, 0x30, 0xd4, 0xde, 0xff, 0xec, 0x3a, 0x63, 0x09, 0x3e,


  0x4a, 0x38, 0x05, 0x08, 0xcd, 0xcb, 0x22, 0x9f, 0x95, 0x35, 0x68, 0x2d,
  0xa9, 0x84, 0x46, 0xef, 0xb6, 0x71, 0xd1, 0xf0, 0x37, 0xcb, 0x14, 0x39,
  0x71, 0x9c, 0x05, 0x52, 0x8c, 0xcb, 0x40, 0x04, 0x08, 0x65, 0x9c, 0x76,
  0xbc, 0x06, 0x4a, 0x0e, 0x48, 0x28, 0x6b, 0x1c, 0xd4, 0xe6, 0xbc, 0xaa,
  0x3d, 0x45, 0xed, 0xc1, 0xf6, 0x5c, 0x02, 0xa9, 0x42, 0xa2, 0x7a, 0x76,
  0xbb, 0x0c, 0xa7, 0x5f, 0x3a, 0x52, 0x0e, 0x46, 0xca, 0xe3, 0x82, 0xb7,
  0x34, 0x14, 0x0f, 0x4f, 0xa6, 0x08, 0xf5, 0x82, 0xda, 0x07, 0x56, 0xbb,
  0xc3, 0x5d, 0xca, 0x9e, 0x68, 0xdd, 0xdc, 0x70, 0x82, 0x60, 0x3c, 0x36,

  0x3a, 0x5c, 0xdc, 0x14, 0xa0, 0xc9, 0xfb, 0x75, 0x73, 0x83, 0x77, 0x11,
  0xe3, 0xa2, 0xc2, 0x53, 0xfc, 0x8c, 0xb9, 0xec, 0x0e, 0x74, 0xe4, 0x27,
  0xc4, 0x3b, 0xc4, 0x84, 0xa0, 0x5e, 0x5c, 0xf6, 0x3c, 0xea, 0xb8, 0xb6,
  0x05, 0xd3, 0x1c, 0x0f, 0xca, 0xd9, 0xb6, 0xc4, 0x5c, 0x54, 0x0c, 0x91,
  0x66, 0x88, 0xa9, 0x03, 0xf4, 0xb1, 0xd9, 0xef, 0x6f, 0xa2, 0xfc, 0xd9,
  0x84, 0x3f, 0x52, 0xa7, 0x41, 0x4c, 0xb3, 0x0b, 0x21, 0x30, 0x2d, 0xfc,
  0x16, 0xfa, 0xf3, 0xa4, 0x63, 0xaf, 0xd3, 0xd5, 0xed, 0x6f, 0x4b, 0x4a,
  0x25, 0x2e, 0xc0, 0x32, 0x28, 0xb8, 0x26, 0x1b, 0xd1, 0xee, 0x8d, 0xba,

  0x13, 0x48, 0x2a, 0x94, 0x10, 0x49, 0x29, 0xf8, 0x1f, 0x8d, 0x7e, 0x96,
  0x68, 0xa2, 0x93, 0x27, 0x0d, 0x17, 0x91, 0x56, 0x8a, 0xba, 0x46, 0xf5,
  0xf0, 0xf1, 0x4a, 0xdb, 0x7c, 0x6f, 0xa7, 0x71, 0x7c, 0x29, 0x1c, 0xf8,
  0x18, 0xac, 0x1c, 0x02, 0x6b, 0xc5, 0x6c, 0x4a, 0xbf, 0x1e, 0x4b, 0x1c,
  0xa3, 0x1c, 0x48, 0x6f, 0xc2, 0xcf, 0xb1, 0xb8, 0x32, 0x0a, 0xa4, 0xd3,
  0x66, 0x50, 0x72, 0xc7, 0x3d, 0xc5, 0x87, 0x3f, 0x42, 0xf9, 0x58, 0x92,

  0x6d, 0x4d, 0xe4, 0x90, 0x98, 0xd6, 0x29, 0xa2, 0x95, 0xc6, 0x9c, 0xcd,

  0x45, 0x66, 0x98, 0xa4, 0x77, 0x84, 0x3c, 0x58, 0xc6, 0x7d, 0x64, 0x9c,
  0x5e, 0xce, 0x14, 0x60, 0xcd, 0x88, 0x77, 0x0b, 0x3b, 0xff, 0xe6, 0xe4,
  0x4a, 0x54, 0x4d, 0x72, 0x26, 0xd9, 0x26, 0xd5, 0x7e, 0x0f, 0x77, 0x34,
  0x4a, 0x5f, 0xec, 0x91, 0xed, 0x88, 0xfb, 0x56, 0xde, 0xc4, 0x3b, 0xfb,
  0x2f, 0x64, 0xda, 0x8a, 0x7e, 0x46, 0x3a, 0xd8, 0x1a, 0xff, 0x6a, 0x73,
  0x93, 0x13, 0x1f, 0xd0, 0xcd, 0xe0, 0xf1, 0x78, 0xf2, 0xf9, 0xe1, 0xb3,
  0x5f, 0xac, 0x85, 0x53, 0x1e, 0xd5, 0x0a, 0xd1, 0x56, 0xc9, 0xd4, 0xab,

  0x8d, 0x52, 0x33, 0xdd, 0x46, 0x1b, 0xdd, 0x5a, 0x1b, 0x35, 0xaa, 0x43,
  0x8a, 0x57, 0xf4, 0x9f, 0x10, 0xbc, 0x10, 0x6a, 0xf4, 0x0a, 0xdc, 0x41,
  0xeb, 0x8a, 0x11, 0x87, 0xd5, 0xd9, 0x1d, 0xce, 0x66, 0xc4, 0x06, 0xdd,
  0x23, 0x1f, 0x94, 0x86, 0xeb, 0x75, 0x88, 0xea, 0xdc, 0x91, 0x25, 0x91,
  0x17, 0x91, 0xcc, 0x11, 0xa7, 0x11, 0x29, 0x4f, 0x03, 0x68, 0xec, 0x5e,
  0xa3, 0xc3, 0x5c, 0x0e, 0xbd, 0x8c, 0x13, 0xf9, 0xa6, 0xc1, 0x4d, 0x25,
  0xdf, 0x8c, 0x93, 0xe7, 0x69, 0xaf, 0x0b, 0x48, 0xf6, 0x82, 0x95, 0x04,
  0x67, 0x03, 0x3c, 0x2f, 0x00, 0xe1, 0x74, 0x2b, 0x1c, 0x0e, 0x25, 0xfa,
  0x8d, 0x92, 0x94, 0x81, 0xb4, 0xe0, 0x6c, 0x31, 0x82, 0xe7, 0xdd, 0x03,
  0x20, 0x85, 0x4d, 0xa4, 0x03, 0xb1, 0x1b, 0xbd, 0x86, 0x18, 0x18, 0x2f,
  0x78, 0xd5, 0xdf, 0x3a, 0x50, 0x88, 0xdd, 0x6e, 0xf4, 0x4d, 0xb6, 0xc4,
  0xf3, 0xc0, 0x45, 0x7f, 0x33, 0xf8, 0xd6, 0x2b, 0x96, 0xc3, 0x37, 0xf6,
  0x76, 0xf1, 0x8d, 0xf3, 0x01, 0x3f, 0x75, 0x9f, 0xcf, 0x26, 0xf0, 0x66,
  0xe8, 0xb9, 0x97, 0xf8, 0x1c, 0x50, 0xdc, 0xb8, 0x9a, 0x95, 0x4a, 0x54,
  0x2b, 0x66, 0xb2, 0xb7, 0x17, 0x98, 0x49, 0xf7, 0x17, 0x7f, 0xe8, 0x82,
  0x5c, 0xae, 0x48, 0x4c, 0xd8, 0x47, 0x8a, 0x08, 0x87, 0xca, 0x08, 0x0c,

  0x60, 0xf4, 0xa7, 0x64, 0xbe, 0x0c, 0xfc, 0xf0, 0x9c, 0x2e, 0x73, 0x05,
  0xe1, 0xde, 0x55, 0x84, 0x27, 0xf0, 0x72, 0x67, 0x77, 0x7b, 0xf3, 0x45,
  0x7f, 0xaf, 0xbf, 0x63, 0xd2, 0xfa, 0x80, 0x0e, 0xee, 0xb0, 0x0b, 0x0a,
  0x66, 0x51, 0x04, 0x42, 0x0f, 0x94, 0xd0, 0x92, 0x66, 0x30, 0x8e, 0x03,
  0x73, 0x21, 0x68, 0xf5, 0x36, 0xa1, 0x07, 0x41, 0x2d, 0xb6, 0xdd, 0xfa,
  0xb0, 0x7e, 0xa0, 0xeb, 0x2a, 0x62, 0x65, 0x50, 0x61, 0x8b, 0xf8, 0x99,
  0x30, 0xc3, 0x99, 0xdc, 0x23, 0xc3, 0xf4, 0x6f, 0xcb, 0xb4, 0x02, 0x2d,
  0x00, 0x99, 0x0a, 0x7a, 0xcf, 0x14, 0x36, 0x9f, 0x20, 0xc3, 0x68, 0x1d,
  0x78, 0x23, 0x02, 0x6e, 0x49, 0x9e, 0x3c, 0xe5, 0x4f, 0xdb, 0x40, 0x20,
  0xd7, 0xa0, 0xa5, 0xc4, 0xbb, 0x22, 0x6e, 0x57, 0x03, 0x76, 0x64, 0x36,
  0xa2, 0x2e, 0x88, 0x60, 0xe4, 0xdd, 0xa1, 0xc7, 0xde, 0xef, 0x4e, 0x2b,
  0xdd, 0x6a, 0x08, 0x36, 0x42, 0x83, 0x2e, 0x9a, 0x5d, 0x62, 0xb1, 0xed,
  0xe5, 0x07, 0x5c, 0xaf, 0xc2, 0xde, 0x27, 0x5a, 0xb7, 0xc7, 0x9d, 0xec,
  0x3e, 0xd4, 0x4e, 0x5c, 0x50, 0xe1, 0xb1, 0x5e, 0x8c, 0x63, 0x0b, 0x0c,
  0xe5, 0x47, 0x2c, 0x0a, 0x0b, 0xff, 0x56, 0xa0, 0xd2, 0xac, 0xce, 0x84,
  0x50, 0xfc, 0x8f, 0x3a, 0x00, 0x08, 0xff, 0xab, 0xd1, 0x2b, 0xb9, 0xb5,

  0x4d, 0x66, 0xb3, 0x99, 0xac, 0x8c, 0xf9, 0xab, 0xa9, 0x6c, 0xf7, 0xb7,
  0xa7, 0xb2, 0x9d, 0xe7, 0x52, 0x99, 0x25, 0x32, 0xbc, 0x67, 0x2b, 0x48,
  0x8c, 0x8c, 0x20, 0x16, 0xbd, 0x2d, 0x54, 0xe6, 0x92, 0x99, 0xe4, 0xde,
  0xf8, 0x84, 0x56, 0xa3, 0x33, 0x43, 0x66, 0x2d, 0x54, 0xc6, 0x18, 0x61,
  0x4c, 0x63, 0xab, 0x49, 0x4c, 0xcb, 0xd1, 0xa3, 0xd5, 0x54, 0x56, 0xcf,

  0xf8, 0x5e, 0x4d, 0x67, 0x96, 0x1c, 0x9e, 0x4d, 0x65, 0xda, 0x95, 0x88,
  0xb9, 0x4e, 0x0b, 0x89, 0xd5, 0x68, 0x4c, 0x88, 0x2c, 0x48, 0x65, 0xaf,
  0x42, 0x54, 0xb6, 0xfb, 0x1c, 0x2a, 0x83, 0x03, 0x9d, 0xa1, 0xa8, 0xac,
  0x51, 0xd9, 0xde, 0x6f, 0x4b, 0x65, 0x88, 0x51, 0xd4, 0xac, 0x75, 0x8d,
  0x8e, 0xfe, 0xd5, 0x73, 0x8c, 0x69, 0x58, 0x1d, 0xd5, 0x2b, 0x01, 0xfd,
  0x65, 0x9c, 0xa2, 0x71, 0xa1, 0x9f, 0x3c, 0xb1, 0x3a, 0x2a, 0xd0, 0xf6,
  0x2f, 0x3e, 0xb1, 0x9d, 0xa6, 0x65, 0x52, 0x24, 0xec, 0x35, 0xff, 0x51,
  0x83, 0x17, 0x07, 0x9b, 0x9b, 0x3f, 0x93, 0x0f, 0xe8, 0x00, 0x65, 0xdf,
  0xcf, 0x5e, 0x23, 0xf1, 0x80, 0x3a, 0x3b, 0xb8, 0x38, 0xfe, 0x76, 0x20,
  0xde, 0x77, 0xd1, 0x39, 0x54, 0x27, 0x61, 0x3f, 0x25, 0xe8, 0xaa, 0x54,
  0xbd, 0xed, 0xa9, 0xb9, 0xdc, 0xca, 0xb6, 0xf7, 0xd0, 0x55, 0x0f, 0x38,
  0xa5, 0x4d, 0x09, 0x33, 0x26, 0x90, 0x3a, 0xa9, 0x8b, 0xe6, 0x32, 0x0d,
  0x19, 0x55, 0x1a, 0xa5, 0xfb, 0x86, 0x1a, 0x4f, 0xc4, 0xc4, 0x01, 0xc4,
  0x35, 0x93, 0x39, 0x2f, 0xae, 0x57, 0x37, 0x05, 0x15, 0xa6, 0xd0, 0xa3,
  0x1b, 0x1a, 0xfc, 0x5a, 0x35, 0x3b, 0x99, 0xd7, 0x3b, 0x02, 0xf3, 0x5d,
  0x14, 0x1a, 0x50, 0x0c, 0x19, 0xb9, 0xe6, 0xb7, 0xea, 0x09, 0x0c, 0x81,
  0x56, 0x08, 0x38, 0x9d, 0xb3, 0xdf, 0xf8, 0x9e, 0x97, 0x02, 0x98, 0x3e,
  0xd4, 0x30, 0x72, 0x50, 0x3c, 0x50, 0x0f, 0xe8, 0x4a, 0xdb, 0xac, 0x3c,
  0x70, 0x53, 0x0c, 0x1a, 0x84, 0x13, 0xb0, 0x12, 0x6a, 0x64, 0x52, 0xee,
  0xc1, 0x90, 0x4d, 0xbf, 0x12, 0xff, 0x22, 0xc6, 0xdf, 0xf0, 0xdf, 0xf7,
  0xf1, 0xbb, 0xe8, 0xb1, 0xe6, 0x7f, 0xdd, 0xe0, 0x3f, 0xe9, 0x7b, 0x8a,
  0x7f, 0x55, 0x3b, 0xe5, 0x51, 0x78, 0xa3, 0xdd, 0x8a, 0x27, 0x83, 0xcd,
  0x70, 0x9e, 0xdb, 0x9a, 0x40, 0x77, 0xd5, 0x2e, 0x8c, 0x9e, 0x97, 0xb6,
  0x62, 0xb8, 0x30, 0x8d, 0xbc, 0x17, 0x56, 0xb8, 0x12, 0x17, 0x24, 0x53,
  0x51, 0x0f, 0xdc, 0xd6, 0x67, 0x36, 0xde, 0x2b, 0x07, 0xc0, 0x8d, 0x42,
  0x03, 0x28, 0xd6, 0xdc, 0xd8, 0x43, 0xe6, 0xbd, 0xbd, 0xf5, 0xb9, 0xef,
  0x92, 0xf8, 0xa0, 0x15, 0x79, 0x16, 0x29, 0x92, 0xd2, 0x3a, 0x28, 0x37,
  0x7e, 0x68, 0xeb, 0x50, 0x42, 0x9f, 0x0d, 0x14, 0xed, 0xa1, 0xed, 0x3b,

  0x4e, 0xd8, 0x58, 0x1a, 0xb2, 0xdd, 0xeb, 0xe7, 0x44, 0x53, 0x0d, 0x72,
  0x49, 0x92, 0x4d, 0x10, 0x8e, 0x23, 0xc9, 0x4d, 0xf0, 0xf8, 0x3b, 0x7a,
  0x31, 0x34, 0x64, 0xf6, 0x95, 0xc5, 0xa1, 0xfb, 0xd3, 0xde, 0x16, 0x9e,
  0xaa, 0x8e, 0x82, 0xcd, 0x7d, 0x66, 0x1a, 0xea, 0xf8, 0xd3, 0x6e, 0xdc,
  0xff, 0x1d, 0x71, 0xa4, 0xf6, 0xeb, 0x56, 0xf4, 0x1f, 0xe5, 0x8e, 0x4f,
  0x11, 0xec, 0xa6, 0x37, 0x8c, 0x8b, 0x80, 0xcf, 0x46, 0x34, 0x44, 0xc5,



  0x48, 0x51, 0x84, 0x11, 0x7d, 0x8b, 0x5b, 0x5b, 0x48, 0x4e, 0xbf, 0xf9,
  0x21, 0x0c, 0x15, 0xf9, 0xdd, 0x32, 0x4c, 0xbc, 0xc1, 0x6d, 0x7c, 0xdd,
  0x65, 0x64, 0x2f, 0x07, 0xd8, 0x2b, 0x9e, 0x75, 0x31, 0x12, 0x19, 0x70,
  0xe7, 0xd0, 0xd9, 0xd4, 0x3e, 0x32, 0x2e, 0xe2, 0x7b, 0xc7, 0x82, 0x66,
  0x64, 0xfd, 0x09, 0x05, 0x1d, 0x6c, 0x06, 0x09, 0xa6, 0x7c, 0x63, 0x44,
  0x39, 0xa4, 0x7d, 0x94, 0xa3, 0x02, 0xdb, 0x20, 0x49, 0xb7, 0x07, 0x1a,
  0x6b, 0x81, 0xe8, 0x86, 0xa0, 0x76, 0x4c, 0x13, 0xad, 0xfc, 0x34, 0xab,
  0x56, 0x68, 0x0f, 0xc2, 0xf3, 0xe8, 0x07, 0x92, 0xaa, 0xad, 0x3b, 0x4b,
  0x3b, 0x91, 0xc7, 0x02, 0xfe, 0x81, 0xaf, 0x6a, 0x0d, 0xae, 0x13, 0xc6,
  0x28, 0x17, 0xd8, 0x84, 0x0f, 0xbe, 0x9d, 0x2e, 0x9a, 0x22, 0xba, 0xf7,
  0x3a, 0x7f, 0xdd, 0xdb, 0x30, 0x80, 0x6b, 0xf9, 0x5d, 0x52, 0x72, 0x4f,
  0x5d, 0x9c, 0x2c, 0xc6, 0x9b, 0x6f, 0xc8, 0xc9, 0x22, 0xe2, 0x8b, 0x0a,
  0x4e, 0x29, 0x81, 0x54, 0x60, 0xb5, 0xbc, 0xf6, 0x30, 0x3c, 0xb3, 0x02,
  0x43, 0xcd, 0xc2, 0xef, 0xd0, 0x1d, 0x03, 0xbb, 0x35, 0xe1, 0xfc, 0x34,
  0x2a, 0x49, 0xc5, 0x28, 0xbc, 0xe0, 0x40, 0xb3, 0x57, 0x3f, 0x5f, 0xd4,
  0x65, 0x13, 0x56, 0x37, 0x2b, 0x6f, 0x38, 0x54, 0xa6, 0xf2, 0xe5, 0x93,
  0xb5, 0x0b, 0x86, 0xfd, 0x4c, 0xc4, 0x89, 0x81, 0x97, 0x8f, 0x6a, 0x59,
  0x18, 0x41, 0x7a, 0x74, 0x93, 0xcc, 0xa5, 0x8d, 0x4e, 0x4b, 0x25, 0x78,
  0x6b, 0xd9, 0x74, 0x7d, 0x4e, 0x9c, 0xdc, 0x37, 0xa9, 0x16, 0xfd, 0x79,
  0xfe, 0x77, 0xd8, 0xe6, 0x18, 0xfb, 0xf2, 0x79, 0x57, 0x02, 0x64, 0x7d,
  0xc6, 0xe7, 0x82, 0x21, 0x9a, 0xcc, 0x58, 0x95, 0x91, 0x83, 0x85, 0x27,

  0x38, 0xdf, 0x5c, 0xb1, 0x1f, 0x45, 0xc7, 0x30, 0xe3, 0x93, 0x8f, 0x1f,
  0xce, 0x07, 0x1f, 0x2e, 0x9b, 0x84, 0x7d, 0x79, 0x71, 0x75, 0x7d, 0xf2,

  0xe6, 0xe3, 0xe5, 0xd5, 0xc5, 0xf5, 0xc5, 0xf1, 0xc5, 0x59, 0xb4, 0xbe,
  0xbd, 0xb1, 0xb2, 0x42, 0xcd, 0x78, 0x20, 0x1c, 0xac, 0x43, 0x9d, 0x3f,
  0xf3, 0x2c, 0x33, 0x8b, 0x75, 0x5c, 0x8f, 0x3f, 0xda, 0xf7, 0xda, 0xe7,
  0xbe, 0x16, 0x0f, 0x67, 0x57, 0x04, 0x89, 0x37, 0x62, 0xeb, 0x71, 0x34,
  0x5d, 0xf2, 0x4d, 0xb1, 0xd9, 0x0a, 0x8c, 0xf4, 0xe9, 0x29, 0x5c, 0x89,
  0x44, 0x4c, 0x9d, 0xe2, 0xa6, 0x95, 0xee, 0xb8, 0xfd, 0xa6, 0xce, 0x82,
  0x67, 0x40, 0x0a, 0x98, 0xa5, 0x8a, 0x72, 0x35, 0x59, 0x30, 0x22, 0x0a,
  0xc1, 0x68, 0x9b, 0x37, 0xa8, 0xc7, 0x80, 0x04, 0xb0, 0xf2, 0xcc, 0x68,
  0x74, 0x20, 0x4a, 0x2f, 0xfd, 0x5e, 0x53, 0xf2, 0x0a, 0xcc, 0x37, 0x93,
  0x8e, 0xa7, 0x32, 0x11, 0x8a, 0x60, 0x52, 0x2b, 0x15, 0x8e, 0xa7, 0xc3,
  0x03, 0xf8, 0x5b, 0x87, 0xab, 0x52, 0x65, 0x97, 0x17, 0x15, 0xe6, 0x97,
  0x19, 0x2d, 0xe4, 0xde, 0x99, 0x14, 0x0e, 0x87, 0x4a, 0x19, 0x61, 0x19,
  0x06, 0x38, 0xec, 0x89, 0x86, 0xc7, 0x18, 0xe9, 0x84, 0x6e, 0x24, 0xa9,
  0x2f, 0x8a, 0x91, 0x33, 0x70, 0x17, 0xf3, 0x04, 0x21, 0xf3, 0x26, 0x62,
  0xac, 0xa2, 0x8b, 0x67, 0xdf, 0x65, 0x82, 0x96, 0xa8, 0xe0, 0x8a, 0x02,
  0x09, 0x9b, 0xd0, 0xe9, 0xba, 0xa4, 0x68, 0x42, 0x5c, 0x00, 0x47, 0x13,
  0xe9, 0x1a, 0xec, 0x9e, 0xb7, 0x8d, 0x69, 0x35, 0xd9, 0xcf, 0xcb, 0xfe,
  0x8b, 0xfd, 0xfe, 0x0e, 0x02, 0x4f, 0x5c, 0xcc, 0x30, 0x8a, 0x26, 0x8a,
  0x05, 0x39, 0x97, 0xe9, 0x03, 0x82, 0xb2, 0x43, 0x29, 0x78, 0x76, 0xaf,
  0x64, 0xc4, 0x90, 0x2d, 0xa5, 0xf5, 0xb0, 0x2a, 0xc9, 0x14, 0x9a, 0x40,
  0xba, 0xe2, 0x0a, 0x32, 0x33, 0x02, 0x9b, 0xc0, 0x67, 0x0e, 0x24, 0x0b,
  0x4d, 0xf2, 0xb2, 0x9a, 0xbc, 0xf6, 0xd4, 0xf4, 0x8d, 0x1b, 0x1c, 0x5f,

  0x0a, 0x80, 0x80, 0x85, 0x3a, 0x20, 0x76, 0xae, 0xad, 0x9f, 0xb7, 0xfa,
  0x5b, 0xd1, 0xe0, 0xfd, 0xd7, 0x82, 0x32, 0xf9, 0xf5, 0x20, 0xa0, 0x09,
  0x90, 0x3e, 0xaf, 0xaf, 0xd7, 0xc2, 0x59, 0xb8, 0x38, 0x98, 0xdd, 0x9f,
  0xf1, 0x4f, 0x4d, 0x02, 0xc7, 0xbf, 0x3b, 0x2b, 0x8e, 0x3c, 0x27, 0x9f,
  0x6e, 0x69, 0xd7, 0x41, 0x22, 0x80, 0xfb, 0x5a, 0x26, 0xe1, 0x25, 0xf7,
  0x57, 0xa3, 0x99, 0xed, 0x78, 0x17, 0xed, 0xc9, 0x2b, 0x66, 0x9d, 0xdd,
  0x4f, 0x5d, 0x32, 0xd1, 0x94, 0x54, 0x3a, 0x34, 0x65, 0xda, 0x65, 0xed,
  0x0e, 0x24, 0x58, 0x01, 0xc5, 0xc9, 0xa0, 0xc9, 0x84, 0x54, 0x43, 0x2a,
  0x4b, 0xec, 0xd2, 0x2f, 0x29, 0xa2, 0x69, 0x52, 0xd6, 0xc2, 0xd0, 0x56,
  0x74, 0x4c, 0x54, 0x31, 0xe6, 0x68, 0xdb, 0x06, 0x0a, 0x6f, 0x0d, 0x36,

  0x16, 0x7b, 0x28, 0x49, 0x6d, 0xec, 0xec, 0x91, 0xa0, 0xdf, 0xd3, 0x07,
  0xbe, 0xdb, 0x7f, 0x4f, 0x8a, 0xdc, 0x0f, 0xaf, 0x93, 0xf2, 0xa0, 0x80,
  0x64, 0xa0, 0x72, 0x1f, 0x29, 0x62, 0x8a, 0xfd, 0x21, 0x7e, 0xd5, 0xbb,
  0x73, 0x7f, 0xa6, 0xf6, 0xbd, 0x0c, 0x30, 0xcc, 0x4a, 0x85, 0x20, 0x66,
  0x10, 0xf8, 0x5f, 0xaa, 0x21, 0x51, 0x87, 0x07, 0xcc, 0xb0, 0x8e, 0xf2,
  0x91, 0x4b, 0x30, 0x3d, 0x13, 0x93, 0xd4, 0xbf, 0x31, 0x9a, 0x32, 0x36,
  0xeb, 0xdf, 0x84, 0xd7, 0xb0, 0x55, 0x96, 0x05, 0x4d, 0x13, 0x7d, 0xce,
  0xe7, 0xe9, 0xbd, 0x28, 0x7a, 0x93, 0x64, 0x8f, 0xca, 0xd3, 0x6d, 0xe6,
  0x1a, 0x41, 0x9f, 0xdc, 0xb1, 0x4f, 0xdc, 0x56, 0xe7, 0x6b, 0x3e, 0xae,
  0x99, 0xa2, 0x3f, 0xa5, 0xfa, 0x9c, 0x43, 0x9c, 0xeb, 0xb5, 0xd9, 0x06,
  0xc9, 0x98, 0x72, 0xf7, 0x62, 0x9d, 0x00, 0x36, 0x34, 0xa8, 0x4b, 0xdf,
  0xd3, 0x11, 0x57, 0x6e, 0xc3, 0x06, 0xc5, 0x35, 0xc9, 0xa4, 0x2b, 0x97,
  0xc3, 0xbf, 0x32, 0x52, 0x7b, 0x84, 0xae, 0x85, 0x42, 0xb6, 0x41, 0xf2,
  0x1c, 0xe1, 0x54, 0xe1, 0x01, 0x0e, 0x5b, 0x01, 0x77, 0xc8, 0x42, 0xc3,
  0x51, 0xb0, 0x59, 0x21, 0xd2, 0xeb, 0x24, 0x46, 0x53, 0x0a, 0xd6, 0xb6,
  0x25, 0x2d, 0x2a, 0x83, 0xde, 0x9f, 0xde, 0x04, 0x79, 0x2a, 0xa7, 0xcf,
  0x35, 0x84, 0x2f, 0xef, 0x25, 0xe7, 0x6c, 0x9a, 0x0c, 0x62, 0x7c, 0xbc,
  0x75, 0x2c, 0xe5, 0xd4, 0x65, 0xf7, 0xcf, 0xf8, 0x87, 0xbf, 0x86, 0x1a,
  0xc9, 0xe2, 0x36, 0x2b, 0x23, 0xc1, 0xc7, 0x89, 0x2d, 0xd1, 0xeb, 0x6d,
  0x1f, 0x78, 0x6d, 0xc5, 0xc0, 0xea, 0xb1, 0x89, 0x8b, 0x3d, 0xe7, 0x03,
  0x1f, 0x32, 0x05, 0xa4, 0x53, 0xea, 0x5e, 0x18, 0x84, 0xfc, 0xfb, 0xb8,
  0xc8, 0xa8, 0x42, 0xc0, 0x35, 0x84, 0x10, 0xc7, 0x64, 0x21, 0xdd, 0x33,

  0xe2, 0x09, 0x26, 0x57, 0x17, 0x89, 0x05, 0xf4, 0xc5, 0x93, 0x64, 0xb8,
  0x22, 0x41, 0x08, 0xd7, 0x54, 0xdf, 0x45, 0x5e, 0x31, 0x56, 0x39, 0x66,
  0x63, 0xa3, 0xa6, 0x53, 0xa0, 0x8f, 0xd0, 0xd9, 0x64, 0x55, 0x92, 0x71,
  0x34, 0x73, 0xf8, 0x38, 0xd2, 0x72, 0x81, 0xd1, 0x42, 0x49, 0x93, 0xe3,
  0xc8, 0xab, 0xc3, 0xc1, 0xe4, 0x73, 0x9c, 0x4f, 0x47, 0x2e, 0x27, 0x1b,
  0xdc, 0x8b, 0xef, 0xf2, 0x74, 0x8c, 0xbc, 0x47, 0x87, 0x23, 0xf5, 0xcd,
  0x52, 0xc9, 0x75, 0xb8, 0xdb, 0x86, 0xcd, 0x63, 0x12, 0xfb, 0xca, 0xa6,
  0x79, 0xc7, 0x65, 0xad, 0x7a, 0x2b, 0xad, 0x25, 0x7c, 0x53, 0xc2, 0x0b,
  0x85, 0xab, 0x33, 0x0c, 0x33, 0x65, 0x1c, 0xbb, 0x12, 0xe3, 0x53, 0xd9,
  0x2d, 0xce, 0x90, 0x52, 0x10, 0x33, 0xb4, 0x7a, 0x46, 0x06, 0x49, 0xaa,
  0x09, 0x48, 0x5e, 0x6f, 0x51, 0x6e, 0x74, 0x01, 0x93, 0x96, 0x6b, 0xd5,
  0xdc, 0xfe, 0x13, 0x32, 0xe2, 0xe1, 0x51, 0x13, 0x01, 0x57, 0xaa, 0x60,
  0x0b, 0xaa, 0xcc, 0x86, 0x8d, 0x4e, 0x2b, 0x3a, 0xb0, 0x46, 0x1e, 0xb2,
  0xe6, 0xe7, 0x8a, 0xbf, 0x66, 0x3e, 0x5f, 0xfa, 0x0d, 0x10, 0x25, 0x5a,
  0x27, 0x95, 0xd6, 0x95, 0xed, 0x6c, 0x45, 0x0a, 0x90, 0x38, 0x6a, 0xb8,
  0x49, 0x83, 0xd3, 0xb7, 0x02, 0xd3, 0xbd, 0x31, 0x7e, 0x17, 0xf6, 0x23,
  0x6e, 0x1a, 0x64, 0x1e, 0x20, 0x98, 0x6c, 0xdc, 0x03, 0x26, 0xb0, 0x58,
  0xe1, 0x87, 0xb3, 0xae, 0xaa, 0x5a, 0x06, 0xb3, 0x0b, 0x05, 0xc2, 0x3f,


  0xe1, 0x44, 0x49, 0xd9, 0x3b, 0xbf, 0x02, 0x00, 0x34, 0x8d, 0xdd, 0xd0,
  0x4e, 0x86, 0x32, 0x31, 0x9b, 0x72, 0x16, 0x17, 0xd5, 0xda, 0xb9, 0x81,
  0x77, 0x90, 0x36, 0x50, 0x37, 0xac, 0x2d, 0x6d, 0x8d, 0xf7, 0x4e, 0xb6,
  0xed, 0x03, 0xd7, 0xc7, 0xd1, 0x88, 0x54, 0xf6, 0x9c, 0x49, 0xee, 0xbb,
  0xf3, 0x25, 0x36, 0xe5, 0xbc, 0x7d, 0x24, 0xac, 0x2c, 0x69, 0x02, 0x20,
  0x4f, 0x52, 0x38, 0xc8, 0xe5, 0x76, 0xe1, 0xd3, 0x0e, 0xf8, 0x82, 0x88,
  0x4f, 0xd2, 0x87, 0x70, 0x62, 0xe9, 0x4a, 0x14, 0x8a, 0x96, 0xc3, 0x08,
  0x01, 0xb0, 0x8c, 0x1b, 0x69, 0xc5, 0xfa, 0xf3, 0x51, 0x8c, 0x81, 0xdb,
  0x70, 0x32, 0xe3, 0x40, 0xee, 0x5b, 0x4f, 0x9f, 0x42, 0x3e, 0xad, 0x99,
  0xa4, 0x8e, 0x73, 0x90, 0x1b, 0x49, 0x3d, 0x54, 0xcf, 0x48, 0xf0, 0x1d,
  0xc5, 0x14, 0xaf, 0xd7, 0xb6, 0xdd, 0x32, 0xae, 0xfd, 0xa7, 0xfb, 0xdb,
  0x87, 0x6e, 0x88, 0x49, 0xe3, 0x59, 0xb5, 0x7b, 0x59, 0xea, 0x9f, 0x39,
  0x84, 0x1b, 0xbd, 0x6a, 0x51, 0xf4, 0xd0, 0xaf, 0x59, 0x94, 0xb7, 0x2a,
  0x5a, 0x06, 0xed, 0xb7, 0x77, 0x26, 0xfc, 0x99, 0x15, 0xb1, 0xaa, 0x96,
  0x25, 0xc0, 0x88, 0x2b, 0x5a, 0x09, 0x3b, 0xcb, 0x30, 0x0f, 0xfe, 0xd2,
  0x95, 0x3c, 0xbd, 0x8d, 0x44, 0x1a, 0xf8, 0xdf, 0x1f, 0x0f, 0xc8, 0x0d,
  0x38, 0xfe, 0xb9, 0x75, 0x1e, 0x27, 0x5d, 0x99, 0xcb, 0x27, 0x98, 0x46,
  0xba, 0xb8, 0x41, 0xdd, 0xf2, 0x30, 0x54, 0x3a, 0xe5, 0x6c, 0x84, 0x3c,
  0xf6, 0xdb, 0x7f, 0xbf, 0x98, 0x59, 0x90, 0xa2, 0x15, 0xdf, 0x97, 0xc7,
  0x7e, 0xf3, 0xef, 0xf3, 0xdd, 0x7d, 0xd2, 0xed, 0x43, 0x8c, 0xea, 0x8d,
  0xe4, 0xa7, 0x07, 0x78, 0xe2, 0xaf, 0x66, 0x8a, 0x92, 0xf3, 0xee, 0x73,
  0x45, 0xf9, 0x58, 0xb0, 0x93, 0x86, 0xb0, 0x45, 0xe2, 0x8a, 0xbf, 0x09,
  0x07, 0x23, 0xd6, 0xec, 0x6f, 0x8e, 0xb4, 0xb6, 0x39, 0xe4, 0x3f, 0x37,
  0xbf, 0x0a, 0x9d, 0x91, 0x96, 0xd2, 0xa0, 0x14, 0xd4, 0x5e, 0x38, 0xd4,
  0x5c, 0x85, 0xa1, 0x1f, 0x44, 0xe3, 0x35, 0x8d, 0x41, 0x70, 0xb3, 0x4c,

  0x0f, 0x25, 0x7c, 0x35, 0xd4, 0x81, 0x47, 0x76, 0x08, 0xd3, 0x80, 0xd1,
  0xbe, 0xd3, 0x30, 0x85, 0xcd, 0x19, 0x42, 0xc5, 0x23, 0x71, 0xbe, 0x58,
  0xb6, 0x35, 0x53, 0x6b, 0xb6, 0x31, 0xb5, 0x20, 0xb4, 0xef, 0xba, 0xd2,
  0x00, 0x07, 0x46, 0x43, 0xaa, 0x92, 0x34, 0x58, 0x09, 0x7e, 0xc8, 0x71,
  0xfa, 0x50, 0x3d, 0x5c, 0xaf, 0xc1, 0xa0, 0x1b, 0x94, 0xf3, 0x8b, 0x2b,
  0x3c, 0xbe, 0x38, 0x3f, 0x3f, 0x39, 0x6e, 0x06, 0x0b, 0x4d, 0x4d, 0x89,

  0x55, 0xf5, 0xbd, 0xfe, 0x8b, 0xf4, 0x79, 0xc2, 0xd6, 0x97, 0x68, 0x11,
  0x7f, 0x9f, 0x5a, 0x33, 0xc5, 0x02, 0xb3, 0xcb, 0xbf, 0x94, 0x02, 0x2b,
  0x86, 0x60, 0x15, 0x0a, 0x08, 0x54, 0xeb, 0x79, 0xf4, 0xe0, 0x96, 0xff,
  0x93, 0x33, 0x0d, 0x71, 0x3f, 0xb4, 0xc6, 0x93, 0x4c, 0x58, 0x99, 0x05,
  0x65, 0xcc, 0x8f, 0xc7, 0x9b, 0x92, 0x90, 0xae, 0xdf, 0x6e, 0xa3, 0x65,
  0x46, 0x6d, 0xc3, 0xb2, 0x9f, 0x5e, 0x3e, 0xe1, 0x56, 0xb0, 0xf3, 0xb8,
  0xb8, 0xc5, 0x70, 0xb6, 0x53, 0x00, 0x44, 0x05, 0xa0, 0x04, 0x20, 0x3d,
  0x1e, 0x87, 0x70, 0x05, 0xc8, 0xeb, 0xae, 0x15, 0x0f, 0xe4, 0xd5, 0xe3,
  0xc9, 0x48, 0xfb, 0xc4, 0x03, 0xad, 0xcc, 0xc4, 0xd7, 0xb3, 0xe4, 0x1e,

  0x3f, 0xc3, 0x60, 0x2a, 0x08, 0x0e, 0xe0, 0xf7, 0x63, 0x60, 0x0c, 0x70,
  0x8e, 0x2a, 0x3c, 0x0a, 0x2e, 0x01, 0x1e, 0xd5, 0x9c, 0x3b, 0x1e, 0x10,
  0xa8, 0x32, 0xb6, 0x10, 0xe3, 0xaa, 0x1e, 0x6f, 0xaf, 0xde, 0x09, 0x30,
  0x62, 0x23, 0xa0, 0xe6, 0xb5, 0x6c, 0x92, 0x92, 0x27, 0x03, 0x96, 0x48,
  0x65, 0x97, 0x6d, 0xd8, 0x32, 0xbc, 0xd3, 0x74, 0x0c, 0x68, 0xad, 0x94,
  0xb5, 0x21, 0xf4, 0x74, 0xe3, 0x96, 0xc8, 0xdf, 0x00, 0x81, 0xce, 0xe9,
  0xae, 0xe0, 0x27, 0x80, 0x89, 0xed, 0x37, 0x41, 0x7b, 0x09, 0xcf, 0x8a,
  0x9c, 0xa4, 0x08, 0x64, 0x37, 0xa5, 0xd2, 0x05, 0x7c, 0x98, 0x2e, 0xab,
  0xa7, 0xe6, 0x22, 0x43, 0xa5, 0xc2, 0x3e, 0xa9, 0x46, 0x95, 0x4e, 0xe4,
  0x63, 0x4c, 0x67, 0xd3, 0xbd, 0x57, 0x60, 0x1a, 0x8e, 0x42, 0xc8, 0x05,
  0x86, 0x3f, 0x17, 0xcb, 0xca, 0x0b, 0x24, 0x22, 0x44, 0x17, 0xa3, 0x33,
  0x7c, 0xd5, 0xf3, 0xdb, 0x59, 0xc5, 0x63, 0xf7, 0x4c, 0x89, 0x81, 0x93,

  0xd9, 0x5f, 0x56, 0x70, 0xff, 0x9f, 0x80, 0x50, 0x24, 0x08, 0x5d, 0xd3,
  0xd2, 0xa3, 0x6e, 0xd5, 0xd0, 0x8e, 0x59, 0x52, 0xdd, 0x24, 0xbf, 0x42,
  0x93, 0x16, 0xcc, 0x2b, 0xca, 0x22, 0x56, 0x21, 0xb1, 0x10, 0x4c, 0x64,
  0x83, 0xfb, 0x81, 0x95, 0x83, 0x8e, 0xad, 0xa4, 0x4d, 0x28, 0xdd, 0x72,

  0x87, 0x2d, 0x7e, 0xe8, 0xb7, 0x97, 0x4c, 0xa6, 0x9b, 0xf9, 0x13, 0x3a,
  0x8a, 0x79, 0xee, 0x53, 0xcc, 0x20, 0x3a, 0x84, 0xff, 0xac, 0xfc, 0xf6,
  0xf3, 0x3f, 0xeb, 0xe1, 0x15, 0x3e, 0x4f, 0xea, 0x5a, 0x2c, 0x4e, 0x0b,
  0xc6, 0xe9, 0x15, 0x9a, 0xde, 0xfb, 0x65, 0x78, 0x35, 0x89, 0xbc, 0x52,
  0x06, 0xdb, 0x3a, 0x34, 0x57, 0x0c, 0x07, 0x02, 0xf6, 0x21, 0x5c, 0x50,
  0x09, 0x41, 0x3d, 0x4f, 0x24, 0x3f, 0x29, 0x82, 0x6b, 0x65, 0xbc, 0xcd,
  0x3c, 0x2b, 0x53, 0xc6, 0xf7, 0xcc, 0x8d, 0x0b, 0x14, 0xae, 0x46, 0xff,
  0xa2, 0xba, 0x42, 0xb5, 0x83, 0x35, 0x65, 0x85, 0xbe, 0x52, 0xdb, 0x84,
  0xe7, 0x48, 0x25, 0x6f, 0x4b, 0x9a, 0xb5, 0x80, 0xb5, 0x8d, 0xf2, 0x77,
  0x61, 0x55, 0xd6, 0xbb, 0x25, 0x4f, 0x7a, 0xea, 0x37, 0xbf, 0x16, 0xcf,

  0x4f, 0xd9, 0xae, 0x1f, 0xcc, 0xca, 0x7c, 0x6d, 0xce, 0x07, 0xe6, 0x2c,
  0xeb, 0xf6, 0x94, 0xed, 0x66, 0xce, 0xb6, 0xe3, 0x95, 0x08, 0x24, 0x6d,
  0xd3, 0x68, 0xff, 0x17, 0xa6, 0x6c, 0xbb, 0x19, 0xdb, 0x31, 0xe5, 0x6b,
  0x07, 0xd2, 0xb5, 0x65, 0xa3, 0x25, 0x5f, 0x93, 0x33, 0xb6, 0x57, 0xa6,
  0x6c, 0xbb, 0x39, 0xdb, 0xab, 0x92, 0xb6, 0xa9, 0x28, 0x7d, 0x45, 0xca,
  0xf6, 0xaf, 0xcb, 0xd8, 0x6e, 0x4b, 0xd9, 0xfe, 0xe5, 0x39, 0xdb, 0xbf,
  0x6d, 0xca, 0xf6, 0x6f, 0x99, 0x8d, 0x4c, 0xb7, 0x07, 0x4f, 0x24, 0x1d,
  0x49, 0x69, 0xd3, 0x61, 0x2b, 0x2c, 0xad, 0x16, 0xfc, 0xd5, 0x12, 0x58,
  0x9c, 0x30, 0xb3, 0x0c, 0xc3, 0x1a, 0x8d, 0xa3, 0xb8, 0xfb, 0x75, 0x43,
  0x42, 0x2b, 0x81, 0x0c, 0x38, 0x37, 0x0e, 0xbc, 0x1b, 0xba, 0xe9, 0x65,

  0x39, 0xeb, 0xd1, 0x0c, 0xb0, 0xe6, 0xd8, 0xb3, 0x12, 0x2d, 0x9f, 0x69,
  0x3c, 0xf7, 0xdb, 0xb3, 0x9c, 0x6a, 0x56, 0x6e, 0xef, 0x5a, 0x5b, 0x5d,
  0xfe, 0xb2, 0xc4, 0x7a, 0xd8, 0x90, 0xdd, 0x2e, 0x05, 0x23, 0x03, 0xe1,
  0x32, 0x8a, 0x72, 0xc2, 0xaf, 0x91, 0x97, 0x34, 0x31, 0x7d, 0xf9, 0x4c,
  0x48, 0xc2, 0xb4, 0xd9, 0xf5, 0x8a, 0x61, 0xa8, 0x00, 0xde, 0x5d, 0x07,
  0xc9, 0x10, 0x2c, 0x7b, 0x51, 0xa6, 0x5d, 0xd2, 0x2d, 0xdc, 0xee, 0xef,
  0x72, 0x85, 0xb4, 0x86, 0x74, 0x64, 0x9e, 0x1e, 0xaa, 0x11, 0x7d, 0x9f,
  0x41, 0xa5, 0x6d, 0x0e, 0x1a, 0xf7, 0xbd, 0xd2, 0x77, 0xfa, 0xd1, 0x15,
  0xaa, 0x8f, 0xa0, 0xac, 0xc3, 0x8c, 0x64, 0x70, 0xf9, 0x5d, 0x68, 0xb8,
  0x3a, 0x90, 0x29, 0xd0, 0xcf, 0x87, 0xab, 0x33, 0x3f, 0x3e, 0x4d, 0xd1,
  0x83, 0x83, 0xcd, 0x4d, 0xca, 0x90, 0xba, 0x89, 0x1f, 0x1e, 0xfa, 0x65,
  0xb2, 0x39, 0xce, 0x47, 0xe5, 0x26, 0x9e, 0xa0, 0x7e, 0xf9, 0xa6, 0x9a,
  0xcf, 0x56, 0x65, 0x3d, 0xa4, 0xa5, 0x16, 0xe5, 0x2a, 0x6c, 0xab, 0xcd,
  0xbc, 0x64, 0x6b, 0x2b, 0x75, 0xe1, 0xca, 0x89, 0xef, 0x37, 0x86, 0x93,
  0xaa, 0x02, 0x58, 0x14, 0xfc, 0x1f, 0xf5, 0xed, 0xc0, 0xa0, 0x52, 0xa0,
  0x70, 0xd9, 0xed, 0x6d, 0xea, 0xd4, 0x10, 0xf8, 0x07, 0xc4, 0x76, 0x00,
  0xc2, 0x92, 0x26, 0x15, 0xb1, 0xb0, 0xfa, 0x9e, 0xe9, 0xa6, 0xd7, 0x9a,
  0x8a, 0x1a, 0xf2, 0xf2, 0x5b, 0x7f, 0x11, 0x9d, 0xb5, 0xf4, 0x19, 0xfd,
  0xcd, 0x59, 0x02, 0x50, 0x37, 0x4a, 0xf9, 0xe7, 0x28, 0xbb, 0xee, 0xa3,
  0x9f, 0xe2, 0x96, 0x99, 0x84, 0xbc, 0x43, 0xce, 0xb6, 0x5b, 0x39, 0x13,
  0xf3, 0xf0, 0xa7, 0x98, 0x09, 0x15, 0xe9, 0x07, 0xf9, 0x63, 0x6d, 0x0e,
  0xf4, 0xd8, 0xa7, 0xf8, 0xfe, 0xdd, 0x76, 0xdb, 0x67, 0xa9, 0x91, 0x28,
  0x3d, 0xf1, 0x1b, 0x7e, 0xf8, 0x83, 0x71, 0x56, 0x31, 0xa6, 0xc1, 0x21,
  0xfe, 0xf7, 0x40, 0x77, 0x78, 0x65, 0x87, 0xb2, 0x16, 0xf8, 0x77, 0xa7,
  0x3b, 0xba, 0x38, 0xc1, 0x56, 0x82, 0x86, 0xb4, 0xa1, 0x82, 0x30, 0x26,
  0x94, 0x00, 0x43, 0x13, 0x5e, 0x7f, 0x4f, 0x51, 0xe5, 0x18, 0x41, 0x85,
  0x21, 0x6d, 0x18, 0xa0, 0x44, 0x11, 0x96, 0xc0, 0x50, 0x08, 0x8b, 0x21,
  0xaa, 0xe5, 0x66, 0x9d, 0xb9, 0xa1, 0x98, 0x57, 0xea, 0x32, 0xa2, 0x8b,
  0xec, 0xb6, 0x8e, 0x29, 0x93, 0x99, 0x9f, 0xd6, 0xf2, 0x14, 0xee, 0x3d,
  0xf1, 0x6c, 0x17, 0x89, 0x68, 0x68, 0xfc, 0x68, 0xc4, 0x57, 0x9a, 0x4c,
  0x54, 0x31, 0x51, 0x67, 0x16, 0xbc, 0xc2, 0x5c, 0xf1, 0x83, 0xa8, 0xd3,

  0xfb, 0x10, 0x1d, 0x74, 0xbc, 0x2d, 0xba, 0xc8, 0xa4, 0x6f, 0x08, 0x79,
  0xbc, 0x0a, 0x2a, 0x84, 0xa7, 0x56, 0x44, 0xae, 0x66, 0x72, 0x83, 0x80,
  0x45, 0xd6, 0x9c, 0x30, 0x98, 0xfb, 0x53, 0x2f, 0x08, 0x37, 0xd7, 0x1e,
  0x93, 0xa6, 0x47, 0x0e, 0x0a, 0x12, 0x74, 0xda, 0x58, 0x00, 0x6d, 0xd2,
  0x9e, 0x18, 0xff, 0x1f, 0x59, 0x2b, 0x06, 0x13, 0x31, 0x98, 0x89, 0x35,
  0xdf, 0x3e, 0x60, 0x9d, 0xf4, 0x97, 0x96, 0x52, 0xba, 0x45, 0x5e, 0x96,
  0xe9, 0x10, 0x38, 0xf5, 0x54, 0x58, 0x64, 0x99, 0x70, 0x3e, 0x15, 0xb7,
  0xea, 0xc4, 0xdd, 0x34, 0x00, 0x00, 0xa5, 0x0f, 0xad, 0xc5, 0x2b, 0x15,
  0xd0, 0x01, 0x71, 0x2e, 0xc1, 0xec, 0x98, 0xb1, 0xdd, 0xa5, 0x38, 0x34,
  0x53, 0x5b, 0x1c, 0x0d, 0x8b, 0x34, 0x99, 0x60, 0xaa, 0x23, 0xe3, 0x49,
  0xb1, 0xe2, 0xd5, 0x64, 0xb2, 0x33, 0x04, 0xe6, 0xc0, 0x24, 0x1d, 0xcc,
  0xb4, 0x2d, 0x11, 0xb8, 0x90, 0xd2, 0xaf, 0x29, 0xf7, 0xd1, 0xe6, 0x76,
  0x17, 0x09, 0x66, 0x0e, 0xdc, 0x25, 0x72, 0xac, 0xb1, 0xf6, 0x6f, 0x69,
  0xc9, 0x49, 0x2d, 0x0c, 0xbe, 0x33, 0x55, 0x3b, 0x10, 0x26, 0x90, 0xc1,
  0x27, 0xc1, 0x2f, 0x46, 0xda, 0xaa, 0x3d, 0xae, 0x95, 0xee, 0xf7, 0x3f,
  0x19, 0x8f, 0x77, 0xbc, 0xd0, 0xbf, 0xa0, 0x0e, 0xa0, 0xde, 0x2e, 0x6a,
  0x55, 0x56, 0xbc, 0x93, 0x19, 0xed, 0xa1, 0xa9, 0x84, 0xd3, 0xe1, 0x27,
  0x08, 0xac, 0x1e, 0x9d, 0x37, 0xb5, 0x9c, 0x40, 0x62, 0x39, 0x26, 0xd0,


  0x71, 0xbe, 0x9a, 0x59, 0x5d, 0x45, 0xd8, 0x02, 0x04, 0xd4, 0xe2, 0x06,
  0x86, 0x3f, 0x78, 0x22, 0xde, 0xa6, 0xcb, 0xb7, 0x27, 0xc8, 0x3b, 0xf9,
  0xf1, 0x54, 0x10, 0xc2, 0x3e, 0xf2, 0x18, 0x67, 0xe0, 0xcb, 0x64, 0xc4,
  0xa1, 0xe6, 0xdc, 0x78, 0x4d, 0x8d, 0x77, 0x33, 0xe3, 0x41, 0xe7, 0x73,
  0x62, 0xf5, 0x16, 0x39, 0x12, 0x1d, 0xac, 0xe1, 0x28, 0x31, 0xdd, 0x50,
  0xea, 0x21, 0xf0, 0xd2, 0xeb, 0x04, 0xe8, 0xf2, 0x72, 0x1d, 0xea, 0x2e,
  0x8d, 0x8d, 0x02, 0x65, 0x3f, 0xc4, 0xfb, 0x29, 0x10, 0xc2, 0x71, 0x6b,
  0x6d, 0x08, 0x72, 0x7b, 0x46, 0xdc, 0x09, 0x54, 0x76, 0x9e, 0x0f, 0x06,
  0x7e, 0x8a, 0x7c, 0x06, 0xc6, 0x49, 0x3e, 0xcd, 0xd2, 0xbf, 0x27, 0x63,
  0x09, 0x5a, 0x36, 0xd3, 0x5b, 0x6b, 0x45, 0x0a, 0x91, 0x13, 0x90, 0xc7,
  0x44, 0x09, 0x9f, 0xbf, 0x31, 0x12, 0x1c, 0x4a, 0x1d, 0x4c, 0x07, 0x43,
  0x00, 0x2b, 0x93, 0x09, 0x88, 0x41, 0x06, 0x6e, 0xc2, 0x23, 0xb6, 0x98,
  0xc9, 0x9d, 0xe5, 0x0f, 0x7b, 0x87, 0xab, 0x54, 0x21, 0xd8, 0x33, 0x2d,
  0x08, 0x4f, 0x49, 0xf4, 0x2b, 0x8a, 0x0a, 0xa8, 0xb9, 0xde, 0x2f, 0x2f,
  0x29, 0x08, 0xa3, 0x2f, 0x25, 0x0f, 0xcc, 0x40, 0x5b, 0xf0, 0xed, 0x34,
  0x27, 0xbb, 0x4c, 0x42, 0xe2, 0x45, 0xf7, 0x98, 0x05, 0xe9, 0xb3, 0x50,
  0xee, 0x54, 0xf9, 0x8c, 0xfd, 0xbb, 0xd5, 0x44, 0xb8, 0x33, 0x81, 0x8e,
  0x67, 0x40, 0xdb, 0xa1, 0x1b, 0x5f, 0x81, 0xc9, 0xc5, 0x9f, 0x4e, 0xed,
  0x3a, 0x18, 0x7f, 0x21, 0x61, 0x3c, 0x3a, 0x53, 0x09, 0x24, 0x36, 0x4a,
  0xaa, 0xf8, 0x9f, 0x1e, 0x1e, 0x5a, 0x2c, 0xba, 0x3b, 0xb9, 0x97, 0xa5,
  0x1a, 0x4c, 0xda, 0x46, 0xe3, 0x00, 0x7d, 0x04, 0x60, 0xc3, 0xba, 0x2a,
  0x75, 0xdd, 0xc3, 0xaf, 0xb1, 0x52, 0x4b, 0xa9, 0xa2, 0x49, 0x5a, 0x16,
  0x24, 0xde, 0x4c, 0x91, 0x53, 0x44, 0xc4, 0xc7, 0x6f, 0x9a, 0x9f, 0xd5,
  0xa5, 0x18, 0x43, 0x90, 0x7a, 0xa4, 0x25, 0xc8, 0x34, 0xa4, 0x05, 0x2c,
  0xc1, 0x26, 0x43, 0xf0, 0x58, 0x2e, 0x2b, 0x32, 0xb4, 0xd2, 0x45, 0xee,
  0xc3, 0x2c, 0x57, 0x3c, 0x75, 0xbd, 0x85, 0x72, 0xd9, 0xe6, 0x62, 0x1f,
  0x65, 0x90, 0x16, 0x5d, 0xfe, 0x13, 0x54, 0xa2, 0xfc, 0xaa, 0x52, 0x94,
  0x4f, 0x5b, 0x89, 0x62, 0x25, 0x05, 0x4a, 0x1d, 0x5f, 0x4e, 0x50, 0x94,

  0x10, 0x5d, 0x32, 0x9c, 0x06, 0x75, 0x1f, 0x9b, 0xee, 0x25, 0xfc, 0x5a,
  0x63, 0xb8, 0xf0, 0x65, 0xea, 0x46, 0xb5, 0x2c, 0xd9, 0xc4, 0xe3, 0x91,

  0xeb, 0xc2, 0x35, 0x42, 0xcd, 0xf9, 0x68, 0x06, 0x58, 0x32, 0x3e, 0x4e,
  0x04, 0x9f, 0xeb, 0xcf, 0xb6, 0x7b, 0xc8, 0xa7, 0x36, 0xc0, 0xb6, 0x81,
  0x37, 0x1f, 0x3a, 0xf2, 0xf8, 0xcb, 0x27, 0x05, 0x32, 0xdd, 0x33, 0x7c,
  0xcd, 0x02, 0x60, 0x3a, 0xfc, 0xce, 0x74, 0x36, 0xe5, 0x1e, 0x6d, 0x55,
  0xf8, 0xc2, 0x50, 0xb3, 0x52, 0x46, 0x3a, 0x14, 0xf6, 0x86, 0x99, 0x71,
  0xf8, 0x7e, 0x0b, 0x83, 0x4b, 0x34, 0xee, 0xaa, 0x26, 0x31, 0x70, 0xf4,
  0x61, 0x52, 0xdd, 0xa3, 0x16, 0x47, 0xfb, 0xa1, 0x1b, 0xe9, 0x70, 0x01,
  0xd9, 0xa2, 0xd6, 0x7c, 0x97, 0x2e, 0xa7, 0xc1, 0x21, 0x43, 0x61, 0x0c,
  0x5f, 0xe3, 0x17, 0xd1, 0x98, 0xae, 0x77, 0xfb, 0x82, 0xed, 0x80, 0x6c,
  0x88, 0xba, 0xb6, 0x37, 0x9a, 0x8b, 0x5b, 0xab, 0x18, 0xd2, 0xb4, 0x25,
  0x79, 0xd0, 0xf5, 0xf1, 0x9b, 0x6b, 0x2c, 0xd7, 0x36, 0x08, 0x58, 0x81,
  0x81, 0x31, 0x7a, 0x57, 0xe6, 0xa3, 0xe7, 0xef, 0xa8, 0x5a, 0x5d, 0x3f,
  0x66, 0x89, 0x71, 0xb9, 0x50, 0x68, 0xb8, 0x8d, 0xc9, 0xb0, 0x27, 0x47,
  0x7e, 0x1b, 0x2f, 0xe0, 0x67, 0x18, 0x12, 0x24, 0x3c, 0x59, 0xee, 0x5d,

  0xe7, 0xe5, 0x25, 0x10, 0x01, 0xb8, 0x13, 0x6b, 0x84, 0xc5, 0xe9, 0x7c,
  0x7c, 0xb0, 0x7d, 0x31, 0xce, 0x42, 0x2d, 0x52, 0x4a, 0x41, 0x6e, 0x52,
  0xef, 0x94, 0x06, 0xc9, 0x25, 0xd8, 0xe2, 0x0a, 0x57, 0x41, 0xa4, 0xce,
  0xf8, 0x00, 0x2b, 0x1f, 0xbe, 0xba, 0xb6, 0x48, 0xbf, 0x7b, 0xfa, 0x75,
  0xce, 0x70, 0xdb, 0x54, 0x91, 0xe5, 0xcd, 0x5f, 0xb2, 0xf8, 0xb4, 0x71,



  0x9e, 0x75, 0xf5, 0x98, 0x3e, 0xb8, 0x7e, 0x3f, 0x54, 0x04, 0x7f, 0xd2,
  0x17, 0x04, 0x02, 0x59, 0xc6, 0x37, 0xed, 0x45, 0xdb, 0x22, 0x93, 0xa1,
  0x1c, 0x8e, 0xda, 0xad, 0x95, 0xd8, 0x43, 0x20, 0x36, 0xb7, 0x3e, 0xc0,

  0xba, 0x88, 0xc1, 0xf1, 0xe5, 0x46, 0x74, 0xd9, 0x40, 0x82, 0xa1, 0xa2,
  0x24, 0x14, 0xa6, 0x2e, 0x1f, 0x96, 0x76, 0x6e, 0x8c, 0x71, 0xd9, 0x8e,
  0x1a, 0x92, 0xca, 0x15, 0x33, 0x48, 0xae, 0x14, 0xfa, 0xfd, 0xcd, 0x19,
  0x53, 0x63, 0x2d, 0x47, 0x54, 0xa4, 0xc1, 0xa0, 0x20, 0x62, 0x52, 0xba,
  0xd7, 0x14, 0x2c, 0xe8, 0x1c, 0x4b, 0xed, 0xb8, 0x81, 0x92, 0x38, 0xe5,
  0x15, 0xff, 0x64, 0xe6, 0xa5, 0x3a, 0xd2, 0x46, 0x68, 0xd6, 0xb9, 0x83,
  0x7e, 0x24, 0x9d, 0x0c, 0x4b, 0x96, 0x4a, 0x8d, 0x4e, 0x03, 0xc4, 0xc3,
  0xa6, 0x49, 0xe6, 0x77, 0x2e, 0xa1, 0x8f, 0xa2, 0x20, 0x17, 0x92, 0x1e,
  0xf7, 0x9b, 0xa8, 0xf9, 0x4e, 0xd0, 0x40, 0x26, 0x97, 0xe6, 0x16, 0x6d,
  0xbd, 0x05, 0x61, 0x93, 0x75, 0x3c, 0x6c, 0x64, 0x88, 0x1c, 0x71, 0x8a,
  0x61, 0x9a, 0x8a, 0x24, 0xdc, 0xe2, 0x11, 0x37, 0x03, 0x1e, 0x2b, 0xcb,
  0x9b, 0x1d, 0xe0, 0x1b, 0x3b, 0xfd, 0xcf, 0x19, 0x17, 0xf2, 0x06, 0x84,
  0x75, 0x00, 0x8e, 0x97, 0xd3, 0x47, 0xa4, 0xe5, 0x69, 0x63, 0x3c, 0xd1,
  0xc2, 0xfb, 0x56, 0xf1, 0xef, 0xfd, 0x27, 0x52, 0xda, 0xdf, 0x96, 0x7e,
  0xfc, 0x6e, 0x1d, 0x09, 0x2a, 0x42, 0xb2, 0xda, 0xe0, 0x06, 0x7d, 0x9c,
  0x69, 0x30, 0x4c, 0x2b, 0x02, 0xc6, 0x57, 0x2b, 0xb2, 0x7e, 0x35, 0xa9,
  0x89, 0x55, 0x41, 0x6f, 0x05, 0x6b, 0xe2, 0xfb, 0xd1, 0x7f, 0xe2, 0xa7,
  0xf4, 0x6d, 0x2e, 0xcb, 0xa0, 0x64, 0x88, 0xaf, 0x4f, 0xde, 0x5e, 0x5c,
  0x9d, 0xd4, 0xcb, 0x15, 0x2b, 0xee, 0x95, 0x4e, 0xc1, 0xfe, 0xe6, 0xec,
  0x08, 0xd5, 0x4e, 0x61, 0x10, 0x24, 0x53, 0x21, 0x45, 0xbb, 0x3f, 0xba,
  0xfc, 0xfe, 0x8d, 0x99, 0x1d, 0x6a, 0x09, 0x19, 0x77, 0x5a, 0x92, 0x41,
  0xbb, 0xbc, 0xd3, 0x4d, 0xd1, 0x8e, 0x5a, 0x00, 0x36, 0x94, 0x92, 0x06,
  0xd5, 0x66, 0x7e, 0x94, 0x62, 0xc1, 0x89, 0x31, 0x5a, 0xaa, 0x4f, 0x18,
  0xea, 0x65, 0x89, 0xa5, 0xf7, 0x66, 0x50, 0x4f, 0xef, 0x65, 0xeb, 0x88,
  0x01, 0xa7, 0x38, 0xb5, 0x38, 0x66, 0xf4, 0x38, 0x84, 0x94, 0xeb, 0x47,
  0xfe, 0x87, 0x34, 0x29, 0x84, 0xbe, 0x12, 0x62, 0xd8, 0xd8, 0x3b, 0x9d,
  0x03, 0x21, 0x2c, 0xed, 0xd0, 0xe1, 0x82, 0x44, 0x6b, 0x7a, 0x57, 0x75,
  0x19, 0xe9, 0x4f, 0xc2, 0x3d, 0xee, 0x46, 0x06, 0x22, 0xe4, 0xf0, 0xcd,
  0xf5, 0x12, 0x0b, 0x1d, 0x9c, 0xa9, 0x9a, 0xdf, 0x44, 0x6a, 0x41, 0xaf,
  0xfd, 0x79, 0xcd, 0xd6, 0x84, 0x70, 0x0f, 0xbe, 0x70, 0xcf, 0x4a, 0xdb,
  0xc3, 0x6c, 0xe3, 0xa9, 0xfc, 0x2d, 0x5d, 0x71, 0x5b, 0x3d, 0xb6, 0x84,
  0xee, 0x24, 0xa5, 0x87, 0x5a, 0x89, 0x2e, 0x19, 0xae, 0x94, 0x18, 0x87,
  0x08, 0x53, 0x1d, 0xa5, 0x6b, 0x80, 0xbc, 0x7d, 0xe7, 0x5e, 0xe1, 0xf6,
  0x35, 0x52, 0x86, 0x43, 0x01, 0x33, 0x45, 0xae, 0xa7, 0x50, 0x04, 0x35,
  0x8c, 0x2a, 0x1f, 0xb3, 0x0a, 0x2f, 0x2a, 0xf3, 0x94, 0x51, 0x5e, 0x04,
  0x0b, 0xc0, 0x90, 0x90, 0x2c, 0xe9, 0x96, 0x84, 0x34, 0xf1, 0x6a, 0xff,
  0x15, 0x8a, 0x76, 0xca, 0x50, 0x92, 0xae, 0x5e, 0x82, 0xef, 0x4c, 0xd1,
  0x53, 0xee, 0x24, 0xe8, 0xa1, 0x29, 0xbb, 0x6b, 0xd0, 0x4e, 0xcc, 0xc3,
  0x64, 0xc6, 0x9d, 0xc4, 0x06, 0xce, 0x20, 0x3e, 0x98, 0xd2, 0x8a, 0x03,
  0x43, 0x18, 0x3f, 0x20, 0x9f, 0xb4, 0xbc, 0x8d, 0xd6, 0xff, 0x6d, 0xc3,
  0xb4, 0x5b, 0x27, 0xfa, 0x41, 0xdf, 0x6c, 0x9a, 0x2d, 0x3d, 0xca, 0x47,
  0xe7, 0x5c, 0x5a, 0xdb, 0x54, 0xda, 0x73, 0x5a, 0xdf, 0x30, 0x54, 0x93,
  0x57, 0x56, 0xf9, 0x22, 0xe2, 0xd6, 0x6f, 0x85, 0x17, 0x1c, 0x93, 0xe3,
  0x5a, 0x69, 0xa7, 0xb6, 0x97, 0x2d, 0xf8, 0x12, 0x91, 0x98, 0x10, 0xa1,
  0x62, 0x8b, 0xc3, 0x55, 0xb5, 0xab, 0x7e, 0xf4, 0x21, 0xa3, 0x44, 0x3c,
  0xa1, 0x3b, 0x91, 0x13, 0x69, 0x06, 0xeb, 0x07, 0x9a, 0x06, 0x49, 0x11,
  0x60, 0x42, 0x7f, 0xab, 0x33, 0x1f, 0x61, 0x92, 0x8d, 0x00, 0x29, 0x5d,
  0x5a, 0x61, 0x6b, 0x86, 0x6d, 0x45, 0xd1, 0x5b, 0xbf, 0x47, 0x1e, 0xf7,
  0xf8, 0x42, 0x52, 0x87, 0xe5, 0xd0, 0xd8, 0x18, 0x02, 0x4f, 0x66, 0xb3,
  0x1e, 0x83, 0xa8, 0x23, 0xa8, 0x34, 0x2a, 0xf7, 0x5c, 0x25, 0x4d, 0x09,
  0x6c, 0xae, 0xe1, 0xe3, 0x49, 0x16, 0x2a, 0xf6, 0xee, 0x63, 0x09, 0x90,
  0xc2, 0x8d, 0x48, 0x29, 0x96, 0x06, 0xd6, 0xb0, 0x72, 0xcf, 0x3a, 0x43,
  0x68, 0x73, 0x78, 0x49, 0x6d, 0x5d, 0xad, 0x7c, 0x58, 0xd2, 0xd1, 0xcd,

  0xb4, 0x58, 0x70, 0x67, 0xbd, 0x50, 0xdb, 0x3f, 0x57, 0xeb, 0xe6, 0x47,


  0x95, 0x28, 0xca, 0xa4, 0xe2, 0xc9, 0xf0, 0xbb, 0xa7, 0x6f, 0x6a, 0x2d,

  0xba, 0x71, 0x2b, 0xd0, 0xf4, 0x0b, 0x0f, 0x67, 0x9b, 0x84, 0xe3, 0x7d,
  0xb4, 0x52, 0xc3, 0x0c, 0x65, 0x4d, 0x8c, 0xa1, 0xb6, 0x51, 0xa5, 0xdf,
  0x85, 0x87, 0x93, 0x51, 0x58, 0x55, 0xe5, 0x31, 0x74, 0x60, 0x22, 0x15,
  0xed, 0x21, 0x8f, 0xc4, 0x30, 0x4d, 0x0a, 0xf3, 0x19, 0x3f, 0x49, 0xf2,
  0x66, 0x9e, 0x8f, 0xb1, 0xa6, 0x2b, 0x79, 0x7a, 0x2f, 0xf0, 0x49, 0x7b,
  0xdf, 0xa4, 0x1c, 0xae, 0x34, 0x3d, 0x5f, 0xb9, 0x62, 0x0f, 0xa1, 0xee,

  0xab, 0x52, 0x76, 0x26, 0x3c, 0x9c, 0x5d, 0xaa, 0x76, 0xba, 0x94, 0x37,
  0xdd, 0x25, 0x64, 0x51, 0x3e, 0xaa, 0x9c, 0x15, 0xe0, 0x03, 0xe1, 0xe1,
  0x98, 0xb1, 0x06, 0x56, 0x86, 0x05, 0x52, 0x64, 0x51, 0xae, 0x5e, 0x19,
  0x3f, 0xe8, 0x1d, 0x32, 0xfc, 0x90, 0xd9, 0xb5, 0x77, 0xc2, 0xed, 0x2b,
  0x0b, 0x9d, 0x30, 0xcd, 0xa0, 0x79, 0xc0, 0xda, 0xe1, 0xa8, 0xe0, 0xa3,
  0xec, 0x85, 0x87, 0x33, 0x27, 0x2c, 0x60, 0xd7, 0x2b, 0x0e, 0x58, 0xbe,
  0xe2, 0xed, 0xc2, 0x2c, 0x03, 0xf5, 0x6e, 0x59, 0x8c, 0x92, 0x8f, 0x34,
  0xb7, 0x2a, 0x2e, 0xa6, 0x49, 0xf5, 0x71, 0xf5, 0x86, 0xcc, 0x04, 0x4d,
  0xe1, 0x71, 0x4e, 0xad, 0xaa, 0x0d, 0xb3, 0x10, 0x74, 0xd9, 0x58, 0xd0,
  0x05, 0x40, 0xc1, 0xe3, 0x76, 0xe0, 0x55, 0xfb, 0x86, 0x38, 0xdf, 0x8b,
  0x14, 0x4a, 0x07, 0xc4, 0x65, 0x9a, 0x29, 0x88, 0x8d, 0xf0, 0x18, 0x67,
  0x8a, 0x51, 0x08, 0x79, 0x69, 0x55, 0xb8, 0x6a, 0x7e, 0x8b, 0x25, 0x56,
  0x46, 0x09, 0xf8, 0x18, 0x68, 0x0e, 0xe2, 0xd2, 0x31, 0x3f, 0xae, 0xc7,

  0xcd, 0x6b, 0x92, 0x1a, 0x42, 0xd3, 0xd1, 0xd4, 0x3d, 0xe9, 0xc8, 0x2f,

  0x85, 0x76, 0x04, 0xa2, 0x7e, 0xd0, 0xdc, 0xc8, 0xe6, 0xec, 0x16, 0xf7,
  0x63, 0xe3, 0x88, 0x81, 0xbf, 0xea, 0x77, 0x55, 0xb8, 0x53, 0x6b, 0x68,
  0x6d, 0x1a, 0x8c, 0x09, 0x4c, 0x3c, 0xd8, 0x44, 0x11, 0xb0, 0x5b, 0x3f,
  0x9d, 0x55, 0xbe, 0xfe, 0xe3, 0x7d, 0xbc, 0x48, 0x38, 0xef, 0x95, 0xb6,
  0x57, 0x0e, 0xa3, 0x7d, 0x6b, 0xe4, 0x69, 0x3b, 0x45, 0xe6, 0xee, 0x96,
  0x75, 0x15, 0x81, 0x2d, 0x6a, 0x67, 0x77, 0xf2, 0xd5, 0xc6, 0x75, 0x18,
  0x27, 0xe8, 0x97, 0x15, 0x42, 0xc0, 0x84, 0x2d, 0x1e, 0x48, 0xb9, 0xde,
  0x2a, 0x32, 0x6a, 0xdd, 0xe3, 0x62, 0xfe, 0xc4, 0x15, 0x87, 0x07, 0xec,
  0xaa, 0x18, 0x87, 0xc3, 0xac, 0xca, 0xbb, 0x97, 0x72, 0x89, 0x5b, 0x76,
  0xbe, 0x6d, 0x06, 0x35, 0x1a, 0x5c, 0x35, 0x13, 0x97, 0xfa, 0xdc, 0xc9,


  0xd8, 0xad, 0x05, 0x55, 0xae, 0xa2, 0x8e, 0xc5, 0x3a, 0xb3, 0xf0, 0x70,
  0x86, 0x3c, 0xf5, 0x3d, 0xd9, 0x9e, 0xae, 0xe3, 0xbb, 0xe4, 0x4e, 0x22,
  0x60, 0x36, 0xfa, 0xb4, 0xa1, 0xd7, 0xfb, 0x17, 0xb1, 0x07, 0xb4, 0xcf,
  0x67, 0x99, 0x6b, 0x91, 0xe3, 0x17, 0x41, 0xf2, 0xae, 0x28, 0x65, 0x71,
  0xda, 0x10, 0x98, 0x03, 0xe7, 0x7e, 0xb4, 0x14, 0x77, 0xa5, 0x84, 0x3c,
  0x4a, 0x54, 0xa5, 0x4e, 0x54, 0xa2, 0xa4, 0x12, 0x5c, 0xdc, 0x18, 0x7b,
  0x7c, 0xf8, 0x79, 0xf3, 0xfc, 0x49, 0xce, 0xda, 0x62, 0x18, 0x64, 0x8c,
  0x1c, 0x8a, 0x12, 0xa2, 0xdd, 0x6e, 0xcb, 0x44, 0xac, 0x04, 0x7d, 0x3c,
  0xe2, 0xb6, 0x21, 0x7e, 0x93, 0xdf, 0x46, 0x02, 0x5d, 0xd9, 0x77, 0xdc,

  0x10, 0x0c, 0xb6, 0x9d, 0x4c, 0xc7, 0x6e, 0xcb, 0x6c, 0x67, 0xf9, 0x45,
  0x97, 0xb7, 0x60, 0x0a, 0x8b, 0xa7, 0x3f, 0x82, 0x45, 0x22, 0xa4, 0x12,
  0x93, 0xae, 0x82, 0xa8, 0x07, 0x1b, 0xd1, 0x95, 0x84, 0x36, 0x51, 0xa7,
  0x7b, 0x84, 0x7b, 0xcf, 0x03, 0xac, 0xa7, 0x7d, 0x10, 0x86, 0x5c, 0x14,
  0x80, 0x0a, 0x12, 0xc2, 0xf1, 0x87, 0x02, 0xc5, 0x1b, 0x12, 0x10, 0x65,
  0x87, 0xdb, 0xe6, 0x76, 0x7f, 0xbb, 0xeb, 0x5a, 0x9d, 0x36, 0xf5, 0x0f,
  0x75, 0xef, 0x58, 0xfa, 0x0c, 0x31, 0xe0, 0x42, 0xd3, 0xcf, 0x70, 0x85,
  0x1f, 0x2e, 0x7d, 0xb7, 0x30, 0xb9, 0x96, 0xad, 0xc1, 0x72, 0x1f, 0x3f,
  0xfa, 0x8a, 0xe9, 0x56, 0x6f, 0xef, 0xd5, 0xab, 0x9a, 0x3c, 0x2f, 0x1d,
  0x28, 0xf5, 0xfd, 0xad, 0x2d, 0x5a, 0x9b, 0x57, 0x13, 0x0d, 0xbf, 0xe8,
  0xbd, 0xa2, 0x17, 0xeb, 0xaf, 0x95, 0x09, 0x1c, 0xc1, 0xb8, 0xfd, 0xbd,
  0x1e, 0xfe, 0x26, 0xf0, 0x39, 0xf2, 0xa7, 0xb4, 0xbe, 0xf5, 0x0a, 0x3f,
  0x17, 0x78, 0x8b, 0x1e, 0xe6, 0x7d, 0xcc, 0x27, 0x13, 0x74, 0x64, 0xe1,

  0x93, 0x8a, 0xcb, 0x73, 0x1f, 0x17, 0x63, 0x7f, 0xb9, 0x5b, 0xdd, 0xde,
  0x76, 0xdb, 0x72, 0x29, 0x9a, 0x4c, 0x09, 0x70, 0x78, 0x9e, 0x68, 0x27,
  0x82, 0xf5, 0xc1, 0x05, 0x42, 0xcd, 0x81, 0xb6, 0x61, 0x46, 0xdb, 0xaf,
  0x5e, 0x75, 0x71, 0x66, 0xfb, 0xaf, 0x5e, 0xb5, 0x16, 0x84, 0x3b, 0x9f,
  0xb9, 0xcf, 0xad, 0xfb, 0x09, 0x5f, 0xb7, 0x44, 0x53, 0xa2, 0x91, 0x13,
  0xfe, 0x0e, 0xfe, 0x26, 0x7a, 0x1d, 0x9d, 0x5f, 0x5c, 0x9f, 0x38, 0x9e,
  0x19, 0xba, 0x5f, 0x1c, 0x30, 0x74, 0x4c, 0x4d, 0x8a, 0xc1, 0x2e, 0xa8,
  0x95, 0x17, 0x59, 0xbd, 0x60, 0x93, 0xf8, 0xc6, 0x24, 0x15, 0xab, 0xa8,
  0x47, 0xf0, 0x0f, 0x7e, 0x46, 0x04, 0x35, 0xec, 0x9a, 0xa6, 0x95, 0x0b,
  0xdb, 0xb4, 0x0e, 0x87, 0xbd, 0x41, 0x2e, 0x0e, 0x4e, 0x72, 0x93, 0x60,
  0xca, 0x5a, 0x89, 0xd5, 0x1d, 0x9c, 0x08, 0x8b, 0xff, 0xc8, 0x17, 0x6b,
  0x5e, 0x81, 0x45, 0x32, 0xc3, 0xbc, 0x55, 0x91, 0x84, 0xfc, 0x42, 0x8f,
  0x9e, 0x94, 0xeb, 0x42, 0xf6, 0x2a, 0x37, 0x0a, 0x8f, 0x09, 0xd5, 0xd2,
  0xfd, 0x78, 0x20, 0x9e, 0x82, 0x9c, 0x90, 0x13, 0x31, 0xb4, 0x32, 0x0b,
  0x87, 0x71, 0xd1, 0x8d, 0xd7, 0x4a, 0xeb, 0xf0, 0x34, 0xde, 0xb9, 0x0c,
  0xcf, 0xc1, 0xc3, 0x23, 0x64, 0x27, 0xfe, 0x38, 0x59, 0x68, 0x4a, 0x69,
  0x56, 0x1f, 0x07, 0x68, 0x79, 0x92, 0x4e, 0x97, 0x45, 0x38, 0xfd, 0x92,
  0xba, 0x3c, 0x48, 0xa6, 0x83, 0x76, 0x0d, 0x88, 0xef, 0xe3, 0x22, 0xd1,
  0x26, 0x77, 0xd9, 0xa3, 0xb9, 0xdb, 0x6a, 0x05, 0x6b, 0x3d, 0x10, 0xb6,
  0x74, 0xf0, 0x2c, 0x69, 0x2c, 0xe1, 0x02, 0x3d, 0x06, 0xbd, 0x04, 0x92,
  0xa2, 0x43, 0x5e, 0x3d, 0xe9, 0xed, 0x27, 0xe9, 0x35, 0xe2, 0x40, 0xc4,
  0xc3, 0xa6, 0x26, 0x7e, 0x71, 0x24, 0x5b, 0xe0, 0xe7, 0xd4, 0xad, 0xcd,
  0xac, 0xef, 0x1e, 0x9f, 0x25, 0x6f, 0xcb, 0x4d, 0xee, 0xf4, 0x08, 0xf1,
  0x41, 0x1b, 0x90, 0xf3, 0x30, 0x9c, 0x0b, 0xfd, 0x95, 0x0f, 0x09, 0x9e,
  0xbf, 0xcf, 0x66, 0x79, 0x3c, 0xb6, 0xce, 0x93, 0x85, 0xa6, 0xeb, 0x0a,
  0xe4, 0x98, 0x1c, 0xad, 0x97, 0xd5, 0x81, 0x27, 0xcd, 0x67, 0x1c, 0xad,
  0x3b, 0x80, 0x22, 0x44, 0xa1, 0x8e, 0x1b, 0x84, 0xb9, 0x14, 0x52, 0x0a,
  0x03, 0x64, 0x20, 0xdc, 0x8d, 0x6f, 0xf6, 0x22, 0xbd, 0xf3, 0x69, 0x99,
  0x44, 0x17, 0xea, 0x99, 0x89, 0x42, 0xd2, 0x71, 0x69, 0x44, 0x83, 0xd3,
  0xff, 0x79, 0xf2, 0x29, 0xa3, 0x4e, 0x45, 0x7c, 0x6f, 0x0a, 0x07, 0xbf,
  0x67, 0xc0, 0x4a, 0x89, 0x06, 0x19, 0xa4, 0x8a, 0x78, 0x26, 0x36, 0x3c,
  0xac, 0x97, 0x83, 0x0a, 0x14, 0x56, 0x94, 0x96, 0xb8, 0x40, 0x58, 0x3e,
  0x6d, 0x63, 0x7d, 0x9f, 0x45, 0x2e, 0xe3, 0x5c, 0x74, 0xaa, 0xf8, 0x62,
  0x07, 0x20, 0x9f, 0xe3, 0x9c, 0x5c, 0x89, 0x64, 0xda, 0xa3, 0xb7, 0x97,
  0xe1, 0xa4, 0x02, 0xdd, 0x2e, 0x09, 0x11, 0x11, 0x27, 0x05, 0x73, 0x7d,
  0xa2, 0x27, 0xa1, 0x5b, 0x69, 0x9f, 0x70, 0x43, 0x06, 0x0c, 0x4f, 0x15,
  0xd1, 0xe1, 0x87, 0xab, 0xb3, 0x96, 0x72, 0xc9, 0x01, 0x9d, 0x01, 0x6e,
  0x56, 0xe7, 0x2a, 0x21, 0x34, 0xb3, 0x22, 0xba, 0x8c, 0xa7, 0x49, 0xc7,
  0x05, 0x90, 0xab, 0x21, 0x48, 0x8a, 0x03, 0x22, 0xe4, 0x4e, 0x71, 0xdb,
  0x6e, 0x20, 0x13, 0xb7, 0x61, 0x61, 0xb7, 0xc8, 0x71, 0x32, 0x8b, 0x65,
  0xef, 0x96, 0x05, 0x86, 0xf3, 0x69, 0xe7, 0x03, 0xad, 0xa4, 0xd4, 0x4f,
  0xd9, 0x80, 0xfe, 0xe4, 0x2c, 0x53, 0x2e, 0xcb, 0x8a, 0x17, 0x48, 0x43,
  0x51, 0xe7, 0x0b, 0xf4, 0xc0, 0x77, 0x74, 0x9a, 0xbd, 0xc4, 0x0f, 0xb2,
  0xe9, 0x56, 0x60, 0x60, 0xb8, 0xe6, 0x85, 0xaa, 0xfb, 0xee, 0x71, 0xd6,
  0x1a, 0x6f, 0x4d, 0x10, 0x8f, 0xb7, 0xa4, 0x58, 0xb2, 0xd7, 0x2a, 0x0c,
  0xc3, 0x5f, 0x08, 0xba, 0xc8, 0x38, 0xac, 0x98, 0x71, 0x12, 0x9d, 0xc9,
  0xfc, 0x0e, 0x24, 0xd8, 0xc2, 0xba, 0x90, 0x4e, 0xad, 0x96, 0x19, 0x14,
  0x5a, 0x6c, 0x3c, 0xc3, 0x86, 0x38, 0xc6, 0xfb, 0x85, 0x6b, 0x1c, 0xe7,
  0xd8, 0x43, 0x85, 0x7a, 0xae, 0x67, 0xc6, 0x99, 0x5c, 0x3b, 0xd9, 0x4f,
  0x0e, 0x75, 0x68, 0x03, 0x40, 0x47, 0x5d, 0xe9, 0xf2, 0xd4, 0x03, 0xea,
  0xc8, 0xa4, 0x0e, 0xde, 0x39, 0x56, 0x87, 0xf6, 0xfe, 0xc3, 0x69, 0x1c,
  0xe2, 0x34, 0xff, 0x68, 0x41, 0xcc, 0x75, 0xa6, 0x5b, 0x51, 0x99, 0x0a,
  0x1d, 0xa1, 0xd7, 0x7c, 0xc4, 0x56, 0xcc, 0x8a, 0xb0, 0x0c, 0xba, 0xf3,
  0x7b, 0x4e, 0x41, 0xcb, 0x31, 0x97, 0x6e, 0xf6, 0xde, 0xa4, 0x20, 0x44,
  0x4a, 0x46, 0x20, 0x22, 0x2d, 0x97, 0xdb, 0x05, 0xeb, 0x45, 0xe4, 0x12,
  0xde, 0x9e, 0x8f, 0xee, 0x37, 0x92, 0xba, 0x0e, 0xf3, 0x8a, 0x89, 0xd9,
  0x00, 0x45, 0x3c, 0xe1, 0x2c, 0xb6, 0xda, 0x42, 0x6c, 0x9d, 0x15, 0xd2,

  0x00, 0x5e, 0x3a, 0x18, 0x08, 0xbc, 0x07, 0xfa, 0x2d, 0x03, 0xbb, 0x63,
  0x70, 0x81, 0x28, 0x73, 0x86, 0x5a, 0xd8, 0xd7, 0xba, 0x30, 0x79, 0xc6,
  0xa6, 0xe9, 0x7f, 0xcd, 0xc9, 0x1e, 0xcd, 0x30, 0x20, 0x4c, 0xca, 0x34,
  0xc2, 0xe1, 0xc8, 0x09, 0xa3, 0xf0, 0x71, 0x69, 0xea, 0x08, 0x86, 0xed,
  0x37, 0x96, 0xa0, 0x3d, 0x7c, 0xc2, 0x02, 0xf7, 0xb1, 0xb6, 0x30, 0xca,
  0x19, 0x75, 0x09, 0x0f, 0x63, 0x03, 0x59, 0x2e, 0x08, 0x2f, 0xa1, 0x10,
  0x3a, 0x65, 0xef, 0xe0, 0x23, 0xae, 0x1c, 0xe4, 0x84, 0x8d, 0xe8, 0x4f,
  0x3d, 0xdb, 0x78, 0x63, 0xfd, 0x31, 0x01, 0x0d, 0xdb, 0x26, 0x7d, 0x90,
  0x21, 0x15, 0xa8, 0xfe, 0x8c, 0xb8, 0x3b, 0x68, 0x59, 0xab, 0x4b, 0x21,
  0x23, 0xc4, 0x89, 0x2c, 0xf2, 0xa6, 0x83, 0x16, 0x40, 0x69, 0x96, 0x59,
  0xf2, 0x80, 0x18, 0xe0, 0xed, 0xc3, 0xf9, 0x4a, 0xf6, 0xf7, 0x47, 0x57,
  0xe7, 0xa7, 0xe7, 0xdf, 0x1c, 0x20, 0x42, 0x5d, 0x52, 0x8c, 0xb0, 0x91,
  0x75, 0xf4, 0xd7, 0xe5, 0x38, 0x1d, 0x31, 0xa7, 0x90, 0x16, 0xc1, 0xb5,
  0xca, 0x98, 0x44, 0x1c, 0xac, 0xc0, 0x5c, 0xbc, 0x42, 0x18, 0x49, 0xe6,
  0xc5, 0xba, 0x9e, 0x22, 0x9f, 0x2e, 0xcd, 0xd6, 0x8f, 0x48, 0x15, 0xa1,
  0x30, 0x00, 0x85, 0x47, 0x91, 0x1f, 0x31, 0xd1, 0x62, 0xe3, 0x25, 0x50,
  0x14, 0xde, 0x9c, 0x9d, 0x45, 0x3e, 0x94, 0x2f, 0xa7, 0x8f, 0x0a, 0x7d,
  0x71, 0xc6, 0x10, 0x0d, 0x64, 0xf2, 0x4d, 0x31, 0x9e, 0x07, 0xc2, 0x9f,
  0xfb, 0x16, 0x3a, 0x5c, 0x0f, 0x4c, 0xd7, 0xef, 0xfd, 0x4c, 0x4e, 0xca,
  0x33, 0xa6, 0xe4, 0x40, 0x3a, 0xe1, 0xb4, 0x18, 0x93, 0x2d, 0x04, 0x4c,
  0x32, 0x9f, 0x54, 0xa8, 0x1e, 0xd5, 0x24, 0x69, 0xbd, 0x2b, 0xd0, 0x2a,
  0x67, 0xfb, 0x0d, 0x5b, 0x39, 0x35, 0xe0, 0x14, 0x8e, 0x48, 0x52, 0xd2,
  0x2a, 0xd0, 0x23, 0xeb, 0x85, 0xd4, 0x49, 0x0a, 0x7d, 0x52, 0x1e, 0x35,
  0x8f, 0x93, 0xd8, 0x74, 0xc7, 0x2e, 0x91, 0x5b, 0xfa, 0xec, 0xe2, 0x3e,
  0x29, 0xc4, 0xf8, 0x34, 0x55, 0xc4, 0xc0, 0xec, 0xfa, 0xd1, 0x20, 0x87,
  0xe7, 0x03, 0x55, 0x0b, 0xda, 0x73, 0xb1, 0xd6, 0xbc, 0x9d, 0x93, 0x68,
  0x4d, 0x5e, 0x15, 0xf5, 0xa3, 0xa2, 0x98, 0x5b, 0x7d, 0xbd, 0x81, 0x7e,
  0xcf, 0x48, 0xff, 0xc3, 0xc4, 0x28, 0x14, 0x8f, 0x1a, 0xda, 0x41, 0x0a,
  0xe9, 0xf4, 0x80, 0x9d, 0x76, 0x70, 0x67, 0xa9, 0x0b, 0xb5, 0x33, 0xd2,
  0x13, 0xbd, 0x54, 0xdd, 0x34, 0xf5, 0xe6, 0x82, 0x83, 0x2d, 0xea, 0x9c,
  0xd6, 0x4f, 0xb1, 0xd8, 0x9d, 0x8e, 0xe7, 0x54, 0x3a, 0x85, 0x99, 0x50,
  0x29, 0x57, 0xe9, 0x25, 0xa8, 0x61, 0x7a, 0x01, 0xf0, 0x0b, 0xdb, 0xfe,
  0x11, 0x8b, 0xf4, 0x9c, 0x3a, 0x79, 0xf7, 0x65, 0x11, 0x37, 0x5d, 0xeb,
  0x5c, 0x48, 0x09, 0xd2, 0xa7, 0xf2, 0xea, 0xf4, 0x26, 0xfd, 0x8d, 0x60,
  0x5e, 0x0d, 0xcf, 0x41, 0x24, 0x52, 0x19, 0xdf, 0xd9, 0x84, 0xaf, 0x56,
  0xc6, 0xa7, 0xc5, 0x2a, 0x4d, 0x19, 0x4d, 0x07, 0x6a, 0xbc, 0x4a, 0x3a,
  0x54, 0x1c, 0x39, 0x85, 0x2c, 0x6e, 0xa8, 0xb2, 0x86, 0x49, 0xe0, 0x0f,

  0x27, 0x15, 0x5f, 0x12, 0xe4, 0x6a, 0x65, 0xc2, 0x12, 0xb9, 0x49, 0xb3,
  0xbb, 0x9c, 0x7e, 0x23, 0x41, 0xaa, 0x40, 0x8a, 0x4a, 0xda, 0x5a, 0xd6,
  0x72, 0xdd, 0xd8, 0x55, 0x75, 0xd0, 0x68, 0x11, 0x01, 0xac, 0x85, 0x4b,
  0x03, 0xdd, 0x9e, 0x2d, 0xb6, 0x4d, 0x4b, 0x93, 0x14, 0xf8, 0x32, 0x21,

  0xf1, 0x76, 0x4d, 0x4b, 0x71, 0x78, 0x71, 0x56, 0x26, 0xd2, 0xe5, 0x98,
  0x4b, 0x02, 0x55, 0xe0, 0x88, 0xbc, 0x49, 0x8d, 0xef, 0xa7, 0x5d, 0x92,
  0xf4, 0xeb, 0x0d, 0x4b, 0x6b, 0xf6, 0x2b, 0x66, 0x34, 0xd2, 0x45, 0xa2,
  0x1b, 0x3c, 0xba, 0xc9, 0x73, 0xa9, 0x39, 0x6d, 0x63, 0xb6, 0x11, 0xa9,
  0x34, 0x84, 0x88, 0xd1, 0xa2, 0x3f, 0xd4, 0x5b, 0x55, 0x4a, 0x32, 0x79,
  0xf3, 0xee, 0x39, 0x50, 0x83, 0x35, 0x74, 0xd2, 0xba, 0x6c, 0xe3, 0xf9,
  0x18, 0xe1, 0x2c, 0xcc, 0xd5, 0x87, 0x57, 0x24, 0x2e, 0xc0, 0xa2, 0x3b,
  0xbc, 0x3d, 0x92, 0x59, 0xe9, 0x6e, 0x4a, 0x50, 0xd8, 0x71, 0xae, 0xa5,
  0x05, 0xc8, 0x26, 0xaa, 0x21, 0xb3, 0x29, 0xab, 0x07, 0x34, 0x68, 0xa6,
  0x69, 0x45, 0x0c, 0xe4, 0x4f, 0x3b, 0x5b, 0x6d, 0x4c, 0x1e, 0x07, 0xd2,
  0x1a, 0x57, 0xbc, 0x8d, 0xa5, 0xb1, 0xbf, 0x48, 0x0c, 0xda, 0xc2, 0x00,
  0x94, 0x21, 0xcb, 0x05, 0xfa, 0xe9, 0x7a, 0x48, 0x2f, 0x71, 0xd9, 0xb6,
  0xff, 0xfd, 0xdf, 0xa3, 0xf7, 0xa1, 0xe5, 0x5f, 0x57, 0xce, 0x19, 0xe3,
  0x40, 0xa1, 0x04, 0x33, 0xe5, 0x25, 0xea, 0x27, 0x71, 0x94, 0x76, 0xab,
  0x33, 0x90, 0x5d, 0x4f, 0x4d, 0xee, 0xe4, 0x72, 0xe2, 0x68, 0xbe, 0xf9,
  0x1a, 0xcf, 0x17, 0x51, 0x80, 0x65, 0x75, 0xf5, 0x06, 0x68, 0x9a, 0x4a,
  0x6c, 0xe1, 0x2e, 0xe3, 0x5b, 0x6d, 0xdd, 0xe7, 0xa3, 0xaf, 0x08, 0x23,

  0x65, 0x63, 0x3c, 0x96, 0x74, 0x4d, 0xda, 0x10, 0xfc, 0x52, 0x5d, 0x30,
  0x52, 0xce, 0x59, 0x2f, 0xe8, 0xed, 0x0f, 0x76, 0x8d, 0x90, 0xec, 0x71,
  0x17, 0x0a, 0xbf, 0xc3, 0x6f, 0x77, 0xa2, 0x75, 0xe4, 0xaa, 0x1b, 0x46,
  0x79, 0xf5, 0xeb, 0x9f, 0xb5, 0x39, 0x0b, 0xdb, 0x30, 0x31, 0x4b, 0xc8,
  0x66, 0xf2, 0x2c, 0xea, 0xaf, 0x60, 0xe5, 0x15, 0x20, 0xff, 0xb1, 0xe7,
  0x1b, 0x57, 0x0f, 0x4e, 0x96, 0xb3, 0x90, 0x99, 0x83, 0x77, 0x5b, 0x82,
  0x43, 0x69, 0x59, 0x2e, 0xc5, 0x08, 0x34, 0x00, 0x33, 0x06, 0x71, 0x30,
  0x9a, 0xc1, 0x7c, 0xe8, 0xd3, 0xe5, 0x0c, 0xb3, 0x4a, 0x5a, 0xd5, 0x13,
  0xf2, 0x0e, 0x6b, 0x0b, 0x73, 0xd1, 0x31, 0xc5, 0x8e, 0x92, 0xd3, 0xe1,
  0x46, 0x74, 0xd2, 0x48, 0x0d, 0x37, 0xa1, 0x4b, 0xb2, 0xaa, 0x31, 0x5c,
  0xe7, 0xe2, 0xf2, 0xfa, 0xf4, 0xe2, 0x7c, 0x10, 0xfd, 0x5b, 0x67, 0x65,
  0x79, 0x57, 0x1d, 0x58, 0xf9, 0x87, 0xae, 0x3d, 0x93, 0xe8, 0x50, 0xfc,
  0x0c, 0x6d, 0xb6, 0xb1, 0xa3, 0xc4, 0x8f, 0x40, 0x7a, 0x03, 0x7f, 0xd5,
  0x37, 0x05, 0xda, 0x4d, 0x4e, 0xab, 0x81, 0x46, 0xe7, 0x69, 0xcb, 0x06,
  0xce, 0xaf, 0x69, 0x44, 0x33, 0xb3, 0xb7, 0x36, 0x4b, 0x63, 0xf8, 0x30,
  0x07, 0x16, 0xce, 0x57, 0x4b, 0xe5, 0x94, 0x17, 0x68, 0x8b, 0xef, 0x49,
  0x2d, 0x65, 0x0b, 0x7a, 0x9d, 0x79, 0xa6, 0x2a, 0x5a, 0x65, 0xa0, 0xc3,
  0xdc, 0x37, 0x27, 0xd7, 0xe8, 0xa4, 0xa1, 0x2a, 0x57, 0x3b, 0x41, 0x72,
  0x75, 0x89, 0xe2, 0x13, 0x1b, 0xe5, 0x4c, 0x8b, 0x5b, 0xf1, 0xd2, 0x80,
  0xf6, 0x3c, 0x8b, 0xb3, 0x60, 0x09, 0x1b, 0x68, 0xb4, 0xc7, 0xb0, 0x1b,
  0xb9, 0x85, 0x7e, 0x55, 0xdf, 0x89, 0xd3, 0xd7, 0x84, 0x61, 0x99, 0x2e,
  0x3f, 0x5c, 0x8b, 0x9f, 0xea, 0xcd, 0xc9, 0xd9, 0xc9, 0xf5, 0x49, 0xd3,
  0x72, 0x1f, 0x32, 0x98, 0x25, 0x95, 0xba, 0x54, 0xc9, 0xe8, 0x26, 0xcb,
  0x67, 0xf9, 0x34, 0x95, 0x86, 0xaf, 0xd1, 0xf7, 0xc9, 0xf0, 0xcd, 0xd1,
  0x77, 0xa8, 0x4f, 0xa0, 0xcf, 0xe9, 0xf2, 0xea, 0xe2, 0xf2, 0xed, 0xe9,
  0xf9, 0x9b, 0x6e, 0x74, 0x7c, 0x71, 0xf9, 0x97, 0x6e, 0xf4, 0xfe, 0xe2,
  0xbb, 0x93, 0x40, 0x8a, 0x33, 0x22, 0xdc, 0x7a, 0x14, 0x63, 0x9a, 0xf5,
  0x59, 0xc3, 0x3b, 0xe3, 0x90, 0x85, 0x23, 0x44, 0x30, 0xff, 0x1f, 0xb4,
  0x5f, 0x64, 0xb7, 0x74, 0xd7, 0x60, 0xeb, 0x40, 0x86, 0xbe, 0x3b, 0x39,
  0x7a, 0xd3, 0xf5, 0x00, 0xcc, 0xb1, 0x95, 0x0a, 0x7c, 0x0c, 0xd7, 0x67,
  0x16, 0x4d, 0xb0, 0xd7, 0x6c, 0x7d, 0x90, 0x86, 0xc0, 0x41, 0x2e, 0xbe,
  0xb1, 0x40, 0xb0, 0x54, 0xa5, 0x3f, 0x6e, 0xcb, 0x9c, 0x10, 0x2c, 0xfe,
  0xd6, 0x16, 0xcb, 0x4e, 0xd9, 0x05, 0x2a, 0x6b, 0xae, 0x9a, 0x2d, 0x60,
  0x4d, 0x94, 0x56, 0xaf, 0x45, 0x58, 0x6e, 0x96, 0x6c, 0x0b, 0x62, 0x50,
  0xb7, 0x06, 0x15, 0x40, 0xfc, 0x88, 0x5d, 0x8f, 0xb1, 0xf4, 0x34, 0xa4,
  0xa6, 0x45, 0x60, 0x26, 0xa1, 0x56, 0x3d, 0xb1, 0x28, 0xb1, 0xab, 0x35,
  0x6c, 0x01, 0x52, 0x17, 0xd8, 0x26, 0xdc, 0x3c, 0xdd, 0x20, 0xd3, 0xd3,
  0xf3, 0x07, 0xfe, 0xb1, 0x80, 0x45, 0x05, 0x12, 0xb7, 0x97, 0x13, 0x20,
  0xcb, 0x84, 0x53, 0xa6, 0xf8, 0x98, 0x8c, 0x5b, 0x20, 0xea, 0x9d, 0xaa,
  0x53, 0x62, 0x95, 0x82, 0xa5, 0x37, 0x46, 0x1d, 0x33, 0x8c, 0x15, 0xa5,
  0x3e, 0xab, 0x3a, 0x9b, 0x70, 0x3d, 0x24, 0xb8, 0xce, 0x80, 0xbe, 0xaf,
  0x47, 0xac, 0x68, 0x46, 0xe2, 0xc1, 0x71, 0x37, 0x85, 0x40, 0x37, 0x3c,
  0x5f, 0x16, 0x08, 0x58, 0x4f, 0xb8, 0xd0, 0x93, 0xc0, 0x4a, 0x32, 0xf1,
  0x88, 0x46, 0x18, 0x7a, 0xeb, 0xb1, 0x2d, 0xed, 0xe6, 0xfc, 0x2a, 0xf7,
  0x14, 0xdd, 0x54, 0xe6, 0xe0, 0x85, 0xa8, 0x68, 0x9d, 0xb5, 0x96, 0xda,
  0xe6, 0x96, 0xef, 0x6e, 0x3d, 0x58, 0x1f, 0x3b, 0x6a, 0x13, 0x65, 0xd4,
  0x13, 0xac, 0x6f, 0x2a, 0xde, 0xf3, 0xb6, 0x6e, 0xfd, 0x6d, 0x0b, 0x63,
  0x74, 0xbd, 0xb6, 0xa6, 0xa0, 0xdf, 0xb0, 0xa8, 0xb3, 0x53, 0xb8, 0x0e,
  0x01, 0x68, 0x9c, 0x71, 0x4e, 0x8d, 0xa3, 0x29, 0x1d, 0x81, 0xf4, 0x2a,

  0xda, 0x7d, 0x18, 0xcb, 0xff, 0x30, 0x76, 0x52, 0x0f, 0x7e, 0x99, 0x5a,

  0xac, 0x3f, 0xf1, 0x69, 0xef, 0xcc, 0xae, 0x4e, 0xae, 0xaf, 0xfa, 0xd1,
  0xba, 0x8b, 0xf9, 0xfa, 0xa2, 0xbf, 0xe5, 0x07, 0x6d, 0xb0, 0x89, 0x7b,
  0xf0, 0xab, 0xd4, 0xdd, 0xbd, 0xe5, 0xab, 0xc4, 0x1b, 0xf0, 0xbb, 0x7e,
  0x1e, 0xb1, 0x83, 0xf4, 0xb4, 0x15, 0xfa, 0x9e, 0xdb, 0x2a, 0xbe, 0xf6,
  0x3d, 0xfc, 0xc5, 0x8a, 0x55, 0xbe, 0x3b, 0x39, 0x0b, 0xf4, 0xf6, 0xf9,
  0xee, 0xea, 0xed, 0x5f, 0xea, 0xab, 0xdc, 0xdd, 0x0b, 0x7c, 0xf5, 0xb7,
  0x74, 0xa8, 0x27, 0x65, 0x3e, 0x03, 0x85, 0x85, 0xaa, 0x38, 0xa8, 0x88,
  0xe3, 0x00, 0x44, 0x00, 0xe6, 0x9a, 0xff, 0xd8, 0x95, 0xbf, 0xfc, 0xdc,
  0xef, 0xf7, 0xbf, 0xf4, 0x51, 0xd1, 0xc9, 0x47, 0x63, 0x96, 0x2b, 0xcf,
  0x36, 0x2d, 0x70, 0xaa, 0x9a, 0xa1, 0x2a, 0x21, 0x8c, 0x5a, 0x2c, 0xe2,
  0xb4, 0xa0, 0x9e, 0x40, 0x41, 0x81, 0x8b, 0x4b, 0xb2, 0x95, 0x5e, 0x46,
  0x9b, 0x13, 0x44, 0x30, 0xbe, 0xae, 0xeb, 0xe5, 0x86, 0xd4, 0x55, 0x5b,
  0x19, 0x1c, 0x8f, 0x3d, 0x47, 0x08, 0xf7, 0x65, 0xc1, 0xcf, 0x16, 0xe8,
  0x9f, 0x65, 0x5b, 0xc7, 0xca, 0xda, 0x4c, 0x65, 0x87, 0xac, 0x7e, 0x6c,
  0xa6, 0x1f, 0xf4, 0x5e, 0x48, 0x9d, 0xe4, 0xb1, 0x84, 0xd4, 0xc9, 0x91,
  0x1c, 0x93, 0x58, 0xa1, 0x36, 0xb3, 0x49, 0x35, 0xda, 0xc4, 0x75, 0x96,
  0x35, 0x0d, 0xd0, 0xa8, 0x70, 0x9e, 0x13, 0xc9, 0xcd, 0x93, 0xa4, 0x0a,
  0x5a, 0x4e, 0x6e, 0x71, 0x4a, 0x12, 0x6c, 0x11, 0xaf, 0xa3, 0xa9, 0xb3,
  0x7e, 0xe0, 0x73, 0xb3, 0x5a, 0x47, 0x24, 0xb7, 0x02, 0x51, 0x5b, 0x5d,
  0x78, 0xec, 0xd0, 0x29, 0x53, 0xf3, 0xd5, 0x7e, 0xe2, 0xce, 0x4a, 0x49,
  0x98, 0x48, 0x41, 0xe8, 0xe3, 0x93, 0x9a, 0x44, 0x50, 0x0f, 0x9d, 0x7b,
  0xe8, 0x2d, 0xb5, 0xcf, 0x34, 0x01, 0x46, 0x12, 0x57, 0x23, 0x1e, 0x57,
  0xea, 0xcb, 0xc3, 0xaf, 0x4d, 0xc2, 0x06, 0x95, 0x99, 0xaf, 0xfd, 0xdb,
  0x1a, 0x2a, 0xc2, 0xf4, 0x7a, 0xb0, 0xb6, 0x5d, 0x09, 0x17, 0x0d, 0x1b,
  0x7c, 0x2a, 0xa0, 0x37, 0x98, 0x4d, 0x31, 0xc4, 0xa7, 0xbc, 0xd4, 0x25,
  0x1e, 0x5a, 0x42, 0x3f, 0xfa, 0x3e, 0x9d, 0x8d, 0x47, 0x71, 0x41, 0xe9,
  0x61, 0xbe, 0x78, 0x15, 0x32, 0xe1, 0xfb, 0x54, 0xe6, 0xf4, 0x55, 0x7b,
  0x79, 0xb4, 0x99, 0x4c, 0x98, 0xea, 0x03, 0x45, 0x3f, 0xe6, 0x30, 0x30,
  0xf8, 0xdd, 0x56, 0x74, 0xc6, 0xe4, 0xa3, 0x7b, 0x8c, 0xa2, 0xae, 0xde,
  0xc1, 0xa3, 0x7e, 0xae, 0x1a, 0x87, 0xe8, 0xed, 0xf9, 0xb1, 0x94, 0x74,
  0x71, 0xb7, 0x47, 0xee, 0xab, 0x17, 0x5d, 0xfe, 0xd7, 0x0b, 0x5b, 0x7e,
  0xe2, 0x18, 0x69, 0x6c, 0xc7, 0xb0, 0xd6, 0x7f, 0x7a, 0xa9, 0x45, 0xae,
  0x4d, 0x9e, 0x38, 0x70, 0x30, 0xc9, 0x79, 0x96, 0x5a, 0xb6, 0x06, 0xef,
  0xe8, 0x6c, 0x71, 0x47, 0x80, 0x7f, 0xfd, 0x38, 0x2c, 0x10, 0x76, 0xa4,
  0x2a, 0x7f, 0x5e, 0x55, 0x4f, 0x0c, 0x3a, 0xff, 0xcb, 0x7e, 0xa0, 0xfd,
  0x76, 0xf0, 0x43, 0x26, 0xdd, 0xd7, 0x7e, 0x0d, 0x81, 0xa2, 0x28, 0x6c,
  0x87, 0x59, 0x3f, 0xb6, 0x9c, 0x38, 0xf8, 0xa1, 0x57, 0x4f, 0x7c, 0x88,
  0x8f, 0xd4, 0xe0, 0xbe, 0xdd, 0x2b, 0x55, 0x98, 0xe9, 0x4b, 0x2f, 0xed,
  0xbd, 0xfe, 0xd6, 0xf3, 0x33, 0x94, 0xad, 0xf1, 0xcd, 0xf0, 0x83, 0xfc,
  0x13, 0xa2, 0x12, 0x49, 0x11, 0xcb, 0xdb, 0x68, 0x6e, 0x65, 0x67, 0x0c,
  0x84, 0xcd, 0xa9, 0xf1, 0x72, 0xd8, 0x00, 0x2a, 0x11, 0x2a, 0xc0, 0x38,
  0x2c, 0xbd, 0x1d, 0x38, 0xcd, 0x1a, 0xee, 0x16, 0xe1, 0x89, 0x18, 0x14,
  0xe5, 0x1f, 0x23, 0xfc, 0x82, 0x72, 0xb9, 0x13, 0x2c, 0x62, 0xba, 0x3a,
  0x79, 0xfb, 0x61, 0x70, 0xf2, 0x26, 0x8a, 0x03, 0x10, 0x58, 0x14, 0x2f,
  0x4d, 0xc9, 0x2d, 0x27, 0x0d, 0x82, 0xaa, 0x3c, 0xe7, 0x8c, 0x20, 0x99,
  0x8b, 0xd7, 0x73, 0x50, 0x92, 0x8b, 0xc0, 0x32, 0xf6, 0xeb, 0x4e, 0x58,

  0x8f, 0x93, 0x17, 0x7f, 0x01, 0xee, 0x08, 0xaf, 0x7a, 0x9c, 0x60, 0x73,
  0xae, 0x43, 0xce, 0x82, 0xf1, 0x40, 0xd5, 0x6c, 0x1b, 0xaf, 0x72, 0x96,
  0x24, 0x0b, 0x29, 0xfa, 0xb3, 0x9d, 0xe4, 0xe1, 0x6c, 0xd4, 0x13, 0x28,
  0xcd, 0x39, 0x68, 0x54, 0x0d, 0x1c, 0xc6, 0x2d, 0x9d, 0xa4, 0x08, 0x5e,
  0x8d, 0x33, 0xd6, 0x2d, 0x66, 0x80, 0xdd, 0x16, 0xde, 0x95, 0xf5, 0xb4,
  0x6a, 0xb8, 0xd0, 0xbd, 0xae, 0x7a, 0xe4, 0x52, 0x47, 0x80, 0x1e, 0xb0,
  0x8b, 0x78, 0x32, 0xf1, 0x6c, 0x9a, 0x17, 0x30, 0xde, 0xdc, 0xd4, 0x29,
  0x32, 0x9c, 0x43, 0xb9, 0xd1, 0xec, 0xc5, 0xe9, 0xd7, 0x7c, 0x73, 0xa9,
  0x23, 0x85, 0xc0, 0x13, 0xae, 0xe1, 0x46, 0xb6, 0xc0, 0xfb, 0x44, 0x1e,
  0x13, 0x0c, 0x0f, 0xb2, 0x4c, 0x1b, 0x48, 0xd5, 0x35, 0xed, 0x07, 0x6f,
  0xa1, 0x67, 0x6e, 0x62, 0xd7, 0x91, 0xa6, 0x3b, 0x47, 0x55, 0x77, 0x0d,

  0x07, 0xb8, 0x73, 0xff, 0x3d, 0xbb, 0xb9, 0x6d, 0xef, 0x84, 0x6e, 0xc0,
  0x3c, 0x7e, 0x20, 0x17, 0x55, 0x2b, 0x39, 0xb0, 0xc3, 0x16, 0xb7, 0x03,
  0x1f, 0x2b, 0x98, 0xe5, 0x13, 0x83, 0xb5, 0x95, 0x2f, 0x9c, 0x97, 0x64,
  0x4e, 0x5a, 0x1c, 0x58, 0x64, 0x77, 0xfb, 0xa1, 0x47, 0x4a, 0xe3, 0x36,
  0x2d, 0xcd, 0xc8, 0x4f, 0x18, 0xe3, 0x32, 0xd1, 0x88, 0x5b, 0xe7, 0xd6,
  0x52, 0xf4, 0xbd, 0x0d, 0xfc, 0xf1, 0x2c, 0xc7, 0x28, 0x25, 0x13, 0x03,
  0x7d, 0xdf, 0x87, 0xec, 0x43, 0x23, 0xa1, 0x40, 0x42, 0x54, 0x83, 0x96,
  0x7d, 0xc2, 0xd4, 0xca, 0x86, 0x8a, 0xc5, 0x10, 0xc0, 0x8c, 0x3d, 0x60,
  0x13, 0x3b, 0x8e, 0xbc, 0xe9, 0xe5, 0xb0, 0xf2, 0x38, 0xac, 0x28, 0xd0,
  0x10, 0xdd, 0x3a, 0xb2, 0xb2, 0x6c, 0x36, 0x95, 0x67, 0x52, 0x83, 0x6a,
  0x6a, 0xa5, 0x26, 0x35, 0xf2, 0x01, 0x55, 0xad, 0xab, 0xed, 0x73, 0xa8,
  0xb4, 0x09, 0x97, 0x43, 0x76, 0x66, 0x9c, 0xb9, 0x73, 0xa5, 0x03, 0x80,
  0x31, 0xd2, 0x7c, 0x4c, 0x45, 0x51, 0xdc, 0x86, 0xa7, 0x0d, 0x3e, 0x46,
  0xe6, 0xb2, 0x86, 0x9e, 0xca, 0x87, 0x74, 0xbe, 0x9c, 0xd3, 0xfb, 0x5d,
  0x2e, 0x7f, 0x9c, 0xa3, 0xd4, 0xd2, 0x43, 0xa5, 0xec, 0xc2, 0x4a, 0x29,
  0x2a, 0xe4, 0xcc, 0x40, 0xde, 0x46, 0x44, 0x5b, 0x71, 0xc6, 0x0f, 0xbe,
  0xc5, 0x2d, 0x36, 0xe8, 0xa0, 0xfe, 0xdb, 0xe9, 0x33, 0x3a, 0x04, 0x8d,
  0xee, 0x4b, 0x7f, 0x12, 0x3e, 0xeb, 0x20, 0xba, 0xc4, 0x3c, 0xe7, 0x64,
  0xec, 0x58, 0x91, 0x42, 0x6e, 0x04, 0x62, 0xc3, 0x67, 0xd4, 0xce, 0xa1,

  0xa4, 0xd5, 0x24, 0xcd, 0x57, 0x28, 0x1e, 0x97, 0x6a, 0x9d, 0xbf, 0x2c,
  0x96, 0x84, 0xee, 0xa7, 0x0c, 0xe9, 0xb7, 0x5c, 0x78, 0x32, 0xdf, 0xf0,
  0x09, 0xa3, 0x8e, 0xc2, 0xe7, 0xb7, 0x24, 0x27, 0x46, 0x6c, 0x5b, 0xf4,
  0x97, 0xcb, 0x1e, 0x1b, 0x37, 0x96, 0x34, 0x5c, 0x08, 0x77, 0xd6, 0x24,
  0x5e, 0xe6, 0x09, 0x11, 0x56, 0x4c, 0x19, 0x0e, 0xe9, 0x00, 0x37, 0x85,
  0x8f, 0xaf, 0xab, 0x65, 0x78, 0x7b, 0x0f, 0x0f, 0x1e, 0x85, 0x3b, 0x06,
  0x31, 0xe3, 0x4d, 0xb2, 0xb5, 0xbc, 0xb7, 0xf5, 0x39, 0xfe, 0x73, 0xff,
  0xa1, 0x61, 0x34, 0xf7, 0x83, 0xe0, 0x90, 0x5a, 0x96, 0x1b, 0x0f, 0x73,
  0x0e, 0xc1, 0xf1, 0x86, 0xc5, 0xce, 0x66, 0x6a, 0x14, 0x41, 0x3a, 0xbf,
  0xde, 0xc7, 0xb8, 0xb9, 0x79, 0xe6, 0xa7, 0x36, 0x50, 0x2e, 0xa6, 0xd3,
  0xeb, 0x55, 0x03, 0xa5, 0xd4, 0xb4, 0x10, 0x94, 0x7f, 0xdc, 0x4c, 0xdd,
  0x2b, 0x1d, 0x74, 0x9c, 0x2f, 0x39, 0x90, 0x99, 0x78, 0x91, 0xb1, 0x94,
  0x77, 0x1f, 0xaf, 0x14, 0x88, 0xac, 0x74, 0x86, 0xef, 0xf0, 0xbd, 0x2e,
  0xa3, 0x6d, 0x38, 0x86, 0x34, 0x5b, 0x56, 0x06, 0xac, 0x8f, 0x3e, 0xa8,
  0x14, 0x1a, 0xdc, 0x7d, 0xe4, 0xf3, 0x46, 0xb0, 0x08, 0x2f, 0x28, 0x9d,
  0x00, 0x21, 0xdf, 0x13, 0xd2, 0xc9, 0xc5, 0xc1, 0xe3, 0x4a, 0xd9, 0x80,
  0xab, 0xc8, 0x44, 0x61, 0xa5, 0x73, 0x53, 0xf2, 0x00, 0x9b, 0xcd, 0x20,
  0x4a, 0x91, 0x11, 0x0e, 0x56, 0xa8, 0x49, 0x86, 0x30, 0x37, 0x6c, 0x08,
  0x64, 0xfe, 0xd4, 0x98, 0xb8, 0x69, 0xe1, 0x45, 0x7c, 0x2e, 0xaf, 0xe4,
  0x4a, 0x9a, 0xe6, 0x6b, 0xac, 0xb5, 0x85, 0xaf, 0xb6, 0x34, 0x50, 0x63,
  0x6c, 0x3d, 0xd0, 0xda, 0x5e, 0x60, 0x35, 0xb0, 0x53, 0x88, 0x06, 0x27,
  0x61, 0xb2, 0x36, 0x71, 0xf8, 0x2b, 0xfa, 0xf4, 0x11, 0x86, 0x8c, 0x0f,
  0x42, 0x1a, 0x99, 0x5b, 0xcc, 0x8d, 0xac, 0x97, 0x78, 0x01, 0xf9, 0xeb,
  0x13, 0xc5, 0xe3, 0x46, 0xa4, 0x6e, 0xbe, 0xac, 0xc6, 0x01, 0xcf, 0xe9,
  0x00, 0xc9, 0x83, 0xcf, 0x99, 0x43, 0xaa, 0xce, 0xef, 0xc8, 0x8e, 0xca,
  0x18, 0xe1, 0x27, 0x97, 0xd5, 0xcd, 0xdf, 0xd3, 0x71, 0x10, 0xb9, 0x01,
  0x6f, 0x03, 0xfc, 0x1a, 0x4e, 0xad, 0x64, 0xf7, 0x97, 0x22, 0x9b, 0x46,
  0xeb, 0xf2, 0xda, 0x46, 0x37, 0x1a, 0x2f, 0xc9, 0x21, 0x37, 0x38, 0x1a,
  0x9c, 0x45, 0x97, 0x67, 0x47, 0xa7, 0xe7, 0xf0, 0x4e, 0xcf, 0x37, 0x52,
  0x0d, 0x60, 0x59, 0xb7, 0xd9, 0x62, 0x8c, 0x3c, 0x9e, 0x75, 0x4c, 0x33,
  0xf3, 0x1d, 0xfe, 0x90, 0x8f, 0x69, 0x34, 0x26, 0x51, 0x5a, 0xab, 0x3d,

  0xe8, 0x2d, 0x35, 0xe3, 0xa9, 0x1d, 0x55, 0xc7, 0x2a, 0x4d, 0x9a, 0x29,
  0x23, 0xa9, 0xa8, 0x4e, 0xac, 0x91, 0x2f, 0x23, 0x48, 0xae, 0xbb, 0x44,
  0xa6, 0xe6, 0xaf, 0x06, 0x56, 0x6e, 0xb3, 0x8b, 0x70, 0x86, 0x30, 0x23,
  0xee, 0x98, 0x05, 0x54, 0xe1, 0x0c, 0x4b, 0xe0, 0x6e, 0x26, 0xcb, 0x95,
  0x32, 0x06, 0xdb, 0x32, 0xa1, 0x60, 0x52, 0xe8, 0x76, 0xc4, 0xe4, 0x50,
  0xd9, 0x26, 0x15, 0xb3, 0x4e, 0x56, 0x7e, 0x4c, 0x85, 0xc3, 0xc6, 0x4a,
  0xc3, 0xc5, 0xae, 0x95, 0x9e, 0x84, 0x1e, 0xe6, 0x0f, 0x5d, 0x0b, 0x93,
  0x40, 0xa5, 0x4d, 0x26, 0xbf, 0x61, 0x0a, 0xcc, 0x8c, 0x60, 0xa8, 0x78,
  0x24, 0x18, 0xb4, 0x6b, 0x32, 0xdd, 0xcb, 0x9b, 0xd8, 0x2f, 0x18, 0x98,
  0x83, 0x76, 0x0b, 0x03, 0xba, 0xae, 0xd1, 0x55, 0x34, 0xf6, 0xa2, 0xd1,
  0xcb, 0x9b, 0x68, 0x2c, 0x6d, 0xea, 0x38, 0x27, 0x94, 0x65, 0x6b, 0x72,
  0xe4, 0x0c, 0x77, 0x86, 0x21, 0x88, 0x8e, 0xea, 0xe4, 0xb0, 0x12, 0x80,
  0x7d, 0xbb, 0xf1, 0xbd, 0x4f, 0x84, 0x12, 0xcb, 0xa8, 0xdd, 0x6d, 0x8d,
  0x2f, 0xcb, 0x03, 0xfe, 0xba, 0x05, 0xa3, 0xf6, 0x27, 0xc3, 0xc8, 0x5e,

  0x58, 0xcd, 0xc4, 0x0d, 0x4a, 0x43, 0xf0, 0x50, 0xf4, 0xc4, 0xa6, 0xa4,
  0xc6, 0x3d, 0x95, 0x61, 0xc2, 0xd0, 0xb3, 0xba, 0xf2, 0x01, 0x52, 0x3f,
  0x76, 0xf0, 0xed, 0x85, 0x60, 0xac, 0x4c, 0x7c, 0x56, 0xec, 0xac, 0x92,
  0x9e, 0xc6, 0x44, 0xb9, 0x4a, 0xd4, 0x39, 0x23, 0xc9, 0x71, 0x0c, 0x9b,
  0x6f, 0x86, 0x0d, 0x10, 0xfc, 0x76, 0x09, 0x9c, 0x82, 0x30, 0xe1, 0x26,
  0xa9, 0x3a, 0x03, 0x67, 0x4c, 0x8f, 0x0f, 0x53, 0x13, 0x0d, 0xa2, 0xb3,
  0xbf, 0x2d, 0xd3, 0x84, 0xba, 0xf9, 0x82, 0x1c, 0x8e, 0xde, 0x70, 0xc6,
  0xa4, 0x34, 0x1b, 0xe5, 0xae, 0xc6, 0xd4, 0xf9, 0x18, 0x1f, 0x35, 0x13,
  0xf0, 0xf8, 0x30, 0x4c, 0x08, 0xe5, 0xd3, 0x7b, 0x9a, 0xf4, 0x31, 0x4e,
  0x7a, 0x0e, 0x02, 0x90, 0xfc, 0x5a, 0x0e, 0xba, 0x9e, 0x26, 0xd3, 0x68,
  0x85, 0x0b, 0x8b, 0xaa, 0xb8, 0xbc, 0xf5, 0x6b, 0x58, 0xba, 0xb5, 0x4e,

  0x6d, 0xe4, 0x4b, 0x11, 0xc6, 0x54, 0x61, 0x9b, 0xbf, 0x2c, 0x9e, 0x6d,
  0x96, 0xd5, 0x18, 0xf5, 0x82, 0x65, 0x36, 0xc3, 0x49, 0xe2, 0x50, 0x2d,
  0x7d, 0x43, 0x03, 0x38, 0x54, 0x04, 0x81, 0xde, 0x38, 0x20, 0x8a, 0xe9,
  0x18, 0x36, 0x28, 0xb5, 0x7c, 0xae, 0x61, 0x87, 0x3f, 0x11, 0xb9, 0xea,
  0x83, 0x62, 0xb9, 0x5b, 0x85, 0x6c, 0x87, 0x57, 0x4c, 0x1b, 0x59, 0x3b,
  0xb7, 0x55, 0x10, 0x21, 0x77, 0x38, 0x21, 0x20, 0xb4, 0x61, 0x5e, 0x2a,
  0x78, 0x3a, 0x2c, 0x12, 0x5e, 0xaf, 0xdd, 0x27, 0x82, 0xa0, 0xfb, 0x85,
  0x28, 0x3f, 0xdc, 0x2f, 0xdd, 0xc1, 0xf8, 0x59, 0xd5, 0x26, 0xdd, 0x6f,
  0x32, 0xff, 0x8b, 0x01, 0x7e, 0x42, 0x08, 0x66, 0xe8, 0x62, 0x31, 0x39,
  0xc1, 0x92, 0xe8, 0x57, 0x03, 0xba, 0x21, 0xa7, 0x06, 0x26, 0x5e, 0x04,
  0x5a, 0x74, 0x02, 0x39, 0x2d, 0x05, 0x1b, 0x64, 0x34, 0x03, 0x1d, 0x28,
  0xe0, 0x88, 0x19, 0x08, 0x30, 0x1c, 0xc2, 0xe0, 0x75, 0x9b, 0x22, 0xbb,
  0x5c, 0xa2, 0x6a, 0x3e, 0x5b, 0xe2, 0xb7, 0x19, 0x41, 0xce, 0x20, 0x98,
  0x29, 0xa4, 0x41, 0x10, 0xf5, 0xcf, 0x40, 0x90, 0xe1, 0x1d, 0x75, 0x00,
  0x10, 0x15, 0xd3, 0xd7, 0x60, 0x03, 0x36, 0x31, 0xa2, 0xfa, 0x2d, 0xb3,
  0x43, 0x6f, 0x09, 0x0f, 0x93, 0x08, 0xc0, 0xaa, 0xe3, 0x98, 0xc2, 0x32,
  0x2f, 0x9d, 0x8e, 0x20, 0x04, 0x0a, 0xa6, 0x4e, 0x10, 0xd5, 0x8d, 0x72,
  0x26, 0x58, 0xf9, 0x72, 0xe7, 0xa6, 0x1a, 0x8a, 0x02, 0x08, 0x50, 0xe5,
  0x85, 0x83, 0x03, 0x08, 0x04, 0x90, 0x79, 0xf1, 0x40, 0x44, 0xe6, 0xe2,
  0xc6, 0x82, 0xc4, 0x73, 0x58, 0xa1, 0x96, 0x22, 0xb2, 0x52, 0xef, 0x5e,
  0x6d, 0x4a, 0x0c, 0xd1, 0x94, 0x85, 0x32, 0xf8, 0xf9, 0xa5, 0x75, 0x05,

  0xe9, 0xa1, 0xd7, 0x36, 0x6a, 0x71, 0xb3, 0xbc, 0x06, 0x43, 0xfd, 0xbb,
  0xea, 0x5c, 0xfb, 0xf5, 0x86, 0x7a, 0x02, 0xe9, 0xf8, 0xab, 0x2e, 0x54,
  0xfc, 0xbc, 0x1b, 0xd5, 0x52, 0x6d, 0xf3, 0xff, 0xe6, 0x8d, 0x8a, 0x9f,
  0x77, 0xa5, 0xe2, 0xda, 0x9d, 0xc2, 0x65, 0xfa, 0x6c, 0xe9, 0xa1, 0x75,
  0xc6, 0xbf, 0xe1, 0x2d, 0x33, 0x89, 0x49, 0xcf, 0xbd, 0x63, 0x4a, 0x13,
  0xff, 0x6f, 0xdf, 0xb2, 0xcf, 0x1b, 0x5a, 0x20, 0xe1, 0xa3, 0xae, 0xe8,
  0x5b, 0xe9, 0xe6, 0x6e, 0xa1, 0x82, 0x8c, 0xba, 0xd6, 0xa6, 0x81, 0x32,
  0x0c, 0x37, 0xaf, 0x64, 0xe8, 0xad, 0x60, 0xe8, 0x32, 0xd7, 0xa3, 0xdd,
  0x37, 0xc7, 0xa1, 0xb8, 0x03, 0x2b, 0x47, 0xf6, 0x9c, 0xb7, 0x8a, 0x10,
  0x6d, 0x71, 0x53, 0xfa, 0xa2, 0x3e, 0xe8, 0x9a, 0xa6, 0x20, 0xd7, 0x17,
  0x29, 0x69, 0x07, 0xa0, 0xb8, 0xa0, 0x79, 0xfb, 0xcd, 0x60, 0xd0, 0x3b,
  0xba, 0x3c, 0x8d, 0x9e, 0xb0, 0xbb, 0x08, 0x17, 0xc6, 0xce, 0x31, 0x64,
  0x2f, 0xb7, 0xa7, 0x61, 0xd5, 0xbf, 0x0e, 0x7a, 0x6e, 0x73, 0x5b, 0x8f,
  0xca, 0xa8, 0x96, 0x66, 0xac, 0x93, 0x32, 0x2d, 0x37, 0x50, 0xdb, 0x56,
  0xd4, 0x65, 0x4a, 0xf5, 0x47, 0x67, 0x0d, 0x72, 0x2d, 0x7a, 0xc0, 0xcb,
  0xc9, 0x26, 0x84, 0x1d, 0x44, 0xc7, 0xd9, 0x7e, 0xf5, 0x62, 0x1b, 0x6e,
  0xc5, 0x23, 0xa3, 0x3e, 0xca, 0xcb, 0x7b, 0xfd, 0xdd, 0xcd, 0xbd, 0xfe,

  0x1e, 0xf2, 0x34, 0x09, 0x96, 0x92, 0xb3, 0x43, 0x86, 0x07, 0x6e, 0x17,
  0xc8, 0x4a, 0x62, 0x21, 0x76, 0x7e, 0x72, 0x1c, 0x71, 0xea, 0x2a, 0xc1,
  0x00, 0x36, 0x8c, 0x2e, 0xce, 0x70, 0xa3, 0x14, 0x16, 0x39, 0x42, 0x26,
  0x56, 0xcf, 0x49, 0xe1, 0x6d, 0x87, 0x9a, 0x12, 0x64, 0x71, 0x65, 0x66,
  0x22, 0xc8, 0xee, 0xd8, 0xaa, 0x90, 0x7d, 0xc1, 0x39, 0xfa, 0x15, 0x68,
  0xce, 0x96, 0x38, 0x1b, 0xf6, 0x44, 0x7a, 0xf9, 0x5e, 0xfb, 0xf9, 0xa8,
  0xf9, 0xd2, 0x62, 0x00, 0x59, 0xcf, 0xbd, 0x67, 0xe7, 0x08, 0x43, 0x54,
  0xa3, 0x14, 0x5d, 0x90, 0xa3, 0xb9, 0x31, 0x49, 0x26, 0x7f, 0x1b, 0x67,
  0xfd, 0x5f, 0x6a, 0x4f, 0x05, 0x14, 0x62, 0xc7, 0x6c, 0xd2, 0xa9, 0x0b,
  0x23, 0x13, 0x5b, 0xa9, 0x6d, 0x41, 0x62, 0x22, 0x35, 0x3d, 0x64, 0x4c,
  0x02, 0x78, 0x99, 0xd9, 0x82, 0x72, 0x86, 0x32, 0xe3, 0x07, 0x7e, 0xa6,
  0xa3, 0x07, 0x0c, 0x72, 0xfc, 0x18, 0x8f, 0x55, 0x24, 0xf1, 0x4c, 0x66,
  0xe5, 0x7c, 0xc7, 0xff, 0x25, 0xee, 0x1e, 0x31, 0xdb, 0xd2, 0x4f, 0xcb,
  0x94, 0xa0, 0x82, 0x33, 0x05, 0x93, 0xa6, 0x65, 0x3b, 0xb9, 0x2c, 0x0a,
  0x10, 0x27, 0xe9, 0x22, 0x9e, 0x45, 0xcf, 0xa8, 0x2d, 0x68, 0x3f, 0xfc,



  0x27, 0xfa, 0xf4, 0xd2, 0xec, 0xf5, 0x76, 0xae, 0x60, 0x74, 0x92, 0x7a,
  0xd4, 0x94, 0xaa, 0x01, 0x2e, 0xd7, 0x32, 0x18, 0x22, 0x27, 0x58, 0x6e,
  0xa6, 0x14, 0xd7, 0x4c, 0xa0, 0x01, 0x4b, 0xd2, 0x78, 0x5e, 0xd1, 0x1d,
  0x67, 0x43, 0x69, 0x3a, 0xac, 0xd4, 0xbc, 0x6e, 0x34, 0x19, 0x61, 0x88,
  0xb9, 0x57, 0xb9, 0x30, 0xc5, 0x27, 0x39, 0xef, 0x6f, 0xc1, 0x0c, 0x51,
  0x85, 0x63, 0x3f, 0xc3, 0x2f, 0x57, 0xe6, 0x64, 0x0b, 0xa3, 0x75, 0x4a,
  0x03, 0x91, 0x1a, 0x61, 0xc5, 0x09, 0xd5, 0xc4, 0x82, 0x80, 0xb3, 0x88,
  0xa2, 0xc6, 0x44, 0x20, 0xb8, 0x21, 0x4f, 0x98, 0x56, 0x01, 0xc5, 0xcf,
  0xe3, 0xb3, 0xff, 0x4f, 0xa8, 0x81, 0xfb, 0x91, 0x39, 0xab, 0xe7, 0xa8,
  0x83, 0x8c, 0xac, 0xce, 0xfd, 0xc6, 0x3d, 0xe8, 0x3b, 0x6b, 0x72, 0xfd,
  0xff, 0xda, 0xe0, 0xff, 0x49, 0xda, 0xe0, 0xbf, 0x72, 0x4b, 0x7b, 0x92,
  0xd7, 0xcc, 0xd7, 0xd2, 0x64, 0x56, 0x49, 0x1d, 0x4a, 0xb0, 0xe0, 0x60,
  0xf6, 0xd8, 0x8f, 0x5a, 0xe0, 0x8d, 0x9f, 0xb8, 0xa2, 0x3e, 0x29, 0xfc,
  0xbf, 0x71, 0x45, 0x9f, 0x75, 0x33, 0xff, 0x7f, 0xdf, 0xc7, 0xff, 0x6e,
  0xf7, 0x30, 0x40, 0x90, 0x3a, 0xd8, 0x3a, 0x90, 0xd9, 0x3d, 0x66, 0xed,
  0x71, 0xb3, 0x33, 0xb2, 0xb4, 0x37, 0xac, 0xea, 0x83, 0xe5, 0x78, 0xbc,
  0x75, 0xa7, 0x97, 0xdf, 0xbd, 0x20, 0x14, 0x9e, 0x41, 0x33, 0x99, 0xa5,
  0x88, 0xce, 0xde, 0x1c, 0x5d, 0xfe, 0x82, 0xdb, 0xfe, 0x17, 0x72, 0xb3,
  0x2e, 0x92, 0x64, 0xdc, 0xe3, 0xb8, 0xe1, 0x21, 0xfd, 0x23, 0x18, 0x70,
  0x57, 0x74, 0x0d, 0x22, 0x5b, 0x0c, 0x27, 0xfa, 0x79, 0x0c, 0xf4, 0x32,
  0xa8, 0x29, 0x99, 0x60, 0xde, 0x2c, 0xa8, 0xed, 0xb2, 0xe7, 0x63, 0xc9,
  0xb3, 0xf1, 0x86, 0xa8, 0x80, 0xfc, 0x6d, 0x22, 0x15, 0xc9, 0x3f, 0xc1,
  0xeb, 0x3d, 0x45, 0x5c, 0x3c, 0x03, 0x1d, 0xea, 0x3c, 0xc3, 0x99, 0x78,
  0xc1, 0x64, 0xa8, 0x47, 0xbb, 0x14, 0x0e, 0x79, 0x32, 0x7a, 0xdd, 0xee,
  0x16, 0xfa, 0xdf, 0x89, 0x83, 0x24, 0xd5, 0x27, 0x44, 0xdb, 0x68, 0x7e,
  0xbe, 0x2d, 0x9d, 0x66, 0xe5, 0x56, 0xba, 0x27, 0x51, 0xdb, 0x41, 0x8c,
  0x90, 0x73, 0xe8, 0xd0, 0xeb, 0x52, 0xee, 0x7c, 0x93, 0x33, 0x48, 0x78,
  0xbe, 0xe6, 0x13, 0xf5, 0xbd, 0x3c, 0x9d, 0xd4, 0xb7, 0x33, 0x90, 0xbd,
  0xdb, 0xad, 0x65, 0x2b, 0xb9, 0x53, 0x32, 0x71, 0xf2, 0xed, 0x48, 0x5d,
  0xfb, 0x8c, 0x29, 0x21, 0x50, 0x16, 0x7f, 0xf1, 0xb3, 0x29, 0x9d, 0xd7,
  0x9f, 0xea, 0x44, 0x9c, 0x67, 0x55, 0x41, 0x2d, 0x46, 0x34, 0x85, 0xa0,
  0x54, 0xd0, 0xfe, 0xa5, 0xd3, 0xcd, 0x39, 0xa6, 0x42, 0x01, 0xda, 0x35,
  0xbf, 0xdd, 0x26, 0xdf, 0xef, 0xa4, 0x1a, 0xf5, 0xcd, 0xc9, 0x12, 0x80,
  0x21, 0xfc, 0x6a, 0x04, 0x2a, 0xae, 0x76, 0xa4, 0xee, 0x52, 0x0b, 0x37,
  0x6d, 0xce, 0xd6, 0xe2, 0xab, 0xd0, 0x4c, 0x98, 0x4f, 0xdf, 0x9e, 0x6d,
  0x75, 0xff, 0x43, 0x1f, 0x42, 0x42, 0xdd, 0x31, 0x86, 0x2b, 0xc4, 0xc0,
  0xce, 0x08, 0x7c, 0x81, 0x9a, 0x24, 0x63, 0x24, 0x78, 0x32, 0x8b, 0xef,
  0xa5, 0x1e, 0xae, 0xc9, 0xef, 0x07, 0x67, 0xbb, 0xb4, 0xad, 0xd7, 0x67,
  0x03, 0x17, 0x3e, 0xbf, 0xa4, 0x60, 0x3c, 0xd5, 0x3f, 0x7e, 0x7d, 0x72,
  0x34, 0xb8, 0xee, 0x7b, 0x4b, 0xe4, 0x38, 0x70, 0x90, 0x60, 0x98, 0x09,
  0x0f, 0xce, 0x60, 0xad, 0x8f, 0x08, 0x9f, 0x29, 0x75, 0x95, 0x38, 0x39,
  0x9e, 0x9b, 0x8e, 0x8e, 0x76, 0x6e, 0xcc, 0xd9, 0xfd, 0x55, 0x52, 0xf8,
  0x29, 0x49, 0xb0, 0x77, 0xc3, 0x74, 0x86, 0x2b, 0x80, 0x79, 0x81, 0x35,
  0x34, 0x97, 0xa2, 0x09, 0xaa, 0xd2, 0xcf, 0x67, 0x98, 0x49, 0x80, 0x9f,
  0xa9, 0xfb, 0x21, 0x30, 0x21, 0x59, 0xa0, 0x0b, 0xda, 0x0b, 0x91, 0x41,

  0xef, 0xc8, 0xb1, 0xfd, 0x93, 0x99, 0xaa, 0xee, 0x15, 0xc7, 0x9d, 0x9d,
  0x8e, 0x7d, 0x88, 0x6f, 0x84, 0x20, 0x2e, 0x7e, 0xba, 0x77, 0x5c, 0xde,
  0x6a, 0x64, 0x97, 0xfa, 0x8a, 0x62, 0xd4, 0x78, 0x65, 0xce, 0x69, 0xd3,
  0x12, 0x82, 0x83, 0xa6, 0x9a, 0x78, 0xac, 0x8e, 0xf2, 0x8a, 0x23, 0xd0,
  0x01, 0x90, 0x25, 0xb3, 0x8d, 0x15, 0x27, 0xae, 0x99, 0x23, 0x6e, 0xdf,

  0x53, 0x1c, 0x2d, 0xdc, 0x6b, 0x2d, 0x1a, 0xdd, 0x24, 0x20, 0x44, 0xfa,
  0x0e, 0xb2, 0xc3, 0xb3, 0x37, 0xe4, 0x33, 0x0f, 0xfe, 0x2f, 0xb0, 0x3d,
  0xbf, 0x78, 0x43, 0xf6, 0xf6, 0xfc, 0x0d, 0x29, 0x92, 0xbf, 0x8d, 0x43,
  0x58, 0xe8, 0x54, 0x83, 0x42, 0xe5, 0x2f, 0x5c, 0x36, 0x72, 0xc5, 0x80,
  0xee, 0x38, 0xd5, 0x4d, 0x6c, 0x69, 0xa4, 0x79, 0xf4, 0x16, 0x4c, 0x0f,
  0x2d, 0x6c, 0x0c, 0x40, 0xfa, 0xed, 0xd8, 0x15, 0x74, 0xd3, 0x69, 0xbf,
  0x99, 0x86, 0xe1, 0x40, 0x24, 0xbb, 0x59, 0x3e, 0xb2, 0x52, 0x83, 0xc4,
  0x5c, 0x16, 0x6a, 0x8c, 0x83, 0x25, 0xa6, 0xe6, 0xf2, 0xf4, 0x7a, 0x93,
  0x6a, 0x61, 0x16, 0xb6, 0x92, 0x3a, 0xb6, 0xbc, 0xcd, 0x68, 0x59, 0xfa,
  0x75, 0xf1, 0xa8, 0xee, 0xd7, 0x95, 0xab, 0xf7, 0xb3, 0x2d, 0xb1, 0xe7,
  0x0e, 0x27, 0x52, 0x13, 0x6a, 0x99, 0x34, 0x51, 0x6f, 0xdd, 0x06, 0x5b,

  0xb2, 0x2a, 0x1b, 0xe1, 0x33, 0x0f, 0xda, 0x96, 0x5a, 0x64, 0xd4, 0x2c,
  0x58, 0x38, 0xb8, 0x46, 0x47, 0x65, 0x0b, 0xb8, 0xb4, 0x92, 0x0a, 0x1a,
  0xbc, 0xdb, 0x9e, 0x55, 0x60, 0xcd, 0xdf, 0x25, 0x33, 0x2a, 0xf0, 0x4e,
  0xb2, 0x51, 0xf1, 0xb8, 0x70, 0xc1, 0xfb, 0xc7, 0xff, 0xca, 0xfe, 0x6b,
  0x65, 0x10, 0x85, 0x8e, 0x41, 0xf1, 0x01, 0x66, 0xb7, 0xe1, 0xeb, 0x5f,

  0x58, 0xa7, 0x2b, 0xe3, 0x31, 0x1e, 0x29, 0x4a, 0xe1, 0xca, 0xad, 0x15,
  0x40, 0x5b, 0x46, 0x39, 0x37, 0x43, 0x68, 0x0a, 0xd4, 0xc2, 0xc4, 0x77,
  0x20, 0xe3, 0xe6, 0x9a, 0x4a, 0x80, 0x67, 0x9f, 0xfc, 0x4e, 0x97, 0xb7,
  0xeb, 0x6e, 0xc7, 0xe3, 0x09, 0x83, 0xb3, 0x8d, 0xe8, 0x2d, 0xfa, 0x68,
  0xea, 0x4e, 0x78, 0xbc, 0xae, 0xda, 0x9e, 0x6c, 0x87, 0x1d, 0x51, 0x6e,
  0xb7, 0x66, 0x85, 0xc0, 0xf7, 0x52, 0xa8, 0xa8, 0x32, 0x9c, 0xde, 0xb6,
  0x35, 0xba, 0x03, 0x60, 0xad, 0x9c, 0xd8, 0xa8, 0x9e, 0x25, 0xee, 0xa9,
  0xaa, 0xa5, 0xcf, 0xf0, 0xf4, 0xdd, 0x4e, 0x1b, 0x10, 0x7d, 0x5f, 0x7e,
  0x4d, 0x45, 0xec, 0xe3, 0x84, 0xb0, 0xdc, 0x15, 0x4b, 0x13, 0x2b, 0xb8,
  0x98, 0xde, 0x28, 0xab, 0x17, 0xdd, 0xd3, 0x2f, 0xb6, 0x5f, 0xbe, 0xd8,
  0x58, 0xd5, 0xa5, 0x1c, 0x7b, 0xf7, 0x60, 0x71, 0x2e, 0x93, 0x10, 0xfe,

  0x6b, 0xa7, 0xef, 0x6e, 0x50, 0x64, 0x3b, 0x9b, 0x48, 0x91, 0xb5, 0x2f,
  0xe1, 0x40, 0xdc, 0x20, 0x49, 0xd0, 0x46, 0x68, 0xbb, 0x07, 0x22, 0x16,
  0x5e, 0x17, 0xda, 0x32, 0x72, 0xcb, 0x89, 0x94, 0x9b, 0x46, 0xa1, 0x87,
  0x44, 0x4f, 0x46, 0x62, 0x6f, 0x57, 0xe7, 0xc0, 0xd2, 0xd3, 0x6d, 0xcf,
  0xc9, 0x93, 0xa5, 0xbf, 0xf7, 0xeb, 0xff, 0x72, 0x83, 0x99, 0x76, 0x80,
  0x5f, 0x73, 0xca, 0xbb, 0xbf, 0xc3, 0x29, 0xef, 0xae, 0x3e, 0xe5, 0xdd,
  0xe7, 0x9e, 0xf2, 0xcb, 0xfd, 0x17, 0x9f, 0xff, 0x8a, 0x53, 0x76, 0x76,
  0xf8, 0xbf, 0xed, 0x94, 0x1d, 0x4a, 0xfb, 0x75, 0xa7, 0x2c, 0x49, 0x21,
  0xcd, 0x82, 0x4c, 0x49, 0x7e, 0xa1, 0xb4, 0x56, 0x84, 0xd2, 0xe0, 0x32,
  0x16, 0x7e, 0xd6, 0xaf, 0xb3, 0x92, 0xe6, 0x93, 0xdc, 0xf4, 0x0e, 0xf5,
  0xb0, 0x80, 0x91, 0x6d, 0xa1, 0x45, 0x48, 0xc3, 0x5d, 0xcc, 0xb0, 0x77,
  0xda, 0x5a, 0x6f, 0x4d, 0xdd, 0x23, 0x5a, 0x3e, 0xa9, 0xb8, 0x58, 0xfc,
  0x39, 0x38, 0xea, 0xdf, 0x11, 0x55, 0xcd, 0xcf, 0x99, 0x71, 0xb2, 0x9e,
  0xea, 0x9b, 0xf6, 0x38, 0x03, 0x33, 0x81, 0x73, 0x90, 0x82, 0xd9, 0x6f,
  0x82, 0xfc, 0x6e, 0x90, 0x9d, 0xd4, 0x51, 0x33, 0x04, 0xa5, 0x10, 0xa4,
  0x40, 0x86, 0x49, 0x3d, 0x8f, 0xb3, 0x44, 0x0a, 0x88, 0x71, 0xd1, 0x48,
  0x19, 0x68, 0xca, 0x37, 0x5d, 0xc2, 0xd2, 0x2b, 0xa8, 0x91, 0xb1, 0xd4,
  0x17, 0x77, 0x39, 0xa8, 0x67, 0xb5, 0xc9, 0x50, 0x10, 0xa0, 0x84, 0x5b,
  0x32, 0xba, 0xe1, 0xfe, 0x22, 0x01, 0xb0, 0x9f, 0x55, 0x09, 0x7e, 0xcd,

  0x84, 0xbb, 0x96, 0xde, 0x44, 0xc1, 0x0e, 0x54, 0xd8, 0xa7, 0xaa, 0xde,
  0xa8, 0x8a, 0x73, 0xc4, 0x19, 0x51, 0x8f, 0x14, 0xfe, 0x66, 0xef, 0x27,
  0x69, 0x1c, 0xe5, 0x15, 0x22, 0xa3, 0x4c, 0x97, 0x05, 0xd5, 0x9b, 0x2e,
  0xd9, 0x6c, 0x42, 0xdd, 0x99, 0xa7, 0x6b, 0x66, 0x30, 0xe9, 0x5c, 0x7a,
  0x6e, 0xab, 0x90, 0x64, 0x13, 0xfc, 0x0d, 0x9e, 0xee, 0x78, 0x39, 0x5f,
  0x28, 0x18, 0x22, 0x56, 0x37, 0xa5, 0x54, 0x46, 0x27, 0x80, 0x08, 0x94,
  0x74, 0x1d, 0x70, 0xa3, 0x19, 0x2f, 0x93, 0x24, 0xb7, 0xb1, 0xc7, 0x4a,
  0xcf, 0x4a, 0x80, 0x3d, 0x78, 0x01, 0x94, 0xb8, 0x46, 0xa5, 0x44, 0x88,
  0xaf, 0x96, 0x4c, 0xbc, 0xd4, 0x03, 0x6a, 0x54, 0x4b, 0xd1, 0xc9, 0x64,
  0xb8, 0x9c, 0x2a, 0xa6, 0x80, 0x69, 0x70, 0x57, 0xa7, 0x4a, 0xaa, 0xbf,
  0x42, 0x94, 0xa1, 0xa4, 0xcb, 0xc9, 0xf0, 0x8f, 0x3e, 0xb8, 0x4a, 0x85,
  0xdd, 0x1d, 0x47, 0xab, 0x92, 0xc3, 0xbc, 0x85, 0x13, 0xb1, 0xd7, 0x56,
  0x4e, 0x3f, 0xa9, 0x35, 0x1e, 0x0b, 0xb4, 0xce, 0x72, 0x49, 0xa5, 0x1a,
  0x2d, 0x7a, 0x93, 0x18, 0xa1, 0x49, 0xbd, 0xc2, 0x72, 0x49, 0x08, 0x95,
  0x2b, 0x70, 0x7d, 0x7c, 0x19, 0xbd, 0x8d, 0xa5, 0xdd, 0x50, 0xb4, 0x0e,
  0x1c, 0xf8, 0xe5, 0xde, 0xf6, 0xee, 0xc6, 0x4a, 0x3d, 0xbc, 0x0e, 0xb7,
  0x45, 0xdf, 0xca, 0xf2, 0x50, 0xc2, 0xfa, 0xf5, 0x12, 0xcc, 0x66, 0xc5,
  0xf1, 0x81, 0x2f, 0x7d, 0x3c, 0xbf, 0x78, 0x73, 0x72, 0x76, 0xf4, 0x17,
  0x83, 0x1a, 0x81, 0x9b, 0xa0, 0x95, 0xc7, 0x1f, 0xc1, 0x7c, 0x7d, 0xfc,
  0x58, 0x26, 0x30, 0xe7, 0x6a, 0x7d, 0x77, 0x03, 0x2b, 0xf7, 0xbc, 0xa6,
  0x90, 0xd3, 0xa4, 0x8e, 0xb5, 0xc1, 0xf5, 0x03, 0x2b, 0x00, 0xa3, 0x8c,
  0x83, 0x72, 0xab, 0xbf, 0x23, 0x5d, 0x47, 0xa4, 0x6d, 0x82, 0xe5, 0x59,
  0x4e, 0xe3, 0x94, 0x58, 0x60, 0xe5, 0xb8, 0x36, 0xd7, 0xaf, 0xd0, 0x42,
  0x60, 0x8f, 0x74, 0x94, 0xa2, 0xb5, 0x22, 0xd7, 0x3a, 0xc5, 0x30, 0xfc,
  0xa4, 0x0e, 0x4b, 0x49, 0xc5, 0xbb, 0xf8, 0x8b, 0xd5, 0x61, 0xe5, 0x3a,
  0xef, 0xaf, 0x48, 0x58, 0x24, 0xb3, 0x2c, 0xa9, 0x7a, 0x32, 0xb1, 0x43,
  0xf8, 0xf3, 0xf5, 0x5d, 0x3c, 0xf3, 0x4a, 0xc2, 0xb1, 0xa7, 0xa2, 0x52,
  0xa6, 0x61, 0x45, 0xf8, 0xa6, 0xd3, 0x71, 0x65, 0x60, 0x5a, 0x8f, 0xe8,
  0x93, 0x70, 0x55, 0xbc, 0x0e, 0x23, 0xd7, 0xd7, 0x7f, 0xb9, 0x3c, 0x79,
  0x7d, 0x88, 0x8c, 0xec, 0x4b, 0xac, 0x3d, 0x29, 0x6b, 0x7c, 0x2d, 0xc2,
  0x1e, 0xee, 0xde, 0x1a, 0x7e, 0x78, 0x73, 0x3a, 0xb8, 0x3c, 0xbb, 0x38,
  0x7e, 0x7d, 0xf8, 0x03, 0xda, 0x94, 0x20, 0x3c, 0x1e, 0x9d, 0x77, 0xcd,
  0xcf, 0x4c, 0x17, 0x05, 0x1f, 0x50, 0xe4, 0xe4, 0xfb, 0x8f, 0x27, 0xe7,
  0xdf, 0xbd, 0x3e, 0xbc, 0x8b, 0x8b, 0x2e, 0xae, 0x8f, 0xdf, 0x6e, 0x69,
  0x58, 0x5a, 0x23, 0x35, 0x54, 0xcf, 0x87, 0xb3, 0xdb, 0x32, 0xfd, 0x7b,
  0x12, 0xc1, 0xeb, 0xb3, 0xa5, 0x0f, 0x63, 0x7e, 0xcd, 0x38, 0x0c, 0xb0,
  0x19, 0xf8, 0xb7, 0xe8, 0xeb, 0xb3, 0x6f, 0x11, 0x2a, 0xd7, 0xf8, 0x49,
  0xe7, 0xdc, 0x77, 0x29, 0xfa, 0x72, 0x7f, 0x7b, 0x67, 0xc3, 0x76, 0xfb,
  0x24, 0xa8, 0x6d, 0x98, 0xf1, 0xad, 0x57, 0x35, 0xf5, 0x77, 0xa9, 0xff,
  0xb2, 0xb5, 0x0c, 0x95, 0xb5, 0xa8, 0xb8, 0xfc, 0x40, 0x5c, 0x4e, 0x94,
  0x9c, 0x4f, 0xf9, 0xaf, 0xd8, 0x2c, 0xb5, 0xa0, 0xb4, 0x75, 0xcf, 0xe3,
  0x76, 0xfd, 0xd6, 0xc1, 0xb8, 0xf9, 0xda, 0x92, 0x1e, 0x4c, 0x47, 0xbc,
  0x76, 0x2b, 0xe5, 0xe3, 0x27, 0x8c, 0xe5, 0x34, 0x4d, 0x4a, 0xda, 0x6c,
  0x10, 0x69, 0x42, 0x3f, 0xe1, 0x7d, 0x76, 0x72, 0x7c, 0xa8, 0x02, 0x2c,
  0x67, 0x6c, 0x46, 0x5a, 0xa5, 0x12, 0x9e, 0x42, 0x0a, 0x3c, 0xe1, 0xc3,
  0x4b, 0xe7, 0x58, 0x7b, 0x9c, 0x94, 0x91, 0xfa, 0x77, 0x1c, 0xef, 0xcd,
  0x2c, 0x99, 0xc6, 0xa3, 0x47, 0x83, 0x30, 0x4d, 0x07, 0x32, 0x6e, 0xde,
  0x4e, 0xf2, 0xf0, 0x8d, 0xd0, 0x98, 0x03, 0x11, 0x3c, 0x25, 0xf6, 0xcc,
  0x50, 0x2a, 0x70, 0x5d, 0x8d, 0xd3, 0x87, 0xa7, 0x66, 0xc0, 0x62, 0x54,

  0x5c, 0xe2, 0xa6, 0x36, 0xa5, 0x73, 0x7d, 0x8b, 0x1b, 0xd4, 0x87, 0x64,
  0x43, 0xed, 0x88, 0x57, 0xee, 0xe9, 0x5e, 0xdd, 0x63, 0xfe, 0x77, 0xba,
  0xe4, 0x88, 0xc2, 0x45, 0x4e, 0xd9, 0x43, 0xfc, 0x6b, 0x18, 0x87, 0x9f,
  0xda, 0x73, 0x91, 0xdb, 0x82, 0xdb, 0x4d, 0x73, 0xd3, 0x03, 0x5c, 0xb6,
  0xa9, 0x2f, 0x90, 0xb6, 0x36, 0x08, 0xe7, 0x5e, 0x59, 0x77, 0x7a, 0x18,
  0xe3, 0xce, 0x38, 0xb5, 0x81, 0x3c, 0x59, 0x58, 0x21, 0x65, 0xb4, 0x8c,
  0x67, 0x0a, 0x74, 0xf1, 0xf7, 0x01, 0xc7, 0xa6, 0x24, 0x23, 0x1c, 0xe2,
  0x58, 0xc8, 0x12, 0x51, 0x27, 0x81, 0x9d, 0xfa, 0x52, 0xa3, 0x3e, 0xd4,
  0xf9, 0x28, 0x17, 0xe4, 0x35, 0x7a, 0x88, 0x91, 0x64, 0x4a, 0x1f, 0x86,
  0x83, 0xb3, 0xdb, 0xd5, 0x71, 0xc0, 0x09, 0x1a, 0x18, 0x52, 0x33, 0xb0,
  0xd2, 0x30, 0xcd, 0x52, 0xb5, 0x52, 0x2c, 0x82, 0x24, 0x33, 0xdd, 0x02,
  0xcf, 0x06, 0xb0, 0x08, 0x9c, 0xaa, 0x3d, 0x05, 0x04, 0xe7, 0x95, 0x49,
  0x3a, 0x02, 0x4d, 0x68, 0x7d, 0x8e, 0x0b, 0x91, 0xfe, 0x04, 0xdc, 0x0c,
  0xa2, 0xad, 0x61, 0x7b, 0x43, 0x4a, 0xc1, 0x98, 0x38, 0x82, 0x48, 0x28,
  0x92, 0x49, 0x0c, 0xcb, 0xd0, 0xd8, 0x8d, 0x40, 0xf5, 0x71, 0xc5, 0x49,
  0xfc, 0x4d, 0x11, 0x85, 0xa0, 0xe2, 0x9a, 0x3a, 0x5f, 0x1b, 0x41, 0xca,
  0x9c, 0xa9, 0x13, 0xdd, 0x7a, 0xcf, 0xb6, 0x08, 0x4b, 0x2b, 0xa3, 0xb2,
  0x05, 0x20, 0x77, 0x0c, 0xf0, 0xb9, 0x01, 0x6e, 0x63, 0xd7, 0xa7, 0xd2,
  0x87, 0x50, 0x04, 0x7e, 0x6c, 0x93, 0x4b, 0x3f, 0x95, 0x05, 0xa5, 0x81,
  0xd2, 0x73, 0x6f, 0xb0, 0x2c, 0xb9, 0x77, 0x07, 0xb3, 0x76, 0x87, 0x19,
  0xf0, 0x53, 0x7a, 0xbb, 0xc1, 0x66, 0xc2, 0x7a, 0xb5, 0xe8, 0xf0, 0xbb,

  0x93, 0xab, 0xc1, 0xe9, 0xc5, 0xf9, 0x97, 0x41, 0x73, 0x58, 0x7e, 0x69,
  0x5a, 0xbd, 0x69, 0xa5, 0xab, 0x6d, 0xc7, 0x85, 0x5e, 0x30, 0xf5, 0xb5,
  0x70, 0x57, 0xa7, 0x34, 0xc3, 0x47, 0xbc, 0x2e, 0x5f, 0xa3, 0x64, 0x51,
  0x91, 0xbe, 0xa4, 0xb6, 0x34, 0xed, 0x12, 0xc5, 0x2d, 0xa8, 0x0f, 0x0c,
  0xd9, 0x70, 0x58, 0xea, 0x26, 0xb6, 0x9d, 0xf9, 0xdb, 0x4e, 0x00, 0xe6,
  0x8d, 0x7f, 0xb3, 0xeb, 0x6d, 0x50, 0x38, 0x61, 0xc7, 0x89, 0x97, 0x2f,
  0x17, 0x5c, 0x25, 0x89, 0x60, 0x26, 0x0c, 0x7c, 0xe4, 0x2e, 0xc0, 0xeb,
  0xdb, 0xd0, 0xdf, 0xaa, 0xbf, 0x08, 0x0f, 0xdf, 0x6d, 0x3b, 0x15, 0x2c,
  0xe6, 0xb9, 0xed, 0xd0, 0x73, 0xdb, 0xfe, 0x73, 0x3b, 0xa1, 0xe7, 0x76,
  0xfc, 0xe7, 0x76, 0x43, 0xcf, 0x39, 0xeb, 0x75, 0xcc, 0x78, 0xd9, 0xb9,
  0x55, 0x96, 0x71, 0xed, 0x5f, 0xbb, 0x7d, 0x7b, 0xfc, 0x9f, 0x19, 0x6f,
  0x45, 0xb3, 0x51, 0xad, 0x63, 0xd8, 0xab, 0x5d, 0xdf, 0x6e, 0xd6, 0x2b,
  0x9f, 0xd6, 0xe1, 0x40, 0x4d, 0x6c, 0xb8, 0x98, 0xe1, 0x7b, 0xdb, 0xbb,
  0xbd, 0x51, 0xba, 0xb8, 0x41, 0xa9, 0x73, 0xa8, 0xad, 0xdd, 0x70, 0xf3,
  0x71, 0xb1, 0xf2, 0x8b, 0x25, 0x9a, 0xe4, 0xbe, 0x1e, 0x72, 0x36, 0xd8,

  0x88, 0x1c, 0xbc, 0x22, 0x81, 0xe8, 0xa4, 0x57, 0x22, 0x7e, 0xc7, 0xa2,
  0x15, 0xf9, 0x0e, 0x66, 0xaf, 0xd4, 0xc5, 0xb8, 0x6f, 0xe0, 0x3d, 0x99,

  0x00, 0x93, 0xae, 0xce, 0x4a, 0xa7, 0x29, 0x63, 0x33, 0xaa, 0xae, 0x86,
  0xde, 0x9b, 0xae, 0x5d, 0xea, 0x71, 0xa1, 0xaf, 0x28, 0xc6, 0x1d, 0xf6,
  0x66, 0xcb, 0x1a, 0xab, 0xe3, 0xe1, 0x8c, 0xca, 0x9d, 0x67, 0x21, 0x51,

  0xf9, 0xe1, 0xea, 0xcc, 0x53, 0x2d, 0x23, 0x74, 0xcd, 0x94, 0x07, 0x9b,
  0x9b, 0xd4, 0x60, 0xfc, 0x26, 0x7e, 0x78, 0xe8, 0x97, 0xc9, 0x26, 0xf0,
  0x93, 0x72, 0x93, 0xfc, 0xbd, 0xf2, 0xe9, 0x9b, 0x6a, 0x3e, 0x5b, 0xe5,
  0xa8, 0x4d, 0x4b, 0xc5, 0x94, 0x65, 0x2c, 0xc6, 0x31, 0xa3, 0x2e, 0xd8,
  0x22, 0x6d, 0xba, 0x90, 0x7c, 0xc0, 0x9a, 0x74, 0xd7, 0x6c, 0xf8, 0xc1,
  0x9d, 0x54, 0xa9, 0x8f, 0xf3, 0x36, 0xca, 0x3e, 0x12, 0x98, 0x06, 0xa2,
  0x95, 0x4d, 0x48, 0xce, 0x7c, 0xb0, 0xd8, 0x39, 0xf8, 0x02, 0xd6, 0xd3,
  0x26, 0x5e, 0x38, 0xc3, 0x80, 0xe4, 0x14, 0x04, 0x8a, 0x4f, 0xbe, 0x82,
  0xd0, 0x9e, 0x95, 0x6e, 0xe0, 0x03, 0xdd, 0x03, 0xb2, 0xe4, 0xa0, 0x9a,
  0xf1, 0x89, 0x99, 0x26, 0xa6, 0xe4, 0xa1, 0x32, 0x0f, 0x2a, 0x07, 0xfc,
  0xf7, 0x4b, 0xbf, 0xe8, 0x3c, 0xa2, 0x25, 0x78, 0xa9, 0x7b, 0xa8, 0xff,
  0x63, 0xd9, 0x17, 0xef, 0x3f, 0x7f, 0xcf, 0x6d, 0x8f, 0x41, 0xe6, 0x45,
  0x30, 0x7c, 0x44, 0xc7, 0xd2, 0x19, 0x5c, 0x5d, 0x76, 0xba, 0x12, 0xad,
  0x87, 0x0f, 0xf4, 0xe0, 0xdf, 0x11, 0x59, 0x99, 0xd8, 0x5e, 0x67, 0x7f,
  0x4f, 0x12, 0xeb, 0x78, 0x8e, 0xdc, 0x64, 0xce, 0x0f, 0x1f, 0xd1, 0x2f,
  0x4d, 0x72, 0x21, 0x77, 0xa1, 0xb5, 0xd5, 0xa8, 0x60, 0x00, 0xd6, 0x57,
  0xc8, 0x29, 0x3f, 0x5d, 0x0b, 0xbc, 0x1e, 0x56, 0xeb, 0x0c, 0xec, 0x23,
  0xd0, 0x0c, 0x4d, 0xb3, 0xdf, 0x08, 0x10, 0xe4, 0xc5, 0xad, 0xb4, 0x02,
  0x91, 0x30, 0x07, 0x33, 0x17, 0xaf, 0xfb, 0x72, 0xc3, 0x8b, 0xe8, 0x50,

  0x23, 0xbb, 0x58, 0x75, 0xd9, 0xb2, 0x63, 0x0a, 0x83, 0xd7, 0xd2, 0x62,
  0x58, 0x69, 0x15, 0x36, 0xec, 0x9b, 0x6c, 0x89, 0x67, 0x42, 0xa3, 0x34,
  0x06, 0x79, 0x02, 0xab, 0x66, 0xaf, 0x71, 0xfa, 0xba, 0x79, 0x81, 0x63,
  0x37, 0xfb, 0x8a, 0x47, 0x44, 0x16, 0x8d, 0x56, 0x68, 0xe3, 0xb7, 0x1b,
  0xe4, 0x60, 0x91, 0x01, 0xdb, 0xaa, 0xc9, 0x14, 0x5b, 0xc6, 0x39, 0x90,

  0xbe, 0x06, 0xdf, 0x84, 0x4d, 0xdb, 0xb3, 0x76, 0xfa, 0x61, 0x3c, 0xbd,
  0x20, 0x77, 0x3d, 0xf4, 0x76, 0x30, 0xe1, 0x9a, 0x28, 0x59, 0x33, 0x52,
  0xa3, 0x67, 0x2d, 0x4a, 0xd6, 0xf4, 0x2b, 0x97, 0x24, 0x2e, 0xe6, 0x26,
  0x8d, 0xe2, 0xca, 0x7c, 0xdf, 0xd7, 0xb3, 0x16, 0x5a, 0x5b, 0x29, 0x8a,
  0xc8, 0xb0, 0x60, 0x09, 0xb8, 0xfc, 0x1d, 0x9d, 0x80, 0x74, 0x00, 0xe5,
  0x74, 0x4f, 0x56, 0x55, 0x50, 0x88, 0x4f, 0x5c, 0xff, 0x38, 0x88, 0xf6,
  0x31, 0xf1, 0x51, 0x8d, 0xd0, 0x61, 0x2a, 0x9f, 0x20, 0xed, 0x9e, 0x3f,
  0x5f, 0x33, 0xe3, 0x08, 0x16, 0x4a, 0xd5, 0x46, 0xf6, 0xa2, 0x44, 0x9c,
  0xad, 0xde, 0x18, 0xee, 0x23, 0x5e, 0xae, 0x8f, 0xc2, 0x78, 0x48, 0x89,
  0xc2, 0xcb, 0x4c, 0xc0, 0x99, 0x29, 0xb6, 0x5f, 0x88, 0x09, 0x0a, 0x15,
  0x63, 0x05, 0x25, 0x35, 0x8e, 0x69, 0xf6, 0x30, 0x6a, 0x0a, 0x0d, 0x18,
  0x06, 0x6e, 0x21, 0x36, 0xbc, 0x56, 0x7f, 0xac, 0x6a, 0x8b, 0x0d, 0x50,
  0x35, 0x6a, 0x1b, 0x62, 0x94, 0x42, 0xd9, 0x35, 0x4f, 0xf7, 0x7f, 0xaa,
  0x1a, 0xda, 0x57, 0x15, 0x50, 0x83, 0xf9, 0x95, 0x87, 0xb5, 0xfd, 0x7f,
  0xd8, 0x61, 0x6d, 0xff, 0xdf, 0x70, 0x58, 0x3b, 0xbf, 0xf2, 0xb0, 0x76,
  0xfe, 0x0f, 0x3b, 0xac, 0x9d, 0xff, 0x1b, 0x0e, 0x6b, 0xf7, 0x57, 0x1e,
  0xd6, 0xee, 0x6f, 0x7e, 0x58, 0xe7, 0xf8, 0x7b, 0x62, 0xfb, 0xaa, 0xf5,
  0xa5, 0x65, 0x53, 0x29, 0x1a, 0x3e, 0x52, 0xf3, 0xf9, 0x21, 0x6e, 0x88,
  0x18, 0x0c, 0xa2, 0x4c, 0x96, 0x4d, 0xab, 0xe9, 0xa8, 0x32, 0xb8, 0x52,
  0xa6, 0x43, 0x8a, 0x84, 0xa0, 0x04, 0xad, 0x1e, 0x35, 0x9e, 0xaf, 0x73,
  0xf4, 0xa0, 0x80, 0x66, 0xd0, 0x8d, 0xce, 0x07, 0x03, 0x4e, 0x3b, 0x1a,
  0x50, 0xe8, 0xb4, 0x79, 0x58, 0xe8, 0x8c, 0x24, 0x1b, 0x67, 0x1d, 0xd5,
  0xc6, 0x0b, 0x98, 0xa1, 0x65, 0x2e, 0xfc, 0xde, 0x3c, 0x1e, 0xe1, 0x8f,
  0xb7, 0xfa, 0xdb, 0x76, 0x73, 0x36, 0x7e, 0x01, 0x10, 0x9c, 0x8d, 0x6b,
  0x06, 0xad, 0xef, 0x00, 0x64, 0x3b, 0x66, 0x6a, 0xa0, 0x96, 0x5a, 0x3f,
  0x9a, 0x07, 0x01, 0x7d, 0x53, 0xc3, 0xa6, 0x1d, 0x1c, 0x9c, 0x3a, 0xc0,
  0x49, 0x68, 0x9a, 0x88, 0x5a, 0x1d, 0xa8, 0x94, 0x83, 0xc1, 0x38, 0x46,
  0xbe, 0xf4, 0x6b, 0x06, 0xef, 0xd2, 0x29, 0x62, 0xe1, 0xfd, 0xd2, 0xc8,
  0xb2, 0x13, 0xc5, 0xfd, 0x6f, 0x8b, 0x2c, 0x3f, 0xcb, 0x3e, 0x76, 0xaf,
  0x4c, 0xd1, 0xd3, 0xd6, 0x6a, 0x61, 0xfc, 0x76, 0xeb, 0x58, 0xc4, 0x4a,
  0x20, 0x82, 0x76, 0x1c, 0x33, 0xe9, 0x60, 0xa6, 0xcd, 0x89, 0xbc, 0x6b,
  0xe3, 0x7b, 0x6c, 0xc6, 0xf8, 0xf8, 0x4b, 0xb9, 0x66, 0xdd, 0x1b, 0xc4,
  0x21, 0x85, 0xb6, 0xe0, 0x55, 0x96, 0x4c, 0x71, 0xcb, 0x4c, 0x3f, 0x63,
  0x31, 0x22, 0x08, 0xfb, 0xcc, 0x4b, 0x3f, 0x18, 0x25, 0x8c, 0x8c, 0x95,
  0x3e, 0xa5, 0x29, 0xbd, 0xa8, 0xaf, 0x37, 0x1e, 0x25, 0xbd, 0xb8, 0x1c,
  0xa5, 0x69, 0xb8, 0xb5, 0xab, 0xc6, 0x81, 0x31, 0xf1, 0x86, 0x3c, 0xf8,
  0xf0, 0x7c, 0x84, 0x31, 0x37, 0xed, 0xd4, 0x8e, 0xfc, 0x90, 0xb0, 0xa2,
  0x70, 0xba, 0xf9, 0xb2, 0x9a, 0xe6, 0xea, 0xcc, 0xef, 0x06, 0x1c, 0x83,
  0x18, 0x95, 0xa3, 0x23, 0x86, 0xd3, 0x19, 0x15, 0xe9, 0x82, 0x70, 0x68,
  0xdd, 0xb6, 0x70, 0x5d, 0xd3, 0x35, 0x9d, 0x9c, 0x6d, 0x12, 0x3d, 0xe5,
  0x26, 0xe2, 0x1f, 0x3c, 0x03, 0xb5, 0xd3, 0xeb, 0xa0, 0x5b, 0xd3, 0x74,
  0xd3, 0x82, 0x77, 0x11, 0x3d, 0xdc, 0x89, 0x5b, 0x46, 0x0a, 0x7a, 0xd4,
  0x12, 0x86, 0xd7, 0x30, 0x06, 0x90, 0xd0, 0xa3, 0x22, 0x54, 0x53, 0xc3,
  0x10, 0x0d, 0x4f, 0xa2, 0x00, 0x80, 0x3b, 0x88, 0xee, 0xf5, 0x5c, 0x90,
  0x3a, 0x6e, 0x92, 0x07, 0xae, 0x23, 0xf5, 0x4d, 0x2e, 0x06, 0x36, 0xc4,
  0x78, 0xaa, 0x84, 0xce, 0x8f, 0x06, 0xc7, 0xa7, 0xa7, 0xb5, 0xaa, 0x53,
  0xdc, 0x3c, 0x86, 0xb7, 0x25, 0x68, 0x90, 0x12, 0x61, 0x7e, 0x31, 0x68,
  0x1b, 0x8a, 0xc2, 0x73, 0xaf, 0x48, 0xb8, 0x7e, 0x14, 0x79, 0x01, 0x4e,

  0x90, 0x6a, 0x27, 0xcf, 0x58, 0x0c, 0x8f, 0x0c, 0xa6, 0x99, 0x22, 0xf8,
  0xda, 0xcd, 0x72, 0x1e, 0x67, 0x9f, 0x1e, 0x39, 0x2e, 0x5c, 0xcc, 0x21,

  0xbb, 0xc5, 0xf7, 0xca, 0x8d, 0xf4, 0xfa, 0xb4, 0x16, 0x68, 0xcc, 0x71,
  0x59, 0x48, 0xdb, 0x46, 0x46, 0x52, 0x93, 0xce, 0x1a, 0xb0, 0x4c, 0xc2,

  0xb9, 0xe4, 0x91, 0x61, 0xad, 0x1a, 0x3c, 0x66, 0xd0, 0x7a, 0x61, 0x24,
  0x78, 0x67, 0x9a, 0x4e, 0x41, 0x0e, 0xa3, 0xad, 0xac, 0x96, 0xdb, 0x6e,

  0x8a, 0x4a, 0xfa, 0xc8, 0xef, 0x79, 0x03, 0xdc, 0x0b, 0xf0, 0x24, 0xfd,
  0xcb, 0x05, 0x68, 0xb9, 0x01, 0x54, 0x29, 0x63, 0x9b, 0xd0, 0x3d, 0x7d,
  0x09, 0x48, 0x17, 0xe9, 0xfc, 0xa9, 0x13, 0x6e, 0xdd, 0xf2, 0x8c, 0x9b,
  0x54, 0x03, 0x60, 0xf9, 0x7d, 0x29, 0x2d, 0x80, 0x08, 0xe3, 0x30, 0x31,
  0xf7, 0x4c, 0x97, 0x59, 0xfa, 0x40, 0x05, 0x1d, 0xa0, 0x4a, 0x1c, 0x62,

  0xdb, 0x92, 0x96, 0x96, 0x1c, 0xc7, 0xac, 0xd8, 0x44, 0x5a, 0x9f, 0x42,
  0xab, 0xf8, 0x00, 0x2f, 0x83, 0xca, 0x38, 0xc7, 0xfc, 0x1e, 0x1e, 0xa3,
  0xeb, 0x62, 0xa3, 0x13, 0x5b, 0x0f, 0xe4, 0x07, 0x65, 0x49, 0x85, 0xfe,
  0x8f, 0x95, 0x91, 0xad, 0x7a, 0xb4, 0xf0, 0x9a, 0x10, 0xc1, 0x16, 0x58,
  0x34, 0xb0, 0xa2, 0xc3, 0x36, 0x07, 0xfc, 0x9c, 0x14, 0x7d, 0x17, 0x52,
  0x1b, 0x23, 0x59, 0xb6, 0x11, 0x97, 0xd0, 0x8f, 0x48, 0x7d, 0x6a, 0xcb,
  0x12, 0x4a, 0x65, 0x32, 0xfd, 0x83, 0x6c, 0xf7, 0xad, 0xb4, 0x19, 0x99,

  0xa0, 0xfe, 0x4e, 0x36, 0x7c, 0x2b, 0x9d, 0x31, 0x7d, 0xd9, 0xdd, 0x68,

  0x03, 0xd6, 0x77, 0x3a, 0x12, 0xd7, 0xba, 0x94, 0x11, 0x4e, 0x61, 0x3a,
  0x43, 0xf2, 0xdf, 0xd4, 0xec, 0x86, 0x99, 0x9f, 0x7b, 0x6f, 0x5b, 0x5f,
  0x31, 0xab, 0xc3, 0x42, 0x2f, 0x8a, 0x70, 0xe2, 0xbf, 0x8f, 0x59, 0xbd,
  0x67, 0xb7, 0x75, 0x7d, 0x11, 0xd2, 0xce, 0xae, 0xa9, 0xbe, 0x38, 0xf1,
  0xe7, 0x1b, 0xec, 0x86, 0xae, 0xf3, 0x2a, 0x98, 0x10, 0xeb, 0xfd, 0xee,
  0x35, 0xa4, 0xed, 0xf4, 0xf3, 0xf1, 0xf2, 0x9a, 0x4d, 0xeb, 0x2c, 0x51,
  0xa3, 0x18, 0x79, 0x16, 0x8b, 0xed, 0xb0, 0x81, 0x08, 0xe6, 0xe9, 0x99,
  0xe6, 0xcb, 0x7c, 0xb0, 0xdc, 0xb6, 0x5d, 0x6a, 0x7a, 0x3d, 0x64, 0xdd,
  0x74, 0x56, 0xab, 0x9b, 0x10, 0x57, 0xad, 0x96, 0x6a, 0xad, 0x83, 0xb2,
  0xce, 0x4a, 0x1b, 0x5f, 0x1e, 0x6c, 0xfe, 0xa1, 0xd0, 0xec, 0xed, 0xb0,

  0xdd, 0x41, 0x78, 0xa7, 0x7a, 0x02, 0x1b, 0x72, 0x8e, 0xf5, 0x58, 0xd1,
  0x4d, 0x31, 0x56, 0xb6, 0xa1, 0x6a, 0x27, 0xdc, 0xf0, 0x34, 0x73, 0xc9,
  0xdd, 0x8b, 0x6e, 0x49, 0x03, 0x30, 0x61, 0x4b, 0xd1, 0x91, 0xa0, 0xca,
  0x27, 0xe8, 0xea, 0x6c, 0x7e, 0xa7, 0xef, 0x7e, 0x87, 0x8b, 0x65, 0x36,
  0x3c, 0x00, 0xb7, 0xc7, 0x66, 0x77, 0x72, 0xf3, 0x6d, 0x9c, 0xa7, 0xd6,
  0x84, 0xcb, 0xcc, 0x28, 0xb9, 0x18, 0x33, 0xab, 0x29, 0xf1, 0xc0, 0xbf,


  0x89, 0x04, 0x52, 0x60, 0x8d, 0x3c, 0x02, 0x98, 0x95, 0x3e, 0x42, 0x9c,
  0x71, 0x2d, 0x1c, 0x8d, 0x51, 0x64, 0x65, 0xb5, 0x18, 0xcc, 0x65, 0x68,
  0x51, 0xcf, 0x53, 0x49, 0xfd, 0x0d, 0x83, 0xcd, 0xac, 0xdc, 0x92, 0x41,
  0xe4, 0x68, 0xfe, 0x75, 0x36, 0xad, 0x02, 0xb1, 0xf7, 0x50, 0xae, 0x3d,
  0x52, 0xda, 0xfa, 0xb1, 0x08, 0xda, 0x7e, 0x74, 0x82, 0x6f, 0xf8, 0x83,
  0xfd, 0x59, 0x3a, 0x18, 0xa5, 0x6e, 0x37, 0xd0, 0x7b, 0xba, 0x0c, 0x4d,
  0xba, 0x12, 0xca, 0x93, 0xd6, 0x0e, 0x54, 0xdf, 0xdf, 0x97, 0x46, 0x57,
  0xa8, 0xb4, 0xab, 0x9a, 0x19, 0x75, 0xa6, 0xb3, 0x7c, 0x38, 0x84, 0x85,
  0x77, 0x1c, 0xa5, 0x14, 0xbe, 0xec, 0xf9, 0x92, 0xdd, 0x79, 0x80, 0x65,
  0x35, 0x25, 0x63, 0xba, 0xcb, 0x79, 0x69, 0xd2, 0x1c, 0x01, 0x05, 0xb2,
  0x3a, 0xf9, 0xe5, 0xfb, 0x8a, 0x85, 0x1e, 0x90, 0x33, 0x92, 0x21, 0x2f,
  0x84, 0x81, 0x0b, 0xab, 0xb9, 0xfd, 0xa9, 0x9c, 0x11, 0x7f, 0xaa, 0x13,
  0xe4, 0x5c, 0xc3, 0xa8, 0x2d, 0x5d, 0xb6, 0xd6, 0x8a, 0xaa, 0xab, 0x9d,
  0x08, 0xd3, 0xd2, 0x8f, 0xaf, 0xd0, 0x2e, 0xd4, 0x17, 0xd4, 0xf9, 0x07,
  0xfe, 0xb1, 0xdd, 0xc5, 0xff, 0xee, 0xfc, 0xb3, 0x43, 0x21, 0x98, 0x83,
  0xcd, 0xcd, 0xfb, 0xfb, 0xfb, 0xbe, 0x02, 0x0a, 0xc2, 0x91, 0x7d, 0xe6,
  0x57, 0xfe, 0x21, 0x0e, 0x5b, 0xcb, 0x07, 0xae, 0xa3, 0x4e, 0x3a, 0x9f,






  0xfe, 0xb8, 0xdd, 0xdb, 0xde, 0xda, 0xda, 0xfa, 0xb9, 0xbf, 0xc0, 0x2d,
  0x9e, 0xd0, 0xb0, 0xf0, 0x5f, 0x77, 0xd8, 0x4d, 0x9e, 0xc9, 0x66, 0x10,
  0xf2, 0x55, 0x36, 0xd2, 0x60, 0xb8, 0x64, 0xdc, 0xb6, 0x83, 0x09, 0xf9,
  0xc0, 0x61, 0x32, 0x1c, 0x49, 0x8e, 0xdb, 0xeb, 0xe8, 0xb9, 0x83, 0x1e,
  0x86, 0x10, 0xf6, 0x77, 0x77, 0x76, 0x22, 0x56, 0x39, 0xb8, 0x3c, 0x8d,
  0x93, 0x19, 0x10, 0x99, 0x40, 0x5a, 0x8c, 0xb3, 0x2c, 0x43, 0xf8, 0xc5,
  0x98, 0x83, 0x35, 0x40, 0x1b, 0x2d, 0x29, 0x9d, 0x9c, 0x3b, 0x80, 0x10,
  0x8c, 0xc0, 0x7d, 0xf2, 0xf1, 0xa3, 0x1d, 0x18, 0xa8, 0xbc, 0x40, 0xde,
  0xca, 0xdd, 0x40, 0x0d, 0xce, 0x63, 0x5c, 0x86, 0xb4, 0x36, 0x53, 0x6a,
  0x46, 0x42, 0x8e, 0x60, 0x72, 0xb3, 0x5c, 0x1a, 0x5d, 0x53, 0xe4, 0x7e,
  0xb2, 0x2c, 0xa4, 0xcb, 0x11, 0x25, 0x3a, 0xdc, 0xc7, 0x8f, 0x35, 0x61,
  0x0f, 0x3b, 0x7e, 0x08, 0xff, 0xf1, 0xfc, 0xda, 0xa6, 0x80, 0x56, 0xba,
  0x34, 0x4f, 0x92, 0x6a, 0x74, 0xe3, 0xa1, 0xbe, 0x13, 0xfb, 0x46, 0xd5,
  0xfd, 0x06, 0x56, 0x63, 0x40, 0xd5, 0xdb, 0x3a, 0x40, 0xda, 0xba, 0x5c,
  0x18, 0x14, 0xfb, 0x7d, 0x50, 0x65, 0x02, 0x37, 0x84, 0x67, 0x9e, 0xd8,
  0x86, 0xee, 0x69, 0xba, 0x90, 0x52, 0xce, 0x68, 0x5a, 0x6a, 0xdd, 0xf0,
  0xe8, 0x26, 0x99, 0x0b, 0xbf, 0x5c, 0xd7, 0x94, 0xc9, 0x8e, 0x10, 0x61,
  0xc7, 0x17, 0x69, 0x9d, 0x89, 0xfc, 0x06, 0x16, 0xb3, 0x21, 0x75, 0xb7,
  0x46, 0xca, 0x49, 0x33, 0xa4, 0xe9, 0x12, 0xad, 0xc6, 0x61, 0x2c, 0xe2,
  0x44, 0x0b, 0xc2, 0xdb, 0x32, 0x9b, 0x91, 0x27, 0x26, 0x05, 0x49, 0x31,
  0xf4, 0xbf, 0xf4, 0x44, 0xf7, 0x11, 0xa1, 0x4a, 0x09, 0x26, 0x70, 0x63,
  0xdf, 0x9c, 0x1e, 0x5f, 0x53, 0x11, 0x6c, 0x97, 0xca, 0x65, 0xba, 0x54,

  0xf9, 0xea, 0x37, 0xaa, 0xba, 0x24, 0xff, 0x08, 0x11, 0xaa, 0x44, 0x93,
  0x62, 0x9b, 0x62, 0x67, 0x51, 0xc8, 0xb5, 0x8e, 0xcd, 0x69, 0x31, 0x16,
  0xc8, 0x1d, 0xae, 0x69, 0x89, 0x26, 0x31, 0x71, 0x6f, 0xbf, 0xbf, 0xc5,
  0x6b, 0xb4, 0x3d, 0xb0, 0xb5, 0x52, 0x8b, 0xdc, 0x48, 0x1a, 0x61, 0x8c,
  0xc3, 0x39, 0x03, 0x66, 0x3a, 0xdd, 0x88, 0xd1, 0xcf, 0x19, 0x4a, 0x41,
  0x7f, 0xeb, 0x64, 0x4b, 0xae, 0xd4, 0x4c, 0x5d, 0xf0, 0x53, 0x24, 0xcb,
  0x06, 0x6c, 0x35, 0xc6, 0xc6, 0x72, 0x53, 0x65, 0x29, 0x38, 0x2b, 0xa1,
  0x72, 0x39, 0xa2, 0x89, 0x48, 0x3c, 0x58, 0x55, 0x92, 0x75, 0x6d, 0xef,
  0xa9, 0x1c, 0xa5, 0x80, 0x48, 0x2c, 0xa9, 0x3f, 0xaa, 0xb5, 0x6a, 0x0d,
  0xe9, 0x27, 0x5e, 0x4b, 0xaf, 0xde, 0xd7, 0x82, 0x3c, 0xcb, 0x7a, 0x72,
  0xa8, 0xf4, 0x0b, 0x8f, 0x72, 0x43, 0xb3, 0x5c, 0xd9, 0x6e, 0x55, 0x85,
  0xb3, 0x8f, 0xee, 0x42, 0x3e, 0xf6, 0xaa, 0xd9, 0x94, 0x1d, 0xae, 0x68,

  0xcf, 0x47, 0xab, 0x1c, 0x51, 0x3a, 0xd4, 0xa3, 0xe9, 0x1d, 0x18, 0xcb,
  0x0a, 0x89, 0x12, 0xc8, 0xd8, 0x23, 0xff, 0x54, 0xe7, 0x0b, 0x0c, 0x0b,
  0xbd, 0x3e, 0xea, 0xd4, 0x6e, 0x64, 0xa8, 0x7b, 0x55, 0xc9, 0xdc, 0xad,
  0x6e, 0xc9, 0x08, 0x4f, 0x43, 0xbe, 0x9f, 0x3c, 0x54, 0x2c, 0xf7, 0x27,

  0xd4, 0x81, 0x3a, 0xdb, 0xdd, 0x89, 0xca, 0x47, 0x50, 0x22, 0xe6, 0xee,
  0x26, 0x34, 0x1b, 0x8e, 0x07, 0x43, 0x61, 0xb5, 0x4e, 0x7d, 0xcc, 0xb7,
  0x3e, 0xe0, 0x2b, 0x47, 0xf4, 0x8a, 0xf4, 0xf6, 0xd2, 0x7c, 0xbd, 0x67,

  0x74, 0xb1, 0xc7, 0x7c, 0x69, 0xe6, 0x62, 0xc3, 0x59, 0x9c, 0xdd, 0x9a,
  0xc4, 0x6a, 0x1e, 0xa9, 0x8b, 0xed, 0x61, 0xb9, 0x92, 0xd4, 0xfe, 0x50,
  0x12, 0xf8, 0x48, 0x32, 0x7a, 0x5d, 0xd4, 0x50, 0x2f, 0x9d, 0xc7, 0x05,
  0x96, 0x18, 0xd2, 0x9e, 0x49, 0xf2, 0xb3, 0x7b, 0x26, 0xa6, 0xe9, 0x18,
  0x4b, 0xf3, 0x77, 0x94, 0xd1, 0xce, 0xcf, 0xf9, 0x22, 0x8c, 0x63, 0xec,
  0x8c, 0xfb, 0xa3, 0x19, 0xe4, 0x2d, 0x1d, 0xe1, 0x7e, 0xbb, 0xd8, 0xba,

  0x01, 0x42, 0x06, 0xae, 0x0d, 0xff, 0x3d, 0xd0, 0x10, 0x60, 0x1b, 0xff,

  0x36, 0xd2, 0xc3, 0x34, 0x3d, 0x37, 0x41, 0x43, 0xb7, 0x8d, 0x2d, 0xab,
  0x77, 0x36, 0x50, 0x19, 0x8a, 0xb0, 0xf7, 0xa3, 0x0b, 0x6b, 0x4e, 0x66,
  0x5d, 0x82, 0xc4, 0xad, 0x8a, 0x91, 0x18, 0x93, 0xf4, 0x77, 0x49, 0xdd,
  0x8c, 0x67, 0xa1, 0x1d, 0xa0, 0xae, 0x6e, 0x29, 0xa1, 0x72, 0x97, 0xa1,
  0xd9, 0x29, 0x7c, 0xb7, 0xf0, 0x39, 0xd8, 0x58, 0x6c, 0x2b, 0xca, 0xa1,
  0xfc, 0xd8, 0xcb, 0xcc, 0xe6, 0x45, 0x84, 0xfb, 0xc9, 0x71, 0x60, 0xdf,
  0x34, 0x92, 0xb5, 0x8f, 0x97, 0x12, 0xcc, 0x9f, 0x81, 0x5c, 0xe4, 0xdc,
  0x13, 0xdb, 0x0f, 0x02, 0x58, 0x5a, 0x9e, 0x75, 0x3d, 0x7c, 0x27, 0x0c,
  0x9d, 0xb3, 0xc7, 0x09, 0x73, 0x02, 0xe7, 0xd2, 0xbf, 0xdb, 0x34, 0x01,
  0x8e, 0xf9, 0x3d, 0xa5, 0x4d, 0xf7, 0xcb, 0x4f, 0xb4, 0x1a, 0xe6, 0x5e,
  0x40, 0x7a, 0x18, 0x40, 0x85, 0x5d, 0x2e, 0xe5, 0xf3, 0x96, 0x74, 0x91,
  0xe9, 0x8d, 0x14, 0xb8, 0xa9, 0x94, 0x0b, 0xa9, 0x4b, 0xd7, 0xc6, 0xbc,





  0xc1, 0xa6, 0x4d, 0x8e, 0xff, 0x43, 0x30, 0xbb, 0x40, 0xdd, 0xf4, 0xf4,

  0x65, 0xbc, 0x8d, 0x94, 0x86, 0x08, 0x3b, 0x4c, 0x40, 0xd1, 0x98, 0xcf,
  0x83, 0xd9, 0x92, 0x36, 0x39, 0x19, 0xf5, 0x89, 0x24, 0x63, 0xab, 0x3e,
  0x37, 0xd8, 0x6b, 0x70, 0x3e, 0x3e, 0x76, 0xe2, 0x98, 0xa1, 0x75, 0x4b,
  0x6d, 0x7a, 0x6c, 0x1a, 0x9c, 0x4f, 0x45, 0x8e, 0x94, 0x98, 0xea, 0x09,
  0x1c, 0xcd, 0xc2, 0x5a, 0x97, 0xba, 0xf1, 0x81, 0xa6, 0x52, 0xbc, 0x52,
  0xe9, 0xa1, 0xf1, 0xe8, 0x42, 0xfe, 0xc2, 0x5d, 0xb8, 0x4b, 0x79, 0xef,
  0x19, 0xcc, 0x6c, 0x58, 0xa4, 0xc9, 0x04, 0x35, 0x10, 0x5a, 0x91, 0xe4,
  0x90, 0x7a, 0x5e, 0xa3, 0x04, 0x71, 0xaf, 0x31, 0x3b, 0x1d, 0xce, 0x11,
  0x0b, 0x88, 0x53, 0xf2, 0x1c, 0x31, 0x4f, 0x34, 0xbd, 0xb8, 0x18, 0x64,
  0x1e, 0x6b, 0x25, 0x69, 0x11, 0xb1, 0xd6, 0x34, 0x05, 0xf3, 0x33, 0xa9,
  0x0f, 0xbb, 0x78, 0x3c, 0x91, 0xba, 0x32, 0xbc, 0xc5, 0xa6, 0x97, 0x23,
  0x7d, 0x91, 0xd9, 0xaa, 0x68, 0x37, 0x4e, 0x3b, 0xb0, 0x30, 0x72, 0x33,
  0xee, 0xd2, 0xb7, 0x49, 0x01, 0xf2, 0x2f, 0x2f, 0xa3, 0xef, 0xf6, 0x35,
  0x0d, 0x53, 0x3a, 0xd2, 0x8b, 0x2a, 0x62, 0x8a, 0x5e, 0xa9, 0x5c, 0x80,
  0xa7, 0xee, 0x85, 0x2f, 0xb8, 0x78, 0x83, 0xb9, 0x97, 0xbe, 0x2e, 0x0a,
  0x09, 0x1b, 0xe9, 0x59, 0xf3, 0xca, 0xc1, 0x4f, 0x80, 0xfc, 0xe0, 0x9f,
  0xe1, 0xee, 0x63, 0xb6, 0x89, 0x34, 0x68, 0x57, 0x48, 0x2c, 0xe8, 0xcb,
  0x83, 0xb3, 0x1c, 0x56, 0xa4, 0xe4, 0x80, 0x74, 0x32, 0x13, 0x8f, 0xae,
  0x53, 0x74, 0xf7, 0x48, 0x82, 0x8d, 0xaf, 0x02, 0x72, 0xa9, 0x82, 0xa8,
  0x35, 0x16, 0x1f, 0xbc, 0x91, 0x1c, 0x81, 0x7a, 0x64, 0x79, 0x83, 0x9a,
  0x18, 0x6a, 0x08, 0x64, 0xe4, 0xb7, 0xa8, 0xf7, 0x2c, 0x1f, 0xcf, 0xaf,
  0xcf, 0xde, 0x8b, 0xe9, 0x6c, 0xd9, 0x9c, 0x68, 0x35, 0xd6, 0x2c, 0x16,
  0xb6, 0xc3, 0x54, 0xe5, 0x63, 0x02, 0xe8, 0x66, 0x68, 0x79, 0x21, 0x23,
  0x52, 0xe0, 0xb6, 0x75, 0x25, 0x17, 0xa7, 0x90, 0xc2, 0x35, 0x31, 0xba,
  0x74, 0x53, 0x03, 0x9e, 0x6c, 0x24, 0xc2, 0x92, 0xce, 0x9e, 0x5c, 0x25,
  0x20, 0x51, 0x80, 0xd1, 0xac, 0x02, 0x58, 0x47, 0x39, 0xa7, 0xfc, 0xd0,
  0xf9, 0x32, 0xaf, 0x04, 0x59, 0x0c, 0xf7, 0xcb, 0x88, 0xde, 0xe4, 0xf7,
  0x59, 0xef, 0x0c, 0xeb, 0x8f, 0xa3, 0xb3, 0x7c, 0x0a, 0x5b, 0x75, 0x4e,
  0x0a, 0x4b, 0xf3, 0xd4, 0x3e, 0x5c, 0x9e, 0x47, 0xeb, 0x28, 0x77, 0xa3,
  0x4b, 0x83, 0x39, 0x87, 0x4f, 0x6e, 0x88, 0x7d, 0x51, 0xb2, 0x4e, 0x22,
  0xb3, 0xe9, 0x46, 0x27, 0x3f, 0x1c, 0xbd, 0xbf, 0x3c, 0x3b, 0xf9, 0x89,
  0x4d, 0x0c, 0x6f, 0x39, 0xf8, 0xe3, 0xaf, 0x1c, 0x9b, 0x8b, 0x22, 0x34,
  0x98, 0x33, 0x08, 0xf3, 0x08, 0x02, 0xce, 0x30, 0x7d, 0x32, 0x6b, 0x54,
  0x12, 0x1c, 0x0c, 0x2e, 0x4f, 0x7b, 0x0a, 0x18, 0xc7, 0xdd, 0x4a, 0xd3,
  0x0c, 0x0d, 0x24, 0x92, 0x47, 0xd2, 0xe8, 0xe4, 0x5b, 0x3f, 0x18, 0xa5,
  0x37, 0xa2, 0x1b, 0x9d, 0x6b, 0x2a, 0x62, 0x97, 0x4e, 0x1c, 0xaf, 0xe0,
  0x9b, 0x74, 0x4a, 0x01, 0xa5, 0x46, 0x02, 0x19, 0x12, 0x07, 0x4d, 0x61,
  0xe4, 0x95, 0xf3, 0x50, 0x93, 0x39, 0x8b, 0x96, 0x57, 0x26, 0x33, 0x76,
  0x5f, 0xb6, 0x4a, 0x48, 0x62, 0x06, 0x74, 0x8c, 0x58, 0x27, 0xe2, 0x85,
  0xca, 0xa4, 0x6e, 0x64, 0xf8, 0xe8, 0x76, 0xb7, 0x33, 0x34, 0xc2, 0x72,
  0x41, 0xb4, 0x09, 0xc3, 0xf6, 0x0f, 0xa2, 0x4e, 0x6f, 0x19, 0x1d, 0x74,
  0x3e, 0xa1, 0x8a, 0xe0, 0x7a, 0x7a, 0x03, 0xcd, 0xb2, 0x24, 0x5e, 0xa6,
  0xae, 0x60, 0x69, 0xf1, 0x40, 0xfe, 0x6a, 0xf5, 0xb6, 0xb1, 0xc7, 0x1c,
  0xae, 0xba, 0x48, 0x5f, 0x2a, 0x4d, 0x9b, 0x06, 0xe0, 0x5c, 0x32, 0xe2,
  0x4b, 0x09, 0xc7, 0x4d, 0x41, 0x43, 0x5d, 0x03, 0x36, 0xc0, 0x6e, 0x7c,
  0x64, 0xf1, 0x1d, 0x8a, 0x4d, 0x8a, 0x05, 0x95, 0x8f, 0x41, 0x57, 0x3d,
  0xe2, 0x18, 0x44, 0x89, 0x19, 0xe8, 0xfe, 0x70, 0xb4, 0x57, 0x6b, 0x5f,
  0xae, 0x49, 0x7c, 0xb5, 0x23, 0x4a, 0x15, 0xf2, 0xea, 0x0e, 0x2b, 0xb0,
  0xa8, 0x18, 0xe3, 0xec, 0xe1, 0xc6, 0xaf, 0x1d, 0xae, 0x69, 0x43, 0x19,
  0x7d, 0xb2, 0xc9, 0x70, 0xe8, 0x3d, 0x09, 0xf1, 0xa9, 0x5a, 0x2d, 0xa7,
  0x2f, 0xb9, 0xe5, 0x20, 0x35, 0xc7, 0x09, 0x09, 0x6f, 0xee, 0x1b, 0xc9,
  0x18, 0x8f, 0x1c, 0x42, 0x6c, 0xaa, 0x1c, 0xb5, 0x99, 0xcb, 0x5c, 0xff,
  0x4d, 0xe7, 0xea, 0xf4, 0x56, 0xc6, 0xa0, 0x84, 0xed, 0xf1, 0x37, 0xe4,
  0xf6, 0xbc, 0x6d, 0xfa, 0x10, 0xa7, 0x96, 0xa2, 0x71, 0x4c, 0x9a, 0x70,
  0xb0, 0x84, 0xb0, 0xdb, 0xa8, 0xcd, 0xa3, 0xb8, 0x96, 0xef, 0xbe, 0xac,
  0x0c, 0xa2, 0x29, 0x8e, 0xbc, 0x56, 0x60, 0xfb, 0xa6, 0xfc, 0x96, 0x7a,
  0xba, 0xe6, 0x45, 0xeb, 0x4d, 0x55, 0xd7, 0xae, 0xa5, 0x3c, 0x96, 0xb6,
  0x5a, 0x21, 0x81, 0xea, 0x04, 0x3d, 0x28, 0xea, 0x80, 0xd8, 0x76, 0x5d,
  0x1f, 0xcd, 0x86, 0x5b, 0xcb, 0x69, 0x53, 0x19, 0x13, 0x7d, 0xaa, 0xc7,

  0x4a, 0xb5, 0x4c, 0x38, 0x88, 0xa2, 0xef, 0x94, 0xdb, 0xd6, 0xbb, 0x17,
  0x8a, 0x2f, 0x9b, 0xda, 0x0b, 0xb4, 0xd7, 0x35, 0xd2, 0x36, 0xd9, 0x7d,

  0xf2, 0x2a, 0x43, 0x6d, 0x30, 0xc4, 0xcc, 0x2f, 0x9c, 0xfc, 0x19, 0x0c,



  0x8b, 0x7c, 0x27, 0xb7, 0xaa, 0xf4, 0xed, 0xac, 0x37, 0x12, 0x38, 0x73,

  0xe3, 0x51, 0x52, 0x2a, 0xc8, 0x8e, 0x43, 0xb1, 0x51, 0x34, 0x3c, 0xaf,

  0x49, 0x03, 0x29, 0x79, 0xf7, 0xcb, 0x7e, 0x48, 0x85, 0x95, 0x36, 0x44,
  0x1c, 0xb2, 0x93, 0x15, 0xb1, 0x87, 0x9d, 0xa2, 0x69, 0x3a, 0x84, 0xe4,
  0xed, 0x74, 0xcd, 0xd8, 0x81, 0xd0, 0x2a, 0x49, 0x8f, 0xdd, 0x62, 0x4c,
  0xc1, 0x8a, 0x47, 0x49, 0xac, 0xe1, 0xb6, 0xdd, 0xd9, 0xad, 0xa6, 0x1b,
  0xe2, 0xc8, 0xc9, 0x43, 0x32, 0x5a, 0x56, 0xf5, 0x12, 0x38, 0x67, 0x4e,
  0x02, 0xec, 0x44, 0x53, 0x5a, 0xa7, 0x8b, 0xa0, 0xc6, 0xe8, 0xa5, 0xa2,
  0xf2, 0x1c, 0x74, 0x36, 0x34, 0x88, 0x1b, 0x8b, 0x0e, 0xcf, 0xbf, 0x08,
  0xc5, 0x67, 0x75, 0xca, 0x45, 0xc2, 0x1e, 0x55, 0x9b, 0xaa, 0x10, 0xfc,
  0x3c, 0xd0, 0x68, 0x11, 0xfc, 0xfa, 0x5b, 0xf6, 0xbd, 0x39, 0x1f, 0x37,
  0xdd, 0x3a, 0xc5, 0x2d, 0x57, 0x7a, 0x57, 0xd9, 0xfb, 0x32, 0xb5, 0x2d,
  0x07, 0x06, 0x75, 0x07, 0xd4, 0x4d, 0x86, 0xbc, 0xbe, 0xaa, 0x9b, 0xef,
  0xb9, 0x43, 0x4f, 0x2f, 0xef, 0x5e, 0x38, 0xde, 0x6c, 0x94, 0x78, 0xf4,
  0x23, 0xc3, 0xf1, 0xbd, 0x55, 0xdc, 0x16, 0xc3, 0x3d, 0xf8, 0xe3, 0x5b,
  0xfc, 0x63, 0xc2, 0x7e, 0x01, 0x01, 0xd5, 0x63, 0x3f, 0xac, 0x4f, 0xda,
  0x08, 0x8a, 0x10, 0xb9, 0xc8, 0x0a, 0x94, 0xa9, 0x85, 0x85, 0x8a, 0x88,
  0xc0, 0x67, 0xc1, 0x90, 0xc8, 0xaa, 0xd1, 0x61, 0xba, 0x5c, 0x3c, 0xec,
  0x07, 0x29, 0xe5, 0x7f, 0x84, 0x18, 0xc7, 0x88, 0x6c, 0x5d, 0xf2, 0x39,
  0x0d, 0xb8, 0xa5, 0x6a, 0x1e, 0xaa, 0x1f, 0x85, 0xad, 0xfa, 0x3b, 0x06,
  0x2a, 0x4c, 0x25, 0x3b, 0x70, 0x00, 0x4d, 0xad, 0x50, 0x02, 0xb4, 0x09,
  0x1d, 0xec, 0x9e, 0xc6, 0x8b, 0xc6, 0xfc, 0x2c, 0x6d, 0x99, 0x42, 0xfb,
  0x92, 0x49, 0xba, 0xcb, 0x1f, 0x3e, 0xe8, 0x6c, 0xfb, 0x7b, 0x6f, 0xa8,
  0x7a, 0x9a, 0x6f, 0xbc, 0xf6, 0x31, 0x44, 0x85, 0x4d, 0x8f, 0xda, 0xe2,
  0x47, 0xf0, 0xa3, 0x86, 0x3b, 0xb0, 0x5a, 0xd2, 0x32, 0xcf, 0x39, 0xb7,
  0x8d, 0xc4, 0xae, 0x1b, 0xc4, 0x16, 0x6e, 0xd9, 0x27, 0x83, 0x29, 0x4d,
  0xc9, 0x1c, 0x43, 0x5f, 0x46, 0x32, 0x32, 0x8c, 0x17, 0x6a, 0x56, 0xf8,
  0xb9, 0x5e, 0x78, 0xb8, 0x31, 0x6a, 0x6f, 0x28, 0x65, 0x39, 0x7d, 0xeb,
  0x0f, 0x5e, 0xb4, 0xb3, 0x7c, 0xcc, 0x46, 0x37, 0x6f, 0xce, 0x07, 0xe1,
  0xd7, 0x9b, 0x8b, 0xa3, 0xa7, 0x41, 0x0b, 0x41, 0x5a, 0x60, 0x93, 0x53,
  0x50, 0x2c, 0xd1, 0x7d, 0x76, 0xe4, 0xfc, 0x36, 0x3c, 0x5c, 0xfd, 0x15,
  0xe3, 0x0a, 0x44, 0xcd, 0x82, 0xb9, 0xb8, 0x28, 0x9e, 0x54, 0x29, 0xd2,
  0x8b, 0xf1, 0x2e, 0xb0, 0xd7, 0x23, 0x3c, 0x5c, 0x75, 0x83, 0xd1, 0x22,
  0x20, 0x02, 0x19, 0xb1, 0x70, 0x12, 0xd0, 0x9a, 0x74, 0x4d, 0x0d, 0x77,
  0xf4, 0x8f, 0x5f, 0x72, 0xcc, 0x67, 0x60, 0xd1, 0x26, 0x81, 0xe0, 0xa2,
  0xb7, 0x43, 0x26, 0x4e, 0x63, 0x63, 0xbf, 0x40, 0xaa, 0x33, 0x7c, 0x9d,
  0xa9, 0xb4, 0x2b, 0xc4, 0x4a, 0x3f, 0x2a, 0xda, 0x96, 0x04, 0x7b, 0xb2,
  0xf3, 0xcd, 0xd7, 0xbe, 0xf4, 0x7c, 0x73, 0xde, 0xf2, 0x39, 0xfc, 0x4d,
  0x4f, 0xab, 0x09, 0x45, 0x23, 0x70, 0x14, 0x7a, 0x7f, 0x2f, 0x04, 0x0a,


  0x39, 0x3c, 0x01, 0xc5, 0x49, 0x7e, 0x82, 0x4b, 0x20, 0x40, 0x3c, 0xff,
  0xb1, 0xf2, 0x41, 0xc9, 0xe9, 0x0f, 0x7f, 0x8a, 0x0b, 0x25, 0x38, 0xc3,
  0x2f, 0xba, 0xe2, 0x28, 0xee, 0xa5, 0x28, 0xc2, 0x1b, 0xab, 0xce, 0x28,
  0x3c, 0x1c, 0xf2, 0xb7, 0x10, 0x24, 0x15, 0xb2, 0x85, 0x1d, 0xfe, 0x63,
  0x73, 0xc7, 0xa4, 0xa6, 0x99, 0x92, 0x50, 0xba, 0xa6, 0x20, 0xc1, 0x7d,
  0x05, 0x21, 0x4b, 0x1f, 0x06, 0x94, 0x4f, 0xd0, 0x42, 0xcd, 0x94, 0x78,
  0xc0, 0x19, 0x07, 0x66, 0x72, 0x38, 0x4f, 0xd5, 0xc4, 0x82, 0x33, 0x19,
  0xb0, 0xfb, 0xee, 0x29, 0x62, 0x4a, 0x03, 0xd9, 0x74, 0xab, 0x70, 0x37,
  0xdf, 0x83, 0x92, 0x84, 0xc2, 0xf5, 0xd9, 0x44, 0xaa, 0x2f, 0x44, 0xeb,

  0x43, 0x10, 0xd7, 0x0e, 0x8c, 0x0e, 0xab, 0xd8, 0x7b, 0x5c, 0xc2, 0x12,




  0x1e, 0x6e, 0xff, 0xf3, 0xfd, 0xbd, 0x8d, 0x8d, 0xae, 0xfa, 0xaa, 0x24,
  0x41, 0x66, 0x48, 0x05, 0x59, 0x29, 0x72, 0x2e, 0x6e, 0x97, 0x0e, 0x5b,
  0x7c, 0x43, 0x8c, 0xc1, 0xf8, 0x8c, 0xc2, 0xc3, 0xa1, 0x1c, 0xd3, 0xf7,
  0xf0, 0x10, 0xd1, 0x04, 0x27, 0x86, 0x6e, 0x0c, 0x61, 0x14, 0x36, 0x09,
  0x3f, 0x60, 0x62, 0x2e, 0xad, 0x5c, 0x81, 0x1c, 0x29, 0xd6, 0xc3, 0x88,
  0x8e, 0x25, 0x0e, 0x17, 0xc7, 0x2a, 0x69, 0xfd, 0x44, 0xd0, 0x4b, 0x16,
  0x7b, 0xf4, 0x07, 0x15, 0x3f, 0xde, 0x68, 0x0b, 0xe7, 0xcb, 0xe5, 0x70,
  0x06, 0x32, 0x68, 0xb0, 0x9c, 0x4c, 0xe0, 0xb4, 0xcf, 0x52, 0xe9, 0xc5,
  0xcd, 0x3a, 0xb8, 0x24, 0x37, 0xb4, 0xc9, 0x1c, 0x5a, 0x77, 0x9d, 0xd0,
  0x24, 0xd7, 0xd3, 0x16, 0x70, 0x8b, 0xd6, 0x16, 0x75, 0x16, 0xfc, 0x21,
  0x38, 0xa1, 0x49, 0xaf, 0x6d, 0x61, 0x0f, 0x49, 0xe9, 0x9b, 0x71, 0xef,
  0x31, 0x6e, 0x0b, 0x02, 0xfb, 0xd9, 0x47, 0x6f, 0x9a, 0x5e, 0xd7, 0x53,
  0x76, 0x8d, 0xde, 0x79, 0x8f, 0x7a, 0x27, 0x81, 0xf0, 0x60, 0x2c, 0x23,
  0x3a, 0x64, 0x0d, 0xb3, 0xbd, 0x0b, 0xb2, 0x82, 0x21, 0xb8, 0xba, 0x28,
  0x69, 0xf5, 0xe4, 0xf7, 0x8f, 0xb1, 0xff, 0xa1, 0x24, 0x61, 0xce, 0x12,
  0x8c, 0x35, 0x12, 0x7f, 0xf4, 0x51, 0x49, 0x0a, 0xf6, 0x4f, 0xf2, 0x18,
  0xe2, 0xfb, 0x10, 0x0f, 0x3e, 0xe5, 0xd6, 0xc5, 0x84, 0xaa, 0xc4, 0x5e,
  0x20, 0x46, 0xf3, 0x61, 0x9f, 0x17, 0xd0, 0xce, 0x83, 0xc7, 0x13, 0x24,
  0xa5, 0x36, 0x7b, 0x8c, 0x9c, 0x38, 0x8f, 0xc2, 0x2d, 0x94, 0xb5, 0x2f,
  0x79, 0xae, 0x1b, 0xac, 0xbe, 0xf6, 0x74, 0x92, 0x8a, 0x6c, 0xe2, 0x0e,

  0xcf, 0xa8, 0x43, 0xe5, 0xe5, 0x1a, 0x3f, 0xa7, 0xec, 0x2b, 0xb5, 0x1a,
  0x58, 0xef, 0xd6, 0xb1, 0xc5, 0x43, 0x19, 0x07, 0x62, 0xea, 0x3a, 0xc7,
  0xce, 0x57, 0x9a, 0xc9, 0xd5, 0xd1, 0x14, 0x80, 0x46, 0x6b, 0x7a, 0x19,
  0x53, 0x86, 0x0c, 0x20, 0x2e, 0x70, 0x5a, 0x04, 0x25, 0xa9, 0xe3, 0xa9,
  0xc1, 0x90, 0xbd, 0x4e, 0x50, 0xa1, 0x35, 0x1b, 0x60, 0x7a, 0x4c, 0xd6,
  0xcc, 0x3e, 0xfd, 0x84, 0x8d, 0xfa, 0x61, 0x7a, 0x77, 0x95, 0x56, 0x4b,
  0x9f, 0xe9, 0x0e, 0x15, 0x1f, 0x94, 0x10, 0x2a, 0x48, 0x4c, 0xe3, 0x61,
  0x58, 0x18, 0x09, 0x32, 0xf3, 0x30, 0xe1, 0x13, 0x9b, 0xad, 0x96, 0x86,
  0x47, 0xa0, 0xf3, 0x73, 0x96, 0xdf, 0x7b, 0x19, 0xe2, 0x68, 0x61, 0x98,
  0xd9, 0xd5, 0xeb, 0xdf, 0xe0, 0xed, 0x3f, 0xfd, 0x43, 0x7f, 0xf9, 0x11,

  0x77, 0xea, 0x9f, 0xba, 0x53, 0x9a, 0x74, 0x17, 0x7b, 0x30, 0x09, 0x64,
  0x5b, 0x47, 0x7f, 0xa2, 0x5d, 0xf9, 0x2b, 0x66, 0x35, 0xf1, 0xd6, 0x20,
  0x42, 0x11, 0x0d, 0xf8, 0xa7, 0xbe, 0xd1, 0xa3, 0x65, 0x90, 0x18, 0xeb,
  0xbe, 0x49, 0xd9, 0x1f, 0x3e, 0x7a, 0x2e, 0x29, 0x24, 0xc3, 0x9f, 0xb2,
  0x2e, 0x41, 0x2d, 0x83, 0x49, 0x87, 0x28, 0x2d, 0xdc, 0x4c, 0x97, 0x4f,
  0xf1, 0xa7, 0x42, 0xf0, 0x86, 0xc0, 0x96, 0x81, 0x99, 0xa3, 0xa1, 0xc7,




  0x3f, 0x0f, 0x1b, 0x16, 0x9a, 0xd4, 0x22, 0xde, 0x94, 0x1a, 0x04, 0x15,
  0x8c, 0x83, 0x2d, 0xe2, 0xd5, 0x10, 0x1f, 0x2a, 0xfa, 0x0b, 0x4d, 0x15,
  0x9e, 0x6e, 0x9e, 0x3d, 0x61, 0xb4, 0x08, 0x38, 0x90, 0xbe, 0xcc, 0x4d,
  0xdb, 0x4c, 0x8e, 0xc6, 0x9f, 0xfe, 0xc1, 0x89, 0x80, 0xff, 0xf4, 0x75,
  0xdf, 0x8b, 0xeb, 0x93, 0x03, 0x9a, 0xd2, 0x9f, 0x7a, 0xe5, 0xe3, 0x7c,
  0x98, 0xcf, 0xe4, 0xe2, 0xe1, 0xe6, 0xc3, 0x06, 0xea, 0xcf, 0x98, 0x4a,
  0x28, 0x56, 0xd7, 0x73, 0x00, 0x4c, 0xba, 0xc1, 0xde, 0x14, 0x68, 0x87,
  0xe5, 0x23, 0xae, 0x68, 0xc5, 0xc2, 0x05, 0xb8, 0x79, 0x7f, 0x8a, 0x14,
  0x93, 0x84, 0xfb, 0xd2, 0x4a, 0x07, 0x62, 0xf1, 0xa8, 0x6a, 0x09, 0x48,
  0x30, 0x04, 0xb4, 0x9a, 0x8e, 0x0d, 0x4f, 0x0f, 0x42, 0xbf, 0x20, 0xbf,
  0x80, 0x69, 0x7e, 0xa4, 0xa2, 0x49, 0x31, 0x73, 0x8f, 0xf9, 0x67, 0xbd,
  0x6b, 0xfa, 0x99, 0xe6, 0xd1, 0x08, 0xd8, 0x00, 0x66, 0x66, 0x48, 0xf1,
  0x49, 0xd7, 0x2f, 0x50, 0x8e, 0x42, 0xa9, 0x79, 0x98, 0xf8, 0x0e, 0x7c,
  0xc6, 0x9b, 0xa7, 0xde, 0xea, 0x8f, 0x09, 0x01, 0xf2, 0xa6, 0x77, 0xc9,
  0xea, 0xd1, 0xa8, 0xc3, 0x0f, 0x30, 0xe6, 0x79, 0x2c, 0xc9, 0x6c, 0x9c,
  0xbd, 0x66, 0xee, 0x93, 0xc2, 0xa2, 0x51, 0x6e, 0x33, 0x9c, 0x76, 0xff,
  0xa9, 0xe1, 0x70, 0x4f, 0xb5, 0x6a, 0x43, 0x32, 0x7f, 0xd0, 0xbf, 0x96,
  0x4e, 0x8c, 0x86, 0x51, 0x61, 0x41, 0x0e, 0xa6, 0x1c, 0xe1, 0xc8, 0x4f,
  0xac, 0x35, 0xd7, 0x10, 0x85, 0xb0, 0x2d, 0x0e, 0x57, 0x5e, 0x74, 0x23,
  0x1b, 0xdd, 0xd6, 0xa4, 0xbe, 0x08, 0x03, 0xe1, 0xab, 0x87, 0x33, 0x51,
  0x72, 0x13, 0x9a, 0x3a, 0xa5, 0x76, 0xdd, 0x39, 0xa7, 0x1f, 0xd2, 0x3c,
  0xb1, 0x8e, 0x65, 0x8e, 0x5e, 0xdb, 0x40, 0x9c, 0x39, 0x0a, 0x70, 0x7b,
  0x0a, 0x8e, 0xfe, 0x87, 0x13, 0x6d, 0x67, 0xd7, 0x56, 0xcf, 0x89, 0xb2,
  0x83, 0x2e, 0xc2, 0xa0, 0x97, 0xab, 0x87, 0xe3, 0xfc, 0xfb, 0x17, 0xfd,
  0xad, 0x0d, 0xef, 0x50, 0xab, 0xc5, 0x47, 0xa0, 0x8d, 0xe2, 0xf1, 0x23,
  0x66, 0xa9, 0xd2, 0x99, 0x69, 0x54, 0x81, 0x7e, 0x40, 0x3b, 0xcb, 0xe8,
  0x05, 0xcb, 0x05, 0x8e, 0x43, 0x64, 0x3e, 0xcb, 0xd9, 0x60, 0x7b, 0x6a,

  0x19, 0xf5, 0x7c, 0x50, 0x17, 0x44, 0x67, 0xbd, 0xde, 0x03, 0x6e, 0xcf,
  0x9b, 0x18, 0x26, 0xa0, 0x7c, 0xa4, 0xc8, 0xb5, 0x21, 0x26, 0x90, 0x7b,
  0x49, 0x91, 0x8e, 0xdc, 0x86, 0xa8, 0xf4, 0x00, 0x91, 0x14, 0x63, 0x83,
  0x62, 0x28, 0x3b, 0x08, 0x82, 0xdc, 0xf8, 0x1f, 0xf9, 0x7f, 0x9d, 0x90,
  0x95, 0x49, 0x77, 0xa4, 0xd3, 0x86, 0x89, 0x62, 0x66, 0x8d, 0xcd, 0x40,
  0x38, 0x7d, 0x62, 0x9d, 0x84, 0xb2, 0xbe, 0xc3, 0x78, 0x75, 0xb3, 0x34,
  0x2e, 0xcd, 0x04, 0x79, 0x05, 0x74, 0xa3, 0x68, 0xbd, 0x84, 0x2d, 0x77,
  0xe3, 0xd5, 0x7e, 0x45, 0x81, 0xa8, 0x11, 0xc7, 0x9a, 0x26, 0x79, 0xbf,
  0x65, 0x67, 0x38, 0x71, 0xb8, 0xb9, 0x33, 0xed, 0x1b, 0xc2, 0x6b, 0xf6,
  0x83, 0x8f, 0x4d, 0xb7, 0x02, 0x6f, 0xec, 0xba, 0x04, 0xf1, 0x48, 0x39,
  0xdf, 0xe0, 0xdb, 0x42, 0xb4, 0xe0, 0xc0, 0xc8, 0x11, 0x83, 0x79, 0xe2,
  0xd6, 0xae, 0xd7, 0xfb, 0x2b, 0xb7, 0x9c, 0xb3, 0xc1, 0xe9, 0x60, 0x8e,
  0x86, 0x3f, 0x8b, 0x2c, 0x78, 0x07, 0x27, 0xf7, 0x51, 0x21, 0x9d, 0x61,

  0x3d, 0xb3, 0xc7, 0x28, 0x88, 0xaf, 0xbf, 0xe2, 0xf3, 0xfb, 0x5b, 0x01,
  0xfa, 0xa7, 0xf4, 0xe1, 0x8f, 0xe9, 0xc2, 0xe1, 0x59, 0xa7, 0x97, 0x78,
  0x58, 0x54, 0xf7, 0x22, 0x65, 0x13, 0x9c, 0x63, 0x8c, 0x29, 0x17, 0xda,
  0xa5, 0x8a, 0x73, 0x95, 0x9e, 0xdc, 0xcc, 0x11, 0x23, 0x20, 0xb0, 0x43,
  0xc0, 0x85, 0x8a, 0x00, 0xfb, 0x56, 0xb4, 0x34, 0x71, 0x10, 0x9c, 0x5e,
  0xde, 0xed, 0xf9, 0x81, 0xa8, 0x28, 0xe0, 0x2e, 0x73, 0x97, 0xb4, 0xf3,
  0xaa, 0x75, 0x49, 0xdc, 0x51, 0x43, 0x96, 0xc4, 0x0b, 0x70, 0xdb, 0xe0,
  0xc8, 0x42, 0x74, 0x1d, 0xee, 0x44, 0x9f, 0x58, 0x92, 0x5d, 0xc4, 0x93,
  0x33, 0x81, 0x6f, 0x7d, 0x34, 0x18, 0xed, 0x20, 0x9b, 0xf9, 0xd3, 0xf8,
  0x6d, 0x50, 0x4c, 0x2c, 0x7a, 0x3b, 0xe2, 0x17, 0x2a, 0x91, 0xf2, 0x54,
  0xc2, 0x1a, 0x75, 0x14, 0x50, 0xb0, 0x1b, 0xf4, 0xb5, 0x1b, 0x9c, 0x83,
  0x76, 0xa2, 0x2d, 0xcd, 0x1c, 0x60, 0x0a, 0xf6, 0x87, 0x7c, 0x5d, 0x50,
  0xf4, 0x4d, 0x72, 0xe9, 0x9a, 0x6e, 0x66, 0xf3, 0xc4, 0x1c, 0xf8, 0x0a,
  0x3c, 0x3d, 0x0b, 0xba, 0x46, 0x1f, 0xcb, 0x72, 0x86, 0xa4, 0x9e, 0x4e,
  0x1e, 0x61, 0x4a, 0x65, 0x2b, 0x78, 0x8c, 0x2b, 0x40, 0xf9, 0x39, 0x3d,
  0x2e, 0xc7, 0x60, 0x5e, 0x2b, 0xc9, 0xa7, 0xb9, 0x48, 0x30, 0xfd, 0x86,
  0xc1, 0xc1, 0x9f, 0x22, 0x46, 0x94, 0xc3, 0xf4, 0x79, 0x1b, 0xe8, 0x13,
  0x3e, 0x61, 0x94, 0x85, 0x7e, 0xb4, 0x65, 0x2c, 0xc1, 0x27, 0x08, 0xa1,
  0x36, 0x12, 0x0e, 0x62, 0xa3, 0xdb, 0xf5, 0x0d, 0xc1, 0x42, 0x44, 0x6f,
  0x43, 0x74, 0xf7, 0x3f, 0x92, 0x26, 0xc0, 0xf1, 0x68, 0xc9, 0x3a, 0x37,
  0x38, 0x49, 0x38, 0x28, 0xd1, 0x86, 0xc6, 0x94, 0x7b, 0x67, 0x28, 0x0c,
  0x67, 0x01, 0xf0, 0xf3, 0x28, 0x00, 0x66, 0x41, 0xcd, 0xae, 0x28, 0x07,
  0xdb, 0x1e, 0xf5, 0x7a, 0x2e, 0x15, 0xa5, 0x3d, 0xac, 0x84, 0xed, 0xd1,
  0x2f, 0xa2, 0x56, 0x17, 0xab, 0x4d, 0xf7, 0xa8, 0x36, 0xba, 0xaa, 0xd5,
  0xa9, 0xaa, 0x26, 0x39, 0x36, 0x84, 0x5f, 0x49, 0x8c, 0x7f, 0x84, 0x7d,
  0x61, 0x28, 0xd3, 0x2c, 0x5e, 0x3d, 0x9c, 0x4e, 0x47, 0xfa, 0xa5, 0x91,
  0xb5, 0x35, 0x25, 0x68, 0xaf, 0xbc, 0x41, 0x4a, 0x20, 0x54, 0x02, 0x3b,
  0x87, 0xc2, 0xd4, 0xb0, 0xac, 0x6b, 0x2b, 0x5f, 0x7d, 0xc6, 0xf5, 0x2f,
  0x5d, 0xef, 0x16, 0x16, 0xd5, 0xe0, 0x42, 0x4f, 0x09, 0xc6, 0x20, 0x63,
  0x90, 0x35, 0x28, 0x8f, 0x72, 0xd6, 0xd0, 0xc6, 0xa3, 0x3e, 0x15, 0x8b,
  0x92, 0xec, 0xd7, 0x5a, 0xdc, 0x88, 0x92, 0x05, 0xe5, 0x17, 0xeb, 0xa5,
  0x85, 0x51, 0xc6, 0x62, 0xb9, 0xb1, 0x89, 0x18, 0x6c, 0x84, 0x90, 0xd6,
  0x9a, 0x6a, 0x1c, 0x50, 0xb0, 0x2b, 0xb2, 0x28, 0x1c, 0xfd, 0xe4, 0xdd,
  0x40, 0xa8, 0xba, 0x8f, 0xa6, 0x9b, 0x07, 0x07, 0x6e, 0xf2, 0x0a, 0xf3,
  0x3c, 0xe6, 0x20, 0xcf, 0x89, 0x19, 0x30, 0xe8, 0xa0, 0x65, 0x5c, 0xfa,
  0x74, 0xc0, 0x47, 0x47, 0xa3, 0x49, 0x18, 0x38, 0x5a, 0x35, 0x9a, 0xd6,
  0x08, 0x9a, 0xa1, 0x28, 0x94, 0xfa, 0xc4, 0x4d, 0x43, 0x34, 0xa0, 0xe0,
  0x17, 0xf5, 0x12, 0xcb, 0x9e, 0xf2, 0x27, 0x57, 0xac, 0xc0, 0x31, 0xde,
  0x57, 0x7f, 0xd1, 0x65, 0x11, 0xe1, 0x4f, 0x4b, 0xfa, 0x7f, 0xf4, 0xbc,
  0xad, 0xd3, 0x0c, 0x76, 0x7f, 0x2c, 0x6c, 0x64, 0x62, 0xcf, 0x01, 0xc7,

  0x8a, 0x31, 0x91, 0x60, 0xea, 0xb4, 0x5a, 0xe1, 0xf6, 0x37, 0xd6, 0xa6,
  0x01, 0xde, 0x59, 0x2e, 0x11, 0x23, 0x7b, 0xf2, 0x94, 0x2c, 0x67, 0xec,
  0x28, 0xf6, 0x20, 0x99, 0xf1, 0x10, 0x5c, 0xb2, 0xde, 0x03, 0xa6, 0x65,


  0x56, 0x66, 0x89, 0xb4, 0xb9, 0x3a, 0x2d, 0x2d, 0x7c, 0xf8, 0x8d, 0x66,


  0xc5, 0xa3, 0x3d, 0x67, 0x4e, 0xff, 0xaa, 0x5c, 0x6b, 0x4a, 0x32, 0x12,
  0x55, 0x46, 0xc2, 0x3c, 0x8b, 0xd9, 0xaf, 0x16, 0x65, 0x35, 0x69, 0xf5,
  0xf4, 0x9d, 0x6d, 0x13, 0x65, 0xdb, 0x41, 0x16, 0xc2, 0x98, 0xde, 0xfa,
  0xbf, 0xb7, 0xa8, 0x38, 0x93, 0xa8, 0x58, 0xe4, 0x29, 0x92, 0x5c, 0xd6,
  0x15, 0xdb, 0xf2, 0x9e, 0x6c, 0x4b, 0xeb, 0x87, 0x0c, 0xd7, 0xdd, 0x46,
  0x81, 0x0c, 0x74, 0x72, 0x5d, 0xa9, 0x53, 0x85, 0x8d, 0x08, 0xf5, 0x8c,
  0xb0, 0x6b, 0xa4, 0xff, 0x7c, 0x86, 0xfc, 0x62, 0x37, 0xbc, 0x06, 0x9a,
  0xd1, 0x27, 0x5e, 0x43, 0xbb, 0x5f, 0xa8, 0x1f, 0xb9, 0xa8, 0xae, 0xab,
  0x87, 0x93, 0x3c, 0x79, 0x76, 0x25, 0xb9, 0x4d, 0xcb, 0x6a, 0xd0, 0xdd,
  0xe8, 0x07, 0x8e, 0xd8, 0x59, 0xfb, 0x84, 0xc5, 0x43, 0x2f, 0x68, 0x62,
  0x35, 0x17, 0x98, 0xd6, 0x2d, 0x87, 0xe0, 0x96, 0xa1, 0x50, 0xf8, 0x18,
  0x2f, 0x16, 0x22, 0x6d, 0x9e, 0x26, 0xf9, 0x88, 0x81, 0x1b, 0xb9, 0x4d,
  0x2f, 0x36, 0x8a, 0x22, 0x88, 0xcc, 0x2a, 0xcf, 0x6f, 0xd9, 0xa9, 0xca,
  0x29, 0xd8, 0x58, 0x0c, 0xe9, 0x23, 0x45, 0x7b, 0x24, 0x3f, 0xd3, 0x7b,
  0xb3, 0x39, 0x18, 0xbc, 0xdb, 0x4c, 0xaa, 0x91, 0x4a, 0xbd, 0x4d, 0x9b,
  0xfd, 0x27, 0xd6, 0xf7, 0xd3, 0x5a, 0x2c, 0x49, 0x5e, 0xea, 0xd8, 0x87,
  0xc4, 0x6f, 0xfc, 0xda, 0xcf, 0xa0, 0x7d, 0xda, 0x84, 0xba, 0x2d, 0xfa,

  0x09, 0x96, 0x89, 0x78, 0xd7, 0xfa, 0x91, 0xba, 0x4b, 0x81, 0x26, 0xbd,
  0xce, 0x98, 0xb1, 0x60, 0xa7, 0x3e, 0x7d, 0xb3, 0xed, 0xe2, 0x82, 0x4b,
  0x41, 0xd7, 0x0a, 0xa6, 0xfc, 0x2c, 0x17, 0xff, 0x2d, 0xe7, 0x49, 0x9e,
  0x1d, 0x8e, 0xfd, 0x52, 0x82, 0xd4, 0xd3, 0x13, 0x5e, 0xa0, 0x0f, 0x83,
  0xdd, 0x14, 0x4f, 0xcf, 0xf8, 0xd9, 0x13, 0x7e, 0xde, 0x8c, 0x25, 0x30,
  0x40, 0x3e, 0x34, 0x9d, 0x04, 0xcd, 0x99, 0xdc, 0xd3, 0x82, 0xf3, 0x8d,
  0x35, 0x01, 0xd3, 0x34, 0x7b, 0x8e, 0x73, 0xcf, 0xa4, 0xe8, 0xa0, 0xbf,
  0x15, 0x5b, 0xcc, 0x9b, 0x41, 0x25, 0x01, 0xb8, 0x94, 0x5c, 0xe1, 0x69,
  0xfe, 0xe4, 0xec, 0x62, 0x01, 0xda, 0x46, 0xb1, 0xe0, 0x38, 0xdf, 0x47,
  0x4a, 0x3f, 0x98, 0xc7, 0x93, 0x8e, 0x96, 0x98, 0x7f, 0x1c, 0xe8, 0x38,
  0xed, 0xb9, 0xb1, 0x40, 0xdf, 0xe3, 0x5a, 0xab, 0x3b, 0x0c, 0xcb, 0xb7,
  0x9c, 0x85, 0xd1, 0xeb, 0x9f, 0xda, 0x6c, 0x4c, 0xbd, 0x9e, 0xcd, 0x8c,
  0x1d, 0xf0, 0xa4, 0x48, 0x02, 0x71, 0xb6, 0xd0, 0xed, 0x41, 0xba, 0x20,
  0x32, 0x61, 0x32, 0xed, 0xea, 0xc5, 0xe8, 0x46, 0xcf, 0x26, 0x05, 0x0a,
  0x35, 0xe8, 0xd6, 0x5a, 0xd8, 0x60, 0x3a, 0x4b, 0x8c, 0xb5, 0xf3, 0x2f,
  0xe3, 0x91, 0x01, 0x30, 0x7a, 0x6a, 0x76, 0x31, 0x77, 0x9a, 0x6b, 0xec,
  0x02, 0xe7, 0x11, 0xd5, 0x34, 0x0a, 0xca, 0x8e, 0x7a, 0x96, 0x38, 0x4f,
  0xa5, 0xdf, 0xb6, 0x09, 0xed, 0xb9, 0xbb, 0x55, 0x5a, 0xfe, 0xfc, 0x0c,
  0x81, 0x17, 0x34, 0xc8, 0x69, 0xaa, 0x34, 0xf3, 0xe7, 0x5f, 0x9f, 0x4f,
  0x70, 0xe1, 0x39, 0x45, 0x0d, 0x55, 0xd2, 0xe6, 0xc5, 0xd1, 0x66, 0x0b,
  0xcf, 0x75, 0x85, 0x50, 0x86, 0xbe, 0x3a, 0xc9, 0x4d, 0xae, 0x5b, 0x83,
  0x45, 0x70, 0x4c, 0x67, 0x56, 0xe6, 0x4f, 0x6b, 0x81, 0x74, 0x02, 0x4e,
  0xfa, 0x3a, 0x82, 0xeb, 0xb3, 0x03, 0x13, 0xec, 0x20, 0xbc, 0x38, 0x95,
  0x12, 0xcd, 0xd3, 0x2e, 0x45, 0x38, 0xc3, 0xf0, 0x8d, 0x11, 0xab, 0xa0,
  0x6e, 0x24, 0xf8, 0xbb, 0x6c, 0x90, 0x62, 0x29, 0x6f, 0x8f, 0x52, 0x6c,
  0x9f, 0x43, 0x44, 0xe8, 0xf0, 0x0c, 0xdc, 0x55, 0x6a, 0x5b, 0xa0, 0x46,
  0x19, 0x7f, 0x99, 0xea, 0x33, 0x8d, 0xd3, 0x34, 0xe1, 0xf8, 0x13, 0xbe,
  0x6e, 0xcb, 0x39, 0xc8, 0x0a, 0x45, 0x7d, 0xb2, 0xf7, 0x94, 0xab, 0x9d,
  0x82, 0x12, 0x18, 0x95, 0xa0, 0x1c, 0x52, 0x6a, 0x53, 0x8d, 0x61, 0x09,
  0x0d, 0x7f, 0x8a, 0x4f, 0x42, 0x81, 0xf6, 0x0f, 0x56, 0x0f, 0xa7, 0x2d,
  0x3a, 0x3e, 0x21, 0xd2, 0xe8, 0x43, 0x0c, 0x77, 0x20, 0x54, 0x1f, 0x50,
  0xc6, 0x24, 0x85, 0x6c, 0x5b, 0x14, 0x0e, 0x98, 0xd4, 0x3b, 0xda, 0x56,
  0xcd, 0xfe, 0xe9, 0x65, 0x15, 0x28, 0x21, 0x01, 0xb5, 0x9e, 0xe2, 0xdb,
  0x2c, 0x2c, 0xc0, 0xa2, 0x8e, 0xa9, 0x7a, 0x04, 0x4f, 0x39, 0x79, 0xa8,
  0x38, 0xbe, 0x40, 0xbf, 0xc3, 0xb9, 0xa4, 0xa0, 0xd7, 0x61, 0x48, 0xdb,
  0x42, 0x98, 0x06, 0xaa, 0x2a, 0xa4, 0x8e, 0x95, 0xbe, 0x66, 0xfc, 0x75,
  0x0f, 0xe3, 0x69, 0x3f, 0x2f, 0x52, 0x94, 0x37, 0x94, 0xc8, 0xa9, 0x83,
  0x21, 0xdd, 0x77, 0x89, 0x9f, 0xa0, 0xf5, 0x18, 0x1a, 0x4e, 0x23, 0x6b,
  0x51, 0xc4, 0xa1, 0x35, 0x6f, 0xe8, 0x39, 0xd1, 0x2b, 0xfe, 0xce, 0x8c,
  0x2a, 0xd0, 0x09, 0xa1, 0xfa, 0x72, 0xad, 0xc1, 0x31, 0xbd, 0x5c, 0x35,
  0xe5, 0xc5, 0xac, 0xd6, 0x2e, 0x14, 0x63, 0xb0, 0x40, 0x78, 0x05, 0x57,
  0xb2, 0x7b, 0xbe, 0xa8, 0xb4, 0x2c, 0x97, 0x74, 0x60, 0x6f, 0x4f, 0xcf,
  0x4e, 0x4c, 0x56, 0xdb, 0xff, 0xda, 0xec, 0xe3, 0x96, 0x17, 0x23, 0x2f,
  0x87, 0x8f, 0x6b, 0x48, 0x9d, 0x82, 0x60, 0x29, 0x32, 0xfd, 0xb6, 0xcb,
  0x9d, 0x2f, 0xe9, 0xc7, 0xb5, 0x0a, 0xd3, 0x93, 0xf3, 0xef, 0x4e, 0xaf,
  0x2e, 0xce, 0xdf, 0x9f, 0x9c, 0x5f, 0x7f, 0xe6, 0xb0, 0xbb, 0x50, 0x5f,
  0x87, 0xd2, 0x4f, 0x2e, 0x48, 0x31, 0x1c, 0x74, 0x4f, 0x45, 0x80, 0xdc,
  0x5d, 0x05, 0x56, 0x2a, 0xff, 0xea, 0xbb, 0xc3, 0x39, 0x0f, 0xa9, 0x67,
  0x1f, 0x33, 0x49, 0x16, 0xe8, 0xd9, 0x19, 0x63, 0x5c, 0xb5, 0xcf, 0xb1,
  0x00, 0xd3, 0x39, 0x18, 0x5b, 0x4b, 0x3c, 0x20, 0x94, 0x37, 0xa5, 0x02,
  0x63, 0xed, 0xd8, 0x67, 0x66, 0x4b, 0x38, 0x08, 0x68, 0x63, 0xa5, 0xb5,
  0x49, 0x58, 0xe2, 0xfe, 0x20, 0x05, 0xa0, 0x59, 0x14, 0x5c, 0x8d, 0xa2,
  0xdf, 0x91, 0x42, 0x40, 0x9f, 0xbd, 0xe1, 0x3c, 0x1c, 0x8e, 0xbe, 0x30,
  0x93, 0x70, 0x72, 0x40, 0x1d, 0x5c, 0x60, 0xa7, 0xc9, 0x71, 0x13, 0x0b,
  0xd8, 0x59, 0xc5, 0x8f, 0xea, 0x2c, 0x3a, 0xd8, 0xdc, 0xfc, 0x99, 0xfa,
  0x6b, 0x7f, 0x29, 0x0d, 0xb6, 0x7d, 0x08, 0xd4, 0xd2, 0x99, 0x86, 0x2d,
  0x19, 0xd2, 0xea, 0x42, 0xa4, 0x5b, 0xb3, 0x9d, 0xe4, 0x06, 0xfe, 0x78,
  0x79, 0x75, 0xf1, 0xc3, 0x5f, 0x7e, 0xe3, 0x4f, 0x38, 0xc9, 0x66, 0x3f,

  0x62, 0x0e, 0xa6, 0x0e, 0xfe, 0xf3, 0x6f, 0xfe, 0xb5, 0xfa, 0xf0, 0x5d,
  0x89, 0xb4, 0x73, 0x33, 0x70, 0x5f, 0x21, 0xe3, 0xe2, 0x6d, 0x06, 0xbb,
  0xb7, 0x29, 0xd1, 0x91, 0xe3, 0xe3, 0x30, 0xc9, 0x40, 0x24, 0xe2, 0xca,
  0x3a, 0x81, 0xc6, 0x3e, 0xf4, 0x75, 0x9f, 0x4b, 0x8a, 0x6d, 0x06, 0xaf,
  0x56, 0x95, 0x63, 0xe5, 0x38, 0xd7, 0x96, 0x53, 0x3e, 0xaa, 0xd9, 0x8f,
  0xa3, 0xb3, 0xb3, 0xdf, 0x74, 0x13, 0xa8, 0x47, 0xb1, 0x5d, 0x4b, 0xcf,
  0x68, 0xa8, 0xf2, 0xf4, 0x13, 0x48, 0xb4, 0xe7, 0x17, 0x32, 0x9b, 0x43,
  0x52, 0x8e, 0x7b, 0x65, 0x02, 0x2a, 0x6d, 0x8c, 0xf1, 0x7e, 0x85, 0x16,
  0xc7, 0x89, 0x95, 0x9b, 0x9c, 0x38, 0xe9, 0x21, 0x9d, 0xd3, 0x43, 0x94,
  0x2c, 0x40, 0x26, 0x14, 0xe5, 0x55, 0xf2, 0x6e, 0x72, 0x59, 0x1c, 0xd5,
  0x2d, 0xe4, 0x06, 0x97, 0x88, 0x3b, 0xa6, 0x73, 0xc7, 0xee, 0x49, 0xa0,
  0x21, 0x33, 0xa3, 0x43, 0xa0, 0xbc, 0x2d, 0xd2, 0xf2, 0x96, 0x8a, 0x3a,
  0xf0, 0x86, 0x92, 0x82, 0xa4, 0xf5, 0xfb, 0xa8, 0xf2, 0xd2, 0x9c, 0xfa,
  0x0c, 0x31, 0x62, 0xab, 0xe9, 0xd2, 0x32, 0x34, 0x3b, 0xea, 0x6c, 0xc5,
  0xa2, 0x18, 0xdd, 0xa8, 0xec, 0x84, 0x8e, 0x6b, 0xa5, 0x5d, 0x02, 0xcf,

  0xce, 0x49, 0x54, 0xa5, 0xc1, 0x19, 0x08, 0x95, 0xa5, 0x77, 0xb5, 0xdc,
  0x18, 0x1f, 0xe0, 0x4f, 0x57, 0x65, 0x32, 0x9b, 0x84, 0x2b, 0xec, 0x83,
  0xdc, 0x42, 0x2a, 0xfc, 0x4d, 0xcb, 0x78, 0x25, 0x56, 0x3c, 0xac, 0x84,
  0x30, 0x69, 0x30, 0xb4, 0xe0, 0xfb, 0xeb, 0x84, 0x0e, 0x6b, 0x79, 0x06,
  0x0f, 0xb6, 0xd1, 0x57, 0xe4, 0x54, 0xb3, 0x72, 0x9e, 0x98, 0x9e, 0xed,

  0xeb, 0xb1, 0x5f, 0x30, 0x05, 0x1c, 0xc9, 0xc5, 0xef, 0x50, 0xc9, 0xdb,
  0x7b, 0x88, 0x14, 0x38, 0x84, 0xcf, 0xa9, 0xf6, 0x8c, 0xfc, 0xe6, 0x39,
  0xc3, 0x51, 0xfb, 0x84, 0x12, 0x73, 0xa3, 0x65, 0xaa, 0x51, 0x85, 0xd9,
  0xbd, 0x55, 0x24, 0x7e, 0x71, 0x56, 0xc2, 0x09, 0x6b, 0xc7, 0xaf, 0x93,
  0x70, 0x26, 0xbe, 0x6a, 0xa2, 0xad, 0x33, 0x0d, 0xc4, 0x86, 0xe1, 0x31,
  0x74, 0xc1, 0x33, 0x88, 0x8c, 0x3b, 0x9e, 0x99, 0x27, 0x69, 0xab, 0x3c,
  0x47, 0xd6, 0xe3, 0x14, 0x4a, 0x2b, 0x09, 0x05, 0xe1, 0x82, 0xe9, 0x37,
  0xee, 0x95, 0x91, 0xbb, 0x60, 0x4a, 0xda, 0x49, 0x09, 0x37, 0x65, 0xa1,
  0x36, 0xd2, 0x8e, 0xe1, 0x96, 0xc8, 0xf7, 0x8f, 0x53, 0xfc, 0x05, 0x85,
  0x3a, 0x31, 0x22, 0x8a, 0x95, 0x98, 0xba, 0x03, 0x29, 0x96, 0xa5, 0xfa,
  0xba, 0xa1, 0x96, 0x19, 0x6b, 0x70, 0x0b, 0x44, 0xe0, 0x2c, 0x2f, 0x43,
  0x70, 0x9a, 0x43, 0xcc, 0x9a, 0x4f, 0xa8, 0x15, 0x0f, 0x5f, 0x79, 0xf8,
  0xef, 0xf5, 0xc5, 0xf1, 0xc5, 0x19, 0xfc, 0xe5, 0xe4, 0xed, 0xe9, 0x0f,
  0x56, 0x2b, 0x60, 0x80, 0x8a, 0x5a, 0x81, 0x0c, 0xe1, 0x2e, 0xbe, 0xec,
  0xba, 0x6c, 0x88, 0x73, 0x10, 0x31, 0xfd, 0x90, 0x53, 0xe2, 0x9a, 0x14,


  0x6a, 0xb8, 0xa5, 0xc3, 0xe7, 0x50, 0x4e, 0x63, 0xbe, 0xa8, 0x83, 0x3f,
  0x12, 0x0b, 0xf0, 0x12, 0x6a, 0xd1, 0x3c, 0xb2, 0x29, 0xa6, 0xb0, 0x9b,
  0x8c, 0x35, 0x52, 0x2e, 0x9b, 0x93, 0x6c, 0x54, 0xfb, 0xc9, 0x54, 0x61,
  0x89, 0x6a, 0x93, 0xcb, 0x0b, 0xd3, 0xa7, 0xb6, 0x72, 0x7b, 0xa0, 0x37,
  0x9a, 0xce, 0xb8, 0x88, 0xf6, 0x59, 0xe2, 0x2e, 0xd2, 0x34, 0x2e, 0xaf,
  0x8a, 0x84, 0xb8, 0x22, 0x01, 0xd5, 0xa1, 0x22, 0xe0, 0xa2, 0x7c, 0x34,
  0x28, 0x82, 0x2a, 0x74, 0xcc, 0x88, 0xf5, 0x35, 0xc9, 0x06, 0x48, 0x2e,
  0x1f, 0xe5, 0x56, 0xa0, 0x1e, 0xef, 0x40, 0xfc, 0x08, 0xb5, 0x06, 0xcb,
  0x05, 0xa5, 0x4e, 0x09, 0xff, 0xa0, 0xec, 0x2a, 0x8e, 0x62, 0x08, 0x47,
  0xbd, 0x76, 0x9a, 0xaf, 0xb3, 0x54, 0x90, 0xe0, 0xd3, 0xc2, 0x37, 0xad,
  0xf0, 0x0c, 0x44, 0xd9, 0xaf, 0x6b, 0x1c, 0x65, 0xdb, 0xa7, 0xd1, 0x44,
  0x95, 0x3d, 0xb0, 0x9f, 0xf6, 0xb2, 0xae, 0x31, 0xeb, 0xbb, 0xdc, 0x5b,
  0x35, 0x06, 0x6a, 0x84, 0x7f, 0x5b, 0xa6, 0x77, 0x31, 0xd5, 0x96, 0xc1,
  0x65, 0xe9, 0xf5, 0xf8, 0xa5, 0xc6, 0x18, 0xf1, 0xaf, 0x1a, 0x24, 0xae,
  0x8f, 0xb2, 0xff, 0x6b, 0x06, 0xd9, 0x6f, 0x8c, 0x71, 0xf3, 0xab, 0x06,
  0xe9, 0xa9, 0x80, 0x00, 0xc5, 0xf8, 0x87, 0xd3, 0xeb, 0xe8, 0xf8, 0xe2,

  0x8d, 0xbd, 0x60, 0xd7, 0x26, 0x7b, 0x3b, 0x8e, 0x86, 0xcb, 0x0c, 0x68,
  0x10, 0xbb, 0x25, 0x99, 0xfe, 0x13, 0x9c, 0xa6, 0x88, 0x39, 0x38, 0xa5,
  0x56, 0xac, 0xa5, 0x05, 0x43, 0x11, 0x61, 0x5e, 0x0d, 0x23, 0x29, 0x39,
  0x35, 0xba, 0xf8, 0xf4, 0x1c, 0x81, 0x8e, 0xa6, 0x2a, 0x7d, 0xf1, 0x56,
  0x22, 0xd6, 0x5d, 0x5c, 0x68, 0x55, 0xe9, 0x30, 0x46, 0x30, 0xa3, 0x8c,
  0x6b, 0x23, 0x41, 0x76, 0x06, 0xa0, 0x87, 0x75, 0x38, 0x17, 0x81, 0x18,
  0x74, 0xe7, 0xb4, 0xd2, 0xa9, 0xb8, 0x99, 0x84, 0xdb, 0x9a, 0xeb, 0x5f,
  0xa3, 0x74, 0x69, 0x40, 0x47, 0xc2, 0x0f, 0xf3, 0xba, 0xc7, 0x06, 0xce,
  0x1a, 0x55, 0xe2, 0xcc, 0xe6, 0xec, 0x73, 0x1b, 0x6a, 0x4f, 0x62, 0x9b,
  0x21, 0xcc, 0x77, 0x76, 0x24, 0x94, 0x00, 0x2a, 0x3a, 0xfb, 0x0d, 0x24,
  0xaf, 0x2c, 0xfd, 0xbb, 0xa3, 0xa0, 0xef, 0x1a, 0x7d, 0x0c, 0x56, 0x3e,
  0xa3, 0xde, 0xce, 0x63, 0xbe, 0x10, 0xe5, 0x23, 0x08, 0xf5, 0x07, 0x32,
  0xc8, 0xd1, 0x7e, 0x12, 0x38, 0x27, 0xfb, 0xe6, 0x9e, 0x68, 0x65, 0x91,
  0xc1, 0x8d, 0xa2, 0x06, 0x59, 0x8b, 0x7a, 0x34, 0xc8, 0x7a, 0x2d, 0xb4,
  0x44, 0x9a, 0x42, 0x9c, 0x49, 0x89, 0xbd, 0xa6, 0x03, 0x9e, 0x0b, 0x9b,
  0x78, 0xc0, 0xf0, 0x0d, 0x5c, 0x6e, 0x2d, 0xf0, 0xdb, 0x4e, 0x23, 0x41,

  0x03, 0xf6, 0x83, 0x99, 0x49, 0xb4, 0x5f, 0x3d, 0xee, 0xa2, 0xe4, 0xd5,
  0xa5, 0xdb, 0x0a, 0x4c, 0xb5, 0x38, 0xc6, 0x39, 0x6d, 0x60, 0x97, 0x32,
  0x79, 0xb1, 0xe9, 0x7d, 0x8c, 0x50, 0x0f, 0xd4, 0xbc, 0x30, 0xce, 0xb8,
  0xd2, 0x50, 0x4f, 0x20, 0x5c, 0x73, 0x67, 0x6b, 0x9e, 0xf6, 0xf9, 0x8f,
  0x63, 0xd5, 0xd8, 0xa4, 0x6c, 0xc8, 0x65, 0x2c, 0x2c, 0x64, 0xc4, 0xba,
  0xc9, 0x09, 0xa3, 0x03, 0x65, 0x10, 0xad, 0x8f, 0x18, 0xa4, 0xbf, 0x09,
  0x65, 0xc3, 0xc7, 0xf9, 0xa2, 0xe5, 0x2b, 0x0c, 0xe9, 0x64, 0x3f, 0xe2,
  0xfa, 0xe4, 0x75, 0x0b, 0xe5, 0x59, 0x67, 0xb4, 0x97, 0x4d, 0xba, 0x70,
  0x3c, 0xfb, 0x34, 0xa2, 0x79, 0xf2, 0x73, 0xf1, 0x45, 0x24, 0x58, 0xb4,
  0x28, 0xca, 0x73, 0x91, 0x2c, 0x66, 0xb2, 0x32, 0xf9, 0x09, 0x05, 0x8e,
  0xc9, 0x9b, 0x40, 0xbb, 0x3c, 0xd2, 0x59, 0x82, 0x3a, 0xec, 0x9a, 0x82,
  0xaf, 0xe4, 0xb3, 0xd8, 0xa6, 0x8d, 0x55, 0x07, 0xc2, 0xdd, 0x48, 0x0d,

  0xbd, 0x49, 0x5b, 0x78, 0xfa, 0x11, 0x26, 0x38, 0x12, 0xaa, 0x83, 0xfe,
  0x5b, 0xde, 0xf0, 0x90, 0xee, 0x1a, 0xae, 0x64, 0x5c, 0xed, 0xb2, 0xe0,
  0xa2, 0x5d, 0x8b, 0xed, 0xa8, 0x60, 0xeb, 0x92, 0xff, 0x57, 0x20, 0x24,
  0x5f, 0x1f, 0x78, 0x51, 0xee, 0xa1, 0x4f, 0xe6, 0x93, 0x4a, 0xb0, 0xbf,
  0xb8, 0x23, 0x1a, 0xef, 0xcf, 0x4d, 0x9c, 0x4d, 0x13, 0xf6, 0xbf, 0x38,
  0xf0, 0x94, 0xdc, 0x4d, 0x8f, 0xc5, 0x21, 0xdc, 0x75, 0x72, 0xf2, 0xb4,
  0xa2, 0x4f, 0xd8, 0x7d, 0xd8, 0xde, 0x32, 0xfb, 0xc0, 0x8d, 0xb2, 0xa8,
  0x3a, 0x05, 0x77, 0xe1, 0x7b, 0x42, 0x24, 0xbc, 0x8f, 0xb9, 0x91, 0xae,
  0xb6, 0x9b, 0xb7, 0x46, 0x8b, 0x09, 0xf3, 0x60, 0x64, 0xcd, 0xcf, 0x93,
  0x26, 0x24, 0x07, 0xcc, 0x82, 0x41, 0x7d, 0x80, 0x53, 0x3d, 0xb9, 0xbc,
  0x51, 0xc4, 0x55, 0x97, 0x0c, 0x7a, 0xc3, 0x20, 0x39, 0xce, 0x4a, 0xbc,
  0xf7, 0x2e, 0x09, 0xc1, 0x66, 0x28, 0x6e, 0x95, 0x93, 0xcd, 0x61, 0x41,
  0x43, 0x9c, 0xf5, 0x6c, 0x9b, 0xf5, 0xdc, 0x13, 0xa1, 0x5c, 0x1e, 0x0d,
  0x06, 0x4a, 0x26, 0xc7, 0x3e, 0x45, 0x48, 0xf4, 0x88, 0x10, 0x74, 0xa4,
  0x48, 0x3a, 0xa0, 0x2a, 0xca, 0x20, 0x8d, 0x24, 0x83, 0x6d, 0xe6, 0x69,
  0x6f, 0x98, 0x31, 0x93, 0x36, 0x21, 0xeb, 0x65, 0xba, 0xd2, 0x15, 0xdf,
  0xaf, 0xde, 0xc9, 0xcf, 0x82, 0xe9, 0x2a, 0x1c, 0xb0, 0xc4, 0x7d, 0xa6,
  0x62, 0x64, 0xe5, 0xf1, 0xa4, 0x1a, 0x3e, 0x2c, 0xd2, 0x5a, 0xcf, 0xc2,
  0xed, 0x5d, 0x7f, 0xd1, 0xdf, 0xf1, 0xaa, 0xba, 0xff, 0xd2, 0xa2, 0xbf,
  0x0b, 0x2c, 0x7a, 0xcf, 0x5e, 0x1c, 0xfe, 0x58, 0xb4, 0xb3, 0xf3, 0x52,
  0x0b, 0x42, 0x80, 0x8e, 0xe9, 0x7b, 0xf6, 0x83, 0xce, 0x17, 0xe1, 0xb9,
  0x1e, 0xd5, 0x1f, 0xf8, 0xdf, 0x72, 0x2e, 0xaf, 0xf3, 0xa9, 0x7d, 0xf3,
  0x29, 0x50, 0xbf, 0xd1, 0x02, 0x05, 0x9d, 0x9e, 0xb9, 0x8c, 0xc7, 0x7c,
  0xd4, 0x94, 0x43, 0x35, 0xfc, 0x1e, 0xf3, 0xa7, 0x2a, 0xa3, 0x4b, 0x36,
  0x3e, 0xa5, 0xb3, 0x70, 0xbe, 0xf3, 0xc2, 0xb8, 0x51, 0x36, 0x77, 0x34,
  0x80, 0x7e, 0x44, 0xbc, 0x78, 0x96, 0xcc, 0x89, 0x32, 0xc7, 0x09, 0xa2,
  0xf5, 0x58, 0xf7, 0x1f, 0xd7, 0xdc, 0x4d, 0x8a, 0x98, 0xd0, 0x96, 0x67,



  0xf1, 0x63, 0x00, 0x6c, 0x4b, 0x3c, 0xc5, 0x6c, 0xae, 0xc4, 0x38, 0xfb,
  0x0c, 0x6d, 0x05, 0xd2, 0x04, 0xc4, 0x6d, 0x86, 0x7e, 0x58, 0x3c, 0xd1,
  0x7c, 0x62, 0x5c, 0xb5, 0xf2, 0x55, 0x0f, 0x0e, 0xa0, 0x94, 0x06, 0x86,
  0x7c, 0x65, 0x44, 0x4b, 0x08, 0x63, 0xc3, 0x6d, 0xbf, 0xb4, 0x47, 0x64,
  0xce, 0x01, 0x1d, 0x5b, 0x0c, 0x11, 0xe2, 0xec, 0x9e, 0xf2, 0x12, 0x8d,
  0x07, 0x48, 0x1f, 0x1d, 0x8c, 0xd2, 0xa5, 0xbe, 0xd5, 0x5c, 0x38, 0x0a,
  0xe2, 0x36, 0x73, 0xe3, 0x4b, 0x64, 0x76, 0x02, 0xb8, 0xdb, 0x8f, 0x2e,
  0xc8, 0x0b, 0x57, 0x83, 0x18, 0x9f, 0x30, 0xe9, 0xdb, 0xa2, 0xd1, 0x3a,
  0xe1, 0xbe, 0xb2, 0x27, 0xac, 0x73, 0xd2, 0xe4, 0x97, 0x4d, 0x65, 0xb2,
  0x46, 0xa0, 0xa8, 0xb7, 0x39, 0x89, 0xae, 0x4e, 0xae, 0xaf, 0x28, 0xce,
  0x4b, 0x0c, 0xc0, 0x03, 0x49, 0x8d, 0x8b, 0x0d, 0x03, 0x12, 0x24, 0xec,
  0xcc, 0xea, 0x21, 0x96, 0x41, 0x30, 0x7e, 0x99, 0x39, 0x6f, 0xfe, 0xa7,
  0xbe, 0xc7, 0xd5, 0x2f, 0x89, 0xd6, 0x9a, 0xd8, 0x88, 0x4e, 0x1d, 0x59,
  0x6d, 0x67, 0xc7, 0x66, 0x21, 0x71, 0x73, 0x63, 0x16, 0x73, 0x92, 0x49,
  0xde, 0x97, 0xec, 0x16, 0x2d, 0xbe, 0xd0, 0x66, 0x76, 0xf8, 0x10, 0x67,

  0x63, 0xe7, 0x45, 0x40, 0xe4, 0xca, 0xa7, 0x55, 0xfe, 0xf3, 0x14, 0x2c,
  0x8a, 0x1a, 0x7f, 0x8d, 0x7f, 0xca, 0xdc, 0x53, 0x2a, 0x00, 0xa3, 0xbd,
  0xad, 0xad, 0x00, 0xec, 0x70, 0x3c, 0x04, 0xa6, 0x2a, 0xda, 0x9c, 0x54,
  0xf5, 0xd0, 0x5b, 0xec, 0x35, 0x25, 0xf5, 0xb2, 0x44, 0x53, 0xa3, 0x37,
  0x41, 0x37, 0x26, 0xee, 0x98, 0x6f, 0x54, 0xec, 0x30, 0x8f, 0xf9, 0x9e,
  0xaa, 0x8c, 0x74, 0xd3, 0x1a, 0xcc, 0x85, 0x4b, 0x90, 0xb4, 0x7b, 0x6e,
  0xec, 0x80, 0x31, 0x8b, 0xff, 0xdb, 0x9b, 0x99, 0xc7, 0xbf, 0x77, 0xf6,
  0x7d, 0x8a, 0x18, 0x5c, 0x5f, 0x5c, 0x09, 0x85, 0xf9, 0xa2, 0x99, 0x77,


  0x84, 0x1e, 0xb1, 0x68, 0x2b, 0x5d, 0x1f, 0x72, 0x67, 0x6c, 0xf0, 0x01,
  0x0c, 0x8a, 0xa9, 0xf3, 0x55, 0xe6, 0x00, 0xd4, 0x40, 0x4f, 0x96, 0xf6,

  0x9d, 0x20, 0x02, 0x28, 0x5e, 0xaf, 0xde, 0x4b, 0xe7, 0x25, 0xbe, 0x66,

  0x17, 0x7c, 0x7f, 0xb9, 0x7a, 0x1d, 0xe9, 0x48, 0xea, 0xd8, 0x11, 0xef,
  0x57, 0xd2, 0x61, 0x4d, 0xa7, 0xcf, 0x26, 0x2d, 0xf2, 0x25, 0xba, 0xb0,
  0x90, 0xcc, 0xcc, 0xe1, 0x65, 0x9d, 0xc6, 0x2a, 0xa6, 0x6e, 0xb3, 0xc8,
  0x27, 0x18, 0xb2, 0x58, 0x12, 0x9b, 0x62, 0xf6, 0x85, 0x8d, 0x3c, 0x58,
  0xf7, 0xbc, 0x18, 0x4b, 0xfa, 0x8a, 0x08, 0x4e, 0x35, 0x16, 0xac, 0x9e,
  0x6d, 0xa5, 0xfe, 0xe5, 0xc5, 0xd5, 0xb5, 0x91, 0xf9, 0xf8, 0x59, 0xfa,
  0x41, 0xe3, 0xf6, 0x60, 0xbf, 0x14, 0xc1, 0x9f, 0x10, 0xc9, 0x46, 0x3d,
  0x7c, 0x3f, 0x0b, 0x42, 0x10, 0xc8, 0x91, 0xd0, 0x38, 0x3a, 0x50, 0x97,
  0x3a, 0xed, 0x8d, 0x73, 0x86, 0xf3, 0x31, 0xfc, 0x86, 0x3d, 0xe8, 0x24,

  0x68, 0x5a, 0x90, 0xc1, 0xac, 0x72, 0xbb, 0xbb, 0xed, 0x53, 0x06, 0xda,
  0xd0, 0x57, 0x27, 0x83, 0x6b, 0x9e, 0x39, 0xfe, 0xcd, 0x9b, 0x39, 0xd7,
  0x87, 0xca, 0x0f, 0x7d, 0x27, 0xaa, 0xa1, 0x0c, 0xcc, 0x40, 0x03, 0x6b,
  0x83, 0xc6, 0x37, 0x05, 0xee, 0xce, 0x8e, 0xed, 0x3a, 0xd9, 0x86, 0xc4,
  0x34, 0x85, 0x4e, 0xe8, 0x7e, 0xd3, 0x0f, 0x3a, 0xf2, 0x95, 0x0e, 0xa8,
  0x65, 0x7c, 0x1d, 0x6a, 0xf0, 0xeb, 0xbb, 0x7b, 0x76, 0x84, 0x05, 0x4a,
  0x2a, 0x19, 0xe0, 0x54, 0xdb, 0xe4, 0xe2, 0x0f, 0x7b, 0x4a, 0x2a, 0x24,
  0x2c, 0x98, 0x28, 0xf8, 0x39, 0x3b, 0xce, 0xbe, 0x94, 0xa8, 0x9f, 0x19,
  0x55, 0xc1, 0x99, 0x0a, 0xfe, 0x58, 0x53, 0x7e, 0x48, 0xdb, 0x68, 0x90,
  0xdc, 0x2e, 0x53, 0xfa, 0xd7, 0x98, 0x2d, 0x68, 0xd2, 0x16, 0x79, 0xed,
  0xae, 0x5c, 0x00, 0x65, 0x2b, 0xcd, 0x96, 0x09, 0xe9, 0x68, 0x71, 0x31,
  0xc3, 0x5e, 0x0f, 0xc0, 0x44, 0x0a, 0xae, 0x1f, 0xbb, 0xcf, 0x42, 0xb0,
  0xd4, 0xce, 0x37, 0x44, 0xfe, 0x9c, 0x9e, 0x9d, 0xd8, 0xa3, 0xe2, 0x3e,

  0x11, 0x74, 0x89, 0xad, 0xae, 0x8f, 0xad, 0xed, 0x8d, 0x98, 0xe8, 0x47,
  0x97, 0xd8, 0xb3, 0x9c, 0x74, 0xa6, 0xf2, 0xdf, 0xed, 0x68, 0x7c, 0x49,
  0xc8, 0x03, 0x0f, 0x62, 0x93, 0xca, 0x9d, 0xd3, 0x0c, 0x4e, 0x96, 0x7e,
  0x82, 0x7f, 0x75, 0x30, 0xcd, 0xbd, 0xe5, 0xbe, 0xb2, 0x2f, 0x97, 0xb0,
  0x12, 0xb0, 0xd0, 0x9b, 0x8f, 0xec, 0x09, 0x5d, 0x81, 0xf9, 0x4e, 0x43,

  0x18, 0xd6, 0x8c, 0x77, 0x59, 0x9a, 0xc5, 0x8c, 0x79, 0x84, 0x89, 0x3e,
  0x53, 0x63, 0xe1, 0xce, 0x50, 0x2c, 0x0c, 0x8e, 0x86, 0xa6, 0x81, 0x10,
  0x26, 0x09, 0xa3, 0x22, 0x07, 0x63, 0x65, 0xc8, 0x69, 0x67, 0x26, 0xd7,
  0xde, 0x8d, 0x01, 0xd3, 0xd6, 0x1a, 0xbc, 0xa8, 0xe6, 0xe6, 0x36, 0x1a,
  0xb0, 0xef, 0x31, 0x25, 0x1a, 0xb2, 0x31, 0xf2, 0xab, 0x36, 0x3b, 0xc9,

  0x4e, 0x16, 0xdc, 0x3b, 0x74, 0x1a, 0x60, 0x3c, 0x00, 0xe4, 0xbb, 0xab,
  0xfc, 0xef, 0xed, 0xdb, 0xa1, 0x26, 0x04, 0xde, 0xa3, 0x7c, 0xfd, 0xa8,
  0xe6, 0x94, 0x33, 0x9d, 0x24, 0x52, 0xf3, 0x24, 0x9b, 0x8d, 0x5c, 0x7b,
  0x1e, 0xb8, 0x52, 0xce, 0x37, 0x5e, 0x8a, 0xe9, 0x8b, 0xb6, 0x6f, 0xf6,
  0x68, 0x93, 0xef, 0xfb, 0x1c, 0x55, 0x66, 0xbf, 0x19, 0x37, 0xaa, 0x91,
  0xdf, 0x08, 0x08, 0xe3, 0x8d, 0xf8, 0x65, 0xb0, 0x15, 0x95, 0x87, 0xb8,
  0xb8, 0x9c, 0x4b, 0x0e, 0xaf, 0xf3, 0xa5, 0xcf, 0xc5, 0x93, 0x81, 0xc5,
  0xe7, 0x99, 0x05, 0x29, 0x72, 0x16, 0x82, 0x8a, 0xae, 0x58, 0xcd, 0x1a,
  0xca, 0x07, 0xe6, 0x38, 0x8a, 0x4d, 0x0a, 0xb0, 0x8f, 0xb1, 0x87, 0xc8,
  0x65, 0xc8, 0x66, 0x45, 0xd9, 0x55, 0x8f, 0x42, 0xae, 0x45, 0xc0, 0xe2,
  0x59, 0x90, 0xc7, 0xf8, 0x57, 0xa6, 0x69, 0x90, 0xef, 0x12, 0x2f, 0x92,
  0xbf, 0x92, 0x22, 0xd9, 0x37, 0xdd, 0x5a, 0x35, 0xa0, 0x1c, 0x67, 0xcb,
  0xd8, 0xb1, 0xe5, 0xf7, 0x5e, 0x89, 0x87, 0x4a, 0xdc, 0x20, 0x18, 0x59,
  0xcf, 0x10, 0xfc, 0xba, 0x11, 0x5e, 0xdc, 0xdf, 0x36, 0xbe, 0x4a, 0x4c,
  0x99, 0x95, 0x3a, 0x10, 0x37, 0x71, 0x16, 0xe1, 0x8f, 0x07, 0xef, 0xa2,
  0xf7, 0x6f, 0xf6, 0x31, 0xa1, 0x67, 0x9a, 0x14, 0x8b, 0x02, 0x93, 0x38,
  0x95, 0x86, 0x2f, 0xbe, 0x75, 0x06, 0xdb, 0xb1, 0xd9, 0x17, 0x0a, 0x8e,
  0x28, 0xcc, 0x4c, 0xec, 0x05, 0x38, 0x42, 0x2c, 0x7c, 0x9e, 0x6a, 0x0b,
  0x4c, 0xc5, 0xf1, 0x53, 0xb4, 0x2a, 0xd2, 0x5a, 0x3e, 0x6b, 0x26, 0x85,
  0xd7, 0x18, 0xd8, 0xfe, 0xae, 0x65, 0x60, 0xc5, 0xe3, 0x02, 0x9b, 0xab,
  0x64, 0x53, 0x34, 0x0b, 0x02, 0x37, 0x6a, 0x9f, 0x99, 0xe6, 0x31, 0xdf,
  0x7b, 0xd4, 0x61, 0xfd, 0xd7, 0x48, 0x3d, 0x27, 0x77, 0xa9, 0xf3, 0xde,
  0xbe, 0xeb, 0x55, 0x28, 0xa5, 0x33, 0x9a, 0xb4, 0xc4, 0x20, 0x0d, 0xc5,
  0x79, 0xf6, 0x85, 0x79, 0x16, 0xfd, 0x46, 0x69, 0xe6, 0xb4, 0x30, 0x6a,
  0x79, 0x43, 0x94, 0x5f, 0x35, 0x10, 0x54, 0x31, 0x63, 0x7d, 0xc7, 0xd9,
  0x7b, 0xe7, 0x95, 0x57, 0x75, 0xa7, 0x09, 0xf5, 0x36, 0x30, 0x84, 0x49,
  0x8b, 0xa2, 0xce, 0xb2, 0x8e, 0x9b, 0x85, 0x65, 0xf4, 0x65, 0x33, 0x0f,
  0x5a, 0x79, 0x60, 0xe2, 0x22, 0x88, 0xe8, 0x55, 0x67, 0xd2, 0x3f, 0x3e,
  0x8a, 0xda, 0x8a, 0x80, 0x88, 0xd6, 0x9d, 0x8f, 0x6c, 0xcb, 0x9d, 0xc1,
  0xbe, 0xd4, 0xd3, 0x2c, 0xfd, 0x7b, 0xe2, 0xe4, 0x82, 0x69, 0xfb, 0x29,
  0xe7, 0xf1, 0x1d, 0x61, 0x18, 0xdc, 0x7b, 0x98, 0x98, 0x22, 0x06, 0x4f,
  0xed, 0x03, 0xbb, 0x42, 0xb5, 0xdc, 0x3d, 0x8e, 0x73, 0x1f, 0x60, 0x54,
  0x0a, 0xdd, 0x27, 0xb5, 0xb4, 0xfa, 0x17, 0x7b, 0xa2, 0x73, 0xa9, 0x6e,
  0x8c, 0x92, 0x17, 0x37, 0x62, 0x46, 0x80, 0x8c, 0x4d, 0x36, 0xfd, 0x42,

  0xc4, 0x9e, 0x1c, 0xa5, 0x69, 0x41, 0x65, 0xda, 0x79, 0xe1, 0x5f, 0xef,
  0xd3, 0x4c, 0x12, 0xdd, 0xbd, 0xd7, 0x5f, 0xb4, 0xb8, 0x1f, 0x4b, 0x96,
  0x99, 0x27, 0x44, 0x4b, 0xce, 0xf3, 0x2f, 0xed, 0x4d, 0xb0, 0x08, 0xb4,
  0x5d, 0x8b, 0x7b, 0xdb, 0x75, 0x31, 0x4b, 0xf5, 0x2e, 0xb1, 0x0b, 0x25,
  0xe1, 0x5e, 0x07, 0x01, 0x64, 0xf9, 0x89, 0xf9, 0xfc, 0x2c, 0x47, 0x6e,
  0xea, 0x7c, 0x8f, 0x49, 0xea, 0x2d, 0xf5, 0xaa, 0xb0, 0xc6, 0x41, 0x16,
  0x5d, 0x3b, 0x65, 0xb2, 0xf6, 0xe9, 0x57, 0x42, 0x1b, 0x2a, 0x2f, 0x8d,
  0xb1, 0xda, 0xf6, 0xc6, 0xcb, 0x2d, 0x57, 0x59, 0x1d, 0x63, 0x54, 0x96,
  0xcb, 0xf8, 0x5b, 0x5f, 0x60, 0xca, 0x38, 0x05, 0x31, 0x32, 0x05, 0xa2,
  0xa6, 0x67, 0x2c, 0x9a, 0xa1, 0x7d, 0x6c, 0xa7, 0xc6, 0x74, 0xaf, 0x5d,
  0xf5, 0x29, 0x3a, 0x7d, 0xe3, 0x3c, 0xb8, 0x6b, 0x17, 0x18, 0xcf, 0x50,
  0x1b, 0x78, 0x64, 0x3f, 0x55, 0x19, 0xad, 0xe3, 0x5b, 0x0e, 0x66, 0xc9,
  0x4b, 0xa6, 0x8c, 0xf3, 0x9c, 0x51, 0xb7, 0x68, 0xfb, 0xbd, 0x67, 0x98,
  0x1c, 0x8e, 0x6f, 0x40, 0xaa, 0x8d, 0x2a, 0xca, 0x09, 0xcd, 0x34, 0xc6,
  0xd5, 0x3c, 0xfb, 0x97, 0x2f, 0x56, 0x3c, 0x2b, 0x42, 0xb3, 0x34, 0xa2,
  0xde, 0x79, 0xef, 0xa5, 0x7f, 0xcd, 0xd5, 0x1c, 0xd0, 0x32, 0x05, 0xb8,
  0x6a, 0x78, 0xd3, 0xa2, 0x75, 0x2c, 0x8f, 0xfe, 0x77, 0x75, 0x0c, 0x16,
  0x88, 0x27, 0x58, 0xfe, 0xbb, 0x3b, 0xdf, 0xcf, 0xdd, 0x5a, 0x07, 0xf6,
  0x0a, 0x16, 0x09, 0xc5, 0x09, 0x46, 0xb5, 0x76, 0x11, 0x36, 0x47, 0x88,
  0x76, 0xc7, 0x19, 0x81, 0xcf, 0x1c, 0xf4, 0x88, 0x65, 0x66, 0x39, 0x07,
  0x1b, 0x81, 0x82, 0x46, 0x30, 0x76, 0xa1, 0x27, 0x91, 0xe7, 0x8b, 0x07,
  0xca, 0xf1, 0xa1, 0x6e, 0x35, 0xae, 0x41, 0x79, 0xb3, 0x64, 0x93, 0xdb,
  0xac, 0xc8, 0x3a, 0xd8, 0x9c, 0xd7, 0x76, 0x2c, 0xf7, 0xa2, 0xb9, 0x91,
  0xda, 0x78, 0x0c, 0xb3, 0x65, 0x9b, 0xdc, 0xf4, 0x0f, 0xa0, 0x7a, 0xe9,
  0xfb, 0x22, 0xc7, 0xbf, 0x2a, 0x44, 0xc8, 0x7a, 0xdc, 0x92, 0x9a, 0x29,
  0x49, 0xe4, 0xce, 0x67, 0x44, 0xb5, 0xc1, 0x14, 0x27, 0x38, 0xa5, 0x9b,
  0x64, 0x74, 0xab, 0x57, 0x46, 0x06, 0xb1, 0xa9, 0xe7, 0xce, 0x5b, 0x7b,
  0x66, 0x6b, 0xc9, 0xa0, 0xb9, 0x3a, 0x69, 0x5a, 0x01, 0xf6, 0x51, 0xa6,
  0x9a, 0xab, 0xeb, 0xc1, 0xe5, 0x01, 0xce, 0x99, 0xe3, 0x86, 0x70, 0x21,
  0x8e, 0x07, 0xc9, 0xdf, 0xa4, 0xce, 0xac, 0xb4, 0x4f, 0xbf, 0x68, 0x79,
  0x7a, 0x20, 0x8e, 0xbd, 0x53, 0x42, 0x6a, 0x86, 0x73, 0x70, 0x5f, 0x62,
  0xa2, 0x59, 0x66, 0xea, 0xdf, 0x67, 0xff, 0x17, 0xce, 0x8c, 0xb8, 0x21,
  0xc6, 0x96, 0xed, 0xc3, 0x9f, 0x5b, 0x9b, 0xe6, 0x66, 0x99, 0xdd, 0x1a,
  0x7d, 0x51, 0x70, 0xf4, 0xf4, 0x80, 0xed, 0x0b, 0xaf, 0xf4, 0x6a, 0x38,
  0x7e, 0x50, 0x93, 0xf7, 0xd4, 0x15, 0x0f, 0x85, 0xb8, 0x1d, 0x25, 0xe6,
  0x09, 0xfc, 0x75, 0xe9, 0xec, 0xc1, 0xab, 0x2d, 0x23, 0x7e, 0x05, 0x92,
  0xe7, 0x36, 0x79, 0xb4, 0x54, 0xa7, 0x39, 0x16, 0x8b, 0x34, 0x43, 0x17,
  0x84, 0x7d, 0xc4, 0x0e, 0xb0, 0x5d, 0x13, 0x02, 0x4d, 0x75, 0xa3, 0xac,
  0xe2, 0x6a, 0xe9, 0x88, 0x98, 0x57, 0x4c, 0x3b, 0x03, 0x8c, 0x3a, 0xce,
  0x85, 0x5e, 0xd3, 0x4c, 0xbd, 0x6d, 0x0d, 0x17, 0x9a, 0xbe, 0xf4, 0xc3,
  0x0f, 0x2c, 0x47, 0x72, 0x05, 0x46, 0x92, 0xd0, 0x95, 0x69, 0xfe, 0x04,
  0x4c, 0x97, 0x55, 0x0f, 0xbc, 0xc2, 0x14, 0xef, 0x29, 0x12, 0xec, 0x4f,
  0xa9, 0xd8, 0x37, 0x74, 0x79, 0x42, 0xd1, 0xf3, 0x3c, 0x93, 0x98, 0x2d,

  0x26, 0x6f, 0x92, 0xeb, 0x93, 0xc1, 0xa6, 0xd9, 0x15, 0x06, 0x33, 0x38,



  0xfa, 0x70, 0xfd, 0xee, 0xe2, 0x6a, 0x10, 0x6d, 0x62, 0x6d, 0xfb, 0xf5,
  0xd5, 0xe9, 0xd7, 0x1f, 0xae, 0xe1, 0x9f, 0x3a, 0xd2, 0x9b, 0x38, 0x4b,
  0x41, 0x3a, 0x0d, 0xaa, 0x24, 0x03, 0x5a, 0x99, 0x6a, 0x8f, 0x26, 0xca,
  0x41, 0x41, 0x79, 0x9c, 0x17, 0x0a, 0x69, 0x82, 0xe9, 0x28, 0xf9, 0xcc,
  0x26, 0x13, 0xb0, 0x07, 0x1b, 0x73, 0xfc, 0x72, 0x6b, 0x39, 0xa7, 0x8d,
  0xa2, 0x7c, 0x4d, 0xdb, 0x89, 0xae, 0xdf, 0x1d, 0x9d, 0x7f, 0x3b, 0xd0,

  0x0e, 0x1e, 0xdf, 0x7f, 0xff, 0x7d, 0x33, 0xb8, 0x4b, 0x3a, 0xec, 0x4d,
  0xfc, 0xf0, 0xd0, 0x2f, 0x93, 0xcf, 0x3e, 0x1b, 0x9c, 0x9c, 0x44, 0x47,
  0x67, 0x83, 0x8b, 0xcf, 0x2c, 0x8e, 0xc3, 0xfa, 0xf6, 0x06, 0x28, 0x69,
  0xd3, 0xa4, 0x82, 0xbf, 0x7c, 0xf6, 0xd9, 0xff, 0x07, 0x20, 0xad, 0x4e,
  0xbd, 0x33, 0x97, 0x02, 0x00,
};
#define BUF_SIZE 0x10000
static voidpf zalloc_func(voidpf opaque, unsigned int items, unsigned int size)
{
  (void) opaque;
  /* not a typo, keep it calloc() */
  return (voidpf) calloc(items, size);
Changes to jni/curl/src/tool_main.c.
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
    /* use the value as file name */
    char fname[CURL_MT_LOGFNAME_BUFSIZE];
    if(strlen(env) >= CURL_MT_LOGFNAME_BUFSIZE)
      env[CURL_MT_LOGFNAME_BUFSIZE-1] = '\0';
    strcpy(fname, env);
    curl_free(env);
    curl_dbg_memdebug(fname);
    /* this weird stuff here is to make curl_free() get called
       before curl_memdebug() as otherwise memory tracking will
       log a free() without an alloc! */
  }
  /* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */
  env = curlx_getenv("CURL_MEMLIMIT");
  if(env) {
    char *endptr;
    long num = strtol(env, &endptr, 10);
    if((endptr != env) && (endptr == env + strlen(env)) && (num > 0))







|
|
|







109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
    /* use the value as file name */
    char fname[CURL_MT_LOGFNAME_BUFSIZE];
    if(strlen(env) >= CURL_MT_LOGFNAME_BUFSIZE)
      env[CURL_MT_LOGFNAME_BUFSIZE-1] = '\0';
    strcpy(fname, env);
    curl_free(env);
    curl_dbg_memdebug(fname);
    /* this weird stuff here is to make curl_free() get called before
       curl_gdb_memdebug() as otherwise memory tracking will log a free()
       without an alloc! */
  }
  /* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */
  env = curlx_getenv("CURL_MEMLIMIT");
  if(env) {
    char *endptr;
    long num = strtol(env, &endptr, 10);
    if((endptr != env) && (endptr == env + strlen(env)) && (num > 0))
145
146
147
148
149
150
151

152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
  _djstat_flags |= _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
#endif

  /* Initialise the global config */
  config->showerror = -1;             /* Will show errors */
  config->errors = stderr;            /* Default errors to stderr */
  config->styled_output = TRUE;       /* enable detection */


  /* Allocate the initial operate config */
  config->first = config->last = malloc(sizeof(struct OperationConfig));
  if(config->first) {
    /* Perform the libcurl initialization */
    result = curl_global_init(CURL_GLOBAL_DEFAULT);
    if(!result) {
      /* Get information about libcurl */
      result = get_libcurl_info();

      if(!result) {
        /* Get a curl handle to use for all forthcoming curl transfers */
        config->easy = curl_easy_init();
        if(config->easy) {
          /* Initialise the config */
          config_init(config->first);
          config->first->easy = config->easy;
          config->first->global = config;
        }
        else {
          helpf(stderr, "error initializing curl easy handle\n");
          result = CURLE_FAILED_INIT;
          free(config->first);
        }
      }
      else {
        helpf(stderr, "error retrieving curl library information\n");
        free(config->first);
      }
    }
    else {







>











<
<
<
|
|
<
|
<
<
<
<
<
<







145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163



164
165

166






167
168
169
170
171
172
173
  _djstat_flags |= _STAT_INODE | _STAT_EXEC_MAGIC | _STAT_DIRSIZE;
#endif

  /* Initialise the global config */
  config->showerror = -1;             /* Will show errors */
  config->errors = stderr;            /* Default errors to stderr */
  config->styled_output = TRUE;       /* enable detection */
  config->parallel_max = PARALLEL_DEFAULT;

  /* Allocate the initial operate config */
  config->first = config->last = malloc(sizeof(struct OperationConfig));
  if(config->first) {
    /* Perform the libcurl initialization */
    result = curl_global_init(CURL_GLOBAL_DEFAULT);
    if(!result) {
      /* Get information about libcurl */
      result = get_libcurl_info();

      if(!result) {



        /* Initialise the config */
        config_init(config->first);

        config->first->global = config;






      }
      else {
        helpf(stderr, "error retrieving curl library information\n");
        free(config->first);
      }
    }
    else {
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
/*
 * This is the main global destructor for the app. Call this after
 * _all_ libcurl usage is done.
 */
static void main_free(struct GlobalConfig *config)
{
  /* Cleanup the easy handle */
  curl_easy_cleanup(config->easy);
  config->easy = NULL;

  /* Main cleanup */
  curl_global_cleanup();
  convert_cleanup();
  metalink_cleanup();
#ifdef USE_NSS
  if(PR_Initialized()) {
    /* prevent valgrind from reporting still reachable mem from NSRP arenas */







<
<
<







201
202
203
204
205
206
207



208
209
210
211
212
213
214
/*
 * This is the main global destructor for the app. Call this after
 * _all_ libcurl usage is done.
 */
static void main_free(struct GlobalConfig *config)
{
  /* Cleanup the easy handle */



  /* Main cleanup */
  curl_global_cleanup();
  convert_cleanup();
  metalink_cleanup();
#ifdef USE_NSS
  if(PR_Initialized()) {
    /* prevent valgrind from reporting still reachable mem from NSRP arenas */
Changes to jni/curl/src/tool_main.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29



30
31
32
33
34
35
36
#ifndef HEADER_CURL_TOOL_MAIN_H
#define HEADER_CURL_TOOL_MAIN_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"

#define DEFAULT_MAXREDIRS  50L

#define RETRY_SLEEP_DEFAULT 1000L   /* ms */
#define RETRY_SLEEP_MAX     600000L /* ms == 10 minutes */




#ifndef STDIN_FILENO
#  define STDIN_FILENO  fileno(stdin)
#endif

#ifndef STDOUT_FILENO
#  define STDOUT_FILENO  fileno(stdout)









|



















>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#ifndef HEADER_CURL_TOOL_MAIN_H
#define HEADER_CURL_TOOL_MAIN_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"

#define DEFAULT_MAXREDIRS  50L

#define RETRY_SLEEP_DEFAULT 1000L   /* ms */
#define RETRY_SLEEP_MAX     600000L /* ms == 10 minutes */

#define MAX_PARALLEL 300 /* conservative */
#define PARALLEL_DEFAULT 50

#ifndef STDIN_FILENO
#  define STDIN_FILENO  fileno(stdin)
#endif

#ifndef STDOUT_FILENO
#  define STDOUT_FILENO  fileno(stdout)
Changes to jni/curl/src/tool_metalink.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
100
101
102
103
104
105
106

107
108
109
110
111
112
113
/* use our own printf() functions */
#include "curlx.h"

#include "tool_getparam.h"
#include "tool_paramhlp.h"
#include "tool_cfgable.h"
#include "tool_metalink.h"

#include "tool_msgs.h"

#include "memdebug.h" /* keep this as LAST include */

/* Copied from tool_getparam.c */
#define GetStr(str,val) do { \
  if(*(str)) { \







>







100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/* use our own printf() functions */
#include "curlx.h"

#include "tool_getparam.h"
#include "tool_paramhlp.h"
#include "tool_cfgable.h"
#include "tool_metalink.h"
#include "tool_operate.h"
#include "tool_msgs.h"

#include "memdebug.h" /* keep this as LAST include */

/* Copied from tool_getparam.c */
#define GetStr(str,val) do { \
  if(*(str)) { \
670
671
672
673
674
675
676
677
678

679
680
681
682
683
684
685
    return -2;
  }
  rv = check_hash(filename, mlfile->checksum->digest_def,
                  mlfile->checksum->digest, config->errors);
  return rv;
}

static metalink_checksum *new_metalink_checksum_from_hex_digest
(const metalink_digest_def *digest_def, const char *hex_digest)

{
  metalink_checksum *chksum;
  unsigned char *digest;
  size_t i;
  size_t len = strlen(hex_digest);
  digest = malloc(len/2);
  if(!digest)







|
|
>







671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
    return -2;
  }
  rv = check_hash(filename, mlfile->checksum->digest_def,
                  mlfile->checksum->digest, config->errors);
  return rv;
}

static metalink_checksum *
checksum_from_hex_digest(const metalink_digest_def *digest_def,
                         const char *hex_digest)
{
  metalink_checksum *chksum;
  unsigned char *digest;
  size_t i;
  size_t len = strlen(hex_digest);
  digest = malloc(len/2);
  if(!digest)
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
    for(digest_alias = digest_aliases; digest_alias->alias_name;
        ++digest_alias) {
      metalink_checksum_t **p;
      for(p = fileinfo->checksums; *p; ++p) {
        if(curl_strequal(digest_alias->alias_name, (*p)->type) &&
           check_hex_digest((*p)->hash, digest_alias->digest_def)) {
          f->checksum =
            new_metalink_checksum_from_hex_digest(digest_alias->digest_def,
                                                  (*p)->hash);
          break;
        }
      }
      if(f->checksum) {
        break;
      }
    }







|
|







752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
    for(digest_alias = digest_aliases; digest_alias->alias_name;
        ++digest_alias) {
      metalink_checksum_t **p;
      for(p = fileinfo->checksums; *p; ++p) {
        if(curl_strequal(digest_alias->alias_name, (*p)->type) &&
           check_hex_digest((*p)->hash, digest_alias->digest_def)) {
          f->checksum =
            checksum_from_hex_digest(digest_alias->digest_def,
                                     (*p)->hash);
          break;
        }
      }
      if(f->checksum) {
        break;
      }
    }
887
888
889
890
891
892
893

894
895
896
897
898
899
900
901
  metalink_delete(metalink);
  return (warnings) ? -2 : 0;
}

size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb,
                         void *userdata)
{

  struct OutStruct *outs = userdata;
  struct OperationConfig *config = outs->config;
  int rv;

  /*
   * Once that libcurl has called back tool_write_cb() the returned value
   * is checked against the amount that was intended to be written, if
   * it does not match then it fails with CURLE_WRITE_ERROR. So at this







>
|







889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
  metalink_delete(metalink);
  return (warnings) ? -2 : 0;
}

size_t metalink_write_cb(void *buffer, size_t sz, size_t nmemb,
                         void *userdata)
{
  struct per_transfer *per = userdata;
  struct OutStruct *outs = &per->outs;
  struct OperationConfig *config = outs->config;
  int rv;

  /*
   * Once that libcurl has called back tool_write_cb() the returned value
   * is checked against the amount that was intended to be written, if
   * it does not match then it fails with CURLE_WRITE_ERROR. So at this
Changes to jni/curl/src/tool_metalink.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

25
26
27
28
29
30
31
#ifndef HEADER_CURL_TOOL_METALINK_H
#define HEADER_CURL_TOOL_METALINK_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"


struct GlobalConfig;
struct OperationConfig;

/* returns 1 for success, 0 otherwise (we use OpenSSL *_Init fncs directly) */
typedef int (* Curl_digest_init_func)(void *context);










|














>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#ifndef HEADER_CURL_TOOL_METALINK_H
#define HEADER_CURL_TOOL_METALINK_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2014, 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"
#include "tool_sdecls.h"

struct GlobalConfig;
struct OperationConfig;

/* returns 1 for success, 0 otherwise (we use OpenSSL *_Init fncs directly) */
typedef int (* Curl_digest_init_func)(void *context);

Changes to jni/curl/src/tool_operate.c.
24
25
26
27
28
29
30




31
32
33
34
35
36
37
#ifdef HAVE_FCNTL_H
#  include <fcntl.h>
#endif

#ifdef HAVE_LOCALE_H
#  include <locale.h>
#endif





#ifdef __VMS
#  include <fabdef.h>
#endif

#ifdef __AMIGA__
#  include <proto/dos.h>







>
>
>
>







24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifdef HAVE_FCNTL_H
#  include <fcntl.h>
#endif

#ifdef HAVE_LOCALE_H
#  include <locale.h>
#endif

#ifdef HAVE_SYS_SELECT_H
#  include <sys/select.h>
#endif

#ifdef __VMS
#  include <fabdef.h>
#endif

#ifdef __AMIGA__
#  include <proto/dos.h>
71
72
73
74
75
76
77

78
79
80
81
82
83
84
#include "tool_urlglob.h"
#include "tool_util.h"
#include "tool_writeout.h"
#include "tool_xattr.h"
#include "tool_vms.h"
#include "tool_help.h"
#include "tool_hugehelp.h"


#include "memdebug.h" /* keep this as LAST include */

#ifdef CURLDEBUG
/* libcurl's debug builds provide an extra function */
CURLcode curl_easy_perform_ev(CURL *easy);
#endif







>







75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "tool_urlglob.h"
#include "tool_util.h"
#include "tool_writeout.h"
#include "tool_xattr.h"
#include "tool_vms.h"
#include "tool_help.h"
#include "tool_hugehelp.h"
#include "tool_progress.h"

#include "memdebug.h" /* keep this as LAST include */

#ifdef CURLDEBUG
/* libcurl's debug builds provide an extra function */
CURLcode curl_easy_perform_ev(CURL *easy);
#endif
93
94
95
96
97
98
99





100
101
102
103
104
105
106

#define CURL_CA_CERT_ERRORMSG                                               \
  "More details here: https://curl.haxx.se/docs/sslcerts.html\n\n"          \
  "curl failed to verify the legitimacy of the server and therefore "       \
  "could not\nestablish a secure connection to it. To learn more about "    \
  "this situation and\nhow to fix it, please visit the web page mentioned " \
  "above.\n"






static bool is_fatal_error(CURLcode code)
{
  switch(code) {
  case CURLE_FAILED_INIT:
  case CURLE_OUT_OF_MEMORY:
  case CURLE_UNKNOWN_OPTION:







>
>
>
>
>







98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

#define CURL_CA_CERT_ERRORMSG                                               \
  "More details here: https://curl.haxx.se/docs/sslcerts.html\n\n"          \
  "curl failed to verify the legitimacy of the server and therefore "       \
  "could not\nestablish a secure connection to it. To learn more about "    \
  "this situation and\nhow to fix it, please visit the web page mentioned " \
  "above.\n"

static CURLcode create_transfers(struct GlobalConfig *global,
                                 struct OperationConfig *config,
                                 CURLSH *share,
                                 bool capath_from_env);

static bool is_fatal_error(CURLcode code)
{
  switch(code) {
  case CURLE_FAILED_INIT:
  case CURLE_OUT_OF_MEMORY:
  case CURLE_UNKNOWN_OPTION:
183
184
185
186
187
188
189





















































190





191




192













































193











194












195





















































































































196











197






















198

































































199




















































200





201
202

203







204




































205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
    return stat_buf->st_size;
  }
}
#endif /* __VMS */

#define BUFFER_SIZE (100*1024)






















































static CURLcode operate_do(struct GlobalConfig *global,





                           struct OperationConfig *config)




{













































  char errorbuffer[CURL_ERROR_SIZE];











  struct ProgressData progressbar;












  struct getout *urlnode;

































































































































  struct HdrCbData hdrcbdata;






















  struct OutStruct heads;






















































































































  metalinkfile *mlfile_last = NULL;






  CURL *curl = config->easy;

  char *httpgetfields = NULL;












































  CURLcode result = CURLE_OK;
  unsigned long li;
  bool capath_from_env;

  /* Save the values of noprogress and isatty to restore them later on */
  bool orig_noprogress = global->noprogress;
  bool orig_isatty = global->isatty;

  errorbuffer[0] = '\0';

  /* default headers output stream is stdout */
  memset(&hdrcbdata, 0, sizeof(struct HdrCbData));
  memset(&heads, 0, sizeof(struct OutStruct));
  heads.stream = stdout;
  heads.config = config;

  /*
  ** Beyond this point no return'ing from this function allowed.
  ** Jump to label 'quit_curl' in order to abandon this function
  ** from outside of nested loops further down below.
  */

  /* Check we have a url */
  if(!config->url_list || !config->url_list->url) {
    helpf(global->errors, "no URL specified!\n");
    result = CURLE_FAILED_INIT;
    goto quit_curl;
  }

  /* On WIN32 we can't set the path to curl-ca-bundle.crt
   * at compile time. So we look here for the file in two ways:
   * 1: look at the environment variable CURL_CA_BUNDLE for a path
   * 2: if #1 isn't found, use the windows API function SearchPath()
   *    to find it along the app's path (includes app's dir and CWD)
   *
   * We support the environment variable thing for non-Windows platforms
   * too. Just for the sake of it.
   */
  capath_from_env = false;
  if(!config->cacert &&
     !config->capath &&
     !config->insecure_ok) {
    struct curl_tlssessioninfo *tls_backend_info = NULL;

    /* With the addition of CAINFO support for Schannel, this search could find
     * a certificate bundle that was previously ignored. To maintain backward
     * compatibility, only perform this search if not using Schannel.
     */
    result = curl_easy_getinfo(config->easy,
                               CURLINFO_TLS_SSL_PTR,
                               &tls_backend_info);
    if(result) {
      goto quit_curl;
    }

    /* Set the CA cert locations specified in the environment. For Windows if
     * no environment-specified filename is found then check for CA bundle
     * default filename curl-ca-bundle.crt in the user's PATH.
     *
     * If Schannel is the selected SSL backend then these locations are
     * ignored. We allow setting CA location for schannel only when explicitly
     * specified by the user via CURLOPT_CAINFO / --cacert.
     */
    if(tls_backend_info->backend != CURLSSLBACKEND_SCHANNEL) {
      char *env;
      env = curlx_getenv("CURL_CA_BUNDLE");
      if(env) {
        config->cacert = strdup(env);
        if(!config->cacert) {
          curl_free(env);
          helpf(global->errors, "out of memory\n");
          result = CURLE_OUT_OF_MEMORY;
          goto quit_curl;
        }
      }
      else {
        env = curlx_getenv("SSL_CERT_DIR");
        if(env) {
          config->capath = strdup(env);
          if(!config->capath) {
            curl_free(env);
            helpf(global->errors, "out of memory\n");
            result = CURLE_OUT_OF_MEMORY;
            goto quit_curl;
          }
          capath_from_env = true;
        }
        else {
          env = curlx_getenv("SSL_CERT_FILE");
          if(env) {
            config->cacert = strdup(env);
            if(!config->cacert) {
              curl_free(env);
              helpf(global->errors, "out of memory\n");
              result = CURLE_OUT_OF_MEMORY;
              goto quit_curl;
            }
          }
        }
      }

      if(env)
        curl_free(env);
#ifdef WIN32
      else {
        result = FindWin32CACert(config, tls_backend_info->backend,
                                 "curl-ca-bundle.crt");
        if(result)
          goto quit_curl;
      }
#endif
    }
  }

  if(config->postfields) {
    if(config->use_httpget) {
      /* Use the postfields data for a http get */
      httpgetfields = strdup(config->postfields);
      Curl_safefree(config->postfields);
      if(!httpgetfields) {







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
|
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
>
>
>
>
>

|
>
|
>
>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

|
<
|
<


<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662

663

664
665

























































666
















































667
668
669
670
671
672
673
    return stat_buf->st_size;
  }
}
#endif /* __VMS */

#define BUFFER_SIZE (100*1024)

struct per_transfer *transfers; /* first node */
static struct per_transfer *transfersl; /* last node */

static CURLcode add_transfer(struct per_transfer **per)
{
  struct per_transfer *p;
  p = calloc(sizeof(struct per_transfer), 1);
  if(!p)
    return CURLE_OUT_OF_MEMORY;
  if(!transfers)
    /* first entry */
    transfersl = transfers = p;
  else {
    /* make the last node point to the new node */
    transfersl->next = p;
    /* make the new node point back to the formerly last node */
    p->prev = transfersl;
    /* move the last node pointer to the new entry */
    transfersl = p;
  }
  *per = p;
  all_xfers++; /* count total number of transfers added */
  return CURLE_OK;
}

/* Remove the specified transfer from the list (and free it), return the next
   in line */
static struct per_transfer *del_transfer(struct per_transfer *per)
{
  struct per_transfer *n;
  struct per_transfer *p;
  DEBUGASSERT(transfers);
  DEBUGASSERT(transfersl);
  DEBUGASSERT(per);

  n = per->next;
  p = per->prev;

  if(p)
    p->next = n;
  else
    transfers = n;

  if(n)
    n->prev = p;
  else
    transfersl = p;

  free(per);

  return n;
}

static CURLcode pre_transfer(struct GlobalConfig *global,
                             struct per_transfer *per)
{
  curl_off_t uploadfilesize = -1;
  struct_stat fileinfo;
  CURLcode result = CURLE_OK;

  if(per->separator_err)
    fprintf(global->errors, "%s\n", per->separator_err);
  if(per->separator)
    printf("%s\n", per->separator);

  if(per->uploadfile && !stdin_upload(per->uploadfile)) {
    /* VMS Note:
     *
     * Reading binary from files can be a problem...  Only FIXED, VAR
     * etc WITHOUT implied CC will work Others need a \n appended to a
     * line
     *
     * - Stat gives a size but this is UNRELIABLE in VMS As a f.e. a
     * fixed file with implied CC needs to have a byte added for every
     * record processed, this can by derived from Filesize & recordsize
     * for VARiable record files the records need to be counted!  for
     * every record add 1 for linefeed and subtract 2 for the record
     * header for VARIABLE header files only the bare record data needs
     * to be considered with one appended if implied CC
     */
#ifdef __VMS
    /* Calculate the real upload size for VMS */
    per->infd = -1;
    if(stat(per->uploadfile, &fileinfo) == 0) {
      fileinfo.st_size = VmsSpecialSize(uploadfile, &fileinfo);
      switch(fileinfo.st_fab_rfm) {
      case FAB$C_VAR:
      case FAB$C_VFC:
      case FAB$C_STMCR:
        per->infd = open(per->uploadfile, O_RDONLY | O_BINARY);
        break;
      default:
        per->infd = open(per->uploadfile, O_RDONLY | O_BINARY,
                        "rfm=stmlf", "ctx=stm");
      }
    }
    if(per->infd == -1)
#else
      per->infd = open(per->uploadfile, O_RDONLY | O_BINARY);
    if((per->infd == -1) || fstat(per->infd, &fileinfo))
#endif
    {
      helpf(global->errors, "Can't open '%s'!\n", per->uploadfile);
      if(per->infd != -1) {
        close(per->infd);
        per->infd = STDIN_FILENO;
      }
      return CURLE_READ_ERROR;
    }
    per->infdopen = TRUE;

    /* we ignore file size for char/block devices, sockets, etc. */
    if(S_ISREG(fileinfo.st_mode))
      uploadfilesize = fileinfo.st_size;

    if(uploadfilesize != -1)
      my_setopt(per->curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
    per->input.fd = per->infd;
  }
  show_error:
  return result;
}

/*
 * Call this after a transfer has completed.
 */
static CURLcode post_transfer(struct GlobalConfig *global,
                              CURLSH *share,
                              struct per_transfer *per,
                              CURLcode result,
                              bool *retryp)
{
  struct OutStruct *outs = &per->outs;
  CURL *curl = per->curl;
  struct OperationConfig *config = per->config;

  *retryp = FALSE;

  if(per->infdopen)
    close(per->infd);

#ifdef __VMS
  if(is_vms_shell()) {
    /* VMS DCL shell behavior */
    if(!global->showerror)
      vms_show = VMSSTS_HIDE;
  }
  else
#endif
    if(config->synthetic_error) {
      ;
    }
    else if(result && global->showerror) {
      fprintf(global->errors, "curl: (%d) %s\n", result,
              (per->errorbuffer[0]) ? per->errorbuffer :
              curl_easy_strerror(result));
      if(result == CURLE_PEER_FAILED_VERIFICATION)
        fputs(CURL_CA_CERT_ERRORMSG, global->errors);
    }

  /* Set file extended attributes */
  if(!result && config->xattr && outs->fopened && outs->stream) {
    int rc = fwrite_xattr(curl, fileno(outs->stream));
    if(rc)
      warnf(config->global, "Error setting extended attributes: %s\n",
            strerror(errno));
  }

  if(!result && !outs->stream && !outs->bytes) {
    /* we have received no data despite the transfer was successful
       ==> force cration of an empty output file (if an output file
       was specified) */
    long cond_unmet = 0L;
    /* do not create (or even overwrite) the file in case we get no
       data because of unmet condition */
    curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &cond_unmet);
    if(!cond_unmet && !tool_create_output_file(outs))
      result = CURLE_WRITE_ERROR;
  }

  if(!outs->s_isreg && outs->stream) {
    /* Dump standard stream buffered data */
    int rc = fflush(outs->stream);
    if(!result && rc) {
      /* something went wrong in the writing process */
      result = CURLE_WRITE_ERROR;
      fprintf(global->errors, "(%d) Failed writing body\n", result);
    }
  }

#ifdef USE_METALINK
  if(per->metalink && !per->metalink_next_res)
    fprintf(global->errors, "Metalink: fetching (%s) from (%s) OK\n",
            per->mlfile->filename, per->this_url);

  if(!per->metalink && config->use_metalink && result == CURLE_OK) {
    int rv = parse_metalink(config, outs, per->this_url);
    if(!rv) {
      fprintf(config->global->errors, "Metalink: parsing (%s) OK\n",
              per->this_url);
    }
    else if(rv == -1)
      fprintf(config->global->errors, "Metalink: parsing (%s) FAILED\n",
              per->this_url);
    result = create_transfers(global, config, share, FALSE);
  }
  else if(per->metalink && result == CURLE_OK && !per->metalink_next_res) {
    int rv;
    (void)fflush(outs->stream);
    rv = metalink_check_hash(global, per->mlfile, outs->filename);
    if(!rv)
      per->metalink_next_res = 1;
  }
#else
  (void)share;
#endif /* USE_METALINK */

#ifdef USE_METALINK
  if(outs->metalink_parser)
    metalink_parser_context_delete(outs->metalink_parser);
#endif /* USE_METALINK */

  if(outs->is_cd_filename && outs->stream && !global->mute &&
     outs->filename)
    printf("curl: Saved to filename '%s'\n", outs->filename);

  /* if retry-max-time is non-zero, make sure we haven't exceeded the
     time */
  if(per->retry_numretries &&
     (!config->retry_maxtime ||
      (tvdiff(tvnow(), per->retrystart) <
       config->retry_maxtime*1000L)) ) {
    enum {
      RETRY_NO,
      RETRY_TIMEOUT,
      RETRY_CONNREFUSED,
      RETRY_HTTP,
      RETRY_FTP,
      RETRY_LAST /* not used */
    } retry = RETRY_NO;
    long response;
    if((CURLE_OPERATION_TIMEDOUT == result) ||
       (CURLE_COULDNT_RESOLVE_HOST == result) ||
       (CURLE_COULDNT_RESOLVE_PROXY == result) ||
       (CURLE_FTP_ACCEPT_TIMEOUT == result))
      /* retry timeout always */
      retry = RETRY_TIMEOUT;
    else if(config->retry_connrefused &&
            (CURLE_COULDNT_CONNECT == result)) {
      long oserrno;
      curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &oserrno);
      if(ECONNREFUSED == oserrno)
        retry = RETRY_CONNREFUSED;
    }
    else if((CURLE_OK == result) ||
            (config->failonerror &&
             (CURLE_HTTP_RETURNED_ERROR == result))) {
      /* If it returned OK. _or_ failonerror was enabled and it
         returned due to such an error, check for HTTP transient
         errors to retry on. */
      long protocol;
      curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);
      if((protocol == CURLPROTO_HTTP) || (protocol == CURLPROTO_HTTPS)) {
        /* This was HTTP(S) */
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);

        switch(response) {
        case 500: /* Internal Server Error */
        case 502: /* Bad Gateway */
        case 503: /* Service Unavailable */
        case 504: /* Gateway Timeout */
          retry = RETRY_HTTP;
          /*
           * At this point, we have already written data to the output
           * file (or terminal). If we write to a file, we must rewind
           * or close/re-open the file so that the next attempt starts
           * over from the beginning.
           *
           * TODO: similar action for the upload case. We might need
           * to start over reading from a previous point if we have
           * uploaded something when this was returned.
           */
          break;
        }
      }
    } /* if CURLE_OK */
    else if(result) {
      long protocol;

      curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
      curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);

      if((protocol == CURLPROTO_FTP || protocol == CURLPROTO_FTPS) &&
         response / 100 == 4)
        /*
         * This is typically when the FTP server only allows a certain
         * amount of users and we are not one of them.  All 4xx codes
         * are transient.
         */
        retry = RETRY_FTP;
    }

    if(retry) {
      long sleeptime = 0;
      curl_off_t retry_after = 0;
      static const char * const m[]={
        NULL,
        "timeout",
        "connection refused",
        "HTTP error",
        "FTP error"
      };

      sleeptime = per->retry_sleep;
      if(RETRY_HTTP == retry) {
        curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &retry_after);
        if(retry_after) {
          /* store in a 'long', make sure it doesn't overflow */
          if(retry_after > LONG_MAX/1000)
            sleeptime = LONG_MAX;
          else
            sleeptime = (long)retry_after * 1000; /* milliseconds */
        }
      }
      warnf(config->global, "Transient problem: %s "
            "Will retry in %ld seconds. "
            "%ld retries left.\n",
            m[retry], per->retry_sleep/1000L, per->retry_numretries);

      per->retry_numretries--;
      tool_go_sleep(sleeptime);
      if(!config->retry_delay) {
        per->retry_sleep *= 2;
        if(per->retry_sleep > RETRY_SLEEP_MAX)
          per->retry_sleep = RETRY_SLEEP_MAX;
      }
      if(outs->bytes && outs->filename && outs->stream) {
        int rc;
        /* We have written data to a output file, we truncate file
         */
        if(!global->mute)
          fprintf(global->errors, "Throwing away %"
                  CURL_FORMAT_CURL_OFF_T " bytes\n",
                  outs->bytes);
        fflush(outs->stream);
        /* truncate file at the position where we started appending */
#ifdef HAVE_FTRUNCATE
        if(ftruncate(fileno(outs->stream), outs->init)) {
          /* when truncate fails, we can't just append as then we'll
             create something strange, bail out */
          if(!global->mute)
            fprintf(global->errors,
                    "failed to truncate, exiting\n");
          return CURLE_WRITE_ERROR;
        }
        /* now seek to the end of the file, the position where we
           just truncated the file in a large file-safe way */
        rc = fseek(outs->stream, 0, SEEK_END);
#else
        /* ftruncate is not available, so just reposition the file
           to the location we would have truncated it. This won't
           work properly with large files on 32-bit systems, but
           most of those will have ftruncate. */
        rc = fseek(outs->stream, (long)outs->init, SEEK_SET);
#endif
        if(rc) {
          if(!global->mute)
            fprintf(global->errors,
                    "failed seeking to end of file, exiting\n");
          return CURLE_WRITE_ERROR;
        }
        outs->bytes = 0; /* clear for next round */
      }
      *retryp = TRUE; /* curl_easy_perform loop */
      return CURLE_OK;
    }
  } /* if retry_numretries */
  else if(per->metalink) {
    /* Metalink: Decide to try the next resource or not. Try the next resource
       if download was not successful. */
    long response;
    if(CURLE_OK == result) {
      /* TODO We want to try next resource when download was
         not successful. How to know that? */
      char *effective_url = NULL;
      curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
      if(effective_url &&
         curl_strnequal(effective_url, "http", 4)) {
        /* This was HTTP(S) */
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
        if(response != 200 && response != 206) {
          per->metalink_next_res = 1;
          fprintf(global->errors,
                  "Metalink: fetching (%s) from (%s) FAILED "
                  "(HTTP status code %ld)\n",
                  per->mlfile->filename, per->this_url, response);
        }
      }
    }
    else {
      per->metalink_next_res = 1;
      fprintf(global->errors,
              "Metalink: fetching (%s) from (%s) FAILED (%s)\n",
              per->mlfile->filename, per->this_url,
              curl_easy_strerror(result));
    }
  }

  if((global->progressmode == CURL_PROGRESS_BAR) &&
     per->progressbar.calls)
    /* if the custom progress bar has been displayed, we output a
       newline here */
    fputs("\n", per->progressbar.out);

  if(config->writeout)
    ourWriteOut(per->curl, &per->outs, config->writeout);

  /* Close the outs file */
  if(outs->fopened && outs->stream) {
    int rc = fclose(outs->stream);
    if(!result && rc) {
      /* something went wrong in the writing process */
      result = CURLE_WRITE_ERROR;
      fprintf(global->errors, "(%d) Failed writing body\n", result);
    }
  }

  /* File time can only be set _after_ the file has been closed */
  if(!result && config->remote_time && outs->s_isreg && outs->filename) {
    /* Ask libcurl if we got a remote file time */
    curl_off_t filetime = -1;
    curl_easy_getinfo(curl, CURLINFO_FILETIME_T, &filetime);
    setfiletime(filetime, outs->filename, config->global->errors);
  }

  /* Close function-local opened file descriptors */
  if(per->heads.fopened && per->heads.stream)
    fclose(per->heads.stream);

  if(per->heads.alloc_filename)
    Curl_safefree(per->heads.filename);

  curl_easy_cleanup(per->curl);
  if(outs->alloc_filename)
    free(outs->filename);
  free(per->this_url);
  free(per->separator_err);
  free(per->separator);
  free(per->outfile);
  free(per->uploadfile);

  return CURLE_OK;
}

/* go through the list of URLs and configs and add transfers */

static CURLcode create_transfers(struct GlobalConfig *global,
                                 struct OperationConfig *config,
                                 CURLSH *share,
                                 bool capath_from_env)
{
  CURLcode result = CURLE_OK;
  struct getout *urlnode;

  metalinkfile *mlfile_last = NULL;

  bool orig_noprogress = global->noprogress;
  bool orig_isatty = global->isatty;

























































  char *httpgetfields = NULL;

















































  if(config->postfields) {
    if(config->use_httpget) {
      /* Use the postfields data for a http get */
      httpgetfields = strdup(config->postfields);
      Curl_safefree(config->postfields);
      if(!httpgetfields) {
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
      if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq)) {
        result = CURLE_FAILED_INIT;
        goto quit_curl;
      }
    }
  }

  /* Single header file for all URLs */
  if(config->headerfile) {
    /* open file for output: */
    if(strcmp(config->headerfile, "-")) {
      FILE *newfile = fopen(config->headerfile, "wb");
      if(!newfile) {
        warnf(config->global, "Failed to open %s\n", config->headerfile);
        result = CURLE_WRITE_ERROR;
        goto quit_curl;
      }
      else {
        heads.filename = config->headerfile;
        heads.s_isreg = TRUE;
        heads.fopened = TRUE;
        heads.stream = newfile;
      }
    }
    else {
      /* always use binary mode for protocol header output */
      set_binmode(heads.stream);
    }
  }

  /*
  ** Nested loops start here.
  */

  /* loop through the list of given URLs */

  for(urlnode = config->url_list; urlnode; urlnode = urlnode->next) {

    unsigned long up; /* upload file counter within a single upload glob */
    char *infiles; /* might be a glob pattern */
    char *outfiles;
    unsigned long infilenum;
    URLGlob *inglob;

    int metalink = 0; /* nonzero for metalink download. */
    metalinkfile *mlfile;
    metalink_resource *mlres;

    outfiles = NULL;
    infilenum = 1;
    inglob = NULL;








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|





|
<







686
687
688
689
690
691
692





























693
694
695
696
697
698
699
700

701
702
703
704
705
706
707
      if(SetHTTPrequest(config, HTTPREQ_SIMPLEPOST, &config->httpreq)) {
        result = CURLE_FAILED_INIT;
        goto quit_curl;
      }
    }
  }






























  for(urlnode = config->url_list; urlnode; urlnode = urlnode->next) {
    unsigned long li;
    unsigned long up; /* upload file counter within a single upload glob */
    char *infiles; /* might be a glob pattern */
    char *outfiles;
    unsigned long infilenum;
    URLGlob *inglob;
    bool metalink = FALSE; /* metalink download? */

    metalinkfile *mlfile;
    metalink_resource *mlres;

    outfiles = NULL;
    infilenum = 1;
    inglob = NULL;

457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
        else if(!up) {
          uploadfile = strdup(infiles);
          if(!uploadfile) {
            helpf(global->errors, "out of memory\n");
            result = CURLE_OUT_OF_MEMORY;
          }
        }
        else
          uploadfile = NULL;
        if(!uploadfile)
          break;
      }

      if(metalink) {
        /* For Metalink download, we don't use glob. Instead we use
           the number of resources as urlnum. */







<
<







776
777
778
779
780
781
782


783
784
785
786
787
788
789
        else if(!up) {
          uploadfile = strdup(infiles);
          if(!uploadfile) {
            helpf(global->errors, "out of memory\n");
            result = CURLE_OUT_OF_MEMORY;
          }
        }


        if(!uploadfile)
          break;
      }

      if(metalink) {
        /* For Metalink download, we don't use glob. Instead we use
           the number of resources as urlnum. */
486
487
488
489
490
491
492
493
494
495
496
497
498



499


500







501




502






















503
504

505


506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529

530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
        urlnum = 1; /* without globbing, this is a single URL */

      /* if multiple files extracted to stdout, insert separators! */
      separator = ((!outfiles || !strcmp(outfiles, "-")) && urlnum > 1);

      /* Here's looping around each globbed URL */
      for(li = 0 ; li < urlnum; li++) {

        int infd;
        bool infdopen;
        char *outfile;
        struct OutStruct outs;
        struct InStruct input;



        struct timeval retrystart;


        curl_off_t uploadfilesize;







        long retry_numretries;




        long retry_sleep_default;






















        long retry_sleep;
        char *this_url = NULL;

        int metalink_next_res = 0;



        outfile = NULL;
        infdopen = FALSE;
        infd = STDIN_FILENO;
        uploadfilesize = -1; /* -1 means unknown */

        /* default output stream is stdout */
        memset(&outs, 0, sizeof(struct OutStruct));
        outs.stream = stdout;
        outs.config = config;

        if(metalink) {
          /* For Metalink download, use name in Metalink file as
             filename. */
          outfile = strdup(mlfile->filename);
          if(!outfile) {
            result = CURLE_OUT_OF_MEMORY;
            goto show_error;
          }
          this_url = strdup(mlres->url);
          if(!this_url) {
            result = CURLE_OUT_OF_MEMORY;
            goto show_error;
          }

        }
        else {
          if(urls) {
            result = glob_next_url(&this_url, urls);
            if(result)
              goto show_error;
          }
          else if(!li) {
            this_url = strdup(urlnode->url);
            if(!this_url) {
              result = CURLE_OUT_OF_MEMORY;
              goto show_error;
            }
          }
          else
            this_url = NULL;
          if(!this_url)
            break;

          if(outfiles) {
            outfile = strdup(outfiles);
            if(!outfile) {
              result = CURLE_OUT_OF_MEMORY;
              goto show_error;
            }
          }
        }

        if(((urlnode->flags&GETOUT_USEREMOTE) ||
            (outfile && strcmp("-", outfile))) &&
           (metalink || !config->use_metalink)) {

          /*
           * We have specified a file name to store the result in, or we have
           * decided we want to use the remote file name.
           */

          if(!outfile) {
            /* extract the file name from the URL */
            result = get_url_file_name(&outfile, this_url);
            if(result)
              goto show_error;
            if(!*outfile && !config->content_disposition) {
              helpf(global->errors, "Remote file name has no length!\n");
              result = CURLE_WRITE_ERROR;
              goto quit_urls;
            }
          }
          else if(urls) {
            /* fill '#1' ... '#9' terms from URL pattern */
            char *storefile = outfile;
            result = glob_match_url(&outfile, storefile, urls);
            Curl_safefree(storefile);
            if(result) {
              /* bad globbing */
              warnf(config->global, "bad output glob!\n");
              goto quit_urls;
            }
          }

          /* Create the directory hierarchy, if not pre-existent to a multiple
             file output call */

          if(config->create_dirs || metalink) {
            result = create_dir_hierarchy(outfile, global->errors);
            /* create_dir_hierarchy shows error upon CURLE_WRITE_ERROR */
            if(result == CURLE_WRITE_ERROR)
              goto quit_urls;
            if(result) {
              goto show_error;
            }
          }

          if((urlnode->flags & GETOUT_USEREMOTE)
             && config->content_disposition) {
            /* Our header callback MIGHT set the filename */
            DEBUGASSERT(!outs.filename);
          }

          if(config->resume_from_current) {
            /* We're told to continue from where we are now. Get the size
               of the file as it is now and open it for append instead */
            struct_stat fileinfo;
            /* VMS -- Danger, the filesize is only valid for stream files */
            if(0 == stat(outfile, &fileinfo))
              /* set offset to current file size: */
              config->resume_from = fileinfo.st_size;
            else
              /* let offset be 0 */
              config->resume_from = 0;
          }

          if(config->resume_from) {
#ifdef __VMS
            /* open file for output, forcing VMS output format into stream
               mode which is needed for stat() call above to always work. */
            FILE *file = fopen(outfile, config->resume_from?"ab":"wb",
                               "ctx=stm", "rfm=stmlf", "rat=cr", "mrs=0");
#else
            /* open file for output: */
            FILE *file = fopen(outfile, config->resume_from?"ab":"wb");
#endif
            if(!file) {
              helpf(global->errors, "Can't open '%s'!\n", outfile);
              result = CURLE_WRITE_ERROR;
              goto quit_urls;
            }
            outs.fopened = TRUE;
            outs.stream = file;
            outs.init = config->resume_from;
          }
          else {
            outs.stream = NULL; /* open when needed */
          }
          outs.filename = outfile;
          outs.s_isreg = TRUE;
        }

        if(uploadfile && !stdin_upload(uploadfile)) {
          /*
           * We have specified a file to upload and it isn't "-".
           */
          struct_stat fileinfo;

          this_url = add_file_name_to_url(curl, this_url, uploadfile);
          if(!this_url) {
            result = CURLE_OUT_OF_MEMORY;
            goto show_error;
          }
          /* VMS Note:
           *
           * Reading binary from files can be a problem...  Only FIXED, VAR
           * etc WITHOUT implied CC will work Others need a \n appended to a
           * line
           *
           * - Stat gives a size but this is UNRELIABLE in VMS As a f.e. a
           * fixed file with implied CC needs to have a byte added for every
           * record processed, this can by derived from Filesize & recordsize
           * for VARiable record files the records need to be counted!  for
           * every record add 1 for linefeed and subtract 2 for the record
           * header for VARIABLE header files only the bare record data needs
           * to be considered with one appended if implied CC
           */
#ifdef __VMS
          /* Calculate the real upload size for VMS */
          infd = -1;
          if(stat(uploadfile, &fileinfo) == 0) {
            fileinfo.st_size = VmsSpecialSize(uploadfile, &fileinfo);
            switch(fileinfo.st_fab_rfm) {
            case FAB$C_VAR:
            case FAB$C_VFC:
            case FAB$C_STMCR:
              infd = open(uploadfile, O_RDONLY | O_BINARY);
              break;
            default:
              infd = open(uploadfile, O_RDONLY | O_BINARY,
                          "rfm=stmlf", "ctx=stm");
            }
          }
          if(infd == -1)
#else
          infd = open(uploadfile, O_RDONLY | O_BINARY);
          if((infd == -1) || fstat(infd, &fileinfo))
#endif
          {
            helpf(global->errors, "Can't open '%s'!\n", uploadfile);
            if(infd != -1) {
              close(infd);
              infd = STDIN_FILENO;
            }
            result = CURLE_READ_ERROR;
            goto quit_urls;
          }
          infdopen = TRUE;

          /* we ignore file size for char/block devices, sockets, etc. */
          if(S_ISREG(fileinfo.st_mode))
            uploadfilesize = fileinfo.st_size;

        }
        else if(uploadfile && stdin_upload(uploadfile)) {
          /* count to see if there are more than one auth bit set
             in the authtype field */
          int authbits = 0;
          int bitcheck = 0;
          while(bitcheck < 32) {
            if(config->authtype & (1UL << bitcheck++)) {
              authbits++;







|
<
<
<
|
|
>
>
>
|
>
>
|
>
>
>
>
>
>
>
|
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
>
|
>
>

|
|
|
<


<
|
|




|
|



|
|



>



|




|
|





|
|



|
|







|







|

|


|







|
|












|











|







|















|


|



|
|
|


|

|
|


|



<
<
|
|



<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
|
<
|







803
804
805
806
807
808
809
810



811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864

865
866

867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005


1006
1007
1008
1009
1010













































1011



1012

1013
1014
1015
1016
1017
1018
1019
1020
        urlnum = 1; /* without globbing, this is a single URL */

      /* if multiple files extracted to stdout, insert separators! */
      separator = ((!outfiles || !strcmp(outfiles, "-")) && urlnum > 1);

      /* Here's looping around each globbed URL */
      for(li = 0 ; li < urlnum; li++) {
        struct per_transfer *per;



        struct OutStruct *outs;
        struct InStruct *input;
        struct OutStruct *heads;
        struct HdrCbData *hdrcbdata = NULL;
        CURL *curl = curl_easy_init();

        result = add_transfer(&per);
        if(result || !curl) {
          free(uploadfile);
          curl_easy_cleanup(curl);
          result = CURLE_OUT_OF_MEMORY;
          goto show_error;
        }
        per->config = config;
        per->curl = curl;
        per->uploadfile = uploadfile;

        /* default headers output stream is stdout */
        heads = &per->heads;
        heads->stream = stdout;
        heads->config = config;

        /* Single header file for all URLs */
        if(config->headerfile) {
          /* open file for output: */
          if(strcmp(config->headerfile, "-")) {
            FILE *newfile = fopen(config->headerfile, "wb");
            if(!newfile) {
              warnf(config->global, "Failed to open %s\n", config->headerfile);
              result = CURLE_WRITE_ERROR;
              goto quit_curl;
            }
            else {
              heads->filename = config->headerfile;
              heads->s_isreg = TRUE;
              heads->fopened = TRUE;
              heads->stream = newfile;
            }
          }
          else {
            /* always use binary mode for protocol header output */
            set_binmode(heads->stream);
          }
        }


        hdrcbdata = &per->hdrcbdata;

        outs = &per->outs;
        input = &per->input;

        per->outfile = NULL;
        per->infdopen = FALSE;
        per->infd = STDIN_FILENO;


        /* default output stream is stdout */

        outs->stream = stdout;
        outs->config = config;

        if(metalink) {
          /* For Metalink download, use name in Metalink file as
             filename. */
          per->outfile = strdup(mlfile->filename);
          if(!per->outfile) {
            result = CURLE_OUT_OF_MEMORY;
            goto show_error;
          }
          per->this_url = strdup(mlres->url);
          if(!per->this_url) {
            result = CURLE_OUT_OF_MEMORY;
            goto show_error;
          }
          per->mlfile = mlfile;
        }
        else {
          if(urls) {
            result = glob_next_url(&per->this_url, urls);
            if(result)
              goto show_error;
          }
          else if(!li) {
            per->this_url = strdup(urlnode->url);
            if(!per->this_url) {
              result = CURLE_OUT_OF_MEMORY;
              goto show_error;
            }
          }
          else
            per->this_url = NULL;
          if(!per->this_url)
            break;

          if(outfiles) {
            per->outfile = strdup(outfiles);
            if(!per->outfile) {
              result = CURLE_OUT_OF_MEMORY;
              goto show_error;
            }
          }
        }

        if(((urlnode->flags&GETOUT_USEREMOTE) ||
            (per->outfile && strcmp("-", per->outfile))) &&
           (metalink || !config->use_metalink)) {

          /*
           * We have specified a file name to store the result in, or we have
           * decided we want to use the remote file name.
           */

          if(!per->outfile) {
            /* extract the file name from the URL */
            result = get_url_file_name(&per->outfile, per->this_url);
            if(result)
              goto show_error;
            if(!*per->outfile && !config->content_disposition) {
              helpf(global->errors, "Remote file name has no length!\n");
              result = CURLE_WRITE_ERROR;
              goto quit_urls;
            }
          }
          else if(urls) {
            /* fill '#1' ... '#9' terms from URL pattern */
            char *storefile = per->outfile;
            result = glob_match_url(&per->outfile, storefile, urls);
            Curl_safefree(storefile);
            if(result) {
              /* bad globbing */
              warnf(config->global, "bad output glob!\n");
              goto quit_urls;
            }
          }

          /* Create the directory hierarchy, if not pre-existent to a multiple
             file output call */

          if(config->create_dirs || metalink) {
            result = create_dir_hierarchy(per->outfile, global->errors);
            /* create_dir_hierarchy shows error upon CURLE_WRITE_ERROR */
            if(result == CURLE_WRITE_ERROR)
              goto quit_urls;
            if(result) {
              goto show_error;
            }
          }

          if((urlnode->flags & GETOUT_USEREMOTE)
             && config->content_disposition) {
            /* Our header callback MIGHT set the filename */
            DEBUGASSERT(!outs->filename);
          }

          if(config->resume_from_current) {
            /* We're told to continue from where we are now. Get the size
               of the file as it is now and open it for append instead */
            struct_stat fileinfo;
            /* VMS -- Danger, the filesize is only valid for stream files */
            if(0 == stat(per->outfile, &fileinfo))
              /* set offset to current file size: */
              config->resume_from = fileinfo.st_size;
            else
              /* let offset be 0 */
              config->resume_from = 0;
          }

          if(config->resume_from) {
#ifdef __VMS
            /* open file for output, forcing VMS output format into stream
               mode which is needed for stat() call above to always work. */
            FILE *file = fopen(outfile, config->resume_from?"ab":"wb",
                               "ctx=stm", "rfm=stmlf", "rat=cr", "mrs=0");
#else
            /* open file for output: */
            FILE *file = fopen(per->outfile, config->resume_from?"ab":"wb");
#endif
            if(!file) {
              helpf(global->errors, "Can't open '%s'!\n", per->outfile);
              result = CURLE_WRITE_ERROR;
              goto quit_urls;
            }
            outs->fopened = TRUE;
            outs->stream = file;
            outs->init = config->resume_from;
          }
          else {
            outs->stream = NULL; /* open when needed */
          }
          outs->filename = per->outfile;
          outs->s_isreg = TRUE;
        }

        if(per->uploadfile && !stdin_upload(per->uploadfile)) {
          /*
           * We have specified a file to upload and it isn't "-".
           */


          char *nurl = add_file_name_to_url(per->this_url, per->uploadfile);
          if(!nurl) {
            result = CURLE_OUT_OF_MEMORY;
            goto show_error;
          }













































          per->this_url = nurl;



        }

        else if(per->uploadfile && stdin_upload(per->uploadfile)) {
          /* count to see if there are more than one auth bit set
             in the authtype field */
          int authbits = 0;
          int bitcheck = 0;
          while(bitcheck < 32) {
            if(config->authtype & (1UL << bitcheck++)) {
              authbits++;
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762

763
764

765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810

811
812
813
814
815
816
817
818







819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
          if(config->proxyanyauth || (authbits>1)) {
            warnf(config->global,
                  "Using --anyauth or --proxy-anyauth with upload from stdin"
                  " involves a big risk of it not working. Use a temporary"
                  " file or a fixed auth type instead!\n");
          }

          DEBUGASSERT(infdopen == FALSE);
          DEBUGASSERT(infd == STDIN_FILENO);

          set_binmode(stdin);
          if(!strcmp(uploadfile, ".")) {
            if(curlx_nonblock((curl_socket_t)infd, TRUE) < 0)
              warnf(config->global,
                    "fcntl failed on fd=%d: %s\n", infd, strerror(errno));
          }
        }

        if(uploadfile && config->resume_from_current)
          config->resume_from = -1; /* -1 will then force get-it-yourself */

        if(output_expected(this_url, uploadfile) && outs.stream &&
           isatty(fileno(outs.stream)))
          /* we send the output to a tty, therefore we switch off the progress
             meter */
          global->noprogress = global->isatty = TRUE;
        else {
          /* progress meter is per download, so restore config
             values */
          global->noprogress = orig_noprogress;
          global->isatty = orig_isatty;
        }

        if(urlnum > 1 && !global->mute) {

          fprintf(global->errors, "\n[%lu/%lu]: %s --> %s\n",
                  li + 1, urlnum, this_url, outfile ? outfile : "<stdout>");

          if(separator)
            printf("%s%s\n", CURLseparator, this_url);
        }
        if(httpgetfields) {
          char *urlbuffer;
          /* Find out whether the url contains a file name */
          const char *pc = strstr(this_url, "://");
          char sep = '?';
          if(pc)
            pc += 3;
          else
            pc = this_url;

          pc = strrchr(pc, '/'); /* check for a slash */

          if(pc) {
            /* there is a slash present in the URL */

            if(strchr(pc, '?'))
              /* Ouch, there's already a question mark in the URL string, we
                 then append the data with an ampersand separator instead! */
              sep = '&';
          }
          /*
           * Then append ? followed by the get fields to the url.
           */
          if(pc)
            urlbuffer = aprintf("%s%c%s", this_url, sep, httpgetfields);
          else
            /* Append  / before the ? to create a well-formed url
               if the url contains a hostname only
            */
            urlbuffer = aprintf("%s/?%s", this_url, httpgetfields);

          if(!urlbuffer) {
            result = CURLE_OUT_OF_MEMORY;
            goto show_error;
          }

          Curl_safefree(this_url); /* free previous URL */
          this_url = urlbuffer; /* use our new URL instead! */
        }

        if(!global->errors)
          global->errors = stderr;


        if((!outfile || !strcmp(outfile, "-")) && !config->use_ascii) {
          /* We get the output to stdout and we have not got the ASCII/text
             flag, then set stdout to be binary */
          set_binmode(stdout);
        }

        /* explicitly passed to stdout means okaying binary gunk */
        config->terminal_binary_ok = (outfile && !strcmp(outfile, "-"));








        if(!config->tcp_nodelay)
          my_setopt(curl, CURLOPT_TCP_NODELAY, 0L);

        if(config->tcp_fastopen)
          my_setopt(curl, CURLOPT_TCP_FASTOPEN, 1L);

        /* where to store */
        my_setopt(curl, CURLOPT_WRITEDATA, &outs);
        my_setopt(curl, CURLOPT_INTERLEAVEDATA, &outs);

        if(metalink || !config->use_metalink)
          /* what call to write */
          my_setopt(curl, CURLOPT_WRITEFUNCTION, tool_write_cb);
#ifdef USE_METALINK
        else
          /* Set Metalink specific write callback function to parse
             XML data progressively. */
          my_setopt(curl, CURLOPT_WRITEFUNCTION, metalink_write_cb);
#endif /* USE_METALINK */

        /* for uploads */
        input.fd = infd;
        input.config = config;
        /* Note that if CURLOPT_READFUNCTION is fread (the default), then
         * lib/telnet.c will Curl_poll() on the input file descriptor
         * rather then calling the READFUNCTION at regular intervals.
         * The circumstances in which it is preferable to enable this
         * behaviour, by omitting to set the READFUNCTION & READDATA options,
         * have not been determined.
         */
        my_setopt(curl, CURLOPT_READDATA, &input);
        /* what call to read */
        my_setopt(curl, CURLOPT_READFUNCTION, tool_read_cb);

        /* in 7.18.0, the CURLOPT_SEEKFUNCTION/DATA pair is taking over what
           CURLOPT_IOCTLFUNCTION/DATA pair previously provided for seeking */
        my_setopt(curl, CURLOPT_SEEKDATA, &input);
        my_setopt(curl, CURLOPT_SEEKFUNCTION, tool_seek_cb);

        if(config->recvpersecond &&
           (config->recvpersecond < BUFFER_SIZE))
          /* use a smaller sized buffer for better sleeps */
          my_setopt(curl, CURLOPT_BUFFERSIZE, (long)config->recvpersecond);
        else
          my_setopt(curl, CURLOPT_BUFFERSIZE, (long)BUFFER_SIZE);

        /* size of uploaded file: */
        if(uploadfilesize != -1)
          my_setopt(curl, CURLOPT_INFILESIZE_LARGE, uploadfilesize);
        my_setopt_str(curl, CURLOPT_URL, this_url);     /* what to fetch */
        my_setopt(curl, CURLOPT_NOPROGRESS, global->noprogress?1L:0L);
        if(config->no_body)
          my_setopt(curl, CURLOPT_NOBODY, 1L);

        if(config->oauth_bearer)
          my_setopt_str(curl, CURLOPT_XOAUTH2_BEARER, config->oauth_bearer);








|
|


|
|

|



|


|
|











>
|
|
>

|




|




|















|




|






|
|





>
|






|
>
>
>
>
>
>
>








|
|












<
|







|





|









<
<
<
|







1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153

1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177



1178
1179
1180
1181
1182
1183
1184
1185
          if(config->proxyanyauth || (authbits>1)) {
            warnf(config->global,
                  "Using --anyauth or --proxy-anyauth with upload from stdin"
                  " involves a big risk of it not working. Use a temporary"
                  " file or a fixed auth type instead!\n");
          }

          DEBUGASSERT(per->infdopen == FALSE);
          DEBUGASSERT(per->infd == STDIN_FILENO);

          set_binmode(stdin);
          if(!strcmp(per->uploadfile, ".")) {
            if(curlx_nonblock((curl_socket_t)per->infd, TRUE) < 0)
              warnf(config->global,
                    "fcntl failed on fd=%d: %s\n", per->infd, strerror(errno));
          }
        }

        if(per->uploadfile && config->resume_from_current)
          config->resume_from = -1; /* -1 will then force get-it-yourself */

        if(output_expected(per->this_url, per->uploadfile) && outs->stream &&
           isatty(fileno(outs->stream)))
          /* we send the output to a tty, therefore we switch off the progress
             meter */
          global->noprogress = global->isatty = TRUE;
        else {
          /* progress meter is per download, so restore config
             values */
          global->noprogress = orig_noprogress;
          global->isatty = orig_isatty;
        }

        if(urlnum > 1 && !global->mute) {
          per->separator_err =
            aprintf("\n[%lu/%lu]: %s --> %s",
                    li + 1, urlnum, per->this_url,
                    per->outfile ? per->outfile : "<stdout>");
          if(separator)
            per->separator = aprintf("%s%s", CURLseparator, per->this_url);
        }
        if(httpgetfields) {
          char *urlbuffer;
          /* Find out whether the url contains a file name */
          const char *pc = strstr(per->this_url, "://");
          char sep = '?';
          if(pc)
            pc += 3;
          else
            pc = per->this_url;

          pc = strrchr(pc, '/'); /* check for a slash */

          if(pc) {
            /* there is a slash present in the URL */

            if(strchr(pc, '?'))
              /* Ouch, there's already a question mark in the URL string, we
                 then append the data with an ampersand separator instead! */
              sep = '&';
          }
          /*
           * Then append ? followed by the get fields to the url.
           */
          if(pc)
            urlbuffer = aprintf("%s%c%s", per->this_url, sep, httpgetfields);
          else
            /* Append  / before the ? to create a well-formed url
               if the url contains a hostname only
            */
            urlbuffer = aprintf("%s/?%s", per->this_url, httpgetfields);

          if(!urlbuffer) {
            result = CURLE_OUT_OF_MEMORY;
            goto show_error;
          }

          Curl_safefree(per->this_url); /* free previous URL */
          per->this_url = urlbuffer; /* use our new URL instead! */
        }

        if(!global->errors)
          global->errors = stderr;

        if((!per->outfile || !strcmp(per->outfile, "-")) &&
           !config->use_ascii) {
          /* We get the output to stdout and we have not got the ASCII/text
             flag, then set stdout to be binary */
          set_binmode(stdout);
        }

        /* explicitly passed to stdout means okaying binary gunk */
        config->terminal_binary_ok =
          (per->outfile && !strcmp(per->outfile, "-"));

        /* avoid having this setopt added to the --libcurl source
           output */
        result = curl_easy_setopt(curl, CURLOPT_SHARE, share);
        if(result)
          goto show_error;

        if(!config->tcp_nodelay)
          my_setopt(curl, CURLOPT_TCP_NODELAY, 0L);

        if(config->tcp_fastopen)
          my_setopt(curl, CURLOPT_TCP_FASTOPEN, 1L);

        /* where to store */
        my_setopt(curl, CURLOPT_WRITEDATA, per);
        my_setopt(curl, CURLOPT_INTERLEAVEDATA, per);

        if(metalink || !config->use_metalink)
          /* what call to write */
          my_setopt(curl, CURLOPT_WRITEFUNCTION, tool_write_cb);
#ifdef USE_METALINK
        else
          /* Set Metalink specific write callback function to parse
             XML data progressively. */
          my_setopt(curl, CURLOPT_WRITEFUNCTION, metalink_write_cb);
#endif /* USE_METALINK */

        /* for uploads */

        input->config = config;
        /* Note that if CURLOPT_READFUNCTION is fread (the default), then
         * lib/telnet.c will Curl_poll() on the input file descriptor
         * rather then calling the READFUNCTION at regular intervals.
         * The circumstances in which it is preferable to enable this
         * behaviour, by omitting to set the READFUNCTION & READDATA options,
         * have not been determined.
         */
        my_setopt(curl, CURLOPT_READDATA, input);
        /* what call to read */
        my_setopt(curl, CURLOPT_READFUNCTION, tool_read_cb);

        /* in 7.18.0, the CURLOPT_SEEKFUNCTION/DATA pair is taking over what
           CURLOPT_IOCTLFUNCTION/DATA pair previously provided for seeking */
        my_setopt(curl, CURLOPT_SEEKDATA, input);
        my_setopt(curl, CURLOPT_SEEKFUNCTION, tool_seek_cb);

        if(config->recvpersecond &&
           (config->recvpersecond < BUFFER_SIZE))
          /* use a smaller sized buffer for better sleeps */
          my_setopt(curl, CURLOPT_BUFFERSIZE, (long)config->recvpersecond);
        else
          my_setopt(curl, CURLOPT_BUFFERSIZE, (long)BUFFER_SIZE);




        my_setopt_str(curl, CURLOPT_URL, per->this_url);
        my_setopt(curl, CURLOPT_NOPROGRESS, global->noprogress?1L:0L);
        if(config->no_body)
          my_setopt(curl, CURLOPT_NOBODY, 1L);

        if(config->oauth_bearer)
          my_setopt_str(curl, CURLOPT_XOAUTH2_BEARER, config->oauth_bearer);

911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944

          my_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS,
                    config->suppress_connect_headers?1L:0L);
        }

        my_setopt(curl, CURLOPT_FAILONERROR, config->failonerror?1L:0L);
        my_setopt(curl, CURLOPT_REQUEST_TARGET, config->request_target);
        my_setopt(curl, CURLOPT_UPLOAD, uploadfile?1L:0L);
        my_setopt(curl, CURLOPT_DIRLISTONLY, config->dirlistonly?1L:0L);
        my_setopt(curl, CURLOPT_APPEND, config->ftp_append?1L:0L);

        if(config->netrc_opt)
          my_setopt_enum(curl, CURLOPT_NETRC, (long)CURL_NETRC_OPTIONAL);
        else if(config->netrc || config->netrc_file)
          my_setopt_enum(curl, CURLOPT_NETRC, (long)CURL_NETRC_REQUIRED);
        else
          my_setopt_enum(curl, CURLOPT_NETRC, (long)CURL_NETRC_IGNORED);

        if(config->netrc_file)
          my_setopt_str(curl, CURLOPT_NETRC_FILE, config->netrc_file);

        my_setopt(curl, CURLOPT_TRANSFERTEXT, config->use_ascii?1L:0L);
        if(config->login_options)
          my_setopt_str(curl, CURLOPT_LOGIN_OPTIONS, config->login_options);
        my_setopt_str(curl, CURLOPT_USERPWD, config->userpwd);
        my_setopt_str(curl, CURLOPT_RANGE, config->range);
        my_setopt(curl, CURLOPT_ERRORBUFFER, errorbuffer);
        my_setopt(curl, CURLOPT_TIMEOUT_MS, (long)(config->timeout * 1000));

        switch(config->httpreq) {
        case HTTPREQ_SIMPLEPOST:
          my_setopt_str(curl, CURLOPT_POSTFIELDS,
                        config->postfields);
          my_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,







|


















|







1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253

          my_setopt(curl, CURLOPT_SUPPRESS_CONNECT_HEADERS,
                    config->suppress_connect_headers?1L:0L);
        }

        my_setopt(curl, CURLOPT_FAILONERROR, config->failonerror?1L:0L);
        my_setopt(curl, CURLOPT_REQUEST_TARGET, config->request_target);
        my_setopt(curl, CURLOPT_UPLOAD, per->uploadfile?1L:0L);
        my_setopt(curl, CURLOPT_DIRLISTONLY, config->dirlistonly?1L:0L);
        my_setopt(curl, CURLOPT_APPEND, config->ftp_append?1L:0L);

        if(config->netrc_opt)
          my_setopt_enum(curl, CURLOPT_NETRC, (long)CURL_NETRC_OPTIONAL);
        else if(config->netrc || config->netrc_file)
          my_setopt_enum(curl, CURLOPT_NETRC, (long)CURL_NETRC_REQUIRED);
        else
          my_setopt_enum(curl, CURLOPT_NETRC, (long)CURL_NETRC_IGNORED);

        if(config->netrc_file)
          my_setopt_str(curl, CURLOPT_NETRC_FILE, config->netrc_file);

        my_setopt(curl, CURLOPT_TRANSFERTEXT, config->use_ascii?1L:0L);
        if(config->login_options)
          my_setopt_str(curl, CURLOPT_LOGIN_OPTIONS, config->login_options);
        my_setopt_str(curl, CURLOPT_USERPWD, config->userpwd);
        my_setopt_str(curl, CURLOPT_RANGE, config->range);
        my_setopt(curl, CURLOPT_ERRORBUFFER, per->errorbuffer);
        my_setopt(curl, CURLOPT_TIMEOUT_MS, (long)(config->timeout * 1000));

        switch(config->httpreq) {
        case HTTPREQ_SIMPLEPOST:
          my_setopt_str(curl, CURLOPT_POSTFIELDS,
                        config->postfields);
          my_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE,
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
        if(built_in_protos & (CURLPROTO_SCP|CURLPROTO_SFTP)) {
          if(!config->insecure_ok) {
            char *home;
            char *file;
            result = CURLE_OUT_OF_MEMORY;
            home = homedir();
            if(home) {
              file = aprintf("%s/%sssh/known_hosts", home, DOT_CHAR);
              if(file) {
                /* new in curl 7.19.6 */
                result = res_setopt_str(curl, CURLOPT_SSH_KNOWNHOSTS, file);
                curl_free(file);
                if(result == CURLE_UNKNOWN_OPTION)
                  /* libssh2 version older than 1.1.1 */
                  result = CURLE_OK;







|







1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
        if(built_in_protos & (CURLPROTO_SCP|CURLPROTO_SFTP)) {
          if(!config->insecure_ok) {
            char *home;
            char *file;
            result = CURLE_OUT_OF_MEMORY;
            home = homedir();
            if(home) {
              file = aprintf("%s/.ssh/known_hosts", home);
              if(file) {
                /* new in curl 7.19.6 */
                result = res_setopt_str(curl, CURLOPT_SSH_KNOWNHOSTS, file);
                curl_free(file);
                if(result == CURLE_UNKNOWN_OPTION)
                  /* libssh2 version older than 1.1.1 */
                  result = CURLE_OK;
1226
1227
1228
1229
1230
1231
1232

1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
        my_setopt_str(curl, CURLOPT_CUSTOMREQUEST, config->customrequest);
        customrequest_helper(config, config->httpreq, config->customrequest);
        my_setopt(curl, CURLOPT_STDERR, global->errors);

        /* three new ones in libcurl 7.3: */
        my_setopt_str(curl, CURLOPT_INTERFACE, config->iface);
        my_setopt_str(curl, CURLOPT_KRBLEVEL, config->krblevel);


        progressbarinit(&progressbar, config);
        if((global->progressmode == CURL_PROGRESS_BAR) &&
           !global->noprogress && !global->mute) {
          /* we want the alternative style, then we have to implement it
             ourselves! */
          my_setopt(curl, CURLOPT_XFERINFOFUNCTION, tool_progress_cb);
          my_setopt(curl, CURLOPT_XFERINFODATA, &progressbar);
        }

        /* new in libcurl 7.24.0: */
        if(config->dns_servers)
          my_setopt_str(curl, CURLOPT_DNS_SERVERS, config->dns_servers);

        /* new in libcurl 7.33.0: */







>

<





|







1535
1536
1537
1538
1539
1540
1541
1542
1543

1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
        my_setopt_str(curl, CURLOPT_CUSTOMREQUEST, config->customrequest);
        customrequest_helper(config, config->httpreq, config->customrequest);
        my_setopt(curl, CURLOPT_STDERR, global->errors);

        /* three new ones in libcurl 7.3: */
        my_setopt_str(curl, CURLOPT_INTERFACE, config->iface);
        my_setopt_str(curl, CURLOPT_KRBLEVEL, config->krblevel);
        progressbarinit(&per->progressbar, config);


        if((global->progressmode == CURL_PROGRESS_BAR) &&
           !global->noprogress && !global->mute) {
          /* we want the alternative style, then we have to implement it
             ourselves! */
          my_setopt(curl, CURLOPT_XFERINFOFUNCTION, tool_progress_cb);
          my_setopt(curl, CURLOPT_XFERINFODATA, &per->progressbar);
        }

        /* new in libcurl 7.24.0: */
        if(config->dns_servers)
          my_setopt_str(curl, CURLOPT_DNS_SERVERS, config->dns_servers);

        /* new in libcurl 7.33.0: */
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
        if(config->proto_present)
          my_setopt_flags(curl, CURLOPT_PROTOCOLS, config->proto);
        if(config->proto_redir_present)
          my_setopt_flags(curl, CURLOPT_REDIR_PROTOCOLS, config->proto_redir);

        if(config->content_disposition
           && (urlnode->flags & GETOUT_USEREMOTE))
          hdrcbdata.honor_cd_filename = TRUE;
        else
          hdrcbdata.honor_cd_filename = FALSE;

        hdrcbdata.outs = &outs;
        hdrcbdata.heads = &heads;
        hdrcbdata.global = global;
        hdrcbdata.config = config;

        my_setopt(curl, CURLOPT_HEADERFUNCTION, tool_header_cb);
        my_setopt(curl, CURLOPT_HEADERDATA, &hdrcbdata);

        if(config->resolve)
          /* new in 7.21.3 */
          my_setopt_slist(curl, CURLOPT_RESOLVE, config->resolve);

        if(config->connect_to)
          /* new in 7.49.0 */







|

|

|
|
|
|


|







1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
        if(config->proto_present)
          my_setopt_flags(curl, CURLOPT_PROTOCOLS, config->proto);
        if(config->proto_redir_present)
          my_setopt_flags(curl, CURLOPT_REDIR_PROTOCOLS, config->proto_redir);

        if(config->content_disposition
           && (urlnode->flags & GETOUT_USEREMOTE))
          hdrcbdata->honor_cd_filename = TRUE;
        else
          hdrcbdata->honor_cd_filename = FALSE;

        hdrcbdata->outs = outs;
        hdrcbdata->heads = heads;
        hdrcbdata->global = global;
        hdrcbdata->config = config;

        my_setopt(curl, CURLOPT_HEADERFUNCTION, tool_header_cb);
        my_setopt(curl, CURLOPT_HEADERDATA, per);

        if(config->resolve)
          /* new in 7.21.3 */
          my_setopt_slist(curl, CURLOPT_RESOLVE, config->resolve);

        if(config->connect_to)
          /* new in 7.49.0 */
1478
1479
1480
1481
1482
1483
1484




1485
1486
1487
1488
1489
1490
1491
        if(config->proxy_ssl_allow_beast)
          my_setopt(curl, CURLOPT_PROXY_SSL_OPTIONS,
                    (long)CURLSSLOPT_ALLOW_BEAST);

        if(config->mail_auth)
          my_setopt_str(curl, CURLOPT_MAIL_AUTH, config->mail_auth);





        /* new in 7.31.0 */
        if(config->sasl_ir)
          my_setopt(curl, CURLOPT_SASL_IR, 1L);

        if(config->nonpn) {
          my_setopt(curl, CURLOPT_SSL_ENABLE_NPN, 0L);
        }







>
>
>
>







1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
        if(config->proxy_ssl_allow_beast)
          my_setopt(curl, CURLOPT_PROXY_SSL_OPTIONS,
                    (long)CURLSSLOPT_ALLOW_BEAST);

        if(config->mail_auth)
          my_setopt_str(curl, CURLOPT_MAIL_AUTH, config->mail_auth);

        /* new in 7.66.0 */
        if(config->sasl_authzid)
          my_setopt_str(curl, CURLOPT_SASL_AUTHZID, config->sasl_authzid);

        /* new in 7.31.0 */
        if(config->sasl_ir)
          my_setopt(curl, CURLOPT_SASL_IR, 1L);

        if(config->nonpn) {
          my_setopt(curl, CURLOPT_SSL_ENABLE_NPN, 0L);
        }
1501
1502
1503
1504
1505
1506
1507

1508
1509
1510
1511
1512
1513
1514
                          config->unix_socket_path);
          }
          else {
            my_setopt_str(curl, CURLOPT_UNIX_SOCKET_PATH,
                          config->unix_socket_path);
          }
        }

        /* new in 7.45.0 */
        if(config->proto_default)
          my_setopt_str(curl, CURLOPT_DEFAULT_PROTOCOL, config->proto_default);

        /* new in 7.47.0 */
        if(config->expect100timeout > 0)
          my_setopt_str(curl, CURLOPT_EXPECT_100_TIMEOUT_MS,







>







1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
                          config->unix_socket_path);
          }
          else {
            my_setopt_str(curl, CURLOPT_UNIX_SOCKET_PATH,
                          config->unix_socket_path);
          }
        }

        /* new in 7.45.0 */
        if(config->proto_default)
          my_setopt_str(curl, CURLOPT_DEFAULT_PROTOCOL, config->proto_default);

        /* new in 7.47.0 */
        if(config->expect100timeout > 0)
          my_setopt_str(curl, CURLOPT_EXPECT_100_TIMEOUT_MS,
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936

#ifdef USE_ALTSVC
        /* only if explicitly enabled in configure */
        if(config->altsvc)
          my_setopt_str(curl, CURLOPT_ALTSVC, config->altsvc);
#endif

        /* initialize retry vars for loop below */
        retry_sleep_default = (config->retry_delay) ?
          config->retry_delay*1000L : RETRY_SLEEP_DEFAULT; /* ms */

        retry_numretries = config->req_retry;
        retry_sleep = retry_sleep_default; /* ms */
        retrystart = tvnow();

#ifndef CURL_DISABLE_LIBCURL_OPTION
        if(global->libcurl) {
          result = easysrc_perform();
          if(result)
            goto show_error;
        }
#endif

        for(;;) {
#ifdef USE_METALINK
          if(!metalink && config->use_metalink) {
            /* If outs.metalink_parser is non-NULL, delete it first. */
            if(outs.metalink_parser)
              metalink_parser_context_delete(outs.metalink_parser);
            outs.metalink_parser = metalink_parser_context_new();
            if(outs.metalink_parser == NULL) {
              result = CURLE_OUT_OF_MEMORY;
              goto show_error;
            }
            fprintf(config->global->errors,
                    "Metalink: parsing (%s) metalink/XML...\n", this_url);
          }
          else if(metalink)
            fprintf(config->global->errors,
                    "Metalink: fetching (%s) from (%s)...\n",
                    mlfile->filename, this_url);
#endif /* USE_METALINK */

#ifdef CURLDEBUG
          if(config->test_event_based)
            result = curl_easy_perform_ev(curl);
          else
#endif
          result = curl_easy_perform(curl);

          if(!result && !outs.stream && !outs.bytes) {
            /* we have received no data despite the transfer was successful
               ==> force cration of an empty output file (if an output file
               was specified) */
            long cond_unmet = 0L;
            /* do not create (or even overwrite) the file in case we get no
               data because of unmet condition */
            curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &cond_unmet);
            if(!cond_unmet && !tool_create_output_file(&outs))
              result = CURLE_WRITE_ERROR;
          }

          if(outs.is_cd_filename && outs.stream && !global->mute &&
             outs.filename)
            printf("curl: Saved to filename '%s'\n", outs.filename);

          /* if retry-max-time is non-zero, make sure we haven't exceeded the
             time */
          if(retry_numretries &&
             (!config->retry_maxtime ||
              (tvdiff(tvnow(), retrystart) <
               config->retry_maxtime*1000L)) ) {
            enum {
              RETRY_NO,
              RETRY_TIMEOUT,
              RETRY_CONNREFUSED,
              RETRY_HTTP,
              RETRY_FTP,
              RETRY_LAST /* not used */
            } retry = RETRY_NO;
            long response;
            if((CURLE_OPERATION_TIMEDOUT == result) ||
               (CURLE_COULDNT_RESOLVE_HOST == result) ||
               (CURLE_COULDNT_RESOLVE_PROXY == result) ||
               (CURLE_FTP_ACCEPT_TIMEOUT == result))
              /* retry timeout always */
              retry = RETRY_TIMEOUT;
            else if(config->retry_connrefused &&
                    (CURLE_COULDNT_CONNECT == result)) {
              long oserrno;
              curl_easy_getinfo(curl, CURLINFO_OS_ERRNO, &oserrno);
              if(ECONNREFUSED == oserrno)
                retry = RETRY_CONNREFUSED;
            }
            else if((CURLE_OK == result) ||
                    (config->failonerror &&
                     (CURLE_HTTP_RETURNED_ERROR == result))) {
              /* If it returned OK. _or_ failonerror was enabled and it
                 returned due to such an error, check for HTTP transient
                 errors to retry on. */
              char *effective_url = NULL;
              curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
              if(effective_url &&
                 checkprefix("http", effective_url)) {
                /* This was HTTP(S) */
                curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);

                switch(response) {
                case 408: /* Request Timeout */
                case 500: /* Internal Server Error */
                case 502: /* Bad Gateway */
                case 503: /* Service Unavailable */
                case 504: /* Gateway Timeout */
                  retry = RETRY_HTTP;
                  /*
                   * At this point, we have already written data to the output
                   * file (or terminal). If we write to a file, we must rewind
                   * or close/re-open the file so that the next attempt starts
                   * over from the beginning.
                   */
                  break;
                }
              }
            } /* if CURLE_OK */
            else if(result) {
              long protocol;

              curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
              curl_easy_getinfo(curl, CURLINFO_PROTOCOL, &protocol);

              if((protocol == CURLPROTO_FTP || protocol == CURLPROTO_FTPS) &&
                 response / 100 == 4)
                /*
                 * This is typically when the FTP server only allows a certain
                 * amount of users and we are not one of them.  All 4xx codes
                 * are transient.
                 */
                retry = RETRY_FTP;
            }

            if(retry) {
              static const char * const m[]={
                NULL,
                "timeout",
                "connection refused",
                "HTTP error",
                "FTP error"
              };

              warnf(config->global, "Transient problem: %s "
                    "Will retry in %ld seconds. "
                    "%ld retries left.\n",
                    m[retry], retry_sleep/1000L, retry_numretries);

              tool_go_sleep(retry_sleep);
              retry_numretries--;
              if(!config->retry_delay) {
                retry_sleep *= 2;
                if(retry_sleep > RETRY_SLEEP_MAX)
                  retry_sleep = RETRY_SLEEP_MAX;
              }
              if(outs.bytes && outs.filename && outs.stream) {
                int rc;
                /* We have written data to a output file, we truncate file
                 */
                if(!global->mute)
                  fprintf(global->errors, "Throwing away %"
                          CURL_FORMAT_CURL_OFF_T " bytes\n",
                          outs.bytes);
                fflush(outs.stream);
                /* truncate file at the position where we started appending */
#ifdef HAVE_FTRUNCATE
                if(ftruncate(fileno(outs.stream), outs.init)) {
                  /* when truncate fails, we can't just append as then we'll
                     create something strange, bail out */
                  if(!global->mute)
                    fprintf(global->errors,
                            "failed to truncate, exiting\n");
                  result = CURLE_WRITE_ERROR;
                  goto quit_urls;
                }
                /* now seek to the end of the file, the position where we
                   just truncated the file in a large file-safe way */
                rc = fseek(outs.stream, 0, SEEK_END);
#else
                /* ftruncate is not available, so just reposition the file
                   to the location we would have truncated it. This won't
                   work properly with large files on 32-bit systems, but
                   most of those will have ftruncate. */
                rc = fseek(outs.stream, (long)outs.init, SEEK_SET);
#endif
                if(rc) {
                  if(!global->mute)
                    fprintf(global->errors,
                            "failed seeking to end of file, exiting\n");
                  result = CURLE_WRITE_ERROR;
                  goto quit_urls;
                }
                outs.bytes = 0; /* clear for next round */
              }
              continue; /* curl_easy_perform loop */
            }
          } /* if retry_numretries */
          else if(metalink) {
            /* Metalink: Decide to try the next resource or
               not. Basically, we want to try the next resource if
               download was not successful. */
            long response;
            if(CURLE_OK == result) {
              char *effective_url = NULL;
              curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url);
              if(effective_url &&
                 curl_strnequal(effective_url, "http", 4)) {
                /* This was HTTP(S) */
                curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response);
                if(response != 200 && response != 206) {
                  metalink_next_res = 1;
                  fprintf(global->errors,
                          "Metalink: fetching (%s) from (%s) FAILED "
                          "(HTTP status code %ld)\n",
                          mlfile->filename, this_url, response);
                }
              }
            }
            else {
              metalink_next_res = 1;
              fprintf(global->errors,
                      "Metalink: fetching (%s) from (%s) FAILED (%s)\n",
                      mlfile->filename, this_url,
                      (errorbuffer[0]) ?
                      errorbuffer : curl_easy_strerror(result));
            }
          }
          if(metalink && !metalink_next_res)
            fprintf(global->errors, "Metalink: fetching (%s) from (%s) OK\n",
                    mlfile->filename, this_url);

          /* In all ordinary cases, just break out of loop here */
          break; /* curl_easy_perform loop */

        }

        if((global->progressmode == CURL_PROGRESS_BAR) &&
           progressbar.calls)
          /* if the custom progress bar has been displayed, we output a
             newline here */
          fputs("\n", progressbar.out);

        if(config->writeout)
          ourWriteOut(curl, &outs, config->writeout);

        /*
        ** Code within this loop may jump directly here to label 'show_error'
        ** in order to display an error message for CURLcode stored in 'res'
        ** variable and exit loop once that necessary writing and cleanup
        ** in label 'quit_urls' has been done.
        */

        show_error:

#ifdef __VMS
        if(is_vms_shell()) {
          /* VMS DCL shell behavior */
          if(!global->showerror)
            vms_show = VMSSTS_HIDE;
        }
        else
#endif
        if(config->synthetic_error) {
          ;
        }
        else if(result && global->showerror) {
          fprintf(global->errors, "curl: (%d) %s\n", result, (errorbuffer[0]) ?
                  errorbuffer : curl_easy_strerror(result));
          if(result == CURLE_PEER_FAILED_VERIFICATION)
            fputs(CURL_CA_CERT_ERRORMSG, global->errors);
        }

        /* Fall through comment to 'quit_urls' label */

        /*
        ** Upon error condition and always that a message has already been
        ** displayed, code within this loop may jump directly here to label
        ** 'quit_urls' otherwise it should jump to 'show_error' label above.
        **
        ** When 'res' variable is _not_ CURLE_OK loop will exit once that
        ** all code following 'quit_urls' has been executed. Otherwise it
        ** will loop to the beginning from where it may exit if there are
        ** no more urls left.
        */

        quit_urls:

        /* Set file extended attributes */
        if(!result && config->xattr && outs.fopened && outs.stream) {
          int rc = fwrite_xattr(curl, fileno(outs.stream));
          if(rc)
            warnf(config->global, "Error setting extended attributes: %s\n",
                  strerror(errno));
        }

        /* Close the file */
        if(outs.fopened && outs.stream) {
          int rc = fclose(outs.stream);
          if(!result && rc) {
            /* something went wrong in the writing process */
            result = CURLE_WRITE_ERROR;
            fprintf(global->errors, "(%d) Failed writing body\n", result);
          }
        }
        else if(!outs.s_isreg && outs.stream) {
          /* Dump standard stream buffered data */
          int rc = fflush(outs.stream);
          if(!result && rc) {
            /* something went wrong in the writing process */
            result = CURLE_WRITE_ERROR;
            fprintf(global->errors, "(%d) Failed writing body\n", result);
          }
        }

#ifdef __AMIGA__
        if(!result && outs.s_isreg && outs.filename) {
          /* Set the url (up to 80 chars) as comment for the file */
          if(strlen(urlnode->url) > 78)
            urlnode->url[79] = '\0';
          SetComment(outs.filename, urlnode->url);
        }
#endif

        /* File time can only be set _after_ the file has been closed */
        if(!result && config->remote_time && outs.s_isreg && outs.filename) {
          /* Ask libcurl if we got a remote file time */
          curl_off_t filetime = -1;
          curl_easy_getinfo(curl, CURLINFO_FILETIME_T, &filetime);
          setfiletime(filetime, outs.filename, config->global->errors);
        }

#ifdef USE_METALINK
        if(!metalink && config->use_metalink && result == CURLE_OK) {
          int rv = parse_metalink(config, &outs, this_url);
          if(rv == 0)
            fprintf(config->global->errors, "Metalink: parsing (%s) OK\n",
                    this_url);
          else if(rv == -1)
            fprintf(config->global->errors, "Metalink: parsing (%s) FAILED\n",
                    this_url);
        }
        else if(metalink && result == CURLE_OK && !metalink_next_res) {
          int rv = metalink_check_hash(global, mlfile, outs.filename);
          if(rv == 0) {
            metalink_next_res = 1;
          }
        }
#endif /* USE_METALINK */

        /* No more business with this output struct */
        if(outs.alloc_filename)
          Curl_safefree(outs.filename);
#ifdef USE_METALINK
        if(outs.metalink_parser)
          metalink_parser_context_delete(outs.metalink_parser);
#endif /* USE_METALINK */
        memset(&outs, 0, sizeof(struct OutStruct));
        hdrcbdata.outs = NULL;

        /* Free loop-local allocated memory and close loop-local opened fd */

        Curl_safefree(outfile);
        Curl_safefree(this_url);

        if(infdopen)
          close(infd);

        if(metalink) {
          /* Should exit if error is fatal. */
          if(is_fatal_error(result)) {
            break;
          }
          if(!metalink_next_res)
            break;
          mlres = mlres->next;
          if(mlres == NULL)
            break;
        }
        else if(urlnum > 1) {
          /* when url globbing, exit loop upon critical error */
          if(is_fatal_error(result))
            break;
        }
        else if(result)
          /* when not url globbing, exit loop upon any error */
          break;

      } /* loop to the next URL */

      /* Free loop-local allocated memory */

      Curl_safefree(uploadfile);

      if(urls) {
        /* Free list of remaining URLs */
        glob_cleanup(urls);
        urls = NULL;
      }








<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<

|
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
|
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
|
<
<
|
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
<
<
<
<
<
<
<
<
<
|
<
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<



<
|
|







1846
1847
1848
1849
1850
1851
1852

















1853
1854



1855












































































1856







































































1857
1858
1859












1860


1861


1862



1863













1864
1865









1866






































1867































1868
1869


















1870








1871







1872

















1873









1874

1875

























1876
1877
1878

1879
1880
1881
1882
1883
1884
1885
1886
1887

#ifdef USE_ALTSVC
        /* only if explicitly enabled in configure */
        if(config->altsvc)
          my_setopt_str(curl, CURLOPT_ALTSVC, config->altsvc);
#endif


















#ifdef USE_METALINK
        if(!metalink && config->use_metalink) {



          outs->metalink_parser = metalink_parser_context_new();












































































          if(outs->metalink_parser == NULL) {







































































            result = CURLE_OUT_OF_MEMORY;
            goto show_error;
          }












          fprintf(config->global->errors,


                  "Metalink: parsing (%s) metalink/XML...\n", per->this_url);


        }



        else if(metalink)













          fprintf(config->global->errors,
                  "Metalink: fetching (%s) from (%s)...\n",









                  mlfile->filename, per->this_url);






































#endif /* USE_METALINK */
































        per->metalink = metalink;


















        /* initialize retry vars for loop below */








        per->retry_sleep_default = (config->retry_delay) ?







          config->retry_delay*1000L : RETRY_SLEEP_DEFAULT; /* ms */

















        per->retry_numretries = config->req_retry;









        per->retry_sleep = per->retry_sleep_default; /* ms */

        per->retrystart = tvnow();


























      } /* loop to the next URL */


      show_error:
      quit_urls:

      if(urls) {
        /* Free list of remaining URLs */
        glob_cleanup(urls);
        urls = NULL;
      }

1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977











































































































































































































































































































1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
    /* Free this URL node data without destroying the
       the node itself nor modifying next pointer. */
    Curl_safefree(urlnode->url);
    Curl_safefree(urlnode->outfile);
    Curl_safefree(urlnode->infile);
    urlnode->flags = 0;

    /*
    ** Bail out upon critical errors or --fail-early
    */
    if(is_fatal_error(result) || (result && global->fail_early))
      goto quit_curl;

  } /* for-loop through all URLs */

  /*
  ** Nested loops end here.
  */

  quit_curl:












































































































































































































































































































  /* Reset the global config variables */
  global->noprogress = orig_noprogress;
  global->isatty = orig_isatty;

  /* Free function-local referenced allocated memory */
  Curl_safefree(httpgetfields);

  /* Free list of given URLs */
  clean_getout(config);

  hdrcbdata.heads = NULL;

  /* Close function-local opened file descriptors */
  if(heads.fopened && heads.stream)
    fclose(heads.stream);

  if(heads.alloc_filename)
    Curl_safefree(heads.filename);

  /* Release metalink related resources here */
  clean_metalink(config);

  return result;
}

CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
{
  CURLcode result = CURLE_OK;







<
<
<
<
<
<

<
<
<
<
<

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







1909
1910
1911
1912
1913
1914
1915






1916





1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221

















2222
2223
2224
2225
2226
2227
2228
    /* Free this URL node data without destroying the
       the node itself nor modifying next pointer. */
    Curl_safefree(urlnode->url);
    Curl_safefree(urlnode->outfile);
    Curl_safefree(urlnode->infile);
    urlnode->flags = 0;







  } /* for-loop through all URLs */





  quit_curl:

  /* Free function-local referenced allocated memory */
  Curl_safefree(httpgetfields);

  return result;
}

static long all_added; /* number of easy handles currently added */

/*
 * add_parallel_transfers() sets 'morep' to TRUE if there are more transfers
 * to add even after this call returns. sets 'addedp' to TRUE if one or more
 * transfers were added.
 */
static int add_parallel_transfers(struct GlobalConfig *global,
                                  CURLM *multi,
                                  bool *morep,
                                  bool *addedp)
{
  struct per_transfer *per;
  CURLcode result;
  CURLMcode mcode;
  *addedp = FALSE;
  *morep = FALSE;
  for(per = transfers; per && (all_added < global->parallel_max);
      per = per->next) {
    if(per->added)
      /* already added */
      continue;

    result = pre_transfer(global, per);
    if(result)
      break;

    (void)curl_easy_setopt(per->curl, CURLOPT_PRIVATE, per);
    (void)curl_easy_setopt(per->curl, CURLOPT_XFERINFOFUNCTION, xferinfo_cb);
    (void)curl_easy_setopt(per->curl, CURLOPT_XFERINFODATA, per);

    mcode = curl_multi_add_handle(multi, per->curl);
    if(mcode)
      return CURLE_OUT_OF_MEMORY;
    per->added = TRUE;
    all_added++;
    *addedp = TRUE;
  }
  *morep = per ? TRUE : FALSE;
  return CURLE_OK;
}

static CURLcode parallel_transfers(struct GlobalConfig *global,
                                   CURLSH *share)
{
  CURLM *multi;
  bool done = FALSE;
  CURLMcode mcode = CURLM_OK;
  CURLcode result = CURLE_OK;
  int still_running = 1;
  struct timeval start = tvnow();
  bool more_transfers;
  bool added_transfers;

  multi = curl_multi_init();
  if(!multi)
    return CURLE_OUT_OF_MEMORY;

  result = add_parallel_transfers(global, multi,
                                  &more_transfers, &added_transfers);
  if(result)
    return result;

  while(!done && !mcode && (still_running || more_transfers)) {
    mcode = curl_multi_poll(multi, NULL, 0, 1000, NULL);
    if(!mcode)
      mcode = curl_multi_perform(multi, &still_running);

    progress_meter(global, &start, FALSE);

    if(!mcode) {
      int rc;
      CURLMsg *msg;
      bool removed = FALSE;
      do {
        msg = curl_multi_info_read(multi, &rc);
        if(msg) {
          bool retry;
          struct per_transfer *ended;
          CURL *easy = msg->easy_handle;
          result = msg->data.result;
          curl_easy_getinfo(easy, CURLINFO_PRIVATE, (void *)&ended);
          curl_multi_remove_handle(multi, easy);

          result = post_transfer(global, share, ended, result, &retry);
          if(retry)
            continue;
          progress_finalize(ended); /* before it goes away */
          all_added--; /* one fewer added */
          removed = TRUE;
          (void)del_transfer(ended);
        }
      } while(msg);
      if(removed) {
        /* one or more transfers completed, add more! */
        (void)add_parallel_transfers(global, multi, &more_transfers,
                                     &added_transfers);
        if(added_transfers)
          /* we added new ones, make sure the loop doesn't exit yet */
          still_running = 1;
      }
    }
  }

  (void)progress_meter(global, &start, TRUE);

  /* Make sure to return some kind of error if there was a multi problem */
  if(mcode) {
    result = (mcode == CURLM_OUT_OF_MEMORY) ? CURLE_OUT_OF_MEMORY :
      /* The other multi errors should never happen, so return
         something suitably generic */
      CURLE_BAD_FUNCTION_ARGUMENT;
  }

  curl_multi_cleanup(multi);

  return result;
}

static CURLcode serial_transfers(struct GlobalConfig *global,
                                 CURLSH *share)
{
  CURLcode returncode = CURLE_OK;
  CURLcode result = CURLE_OK;
  struct per_transfer *per;
  for(per = transfers; per;) {
    bool retry;
    result = pre_transfer(global, per);
    if(result)
      break;

#ifndef CURL_DISABLE_LIBCURL_OPTION
    if(global->libcurl) {
      result = easysrc_perform();
      if(result)
        break;
    }
#endif
#ifdef CURLDEBUG
    if(global->test_event_based)
      result = curl_easy_perform_ev(per->curl);
    else
#endif
      result = curl_easy_perform(per->curl);

    /* store the result of the actual transfer */
    returncode = result;

    result = post_transfer(global, share, per, result, &retry);
    if(retry)
      continue;
    per = del_transfer(per);

    /* Bail out upon critical errors or --fail-early */
    if(result || is_fatal_error(returncode) ||
       (returncode && global->fail_early))
      break;
  }
  if(returncode)
    /* returncode errors have priority */
    result = returncode;
  return result;
}

static CURLcode operate_do(struct GlobalConfig *global,
                           struct OperationConfig *config,
                           CURLSH *share)
{
  CURLcode result = CURLE_OK;
  bool capath_from_env;

  /* Check we have a url */
  if(!config->url_list || !config->url_list->url) {
    helpf(global->errors, "no URL specified!\n");
    return CURLE_FAILED_INIT;
  }

  /* On WIN32 we can't set the path to curl-ca-bundle.crt
   * at compile time. So we look here for the file in two ways:
   * 1: look at the environment variable CURL_CA_BUNDLE for a path
   * 2: if #1 isn't found, use the windows API function SearchPath()
   *    to find it along the app's path (includes app's dir and CWD)
   *
   * We support the environment variable thing for non-Windows platforms
   * too. Just for the sake of it.
   */
  capath_from_env = false;
  if(!config->cacert &&
     !config->capath &&
     !config->insecure_ok) {
    CURL *curltls = curl_easy_init();
    struct curl_tlssessioninfo *tls_backend_info = NULL;

    /* With the addition of CAINFO support for Schannel, this search could find
     * a certificate bundle that was previously ignored. To maintain backward
     * compatibility, only perform this search if not using Schannel.
     */
    result = curl_easy_getinfo(curltls, CURLINFO_TLS_SSL_PTR,
                               &tls_backend_info);
    if(result)
      return result;

    /* Set the CA cert locations specified in the environment. For Windows if
     * no environment-specified filename is found then check for CA bundle
     * default filename curl-ca-bundle.crt in the user's PATH.
     *
     * If Schannel is the selected SSL backend then these locations are
     * ignored. We allow setting CA location for schannel only when explicitly
     * specified by the user via CURLOPT_CAINFO / --cacert.
     */
    if(tls_backend_info->backend != CURLSSLBACKEND_SCHANNEL) {
      char *env;
      env = curlx_getenv("CURL_CA_BUNDLE");
      if(env) {
        config->cacert = strdup(env);
        if(!config->cacert) {
          curl_free(env);
          helpf(global->errors, "out of memory\n");
          return CURLE_OUT_OF_MEMORY;
        }
      }
      else {
        env = curlx_getenv("SSL_CERT_DIR");
        if(env) {
          config->capath = strdup(env);
          if(!config->capath) {
            curl_free(env);
            helpf(global->errors, "out of memory\n");
            return CURLE_OUT_OF_MEMORY;
          }
          capath_from_env = true;
        }
        else {
          env = curlx_getenv("SSL_CERT_FILE");
          if(env) {
            config->cacert = strdup(env);
            if(!config->cacert) {
              curl_free(env);
              helpf(global->errors, "out of memory\n");
              return CURLE_OUT_OF_MEMORY;
            }
          }
        }
      }

      if(env)
        curl_free(env);
#ifdef WIN32
      else {
        result = FindWin32CACert(config, tls_backend_info->backend,
                                 "curl-ca-bundle.crt");
      }
#endif
    }
    curl_easy_cleanup(curltls);
  }

  if(!result)
    /* loop through the list of given URLs */
    result = create_transfers(global, config, share, capath_from_env);

  return result;
}

static CURLcode operate_transfers(struct GlobalConfig *global,
                                  CURLSH *share,
                                  CURLcode result)
{
  /* Save the values of noprogress and isatty to restore them later on */
  bool orig_noprogress = global->noprogress;
  bool orig_isatty = global->isatty;
  struct per_transfer *per;

  /* Time to actually do the transfers */
  if(!result) {
    if(global->parallel)
      result = parallel_transfers(global, share);
    else
      result = serial_transfers(global, share);
  }

  /* cleanup if there are any left */
  for(per = transfers; per;) {
    bool retry;
    (void)post_transfer(global, share, per, result, &retry);
    /* Free list of given URLs */
    clean_getout(per->config);

    /* Release metalink related resources here */
    clean_metalink(per->config);
    per = del_transfer(per);
  }

  /* Reset the global config variables */
  global->noprogress = orig_noprogress;
  global->isatty = orig_isatty;



















  return result;
}

CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[])
{
  CURLcode result = CURLE_OK;
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060






2061










2062
2063

2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080


2081

2082
2083
2084
2085
2086
2087
2088
      else if(res == PARAM_MANUAL_REQUESTED)
        hugehelp();
      /* Check if we were asked for the version information */
      else if(res == PARAM_VERSION_INFO_REQUESTED)
        tool_version_info();
      /* Check if we were asked to list the SSL engines */
      else if(res == PARAM_ENGINES_REQUESTED)
        tool_list_engines(config->easy);
      else if(res == PARAM_LIBCURL_UNSUPPORTED_PROTOCOL)
        result = CURLE_UNSUPPORTED_PROTOCOL;
      else
        result = CURLE_FAILED_INIT;
    }
    else {
#ifndef CURL_DISABLE_LIBCURL_OPTION
      if(config->libcurl) {
        /* Initialise the libcurl source output */
        result = easysrc_init();
      }
#endif

      /* Perform the main operations */
      if(!result) {
        size_t count = 0;
        struct OperationConfig *operation = config->first;

















        /* Get the required arguments for each operation */
        while(!result && operation) {

          result = get_args(operation, count++);

          operation = operation->next;
        }

        /* Set the current operation pointer */
        config->current = config->first;

        /* Perform each operation */
        while(!result && config->current) {
          result = operate_do(config, config->current);

          config->current = config->current->next;

          if(config->current && config->current->easy)
            curl_easy_reset(config->current->easy);
        }




#ifndef CURL_DISABLE_LIBCURL_OPTION
        if(config->libcurl) {
          /* Cleanup the libcurl source output */
          easysrc_cleanup();

          /* Dump the libcurl code if previously enabled */
          dumpeasysrc(config);







|

















>
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>

<
>



|




|

|
<

|
<
<
|
>
>

>







2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300

2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312

2313
2314


2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
      else if(res == PARAM_MANUAL_REQUESTED)
        hugehelp();
      /* Check if we were asked for the version information */
      else if(res == PARAM_VERSION_INFO_REQUESTED)
        tool_version_info();
      /* Check if we were asked to list the SSL engines */
      else if(res == PARAM_ENGINES_REQUESTED)
        tool_list_engines();
      else if(res == PARAM_LIBCURL_UNSUPPORTED_PROTOCOL)
        result = CURLE_UNSUPPORTED_PROTOCOL;
      else
        result = CURLE_FAILED_INIT;
    }
    else {
#ifndef CURL_DISABLE_LIBCURL_OPTION
      if(config->libcurl) {
        /* Initialise the libcurl source output */
        result = easysrc_init();
      }
#endif

      /* Perform the main operations */
      if(!result) {
        size_t count = 0;
        struct OperationConfig *operation = config->first;
        CURLSH *share = curl_share_init();
        if(!share) {
#ifndef CURL_DISABLE_LIBCURL_OPTION
          if(config->libcurl) {
            /* Cleanup the libcurl source output */
            easysrc_cleanup();
          }
#endif
          return CURLE_OUT_OF_MEMORY;
        }

        curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
        curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
        curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
        curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);
        curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_PSL);

        /* Get the required arguments for each operation */

        do {
          result = get_args(operation, count++);

          operation = operation->next;
        } while(!result && operation);

        /* Set the current operation pointer */
        config->current = config->first;

        /* Setup all transfers */
        while(!result && config->current) {
          result = operate_do(config, config->current, share);

          config->current = config->current->next;
        }



        /* now run! */
        result = operate_transfers(config, share, result);

        curl_share_cleanup(share);
#ifndef CURL_DISABLE_LIBCURL_OPTION
        if(config->libcurl) {
          /* Cleanup the libcurl source output */
          easysrc_cleanup();

          /* Dump the libcurl code if previously enabled */
          dumpeasysrc(config);
Changes to jni/curl/src/tool_operate.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24



25









































26
27


28
#ifndef HEADER_CURL_TOOL_OPERATE_H
#define HEADER_CURL_TOOL_OPERATE_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"













































CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[]);



#endif /* HEADER_CURL_TOOL_OPERATE_H */









|














>
>
>

>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


>
>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#ifndef HEADER_CURL_TOOL_OPERATE_H
#define HEADER_CURL_TOOL_OPERATE_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"
#include "tool_cb_hdr.h"
#include "tool_cb_prg.h"
#include "tool_sdecls.h"

struct per_transfer {
  /* double linked */
  struct per_transfer *next;
  struct per_transfer *prev;
  struct OperationConfig *config; /* for this transfer */
  CURL *curl;
  long retry_numretries;
  long retry_sleep_default;
  long retry_sleep;
  struct timeval retrystart;
  bool metalink; /* nonzero for metalink download. */
  bool metalink_next_res;
  metalinkfile *mlfile;
  metalink_resource *mlres;
  char *this_url;
  char *outfile;
  bool infdopen; /* TRUE if infd needs closing */
  int infd;
  struct ProgressData progressbar;
  struct OutStruct outs;
  struct OutStruct heads;
  struct InStruct input;
  struct HdrCbData hdrcbdata;
  char errorbuffer[CURL_ERROR_SIZE];

  bool added; /* set TRUE when added to the multi handle */

  /* for parallel progress bar */
  curl_off_t dltotal;
  curl_off_t dlnow;
  curl_off_t ultotal;
  curl_off_t ulnow;
  bool dltotal_added; /* if the total has been added from this */
  bool ultotal_added;

  /* NULL or malloced */
  char *separator_err;
  char *separator;
  char *uploadfile;
};

CURLcode operate(struct GlobalConfig *config, int argc, argv_item_t argv[]);

extern struct per_transfer *transfers; /* first node */

#endif /* HEADER_CURL_TOOL_OPERATE_H */
Changes to jni/curl/src/tool_operhlp.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
67
68
69
70
71
72
73
74
75
76
77



78
79
80
81
82
83
84
          !strcmp(uploadfile, ".")) ? TRUE : FALSE;
}

/*
 * Adds the file name to the URL if it doesn't already have one.
 * url will be freed before return if the returned pointer is different
 */
char *add_file_name_to_url(CURL *curl, char *url, const char *filename)
{
  /* If no file name part is given in the URL, we add this file name */
  char *ptr = strstr(url, "://");



  if(ptr)
    ptr += 3;
  else
    ptr = url;
  ptr = strrchr(ptr, '/');
  if(!ptr || !strlen(++ptr)) {
    /* The URL has no file name part, add the local file name. In order







|



>
>
>







67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
          !strcmp(uploadfile, ".")) ? TRUE : FALSE;
}

/*
 * Adds the file name to the URL if it doesn't already have one.
 * url will be freed before return if the returned pointer is different
 */
char *add_file_name_to_url(char *url, const char *filename)
{
  /* If no file name part is given in the URL, we add this file name */
  char *ptr = strstr(url, "://");
  CURL *curl = curl_easy_init(); /* for url escaping */
  if(!curl)
    return NULL; /* error! */
  if(ptr)
    ptr += 3;
  else
    ptr = url;
  ptr = strrchr(ptr, '/');
  if(!ptr || !strlen(++ptr)) {
    /* The URL has no file name part, add the local file name. In order
116
117
118
119
120
121
122

123
124
125
126
127
128
129
        return NULL;

      url = urlbuffer; /* use our new URL instead! */
    }
    else
      Curl_safefree(url);
  }

  return url;
}

/* Extracts the name portion of the URL.
 * Returns a pointer to a heap-allocated string or NULL if
 * no name part, at location indicated by first argument.
 */







>







119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
        return NULL;

      url = urlbuffer; /* use our new URL instead! */
    }
    else
      Curl_safefree(url);
  }
  curl_easy_cleanup(curl);
  return url;
}

/* Extracts the name portion of the URL.
 * Returns a pointer to a heap-allocated string or NULL if
 * no name part, at location indicated by first argument.
 */
Changes to jni/curl/src/tool_operhlp.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_CURL_TOOL_OPERHLP_H
#define HEADER_CURL_TOOL_OPERHLP_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_CURL_TOOL_OPERHLP_H
#define HEADER_CURL_TOOL_OPERHLP_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
27
28
29
30
31
32
33
34
35
36
37
38

void clean_getout(struct OperationConfig *config);

bool output_expected(const char *url, const char *uploadfile);

bool stdin_upload(const char *uploadfile);

char *add_file_name_to_url(CURL *curl, char *url, const char *filename);

CURLcode get_url_file_name(char **filename, const char *url);

#endif /* HEADER_CURL_TOOL_OPERHLP_H */







|




27
28
29
30
31
32
33
34
35
36
37
38

void clean_getout(struct OperationConfig *config);

bool output_expected(const char *url, const char *uploadfile);

bool stdin_upload(const char *uploadfile);

char *add_file_name_to_url(char *url, const char *filename);

CURLcode get_url_file_name(char **filename, const char *url);

#endif /* HEADER_CURL_TOOL_OPERHLP_H */
Changes to jni/curl/src/tool_paramhlp.c.
192
193
194
195
196
197
198






















199
200
201
202
203
204
205
  if(result != PARAM_OK)
    return result;
  if(*val < 0)
    return PARAM_NEGATIVE_NUMERIC;

  return PARAM_OK;
}























/*
 * Parse the string and write the double in the given address. Return PARAM_OK
 * on success, otherwise a parameter specific error enum.
 *
 * The 'max' argument is the maximum value allowed, as the numbers are often
 * multiplied when later used.







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
  if(result != PARAM_OK)
    return result;
  if(*val < 0)
    return PARAM_NEGATIVE_NUMERIC;

  return PARAM_OK;
}

/*
 * Parse the string and write the long in the given address if it is below the
 * maximum allowed value. Return PARAM_OK on success, otherwise a parameter
 * error enum. ONLY ACCEPTS POSITIVE NUMBERS!
 *
 * Since this function gets called with the 'nextarg' pointer from within the
 * getparameter a lot, we must check it for NULL before accessing the str
 * data.
 */

ParameterError str2unummax(long *val, const char *str, long max)
{
  ParameterError result = str2unum(val, str);
  if(result != PARAM_OK)
    return result;
  if(*val > max)
    return PARAM_NUMBER_TOO_LARGE;

  return PARAM_OK;
}


/*
 * Parse the string and write the double in the given address. Return PARAM_OK
 * on success, otherwise a parameter specific error enum.
 *
 * The 'max' argument is the maximum value allowed, as the numbers are often
 * multiplied when later used.
Changes to jni/curl/src/tool_paramhlp.h.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_CURL_TOOL_PARAMHLP_H
#define HEADER_CURL_TOOL_PARAMHLP_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is









|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef HEADER_CURL_TOOL_PARAMHLP_H
#define HEADER_CURL_TOOL_PARAMHLP_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
29
30
31
32
33
34
35

36
37
38
39
40
41
42

ParameterError file2memory(char **bufp, size_t *size, FILE *file);

void cleanarg(char *str);

ParameterError str2num(long *val, const char *str);
ParameterError str2unum(long *val, const char *str);

ParameterError str2udouble(double *val, const char *str, long max);

long proto2num(struct OperationConfig *config, long *val, const char *str);

int check_protocol(const char *str);

ParameterError str2offset(curl_off_t *val, const char *str);







>







29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

ParameterError file2memory(char **bufp, size_t *size, FILE *file);

void cleanarg(char *str);

ParameterError str2num(long *val, const char *str);
ParameterError str2unum(long *val, const char *str);
ParameterError str2unummax(long *val, const char *str, long max);
ParameterError str2udouble(double *val, const char *str, long max);

long proto2num(struct OperationConfig *config, long *val, const char *str);

int check_protocol(const char *str);

ParameterError str2offset(curl_off_t *val, const char *str);
Changes to jni/curl/src/tool_parsecfg.c.
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44





























45
46
47
48
49
50
51
52
53

54
55
56
57
58
59
60
61
62
63
64



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84




85


86
87
88
89
90
91
92
93

94

95
96





97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "tool_helpers.h"
#include "tool_homedir.h"
#include "tool_msgs.h"
#include "tool_parsecfg.h"

#include "memdebug.h" /* keep this as LAST include */

#define CURLRC DOT_CHAR "curlrc"

/* only acknowledge colon or equals as separators if the option was not
   specified with an initial dash! */
#define ISSEP(x,dash) (!dash && (((x) == '=') || ((x) == ':')))

static const char *unslashquote(const char *line, char *param);
static char *my_get_line(FILE *fp);






























/* return 0 on everything-is-fine, and non-zero otherwise */
int parseconfig(const char *filename, struct GlobalConfig *global)
{
  FILE *file = NULL;
  char filebuffer[512];
  bool usedarg = FALSE;
  int rc = 0;
  struct OperationConfig *operation = global->first;


  if(!filename || !*filename) {
    /* NULL or no file name attempts to load .curlrc from the homedir! */

#ifndef __AMIGA__
    char *home = homedir();    /* portable homedir finder */
    filename = CURLRC;   /* sensible default */
    if(home) {
      if(strlen(home) < (sizeof(filebuffer) - strlen(CURLRC))) {
        msnprintf(filebuffer, sizeof(filebuffer),
                  "%s%s%s", home, DIR_CHAR, CURLRC);




#ifdef WIN32
        /* Check if the file exists - if not, try CURLRC in the same
         * directory as our executable
         */
        file = fopen(filebuffer, FOPEN_READTEXT);
        if(file != NULL) {
          filename = filebuffer;
        }
        else {
          /* Get the filename of our executable. GetModuleFileName is
           * already declared via inclusions done in setup header file.
           * We assume that we are using the ASCII version here.
           */
          unsigned long len = GetModuleFileNameA(0, filebuffer,
                                                 sizeof(filebuffer));
          if(len > 0 && len < sizeof(filebuffer)) {
            /* We got a valid filename - get the directory part */
            char *lastdirchar = strrchr(filebuffer, '\\');
            if(lastdirchar) {




              size_t remaining;


              *lastdirchar = 0;
              /* If we have enough space, build the RC filename */
              remaining = sizeof(filebuffer) - strlen(filebuffer);
              if(strlen(CURLRC) < remaining - 1) {
                msnprintf(lastdirchar, remaining,
                          "%s%s", DIR_CHAR, CURLRC);
                /* Don't bother checking if it exists - we do that later */
                filename = filebuffer;

              }

            }
          }





        }
#else /* WIN32 */
        filename = filebuffer;
#endif /* WIN32 */
      }
      Curl_safefree(home); /* we've used it, now free it */
    }

# else /* __AMIGA__ */
    /* On AmigaOS all the config files are into env:
     */
    filename = "ENV:" CURLRC;

#endif
  }

  if(!file) { /* WIN32: no need to fopen() again */
    if(strcmp(filename, "-"))
      file = fopen(filename, FOPEN_READTEXT);
    else
      file = stdin;
  }

  if(file) {







<
<






>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





<



>




<

|

<
<
|
>
>
>
|
<
<
<
<
<
<
|
|
|
<
<
<
<
<
|
<
<
|
|
>
>
>
>
|
>
>
|
|
|
|
<
<
<
|
>
|
>
|
|
>
>
>
>
>
|
<
<
|
|
|
|

<
<
<
<
<
<
<
<
|







30
31
32
33
34
35
36


37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

77
78
79
80
81
82
83
84

85
86
87


88
89
90
91
92






93
94
95





96


97
98
99
100
101
102
103
104
105
106
107
108
109



110
111
112
113
114
115
116
117
118
119
120
121


122
123
124
125
126








127
128
129
130
131
132
133
134
#include "tool_helpers.h"
#include "tool_homedir.h"
#include "tool_msgs.h"
#include "tool_parsecfg.h"

#include "memdebug.h" /* keep this as LAST include */



/* only acknowledge colon or equals as separators if the option was not
   specified with an initial dash! */
#define ISSEP(x,dash) (!dash && (((x) == '=') || ((x) == ':')))

static const char *unslashquote(const char *line, char *param);
static char *my_get_line(FILE *fp);

#ifdef WIN32
static FILE *execpath(const char *filename)
{
  char filebuffer[512];
  /* Get the filename of our executable. GetModuleFileName is already declared
   * via inclusions done in setup header file.  We assume that we are using
   * the ASCII version here.
   */
  unsigned long len = GetModuleFileNameA(0, filebuffer, sizeof(filebuffer));
  if(len > 0 && len < sizeof(filebuffer)) {
    /* We got a valid filename - get the directory part */
    char *lastdirchar = strrchr(filebuffer, '\\');
    if(lastdirchar) {
      size_t remaining;
      *lastdirchar = 0;
      /* If we have enough space, build the RC filename */
      remaining = sizeof(filebuffer) - strlen(filebuffer);
      if(strlen(filename) < remaining - 1) {
        msnprintf(lastdirchar, remaining, "%s%s", DIR_CHAR, filename);
        return fopen(filebuffer, FOPEN_READTEXT);
      }
    }
  }

  return NULL;
}
#endif


/* return 0 on everything-is-fine, and non-zero otherwise */
int parseconfig(const char *filename, struct GlobalConfig *global)
{
  FILE *file = NULL;

  bool usedarg = FALSE;
  int rc = 0;
  struct OperationConfig *operation = global->first;
  char *pathalloc = NULL;

  if(!filename || !*filename) {
    /* NULL or no file name attempts to load .curlrc from the homedir! */


    char *home = homedir();    /* portable homedir finder */
#ifndef WIN32
    if(home) {


      pathalloc = curl_maprintf("%s%s.curlrc", home, DIR_CHAR);
      if(!pathalloc) {
        free(home);
        return 1; /* out of memory */
      }






      filename = pathalloc;
    }
#else /* Windows */





    if(home) {


      int i = 0;
      char prefix = '.';
      do {
        /* check for .curlrc then _curlrc in the home dir */
        pathalloc = curl_maprintf("%s%s%ccurlrc", home, DIR_CHAR, prefix);
        if(!pathalloc) {
          free(home);
          return 1; /* out of memory */
        }

        /* Check if the file exists - if not, try _curlrc */
        file = fopen(pathalloc, FOPEN_READTEXT);
        if(file) {



          filename = pathalloc;
          break;
        }
        prefix = '_';
      } while(++i < 2);
    }
    if(!filename) {
      /* check for .curlrc then _curlrc in the dir of the executable */
      file = execpath(".curlrc");
      if(!file)
        file = execpath("_curlrc");
    }


#endif

    Curl_safefree(home); /* we've used it, now free it */
  }









  if(!file && filename) { /* no need to fopen() again */
    if(strcmp(filename, "-"))
      file = fopen(filename, FOPEN_READTEXT);
    else
      file = stdin;
  }

  if(file) {
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
        if(operation->url_list && operation->url_list->url) {
          /* Allocate the next config */
          operation->next = malloc(sizeof(struct OperationConfig));
          if(operation->next) {
            /* Initialise the newly created config */
            config_init(operation->next);

            /* Copy the easy handle */
            operation->next->easy = global->easy;

            /* Set the global config pointer */
            operation->next->global = global;

            /* Update the last operation pointer */
            global->last = operation->next;

            /* Move onto the new config */







<
<
<







240
241
242
243
244
245
246



247
248
249
250
251
252
253
        if(operation->url_list && operation->url_list->url) {
          /* Allocate the next config */
          operation->next = malloc(sizeof(struct OperationConfig));
          if(operation->next) {
            /* Initialise the newly created config */
            config_init(operation->next);




            /* Set the global config pointer */
            operation->next->global = global;

            /* Update the last operation pointer */
            global->last = operation->next;

            /* Move onto the new config */
270
271
272
273
274
275
276

277
278
279
280
281
282
283
    }
    if(file != stdin)
      fclose(file);
  }
  else
    rc = 1; /* couldn't open the file */


  return rc;
}

/*
 * Copies the string from line to the buffer at param, unquoting
 * backslash-quoted characters and NUL-terminating the output string.
 * Stops at the first non-backslash-quoted double quote character or the







>







281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
    }
    if(file != stdin)
      fclose(file);
  }
  else
    rc = 1; /* couldn't open the file */

  free(pathalloc);
  return rc;
}

/*
 * Copies the string from line to the buffer at param, unquoting
 * backslash-quoted characters and NUL-terminating the output string.
 * Stops at the first non-backslash-quoted double quote character or the
Added jni/curl/src/tool_progress.c.




















































































































































































































































































































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"
#include "tool_operate.h"
#include "tool_progress.h"
#include "tool_util.h"

#define ENABLE_CURLX_PRINTF
/* use our own printf() functions */
#include "curlx.h"

/* The point of this function would be to return a string of the input data,
   but never longer than 5 columns (+ one zero byte).
   Add suffix k, M, G when suitable... */
static char *max5data(curl_off_t bytes, char *max5)
{
#define ONE_KILOBYTE  CURL_OFF_T_C(1024)
#define ONE_MEGABYTE (CURL_OFF_T_C(1024) * ONE_KILOBYTE)
#define ONE_GIGABYTE (CURL_OFF_T_C(1024) * ONE_MEGABYTE)
#define ONE_TERABYTE (CURL_OFF_T_C(1024) * ONE_GIGABYTE)
#define ONE_PETABYTE (CURL_OFF_T_C(1024) * ONE_TERABYTE)

  if(bytes < CURL_OFF_T_C(100000))
    msnprintf(max5, 6, "%5" CURL_FORMAT_CURL_OFF_T, bytes);

  else if(bytes < CURL_OFF_T_C(10000) * ONE_KILOBYTE)
    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "k", bytes/ONE_KILOBYTE);

  else if(bytes < CURL_OFF_T_C(100) * ONE_MEGABYTE)
    /* 'XX.XM' is good as long as we're less than 100 megs */
    msnprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0"
              CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE,
              (bytes%ONE_MEGABYTE) / (ONE_MEGABYTE/CURL_OFF_T_C(10)) );

#if (CURL_SIZEOF_CURL_OFF_T > 4)

  else if(bytes < CURL_OFF_T_C(10000) * ONE_MEGABYTE)
    /* 'XXXXM' is good until we're at 10000MB or above */
    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE);

  else if(bytes < CURL_OFF_T_C(100) * ONE_GIGABYTE)
    /* 10000 MB - 100 GB, we show it as XX.XG */
    msnprintf(max5, 6, "%2" CURL_FORMAT_CURL_OFF_T ".%0"
              CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE,
              (bytes%ONE_GIGABYTE) / (ONE_GIGABYTE/CURL_OFF_T_C(10)) );

  else if(bytes < CURL_OFF_T_C(10000) * ONE_GIGABYTE)
    /* up to 10000GB, display without decimal: XXXXG */
    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "G", bytes/ONE_GIGABYTE);

  else if(bytes < CURL_OFF_T_C(10000) * ONE_TERABYTE)
    /* up to 10000TB, display without decimal: XXXXT */
    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "T", bytes/ONE_TERABYTE);

  else
    /* up to 10000PB, display without decimal: XXXXP */
    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "P", bytes/ONE_PETABYTE);

    /* 16384 petabytes (16 exabytes) is the maximum a 64 bit unsigned number
       can hold, but our data type is signed so 8192PB will be the maximum. */

#else

  else
    msnprintf(max5, 6, "%4" CURL_FORMAT_CURL_OFF_T "M", bytes/ONE_MEGABYTE);

#endif

  return max5;
}

int xferinfo_cb(void *clientp,
                curl_off_t dltotal,
                curl_off_t dlnow,
                curl_off_t ultotal,
                curl_off_t ulnow)
{
  struct per_transfer *per = clientp;
  per->dltotal = dltotal;
  per->dlnow = dlnow;
  per->ultotal = ultotal;
  per->ulnow = ulnow;
  return 0;
}

/* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero
   byte) */
static void time2str(char *r, curl_off_t seconds)
{
  curl_off_t h;
  if(seconds <= 0) {
    strcpy(r, "--:--:--");
    return;
  }
  h = seconds / CURL_OFF_T_C(3600);
  if(h <= CURL_OFF_T_C(99)) {
    curl_off_t m = (seconds - (h*CURL_OFF_T_C(3600))) / CURL_OFF_T_C(60);
    curl_off_t s = (seconds - (h*CURL_OFF_T_C(3600))) - (m*CURL_OFF_T_C(60));
    msnprintf(r, 9, "%2" CURL_FORMAT_CURL_OFF_T ":%02" CURL_FORMAT_CURL_OFF_T
              ":%02" CURL_FORMAT_CURL_OFF_T, h, m, s);
  }
  else {
    /* this equals to more than 99 hours, switch to a more suitable output
       format to fit within the limits. */
    curl_off_t d = seconds / CURL_OFF_T_C(86400);
    h = (seconds - (d*CURL_OFF_T_C(86400))) / CURL_OFF_T_C(3600);
    if(d <= CURL_OFF_T_C(999))
      msnprintf(r, 9, "%3" CURL_FORMAT_CURL_OFF_T
                "d %02" CURL_FORMAT_CURL_OFF_T "h", d, h);
    else
      msnprintf(r, 9, "%7" CURL_FORMAT_CURL_OFF_T "d", d);
  }
}

static curl_off_t all_dltotal = 0;
static curl_off_t all_ultotal = 0;
static curl_off_t all_dlalready = 0;
static curl_off_t all_ulalready = 0;

curl_off_t all_xfers = 0;   /* current total */

struct speedcount {
  curl_off_t dl;
  curl_off_t ul;
  struct timeval stamp;
};
#define SPEEDCNT 10
static unsigned int speedindex;
static bool indexwrapped;
static struct speedcount speedstore[SPEEDCNT];

/*
  |DL% UL%  Dled  Uled  Xfers  Live   Qd Total     Current  Left    Speed
  |  6 --   9.9G     0     2     2     0  0:00:40  0:00:02  0:00:37 4087M
*/
bool progress_meter(struct GlobalConfig *global,
                    struct timeval *start,
                    bool final)
{
  static struct timeval stamp;
  static bool header = FALSE;
  struct timeval now;
  long diff;

  if(global->noprogress)
    return FALSE;

  now = tvnow();
  diff = tvdiff(now, stamp);

  if(!header) {
    header = TRUE;
    fputs("DL% UL%  Dled  Uled  Xfers  Live   Qd "
          "Total     Current  Left    Speed\n",
          global->errors);
  }
  if(final || (diff > 500)) {
    char time_left[10];
    char time_total[10];
    char time_spent[10];
    char buffer[3][6];
    curl_off_t spent = tvdiff(now, *start)/1000;
    char dlpercen[4]="--";
    char ulpercen[4]="--";
    struct per_transfer *per;
    curl_off_t all_dlnow = 0;
    curl_off_t all_ulnow = 0;
    bool dlknown = TRUE;
    bool ulknown = TRUE;
    curl_off_t all_running = 0; /* in progress */
    curl_off_t all_queued = 0;  /* pending */
    curl_off_t speed = 0;
    unsigned int i;
    stamp = now;

    /* first add the amounts of the already completed transfers */
    all_dlnow += all_dlalready;
    all_ulnow += all_ulalready;

    for(per = transfers; per; per = per->next) {
      all_dlnow += per->dlnow;
      all_ulnow += per->ulnow;
      if(!per->dltotal)
        dlknown = FALSE;
      else if(!per->dltotal_added) {
        /* only add this amount once */
        all_dltotal += per->dltotal;
        per->dltotal_added = TRUE;
      }
      if(!per->ultotal)
        ulknown = FALSE;
      else if(!per->ultotal_added) {
        /* only add this amount once */
        all_ultotal += per->ultotal;
        per->ultotal_added = TRUE;
      }
      if(!per->added)
        all_queued++;
      else
        all_running++;
    }
    if(dlknown && all_dltotal)
      /* TODO: handle integer overflow */
      msnprintf(dlpercen, sizeof(dlpercen), "%3d",
                all_dlnow * 100 / all_dltotal);
    if(ulknown && all_ultotal)
      /* TODO: handle integer overflow */
      msnprintf(ulpercen, sizeof(ulpercen), "%3d",
                all_ulnow * 100 / all_ultotal);

    /* get the transfer speed, the higher of the two */

    i = speedindex;
    speedstore[i].dl = all_dlnow;
    speedstore[i].ul = all_ulnow;
    speedstore[i].stamp = now;
    if(++speedindex >= SPEEDCNT) {
      indexwrapped = TRUE;
      speedindex = 0;
    }

    {
      long deltams;
      curl_off_t dl;
      curl_off_t ul;
      curl_off_t dls;
      curl_off_t uls;
      if(indexwrapped) {
        /* 'speedindex' is the oldest stored data */
        deltams = tvdiff(now, speedstore[speedindex].stamp);
        dl = all_dlnow - speedstore[speedindex].dl;
        ul = all_ulnow - speedstore[speedindex].ul;
      }
      else {
        /* since the beginning */
        deltams = tvdiff(now, *start);
        dl = all_dlnow;
        ul = all_ulnow;
      }
      dls = (curl_off_t)((double)dl / ((double)deltams/1000.0));
      uls = (curl_off_t)((double)ul / ((double)deltams/1000.0));
      speed = dls > uls ? dls : uls;
    }


    if(dlknown && speed) {
      curl_off_t est = all_dltotal / speed;
      curl_off_t left = (all_dltotal - all_dlnow) / speed;
      time2str(time_left, left);
      time2str(time_total, est);
    }
    else {
      time2str(time_left, 0);
      time2str(time_total, 0);
    }
    time2str(time_spent, spent);

    fprintf(global->errors,
            "\r"
            "%-3s " /* percent downloaded */
            "%-3s " /* percent uploaded */
            "%s " /* Dled */
            "%s " /* Uled */
            "%5" CURL_FORMAT_CURL_OFF_T " " /* Xfers */
            "%5" CURL_FORMAT_CURL_OFF_T " " /* Live */
            "%5" CURL_FORMAT_CURL_OFF_T " " /* Queued */
            "%s "  /* Total time */
            "%s "  /* Current time */
            "%s "  /* Time left */
            "%s "  /* Speed */
            "%5s" /* final newline */,

            dlpercen,  /* 3 letters */
            ulpercen,  /* 3 letters */
            max5data(all_dlnow, buffer[0]),
            max5data(all_ulnow, buffer[1]),
            all_xfers,
            all_running,
            all_queued,
            time_total,
            time_spent,
            time_left,
            max5data(speed, buffer[2]), /* speed */
            final ? "\n" :"");
    return TRUE;
  }
  return FALSE;
}

void progress_finalize(struct per_transfer *per)
{
  /* get the numbers before this transfer goes away */
  all_dlalready += per->dlnow;
  all_ulalready += per->ulnow;
}
Added jni/curl/src/tool_progress.h.














































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#ifndef HEADER_CURL_TOOL_PROGRESS_H
#define HEADER_CURL_TOOL_PROGRESS_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "tool_setup.h"

int xferinfo_cb(void *clientp,
                curl_off_t dltotal,
                curl_off_t dlnow,
                curl_off_t ultotal,
                curl_off_t ulnow);

bool progress_meter(struct GlobalConfig *global,
                    struct timeval *start,
                    bool final);
void progress_finalize(struct per_transfer *per);

extern curl_off_t all_xfers;   /* total number */

#endif /* HEADER_CURL_TOOL_PROGRESS_H */
Changes to jni/curl/src/tool_setopt.c.
78
79
80
81
82
83
84

85
86
87
88
89
90
91

const NameValue setopt_nv_CURL_HTTP_VERSION[] = {
  NV(CURL_HTTP_VERSION_NONE),
  NV(CURL_HTTP_VERSION_1_0),
  NV(CURL_HTTP_VERSION_1_1),
  NV(CURL_HTTP_VERSION_2_0),
  NV(CURL_HTTP_VERSION_2TLS),

  NVEND,
};

const NameValue setopt_nv_CURL_SSLVERSION[] = {
  NV(CURL_SSLVERSION_DEFAULT),
  NV(CURL_SSLVERSION_TLSv1),
  NV(CURL_SSLVERSION_SSLv2),







>







78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

const NameValue setopt_nv_CURL_HTTP_VERSION[] = {
  NV(CURL_HTTP_VERSION_NONE),
  NV(CURL_HTTP_VERSION_1_0),
  NV(CURL_HTTP_VERSION_1_1),
  NV(CURL_HTTP_VERSION_2_0),
  NV(CURL_HTTP_VERSION_2TLS),
  NV(CURL_HTTP_VERSION_3),
  NVEND,
};

const NameValue setopt_nv_CURL_SSLVERSION[] = {
  NV(CURL_SSLVERSION_DEFAULT),
  NV(CURL_SSLVERSION_TLSv1),
  NV(CURL_SSLVERSION_SSLv2),
818
819
820
821
822
823
824










825
826
827
828
829
830
831
  switch(tag) {
  case CURLOPT_TFTP_BLKSIZE:
  case CURLOPT_TFTP_NO_OPTIONS:
    return TRUE;
  default:
    break;
  }










#endif

#ifndef USED_TAG
  (void)tag;
#endif
  return FALSE;
}







>
>
>
>
>
>
>
>
>
>







819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
  switch(tag) {
  case CURLOPT_TFTP_BLKSIZE:
  case CURLOPT_TFTP_NO_OPTIONS:
    return TRUE;
  default:
    break;
  }
#endif
#ifdef CURL_DISABLE_NETRC
#define USED_TAG
  switch(tag) {
  case CURLOPT_NETRC:
  case CURLOPT_NETRC_FILE:
    return TRUE;
  default:
    break;
  }
#endif

#ifndef USED_TAG
  (void)tag;
#endif
  return FALSE;
}
Changes to jni/curl/src/tool_version.h.
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include <curl/curlver.h>

#define CURL_NAME "curl"
#define CURL_COPYRIGHT LIBCURL_COPYRIGHT
#define CURL_VERSION "7.65.3"
#define CURL_VERSION_MAJOR LIBCURL_VERSION_MAJOR
#define CURL_VERSION_MINOR LIBCURL_VERSION_MINOR
#define CURL_VERSION_PATCH LIBCURL_VERSION_PATCH
#define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") "

#endif /* HEADER_CURL_TOOL_VERSION_H */







|






21
22
23
24
25
26
27
28
29
30
31
32
33
34
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include <curl/curlver.h>

#define CURL_NAME "curl"
#define CURL_COPYRIGHT LIBCURL_COPYRIGHT
#define CURL_VERSION "7.66.0"
#define CURL_VERSION_MAJOR LIBCURL_VERSION_MAJOR
#define CURL_VERSION_MINOR LIBCURL_VERSION_MINOR
#define CURL_VERSION_PATCH LIBCURL_VERSION_PATCH
#define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") "

#endif /* HEADER_CURL_TOOL_VERSION_H */
Changes to jni/curl/src/tool_writeout.c.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
309
310
311
312
313
314
315



316
317
318
319
320
321
322
                    version = "1.0";
                    break;
                  case CURL_HTTP_VERSION_1_1:
                    version = "1.1";
                    break;
                  case CURL_HTTP_VERSION_2_0:
                    version = "2";



                    break;
                  }

                  fprintf(stream, version);
                }
                break;
              case VAR_SCHEME:







>
>
>







309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
                    version = "1.0";
                    break;
                  case CURL_HTTP_VERSION_1_1:
                    version = "1.1";
                    break;
                  case CURL_HTTP_VERSION_2_0:
                    version = "2";
                    break;
                  case CURL_HTTP_VERSION_3:
                    version = "3";
                    break;
                  }

                  fprintf(stream, version);
                }
                break;
              case VAR_SCHEME:
Changes to jni/curl/tests/Makefile.in.
346
347
348
349
350
351
352



353
354

355
356
357
358
359
360
361
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --gnu tests/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \







|

|







473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --foreign tests/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
Changes to jni/curl/tests/README.
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238

239
240
241
242
243
244
245
246
  system using ssh or some other remote execution method.  See the comments at
  the beginning of runtests.pl for details.

2. Numbering

 2.1 Test case numbering

     1   -  99   HTTP
     100 - 199   FTP
     200 - 299   FILE
     300 - 399   HTTPS
     400 - 499   FTPS
     500 - 599   libcurl source code tests, not using the curl command tool
     600 - 699   SCP/SFTP
     700 - 799   SOCKS4 (even numbers) and SOCK5 (odd numbers)
     800 - 849   IMAP
     850 - 899   POP3
     900 - 999   SMTP
     1000 - 1299 miscellaneous
     1300 - 1399 unit tests
     1400 - 1499 miscellaneous
     1500 - 1599 libcurl source code tests, not using the curl command tool
                 (same as 5xx)
     1600 - 1699 unit tests
     2000 - x    multiple sequential protocols per test case

  There's nothing in the system that *requires* us to keep within these number

  series.

3. Write tests

  Here's a quick description on writing test cases. We basically have three
  kinds of tests: the ones that test the curl tool, the ones that build small
  applications and test libcurl directly and the unit tests that test
  individual (possibly internal) functions.







<
<
<
<
<
<
<
|
<
<
<
<
|
<
<
<
|
<

<
>
|







212
213
214
215
216
217
218







219




220



221

222

223
224
225
226
227
228
229
230
231
  system using ssh or some other remote execution method.  See the comments at
  the beginning of runtests.pl for details.

2. Numbering

 2.1 Test case numbering








  Test cases used to be numbered by category, but the ranges filled




  up. Subsets of tests can now be selected by passing keywords to the



  runtests.pl script via the make TFLAGS variable.



  New tests should now be added by finding a free number in
  tests/data/Makefile.inc.

3. Write tests

  Here's a quick description on writing test cases. We basically have three
  kinds of tests: the ones that test the curl tool, the ones that build small
  applications and test libcurl directly and the unit tests that test
  individual (possibly internal) functions.
Changes to jni/curl/tests/certs/Makefile.in.
325
326
327
328
329
330
331



332
333

334
335
336
337
338
339
340
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
Changes to jni/curl/tests/certs/scripts/Makefile.in.
265
266
267
268
269
270
271



272
273

274
275
276
277
278
279
280
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
Changes to jni/curl/tests/data/Makefile.in.
287
288
289
290
291
292
293



294
295

296
297
298
299
300
301
302
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
test271 test272 test273 test274 test275 test276 test277 test278 test279 \
test280 test281 test282 test283 test284 test285 test286 test287 test288 \
test289 test290 test291 test292 test293 test294 test295 test296 test297 \
test298 test299 test300 test301 test302 test303 test304 test305 test306 \
test307 test308 test309 test310 test311 test312 test313 test314 test315 \
test316 test317 test318 test319 test320 test321 test322 test323 test324 \
test325 test326 test327 test328 test329 test330 test331 test332 test333 \
test334 \
test340 \
\
test350 test351 test352 test353 test354 test355 test356 \
test393 test394 test395 \
\
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
test409 \







|







395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
test271 test272 test273 test274 test275 test276 test277 test278 test279 \
test280 test281 test282 test283 test284 test285 test286 test287 test288 \
test289 test290 test291 test292 test293 test294 test295 test296 test297 \
test298 test299 test300 test301 test302 test303 test304 test305 test306 \
test307 test308 test309 test310 test311 test312 test313 test314 test315 \
test316 test317 test318 test319 test320 test321 test322 test323 test324 \
test325 test326 test327 test328 test329 test330 test331 test332 test333 \
test334 test335 \
test340 \
\
test350 test351 test352 test353 test354 test355 test356 \
test393 test394 test395 \
\
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
test409 \
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447

448
449
450
451
452
453
454
test709 test710 test711 test712 test713 test714 test715 test716 test717 \
\
test800 test801 test802 test803 test804 test805 test806 test807 test808 \
test809 test810 test811 test812 test813 test814 test815 test816 test817 \
test818 test819 test820 test821 test822 test823 test824 test825 test826 \
test827 test828 test829 test830 test831 test832 test833 test834 test835 \
test836 test837 test838 test839 test840 test841 test842 test843 test844 \
test845 test846 test847 \
\
test850 test851 test852 test853 test854 test855 test856 test857 test858 \
test859 test860 test861 test862 test863 test864 test865 test866 test867 \
test868 test869 test870 test871 test872 test873 test874 test875 test876 \
test877 test878 test879 test880 test881 test882 test883 test884 test885 \
test886 test887 test888 test889 test890 test891 \
\
test900 test901 test902 test903 test904 test905 test906 test907 test908 \
test909 test910 test911 test912 test913 test914 test915 test916 test917 \
test918 test919 test920 test921 test922 test923 test924 test925 test926 \
test927 test928 test929 test930 test931 test932 test933 test934 test935 \
test936 test937 test938 test939 test940 test941 test942 test943 test944 \
test945 test946 test947 test948 test949 test950 test951 test952 \

\
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
test1016 test1017 test1018 test1019 test1020 test1021 test1022 test1023 \
test1024 test1025 test1026 test1027 test1028 test1029 test1030 test1031 \
test1032 test1033 test1034 test1035 test1036 test1037 test1038 test1039 \
test1040 test1041 test1042 test1043 test1044 test1045 test1046 test1047 \







|





|






|
>







431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
test709 test710 test711 test712 test713 test714 test715 test716 test717 \
\
test800 test801 test802 test803 test804 test805 test806 test807 test808 \
test809 test810 test811 test812 test813 test814 test815 test816 test817 \
test818 test819 test820 test821 test822 test823 test824 test825 test826 \
test827 test828 test829 test830 test831 test832 test833 test834 test835 \
test836 test837 test838 test839 test840 test841 test842 test843 test844 \
test845 test846 test847 test848 test849 \
\
test850 test851 test852 test853 test854 test855 test856 test857 test858 \
test859 test860 test861 test862 test863 test864 test865 test866 test867 \
test868 test869 test870 test871 test872 test873 test874 test875 test876 \
test877 test878 test879 test880 test881 test882 test883 test884 test885 \
test886 test887 test888 test889 test890 test891 test892 test893 \
\
test900 test901 test902 test903 test904 test905 test906 test907 test908 \
test909 test910 test911 test912 test913 test914 test915 test916 test917 \
test918 test919 test920 test921 test922 test923 test924 test925 test926 \
test927 test928 test929 test930 test931 test932 test933 test934 test935 \
test936 test937 test938 test939 test940 test941 test942 test943 test944 \
test945 test946 test947 test948 test949 test950 test951 test952 test953 \
test954 \
\
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
test1016 test1017 test1018 test1019 test1020 test1021 test1022 test1023 \
test1024 test1025 test1026 test1027 test1028 test1029 test1030 test1031 \
test1032 test1033 test1034 test1035 test1036 test1037 test1038 test1039 \
test1040 test1041 test1042 test1043 test1044 test1045 test1046 test1047 \
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 \
test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 \
test1128 test1129 test1130 test1131 test1132 test1133 test1134 test1135 \
test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \
test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \
test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 \
test1160 test1161 test1162 test1163 test1164 test1165 \
test1170 test1171 test1172 test1173 \
\
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
test1216 test1217 test1218 test1219 \
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 \
test1268 \
\
test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
test1288 test1289 test1290 test1291 test1292 \
test1298 test1299 \
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \







|










|







468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 \
test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 \
test1128 test1129 test1130 test1131 test1132 test1133 test1134 test1135 \
test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \
test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \
test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 \
test1160 test1161 test1162 test1163 test1164 test1165 \
test1170 test1171 test1172 test1173 test1174 \
\
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
test1216 test1217 test1218 test1219 \
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 \
test1268 test1269 \
\
test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
test1288 test1289 test1290 test1291 test1292 \
test1298 test1299 \
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
\
test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
test1533 test1534 test1535 test1536 test1537 test1538 \
test1540 test1541 \
test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \
test1558 test1559 test1560 test1561 test1562 test1563 \
\
test1590 test1591 test1592 test1593 \
\
test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 \
test1608 test1609 test1620 test1621 \
\
test1650 test1651 test1652 test1653 test1654 \
\
test1700 test1701 test1702 \







|







516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
\
test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
test1533 test1534 test1535 test1536 test1537 test1538 \
test1540 test1541 \
test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \
test1558 test1559 test1560 test1561 test1562 test1563 \
\
test1590 test1591 test1592 test1593 test1594 \
\
test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 \
test1608 test1609 test1620 test1621 \
\
test1650 test1651 test1652 test1653 test1654 \
\
test1700 test1701 test1702 \
533
534
535
536
537
538
539
540

541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \
test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \
test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \
test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
test2064 test2065 test2066 test2067 test2068 test2069 \
         test2071 test2072 test2073 test2074 test2075 test2076 \

test2080 \
test2100 \
\
test3000 test3001


# TESTCASES are taken from Makefile.inc
EXTRA_DIST = $(TESTCASES) DISABLED CMakeLists.txt
all: all-am

.SUFFIXES:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Makefile.inc $(am__configure_deps)
	@for dep in $?; do \
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/data/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --gnu tests/data/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \







|
>




















|

|







538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \
test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \
test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \
test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
test2064 test2065 test2066 test2067 test2068 test2069 \
         test2071 test2072 test2073 test2074 test2075 test2076 test2077 \
test2078 \
test2080 \
test2100 \
\
test3000 test3001


# TESTCASES are taken from Makefile.inc
EXTRA_DIST = $(TESTCASES) DISABLED CMakeLists.txt
all: all-am

.SUFFIXES:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/Makefile.inc $(am__configure_deps)
	@for dep in $?; do \
	  case '$(am__configure_deps)' in \
	    *$$dep*) \
	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
	        && { if test -f $@; then exit 0; else break; fi; }; \
	      exit 1;; \
	  esac; \
	done; \
	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/data/Makefile'; \
	$(am__cd) $(top_srcdir) && \
	  $(AUTOMAKE) --foreign tests/data/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@case '$?' in \
	  *config.status*) \
	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
	  *) \
	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
Changes to jni/curl/tests/data/Makefile.inc.
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
test271 test272 test273 test274 test275 test276 test277 test278 test279 \
test280 test281 test282 test283 test284 test285 test286 test287 test288 \
test289 test290 test291 test292 test293 test294 test295 test296 test297 \
test298 test299 test300 test301 test302 test303 test304 test305 test306 \
test307 test308 test309 test310 test311 test312 test313 test314 test315 \
test316 test317 test318 test319 test320 test321 test322 test323 test324 \
test325 test326 test327 test328 test329 test330 test331 test332 test333 \
test334 \
test340 \
\
test350 test351 test352 test353 test354 test355 test356 \
test393 test394 test395 \
\
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
test409 \







|







53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
test271 test272 test273 test274 test275 test276 test277 test278 test279 \
test280 test281 test282 test283 test284 test285 test286 test287 test288 \
test289 test290 test291 test292 test293 test294 test295 test296 test297 \
test298 test299 test300 test301 test302 test303 test304 test305 test306 \
test307 test308 test309 test310 test311 test312 test313 test314 test315 \
test316 test317 test318 test319 test320 test321 test322 test323 test324 \
test325 test326 test327 test328 test329 test330 test331 test332 test333 \
test334 test335 \
test340 \
\
test350 test351 test352 test353 test354 test355 test356 \
test393 test394 test395 \
\
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
test409 \
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109

110
111
112
113
114
115
116
test709 test710 test711 test712 test713 test714 test715 test716 test717 \
\
test800 test801 test802 test803 test804 test805 test806 test807 test808 \
test809 test810 test811 test812 test813 test814 test815 test816 test817 \
test818 test819 test820 test821 test822 test823 test824 test825 test826 \
test827 test828 test829 test830 test831 test832 test833 test834 test835 \
test836 test837 test838 test839 test840 test841 test842 test843 test844 \
test845 test846 test847 \
\
test850 test851 test852 test853 test854 test855 test856 test857 test858 \
test859 test860 test861 test862 test863 test864 test865 test866 test867 \
test868 test869 test870 test871 test872 test873 test874 test875 test876 \
test877 test878 test879 test880 test881 test882 test883 test884 test885 \
test886 test887 test888 test889 test890 test891 \
\
test900 test901 test902 test903 test904 test905 test906 test907 test908 \
test909 test910 test911 test912 test913 test914 test915 test916 test917 \
test918 test919 test920 test921 test922 test923 test924 test925 test926 \
test927 test928 test929 test930 test931 test932 test933 test934 test935 \
test936 test937 test938 test939 test940 test941 test942 test943 test944 \
test945 test946 test947 test948 test949 test950 test951 test952 \

\
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
test1016 test1017 test1018 test1019 test1020 test1021 test1022 test1023 \
test1024 test1025 test1026 test1027 test1028 test1029 test1030 test1031 \
test1032 test1033 test1034 test1035 test1036 test1037 test1038 test1039 \
test1040 test1041 test1042 test1043 test1044 test1045 test1046 test1047 \







|





|






|
>







89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
test709 test710 test711 test712 test713 test714 test715 test716 test717 \
\
test800 test801 test802 test803 test804 test805 test806 test807 test808 \
test809 test810 test811 test812 test813 test814 test815 test816 test817 \
test818 test819 test820 test821 test822 test823 test824 test825 test826 \
test827 test828 test829 test830 test831 test832 test833 test834 test835 \
test836 test837 test838 test839 test840 test841 test842 test843 test844 \
test845 test846 test847 test848 test849 \
\
test850 test851 test852 test853 test854 test855 test856 test857 test858 \
test859 test860 test861 test862 test863 test864 test865 test866 test867 \
test868 test869 test870 test871 test872 test873 test874 test875 test876 \
test877 test878 test879 test880 test881 test882 test883 test884 test885 \
test886 test887 test888 test889 test890 test891 test892 test893 \
\
test900 test901 test902 test903 test904 test905 test906 test907 test908 \
test909 test910 test911 test912 test913 test914 test915 test916 test917 \
test918 test919 test920 test921 test922 test923 test924 test925 test926 \
test927 test928 test929 test930 test931 test932 test933 test934 test935 \
test936 test937 test938 test939 test940 test941 test942 test943 test944 \
test945 test946 test947 test948 test949 test950 test951 test952 test953 \
test954 \
\
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
test1016 test1017 test1018 test1019 test1020 test1021 test1022 test1023 \
test1024 test1025 test1026 test1027 test1028 test1029 test1030 test1031 \
test1032 test1033 test1034 test1035 test1036 test1037 test1038 test1039 \
test1040 test1041 test1042 test1043 test1044 test1045 test1046 test1047 \
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 \
test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 \
test1128 test1129 test1130 test1131 test1132 test1133 test1134 test1135 \
test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \
test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \
test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 \
test1160 test1161 test1162 test1163 test1164 test1165 \
test1170 test1171 test1172 test1173 \
\
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
test1216 test1217 test1218 test1219 \
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 \
test1268 \
\
test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
test1288 test1289 test1290 test1291 test1292 \
test1298 test1299 \
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \







|










|







126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
test1112 test1113 test1114 test1115 test1116 test1117 test1118 test1119 \
test1120 test1121 test1122 test1123 test1124 test1125 test1126 test1127 \
test1128 test1129 test1130 test1131 test1132 test1133 test1134 test1135 \
test1136 test1137 test1138 test1139 test1140 test1141 test1142 test1143 \
test1144 test1145 test1146 test1147 test1148 test1149 test1150 test1151 \
test1152 test1153 test1154 test1155 test1156 test1157 test1158 test1159 \
test1160 test1161 test1162 test1163 test1164 test1165 \
test1170 test1171 test1172 test1173 test1174 \
\
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 test1212 test1213 test1214 test1215 \
test1216 test1217 test1218 test1219 \
test1220 test1221 test1222 test1223 test1224 test1225 test1226 test1227 \
test1228 test1229 test1230 test1231 test1232 test1233 test1234 test1235 \
test1236 test1237 test1238 test1239 test1240 test1241 test1242 test1243 \
test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \
test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \
test1260 test1261 test1262 test1263 test1264 test1265 test1266 test1267 \
test1268 test1269 \
\
test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \
test1288 test1289 test1290 test1291 test1292 \
test1298 test1299 \
test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \
test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \
test1316 test1317 test1318 test1319 test1320 test1321 test1322 test1323 \
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
\
test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
test1533 test1534 test1535 test1536 test1537 test1538 \
test1540 test1541 \
test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \
test1558 test1559 test1560 test1561 test1562 test1563 \
\
test1590 test1591 test1592 test1593 \
\
test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 \
test1608 test1609 test1620 test1621 \
\
test1650 test1651 test1652 test1653 test1654 \
\
test1700 test1701 test1702 \







|







174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
\
test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
test1533 test1534 test1535 test1536 test1537 test1538 \
test1540 test1541 \
test1550 test1551 test1552 test1553 test1554 test1555 test1556 test1557 \
test1558 test1559 test1560 test1561 test1562 test1563 \
\
test1590 test1591 test1592 test1593 test1594 \
\
test1600 test1601 test1602 test1603 test1604 test1605 test1606 test1607 \
test1608 test1609 test1620 test1621 \
\
test1650 test1651 test1652 test1653 test1654 \
\
test1700 test1701 test1702 \
195
196
197
198
199
200
201
202

203
204
205
206
test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \
test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \
test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \
test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
test2064 test2065 test2066 test2067 test2068 test2069 \
         test2071 test2072 test2073 test2074 test2075 test2076 \

test2080 \
test2100 \
\
test3000 test3001







|
>




196
197
198
199
200
201
202
203
204
205
206
207
208
test2016 test2017 test2018 test2019 test2020 test2021 test2022 test2023 \
test2024 test2025 test2026 test2027 test2028 test2029 test2030 test2031 \
test2032 test2033 test2034 test2035 test2036 test2037 test2038 test2039 \
test2040 test2041 test2042 test2043 test2044 test2045 test2046 test2047 \
test2048 test2049 test2050 test2051 test2052 test2053 test2054 test2055 \
test2056 test2057 test2058 test2059 test2060 test2061 test2062 test2063 \
test2064 test2065 test2066 test2067 test2068 test2069 \
         test2071 test2072 test2073 test2074 test2075 test2076 test2077 \
test2078 \
test2080 \
test2100 \
\
test3000 test3001
Changes to jni/curl/tests/data/test1002.
97
98
99
100
101
102
103








104
105
106
107
108
109
110
Content-Range: bytes 2-4/5
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
Expect: 100-continue

st








GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1002.upload2", response="d711f0d2042786d930de635ba0d1a1d0"
Content-Range: bytes 2-4/5
User-Agent: curl/7.16.1
Accept: */*
Proxy-Connection: Keep-Alive







>
>
>
>
>
>
>
>







97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
Content-Range: bytes 2-4/5
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 3
Expect: 100-continue

st
GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Content-Range: bytes 2-4/5
User-Agent: curl/7.16.1
Accept: */*
Proxy-Connection: Keep-Alive
Content-Length: 0

GET http://%HOSTIP:%HTTPPORT/1002.upload2 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="auser", realm="testrealm", nonce="1053604144", uri="/1002.upload2", response="d711f0d2042786d930de635ba0d1a1d0"
Content-Range: bytes 2-4/5
User-Agent: curl/7.16.1
Accept: */*
Proxy-Connection: Keep-Alive
Changes to jni/curl/tests/data/test1135.
87
88
89
90
91
92
93

94
95
96
97
98
99
100
CURL_EXTERN char *curl_maprintf(const char *format, ...);
CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);
CURL_EXTERN CURLM *curl_multi_init(void);
CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,

CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s,
CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle,







>







87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
CURL_EXTERN char *curl_maprintf(const char *format, ...);
CURL_EXTERN char *curl_mvaprintf(const char *format, va_list args);
CURL_EXTERN CURLM *curl_multi_init(void);
CURL_EXTERN CURLMcode curl_multi_add_handle(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_fdset(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_wait(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_poll(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_perform(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_cleanup(CURLM *multi_handle);
CURL_EXTERN CURLMsg *curl_multi_info_read(CURLM *multi_handle,
CURL_EXTERN const char *curl_multi_strerror(CURLMcode);
CURL_EXTERN CURLMcode curl_multi_socket(CURLM *multi_handle, curl_socket_t s,
CURL_EXTERN CURLMcode curl_multi_socket_action(CURLM *multi_handle,
CURL_EXTERN CURLMcode curl_multi_socket_all(CURLM *multi_handle,
Added jni/curl/tests/data/test1174.




































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<testcase>
<info>
<keywords>
HTTP
HTTP/0.9
</keywords>
</info>

#
# Server-side
<reply>
<data>
-foo- swsclose
</data>
<datacheck>
</datacheck>
</reply>

#
# Client-side
<client>
<server>
http
</server>
 <name>
HTTP/0.9 GET response denied by default
 </name>
 <command>
http://%HOSTIP:%HTTPPORT/1174
</command>
</client>

#
# Verify data after the test has been "shot"
<verify>
<strip>
^User-Agent:.*
</strip>
<protocol>
GET /1174 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*

</protocol>
# unsupported protocol
<errorcode>
1
</errorcode>
</verify>
</testcase>
Added jni/curl/tests/data/test1269.




































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<testcase>
<info>
<keywords>
--retry-delay
</keywords>
</info>

#
# Server-side
<reply>
</reply>

#
# Client-side
<client>
<server>
none
</server>
 <name>
too large --retry-delay value
 </name>
 <command>
--retry 3 --retry-delay 9223372036854776 http://%HOSTIP:%HTTPPORT/1269
</command>
</client>

#
# Verify data after the test has been "shot"
<verify>
<errorcode>
2
</errorcode>
</verify>
</testcase>
Changes to jni/curl/tests/data/test1291.
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

# Client-side
<client>
<server>
none
</server>
<name>
Attempt to upload 100K files but fail immediately
</name>
<command>
-K log/cmd1291 --fail-early
</command>
<file name="log/upload-this">
XXXXXXXx
</file>
# generate the config file
<precheck>
perl -e 'for(1 .. 100000) { printf("upload-file=log/upload-this\nurl=htttttp://non-existing-host.haxx.se/upload/1291\n", $_);}' > log/cmd1291;
</precheck>
</client>

# Verify data after the test has been "shot"
<verify>
<errorcode>
1
</errorcode>

# we disable valgrind here since it takes 40+ seconds even on a fairly snappy
# machine
<valgrind>
disable
</valgrind>
</verify>
</testcase>







|









|








<
<
<
<
<
<


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42






43
44

# Client-side
<client>
<server>
none
</server>
<name>
Attempt to upload 1000 files but fail immediately
</name>
<command>
-K log/cmd1291 --fail-early
</command>
<file name="log/upload-this">
XXXXXXXx
</file>
# generate the config file
<precheck>
perl -e 'for(1 .. 1000) { printf("upload-file=log/upload-this\nurl=htttttp://non-existing-host.haxx.se/upload/1291\n", $_);}' > log/cmd1291;
</precheck>
</client>

# Verify data after the test has been "shot"
<verify>
<errorcode>
1
</errorcode>






</verify>
</testcase>
Changes to jni/curl/tests/data/test1401.
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1401");
  curl_easy_setopt(hnd, CURLOPT_USERPWD, "fake:user");
  curl_easy_setopt(hnd, CURLOPT_HTTPAUTH, (long)CURLAUTH_BASIC);
  curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, slist1);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "MyUA");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
  curl_easy_setopt(hnd, CURLOPT_COOKIE, "chocolate=chip");
  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
  curl_easy_setopt(hnd, CURLOPT_PROTOCOLS, (long)CURLPROTO_FILE |
                                           (long)CURLPROTO_FTP |
                                           (long)CURLPROTO_HTTP);








<







84
85
86
87
88
89
90

91
92
93
94
95
96
97
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1401");
  curl_easy_setopt(hnd, CURLOPT_USERPWD, "fake:user");
  curl_easy_setopt(hnd, CURLOPT_HTTPAUTH, (long)CURLAUTH_BASIC);
  curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, slist1);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "MyUA");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);

  curl_easy_setopt(hnd, CURLOPT_COOKIE, "chocolate=chip");
  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
  curl_easy_setopt(hnd, CURLOPT_PROTOCOLS, (long)CURLPROTO_FILE |
                                           (long)CURLPROTO_FTP |
                                           (long)CURLPROTO_HTTP);

Changes to jni/curl/tests/data/test1402.
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1402");
  curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, "foo=bar&baz=quux");
  curl_easy_setopt(hnd, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)16);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.








<







76
77
78
79
80
81
82

83
84
85
86
87
88
89
  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1402");
  curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, "foo=bar&baz=quux");
  curl_easy_setopt(hnd, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)16);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);

  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.

Changes to jni/curl/tests/data/test1403.
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  CURL *hnd;

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1403?foo=bar&baz=quux");
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.








<







71
72
73
74
75
76
77

78
79
80
81
82
83
84
  CURL *hnd;

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1403?foo=bar&baz=quux");
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);

  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.

Changes to jni/curl/tests/data/test1404.
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  slist1 = NULL;
  curl_mime_subparts(part1, mime2);
  mime2 = NULL;
  curl_mime_name(part1, "file");
  curl_easy_setopt(hnd, CURLOPT_MIMEPOST, mime1);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.








<







142
143
144
145
146
147
148

149
150
151
152
153
154
155
  slist1 = NULL;
  curl_mime_subparts(part1, mime2);
  mime2 = NULL;
  curl_mime_name(part1, "file");
  curl_easy_setopt(hnd, CURLOPT_MIMEPOST, mime1);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);

  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.

Changes to jni/curl/tests/data/test1406.
72
73
74
75
76
77
78
79
80
81
82
83
84
85

86
87
88
89
90
91
92

  slist1 = NULL;
  slist1 = curl_slist_append(slist1, "recipient.one@example.com");
  slist1 = curl_slist_append(slist1, "recipient.two@example.com");

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, (curl_off_t)38);
  curl_easy_setopt(hnd, CURLOPT_URL, "smtp://%HOSTIP:%SMTPPORT/1406");
  curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
  curl_easy_setopt(hnd, CURLOPT_MAIL_FROM, "sender@example.com");
  curl_easy_setopt(hnd, CURLOPT_MAIL_RCPT, slist1);


  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.

  CURLOPT_WRITEDATA set to a objectpointer
  CURLOPT_WRITEFUNCTION set to a functionpointer







<






>







72
73
74
75
76
77
78

79
80
81
82
83
84
85
86
87
88
89
90
91
92

  slist1 = NULL;
  slist1 = curl_slist_append(slist1, "recipient.one@example.com");
  slist1 = curl_slist_append(slist1, "recipient.two@example.com");

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);

  curl_easy_setopt(hnd, CURLOPT_URL, "smtp://%HOSTIP:%SMTPPORT/1406");
  curl_easy_setopt(hnd, CURLOPT_UPLOAD, 1L);
  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
  curl_easy_setopt(hnd, CURLOPT_MAIL_FROM, "sender@example.com");
  curl_easy_setopt(hnd, CURLOPT_MAIL_RCPT, slist1);
  curl_easy_setopt(hnd, CURLOPT_INFILESIZE_LARGE, (curl_off_t)38);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.

  CURLOPT_WRITEDATA set to a objectpointer
  CURLOPT_WRITEFUNCTION set to a functionpointer
Changes to jni/curl/tests/data/test1412.
20
21
22
23
24
25
26













27
28
29
30
31
32
33
WWW-Authenticate: Basic realm="gimme all yer s3cr3ts"
WWW-Authenticate: Digest realm="gimme all yer s3cr3ts", nonce="11223344"
Content-Type: text/html; charset=iso-8859-1
Connection: close

This is not the real page
</data>














# This is supposed to be returned when the server gets a
# Authorization: Digest line passed-in from the client
<data1000>
HTTP/1.1 200 OK swsclose
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
Content-Type: text/html; charset=iso-8859-1







>
>
>
>
>
>
>
>
>
>
>
>
>







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
WWW-Authenticate: Basic realm="gimme all yer s3cr3ts"
WWW-Authenticate: Digest realm="gimme all yer s3cr3ts", nonce="11223344"
Content-Type: text/html; charset=iso-8859-1
Connection: close

This is not the real page
</data>

# The second URL will get this response
<data1>
HTTP/1.1 401 Authorization Required swsclose
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
WWW-Authenticate: Blackmagic realm="gimme all yer s3cr3ts"
WWW-Authenticate: Basic realm="gimme all yer s3cr3ts"
WWW-Authenticate: Digest realm="gimme all yer s3cr3ts", nonce="11223344"
Content-Type: text/html; charset=iso-8859-1
Connection: close

This is not the real page
</data1>

# This is supposed to be returned when the server gets a
# Authorization: Digest line passed-in from the client
<data1000>
HTTP/1.1 200 OK swsclose
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
Content-Type: text/html; charset=iso-8859-1
102
103
104
105
106
107
108





109
110
111
112
113
114
115
116
117
118
Accept: */*

GET /1412 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/1412", response="0390dbe89e31adca0413d11f91f30e7f"
User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Accept: */*






GET /14120001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/14120001", response="0085df91870374c8bf4e94415e7fbf8e"
User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Accept: */*

</protocol>
</verify>
</testcase>







>
>
>
>
>










115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
Accept: */*

GET /1412 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/1412", response="0390dbe89e31adca0413d11f91f30e7f"
User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Accept: */*

GET /14120001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Accept: */*

GET /14120001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="gimme all yer s3cr3ts", nonce="11223344", uri="/14120001", response="0085df91870374c8bf4e94415e7fbf8e"
User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Accept: */*

</protocol>
</verify>
</testcase>
Changes to jni/curl/tests/data/test1418.
18
19
20
21
22
23
24









25
26
27
28
29
30
31
Content-Length: 20
WWW-Authenticate: Digest realm="loonie", nonce="314156592"
WWW-Authenticate: Basic

Please auth with me
</data>










# This is supposed to be returned when the server gets the second
# Authorization: NTLM line passed-in from the client
<data1000>
HTTP/1.1 200 Things are fine in server land
Server: Microsoft-IIS/5.0
Content-Length: 4








>
>
>
>
>
>
>
>
>







18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Content-Length: 20
WWW-Authenticate: Digest realm="loonie", nonce="314156592"
WWW-Authenticate: Basic

Please auth with me
</data>

<data3>
HTTP/1.1 401 Authentication please!
Content-Length: 20
WWW-Authenticate: Digest realm="loonie", nonce="314156592"
WWW-Authenticate: Basic

Please auth with me
</data3>

# This is supposed to be returned when the server gets the second
# Authorization: NTLM line passed-in from the client
<data1000>
HTTP/1.1 200 Things are fine in server land
Server: Microsoft-IIS/5.0
Content-Length: 4

92
93
94
95
96
97
98




99
100
101
102
103
104
105
106
107
108
Host: %HOSTIP:%HTTPPORT
Accept: */*

GET /1418 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/1418", response="986238b7e0077754944c966f56d9bc77"
Accept: */*





GET /14180003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/14180003", response="1c6390a67bac3283a9b023402f3b3540"
Accept: */*

[DISCONNECT]
</protocol>
</verify>
</testcase>







>
>
>
>










101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
Host: %HOSTIP:%HTTPPORT
Accept: */*

GET /1418 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/1418", response="986238b7e0077754944c966f56d9bc77"
Accept: */*

GET /14180003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*

GET /14180003 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="loonie", nonce="314156592", uri="/14180003", response="1c6390a67bac3283a9b023402f3b3540"
Accept: */*

[DISCONNECT]
</protocol>
</verify>
</testcase>
Changes to jni/curl/tests/data/test1420.
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  CURLcode ret;
  CURL *hnd;

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "imap://%HOSTIP:%IMAPPORT/1420/;MAILINDEX=1");
  curl_easy_setopt(hnd, CURLOPT_USERPWD, "user:secret");
  curl_easy_setopt(hnd, CURLOPT_HTTP09_ALLOWED, 1L);
  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.








<







62
63
64
65
66
67
68

69
70
71
72
73
74
75
  CURLcode ret;
  CURL *hnd;

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "imap://%HOSTIP:%IMAPPORT/1420/;MAILINDEX=1");
  curl_easy_setopt(hnd, CURLOPT_USERPWD, "user:secret");

  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.

Changes to jni/curl/tests/data/test1514.
1
2
3
4
5
6

7
8
9
10
11
12
13
14
15
16
17
18
19
20
<testcase>
<info>
<keywords>
HTTP
HTTP POST
Content-Length

</keywords>
</info>

# Server-side
<reply>
<data nocheck="yes">
HTTP/1.1 411 Length Required
Date: Sun, 19 Jan 2014 18:50:58 GMT
Server: test-server/fake swsclose
Connection: close
</data>
</reply>

# Client-side






>






|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<testcase>
<info>
<keywords>
HTTP
HTTP POST
Content-Length
chunked Transfer-Encoding
</keywords>
</info>

# Server-side
<reply>
<data nocheck="yes">
HTTP/1.1 200 OK
Date: Sun, 19 Jan 2014 18:50:58 GMT
Server: test-server/fake swsclose
Connection: close
</data>
</reply>

# Client-side
32
33
34
35
36
37
38

39
40
41
42

43
44












45
46
47
48
http://%HOSTIP:%HTTPPORT/1514
</command>
</client>

# Verify data after the test has been "shot"
<verify>
# Content-Length header is not present

<protocol>
POST /1514 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*

Content-Type: application/x-www-form-urlencoded
Expect: 100-continue













</protocol>
</verify>
</testcase>







>




>


>
>
>
>
>
>
>
>
>
>
>
>




33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
http://%HOSTIP:%HTTPPORT/1514
</command>
</client>

# Verify data after the test has been "shot"
<verify>
# Content-Length header is not present
# Transfer-Encoding header is added automatically
<protocol>
POST /1514 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
Transfer-Encoding: chunked
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue

1
d
1
u
1
m
1
m
1
y
0

</protocol>
</verify>
</testcase>
Changes to jni/curl/tests/data/test153.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21











22
23
24
25
26
27
28
<testcase>
<info>
<keywords>
HTTP
HTTP GET
HTTP Digest auth
</keywords>
</info>

# Server-side
<reply>
# reply back and ask for Digest auth
<data1>
HTTP/1.1 401 Authorization Required swsclose
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
WWW-Authenticate: Digest realm="testrealm", nonce="1053604145"
Content-Type: text/html; charset=iso-8859-1
Content-Length: 26

This is not the real page
</data1>












# This is supposed to be returned when the server gets a
# Authorization: Digest line passed-in from the client
<data1001>
HTTP/1.1 200 OK
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
Content-Type: text/html; charset=iso-8859-1











|









>
>
>
>
>
>
>
>
>
>
>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<testcase>
<info>
<keywords>
HTTP
HTTP GET
HTTP Digest auth
</keywords>
</info>

# Server-side
<reply>
# First reply back and ask for Digest auth
<data1>
HTTP/1.1 401 Authorization Required swsclose
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
WWW-Authenticate: Digest realm="testrealm", nonce="1053604145"
Content-Type: text/html; charset=iso-8859-1
Content-Length: 26

This is not the real page
</data1>

# second reply back
<data2>
HTTP/1.1 401 Authorization Required swsclose
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
WWW-Authenticate: Digest realm="testrealm", nonce="1053604145"
Content-Type: text/html; charset=iso-8859-1
Content-Length: 26

This is not the real page
</data2>

# This is supposed to be returned when the server gets a
# Authorization: Digest line passed-in from the client
<data1001>
HTTP/1.1 200 OK
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
Content-Type: text/html; charset=iso-8859-1
86
87
88
89
90
91
92





93
94
95
96
97
98
99
Accept: */*

GET /1530001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1530001", response="f4f83139396995bac665f24a1f1055c7"
User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Accept: */*






GET /1530002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1530002", response="f84511b014fdd0ba6494f42871079c32"
User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
Accept: */*








>
>
>
>
>







97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
Accept: */*

GET /1530001 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1530001", response="f4f83139396995bac665f24a1f1055c7"
User-Agent: curl/7.10.5 (i686-pc-linux-gnu) libcurl/7.10.5 OpenSSL/0.9.7a ipv6 zlib/1.1.3
Accept: */*

GET /1530002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
Accept: */*

GET /1530002 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Authorization: Digest username="testuser", realm="testrealm", nonce="1053604145", uri="/1530002", response="f84511b014fdd0ba6494f42871079c32"
User-Agent: curl/7.11.0-CVS (i686-pc-linux-gnu) libcurl/7.11.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS
Accept: */*

113
114
115
116
117
118
119






120
121
122
123
124
125
126

HTTP/1.1 200 OK
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
Content-Type: text/html; charset=iso-8859-1
Content-Length: 23

This IS the real page!






HTTP/1.1 401 Authorization re-negotiation please swsbounce
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
WWW-Authenticate: Digest realm="testrealm", algorithm=MD5, nonce="999999", stale=true, qop="auth"
Content-Type: text/html; charset=iso-8859-1
Content-Length: 26

HTTP/1.1 200 OK







>
>
>
>
>
>







129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148

HTTP/1.1 200 OK
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
Content-Type: text/html; charset=iso-8859-1
Content-Length: 23

This IS the real page!
HTTP/1.1 401 Authorization Required swsclose
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
WWW-Authenticate: Digest realm="testrealm", nonce="1053604145"
Content-Type: text/html; charset=iso-8859-1
Content-Length: 26

HTTP/1.1 401 Authorization re-negotiation please swsbounce
Server: Apache/1.3.27 (Darwin) PHP/4.1.2
WWW-Authenticate: Digest realm="testrealm", algorithm=MD5, nonce="999999", stale=true, qop="auth"
Content-Type: text/html; charset=iso-8859-1
Content-Length: 26

HTTP/1.1 200 OK
Changes to jni/curl/tests/data/test1538.
122
123
124
125
126
127
128

129
130
131
132
133
134
135
136
e87: Unable to parse FTP file list
e88: Chunk callback failed
e89: The max connection limit is reached
e90: SSL public key does not match pinned public key
e91: SSL server certificate status verification FAILED
e92: Stream error in the HTTP/2 framing layer
e93: API function called from within callback

e94: Unknown error
m-1: Please call curl_multi_perform() soon
m0: No error
m1: Invalid multi handle
m2: Invalid easy handle
m3: Out of memory
m4: Internal error
m5: Invalid socket argument







>
|







122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
e87: Unable to parse FTP file list
e88: Chunk callback failed
e89: The max connection limit is reached
e90: SSL public key does not match pinned public key
e91: SSL server certificate status verification FAILED
e92: Stream error in the HTTP/2 framing layer
e93: API function called from within callback
e94: An authentication function returned an error
e95: Unknown error
m-1: Please call curl_multi_perform() soon
m0: No error
m1: Invalid multi handle
m2: Invalid easy handle
m3: Out of memory
m4: Internal error
m5: Invalid socket argument
Added jni/curl/tests/data/test1594.








































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<testcase>
<info>
<keywords>
HTTP
HTTP GET
HTTP replaced headers
CURLOPT_TIMECONDITION
If-Modified-Since
</keywords>
</info>

# Server-side
<reply>
<data nocheck="yes">
HTTP/1.1 503 Error
Date: Thu, 11 Jul 2019 02:26:59 GMT
Server: test-server/swsclose
Retry-After: 22

</data>
</reply>
# Client-side
<client>
<server>
http
</server>
<name>
HTTP Retry-After header parsing and extraction
</name>
<tool>
lib1594
</tool>
<command>
http://%HOSTIP:%HTTPPORT/1594
</command>
</client>

<verify>
<strip>
^User-Agent:.*
</strip>
<protocol>
GET /1594 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*

</protocol>
<stdout>
Retry-After: 22
</stdout>
</verify>
</testcase>
Changes to jni/curl/tests/data/test1654.
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
</command>
<tool>
unit1654
</tool>
<file name="log/1654" mode="text">
h2 example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
# a comment
h2c example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 1
  h1 example.com 443 h3 shiny.example.com 8443 "20121231 00:00:01" 0 1
	h3 example.com 443 h3 shiny.example.com 8443 "20131231 00:00:00" 0 1
    # also a comment
bad example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
rubbish
</file>
</client>
<verify>
<file name="log/1654-out" mode="text">
# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html
# This file was generated by libcurl! Edit at your own risk.
h2 example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
h2c example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 1
h1 example.com 443 h3 shiny.example.com 8443 "20121231 00:00:01" 0 1
h3 example.com 443 h3 shiny.example.com 8443 "20131231 00:00:00" 0 1
h1 example.org 8080 h2 example.com 8080 "20190125 22:34:21" 0 0
h1 2.example.org 8080 h3 2.example.org 8080 "20190125 22:34:21" 0 0
h1 3.example.org 8080 h2 example.com 8080 "20190125 22:34:21" 0 0
h1 3.example.org 8080 h3 yesyes.com 8080 "20190125 22:34:21" 0 0
h2c example.org 80 h2 example.com 443 "20190124 22:36:21" 0 0
</file>
</verify>
</testcase>







|












|






|



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
</command>
<tool>
unit1654
</tool>
<file name="log/1654" mode="text">
h2 example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
# a comment
h2 foo.example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 1
  h1 example.com 443 h3 shiny.example.com 8443 "20121231 00:00:01" 0 1
	h3 example.com 443 h3 shiny.example.com 8443 "20131231 00:00:00" 0 1
    # also a comment
bad example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
rubbish
</file>
</client>
<verify>
<file name="log/1654-out" mode="text">
# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html
# This file was generated by libcurl! Edit at your own risk.
h2 example.com 443 h3 shiny.example.com 8443 "20191231 00:00:00" 0 1
h2 foo.example.com 443 h3 shiny.example.com 8443 "20291231 23:30:00" 0 1
h1 example.com 443 h3 shiny.example.com 8443 "20121231 00:00:01" 0 1
h3 example.com 443 h3 shiny.example.com 8443 "20131231 00:00:00" 0 1
h1 example.org 8080 h2 example.com 8080 "20190125 22:34:21" 0 0
h1 2.example.org 8080 h3 2.example.org 8080 "20190125 22:34:21" 0 0
h1 3.example.org 8080 h2 example.com 8080 "20190125 22:34:21" 0 0
h1 3.example.org 8080 h3 yesyes.com 8080 "20190125 22:34:21" 0 0
h2 example.org 80 h2 example.com 443 "20190124 22:36:21" 0 0
</file>
</verify>
</testcase>
Changes to jni/curl/tests/data/test2006.
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Accept: */*

</protocol>
<file1 name="log/download2006">
Some data delivered from an HTTP resource
</file1>
<file2 name="log/heads2006">
Content-Length: 496
Accept-ranges: bytes


HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 14:49:01 GMT
Server: test-server/fake
Content-Length: 42
Connection: close
Content-Type: text/html
Content-Disposition: filename=name2006; charset=funny; option=strange







<
<
<
<







82
83
84
85
86
87
88




89
90
91
92
93
94
95
Accept: */*

</protocol>
<file1 name="log/download2006">
Some data delivered from an HTTP resource
</file1>
<file2 name="log/heads2006">




HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 14:49:01 GMT
Server: test-server/fake
Content-Length: 42
Connection: close
Content-Type: text/html
Content-Disposition: filename=name2006; charset=funny; option=strange
Changes to jni/curl/tests/data/test2007.
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<file1 name="log/download2007">
Something delivered from an HTTP resource
</file1>
<stripfile2>
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2007">
Content-Length: 496
Accept-ranges: bytes


HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 14:50:02 GMT
Server: test-server/fake
Content-Length: 42
Connection: close
Content-Type: text/html
Content-Disposition: filename=name2007; charset=funny; option=strange







<
<
<
<







86
87
88
89
90
91
92




93
94
95
96
97
98
99
<file1 name="log/download2007">
Something delivered from an HTTP resource
</file1>
<stripfile2>
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2007">




HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 14:50:02 GMT
Server: test-server/fake
Content-Length: 42
Connection: close
Content-Type: text/html
Content-Disposition: filename=name2007; charset=funny; option=strange
Changes to jni/curl/tests/data/test2008.
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<file1 name="log/download2008">
Some stuff delivered from an HTTP resource
</file1>
<stripfile2>
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2008">
Content-Length: 496
Accept-ranges: bytes


HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 15:23:48 GMT
Server: test-server/fake
Content-Length: 43
Connection: close
Content-Type: text/html
Content-Disposition: filename=name2008; charset=funny; option=strange







<
<
<
<







78
79
80
81
82
83
84




85
86
87
88
89
90
91
<file1 name="log/download2008">
Some stuff delivered from an HTTP resource
</file1>
<stripfile2>
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2008">




HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 15:23:48 GMT
Server: test-server/fake
Content-Length: 43
Connection: close
Content-Type: text/html
Content-Disposition: filename=name2008; charset=funny; option=strange
Changes to jni/curl/tests/data/test2009.
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<file1 name="log/download2009">
Some contents delivered from an HTTP resource
</file1>
<stripfile2>
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2009">
Content-Length: 496
Accept-ranges: bytes


HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 16:27:17 GMT
Server: test-server/fake
Content-Length: 46
Connection: close
Content-Type: text/html
Content-Disposition: filename=name2009; charset=funny; option=strange







<
<
<
<







79
80
81
82
83
84
85




86
87
88
89
90
91
92
<file1 name="log/download2009">
Some contents delivered from an HTTP resource
</file1>
<stripfile2>
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2009">




HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 16:27:17 GMT
Server: test-server/fake
Content-Length: 46
Connection: close
Content-Type: text/html
Content-Disposition: filename=name2009; charset=funny; option=strange
Changes to jni/curl/tests/data/test2010.
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<file1 name="log/download2010">
Contents delivered from an HTTP resource
</file1>
<stripfile2>
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2010">
Content-Length: 496
Accept-ranges: bytes


HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 17:37:27 GMT
Server: test-server/fake
Content-Length: 41
Connection: close
Content-Type: text/html
Content-Disposition: filename=name2010; charset=funny; option=strange







<
<
<
<







78
79
80
81
82
83
84




85
86
87
88
89
90
91
<file1 name="log/download2010">
Contents delivered from an HTTP resource
</file1>
<stripfile2>
s/Last-Modified:.*//
</stripfile2>
<file2 name="log/heads2010">




HTTP/1.1 200 OK
Date: Thu, 21 Jun 2012 17:37:27 GMT
Server: test-server/fake
Content-Length: 41
Connection: close
Content-Type: text/html
Content-Disposition: filename=name2010; charset=funny; option=strange
Changes to jni/curl/tests/data/test2047.
88
89
90
91
92
93
94
95
96
97
98
99
100
101
Content-Length: 3
Content-Type: text/plain; charset=us-ascii

OK
1
1
3
http://xn--4cab6c.se/20470001
text/plain; charset=us-ascii
200
</stdout>

</verify>
</testcase>







|






88
89
90
91
92
93
94
95
96
97
98
99
100
101
Content-Length: 3
Content-Type: text/plain; charset=us-ascii

OK
1
1
3
http://åäö.se/20470001
text/plain; charset=us-ascii
200
</stdout>

</verify>
</testcase>
Added jni/curl/tests/data/test2077.




















































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<testcase>
<info>
<keywords>
HTTP
HTTP GET
GSS-API
</keywords>
</info>

# Server-side
<reply>
<data>
HTTP/1.1 200 OK swsclose
Content-Length: 23

This IS the real page!
</data>
</reply>

# Client-side
<client>
<server>
http
</server>
<features>
GSS-API
</features>
<name>
curl --fail --negotiate to unauthenticated service fails
</name>
<command>
http://%HOSTIP:%HTTPPORT/2077 -u : --fail --negotiate
</command>
</client>

# Verify data after the test has been "shot"
<verify>
<errorcode>
0
</errorcode>
</verify>
</testcase>
Added jni/curl/tests/data/test2078.












































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<testcase>
<info>
<keywords>
HTTP
HTTP GET
GSS-API
</keywords>
</info>

# Server-side
<reply>
<data>
HTTP/1.1 200 OK swsclose
Content-Length: 23

This IS the real page!
</data>
</reply>

# Client-side
<client>
<server>
http
</server>
<features>
GSS-API
</features>
<name>
curl --negotiate should not send empty POST request only
</name>
<command>
http://%HOSTIP:%HTTPPORT/2078 -u : --negotiate --data name=value
</command>
</client>

# Verify data after the test has been "shot"
<verify>
<errorcode>
0
</errorcode>
<strip>
^User-Agent:.*
</strip>
<protocol nonewline="yes">
POST /2078 HTTP/1.1
Host: 127.0.0.1:8990
Accept: */*
Content-Length: 10
Content-Type: application/x-www-form-urlencoded

name=value
</protocol>
</verify>
</testcase>
Added jni/curl/tests/data/test335.












































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# Mostly a duplicate of test168
<testcase>
<info>
<keywords>
HTTP
HTTP GET
HTTP proxy
HTTP proxy Digest auth
HTTP Digest auth
HTTP auth in URL
</keywords>
</info>

# Server-side
<reply>

# this is returned first since we get no proxy-auth
<data>
HTTP/1.1 407 Authorization Required to proxy me my dear swsclose
Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"

And you should ignore this data.
</data>

# then this is returned since we get no server-auth
<data1000>
HTTP/1.1 401 Authorization to the remote host as well swsbounce swsclose
WWW-Authenticate: Digest realm="realmweirdo", nonce="123456"

you should ignore this data too
</data1000>

<data1001>
HTTP/1.1 200 OK swsclose
Server: no
Content-Length: 15

Nice auth sir!
</data1001>

<datacheck>
HTTP/1.1 407 Authorization Required to proxy me my dear swsclose
Proxy-Authenticate: Digest realm="weirdorealm", nonce="12345"

HTTP/1.1 401 Authorization to the remote host as well swsbounce swsclose
WWW-Authenticate: Digest realm="realmweirdo", nonce="123456"

HTTP/1.1 200 OK swsclose
Server: no
Content-Length: 15

Nice auth sir!
</datacheck>
</reply>

# Client-side
<client>
<server>
http
</server>
<features>
!SSPI
crypto
</features>
 <name>
HTTP with proxy Digest and site Digest with creds in URLs
 </name>
 <command>
http://digest:alot@data.from.server.requiring.digest.hohoho.com/335 --proxy http://foo:bar@%HOSTIP:%HTTPPORT --proxy-digest --digest
</command>
</client>

# Verify data after the test has been "shot"
<verify>
<strip>
^User-Agent: curl/.*
</strip>
<protocol>
GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
Accept: */*
Proxy-Connection: Keep-Alive

GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/335", response="f61609cd8f5bb205ef4e169b2c5626cb"
User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b zlib/1.1.4 c-ares/1.2.0 libidn/0.4.3
Accept: */*
Proxy-Connection: Keep-Alive

GET http://data.from.server.requiring.digest.hohoho.com/335 HTTP/1.1
Host: data.from.server.requiring.digest.hohoho.com
Proxy-Authorization: Digest username="foo", realm="weirdorealm", nonce="12345", uri="/335", response="f61609cd8f5bb205ef4e169b2c5626cb"
Authorization: Digest username="digest", realm="realmweirdo", nonce="123456", uri="/335", response="08a2e2e684047f4219a38ddc189ac00c"
User-Agent: curl/7.12.0-CVS (i686-pc-linux-gnu) libcurl/7.12.0-CVS OpenSSL/0.9.6b ipv6 zlib/1.1.4 GSS libidn/0.4.3
Accept: */*
Proxy-Connection: Keep-Alive

</protocol>
</verify>
</testcase>
Changes to jni/curl/tests/data/test356.
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
Connection: close
Content-Type: text/html
Funny-head: yesyes
Alt-Svc: h1="nowhere.foo:81"

-foo-
</data>
</reply>

#
# Client-side







|







12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<data>
HTTP/1.1 200 OK
Date: Thu, 09 Nov 2010 14:49:00 GMT
Content-Length: 6
Connection: close
Content-Type: text/html
Funny-head: yesyes
Alt-Svc: h1="nowhere.foo:81", un-kno22!wn=":82"

-foo-
</data>
</reply>

#
# Client-side
Added jni/curl/tests/data/test848.
















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<testcase>
<info>
<keywords>
IMAP
SASL
SASL AUTH PLAIN
RFC4616
</keywords>
</info>

#
# Server-side
<reply>
<servercmd>
AUTH PLAIN
REPLY AUTHENTICATE +
REPLY c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ= A002 OK AUTHENTICATE completed
</servercmd>
<data>
From: me@somewhere
To: fake@nowhere

body

--
  yours sincerely
</data>
</reply>

#
# Client-side
<client>
<server>
imap
</server>
 <name>
IMAP plain authentication with alternative authorization identity
 </name>
 <command>
'imap://%HOSTIP:%IMAPPORT/848/;MAILINDEX=1' -u user:secret --sasl-authzid shared-mailbox
</command>
</client>

#
# Verify data after the test has been "shot"
<verify>
<protocol>
A001 CAPABILITY
A002 AUTHENTICATE PLAIN
c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ=
A003 SELECT 848
A004 FETCH 1 BODY[]
A005 LOGOUT
</protocol>
</verify>
</testcase>
Added jni/curl/tests/data/test849.






































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<testcase>
<info>
<keywords>
IMAP
SASL
SASL AUTH PLAIN
RFC4616
</keywords>
</info>

#
# Server-side
<reply>
<servercmd>
AUTH PLAIN
REPLY AUTHENTICATE +
REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= A002 NO Not authorized
</servercmd>
</reply>

#
# Client-side
<client>
<server>
imap
</server>
 <name>
IMAP plain authentication with alternative authorization identity (Not authorized)
 </name>
 <command>
'imap://%HOSTIP:%IMAPPORT/849/;MAILINDEX=1' -u kurt:xipj3plmq --sasl-authzid ursel
</command>
</client>

#
# Verify data after the test has been "shot"
<verify>
# 67 - CURLE_LOGIN_DENIED
<errorcode>
67
</errorcode>
#
# The multi interface considers a broken "CONNECT" as a prematurely broken
# transfer and such a connection will not get a "LOGOUT"
<protocol>
A001 CAPABILITY
A002 AUTHENTICATE PLAIN
dXJzZWwAa3VydAB4aXBqM3BsbXE=
</protocol>
</verify>
</testcase>
Added jni/curl/tests/data/test892.


















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<testcase>
<info>
<keywords>
POP3
SASL
SASL AUTH PLAIN
RFC1734
RFC4616
RFC5034
</keywords>
</info>

#
# Server-side
<reply>
<servercmd>
AUTH PLAIN
REPLY AUTH +
REPLY c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ= +OK Login successful
</servercmd>
<data>
From: me@somewhere
To: fake@nowhere

body

--
  yours sincerely
</data>
</reply>

#
# Client-side
<client>
<server>
pop3
</server>
 <name>
POP3 plain authentication with alternative authorization identity
 </name>
 <command>
pop3://%HOSTIP:%POP3PORT/892 -u user:secret --sasl-authzid shared-mailbox
</command>
</client>

#
# Verify data after the test has been "shot"
<verify>
<protocol>
CAPA
AUTH PLAIN
c2hhcmVkLW1haWxib3gAdXNlcgBzZWNyZXQ=
RETR 892
QUIT
</protocol>
</verify>
</testcase>
Added jni/curl/tests/data/test893.










































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<testcase>
<info>
<keywords>
POP3
SASL
SASL AUTH PLAIN
RFC1734
RFC4616
RFC5034
</keywords>
</info>

#
# Server-side
<reply>
<servercmd>
AUTH PLAIN
REPLY AUTH +
REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= -ERR Not authorized
</servercmd>
</reply>

#
# Client-side
<client>
<server>
pop3
</server>
 <name>
POP3 plain authentication with alternative authorization identity (Not authorized)
 </name>
 <command>
pop3://%HOSTIP:%POP3PORT/893 -u kurt:xipj3plmq --sasl-authzid ursel
</command>
</client>

#
# Verify data after the test has been "shot"
<verify>
# 67 - CURLE_LOGIN_DENIED
<errorcode>
67
</errorcode>
#
# The multi interface considers a broken "CONNECT" as a prematurely broken
# transfer and such a connection will not get a "QUIT"
<protocol>
CAPA
AUTH PLAIN
dXJzZWwAa3VydAB4aXBqM3BsbXE=
</protocol>
</verify>
</testcase>
Added jni/curl/tests/data/test953.
















































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<testcase>
<info>
<keywords>
SMTP
SASL
SASL AUTH PLAIN
RFC4616
RFC4954
</keywords>
</info>

#
# Server-side
<reply>
<servercmd>
AUTH PLAIN
REPLY AUTH 334 PLAIN supported
REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= 235 Authenticated
</servercmd>
</reply>

#
# Client-side
<client>
<server>
smtp
</server>
 <name>
SMTP plain authentication with alternative authorization identity
 </name>
<stdin>
mail body
</stdin>
 <command>
smtp://%HOSTIP:%SMTPPORT/953 --mail-rcpt recipient@example.com --mail-from sender@example.com -u kurt:xipj3plmq --sasl-authzid ursel -T -
</command>
</client>

#
# Verify data after the test has been "shot"
<verify>
<protocol>
EHLO 953
AUTH PLAIN
dXJzZWwAa3VydAB4aXBqM3BsbXE=
MAIL FROM:<sender@example.com>
RCPT TO:<recipient@example.com>
DATA
QUIT
</protocol>
<upload>
mail body
.
</upload>
</verify>
</testcase>
Added jni/curl/tests/data/test954.














































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<testcase>
<info>
<keywords>
SMTP
SASL
SASL AUTH PLAIN
RFC4616
RFC4954
</keywords>
</info>

#
# Server-side
<reply>
<servercmd>
AUTH PLAIN
REPLY AUTH 334 PLAIN supported
REPLY dXJzZWwAa3VydAB4aXBqM3BsbXE= 501 Not authorized
</servercmd>
</reply>

#
# Client-side
<client>
<server>
smtp
</server>
 <name>
SMTP plain authentication with alternative authorization identity (Not authorized)
 </name>
<stdin>
mail body
</stdin>
 <command>
smtp://%HOSTIP:%SMTPPORT/954 --mail-rcpt recipient@example.com --mail-from sender@example.com -u kurt:xipj3plmq --sasl-authzid ursel -T -
</command>
</client>

#
# Verify data after the test has been "shot"
<verify>
# 67 - CURLE_LOGIN_DENIED
<errorcode>
67
</errorcode>
#
# The multi interface considers a broken "CONNECT" as a prematurely broken
# transfer and such a connection will not get a "QUIT"
<protocol>
EHLO 954
AUTH PLAIN
dXJzZWwAa3VydAB4aXBqM3BsbXE=
</protocol>
</verify>
</testcase>
Changes to jni/curl/tests/libtest/Makefile.in.
134
135
136
137
138
139
140

141
142
143
144
145
146
147
148
149
	lib1533$(EXEEXT) lib1534$(EXEEXT) lib1535$(EXEEXT) \
	lib1536$(EXEEXT) lib1537$(EXEEXT) lib1538$(EXEEXT) \
	lib1540$(EXEEXT) lib1541$(EXEEXT) lib1550$(EXEEXT) \
	lib1551$(EXEEXT) lib1552$(EXEEXT) lib1553$(EXEEXT) \
	lib1554$(EXEEXT) lib1555$(EXEEXT) lib1556$(EXEEXT) \
	lib1557$(EXEEXT) lib1558$(EXEEXT) lib1559$(EXEEXT) \
	lib1560$(EXEEXT) lib1591$(EXEEXT) lib1592$(EXEEXT) \

	lib1593$(EXEEXT) lib1900$(EXEEXT) lib1905$(EXEEXT) \
	lib1906$(EXEEXT) lib2033$(EXEEXT)
@USE_CPPFLAG_CURL_STATICLIB_TRUE@am__append_1 = -DCURL_STATICLIB
@CURL_LT_SHLIB_USE_NO_UNDEFINED_TRUE@am__append_2 = -no-undefined
@CURL_LT_SHLIB_USE_MIMPURE_TEXT_TRUE@am__append_3 = -mimpure-text
@DOING_CURL_SYMBOL_HIDING_TRUE@am__append_4 = -DCURL_HIDDEN_SYMBOLS
@DOING_CURL_SYMBOL_HIDING_TRUE@am__append_5 = $(CFLAG_CURL_SYMBOL_HIDING)

# Build a stub gssapi implementation for testing







>
|
|







134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
	lib1533$(EXEEXT) lib1534$(EXEEXT) lib1535$(EXEEXT) \
	lib1536$(EXEEXT) lib1537$(EXEEXT) lib1538$(EXEEXT) \
	lib1540$(EXEEXT) lib1541$(EXEEXT) lib1550$(EXEEXT) \
	lib1551$(EXEEXT) lib1552$(EXEEXT) lib1553$(EXEEXT) \
	lib1554$(EXEEXT) lib1555$(EXEEXT) lib1556$(EXEEXT) \
	lib1557$(EXEEXT) lib1558$(EXEEXT) lib1559$(EXEEXT) \
	lib1560$(EXEEXT) lib1591$(EXEEXT) lib1592$(EXEEXT) \
	lib1593$(EXEEXT) lib1594$(EXEEXT) lib1596$(EXEEXT) \
	lib1900$(EXEEXT) lib1905$(EXEEXT) lib1906$(EXEEXT) \
	lib2033$(EXEEXT)
@USE_CPPFLAG_CURL_STATICLIB_TRUE@am__append_1 = -DCURL_STATICLIB
@CURL_LT_SHLIB_USE_NO_UNDEFINED_TRUE@am__append_2 = -no-undefined
@CURL_LT_SHLIB_USE_MIMPURE_TEXT_TRUE@am__append_3 = -mimpure-text
@DOING_CURL_SYMBOL_HIDING_TRUE@am__append_4 = -DCURL_HIDDEN_SYMBOLS
@DOING_CURL_SYMBOL_HIDING_TRUE@am__append_5 = $(CFLAG_CURL_SYMBOL_HIDING)

# Build a stub gssapi implementation for testing
549
550
551
552
553
554
555




556
557
558
559
560







561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
	$(am__objects_128) $(am__objects_129)
lib1592_OBJECTS = $(am_lib1592_OBJECTS)
lib1592_DEPENDENCIES = $(am__DEPENDENCIES_1)
am_lib1593_OBJECTS = lib1593.$(OBJEXT) $(am__objects_121) \
	$(am__objects_122) $(am__objects_123)
lib1593_OBJECTS = $(am_lib1593_OBJECTS)
lib1593_DEPENDENCIES = $(am__DEPENDENCIES_1)




am__objects_130 = lib1900-first.$(OBJEXT)
am__objects_131 = lib1900-testutil.$(OBJEXT)
am__objects_132 = ../../lib/lib1900-warnless.$(OBJEXT)
am_lib1900_OBJECTS = lib1900-lib1900.$(OBJEXT) $(am__objects_130) \
	$(am__objects_131) $(am__objects_132)







lib1900_OBJECTS = $(am_lib1900_OBJECTS)
lib1900_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_133 = lib1905-first.$(OBJEXT)
am__objects_134 = lib1905-testutil.$(OBJEXT)
am__objects_135 = ../../lib/lib1905-warnless.$(OBJEXT)
am_lib1905_OBJECTS = lib1905-lib1905.$(OBJEXT) $(am__objects_133) \
	$(am__objects_134) $(am__objects_135)
lib1905_OBJECTS = $(am_lib1905_OBJECTS)
lib1905_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_136 = lib1906-first.$(OBJEXT)
am__objects_137 = lib1906-testutil.$(OBJEXT)
am__objects_138 = ../../lib/lib1906-warnless.$(OBJEXT)
am_lib1906_OBJECTS = lib1906-lib1906.$(OBJEXT) $(am__objects_136) \
	$(am__objects_137) $(am__objects_138)
lib1906_OBJECTS = $(am_lib1906_OBJECTS)
lib1906_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_139 = lib2033-first.$(OBJEXT)
am__objects_140 = lib2033-testutil.$(OBJEXT)
am__objects_141 = ../../lib/lib2033-warnless.$(OBJEXT)
am_lib2033_OBJECTS = lib2033-libntlmconnect.$(OBJEXT) \
	$(am__objects_139) $(am__objects_140) $(am__objects_141)
lib2033_OBJECTS = $(am_lib2033_OBJECTS)
lib2033_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_142 = lib500-first.$(OBJEXT)
am__objects_143 = lib500-testutil.$(OBJEXT)
am__objects_144 = lib500-testtrace.$(OBJEXT)
am_lib500_OBJECTS = lib500-lib500.$(OBJEXT) $(am__objects_142) \
	$(am__objects_143) $(am__objects_144)
lib500_OBJECTS = $(am_lib500_OBJECTS)
lib500_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_145 = lib501-first.$(OBJEXT)
am_lib501_OBJECTS = lib501-lib501.$(OBJEXT) $(am__objects_145)
lib501_OBJECTS = $(am_lib501_OBJECTS)
lib501_LDADD = $(LDADD)
lib501_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_146 = lib502-first.$(OBJEXT)
am__objects_147 = lib502-testutil.$(OBJEXT)
am__objects_148 = ../../lib/lib502-warnless.$(OBJEXT)
am_lib502_OBJECTS = lib502-lib502.$(OBJEXT) $(am__objects_146) \
	$(am__objects_147) $(am__objects_148)
lib502_OBJECTS = $(am_lib502_OBJECTS)
lib502_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_149 = lib503-first.$(OBJEXT)
am__objects_150 = lib503-testutil.$(OBJEXT)
am__objects_151 = ../../lib/lib503-warnless.$(OBJEXT)
am_lib503_OBJECTS = lib503-lib503.$(OBJEXT) $(am__objects_149) \
	$(am__objects_150) $(am__objects_151)
lib503_OBJECTS = $(am_lib503_OBJECTS)
lib503_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_152 = lib504-first.$(OBJEXT)
am__objects_153 = lib504-testutil.$(OBJEXT)
am__objects_154 = ../../lib/lib504-warnless.$(OBJEXT)
am_lib504_OBJECTS = lib504-lib504.$(OBJEXT) $(am__objects_152) \
	$(am__objects_153) $(am__objects_154)
lib504_OBJECTS = $(am_lib504_OBJECTS)
lib504_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_155 = lib505-first.$(OBJEXT)
am_lib505_OBJECTS = lib505-lib505.$(OBJEXT) $(am__objects_155)
lib505_OBJECTS = $(am_lib505_OBJECTS)
lib505_LDADD = $(LDADD)
lib505_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_156 = lib506-first.$(OBJEXT)
am_lib506_OBJECTS = lib506-lib506.$(OBJEXT) $(am__objects_156)
lib506_OBJECTS = $(am_lib506_OBJECTS)
lib506_LDADD = $(LDADD)
lib506_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_157 = lib507-first.$(OBJEXT)
am__objects_158 = lib507-testutil.$(OBJEXT)
am__objects_159 = ../../lib/lib507-warnless.$(OBJEXT)
am_lib507_OBJECTS = lib507-lib507.$(OBJEXT) $(am__objects_157) \
	$(am__objects_158) $(am__objects_159)
lib507_OBJECTS = $(am_lib507_OBJECTS)
lib507_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_160 = lib508-first.$(OBJEXT)
am_lib508_OBJECTS = lib508-lib508.$(OBJEXT) $(am__objects_160)
lib508_OBJECTS = $(am_lib508_OBJECTS)
lib508_LDADD = $(LDADD)
lib508_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_161 = lib509-first.$(OBJEXT)
am_lib509_OBJECTS = lib509-lib509.$(OBJEXT) $(am__objects_161)
lib509_OBJECTS = $(am_lib509_OBJECTS)
lib509_LDADD = $(LDADD)
lib509_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_162 = lib510-first.$(OBJEXT)
am_lib510_OBJECTS = lib510-lib510.$(OBJEXT) $(am__objects_162)
lib510_OBJECTS = $(am_lib510_OBJECTS)
lib510_LDADD = $(LDADD)
lib510_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_163 = lib511-first.$(OBJEXT)
am_lib511_OBJECTS = lib511-lib511.$(OBJEXT) $(am__objects_163)
lib511_OBJECTS = $(am_lib511_OBJECTS)
lib511_LDADD = $(LDADD)
lib511_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_164 = lib512-first.$(OBJEXT)
am_lib512_OBJECTS = lib512-lib512.$(OBJEXT) $(am__objects_164)
lib512_OBJECTS = $(am_lib512_OBJECTS)
lib512_LDADD = $(LDADD)
lib512_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_165 = lib513-first.$(OBJEXT)
am_lib513_OBJECTS = lib513-lib513.$(OBJEXT) $(am__objects_165)
lib513_OBJECTS = $(am_lib513_OBJECTS)
lib513_LDADD = $(LDADD)
lib513_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_166 = lib514-first.$(OBJEXT)
am_lib514_OBJECTS = lib514-lib514.$(OBJEXT) $(am__objects_166)
lib514_OBJECTS = $(am_lib514_OBJECTS)
lib514_LDADD = $(LDADD)
lib514_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_167 = lib515-first.$(OBJEXT)
am_lib515_OBJECTS = lib515-lib515.$(OBJEXT) $(am__objects_167)
lib515_OBJECTS = $(am_lib515_OBJECTS)
lib515_LDADD = $(LDADD)
lib515_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_168 = lib516-first.$(OBJEXT)
am_lib516_OBJECTS = lib516-lib516.$(OBJEXT) $(am__objects_168)
lib516_OBJECTS = $(am_lib516_OBJECTS)
lib516_LDADD = $(LDADD)
lib516_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_169 = lib517-first.$(OBJEXT)
am_lib517_OBJECTS = lib517-lib517.$(OBJEXT) $(am__objects_169)
lib517_OBJECTS = $(am_lib517_OBJECTS)
lib517_LDADD = $(LDADD)
lib517_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_170 = lib518-first.$(OBJEXT)
am__objects_171 = ../../lib/lib518-warnless.$(OBJEXT)
am_lib518_OBJECTS = lib518-lib518.$(OBJEXT) $(am__objects_170) \
	$(am__objects_171)
lib518_OBJECTS = $(am_lib518_OBJECTS)
lib518_LDADD = $(LDADD)
lib518_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_172 = lib519-first.$(OBJEXT)
am_lib519_OBJECTS = lib519-lib519.$(OBJEXT) $(am__objects_172)
lib519_OBJECTS = $(am_lib519_OBJECTS)
lib519_LDADD = $(LDADD)
lib519_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_173 = lib520-first.$(OBJEXT)
am_lib520_OBJECTS = lib520-lib520.$(OBJEXT) $(am__objects_173)
lib520_OBJECTS = $(am_lib520_OBJECTS)
lib520_LDADD = $(LDADD)
lib520_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_174 = lib521-first.$(OBJEXT)
am_lib521_OBJECTS = lib521-lib521.$(OBJEXT) $(am__objects_174)
lib521_OBJECTS = $(am_lib521_OBJECTS)
lib521_LDADD = $(LDADD)
lib521_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_175 = lib523-first.$(OBJEXT)
am_lib523_OBJECTS = lib523-lib523.$(OBJEXT) $(am__objects_175)
lib523_OBJECTS = $(am_lib523_OBJECTS)
lib523_LDADD = $(LDADD)
lib523_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_176 = lib524-first.$(OBJEXT)
am_lib524_OBJECTS = lib524-lib524.$(OBJEXT) $(am__objects_176)
lib524_OBJECTS = $(am_lib524_OBJECTS)
lib524_LDADD = $(LDADD)
lib524_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_177 = lib525-first.$(OBJEXT)
am__objects_178 = lib525-testutil.$(OBJEXT)
am__objects_179 = ../../lib/lib525-warnless.$(OBJEXT)
am_lib525_OBJECTS = lib525-lib525.$(OBJEXT) $(am__objects_177) \
	$(am__objects_178) $(am__objects_179)
lib525_OBJECTS = $(am_lib525_OBJECTS)
lib525_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_180 = lib526-first.$(OBJEXT)
am__objects_181 = lib526-testutil.$(OBJEXT)
am__objects_182 = ../../lib/lib526-warnless.$(OBJEXT)
am_lib526_OBJECTS = lib526-lib526.$(OBJEXT) $(am__objects_180) \
	$(am__objects_181) $(am__objects_182)
lib526_OBJECTS = $(am_lib526_OBJECTS)
lib526_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_183 = lib527-first.$(OBJEXT)
am__objects_184 = lib527-testutil.$(OBJEXT)
am__objects_185 = ../../lib/lib527-warnless.$(OBJEXT)
am_lib527_OBJECTS = lib527-lib526.$(OBJEXT) $(am__objects_183) \
	$(am__objects_184) $(am__objects_185)
lib527_OBJECTS = $(am_lib527_OBJECTS)
lib527_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_186 = lib529-first.$(OBJEXT)
am__objects_187 = lib529-testutil.$(OBJEXT)
am__objects_188 = ../../lib/lib529-warnless.$(OBJEXT)
am_lib529_OBJECTS = lib529-lib525.$(OBJEXT) $(am__objects_186) \
	$(am__objects_187) $(am__objects_188)
lib529_OBJECTS = $(am_lib529_OBJECTS)
lib529_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_189 = lib530-first.$(OBJEXT)
am__objects_190 = lib530-testutil.$(OBJEXT)
am__objects_191 = ../../lib/lib530-warnless.$(OBJEXT)
am_lib530_OBJECTS = lib530-lib530.$(OBJEXT) $(am__objects_189) \
	$(am__objects_190) $(am__objects_191)
lib530_OBJECTS = $(am_lib530_OBJECTS)
lib530_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_192 = lib532-first.$(OBJEXT)
am__objects_193 = lib532-testutil.$(OBJEXT)
am__objects_194 = ../../lib/lib532-warnless.$(OBJEXT)
am_lib532_OBJECTS = lib532-lib526.$(OBJEXT) $(am__objects_192) \
	$(am__objects_193) $(am__objects_194)
lib532_OBJECTS = $(am_lib532_OBJECTS)
lib532_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_195 = lib533-first.$(OBJEXT)
am__objects_196 = lib533-testutil.$(OBJEXT)
am__objects_197 = ../../lib/lib533-warnless.$(OBJEXT)
am_lib533_OBJECTS = lib533-lib533.$(OBJEXT) $(am__objects_195) \
	$(am__objects_196) $(am__objects_197)
lib533_OBJECTS = $(am_lib533_OBJECTS)
lib533_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_198 = lib537-first.$(OBJEXT)
am__objects_199 = ../../lib/lib537-warnless.$(OBJEXT)
am_lib537_OBJECTS = lib537-lib537.$(OBJEXT) $(am__objects_198) \
	$(am__objects_199)
lib537_OBJECTS = $(am_lib537_OBJECTS)
lib537_LDADD = $(LDADD)
lib537_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_200 = lib539-first.$(OBJEXT)
am_lib539_OBJECTS = lib539-lib539.$(OBJEXT) $(am__objects_200)
lib539_OBJECTS = $(am_lib539_OBJECTS)
lib539_LDADD = $(LDADD)
lib539_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_201 = lib540-first.$(OBJEXT)
am__objects_202 = lib540-testutil.$(OBJEXT)
am__objects_203 = ../../lib/lib540-warnless.$(OBJEXT)
am_lib540_OBJECTS = lib540-lib540.$(OBJEXT) $(am__objects_201) \
	$(am__objects_202) $(am__objects_203)
lib540_OBJECTS = $(am_lib540_OBJECTS)
lib540_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_204 = lib541-first.$(OBJEXT)
am_lib541_OBJECTS = lib541-lib541.$(OBJEXT) $(am__objects_204)
lib541_OBJECTS = $(am_lib541_OBJECTS)
lib541_LDADD = $(LDADD)
lib541_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_205 = lib542-first.$(OBJEXT)
am_lib542_OBJECTS = lib542-lib542.$(OBJEXT) $(am__objects_205)
lib542_OBJECTS = $(am_lib542_OBJECTS)
lib542_LDADD = $(LDADD)
lib542_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_206 = lib543-first.$(OBJEXT)
am_lib543_OBJECTS = lib543-lib543.$(OBJEXT) $(am__objects_206)
lib543_OBJECTS = $(am_lib543_OBJECTS)
lib543_LDADD = $(LDADD)
lib543_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_207 = lib544-first.$(OBJEXT)
am_lib544_OBJECTS = lib544-lib544.$(OBJEXT) $(am__objects_207)
lib544_OBJECTS = $(am_lib544_OBJECTS)
lib544_LDADD = $(LDADD)
lib544_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_208 = lib545-first.$(OBJEXT)
am_lib545_OBJECTS = lib545-lib544.$(OBJEXT) $(am__objects_208)
lib545_OBJECTS = $(am_lib545_OBJECTS)
lib545_LDADD = $(LDADD)
lib545_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_209 = lib547-first.$(OBJEXT)
am_lib547_OBJECTS = lib547-lib547.$(OBJEXT) $(am__objects_209)
lib547_OBJECTS = $(am_lib547_OBJECTS)
lib547_LDADD = $(LDADD)
lib547_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_210 = lib548-first.$(OBJEXT)
am_lib548_OBJECTS = lib548-lib547.$(OBJEXT) $(am__objects_210)
lib548_OBJECTS = $(am_lib548_OBJECTS)
lib548_LDADD = $(LDADD)
lib548_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_211 = lib549-first.$(OBJEXT)
am_lib549_OBJECTS = lib549-lib549.$(OBJEXT) $(am__objects_211)
lib549_OBJECTS = $(am_lib549_OBJECTS)
lib549_LDADD = $(LDADD)
lib549_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_212 = lib552-first.$(OBJEXT)
am__objects_213 = ../../lib/lib552-warnless.$(OBJEXT)
am_lib552_OBJECTS = lib552-lib552.$(OBJEXT) $(am__objects_212) \
	$(am__objects_213)
lib552_OBJECTS = $(am_lib552_OBJECTS)
lib552_LDADD = $(LDADD)
lib552_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_214 = lib553-first.$(OBJEXT)
am_lib553_OBJECTS = lib553-lib553.$(OBJEXT) $(am__objects_214)
lib553_OBJECTS = $(am_lib553_OBJECTS)
lib553_LDADD = $(LDADD)
lib553_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_215 = lib554-first.$(OBJEXT)
am_lib554_OBJECTS = lib554-lib554.$(OBJEXT) $(am__objects_215)
lib554_OBJECTS = $(am_lib554_OBJECTS)
lib554_LDADD = $(LDADD)
lib554_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_216 = lib555-first.$(OBJEXT)
am__objects_217 = lib555-testutil.$(OBJEXT)
am__objects_218 = ../../lib/lib555-warnless.$(OBJEXT)
am_lib555_OBJECTS = lib555-lib555.$(OBJEXT) $(am__objects_216) \
	$(am__objects_217) $(am__objects_218)
lib555_OBJECTS = $(am_lib555_OBJECTS)
lib555_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_219 = lib556-first.$(OBJEXT)
am__objects_220 = ../../lib/lib556-warnless.$(OBJEXT)
am_lib556_OBJECTS = lib556-lib556.$(OBJEXT) $(am__objects_219) \
	$(am__objects_220)
lib556_OBJECTS = $(am_lib556_OBJECTS)
lib556_LDADD = $(LDADD)
lib556_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_221 = lib557-first.$(OBJEXT)
am_lib557_OBJECTS = lib557-lib557.$(OBJEXT) $(am__objects_221)
lib557_OBJECTS = $(am_lib557_OBJECTS)
lib557_LDADD = $(LDADD)
lib557_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_222 = lib558-first.$(OBJEXT)
am_lib558_OBJECTS = lib558-lib558.$(OBJEXT) $(am__objects_222)
lib558_OBJECTS = $(am_lib558_OBJECTS)
lib558_LDADD = $(LDADD)
lib558_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_223 = lib559-first.$(OBJEXT)
am_lib559_OBJECTS = lib559-lib559.$(OBJEXT) $(am__objects_223)
lib559_OBJECTS = $(am_lib559_OBJECTS)
lib559_LDADD = $(LDADD)
lib559_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_224 = lib560-first.$(OBJEXT)
am__objects_225 = lib560-testutil.$(OBJEXT)
am__objects_226 = ../../lib/lib560-warnless.$(OBJEXT)
am_lib560_OBJECTS = lib560-lib560.$(OBJEXT) $(am__objects_224) \
	$(am__objects_225) $(am__objects_226)
lib560_OBJECTS = $(am_lib560_OBJECTS)
lib560_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_227 = lib562-first.$(OBJEXT)
am_lib562_OBJECTS = lib562-lib562.$(OBJEXT) $(am__objects_227)
lib562_OBJECTS = $(am_lib562_OBJECTS)
lib562_LDADD = $(LDADD)
lib562_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_228 = lib564-first.$(OBJEXT)
am__objects_229 = lib564-testutil.$(OBJEXT)
am__objects_230 = ../../lib/lib564-warnless.$(OBJEXT)
am_lib564_OBJECTS = lib564-lib564.$(OBJEXT) $(am__objects_228) \
	$(am__objects_229) $(am__objects_230)
lib564_OBJECTS = $(am_lib564_OBJECTS)
lib564_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_231 = lib565-first.$(OBJEXT)
am_lib565_OBJECTS = lib565-lib510.$(OBJEXT) $(am__objects_231)
lib565_OBJECTS = $(am_lib565_OBJECTS)
lib565_LDADD = $(LDADD)
lib565_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_232 = lib566-first.$(OBJEXT)
am_lib566_OBJECTS = lib566-lib566.$(OBJEXT) $(am__objects_232)
lib566_OBJECTS = $(am_lib566_OBJECTS)
lib566_LDADD = $(LDADD)
lib566_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_233 = lib567-first.$(OBJEXT)
am_lib567_OBJECTS = lib567-lib567.$(OBJEXT) $(am__objects_233)
lib567_OBJECTS = $(am_lib567_OBJECTS)
lib567_LDADD = $(LDADD)
lib567_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_234 = lib568-first.$(OBJEXT)
am_lib568_OBJECTS = lib568-lib568.$(OBJEXT) $(am__objects_234)
lib568_OBJECTS = $(am_lib568_OBJECTS)
lib568_LDADD = $(LDADD)
lib568_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_235 = lib569-first.$(OBJEXT)
am_lib569_OBJECTS = lib569-lib569.$(OBJEXT) $(am__objects_235)
lib569_OBJECTS = $(am_lib569_OBJECTS)
lib569_LDADD = $(LDADD)
lib569_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_236 = lib570-first.$(OBJEXT)
am_lib570_OBJECTS = lib570-lib570.$(OBJEXT) $(am__objects_236)
lib570_OBJECTS = $(am_lib570_OBJECTS)
lib570_LDADD = $(LDADD)
lib570_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_237 = lib571-first.$(OBJEXT)
am__objects_238 = ../../lib/lib571-warnless.$(OBJEXT)
am_lib571_OBJECTS = lib571-lib571.$(OBJEXT) $(am__objects_237) \
	$(am__objects_238)
lib571_OBJECTS = $(am_lib571_OBJECTS)
lib571_LDADD = $(LDADD)
lib571_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_239 = lib572-first.$(OBJEXT)
am_lib572_OBJECTS = lib572-lib572.$(OBJEXT) $(am__objects_239)
lib572_OBJECTS = $(am_lib572_OBJECTS)
lib572_LDADD = $(LDADD)
lib572_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_240 = lib573-first.$(OBJEXT)
am__objects_241 = lib573-testutil.$(OBJEXT)
am__objects_242 = ../../lib/lib573-warnless.$(OBJEXT)
am__objects_243 = lib573-testtrace.$(OBJEXT)
am_lib573_OBJECTS = lib573-lib573.$(OBJEXT) $(am__objects_240) \
	$(am__objects_241) $(am__objects_242) $(am__objects_243)
lib573_OBJECTS = $(am_lib573_OBJECTS)
lib573_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_244 = lib574-first.$(OBJEXT)
am_lib574_OBJECTS = lib574-lib574.$(OBJEXT) $(am__objects_244)
lib574_OBJECTS = $(am_lib574_OBJECTS)
lib574_LDADD = $(LDADD)
lib574_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_245 = lib575-first.$(OBJEXT)
am__objects_246 = lib575-testutil.$(OBJEXT)
am__objects_247 = ../../lib/lib575-warnless.$(OBJEXT)
am_lib575_OBJECTS = lib575-lib575.$(OBJEXT) $(am__objects_245) \
	$(am__objects_246) $(am__objects_247)
lib575_OBJECTS = $(am_lib575_OBJECTS)
lib575_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_248 = lib576-first.$(OBJEXT)
am_lib576_OBJECTS = lib576-lib576.$(OBJEXT) $(am__objects_248)
lib576_OBJECTS = $(am_lib576_OBJECTS)
lib576_LDADD = $(LDADD)
lib576_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_249 = lib578-first.$(OBJEXT)
am_lib578_OBJECTS = lib578-lib578.$(OBJEXT) $(am__objects_249)
lib578_OBJECTS = $(am_lib578_OBJECTS)
lib578_LDADD = $(LDADD)
lib578_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_250 = lib579-first.$(OBJEXT)
am_lib579_OBJECTS = lib579-lib579.$(OBJEXT) $(am__objects_250)
lib579_OBJECTS = $(am_lib579_OBJECTS)
lib579_LDADD = $(LDADD)
lib579_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_251 = lib582-first.$(OBJEXT)
am__objects_252 = lib582-testutil.$(OBJEXT)
am__objects_253 = ../../lib/lib582-warnless.$(OBJEXT)
am_lib582_OBJECTS = lib582-lib582.$(OBJEXT) $(am__objects_251) \
	$(am__objects_252) $(am__objects_253)
lib582_OBJECTS = $(am_lib582_OBJECTS)
lib582_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_254 = lib583-first.$(OBJEXT)
am_lib583_OBJECTS = lib583-lib583.$(OBJEXT) $(am__objects_254)
lib583_OBJECTS = $(am_lib583_OBJECTS)
lib583_LDADD = $(LDADD)
lib583_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_255 = lib585-first.$(OBJEXT)
am__objects_256 = lib585-testutil.$(OBJEXT)
am__objects_257 = lib585-testtrace.$(OBJEXT)
am_lib585_OBJECTS = lib585-lib500.$(OBJEXT) $(am__objects_255) \
	$(am__objects_256) $(am__objects_257)
lib585_OBJECTS = $(am_lib585_OBJECTS)
lib585_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_258 = lib586-first.$(OBJEXT)
am_lib586_OBJECTS = lib586-lib586.$(OBJEXT) $(am__objects_258)
lib586_OBJECTS = $(am_lib586_OBJECTS)
lib586_LDADD = $(LDADD)
lib586_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_259 = lib587-first.$(OBJEXT)
am_lib587_OBJECTS = lib587-lib554.$(OBJEXT) $(am__objects_259)
lib587_OBJECTS = $(am_lib587_OBJECTS)
lib587_LDADD = $(LDADD)
lib587_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_260 = lib589-first.$(OBJEXT)
am_lib589_OBJECTS = lib589-lib589.$(OBJEXT) $(am__objects_260)
lib589_OBJECTS = $(am_lib589_OBJECTS)
lib589_LDADD = $(LDADD)
lib589_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_261 = lib590-first.$(OBJEXT)
am_lib590_OBJECTS = lib590-lib590.$(OBJEXT) $(am__objects_261)
lib590_OBJECTS = $(am_lib590_OBJECTS)
lib590_LDADD = $(LDADD)
lib590_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_262 = lib591-first.$(OBJEXT)
am__objects_263 = lib591-testutil.$(OBJEXT)
am__objects_264 = ../../lib/lib591-warnless.$(OBJEXT)
am_lib591_OBJECTS = lib591-lib591.$(OBJEXT) $(am__objects_262) \
	$(am__objects_263) $(am__objects_264)
lib591_OBJECTS = $(am_lib591_OBJECTS)
lib591_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_265 = lib597-first.$(OBJEXT)
am__objects_266 = lib597-testutil.$(OBJEXT)
am__objects_267 = ../../lib/lib597-warnless.$(OBJEXT)
am_lib597_OBJECTS = lib597-lib597.$(OBJEXT) $(am__objects_265) \
	$(am__objects_266) $(am__objects_267)
lib597_OBJECTS = $(am_lib597_OBJECTS)
lib597_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_268 = lib598-first.$(OBJEXT)
am_lib598_OBJECTS = lib598-lib598.$(OBJEXT) $(am__objects_268)
lib598_OBJECTS = $(am_lib598_OBJECTS)
lib598_LDADD = $(LDADD)
lib598_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_269 = lib599-first.$(OBJEXT)
am_lib599_OBJECTS = lib599-lib599.$(OBJEXT) $(am__objects_269)
lib599_OBJECTS = $(am_lib599_OBJECTS)
lib599_LDADD = $(LDADD)
lib599_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_270 = lib643-first.$(OBJEXT)
am_lib643_OBJECTS = lib643-lib643.$(OBJEXT) $(am__objects_270)
lib643_OBJECTS = $(am_lib643_OBJECTS)
lib643_LDADD = $(LDADD)
lib643_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_271 = lib644-first.$(OBJEXT)
am_lib644_OBJECTS = lib644-lib643.$(OBJEXT) $(am__objects_271)
lib644_OBJECTS = $(am_lib644_OBJECTS)
lib644_LDADD = $(LDADD)
lib644_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_272 = lib645-first.$(OBJEXT)
am_lib645_OBJECTS = lib645-lib643.$(OBJEXT) $(am__objects_272)
lib645_OBJECTS = $(am_lib645_OBJECTS)
lib645_LDADD = $(LDADD)
lib645_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_273 = lib650-first.$(OBJEXT)
am_lib650_OBJECTS = lib650-lib650.$(OBJEXT) $(am__objects_273)
lib650_OBJECTS = $(am_lib650_OBJECTS)
lib650_LDADD = $(LDADD)
lib650_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_274 = lib651-first.$(OBJEXT)
am_lib651_OBJECTS = lib651-lib651.$(OBJEXT) $(am__objects_274)
lib651_OBJECTS = $(am_lib651_OBJECTS)
lib651_LDADD = $(LDADD)
lib651_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_275 = lib652-first.$(OBJEXT)
am_lib652_OBJECTS = lib652-lib652.$(OBJEXT) $(am__objects_275)
lib652_OBJECTS = $(am_lib652_OBJECTS)
lib652_LDADD = $(LDADD)
lib652_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_276 = lib653-first.$(OBJEXT)
am_lib653_OBJECTS = lib653-lib653.$(OBJEXT) $(am__objects_276)
lib653_OBJECTS = $(am_lib653_OBJECTS)
lib653_LDADD = $(LDADD)
lib653_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_277 = lib654-first.$(OBJEXT)
am_lib654_OBJECTS = lib654-lib654.$(OBJEXT) $(am__objects_277)
lib654_OBJECTS = $(am_lib654_OBJECTS)
lib654_LDADD = $(LDADD)
lib654_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_278 = lib655-first.$(OBJEXT)
am_lib655_OBJECTS = lib655-lib655.$(OBJEXT) $(am__objects_278)
lib655_OBJECTS = $(am_lib655_OBJECTS)
lib655_LDADD = $(LDADD)
lib655_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_279 = lib658-first.$(OBJEXT)
am__objects_280 = lib658-testutil.$(OBJEXT)
am__objects_281 = ../../lib/lib658-warnless.$(OBJEXT)
am_lib658_OBJECTS = lib658-lib658.$(OBJEXT) $(am__objects_279) \
	$(am__objects_280) $(am__objects_281)
lib658_OBJECTS = $(am_lib658_OBJECTS)
lib658_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_282 = lib659-first.$(OBJEXT)
am__objects_283 = lib659-testutil.$(OBJEXT)
am__objects_284 = ../../lib/lib659-warnless.$(OBJEXT)
am_lib659_OBJECTS = lib659-lib659.$(OBJEXT) $(am__objects_282) \
	$(am__objects_283) $(am__objects_284)
lib659_OBJECTS = $(am_lib659_OBJECTS)
lib659_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_285 = libauthretry-first.$(OBJEXT)
am_libauthretry_OBJECTS = libauthretry-libauthretry.$(OBJEXT) \
	$(am__objects_285)
libauthretry_OBJECTS = $(am_libauthretry_OBJECTS)
libauthretry_LDADD = $(LDADD)
libauthretry_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_286 = libntlmconnect-first.$(OBJEXT)
am__objects_287 = libntlmconnect-testutil.$(OBJEXT)
am__objects_288 = ../../lib/libntlmconnect-warnless.$(OBJEXT)
am_libntlmconnect_OBJECTS = libntlmconnect-libntlmconnect.$(OBJEXT) \
	$(am__objects_286) $(am__objects_287) $(am__objects_288)
libntlmconnect_OBJECTS = $(am_libntlmconnect_OBJECTS)
libntlmconnect_DEPENDENCIES = $(am__DEPENDENCIES_1)
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
am__v_P_0 = false
am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)







>
>
>
>
|
|
|
|

>
>
>
>
>
>
>


|
|
|
|
|


|
|
|
|
|


|
|
|

|


|
|
|
|
|


|
|



|
|
|
|
|


|
|
|
|
|


|
|
|
|
|


|
|



|
|



|
|
|
|
|


|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|
|
|



|
|



|
|



|
|



|
|



|
|



|
|
|
|
|


|
|
|
|
|


|
|
|
|
|


|
|
|
|
|


|
|
|
|
|


|
|
|
|
|


|
|
|
|
|


|
|
|
|



|
|



|
|
|
|
|


|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|
|
|



|
|



|
|



|
|
|
|
|


|
|
|
|



|
|



|
|



|
|



|
|
|
|
|


|
|



|
|
|
|
|


|
|



|
|



|
|



|
|



|
|



|
|



|
|
|
|



|
|



|
|
|
|
|
|


|
|



|
|
|
|
|


|
|



|
|



|
|



|
|
|
|
|


|
|



|
|
|
|
|


|
|



|
|



|
|



|
|



|
|
|
|
|


|
|
|
|
|


|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|



|
|
|
|
|


|
|
|
|
|


|

|



|
|
|

|







550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
	$(am__objects_128) $(am__objects_129)
lib1592_OBJECTS = $(am_lib1592_OBJECTS)
lib1592_DEPENDENCIES = $(am__DEPENDENCIES_1)
am_lib1593_OBJECTS = lib1593.$(OBJEXT) $(am__objects_121) \
	$(am__objects_122) $(am__objects_123)
lib1593_OBJECTS = $(am_lib1593_OBJECTS)
lib1593_DEPENDENCIES = $(am__DEPENDENCIES_1)
am_lib1594_OBJECTS = lib1594.$(OBJEXT) $(am__objects_121) \
	$(am__objects_122) $(am__objects_123)
lib1594_OBJECTS = $(am_lib1594_OBJECTS)
lib1594_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_130 = lib1596-first.$(OBJEXT)
am__objects_131 = lib1596-testutil.$(OBJEXT)
am__objects_132 = ../../lib/lib1596-warnless.$(OBJEXT)
am_lib1596_OBJECTS = lib1596-lib1594.$(OBJEXT) $(am__objects_130) \
	$(am__objects_131) $(am__objects_132)
lib1596_OBJECTS = $(am_lib1596_OBJECTS)
lib1596_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_133 = lib1900-first.$(OBJEXT)
am__objects_134 = lib1900-testutil.$(OBJEXT)
am__objects_135 = ../../lib/lib1900-warnless.$(OBJEXT)
am_lib1900_OBJECTS = lib1900-lib1900.$(OBJEXT) $(am__objects_133) \
	$(am__objects_134) $(am__objects_135)
lib1900_OBJECTS = $(am_lib1900_OBJECTS)
lib1900_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_136 = lib1905-first.$(OBJEXT)
am__objects_137 = lib1905-testutil.$(OBJEXT)
am__objects_138 = ../../lib/lib1905-warnless.$(OBJEXT)
am_lib1905_OBJECTS = lib1905-lib1905.$(OBJEXT) $(am__objects_136) \
	$(am__objects_137) $(am__objects_138)
lib1905_OBJECTS = $(am_lib1905_OBJECTS)
lib1905_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_139 = lib1906-first.$(OBJEXT)
am__objects_140 = lib1906-testutil.$(OBJEXT)
am__objects_141 = ../../lib/lib1906-warnless.$(OBJEXT)
am_lib1906_OBJECTS = lib1906-lib1906.$(OBJEXT) $(am__objects_139) \
	$(am__objects_140) $(am__objects_141)
lib1906_OBJECTS = $(am_lib1906_OBJECTS)
lib1906_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_142 = lib2033-first.$(OBJEXT)
am__objects_143 = lib2033-testutil.$(OBJEXT)
am__objects_144 = ../../lib/lib2033-warnless.$(OBJEXT)
am_lib2033_OBJECTS = lib2033-libntlmconnect.$(OBJEXT) \
	$(am__objects_142) $(am__objects_143) $(am__objects_144)
lib2033_OBJECTS = $(am_lib2033_OBJECTS)
lib2033_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_145 = lib500-first.$(OBJEXT)
am__objects_146 = lib500-testutil.$(OBJEXT)
am__objects_147 = lib500-testtrace.$(OBJEXT)
am_lib500_OBJECTS = lib500-lib500.$(OBJEXT) $(am__objects_145) \
	$(am__objects_146) $(am__objects_147)
lib500_OBJECTS = $(am_lib500_OBJECTS)
lib500_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_148 = lib501-first.$(OBJEXT)
am_lib501_OBJECTS = lib501-lib501.$(OBJEXT) $(am__objects_148)
lib501_OBJECTS = $(am_lib501_OBJECTS)
lib501_LDADD = $(LDADD)
lib501_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_149 = lib502-first.$(OBJEXT)
am__objects_150 = lib502-testutil.$(OBJEXT)
am__objects_151 = ../../lib/lib502-warnless.$(OBJEXT)
am_lib502_OBJECTS = lib502-lib502.$(OBJEXT) $(am__objects_149) \
	$(am__objects_150) $(am__objects_151)
lib502_OBJECTS = $(am_lib502_OBJECTS)
lib502_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_152 = lib503-first.$(OBJEXT)
am__objects_153 = lib503-testutil.$(OBJEXT)
am__objects_154 = ../../lib/lib503-warnless.$(OBJEXT)
am_lib503_OBJECTS = lib503-lib503.$(OBJEXT) $(am__objects_152) \
	$(am__objects_153) $(am__objects_154)
lib503_OBJECTS = $(am_lib503_OBJECTS)
lib503_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_155 = lib504-first.$(OBJEXT)
am__objects_156 = lib504-testutil.$(OBJEXT)
am__objects_157 = ../../lib/lib504-warnless.$(OBJEXT)
am_lib504_OBJECTS = lib504-lib504.$(OBJEXT) $(am__objects_155) \
	$(am__objects_156) $(am__objects_157)
lib504_OBJECTS = $(am_lib504_OBJECTS)
lib504_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_158 = lib505-first.$(OBJEXT)
am_lib505_OBJECTS = lib505-lib505.$(OBJEXT) $(am__objects_158)
lib505_OBJECTS = $(am_lib505_OBJECTS)
lib505_LDADD = $(LDADD)
lib505_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_159 = lib506-first.$(OBJEXT)
am_lib506_OBJECTS = lib506-lib506.$(OBJEXT) $(am__objects_159)
lib506_OBJECTS = $(am_lib506_OBJECTS)
lib506_LDADD = $(LDADD)
lib506_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_160 = lib507-first.$(OBJEXT)
am__objects_161 = lib507-testutil.$(OBJEXT)
am__objects_162 = ../../lib/lib507-warnless.$(OBJEXT)
am_lib507_OBJECTS = lib507-lib507.$(OBJEXT) $(am__objects_160) \
	$(am__objects_161) $(am__objects_162)
lib507_OBJECTS = $(am_lib507_OBJECTS)
lib507_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_163 = lib508-first.$(OBJEXT)
am_lib508_OBJECTS = lib508-lib508.$(OBJEXT) $(am__objects_163)
lib508_OBJECTS = $(am_lib508_OBJECTS)
lib508_LDADD = $(LDADD)
lib508_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_164 = lib509-first.$(OBJEXT)
am_lib509_OBJECTS = lib509-lib509.$(OBJEXT) $(am__objects_164)
lib509_OBJECTS = $(am_lib509_OBJECTS)
lib509_LDADD = $(LDADD)
lib509_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_165 = lib510-first.$(OBJEXT)
am_lib510_OBJECTS = lib510-lib510.$(OBJEXT) $(am__objects_165)
lib510_OBJECTS = $(am_lib510_OBJECTS)
lib510_LDADD = $(LDADD)
lib510_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_166 = lib511-first.$(OBJEXT)
am_lib511_OBJECTS = lib511-lib511.$(OBJEXT) $(am__objects_166)
lib511_OBJECTS = $(am_lib511_OBJECTS)
lib511_LDADD = $(LDADD)
lib511_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_167 = lib512-first.$(OBJEXT)
am_lib512_OBJECTS = lib512-lib512.$(OBJEXT) $(am__objects_167)
lib512_OBJECTS = $(am_lib512_OBJECTS)
lib512_LDADD = $(LDADD)
lib512_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_168 = lib513-first.$(OBJEXT)
am_lib513_OBJECTS = lib513-lib513.$(OBJEXT) $(am__objects_168)
lib513_OBJECTS = $(am_lib513_OBJECTS)
lib513_LDADD = $(LDADD)
lib513_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_169 = lib514-first.$(OBJEXT)
am_lib514_OBJECTS = lib514-lib514.$(OBJEXT) $(am__objects_169)
lib514_OBJECTS = $(am_lib514_OBJECTS)
lib514_LDADD = $(LDADD)
lib514_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_170 = lib515-first.$(OBJEXT)
am_lib515_OBJECTS = lib515-lib515.$(OBJEXT) $(am__objects_170)
lib515_OBJECTS = $(am_lib515_OBJECTS)
lib515_LDADD = $(LDADD)
lib515_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_171 = lib516-first.$(OBJEXT)
am_lib516_OBJECTS = lib516-lib516.$(OBJEXT) $(am__objects_171)
lib516_OBJECTS = $(am_lib516_OBJECTS)
lib516_LDADD = $(LDADD)
lib516_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_172 = lib517-first.$(OBJEXT)
am_lib517_OBJECTS = lib517-lib517.$(OBJEXT) $(am__objects_172)
lib517_OBJECTS = $(am_lib517_OBJECTS)
lib517_LDADD = $(LDADD)
lib517_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_173 = lib518-first.$(OBJEXT)
am__objects_174 = ../../lib/lib518-warnless.$(OBJEXT)
am_lib518_OBJECTS = lib518-lib518.$(OBJEXT) $(am__objects_173) \
	$(am__objects_174)
lib518_OBJECTS = $(am_lib518_OBJECTS)
lib518_LDADD = $(LDADD)
lib518_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_175 = lib519-first.$(OBJEXT)
am_lib519_OBJECTS = lib519-lib519.$(OBJEXT) $(am__objects_175)
lib519_OBJECTS = $(am_lib519_OBJECTS)
lib519_LDADD = $(LDADD)
lib519_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_176 = lib520-first.$(OBJEXT)
am_lib520_OBJECTS = lib520-lib520.$(OBJEXT) $(am__objects_176)
lib520_OBJECTS = $(am_lib520_OBJECTS)
lib520_LDADD = $(LDADD)
lib520_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_177 = lib521-first.$(OBJEXT)
am_lib521_OBJECTS = lib521-lib521.$(OBJEXT) $(am__objects_177)
lib521_OBJECTS = $(am_lib521_OBJECTS)
lib521_LDADD = $(LDADD)
lib521_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_178 = lib523-first.$(OBJEXT)
am_lib523_OBJECTS = lib523-lib523.$(OBJEXT) $(am__objects_178)
lib523_OBJECTS = $(am_lib523_OBJECTS)
lib523_LDADD = $(LDADD)
lib523_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_179 = lib524-first.$(OBJEXT)
am_lib524_OBJECTS = lib524-lib524.$(OBJEXT) $(am__objects_179)
lib524_OBJECTS = $(am_lib524_OBJECTS)
lib524_LDADD = $(LDADD)
lib524_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_180 = lib525-first.$(OBJEXT)
am__objects_181 = lib525-testutil.$(OBJEXT)
am__objects_182 = ../../lib/lib525-warnless.$(OBJEXT)
am_lib525_OBJECTS = lib525-lib525.$(OBJEXT) $(am__objects_180) \
	$(am__objects_181) $(am__objects_182)
lib525_OBJECTS = $(am_lib525_OBJECTS)
lib525_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_183 = lib526-first.$(OBJEXT)
am__objects_184 = lib526-testutil.$(OBJEXT)
am__objects_185 = ../../lib/lib526-warnless.$(OBJEXT)
am_lib526_OBJECTS = lib526-lib526.$(OBJEXT) $(am__objects_183) \
	$(am__objects_184) $(am__objects_185)
lib526_OBJECTS = $(am_lib526_OBJECTS)
lib526_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_186 = lib527-first.$(OBJEXT)
am__objects_187 = lib527-testutil.$(OBJEXT)
am__objects_188 = ../../lib/lib527-warnless.$(OBJEXT)
am_lib527_OBJECTS = lib527-lib526.$(OBJEXT) $(am__objects_186) \
	$(am__objects_187) $(am__objects_188)
lib527_OBJECTS = $(am_lib527_OBJECTS)
lib527_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_189 = lib529-first.$(OBJEXT)
am__objects_190 = lib529-testutil.$(OBJEXT)
am__objects_191 = ../../lib/lib529-warnless.$(OBJEXT)
am_lib529_OBJECTS = lib529-lib525.$(OBJEXT) $(am__objects_189) \
	$(am__objects_190) $(am__objects_191)
lib529_OBJECTS = $(am_lib529_OBJECTS)
lib529_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_192 = lib530-first.$(OBJEXT)
am__objects_193 = lib530-testutil.$(OBJEXT)
am__objects_194 = ../../lib/lib530-warnless.$(OBJEXT)
am_lib530_OBJECTS = lib530-lib530.$(OBJEXT) $(am__objects_192) \
	$(am__objects_193) $(am__objects_194)
lib530_OBJECTS = $(am_lib530_OBJECTS)
lib530_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_195 = lib532-first.$(OBJEXT)
am__objects_196 = lib532-testutil.$(OBJEXT)
am__objects_197 = ../../lib/lib532-warnless.$(OBJEXT)
am_lib532_OBJECTS = lib532-lib526.$(OBJEXT) $(am__objects_195) \
	$(am__objects_196) $(am__objects_197)
lib532_OBJECTS = $(am_lib532_OBJECTS)
lib532_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_198 = lib533-first.$(OBJEXT)
am__objects_199 = lib533-testutil.$(OBJEXT)
am__objects_200 = ../../lib/lib533-warnless.$(OBJEXT)
am_lib533_OBJECTS = lib533-lib533.$(OBJEXT) $(am__objects_198) \
	$(am__objects_199) $(am__objects_200)
lib533_OBJECTS = $(am_lib533_OBJECTS)
lib533_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_201 = lib537-first.$(OBJEXT)
am__objects_202 = ../../lib/lib537-warnless.$(OBJEXT)
am_lib537_OBJECTS = lib537-lib537.$(OBJEXT) $(am__objects_201) \
	$(am__objects_202)
lib537_OBJECTS = $(am_lib537_OBJECTS)
lib537_LDADD = $(LDADD)
lib537_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_203 = lib539-first.$(OBJEXT)
am_lib539_OBJECTS = lib539-lib539.$(OBJEXT) $(am__objects_203)
lib539_OBJECTS = $(am_lib539_OBJECTS)
lib539_LDADD = $(LDADD)
lib539_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_204 = lib540-first.$(OBJEXT)
am__objects_205 = lib540-testutil.$(OBJEXT)
am__objects_206 = ../../lib/lib540-warnless.$(OBJEXT)
am_lib540_OBJECTS = lib540-lib540.$(OBJEXT) $(am__objects_204) \
	$(am__objects_205) $(am__objects_206)
lib540_OBJECTS = $(am_lib540_OBJECTS)
lib540_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_207 = lib541-first.$(OBJEXT)
am_lib541_OBJECTS = lib541-lib541.$(OBJEXT) $(am__objects_207)
lib541_OBJECTS = $(am_lib541_OBJECTS)
lib541_LDADD = $(LDADD)
lib541_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_208 = lib542-first.$(OBJEXT)
am_lib542_OBJECTS = lib542-lib542.$(OBJEXT) $(am__objects_208)
lib542_OBJECTS = $(am_lib542_OBJECTS)
lib542_LDADD = $(LDADD)
lib542_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_209 = lib543-first.$(OBJEXT)
am_lib543_OBJECTS = lib543-lib543.$(OBJEXT) $(am__objects_209)
lib543_OBJECTS = $(am_lib543_OBJECTS)
lib543_LDADD = $(LDADD)
lib543_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_210 = lib544-first.$(OBJEXT)
am_lib544_OBJECTS = lib544-lib544.$(OBJEXT) $(am__objects_210)
lib544_OBJECTS = $(am_lib544_OBJECTS)
lib544_LDADD = $(LDADD)
lib544_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_211 = lib545-first.$(OBJEXT)
am_lib545_OBJECTS = lib545-lib544.$(OBJEXT) $(am__objects_211)
lib545_OBJECTS = $(am_lib545_OBJECTS)
lib545_LDADD = $(LDADD)
lib545_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_212 = lib547-first.$(OBJEXT)
am_lib547_OBJECTS = lib547-lib547.$(OBJEXT) $(am__objects_212)
lib547_OBJECTS = $(am_lib547_OBJECTS)
lib547_LDADD = $(LDADD)
lib547_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_213 = lib548-first.$(OBJEXT)
am_lib548_OBJECTS = lib548-lib547.$(OBJEXT) $(am__objects_213)
lib548_OBJECTS = $(am_lib548_OBJECTS)
lib548_LDADD = $(LDADD)
lib548_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_214 = lib549-first.$(OBJEXT)
am_lib549_OBJECTS = lib549-lib549.$(OBJEXT) $(am__objects_214)
lib549_OBJECTS = $(am_lib549_OBJECTS)
lib549_LDADD = $(LDADD)
lib549_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_215 = lib552-first.$(OBJEXT)
am__objects_216 = ../../lib/lib552-warnless.$(OBJEXT)
am_lib552_OBJECTS = lib552-lib552.$(OBJEXT) $(am__objects_215) \
	$(am__objects_216)
lib552_OBJECTS = $(am_lib552_OBJECTS)
lib552_LDADD = $(LDADD)
lib552_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_217 = lib553-first.$(OBJEXT)
am_lib553_OBJECTS = lib553-lib553.$(OBJEXT) $(am__objects_217)
lib553_OBJECTS = $(am_lib553_OBJECTS)
lib553_LDADD = $(LDADD)
lib553_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_218 = lib554-first.$(OBJEXT)
am_lib554_OBJECTS = lib554-lib554.$(OBJEXT) $(am__objects_218)
lib554_OBJECTS = $(am_lib554_OBJECTS)
lib554_LDADD = $(LDADD)
lib554_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_219 = lib555-first.$(OBJEXT)
am__objects_220 = lib555-testutil.$(OBJEXT)
am__objects_221 = ../../lib/lib555-warnless.$(OBJEXT)
am_lib555_OBJECTS = lib555-lib555.$(OBJEXT) $(am__objects_219) \
	$(am__objects_220) $(am__objects_221)
lib555_OBJECTS = $(am_lib555_OBJECTS)
lib555_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_222 = lib556-first.$(OBJEXT)
am__objects_223 = ../../lib/lib556-warnless.$(OBJEXT)
am_lib556_OBJECTS = lib556-lib556.$(OBJEXT) $(am__objects_222) \
	$(am__objects_223)
lib556_OBJECTS = $(am_lib556_OBJECTS)
lib556_LDADD = $(LDADD)
lib556_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_224 = lib557-first.$(OBJEXT)
am_lib557_OBJECTS = lib557-lib557.$(OBJEXT) $(am__objects_224)
lib557_OBJECTS = $(am_lib557_OBJECTS)
lib557_LDADD = $(LDADD)
lib557_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_225 = lib558-first.$(OBJEXT)
am_lib558_OBJECTS = lib558-lib558.$(OBJEXT) $(am__objects_225)
lib558_OBJECTS = $(am_lib558_OBJECTS)
lib558_LDADD = $(LDADD)
lib558_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_226 = lib559-first.$(OBJEXT)
am_lib559_OBJECTS = lib559-lib559.$(OBJEXT) $(am__objects_226)
lib559_OBJECTS = $(am_lib559_OBJECTS)
lib559_LDADD = $(LDADD)
lib559_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_227 = lib560-first.$(OBJEXT)
am__objects_228 = lib560-testutil.$(OBJEXT)
am__objects_229 = ../../lib/lib560-warnless.$(OBJEXT)
am_lib560_OBJECTS = lib560-lib560.$(OBJEXT) $(am__objects_227) \
	$(am__objects_228) $(am__objects_229)
lib560_OBJECTS = $(am_lib560_OBJECTS)
lib560_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_230 = lib562-first.$(OBJEXT)
am_lib562_OBJECTS = lib562-lib562.$(OBJEXT) $(am__objects_230)
lib562_OBJECTS = $(am_lib562_OBJECTS)
lib562_LDADD = $(LDADD)
lib562_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_231 = lib564-first.$(OBJEXT)
am__objects_232 = lib564-testutil.$(OBJEXT)
am__objects_233 = ../../lib/lib564-warnless.$(OBJEXT)
am_lib564_OBJECTS = lib564-lib564.$(OBJEXT) $(am__objects_231) \
	$(am__objects_232) $(am__objects_233)
lib564_OBJECTS = $(am_lib564_OBJECTS)
lib564_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_234 = lib565-first.$(OBJEXT)
am_lib565_OBJECTS = lib565-lib510.$(OBJEXT) $(am__objects_234)
lib565_OBJECTS = $(am_lib565_OBJECTS)
lib565_LDADD = $(LDADD)
lib565_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_235 = lib566-first.$(OBJEXT)
am_lib566_OBJECTS = lib566-lib566.$(OBJEXT) $(am__objects_235)
lib566_OBJECTS = $(am_lib566_OBJECTS)
lib566_LDADD = $(LDADD)
lib566_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_236 = lib567-first.$(OBJEXT)
am_lib567_OBJECTS = lib567-lib567.$(OBJEXT) $(am__objects_236)
lib567_OBJECTS = $(am_lib567_OBJECTS)
lib567_LDADD = $(LDADD)
lib567_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_237 = lib568-first.$(OBJEXT)
am_lib568_OBJECTS = lib568-lib568.$(OBJEXT) $(am__objects_237)
lib568_OBJECTS = $(am_lib568_OBJECTS)
lib568_LDADD = $(LDADD)
lib568_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_238 = lib569-first.$(OBJEXT)
am_lib569_OBJECTS = lib569-lib569.$(OBJEXT) $(am__objects_238)
lib569_OBJECTS = $(am_lib569_OBJECTS)
lib569_LDADD = $(LDADD)
lib569_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_239 = lib570-first.$(OBJEXT)
am_lib570_OBJECTS = lib570-lib570.$(OBJEXT) $(am__objects_239)
lib570_OBJECTS = $(am_lib570_OBJECTS)
lib570_LDADD = $(LDADD)
lib570_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_240 = lib571-first.$(OBJEXT)
am__objects_241 = ../../lib/lib571-warnless.$(OBJEXT)
am_lib571_OBJECTS = lib571-lib571.$(OBJEXT) $(am__objects_240) \
	$(am__objects_241)
lib571_OBJECTS = $(am_lib571_OBJECTS)
lib571_LDADD = $(LDADD)
lib571_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_242 = lib572-first.$(OBJEXT)
am_lib572_OBJECTS = lib572-lib572.$(OBJEXT) $(am__objects_242)
lib572_OBJECTS = $(am_lib572_OBJECTS)
lib572_LDADD = $(LDADD)
lib572_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_243 = lib573-first.$(OBJEXT)
am__objects_244 = lib573-testutil.$(OBJEXT)
am__objects_245 = ../../lib/lib573-warnless.$(OBJEXT)
am__objects_246 = lib573-testtrace.$(OBJEXT)
am_lib573_OBJECTS = lib573-lib573.$(OBJEXT) $(am__objects_243) \
	$(am__objects_244) $(am__objects_245) $(am__objects_246)
lib573_OBJECTS = $(am_lib573_OBJECTS)
lib573_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_247 = lib574-first.$(OBJEXT)
am_lib574_OBJECTS = lib574-lib574.$(OBJEXT) $(am__objects_247)
lib574_OBJECTS = $(am_lib574_OBJECTS)
lib574_LDADD = $(LDADD)
lib574_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_248 = lib575-first.$(OBJEXT)
am__objects_249 = lib575-testutil.$(OBJEXT)
am__objects_250 = ../../lib/lib575-warnless.$(OBJEXT)
am_lib575_OBJECTS = lib575-lib575.$(OBJEXT) $(am__objects_248) \
	$(am__objects_249) $(am__objects_250)
lib575_OBJECTS = $(am_lib575_OBJECTS)
lib575_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_251 = lib576-first.$(OBJEXT)
am_lib576_OBJECTS = lib576-lib576.$(OBJEXT) $(am__objects_251)
lib576_OBJECTS = $(am_lib576_OBJECTS)
lib576_LDADD = $(LDADD)
lib576_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_252 = lib578-first.$(OBJEXT)
am_lib578_OBJECTS = lib578-lib578.$(OBJEXT) $(am__objects_252)
lib578_OBJECTS = $(am_lib578_OBJECTS)
lib578_LDADD = $(LDADD)
lib578_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_253 = lib579-first.$(OBJEXT)
am_lib579_OBJECTS = lib579-lib579.$(OBJEXT) $(am__objects_253)
lib579_OBJECTS = $(am_lib579_OBJECTS)
lib579_LDADD = $(LDADD)
lib579_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_254 = lib582-first.$(OBJEXT)
am__objects_255 = lib582-testutil.$(OBJEXT)
am__objects_256 = ../../lib/lib582-warnless.$(OBJEXT)
am_lib582_OBJECTS = lib582-lib582.$(OBJEXT) $(am__objects_254) \
	$(am__objects_255) $(am__objects_256)
lib582_OBJECTS = $(am_lib582_OBJECTS)
lib582_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_257 = lib583-first.$(OBJEXT)
am_lib583_OBJECTS = lib583-lib583.$(OBJEXT) $(am__objects_257)
lib583_OBJECTS = $(am_lib583_OBJECTS)
lib583_LDADD = $(LDADD)
lib583_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_258 = lib585-first.$(OBJEXT)
am__objects_259 = lib585-testutil.$(OBJEXT)
am__objects_260 = lib585-testtrace.$(OBJEXT)
am_lib585_OBJECTS = lib585-lib500.$(OBJEXT) $(am__objects_258) \
	$(am__objects_259) $(am__objects_260)
lib585_OBJECTS = $(am_lib585_OBJECTS)
lib585_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_261 = lib586-first.$(OBJEXT)
am_lib586_OBJECTS = lib586-lib586.$(OBJEXT) $(am__objects_261)
lib586_OBJECTS = $(am_lib586_OBJECTS)
lib586_LDADD = $(LDADD)
lib586_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_262 = lib587-first.$(OBJEXT)
am_lib587_OBJECTS = lib587-lib554.$(OBJEXT) $(am__objects_262)
lib587_OBJECTS = $(am_lib587_OBJECTS)
lib587_LDADD = $(LDADD)
lib587_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_263 = lib589-first.$(OBJEXT)
am_lib589_OBJECTS = lib589-lib589.$(OBJEXT) $(am__objects_263)
lib589_OBJECTS = $(am_lib589_OBJECTS)
lib589_LDADD = $(LDADD)
lib589_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_264 = lib590-first.$(OBJEXT)
am_lib590_OBJECTS = lib590-lib590.$(OBJEXT) $(am__objects_264)
lib590_OBJECTS = $(am_lib590_OBJECTS)
lib590_LDADD = $(LDADD)
lib590_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_265 = lib591-first.$(OBJEXT)
am__objects_266 = lib591-testutil.$(OBJEXT)
am__objects_267 = ../../lib/lib591-warnless.$(OBJEXT)
am_lib591_OBJECTS = lib591-lib591.$(OBJEXT) $(am__objects_265) \
	$(am__objects_266) $(am__objects_267)
lib591_OBJECTS = $(am_lib591_OBJECTS)
lib591_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_268 = lib597-first.$(OBJEXT)
am__objects_269 = lib597-testutil.$(OBJEXT)
am__objects_270 = ../../lib/lib597-warnless.$(OBJEXT)
am_lib597_OBJECTS = lib597-lib597.$(OBJEXT) $(am__objects_268) \
	$(am__objects_269) $(am__objects_270)
lib597_OBJECTS = $(am_lib597_OBJECTS)
lib597_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_271 = lib598-first.$(OBJEXT)
am_lib598_OBJECTS = lib598-lib598.$(OBJEXT) $(am__objects_271)
lib598_OBJECTS = $(am_lib598_OBJECTS)
lib598_LDADD = $(LDADD)
lib598_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_272 = lib599-first.$(OBJEXT)
am_lib599_OBJECTS = lib599-lib599.$(OBJEXT) $(am__objects_272)
lib599_OBJECTS = $(am_lib599_OBJECTS)
lib599_LDADD = $(LDADD)
lib599_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_273 = lib643-first.$(OBJEXT)
am_lib643_OBJECTS = lib643-lib643.$(OBJEXT) $(am__objects_273)
lib643_OBJECTS = $(am_lib643_OBJECTS)
lib643_LDADD = $(LDADD)
lib643_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_274 = lib644-first.$(OBJEXT)
am_lib644_OBJECTS = lib644-lib643.$(OBJEXT) $(am__objects_274)
lib644_OBJECTS = $(am_lib644_OBJECTS)
lib644_LDADD = $(LDADD)
lib644_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_275 = lib645-first.$(OBJEXT)
am_lib645_OBJECTS = lib645-lib643.$(OBJEXT) $(am__objects_275)
lib645_OBJECTS = $(am_lib645_OBJECTS)
lib645_LDADD = $(LDADD)
lib645_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_276 = lib650-first.$(OBJEXT)
am_lib650_OBJECTS = lib650-lib650.$(OBJEXT) $(am__objects_276)
lib650_OBJECTS = $(am_lib650_OBJECTS)
lib650_LDADD = $(LDADD)
lib650_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_277 = lib651-first.$(OBJEXT)
am_lib651_OBJECTS = lib651-lib651.$(OBJEXT) $(am__objects_277)
lib651_OBJECTS = $(am_lib651_OBJECTS)
lib651_LDADD = $(LDADD)
lib651_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_278 = lib652-first.$(OBJEXT)
am_lib652_OBJECTS = lib652-lib652.$(OBJEXT) $(am__objects_278)
lib652_OBJECTS = $(am_lib652_OBJECTS)
lib652_LDADD = $(LDADD)
lib652_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_279 = lib653-first.$(OBJEXT)
am_lib653_OBJECTS = lib653-lib653.$(OBJEXT) $(am__objects_279)
lib653_OBJECTS = $(am_lib653_OBJECTS)
lib653_LDADD = $(LDADD)
lib653_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_280 = lib654-first.$(OBJEXT)
am_lib654_OBJECTS = lib654-lib654.$(OBJEXT) $(am__objects_280)
lib654_OBJECTS = $(am_lib654_OBJECTS)
lib654_LDADD = $(LDADD)
lib654_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_281 = lib655-first.$(OBJEXT)
am_lib655_OBJECTS = lib655-lib655.$(OBJEXT) $(am__objects_281)
lib655_OBJECTS = $(am_lib655_OBJECTS)
lib655_LDADD = $(LDADD)
lib655_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_282 = lib658-first.$(OBJEXT)
am__objects_283 = lib658-testutil.$(OBJEXT)
am__objects_284 = ../../lib/lib658-warnless.$(OBJEXT)
am_lib658_OBJECTS = lib658-lib658.$(OBJEXT) $(am__objects_282) \
	$(am__objects_283) $(am__objects_284)
lib658_OBJECTS = $(am_lib658_OBJECTS)
lib658_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_285 = lib659-first.$(OBJEXT)
am__objects_286 = lib659-testutil.$(OBJEXT)
am__objects_287 = ../../lib/lib659-warnless.$(OBJEXT)
am_lib659_OBJECTS = lib659-lib659.$(OBJEXT) $(am__objects_285) \
	$(am__objects_286) $(am__objects_287)
lib659_OBJECTS = $(am_lib659_OBJECTS)
lib659_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_288 = libauthretry-first.$(OBJEXT)
am_libauthretry_OBJECTS = libauthretry-libauthretry.$(OBJEXT) \
	$(am__objects_288)
libauthretry_OBJECTS = $(am_libauthretry_OBJECTS)
libauthretry_LDADD = $(LDADD)
libauthretry_DEPENDENCIES = $(am__DEPENDENCIES_1)
am__objects_289 = libntlmconnect-first.$(OBJEXT)
am__objects_290 = libntlmconnect-testutil.$(OBJEXT)
am__objects_291 = ../../lib/libntlmconnect-warnless.$(OBJEXT)
am_libntlmconnect_OBJECTS = libntlmconnect-libntlmconnect.$(OBJEXT) \
	$(am__objects_289) $(am__objects_290) $(am__objects_291)
libntlmconnect_OBJECTS = $(am_libntlmconnect_OBJECTS)
libntlmconnect_DEPENDENCIES = $(am__DEPENDENCIES_1)
AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
am__v_P_0 = false
am__v_P_1 = :
AM_V_GEN = $(am__v_GEN_@AM_V@)
1150
1151
1152
1153
1154
1155
1156

1157
1158
1159
1160
1161
1162
1163
	../../lib/$(DEPDIR)/lib1540-warnless.Po \
	../../lib/$(DEPDIR)/lib1541-warnless.Po \
	../../lib/$(DEPDIR)/lib1555-warnless.Po \
	../../lib/$(DEPDIR)/lib1556-warnless.Po \
	../../lib/$(DEPDIR)/lib1557-warnless.Po \
	../../lib/$(DEPDIR)/lib1591-warnless.Po \
	../../lib/$(DEPDIR)/lib1592-warnless.Po \

	../../lib/$(DEPDIR)/lib1900-warnless.Po \
	../../lib/$(DEPDIR)/lib1905-warnless.Po \
	../../lib/$(DEPDIR)/lib1906-warnless.Po \
	../../lib/$(DEPDIR)/lib2033-warnless.Po \
	../../lib/$(DEPDIR)/lib502-warnless.Po \
	../../lib/$(DEPDIR)/lib503-warnless.Po \
	../../lib/$(DEPDIR)/lib504-warnless.Po \







>







1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
	../../lib/$(DEPDIR)/lib1540-warnless.Po \
	../../lib/$(DEPDIR)/lib1541-warnless.Po \
	../../lib/$(DEPDIR)/lib1555-warnless.Po \
	../../lib/$(DEPDIR)/lib1556-warnless.Po \
	../../lib/$(DEPDIR)/lib1557-warnless.Po \
	../../lib/$(DEPDIR)/lib1591-warnless.Po \
	../../lib/$(DEPDIR)/lib1592-warnless.Po \
	../../lib/$(DEPDIR)/lib1596-warnless.Po \
	../../lib/$(DEPDIR)/lib1900-warnless.Po \
	../../lib/$(DEPDIR)/lib1905-warnless.Po \
	../../lib/$(DEPDIR)/lib1906-warnless.Po \
	../../lib/$(DEPDIR)/lib2033-warnless.Po \
	../../lib/$(DEPDIR)/lib502-warnless.Po \
	../../lib/$(DEPDIR)/lib503-warnless.Po \
	../../lib/$(DEPDIR)/lib504-warnless.Po \
1256
1257
1258
1259
1260
1261
1262


1263
1264
1265
1266
1267
1268
1269
	./$(DEPDIR)/lib1556-testutil.Po ./$(DEPDIR)/lib1557-first.Po \
	./$(DEPDIR)/lib1557-lib1557.Po ./$(DEPDIR)/lib1557-testutil.Po \
	./$(DEPDIR)/lib1558.Po ./$(DEPDIR)/lib1559.Po \
	./$(DEPDIR)/lib1560.Po ./$(DEPDIR)/lib1591-first.Po \
	./$(DEPDIR)/lib1591-lib1591.Po ./$(DEPDIR)/lib1591-testutil.Po \
	./$(DEPDIR)/lib1592-first.Po ./$(DEPDIR)/lib1592-lib1592.Po \
	./$(DEPDIR)/lib1592-testutil.Po ./$(DEPDIR)/lib1593.Po \


	./$(DEPDIR)/lib1900-first.Po ./$(DEPDIR)/lib1900-lib1900.Po \
	./$(DEPDIR)/lib1900-testutil.Po ./$(DEPDIR)/lib1905-first.Po \
	./$(DEPDIR)/lib1905-lib1905.Po ./$(DEPDIR)/lib1905-testutil.Po \
	./$(DEPDIR)/lib1906-first.Po ./$(DEPDIR)/lib1906-lib1906.Po \
	./$(DEPDIR)/lib1906-testutil.Po ./$(DEPDIR)/lib2033-first.Po \
	./$(DEPDIR)/lib2033-libntlmconnect.Po \
	./$(DEPDIR)/lib2033-testutil.Po ./$(DEPDIR)/lib500-first.Po \







>
>







1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
	./$(DEPDIR)/lib1556-testutil.Po ./$(DEPDIR)/lib1557-first.Po \
	./$(DEPDIR)/lib1557-lib1557.Po ./$(DEPDIR)/lib1557-testutil.Po \
	./$(DEPDIR)/lib1558.Po ./$(DEPDIR)/lib1559.Po \
	./$(DEPDIR)/lib1560.Po ./$(DEPDIR)/lib1591-first.Po \
	./$(DEPDIR)/lib1591-lib1591.Po ./$(DEPDIR)/lib1591-testutil.Po \
	./$(DEPDIR)/lib1592-first.Po ./$(DEPDIR)/lib1592-lib1592.Po \
	./$(DEPDIR)/lib1592-testutil.Po ./$(DEPDIR)/lib1593.Po \
	./$(DEPDIR)/lib1594.Po ./$(DEPDIR)/lib1596-first.Po \
	./$(DEPDIR)/lib1596-lib1594.Po ./$(DEPDIR)/lib1596-testutil.Po \
	./$(DEPDIR)/lib1900-first.Po ./$(DEPDIR)/lib1900-lib1900.Po \
	./$(DEPDIR)/lib1900-testutil.Po ./$(DEPDIR)/lib1905-first.Po \
	./$(DEPDIR)/lib1905-lib1905.Po ./$(DEPDIR)/lib1905-testutil.Po \
	./$(DEPDIR)/lib1906-first.Po ./$(DEPDIR)/lib1906-lib1906.Po \
	./$(DEPDIR)/lib1906-testutil.Po ./$(DEPDIR)/lib2033-first.Po \
	./$(DEPDIR)/lib2033-libntlmconnect.Po \
	./$(DEPDIR)/lib2033-testutil.Po ./$(DEPDIR)/lib500-first.Po \
1412
1413
1414
1415
1416
1417
1418





















































1419
1420
1421
1422
1423
1424
1425
1426
	$(lib1533_SOURCES) $(lib1534_SOURCES) $(lib1535_SOURCES) \
	$(lib1536_SOURCES) $(lib1537_SOURCES) $(lib1538_SOURCES) \
	$(lib1540_SOURCES) $(lib1541_SOURCES) $(lib1550_SOURCES) \
	$(lib1551_SOURCES) $(lib1552_SOURCES) $(lib1553_SOURCES) \
	$(lib1554_SOURCES) $(lib1555_SOURCES) $(lib1556_SOURCES) \
	$(lib1557_SOURCES) $(lib1558_SOURCES) $(lib1559_SOURCES) \
	$(lib1560_SOURCES) $(lib1591_SOURCES) $(lib1592_SOURCES) \





















































	$(lib1593_SOURCES) $(lib1900_SOURCES) $(lib1905_SOURCES) \
	$(lib1906_SOURCES) $(lib2033_SOURCES) $(lib500_SOURCES) \
	$(lib501_SOURCES) $(lib502_SOURCES) $(lib503_SOURCES) \
	$(lib504_SOURCES) $(lib505_SOURCES) $(lib506_SOURCES) \
	$(lib507_SOURCES) $(lib508_SOURCES) $(lib509_SOURCES) \
	$(lib510_SOURCES) $(lib511_SOURCES) $(lib512_SOURCES) \
	$(lib513_SOURCES) $(lib514_SOURCES) $(lib515_SOURCES) \
	$(lib516_SOURCES) $(lib517_SOURCES) $(lib518_SOURCES) \







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|







1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
	$(lib1533_SOURCES) $(lib1534_SOURCES) $(lib1535_SOURCES) \
	$(lib1536_SOURCES) $(lib1537_SOURCES) $(lib1538_SOURCES) \
	$(lib1540_SOURCES) $(lib1541_SOURCES) $(lib1550_SOURCES) \
	$(lib1551_SOURCES) $(lib1552_SOURCES) $(lib1553_SOURCES) \
	$(lib1554_SOURCES) $(lib1555_SOURCES) $(lib1556_SOURCES) \
	$(lib1557_SOURCES) $(lib1558_SOURCES) $(lib1559_SOURCES) \
	$(lib1560_SOURCES) $(lib1591_SOURCES) $(lib1592_SOURCES) \
	$(lib1593_SOURCES) $(lib1594_SOURCES) $(lib1596_SOURCES) \
	$(lib1900_SOURCES) $(lib1905_SOURCES) $(lib1906_SOURCES) \
	$(lib2033_SOURCES) $(lib500_SOURCES) $(lib501_SOURCES) \
	$(lib502_SOURCES) $(lib503_SOURCES) $(lib504_SOURCES) \
	$(lib505_SOURCES) $(lib506_SOURCES) $(lib507_SOURCES) \
	$(lib508_SOURCES) $(lib509_SOURCES) $(lib510_SOURCES) \
	$(lib511_SOURCES) $(lib512_SOURCES) $(lib513_SOURCES) \
	$(lib514_SOURCES) $(lib515_SOURCES) $(lib516_SOURCES) \
	$(lib517_SOURCES) $(lib518_SOURCES) $(lib519_SOURCES) \
	$(lib520_SOURCES) $(lib521_SOURCES) $(lib523_SOURCES) \
	$(lib524_SOURCES) $(lib525_SOURCES) $(lib526_SOURCES) \
	$(lib527_SOURCES) $(lib529_SOURCES) $(lib530_SOURCES) \
	$(lib532_SOURCES) $(lib533_SOURCES) $(lib537_SOURCES) \
	$(lib539_SOURCES) $(lib540_SOURCES) $(lib541_SOURCES) \
	$(lib542_SOURCES) $(lib543_SOURCES) $(lib544_SOURCES) \
	$(lib545_SOURCES) $(lib547_SOURCES) $(lib548_SOURCES) \
	$(lib549_SOURCES) $(lib552_SOURCES) $(lib553_SOURCES) \
	$(lib554_SOURCES) $(lib555_SOURCES) $(lib556_SOURCES) \
	$(lib557_SOURCES) $(lib558_SOURCES) $(lib559_SOURCES) \
	$(lib560_SOURCES) $(lib562_SOURCES) $(lib564_SOURCES) \
	$(lib565_SOURCES) $(lib566_SOURCES) $(lib567_SOURCES) \
	$(lib568_SOURCES) $(lib569_SOURCES) $(lib570_SOURCES) \
	$(lib571_SOURCES) $(lib572_SOURCES) $(lib573_SOURCES) \
	$(lib574_SOURCES) $(lib575_SOURCES) $(lib576_SOURCES) \
	$(lib578_SOURCES) $(lib579_SOURCES) $(lib582_SOURCES) \
	$(lib583_SOURCES) $(lib585_SOURCES) $(lib586_SOURCES) \
	$(lib587_SOURCES) $(lib589_SOURCES) $(lib590_SOURCES) \
	$(lib591_SOURCES) $(lib597_SOURCES) $(lib598_SOURCES) \
	$(lib599_SOURCES) $(lib643_SOURCES) $(lib644_SOURCES) \
	$(lib645_SOURCES) $(lib650_SOURCES) $(lib651_SOURCES) \
	$(lib652_SOURCES) $(lib653_SOURCES) $(lib654_SOURCES) \
	$(lib655_SOURCES) $(lib658_SOURCES) $(lib659_SOURCES) \
	$(libauthretry_SOURCES) $(libntlmconnect_SOURCES)
DIST_SOURCES = $(libhostname_la_SOURCES) \
	$(am__libstubgss_la_SOURCES_DIST) $(chkdecimalpoint_SOURCES) \
	$(chkhostname_SOURCES) $(lib1156_SOURCES) $(lib1500_SOURCES) \
	$(lib1501_SOURCES) $(lib1502_SOURCES) $(lib1503_SOURCES) \
	$(lib1504_SOURCES) $(lib1505_SOURCES) $(lib1506_SOURCES) \
	$(lib1507_SOURCES) $(lib1508_SOURCES) $(lib1509_SOURCES) \
	$(lib1510_SOURCES) $(lib1511_SOURCES) $(lib1512_SOURCES) \
	$(lib1513_SOURCES) $(lib1514_SOURCES) $(lib1515_SOURCES) \
	$(lib1517_SOURCES) $(lib1518_SOURCES) $(lib1520_SOURCES) \
	$(lib1522_SOURCES) $(lib1523_SOURCES) $(lib1525_SOURCES) \
	$(lib1526_SOURCES) $(lib1527_SOURCES) $(lib1528_SOURCES) \
	$(lib1529_SOURCES) $(lib1530_SOURCES) $(lib1531_SOURCES) \
	$(lib1532_SOURCES) $(lib1533_SOURCES) $(lib1534_SOURCES) \
	$(lib1535_SOURCES) $(lib1536_SOURCES) $(lib1537_SOURCES) \
	$(lib1538_SOURCES) $(lib1540_SOURCES) $(lib1541_SOURCES) \
	$(lib1550_SOURCES) $(lib1551_SOURCES) $(lib1552_SOURCES) \
	$(lib1553_SOURCES) $(lib1554_SOURCES) $(lib1555_SOURCES) \
	$(lib1556_SOURCES) $(lib1557_SOURCES) $(lib1558_SOURCES) \
	$(lib1559_SOURCES) $(lib1560_SOURCES) $(lib1591_SOURCES) \
	$(lib1592_SOURCES) $(lib1593_SOURCES) $(lib1594_SOURCES) \
	$(lib1596_SOURCES) $(lib1900_SOURCES) $(lib1905_SOURCES) \
	$(lib1906_SOURCES) $(lib2033_SOURCES) $(lib500_SOURCES) \
	$(lib501_SOURCES) $(lib502_SOURCES) $(lib503_SOURCES) \
	$(lib504_SOURCES) $(lib505_SOURCES) $(lib506_SOURCES) \
	$(lib507_SOURCES) $(lib508_SOURCES) $(lib509_SOURCES) \
	$(lib510_SOURCES) $(lib511_SOURCES) $(lib512_SOURCES) \
	$(lib513_SOURCES) $(lib514_SOURCES) $(lib515_SOURCES) \
	$(lib516_SOURCES) $(lib517_SOURCES) $(lib518_SOURCES) \
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
	$(lib590_SOURCES) $(lib591_SOURCES) $(lib597_SOURCES) \
	$(lib598_SOURCES) $(lib599_SOURCES) $(lib643_SOURCES) \
	$(lib644_SOURCES) $(lib645_SOURCES) $(lib650_SOURCES) \
	$(lib651_SOURCES) $(lib652_SOURCES) $(lib653_SOURCES) \
	$(lib654_SOURCES) $(lib655_SOURCES) $(lib658_SOURCES) \
	$(lib659_SOURCES) $(libauthretry_SOURCES) \
	$(libntlmconnect_SOURCES)
DIST_SOURCES = $(libhostname_la_SOURCES) \
	$(am__libstubgss_la_SOURCES_DIST) $(chkdecimalpoint_SOURCES) \
	$(chkhostname_SOURCES) $(lib1156_SOURCES) $(lib1500_SOURCES) \
	$(lib1501_SOURCES) $(lib1502_SOURCES) $(lib1503_SOURCES) \
	$(lib1504_SOURCES) $(lib1505_SOURCES) $(lib1506_SOURCES) \
	$(lib1507_SOURCES) $(lib1508_SOURCES) $(lib1509_SOURCES) \
	$(lib1510_SOURCES) $(lib1511_SOURCES) $(lib1512_SOURCES) \
	$(lib1513_SOURCES) $(lib1514_SOURCES) $(lib1515_SOURCES) \
	$(lib1517_SOURCES) $(lib1518_SOURCES) $(lib1520_SOURCES) \
	$(lib1522_SOURCES) $(lib1523_SOURCES) $(lib1525_SOURCES) \
	$(lib1526_SOURCES) $(lib1527_SOURCES) $(lib1528_SOURCES) \
	$(lib1529_SOURCES) $(lib1530_SOURCES) $(lib1531_SOURCES) \
	$(lib1532_SOURCES) $(lib1533_SOURCES) $(lib1534_SOURCES) \
	$(lib1535_SOURCES) $(lib1536_SOURCES) $(lib1537_SOURCES) \
	$(lib1538_SOURCES) $(lib1540_SOURCES) $(lib1541_SOURCES) \
	$(lib1550_SOURCES) $(lib1551_SOURCES) $(lib1552_SOURCES) \
	$(lib1553_SOURCES) $(lib1554_SOURCES) $(lib1555_SOURCES) \
	$(lib1556_SOURCES) $(lib1557_SOURCES) $(lib1558_SOURCES) \
	$(lib1559_SOURCES) $(lib1560_SOURCES) $(lib1591_SOURCES) \
	$(lib1592_SOURCES) $(lib1593_SOURCES) $(lib1900_SOURCES) \
	$(lib1905_SOURCES) $(lib1906_SOURCES) $(lib2033_SOURCES) \
	$(lib500_SOURCES) $(lib501_SOURCES) $(lib502_SOURCES) \
	$(lib503_SOURCES) $(lib504_SOURCES) $(lib505_SOURCES) \
	$(lib506_SOURCES) $(lib507_SOURCES) $(lib508_SOURCES) \
	$(lib509_SOURCES) $(lib510_SOURCES) $(lib511_SOURCES) \
	$(lib512_SOURCES) $(lib513_SOURCES) $(lib514_SOURCES) \
	$(lib515_SOURCES) $(lib516_SOURCES) $(lib517_SOURCES) \
	$(lib518_SOURCES) $(lib519_SOURCES) $(lib520_SOURCES) \
	$(lib521_SOURCES) $(lib523_SOURCES) $(lib524_SOURCES) \
	$(lib525_SOURCES) $(lib526_SOURCES) $(lib527_SOURCES) \
	$(lib529_SOURCES) $(lib530_SOURCES) $(lib532_SOURCES) \
	$(lib533_SOURCES) $(lib537_SOURCES) $(lib539_SOURCES) \
	$(lib540_SOURCES) $(lib541_SOURCES) $(lib542_SOURCES) \
	$(lib543_SOURCES) $(lib544_SOURCES) $(lib545_SOURCES) \
	$(lib547_SOURCES) $(lib548_SOURCES) $(lib549_SOURCES) \
	$(lib552_SOURCES) $(lib553_SOURCES) $(lib554_SOURCES) \
	$(lib555_SOURCES) $(lib556_SOURCES) $(lib557_SOURCES) \
	$(lib558_SOURCES) $(lib559_SOURCES) $(lib560_SOURCES) \
	$(lib562_SOURCES) $(lib564_SOURCES) $(lib565_SOURCES) \
	$(lib566_SOURCES) $(lib567_SOURCES) $(lib568_SOURCES) \
	$(lib569_SOURCES) $(lib570_SOURCES) $(lib571_SOURCES) \
	$(lib572_SOURCES) $(lib573_SOURCES) $(lib574_SOURCES) \
	$(lib575_SOURCES) $(lib576_SOURCES) $(lib578_SOURCES) \
	$(lib579_SOURCES) $(lib582_SOURCES) $(lib583_SOURCES) \
	$(lib585_SOURCES) $(lib586_SOURCES) $(lib587_SOURCES) \
	$(lib589_SOURCES) $(lib590_SOURCES) $(lib591_SOURCES) \
	$(lib597_SOURCES) $(lib598_SOURCES) $(lib599_SOURCES) \
	$(lib643_SOURCES) $(lib644_SOURCES) $(lib645_SOURCES) \
	$(lib650_SOURCES) $(lib651_SOURCES) $(lib652_SOURCES) \
	$(lib653_SOURCES) $(lib654_SOURCES) $(lib655_SOURCES) \
	$(lib658_SOURCES) $(lib659_SOURCES) $(libauthretry_SOURCES) \
	$(libntlmconnect_SOURCES)
am__can_run_installinfo = \
  case $$AM_UPDATE_INFO_DIR in \
    n|no|NO) false;; \
    *) (install-info --version) >/dev/null 2>&1;; \
  esac
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







1513
1514
1515
1516
1517
1518
1519




















































1520
1521
1522
1523
1524
1525
1526
	$(lib590_SOURCES) $(lib591_SOURCES) $(lib597_SOURCES) \
	$(lib598_SOURCES) $(lib599_SOURCES) $(lib643_SOURCES) \
	$(lib644_SOURCES) $(lib645_SOURCES) $(lib650_SOURCES) \
	$(lib651_SOURCES) $(lib652_SOURCES) $(lib653_SOURCES) \
	$(lib654_SOURCES) $(lib655_SOURCES) $(lib658_SOURCES) \
	$(lib659_SOURCES) $(libauthretry_SOURCES) \
	$(libntlmconnect_SOURCES)




















































am__can_run_installinfo = \
  case $$AM_UPDATE_INFO_DIR in \
    n|no|NO) false;; \
    *) (install-info --version) >/dev/null 2>&1;; \
  esac
am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
# Read a list of newline-separated strings from the standard input,
1659
1660
1661
1662
1663
1664
1665



1666
1667

1668
1669
1670
1671
1672
1673
1674
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
2154
2155
2156
2157
2158
2159
2160





2161
2162
2163
2164
2165
2166
2167
lib1591_LDADD = $(TESTUTIL_LIBS)
lib1591_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1591
lib1592_SOURCES = lib1592.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1592_LDADD = $(TESTUTIL_LIBS)
lib1592_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1592
lib1593_SOURCES = lib1593.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1593_LDADD = $(TESTUTIL_LIBS)





lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS)
lib1905_SOURCES = lib1905.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1905_LDADD = $(TESTUTIL_LIBS)
lib1905_CPPFLAGS = $(AM_CPPFLAGS)
lib1906_SOURCES = lib1906.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)







>
>
>
>
>







2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
lib1591_LDADD = $(TESTUTIL_LIBS)
lib1591_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1591
lib1592_SOURCES = lib1592.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1592_LDADD = $(TESTUTIL_LIBS)
lib1592_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1592
lib1593_SOURCES = lib1593.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1593_LDADD = $(TESTUTIL_LIBS)
lib1594_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1594_LDADD = $(TESTUTIL_LIBS)
lib1596_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1596_LDADD = $(TESTUTIL_LIBS)
lib1596_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1596
lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS)
lib1905_SOURCES = lib1905.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1905_LDADD = $(TESTUTIL_LIBS)
lib1905_CPPFLAGS = $(AM_CPPFLAGS)
lib1906_SOURCES = lib1906.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
2565
2566
2567
2568
2569
2570
2571










2572
2573
2574
2575
2576
2577
2578
lib1592$(EXEEXT): $(lib1592_OBJECTS) $(lib1592_DEPENDENCIES) $(EXTRA_lib1592_DEPENDENCIES) 
	@rm -f lib1592$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(lib1592_OBJECTS) $(lib1592_LDADD) $(LIBS)

lib1593$(EXEEXT): $(lib1593_OBJECTS) $(lib1593_DEPENDENCIES) $(EXTRA_lib1593_DEPENDENCIES) 
	@rm -f lib1593$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(lib1593_OBJECTS) $(lib1593_LDADD) $(LIBS)










../../lib/lib1900-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
	../../lib/$(DEPDIR)/$(am__dirstamp)

lib1900$(EXEEXT): $(lib1900_OBJECTS) $(lib1900_DEPENDENCIES) $(EXTRA_lib1900_DEPENDENCIES) 
	@rm -f lib1900$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(lib1900_OBJECTS) $(lib1900_LDADD) $(LIBS)
../../lib/lib1905-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \







>
>
>
>
>
>
>
>
>
>







2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
lib1592$(EXEEXT): $(lib1592_OBJECTS) $(lib1592_DEPENDENCIES) $(EXTRA_lib1592_DEPENDENCIES) 
	@rm -f lib1592$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(lib1592_OBJECTS) $(lib1592_LDADD) $(LIBS)

lib1593$(EXEEXT): $(lib1593_OBJECTS) $(lib1593_DEPENDENCIES) $(EXTRA_lib1593_DEPENDENCIES) 
	@rm -f lib1593$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(lib1593_OBJECTS) $(lib1593_LDADD) $(LIBS)

lib1594$(EXEEXT): $(lib1594_OBJECTS) $(lib1594_DEPENDENCIES) $(EXTRA_lib1594_DEPENDENCIES) 
	@rm -f lib1594$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(lib1594_OBJECTS) $(lib1594_LDADD) $(LIBS)
../../lib/lib1596-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
	../../lib/$(DEPDIR)/$(am__dirstamp)

lib1596$(EXEEXT): $(lib1596_OBJECTS) $(lib1596_DEPENDENCIES) $(EXTRA_lib1596_DEPENDENCIES) 
	@rm -f lib1596$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(lib1596_OBJECTS) $(lib1596_LDADD) $(LIBS)
../../lib/lib1900-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
	../../lib/$(DEPDIR)/$(am__dirstamp)

lib1900$(EXEEXT): $(lib1900_OBJECTS) $(lib1900_DEPENDENCIES) $(EXTRA_lib1900_DEPENDENCIES) 
	@rm -f lib1900$(EXEEXT)
	$(AM_V_CCLD)$(LINK) $(lib1900_OBJECTS) $(lib1900_LDADD) $(LIBS)
../../lib/lib1905-warnless.$(OBJEXT): ../../lib/$(am__dirstamp) \
3057
3058
3059
3060
3061
3062
3063

3064
3065
3066
3067
3068
3069
3070
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1540-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1541-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1555-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1556-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1557-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1591-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1592-warnless.Po@am__quote@ # am--include-marker

@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1900-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1905-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1906-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib2033-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib502-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib503-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib504-warnless.Po@am__quote@ # am--include-marker







>







3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1540-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1541-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1555-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1556-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1557-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1591-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1592-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1596-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1900-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1905-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib1906-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib2033-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib502-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib503-warnless.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@../../lib/$(DEPDIR)/lib504-warnless.Po@am__quote@ # am--include-marker
3235
3236
3237
3238
3239
3240
3241




3242
3243
3244
3245
3246
3247
3248
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1591-first.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1591-lib1591.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1591-testutil.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1592-first.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1592-lib1592.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1592-testutil.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1593.Po@am__quote@ # am--include-marker




@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-first.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-lib1900.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-testutil.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1905-first.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1905-lib1905.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1905-testutil.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1906-first.Po@am__quote@ # am--include-marker







>
>
>
>







3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1591-first.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1591-lib1591.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1591-testutil.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1592-first.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1592-lib1592.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1592-testutil.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1593.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1594.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1596-first.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1596-lib1594.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1596-testutil.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-first.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-lib1900.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1900-testutil.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1905-first.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1905-lib1905.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1905-testutil.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lib1906-first.Po@am__quote@ # am--include-marker
6025
6026
6027
6028
6029
6030
6031
























































6032
6033
6034
6035
6036
6037
6038
../../lib/lib1592-warnless.obj: ../../lib/warnless.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1592-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1592-warnless.Tpo -c -o ../../lib/lib1592-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1592-warnless.Tpo ../../lib/$(DEPDIR)/lib1592-warnless.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1592-warnless.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1592-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`

























































lib1900-lib1900.o: lib1900.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1900-lib1900.o -MD -MP -MF $(DEPDIR)/lib1900-lib1900.Tpo -c -o lib1900-lib1900.o `test -f 'lib1900.c' || echo '$(srcdir)/'`lib1900.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1900-lib1900.Tpo $(DEPDIR)/lib1900-lib1900.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1900.c' object='lib1900-lib1900.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1900-lib1900.o `test -f 'lib1900.c' || echo '$(srcdir)/'`lib1900.c








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







6065
6066
6067
6068
6069
6070
6071
6072
6073
6074
6075
6076
6077
6078
6079
6080
6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
../../lib/lib1592-warnless.obj: ../../lib/warnless.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1592-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1592-warnless.Tpo -c -o ../../lib/lib1592-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1592-warnless.Tpo ../../lib/$(DEPDIR)/lib1592-warnless.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1592-warnless.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1592_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1592-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`

lib1596-lib1594.o: lib1594.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-lib1594.o -MD -MP -MF $(DEPDIR)/lib1596-lib1594.Tpo -c -o lib1596-lib1594.o `test -f 'lib1594.c' || echo '$(srcdir)/'`lib1594.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-lib1594.Tpo $(DEPDIR)/lib1596-lib1594.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1594.c' object='lib1596-lib1594.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-lib1594.o `test -f 'lib1594.c' || echo '$(srcdir)/'`lib1594.c

lib1596-lib1594.obj: lib1594.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-lib1594.obj -MD -MP -MF $(DEPDIR)/lib1596-lib1594.Tpo -c -o lib1596-lib1594.obj `if test -f 'lib1594.c'; then $(CYGPATH_W) 'lib1594.c'; else $(CYGPATH_W) '$(srcdir)/lib1594.c'; fi`
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-lib1594.Tpo $(DEPDIR)/lib1596-lib1594.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1594.c' object='lib1596-lib1594.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-lib1594.obj `if test -f 'lib1594.c'; then $(CYGPATH_W) 'lib1594.c'; else $(CYGPATH_W) '$(srcdir)/lib1594.c'; fi`

lib1596-first.o: first.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-first.o -MD -MP -MF $(DEPDIR)/lib1596-first.Tpo -c -o lib1596-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-first.Tpo $(DEPDIR)/lib1596-first.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1596-first.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-first.o `test -f 'first.c' || echo '$(srcdir)/'`first.c

lib1596-first.obj: first.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-first.obj -MD -MP -MF $(DEPDIR)/lib1596-first.Tpo -c -o lib1596-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-first.Tpo $(DEPDIR)/lib1596-first.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='first.c' object='lib1596-first.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-first.obj `if test -f 'first.c'; then $(CYGPATH_W) 'first.c'; else $(CYGPATH_W) '$(srcdir)/first.c'; fi`

lib1596-testutil.o: testutil.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-testutil.o -MD -MP -MF $(DEPDIR)/lib1596-testutil.Tpo -c -o lib1596-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-testutil.Tpo $(DEPDIR)/lib1596-testutil.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1596-testutil.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-testutil.o `test -f 'testutil.c' || echo '$(srcdir)/'`testutil.c

lib1596-testutil.obj: testutil.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1596-testutil.obj -MD -MP -MF $(DEPDIR)/lib1596-testutil.Tpo -c -o lib1596-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1596-testutil.Tpo $(DEPDIR)/lib1596-testutil.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='testutil.c' object='lib1596-testutil.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1596-testutil.obj `if test -f 'testutil.c'; then $(CYGPATH_W) 'testutil.c'; else $(CYGPATH_W) '$(srcdir)/testutil.c'; fi`

../../lib/lib1596-warnless.o: ../../lib/warnless.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1596-warnless.o -MD -MP -MF ../../lib/$(DEPDIR)/lib1596-warnless.Tpo -c -o ../../lib/lib1596-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1596-warnless.Tpo ../../lib/$(DEPDIR)/lib1596-warnless.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1596-warnless.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1596-warnless.o `test -f '../../lib/warnless.c' || echo '$(srcdir)/'`../../lib/warnless.c

../../lib/lib1596-warnless.obj: ../../lib/warnless.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ../../lib/lib1596-warnless.obj -MD -MP -MF ../../lib/$(DEPDIR)/lib1596-warnless.Tpo -c -o ../../lib/lib1596-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ../../lib/$(DEPDIR)/lib1596-warnless.Tpo ../../lib/$(DEPDIR)/lib1596-warnless.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='../../lib/warnless.c' object='../../lib/lib1596-warnless.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1596_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ../../lib/lib1596-warnless.obj `if test -f '../../lib/warnless.c'; then $(CYGPATH_W) '../../lib/warnless.c'; else $(CYGPATH_W) '$(srcdir)/../../lib/warnless.c'; fi`

lib1900-lib1900.o: lib1900.c
@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT lib1900-lib1900.o -MD -MP -MF $(DEPDIR)/lib1900-lib1900.Tpo -c -o lib1900-lib1900.o `test -f 'lib1900.c' || echo '$(srcdir)/'`lib1900.c
@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/lib1900-lib1900.Tpo $(DEPDIR)/lib1900-lib1900.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='lib1900.c' object='lib1900-lib1900.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(lib1900_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o lib1900-lib1900.o `test -f 'lib1900.c' || echo '$(srcdir)/'`lib1900.c

9756
9757
9758
9759
9760
9761
9762

9763
9764
9765
9766
9767
9768
9769
	-rm -f ../../lib/$(DEPDIR)/lib1540-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1541-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1555-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1556-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1557-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1591-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1592-warnless.Po

	-rm -f ../../lib/$(DEPDIR)/lib1900-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1905-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1906-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib2033-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib502-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib503-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib504-warnless.Po







>







9852
9853
9854
9855
9856
9857
9858
9859
9860
9861
9862
9863
9864
9865
9866
	-rm -f ../../lib/$(DEPDIR)/lib1540-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1541-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1555-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1556-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1557-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1591-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1592-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1596-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1900-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1905-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1906-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib2033-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib502-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib503-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib504-warnless.Po
9934
9935
9936
9937
9938
9939
9940




9941
9942
9943
9944
9945
9946
9947
	-rm -f ./$(DEPDIR)/lib1591-first.Po
	-rm -f ./$(DEPDIR)/lib1591-lib1591.Po
	-rm -f ./$(DEPDIR)/lib1591-testutil.Po
	-rm -f ./$(DEPDIR)/lib1592-first.Po
	-rm -f ./$(DEPDIR)/lib1592-lib1592.Po
	-rm -f ./$(DEPDIR)/lib1592-testutil.Po
	-rm -f ./$(DEPDIR)/lib1593.Po




	-rm -f ./$(DEPDIR)/lib1900-first.Po
	-rm -f ./$(DEPDIR)/lib1900-lib1900.Po
	-rm -f ./$(DEPDIR)/lib1900-testutil.Po
	-rm -f ./$(DEPDIR)/lib1905-first.Po
	-rm -f ./$(DEPDIR)/lib1905-lib1905.Po
	-rm -f ./$(DEPDIR)/lib1905-testutil.Po
	-rm -f ./$(DEPDIR)/lib1906-first.Po







>
>
>
>







10031
10032
10033
10034
10035
10036
10037
10038
10039
10040
10041
10042
10043
10044
10045
10046
10047
10048
	-rm -f ./$(DEPDIR)/lib1591-first.Po
	-rm -f ./$(DEPDIR)/lib1591-lib1591.Po
	-rm -f ./$(DEPDIR)/lib1591-testutil.Po
	-rm -f ./$(DEPDIR)/lib1592-first.Po
	-rm -f ./$(DEPDIR)/lib1592-lib1592.Po
	-rm -f ./$(DEPDIR)/lib1592-testutil.Po
	-rm -f ./$(DEPDIR)/lib1593.Po
	-rm -f ./$(DEPDIR)/lib1594.Po
	-rm -f ./$(DEPDIR)/lib1596-first.Po
	-rm -f ./$(DEPDIR)/lib1596-lib1594.Po
	-rm -f ./$(DEPDIR)/lib1596-testutil.Po
	-rm -f ./$(DEPDIR)/lib1900-first.Po
	-rm -f ./$(DEPDIR)/lib1900-lib1900.Po
	-rm -f ./$(DEPDIR)/lib1900-testutil.Po
	-rm -f ./$(DEPDIR)/lib1905-first.Po
	-rm -f ./$(DEPDIR)/lib1905-lib1905.Po
	-rm -f ./$(DEPDIR)/lib1905-testutil.Po
	-rm -f ./$(DEPDIR)/lib1906-first.Po
10244
10245
10246
10247
10248
10249
10250

10251
10252
10253
10254
10255
10256
10257
	-rm -f ../../lib/$(DEPDIR)/lib1540-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1541-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1555-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1556-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1557-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1591-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1592-warnless.Po

	-rm -f ../../lib/$(DEPDIR)/lib1900-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1905-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1906-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib2033-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib502-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib503-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib504-warnless.Po







>







10345
10346
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
	-rm -f ../../lib/$(DEPDIR)/lib1540-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1541-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1555-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1556-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1557-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1591-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1592-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1596-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1900-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1905-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib1906-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib2033-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib502-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib503-warnless.Po
	-rm -f ../../lib/$(DEPDIR)/lib504-warnless.Po
10422
10423
10424
10425
10426
10427
10428




10429
10430
10431
10432
10433
10434
10435
	-rm -f ./$(DEPDIR)/lib1591-first.Po
	-rm -f ./$(DEPDIR)/lib1591-lib1591.Po
	-rm -f ./$(DEPDIR)/lib1591-testutil.Po
	-rm -f ./$(DEPDIR)/lib1592-first.Po
	-rm -f ./$(DEPDIR)/lib1592-lib1592.Po
	-rm -f ./$(DEPDIR)/lib1592-testutil.Po
	-rm -f ./$(DEPDIR)/lib1593.Po




	-rm -f ./$(DEPDIR)/lib1900-first.Po
	-rm -f ./$(DEPDIR)/lib1900-lib1900.Po
	-rm -f ./$(DEPDIR)/lib1900-testutil.Po
	-rm -f ./$(DEPDIR)/lib1905-first.Po
	-rm -f ./$(DEPDIR)/lib1905-lib1905.Po
	-rm -f ./$(DEPDIR)/lib1905-testutil.Po
	-rm -f ./$(DEPDIR)/lib1906-first.Po







>
>
>
>







10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
10536
10537
10538
10539
10540
10541
	-rm -f ./$(DEPDIR)/lib1591-first.Po
	-rm -f ./$(DEPDIR)/lib1591-lib1591.Po
	-rm -f ./$(DEPDIR)/lib1591-testutil.Po
	-rm -f ./$(DEPDIR)/lib1592-first.Po
	-rm -f ./$(DEPDIR)/lib1592-lib1592.Po
	-rm -f ./$(DEPDIR)/lib1592-testutil.Po
	-rm -f ./$(DEPDIR)/lib1593.Po
	-rm -f ./$(DEPDIR)/lib1594.Po
	-rm -f ./$(DEPDIR)/lib1596-first.Po
	-rm -f ./$(DEPDIR)/lib1596-lib1594.Po
	-rm -f ./$(DEPDIR)/lib1596-testutil.Po
	-rm -f ./$(DEPDIR)/lib1900-first.Po
	-rm -f ./$(DEPDIR)/lib1900-lib1900.Po
	-rm -f ./$(DEPDIR)/lib1900-testutil.Po
	-rm -f ./$(DEPDIR)/lib1905-first.Po
	-rm -f ./$(DEPDIR)/lib1905-lib1905.Po
	-rm -f ./$(DEPDIR)/lib1905-testutil.Po
	-rm -f ./$(DEPDIR)/lib1906-first.Po
Changes to jni/curl/tests/libtest/Makefile.inc.
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515         lib1517 \
 lib1518         lib1520 lib1521 lib1522 lib1523 \
 lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 lib1533 \
 lib1534 lib1535 lib1536 lib1537 lib1538 \
 lib1540 lib1541 \
 lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \
 lib1558 lib1559 lib1560 \
 lib1591 lib1592 lib1593 \
 lib1900 lib1905 lib1906 \
 lib2033

chkdecimalpoint_SOURCES = chkdecimalpoint.c ../../lib/mprintf.c \
 ../../lib/curl_ctype.c
chkdecimalpoint_LDADD =
chkdecimalpoint_CPPFLAGS = $(AM_CPPFLAGS) -DCURL_STATICLIB \







|







28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515         lib1517 \
 lib1518         lib1520 lib1521 lib1522 lib1523 \
 lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 lib1533 \
 lib1534 lib1535 lib1536 lib1537 lib1538 \
 lib1540 lib1541 \
 lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \
 lib1558 lib1559 lib1560 \
 lib1591 lib1592 lib1593 lib1594 lib1596 \
 lib1900 lib1905 lib1906 \
 lib2033

chkdecimalpoint_SOURCES = chkdecimalpoint.c ../../lib/mprintf.c \
 ../../lib/curl_ctype.c
chkdecimalpoint_LDADD =
chkdecimalpoint_CPPFLAGS = $(AM_CPPFLAGS) -DCURL_STATICLIB \
539
540
541
542
543
544
545







546
547
548
549
550
551
552

lib1592_SOURCES = lib1592.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1592_LDADD = $(TESTUTIL_LIBS)
lib1592_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1592

lib1593_SOURCES = lib1593.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1593_LDADD = $(TESTUTIL_LIBS)








lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS)

lib1905_SOURCES = lib1905.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1905_LDADD = $(TESTUTIL_LIBS)







>
>
>
>
>
>
>







539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559

lib1592_SOURCES = lib1592.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1592_LDADD = $(TESTUTIL_LIBS)
lib1592_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1592

lib1593_SOURCES = lib1593.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1593_LDADD = $(TESTUTIL_LIBS)

lib1594_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1594_LDADD = $(TESTUTIL_LIBS)

lib1596_SOURCES = lib1594.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1596_LDADD = $(TESTUTIL_LIBS)
lib1596_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1596

lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS)

lib1905_SOURCES = lib1905.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1905_LDADD = $(TESTUTIL_LIBS)
Changes to jni/curl/tests/libtest/first.c.
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
    /* use the value as file name */
    char fname[CURL_MT_LOGFNAME_BUFSIZE];
    if(strlen(env) >= CURL_MT_LOGFNAME_BUFSIZE)
      env[CURL_MT_LOGFNAME_BUFSIZE-1] = '\0';
    strcpy(fname, env);
    curl_free(env);
    curl_dbg_memdebug(fname);
    /* this weird stuff here is to make curl_free() get called
       before curl_memdebug() as otherwise memory tracking will
       log a free() without an alloc! */
  }
  /* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */
  env = curl_getenv("CURL_MEMLIMIT");
  if(env) {
    char *endptr;
    long num = strtol(env, &endptr, 10);
    if((endptr != env) && (endptr == env + strlen(env)) && (num > 0))







|
|
|







93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
    /* use the value as file name */
    char fname[CURL_MT_LOGFNAME_BUFSIZE];
    if(strlen(env) >= CURL_MT_LOGFNAME_BUFSIZE)
      env[CURL_MT_LOGFNAME_BUFSIZE-1] = '\0';
    strcpy(fname, env);
    curl_free(env);
    curl_dbg_memdebug(fname);
    /* this weird stuff here is to make curl_free() get called before
       curl_dbg_memdebug() as otherwise memory tracking will log a free()
       without an alloc! */
  }
  /* if CURL_MEMLIMIT is set, this enables fail-on-alloc-number-N feature */
  env = curl_getenv("CURL_MEMLIMIT");
  if(env) {
    char *endptr;
    long num = strtol(env, &endptr, 10);
    if((endptr != env) && (endptr == env + strlen(env)) && (num > 0))
Changes to jni/curl/tests/libtest/lib1560.c.
136
137
138
139
140
141
142




143
144
145
146
147
148
149
  {"file://C:\\programs\\foo",
   "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
  {"file:///C:\\programs\\foo",
   "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
#endif




  /* URL without host name */
  {"http://a:b@/x", "",
   CURLU_DEFAULT_SCHEME, 0, CURLUE_NO_HOST},
  {"boing:80",
   "https | [11] | [12] | [13] | boing | 80 | / | [16] | [17]",
   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
  {"http://[fd00:a41::50]:8080",







>
>
>
>







136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
  {"file://C:\\programs\\foo",
   "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
  {"file:///C:\\programs\\foo",
   "file | [11] | [12] | [13] | [14] | [15] | C:\\programs\\foo | [16] | [17]",
   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
#endif
  {"http://[ab.be:1]/x", "",
   CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
  {"http://[ab.be]/x", "",
   CURLU_DEFAULT_SCHEME, 0, CURLUE_MALFORMED_INPUT},
  /* URL without host name */
  {"http://a:b@/x", "",
   CURLU_DEFAULT_SCHEME, 0, CURLUE_NO_HOST},
  {"boing:80",
   "https | [11] | [12] | [13] | boing | 80 | / | [16] | [17]",
   CURLU_DEFAULT_SCHEME, 0, CURLUE_OK},
  {"http://[fd00:a41::50]:8080",
Added jni/curl/tests/libtest/lib1594.c.




































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at https://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/

/* Testing Retry-After header parser */

#include "test.h"

#include "memdebug.h"

int test(char *URL)
{
  struct curl_slist *header = NULL;
  curl_off_t retry;
  CURL *curl = NULL;
  int res = 0;

  global_init(CURL_GLOBAL_ALL);

  easy_init(curl);

  easy_setopt(curl, CURLOPT_URL, URL);

  res = curl_easy_perform(curl);
  if(res)
    goto test_cleanup;

  res = curl_easy_getinfo(curl, CURLINFO_RETRY_AFTER, &retry);
  if(res)
    goto test_cleanup;

#ifdef LIB1596
  /* we get a relative number of seconds, so add the number of seconds
     we're at to make it a somewhat stable number. Then remove accuracy. */
  retry += time(NULL);
  retry /= 10000;
#endif
  printf("Retry-After: %" CURL_FORMAT_CURL_OFF_T "\n", retry);

test_cleanup:

  /* always cleanup */
  curl_easy_cleanup(curl);
  curl_slist_free_all(header);
  curl_global_cleanup();

  return res;
}
Changes to jni/curl/tests/runtests.1.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH runtests.pl 1 "May 05, 2017" "Curl 7.65.3" "runtests"

.SH NAME
runtests.pl \- run one or more test cases
.SH SYNOPSIS
.B runtests.pl [options] [test number] [!test number] [key word] [!key word]
.SH DESCRIPTION
\fIruntests.pl\fP runs one, several or all the existing test cases in curl's







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH runtests.pl 1 "May 05, 2017" "Curl 7.66.0" "runtests"

.SH NAME
runtests.pl \- run one or more test cases
.SH SYNOPSIS
.B runtests.pl [options] [test number] [!test number] [key word] [!key word]
.SH DESCRIPTION
\fIruntests.pl\fP runs one, several or all the existing test cases in curl's
Changes to jni/curl/tests/server/Makefile.in.
531
532
533
534
535
536
537



538
539

540
541
542
543
544
545
546
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
Changes to jni/curl/tests/symbol-scan.pl.
114
115
116
117
118
119
120


121
122
123
124
125
126
127
128
129
130
131
132
133
for my $e (sort @syms) {
    # OBSOLETE - names that are just placeholders for a position where we
    # previously had a name, that is now removed. The OBSOLETE names should
    # never be used for anything.
    #
    # CURL_EXTERN - is a define used for libcurl functions that are external,
    # public. No app or other code should ever use it.


    #
    # *_LAST and *_LASTENTRY are just prefix for the placeholders used for the
    # last entry in many enum series.
    #

    if($e =~ /(OBSOLETE|^CURL_EXTERN|_LAST\z|_LASTENTRY\z)/) {
        $ignored++;
        next;
    }
    if($doc{$e}) {
        if($verbose) {
            print $e."\n";
        }







>
>





|







114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
for my $e (sort @syms) {
    # OBSOLETE - names that are just placeholders for a position where we
    # previously had a name, that is now removed. The OBSOLETE names should
    # never be used for anything.
    #
    # CURL_EXTERN - is a define used for libcurl functions that are external,
    # public. No app or other code should ever use it.
    #
    # CURLINC_ - defines for header dual-include prevention, ignore those.
    #
    # *_LAST and *_LASTENTRY are just prefix for the placeholders used for the
    # last entry in many enum series.
    #

    if($e =~ /(OBSOLETE|^CURL_EXTERN|^CURLINC_|_LAST\z|_LASTENTRY\z)/) {
        $ignored++;
        next;
    }
    if($doc{$e}) {
        if($verbose) {
            print $e."\n";
        }
Changes to jni/curl/tests/testcurl.1.
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH testcurl.pl 1 "October 22, 2016" "Curl 7.65.3" "testcurl"

.SH NAME
testcurl.pl \- (automatically) test curl
.SH SYNOPSIS
.B testcurl.pl [options] [dir] > output
.SH DESCRIPTION
\fItestcurl.pl\fP is the master script to use for automatic testing of curl







|







16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
.\" * furnished to do so, under the terms of the COPYING file.
.\" *
.\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
.\" * KIND, either express or implied.
.\" *
.\" **************************************************************************
.\"
.TH testcurl.pl 1 "October 22, 2016" "Curl 7.66.0" "testcurl"

.SH NAME
testcurl.pl \- (automatically) test curl
.SH SYNOPSIS
.B testcurl.pl [options] [dir] > output
.SH DESCRIPTION
\fItestcurl.pl\fP is the master script to use for automatic testing of curl
Changes to jni/curl/tests/unit/Makefile.in.
624
625
626
627
628
629
630



631
632

633
634
635
636
637
638
639
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@



USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@

USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@







>
>
>


>







624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
USE_GNUTLS_NETTLE = @USE_GNUTLS_NETTLE@
USE_LIBRTMP = @USE_LIBRTMP@
USE_LIBSSH = @USE_LIBSSH@
USE_LIBSSH2 = @USE_LIBSSH2@
USE_MBEDTLS = @USE_MBEDTLS@
USE_MESALINK = @USE_MESALINK@
USE_NGHTTP2 = @USE_NGHTTP2@
USE_NGHTTP3 = @USE_NGHTTP3@
USE_NGTCP2 = @USE_NGTCP2@
USE_NGTCP2_CRYPTO_OPENSSL = @USE_NGTCP2_CRYPTO_OPENSSL@
USE_NSS = @USE_NSS@
USE_OPENLDAP = @USE_OPENLDAP@
USE_QUICHE = @USE_QUICHE@
USE_SCHANNEL = @USE_SCHANNEL@
USE_SECTRANSP = @USE_SECTRANSP@
USE_UNIX_SOCKETS = @USE_UNIX_SOCKETS@
USE_WINDOWS_SSPI = @USE_WINDOWS_SSPI@
USE_WOLFSSL = @USE_WOLFSSL@
VERSION = @VERSION@
VERSIONNUM = @VERSIONNUM@
Changes to jni/curl/tests/unit/unit1607.c.
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 ***************************************************************************/
#include "curlcheck.h"

#include "urldata.h"
#include "connect.h"
#include "share.h"

/* retrieves ip address and port from a sockaddr structure.
   note it calls Curl_inet_ntop which sets errno on fail, not SOCKERRNO. */
bool getaddressinfo(struct sockaddr *sa, char *addr, long *port);

#include "memdebug.h" /* LAST include file */

static void unit_stop(void)
{
  curl_global_cleanup();
}








<
<
<
<







21
22
23
24
25
26
27




28
29
30
31
32
33
34
 ***************************************************************************/
#include "curlcheck.h"

#include "urldata.h"
#include "connect.h"
#include "share.h"





#include "memdebug.h" /* LAST include file */

static void unit_stop(void)
{
  curl_global_cleanup();
}

150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165

      if(!addr && !tests[i].address[j])
        break;

      if(tests[i].address[j] == &skip)
        continue;

      if(addr && !getaddressinfo(addr->ai_addr,
                                 ipaddress, &port)) {
        fprintf(stderr, "%s:%d tests[%d] failed. getaddressinfo failed.\n",
                __FILE__, __LINE__, i);
        problem = true;
        break;
      }

      if(addr && !tests[i].address[j]) {







|
|







146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161

      if(!addr && !tests[i].address[j])
        break;

      if(tests[i].address[j] == &skip)
        continue;

      if(addr && !Curl_addr2string(addr->ai_addr, addr->ai_addrlen,
                                   ipaddress, &port)) {
        fprintf(stderr, "%s:%d tests[%d] failed. getaddressinfo failed.\n",
                __FILE__, __LINE__, i);
        problem = true;
        break;
      }

      if(addr && !tests[i].address[j]) {
Changes to jni/curl/tests/unit/unit1609.c.
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 ***************************************************************************/
#include "curlcheck.h"

#include "urldata.h"
#include "connect.h"
#include "share.h"

/* retrieves ip address and port from a sockaddr structure.
   note it calls Curl_inet_ntop which sets errno on fail, not SOCKERRNO. */
bool getaddressinfo(struct sockaddr *sa, char *addr, long *port);

#include "memdebug.h" /* LAST include file */

static void unit_stop(void)
{
  curl_global_cleanup();
}








<
<
<
<







21
22
23
24
25
26
27




28
29
30
31
32
33
34
 ***************************************************************************/
#include "curlcheck.h"

#include "urldata.h"
#include "connect.h"
#include "share.h"





#include "memdebug.h" /* LAST include file */

static void unit_stop(void)
{
  curl_global_cleanup();
}

150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
    for(j = 0; j < addressnum; ++j) {
      long port = 0;
      char ipaddress[MAX_IPADR_LEN] = {0};

      if(!addr && !tests[i].address[j])
        break;

      if(addr && !getaddressinfo(addr->ai_addr,
                                 ipaddress, &port)) {
        fprintf(stderr, "%s:%d tests[%d] failed. getaddressinfo failed.\n",
                __FILE__, __LINE__, i);
        problem = true;
        break;
      }

      if(addr && !tests[i].address[j]) {
        fprintf(stderr, "%s:%d tests[%d] failed. the retrieved addr "







|
|
|







146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
    for(j = 0; j < addressnum; ++j) {
      long port = 0;
      char ipaddress[MAX_IPADR_LEN] = {0};

      if(!addr && !tests[i].address[j])
        break;

      if(addr && !Curl_addr2string(addr->ai_addr, addr->ai_addrlen,
                                   ipaddress, &port)) {
        fprintf(stderr, "%s:%d tests[%d] failed. Curl_addr2string failed.\n",
                __FILE__, __LINE__, i);
        problem = true;
        break;
      }

      if(addr && !tests[i].address[j]) {
        fprintf(stderr, "%s:%d tests[%d] failed. the retrieved addr "
Changes to jni/curl/tests/unit/unit1654.c.
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    fprintf(stderr, "Curl_altsvc_parse(3) failed!\n");
    unitfail++;
  }
  /* that one should make two entries */
  fail_unless(asi->num == 8, "wrong number of entries");

  result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:443\"; ma = 120;",
                             ALPN_h2c, "example.org", 80);
  if(result) {
    fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
    unitfail++;
  }
  fail_unless(asi->num == 9, "wrong number of entries");

  result = Curl_altsvc_parse(curl, asi,







|







86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    fprintf(stderr, "Curl_altsvc_parse(3) failed!\n");
    unitfail++;
  }
  /* that one should make two entries */
  fail_unless(asi->num == 8, "wrong number of entries");

  result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:443\"; ma = 120;",
                             ALPN_h2, "example.org", 80);
  if(result) {
    fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
    unitfail++;
  }
  fail_unless(asi->num == 9, "wrong number of entries");

  result = Curl_altsvc_parse(curl, asi,
Changes to jni/curl/winbuild/MakefileBuild.vc.
555
556
557
558
559
560
561

562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578



579
580
581
582
583
584
585
	@if not exist "$(DIRDIST)\include\curl" mkdir $(DIRDIST)\include\curl
	@if not exist "$(DIRDIST)\lib" mkdir $(DIRDIST)\lib

$(LIB_DIROBJ):
	@if not exist "$(LIB_DIROBJ)" mkdir $(LIB_DIROBJ)
	@if not exist "$(LIB_DIROBJ)\vauth" mkdir $(LIB_DIROBJ)\vauth
	@if not exist "$(LIB_DIROBJ)\vtls" mkdir $(LIB_DIROBJ)\vtls


$(CURL_DIROBJ):
	@if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ)
# we need a lib dir for the portability functions from libcurl
# we use the .c directly here
	@if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ)\lib

.SUFFIXES: .c .obj .res

{$(LIBCURL_SRC_DIR)\}.c{$(LIB_DIROBJ)\}.obj:
	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<

{$(LIBCURL_SRC_DIR)\vauth\}.c{$(LIB_DIROBJ)\vauth\}.obj:
	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<

{$(LIBCURL_SRC_DIR)\vtls\}.c{$(LIB_DIROBJ)\vtls\}.obj:
	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<




$(LIB_DIROBJ)\libcurl.res: $(LIBCURL_SRC_DIR)\libcurl.rc
	$(RC) $(RC_FLAGS)

#
# curl.exe
#







>

















>
>
>







555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
	@if not exist "$(DIRDIST)\include\curl" mkdir $(DIRDIST)\include\curl
	@if not exist "$(DIRDIST)\lib" mkdir $(DIRDIST)\lib

$(LIB_DIROBJ):
	@if not exist "$(LIB_DIROBJ)" mkdir $(LIB_DIROBJ)
	@if not exist "$(LIB_DIROBJ)\vauth" mkdir $(LIB_DIROBJ)\vauth
	@if not exist "$(LIB_DIROBJ)\vtls" mkdir $(LIB_DIROBJ)\vtls
	@if not exist "$(LIB_DIROBJ)\vquic" mkdir $(LIB_DIROBJ)\vquic

$(CURL_DIROBJ):
	@if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ)
# we need a lib dir for the portability functions from libcurl
# we use the .c directly here
	@if not exist "$(CURL_DIROBJ)" mkdir $(CURL_DIROBJ)\lib

.SUFFIXES: .c .obj .res

{$(LIBCURL_SRC_DIR)\}.c{$(LIB_DIROBJ)\}.obj:
	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<

{$(LIBCURL_SRC_DIR)\vauth\}.c{$(LIB_DIROBJ)\vauth\}.obj:
	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<

{$(LIBCURL_SRC_DIR)\vtls\}.c{$(LIB_DIROBJ)\vtls\}.obj:
	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<

{$(LIBCURL_SRC_DIR)\vquic\}.c{$(LIB_DIROBJ)\vquic\}.obj:
	$(CURL_CC) $(CFLAGS) /Fo"$@"  $<

$(LIB_DIROBJ)\libcurl.res: $(LIBCURL_SRC_DIR)\libcurl.rc
	$(RC) $(RC_FLAGS)

#
# curl.exe
#
Changes to jni/sdl2tk/library/ttk/spinbox.tcl.
77
78
79
80
81
82
83

84
85
86
87
88
89
90
}

## MouseWheel --
#	Mousewheel callback.  Turn these into <<Increment>> (-1, up)
# 	or <<Decrement> (+1, down) events.
#
proc ttk::spinbox::MouseWheel {w dir} {

    if {$dir < 0} {
	event generate $w <<Increment>>
    } else {
	event generate $w <<Decrement>>
    }
}








>







77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
}

## MouseWheel --
#	Mousewheel callback.  Turn these into <<Increment>> (-1, up)
# 	or <<Decrement> (+1, down) events.
#
proc ttk::spinbox::MouseWheel {w dir} {
    if {[$w instate disabled]} { return }
    if {$dir < 0} {
	event generate $w <<Increment>>
    } else {
	event generate $w <<Decrement>>
    }
}

128
129
130
131
132
133
134

135
136
137
138
139
140
141
## Spin --
#	Handle <<Increment>> and <<Decrement>> events.
#	If -values is specified, cycle through the list.
#	Otherwise cycle through numeric range based on
#	-from, -to, and -increment.
#
proc ttk::spinbox::Spin {w dir} {

    set nvalues [llength [set values [$w cget -values]]]
    set value [$w get]
    if {$nvalues} {
	set current [lsearch -exact $values $value]
	set index [Adjust $w [expr {$current + $dir}] 0 [expr {$nvalues - 1}]]
	$w set [lindex $values $index]
    } else {







>







129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
## Spin --
#	Handle <<Increment>> and <<Decrement>> events.
#	If -values is specified, cycle through the list.
#	Otherwise cycle through numeric range based on
#	-from, -to, and -increment.
#
proc ttk::spinbox::Spin {w dir} {
    if {[$w instate disabled]} { return }
    set nvalues [llength [set values [$w cget -values]]]
    set value [$w get]
    if {$nvalues} {
	set current [lsearch -exact $values $value]
	set index [Adjust $w [expr {$current + $dir}] 0 [expr {$nvalues - 1}]]
	$w set [lindex $values $index]
    } else {
Changes to jni/sdl2tk/win/makefile.vc.
332
333
334
335
336
337
338



339
340
341
342
343
344
345
#---------------------------------------------------------------------

release:  setup $(TKSTUBLIB) $(WISH)
all:	  release $(CAT32)
core:	  setup $(TKSTUBLIB) $(TKLIB)
cwish:	  $(WISHC)
install:  install-binaries install-libraries install-docs



tktest:	  setup $(TKTEST) $(CAT32)

setup: default-setup

test: test-classic test-ttk

test-classic: setup $(TKTEST) $(TKLIB) $(CAT32)







>
>
>







332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
#---------------------------------------------------------------------

release:  setup $(TKSTUBLIB) $(WISH)
all:	  release $(CAT32)
core:	  setup $(TKSTUBLIB) $(TKLIB)
cwish:	  $(WISHC)
install:  install-binaries install-libraries install-docs
!if $(SYMBOLS)
install:    install-pdbs
!endif
tktest:	  setup $(TKTEST) $(CAT32)

setup: default-setup

test: test-classic test-ttk

test-classic: setup $(TKTEST) $(TKLIB) $(CAT32)
512
513
514
515
516
517
518





519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
install-docs:
!if exist("$(CHMFILE)")
	@echo Installing compiled HTML help
	@$(CPY) "$(CHMFILE)" "$(DOC_INSTALL_DIR)\"
!endif
# "emacs font-lock highlighting fix






#---------------------------------------------------------------------
# Special case object file targets
#---------------------------------------------------------------------

$(TMP_DIR)\testMain.obj: $(WINDIR)\winMain.c
	$(cc32) $(appcflags_nostubs) -DTK_TEST \
	    -DTCL_USE_STATIC_PACKAGES=$(TCL_USE_STATIC_PACKAGES) \
	    -Fo$@ $?

$(TMP_DIR)\tkTest.obj: $(GENERICDIR)\tkTest.c
	$(cc32) $(appcflags_nostubs) -Fo$@ $?

$(TMP_DIR)\tkOldTest.obj: $(GENERICDIR)\tkOldTest.c
	$(cc32) $(appcflags_nostubs) -Fo$@ $?

$(TMP_DIR)\tkWinTest.obj: $(WINDIR)\tkWinTest.c
	$(cc32) $(appcflags_nostubs) -Fo$@ $?

$(TMP_DIR)\tkSquare.obj: $(GENERICDIR)\tkSquare.c
	$(cc32) $(appcflags_nostubs) -Fo$@ $?

$(TMP_DIR)\winMain.obj: $(WINDIR)\winMain.c
	$(cc32) $(appcflags_nostubs) \
	    -DTCL_USE_STATIC_PACKAGES=$(TCL_USE_STATIC_PACKAGES) \
	    -Fo$@ $?

$(TMP_DIR)\tkMain2.obj: $(GENERICDIR)\tkMain.c
	$(cc32) $(pkgcflags) -DTK_ASCII_MAIN -Fo$@ $?

# The following objects are part of the stub library and should not
# be built as DLL objects but none of the symbols should be exported
# and no reference made to a C runtime.

$(TMP_DIR)\tkStubLib.obj : $(GENERICDIR)\tkStubLib.c
	$(cc32) $(stubscflags) -Fo$@ $?


$(TMP_DIR)\wish.exe.manifest: $(WINDIR)\wish.exe.manifest.in
	@nmakehlp -s << $** >$@
@MACHINE@	  $(MACHINE:IX86=X86)
@TK_WIN_VERSION@  $(DOTVERSION).0.0
<<

#---------------------------------------------------------------------
# Generate the source dependencies.  Having dependency rules will
# improve incremental build accuracy without having to resort to a
# full rebuild just because some non-global header file like
# tclCompile.h was changed.  These rules aren't needed when building
# from scratch.
#---------------------------------------------------------------------

depend:
!if !exist($(TCLSH))
	@echo Build tclsh first!
!else
	set TCL_LIBRARY=$(TCL_LIBRARY)
	$(TCLSH) $(TCLTOOLSDIR:\=/)/mkdepend.tcl -vc32 -out:"$(OUT_DIR)\depend.mk" \
		-passthru:"-DBUILD_tk $(TK_INCLUDES)" $(GENERICDIR),$$(GENERICDIR) \
		$(WINDIR),$$(WINDIR) $(TTKDIR),$$(TTKDIR) $(XLIBDIR),$$(XLIBDIR) \
		$(BITMAPDIR),$$(BITMAPDIR) @<<
$(TKOBJS)
<<
!endif

#---------------------------------------------------------------------
# Dependency rules







>
>
>
>
>




|










|





|















|




















|







515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
install-docs:
!if exist("$(CHMFILE)")
	@echo Installing compiled HTML help
	@$(CPY) "$(CHMFILE)" "$(DOC_INSTALL_DIR)\"
!endif
# "emacs font-lock highlighting fix

install-pdbs:
	@echo Installing debug symbols
	@$(CPY) "$(OUT_DIR)\*.pdb" "$(BIN_INSTALL_DIR)\"
# "emacs font-lock highlighting fix

#---------------------------------------------------------------------
# Special case object file targets
#---------------------------------------------------------------------

$(TMP_DIR)\testMain.obj: $(WIN_DIR)\winMain.c
	$(cc32) $(appcflags_nostubs) -DTK_TEST \
	    -DTCL_USE_STATIC_PACKAGES=$(TCL_USE_STATIC_PACKAGES) \
	    -Fo$@ $?

$(TMP_DIR)\tkTest.obj: $(GENERICDIR)\tkTest.c
	$(cc32) $(appcflags_nostubs) -Fo$@ $?

$(TMP_DIR)\tkOldTest.obj: $(GENERICDIR)\tkOldTest.c
	$(cc32) $(appcflags_nostubs) -Fo$@ $?

$(TMP_DIR)\tkWinTest.obj: $(WIN_DIR)\tkWinTest.c
	$(cc32) $(appcflags_nostubs) -Fo$@ $?

$(TMP_DIR)\tkSquare.obj: $(GENERICDIR)\tkSquare.c
	$(cc32) $(appcflags_nostubs) -Fo$@ $?

$(TMP_DIR)\winMain.obj: $(WIN_DIR)\winMain.c
	$(cc32) $(appcflags_nostubs) \
	    -DTCL_USE_STATIC_PACKAGES=$(TCL_USE_STATIC_PACKAGES) \
	    -Fo$@ $?

$(TMP_DIR)\tkMain2.obj: $(GENERICDIR)\tkMain.c
	$(cc32) $(pkgcflags) -DTK_ASCII_MAIN -Fo$@ $?

# The following objects are part of the stub library and should not
# be built as DLL objects but none of the symbols should be exported
# and no reference made to a C runtime.

$(TMP_DIR)\tkStubLib.obj : $(GENERICDIR)\tkStubLib.c
	$(cc32) $(stubscflags) -Fo$@ $?


$(TMP_DIR)\wish.exe.manifest: $(WIN_DIR)\wish.exe.manifest.in
	@nmakehlp -s << $** >$@
@MACHINE@	  $(MACHINE:IX86=X86)
@TK_WIN_VERSION@  $(DOTVERSION).0.0
<<

#---------------------------------------------------------------------
# Generate the source dependencies.  Having dependency rules will
# improve incremental build accuracy without having to resort to a
# full rebuild just because some non-global header file like
# tclCompile.h was changed.  These rules aren't needed when building
# from scratch.
#---------------------------------------------------------------------

depend:
!if !exist($(TCLSH))
	@echo Build tclsh first!
!else
	set TCL_LIBRARY=$(TCL_LIBRARY)
	$(TCLSH) $(TCLTOOLSDIR:\=/)/mkdepend.tcl -vc32 -out:"$(OUT_DIR)\depend.mk" \
		-passthru:"-DBUILD_tk $(TK_INCLUDES)" $(GENERICDIR),$$(GENERICDIR) \
		$(WIN_DIR),$$(WIN_DIR) $(TTKDIR),$$(TTKDIR) $(XLIBDIR),$$(XLIBDIR) \
		$(BITMAPDIR),$$(BITMAPDIR) @<<
$(TKOBJS)
<<
!endif

#---------------------------------------------------------------------
# Dependency rules
Changes to jni/sdl2tk/win/rules.vc.
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
!ifndef _RULES_VC
_RULES_VC = 1

# The following macros define the version of the rules.vc nmake build system
# For modifications that are not backward-compatible, you *must* change
# the major version.
RULES_VERSION_MAJOR = 1
RULES_VERSION_MINOR = 1

# The PROJECT macro must be defined by parent makefile.
!if "$(PROJECT)" == ""
!error *** Error: Macro PROJECT not defined! Please define it before including rules.vc
!endif

!if "$(PRJ_PACKAGE_TCLNAME)" == ""







|







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
!ifndef _RULES_VC
_RULES_VC = 1

# The following macros define the version of the rules.vc nmake build system
# For modifications that are not backward-compatible, you *must* change
# the major version.
RULES_VERSION_MAJOR = 1
RULES_VERSION_MINOR = 4

# The PROJECT macro must be defined by parent makefile.
!if "$(PROJECT)" == ""
!error *** Error: Macro PROJECT not defined! Please define it before including rules.vc
!endif

!if "$(PRJ_PACKAGE_TCLNAME)" == ""
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# some Tcl interfaces that are not publicly exposed.
#
# The fragment will set the following macros:
# ROOT - root of this module sources
# COMPATDIR - source directory that holds compatibility sources
# DOCDIR - source directory containing documentation files
# GENERICDIR - platform-independent source directory
# WINDIR - Windows-specific source directory
# TESTDIR - directory containing test files
# TOOLSDIR - directory containing build tools
# _TCLDIR - root of the Tcl installation OR the Tcl sources. Not set
#    when building Tcl itself.
# _INSTALLDIR - native form of the installation path. For Tcl
#    this will be the root of the Tcl installation. For extensions
#    this will be the lib directory under the root.







|







158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# some Tcl interfaces that are not publicly exposed.
#
# The fragment will set the following macros:
# ROOT - root of this module sources
# COMPATDIR - source directory that holds compatibility sources
# DOCDIR - source directory containing documentation files
# GENERICDIR - platform-independent source directory
# WIN_DIR - Windows-specific source directory
# TESTDIR - directory containing test files
# TOOLSDIR - directory containing build tools
# _TCLDIR - root of the Tcl installation OR the Tcl sources. Not set
#    when building Tcl itself.
# _INSTALLDIR - native form of the installation path. For Tcl
#    this will be the root of the Tcl installation. For extensions
#    this will be the lib directory under the root.
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
!ifndef DEMODIR
!if exist("$(LIBDIR)\demos")
DEMODIR		= $(LIBDIR)\demos
!else
DEMODIR		= $(ROOT)\demos
!endif
!endif # ifndef DEMODIR
# Do NOT enclose WINDIR in a !ifndef because Windows always defines
# WINDIR env var to point to c:\windows!
# TBD - This is a potentially dangerous conflict, rename WINDIR to
# something else
WINDIR		= $(ROOT)\win

!ifndef RCDIR
!if exist("$(WINDIR)\rc")
RCDIR           = $(WINDIR)\rc
!else
RCDIR           = $(WINDIR)
!endif
!endif
RCDIR = $(RCDIR:/=\)

# The target directory where the built packages and binaries will be installed.
# INSTALLDIR is the (optional) path specified by the user.
# _INSTALLDIR is INSTALLDIR using the backslash separator syntax







|
|
<
<
|


|
|

|







211
212
213
214
215
216
217
218
219


220
221
222
223
224
225
226
227
228
229
230
231
232
233
!ifndef DEMODIR
!if exist("$(LIBDIR)\demos")
DEMODIR		= $(LIBDIR)\demos
!else
DEMODIR		= $(ROOT)\demos
!endif
!endif # ifndef DEMODIR
# Do NOT use WINDIR because it is Windows internal environment
# variable to point to c:\windows!


WIN_DIR		= $(ROOT)\win

!ifndef RCDIR
!if exist("$(WIN_DIR)\rc")
RCDIR           = $(WIN_DIR)\rc
!else
RCDIR           = $(WIN_DIR)
!endif
!endif
RCDIR = $(RCDIR:/=\)

# The target directory where the built packages and binaries will be installed.
# INSTALLDIR is the (optional) path specified by the user.
# _INSTALLDIR is INSTALLDIR using the backslash separator syntax
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
*** Warning: This extension requires the source distribution of Tk.^
*** Please set the TKDIR macro to point to the Tk sources.
!error $(MSG)
!endif
!endif


# If INSTALLDIR set to tcl installation root dir then reset to the
# lib dir for installing extensions 
!if exist("$(_INSTALLDIR)\include\tcl.h")
_INSTALLDIR=$(_INSTALLDIR)\lib
!endif

# END Case 2(c) or (d) - Building an extension
!endif # if $(DOING_TCL)








|
|







387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
*** Warning: This extension requires the source distribution of Tk.^
*** Please set the TKDIR macro to point to the Tk sources.
!error $(MSG)
!endif
!endif


# If INSTALLDIR set to Tcl installation root dir then reset to the
# lib dir for installing extensions
!if exist("$(_INSTALLDIR)\include\tcl.h")
_INSTALLDIR=$(_INSTALLDIR)\lib
!endif

# END Case 2(c) or (d) - Building an extension
!endif # if $(DOING_TCL)

470
471
472
473
474
475
476















477
478
479
480
481
482
483
!endif
!if "$(MACHINE)" != "$(ARCH)"
!error Specified MACHINE macro $(MACHINE) does not match detected target architecture $(ARCH).
!endif
!else
MACHINE=$(ARCH)
!endif
















#------------------------------------------------------------
# Figure out the *host* architecture by reading the registry

!if ![reg query HKLM\Hardware\Description\System\CentralProcessor\0 /v Identifier | findstr /i x86]
NATIVE_ARCH=IX86
!else







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
!endif
!if "$(MACHINE)" != "$(ARCH)"
!error Specified MACHINE macro $(MACHINE) does not match detected target architecture $(ARCH).
!endif
!else
MACHINE=$(ARCH)
!endif

#---------------------------------------------------------------
# The PLATFORM_IDENTIFY macro matches the values returned by
# the Tcl platform::identify command
!if "$(MACHINE)" == "AMD64"
PLATFORM_IDENTIFY = win32-x86_64
!else
PLATFORM_IDENTIFY = win32-ix86
!endif

# The MULTIPLATFORM macro controls whether binary extensions are installed
# in platform-specific directories. Intended to be set/used by extensions.
!ifndef MULTIPLATFORM_INSTALL
MULTIPLATFORM_INSTALL = 0
!endif

#------------------------------------------------------------
# Figure out the *host* architecture by reading the registry

!if ![reg query HKLM\Hardware\Description\System\CentralProcessor\0 /v Identifier | findstr /i x86]
NATIVE_ARCH=IX86
!else
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
# 5. Test for compiler features
# Visual C++ compiler options have changed over the years. Check
# which options are supported by the compiler in use.
#
# The following macros are set:
# OPTIMIZATIONS - the compiler flags to be used for optimized builds
# DEBUGFLAGS - the compiler flags to be used for debug builds
# LINKERFLAGS - Flags passed to the linker 
#
# Note that these are the compiler settings *available*, not those
# that will be *used*. The latter depends on the OPTS macro settings
# which we have not yet parsed.
#
# Also note that some of the flags in OPTIMIZATIONS are not really
# related to optimization. They are placed there only for legacy reasons







|







555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
# 5. Test for compiler features
# Visual C++ compiler options have changed over the years. Check
# which options are supported by the compiler in use.
#
# The following macros are set:
# OPTIMIZATIONS - the compiler flags to be used for optimized builds
# DEBUGFLAGS - the compiler flags to be used for debug builds
# LINKERFLAGS - Flags passed to the linker
#
# Note that these are the compiler settings *available*, not those
# that will be *used*. The latter depends on the OPTS macro settings
# which we have not yet parsed.
#
# Also note that some of the flags in OPTIMIZATIONS are not really
# related to optimization. They are placed there only for legacy reasons
667
668
669
670
671
672
673


674
675
676
677
678
679
680
# USE_THREAD_ALLOC - 1 -> Use a shared global free pool for allocation.
#           0 -> Use the non-thread allocator.
# UNCHECKED - 1 -> when doing a debug build with symbols, use the release
#           C runtime, 0 -> use the debug C runtime.
# USE_STUBS - 1 -> compile to use stubs interfaces, 0 -> direct linking
# CONFIG_CHECK - 1 -> check current build configuration against Tcl
#           configuration (ignored for Tcl itself)


# Further, LINKERFLAGS are modified based on above.

# Default values for all the above
STATIC_BUILD	= 0
TCL_THREADS	= 1
DEBUG		= 0
SYMBOLS		= 0







>
>







680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
# USE_THREAD_ALLOC - 1 -> Use a shared global free pool for allocation.
#           0 -> Use the non-thread allocator.
# UNCHECKED - 1 -> when doing a debug build with symbols, use the release
#           C runtime, 0 -> use the debug C runtime.
# USE_STUBS - 1 -> compile to use stubs interfaces, 0 -> direct linking
# CONFIG_CHECK - 1 -> check current build configuration against Tcl
#           configuration (ignored for Tcl itself)
# _USE_64BIT_TIME_T - forces a build using 64-bit time_t for 32-bit build
#           (CRT library should support this)
# Further, LINKERFLAGS are modified based on above.

# Default values for all the above
STATIC_BUILD	= 0
TCL_THREADS	= 1
DEBUG		= 0
SYMBOLS		= 0
728
729
730
731
732
733
734
735
736
737
738
739
740
741







742
743
744
745
746
747
748
TCL_USE_STATIC_PACKAGES	= 1
!else
TCL_USE_STATIC_PACKAGES	= 0
!endif

!if [nmakehlp -f $(OPTS) "nothreads"]
!message *** Compile explicitly for non-threaded tcl
TCL_THREADS	= 0
USE_THREAD_ALLOC= 0
!else
TCL_THREADS	= 1
USE_THREAD_ALLOC= 1
!endif








!if [nmakehlp -f $(OPTS) "symbols"]
!message *** Doing symbols
DEBUG		= 1
!else
DEBUG		= 0
!endif








|






>
>
>
>
>
>
>







743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
TCL_USE_STATIC_PACKAGES	= 1
!else
TCL_USE_STATIC_PACKAGES	= 0
!endif

!if [nmakehlp -f $(OPTS) "nothreads"]
!message *** Compile explicitly for non-threaded tcl
TCL_THREADS = 0
USE_THREAD_ALLOC= 0
!else
TCL_THREADS	= 1
USE_THREAD_ALLOC= 1
!endif

!if [nmakehlp -f $(OPTS) "time64bit"]
!message *** Force 64-bit time_t
_USE_64BIT_TIME_T = 1
!endif

# Yes, it's weird that the "symbols" option controls DEBUG and
# the "pdbs" option controls SYMBOLS. That's historical.
!if [nmakehlp -f $(OPTS) "symbols"]
!message *** Doing symbols
DEBUG		= 1
!else
DEBUG		= 0
!endif

966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
################################################################
# 10. Construct output directory and file paths
# Figure-out how to name our intermediate and output directories.
# In order to avoid inadvertent mixing of object files built using
# different compilers, build configurations etc.,
#
# Naming convention (suffixes):
#   t = full thread support.
#   s = static library (as opposed to an import library)
#   g = linked to the debug enabled C run-time.
#   x = special static build when it links to the dynamic C run-time.
#
# The following macros are set in this section:
# SUFX - the suffix to use for binaries based on above naming convention
# BUILDDIRTOP - the toplevel default output directory







|







988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
################################################################
# 10. Construct output directory and file paths
# Figure-out how to name our intermediate and output directories.
# In order to avoid inadvertent mixing of object files built using
# different compilers, build configurations etc.,
#
# Naming convention (suffixes):
#   t = full thread support. (Not used for Tcl >= 8.7)
#   s = static library (as opposed to an import library)
#   g = linked to the debug enabled C run-time.
#   x = special static build when it links to the dynamic C run-time.
#
# The following macros are set in this section:
# SUFX - the suffix to use for binaries based on above naming convention
# BUILDDIRTOP - the toplevel default output directory
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
EXT	    = lib
!if !$(MSVCRT)
TMP_DIRFULL = $(TMP_DIRFULL:X=)
SUFX	    = $(SUFX:x=)
!endif
!endif

!if !$(TCL_THREADS)
TMP_DIRFULL = $(TMP_DIRFULL:Threaded=)
SUFX	    = $(SUFX:t=)
!endif

!ifndef TMP_DIR
TMP_DIR	    = $(TMP_DIRFULL)
!ifndef OUT_DIR







|







1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
EXT	    = lib
!if !$(MSVCRT)
TMP_DIRFULL = $(TMP_DIRFULL:X=)
SUFX	    = $(SUFX:x=)
!endif
!endif

!if !$(TCL_THREADS) || $(TCL_VERSION) > 86
TMP_DIRFULL = $(TMP_DIRFULL:Threaded=)
SUFX	    = $(SUFX:t=)
!endif

!ifndef TMP_DIR
TMP_DIR	    = $(TMP_DIRFULL)
!ifndef OUT_DIR
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123

# The name of the stubs library for the project being built
STUBPREFIX      = $(PROJECT)stub

# Set up paths to various Tcl executables and libraries needed by extensions
!if $(DOING_TCL)

TCLSHNAME       = $(PROJECT)sh$(TCL_VERSION)$(SUFX).exe
TCLSH		= $(OUT_DIR)\$(TCLSHNAME)
TCLIMPLIB	= $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib
TCLLIBNAME	= $(PROJECT)$(VERSION)$(SUFX).$(EXT)
TCLLIB		= $(OUT_DIR)\$(TCLLIBNAME)

TCLSTUBLIBNAME	= $(STUBPREFIX)$(VERSION).lib
TCLSTUBLIB	= $(OUT_DIR)\$(TCLSTUBLIBNAME)
TCL_INCLUDES    = -I"$(WINDIR)" -I"$(GENERICDIR)"

!else # ! $(DOING_TCL)

!if $(TCLINSTALL) # Building against an installed Tcl

# When building extensions, we need to locate tclsh. Depending on version
# of Tcl we are building against, this may or may not have a "t" suffix.
# Try various possibilities in turn.
TCLSH		= $(_TCLDIR)\bin\tclsh$(TCL_VERSION)$(SUFX).exe
!if !exist("$(TCLSH)") && $(TCL_THREADS)
TCLSH           = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)t$(SUFX).exe
!endif
!if !exist("$(TCLSH)")
TCLSH           = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)$(SUFX:t=).exe
!endif

TCLSTUBLIB	= $(_TCLDIR)\lib\tclstub$(TCL_VERSION).lib
TCLIMPLIB	= $(_TCLDIR)\lib\tcl$(TCL_VERSION)$(SUFX).lib
# When building extensions, may be linking against Tcl that does not add
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.
!if !exist("$(TCLIMPLIB)")
TCLIMPLIB	= $(_TCLDIR)\lib\tcl$(TCL_VERSION)$(SUFX:t=).lib
!endif
TCL_LIBRARY	= $(_TCLDIR)\lib
TCLREGLIB	= $(_TCLDIR)\lib\tclreg13$(SUFX:t=).lib
TCLDDELIB	= $(_TCLDIR)\lib\tcldde14$(SUFX:t=).lib
TCLTOOLSDIR	= \must\have\tcl\sources\to\build\this\target
TCL_INCLUDES    = -I"$(_TCLDIR)\include"

!else # Building against Tcl sources

TCLSH		= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)$(SUFX).exe
!if !exist($(TCLSH)) && $(TCL_THREADS)
TCLSH		= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)t$(SUFX).exe
!endif
!if !exist($(TCLSH))
TCLSH		= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)$(SUFX:t=).exe
!endif
TCLSTUBLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclstub$(TCL_VERSION).lib
TCLIMPLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)$(SUFX).lib
# When building extensions, may be linking against Tcl that does not add
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.
!if !exist("$(TCLIMPLIB)")
TCLIMPLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)$(SUFX:t=).lib
!endif
TCL_LIBRARY	= $(_TCLDIR)\library
TCLREGLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclreg13$(SUFX:t=).lib
TCLDDELIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcldde14$(SUFX:t=).lib
TCLTOOLSDIR	= $(_TCLDIR)\tools
TCL_INCLUDES	= -I"$(_TCLDIR)\generic" -I"$(_TCLDIR)\win"








|







|








|
<
<
<

|



|



|









|
<
<
<

|


|



|







1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103



1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123



1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139

# The name of the stubs library for the project being built
STUBPREFIX      = $(PROJECT)stub

# Set up paths to various Tcl executables and libraries needed by extensions
!if $(DOING_TCL)

TCLSHNAME       = $(PROJECT)sh$(VERSION)$(SUFX).exe
TCLSH		= $(OUT_DIR)\$(TCLSHNAME)
TCLIMPLIB	= $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib
TCLLIBNAME	= $(PROJECT)$(VERSION)$(SUFX).$(EXT)
TCLLIB		= $(OUT_DIR)\$(TCLLIBNAME)

TCLSTUBLIBNAME	= $(STUBPREFIX)$(VERSION).lib
TCLSTUBLIB	= $(OUT_DIR)\$(TCLSTUBLIBNAME)
TCL_INCLUDES    = -I"$(WIN_DIR)" -I"$(GENERICDIR)"

!else # ! $(DOING_TCL)

!if $(TCLINSTALL) # Building against an installed Tcl

# When building extensions, we need to locate tclsh. Depending on version
# of Tcl we are building against, this may or may not have a "t" suffix.
# Try various possibilities in turn.
TCLSH		= $(_TCLDIR)\bin\tclsh$(TCL_VERSION)$(SUFX:t=).exe



!if !exist("$(TCLSH)")
TCLSH           = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)t$(SUFX:t=).exe
!endif

TCLSTUBLIB	= $(_TCLDIR)\lib\tclstub$(TCL_VERSION).lib
TCLIMPLIB	= $(_TCLDIR)\lib\tcl$(TCL_VERSION)$(SUFX:t=).lib
# When building extensions, may be linking against Tcl that does not add
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.
!if !exist("$(TCLIMPLIB)")
TCLIMPLIB	= $(_TCLDIR)\lib\tcl$(TCL_VERSION)t$(SUFX:t=).lib
!endif
TCL_LIBRARY	= $(_TCLDIR)\lib
TCLREGLIB	= $(_TCLDIR)\lib\tclreg13$(SUFX:t=).lib
TCLDDELIB	= $(_TCLDIR)\lib\tcldde14$(SUFX:t=).lib
TCLTOOLSDIR	= \must\have\tcl\sources\to\build\this\target
TCL_INCLUDES    = -I"$(_TCLDIR)\include"

!else # Building against Tcl sources

TCLSH		= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)$(SUFX:t=).exe



!if !exist($(TCLSH))
TCLSH		= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)t$(SUFX:t=).exe
!endif
TCLSTUBLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclstub$(TCL_VERSION).lib
TCLIMPLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)$(SUFX:t=).lib
# When building extensions, may be linking against Tcl that does not add
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.
!if !exist("$(TCLIMPLIB)")
TCLIMPLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)t$(SUFX:t=).lib
!endif
TCL_LIBRARY	= $(_TCLDIR)\library
TCLREGLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclreg13$(SUFX:t=).lib
TCLDDELIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcldde14$(SUFX:t=).lib
TCLTOOLSDIR	= $(_TCLDIR)\tools
TCL_INCLUDES	= -I"$(_TCLDIR)\generic" -I"$(_TCLDIR)\win"

1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
TKIMPLIBNAME	= tk$(TK_VERSION)$(SUFX).lib

!if $(DOING_TK)
WISH 		= $(OUT_DIR)\$(WISHNAME)
TKSTUBLIB	= $(OUT_DIR)\$(TKSTUBLIBNAME)
TKIMPLIB	= $(OUT_DIR)\$(TKIMPLIBNAME)
TKLIB		= $(OUT_DIR)\$(TKLIBNAME)
TK_INCLUDES    = -I"$(WINDIR)" -I"$(GENERICDIR)"

!else # effectively NEED_TK

!if $(TKINSTALL) # Building against installed Tk
WISH		= $(_TKDIR)\bin\$(WISHNAME)
TKSTUBLIB	= $(_TKDIR)\lib\$(TKSTUBLIBNAME)
TKIMPLIB	= $(_TKDIR)\lib\$(TKIMPLIBNAME)







|







1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
TKIMPLIBNAME	= tk$(TK_VERSION)$(SUFX).lib

!if $(DOING_TK)
WISH 		= $(OUT_DIR)\$(WISHNAME)
TKSTUBLIB	= $(OUT_DIR)\$(TKSTUBLIBNAME)
TKIMPLIB	= $(OUT_DIR)\$(TKIMPLIBNAME)
TKLIB		= $(OUT_DIR)\$(TKLIBNAME)
TK_INCLUDES    = -I"$(WIN_DIR)" -I"$(GENERICDIR)"

!else # effectively NEED_TK

!if $(TKINSTALL) # Building against installed Tk
WISH		= $(_TKDIR)\bin\$(WISHNAME)
TKSTUBLIB	= $(_TKDIR)\lib\$(TKSTUBLIBNAME)
TKIMPLIB	= $(_TKDIR)\lib\$(TKIMPLIBNAME)
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228




1229
1230

1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
# The following macros get defined in this section:
# LIB_INSTALL_DIR - where libraries should be installed
# BIN_INSTALL_DIR - where the executables should be installed
# DOC_INSTALL_DIR - where documentation should be installed
# SCRIPT_INSTALL_DIR - where scripts should be installed
# INCLUDE_INSTALL_DIR - where C include files should be installed
# DEMO_INSTALL_DIR - where demos should be installed
# PRJ_INSTALL_DIR - where package will be installed (not set for tcl and tk)

!if $(DOING_TCL) || $(DOING_TK)
LIB_INSTALL_DIR		= $(_INSTALLDIR)\lib
BIN_INSTALL_DIR		= $(_INSTALLDIR)\bin
DOC_INSTALL_DIR		= $(_INSTALLDIR)\doc
!if $(DOING_TCL)
SCRIPT_INSTALL_DIR	= $(_INSTALLDIR)\lib\$(PROJECT)$(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION)
!else # DOING_TK
SCRIPT_INSTALL_DIR	= $(_INSTALLDIR)\lib\$(PROJECT)$(TK_MAJOR_VERSION).$(TK_MINOR_VERSION)
!endif
DEMO_INSTALL_DIR	= $(SCRIPT_INSTALL_DIR)\demos
INCLUDE_INSTALL_DIR	= $(_INSTALLDIR)\include

!else # extension other than Tk

PRJ_INSTALL_DIR         = $(_INSTALLDIR)\$(PROJECT)$(DOTVERSION)




LIB_INSTALL_DIR		= $(PRJ_INSTALL_DIR)
BIN_INSTALL_DIR		= $(PRJ_INSTALL_DIR)

DOC_INSTALL_DIR		= $(PRJ_INSTALL_DIR)
SCRIPT_INSTALL_DIR	= $(PRJ_INSTALL_DIR)
DEMO_INSTALL_DIR	= $(PRJ_INSTALL_DIR)\demos
INCLUDE_INSTALL_DIR	= $(_TCLDIR)\include

!endif

###################################################################
# 12. Set up actual options to be passed to the compiler and linker
# Now we have all the information we need, set up the actual flags and
# options that we will pass to the compiler and linker. The main







|
















>
>
>
>


>



|







1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
# The following macros get defined in this section:
# LIB_INSTALL_DIR - where libraries should be installed
# BIN_INSTALL_DIR - where the executables should be installed
# DOC_INSTALL_DIR - where documentation should be installed
# SCRIPT_INSTALL_DIR - where scripts should be installed
# INCLUDE_INSTALL_DIR - where C include files should be installed
# DEMO_INSTALL_DIR - where demos should be installed
# PRJ_INSTALL_DIR - where package will be installed (not set for Tcl and Tk)

!if $(DOING_TCL) || $(DOING_TK)
LIB_INSTALL_DIR		= $(_INSTALLDIR)\lib
BIN_INSTALL_DIR		= $(_INSTALLDIR)\bin
DOC_INSTALL_DIR		= $(_INSTALLDIR)\doc
!if $(DOING_TCL)
SCRIPT_INSTALL_DIR	= $(_INSTALLDIR)\lib\$(PROJECT)$(TCL_MAJOR_VERSION).$(TCL_MINOR_VERSION)
!else # DOING_TK
SCRIPT_INSTALL_DIR	= $(_INSTALLDIR)\lib\$(PROJECT)$(TK_MAJOR_VERSION).$(TK_MINOR_VERSION)
!endif
DEMO_INSTALL_DIR	= $(SCRIPT_INSTALL_DIR)\demos
INCLUDE_INSTALL_DIR	= $(_INSTALLDIR)\include

!else # extension other than Tk

PRJ_INSTALL_DIR         = $(_INSTALLDIR)\$(PROJECT)$(DOTVERSION)
!if $(MULTIPLATFORM_INSTALL)
LIB_INSTALL_DIR		= $(PRJ_INSTALL_DIR)\$(PLATFORM_IDENTIFY)
BIN_INSTALL_DIR		= $(PRJ_INSTALL_DIR)\$(PLATFORM_IDENTIFY)
!else
LIB_INSTALL_DIR		= $(PRJ_INSTALL_DIR)
BIN_INSTALL_DIR		= $(PRJ_INSTALL_DIR)
!endif
DOC_INSTALL_DIR		= $(PRJ_INSTALL_DIR)
SCRIPT_INSTALL_DIR	= $(PRJ_INSTALL_DIR)
DEMO_INSTALL_DIR	= $(PRJ_INSTALL_DIR)\demos
INCLUDE_INSTALL_DIR	= $(_INSTALLDIR)\..\include

!endif

###################################################################
# 12. Set up actual options to be passed to the compiler and linker
# Now we have all the information we need, set up the actual flags and
# options that we will pass to the compiler and linker. The main
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276

!if $(TCL_MEM_DEBUG)
OPTDEFINES	= $(OPTDEFINES) -DTCL_MEM_DEBUG
!endif
!if $(TCL_COMPILE_DEBUG)
OPTDEFINES	= $(OPTDEFINES) -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS
!endif
!if $(TCL_THREADS)
OPTDEFINES	= $(OPTDEFINES) -DTCL_THREADS=1
!if $(USE_THREAD_ALLOC)
OPTDEFINES	= $(OPTDEFINES) -DUSE_THREAD_ALLOC=1
!endif
!endif
!if $(STATIC_BUILD)
OPTDEFINES	= $(OPTDEFINES) -DSTATIC_BUILD
!endif
!if $(TCL_NO_DEPRECATED)







|

|







1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297

!if $(TCL_MEM_DEBUG)
OPTDEFINES	= $(OPTDEFINES) -DTCL_MEM_DEBUG
!endif
!if $(TCL_COMPILE_DEBUG)
OPTDEFINES	= $(OPTDEFINES) -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS
!endif
!if $(TCL_THREADS) && $(TCL_VERSION) < 87
OPTDEFINES	= $(OPTDEFINES) -DTCL_THREADS=1
!if $(USE_THREAD_ALLOC) && $(TCL_VERSION) < 87
OPTDEFINES	= $(OPTDEFINES) -DUSE_THREAD_ALLOC=1
!endif
!endif
!if $(STATIC_BUILD)
OPTDEFINES	= $(OPTDEFINES) -DSTATIC_BUILD
!endif
!if $(TCL_NO_DEPRECATED)
1299
1300
1301
1302
1303
1304
1305




1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
!endif
!if "$(MACHINE)" == "AMD64"
OPTDEFINES	= $(OPTDEFINES) -DTCL_CFG_DO64BIT
!endif
!if $(VCVERSION) < 1300
OPTDEFINES	= $(OPTDEFINES) -DNO_STRTOI64
!endif





# _ATL_XP_TARGETING - Newer SDK's need this to build for XP
COMPILERFLAGS  = /D_ATL_XP_TARGETING

# Following is primarily for the benefit of extensions. Tcl 8.5 builds
# Tcl without /DUNICODE, while 8.6 builds with it defined. When building
# an extension, it is advisable (but not mandated) to use the same Windows
# API as the Tcl build. This is accordingly defaulted below. A particular
# extension can override this by pre-definining USE_WIDECHAR_API.
!ifndef USE_WIDECHAR_API
!if $(TCL_VERSION) > 85
USE_WIDECHAR_API = 1
!else
USE_WIDECHAR_API = 0
!endif
!endif

!if $(USE_WIDECHAR_API)
COMPILERFLAGS = $(COMPILERFLAGS) /DUNICODE /D_UNICODE 
!endif

# Like the TEA system only set this non empty for non-Tk extensions
# Note: some extensions use PACKAGE_NAME and others use PACKAGE_TCLNAME
# so we pass both
!if !$(DOING_TCL) && !$(DOING_TK)
PKGNAMEFLAGS = -DPACKAGE_NAME="\"$(PRJ_PACKAGE_TCLNAME)\"" \
               -DPACKAGE_TCLNAME="\"$(PRJ_PACKAGE_TCLNAME)\"" \
               -DPACKAGE_VERSION="\"$(DOTVERSION)\"" \
               -DMODULE_SCOPE=extern 
!endif

# crt picks the C run time based on selected OPTS
!if $(MSVCRT)
!if $(DEBUG) && !$(UNCHECKED)
crt = -MDd
!else







>
>
>
>


















|









|







1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
!endif
!if "$(MACHINE)" == "AMD64"
OPTDEFINES	= $(OPTDEFINES) -DTCL_CFG_DO64BIT
!endif
!if $(VCVERSION) < 1300
OPTDEFINES	= $(OPTDEFINES) -DNO_STRTOI64
!endif

!if "$(_USE_64BIT_TIME_T)" == "1"
OPTDEFINES	= $(OPTDEFINES) -D_USE_64BIT_TIME_T
!endif

# _ATL_XP_TARGETING - Newer SDK's need this to build for XP
COMPILERFLAGS  = /D_ATL_XP_TARGETING

# Following is primarily for the benefit of extensions. Tcl 8.5 builds
# Tcl without /DUNICODE, while 8.6 builds with it defined. When building
# an extension, it is advisable (but not mandated) to use the same Windows
# API as the Tcl build. This is accordingly defaulted below. A particular
# extension can override this by pre-definining USE_WIDECHAR_API.
!ifndef USE_WIDECHAR_API
!if $(TCL_VERSION) > 85
USE_WIDECHAR_API = 1
!else
USE_WIDECHAR_API = 0
!endif
!endif

!if $(USE_WIDECHAR_API)
COMPILERFLAGS = $(COMPILERFLAGS) /DUNICODE /D_UNICODE
!endif

# Like the TEA system only set this non empty for non-Tk extensions
# Note: some extensions use PACKAGE_NAME and others use PACKAGE_TCLNAME
# so we pass both
!if !$(DOING_TCL) && !$(DOING_TK)
PKGNAMEFLAGS = -DPACKAGE_NAME="\"$(PRJ_PACKAGE_TCLNAME)\"" \
               -DPACKAGE_TCLNAME="\"$(PRJ_PACKAGE_TCLNAME)\"" \
               -DPACKAGE_VERSION="\"$(DOTVERSION)\"" \
               -DMODULE_SCOPE=extern
!endif

# crt picks the C run time based on selected OPTS
!if $(MSVCRT)
!if $(DEBUG) && !$(UNCHECKED)
crt = -MDd
!else
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410

1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
!if $(DEBUG)
# Turn warnings into errors
cwarn = $(cwarn) -WX
!endif

INCLUDES = $(TCL_INCLUDES) $(TK_INCLUDES) $(PRJ_INCLUDES)
!if !$(DOING_TCL) && !$(DOING_TK)
INCLUDES = $(INCLUDES) -I"$(GENERICDIR)" -I"$(WINDIR)" -I"$(COMPATDIR)"
!endif

# These flags are defined roughly in the order of the pre-reform
# rules.vc/makefile.vc to help visually compare that the pre- and
# post-reform build logs

# cflags contains generic flags used for building practically all object files
cflags = -nologo -c $(COMPILERFLAGS) $(carch) $(cwarn) -Fp$(TMP_DIR)^\ $(cdebug)

# appcflags contains $(cflags) and flags for building the application
# object files (e.g. tclsh, or wish) pkgcflags contains $(cflags) plus
# flags used for building shared object files The two differ in the
# BUILD_$(PROJECT) macro which should be defined only for the shared
# library *implementation* and not for its caller interface

appcflags = $(cflags) $(crt) $(INCLUDES) $(TCL_DEFINES) $(PRJ_DEFINES) $(OPTDEFINES) $(USE_STUBS_DEFS)
appcflags_nostubs = $(cflags) $(crt) $(INCLUDES) $(TCL_DEFINES) $(PRJ_DEFINES) $(OPTDEFINES)

pkgcflags = $(appcflags) $(PKGNAMEFLAGS) -DBUILD_$(PROJECT)
pkgcflags_nostubs = $(appcflags_nostubs) $(PKGNAMEFLAGS) -DBUILD_$(PROJECT)

# stubscflags contains $(cflags) plus flags used for building a stubs
# library for the package.  Note: -DSTATIC_BUILD is defined in
# $(OPTDEFINES) only if the OPTS configuration indicates a static
# library. However the stubs library is ALWAYS static hence included
# here irrespective of the OPTS setting.
#
# TBD - tclvfs has a comment that stubs libs should not be compiled with -GL
# without stating why. Tcl itself compiled stubs libs with this flag.
# so we do not remove it from cflags. -GL may prevent extensions
# compiled with one VC version to fail to link against stubs library
# compiled with another VC version. Check for this and fix accordingly.
stubscflags = $(cflags) $(PKGNAMEFLAGS) $(PRJ_DEFINES) $(OPTDEFINES) -Zl -DSTATIC_BUILD $(INCLUDES)

# Link flags 

!if $(DEBUG)
ldebug	= -debug -debugtype:cv
!else
ldebug	= -release -opt:ref -opt:icf,3
!if $(SYMBOLS)
ldebug	= $(ldebug) -debug -debugtype:cv
!endif
!endif

# Note: Profiling is currently only possible with the Visual Studio Enterprise
!if $(PROFILE)
ldebug= $(ldebug) -profile
!endif

### Declarations common to all linker versions 
lflags	= -nologo -machine:$(MACHINE) $(LINKERFLAGS) $(ldebug)

!if $(MSVCRT) && !($(DEBUG) && !$(UNCHECKED)) && $(VCVERSION) >= 1900
lflags	= $(lflags) -nodefaultlib:libucrt.lib
!endif

# Old linkers (Visual C++ 6 in particular) will link for fast loading







|















<

>














|

|















|







1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433

1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
!if $(DEBUG)
# Turn warnings into errors
cwarn = $(cwarn) -WX
!endif

INCLUDES = $(TCL_INCLUDES) $(TK_INCLUDES) $(PRJ_INCLUDES)
!if !$(DOING_TCL) && !$(DOING_TK)
INCLUDES = $(INCLUDES) -I"$(GENERICDIR)" -I"$(WIN_DIR)" -I"$(COMPATDIR)"
!endif

# These flags are defined roughly in the order of the pre-reform
# rules.vc/makefile.vc to help visually compare that the pre- and
# post-reform build logs

# cflags contains generic flags used for building practically all object files
cflags = -nologo -c $(COMPILERFLAGS) $(carch) $(cwarn) -Fp$(TMP_DIR)^\ $(cdebug)

# appcflags contains $(cflags) and flags for building the application
# object files (e.g. tclsh, or wish) pkgcflags contains $(cflags) plus
# flags used for building shared object files The two differ in the
# BUILD_$(PROJECT) macro which should be defined only for the shared
# library *implementation* and not for its caller interface


appcflags_nostubs = $(cflags) $(crt) $(INCLUDES) $(TCL_DEFINES) $(PRJ_DEFINES) $(OPTDEFINES)
appcflags = $(appcflags_nostubs) $(USE_STUBS_DEFS)
pkgcflags = $(appcflags) $(PKGNAMEFLAGS) -DBUILD_$(PROJECT)
pkgcflags_nostubs = $(appcflags_nostubs) $(PKGNAMEFLAGS) -DBUILD_$(PROJECT)

# stubscflags contains $(cflags) plus flags used for building a stubs
# library for the package.  Note: -DSTATIC_BUILD is defined in
# $(OPTDEFINES) only if the OPTS configuration indicates a static
# library. However the stubs library is ALWAYS static hence included
# here irrespective of the OPTS setting.
#
# TBD - tclvfs has a comment that stubs libs should not be compiled with -GL
# without stating why. Tcl itself compiled stubs libs with this flag.
# so we do not remove it from cflags. -GL may prevent extensions
# compiled with one VC version to fail to link against stubs library
# compiled with another VC version. Check for this and fix accordingly.
stubscflags = $(cflags) $(PKGNAMEFLAGS) $(PRJ_DEFINES) $(OPTDEFINES) -Zl -DSTATIC_BUILD $(INCLUDES) $(USE_STUBS_DEFS)

# Link flags

!if $(DEBUG)
ldebug	= -debug -debugtype:cv
!else
ldebug	= -release -opt:ref -opt:icf,3
!if $(SYMBOLS)
ldebug	= $(ldebug) -debug -debugtype:cv
!endif
!endif

# Note: Profiling is currently only possible with the Visual Studio Enterprise
!if $(PROFILE)
ldebug= $(ldebug) -profile
!endif

### Declarations common to all linker versions
lflags	= -nologo -machine:$(MACHINE) $(LINKERFLAGS) $(ldebug)

!if $(MSVCRT) && !($(DEBUG) && !$(UNCHECKED)) && $(VCVERSION) >= 1900
lflags	= $(lflags) -nodefaultlib:libucrt.lib
!endif

# Old linkers (Visual C++ 6 in particular) will link for fast loading
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515





1516
1517
1518

1519
1520
1521
1522
1523
1524
1525
1526
1527
1528

1529

1530






1531
1532
1533
1534
1535

1536


1537
1538
1539
1540
1541
1542
1543
1544
1545
1546





1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
RESCMD  = $(rc32) -fo $@ -r -i "$(GENERICDIR)" -i "$(TMP_DIR)" \
	    $(TCL_INCLUDES) \
	    -DDEBUG=$(DEBUG) -d UNCHECKED=$(UNCHECKED) \
	    -DCOMMAVERSION=$(DOTVERSION:.=,),0 \
	    -DDOTVERSION=\"$(DOTVERSION)\" \
	    -DVERSION=\"$(VERSION)\" \
	    -DSUFX=\"$(SUFX)\" \
            -DPROJECT=\"$(PROJECT)\" \
            -DPRJLIBNAME=\"$(PRJLIBNAME)\" 

!ifndef DEFAULT_BUILD_TARGET
DEFAULT_BUILD_TARGET = $(PROJECT)
!endif

default-target: $(DEFAULT_BUILD_TARGET)






default-pkgindex:
	@echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \
	    [list load [file join $$dir $(PRJLIBNAME)]] > $(OUT_DIR)\pkgIndex.tcl


default-pkgindex-tea:
	@if exist $(ROOT)\pkgIndex.tcl.in nmakehlp -s << $(ROOT)\pkgIndex.tcl.in > $(OUT_DIR)\pkgIndex.tcl
@PACKAGE_VERSION@    $(DOTVERSION)
@PACKAGE_NAME@       $(PRJ_PACKAGE_TCLNAME)
@PACKAGE_TCLNAME@    $(PRJ_PACKAGE_TCLNAME)
@PKG_LIB_FILE@       $(PRJLIBNAME)
<<



default-install: default-install-binaries default-install-libraries








default-install-binaries: $(PRJLIB)
	@echo Installing binaries to '$(SCRIPT_INSTALL_DIR)'
	@if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)"
	@$(CPY) $(PRJLIB) "$(SCRIPT_INSTALL_DIR)" >NUL


default-install-libraries: $(OUT_DIR)\pkgIndex.tcl


	@echo Installing libraries to '$(SCRIPT_INSTALL_DIR)'
	@if exist $(LIBDIR) $(CPY) $(LIBDIR)\*.tcl "$(SCRIPT_INSTALL_DIR)"
	@echo Installing package index in '$(SCRIPT_INSTALL_DIR)'
	@$(CPY) $(OUT_DIR)\pkgIndex.tcl $(SCRIPT_INSTALL_DIR)

default-install-stubs:
	@echo Installing stubs library to '$(SCRIPT_INSTALL_DIR)'
	@if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)"
	@$(CPY) $(PRJSTUBLIB) "$(SCRIPT_INSTALL_DIR)" >NUL






default-install-docs-html:
	@echo Installing documentation files to '$(DOC_INSTALL_DIR)'
	@if not exist "$(DOC_INSTALL_DIR)" mkdir "$(DOC_INSTALL_DIR)"
	@if exist $(DOCDIR) for %f in ("$(DOCDIR)\*.html" "$(DOCDIR)\*.css" "$(DOCDIR)\*.png") do @$(COPY) %f "$(DOC_INSTALL_DIR)"

default-install-docs-n:
	@echo Installing documentation files to '$(DOC_INSTALL_DIR)'
	@if not exist "$(DOC_INSTALL_DIR)" mkdir "$(DOC_INSTALL_DIR)"
	@if exist $(DOCDIR) for %f in ("$(DOCDIR)\*.n") do @$(COPY) %f "$(DOC_INSTALL_DIR)"

default-install-demos:
	@echo Installing demos to '$(DEMO_INSTALL_DIR)'
	@if not exist "$(DEMO_INSTALL_DIR)" mkdir "$(DEMO_INSTALL_DIR)"
	@if exist $(DEMODIR) $(CPYDIR) "$(DEMODIR)" "$(DEMO_INSTALL_DIR)"

default-clean:
	@echo Cleaning $(TMP_DIR)\* ...
	@if exist $(TMP_DIR)\nul $(RMDIR) $(TMP_DIR)
	@echo Cleaning $(WINDIR)\nmakehlp.obj, nmakehlp.exe ...
	@if exist $(WINDIR)\nmakehlp.obj del $(WINDIR)\nmakehlp.obj
	@if exist $(WINDIR)\nmakehlp.exe del $(WINDIR)\nmakehlp.exe
	@if exist $(WINDIR)\nmakehlp.out del $(WINDIR)\nmakehlp.out
	@echo Cleaning $(WINDIR)\nmhlp-out.txt ...
	@if exist $(WINDIR)\nmhlp-out.txt del $(WINDIR)\nmhlp-out.txt
	@echo Cleaning $(WINDIR)\_junk.pch ...
	@if exist $(WINDIR)\_junk.pch del $(WINDIR)\_junk.pch
	@echo Cleaning $(WINDIR)\vercl.x, vercl.i ...
	@if exist $(WINDIR)\vercl.x del $(WINDIR)\vercl.x
	@if exist $(WINDIR)\vercl.i del $(WINDIR)\vercl.i
	@echo Cleaning $(WINDIR)\versions.vc, version.vc ...
	@if exist $(WINDIR)\versions.vc del $(WINDIR)\versions.vc
	@if exist $(WINDIR)\version.vc del $(WINDIR)\version.vc

default-hose: default-clean
	@echo Hosing $(OUT_DIR)\* ...
	@if exist $(OUT_DIR)\nul $(RMDIR) $(OUT_DIR)

# Only for backward compatibility
default-distclean: default-hose







|
|







>
>
>
>
>



>









|
>
|
>

>
>
>
>
>
>

|
|
|

>
|
>
>










>
>
>
>
>


















|
|
|
|
|
|
|
|
|
|
|
|
|
|







1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
RESCMD  = $(rc32) -fo $@ -r -i "$(GENERICDIR)" -i "$(TMP_DIR)" \
	    $(TCL_INCLUDES) \
	    -DDEBUG=$(DEBUG) -d UNCHECKED=$(UNCHECKED) \
	    -DCOMMAVERSION=$(DOTVERSION:.=,),0 \
	    -DDOTVERSION=\"$(DOTVERSION)\" \
	    -DVERSION=\"$(VERSION)\" \
	    -DSUFX=\"$(SUFX)\" \
	    -DPROJECT=\"$(PROJECT)\" \
	    -DPRJLIBNAME=\"$(PRJLIBNAME)\"

!ifndef DEFAULT_BUILD_TARGET
DEFAULT_BUILD_TARGET = $(PROJECT)
!endif

default-target: $(DEFAULT_BUILD_TARGET)

!if $(MULTIPLATFORM_INSTALL)
default-pkgindex:
	@echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \
	    [list load [file join $$dir $(PLATFORM_IDENTIFY) $(PRJLIBNAME)]] > $(OUT_DIR)\pkgIndex.tcl
!else
default-pkgindex:
	@echo package ifneeded $(PRJ_PACKAGE_TCLNAME) $(DOTVERSION) \
	    [list load [file join $$dir $(PRJLIBNAME)]] > $(OUT_DIR)\pkgIndex.tcl
!endif

default-pkgindex-tea:
	@if exist $(ROOT)\pkgIndex.tcl.in nmakehlp -s << $(ROOT)\pkgIndex.tcl.in > $(OUT_DIR)\pkgIndex.tcl
@PACKAGE_VERSION@    $(DOTVERSION)
@PACKAGE_NAME@       $(PRJ_PACKAGE_TCLNAME)
@PACKAGE_TCLNAME@    $(PRJ_PACKAGE_TCLNAME)
@PKG_LIB_FILE@       $(PRJLIBNAME)
<<

default-install: default-install-binaries default-install-libraries
!if $(SYMBOLS)
default-install: default-install-pdbs
!endif

# Again to deal with historical brokenness, there is some confusion
# in terminlogy. For extensions, the "install-binaries" was used to
# locate target directory for *binary shared libraries* and thus
# the appropriate macro is LIB_INSTALL_DIR since BIN_INSTALL_DIR is
# for executables (exes). On the other hand the "install-libraries"
# target is for *scripts* and should have been called "install-scripts".
default-install-binaries: $(PRJLIB)
	@echo Installing binaries to '$(LIB_INSTALL_DIR)'
	@if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)"
	@$(CPY) $(PRJLIB) "$(LIB_INSTALL_DIR)" >NUL

# Alias for default-install-scripts
default-install-libraries: default-install-scripts

default-install-scripts: $(OUT_DIR)\pkgIndex.tcl
	@echo Installing libraries to '$(SCRIPT_INSTALL_DIR)'
	@if exist $(LIBDIR) $(CPY) $(LIBDIR)\*.tcl "$(SCRIPT_INSTALL_DIR)"
	@echo Installing package index in '$(SCRIPT_INSTALL_DIR)'
	@$(CPY) $(OUT_DIR)\pkgIndex.tcl $(SCRIPT_INSTALL_DIR)

default-install-stubs:
	@echo Installing stubs library to '$(SCRIPT_INSTALL_DIR)'
	@if not exist "$(SCRIPT_INSTALL_DIR)" mkdir "$(SCRIPT_INSTALL_DIR)"
	@$(CPY) $(PRJSTUBLIB) "$(SCRIPT_INSTALL_DIR)" >NUL

default-install-pdbs:
	@echo Installing PDBs to '$(LIB_INSTALL_DIR)'
	@if not exist "$(LIB_INSTALL_DIR)" mkdir "$(LIB_INSTALL_DIR)"
	@$(CPY) "$(OUT_DIR)\*.pdb" "$(LIB_INSTALL_DIR)\"

default-install-docs-html:
	@echo Installing documentation files to '$(DOC_INSTALL_DIR)'
	@if not exist "$(DOC_INSTALL_DIR)" mkdir "$(DOC_INSTALL_DIR)"
	@if exist $(DOCDIR) for %f in ("$(DOCDIR)\*.html" "$(DOCDIR)\*.css" "$(DOCDIR)\*.png") do @$(COPY) %f "$(DOC_INSTALL_DIR)"

default-install-docs-n:
	@echo Installing documentation files to '$(DOC_INSTALL_DIR)'
	@if not exist "$(DOC_INSTALL_DIR)" mkdir "$(DOC_INSTALL_DIR)"
	@if exist $(DOCDIR) for %f in ("$(DOCDIR)\*.n") do @$(COPY) %f "$(DOC_INSTALL_DIR)"

default-install-demos:
	@echo Installing demos to '$(DEMO_INSTALL_DIR)'
	@if not exist "$(DEMO_INSTALL_DIR)" mkdir "$(DEMO_INSTALL_DIR)"
	@if exist $(DEMODIR) $(CPYDIR) "$(DEMODIR)" "$(DEMO_INSTALL_DIR)"

default-clean:
	@echo Cleaning $(TMP_DIR)\* ...
	@if exist $(TMP_DIR)\nul $(RMDIR) $(TMP_DIR)
	@echo Cleaning $(WIN_DIR)\nmakehlp.obj, nmakehlp.exe ...
	@if exist $(WIN_DIR)\nmakehlp.obj del $(WIN_DIR)\nmakehlp.obj
	@if exist $(WIN_DIR)\nmakehlp.exe del $(WIN_DIR)\nmakehlp.exe
	@if exist $(WIN_DIR)\nmakehlp.out del $(WIN_DIR)\nmakehlp.out
	@echo Cleaning $(WIN_DIR)\nmhlp-out.txt ...
	@if exist $(WIN_DIR)\nmhlp-out.txt del $(WIN_DIR)\nmhlp-out.txt
	@echo Cleaning $(WIN_DIR)\_junk.pch ...
	@if exist $(WIN_DIR)\_junk.pch del $(WIN_DIR)\_junk.pch
	@echo Cleaning $(WIN_DIR)\vercl.x, vercl.i ...
	@if exist $(WIN_DIR)\vercl.x del $(WIN_DIR)\vercl.x
	@if exist $(WIN_DIR)\vercl.i del $(WIN_DIR)\vercl.i
	@echo Cleaning $(WIN_DIR)\versions.vc, version.vc ...
	@if exist $(WIN_DIR)\versions.vc del $(WIN_DIR)\versions.vc
	@if exist $(WIN_DIR)\version.vc del $(WIN_DIR)\version.vc

default-hose: default-clean
	@echo Hosing $(OUT_DIR)\* ...
	@if exist $(OUT_DIR)\nul $(RMDIR) $(OUT_DIR)

# Only for backward compatibility
default-distclean: default-hose
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
	cd "$(TESTDIR)" && $(DEBUGGER) $(TCLSH) all.tcl $(TESTFLAGS)

default-shell: default-setup $(PROJECT)
	@set TCLLIBPATH=$(OUT_DIR:\=/)
	@if exist $(LIBDIR) for %f in ("$(LIBDIR)\*.tcl") do @$(COPY) %f "$(OUT_DIR)"
	$(DEBUGGER) $(TCLSH)

# Generation of Windows version resource 
!ifdef RCFILE

# Note: don't use $** in below rule because there may be other dependencies
# and only the "master" rc must be passed to the resource compiler
$(TMP_DIR)\$(PROJECT).res: $(RCDIR)\$(PROJECT).rc
	$(RESCMD) $(RCDIR)\$(PROJECT).rc








|







1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
	cd "$(TESTDIR)" && $(DEBUGGER) $(TCLSH) all.tcl $(TESTFLAGS)

default-shell: default-setup $(PROJECT)
	@set TCLLIBPATH=$(OUT_DIR:\=/)
	@if exist $(LIBDIR) for %f in ("$(LIBDIR)\*.tcl") do @$(COPY) %f "$(OUT_DIR)"
	$(DEBUGGER) $(TCLSH)

# Generation of Windows version resource
!ifdef RCFILE

# Note: don't use $** in below rule because there may be other dependencies
# and only the "master" rc must be passed to the resource compiler
$(TMP_DIR)\$(PROJECT).res: $(RCDIR)\$(PROJECT).rc
	$(RESCMD) $(RCDIR)\$(PROJECT).rc

1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "FileDescription",  "Tcl extension " PROJECT
            VALUE "OriginalFilename", PRJLIBNAME
            VALUE "FileVersion",      DOTVERSION
            VALUE "ProductName",      "Package " PROJECT " for Tcl"
            VALUE "ProductVersion",   DOTVERSION 
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END







|







1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
    BEGIN
        BLOCK "040904b0"
        BEGIN
            VALUE "FileDescription",  "Tcl extension " PROJECT
            VALUE "OriginalFilename", PRJLIBNAME
            VALUE "FileVersion",      DOTVERSION
            VALUE "ProductName",      "Package " PROJECT " for Tcl"
            VALUE "ProductVersion",   DOTVERSION
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
# main application, the master makefile should define explicit rules.

{$(ROOT)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(WINDIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(GENERICDIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(COMPATDIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(RCDIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

{$(WINDIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

{$(TMP_DIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

.SUFFIXES:
.SUFFIXES:.c .rc







|

















|







1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
# main application, the master makefile should define explicit rules.

{$(ROOT)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(WIN_DIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(GENERICDIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(COMPATDIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(RCDIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

{$(WIN_DIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

{$(TMP_DIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

.SUFFIXES:
.SUFFIXES:.c .rc
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
!if $(CONFIG_CHECK)
!ifdef TCLNMAKECONFIG
!include $(TCLNMAKECONFIG)

!if defined(CORE_MACHINE) && "$(CORE_MACHINE)" != "$(MACHINE)"
!error ERROR: Build target ($(MACHINE)) does not match the Tcl library architecture ($(CORE_MACHINE)).
!endif
!if defined(CORE_USE_THREAD_ALLOC) && $(CORE_USE_THREAD_ALLOC) != $(USE_THREAD_ALLOC)
!message WARNING: Value of USE_THREAD_ALLOC ($(USE_THREAD_ALLOC)) does not match its Tcl core value ($(CORE_USE_THREAD_ALLOC)).
!endif
!if defined(CORE_DEBUG) && $(CORE_DEBUG) != $(DEBUG)
!message WARNING: Value of DEBUG ($(DEBUG)) does not match its Tcl library configuration ($(DEBUG)).
!endif
!endif








|







1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
!if $(CONFIG_CHECK)
!ifdef TCLNMAKECONFIG
!include $(TCLNMAKECONFIG)

!if defined(CORE_MACHINE) && "$(CORE_MACHINE)" != "$(MACHINE)"
!error ERROR: Build target ($(MACHINE)) does not match the Tcl library architecture ($(CORE_MACHINE)).
!endif
!if $(TCL_VERSION) < 87 && defined(CORE_USE_THREAD_ALLOC) && $(CORE_USE_THREAD_ALLOC) != $(USE_THREAD_ALLOC)
!message WARNING: Value of USE_THREAD_ALLOC ($(USE_THREAD_ALLOC)) does not match its Tcl core value ($(CORE_USE_THREAD_ALLOC)).
!endif
!if defined(CORE_DEBUG) && $(CORE_DEBUG) != $(DEBUG)
!message WARNING: Value of DEBUG ($(DEBUG)) does not match its Tcl library configuration ($(DEBUG)).
!endif
!endif

Changes to jni/tcl/generic/tclCompile.c.
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
    const char *p = script;	/* Where we are in our compile. */
    int depth = TclGetStackDepth(envPtr);
    Interp *iPtr = (Interp *) interp;

    if (envPtr->iPtr == NULL) {
	Tcl_Panic("TclCompileScript() called on uninitialized CompileEnv");
    }
    /* 
     * Check depth to avoid overflow of the C execution stack by too many
     * nested calls of TclCompileScript (considering interp recursionlimit).
     * Factor 5/4 (1.25) is used to avoid too mistaken limit recognition
     * during "mixed" evaluation and compilation process (nested eval+compile)
     * and is good enough for default recursionlimit (1000).
     */
    if (iPtr->numLevels / 5 > iPtr->maxNestingDepth / 4) {







|







2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
    const char *p = script;	/* Where we are in our compile. */
    int depth = TclGetStackDepth(envPtr);
    Interp *iPtr = (Interp *) interp;

    if (envPtr->iPtr == NULL) {
	Tcl_Panic("TclCompileScript() called on uninitialized CompileEnv");
    }
    /*
     * Check depth to avoid overflow of the C execution stack by too many
     * nested calls of TclCompileScript (considering interp recursionlimit).
     * Factor 5/4 (1.25) is used to avoid too mistaken limit recognition
     * during "mixed" evaluation and compilation process (nested eval+compile)
     * and is good enough for default recursionlimit (1000).
     */
    if (iPtr->numLevels / 5 > iPtr->maxNestingDepth / 4) {
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
	     * The advantage of this shortcut is that CompileCommandTokens()
	     * can be written with an assumption that parsePtr->numWords > 0, with
	     * the implication the CCT() always generates bytecode.
	     */
	    continue;
	}

	/* 
	 * Avoid stack exhaustion by too many nested calls of TclCompileScript
	 * (considering interp recursionlimit).
	 */
	iPtr->numLevels++;

	lastCmdIdx = CompileCommandTokens(interp, parsePtr, envPtr);








|







2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
	     * The advantage of this shortcut is that CompileCommandTokens()
	     * can be written with an assumption that parsePtr->numWords > 0, with
	     * the implication the CCT() always generates bytecode.
	     */
	    continue;
	}

	/*
	 * Avoid stack exhaustion by too many nested calls of TclCompileScript
	 * (considering interp recursionlimit).
	 */
	iPtr->numLevels++;

	lastCmdIdx = CompileCommandTokens(interp, parsePtr, envPtr);

Changes to jni/tcl/generic/tclEncoding.c.
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 192 ... 207 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 208 ... 223 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 224 ... 239 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 240 ... 255 */
    };

    Tcl_DStringInit(&lineString);
    if (Tcl_Gets(chan, &lineString) < 0) {
	return NULL;
    }
    line = Tcl_DStringValue(&lineString);

    fallback = (int) strtol(line, &line, 16);
    symbol = (int) strtol(line, &line, 10);
    numPages = (int) strtol(line, &line, 10);







|







1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 192 ... 207 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 208 ... 223 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 224 ... 239 */
      0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 240 ... 255 */
    };

    Tcl_DStringInit(&lineString);
    if (Tcl_Gets(chan, &lineString) == -1) {
	return NULL;
    }
    line = Tcl_DStringValue(&lineString);

    fallback = (int) strtol(line, &line, 16);
    symbol = (int) strtol(line, &line, 10);
    numPages = (int) strtol(line, &line, 10);
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
	Tcl_DStringFree(&lineString);
    }

    size = sizeof(EscapeEncodingData) - sizeof(EscapeSubTable)
	    + Tcl_DStringLength(&escapeData);
    dataPtr = ckalloc(size);
    dataPtr->initLen = strlen(init);
    memcpy(dataPtr->init, init, (unsigned) dataPtr->initLen + 1);
    dataPtr->finalLen = strlen(final);
    memcpy(dataPtr->final, final, (unsigned) dataPtr->finalLen + 1);
    dataPtr->numSubTables =
	    Tcl_DStringLength(&escapeData) / sizeof(EscapeSubTable);
    memcpy(dataPtr->subTables, Tcl_DStringValue(&escapeData),
	    (size_t) Tcl_DStringLength(&escapeData));
    Tcl_DStringFree(&escapeData);

    memset(dataPtr->prefixBytes, 0, sizeof(dataPtr->prefixBytes));
    for (i = 0; i < dataPtr->numSubTables; i++) {
	dataPtr->prefixBytes[UCHAR(dataPtr->subTables[i].sequence[0])] = 1;
    }
    if (dataPtr->init[0] != '\0') {







|

|



|







2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
	Tcl_DStringFree(&lineString);
    }

    size = sizeof(EscapeEncodingData) - sizeof(EscapeSubTable)
	    + Tcl_DStringLength(&escapeData);
    dataPtr = ckalloc(size);
    dataPtr->initLen = strlen(init);
    memcpy(dataPtr->init, init, dataPtr->initLen + 1);
    dataPtr->finalLen = strlen(final);
    memcpy(dataPtr->final, final, dataPtr->finalLen + 1);
    dataPtr->numSubTables =
	    Tcl_DStringLength(&escapeData) / sizeof(EscapeSubTable);
    memcpy(dataPtr->subTables, Tcl_DStringValue(&escapeData),
	    Tcl_DStringLength(&escapeData));
    Tcl_DStringFree(&escapeData);

    memset(dataPtr->prefixBytes, 0, sizeof(dataPtr->prefixBytes));
    for (i = 0; i < dataPtr->numSubTables; i++) {
	dataPtr->prefixBytes[UCHAR(dataPtr->subTables[i].sequence[0])] = 1;
    }
    if (dataPtr->init[0] != '\0') {
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
	srcLen = dstLen;
	result = TCL_CONVERT_NOSPACE;
    }

    *srcReadPtr = srcLen;
    *dstWrotePtr = srcLen;
    *dstCharsPtr = srcLen;
    memcpy(dst, src, (size_t) srcLen);
    return result;
}

/*
 *-------------------------------------------------------------------------
 *
 * UtfIntToUtfExtProc --







|







2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
	srcLen = dstLen;
	result = TCL_CONVERT_NOSPACE;
    }

    *srcReadPtr = srcLen;
    *dstWrotePtr = srcLen;
    *dstCharsPtr = srcLen;
    memcpy(dst, src, srcLen);
    return result;
}

/*
 *-------------------------------------------------------------------------
 *
 * UtfIntToUtfExtProc --
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
    if (flags & TCL_ENCODING_START) {
	state = 0;
	if ((dst + dataPtr->initLen) > dstEnd) {
	    *srcReadPtr = 0;
	    *dstWrotePtr = 0;
	    return TCL_CONVERT_NOSPACE;
	}
	memcpy(dst, dataPtr->init, (size_t)dataPtr->initLen);
	dst += dataPtr->initLen;
    } else {
	state = PTR2INT(*statePtr);
    }

    encodingPtr = GetTableEncoding(dataPtr, state);
    tableDataPtr = encodingPtr->clientData;







|







3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
    if (flags & TCL_ENCODING_START) {
	state = 0;
	if ((dst + dataPtr->initLen) > dstEnd) {
	    *srcReadPtr = 0;
	    *dstWrotePtr = 0;
	    return TCL_CONVERT_NOSPACE;
	}
	memcpy(dst, dataPtr->init, dataPtr->initLen);
	dst += dataPtr->initLen;
    } else {
	state = PTR2INT(*statePtr);
    }

    encodingPtr = GetTableEncoding(dataPtr, state);
    tableDataPtr = encodingPtr->clientData;
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
		     */

		    state = oldState;
		    result = TCL_CONVERT_NOSPACE;
		    break;
		}
		memcpy(dst, subTablePtr->sequence,
			(size_t) subTablePtr->sequenceLen);
		dst += subTablePtr->sequenceLen;
	    }
	}

	if (tablePrefixBytes[(word >> 8)] != 0) {
	    if (dst + 1 > dstEnd) {
		result = TCL_CONVERT_NOSPACE;







|







3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
		     */

		    state = oldState;
		    result = TCL_CONVERT_NOSPACE;
		    break;
		}
		memcpy(dst, subTablePtr->sequence,
			subTablePtr->sequenceLen);
		dst += subTablePtr->sequenceLen;
	    }
	}

	if (tablePrefixBytes[(word >> 8)] != 0) {
	    if (dst + 1 > dstEnd) {
		result = TCL_CONVERT_NOSPACE;
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
	if ((dst + dataPtr->finalLen + (state?len:0)) > dstEnd) {
	    result = TCL_CONVERT_NOSPACE;
	} else {
	    if (state) {
		memcpy(dst, dataPtr->subTables[0].sequence, len);
		dst += len;
	    }
	    memcpy(dst, dataPtr->final, (size_t) dataPtr->finalLen);
	    dst += dataPtr->finalLen;
	    state &= ~TCL_ENCODING_END;
	}
    }

    *statePtr = (Tcl_EncodingState) INT2PTR(state);
    *srcReadPtr = src - srcStart;







|







3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
	if ((dst + dataPtr->finalLen + (state?len:0)) > dstEnd) {
	    result = TCL_CONVERT_NOSPACE;
	} else {
	    if (state) {
		memcpy(dst, dataPtr->subTables[0].sequence, len);
		dst += len;
	    }
	    memcpy(dst, dataPtr->final, dataPtr->finalLen);
	    dst += dataPtr->finalLen;
	    state &= ~TCL_ENCODING_END;
	}
    }

    *statePtr = (Tcl_EncodingState) INT2PTR(state);
    *srcReadPtr = src - srcStart;
Changes to jni/tcl/generic/tclUtil.c.
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
		Tcl_SetErrorCode(interp, "TCL", "INTERNAL", "Tcl_SplitList",
			NULL);
	    }
	    return TCL_ERROR;
	}
	argv[i] = p;
	if (literal) {
	    memcpy(p, element, (size_t) elSize);
	    p += elSize;
	    *p = 0;
	    p++;
	} else {
	    p += 1 + TclCopyAndCollapse(elSize, element, p);
	}
    }







|







920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
		Tcl_SetErrorCode(interp, "TCL", "INTERNAL", "Tcl_SplitList",
			NULL);
	    }
	    return TCL_ERROR;
	}
	argv[i] = p;
	if (literal) {
	    memcpy(p, element, elSize);
	    p += elSize;
	    *p = 0;
	    p++;
	} else {
	    p += 1 + TclCopyAndCollapse(elSize, element, p);
	}
    }
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_ScanElement(
    register const char *src,	/* String to convert to list element. */
    register int *flagPtr)	/* Where to store information to guide
				 * Tcl_ConvertCountedElement. */
{
    return Tcl_ScanCountedElement(src, -1, flagPtr);
}

/*
 *----------------------------------------------------------------------
 *







|
|
|







958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_ScanElement(
    const char *src,	/* String to convert to list element. */
    int *flagPtr)	/* Where to store information to guide
			 * Tcl_ConvertCountedElement. */
{
    return Tcl_ScanCountedElement(src, -1, flagPtr);
}

/*
 *----------------------------------------------------------------------
 *
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_ConvertElement(
    register const char *src,	/* Source information for list element. */
    register char *dst,		/* Place to put list-ified element. */
    register int flags)		/* Flags produced by Tcl_ScanElement. */
{
    return Tcl_ConvertCountedElement(src, -1, dst, flags);
}

/*
 *----------------------------------------------------------------------
 *







|
|
|







1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_ConvertElement(
    const char *src,	/* Source information for list element. */
    char *dst,		/* Place to put list-ified element. */
    int flags)		/* Flags produced by Tcl_ScanElement. */
{
    return Tcl_ConvertCountedElement(src, -1, dst, flags);
}

/*
 *----------------------------------------------------------------------
 *
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_ConvertCountedElement(
    register const char *src,	/* Source information for list element. */
    int length,			/* Number of bytes in src, or -1. */
    char *dst,			/* Place to put list-ified element. */
    int flags)			/* Flags produced by Tcl_ScanElement. */
{
    int numBytes = TclConvertElement(src, length, dst, flags);
    dst[numBytes] = '\0';
    return numBytes;
}

/*







|
|
|
|







1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
Tcl_ConvertCountedElement(
    const char *src,	/* Source information for list element. */
    int length,		/* Number of bytes in src, or -1. */
    char *dst,		/* Place to put list-ified element. */
    int flags)		/* Flags produced by Tcl_ScanElement. */
{
    int numBytes = TclConvertElement(src, length, dst, flags);
    dst[numBytes] = '\0';
    return numBytes;
}

/*
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
TclConvertElement(
    register const char *src,	/* Source information for list element. */
    int length,			/* Number of bytes in src, or -1. */
    char *dst,			/* Place to put list-ified element. */
    int flags)			/* Flags produced by Tcl_ScanElement. */
{
    int conversion = flags & CONVERT_MASK;
    char *p = dst;

    /*
     * Let the caller demand we use escape sequences rather than braces.
     */







|
|
|
|







1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
 *	None.
 *
 *----------------------------------------------------------------------
 */

int
TclConvertElement(
    const char *src,	/* Source information for list element. */
    int length,		/* Number of bytes in src, or -1. */
    char *dst,		/* Place to put list-ified element. */
    int flags)		/* Flags produced by Tcl_ScanElement. */
{
    int conversion = flags & CONVERT_MASK;
    char *p = dst;

    /*
     * Let the caller demand we use escape sequences rather than braces.
     */
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
	Tcl_Panic("Tcl_Concat: max size of Tcl value exceeded");
    }

    /*
     * All element bytes + (argc - 1) spaces + 1 terminating NULL.
     */

    result = ckalloc((unsigned) (bytesNeeded + argc));

    for (p = result, i = 0;  i < argc;  i++) {
	int triml, trimr, elemLength;
	const char *element;

	element = argv[i];
	elemLength = strlen(argv[i]);







|







2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
	Tcl_Panic("Tcl_Concat: max size of Tcl value exceeded");
    }

    /*
     * All element bytes + (argc - 1) spaces + 1 terminating NULL.
     */

    result = ckalloc(bytesNeeded + argc);

    for (p = result, i = 0;  i < argc;  i++) {
	int triml, trimr, elemLength;
	const char *element;

	element = argv[i];
	elemLength = strlen(argv[i]);
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
	/*
	 * Append to the result with space if needed.
	 */

	if (needSpace) {
	    *p++ = ' ';
	}
	memcpy(p, element, (size_t) elemLength);
	p += elemLength;
	needSpace = 1;
    }
    *p = '\0';
    return result;
}








|







2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
	/*
	 * Append to the result with space if needed.
	 */

	if (needSpace) {
	    *p++ = ' ';
	}
	memcpy(p, element, elemLength);
	p += elemLength;
	needSpace = 1;
    }
    *p = '\0';
    return result;
}

2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
     */

    if (newSize >= dsPtr->spaceAvl) {
	dsPtr->spaceAvl = newSize * 2;
	if (dsPtr->string == dsPtr->staticSpace) {
	    char *newString = ckalloc(dsPtr->spaceAvl);

	    memcpy(newString, dsPtr->string, (size_t) dsPtr->length);
	    dsPtr->string = newString;
	} else {
	    int offset = -1;

	    /* See [16896d49fd] */
	    if (bytes >= dsPtr->string
		    && bytes <= dsPtr->string + dsPtr->length) {







|







2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
     */

    if (newSize >= dsPtr->spaceAvl) {
	dsPtr->spaceAvl = newSize * 2;
	if (dsPtr->string == dsPtr->staticSpace) {
	    char *newString = ckalloc(dsPtr->spaceAvl);

	    memcpy(newString, dsPtr->string, dsPtr->length);
	    dsPtr->string = newString;
	} else {
	    int offset = -1;

	    /* See [16896d49fd] */
	    if (bytes >= dsPtr->string
		    && bytes <= dsPtr->string + dsPtr->length) {
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
     */

    if (newSize >= dsPtr->spaceAvl) {
	dsPtr->spaceAvl = newSize * 2;
	if (dsPtr->string == dsPtr->staticSpace) {
	    char *newString = ckalloc(dsPtr->spaceAvl);

	    memcpy(newString, dsPtr->string, (size_t) dsPtr->length);
	    dsPtr->string = newString;
	} else {
	    int offset = -1;

	    /* See [16896d49fd] */
	    if (element >= dsPtr->string
		    && element <= dsPtr->string + dsPtr->length) {







|







2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
     */

    if (newSize >= dsPtr->spaceAvl) {
	dsPtr->spaceAvl = newSize * 2;
	if (dsPtr->string == dsPtr->staticSpace) {
	    char *newString = ckalloc(dsPtr->spaceAvl);

	    memcpy(newString, dsPtr->string, dsPtr->length);
	    dsPtr->string = newString;
	} else {
	    int offset = -1;

	    /* See [16896d49fd] */
	    if (element >= dsPtr->string
		    && element <= dsPtr->string + dsPtr->length) {
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
	    dsPtr->spaceAvl = newsize;
	} else {
	    dsPtr->spaceAvl = length + 1;
	}
	if (dsPtr->string == dsPtr->staticSpace) {
	    char *newString = ckalloc(dsPtr->spaceAvl);

	    memcpy(newString, dsPtr->string, (size_t) dsPtr->length);
	    dsPtr->string = newString;
	} else {
	    dsPtr->string = ckrealloc(dsPtr->string, dsPtr->spaceAvl);
	}
    }
    dsPtr->length = length;
    dsPtr->string[length] = 0;







|







2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
	    dsPtr->spaceAvl = newsize;
	} else {
	    dsPtr->spaceAvl = length + 1;
	}
	if (dsPtr->string == dsPtr->staticSpace) {
	    char *newString = ckalloc(dsPtr->spaceAvl);

	    memcpy(newString, dsPtr->string, dsPtr->length);
	    dsPtr->string = newString;
	} else {
	    dsPtr->string = ckrealloc(dsPtr->string, dsPtr->spaceAvl);
	}
    }
    dsPtr->length = length;
    dsPtr->string[length] = 0;
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081

    if (dsPtr->string != dsPtr->staticSpace) {
	ckfree(dsPtr->string);
    }

    /*
     * Do more efficient transfer when we know the result is a Tcl_Obj. When
     * there's no st`ring result, we only have to deal with two cases:
     *
     *  1. When the string rep is the empty string, when we don't copy but
     *     instead use the staticSpace in the DString to hold an empty string.

     *  2. When the string rep is not there or there's a real string rep, when
     *     we use Tcl_GetString to fetch (or generate) the string rep - which
     *     we know to have been allocated with ckalloc() - and use it to







|







3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081

    if (dsPtr->string != dsPtr->staticSpace) {
	ckfree(dsPtr->string);
    }

    /*
     * Do more efficient transfer when we know the result is a Tcl_Obj. When
     * there's no string result, we only have to deal with two cases:
     *
     *  1. When the string rep is the empty string, when we don't copy but
     *     instead use the staticSpace in the DString to hold an empty string.

     *  2. When the string rep is not there or there's a real string rep, when
     *     we use Tcl_GetString to fetch (or generate) the string rep - which
     *     we know to have been allocated with ckalloc() - and use it to
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
    dsPtr->length = strlen(iPtr->result);
    if (iPtr->freeProc != NULL) {
	if (iPtr->freeProc == TCL_DYNAMIC) {
	    dsPtr->string = iPtr->result;
	    dsPtr->spaceAvl = dsPtr->length+1;
	} else {
	    dsPtr->string = ckalloc(dsPtr->length+1);
	    memcpy(dsPtr->string, iPtr->result, (unsigned) dsPtr->length+1);
	    iPtr->freeProc(iPtr->result);
	}
	dsPtr->spaceAvl = dsPtr->length+1;
	iPtr->freeProc = NULL;
    } else {
	if (dsPtr->length < TCL_DSTRING_STATIC_SIZE) {
	    dsPtr->string = dsPtr->staticSpace;
	    dsPtr->spaceAvl = TCL_DSTRING_STATIC_SIZE;
	} else {
	    dsPtr->string = ckalloc(dsPtr->length+1);
	    dsPtr->spaceAvl = dsPtr->length + 1;
	}
	memcpy(dsPtr->string, iPtr->result, (unsigned) dsPtr->length+1);
    }

    iPtr->result = iPtr->resultSpace;
    iPtr->resultSpace[0] = 0;
}

/*







|












|







3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
    dsPtr->length = strlen(iPtr->result);
    if (iPtr->freeProc != NULL) {
	if (iPtr->freeProc == TCL_DYNAMIC) {
	    dsPtr->string = iPtr->result;
	    dsPtr->spaceAvl = dsPtr->length+1;
	} else {
	    dsPtr->string = ckalloc(dsPtr->length+1);
	    memcpy(dsPtr->string, iPtr->result, dsPtr->length+1);
	    iPtr->freeProc(iPtr->result);
	}
	dsPtr->spaceAvl = dsPtr->length+1;
	iPtr->freeProc = NULL;
    } else {
	if (dsPtr->length < TCL_DSTRING_STATIC_SIZE) {
	    dsPtr->string = dsPtr->staticSpace;
	    dsPtr->spaceAvl = TCL_DSTRING_STATIC_SIZE;
	} else {
	    dsPtr->string = ckalloc(dsPtr->length+1);
	    dsPtr->spaceAvl = dsPtr->length + 1;
	}
	memcpy(dsPtr->string, iPtr->result, dsPtr->length+1);
    }

    iPtr->result = iPtr->resultSpace;
    iPtr->resultSpace[0] = 0;
}

/*
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
				 * at least TCL_DOUBLE_SPACE characters. */
{
    char *p, c;
    int exponent;
    int signum;
    char *digits;
    char *end;
    int *precisionPtr = Tcl_GetThreadData(&precisionKey, (int) sizeof(int));

    /*
     * Handle NaN.
     */

    if (TclIsNaN(value)) {
	TclFormatNaN(value, dst);







|







3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
				 * at least TCL_DOUBLE_SPACE characters. */
{
    char *p, c;
    int exponent;
    int signum;
    char *digits;
    char *end;
    int *precisionPtr = Tcl_GetThreadData(&precisionKey, sizeof(int));

    /*
     * Handle NaN.
     */

    if (TclIsNaN(value)) {
	TclFormatNaN(value, dst);
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
int
TclCheckBadOctal(
    Tcl_Interp *interp,		/* Interpreter to use for error reporting. If
				 * NULL, then no error message is left after
				 * errors. */
    const char *value)		/* String to check. */
{
    register const char *p = value;

    /*
     * A frequent mistake is invalid octal values due to an unwanted leading
     * zero. Try to generate a meaningful error message.
     */

    while (TclIsSpaceProc(*p)) {







|







4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
int
TclCheckBadOctal(
    Tcl_Interp *interp,		/* Interpreter to use for error reporting. If
				 * NULL, then no error message is left after
				 * errors. */
    const char *value)		/* String to check. */
{
    const char *p = value;

    /*
     * A frequent mistake is invalid octal values due to an unwanted leading
     * zero. Try to generate a meaningful error message.
     */

    while (TclIsSpaceProc(*p)) {
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
    if (NULL != pgvPtr->value) {
	ckfree(pgvPtr->value);
    } else {
	Tcl_CreateExitHandler(FreeProcessGlobalValue, pgvPtr);
    }
    bytes = Tcl_GetStringFromObj(newValue, &pgvPtr->numBytes);
    pgvPtr->value = ckalloc(pgvPtr->numBytes + 1);
    memcpy(pgvPtr->value, bytes, (unsigned) pgvPtr->numBytes + 1);
    if (pgvPtr->encoding) {
	Tcl_FreeEncoding(pgvPtr->encoding);
    }
    pgvPtr->encoding = encoding;

    /*
     * Fill the local thread copy directly with the Tcl_Obj value to avoid







|







4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
    if (NULL != pgvPtr->value) {
	ckfree(pgvPtr->value);
    } else {
	Tcl_CreateExitHandler(FreeProcessGlobalValue, pgvPtr);
    }
    bytes = Tcl_GetStringFromObj(newValue, &pgvPtr->numBytes);
    pgvPtr->value = ckalloc(pgvPtr->numBytes + 1);
    memcpy(pgvPtr->value, bytes, pgvPtr->numBytes + 1);
    if (pgvPtr->encoding) {
	Tcl_FreeEncoding(pgvPtr->encoding);
    }
    pgvPtr->encoding = encoding;

    /*
     * Fill the local thread copy directly with the Tcl_Obj value to avoid
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
		    pgvPtr->numBytes, &native);
	    Tcl_ExternalToUtfDString(current, Tcl_DStringValue(&native),
	    Tcl_DStringLength(&native), &newValue);
	    Tcl_DStringFree(&native);
	    ckfree(pgvPtr->value);
	    pgvPtr->value = ckalloc(Tcl_DStringLength(&newValue) + 1);
	    memcpy(pgvPtr->value, Tcl_DStringValue(&newValue),
		    (size_t) Tcl_DStringLength(&newValue) + 1);
	    Tcl_DStringFree(&newValue);
	    Tcl_FreeEncoding(pgvPtr->encoding);
	    pgvPtr->encoding = current;
	    Tcl_MutexUnlock(&pgvPtr->mutex);
	} else {
	    Tcl_FreeEncoding(current);
	}
    }
    cacheMap = GetThreadHash(&pgvPtr->key);
    hPtr = Tcl_FindHashEntry(cacheMap, (char *) INT2PTR(epoch));
    if (NULL == hPtr) {
	int dummy;

	/*
	 * No cache for the current epoch - must be a new one.
	 *
	 * First, clear the cacheMap, as anything in it must refer to some







|









|







4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
		    pgvPtr->numBytes, &native);
	    Tcl_ExternalToUtfDString(current, Tcl_DStringValue(&native),
	    Tcl_DStringLength(&native), &newValue);
	    Tcl_DStringFree(&native);
	    ckfree(pgvPtr->value);
	    pgvPtr->value = ckalloc(Tcl_DStringLength(&newValue) + 1);
	    memcpy(pgvPtr->value, Tcl_DStringValue(&newValue),
		    Tcl_DStringLength(&newValue) + 1);
	    Tcl_DStringFree(&newValue);
	    Tcl_FreeEncoding(pgvPtr->encoding);
	    pgvPtr->encoding = current;
	    Tcl_MutexUnlock(&pgvPtr->mutex);
	} else {
	    Tcl_FreeEncoding(current);
	}
    }
    cacheMap = GetThreadHash(&pgvPtr->key);
    hPtr = Tcl_FindHashEntry(cacheMap, INT2PTR(epoch));
    if (NULL == hPtr) {
	int dummy;

	/*
	 * No cache for the current epoch - must be a new one.
	 *
	 * First, clear the cacheMap, as anything in it must refer to some
Changes to jni/tcl/library/init.tcl.
643
644
645
646
647
648
649
650


651
652
653
654
655
656
657
		return [set auto_execs($name) [list $file]]
	    }
	}
	return ""
    }

    set path "[file dirname [info nameof]];.;"
    if {[info exists env(WINDIR)]} {


	set windir $env(WINDIR)
    }
    if {[info exists windir]} {
	if {$tcl_platform(os) eq "Windows NT"} {
	    append path "$windir/system32;"
	}
	append path "$windir/system;$windir;"







|
>
>







643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
		return [set auto_execs($name) [list $file]]
	    }
	}
	return ""
    }

    set path "[file dirname [info nameof]];.;"
    if {[info exists env(SystemRoot)]} {
	set windir $env(SystemRoot)
    } elseif {[info exists env(WINDIR)]} {
	set windir $env(WINDIR)
    }
    if {[info exists windir]} {
	if {$tcl_platform(os) eq "Windows NT"} {
	    append path "$windir/system32;"
	}
	append path "$windir/system;$windir;"
Changes to jni/tcl/tests/chanio.test.
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

    catch {
	::tcltest::loadTestedCommands
	package require -exact Tcltest [info patchlevel]
	set ::tcltestlib [lindex [package ifneeded Tcltest [info patchlevel]] 1]
    }
    package require tcltests
    
    testConstraint testbytestring   [llength [info commands testbytestring]]
    testConstraint testchannel      [llength [info commands testchannel]]
    testConstraint openpipe         1
    testConstraint testfevent       [llength [info commands testfevent]]
    testConstraint testchannelevent [llength [info commands testchannelevent]]
    testConstraint testmainthread   [llength [info commands testmainthread]]








|







32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

    catch {
	::tcltest::loadTestedCommands
	package require -exact Tcltest [info patchlevel]
	set ::tcltestlib [lindex [package ifneeded Tcltest [info patchlevel]] 1]
    }
    package require tcltests

    testConstraint testbytestring   [llength [info commands testbytestring]]
    testConstraint testchannel      [llength [info commands testchannel]]
    testConstraint openpipe         1
    testConstraint testfevent       [llength [info commands testfevent]]
    testConstraint testchannelevent [llength [info commands testchannelevent]]
    testConstraint testmainthread   [llength [info commands testmainthread]]

122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
set path(test2) [makeFile {} test2]
test chan-io-1.8 {Tcl_WriteChars: WriteChars} {
    # This test written for SF bug #506297.
    #
    # Executing this test without the fix for the referenced bug applied to
    # tcl will cause tcl, more specifically WriteChars, to go into an infinite
    # loop.
    set f [open $path(test2) w] 
    chan configure      $f -encoding iso2022-jp 
    chan puts -nonewline $f [format %s%c [string repeat " " 4] 12399] 
    chan close           $f 
    contents $path(test2)
} "    \x1b\$B\$O\x1b(B"
test chan-io-1.9 {Tcl_WriteChars: WriteChars} {
    # When closing a channel with an encoding that appends escape bytes, check
    # for the case where the escape bytes overflow the current IO buffer. The
    # bytes should be moved into a new buffer.
    set data "1234567890 [format %c 12399]"







|
|
|
|







122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
set path(test2) [makeFile {} test2]
test chan-io-1.8 {Tcl_WriteChars: WriteChars} {
    # This test written for SF bug #506297.
    #
    # Executing this test without the fix for the referenced bug applied to
    # tcl will cause tcl, more specifically WriteChars, to go into an infinite
    # loop.
    set f [open $path(test2) w]
    chan configure      $f -encoding iso2022-jp
    chan puts -nonewline $f [format %s%c [string repeat " " 4] 12399]
    chan close           $f
    contents $path(test2)
} "    \x1b\$B\$O\x1b(B"
test chan-io-1.9 {Tcl_WriteChars: WriteChars} {
    # When closing a channel with an encoding that appends escape bytes, check
    # for the case where the escape bytes overflow the current IO buffer. The
    # bytes should be moved into a new buffer.
    set data "1234567890 [format %c 12399]"
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
    contents $path(test1)
} -cleanup {
    chan close $f
} -result "\r\n12"
test chan-io-3.4 {WriteChars: loop over stage buffer} {
    # stage buffer maps to more than can be queued at once.
    set f [open $path(test1) w]
    chan configure $f -encoding jis0208 -buffersize 16 
    chan puts -nonewline $f "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
    set x [list [contents $path(test1)]]
    chan close $f
    lappend x [contents $path(test1)]
} [list "!)!)!)!)!)!)!)!)" "!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)"]
test chan-io-3.5 {WriteChars: saved != 0} {
    # Bytes produced by UtfToExternal from end of last channel buffer had to
    # be moved to beginning of next channel buffer to preserve requested
    # buffersize.
    set f [open $path(test1) w]
    chan configure $f -encoding jis0208 -buffersize 17 
    chan puts -nonewline $f "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
    set x [list [contents $path(test1)]]
    chan close $f
    lappend x [contents $path(test1)]
} [list "!)!)!)!)!)!)!)!)!" "!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)"]
test chan-io-3.6 {WriteChars: (stageRead + dstWrote == 0)} {
    # One incomplete UTF-8 character at end of staging buffer. Backup in src







|










|







240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
    contents $path(test1)
} -cleanup {
    chan close $f
} -result "\r\n12"
test chan-io-3.4 {WriteChars: loop over stage buffer} {
    # stage buffer maps to more than can be queued at once.
    set f [open $path(test1) w]
    chan configure $f -encoding jis0208 -buffersize 16
    chan puts -nonewline $f "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
    set x [list [contents $path(test1)]]
    chan close $f
    lappend x [contents $path(test1)]
} [list "!)!)!)!)!)!)!)!)" "!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)"]
test chan-io-3.5 {WriteChars: saved != 0} {
    # Bytes produced by UtfToExternal from end of last channel buffer had to
    # be moved to beginning of next channel buffer to preserve requested
    # buffersize.
    set f [open $path(test1) w]
    chan configure $f -encoding jis0208 -buffersize 17
    chan puts -nonewline $f "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
    set x [list [contents $path(test1)]]
    chan close $f
    lappend x [contents $path(test1)]
} [list "!)!)!)!)!)!)!)!)!" "!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)"]
test chan-io-3.6 {WriteChars: (stageRead + dstWrote == 0)} {
    # One incomplete UTF-8 character at end of staging buffer. Backup in src
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
test chan-io-3.7 {WriteChars: (bufPtr->nextAdded > bufPtr->length)} {
    # When translating UTF-8 to external, the produced bytes went past end of
    # the channel buffer. This is done on purpose - we then truncate the bytes
    # at the end of the partial character to preserve the requested blocksize
    # on flush. The truncated bytes are moved to the beginning of the next
    # channel buffer.
    set f [open $path(test1) w]
    chan configure $f -encoding jis0208 -buffersize 17 
    chan puts -nonewline $f "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
    set x [list [contents $path(test1)]]
    chan close $f
    lappend x [contents $path(test1)]
} [list "!)!)!)!)!)!)!)!)!" "!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)"]
test chan-io-3.8 {WriteChars: reset sawLF after each buffer} {
    set f [open $path(test1) w]







|







280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
test chan-io-3.7 {WriteChars: (bufPtr->nextAdded > bufPtr->length)} {
    # When translating UTF-8 to external, the produced bytes went past end of
    # the channel buffer. This is done on purpose - we then truncate the bytes
    # at the end of the partial character to preserve the requested blocksize
    # on flush. The truncated bytes are moved to the beginning of the next
    # channel buffer.
    set f [open $path(test1) w]
    chan configure $f -encoding jis0208 -buffersize 17
    chan puts -nonewline $f "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
    set x [list [contents $path(test1)]]
    chan close $f
    lappend x [contents $path(test1)]
} [list "!)!)!)!)!)!)!)!)!" "!)!)!)!)!)!)!)!)!)!)!)!)!)!)!)"]
test chan-io-3.8 {WriteChars: reset sawLF after each buffer} {
    set f [open $path(test1) w]
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
    chan puts -nonewline $f "12345678901\n456789012345678901234"
    chan close $f
    set x [contents $path(test1)]
} "12345678901\r\n456789012345678901234"

test chan-io-5.1 {CheckFlush: not full} {
    set f [open $path(test1) w]
    chan configure $f 
    chan puts -nonewline $f "12345678901234567890"
    set x [list [contents $path(test1)]]
    chan close $f
    lappend x [contents $path(test1)]
} [list "" "12345678901234567890"]
test chan-io-5.2 {CheckFlush: full} {
    set f [open $path(test1) w]







|







345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
    chan puts -nonewline $f "12345678901\n456789012345678901234"
    chan close $f
    set x [contents $path(test1)]
} "12345678901\r\n456789012345678901234"

test chan-io-5.1 {CheckFlush: not full} {
    set f [open $path(test1) w]
    chan configure $f
    chan puts -nonewline $f "12345678901234567890"
    set x [list [contents $path(test1)]]
    chan close $f
    lappend x [contents $path(test1)]
} [list "" "12345678901234567890"]
test chan-io-5.2 {CheckFlush: full} {
    set f [open $path(test1) w]
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
} -cleanup {
    chan close $f
} -result [list 2 "\u4e00\u4e01"]
set a "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
append a $a
append a $a
test chan-io-6.6 {Tcl_GetsObj: loop test} -body {
    # if (dst >= dstEnd) 
    set f [open $path(test1) w]
    chan puts $f $a
    chan puts $f hi
    chan close $f
    set f [open $path(test1)]
    list [chan gets $f line] $line
} -cleanup {







|







433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
} -cleanup {
    chan close $f
} -result [list 2 "\u4e00\u4e01"]
set a "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
append a $a
append a $a
test chan-io-6.6 {Tcl_GetsObj: loop test} -body {
    # if (dst >= dstEnd)
    set f [open $path(test1) w]
    chan puts $f $a
    chan puts $f hi
    chan close $f
    set f [open $path(test1)]
    list [chan gets $f line] $line
} -cleanup {
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
    set f [open $path(test1)]
    chan configure $f -translation crlf -buffersize 16
    list [chan gets $f line] $line [chan eof $f]
} -cleanup {
    chan close $f
} -result [list 16 "123456789012345\r" 1]
test chan-io-6.34 {Tcl_GetsObj: crlf mode: buffer exhausted, not followed by \n} -body {
    # not (*eol == '\n') 
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "123456789012345\rabcd\r\nefg"
    chan close $f
    set f [open $path(test1)]
    chan configure $f -translation crlf -buffersize 16
    list [chan gets $f line] $line [chan tell $f]







|







742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
    set f [open $path(test1)]
    chan configure $f -translation crlf -buffersize 16
    list [chan gets $f line] $line [chan eof $f]
} -cleanup {
    chan close $f
} -result [list 16 "123456789012345\r" 1]
test chan-io-6.34 {Tcl_GetsObj: crlf mode: buffer exhausted, not followed by \n} -body {
    # not (*eol == '\n')
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "123456789012345\rabcd\r\nefg"
    chan close $f
    set f [open $path(test1)]
    chan configure $f -translation crlf -buffersize 16
    list [chan gets $f line] $line [chan tell $f]
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
    # if (chanPtr->flags & INPUT_SAW_CR)
    set f [openpipe w+ $path(cat)]
    chan configure $f -translation {auto lf} -buffering none
    chan puts -nonewline $f "bbbbbbbbbbbbbbb\n123456789abcdef\r"
    chan configure $f -buffersize 16
    lappend x [chan gets $f]
    chan configure $f -blocking 0
    lappend x [chan gets $f line] $line [testchannel queuedcr $f] 
    chan configure $f -blocking 1
    chan puts -nonewline $f "\nabcd\refg\x1a"
    lappend x [chan gets $f line] $line [testchannel queuedcr $f]
    lappend x [chan gets $f line] $line
} -cleanup {
    chan close $f
} -result {bbbbbbbbbbbbbbb 15 123456789abcdef 1 4 abcd 0 3 efg}
test chan-io-6.44 {Tcl_GetsObj: input saw cr, not followed by cr} -setup {
    set x ""
} -constraints {stdio testchannel openpipe fileevent} -body {
    # not (*eol == '\n') 
    set f [openpipe w+ $path(cat)]
    chan configure $f -translation {auto lf} -buffering none
    chan puts -nonewline $f "bbbbbbbbbbbbbbb\n123456789abcdef\r"
    chan configure $f -buffersize 16
    lappend x [chan gets $f]
    chan configure $f -blocking 0
    lappend x [chan gets $f line] $line [testchannel queuedcr $f] 
    chan configure $f -blocking 1
    chan puts -nonewline $f "abcd\refg\x1a"
    lappend x [chan gets $f line] $line [testchannel queuedcr $f]
    lappend x [chan gets $f line] $line
} -cleanup {
    chan close $f
} -result {bbbbbbbbbbbbbbb 15 123456789abcdef 1 4 abcd 0 3 efg}







|










|






|







852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
    # if (chanPtr->flags & INPUT_SAW_CR)
    set f [openpipe w+ $path(cat)]
    chan configure $f -translation {auto lf} -buffering none
    chan puts -nonewline $f "bbbbbbbbbbbbbbb\n123456789abcdef\r"
    chan configure $f -buffersize 16
    lappend x [chan gets $f]
    chan configure $f -blocking 0
    lappend x [chan gets $f line] $line [testchannel queuedcr $f]
    chan configure $f -blocking 1
    chan puts -nonewline $f "\nabcd\refg\x1a"
    lappend x [chan gets $f line] $line [testchannel queuedcr $f]
    lappend x [chan gets $f line] $line
} -cleanup {
    chan close $f
} -result {bbbbbbbbbbbbbbb 15 123456789abcdef 1 4 abcd 0 3 efg}
test chan-io-6.44 {Tcl_GetsObj: input saw cr, not followed by cr} -setup {
    set x ""
} -constraints {stdio testchannel openpipe fileevent} -body {
    # not (*eol == '\n')
    set f [openpipe w+ $path(cat)]
    chan configure $f -translation {auto lf} -buffering none
    chan puts -nonewline $f "bbbbbbbbbbbbbbb\n123456789abcdef\r"
    chan configure $f -buffersize 16
    lappend x [chan gets $f]
    chan configure $f -blocking 0
    lappend x [chan gets $f line] $line [testchannel queuedcr $f]
    chan configure $f -blocking 1
    chan puts -nonewline $f "abcd\refg\x1a"
    lappend x [chan gets $f line] $line [testchannel queuedcr $f]
    lappend x [chan gets $f line] $line
} -cleanup {
    chan close $f
} -result {bbbbbbbbbbbbbbb 15 123456789abcdef 1 4 abcd 0 3 efg}
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
    chan close $f
    set f [open $path(test1)]
    list [chan gets $f] [testchannel queuedcr $f] [chan tell $f] [chan gets $f]
} -cleanup {
    chan close $f
} -result {123456 0 8 78901}
test chan-io-6.50 {Tcl_GetsObj: auto mode: \r not followed by \n} -constraints {testchannel} -body {
    # not (*eol == '\n') 
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "123456\r78901"
    chan close $f
    set f [open $path(test1)]
    list [chan gets $f] [testchannel queuedcr $f] [chan tell $f] [chan gets $f]
} -cleanup {







|







949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
    chan close $f
    set f [open $path(test1)]
    list [chan gets $f] [testchannel queuedcr $f] [chan tell $f] [chan gets $f]
} -cleanup {
    chan close $f
} -result {123456 0 8 78901}
test chan-io-6.50 {Tcl_GetsObj: auto mode: \r not followed by \n} -constraints {testchannel} -body {
    # not (*eol == '\n')
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "123456\r78901"
    chan close $f
    set f [open $path(test1)]
    list [chan gets $f] [testchannel queuedcr $f] [chan tell $f] [chan gets $f]
} -cleanup {
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
    chan flush $f
    # here
    list [chan gets $f line] $line [testchannel queuedcr $f]
} -cleanup {
    chan close $f
} -result {15 abcdefghijklmno 1}
test chan-io-8.6 {PeekAhead: change to non-blocking mode} -constraints {stdio testchannel openpipe fileevent} -body {
    # ((chanPtr->flags & CHANNEL_NONBLOCKING) == 0) 
    set f [openpipe w+ $path(cat)]
    chan configure $f -translation {auto binary} -buffersize 16
    chan puts -nonewline $f "abcdefghijklmno\r"
    chan flush $f
    # here
    list [chan gets $f line] $line [testchannel queuedcr $f]
} -cleanup {







|







1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
    chan flush $f
    # here
    list [chan gets $f line] $line [testchannel queuedcr $f]
} -cleanup {
    chan close $f
} -result {15 abcdefghijklmno 1}
test chan-io-8.6 {PeekAhead: change to non-blocking mode} -constraints {stdio testchannel openpipe fileevent} -body {
    # ((chanPtr->flags & CHANNEL_NONBLOCKING) == 0)
    set f [openpipe w+ $path(cat)]
    chan configure $f -translation {auto binary} -buffersize 16
    chan puts -nonewline $f "abcdefghijklmno\r"
    chan flush $f
    # here
    list [chan gets $f line] $line [testchannel queuedcr $f]
} -cleanup {
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
    set f [open $path(test1)]
    chan configure $f -translation crlf
    chan read $f
} -cleanup {
    chan close $f
} -result "abcd\ndef\n"
test chan-io-13.3 {TranslateInputEOL: crlf mode: naked cr} -body {
    # (src >= srcMax) 
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "abcd\r\ndef\r"
    chan close $f
    set f [open $path(test1)]
    chan configure $f -translation crlf
    chan read $f
} -cleanup {
    chan close $f
} -result "abcd\ndef\r"
test chan-io-13.4 {TranslateInputEOL: crlf mode: cr followed by not \n} -body {
    # (src >= srcMax) 
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "abcd\r\ndef\rfgh"
    chan close $f
    set f [open $path(test1)]
    chan configure $f -translation crlf
    chan read $f
} -cleanup {
    chan close $f
} -result "abcd\ndef\rfgh"
test chan-io-13.5 {TranslateInputEOL: crlf mode: naked lf} -body {
    # (src >= srcMax) 
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "abcd\r\ndef\nfgh"
    chan close $f
    set f [open $path(test1)]
    chan configure $f -translation crlf
    chan read $f







|











|











|







1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
    set f [open $path(test1)]
    chan configure $f -translation crlf
    chan read $f
} -cleanup {
    chan close $f
} -result "abcd\ndef\n"
test chan-io-13.3 {TranslateInputEOL: crlf mode: naked cr} -body {
    # (src >= srcMax)
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "abcd\r\ndef\r"
    chan close $f
    set f [open $path(test1)]
    chan configure $f -translation crlf
    chan read $f
} -cleanup {
    chan close $f
} -result "abcd\ndef\r"
test chan-io-13.4 {TranslateInputEOL: crlf mode: cr followed by not \n} -body {
    # (src >= srcMax)
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "abcd\r\ndef\rfgh"
    chan close $f
    set f [open $path(test1)]
    chan configure $f -translation crlf
    chan read $f
} -cleanup {
    chan close $f
} -result "abcd\ndef\rfgh"
test chan-io-13.5 {TranslateInputEOL: crlf mode: naked lf} -body {
    # (src >= srcMax)
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "abcd\r\ndef\nfgh"
    chan close $f
    set f [open $path(test1)]
    chan configure $f -translation crlf
    chan read $f
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
    set f [open $path(test1)]
    chan configure $f -translation auto
    chan read $f
} -cleanup {
    chan close $f
} -result "abcd\ndef"
test chan-io-13.10 {TranslateInputEOL: auto mode: \n} -body {
    # not (*src == '\r') 
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "abcd\ndef"
    chan close $f
    set f [open $path(test1)]
    chan configure $f -translation auto
    chan read $f







|







1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
    set f [open $path(test1)]
    chan configure $f -translation auto
    chan read $f
} -cleanup {
    chan close $f
} -result "abcd\ndef"
test chan-io-13.10 {TranslateInputEOL: auto mode: \n} -body {
    # not (*src == '\r')
    set f [open $path(test1) w]
    chan configure $f -translation lf
    chan puts -nonewline $f "abcd\ndef"
    chan close $f
    set f [open $path(test1)]
    chan configure $f -translation auto
    chan read $f
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
    set cs [socket 127.0.0.1 [lindex [chan configure $ss -sockname] 2]]
    vwait [namespace which -variable x]
    chan configure $cs -blocking off
    writelots $cs $l
    chan close $cs
    chan close $ss
    vwait [namespace which -variable x]
    return $c
} -result 2000
test chan-io-29.35 {Tcl_Chan Close vs chan event vs multiple interpreters} -setup {
    catch {interp delete x}
    catch {interp delete y}
} -constraints {socket tempNotMac fileevent} -body {
    # On Mac, this test screws up sockets such that subsequent tests using
    # port 2828 either cause errors or panic().







|







2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
    set cs [socket 127.0.0.1 [lindex [chan configure $ss -sockname] 2]]
    vwait [namespace which -variable x]
    chan configure $cs -blocking off
    writelots $cs $l
    chan close $cs
    chan close $ss
    vwait [namespace which -variable x]
    set c
} -result 2000
test chan-io-29.35 {Tcl_Chan Close vs chan event vs multiple interpreters} -setup {
    catch {interp delete x}
    catch {interp delete y}
} -constraints {socket tempNotMac fileevent} -body {
    # On Mac, this test screws up sockets such that subsequent tests using
    # port 2828 either cause errors or panic().
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
    set line "123456789ABCDE"	;# 14 char plus crlf
    chan puts -nonewline $f x	;# shift crlf across block boundary
    for {set i 0} {$i < 700} {incr i} {
	chan puts $f $line
    }
    chan close $f
    set f [open $path(test1) r]
    chan configure $f -translation crlf 
    while {[chan gets $f line] >= 0} {
	append c $line\n
    }
    chan close $f
    string length $c
} -result [expr 700*15+1]
test chan-io-31.32 {Tcl_Write crlf on block boundary, Tcl_Gets auto} -setup {







|







3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
    set line "123456789ABCDE"	;# 14 char plus crlf
    chan puts -nonewline $f x	;# shift crlf across block boundary
    for {set i 0} {$i < 700} {incr i} {
	chan puts $f $line
    }
    chan close $f
    set f [open $path(test1) r]
    chan configure $f -translation crlf
    while {[chan gets $f line] >= 0} {
	append c $line\n
    }
    chan close $f
    string length $c
} -result [expr 700*15+1]
test chan-io-31.32 {Tcl_Write crlf on block boundary, Tcl_Gets auto} -setup {
5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
} -cleanup {
    chan close $f
} -result 40000
test chan-io-39.14 {Tcl_SetChannelOption: -encoding, binary & utf-8} -setup {
    file delete $path(test1)
} -body {
    set f [open $path(test1) w]
    chan configure $f -encoding {} 
    chan puts -nonewline $f \xe7\x89\xa6
    chan close $f
    set f [open $path(test1) r]
    chan configure $f -encoding utf-8
    chan read $f
} -cleanup {
    chan close $f







|







5155
5156
5157
5158
5159
5160
5161
5162
5163
5164
5165
5166
5167
5168
5169
} -cleanup {
    chan close $f
} -result 40000
test chan-io-39.14 {Tcl_SetChannelOption: -encoding, binary & utf-8} -setup {
    file delete $path(test1)
} -body {
    set f [open $path(test1) w]
    chan configure $f -encoding {}
    chan puts -nonewline $f \xe7\x89\xa6
    chan close $f
    set f [open $path(test1) r]
    chan configure $f -encoding utf-8
    chan read $f
} -cleanup {
    chan close $f
5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
	[chan configure $sock -translation]
} -cleanup {
    chan close $sock
} -result {{{}} auto}
test chan-io-39.24 {Tcl_SetChannelOption, server socket is not readable or\
        writable so we can't change -eofchar or -translation} -setup {
    set l [list]
} -body { 
    set sock [socket -server [namespace code accept] -myaddr 127.0.0.1 0]
    chan configure $sock -eofchar D -translation lf
    lappend l [chan configure $sock -eofchar] \
	[chan configure $sock -translation]
} -cleanup {
    chan close $sock
} -result {{{}} auto}







|







5300
5301
5302
5303
5304
5305
5306
5307
5308
5309
5310
5311
5312
5313
5314
	[chan configure $sock -translation]
} -cleanup {
    chan close $sock
} -result {{{}} auto}
test chan-io-39.24 {Tcl_SetChannelOption, server socket is not readable or\
        writable so we can't change -eofchar or -translation} -setup {
    set l [list]
} -body {
    set sock [socket -server [namespace code accept] -myaddr 127.0.0.1 0]
    chan configure $sock -eofchar D -translation lf
    lappend l [chan configure $sock -eofchar] \
	[chan configure $sock -translation]
} -cleanup {
    chan close $sock
} -result {{{}} auto}
5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
    set f [open $path(test3) WRONLY]
    chan configure $f -eofchar {}
    chan puts -nonewline $f "ab"
    chan seek $f 0 current
    set x [list [catch {chan gets $f} msg] $msg]
    chan close $f
    lappend x [viewFile test3]
} -match glob -result {1 {channel "*" wasn't opened for reading} abzzy} 
test chan-io-40.14 {POSIX open access modes: RDWR} -match regexp -body {
    file delete $path(test3)
    open $path(test3) RDWR
} -returnCodes error -result {(?i)couldn't open ".*test3": no such file or directory}
test chan-io-40.15 {POSIX open access modes: RDWR} {
    makeFile xyzzy test3
    set f [open $path(test3) RDWR]







|







5453
5454
5455
5456
5457
5458
5459
5460
5461
5462
5463
5464
5465
5466
5467
    set f [open $path(test3) WRONLY]
    chan configure $f -eofchar {}
    chan puts -nonewline $f "ab"
    chan seek $f 0 current
    set x [list [catch {chan gets $f} msg] $msg]
    chan close $f
    lappend x [viewFile test3]
} -match glob -result {1 {channel "*" wasn't opened for reading} abzzy}
test chan-io-40.14 {POSIX open access modes: RDWR} -match regexp -body {
    file delete $path(test3)
    open $path(test3) RDWR
} -returnCodes error -result {(?i)couldn't open ".*test3": no such file or directory}
test chan-io-40.15 {POSIX open access modes: RDWR} {
    makeFile xyzzy test3
    set f [open $path(test3) RDWR]
5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
    chan puts $f {exit}
    vwait [namespace which -variable x]
    list $x $l
} -cleanup {
    chan close $f
} -result {done {0 1 0 1 0 1 0 1 0 1 0 1 0 0}}
unset path(bar)
removeFile bar 

test chan-io-48.4 {lf write, testing readability, ^Z termination, auto read mode} -setup {
    file delete $path(test1)
    set c 0
    set l ""
} -constraints {fileevent} -body {
    set f [open $path(test1) w]







|







5956
5957
5958
5959
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
    chan puts $f {exit}
    vwait [namespace which -variable x]
    list $x $l
} -cleanup {
    chan close $f
} -result {done {0 1 0 1 0 1 0 1 0 1 0 1 0 0}}
unset path(bar)
removeFile bar

test chan-io-48.4 {lf write, testing readability, ^Z termination, auto read mode} -setup {
    file delete $path(test1)
    set c 0
    set l ""
} -constraints {fileevent} -body {
    set f [open $path(test1) w]
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
    set token [after 1000 {
	lappend ::RES {bgerror/FAIL timeout}
	set ::forever has-been-reached
    }]
    vwait ::forever
    catch {after cancel $token}
    # Report
    return $::RES
} -cleanup {
    chan close $f
    chan close $g
    catch {unset ::RES}
    catch {unset ::forever}
    rename ::bgerror {}
    removeFile foo







|







7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
    set token [after 1000 {
	lappend ::RES {bgerror/FAIL timeout}
	set ::forever has-been-reached
    }]
    vwait ::forever
    catch {after cancel $token}
    # Report
    set ::RES
} -cleanup {
    chan close $f
    chan close $g
    catch {unset ::RES}
    catch {unset ::forever}
    rename ::bgerror {}
    removeFile foo
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
    set ss [socket -server [namespace code accept] -myaddr 127.0.0.1 0]
    # We need to delay on some systems until the creation of the server socket
    # completes.
    set done 0
    for {set i 0} {$i < 10} {incr i} {
	if {![catch {
	    set cs [socket 127.0.0.1 [lindex [chan configure $ss -sockname] 2]]
	}]} then {
	    set done 1
	    break
	}
	after 100
    }
    if {$done == 0} {
	chan close $ss







|







7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
7242
    set ss [socket -server [namespace code accept] -myaddr 127.0.0.1 0]
    # We need to delay on some systems until the creation of the server socket
    # completes.
    set done 0
    for {set i 0} {$i < 10} {incr i} {
	if {![catch {
	    set cs [socket 127.0.0.1 [lindex [chan configure $ss -sockname] 2]]
	}]} {
	    set done 1
	    break
	}
	after 100
    }
    if {$done == 0} {
	chan close $ss
7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
	chan flush $writer
    }
    producer
    vwait [namespace which -variable done]
    chan close $writer
    chan close $s
    after cancel $after
    return $counter
} -cleanup {
    if {$accept ne {}} {chan close $accept}
} -result 1

set path(fooBar) [makeFile {} fooBar]

test chan-io-55.1 {ChannelEventScriptInvoker: deletion} -constraints {







|







7300
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
7314
	chan flush $writer
    }
    producer
    vwait [namespace which -variable done]
    chan close $writer
    chan close $s
    after cancel $after
    set counter
} -cleanup {
    if {$accept ne {}} {chan close $accept}
} -result 1

set path(fooBar) [makeFile {} fooBar]

test chan-io-55.1 {ChannelEventScriptInvoker: deletion} -constraints {
7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
    set handler [interp bgerror {}]
    interp bgerror {} [namespace which myHandler]
} -body {
    set f [open $path(fooBar) w]
    chan event $f writable [namespace code [list eventScript $f]]
    variable x not_done
    vwait [namespace which -variable x]
    return $x
} -cleanup {
    interp bgerror {} $handler
} -result {got_error}

test chan-io-56.1 {ChannelTimerProc} {testchannelevent} {
    set f [open $path(fooBar) w]
    chan puts $f "this is a test"







|







7327
7328
7329
7330
7331
7332
7333
7334
7335
7336
7337
7338
7339
7340
7341
    set handler [interp bgerror {}]
    interp bgerror {} [namespace which myHandler]
} -body {
    set f [open $path(fooBar) w]
    chan event $f writable [namespace code [list eventScript $f]]
    variable x not_done
    vwait [namespace which -variable x]
    set x
} -cleanup {
    interp bgerror {} $handler
} -result {got_error}

test chan-io-56.1 {ChannelTimerProc} {testchannelevent} {
    set f [open $path(fooBar) w]
    chan puts $f "this is a test"
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
    chan puts $s "12\n34567890"
    chan flush $s
    variable result [chan gets $s2]
    after 1000 [namespace code {lappend result timer}]
    vwait [namespace which -variable result]
    lappend result [chan gets $s2]
    vwait [namespace which -variable result]
    return $result
} -cleanup {
    chan close $s
    chan close $s2
    chan close $server
} -result {12 readable 34567890 timer}
test chan-io-57.2 {buffered data and file events, read} -setup {
    variable s2







|







7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
    chan puts $s "12\n34567890"
    chan flush $s
    variable result [chan gets $s2]
    after 1000 [namespace code {lappend result timer}]
    vwait [namespace which -variable result]
    lappend result [chan gets $s2]
    vwait [namespace which -variable result]
    set result
} -cleanup {
    chan close $s
    chan close $s2
    chan close $server
} -result {12 readable 34567890 timer}
test chan-io-57.2 {buffered data and file events, read} -setup {
    variable s2
7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
    chan puts -nonewline $s "1234567890"
    chan flush $s
    variable result [chan read $s2 1]
    after 1000 [namespace code {lappend result timer}]
    vwait [namespace which -variable result]
    lappend result [chan read $s2 9]
    vwait [namespace which -variable result]
    return $result
} -cleanup {
    chan close $s
    chan close $s2
    chan close $server
} -result {1 readable 234567890 timer}

test chan-io-58.1 {Tcl_NotifyChannel and error when closing} {stdio unixOrWin openpipe fileevent} {







|







7397
7398
7399
7400
7401
7402
7403
7404
7405
7406
7407
7408
7409
7410
7411
    chan puts -nonewline $s "1234567890"
    chan flush $s
    variable result [chan read $s2 1]
    after 1000 [namespace code {lappend result timer}]
    vwait [namespace which -variable result]
    lappend result [chan read $s2 9]
    vwait [namespace which -variable result]
    set result
} -cleanup {
    chan close $s
    chan close $s2
    chan close $server
} -result {1 readable 234567890 timer}

test chan-io-58.1 {Tcl_NotifyChannel and error when closing} {stdio unixOrWin openpipe fileevent} {
Changes to jni/tcl/tests/cmdAH.test.
1345
1346
1347
1348
1349
1350
1351



1352

1353
1354
1355
1356
1357
1358
1359
} -cleanup {
    removeFile touch.me /tmp
} -result 1
test cmdAH-25.3 {Tcl_FileObjCmd: owned} {unix notRoot} {
    file owned /
} 0
test cmdAH-25.3.1 {Tcl_FileObjCmd: owned} -constraints win -body {



    file owned $env(windir)

} -result 0
test cmdAH-25.4 {Tcl_FileObjCmd: owned} -body {
    file owned nosuchfile
} -result 0

# readlink
test cmdAH-26.1 {Tcl_FileObjCmd: readlink} -returnCodes error -body {







>
>
>
|
>







1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
} -cleanup {
    removeFile touch.me /tmp
} -result 1
test cmdAH-25.3 {Tcl_FileObjCmd: owned} {unix notRoot} {
    file owned /
} 0
test cmdAH-25.3.1 {Tcl_FileObjCmd: owned} -constraints win -body {
    if {[info exists env(SystemRoot)]} {
	file owned $env(SystemRoot)
    } else {
	file owned $env(windir)
    }
} -result 0
test cmdAH-25.4 {Tcl_FileObjCmd: owned} -body {
    file owned nosuchfile
} -result 0

# readlink
test cmdAH-26.1 {Tcl_FileObjCmd: readlink} -returnCodes error -body {
Changes to jni/tcl/win/makefile.vc.
47
48
49
50
51
52
53
































































54
55
56
57
58
59
60
# Visual Studio/Windows SDK for the appropriate target architecture.
#
# NOTE: For older (Visual C++ 6 or the 2003 SDK), to use the Platform
# SDK (not expressly needed), run setenv.bat after
# vcvars32.bat according to the instructions for it.  This can also
# turn on the 64-bit compiler, if your SDK has it.
#
































































# Examples:
#       c:\tcl_src\win\>nmake -f makefile.vc release
#       c:\tcl_src\win\>nmake -f makefile.vc test
#       c:\tcl_src\win\>nmake -f makefile.vc install INSTALLDIR=c:\progra~1\tcl
#       c:\tcl_src\win\>nmake -f makefile.vc release OPTS=pdbs
#       c:\tcl_src\win\>nmake -f makefile.vc release OPTS=symbols
#







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# Visual Studio/Windows SDK for the appropriate target architecture.
#
# NOTE: For older (Visual C++ 6 or the 2003 SDK), to use the Platform
# SDK (not expressly needed), run setenv.bat after
# vcvars32.bat according to the instructions for it.  This can also
# turn on the 64-bit compiler, if your SDK has it.
#
# Basic macros and options usable on the commandline (see rules.vc for more info):
#	OPTS=msvcrt,static,staticpkg,symbols,nothreads,profile,unchecked,time64bit,none
#		Sets special options for the core.  The default is for none.
#		Any combination of the above may be used (comma separated).
#		'none' will over-ride everything to nothing.
#
#		msvcrt   = Affects the static option only to switch it from
#			   using libcmt(d) as the C runtime [by default] to
#			   msvcrt(d). This is useful for static embedding
#			   support.
#		static   = Builds a static library of the core instead of a
#			   dll.  The shell will be static (and large), as well.
#		staticpkg= Affects the static option only to switch
#			   tclshXX.exe to have the dde and reg extension linked
#			   inside it.
#		nothreads  = Turns off full multithreading support (default on).
#		thrdalloc = Use the thread allocator (shared global free pool).
#		symbols =  Adds symbols for step debugging.
#		profile =  Adds profiling hooks.  Map file is assumed.
#		unchecked = Allows a symbols build to not use the debug
#			   enabled runtime (msvcrt.dll not msvcrtd.dll
#			   or libcmt.lib not libcmtd.lib).
#		time64bit = Forces a build using 64-bit time_t for 32-bit build
#			   (CRT library should support this).
#
#	STATS=compdbg,memdbg,none
#		Sets optional memory and bytecode compiler debugging code added
#		to the core.  The default is for none.  Any combination of the
#		above may be used (comma separated).  'none' will over-ride
#		everything to nothing.
#
#		compdbg  = Enables byte compilation logging.
#		memdbg   = Enables the debugging memory allocator.
#
#	CHECKS=64bit,fullwarn,nodep,none
#		Sets special macros for checking compatibility.
#
#		64bit    = Enable 64bit portability warnings (if available)
#		fullwarn = Builds with full compiler and link warnings enabled.
#			    Very verbose.
#		nodep	 = Turns off compatibility macros to ensure the core
#			    isn't being built with deprecated functions.
#
#	MACHINE=(ALPHA|AMD64|IA64|IX86)
#		Set the machine type used for the compiler, linker, and
#		resource compiler.  This hook is needed to tell the tools
#		when alternate platforms are requested.  IX86 is the default
#		when not specified. If the CPU environment variable has been
#		set (ie: recent Platform SDK) then MACHINE is set from CPU.
#
#	TMP_DIR=<path>
#	OUT_DIR=<path>
#		Hooks to allow the intermediate and output directories to be
#		changed.  $(OUT_DIR) is assumed to be
#		$(BINROOT)\(Release|Debug) based on if symbols are requested.
#		$(TMP_DIR) will de $(OUT_DIR)\<buildtype> by default.
#
#	TESTPAT=<file>
#		Reads the tests requested to be run from this file.
#
#	CFG_ENCODING=encoding
#		name of encoding for configuration information. Defaults
#		to cp1252
#
# Examples:
#       c:\tcl_src\win\>nmake -f makefile.vc release
#       c:\tcl_src\win\>nmake -f makefile.vc test
#       c:\tcl_src\win\>nmake -f makefile.vc install INSTALLDIR=c:\progra~1\tcl
#       c:\tcl_src\win\>nmake -f makefile.vc release OPTS=pdbs
#       c:\tcl_src\win\>nmake -f makefile.vc release OPTS=symbols
#
412
413
414
415
416
417
418

419
420
421
422
423
424
425
426
427
428
429
!else

$(TCLLIB): $(TCLOBJS)
	$(DLLCMD) @<<
$**
<<
	$(_VC_MANIFEST_EMBED_DLL)

$(TCLIMPLIB): $(TCLLIB)

!endif # $(STATIC_BUILD)


$(TCLSTUBLIB): $(TCLSTUBOBJS)
	$(LIBCMD) -nodefaultlib $(TCLSTUBOBJS)

$(TCLSH): $(TCLSHOBJS) $(TCLSTUBLIB) $(TCLIMPLIB)
	$(CONEXECMD) -stack:2300000 $**
	$(_VC_MANIFEST_EMBED_EXE)







>



<







476
477
478
479
480
481
482
483
484
485
486

487
488
489
490
491
492
493
!else

$(TCLLIB): $(TCLOBJS)
	$(DLLCMD) @<<
$**
<<
	$(_VC_MANIFEST_EMBED_DLL)

$(TCLIMPLIB): $(TCLLIB)

!endif # $(STATIC_BUILD)


$(TCLSTUBLIB): $(TCLSTUBOBJS)
	$(LIBCMD) -nodefaultlib $(TCLSTUBOBJS)

$(TCLSH): $(TCLSHOBJS) $(TCLSTUBLIB) $(TCLIMPLIB)
	$(CONEXECMD) -stack:2300000 $**
	$(_VC_MANIFEST_EMBED_EXE)
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
	@for /d %d in ($(PKGSDIR)\*) do \
	  @if exist "%~fd\win\makefile.vc" ( \
	    pushd "%~fd\win" & \
	    $(MAKE) -$(MAKEFLAGS) -f makefile.vc TCLDIR=$(ROOT) clean &\
	    popd \
	  )

$(CAT32): $(WINDIR)\cat.c
	$(cc32) $(cflags) $(crt) -D_CRT_NONSTDC_NO_DEPRECATE -DCONSOLE -Fo$(TMP_DIR)\ $?
	$(CONEXECMD) -stack:16384 $(TMP_DIR)\cat.obj
	$(_VC_MANIFEST_EMBED_EXE)

#---------------------------------------------------------------------
# Regenerate the stubs files.  [Development use only]
#---------------------------------------------------------------------







|







542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
	@for /d %d in ($(PKGSDIR)\*) do \
	  @if exist "%~fd\win\makefile.vc" ( \
	    pushd "%~fd\win" & \
	    $(MAKE) -$(MAKEFLAGS) -f makefile.vc TCLDIR=$(ROOT) clean &\
	    popd \
	  )

$(CAT32): $(WIN_DIR)\cat.c
	$(cc32) $(cflags) $(crt) -D_CRT_NONSTDC_NO_DEPRECATE -DCONSOLE -Fo$(TMP_DIR)\ $?
	$(CONEXECMD) -stack:16384 $(TMP_DIR)\cat.obj
	$(_VC_MANIFEST_EMBED_EXE)

#---------------------------------------------------------------------
# Regenerate the stubs files.  [Development use only]
#---------------------------------------------------------------------
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
#---------------------------------------------------------------------
# Build tclConfig.sh for the TEA build system.
#---------------------------------------------------------------------

tclConfig: $(OUT_DIR)\tclConfig.sh

# TBD - is this tclConfig.sh file ever used? The values are incorrect!
$(OUT_DIR)\tclConfig.sh: $(WINDIR)\tclConfig.sh.in
	@echo Creating tclConfig.sh
        @nmakehlp -s << $** >$@
@TCL_DLL_FILE@       $(TCLLIBNAME)
@TCL_VERSION@        $(DOTVERSION)
@TCL_MAJOR_VERSION@  $(TCL_MAJOR_VERSION)
@TCL_MINOR_VERSION@  $(TCL_MINOR_VERSION)
@TCL_PATCH_LEVEL@    $(TCL_PATCH_LEVEL)







|







652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
#---------------------------------------------------------------------
# Build tclConfig.sh for the TEA build system.
#---------------------------------------------------------------------

tclConfig: $(OUT_DIR)\tclConfig.sh

# TBD - is this tclConfig.sh file ever used? The values are incorrect!
$(OUT_DIR)\tclConfig.sh: $(WIN_DIR)\tclConfig.sh.in
	@echo Creating tclConfig.sh
        @nmakehlp -s << $** >$@
@TCL_DLL_FILE@       $(TCLLIBNAME)
@TCL_VERSION@        $(DOTVERSION)
@TCL_MAJOR_VERSION@  $(TCL_MAJOR_VERSION)
@TCL_MINOR_VERSION@  $(TCL_MINOR_VERSION)
@TCL_PATCH_LEVEL@    $(TCL_PATCH_LEVEL)
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
	--name-prefix=TclDate \
	$(GENERICDIR)/tclGetDate.y

#---------------------------------------------------------------------
# Special case object file targets
#---------------------------------------------------------------------

$(TMP_DIR)\testMain.obj: $(WINDIR)\tclAppInit.c
	$(cc32) $(appcflags) -DTCL_TEST \
	    -DTCL_USE_STATIC_PACKAGES=$(TCL_USE_STATIC_PACKAGES) \
	    -Fo$@ $?

$(TMP_DIR)\tclMain2.obj: $(GENERICDIR)\tclMain.c
	$(cc32) $(pkgcflags) -DTCL_ASCII_MAIN \
	    -Fo$@ $?

$(TMP_DIR)\tclTest.obj: $(GENERICDIR)\tclTest.c
	$(cc32) $(appcflags) -Fo$@ $?

$(TMP_DIR)\tclTestObj.obj: $(GENERICDIR)\tclTestObj.c
	$(cc32) $(appcflags) -Fo$@ $?

$(TMP_DIR)\tclWinTest.obj: $(WINDIR)\tclWinTest.c
	$(CCAPPCMD) $?

$(TMP_DIR)\tclZlib.obj: $(GENERICDIR)\tclZlib.c
	$(cc32) $(pkgcflags) -I$(COMPATDIR)\zlib -Fo$@ $?

$(TMP_DIR)\tclPkgConfig.obj: $(GENERICDIR)\tclPkgConfig.c
	$(cc32) $(pkgcflags) \
	-DCFG_INSTALL_LIBDIR="\"$(LIB_INSTALL_DIR:\=\\)\"" \
	-DCFG_INSTALL_BINDIR="\"$(BIN_INSTALL_DIR:\=\\)\"" \
	-DCFG_INSTALL_SCRDIR="\"$(SCRIPT_INSTALL_DIR:\=\\)\"" \
	-DCFG_INSTALL_INCDIR="\"$(INCLUDE_INSTALL_DIR:\=\\)\"" \
	-DCFG_INSTALL_DOCDIR="\"$(DOC_INSTALL_DIR:\=\\)\""	\
	-DCFG_RUNTIME_LIBDIR="\"$(LIB_INSTALL_DIR:\=\\)\"" \
	-DCFG_RUNTIME_BINDIR="\"$(BIN_INSTALL_DIR:\=\\)\"" \
	-DCFG_RUNTIME_SCRDIR="\"$(SCRIPT_INSTALL_DIR:\=\\)\"" \
	-DCFG_RUNTIME_INCDIR="\"$(INCLUDE_INSTALL_DIR:\=\\)\"" \
	-DCFG_RUNTIME_DOCDIR="\"$(DOC_INSTALL_DIR:\=\\)\""     \
	-Fo$@ $?

$(TMP_DIR)\tclAppInit.obj: $(WINDIR)\tclAppInit.c
	$(cc32) $(appcflags) \
	    -DTCL_USE_STATIC_PACKAGES=$(TCL_USE_STATIC_PACKAGES) \
	    -Fo$@ $?

### The following objects should be built using the stub interfaces
### *ALL* extensions need to built with -DTCL_THREADS=1

$(TMP_DIR)\tclWinReg.obj: $(WINDIR)\tclWinReg.c
!if $(STATIC_BUILD)
	$(cc32) $(appcflags) -DSTATIC_BUILD -Fo$@ $?
!else
	$(cc32) $(appcflags) -DUSE_TCL_STUBS -Fo$@ $?
!endif


$(TMP_DIR)\tclWinDde.obj: $(WINDIR)\tclWinDde.c
!if $(STATIC_BUILD)
	$(cc32) $(appcflags) -DSTATIC_BUILD -Fo$@ $?
!else
	$(cc32) $(appcflags) -DUSE_TCL_STUBS -Fo$@ $?
!endif


### The following objects are part of the stub library and should not
### be built as DLL objects.  -Zl is used to avoid a dependency on any
### specific C run-time.

$(TMP_DIR)\tclStubLib.obj: $(GENERICDIR)\tclStubLib.c
	$(cc32) $(stubscflags) -Fo$@ $?

$(TMP_DIR)\tclTomMathStubLib.obj: $(GENERICDIR)\tclTomMathStubLib.c
	$(cc32) $(stubscflags) -Fo$@ $?

$(TMP_DIR)\tclOOStubLib.obj: $(GENERICDIR)\tclOOStubLib.c
	$(cc32) $(stubscflags) -Fo$@ $?

$(TMP_DIR)\tclsh.exe.manifest: $(WINDIR)\tclsh.exe.manifest.in
	@nmakehlp -s << $** >$@
@MACHINE@	  $(MACHINE:IX86=X86)
@TCL_WIN_VERSION@  $(DOTVERSION).0.0
<<

#---------------------------------------------------------------------
# Generate the source dependencies.  Having dependency rules will
# improve incremental build accuracy without having to resort to a
# full rebuild just because some non-global header file like
# tclCompile.h was changed.  These rules aren't needed when building
# from scratch.
#---------------------------------------------------------------------

depend:
!if !exist($(TCLSH))
	@echo Build tclsh first!
!else
	$(TCLSH) $(TOOLSDIR:\=/)/mkdepend.tcl -vc32 -out:"$(OUT_DIR)\depend.mk" \
		-passthru:"-DBUILD_tcl $(TCL_INCLUDES) $(PRJ_INCLUDES)" $(GENERICDIR),$$(GENERICDIR) \
		$(COMPATDIR),$$(COMPATDIR) $(TOMMATHDIR),$$(TOMMATHDIR) $(WINDIR),$$(WINDIR) @<<
$(TCLOBJS)
<<
!endif

#---------------------------------------------------------------------
# Dependency rules
#---------------------------------------------------------------------







|














|



















|







|







|




















|



















|







728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
	--name-prefix=TclDate \
	$(GENERICDIR)/tclGetDate.y

#---------------------------------------------------------------------
# Special case object file targets
#---------------------------------------------------------------------

$(TMP_DIR)\testMain.obj: $(WIN_DIR)\tclAppInit.c
	$(cc32) $(appcflags) -DTCL_TEST \
	    -DTCL_USE_STATIC_PACKAGES=$(TCL_USE_STATIC_PACKAGES) \
	    -Fo$@ $?

$(TMP_DIR)\tclMain2.obj: $(GENERICDIR)\tclMain.c
	$(cc32) $(pkgcflags) -DTCL_ASCII_MAIN \
	    -Fo$@ $?

$(TMP_DIR)\tclTest.obj: $(GENERICDIR)\tclTest.c
	$(cc32) $(appcflags) -Fo$@ $?

$(TMP_DIR)\tclTestObj.obj: $(GENERICDIR)\tclTestObj.c
	$(cc32) $(appcflags) -Fo$@ $?

$(TMP_DIR)\tclWinTest.obj: $(WIN_DIR)\tclWinTest.c
	$(CCAPPCMD) $?

$(TMP_DIR)\tclZlib.obj: $(GENERICDIR)\tclZlib.c
	$(cc32) $(pkgcflags) -I$(COMPATDIR)\zlib -Fo$@ $?

$(TMP_DIR)\tclPkgConfig.obj: $(GENERICDIR)\tclPkgConfig.c
	$(cc32) $(pkgcflags) \
	-DCFG_INSTALL_LIBDIR="\"$(LIB_INSTALL_DIR:\=\\)\"" \
	-DCFG_INSTALL_BINDIR="\"$(BIN_INSTALL_DIR:\=\\)\"" \
	-DCFG_INSTALL_SCRDIR="\"$(SCRIPT_INSTALL_DIR:\=\\)\"" \
	-DCFG_INSTALL_INCDIR="\"$(INCLUDE_INSTALL_DIR:\=\\)\"" \
	-DCFG_INSTALL_DOCDIR="\"$(DOC_INSTALL_DIR:\=\\)\""	\
	-DCFG_RUNTIME_LIBDIR="\"$(LIB_INSTALL_DIR:\=\\)\"" \
	-DCFG_RUNTIME_BINDIR="\"$(BIN_INSTALL_DIR:\=\\)\"" \
	-DCFG_RUNTIME_SCRDIR="\"$(SCRIPT_INSTALL_DIR:\=\\)\"" \
	-DCFG_RUNTIME_INCDIR="\"$(INCLUDE_INSTALL_DIR:\=\\)\"" \
	-DCFG_RUNTIME_DOCDIR="\"$(DOC_INSTALL_DIR:\=\\)\""     \
	-Fo$@ $?

$(TMP_DIR)\tclAppInit.obj: $(WIN_DIR)\tclAppInit.c
	$(cc32) $(appcflags) \
	    -DTCL_USE_STATIC_PACKAGES=$(TCL_USE_STATIC_PACKAGES) \
	    -Fo$@ $?

### The following objects should be built using the stub interfaces
### *ALL* extensions need to built with -DTCL_THREADS=1

$(TMP_DIR)\tclWinReg.obj: $(WIN_DIR)\tclWinReg.c
!if $(STATIC_BUILD)
	$(cc32) $(appcflags) -DSTATIC_BUILD -Fo$@ $?
!else
	$(cc32) $(appcflags) -DUSE_TCL_STUBS -Fo$@ $?
!endif


$(TMP_DIR)\tclWinDde.obj: $(WIN_DIR)\tclWinDde.c
!if $(STATIC_BUILD)
	$(cc32) $(appcflags) -DSTATIC_BUILD -Fo$@ $?
!else
	$(cc32) $(appcflags) -DUSE_TCL_STUBS -Fo$@ $?
!endif


### The following objects are part of the stub library and should not
### be built as DLL objects.  -Zl is used to avoid a dependency on any
### specific C run-time.

$(TMP_DIR)\tclStubLib.obj: $(GENERICDIR)\tclStubLib.c
	$(cc32) $(stubscflags) -Fo$@ $?

$(TMP_DIR)\tclTomMathStubLib.obj: $(GENERICDIR)\tclTomMathStubLib.c
	$(cc32) $(stubscflags) -Fo$@ $?

$(TMP_DIR)\tclOOStubLib.obj: $(GENERICDIR)\tclOOStubLib.c
	$(cc32) $(stubscflags) -Fo$@ $?

$(TMP_DIR)\tclsh.exe.manifest: $(WIN_DIR)\tclsh.exe.manifest.in
	@nmakehlp -s << $** >$@
@MACHINE@	  $(MACHINE:IX86=X86)
@TCL_WIN_VERSION@  $(DOTVERSION).0.0
<<

#---------------------------------------------------------------------
# Generate the source dependencies.  Having dependency rules will
# improve incremental build accuracy without having to resort to a
# full rebuild just because some non-global header file like
# tclCompile.h was changed.  These rules aren't needed when building
# from scratch.
#---------------------------------------------------------------------

depend:
!if !exist($(TCLSH))
	@echo Build tclsh first!
!else
	$(TCLSH) $(TOOLSDIR:\=/)/mkdepend.tcl -vc32 -out:"$(OUT_DIR)\depend.mk" \
		-passthru:"-DBUILD_tcl $(TCL_INCLUDES) $(PRJ_INCLUDES)" $(GENERICDIR),$$(GENERICDIR) \
		$(COMPATDIR),$$(COMPATDIR) $(TOMMATHDIR),$$(TOMMATHDIR) $(WIN_DIR),$$(WIN_DIR) @<<
$(TCLOBJS)
<<
!endif

#---------------------------------------------------------------------
# Dependency rules
#---------------------------------------------------------------------
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
<<

{$(COMPATDIR)\zlib}.c{$(TMP_DIR)}.obj::
	$(cc32) $(pkgcflags) -Fo$(TMP_DIR)\ @<<
$<
<<

$(TMP_DIR)\tclsh.res: $(TMP_DIR)\tclsh.exe.manifest $(WINDIR)\tclsh.rc


#---------------------------------------------------------------------
# Installation.
#---------------------------------------------------------------------

install-binaries:







|







857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
<<

{$(COMPATDIR)\zlib}.c{$(TMP_DIR)}.obj::
	$(cc32) $(pkgcflags) -Fo$(TMP_DIR)\ @<<
$<
<<

$(TMP_DIR)\tclsh.res: $(TMP_DIR)\tclsh.exe.manifest $(WIN_DIR)\tclsh.rc


#---------------------------------------------------------------------
# Installation.
#---------------------------------------------------------------------

install-binaries:
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
	@$(CPY) "$(ROOT)\library\parray.tcl"      "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(ROOT)\library\safe.tcl"        "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(ROOT)\library\tclIndex"        "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(ROOT)\library\package.tcl"     "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(ROOT)\library\word.tcl"        "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(ROOT)\library\auto.tcl"        "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(OUT_DIR)\tclConfig.sh"         "$(LIB_INSTALL_DIR)\"
	@$(CPY) "$(WINDIR)\tclooConfig.sh"        "$(LIB_INSTALL_DIR)\"
	@$(CPY) "$(WINDIR)\rules.vc"              "$(LIB_INSTALL_DIR)\nmake\"
	@$(CPY) "$(WINDIR)\targets.vc"              "$(LIB_INSTALL_DIR)\nmake\"
	@$(CPY) "$(WINDIR)\nmakehlp.c"            "$(LIB_INSTALL_DIR)\nmake\"
	@$(CPY) "$(OUT_DIR)\tcl.nmake"            "$(LIB_INSTALL_DIR)\nmake\"
	@echo Installing library http1.0 directory
	@$(CPY) "$(ROOT)\library\http1.0\*.tcl" \
	    "$(SCRIPT_INSTALL_DIR)\http1.0\"
	@echo Installing library opt0.4 directory
	@$(CPY) "$(ROOT)\library\opt\*.tcl" \
	    "$(SCRIPT_INSTALL_DIR)\opt0.4\"







|
|
|
|







915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
	@$(CPY) "$(ROOT)\library\parray.tcl"      "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(ROOT)\library\safe.tcl"        "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(ROOT)\library\tclIndex"        "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(ROOT)\library\package.tcl"     "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(ROOT)\library\word.tcl"        "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(ROOT)\library\auto.tcl"        "$(SCRIPT_INSTALL_DIR)\"
	@$(CPY) "$(OUT_DIR)\tclConfig.sh"         "$(LIB_INSTALL_DIR)\"
	@$(CPY) "$(WIN_DIR)\tclooConfig.sh"        "$(LIB_INSTALL_DIR)\"
	@$(CPY) "$(WIN_DIR)\rules.vc"              "$(LIB_INSTALL_DIR)\nmake\"
	@$(CPY) "$(WIN_DIR)\targets.vc"              "$(LIB_INSTALL_DIR)\nmake\"
	@$(CPY) "$(WIN_DIR)\nmakehlp.c"            "$(LIB_INSTALL_DIR)\nmake\"
	@$(CPY) "$(OUT_DIR)\tcl.nmake"            "$(LIB_INSTALL_DIR)\nmake\"
	@echo Installing library http1.0 directory
	@$(CPY) "$(ROOT)\library\http1.0\*.tcl" \
	    "$(SCRIPT_INSTALL_DIR)\http1.0\"
	@echo Installing library opt0.4 directory
	@$(CPY) "$(ROOT)\library\opt\*.tcl" \
	    "$(SCRIPT_INSTALL_DIR)\opt0.4\"
Changes to jni/tcl/win/rules.vc.
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
!ifndef _RULES_VC
_RULES_VC = 1

# The following macros define the version of the rules.vc nmake build system
# For modifications that are not backward-compatible, you *must* change
# the major version.
RULES_VERSION_MAJOR = 1
RULES_VERSION_MINOR = 3

# The PROJECT macro must be defined by parent makefile.
!if "$(PROJECT)" == ""
!error *** Error: Macro PROJECT not defined! Please define it before including rules.vc
!endif

!if "$(PRJ_PACKAGE_TCLNAME)" == ""







|







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
!ifndef _RULES_VC
_RULES_VC = 1

# The following macros define the version of the rules.vc nmake build system
# For modifications that are not backward-compatible, you *must* change
# the major version.
RULES_VERSION_MAJOR = 1
RULES_VERSION_MINOR = 4

# The PROJECT macro must be defined by parent makefile.
!if "$(PROJECT)" == ""
!error *** Error: Macro PROJECT not defined! Please define it before including rules.vc
!endif

!if "$(PRJ_PACKAGE_TCLNAME)" == ""
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# some Tcl interfaces that are not publicly exposed.
#
# The fragment will set the following macros:
# ROOT - root of this module sources
# COMPATDIR - source directory that holds compatibility sources
# DOCDIR - source directory containing documentation files
# GENERICDIR - platform-independent source directory
# WINDIR - Windows-specific source directory
# TESTDIR - directory containing test files
# TOOLSDIR - directory containing build tools
# _TCLDIR - root of the Tcl installation OR the Tcl sources. Not set
#    when building Tcl itself.
# _INSTALLDIR - native form of the installation path. For Tcl
#    this will be the root of the Tcl installation. For extensions
#    this will be the lib directory under the root.







|







158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# some Tcl interfaces that are not publicly exposed.
#
# The fragment will set the following macros:
# ROOT - root of this module sources
# COMPATDIR - source directory that holds compatibility sources
# DOCDIR - source directory containing documentation files
# GENERICDIR - platform-independent source directory
# WIN_DIR - Windows-specific source directory
# TESTDIR - directory containing test files
# TOOLSDIR - directory containing build tools
# _TCLDIR - root of the Tcl installation OR the Tcl sources. Not set
#    when building Tcl itself.
# _INSTALLDIR - native form of the installation path. For Tcl
#    this will be the root of the Tcl installation. For extensions
#    this will be the lib directory under the root.
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
!ifndef DEMODIR
!if exist("$(LIBDIR)\demos")
DEMODIR		= $(LIBDIR)\demos
!else
DEMODIR		= $(ROOT)\demos
!endif
!endif # ifndef DEMODIR
# Do NOT enclose WINDIR in a !ifndef because Windows always defines
# WINDIR env var to point to c:\windows!
# TBD - This is a potentially dangerous conflict, rename WINDIR to
# something else
WINDIR		= $(ROOT)\win

!ifndef RCDIR
!if exist("$(WINDIR)\rc")
RCDIR           = $(WINDIR)\rc
!else
RCDIR           = $(WINDIR)
!endif
!endif
RCDIR = $(RCDIR:/=\)

# The target directory where the built packages and binaries will be installed.
# INSTALLDIR is the (optional) path specified by the user.
# _INSTALLDIR is INSTALLDIR using the backslash separator syntax







|
|
<
<
|


|
|

|







211
212
213
214
215
216
217
218
219


220
221
222
223
224
225
226
227
228
229
230
231
232
233
!ifndef DEMODIR
!if exist("$(LIBDIR)\demos")
DEMODIR		= $(LIBDIR)\demos
!else
DEMODIR		= $(ROOT)\demos
!endif
!endif # ifndef DEMODIR
# Do NOT use WINDIR because it is Windows internal environment
# variable to point to c:\windows!


WIN_DIR		= $(ROOT)\win

!ifndef RCDIR
!if exist("$(WIN_DIR)\rc")
RCDIR           = $(WIN_DIR)\rc
!else
RCDIR           = $(WIN_DIR)
!endif
!endif
RCDIR = $(RCDIR:/=\)

# The target directory where the built packages and binaries will be installed.
# INSTALLDIR is the (optional) path specified by the user.
# _INSTALLDIR is INSTALLDIR using the backslash separator syntax
682
683
684
685
686
687
688


689
690
691
692
693
694
695
# USE_THREAD_ALLOC - 1 -> Use a shared global free pool for allocation.
#           0 -> Use the non-thread allocator.
# UNCHECKED - 1 -> when doing a debug build with symbols, use the release
#           C runtime, 0 -> use the debug C runtime.
# USE_STUBS - 1 -> compile to use stubs interfaces, 0 -> direct linking
# CONFIG_CHECK - 1 -> check current build configuration against Tcl
#           configuration (ignored for Tcl itself)


# Further, LINKERFLAGS are modified based on above.

# Default values for all the above
STATIC_BUILD	= 0
TCL_THREADS	= 1
DEBUG		= 0
SYMBOLS		= 0







>
>







680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
# USE_THREAD_ALLOC - 1 -> Use a shared global free pool for allocation.
#           0 -> Use the non-thread allocator.
# UNCHECKED - 1 -> when doing a debug build with symbols, use the release
#           C runtime, 0 -> use the debug C runtime.
# USE_STUBS - 1 -> compile to use stubs interfaces, 0 -> direct linking
# CONFIG_CHECK - 1 -> check current build configuration against Tcl
#           configuration (ignored for Tcl itself)
# _USE_64BIT_TIME_T - forces a build using 64-bit time_t for 32-bit build
#           (CRT library should support this)
# Further, LINKERFLAGS are modified based on above.

# Default values for all the above
STATIC_BUILD	= 0
TCL_THREADS	= 1
DEBUG		= 0
SYMBOLS		= 0
743
744
745
746
747
748
749
750
751
752
753
754
755





756
757
758
759
760
761
762
TCL_USE_STATIC_PACKAGES	= 1
!else
TCL_USE_STATIC_PACKAGES	= 0
!endif

!if [nmakehlp -f $(OPTS) "nothreads"]
!message *** Compile explicitly for non-threaded tcl
TCL_THREADS	= 0
USE_THREAD_ALLOC= 0
!else
TCL_THREADS	= 1
USE_THREAD_ALLOC= 1
!endif






# Yes, it's weird that the "symbols" option controls DEBUG and
# the "pdbs" option controls SYMBOLS. That's historical.
!if [nmakehlp -f $(OPTS) "symbols"]
!message *** Doing symbols
DEBUG		= 1
!else







|





>
>
>
>
>







743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
TCL_USE_STATIC_PACKAGES	= 1
!else
TCL_USE_STATIC_PACKAGES	= 0
!endif

!if [nmakehlp -f $(OPTS) "nothreads"]
!message *** Compile explicitly for non-threaded tcl
TCL_THREADS = 0
USE_THREAD_ALLOC= 0
!else
TCL_THREADS	= 1
USE_THREAD_ALLOC= 1
!endif

!if [nmakehlp -f $(OPTS) "time64bit"]
!message *** Force 64-bit time_t
_USE_64BIT_TIME_T = 1
!endif

# Yes, it's weird that the "symbols" option controls DEBUG and
# the "pdbs" option controls SYMBOLS. That's historical.
!if [nmakehlp -f $(OPTS) "symbols"]
!message *** Doing symbols
DEBUG		= 1
!else
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140

# The name of the stubs library for the project being built
STUBPREFIX      = $(PROJECT)stub

# Set up paths to various Tcl executables and libraries needed by extensions
!if $(DOING_TCL)

TCLSHNAME       = $(PROJECT)sh$(TCL_VERSION)$(SUFX).exe
TCLSH		= $(OUT_DIR)\$(TCLSHNAME)
TCLIMPLIB	= $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib
TCLLIBNAME	= $(PROJECT)$(VERSION)$(SUFX).$(EXT)
TCLLIB		= $(OUT_DIR)\$(TCLLIBNAME)

TCLSTUBLIBNAME	= $(STUBPREFIX)$(VERSION).lib
TCLSTUBLIB	= $(OUT_DIR)\$(TCLSTUBLIBNAME)
TCL_INCLUDES    = -I"$(WINDIR)" -I"$(GENERICDIR)"

!else # ! $(DOING_TCL)

!if $(TCLINSTALL) # Building against an installed Tcl

# When building extensions, we need to locate tclsh. Depending on version
# of Tcl we are building against, this may or may not have a "t" suffix.
# Try various possibilities in turn.
TCLSH		= $(_TCLDIR)\bin\tclsh$(TCL_VERSION)$(SUFX).exe
!if !exist("$(TCLSH)") && $(TCL_THREADS)
TCLSH           = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)t$(SUFX).exe
!endif
!if !exist("$(TCLSH)")
TCLSH           = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)$(SUFX:t=).exe
!endif

TCLSTUBLIB	= $(_TCLDIR)\lib\tclstub$(TCL_VERSION).lib
TCLIMPLIB	= $(_TCLDIR)\lib\tcl$(TCL_VERSION)$(SUFX).lib
# When building extensions, may be linking against Tcl that does not add
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.
!if !exist("$(TCLIMPLIB)")
TCLIMPLIB	= $(_TCLDIR)\lib\tcl$(TCL_VERSION)$(SUFX:t=).lib
!endif
TCL_LIBRARY	= $(_TCLDIR)\lib
TCLREGLIB	= $(_TCLDIR)\lib\tclreg13$(SUFX:t=).lib
TCLDDELIB	= $(_TCLDIR)\lib\tcldde14$(SUFX:t=).lib
TCLTOOLSDIR	= \must\have\tcl\sources\to\build\this\target
TCL_INCLUDES    = -I"$(_TCLDIR)\include"

!else # Building against Tcl sources

TCLSH		= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)$(SUFX).exe
!if !exist($(TCLSH)) && $(TCL_THREADS)
TCLSH		= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)t$(SUFX).exe
!endif
!if !exist($(TCLSH))
TCLSH		= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)$(SUFX:t=).exe
!endif
TCLSTUBLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclstub$(TCL_VERSION).lib
TCLIMPLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)$(SUFX).lib
# When building extensions, may be linking against Tcl that does not add
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.
!if !exist("$(TCLIMPLIB)")
TCLIMPLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)$(SUFX:t=).lib
!endif
TCL_LIBRARY	= $(_TCLDIR)\library
TCLREGLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclreg13$(SUFX:t=).lib
TCLDDELIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcldde14$(SUFX:t=).lib
TCLTOOLSDIR	= $(_TCLDIR)\tools
TCL_INCLUDES	= -I"$(_TCLDIR)\generic" -I"$(_TCLDIR)\win"








|







|








|
<
<
<

|



|



|









|
<
<
<

|


|



|







1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103



1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123



1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139

# The name of the stubs library for the project being built
STUBPREFIX      = $(PROJECT)stub

# Set up paths to various Tcl executables and libraries needed by extensions
!if $(DOING_TCL)

TCLSHNAME       = $(PROJECT)sh$(VERSION)$(SUFX).exe
TCLSH		= $(OUT_DIR)\$(TCLSHNAME)
TCLIMPLIB	= $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib
TCLLIBNAME	= $(PROJECT)$(VERSION)$(SUFX).$(EXT)
TCLLIB		= $(OUT_DIR)\$(TCLLIBNAME)

TCLSTUBLIBNAME	= $(STUBPREFIX)$(VERSION).lib
TCLSTUBLIB	= $(OUT_DIR)\$(TCLSTUBLIBNAME)
TCL_INCLUDES    = -I"$(WIN_DIR)" -I"$(GENERICDIR)"

!else # ! $(DOING_TCL)

!if $(TCLINSTALL) # Building against an installed Tcl

# When building extensions, we need to locate tclsh. Depending on version
# of Tcl we are building against, this may or may not have a "t" suffix.
# Try various possibilities in turn.
TCLSH		= $(_TCLDIR)\bin\tclsh$(TCL_VERSION)$(SUFX:t=).exe



!if !exist("$(TCLSH)")
TCLSH           = $(_TCLDIR)\bin\tclsh$(TCL_VERSION)t$(SUFX:t=).exe
!endif

TCLSTUBLIB	= $(_TCLDIR)\lib\tclstub$(TCL_VERSION).lib
TCLIMPLIB	= $(_TCLDIR)\lib\tcl$(TCL_VERSION)$(SUFX:t=).lib
# When building extensions, may be linking against Tcl that does not add
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.
!if !exist("$(TCLIMPLIB)")
TCLIMPLIB	= $(_TCLDIR)\lib\tcl$(TCL_VERSION)t$(SUFX:t=).lib
!endif
TCL_LIBRARY	= $(_TCLDIR)\lib
TCLREGLIB	= $(_TCLDIR)\lib\tclreg13$(SUFX:t=).lib
TCLDDELIB	= $(_TCLDIR)\lib\tcldde14$(SUFX:t=).lib
TCLTOOLSDIR	= \must\have\tcl\sources\to\build\this\target
TCL_INCLUDES    = -I"$(_TCLDIR)\include"

!else # Building against Tcl sources

TCLSH		= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)$(SUFX:t=).exe



!if !exist($(TCLSH))
TCLSH		= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclsh$(TCL_VERSION)t$(SUFX:t=).exe
!endif
TCLSTUBLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclstub$(TCL_VERSION).lib
TCLIMPLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)$(SUFX:t=).lib
# When building extensions, may be linking against Tcl that does not add
# "t" suffix (e.g. 8.5 or 8.7). If lib not found check for that possibility.
!if !exist("$(TCLIMPLIB)")
TCLIMPLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcl$(TCL_VERSION)t$(SUFX:t=).lib
!endif
TCL_LIBRARY	= $(_TCLDIR)\library
TCLREGLIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tclreg13$(SUFX:t=).lib
TCLDDELIB	= $(_TCLDIR)\win\$(BUILDDIRTOP)\tcldde14$(SUFX:t=).lib
TCLTOOLSDIR	= $(_TCLDIR)\tools
TCL_INCLUDES	= -I"$(_TCLDIR)\generic" -I"$(_TCLDIR)\win"

1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
TKIMPLIBNAME	= tk$(TK_VERSION)$(SUFX).lib

!if $(DOING_TK)
WISH 		= $(OUT_DIR)\$(WISHNAME)
TKSTUBLIB	= $(OUT_DIR)\$(TKSTUBLIBNAME)
TKIMPLIB	= $(OUT_DIR)\$(TKIMPLIBNAME)
TKLIB		= $(OUT_DIR)\$(TKLIBNAME)
TK_INCLUDES    = -I"$(WINDIR)" -I"$(GENERICDIR)"

!else # effectively NEED_TK

!if $(TKINSTALL) # Building against installed Tk
WISH		= $(_TKDIR)\bin\$(WISHNAME)
TKSTUBLIB	= $(_TKDIR)\lib\$(TKSTUBLIBNAME)
TKIMPLIB	= $(_TKDIR)\lib\$(TKIMPLIBNAME)







|







1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
TKIMPLIBNAME	= tk$(TK_VERSION)$(SUFX).lib

!if $(DOING_TK)
WISH 		= $(OUT_DIR)\$(WISHNAME)
TKSTUBLIB	= $(OUT_DIR)\$(TKSTUBLIBNAME)
TKIMPLIB	= $(OUT_DIR)\$(TKIMPLIBNAME)
TKLIB		= $(OUT_DIR)\$(TKLIBNAME)
TK_INCLUDES    = -I"$(WIN_DIR)" -I"$(GENERICDIR)"

!else # effectively NEED_TK

!if $(TKINSTALL) # Building against installed Tk
WISH		= $(_TKDIR)\bin\$(WISHNAME)
TKSTUBLIB	= $(_TKDIR)\lib\$(TKSTUBLIBNAME)
TKIMPLIB	= $(_TKDIR)\lib\$(TKIMPLIBNAME)
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298

!if $(TCL_MEM_DEBUG)
OPTDEFINES	= $(OPTDEFINES) -DTCL_MEM_DEBUG
!endif
!if $(TCL_COMPILE_DEBUG)
OPTDEFINES	= $(OPTDEFINES) -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS
!endif
!if $(TCL_THREADS) && $(TCL_VERSION) <= 86
OPTDEFINES	= $(OPTDEFINES) -DTCL_THREADS=1
!if $(USE_THREAD_ALLOC)
OPTDEFINES	= $(OPTDEFINES) -DUSE_THREAD_ALLOC=1
!endif
!endif
!if $(STATIC_BUILD)
OPTDEFINES	= $(OPTDEFINES) -DSTATIC_BUILD
!endif
!if $(TCL_NO_DEPRECATED)







|

|







1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297

!if $(TCL_MEM_DEBUG)
OPTDEFINES	= $(OPTDEFINES) -DTCL_MEM_DEBUG
!endif
!if $(TCL_COMPILE_DEBUG)
OPTDEFINES	= $(OPTDEFINES) -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS
!endif
!if $(TCL_THREADS) && $(TCL_VERSION) < 87
OPTDEFINES	= $(OPTDEFINES) -DTCL_THREADS=1
!if $(USE_THREAD_ALLOC) && $(TCL_VERSION) < 87
OPTDEFINES	= $(OPTDEFINES) -DUSE_THREAD_ALLOC=1
!endif
!endif
!if $(STATIC_BUILD)
OPTDEFINES	= $(OPTDEFINES) -DSTATIC_BUILD
!endif
!if $(TCL_NO_DEPRECATED)
1321
1322
1323
1324
1325
1326
1327




1328
1329
1330
1331
1332
1333
1334
!endif
!if "$(MACHINE)" == "AMD64"
OPTDEFINES	= $(OPTDEFINES) -DTCL_CFG_DO64BIT
!endif
!if $(VCVERSION) < 1300
OPTDEFINES	= $(OPTDEFINES) -DNO_STRTOI64
!endif





# _ATL_XP_TARGETING - Newer SDK's need this to build for XP
COMPILERFLAGS  = /D_ATL_XP_TARGETING

# Following is primarily for the benefit of extensions. Tcl 8.5 builds
# Tcl without /DUNICODE, while 8.6 builds with it defined. When building
# an extension, it is advisable (but not mandated) to use the same Windows







>
>
>
>







1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
!endif
!if "$(MACHINE)" == "AMD64"
OPTDEFINES	= $(OPTDEFINES) -DTCL_CFG_DO64BIT
!endif
!if $(VCVERSION) < 1300
OPTDEFINES	= $(OPTDEFINES) -DNO_STRTOI64
!endif

!if "$(_USE_64BIT_TIME_T)" == "1"
OPTDEFINES	= $(OPTDEFINES) -D_USE_64BIT_TIME_T
!endif

# _ATL_XP_TARGETING - Newer SDK's need this to build for XP
COMPILERFLAGS  = /D_ATL_XP_TARGETING

# Following is primarily for the benefit of extensions. Tcl 8.5 builds
# Tcl without /DUNICODE, while 8.6 builds with it defined. When building
# an extension, it is advisable (but not mandated) to use the same Windows
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
!if $(DEBUG)
# Turn warnings into errors
cwarn = $(cwarn) -WX
!endif

INCLUDES = $(TCL_INCLUDES) $(TK_INCLUDES) $(PRJ_INCLUDES)
!if !$(DOING_TCL) && !$(DOING_TK)
INCLUDES = $(INCLUDES) -I"$(GENERICDIR)" -I"$(WINDIR)" -I"$(COMPATDIR)"
!endif

# These flags are defined roughly in the order of the pre-reform
# rules.vc/makefile.vc to help visually compare that the pre- and
# post-reform build logs

# cflags contains generic flags used for building practically all object files







|







1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
!if $(DEBUG)
# Turn warnings into errors
cwarn = $(cwarn) -WX
!endif

INCLUDES = $(TCL_INCLUDES) $(TK_INCLUDES) $(PRJ_INCLUDES)
!if !$(DOING_TCL) && !$(DOING_TK)
INCLUDES = $(INCLUDES) -I"$(GENERICDIR)" -I"$(WIN_DIR)" -I"$(COMPATDIR)"
!endif

# These flags are defined roughly in the order of the pre-reform
# rules.vc/makefile.vc to help visually compare that the pre- and
# post-reform build logs

# cflags contains generic flags used for building practically all object files
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
	@echo Installing demos to '$(DEMO_INSTALL_DIR)'
	@if not exist "$(DEMO_INSTALL_DIR)" mkdir "$(DEMO_INSTALL_DIR)"
	@if exist $(DEMODIR) $(CPYDIR) "$(DEMODIR)" "$(DEMO_INSTALL_DIR)"

default-clean:
	@echo Cleaning $(TMP_DIR)\* ...
	@if exist $(TMP_DIR)\nul $(RMDIR) $(TMP_DIR)
	@echo Cleaning $(WINDIR)\nmakehlp.obj, nmakehlp.exe ...
	@if exist $(WINDIR)\nmakehlp.obj del $(WINDIR)\nmakehlp.obj
	@if exist $(WINDIR)\nmakehlp.exe del $(WINDIR)\nmakehlp.exe
	@if exist $(WINDIR)\nmakehlp.out del $(WINDIR)\nmakehlp.out
	@echo Cleaning $(WINDIR)\nmhlp-out.txt ...
	@if exist $(WINDIR)\nmhlp-out.txt del $(WINDIR)\nmhlp-out.txt
	@echo Cleaning $(WINDIR)\_junk.pch ...
	@if exist $(WINDIR)\_junk.pch del $(WINDIR)\_junk.pch
	@echo Cleaning $(WINDIR)\vercl.x, vercl.i ...
	@if exist $(WINDIR)\vercl.x del $(WINDIR)\vercl.x
	@if exist $(WINDIR)\vercl.i del $(WINDIR)\vercl.i
	@echo Cleaning $(WINDIR)\versions.vc, version.vc ...
	@if exist $(WINDIR)\versions.vc del $(WINDIR)\versions.vc
	@if exist $(WINDIR)\version.vc del $(WINDIR)\version.vc

default-hose: default-clean
	@echo Hosing $(OUT_DIR)\* ...
	@if exist $(OUT_DIR)\nul $(RMDIR) $(OUT_DIR)

# Only for backward compatibility
default-distclean: default-hose







|
|
|
|
|
|
|
|
|
|
|
|
|
|







1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
	@echo Installing demos to '$(DEMO_INSTALL_DIR)'
	@if not exist "$(DEMO_INSTALL_DIR)" mkdir "$(DEMO_INSTALL_DIR)"
	@if exist $(DEMODIR) $(CPYDIR) "$(DEMODIR)" "$(DEMO_INSTALL_DIR)"

default-clean:
	@echo Cleaning $(TMP_DIR)\* ...
	@if exist $(TMP_DIR)\nul $(RMDIR) $(TMP_DIR)
	@echo Cleaning $(WIN_DIR)\nmakehlp.obj, nmakehlp.exe ...
	@if exist $(WIN_DIR)\nmakehlp.obj del $(WIN_DIR)\nmakehlp.obj
	@if exist $(WIN_DIR)\nmakehlp.exe del $(WIN_DIR)\nmakehlp.exe
	@if exist $(WIN_DIR)\nmakehlp.out del $(WIN_DIR)\nmakehlp.out
	@echo Cleaning $(WIN_DIR)\nmhlp-out.txt ...
	@if exist $(WIN_DIR)\nmhlp-out.txt del $(WIN_DIR)\nmhlp-out.txt
	@echo Cleaning $(WIN_DIR)\_junk.pch ...
	@if exist $(WIN_DIR)\_junk.pch del $(WIN_DIR)\_junk.pch
	@echo Cleaning $(WIN_DIR)\vercl.x, vercl.i ...
	@if exist $(WIN_DIR)\vercl.x del $(WIN_DIR)\vercl.x
	@if exist $(WIN_DIR)\vercl.i del $(WIN_DIR)\vercl.i
	@echo Cleaning $(WIN_DIR)\versions.vc, version.vc ...
	@if exist $(WIN_DIR)\versions.vc del $(WIN_DIR)\versions.vc
	@if exist $(WIN_DIR)\version.vc del $(WIN_DIR)\version.vc

default-hose: default-clean
	@echo Hosing $(OUT_DIR)\* ...
	@if exist $(OUT_DIR)\nul $(RMDIR) $(OUT_DIR)

# Only for backward compatibility
default-distclean: default-hose
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
# main application, the master makefile should define explicit rules.

{$(ROOT)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(WINDIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(GENERICDIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(COMPATDIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(RCDIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

{$(WINDIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

{$(TMP_DIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

.SUFFIXES:
.SUFFIXES:.c .rc







|

















|







1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
# main application, the master makefile should define explicit rules.

{$(ROOT)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(WIN_DIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(GENERICDIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(COMPATDIR)}.c{$(TMP_DIR)}.obj::
	$(CCPKGCMD) @<<
$<
<<

{$(RCDIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

{$(WIN_DIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

{$(TMP_DIR)}.rc{$(TMP_DIR)}.res:
	$(RESCMD) $<

.SUFFIXES:
.SUFFIXES:.c .rc
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
!if $(CONFIG_CHECK)
!ifdef TCLNMAKECONFIG
!include $(TCLNMAKECONFIG)

!if defined(CORE_MACHINE) && "$(CORE_MACHINE)" != "$(MACHINE)"
!error ERROR: Build target ($(MACHINE)) does not match the Tcl library architecture ($(CORE_MACHINE)).
!endif
!if defined(CORE_USE_THREAD_ALLOC) && $(CORE_USE_THREAD_ALLOC) != $(USE_THREAD_ALLOC)
!message WARNING: Value of USE_THREAD_ALLOC ($(USE_THREAD_ALLOC)) does not match its Tcl core value ($(CORE_USE_THREAD_ALLOC)).
!endif
!if defined(CORE_DEBUG) && $(CORE_DEBUG) != $(DEBUG)
!message WARNING: Value of DEBUG ($(DEBUG)) does not match its Tcl library configuration ($(DEBUG)).
!endif
!endif








|







1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
!if $(CONFIG_CHECK)
!ifdef TCLNMAKECONFIG
!include $(TCLNMAKECONFIG)

!if defined(CORE_MACHINE) && "$(CORE_MACHINE)" != "$(MACHINE)"
!error ERROR: Build target ($(MACHINE)) does not match the Tcl library architecture ($(CORE_MACHINE)).
!endif
!if $(TCL_VERSION) < 87 && defined(CORE_USE_THREAD_ALLOC) && $(CORE_USE_THREAD_ALLOC) != $(USE_THREAD_ALLOC)
!message WARNING: Value of USE_THREAD_ALLOC ($(USE_THREAD_ALLOC)) does not match its Tcl core value ($(CORE_USE_THREAD_ALLOC)).
!endif
!if defined(CORE_DEBUG) && $(CORE_DEBUG) != $(DEBUG)
!message WARNING: Value of DEBUG ($(DEBUG)) does not match its Tcl library configuration ($(DEBUG)).
!endif
!endif