diff --git a/KawaiiMonoRegular.sfd b/KawaiiMonoRegular.sfd index 103db31..98be66a 100644 --- a/KawaiiMonoRegular.sfd +++ b/KawaiiMonoRegular.sfd @@ -21,7 +21,7 @@ OS2Version: 0 OS2_WeightWidthSlopeOnly: 0 OS2_UseTypoMetrics: 1 CreationTime: 1673013936 -ModificationTime: 1675593717 +ModificationTime: 1678025742 PfmFamily: 17 TTFWeight: 400 TTFWidth: 5 @@ -54,7 +54,7 @@ NameList: AGL For New Fonts DisplaySize: -48 AntiAlias: 0 FitToEm: 0 -WinInfo: 646 38 14 +WinInfo: 120 20 12 BeginPrivate: 0 EndPrivate Grid @@ -63,11 +63,11 @@ Grid 82 526 l 9 82 446 l 1 468 446 l 25 -1100 801 m 1 - 1650 801 l 1 +1100 800 m 5 + 1650 800 l 5 1650 0 l 1 1100 0 l 1 - 1100 801 l 1 + 1100 800 l 5 1182 730 m 1 1568 730 l 1 1568 0 l 1 @@ -101,16 +101,16 @@ Grid 1018 730 l 25 1018 650 l 17 735 80 l 9 -550 801 m 1 - 1100 801 l 1 +550 800 m 5 + 1100 800 l 5 1100 0 l 1 550 0 l 1 - 550 801 l 1 -0 801 m 1 - 550 801 l 1 + 550 800 l 5 +0 800 m 5 + 550 800 l 5 550 0 l 1 0 0 l 1 - 0 801 l 1 + 0 800 l 5 82 730 m 1 468 730 l 1 468 0 l 1 @@ -610,8 +610,8 @@ LayerCount: 2 Fore SplineSet 468 0 m 25 - 311 361 l 29 - 211 361 l 29 + 321 361 l 25 + 221 361 l 25 369 0 l 25 468 0 l 25 275 650 m 18 @@ -954,28 +954,28 @@ VStem: 82 81<115.376 218.433 370 422.073> 387 81<0 40 103.361 225.954 306 419.38 LayerCount: 2 Fore SplineSet -163 158 m 0 - 163 119 218 78 271 78 c 0 - 324 78 353 89 389 122 c 1 - 388 209 l 1 - 369 232 319 246 257 246 c 0 - 199 246 163 212 163 158 c 0 -387 358 m 2 - 387 393 372 451 275 451 c 0 - 206 451 162 419 162 370 c 1 - 82 370 l 1 - 82 411 107 460 142 488 c 0 +163 158 m 4 + 163 119 218 78 271 78 c 4 + 324 78 353 89 389 122 c 5 + 388 209 l 5 + 369 232 319 246 257 246 c 4 + 199 246 163 212 163 158 c 4 +387 358 m 6 + 387 393 372 451 275 451 c 4 + 206 451 162 419 162 370 c 5 + 82 370 l 5 + 82 411 107 460 142 488 c 4 179 517 209 526 275 526 c 4 - 350 526 391 512 430 475 c 0 - 456 450 468 414 468 358 c 2 - 468 0 l 1 - 387 0 l 1 - 387 40 l 1 - 366 17 317 0 268 0 c 0 - 161 0 82 72 82 171 c 0 - 82 235 120 292 178 314 c 0 - 262 346 371 306 387 306 c 1 - 387 358 l 2 + 350 526 391 512 430 475 c 4 + 456 450 468 414 468 358 c 6 + 468 0 l 5 + 387 0 l 5 + 387 40 l 5 + 366 17 317 0 268 0 c 4 + 161 0 82 72 82 171 c 4 + 82 235 120 292 178 314 c 4 + 262 346 371 306 387 306 c 5 + 387 358 l 6 EndSplineSet EndChar @@ -7552,11 +7552,11 @@ Flags: HW LayerCount: 2 Fore SplineSet -205 -200 m 25 - 205 800 l 25 - 345 800 l 25 - 345 -200 l 25 - 205 -200 l 25 +205 -200 m 29 + 205 800 l 29 + 345 800 l 29 + 345 -200 l 29 + 205 -200 l 29 EndSplineSet EndChar @@ -7565,6 +7565,24 @@ Encoding: 854 9476 598 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +338 340 m 29 + 212 340 l 29 + 212 260 l 29 + 338 260 l 29 + 338 340 l 29 +550 340 m 29 + 418 340 l 29 + 418 260 l 29 + 550 260 l 29 + 550 340 l 29 +132 340 m 29 + 0 340 l 29 + 0 260 l 29 + 132 260 l 29 + 132 340 l 29 +EndSplineSet EndChar StartChar: heavytrpldashhorzbxd @@ -7572,6 +7590,24 @@ Encoding: 855 9477 599 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +212 370 m 29 + 212 230 l 29 + 338 230 l 25 + 338 370 l 25 + 212 370 l 29 +418 370 m 25 + 418 230 l 25 + 550 230 l 25 + 550 370 l 25 + 418 370 l 25 +0 370 m 25 + 0 230 l 25 + 132 230 l 25 + 132 370 l 25 + 0 370 l 25 +EndSplineSet EndChar StartChar: lighttrpldashvertbxd @@ -7591,11 +7627,11 @@ SplineSet 315 800 l 29 315 550 l 29 235 550 l 29 -235 -200 m 29 - 235 50 l 29 - 315 50 l 29 - 315 -200 l 29 - 235 -200 l 29 +235 -200 m 25 + 235 50 l 25 + 315 50 l 25 + 315 -200 l 25 + 235 -200 l 25 EndSplineSet EndChar @@ -7629,6 +7665,29 @@ Encoding: 858 9480 602 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +251 340 m 25 + 149 340 l 25 + 149 260 l 25 + 251 260 l 25 + 251 340 l 25 +401 340 m 25 + 299 340 l 25 + 299 260 l 25 + 401 260 l 25 + 401 340 l 25 +550 340 m 25 + 448 340 l 25 + 448 260 l 25 + 550 260 l 25 + 550 340 l 25 +102 340 m 25 + 0 340 l 25 + 0 260 l 25 + 102 260 l 25 + 102 340 l 25 +EndSplineSet EndChar StartChar: heavyquaddashhorzbxd @@ -7636,6 +7695,29 @@ Encoding: 859 9481 603 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +448 370 m 25 + 448 230 l 25 + 550 230 l 25 + 550 370 l 25 + 448 370 l 25 +299 370 m 25 + 299 230 l 25 + 401 230 l 25 + 401 370 l 25 + 299 370 l 25 +149 370 m 25 + 149 230 l 25 + 251 230 l 25 + 251 370 l 25 + 149 370 l 25 +0 370 m 25 + 0 230 l 25 + 102 230 l 25 + 102 370 l 25 + 0 370 l 25 +EndSplineSet EndChar StartChar: lightquaddashvertbxd @@ -7643,6 +7725,29 @@ Encoding: 860 9482 604 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +235 -200 m 29 + 235 -20 l 29 + 315 -20 l 29 + 315 -200 l 29 + 235 -200 l 29 +235 70 m 29 + 235 250 l 29 + 315 250 l 29 + 315 70 l 29 + 235 70 l 29 +235 350 m 29 + 235 530 l 29 + 315 530 l 29 + 315 350 l 29 + 235 350 l 29 +235 620 m 29 + 235 800 l 29 + 315 800 l 29 + 315 620 l 29 + 235 620 l 29 +EndSplineSet EndChar StartChar: heavyquaddashvertbxd @@ -7650,6 +7755,29 @@ Encoding: 861 9483 605 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +205 -200 m 25 + 205 -20 l 25 + 345 -20 l 25 + 345 -200 l 25 + 205 -200 l 25 +205 70 m 25 + 205 250 l 25 + 345 250 l 25 + 345 70 l 25 + 205 70 l 25 +205 350 m 25 + 205 530 l 25 + 345 530 l 25 + 345 350 l 25 + 205 350 l 25 +205 620 m 25 + 205 800 l 25 + 345 800 l 25 + 345 620 l 25 + 205 620 l 25 +EndSplineSet EndChar StartChar: lightdnrightbxd @@ -7837,6 +7965,19 @@ Encoding: 871 9493 615 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +235 230 m 25 + 235 370 l 25 + 550 370 l 25 + 550 230 l 25 + 235 230 l 25 +315 800 m 25 + 315 370 l 25 + 235 370 l 25 + 235 800 l 25 + 315 800 l 25 +EndSplineSet EndChar StartChar: upheavyrightlightbxd @@ -7844,6 +7985,19 @@ Encoding: 872 9494 616 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +345 340 m 29 + 550 340 l 29 + 550 260 l 29 + 345 260 l 29 + 345 340 l 29 +205 260 m 29 + 205 800 l 29 + 345 800 l 29 + 345 260 l 29 + 205 260 l 29 +EndSplineSet EndChar StartChar: heavyuprightbxd @@ -7851,6 +8005,19 @@ Encoding: 873 9495 617 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +205 230 m 29 + 205 370 l 29 + 550 370 l 29 + 550 230 l 29 + 205 230 l 29 +205 370 m 29 + 345 370 l 29 + 345 800 l 29 + 205 800 l 29 + 205 370 l 29 +EndSplineSet EndChar StartChar: lightupleftbxd @@ -7858,6 +8025,19 @@ Encoding: 874 9496 618 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 260 m 29 + 314.999023438 260 l 29 + 314.999023438 340 l 29 + 0 340 l 29 + 0 260 l 29 +235 800 m 29 + 235 340 l 29 + 315 340 l 29 + 315 800 l 29 + 235 800 l 29 +EndSplineSet EndChar StartChar: uplightleftheavybxd @@ -7865,6 +8045,19 @@ Encoding: 875 9497 619 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +315 230 m 29 + 315 370 l 29 + 0 370 l 29 + 0 230 l 29 + 315 230 l 29 +235 800 m 29 + 235 370 l 29 + 315 370 l 29 + 315 800 l 29 + 235 800 l 29 +EndSplineSet EndChar StartChar: upheavyleftlightbxd @@ -7872,6 +8065,19 @@ Encoding: 876 9498 620 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +205 340 m 29 + 0 340 l 29 + 0 260 l 29 + 205 260 l 29 + 205 340 l 29 +345 260 m 29 + 345 800 l 29 + 205 800 l 29 + 205 260 l 29 + 345 260 l 29 +EndSplineSet EndChar StartChar: heavyupleftbxd @@ -7879,6 +8085,19 @@ Encoding: 877 9499 621 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +345 230 m 29 + 345 370 l 29 + 0 370 l 29 + 0 230 l 29 + 345 230 l 29 +345 370 m 29 + 205 370 l 29 + 205 800 l 29 + 345 800 l 29 + 345 370 l 29 +EndSplineSet EndChar StartChar: lightvertrightbxd @@ -8606,6 +8825,24 @@ Encoding: 910 9532 654 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 340 m 25 + 315 340 l 25 + 315 260 l 25 + 550 260 l 25 + 550 340 l 25 +235 340 m 25 + 0 340 l 25 + 0 260 l 25 + 235 260 l 25 + 235 340 l 25 +235 -200 m 25 + 235 800 l 25 + 315 800 l 25 + 315 -200 l 25 + 235 -200 l 25 +EndSplineSet EndChar StartChar: leftheavyrightvertlightbxd @@ -8613,6 +8850,24 @@ Encoding: 911 9533 655 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 370 m 29 + 0 230 l 29 + 235 230 l 29 + 235 370 l 29 + 0 370 l 29 +550 340 m 25 + 315 340 l 25 + 315 260 l 25 + 550 260 l 25 + 550 340 l 25 +235 -200 m 25 + 235 800 l 25 + 315 800 l 25 + 315 -200 l 25 + 235 -200 l 25 +EndSplineSet EndChar StartChar: rightheavyleftvertlightbxd @@ -8620,6 +8875,24 @@ Encoding: 912 9534 656 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 370 m 29 + 550 230 l 29 + 315 230 l 29 + 315 370 l 29 + 550 370 l 29 +0 340 m 29 + 235 340 l 29 + 235 260 l 29 + 0 260 l 29 + 0 340 l 29 +315 -200 m 29 + 315 800 l 29 + 235 800 l 29 + 235 -200 l 29 + 315 -200 l 29 +EndSplineSet EndChar StartChar: vertlighthorzheavybxd @@ -8627,6 +8900,24 @@ Encoding: 913 9535 657 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +235 370 m 29 + 235 230 l 29 + 0 230 l 29 + 0 370 l 29 + 235 370 l 29 +550 370 m 25 + 550 230 l 25 + 315 230 l 25 + 315 370 l 25 + 550 370 l 25 +315 -200 m 25 + 315 800 l 25 + 235 800 l 25 + 235 -200 l 25 + 315 -200 l 25 +EndSplineSet EndChar StartChar: upheavydnhorzlightbxd @@ -8634,6 +8925,24 @@ Encoding: 914 9536 658 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +205 340 m 29 + 205 800 l 25 + 345 800 l 25 + 345 340 l 29 + 205 340 l 29 +550 340 m 25 + 0 340 l 25 + 0 260 l 25 + 550 260 l 25 + 550 340 l 25 +235 -200 m 25 + 235 260 l 25 + 315 260 l 25 + 315 -200 l 25 + 235 -200 l 25 +EndSplineSet EndChar StartChar: dnheavyuphorzlightbxd @@ -8641,6 +8950,24 @@ Encoding: 915 9537 659 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +205 260 m 29 + 205 -200 l 29 + 345 -200 l 29 + 345 260 l 29 + 205 260 l 29 +550 260 m 29 + 0 260 l 29 + 0 340 l 29 + 550 340 l 29 + 550 260 l 29 +235 800 m 29 + 235 340 l 29 + 315 340 l 29 + 315 800 l 29 + 235 800 l 29 +EndSplineSet EndChar StartChar: vertheavyhorzlightbxd @@ -8648,6 +8975,24 @@ Encoding: 916 9538 660 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +205 -200 m 25 + 205 800 l 25 + 345 800 l 25 + 345 -200 l 25 + 205 -200 l 25 +550 340 m 25 + 345 340 l 29 + 345 260 l 29 + 550 260 l 25 + 550 340 l 25 +205 340 m 25 + 0 340 l 25 + 0 260 l 25 + 205 260 l 25 + 205 340 l 25 +EndSplineSet EndChar StartChar: leftupheavyrightdnlightbxd @@ -8655,6 +9000,30 @@ Encoding: 917 9539 661 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 370 m 29 + 0 230 l 29 + 205 230 l 29 + 205 370 l 29 + 0 370 l 29 +315 230 m 29 + 205 230 l 5 + 205 800 l 29 + 345 800 l 5 + 345 260 l 29 + 315 230 l 29 +550 340 m 29 + 345 340 l 29 + 345 260 l 29 + 550 260 l 29 + 550 340 l 29 +235 -200 m 29 + 235 230 l 29 + 315 230 l 29 + 315 -200 l 29 + 235 -200 l 29 +EndSplineSet EndChar StartChar: rightupheavyleftdnlightbxd @@ -8662,6 +9031,30 @@ Encoding: 918 9540 662 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 370 m 29 + 550 230 l 29 + 345 230 l 29 + 345 370 l 29 + 550 370 l 29 +235 230 m 29 + 345 230 l 5 + 345 800 l 29 + 205 800 l 5 + 205 260 l 29 + 235 230 l 29 +0 340 m 29 + 205 340 l 29 + 205 260 l 29 + 0 260 l 29 + 0 340 l 29 +315 -200 m 29 + 315 230 l 29 + 235 230 l 29 + 235 -200 l 29 + 315 -200 l 29 +EndSplineSet EndChar StartChar: leftdnheavyrightuplightbxd @@ -8669,6 +9062,30 @@ Encoding: 919 9541 663 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 230 m 29 + 0 370 l 29 + 205 370 l 29 + 205 230 l 29 + 0 230 l 29 +315 370 m 29 + 205 370 l 5 + 205 -200 l 29 + 345 -200 l 5 + 345 340 l 29 + 315 370 l 29 +550 260 m 29 + 345 260 l 29 + 345 340 l 29 + 550 340 l 29 + 550 260 l 29 +235 800 m 29 + 235 370 l 29 + 315 370 l 29 + 315 800 l 29 + 235 800 l 29 +EndSplineSet EndChar StartChar: rightdnheavyleftuplightbxd @@ -8676,6 +9093,30 @@ Encoding: 920 9542 664 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 230 m 29 + 550 370 l 29 + 345 370 l 29 + 345 230 l 29 + 550 230 l 29 +235 370 m 29 + 345 370 l 5 + 345 -200 l 29 + 205 -200 l 5 + 205 340 l 29 + 235 370 l 29 +0 260 m 29 + 205 260 l 29 + 205 340 l 29 + 0 340 l 29 + 0 260 l 29 +315 800 m 29 + 315 370 l 29 + 235 370 l 29 + 235 800 l 29 + 315 800 l 29 +EndSplineSet EndChar StartChar: dnlightuphorzheavybxd @@ -8683,6 +9124,24 @@ Encoding: 921 9543 665 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +235 -200 m 25 + 235 230 l 29 + 315 230 l 29 + 315 -200 l 25 + 235 -200 l 25 +345 370 m 25 + 205 370 l 25 + 205 800 l 25 + 345 800 l 25 + 345 370 l 25 +0 230 m 25 + 0 370 l 25 + 550 370 l 25 + 550 230 l 25 + 0 230 l 25 +EndSplineSet EndChar StartChar: uplightdnhorzheavybxd @@ -8690,6 +9149,24 @@ Encoding: 922 9544 666 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +235 800 m 29 + 235 370 l 29 + 315 370 l 29 + 315 800 l 29 + 235 800 l 29 +345 230 m 29 + 205 230 l 29 + 205 -200 l 29 + 345 -200 l 29 + 345 230 l 29 +0 370 m 29 + 0 230 l 29 + 550 230 l 29 + 550 370 l 29 + 0 370 l 29 +EndSplineSet EndChar StartChar: rightlightleftvertheavybxd @@ -8697,6 +9174,24 @@ Encoding: 923 9545 667 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +344.852539062 -200 m 29 + 344.852539062 800 l 29 + 204.852539062 800 l 29 + 204.852539062 -200 l 29 + 344.852539062 -200 l 29 +-0.1474609375 370 m 29 + -0.1474609375 230 l 29 + 204.852539062 230 l 29 + 204.852539062 370 l 29 + -0.1474609375 370 l 29 +549.852539062 340 m 29 + 344.852539062 340 l 29 + 344.852539062 260 l 29 + 549.852539062 260 l 29 + 549.852539062 340 l 29 +EndSplineSet EndChar StartChar: leftlightrightvertheavybxd @@ -8704,6 +9199,24 @@ Encoding: 924 9546 668 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +205 -200 m 29 + 205 800 l 29 + 345 800 l 29 + 345 -200 l 29 + 205 -200 l 29 +550 370 m 29 + 550 230 l 29 + 345 230 l 29 + 345 370 l 29 + 550 370 l 29 +0 340 m 29 + 205 340 l 29 + 205 260 l 29 + 0 260 l 29 + 0 340 l 29 +EndSplineSet EndChar StartChar: heavyverthorzbxd @@ -8711,6 +9224,24 @@ Encoding: 925 9547 669 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +345 -200 m 29 + 205 -200 l 29 + 205 230 l 29 + 345 230 l 29 + 345 -200 l 29 +345 370 m 25 + 205 370 l 25 + 205 800 l 25 + 345 800 l 25 + 345 370 l 25 +0 230 m 25 + 0 370 l 25 + 550 370 l 25 + 550 230 l 25 + 0 230 l 25 +EndSplineSet EndChar StartChar: lightdbldashhorzbxd @@ -8718,6 +9249,19 @@ Encoding: 926 9548 670 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 340 m 25 + 345 340 l 25 + 345 260 l 25 + 550 260 l 25 + 550 340 l 25 +205 340 m 25 + 0 340 l 25 + 0 260 l 25 + 205 260 l 25 + 205 340 l 25 +EndSplineSet EndChar StartChar: heavydbldashhorzbxd @@ -8725,6 +9269,19 @@ Encoding: 927 9549 671 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +345 370 m 25 + 345 230 l 25 + 550 230 l 25 + 550 370 l 25 + 345 370 l 25 +0 370 m 25 + 0 230 l 25 + 205 230 l 25 + 205 370 l 25 + 0 370 l 25 +EndSplineSet EndChar StartChar: lightdbldashvertbxd @@ -8732,6 +9289,19 @@ Encoding: 928 9550 672 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +235 370 m 17 + 235 800 l 9 + 315 800 l 17 + 315 370 l 9 + 235 370 l 17 +315 230 m 17 + 315 -200 l 9 + 235 -200 l 17 + 235 230 l 9 + 315 230 l 17 +EndSplineSet EndChar StartChar: heavydbldashvertbxd @@ -8739,6 +9309,19 @@ Encoding: 929 9551 673 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +205 370 m 17 + 205 800 l 9 + 345 800 l 17 + 345 370 l 9 + 205 370 l 17 +345 230 m 21 + 345 -200 l 9 + 205 -200 l 1 + 205 230 l 9 + 345 230 l 21 +EndSplineSet EndChar StartChar: dblhorzbxd @@ -8746,6 +9329,19 @@ Encoding: 930 9552 674 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 230 m 25 + 0 230 l 25 + 0 150 l 25 + 550 150 l 25 + 550 230 l 25 +550 450 m 25 + 0 450 l 25 + 0 370 l 25 + 550 370 l 25 + 550 450 l 25 +EndSplineSet EndChar StartChar: dblvertbxd @@ -8753,6 +9349,19 @@ Encoding: 931 9553 675 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +345 -200 m 29 + 345 800 l 29 + 425 800 l 29 + 425 -200 l 29 + 345 -200 l 29 +125 -200 m 25 + 125 800 l 25 + 205 800 l 25 + 205 -200 l 25 + 125 -200 l 25 +EndSplineSet EndChar StartChar: dnsngrightdblbxd @@ -8760,6 +9369,24 @@ Encoding: 932 9554 676 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +315 450 m 17 + 315 -200 l 9 + 235 -200 l 17 + 235 450 l 9 + 315 450 l 17 +550 230 m 25 + 315 230 l 25 + 315 150 l 25 + 550 150 l 25 + 550 230 l 25 +550 450 m 25 + 315 450 l 25 + 315 370 l 25 + 550 370 l 25 + 550 450 l 25 +EndSplineSet EndChar StartChar: dndblrightsngbxd @@ -8767,6 +9394,24 @@ Encoding: 933 9555 677 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 340 m 25 + 125 340 l 29 + 125 260 l 29 + 550 260 l 25 + 550 340 l 25 +345 -200 m 25 + 345 260 l 25 + 425 260 l 25 + 425 -200 l 25 + 345 -200 l 25 +125 -200 m 25 + 125 260 l 25 + 205 260 l 25 + 205 -200 l 25 + 125 -200 l 25 +EndSplineSet EndChar StartChar: dbldnrightbxd @@ -8774,6 +9419,29 @@ Encoding: 934 9556 678 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 230 m 25 + 425 230 l 25 + 425 150 l 25 + 550 150 l 25 + 550 230 l 25 +550 450 m 25 + 205 450 l 25 + 205 370 l 25 + 550 370 l 25 + 550 450 l 25 +345 -200 m 25 + 345 230 l 25 + 425 230 l 25 + 425 -200 l 25 + 345 -200 l 25 +125 -200 m 25 + 125 450 l 25 + 205 450 l 25 + 205 -200 l 25 + 125 -200 l 25 +EndSplineSet EndChar StartChar: dnsngleftdblbxd @@ -8781,6 +9449,24 @@ Encoding: 935 9557 679 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +235 450 m 21 + 235 -200 l 13 + 315 -200 l 21 + 315 450 l 13 + 235 450 l 21 +0 230 m 29 + 235 230 l 29 + 235 150 l 29 + 0 150 l 29 + 0 230 l 29 +0 450 m 29 + 235 450 l 29 + 235 370 l 29 + 0 370 l 29 + 0 450 l 29 +EndSplineSet EndChar StartChar: dndblleftsngbxd @@ -8788,6 +9474,24 @@ Encoding: 936 9558 680 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 340 m 29 + 425 340 l 29 + 425 260 l 29 + 0 260 l 29 + 0 340 l 29 +205 -200 m 29 + 205 260 l 29 + 125 260 l 29 + 125 -200 l 29 + 205 -200 l 29 +425 -200 m 29 + 425 260 l 29 + 345 260 l 29 + 345 -200 l 29 + 425 -200 l 29 +EndSplineSet EndChar StartChar: dbldnleftbxd @@ -8795,6 +9499,29 @@ Encoding: 937 9559 681 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 230 m 29 + 125 230 l 29 + 125 150 l 29 + 0 150 l 29 + 0 230 l 29 +0 450 m 29 + 345 450 l 29 + 345 370 l 29 + 0 370 l 29 + 0 450 l 29 +205 -200 m 29 + 205 230 l 29 + 125 230 l 29 + 125 -200 l 29 + 205 -200 l 29 +425 -200 m 29 + 425 450 l 29 + 345 450 l 29 + 345 -200 l 29 + 425 -200 l 29 +EndSplineSet EndChar StartChar: upsngrightdblbxd @@ -8802,6 +9529,24 @@ Encoding: 938 9560 682 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +315 150 m 21 + 315 800 l 13 + 235 800 l 21 + 235 150 l 13 + 315 150 l 21 +550 370 m 29 + 315 370 l 29 + 315 450 l 29 + 550 450 l 29 + 550 370 l 29 +550 150 m 29 + 315 150 l 29 + 315 230 l 29 + 550 230 l 29 + 550 150 l 29 +EndSplineSet EndChar StartChar: updblrightsngbxd @@ -8809,6 +9554,24 @@ Encoding: 939 9561 683 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 260 m 25 + 125 260 l 25 + 125 340 l 25 + 550 340 l 25 + 550 260 l 25 +345 800 m 25 + 345 340 l 25 + 425 340 l 25 + 425 800 l 25 + 345 800 l 25 +125 800 m 25 + 125 340 l 25 + 205 340 l 25 + 205 800 l 25 + 125 800 l 25 +EndSplineSet EndChar StartChar: dbluprightbxd @@ -8816,6 +9579,29 @@ Encoding: 940 9562 684 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 370 m 25 + 425 370 l 25 + 425 450 l 25 + 550 450 l 25 + 550 370 l 25 +550 150 m 25 + 205 150 l 25 + 205 230 l 25 + 550 230 l 25 + 550 150 l 25 +345 800 m 25 + 345 370 l 25 + 425 370 l 25 + 425 800 l 25 + 345 800 l 25 +125 800 m 25 + 125 150 l 25 + 205 150 l 25 + 205 800 l 25 + 125 800 l 25 +EndSplineSet EndChar StartChar: upsngleftdblbxd @@ -8823,6 +9609,24 @@ Encoding: 941 9563 685 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +235 150 m 21 + 235 800 l 13 + 315 800 l 21 + 315 150 l 13 + 235 150 l 21 +0 370 m 29 + 235 370 l 29 + 235 450 l 29 + 0 450 l 29 + 0 370 l 29 +0 150 m 29 + 235 150 l 29 + 235 230 l 29 + 0 230 l 29 + 0 150 l 29 +EndSplineSet EndChar StartChar: updblleftsngbxd @@ -8830,6 +9634,24 @@ Encoding: 942 9564 686 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 260 m 29 + 425 260 l 29 + 425 340 l 29 + 0 340 l 29 + 0 260 l 29 +205 800 m 29 + 205 340 l 29 + 125 340 l 29 + 125 800 l 29 + 205 800 l 29 +425 800 m 29 + 425 340 l 29 + 345 340 l 29 + 345 800 l 29 + 425 800 l 29 +EndSplineSet EndChar StartChar: dblupleftbxd @@ -8837,6 +9659,29 @@ Encoding: 943 9565 687 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 370 m 29 + 125 370 l 29 + 125 450 l 29 + 0 450 l 29 + 0 370 l 29 +0 150 m 29 + 345 150 l 29 + 345 230 l 29 + 0 230 l 29 + 0 150 l 29 +205 800 m 29 + 205 370 l 29 + 125 370 l 29 + 125 800 l 29 + 205 800 l 29 +425 800 m 29 + 425 150 l 29 + 345 150 l 29 + 345 800 l 29 + 425 800 l 29 +EndSplineSet EndChar StartChar: vertsngrightdblbxd @@ -8844,6 +9689,24 @@ Encoding: 944 9566 688 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 370 m 25 + 315 370 l 29 + 315 450 l 29 + 550 450 l 25 + 550 370 l 25 +550 230 m 25 + 315 230 l 29 + 315 150 l 29 + 550 150 l 25 + 550 230 l 25 +235 -200 m 25 + 235 800 l 25 + 315 800 l 25 + 315 -200 l 25 + 235 -200 l 25 +EndSplineSet EndChar StartChar: vertdblrightsngbxd @@ -8851,6 +9714,24 @@ Encoding: 945 9567 689 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 340 m 25 + 425 340 l 29 + 425 260 l 29 + 550 260 l 25 + 550 340 l 25 +345 -200 m 25 + 345 800 l 25 + 425 800 l 25 + 425 -200 l 25 + 345 -200 l 25 +125 -200 m 25 + 125 800 l 25 + 205 800 l 25 + 205 -200 l 25 + 125 -200 l 25 +EndSplineSet EndChar StartChar: dblvertrightbxd @@ -8858,6 +9739,34 @@ Encoding: 946 9568 690 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 370 m 29 + 425 370 l 29 + 425 450 l 29 + 550 450 l 29 + 550 370 l 29 +345 800 m 25 + 345 370 l 25 + 425 370 l 25 + 425 800 l 25 + 345 800 l 25 +550 230 m 29 + 425 230 l 29 + 425 150 l 29 + 550 150 l 29 + 550 230 l 29 +345 -200 m 25 + 345 230 l 25 + 425 230 l 25 + 425 -200 l 25 + 345 -200 l 25 +125 -200 m 25 + 125 800 l 25 + 205 800 l 25 + 205 -200 l 25 + 125 -200 l 25 +EndSplineSet EndChar StartChar: vertsngleftdblbxd @@ -8865,6 +9774,24 @@ Encoding: 947 9569 691 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 370 m 29 + 235 370 l 29 + 235 450 l 29 + 0 450 l 29 + 0 370 l 29 +0 230 m 29 + 235 230 l 29 + 235 150 l 29 + 0 150 l 29 + 0 230 l 29 +315 -200 m 29 + 315 800 l 29 + 235 800 l 29 + 235 -200 l 29 + 315 -200 l 29 +EndSplineSet EndChar StartChar: vertdblleftsngbxd @@ -8872,6 +9799,24 @@ Encoding: 948 9570 692 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 340 m 29 + 125 340 l 29 + 125 260 l 29 + 0 260 l 29 + 0 340 l 29 +205 -200 m 29 + 205 800 l 29 + 125 800 l 29 + 125 -200 l 29 + 205 -200 l 29 +425 -200 m 29 + 425 800 l 29 + 345 800 l 29 + 345 -200 l 29 + 425 -200 l 29 +EndSplineSet EndChar StartChar: dblvertleftbxd @@ -8879,6 +9824,34 @@ Encoding: 949 9571 693 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 370 m 29 + 125 370 l 29 + 125 450 l 29 + 0 450 l 29 + 0 370 l 29 +205 800 m 29 + 205 370 l 29 + 125 370 l 29 + 125 800 l 29 + 205 800 l 29 +0 230 m 29 + 125 230 l 29 + 125 150 l 29 + 0 150 l 29 + 0 230 l 29 +205 -200 m 29 + 205 230 l 29 + 125 230 l 29 + 125 -200 l 29 + 205 -200 l 29 +425 -200 m 29 + 425 800 l 29 + 345 800 l 29 + 345 -200 l 29 + 425 -200 l 29 +EndSplineSet EndChar StartChar: dnsnghorzdblbxd @@ -8886,6 +9859,24 @@ Encoding: 950 9572 694 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +315 150 m 17 + 315 -200 l 9 + 235 -200 l 17 + 235 150 l 9 + 315 150 l 17 +550 230 m 25 + 0 230 l 29 + 0 150 l 29 + 550 150 l 25 + 550 230 l 25 +550 450 m 25 + 0 450 l 29 + 0 370 l 29 + 550 370 l 25 + 550 450 l 25 +EndSplineSet EndChar StartChar: dndblhorzsngbxd @@ -8893,6 +9884,24 @@ Encoding: 951 9573 695 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 340 m 25 + 0 340 l 25 + 0 260 l 25 + 550 260 l 25 + 550 340 l 25 +345 -200 m 25 + 345 260 l 25 + 425 260 l 25 + 425 -200 l 25 + 345 -200 l 25 +125 -200 m 25 + 125 260 l 25 + 205 260 l 25 + 205 -200 l 25 + 125 -200 l 25 +EndSplineSet EndChar StartChar: dbldnhorzbxd @@ -8900,6 +9909,34 @@ Encoding: 952 9574 696 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 230 m 29 + 125 230 l 29 + 125 150 l 29 + 0 150 l 29 + 0 230 l 29 +205 -200 m 29 + 205 230 l 29 + 125 230 l 29 + 125 -200 l 29 + 205 -200 l 29 +550 230 m 25 + 425 230 l 25 + 425 150 l 25 + 550 150 l 25 + 550 230 l 25 +550 450 m 25 + 0 450 l 25 + 0 370 l 25 + 550 370 l 25 + 550 450 l 25 +345 -200 m 25 + 345 230 l 25 + 425 230 l 25 + 425 -200 l 25 + 345 -200 l 25 +EndSplineSet EndChar StartChar: upsnghorzdblbxd @@ -8907,6 +9944,24 @@ Encoding: 953 9575 697 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +235 450 m 25 + 235 800 l 25 + 315 800 l 25 + 315 450 l 25 + 235 450 l 25 +550 230 m 25 + 0 230 l 25 + 0 150 l 25 + 550 150 l 25 + 550 230 l 25 +550 450 m 25 + 0 450 l 25 + 0 370 l 25 + 550 370 l 25 + 550 450 l 25 +EndSplineSet EndChar StartChar: updblhorzsngbxd @@ -8914,6 +9969,24 @@ Encoding: 954 9576 698 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +550 260 m 29 + 0 260 l 29 + 0 340 l 29 + 550 340 l 29 + 550 260 l 29 +345 800 m 29 + 345 340 l 29 + 425 340 l 29 + 425 800 l 29 + 345 800 l 29 +125 800 m 29 + 125 340 l 29 + 205 340 l 29 + 205 800 l 29 + 125 800 l 29 +EndSplineSet EndChar StartChar: dbluphorzbxd @@ -8921,6 +9994,34 @@ Encoding: 955 9577 699 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 370 m 29 + 125 370 l 29 + 125 450 l 29 + 0 450 l 29 + 0 370 l 29 +205 800 m 29 + 205 370 l 29 + 125 370 l 29 + 125 800 l 29 + 205 800 l 29 +550 370 m 29 + 425 370 l 29 + 425 450 l 29 + 550 450 l 29 + 550 370 l 29 +550 150 m 29 + 0 150 l 29 + 0 230 l 29 + 550 230 l 29 + 550 150 l 29 +345 800 m 29 + 345 370 l 29 + 425 370 l 29 + 425 800 l 29 + 345 800 l 29 +EndSplineSet EndChar StartChar: vertsnghorzdblbxd @@ -8928,6 +10029,34 @@ Encoding: 956 9578 700 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +235 230 m 25 + 235 370 l 29 + 315 370 l 29 + 315 230 l 25 + 235 230 l 25 +235 -200 m 25 + 235 150 l 25 + 315 150 l 25 + 315 -200 l 25 + 235 -200 l 25 +235 450 m 25 + 235 800 l 25 + 315 800 l 25 + 315 450 l 25 + 235 450 l 25 +550 230 m 25 + 0 230 l 25 + 0 150 l 25 + 550 150 l 25 + 550 230 l 25 +550 450 m 25 + 0 450 l 25 + 0 370 l 25 + 550 370 l 25 + 550 450 l 25 +EndSplineSet EndChar StartChar: vertdblhorzsngbxd @@ -8935,6 +10064,34 @@ Encoding: 957 9579 701 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +345 340 m 29 + 205 340 l 25 + 205 260 l 25 + 345 260 l 29 + 345 340 l 29 +550 340 m 25 + 425 340 l 25 + 425 260 l 25 + 550 260 l 25 + 550 340 l 25 +125 340 m 25 + 0 340 l 25 + 0 260 l 25 + 125 260 l 25 + 125 340 l 25 +345 -200 m 25 + 345 800 l 25 + 425 800 l 25 + 425 -200 l 25 + 345 -200 l 25 +125 -200 m 25 + 125 800 l 25 + 205 800 l 25 + 205 -200 l 25 + 125 -200 l 25 +EndSplineSet EndChar StartChar: dblverthorzbxd @@ -8942,6 +10099,49 @@ Encoding: 958 9580 702 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +0 370 m 29 + 125 370 l 29 + 125 450 l 29 + 0 450 l 29 + 0 370 l 29 +205 800 m 29 + 205 370 l 29 + 125 370 l 29 + 125 800 l 29 + 205 800 l 29 +550 370 m 29 + 425 370 l 29 + 425 450 l 29 + 550 450 l 29 + 550 370 l 29 +345 800 m 29 + 345 370 l 29 + 425 370 l 29 + 425 800 l 29 + 345 800 l 29 +0 230 m 25 + 125 230 l 25 + 125 150 l 25 + 0 150 l 25 + 0 230 l 25 +205 -200 m 25 + 205 230 l 25 + 125 230 l 25 + 125 -200 l 25 + 205 -200 l 25 +550 230 m 25 + 425 230 l 25 + 425 150 l 25 + 550 150 l 25 + 550 230 l 25 +345 -200 m 25 + 345 230 l 25 + 425 230 l 25 + 425 -200 l 25 + 345 -200 l 25 +EndSplineSet EndChar StartChar: lightarcdnrightbxd @@ -8949,6 +10149,18 @@ Encoding: 959 9581 703 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +392 340 m 5 + 305 340 235 269 235 182 c 5 + 235 -200 l 5 + 315 -200 l 5 + 315 182 l 5 + 315 224 350 260 392 260 c 5 + 550 260 l 13 + 550 340 l 5 + 392 340 l 5 +EndSplineSet EndChar StartChar: lightarcdnleftbxd @@ -8956,6 +10168,18 @@ Encoding: 960 9582 704 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +148 340 m 5 + 235 340 305 269 305 182 c 5 + 305 -200 l 5 + 225 -200 l 5 + 225 182 l 5 + 225 224 190 260 148 260 c 5 + -10 260 l 13 + -10 340 l 5 + 148 340 l 5 +EndSplineSet EndChar StartChar: lightarcupleftbxd @@ -8963,6 +10187,18 @@ Encoding: 961 9583 705 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +158 260 m 5 + 245 260 315 331 315 418 c 5 + 315 800 l 5 + 235 800 l 5 + 235 418 l 5 + 235 376 200 340 158 340 c 5 + 0 340 l 13 + 0 260 l 5 + 158 260 l 5 +EndSplineSet EndChar StartChar: lightarcuprightbxd @@ -8970,6 +10206,18 @@ Encoding: 962 9584 706 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +392 260 m 5 + 305 260 235 331 235 418 c 5 + 235 800 l 5 + 315 800 l 5 + 315 418 l 5 + 315 376 350 340 392 340 c 5 + 550 340 l 13 + 550 260 l 5 + 392 260 l 5 +EndSplineSet EndChar StartChar: lightdiaguprightdnleftbxd @@ -8977,6 +10225,14 @@ Encoding: 963 9585 707 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +-50 -200 m 29 + 505 800 l 29 + 600 800 l 29 + 45 -200 l 29 + -50 -200 l 29 +EndSplineSet EndChar StartChar: lightdiagupleftdnrightbxd @@ -8984,6 +10240,14 @@ Encoding: 964 9586 708 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +600 -200 m 29 + 45 800 l 29 + -50 800 l 29 + 505 -200 l 29 + 600 -200 l 29 +EndSplineSet EndChar StartChar: lightdiagcrossbxd @@ -8991,6 +10255,19 @@ Encoding: 965 9587 709 Width: 550 Flags: HW LayerCount: 2 +Fore +SplineSet +600 800 m 25 + 45 -200 l 25 + -50 -200 l 25 + 505 800 l 25 + 600 800 l 25 +600 -200 m 29 + 505 -200 l 29 + -50 800 l 29 + 45 800 l 29 + 600 -200 l 29 +EndSplineSet EndChar StartChar: lightleftbxd @@ -10355,32 +11632,77 @@ Flags: HW LayerCount: 2 Fore SplineSet -550 372 m 5 - 0 372 l 5 +82 300 m 5 + 275 -50 l 5 + 468 300 l 5 + 275 650 l 5 + 82 300 l 5 +0 300 m 1 275 800 l 1 - 550 372 l 5 + 550 300 l 1 + 275 -200 l 1 + 0 300 l 1 EndSplineSet EndChar StartChar: circle Encoding: 1019 9675 763 Width: 550 +VWidth: 650 Flags: HW LayerCount: 2 +Fore +SplineSet +140 303 m 4 + 140 228 200 168 275 168 c 4 + 350 168 410 228 410 303 c 4 + 410 378 350 438 275 438 c 4 + 200 438 140 378 140 303 c 4 +82 303 m 0 + 82 410 168 496 275 496 c 0 + 382 496 468 410 468 303 c 0 + 468 196 382 110 275 110 c 0 + 168 110 82 196 82 303 c 0 +EndSplineSet EndChar StartChar: H18533 Encoding: 1020 9679 764 Width: 550 +VWidth: 650 Flags: HW LayerCount: 2 +Fore +SplineSet +82 303 m 0 + 82 410 168 496 275 496 c 0 + 382 496 468 410 468 303 c 0 + 468 196 382 110 275 110 c 0 + 168 110 82 196 82 303 c 0 +EndSplineSet EndChar StartChar: whitebullet Encoding: 1021 9702 765 Width: 550 +VWidth: 1080 Flags: HW +HStem: 240 198<198.273 351.727> +VStem: 166 218<272.861 405.139> LayerCount: 2 +Fore +SplineSet +199.200195312 339.299804688 m 4 + 199.200195312 293.799804688 225.799804688 270 275.5 270 c 4 + 325.200195312 270 352 293 352 339 c 4 + 352 385 325 409 275 409 c 4 + 225 409 199.200195312 384.799804688 199.200195312 339.299804688 c 4 +166 339 m 0 + 166 404 204 438 275 438 c 0 + 346 438 384 404 384 339 c 0 + 384 274 346 240 275 240 c 0 + 204 240 166 274 166 339 c 0 +EndSplineSet EndChar StartChar: uni2619 @@ -10658,21 +11980,21 @@ Flags: HW LayerCount: 2 Fore SplineSet -309 302 m 5 - 300 317 288 324 275 324 c 4 - 239 324 219 270 219 170 c 4 - 219 152 219 136 220 123 c 5 - 309 302 l 5 -330 241 m 5 - 241 62 l 5 - 250 47 261 39 275 39 c 4 - 311 39 332 93 332 193 c 4 - 332 214 331 229 330 241 c 5 -275 364 m 4 - 341 364 372 310 372 193 c 4 - 372 66 339 0 275 0 c 4 - 209 0 178 53 178 170 c 4 - 178 297 212 364 275 364 c 4 +316 365 m 5 + 305 383 291 391 275 391 c 4 + 232 391 208 327 208 207 c 4 + 208 185 208 166 209 150 c 5 + 316 365 l 5 +341 292 m 5 + 234 77 l 5 + 245 59 258 49 275 49 c 4 + 318 49 343 114 343 234 c 4 + 343 259 342 278 341 292 c 5 +275 439 m 4 + 354 439 391 374 391 234 c 4 + 391 82 352 3 275 3 c 4 + 196 3 159 67 159 207 c 4 + 159 359 199 439 275 439 c 4 EndSplineSet EndChar @@ -10684,20 +12006,20 @@ Flags: HW LayerCount: 2 Fore SplineSet -296 38 m 1 - 296 364 l 1 - 256 364 l 1 - 189 294 l 1 - 189 234 l 1 - 256 304 l 1 - 256 38 l 1 - 191 38 l 1 - 191 -2 l 1 - 361 -2 l 1 - 361 38 l 1 - 296 38 l 1 -256 38 m 1025 -296 38 m 1025 +300 48 m 1 + 300 440 l 1 + 252 440 l 1 + 172 356 l 1 + 172 284 l 1 + 252 368 l 1 + 252 48 l 1 + 174 48 l 1 + 174 0 l 1 + 378 0 l 1 + 378 48 l 1 + 300 48 l 1 +252 48 m 1025 +300 48 m 1025 EndSplineSet EndChar @@ -10709,22 +12031,22 @@ Flags: HW LayerCount: 2 Fore SplineSet -326 272 m 20 - 326 300 305 324 275 324 c 4 - 245 324 224 300 224 272 c 14 - 224 250 l 29 - 178 250 l 29 - 178 278 l 22 - 178 324 224 364 275 364 c 4 - 326 364 372 323 372 278 c 12 - 372 261 369 251 360 237 c 30 - 230 38 l 21 - 372 38 l 5 - 372 -2 l 5 - 178 -2 l 5 - 179 38 l 13 - 314 242 l 22 - 318 248 326 260 326 272 c 20 +336 329 m 20 + 336 363 311 392 275 392 c 4 + 239 392 214 363 214 329 c 14 + 214 303 l 29 + 159 303 l 29 + 159 336 l 22 + 159 391 214 440 275 440 c 4 + 336 440 391 390 391 336 c 12 + 391 316 388 304 377 287 c 30 + 221 48 l 21 + 391 48 l 5 + 391 0 l 5 + 159 0 l 5 + 160 48 l 13 + 322 293 l 22 + 327 300 336 315 336 329 c 20 EndSplineSet EndChar @@ -10736,22 +12058,32 @@ Flags: HW LayerCount: 2 Fore SplineSet -229 165 m 5 - 229 209 l 5 - 304 209 331 226 331 276 c 4 - 331 314 317 327 275 327 c 4 - 233 327 219 315 219 281 c 5 - 178 281 l 5 - 178 343 206 367 275 367 c 4 - 344 367 372 341 372 274 c 4 - 372 229 370 209 312 185 c 5 - 367 162 372 139 372 93 c 4 - 372 31 339 0 275 -0 c 4 - 212 0 178 29 178 86 c 5 - 219 86 l 5 - 219 55 238 40 275 40 c 4 - 312 40 331 57 331 91 c 4 - 331 145 303 165 229 165 c 5 +276 245 m 22 + 313 245 343 270 343 301 c 6 + 343 329 l 6 + 343 363 312 391 276 391 c 4 + 240 391 209 363 209 329 c 6 + 209 325 l 13 + 160 325 l 21 + 160 336 l 6 + 160 391 215 439 275 439 c 4 + 337 439 391 391 391 336 c 6 + 391 301 l 6 + 391 270 373 240 347 221 c 5 + 373 202 391 173 391 142 c 6 + 391 106 l 6 + 391 51 337 3 275 3 c 4 + 214 3 160 51 160 106 c 6 + 160 109 l 13 + 209 109 l 21 + 209 106 l 6 + 209 75 239 51 276 51 c 4 + 313 51 343 75 343 106 c 6 + 343 135 l 6 + 343 169 312 197 276 197 c 14 + 234 197 l 29 + 234 245 l 29 + 276 245 l 22 EndSplineSet EndChar @@ -10763,17 +12095,17 @@ Flags: HW LayerCount: 2 Fore SplineSet -325 -2 m 17 - 325 364 l 1 - 285 364 l 1 - 178 134 l 1 - 178 94 l 1 - 372 94 l 1 - 372 134 l 1 - 220 134 l 1 - 285 278 l 1 - 285 -2 l 9 - 325 -2 l 17 +335 0 m 17 + 335 440 l 1 + 287 440 l 1 + 159 164 l 1 + 159 116 l 1 + 391 116 l 1 + 391 164 l 1 + 209 164 l 1 + 287 336 l 1 + 287 0 l 9 + 335 0 l 17 EndSplineSet EndChar @@ -10785,24 +12117,24 @@ Flags: HW LayerCount: 2 Fore SplineSet -178 70 m 1025 -179 183 m 17 - 290 183 l 2 - 317 183 331 167 331 136 c 2 - 331 85 l 2 - 331 59 306 38 275 38 c 0 - 244 38 219 59 219 85 c 1 - 178 85 l 1 - 178 39 224 -2 275 -2 c 4 - 326 -2 371 39 371 85 c 2 - 372 142 l 2 - 372 190 339 223 291 223 c 2 - 219 223 l 9 - 218 324 l 25 - 371 324 l 25 - 371 364 l 25 - 178 364 l 25 - 179 183 l 17 +159 87 m 1025 +160 222 m 17 + 293 222 l 2 + 325 222 342 203 342 166 c 2 + 342 105 l 2 + 342 74 312 48 275 48 c 0 + 238 48 208 74 208 105 c 1 + 159 105 l 1 + 159 50 214 0 275 0 c 4 + 336 0 390 50 390 105 c 2 + 391 173 l 2 + 391 231 352 270 294 270 c 2 + 208 270 l 9 + 207 392 l 25 + 390 392 l 25 + 390 440 l 25 + 159 440 l 25 + 160 222 l 17 EndSplineSet EndChar @@ -10814,28 +12146,28 @@ Flags: HW LayerCount: 2 Fore SplineSet -178 85 m 2 - 178 39 225 -2 276 -2 c 0 - 327 -2 372 39 372 85 c 2 - 372 127 l 2 - 372 172 327 213 276 213 c 0 - 257 213 236 206 219 195 c 1 - 219 271 l 2 - 219 299 245 323 275 323 c 0 - 305 323 331 299 331 271 c 2 - 331 266 l 1 - 372 266 l 1 - 372 277 l 2 - 372 322 327 363 276 363 c 0 - 225 363 178 322 178 277 c 2 - 178 85 l 2 -219 85 m 2 - 219 121 l 2 - 219 149 245 173 275 173 c 0 - 305 173 331 149 331 121 c 2 - 331 85 l 2 - 331 59 306 38 275 38 c 0 - 244 38 219 59 219 85 c 2 +159 105 m 2 + 159 50 215 1 276 1 c 0 + 337 1 391 50 391 105 c 2 + 391 155 l 2 + 391 209 337 259 276 259 c 0 + 253 259 228 250 208 237 c 1 + 208 328 l 2 + 208 362 239 391 275 391 c 0 + 311 391 342 362 342 328 c 2 + 342 322 l 1 + 391 322 l 1 + 391 335 l 2 + 391 389 337 439 276 439 c 0 + 215 439 159 389 159 335 c 2 + 159 105 l 2 +208 105 m 2 + 208 148 l 2 + 208 182 239 211 275 211 c 0 + 311 211 342 182 342 148 c 2 + 342 105 l 2 + 342 74 312 49 275 49 c 0 + 238 49 208 74 208 105 c 2 EndSplineSet EndChar @@ -10847,13 +12179,13 @@ Flags: HW LayerCount: 2 Fore SplineSet -204 -2 m 17 - 314 324 l 1 - 178 324 l 1 - 178 364 l 1 - 372 364 l 1 - 252 -2 l 9 - 204 -2 l 17 +190 0 m 17 + 322 392 l 1 + 159 392 l 1 + 159 440 l 1 + 391 440 l 1 + 247 0 l 9 + 190 0 l 17 EndSplineSet EndChar @@ -10865,34 +12197,34 @@ Flags: HW LayerCount: 2 Fore SplineSet -219 257 m 6 - 219 271 l 6 - 219 299 245 323 275 323 c 4 - 305 323 331 299 331 271 c 6 - 331 257 l 6 - 331 231 306 211 275 211 c 4 - 244 211 219 231 219 257 c 6 -178 257 m 6 - 178 211 224 171 275 171 c 4 - 326 171 372 211 372 257 c 6 - 372 277 l 6 - 372 322 327 363 276 363 c 4 - 225 363 178 322 178 277 c 6 - 178 257 l 6 -219 85 m 6 - 219 118 l 6 - 219 146 245 170 275 170 c 4 - 305 170 331 146 331 118 c 6 - 331 85 l 6 - 331 59 306 38 275 38 c 4 - 244 38 219 59 219 85 c 6 -178 85 m 6 - 178 39 225 -2 276 -2 c 4 - 327 -2 372 39 372 85 c 6 - 372 124 l 6 - 372 169 326 210 275 210 c 4 - 224 210 178 170 178 124 c 6 - 178 85 l 6 +208 311 m 6 + 208 328 l 6 + 208 362 239 391 275 391 c 4 + 311 391 342 362 342 328 c 6 + 342 311 l 6 + 342 280 312 256 275 256 c 4 + 238 256 208 280 208 311 c 6 +159 311 m 6 + 159 256 214 208 275 208 c 4 + 336 208 391 256 391 311 c 6 + 391 335 l 6 + 391 389 337 439 276 439 c 4 + 215 439 159 389 159 335 c 6 + 159 311 l 6 +208 105 m 6 + 208 145 l 6 + 208 179 239 207 275 207 c 4 + 311 207 342 179 342 145 c 6 + 342 105 l 6 + 342 74 312 49 275 49 c 4 + 238 49 208 74 208 105 c 6 +159 105 m 6 + 159 50 215 1 276 1 c 4 + 337 1 391 50 391 105 c 6 + 391 152 l 6 + 391 206 336 255 275 255 c 4 + 214 255 159 207 159 152 c 6 + 159 105 l 6 EndSplineSet EndChar @@ -10904,23 +12236,23 @@ Flags: HW LayerCount: 2 Fore SplineSet -336 162 m 1 - 249 -2 l 1 - 204 -2 l 1 - 280 149 l 1 - 228 149 178 190 178 235 c 2 - 178 277 l 2 - 178 323 224 364 275 364 c 0 - 326 364 372 323 372 277 c 2 - 372 255 l 2 - 372 228 366 214 336 162 c 1 -331 277 m 2 - 331 303 306 324 275 324 c 0 - 244 324 219 303 219 277 c 2 - 219 241 l 2 - 219 213 245 189 275 189 c 0 - 305 189 331 213 331 241 c 2 - 331 277 l 2 +348 197 m 1 + 244 0 l 1 + 190 0 l 1 + 281 182 l 1 + 219 182 159 231 159 285 c 2 + 159 335 l 2 + 159 390 214 440 275 440 c 0 + 336 440 391 390 391 335 c 2 + 391 309 l 2 + 391 277 384 259 348 197 c 1 +342 335 m 2 + 342 366 312 392 275 392 c 0 + 238 392 208 366 208 335 c 2 + 208 292 l 2 + 208 258 239 230 275 230 c 0 + 311 230 342 258 342 292 c 2 + 342 335 l 2 EndSplineSet EndChar @@ -10932,21 +12264,21 @@ Flags: HW LayerCount: 2 Fore SplineSet -309 638 m 5 - 300 653 288 660 275 660 c 4 - 239 660 219 606 219 506 c 4 - 219 488 219 472 220 459 c 5 - 309 638 l 5 -330 577 m 5 - 241 398 l 5 - 250 383 261 375 275 375 c 4 - 311 375 332 429 332 529 c 4 - 332 550 331 565 330 577 c 5 -275 700 m 4 - 341 700 372 646 372 529 c 4 - 372 402 339 336 275 336 c 4 - 209 336 178 389 178 506 c 4 - 178 633 212 700 275 700 c 4 +315.799804688 662 m 1 + 305 680 290.599609375 688.400390625 275 688.400390625 c 0 + 231.799804688 688.400390625 207.799804688 623.599609375 207.799804688 503.599609375 c 0 + 207.799804688 482 207.799804688 462.799804688 209 447.200195312 c 1 + 315.799804688 662 l 1 +341 588.799804688 m 1 + 234.200195312 374 l 1 + 245 356 258.200195312 346.400390625 275 346.400390625 c 0 + 318.200195312 346.400390625 343.400390625 411.200195312 343.400390625 531.200195312 c 0 + 343.400390625 556.400390625 342.200195312 574.400390625 341 588.799804688 c 1 +275 736.400390625 m 0 + 354.200195312 736.400390625 391.400390625 671.599609375 391.400390625 531.200195312 c 0 + 391.400390625 378.799804688 351.799804688 299.599609375 275 299.599609375 c 0 + 195.799804688 299.599609375 158.599609375 363.200195312 158.599609375 503.599609375 c 0 + 158.599609375 656 199.400390625 736.400390625 275 736.400390625 c 0 EndSplineSet EndChar @@ -10958,20 +12290,20 @@ Flags: HW LayerCount: 2 Fore SplineSet -296 376 m 5 - 296 700 l 5 - 256 700 l 5 - 189 630 l 5 - 189 570 l 5 - 256 640 l 5 - 256 376 l 5 - 191 376 l 5 - 191 336 l 5 - 361 336 l 5 - 361 376 l 5 - 296 376 l 5 -256 376 m 1029 -296 376 m 1029 +300.200195312 347.599609375 m 5 + 300.200195312 736.400390625 l 5 + 252.200195312 736.400390625 l 5 + 171.799804688 652.400390625 l 5 + 171.799804688 580.400390625 l 5 + 252.200195312 664.400390625 l 5 + 252.200195312 347.599609375 l 5 + 174.200195312 347.599609375 l 5 + 174.200195312 299.599609375 l 5 + 378.200195312 299.599609375 l 5 + 378.200195312 347.599609375 l 5 + 300.200195312 347.599609375 l 5 +252.200195312 347.599609375 m 1029 +300.200195312 347.599609375 m 1029 EndSplineSet EndChar @@ -10983,22 +12315,22 @@ Flags: HW LayerCount: 2 Fore SplineSet -326 608 m 16 - 326 636 305 660 275 660 c 0 - 245 660 224 636 224 608 c 10 - 224 588 l 25 - 178 588 l 25 - 178 614 l 18 - 178 660 224 700 275 700 c 0 - 326 700 372 659 372 614 c 8 - 372 597 369 588 360 574 c 26 - 230 376 l 17 - 372 376 l 1 - 372 336 l 1 - 178 336 l 1 - 179 376 l 9 - 314 579 l 18 - 318 585 326 596 326 608 c 16 +336.200195312 626 m 16 + 336.200195312 659.599609375 311 688.400390625 275 688.400390625 c 0 + 239 688.400390625 213.799804688 659.599609375 213.799804688 626 c 10 + 213.799804688 602 l 25 + 158.599609375 602 l 25 + 158.599609375 633.200195312 l 18 + 158.599609375 688.400390625 213.799804688 736.400390625 275 736.400390625 c 0 + 336.200195312 736.400390625 391.400390625 687.200195312 391.400390625 633.200195312 c 8 + 391.400390625 612.799804688 387.799804688 602 377 585.200195312 c 26 + 221 347.599609375 l 17 + 391.400390625 347.599609375 l 1 + 391.400390625 299.599609375 l 1 + 158.599609375 299.599609375 l 1 + 159.799804688 347.599609375 l 9 + 321.799804688 591.200195312 l 18 + 326.599609375 598.400390625 336.200195312 611.599609375 336.200195312 626 c 16 EndSplineSet EndChar @@ -11010,22 +12342,32 @@ Flags: HW LayerCount: 2 Fore SplineSet -229 502 m 5 - 229 546 l 5 - 304 546 331 563 331 613 c 4 - 331 651 317 664 275 664 c 4 - 233 664 219 652 219 618 c 5 - 178 618 l 5 - 178 680 206 704 275 704 c 4 - 344 704 372 678 372 611 c 4 - 372 566 370 546 312 522 c 5 - 367 499 372 476 372 430 c 4 - 372 368 339 337 275 337 c 4 - 212 337 178 366 178 423 c 5 - 219 423 l 5 - 219 392 238 377 275 377 c 4 - 312 377 331 394 331 428 c 4 - 331 482 303 502 229 502 c 5 +275 546.099609375 m 22 + 312.200195312 546.099609375 342.200195312 570.099609375 342.200195312 601.299804688 c 6 + 342.200195312 630.099609375 l 6 + 342.200195312 663.700195312 311 692.5 275 692.5 c 4 + 239 692.5 207.799804688 663.700195312 207.799804688 630.099609375 c 6 + 207.799804688 625.299804688 l 13 + 158.599609375 625.299804688 l 21 + 158.599609375 637.299804688 l 6 + 158.599609375 692.5 213.799804688 740.5 273.799804688 740.5 c 4 + 336.200195312 740.5 391.400390625 692.5 391.400390625 637.299804688 c 6 + 391.400390625 601.299804688 l 6 + 391.400390625 570.099609375 373.400390625 540.099609375 347 520.900390625 c 5 + 373.400390625 501.700195312 391.400390625 472.900390625 391.400390625 441.700195312 c 6 + 391.400390625 406.900390625 l 6 + 391.400390625 351.700195312 336.200195312 302.5 273.799804688 302.5 c 4 + 212.599609375 302.5 158.599609375 351.700195312 158.599609375 406.900390625 c 6 + 158.599609375 409.299804688 l 13 + 207.799804688 409.299804688 l 21 + 207.799804688 406.900390625 l 6 + 207.799804688 375.700195312 237.799804688 350.5 275 350.5 c 4 + 312.200195312 350.5 342.200195312 375.700195312 342.200195312 406.900390625 c 6 + 342.200195312 434.5 l 6 + 342.200195312 468.099609375 311 496.900390625 275 496.900390625 c 14 + 233 496.900390625 l 29 + 233 546.099609375 l 29 + 275 546.099609375 l 22 EndSplineSet EndChar @@ -11037,17 +12379,17 @@ Flags: HW LayerCount: 2 Fore SplineSet -325 336 m 21 - 325 700 l 5 - 285 700 l 1 - 178 470 l 1 - 178 430 l 1 - 372 430 l 1 - 372 470 l 1 - 220 470 l 1 - 285 616 l 1 - 285 336 l 9 - 325 336 l 21 +335 299.599609375 m 21 + 335 736.400390625 l 5 + 287 736.400390625 l 1 + 158.599609375 460.400390625 l 1 + 158.599609375 412.400390625 l 1 + 391.400390625 412.400390625 l 1 + 391.400390625 460.400390625 l 1 + 209 460.400390625 l 1 + 287 635.599609375 l 1 + 287 299.599609375 l 9 + 335 299.599609375 l 21 EndSplineSet EndChar @@ -11059,24 +12401,24 @@ Flags: HW LayerCount: 2 Fore SplineSet -178 407 m 1029 -179 520 m 21 - 290 520 l 6 - 317 520 331 504 331 473 c 6 - 331 422 l 6 - 331 396 306 376 275 376 c 4 - 244 376 219 396 219 422 c 5 - 178 422 l 5 - 178 376 224 336 275 336 c 4 - 326 336 371 376 371 422 c 6 - 372 479 l 6 - 372 527 339 560 291 560 c 6 - 219 560 l 13 - 218 660 l 29 - 371 660 l 29 - 371 700 l 29 - 178 700 l 29 - 179 520 l 21 +158.599609375 384.799804688 m 1029 +159.799804688 520.400390625 m 21 + 293 520.400390625 l 6 + 325.400390625 520.400390625 342.200195312 501.200195312 342.200195312 464 c 6 + 342.200195312 402.799804688 l 6 + 342.200195312 371.599609375 312.200195312 347.599609375 275 347.599609375 c 4 + 237.799804688 347.599609375 207.799804688 371.599609375 207.799804688 402.799804688 c 5 + 158.599609375 402.799804688 l 5 + 158.599609375 347.599609375 213.799804688 299.599609375 275 299.599609375 c 4 + 336.200195312 299.599609375 390.200195312 347.599609375 390.200195312 402.799804688 c 6 + 391.400390625 471.200195312 l 6 + 391.400390625 528.799804688 351.799804688 568.400390625 294.200195312 568.400390625 c 6 + 207.799804688 568.400390625 l 13 + 206.599609375 688.400390625 l 29 + 390.200195312 688.400390625 l 29 + 390.200195312 736.400390625 l 29 + 158.599609375 736.400390625 l 29 + 159.799804688 520.400390625 l 21 EndSplineSet EndChar @@ -11088,28 +12430,28 @@ Flags: HW LayerCount: 2 Fore SplineSet -178 422 m 2 - 178 376 225 335 276 335 c 0 - 327 335 372 376 372 422 c 2 - 372 464 l 2 - 372 509 327 550 276 550 c 0 - 257 550 236 543 219 532 c 1 - 219 608 l 2 - 219 636 245 660 275 660 c 0 - 305 660 331 636 331 608 c 2 - 331 603 l 1 - 372 603 l 1 - 372 614 l 2 - 372 659 327 700 276 700 c 0 - 225 700 178 659 178 614 c 2 - 178 422 l 2 -219 422 m 2 - 219 458 l 2 - 219 486 245 510 275 510 c 0 - 305 510 331 486 331 458 c 2 - 331 422 l 2 - 331 396 306 375 275 375 c 0 - 244 375 219 396 219 422 c 2 +158.599609375 402.900390625 m 2 + 158.599609375 347.700195312 215 298.5 276.200195312 298.5 c 0 + 337.400390625 298.5 391.400390625 347.700195312 391.400390625 402.900390625 c 2 + 391.400390625 453.299804688 l 2 + 391.400390625 507.299804688 337.400390625 556.5 276.200195312 556.5 c 0 + 253.400390625 556.5 228.200195312 548.099609375 207.799804688 534.900390625 c 1 + 207.799804688 626.099609375 l 2 + 207.799804688 659.700195312 239 688.5 275 688.5 c 0 + 311 688.5 342.200195312 659.700195312 342.200195312 626.099609375 c 2 + 342.200195312 620.099609375 l 1 + 391.400390625 620.099609375 l 1 + 391.400390625 633.299804688 l 2 + 391.400390625 687.299804688 337.400390625 736.5 276.200195312 736.5 c 0 + 215 736.5 158.599609375 687.299804688 158.599609375 633.299804688 c 2 + 158.599609375 402.900390625 l 2 +207.799804688 402.900390625 m 2 + 207.799804688 446.099609375 l 2 + 207.799804688 479.700195312 239 508.5 275 508.5 c 0 + 311 508.5 342.200195312 479.700195312 342.200195312 446.099609375 c 2 + 342.200195312 402.900390625 l 2 + 342.200195312 371.700195312 312.200195312 346.5 275 346.5 c 0 + 237.799804688 346.5 207.799804688 371.700195312 207.799804688 402.900390625 c 2 EndSplineSet EndChar @@ -11121,13 +12463,13 @@ Flags: HW LayerCount: 2 Fore SplineSet -204 336 m 21 - 314 660 l 5 - 178 660 l 5 - 178 700 l 5 - 372 700 l 5 - 252 336 l 13 - 204 336 l 21 +189.799804688 299.599609375 m 21 + 321.799804688 688.400390625 l 5 + 158.599609375 688.400390625 l 5 + 158.599609375 736.400390625 l 5 + 391.400390625 736.400390625 l 5 + 247.400390625 299.599609375 l 13 + 189.799804688 299.599609375 l 21 EndSplineSet EndChar @@ -11139,34 +12481,34 @@ Flags: HW LayerCount: 2 Fore SplineSet -219 594 m 2 - 219 608 l 2 - 219 636 245 660 275 660 c 0 - 305 660 331 636 331 608 c 2 - 331 594 l 2 - 331 568 306 548 275 548 c 0 - 244 548 219 568 219 594 c 2 -178 594 m 2 - 178 548 224 508 275 508 c 0 - 326 508 372 548 372 594 c 2 - 372 614 l 2 - 372 659 327 700 276 700 c 0 - 225 700 178 659 178 614 c 2 - 178 594 l 2 -219 422 m 2 - 219 455 l 2 - 219 483 245 507 275 507 c 0 - 305 507 331 483 331 455 c 2 - 331 422 l 2 - 331 396 306 375 275 375 c 0 - 244 375 219 396 219 422 c 2 -178 422 m 2 - 178 376 225 335 276 335 c 0 - 327 335 372 376 372 422 c 2 - 372 461 l 2 - 372 506 326 547 275 547 c 0 - 224 547 178 507 178 461 c 2 - 178 422 l 2 +207.799804688 609.299804688 m 2 + 207.799804688 626.099609375 l 2 + 207.799804688 659.700195312 239 688.5 275 688.5 c 0 + 311 688.5 342.200195312 659.700195312 342.200195312 626.099609375 c 2 + 342.200195312 609.299804688 l 2 + 342.200195312 578.099609375 312.200195312 554.099609375 275 554.099609375 c 0 + 237.799804688 554.099609375 207.799804688 578.099609375 207.799804688 609.299804688 c 2 +158.599609375 609.299804688 m 2 + 158.599609375 554.099609375 213.799804688 506.099609375 275 506.099609375 c 0 + 336.200195312 506.099609375 391.400390625 554.099609375 391.400390625 609.299804688 c 2 + 391.400390625 633.299804688 l 2 + 391.400390625 687.299804688 337.400390625 736.5 276.200195312 736.5 c 0 + 215 736.5 158.599609375 687.299804688 158.599609375 633.299804688 c 2 + 158.599609375 609.299804688 l 2 +207.799804688 402.900390625 m 2 + 207.799804688 442.5 l 2 + 207.799804688 476.099609375 239 504.900390625 275 504.900390625 c 0 + 311 504.900390625 342.200195312 476.099609375 342.200195312 442.5 c 2 + 342.200195312 402.900390625 l 2 + 342.200195312 371.700195312 312.200195312 346.5 275 346.5 c 0 + 237.799804688 346.5 207.799804688 371.700195312 207.799804688 402.900390625 c 2 +158.599609375 402.900390625 m 2 + 158.599609375 347.700195312 215 298.5 276.200195312 298.5 c 0 + 337.400390625 298.5 391.400390625 347.700195312 391.400390625 402.900390625 c 2 + 391.400390625 449.700195312 l 2 + 391.400390625 503.700195312 336.200195312 552.900390625 275 552.900390625 c 0 + 213.799804688 552.900390625 158.599609375 504.900390625 158.599609375 449.700195312 c 2 + 158.599609375 402.900390625 l 2 EndSplineSet EndChar @@ -11178,23 +12520,23 @@ Flags: HW LayerCount: 2 Fore SplineSet -336 498 m 1 - 249 336 l 1 - 204 336 l 1 - 280 486 l 1 - 228 486 178 527 178 572 c 2 - 178 614 l 2 - 178 660 224 700 275 700 c 0 - 326 700 372 660 372 614 c 2 - 372 592 l 2 - 372 565 366 550 336 498 c 1 -331 614 m 2 - 331 640 306 660 275 660 c 4 - 244 660 219 640 219 614 c 2 - 219 578 l 2 - 219 550 245 526 275 526 c 0 - 305 526 331 550 331 578 c 2 - 331 614 l 2 +348.200195312 494 m 1 + 243.799804688 299.599609375 l 1 + 189.799804688 299.599609375 l 1 + 281 479.599609375 l 1 + 218.599609375 479.599609375 158.599609375 528.799804688 158.599609375 582.799804688 c 2 + 158.599609375 633.200195312 l 2 + 158.599609375 688.400390625 213.799804688 736.400390625 275 736.400390625 c 0 + 336.200195312 736.400390625 391.400390625 688.400390625 391.400390625 633.200195312 c 2 + 391.400390625 606.799804688 l 2 + 391.400390625 574.400390625 384.200195312 556.400390625 348.200195312 494 c 1 +342.200195312 633.200195312 m 2 + 342.200195312 664.400390625 312.200195312 688.400390625 275 688.400390625 c 4 + 237.799804688 688.400390625 207.799804688 664.400390625 207.799804688 633.200195312 c 2 + 207.799804688 590 l 2 + 207.799804688 556.400390625 239 527.599609375 275 527.599609375 c 0 + 311 527.599609375 342.200195312 556.400390625 342.200195312 590 c 2 + 342.200195312 633.200195312 l 2 EndSplineSet EndChar diff --git a/Makefile b/Makefile index ac47cad..81e29e5 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ build: - python3 build.py - py3clean . + @mkdir -p out + @python3 build.py -B 2> out/err.log + @py3clean . install: build - cp out/KawaiiMonoRegularPatched.ttf ~/.local/share/fonts/KawaiiMonoRegular.ttf - fc-cache -f -v + @cp out/KawaiiMonoRegularPatched.ttf ~/.local/share/fonts/KawaiiMonoRegular.ttf + @fc-cache -f -v diff --git a/build.py b/build.py index a6eb78a..f33f8b2 100644 --- a/build.py +++ b/build.py @@ -1,3 +1,7 @@ +import os +import sys +sys.path.append(os.path.realpath(os.path.dirname(__file__)+"/src")) +sys.path.append(os.path.realpath(os.path.dirname(__file__)+"/assets")) from src.build import build import config if __name__ == "__main__": build(config.config) diff --git a/config.py b/config.py index 477578f..3d0476f 100644 --- a/config.py +++ b/config.py @@ -41,25 +41,31 @@ config = { # 폰트 용량이 매우 커집니다!! "CopyKoreanGlyphs": True, - # TODO: 이 설정은 아직 동작하지 않습니다 # 노토 산스 모노에서 가타카나/히라가나 # 글리프를 복사할 지에 대한 여부입니다 # 한자는 포함하지 않습니다 - "CopyJapaneseGlyphs": False, + "CopyJapaneseGlyphs": True, + + # 노토 산스에서 단위관련 기호, 원형 기호 + # 글리프를 복사할 지에 대한 여부입니다 + # 폰트위 용량이 매우 커집니다!! + "CopySymbols": True, - # TODO: 이 설정은 아직 동작하지 않습니다 # 노토 산스 모노에서 CJK 공용 한자 글리프를 # 복사할 지에 대한 여부입니다. # 폰트 용량이 매우 커집니다!! # 웹용 폰트의 경우 끄는것을 추천합니다 - "CopyCJKUnifiedIdeographs": False, + #! 최소 2분 이상 걸립니다!! + "CopyCJKUnifiedIdeographs": True, # 일반적인 CJK Unified + "CopyCJKUnifiedIdeographsExtension": False, # Extension A~F + "CopyCJKCompatibilityIdeographs": False, # Compatibility Ideograph, Supplement + #! 이 옵션들을 활성화시 ttf 포멧으로 저장에 실패할 수 있습니다 + #? ttf 의 글자수 제한 때문에 그런것이므로, 다른 포멧으로 저장해야합니다. - # TODO: 이 설정은 아직 동작하지 않습니다 # 라틴 글리프를 Hack 폰트에서 더 가져옵니다 # (성조 표시된 라틴, ...) "CopyLatinExtra": True, - # TODO: 이 설정은 아직 동작하지 않습니다 # Nerd Fonts 패치를 적용할지에 대한 # 여부입니다. 폰트 용량이 매우 커집니다!! # 웹용 폰트의 경우 끄는것을 추천합니다 diff --git a/src/NanumSquareNeo.py b/src/NanumSquareNeo.py deleted file mode 100644 index 2f16dee..0000000 --- a/src/NanumSquareNeo.py +++ /dev/null @@ -1,87 +0,0 @@ -from . import wgetHandler -import os -import zipfile -import shutil -import math -from . import utility as Utility -import fontforge - -link_NanumSquareNeo = "https://campaign.naver.com/nanumsquare_neo/download/NaverNanumSquareNeo.zip" -patchVersion = 2 # 업데이트 후 캐시를 무시하기 위해서 사용 - -# 폰트 다운로드와 열기 -# 배포 방식이 zip 으로 배포이기 때문에 zipfile 라이브러리로 -# 다운로드 후 언팩함 -def getFontPath(): - if not os.path.exists("assets"): os.mkdir("assets") - if not os.path.exists("assets/NanumSquareNeoKr.ttf"): - if not os.path.exists("assets/NanumSquareNeoKr.zip"): - wgetHandler.download(link_NanumSquareNeo,"assets/NanumSquareNeoKr.zip") - print("Unzipping NanumSquareNeoKr.zip",end="") - with zipfile.ZipFile("assets/NanumSquareNeoKr.zip", 'r') as zip_ref: - extractName = zip_ref.extract("NaverNanumSquareNeo/TTF/NanumSquareNeo-bRg.ttf","assets/NanumSquareNeoKr.extract") - os.rename(extractName,"assets/NanumSquareNeoKr.ttf") - shutil.rmtree('assets/NanumSquareNeoKr.extract') - print(" [OK]") - return "assets/NanumSquareNeoKr.ttf" - -# 한글 범위의 글립을 선택함 -def selectGlyphs(font): - font.selection.none() - font.selection.select(("more","ranges","unicode"),0x3131,0x32BF) # ㄱ ~ ㊿ - font.selection.select(("more","ranges","unicode"),0xAC00,0xD7A3) # 가 ~ 힣 - -# 굵기/폭 설정 캐시파일 만들기 -def getCache(sourcePath,baseSize=550,weight=16): - # 캐시된 파일을 확인하고 있으면 반환 - filename = "assets/cache/NanumSquareNeoKr.cache_{}.base_{}.weight_{}.sfd".format(patchVersion,baseSize,weight) - if os.path.exists(filename): - return fontforge.open(filename) - - # 새로운 캐시용 폰트 생성 - cache=fontforge.font() - cache.encoding = 'UnicodeFull' - - # 소스 폰트를 패치시킴 - source=fontforge.open(sourcePath) - selectGlyphs(source) - source.changeWeight(weight) # 굵기 변경 - - # 너비 지정 - Utility.setWidthWithSavingPosition( - font=source,targetWidth=baseSize*2 - ) - - # 캐시에 붇여넣기 - source.copy() - selectGlyphs(cache) - cache.paste() - - # 캐시 폰트 저장 - if not os.path.exists("assets/cache"): os.mkdir("assets/cache") - cache.save(filename) - return cache - -# Regular 같은 문자열 weight 를 포인트 값으로 변경 -weightStrToNum = { - "Regular": 16, -} - -# 캐시를 가져와서 글리프를 타겟 폰트에 붇여넣음 -def pasteGlyphs(target,sourcePath,baseSize=550,weightStr="Regular"): - - # 캐시된 소스를 읽어드림 - source = getCache( - sourcePath = sourcePath, - baseSize = baseSize, - weight = weightStrToNum.get(weightStr) - ) - - # 타겟으로 글리프 복사 - selectGlyphs(source) - source.copy() - selectGlyphs(target) - target.paste() - - # 캐시 닫기 - source.close() diff --git a/src/NotoMono.py b/src/NotoMono.py deleted file mode 100644 index 14bedca..0000000 --- a/src/NotoMono.py +++ /dev/null @@ -1,38 +0,0 @@ -from . import wgetHandler -import os - -github_NotoSansMonoCJKkr = "https://github.com/googlefonts/noto-cjk/raw/main/Sans/Mono/NotoSansMonoCJKkr-Regular.otf" - -# 폰트 다운로드와 열기 -def getFontPath(): - if not os.path.exists("assets"): os.mkdir("assets") - if not os.path.exists("assets/NotoMonoCJKkr.otf"): - wgetHandler.download(github_NotoSansMonoCJKkr,"assets/NotoMonoCJKkr.otf") - return "assets/NotoMonoCJKkr.otf" - -def pasteGlyphs(target,source,baseSize=550,JapaneseGlyphs=False,CJKUnifiedIdeographs=False): - source.cidFlatten() - - def select(font): - font.selection.none() - font.selection.select(("more","ranges","unicode"),0x3131,0x32BF) # ㄱ ~ ㊿ - font.selection.select(("more","ranges","unicode"),0xAC00,0xD7A3) # 가 ~ 힣 - select(source) - - # 넓은 글자 크기 (한글에 모두 적용) - wideWidth = baseSize*2 - for glyph in source.selection.byGlyphs: - widthDiff = wideWidth-glyph.width # 타겟 너비와 얼마나 크기 차이가 나는지 - sideAdjust = widthDiff/2 # 좌우 사이드 조정해야하는 정도 - glyph.left_side_bearing = int(glyph.left_side_bearing + math.floor(sideAdjust)) # 좌우 베어링을 조정함 - glyph.right_side_bearing = int(glyph.right_side_bearing + math.ceil(sideAdjust)) - glyph.width = wideWidth # 타겟 너비로 정확하게 설정 - - # 타겟으로 글리프 복사 - source.copy() - select(target) - target.paste() - - -if __name__ == "__main__": - getFontPath() diff --git a/src/build.py b/src/build.py deleted file mode 100644 index a7b09a2..0000000 --- a/src/build.py +++ /dev/null @@ -1,58 +0,0 @@ -import fontforge -import os - -from . import NanumSquareNeo as NanumSquareNeoLoader -from . import NotoMono as NotoMonoLoader -from . import KawaiiMono as KawaiiMonoLoader -from . import utility as Utility - -def build(config=None): - # 메인 폰트 불러오기 - kawaii = fontforge.open( - KawaiiMonoLoader.getFontPath()) - - # 모든 글리프를 붇여넣을 수 있도록 인코딩을 utf full 로 변경 - kawaii.encoding = 'UnicodeFull' - - # 폰트 가로폭 설정 - baseSize = config.get("FontBaseWidth") - if baseSize != 550: - Utility.setWidthWithSavingPosition( - font=kawaii,targetWidth=baseSize - ) - - # 한글 글리프 붇여넣기 - if config.get("CopyKoreanGlyphs"): - # 나눔 스퀘어 네오 다운로드/불러오기 - nanumSquareNeo = NanumSquareNeoLoader.getFontPath() - # 글리프 붇여넣기 - NanumSquareNeoLoader.pasteGlyphs( - target=kawaii,baseSize=baseSize,weightStr="Regular", - sourcePath=nanumSquareNeo) - - if (config.get("CopyJapaneseGlyphs") or - config.get("CopyCJKUnifiedIdeographs")): - # 노토 모노 다운로드/불러오기 - notoMono = fontforge.open( - NotoMonoLoader.getFontPath()) - # 글리프 붇여넣기 - NotoMonoLoader.pasteGlyphs( - JapaneseGlyphs=config.get("CopyJapaneseGlyphs") or False, - CJKUnifiedIdeographs=config.get("CopyCJKUnifiedIdeographs") or False, - target=kawaii,baseSize=550, - source=notoMono) - notoMono.close() - - # 생성 - if not os.path.exists("out"): os.mkdir("out") - kawaii.generate("out/"+"KawaiiMonoRegularPatched.ttf") - - # KawaiiMonoRegularPatched.ttf - # KawaiiMonoRegularPatched.otf - # KawaiiMonoRegularPatched.woff - # KawaiiMonoRegularPatched.eot - - # 파일 닫기 - kawaii.close() - -if __name__ == "__main__": build() diff --git a/src/KawaiiMono.py b/src/build/KawaiiMono.py similarity index 100% rename from src/KawaiiMono.py rename to src/build/KawaiiMono.py diff --git a/src/build/NanumSquareNeo/__init__.py b/src/build/NanumSquareNeo/__init__.py new file mode 100644 index 0000000..57b7845 --- /dev/null +++ b/src/build/NanumSquareNeo/__init__.py @@ -0,0 +1,7 @@ + +patchVersion = 2 # 업데이트 후 캐시를 무시하기 위해서 사용 + +from . import select as selectGlyphs +from .download import download +from .cacheBuilder import getCachedFont +from .patcher import pasteGlyphs diff --git a/src/build/NanumSquareNeo/cacheBuilder.py b/src/build/NanumSquareNeo/cacheBuilder.py new file mode 100644 index 0000000..50d43f2 --- /dev/null +++ b/src/build/NanumSquareNeo/cacheBuilder.py @@ -0,0 +1,40 @@ + +import utility as Utility +import fontforge +import os +from . import selectGlyphs +from . import patchVersion + +# 굵기/폭 설정 캐시파일 만들기 +def getCachedFont(sourcePath,baseSize=550,weight=16): + # 캐시된 파일을 확인하고 있으면 반환 + filename = "assets/cache/NanumSquareNeoKr.cache_{}.base_{}.weight_{}.sfd".format(patchVersion,baseSize,weight) + if os.path.exists(filename): + print("Found build cache [OK]") + return fontforge.open(filename) + print("Creating new build cache",end="") + + # 새로운 캐시용 폰트 생성 + cache=fontforge.font() + cache.encoding = 'UnicodeFull' + + # 소스 폰트를 패치시킴 + source=fontforge.open(sourcePath) + selectGlyphs.Korean(source) + source.changeWeight(weight) # 굵기 변경 + + # 너비 지정 + Utility.setWidthWithSavingPosition( + font=source,targetWidth=baseSize*2 + ) + + # 캐시에 붇여넣기 + source.copy() + selectGlyphs.Korean(cache) + cache.paste() + + # 캐시 폰트 저장 + if not os.path.exists("assets/cache"): os.mkdir("assets/cache") + cache.save(filename) + print(" [OK]") + return cache diff --git a/src/build/NanumSquareNeo/download.py b/src/build/NanumSquareNeo/download.py new file mode 100644 index 0000000..f14cb7d --- /dev/null +++ b/src/build/NanumSquareNeo/download.py @@ -0,0 +1,22 @@ +import zipfile +import shutil +import wgetHandler +import os + +link_NanumSquareNeo = "https://campaign.naver.com/nanumsquare_neo/download/NaverNanumSquareNeo.zip" + +# 폰트 다운로드와 열기 +# 배포 방식이 zip 으로 배포이기 때문에 zipfile 라이브러리로 +# 다운로드 후 언팩함 +def download(): + if not os.path.exists("assets"): os.mkdir("assets") + if not os.path.exists("assets/NanumSquareNeoKr.ttf"): + if not os.path.exists("assets/NanumSquareNeoKr.zip"): + wgetHandler.download(link_NanumSquareNeo,"assets/NanumSquareNeoKr.zip") + print("Unzipping NanumSquareNeoKr.zip",end="") + with zipfile.ZipFile("assets/NanumSquareNeoKr.zip", 'r') as zip_ref: + extractName = zip_ref.extract("NaverNanumSquareNeo/TTF/NanumSquareNeo-bRg.ttf","assets/NanumSquareNeoKr.extract") + os.rename(extractName,"assets/NanumSquareNeoKr.ttf") + shutil.rmtree('assets/NanumSquareNeoKr.extract') + print(" [OK]") + return "assets/NanumSquareNeoKr.ttf" diff --git a/src/build/NanumSquareNeo/patcher.py b/src/build/NanumSquareNeo/patcher.py new file mode 100644 index 0000000..837b2c2 --- /dev/null +++ b/src/build/NanumSquareNeo/patcher.py @@ -0,0 +1,32 @@ +from . import getCachedFont +from . import selectGlyphs + +# Regular 같은 문자열 weight 를 포인트 값으로 변경 +weightStrToNum = { + "Regular": 16, +} + +# 캐시를 가져와서 글리프를 타겟 폰트에 붇여넣음 +def pasteGlyphs(target,sourcePath,deselectOriginalGlyphs,baseSize=550,weightStr="Regular"): + + # 캐시된 소스를 읽어드림 + print("Patching: NanumSquareNeo") + source = getCachedFont( + sourcePath = sourcePath, + baseSize = baseSize, + weight = weightStrToNum.get(weightStr) + ) + + selectGlyphs.Clear(source) + selectGlyphs.Clear(target) + + # 타겟으로 글리프 복사 + selectGlyphs.Korean(source) + deselectOriginalGlyphs(source) + source.copy() + selectGlyphs.Korean(target) + deselectOriginalGlyphs(target) + target.paste() + + # 캐시 닫기 + source.close() diff --git a/src/build/NanumSquareNeo/select.py b/src/build/NanumSquareNeo/select.py new file mode 100644 index 0000000..ff66678 --- /dev/null +++ b/src/build/NanumSquareNeo/select.py @@ -0,0 +1,8 @@ +# 한글 범위의 글립을 선택함 +def Korean(font): + font.selection.none() + font.selection.select(("more","ranges","unicode"),0x3131,0x32BF) # ㄱ ~ ㊿ + font.selection.select(("more","ranges","unicode"),0xAC00,0xD7A3) # 가 ~ 힣 + +def Clear(font): + font.selection.none() diff --git a/src/build/NerdFonts/__init__.py b/src/build/NerdFonts/__init__.py new file mode 100644 index 0000000..303aead --- /dev/null +++ b/src/build/NerdFonts/__init__.py @@ -0,0 +1,3 @@ + +from .download import downloadPatcher +from .download import nerdFonts_Download_Test \ No newline at end of file diff --git a/src/build/NerdFonts/download.py b/src/build/NerdFonts/download.py new file mode 100644 index 0000000..bae6779 --- /dev/null +++ b/src/build/NerdFonts/download.py @@ -0,0 +1,21 @@ +import os +import wgetHandler +import zipfile + +link_FontPatcher = "https://github.com/ryanoasis/nerd-fonts/releases/latest/download/FontPatcher.zip" + +def downloadPatcher(): + if not os.path.exists("assets"): os.mkdir("assets") + if not os.path.exists("assets/NerdFontPatcher_extract"): + if not os.path.exists("assets/NerdFontPatcher.zip"): + wgetHandler.download(link_FontPatcher,"assets/NerdFontPatcher.zip") + print("Unzipping NerdFontPatcher.zip",end="") + with zipfile.ZipFile("assets/NerdFontPatcher.zip", 'r') as zip_ref: + extractName = zip_ref.extractall("assets/NerdFontPatcher_extract") + os.rename("assets/NerdFontPatcher_extract/font-patcher","assets/NerdFontPatcher_extract/fontPatcher.py") + with open("assets/NerdFontPatcher_extract/__init__.py","w") as file: + file.write("") + print(" [OK]") + return "assets/NerdFontPatcher_extract" + +def nerdFonts_Download_Test(): downloadPatcher() diff --git a/src/nerdfonts/nerdfonts.py b/src/build/NerdFonts/nerdfonts.py similarity index 100% rename from src/nerdfonts/nerdfonts.py rename to src/build/NerdFonts/nerdfonts.py diff --git a/src/build/NotoMono/__init__.py b/src/build/NotoMono/__init__.py new file mode 100644 index 0000000..2cc08b2 --- /dev/null +++ b/src/build/NotoMono/__init__.py @@ -0,0 +1,7 @@ + +patchVersion = 2 + +from .download import download +from . import select as selectGlyphs +from .cacheBuilder import getCachedFont +from .patcher import pasteGlyphs diff --git a/src/build/NotoMono/cacheBuilder.py b/src/build/NotoMono/cacheBuilder.py new file mode 100644 index 0000000..ee25adb --- /dev/null +++ b/src/build/NotoMono/cacheBuilder.py @@ -0,0 +1,56 @@ + +import utility as Utility +import fontforge +import os +from . import selectGlyphs +from . import patchVersion + +# 굵기/폭 설정 캐시파일 만들기 +def getCachedFont(sourcePath,EnabledItems,baseSize=550,weight=16): + # 캐시된 파일을 확인하고 있으면 반환 + filename = "assets/cache/NotoMono.cache_{}.base_{}.weight_{}{}{}{}{}{}.sfd".format( + patchVersion,baseSize,weight, + EnabledItems.get("JapaneseGlyphs") and ".jp" or "", + EnabledItems.get("CJKUnifiedIdeographs") and ".id" or "", + EnabledItems.get("CopyCJKUnifiedIdeographsExtension") and ".ide" or "", + EnabledItems.get("CopyCJKCompatibilityIdeographs") and ".cid" or "", + EnabledItems.get("Symbols") and ".sym" or "") + if os.path.exists(filename): + print("Found build cache [OK]") + return fontforge.open(filename) + print("Creating new build cache",end="") + + # 새로운 캐시용 폰트 생성 + cache=fontforge.font() + cache.encoding = 'UnicodeFull' + + # 소스 폰트를 패치시킴 + source=fontforge.open(sourcePath) + source.cidFlatten() + source.encoding = 'UnicodeFull' + if EnabledItems.get("JapaneseGlyphs"): selectGlyphs.JapaneseGlyphs(source) + if EnabledItems.get("Symbols"): selectGlyphs.Symbols(source) + source.changeWeight(weight) # 굵기 변경 + selectGlyphs.SelectByEnabledList(source,EnabledItems) + # 한자 글립은 냥많아서 크기조절하면 끝이 안난다냥 + + # 너비 지정 + Utility.setWidthWithSavingPosition( + font=source,targetWidth=baseSize*2 + ) + + Utility.scale(font=source,targetScale=0.85) + + # 캐시에 붇여넣기 + source.copy() + selectGlyphs.SelectByEnabledList(cache,EnabledItems) + cache.paste() + + selectGlyphs.Clear(cache) + selectGlyphs.Clear(source) + + # 캐시 폰트 저장 + if not os.path.exists("assets/cache"): os.mkdir("assets/cache") + cache.save(filename) + print(" [OK]") + return cache diff --git a/src/build/NotoMono/download.py b/src/build/NotoMono/download.py new file mode 100644 index 0000000..a267482 --- /dev/null +++ b/src/build/NotoMono/download.py @@ -0,0 +1,11 @@ +import os +import wgetHandler + +github_NotoSansMonoCJKkr = "https://github.com/googlefonts/noto-cjk/raw/main/Sans/Mono/NotoSansMonoCJKkr-Regular.otf" + +# 폰트 다운로드와 열기 +def download(): + if not os.path.exists("assets"): os.mkdir("assets") + if not os.path.exists("assets/NotoMonoCJKkr.otf"): + wgetHandler.download(github_NotoSansMonoCJKkr,"assets/NotoMonoCJKkr.otf") + return "assets/NotoMonoCJKkr.otf" diff --git a/src/build/NotoMono/patcher.py b/src/build/NotoMono/patcher.py new file mode 100644 index 0000000..9bb09e1 --- /dev/null +++ b/src/build/NotoMono/patcher.py @@ -0,0 +1,30 @@ +from . import selectGlyphs +from . import getCachedFont + +# Regular 같은 문자열 weight 를 포인트 값으로 변경 +weightStrToNum = { + "Regular": 16, +} + +def pasteGlyphs(target,sourcePath,deselectOriginalGlyphs,EnabledItems,baseSize=550,weightStr="Regular"): + # 캐시된 소스를 읽어드림 + source = getCachedFont( + sourcePath = sourcePath, + baseSize = baseSize, + weight = weightStrToNum.get(weightStr), + EnabledItems = EnabledItems + ) + + selectGlyphs.Clear(source) + selectGlyphs.Clear(target) + + # 타겟으로 글리프 복사 + selectGlyphs.SelectByEnabledList(source,EnabledItems) + deselectOriginalGlyphs(source) + source.copy() + selectGlyphs.SelectByEnabledList(source,target) + deselectOriginalGlyphs(target) + target.paste() + + # 캐시 닫기 + source.close() diff --git a/src/build/NotoMono/select.py b/src/build/NotoMono/select.py new file mode 100644 index 0000000..74bf70f --- /dev/null +++ b/src/build/NotoMono/select.py @@ -0,0 +1,73 @@ +selFlag = ("more","ranges","unicode") + +# 일본어 글립 선택 +def JapaneseGlyphs(font): + # 사각문자 (Square) + font.selection.select(selFlag,0x32FF,0x2271) + font.selection.select(selFlag,0x337B,0x337F) # Missing one char + font.selection.select(selFlag,0x1F200,0x1F200) + + # 히라가나/가타카나 + font.selection.select(selFlag,0x3041,0x30FF) + font.selection.select(selFlag,0x31F0,0x31FF) # SMALL Katakana + font.selection.select(selFlag,0xFF66,0xFF9F) # HalfWidth Katakana + + # 일어 기호 + font.selection.select(selFlag,0xFF5B,0xFF65) + +# CJK 한자 글립 선택 +def CJKUnifiedIdeographs(font): + # CJK Stroke + font.selection.select(selFlag,0x31C0,0x31E3) + + # Bopomofo + font.selection.select(selFlag,0x3105,0x312F) + font.selection.select(selFlag,0x31A0,0x31BB) + + # CJK Unified Ideograph + font.selection.select(selFlag,0x4E00,0x9FFF) + + +def CJKUnifiedIdeographsExtension(font): + font.selection.select(selFlag,0x3400,0x4DBF) # Extension A + font.selection.select(selFlag,0x20000,0x2A6DF) # Extension B + font.selection.select(selFlag,0x2A700,0x2B73F) # Extension C + font.selection.select(selFlag,0x2B740,0x2B81F) # Extension D + font.selection.select(selFlag,0x2B820,0x2CEAF) # Extension E + font.selection.select(selFlag,0x2CEB0,0x2EBEF) # Extension F + +def CJKCompatibilityIdeographs(font): + # CJK Compatibility Ideograph + font.selection.select(selFlag,0xF900,0xFAFF) + # CJK Compatibility Ideographs Supplement + font.selection.select(selFlag,0x2F800,0x2FA1F) + +def Symbols(font): + # 원형, 단위기호 + font.selection.select(selFlag,0x3220,0x3250) + font.selection.select(selFlag,0x3220,0x3250) + font.selection.select(selFlag,0x3280,0x32B0) # Missing ... + font.selection.select(selFlag,0x32C0,0x32FE) + + # 단위 기호 + font.selection.select(selFlag,0x3358,0x337A) + font.selection.select(selFlag,0x3380,0x33FF) + + # Latin Ligature + font.selection.select(selFlag,0xFB00,0xFB04) + + # 특수기호/FULLWIDTH Latin + font.selection.select(selFlag,0xFE10,0xFF5A) + font.selection.select(selFlag,0xFFE0,0xFFEE) + font.selection.select(selFlag,0x1F100,0x1F1AC) + font.selection.select(selFlag,0x1F201,0x1F251) + +def SelectByEnabledList(target,EnabledItems): + if EnabledItems.get("JapaneseGlyphs"): JapaneseGlyphs(target) + if EnabledItems.get("CJKUnifiedIdeographs"): CJKUnifiedIdeographs(target) + if EnabledItems.get("CJKUnifiedIdeographsExtension"): CJKUnifiedIdeographsExtension(target) + if EnabledItems.get("CJKCompatibilityIdeographs"): CJKCompatibilityIdeographs(target) + if EnabledItems.get("Symbols"): Symbols(target) + +def Clear(font): + font.selection.none() diff --git a/src/build/__init__.py b/src/build/__init__.py new file mode 100644 index 0000000..eddc09d --- /dev/null +++ b/src/build/__init__.py @@ -0,0 +1,4 @@ + +from .build import build + +from .NerdFonts import nerdFonts_Download_Test diff --git a/src/build/build.py b/src/build/build.py new file mode 100644 index 0000000..c288284 --- /dev/null +++ b/src/build/build.py @@ -0,0 +1,91 @@ +import os +import utility as Utility +import fontforge + +from . import NerdFonts as NerdFontsLoader +from . import NanumSquareNeo as NanumSquareNeoLoader +from . import NotoMono as NotoMonoLoader +from . import KawaiiMono as KawaiiMonoLoader + +deselectFlags = ("less","unicode") + +def build(config=None): + # 메인 폰트 불러오기 / 에셋 다운로드 + kawaii = fontforge.open( + KawaiiMonoLoader.getFontPath()) + print("-------------- DOWNLOAD PATCH CONTENTS --------------") + # 나눔 스퀘어 네오 다운로드 + nanumSquareNeo = None + if config.get("CopyKoreanGlyphs"): + nanumSquareNeo = NanumSquareNeoLoader.download() + # 노토 모노 다운로드/불러오기 + notoMono = None + if (config.get("CopyJapaneseGlyphs") or + config.get("CopyCJKUnifiedIdeographs") or + config.get("CopyCJKUnifiedIdeographsExtension") or + config.get("CopyCJKCompatibilityIdeographs")): + notoMono = NotoMonoLoader.download() + # Nerd fonts 패치기 다운로드 + nerdFontsPatcherPath = None + if config.get("NerdFonts"): + nerdFontsPatcherPath = NerdFontsLoader.downloadPatcher() + print("--------------------- Patching ---------------------") + + # 유지 목록 (덮어쓰기 금지) 만들기 + kawaii.selection.all() + keepList = [i.unicode for i in kawaii.selection.byGlyphs] + def deselectOriginalGlyphs(target): + for unicode in keepList: + if unicode == -1: continue + target.selection.select(deselectFlags,unicode) + + # 모든 글리프를 붇여넣을 수 있도록 인코딩을 utf full 로 변경 + kawaii.encoding = 'UnicodeFull' + + # 폰트 가로폭 설정 + baseSize = config.get("FontBaseWidth") + if baseSize != 550: + Utility.setWidthWithSavingPosition( + font=kawaii,targetWidth=baseSize + ) + + # 한글 글리프 붇여넣기 + if nanumSquareNeo: + # 글리프 붇여넣기 + NanumSquareNeoLoader.pasteGlyphs( + target=kawaii,baseSize=baseSize,weightStr="Regular", + sourcePath=nanumSquareNeo, + deselectOriginalGlyphs = deselectOriginalGlyphs) + + # 일어 글리프 혹은 한자 글리프 추가 + if notoMono: + # 글리프 붇여넣기 + NotoMonoLoader.pasteGlyphs( + EnabledItems = { + "JapaneseGlyphs": config.get("CopyJapaneseGlyphs") or False, + "CJKUnifiedIdeographs": config.get("CopyCJKUnifiedIdeographs") or False, + "CJKUnifiedIdeographsExtension": config.get("CopyCJKUnifiedIdeographsExtension"), + "CJKCompatibilityIdeographs": config.get("CopyCJKCompatibilityIdeographs"), + }, + Symbols=config.get("CopySymbols") or False, + target=kawaii,baseSize=550, + sourcePath=notoMono, + deselectOriginalGlyphs = deselectOriginalGlyphs) + + # NerdFonts 패치 적용 + # if config.get("NerdFonts"): + # nerdFontsPatcherPath = NerdFontsLoader.downloadPatcher() + + # 생성 + if not os.path.exists("out"): os.mkdir("out") + kawaii.generate("out/"+"KawaiiMonoRegularPatched.ttf") + + # KawaiiMonoRegularPatched.ttf + # KawaiiMonoRegularPatched.otf + # KawaiiMonoRegularPatched.woff + # KawaiiMonoRegularPatched.eot + + # 파일 닫기 + kawaii.close() + +if __name__ == "__main__": build() diff --git a/src/liga/liga.py b/src/liga/liga.py deleted file mode 100644 index 6b9a9c8..0000000 --- a/src/liga/liga.py +++ /dev/null @@ -1,4 +0,0 @@ - -def pasteGlyphs(target,sourceList): - - diff --git a/src/nerdfonts/download.py b/src/nerdfonts/download.py deleted file mode 100644 index 1b111ae..0000000 --- a/src/nerdfonts/download.py +++ /dev/null @@ -1,36 +0,0 @@ -import os -import zipfile -# from .. import wgetHandler - -import os -import importlib -basePath = os.path.realpath(os.path.dirname(__file__)+"/../") -wgetHandlerSpec = importlib.util.spec_from_file_location("wgetHandler",basePath+"/wgetHandler.py") -wgetHandler = importlib.util.module_from_spec(wgetHandlerSpec) -wgetHandlerSpec.loader.exec_module(wgetHandler) - - -# import wgetHandler - -print("__file__ : {__file__}".format(__file__=__file__)) -print("wgetHandler (spec)") -print(importlib.util.spec_from_file_location("wgetHandler",basePath)) -print("wgetHandler [object]") -print(wgetHandler) -print(help(wgetHandler)) -# import wgetHandler - -link_FontPatcher = "https://github.com/ryanoasis/nerd-fonts/releases/latest/download/FontPatcher.zip" - -def downloadPatcher(): - if not os.path.exists("assets"): os.mkdir("assets") - if not os.path.exists("assets/NerdFontPatcher_extract"): - if not os.path.exists("assets/NerdFontPatcher.zip"): - wgetHandler.download(link_FontPatcher,"assets/NerdFontPatcher.zip") - print("Unzipping NerdFontPatcher.zip",end="") - with zipfile.ZipFile("assets/NerdFontPatcher.zip", 'r') as zip_ref: - extractName = zip_ref.extractall("assets/NerdFontPatcher_extract") - print(" [OK]") - return "assets/NanumSquareNeoKr.ttf" - -if __name__ == "__main__": downloadPatcher() diff --git a/src/utility/__init__.py b/src/utility/__init__.py new file mode 100644 index 0000000..8851a2c --- /dev/null +++ b/src/utility/__init__.py @@ -0,0 +1,2 @@ + +from .utility import * diff --git a/src/utility.py b/src/utility/utility.py similarity index 84% rename from src/utility.py rename to src/utility/utility.py index 59c0eef..5431107 100644 --- a/src/utility.py +++ b/src/utility/utility.py @@ -1,4 +1,5 @@ import math +import psMat def setWidthWithSavingPosition(font,targetWidth): for glyph in font.selection.byGlyphs: @@ -7,3 +8,7 @@ def setWidthWithSavingPosition(font,targetWidth): glyph.left_side_bearing = int(glyph.left_side_bearing + math.floor(sideAdjust)) # 좌우 베어링을 조정함 glyph.right_side_bearing = int(glyph.right_side_bearing + math.ceil(sideAdjust)) glyph.width = targetWidth # 타겟 너비로 정확하게 설정 + +def scale(font,targetScale): + font.transform(psMat.scale(targetScale)) + font.round() diff --git a/src/wget b/src/wget deleted file mode 160000 index fdd3a0f..0000000 --- a/src/wget +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fdd3a0f8404ccab90f939f9952af139e6c55142a diff --git a/src/wgetHandler/__init__.py b/src/wgetHandler/__init__.py new file mode 100644 index 0000000..1dffe75 --- /dev/null +++ b/src/wgetHandler/__init__.py @@ -0,0 +1,2 @@ + +from .wgetHandler import * diff --git a/src/wgetHandler/wget/README.txt b/src/wgetHandler/wget/README.txt new file mode 100644 index 0000000..eedfa72 --- /dev/null +++ b/src/wgetHandler/wget/README.txt @@ -0,0 +1,95 @@ +Usage +===== + + python -m wget [options] + + options: + -o --output FILE|DIR output filename or directory + + +API Usage +========= + + >>> import wget + >>> url = 'http://www.futurecrew.com/skaven/song_files/mp3/razorback.mp3' + >>> filename = wget.download(url) + 100% [................................................] 3841532 / 3841532> + >> filename + 'razorback.mp3' + +The skew that you see above is a documented side effect. +Alternative progress bar: + + >>> wget.download(url, bar=bar_thermometer) + + +ChangeLog +========= +2.2 (2014-07-19) + * it again can download without -o option + +2.1 (2014-07-10) + * it shows command line help + * -o option allows to select output file/directory + + * download(url, out, bar) contains out parameter + +2.0 (2013-04-26) + * it shows percentage + * it has usage examples + * it changes if being used as a library + + * download shows progress bar by default + * bar_adaptive gets improved algorithm + * download(url, bar) contains bar parameter + * bar(current, total) + * progress_callback is named callback_progress + +1.0 (2012-11-13) + * it runs with Python 3 + +0.9 (2012-11-13) + * it renames file if it already exists + * it can be used as a library + + * download(url) returns filename + * bar_adaptive() draws progress bar + * bar_thermometer() simplified bar + +0.8 (2011-05-03) + * it detects filename from HTTP headers + +0.7 (2011-03-01) + * compatibility fix for Python 2.5 + * limit width of progress bar to 100 chars + +0.6 (2010-04-24) + * it detects console width on POSIX + +0.5 (2010-04-23) + * it detects console width on Windows + +0.4 (2010-04-15) + * it shows cute progress bar + +0.3 (2010-04-05) + * it creates temp file in current dir + +0.2 (2010-02-16) + * it tries to detect filename from URL + +0.1 (2010-02-04) + * it can download file + + +Release Checklist +================= + +| [ ] update version in wget.py +| [x] update description in setup.py +| [ ] python setup.py check -mrs +| [ ] python setup.py sdist upload +| [ ] tag hg version + +-- +anatoly techtonik diff --git a/src/wgetHandler/wget/setup.py b/src/wgetHandler/wget/setup.py new file mode 100644 index 0000000..7a9ee26 --- /dev/null +++ b/src/wgetHandler/wget/setup.py @@ -0,0 +1,37 @@ +from distutils.core import setup + + +def get_version(relpath): + """read version info from file without importing it""" + from os.path import dirname, join + for line in open(join(dirname(__file__), relpath)): + if '__version__' in line: + if '"' in line: + # __version__ = "0.9" + return line.split('"')[1] + elif "'" in line: + return line.split("'")[1] + +setup( + name='wget', + version=get_version('wget.py'), + author='anatoly techtonik ', + url='http://bitbucket.org/techtonik/python-wget/', + + description="pure python download utility", + license="Public Domain", + classifiers=[ + 'Environment :: Console', + 'License :: Public Domain', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 3', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: System :: Networking', + 'Topic :: Utilities', + ], + + py_modules=['wget'], + + long_description=open('README.txt').read(), +) diff --git a/src/wgetHandler/wget/wget.py b/src/wgetHandler/wget/wget.py new file mode 100755 index 0000000..7eb177f --- /dev/null +++ b/src/wgetHandler/wget/wget.py @@ -0,0 +1,402 @@ +#!/usr/bin/env python +""" +Download utility as an easy way to get file from the net + + python -m wget + python wget.py + +Downloads: http://pypi.python.org/pypi/wget/ +Development: http://bitbucket.org/techtonik/python-wget/ + +wget.py is not option compatible with Unix wget utility, +to make command line interface intuitive for new people. + +Public domain by anatoly techtonik +Also available under the terms of MIT license +Copyright (c) 2010-2014 anatoly techtonik +""" + + +import sys, shutil, os +import tempfile +import math + +PY3K = sys.version_info >= (3, 0) +if PY3K: + import urllib.request as urllib + import urllib.parse as urlparse +else: + import urllib + import urlparse + + +__version__ = "2.3-beta1" + + +def filename_from_url(url): + """:return: detected filename or None""" + fname = os.path.basename(urlparse.urlparse(url).path) + if len(fname.strip(" \n\t.")) == 0: + return None + return fname + +def filename_from_headers(headers): + """Detect filename from Content-Disposition headers if present. + http://greenbytes.de/tech/tc2231/ + + :param: headers as dict, list or string + :return: filename from content-disposition header or None + """ + if type(headers) == str: + headers = headers.splitlines() + if type(headers) == list: + headers = dict([x.split(':', 1) for x in headers]) + cdisp = headers.get("Content-Disposition") + if not cdisp: + return None + cdtype = cdisp.split(';') + if len(cdtype) == 1: + return None + if cdtype[0].strip().lower() not in ('inline', 'attachment'): + return None + # several filename params is illegal, but just in case + fnames = [x for x in cdtype[1:] if x.strip().startswith('filename=')] + if len(fnames) > 1: + return None + name = fnames[0].split('=')[1].strip(' \t"') + name = os.path.basename(name) + if not name: + return None + return name + +def filename_fix_existing(filename): + """Expands name portion of filename with numeric ' (x)' suffix to + return filename that doesn't exist already. + """ + dirname = '.' + name, ext = filename.rsplit('.', 1) + names = [x for x in os.listdir(dirname) if x.startswith(name)] + names = [x.rsplit('.', 1)[0] for x in names] + suffixes = [x.replace(name, '') for x in names] + # filter suffixes that match ' (x)' pattern + suffixes = [x[2:-1] for x in suffixes + if x.startswith(' (') and x.endswith(')')] + indexes = [int(x) for x in suffixes + if set(x) <= set('0123456789')] + idx = 1 + if indexes: + idx += sorted(indexes)[-1] + return '%s (%d).%s' % (name, idx, ext) + + +# --- terminal/console output helpers --- + +def get_console_width(): + """Return width of available window area. Autodetection works for + Windows and POSIX platforms. Returns 80 for others + + Code from http://bitbucket.org/techtonik/python-pager + """ + + if os.name == 'nt': + STD_INPUT_HANDLE = -10 + STD_OUTPUT_HANDLE = -11 + STD_ERROR_HANDLE = -12 + + # get console handle + from ctypes import windll, Structure, byref + try: + from ctypes.wintypes import SHORT, WORD, DWORD + except ImportError: + # workaround for missing types in Python 2.5 + from ctypes import ( + c_short as SHORT, c_ushort as WORD, c_ulong as DWORD) + console_handle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) + + # CONSOLE_SCREEN_BUFFER_INFO Structure + class COORD(Structure): + _fields_ = [("X", SHORT), ("Y", SHORT)] + + class SMALL_RECT(Structure): + _fields_ = [("Left", SHORT), ("Top", SHORT), + ("Right", SHORT), ("Bottom", SHORT)] + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + _fields_ = [("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", WORD), + ("srWindow", SMALL_RECT), + ("dwMaximumWindowSize", DWORD)] + + sbi = CONSOLE_SCREEN_BUFFER_INFO() + ret = windll.kernel32.GetConsoleScreenBufferInfo(console_handle, byref(sbi)) + if ret == 0: + return 0 + return sbi.srWindow.Right+1 + + elif os.name == 'posix': + from fcntl import ioctl + from termios import TIOCGWINSZ + from array import array + + winsize = array("H", [0] * 4) + try: + ioctl(sys.stdout.fileno(), TIOCGWINSZ, winsize) + except IOError: + pass + return (winsize[1], winsize[0])[0] + + return 80 + + +def bar_thermometer(current, total, width=80): + """Return thermometer style progress bar string. `total` argument + can not be zero. The minimum size of bar returned is 3. Example: + + [.......... ] + + Control and trailing symbols (\r and spaces) are not included. + See `bar_adaptive` for more information. + """ + # number of dots on thermometer scale + avail_dots = width-2 + shaded_dots = int(math.floor(float(current) / total * avail_dots)) + return '[' + '.'*shaded_dots + ' '*(avail_dots-shaded_dots) + ']' + +def bar_adaptive(current, total, width=80): + """Return progress bar string for given values in one of three + styles depending on available width: + + [.. ] downloaded / total + downloaded / total + [.. ] + + if total value is unknown or <= 0, show bytes counter using two + adaptive styles: + + %s / unknown + %s + + if there is not enough space on the screen, do not display anything + + returned string doesn't include control characters like \r used to + place cursor at the beginning of the line to erase previous content. + + this function leaves one free character at the end of string to + avoid automatic linefeed on Windows. + """ + + # process special case when total size is unknown and return immediately + if not total or total < 0: + msg = "%s / unknown" % current + if len(msg) < width: # leaves one character to avoid linefeed + return msg + if len("%s" % current) < width: + return "%s" % current + + # --- adaptive layout algorithm --- + # + # [x] describe the format of the progress bar + # [x] describe min width for each data field + # [x] set priorities for each element + # [x] select elements to be shown + # [x] choose top priority element min_width < avail_width + # [x] lessen avail_width by value if min_width + # [x] exclude element from priority list and repeat + + # 10% [.. ] 10/100 + # pppp bbbbb sssssss + + min_width = { + 'percent': 4, # 100% + 'bar': 3, # [.] + 'size': len("%s" % total)*2 + 3, # 'xxxx / yyyy' + } + priority = ['percent', 'bar', 'size'] + + # select elements to show + selected = [] + avail = width + for field in priority: + if min_width[field] < avail: + selected.append(field) + avail -= min_width[field]+1 # +1 is for separator or for reserved space at + # the end of line to avoid linefeed on Windows + # render + output = '' + for field in selected: + + if field == 'percent': + # fixed size width for percentage + output += ('%s%%' % (100 * current // total)).rjust(min_width['percent']) + elif field == 'bar': # [. ] + # bar takes its min width + all available space + output += bar_thermometer(current, total, min_width['bar']+avail) + elif field == 'size': + # size field has a constant width (min == max) + output += ("%s / %s" % (current, total)).rjust(min_width['size']) + + selected = selected[1:] + if selected: + output += ' ' # add field separator + + return output + +# --/ console helpers + + +__current_size = 0 # global state variable, which exists solely as a + # workaround against Python 3.3.0 regression + # http://bugs.python.org/issue16409 + # fixed in Python 3.3.1 +def callback_progress(blocks, block_size, total_size, bar_function): + """callback function for urlretrieve that is called when connection is + created and when once for each block + + draws adaptive progress bar in terminal/console + + use sys.stdout.write() instead of "print,", because it allows one more + symbol at the line end without linefeed on Windows + + :param blocks: number of blocks transferred so far + :param block_size: in bytes + :param total_size: in bytes, can be -1 if server doesn't return it + :param bar_function: another callback function to visualize progress + """ + global __current_size + + width = min(100, get_console_width()) + + if sys.version_info[:3] == (3, 3, 0): # regression workaround + if blocks == 0: # first call + __current_size = 0 + else: + __current_size += block_size + current_size = __current_size + else: + current_size = min(blocks*block_size, total_size) + progress = bar_function(current_size, total_size, width) + if progress: + sys.stdout.write("\r" + progress) + +class ThrowOnErrorOpener(urllib.FancyURLopener): + def http_error_default(self, url, fp, errcode, errmsg, headers): + raise Exception("%s: %s" % (errcode, errmsg)) + +def download(url, out=None, bar=bar_adaptive): + """High level function, which downloads URL into tmp file in current + directory and then renames it to filename autodetected from either URL + or HTTP headers. + + :param bar: function to track download progress (visualize etc.) + :param out: output filename or directory + :return: filename where URL is downloaded to + """ + names = dict() + names["out"] = out or '' + names["url"] = filename_from_url(url) + # get filename for temp file in current directory + prefix = (names["url"] or names["out"] or ".") + "." + (fd, tmpfile) = tempfile.mkstemp(".tmp", prefix=prefix, dir=".") + os.close(fd) + os.unlink(tmpfile) + + # set progress monitoring callback + def callback_charged(blocks, block_size, total_size): + # 'closure' to set bar drawing function in callback + callback_progress(blocks, block_size, total_size, bar_function=bar) + if bar: + callback = callback_charged + else: + callback = None + + (tmpfile, headers) = ThrowOnErrorOpener().retrieve(url, tmpfile, callback) + names["header"] = filename_from_headers(headers) + if os.path.isdir(names["out"]): + filename = names["header"] or names["url"] + filename = names["out"] + "/" + filename + else: + filename = names["out"] or names["header"] or names["url"] + # add numeric ' (x)' suffix if filename already exists + if os.path.exists(filename): + filename = filename_fix_existing(filename) + shutil.move(tmpfile, filename) + + #print headers + return filename + + +usage = """\ +usage: wget.py [options] URL + +options: + -o --output FILE|DIR output filename or directory + -h --help + --version +""" + +if __name__ == "__main__": + if len(sys.argv) < 2 or "-h" in sys.argv or "--help" in sys.argv: + sys.exit(usage) + if "--version" in sys.argv: + sys.exit("wget.py " + __version__) + + from optparse import OptionParser + parser = OptionParser() + parser.add_option("-o", "--output", dest="output") + (options, args) = parser.parse_args() + + url = sys.argv[1] + filename = download(args[0], out=options.output) + + print("") + print("Saved under %s" % filename) + +r""" +features that require more tuits for urlretrieve API +http://www.python.org/doc/2.6/library/urllib.html#urllib.urlretrieve + +[x] autodetect filename from URL +[x] autodetect filename from headers - Content-Disposition + http://greenbytes.de/tech/tc2231/ +[ ] make HEAD request to detect temp filename from Content-Disposition +[ ] process HTTP status codes (i.e. 404 error) + http://ftp.de.debian.org/debian/pool/iso-codes_3.24.2.orig.tar.bz2 +[ ] catch KeyboardInterrupt +[ ] optionally preserve incomplete file +[x] create temp file in current directory +[ ] resume download (broken connection) +[ ] resume download (incomplete file) +[x] show progress indicator + http://mail.python.org/pipermail/tutor/2005-May/038797.html +[x] do not overwrite downloaded file + [x] rename file automatically if exists +[x] optionally specify path for downloaded file + +[ ] options plan + [x] -h, --help, --version (CHAOS speccy) +[ ] clpbar progress bar style +_ 30.0Mb at 3.0 Mbps eta: 0:00:20 30% [===== ] +[ ] test "bar \r" print with \r at the end of line on Windows +[ ] process Python 2.x urllib.ContentTooShortError exception gracefully + (ideally retry and continue download) + + (tmpfile, headers) = urllib.urlretrieve(url, tmpfile, callback_progress) + File "C:\Python27\lib\urllib.py", line 93, in urlretrieve + return _urlopener.retrieve(url, filename, reporthook, data) + File "C:\Python27\lib\urllib.py", line 283, in retrieve + "of %i bytes" % (read, size), result) +urllib.ContentTooShortError: retrieval incomplete: got only 15239952 out of 24807571 bytes + +[ ] find out if urlretrieve may return unicode headers +[ ] test suite for unsafe filenames from url and from headers + +[ ] security checks + [ ] filename_from_url + [ ] filename_from_headers + [ ] MITM redirect from https URL + [ ] https certificate check + [ ] size+hash check helpers + [ ] fail if size is known and mismatch + [ ] fail if hash mismatch +""" diff --git a/src/wgetHandler.py b/src/wgetHandler/wgetHandler.py similarity index 99% rename from src/wgetHandler.py rename to src/wgetHandler/wgetHandler.py index d081b2d..04216d9 100644 --- a/src/wgetHandler.py +++ b/src/wgetHandler/wgetHandler.py @@ -1,6 +1,7 @@ -from .wget import wget import math +from .wget import wget + # bar 를 커스텀.... 하는 어떤 글에서 가져온거 def bar_custom(current, total, width=80): width=30