├── .gitattributes ├── .gitignore ├── README.md ├── delphispacecomputer.dpr ├── delphispacecomputer.dproj ├── delphispacecomputer.res ├── fonts ├── Font License.txt ├── Horta demo.otf ├── Klingon-pIqaD-HaSta.ttf ├── LCARS.ttf └── pIqaD-HaSta-licence.txt ├── forms.maincomputergui.dfm ├── forms.maincomputergui.pas ├── graphics ├── 27356-earth-animation.json ├── Emblem.ico ├── Emblem.svg ├── delphi_con_barker_demo.gif ├── lcars_heartbeat.json ├── lf20_xGeRTh.json └── scanner_red.json ├── links_used_in_demo.txt ├── slides └── DelphiCon 2021 Ian Barker.pptx └── sounds ├── alert08.mp3 ├── alert09.mp3 ├── communications_end_transmission.mp3 ├── computer_work_beep.mp3 ├── computerbeep_74.mp3 ├── consolewarning.mp3 └── engage.mp3 /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Delphi compiler-generated binaries (safe to delete) 30 | *.exe 31 | *.dll 32 | *.bpl 33 | *.bpi 34 | *.dcp 35 | *.so 36 | *.apk 37 | *.drc 38 | *.map 39 | *.dres 40 | *.rsm 41 | *.tds 42 | *.dcu 43 | *.lib 44 | *.a 45 | *.o 46 | *.ocx 47 | 48 | # Delphi autogenerated files (duplicated info) 49 | *.cfg 50 | *.hpp 51 | *Resource.rc 52 | 53 | # Delphi local files (user-specific info) 54 | *.local 55 | *.identcache 56 | *.projdata 57 | *.tvsconfig 58 | *.dsk 59 | 60 | # Delphi history and backups 61 | __history/ 62 | __recovery/ 63 | *.~* 64 | 65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 66 | *.stat 67 | 68 | # Boss dependency manager vendor folder https://github.com/HashLoad/boss 69 | modules/ 70 | slides/~$DelphiCon 2021 Ian Barker.pptx 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A 'starship computer console from the future' - example of using Skia4Delphi 2 | 3 | Original code: **Ian Barker** 4 | 5 | [https://github.com/checkdigits](https://github.com/checkdigits) 6 | 7 | [https://about.me/IanBarker](https://about.me/IanBarker) 8 | 9 | ![Engage](https://github.com/checkdigits/spacecomputer/blob/main/graphics/delphi_con_barker_demo.gif) 10 | 11 | __Needs__ Skia4Delphi installed [https://github.com/viniciusfbb/skia4delphi](https://github.com/viniciusfbb/skia4delphi) 12 | 13 | Project originally written with [Delphi 11.](https://www.embarcadero.com/products/delphi) 14 | 15 | To accompany Ian's session at DelphiCon 2021 - [https://delphicon.embarcadero.com](https://delphicon.embarcadero.com) 16 | 17 | Updated to work with version 3.0 and above. 18 | Note that this is a VCL project and therefore the animations can't be transparent which was a change in v3 of Skia4Delphi. 19 | 20 | 21 | -------------------------------------------------------------------------------- /delphispacecomputer.dpr: -------------------------------------------------------------------------------- 1 | program delphispacecomputer; 2 | 3 | uses 4 | Vcl.Forms, 5 | forms.maincomputergui in 'forms.maincomputergui.pas' {MainComputerGUI}; 6 | 7 | {$R *.res} 8 | 9 | begin 10 | Application.Initialize; 11 | Application.MainFormOnTaskbar := True; 12 | Application.CreateForm(TMainComputerGUI, MainComputerGUI); 13 | Application.Run; 14 | end. 15 | -------------------------------------------------------------------------------- /delphispacecomputer.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {33C6A244-27E2-4FC1-B1E0-294BD6055E64} 4 | 19.5 5 | VCL 6 | True 7 | Debug 8 | Win32 9 | 1 10 | Application 11 | delphispacecomputer.dpr 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | true 44 | Cfg_2 45 | true 46 | true 47 | 48 | 49 | .\$(Platform)\$(Config) 50 | .\$(Platform)\$(Config) 51 | false 52 | false 53 | false 54 | false 55 | false 56 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 57 | $(BDS)\bin\delphi_PROJECTICON.ico 58 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 59 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 60 | delphispacecomputer 61 | SKIA;$(DCC_Define) 62 | true 63 | 3 64 | 1033 65 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=3.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=3.0;Comments=Written by Ian Barker. 66 | 67 | 68 | RaizeComponentsVcl;vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RaizeComponentsVclDb;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 69 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 70 | Debug 71 | true 72 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=Written by Ian Barker. 73 | 1033 74 | $(BDS)\bin\default_app.manifest 75 | graphics\Emblem.ico 76 | 77 | 78 | RaizeComponentsVcl;vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RaizeComponentsVclDb;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;FMXTee;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 79 | 80 | 81 | DEBUG;$(DCC_Define) 82 | true 83 | false 84 | true 85 | true 86 | true 87 | true 88 | true 89 | 90 | 91 | false 92 | true 93 | PerMonitorV2 94 | true 95 | 1033 96 | graphics\Emblem.ico 97 | 3 98 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=3.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=Written by Ian Barker. 99 | 100 | 101 | false 102 | RELEASE;$(DCC_Define) 103 | 0 104 | 0 105 | 106 | 107 | true 108 | PerMonitorV2 109 | 110 | 111 | 112 | MainSource 113 | 114 | 115 |
MainComputerGUI
116 | dfm 117 |
118 | 119 | Base 120 | 121 | 122 | Cfg_1 123 | Base 124 | 125 | 126 | Cfg_2 127 | Base 128 | 129 |
130 | 131 | Delphi.Personality.12 132 | Application 133 | 134 | 135 | 136 | delphispacecomputer.dpr 137 | 138 | 139 | Embarcadero C++Builder Office 2000 Servers Package 140 | Embarcadero C++Builder Office XP Servers Package 141 | Microsoft Office 2000 Sample Automation Server Wrapper Components 142 | Microsoft Office XP Sample Automation Server Wrapper Components 143 | 144 | 145 | 146 | 147 | 148 | .\ 149 | 0 150 | sk4d.dll 151 | true 152 | 153 | 154 | 155 | 156 | .\ 157 | 0 158 | sk4d.dll 159 | true 160 | 161 | 162 | 163 | 164 | .\ 165 | 0 166 | sk4d.dll 167 | true 168 | 169 | 170 | 171 | 172 | .\ 173 | 0 174 | sk4d.dll 175 | true 176 | 177 | 178 | 179 | 180 | .\ 181 | 0 182 | sk4d.dll 183 | true 184 | 185 | 186 | 187 | 188 | .\ 189 | 0 190 | sk4d.dll 191 | true 192 | 193 | 194 | 195 | 196 | .\ 197 | 0 198 | sk4d.dll 199 | true 200 | 201 | 202 | 203 | 204 | .\ 205 | 0 206 | sk4d.dll 207 | true 208 | 209 | 210 | 211 | 212 | 213 | 1 214 | 215 | 216 | Contents\MacOS 217 | 1 218 | 219 | 220 | 0 221 | 222 | 223 | 224 | 225 | classes 226 | 64 227 | 228 | 229 | classes 230 | 64 231 | 232 | 233 | 234 | 235 | res\xml 236 | 1 237 | 238 | 239 | res\xml 240 | 1 241 | 242 | 243 | 244 | 245 | library\lib\armeabi-v7a 246 | 1 247 | 248 | 249 | 250 | 251 | library\lib\armeabi 252 | 1 253 | 254 | 255 | library\lib\armeabi 256 | 1 257 | 258 | 259 | 260 | 261 | library\lib\armeabi-v7a 262 | 1 263 | 264 | 265 | 266 | 267 | library\lib\mips 268 | 1 269 | 270 | 271 | library\lib\mips 272 | 1 273 | 274 | 275 | 276 | 277 | library\lib\armeabi-v7a 278 | 1 279 | 280 | 281 | library\lib\arm64-v8a 282 | 1 283 | 284 | 285 | 286 | 287 | library\lib\armeabi-v7a 288 | 1 289 | 290 | 291 | 292 | 293 | res\drawable 294 | 1 295 | 296 | 297 | res\drawable 298 | 1 299 | 300 | 301 | 302 | 303 | res\values 304 | 1 305 | 306 | 307 | res\values 308 | 1 309 | 310 | 311 | 312 | 313 | res\values-v21 314 | 1 315 | 316 | 317 | res\values-v21 318 | 1 319 | 320 | 321 | 322 | 323 | res\values 324 | 1 325 | 326 | 327 | res\values 328 | 1 329 | 330 | 331 | 332 | 333 | res\drawable 334 | 1 335 | 336 | 337 | res\drawable 338 | 1 339 | 340 | 341 | 342 | 343 | res\drawable-xxhdpi 344 | 1 345 | 346 | 347 | res\drawable-xxhdpi 348 | 1 349 | 350 | 351 | 352 | 353 | res\drawable-xxxhdpi 354 | 1 355 | 356 | 357 | res\drawable-xxxhdpi 358 | 1 359 | 360 | 361 | 362 | 363 | res\drawable-ldpi 364 | 1 365 | 366 | 367 | res\drawable-ldpi 368 | 1 369 | 370 | 371 | 372 | 373 | res\drawable-mdpi 374 | 1 375 | 376 | 377 | res\drawable-mdpi 378 | 1 379 | 380 | 381 | 382 | 383 | res\drawable-hdpi 384 | 1 385 | 386 | 387 | res\drawable-hdpi 388 | 1 389 | 390 | 391 | 392 | 393 | res\drawable-xhdpi 394 | 1 395 | 396 | 397 | res\drawable-xhdpi 398 | 1 399 | 400 | 401 | 402 | 403 | res\drawable-mdpi 404 | 1 405 | 406 | 407 | res\drawable-mdpi 408 | 1 409 | 410 | 411 | 412 | 413 | res\drawable-hdpi 414 | 1 415 | 416 | 417 | res\drawable-hdpi 418 | 1 419 | 420 | 421 | 422 | 423 | res\drawable-xhdpi 424 | 1 425 | 426 | 427 | res\drawable-xhdpi 428 | 1 429 | 430 | 431 | 432 | 433 | res\drawable-xxhdpi 434 | 1 435 | 436 | 437 | res\drawable-xxhdpi 438 | 1 439 | 440 | 441 | 442 | 443 | res\drawable-xxxhdpi 444 | 1 445 | 446 | 447 | res\drawable-xxxhdpi 448 | 1 449 | 450 | 451 | 452 | 453 | res\drawable-small 454 | 1 455 | 456 | 457 | res\drawable-small 458 | 1 459 | 460 | 461 | 462 | 463 | res\drawable-normal 464 | 1 465 | 466 | 467 | res\drawable-normal 468 | 1 469 | 470 | 471 | 472 | 473 | res\drawable-large 474 | 1 475 | 476 | 477 | res\drawable-large 478 | 1 479 | 480 | 481 | 482 | 483 | res\drawable-xlarge 484 | 1 485 | 486 | 487 | res\drawable-xlarge 488 | 1 489 | 490 | 491 | 492 | 493 | res\values 494 | 1 495 | 496 | 497 | res\values 498 | 1 499 | 500 | 501 | 502 | 503 | 1 504 | 505 | 506 | Contents\MacOS 507 | 1 508 | 509 | 510 | 0 511 | 512 | 513 | 514 | 515 | Contents\MacOS 516 | 1 517 | .framework 518 | 519 | 520 | Contents\MacOS 521 | 1 522 | .framework 523 | 524 | 525 | Contents\MacOS 526 | 1 527 | .framework 528 | 529 | 530 | 0 531 | 532 | 533 | 534 | 535 | 1 536 | .dylib 537 | 538 | 539 | 1 540 | .dylib 541 | 542 | 543 | 1 544 | .dylib 545 | 546 | 547 | Contents\MacOS 548 | 1 549 | .dylib 550 | 551 | 552 | Contents\MacOS 553 | 1 554 | .dylib 555 | 556 | 557 | Contents\MacOS 558 | 1 559 | .dylib 560 | 561 | 562 | 0 563 | .dll;.bpl 564 | 565 | 566 | 567 | 568 | 1 569 | .dylib 570 | 571 | 572 | 1 573 | .dylib 574 | 575 | 576 | 1 577 | .dylib 578 | 579 | 580 | Contents\MacOS 581 | 1 582 | .dylib 583 | 584 | 585 | Contents\MacOS 586 | 1 587 | .dylib 588 | 589 | 590 | Contents\MacOS 591 | 1 592 | .dylib 593 | 594 | 595 | 0 596 | .bpl 597 | 598 | 599 | 600 | 601 | 0 602 | 603 | 604 | 0 605 | 606 | 607 | 0 608 | 609 | 610 | 0 611 | 612 | 613 | 0 614 | 615 | 616 | Contents\Resources\StartUp\ 617 | 0 618 | 619 | 620 | Contents\Resources\StartUp\ 621 | 0 622 | 623 | 624 | Contents\Resources\StartUp\ 625 | 0 626 | 627 | 628 | 0 629 | 630 | 631 | 632 | 633 | 1 634 | 635 | 636 | 1 637 | 638 | 639 | 640 | 641 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 642 | 1 643 | 644 | 645 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 646 | 1 647 | 648 | 649 | 650 | 651 | ..\ 652 | 1 653 | 654 | 655 | ..\ 656 | 1 657 | 658 | 659 | ..\ 660 | 1 661 | 662 | 663 | 664 | 665 | Contents 666 | 1 667 | 668 | 669 | Contents 670 | 1 671 | 672 | 673 | Contents 674 | 1 675 | 676 | 677 | 678 | 679 | Contents\Resources 680 | 1 681 | 682 | 683 | Contents\Resources 684 | 1 685 | 686 | 687 | Contents\Resources 688 | 1 689 | 690 | 691 | 692 | 693 | library\lib\armeabi-v7a 694 | 1 695 | 696 | 697 | library\lib\arm64-v8a 698 | 1 699 | 700 | 701 | 1 702 | 703 | 704 | 1 705 | 706 | 707 | 1 708 | 709 | 710 | 1 711 | 712 | 713 | Contents\MacOS 714 | 1 715 | 716 | 717 | Contents\MacOS 718 | 1 719 | 720 | 721 | Contents\MacOS 722 | 1 723 | 724 | 725 | 0 726 | 727 | 728 | 729 | 730 | library\lib\armeabi-v7a 731 | 1 732 | 733 | 734 | 735 | 736 | 1 737 | 738 | 739 | 1 740 | 741 | 742 | 743 | 744 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 745 | 1 746 | 747 | 748 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 749 | 1 750 | 751 | 752 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 753 | 1 754 | 755 | 756 | 757 | 758 | ..\ 759 | 1 760 | 761 | 762 | ..\ 763 | 1 764 | 765 | 766 | ..\ 767 | 1 768 | 769 | 770 | 771 | 772 | 1 773 | 774 | 775 | 1 776 | 777 | 778 | 1 779 | 780 | 781 | 782 | 783 | ..\$(PROJECTNAME).launchscreen 784 | 64 785 | 786 | 787 | ..\$(PROJECTNAME).launchscreen 788 | 64 789 | 790 | 791 | 792 | 793 | 1 794 | 795 | 796 | 1 797 | 798 | 799 | 1 800 | 801 | 802 | 803 | 804 | Assets 805 | 1 806 | 807 | 808 | Assets 809 | 1 810 | 811 | 812 | 813 | 814 | Assets 815 | 1 816 | 817 | 818 | Assets 819 | 1 820 | 821 | 822 | 823 | 824 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 825 | 1 826 | 827 | 828 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 829 | 1 830 | 831 | 832 | 833 | 834 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 835 | 1 836 | 837 | 838 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 839 | 1 840 | 841 | 842 | 843 | 844 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 845 | 1 846 | 847 | 848 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 849 | 1 850 | 851 | 852 | 853 | 854 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 855 | 1 856 | 857 | 858 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 859 | 1 860 | 861 | 862 | 863 | 864 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 865 | 1 866 | 867 | 868 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 869 | 1 870 | 871 | 872 | 873 | 874 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 875 | 1 876 | 877 | 878 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 879 | 1 880 | 881 | 882 | 883 | 884 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 885 | 1 886 | 887 | 888 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 889 | 1 890 | 891 | 892 | 893 | 894 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 895 | 1 896 | 897 | 898 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 899 | 1 900 | 901 | 902 | 903 | 904 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 905 | 1 906 | 907 | 908 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 909 | 1 910 | 911 | 912 | 913 | 914 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 915 | 1 916 | 917 | 918 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 919 | 1 920 | 921 | 922 | 923 | 924 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 925 | 1 926 | 927 | 928 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 929 | 1 930 | 931 | 932 | 933 | 934 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 935 | 1 936 | 937 | 938 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 939 | 1 940 | 941 | 942 | 943 | 944 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 945 | 1 946 | 947 | 948 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 949 | 1 950 | 951 | 952 | 953 | 954 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 955 | 1 956 | 957 | 958 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 959 | 1 960 | 961 | 962 | 963 | 964 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 965 | 1 966 | 967 | 968 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 969 | 1 970 | 971 | 972 | 973 | 974 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 975 | 1 976 | 977 | 978 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 979 | 1 980 | 981 | 982 | 983 | 984 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 985 | 1 986 | 987 | 988 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 989 | 1 990 | 991 | 992 | 993 | 994 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 995 | 1 996 | 997 | 998 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 999 | 1 1000 | 1001 | 1002 | 1003 | 1004 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1005 | 1 1006 | 1007 | 1008 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1009 | 1 1010 | 1011 | 1012 | 1013 | 1014 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1015 | 1 1016 | 1017 | 1018 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1019 | 1 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 | 1031 | 1032 | 1033 | 1034 | 1035 | 1036 | True 1037 | False 1038 | 1039 | 1040 | 12 1041 | 1042 | 1043 | 1044 | 1045 |
1046 | -------------------------------------------------------------------------------- /delphispacecomputer.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/delphispacecomputer.res -------------------------------------------------------------------------------- /fonts/Font License.txt: -------------------------------------------------------------------------------- 1 | Shareware/ Font License 2 | 3 | Pixel Sagas Freeware Fonts EULA (End User License Agreement) and Software Inclusion Agreement 4 | 5 | "Purchaser" and "User" may be used interchangeably in this agreement. 6 | 7 | "Pixel Sagas" and "Neale Davidson" may be used interchangeably in this agreement. These all refer to the intellectual and legal property of Neale Davidson. 8 | 9 | Usage 10 | 11 | Pixel Saga's Shareware Fonts are free to use for personal, non-commercial purposes. No payment is necessary to use Pixel Saga's Freeware Fonts for personal use, and there is no limit to the amount of prints, pages, or other medium to be produced using them. However, you cannot offer the font for commercial sale, or offer for direct download. The inclusion of the font name and/or site URL in the credits or documentation when it is used is appreciated, but this is not mandatory. 12 | 13 | Payment 14 | 15 | Payment is not required for the use of Pixel Saga's Shareware Fonts. Commercial use requires a modest fee which can be paid through the pixelsagas.com web site through Paypal.com's services. The transaction receipt for any shareware "commercial license" purchase will suffice as proof of license. 16 | 17 | Support 18 | 19 | Font installation help is available at http://www.pixelsagas.com. If you experience problems with any Pixel Saga's Freeware font (such as spacing issues or missing characters), please verify that you have the correct and current version of the fonts. In the case of Freeware fonts, downloading the font directly from the Pixel Sagas site will ensure that the font files have not been altered. 20 | 21 | Software Inclusion Agreement 22 | 23 | Pixel Saga's software products are protected by copyright laws and International copyright treaties, as well as other intellectual property laws and treaties. All Pixel Saga's software products are licensed, not sold. 24 | 25 | 1) GRANT OF LICENSE 26 | 27 | This document grants the user the following rights: 28 | 29 | Installation and Use. The user may install and use an unlimited number of copies of the software product. The user may not offer Pixel Sagas freeware fonts for direct download unless the user has received explicit, written permission from Neale Davidson. Otherwise please direct users to the http://www.pixelsagas.com website. Pixel Sagas freeware fonts may, however, be embedded for web, publication, or general software use. 30 | 31 | 2) WARRANTIES 32 | 33 | None 34 | 35 | Pixel Sagas expressly disclaims any warranty for the software product. The software product and any related documentation is provided "as is" without warranty of any kind, either express or implied, including, without limitation, the implied warranties or merchantability, fitness for a particular purpose, or non-infringement. The entire risk arising out of use or performance of the software product remains with the user. 36 | 37 | No Liability For Consequential Damages. 38 | 39 | In no event shall Neale Davidson or Pixel Sagas be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of the use of or inability to use this product, even if Pixel Sagas has been advised of the possibility of such damages. 40 | 41 | 3) MISCELLANEOUS 42 | 43 | Should the user have any questions concerning this document or you desire to contact Neale Davidson for any reason, please email jaynz@pixelsagas.com . 44 | 45 | Governing Law 46 | 47 | This agreement is governed by and subject to the laws of the United States of America. 48 | -------------------------------------------------------------------------------- /fonts/Horta demo.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/fonts/Horta demo.otf -------------------------------------------------------------------------------- /fonts/Klingon-pIqaD-HaSta.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/fonts/Klingon-pIqaD-HaSta.ttf -------------------------------------------------------------------------------- /fonts/LCARS.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/fonts/LCARS.ttf -------------------------------------------------------------------------------- /fonts/pIqaD-HaSta-licence.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2005-07-17, Mike Neff (qa'vaj) (darqang99@gmail.com), 2 | with Reserved Font Name pIqaD HaSta. 3 | Copyright (c) 2009-07-01, Michael Everson (evertype.com), 4 | with Reserved Font Name Klingon pIqaD HaSta. 5 | 6 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 7 | This license is copied below, and is also available with a FAQ at: 8 | http://scripts.sil.org/OFL 9 | 10 | 11 | ----------------------------------------------------------- 12 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 13 | ----------------------------------------------------------- 14 | 15 | PREAMBLE 16 | The goals of the Open Font License (OFL) are to stimulate worldwide 17 | development of collaborative font projects, to support the font creation 18 | efforts of academic and linguistic communities, and to provide a free and 19 | open framework in which fonts may be shared and improved in partnership 20 | with others. 21 | 22 | The OFL allows the licensed fonts to be used, studied, modified and 23 | redistributed freely as long as they are not sold by themselves. The 24 | fonts, including any derivative works, can be bundled, embedded, 25 | redistributed and/or sold with any software provided that any reserved 26 | names are not used by derivative works. The fonts and derivatives, 27 | however, cannot be released under any other type of license. The 28 | requirement for fonts to remain under this license does not apply 29 | to any document created using the fonts or their derivatives. 30 | 31 | DEFINITIONS 32 | "Font Software" refers to the set of files released by the Copyright 33 | Holder(s) under this license and clearly marked as such. This may 34 | include source files, build scripts and documentation. 35 | 36 | "Reserved Font Name" refers to any names specified as such after the 37 | copyright statement(s). 38 | 39 | "Original Version" refers to the collection of Font Software components as 40 | distributed by the Copyright Holder(s). 41 | 42 | "Modified Version" refers to any derivative made by adding to, deleting, 43 | or substituting -- in part or in whole -- any of the components of the 44 | Original Version, by changing formats or by porting the Font Software to a 45 | new environment. 46 | 47 | "Author" refers to any designer, engineer, programmer, technical 48 | writer or other person who contributed to the Font Software. 49 | 50 | PERMISSION & CONDITIONS 51 | Permission is hereby granted, free of charge, to any person obtaining 52 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 53 | redistribute, and sell modified and unmodified copies of the Font 54 | Software, subject to the following conditions: 55 | 56 | 1) Neither the Font Software nor any of its individual components, 57 | in Original or Modified Versions, may be sold by itself. 58 | 59 | 2) Original or Modified Versions of the Font Software may be bundled, 60 | redistributed and/or sold with any software, provided that each copy 61 | contains the above copyright notice and this license. These can be 62 | included either as stand-alone text files, human-readable headers or 63 | in the appropriate machine-readable metadata fields within text or 64 | binary files as long as those fields can be easily viewed by the user. 65 | 66 | 3) No Modified Version of the Font Software may use the Reserved Font 67 | Name(s) unless explicit written permission is granted by the corresponding 68 | Copyright Holder. This restriction only applies to the primary font name as 69 | presented to the users. 70 | 71 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 72 | Software shall not be used to promote, endorse or advertise any 73 | Modified Version, except to acknowledge the contribution(s) of the 74 | Copyright Holder(s) and the Author(s) or with their explicit written 75 | permission. 76 | 77 | 5) The Font Software, modified or unmodified, in part or in whole, 78 | must be distributed entirely under this license, and must not be 79 | distributed under any other license. The requirement for fonts to 80 | remain under this license does not apply to any document created 81 | using the Font Software. 82 | 83 | TERMINATION 84 | This license becomes null and void if any of the above conditions are 85 | not met. 86 | 87 | DISCLAIMER 88 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 89 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 90 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 91 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 92 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 93 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 94 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 95 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 96 | OTHER DEALINGS IN THE FONT SOFTWARE. 97 | -------------------------------------------------------------------------------- /forms.maincomputergui.pas: -------------------------------------------------------------------------------- 1 | unit forms.maincomputergui; 2 | 3 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4 | // The following compiler define controls whether or not this demo uses AWS 5 | // Polly to generate text to speech using AI 6 | // 7 | // If you do NOT have an AWS account then disable the define like so: {.$DEFINE USESPEECH} 8 | // If you DO have an AWS account then ENABLE the define like so: {$DEFINE USESPEECH} 9 | // 10 | // If you DO have an AWS account set up then you will need to install the AWS 11 | // components from Appercept which can be found here: https://getitnow.embarcadero.com/?q=Appercept 12 | // or here https://www.appercept.com/appercept-aws-sdk-for-delphi 13 | // 14 | // ** AND ** you also need to have a file in your user folder like so: 15 | // 16 | // C:\Users\**YOUR USER NAME**\.aws\credentials 17 | // 18 | // The file needs to contain the following entries: 19 | // 20 | // [default] 21 | // aws_access_key_id=** YOUR AWS ACCESS KEY NAME ** 22 | // aws_secret_access_key=** YOUR AWS API/SDK SECRET ** 23 | // 24 | // 25 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 26 | 27 | {.$DEFINE USESPEECH} 28 | 29 | interface 30 | 31 | uses 32 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 33 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Skia.Vcl, Vcl.ExtCtrls, Vcl.StdCtrls, 34 | Vcl.MPlayer, Skia 35 | {$IFDEF USESPEECH}, AWS.Polly{$ENDIF} 36 | ; 37 | 38 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 39 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 40 | // %%%% 41 | // %%%% Original Author: 42 | // %%%% Ian Barker. 43 | // %%%% https://about.me/IanBarker 44 | // %%%% https://github.com/checkdigits 45 | // %%%% 46 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 47 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 48 | // %%%% Example of how to use SkiaForDelphi to do some cool things. 49 | // %%%% 50 | // %%%% Based on the Skia4Delphi VCL example here: 51 | // %%%% https://github.com/viniciusfbb/skia4delphi/tree/main/Samples/Basic/VCL 52 | // %%%% 53 | // %%%% Animations from 54 | // %%%% https://lottiefiles.com 55 | // %%%% Sounds from 56 | // %%%% https://www.trekcore.com/audio/ 57 | // %%%% Fonts from 58 | // %%%% Main "Trek type" font https://fontlibrary.org/en/font/horta 59 | // %%%% Klingon font https://www.evertype.com/fonts/tlh/ 60 | // %%%% license https://www.evertype.com/fonts/tlh/klingon-piqad-hasta-licence.html 61 | // %%%% 62 | // %%%% 'Federation' Logo from: https://kopi-svg.blogspot.com/2016/04/33-star-trek-svg-free-images.html?m=1 63 | // %%%% 64 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 65 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 66 | // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 67 | 68 | type Beeps = (BeepRedAlert, BeepBlaaaa, BeepBeeBop, BeepIncoming, BeepComputerWork, BeepConsoleWarning, BeepEngage); 69 | 70 | 71 | type 72 | TMainComputerGUI = class(TForm) 73 | PlanetAnim: TSkAnimatedImage; 74 | CountdownAnim: TSkAnimatedImage; 75 | WireframeGlobeAnim: TSkAnimatedImage; 76 | WarpVectorAnim: TSkAnimatedImage; 77 | RadarSweepAnim: TSkAnimatedImage; 78 | HeartbeatAnim: TSkAnimatedImage; 79 | ScanningAnim: TSkAnimatedImage; 80 | FederationLogo: TSkSvg; 81 | Shape1: TShape; 82 | Shape2: TShape; 83 | Shape3: TShape; 84 | Shape4: TShape; 85 | Shape5: TShape; 86 | Shape6: TShape; 87 | Shape7: TShape; 88 | Shape8: TShape; 89 | Shape9: TShape; 90 | Shape10: TShape; 91 | Shape11: TShape; 92 | Shape12: TShape; 93 | Shape13: TShape; 94 | Shape14: TShape; 95 | Shape15: TShape; 96 | Shape16: TShape; 97 | Shape17: TShape; 98 | Shape18: TShape; 99 | Shape19: TShape; 100 | Shape20: TShape; 101 | Shape21: TShape; 102 | Shape22: TShape; 103 | Shape23: TShape; 104 | Shape24: TShape; 105 | Shape25: TShape; 106 | Label1: TLabel; 107 | Label2: TLabel; 108 | Label3: TLabel; 109 | Label4: TLabel; 110 | Label5: TLabel; 111 | AlertLabel: TLabel; 112 | Image1: TImage; 113 | Timer1: TTimer; 114 | MediaPlayer1: TMediaPlayer; 115 | MediaPlayer2: TMediaPlayer; 116 | procedure FormActivate(Sender: TObject); 117 | procedure FormCreate(Sender: TObject); 118 | procedure Timer1Timer(Sender: TObject); 119 | procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 120 | procedure Shape19MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 121 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 122 | procedure FederationLogoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 123 | procedure Shape25MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 124 | private 125 | HasNotPlayedRedAlert, PlaySounds: Boolean; 126 | {$IFDEF USESPEECH} 127 | SpeechClient: IPollyClient; 128 | SpeechCount: integer; 129 | Speaking: boolean; 130 | UseFemaleVoice: boolean; 131 | {$ENDIF} 132 | procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest; 133 | procedure DoSpaceText; 134 | function RandomLineOfNumbers: string; 135 | function RandomLineOfText: string; 136 | function RandomKlingonString(const DesiredLength: integer): string; 137 | procedure PlaySound(const WhichSound: Beeps); 138 | {$IFDEF USESPEECH} 139 | procedure Speak(const TheText: string); 140 | procedure CleanupSpeechFiles; 141 | {$ENDIF} 142 | end; 143 | 144 | var 145 | MainComputerGUI: TMainComputerGUI; 146 | 147 | implementation 148 | uses 149 | System.Types, 150 | System.UITypes, 151 | {$IFDEF USESPEECH}System.IOUtils,{$ENDIF} 152 | System.Math; 153 | 154 | {$R *.dfm} 155 | 156 | {$IFDEF USESPEECH} 157 | const ComputerSpeech: array[0..4] of string = ( 158 | 'All shipwide systems are operating within normal parameters.', 159 | 'The starboard niscelles require plasma venting', 160 | 'Ensign McKeeth is not currently on board the ship', 161 | 'There is an incoming message from a planet situated three light years from our current location.', 162 | 'Captain, the ships doctor is attempting to bypass the security lock outs' 163 | ); 164 | 165 | const cSpeechFileTemplate ='PollySpeak%s.mp3'; 166 | {$ENDIF} 167 | 168 | procedure TMainComputerGUI.FederationLogoMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 169 | begin 170 | Close; 171 | end; 172 | 173 | procedure TMainComputerGUI.FormActivate(Sender: TObject); 174 | begin 175 | if Tag = 0 then 176 | begin 177 | Tag := 1; 178 | DoSpaceText; 179 | Timer1.Enabled := True; 180 | PlaySound(BeepEngage); 181 | end; 182 | end; 183 | 184 | procedure TMainComputerGUI.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 185 | begin 186 | {$IFDEF USESPEECH}CleanupSpeechFiles;{$ENDIF} 187 | end; 188 | 189 | procedure TMainComputerGUI.FormCreate(Sender: TObject); 190 | begin 191 | HasNotPlayedRedAlert := True; 192 | PlaySounds := True; 193 | {$IFDEF USESPEECH} 194 | SpeechClient := TPollyClient.Create; 195 | SpeechCount := 0; 196 | Speaking := False; 197 | UseFemaleVoice := True; 198 | {$ENDIF} 199 | end; 200 | 201 | procedure TMainComputerGUI.PlaySound(const WhichSound: Beeps); 202 | 203 | const 204 | cSounds: array[BeepRedAlert..BeepEngage] of string = ( 205 | 'alert09.mp3', 206 | 'alert08.mp3', 207 | 'communications_end_transmission.mp3', 208 | 'computerbeep_74.mp3', 209 | 'computer_work_beep.mp3', 210 | 'consolewarning.mp3', 211 | 'engage.mp3' 212 | ); 213 | begin 214 | // We use the TMediaPlayer to play the sounds rather than sndPlaySound 215 | // just because MP3s are more likely to work that way and we don't need 216 | // asynchronous playback. 217 | 218 | // Only play the (very jarring) red alert sound once. 219 | if WhichSound = BeepRedAlert then HasNotPlayedRedAlert := False; 220 | 221 | // Clicking on the bottom left LCARS area toggles the sound off or on 222 | if PlaySounds then 223 | begin 224 | MediaPlayer1.Close; 225 | MediaPlayer1.FileName := '..\..\sounds\' + cSounds[WhichSound]; 226 | MediaPlayer1.Open; 227 | MediaPlayer1.Play; 228 | end; 229 | end; 230 | 231 | function TMainComputerGUI.RandomKlingonString(const DesiredLength: integer): string; 232 | var 233 | Klingon: char; 234 | begin 235 | Result := ''; 236 | for var count := 1 to DesiredLength do 237 | begin 238 | if Random(5) mod 5 = 0 then 239 | Result := Concat(Result, ' ') 240 | else 241 | begin 242 | Klingon := Char($F8D0 + Random(25)); 243 | Result := Result + Klingon; 244 | end; 245 | end; 246 | end; 247 | 248 | function TMainComputerGUI.RandomLineOfNumbers: string; 249 | var 250 | iWidth: integer; 251 | iSpaces: integer; 252 | iIndex: integer; 253 | 254 | const 255 | cSpaces: array[0..5] of integer = (4, 6, 4, 8, 4, 4); 256 | 257 | begin 258 | Result := ''; 259 | for var iLoop := 0 to 10 do 260 | begin 261 | iSpaces := cSpaces[iLoop mod 6]; 262 | Result := Result + Format('%.4f%s', [Random, StringOfChar(' ', iSpaces)]); 263 | end; 264 | end; 265 | 266 | function TMainComputerGUI.RandomLineOfText: string; 267 | 268 | const 269 | cChanceOfSpaces = 4; 270 | cChanceOfNumbers = 3; 271 | cMaxLengthOfLine = 95; 272 | begin 273 | Result := ''; 274 | for var iLoop := 0 to cMaxLengthOfLine do 275 | if Random(cChanceOfSpaces) mod cChanceOfSpaces = 0 then 276 | Result := Concat(Result, ' ') 277 | else 278 | if Random(cChanceOfNumbers) mod cChanceOfNumbers = 0 then 279 | Result := Concat(Result, Chr(48 + Random(10))) 280 | else 281 | Result := Concat(Result, Chr(65 + Random(25))); 282 | end; 283 | 284 | procedure TMainComputerGUI.Shape19MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 285 | begin 286 | {$IFDEF USESPEECH}Speak(ComputerSpeech[Random(High(ComputerSpeech))]);{$ENDIF} 287 | end; 288 | 289 | procedure TMainComputerGUI.Shape1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 290 | begin 291 | // Clicking on the bottom left LCARS area toggles the sound off or on 292 | PlaySounds := Not PlaySounds; 293 | if PlaySounds then AlertLabel.Caption := 'ALERTS ON' else AlertLabel.Caption := 'ALERTS OFF'; 294 | end; 295 | 296 | procedure TMainComputerGUI.Shape25MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 297 | begin 298 | {$IFDEF USESPEECH}UseFemaleVoice := not UseFemaleVoice;{$ENDIF} 299 | end; 300 | 301 | procedure TMainComputerGUI.Timer1Timer(Sender: TObject); 302 | begin 303 | // Cause the random text to be repainted every 1.5 seconds 304 | Timer1.Enabled := False; 305 | DoSpaceText; 306 | Timer1.Enabled := True; 307 | end; 308 | 309 | procedure TMainComputerGUI.WMNCHitTest(var Msg: TWMNCHitTest); 310 | begin 311 | // We have no title bar - so we need to check for click and hold mouse 312 | // movements to trigger the form dragging but only if it's near the top 313 | // border shape. 314 | inherited; 315 | if Msg.Result = htClient then 316 | begin 317 | var Pt := ScreenToClient(SmallPointToPoint(Msg.Pos)); 318 | if Pt.Y < (Shape22.Height + Shape22.Top) then Msg.Result := htCaption; 319 | end; 320 | end; 321 | 322 | {$IFDEF USESPEECH} 323 | procedure TMainComputerGUI.CleanupSpeechFiles; 324 | begin 325 | for var AFile in TDirectory.GetFiles(ExtractFilePath(ParamStr(0)), Format(cSpeechFileTemplate, ['*'])) do 326 | DeleteFile(AFile); 327 | end; 328 | {$ENDIF} 329 | 330 | procedure TMainComputerGUI.DoSpaceText; 331 | var 332 | LBitmap: TBitmap; 333 | const 334 | cYellowText = $FFFBD768; 335 | cWhiteText = TAlphaColors.White; 336 | cBackground = TAlphaColors.Black; 337 | begin 338 | LBitmap := TBitmap.Create; 339 | try 340 | LBitmap.SetSize(745, 202); 341 | LBitmap.SkiaDraw( 342 | procedure (const ACanvas: ISkCanvas) 343 | var 344 | LTypeface: ISkTypeface; 345 | LFont: ISkFont; 346 | LPaint: ISkPaint; 347 | begin 348 | // Create the drawing surface for the text 349 | ACanvas.Clear(cBackground); 350 | LPaint := TSkPaint.Create; 351 | 352 | // Now load a custom 'Klingon' font and use that to print some random Klingon 353 | const FontFolder = '..\..\fonts\'; 354 | LTypeface := TSkTypeface.MakeFromFile(FontFolder + 'Klingon-pIqaD-HaSta.ttf'); 355 | LFont := TSkFont.Create(LTypeface, 28); 356 | LFont.Typeface := LTypeface; 357 | LFont.Size := 28; 358 | LPaint.Color := TAlphaColors.Tomato; 359 | LPaint.Style := TSkPaintStyle.Fill; // Fills can be grad fills for cool text! 360 | ACanvas.DrawSimpleText(RandomKlingonString(19), 10, 25, LFont, LPaint); 361 | 362 | // Now to load a "Trek" type font to emulate the computer interface's text 363 | LTypeface := TSkTypeface.MakeFromFile(FontFolder + 'LCARS.ttf'); 364 | LFont := TSkFont.Create(LTypeface, 16); 365 | LPaint.Color := TAlphaColor(cYellowText); 366 | LPaint.Style := TSkPaintStyle.Fill; // Solid fill 367 | 368 | // First some random 'planetary' statistics in yellow 369 | ACanvas.DrawSimpleText(Format('Saturation %d%% Lead %d%%', [Random(100), Random(100)]), 500, 25, LFont, LPaint); 370 | ACanvas.DrawSimpleText(Format('Titanium %d%% Ore %d%%', [Random(100), Random(100)]), 500, 45, LFont, LPaint); 371 | ACanvas.DrawSimpleText(Format('Cadnium %d%%', [Random(100)]), 500, 65, LFont, LPaint); 372 | ACanvas.DrawSimpleText('Planet Class: M', 500, 85, LFont, LPaint); 373 | 374 | // Now a few rows of random numbers - the movies like screenfuls of junky numbers :) 375 | for var i := 0 to 3 do 376 | ACanvas.DrawSimpleText(RandomLineOfText, 10, 45 + (i * 20), LFont, LPaint); 377 | LPaint.Color := cWhiteText; 378 | for var iRow := 4 to 7 do 379 | begin 380 | ACanvas.DrawSimpleText(RandomLineOfNumbers, 10, 45 + (iRow * 20), LFont, LPaint); 381 | end; 382 | 383 | // Now let's show some worrying command text from The Main Bridge 384 | LTypeface := TSkTypeface.MakeFromFile(FontFolder + 'Horta demo.otf'); 385 | LFont := TSkFont.Create(LTypeface, 32); 386 | LPaint.Style := TSkPaintStyle.Fill; 387 | var CaptainsOrders1, CaptainsOrders2: string; 388 | if Random(2) Mod 2 = 0 then 389 | begin 390 | CaptainsOrders1 := 'RED ALERT'; 391 | CaptainsOrders2 := 'ALL CREW TO STATIONS'; 392 | LPaint.Color := TAlphaColors.Crimson; 393 | if HasNotPlayedRedAlert then PlaySound(BeepRedAlert); 394 | end 395 | else 396 | begin 397 | CaptainsOrders1 := 'ENSIGN BARKER'; 398 | CaptainsOrders2 := 'REPORT TO THE BRIDGE'; 399 | LPaint.Color := TAlphaColors.Cadetblue; // Starfleet Cadet Blue ;) 400 | if Random(3) Mod 3 = 0 then PlaySound(Beeps(RandomRange(Ord(BeepIncoming), Ord(BeepEngage)))); 401 | {$IFDEF USESPEECH} 402 | if (Random(4) Mod 4 = 0) and (SpeechCount < 20) then 403 | begin 404 | Inc(SpeechCount); // Used to prevent you accidentally using all your free AWS allowance 405 | Speak(ComputerSpeech[Random(High(ComputerSpeech))]); 406 | end; 407 | {$ENDIF} 408 | end; 409 | 410 | ACanvas.DrawSimpleText(Format(CaptainsOrders1, [Random(100), Random(100)]), 500, 145, LFont, LPaint); 411 | ACanvas.DrawSimpleText(Format(CaptainsOrders2, [Random(100), Random(100)]), 500, 175, LFont, LPaint); 412 | end); 413 | Image1.Width := Ceil(LBitmap.Width {$IF CompilerVersion >= 33}/ Image1.ScaleFactor{$ENDIF}); 414 | Image1.Height := Ceil(LBitmap.Height {$IF CompilerVersion >= 33}/ Image1.ScaleFactor{$ENDIF}); 415 | Image1.Picture.Bitmap := LBitmap; 416 | finally 417 | LBitmap.Free; 418 | end; 419 | end; 420 | 421 | {$IFDEF USESPEECH} 422 | procedure TMainComputerGUI.Speak(const TheText: string); 423 | var 424 | LRequest: IPollySynthesizeSpeechRequest; 425 | LResponse: IPollySynthesizeSpeechResponse; 426 | LAudioFile: TFileStream; 427 | LFileName: string; 428 | begin 429 | LRequest := TPollySynthesizeSpeechRequest.Create; 430 | LRequest.Engine := 'neural'; // can also be --> LRequest.Engine := 'standard' 431 | LRequest.LanguageCode := 'en-US'; 432 | LRequest.OutputFormat := 'mp3'; 433 | LRequest.Text := TheText; 434 | if UseFemaleVoice then 435 | LRequest.VoiceId := 'Joanna' 436 | else 437 | LRequest.VoiceId := 'Joey'; 438 | LResponse := SpeechClient.SynthesizeSpeech(LRequest); 439 | if LResponse.IsSuccessful then 440 | begin 441 | LFileName := ExtractFilePath(ParamStr(0)) + Format(cSpeechFileTemplate, [FormatDateTime('yyyymmddhhnnsszzz', Now)]); 442 | LAudioFile := TFileStream.Create(LFileName, fmCreate); 443 | try 444 | LAudioFile.CopyFrom(LResponse.AudioStream); 445 | finally 446 | LAudioFile.Free; 447 | end; 448 | MediaPlayer2.Close; 449 | MediaPlayer2.FileName := LFileName; 450 | MediaPlayer2.Open; 451 | MediaPlayer2.Play; 452 | end 453 | else 454 | if LResponse.StatusText.ToLower.Contains('forbidden') then 455 | ShowMessage('AWS access was denied. Have you set up your AWS account? [' + LResponse.StatusText + ']') 456 | else 457 | ShowMessage('AWS error: ' + LResponse.StatusText); 458 | end; 459 | {$ENDIF} 460 | 461 | end. 462 | -------------------------------------------------------------------------------- /graphics/Emblem.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/graphics/Emblem.ico -------------------------------------------------------------------------------- /graphics/Emblem.svg: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | 16 | image/svg+xml 17 | 18 | Star Trek Emblem 19 | 1.st May 2009 20 | 21 | 22 | Jesper Hansen 23 | 24 | 25 | 26 | 27 | None 28 | 29 | 30 | Dansk 31 | 32 | 33 | Star Trek 34 | signia 35 | emblem 36 | 37 | 38 | It is a draw over of an original bitmap from a fan site. 39 | 41 | 42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 57 | 58 | 59 | 62 | 63 | -------------------------------------------------------------------------------- /graphics/delphi_con_barker_demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/graphics/delphi_con_barker_demo.gif -------------------------------------------------------------------------------- /graphics/lcars_heartbeat.json: -------------------------------------------------------------------------------- 1 | {"v":"5.7.6","fr":30,"ip":0,"op":450,"w":512,"h":512,"nm":"Icon_101","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"2 Outlines 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2,"l":2},"a":{"a":0,"k":[256,256,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[167,6.659],[138.952,6.659],[124.928,60.54],[110.903,-60.54],[82.855,29.06],[68.831,-4.44],[54.807,17.354],[40.783,-15.741],[26.758,6.659],[-1.29,6.659],[-13.991,6.659],[-26.758,6.659],[-40.783,60.54],[-54.807,-60.54],[-82.855,29.06],[-96.879,-4.44],[-110.903,17.354],[-124.927,-15.741],[-138.952,6.659],[-167,6.659]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9529411764705882,0.3215686274509804,0.027450980392156862,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[256,216.449],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":73,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":59,"s":[-360]}],"ix":3,"x":"var $bm_rt;\n$bm_rt = loopOut('Cycle', 0);"},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2,"l":2},"a":{"a":0,"k":[256,256,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[40.232,-52.487],[4.252,-4.252],[0,0],[0,0],[3.559,4.645],[-48.026,48.034],[-52.52,-40.892],[-48.277,-48.277]],"o":[[-3.559,4.645],[0,0],[0,0],[-4.252,-4.252],[-40.224,-52.487],[48.285,-48.285],[52.521,-40.892],[48.034,48.034]],"v":[[188.496,18.888],[176.784,32.254],[0,209.046],[-176.792,32.254],[-188.504,18.888],[-176.792,-157.077],[0,-168.154],[176.784,-157.077]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8117647058823529,0.3764705882352941,0.13333333333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[256.001,249.62],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transformar"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":15,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":79,"s":[-360]}],"ix":3,"x":"var $bm_rt;\n$bm_rt = loopOut('Cycle', 0);"},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":450,"st":0,"bm":0}],"markers":[]} -------------------------------------------------------------------------------- /graphics/scanner_red.json: -------------------------------------------------------------------------------- 1 | {"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.21","a":"Nirmal","k":"Scan, QR Code, scanning, finding","d":"Scan matrix ","tc":"black"},"fr":30,"ip":0,"op":60,"w":328,"h":208,"nm":"Comp 1","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164,104,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.968,3.968],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[62.275,-8.435],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 38","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.322,1.322],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.083,-2.181],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 37","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.886,3.886],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-59.762,-20.978],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 36","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.631,2.631],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-48.644,6.809],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 35","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.114,1.114],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-5.833,23.479],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 34","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[4.258,4.258],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.735,79.987],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 33","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.423,2.423],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.302,61.641],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 32","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[5.14,5.14],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[87.109,65.273],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 31","np":3,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.533,1.533],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[40.978,73.699],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 30","np":3,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.236,1.236],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-25.473,76.203],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 29","np":3,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.371,2.371],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-74.917,76.012],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 28","np":3,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.563,2.563],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-97.174,54.134],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 27","np":3,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.692,2.692],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-61.117,53.441],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 26","np":3,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.429,2.429],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-22.604,56.719],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 25","np":3,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.123,3.123],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.221,52.898],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 24","np":3,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.08,3.08],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[64.483,42.268],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 23","np":3,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.155,3.155],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.426,26.394],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 22","np":3,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.388,1.388],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.115,24.374],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 21","np":3,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[4.02,4.02],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[75.183,14.323],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 20","np":3,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.204,2.204],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.86,28.191],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 19","np":3,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.256,3.256],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-33.177,23.792],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 18","np":3,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.327,2.327],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-79.485,15.371],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 17","np":3,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.312,3.312],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-104.756,4.876],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 16","np":3,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.18,1.18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-75.133,-14.376],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 15","np":3,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.32,3.32],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-2.457,-28.839],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 14","np":3,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[1.702,1.702],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-37.743,-12.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 13","np":3,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.304,2.304],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.103,-13.813],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 12","np":3,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.102,2.102],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.85,-17.324],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 11","np":3,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.429,3.429],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.882,-28.785],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 10","np":3,"cix":2,"bm":0,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.88,3.88],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-86.665,-49.397],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 9","np":3,"cix":2,"bm":0,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.247,3.247],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-34.697,-42.894],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 8","np":3,"cix":2,"bm":0,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[4.116,4.116],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.79,-50.037],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7","np":3,"cix":2,"bm":0,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.483,2.483],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[120.637,-60.325],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":3,"cix":2,"bm":0,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.144,2.144],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[67.804,-82.09],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":3,"cix":2,"bm":0,"ix":34,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.658,2.658],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[24.112,-73.498],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":3,"cix":2,"bm":0,"ix":35,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2.556,2.556],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-41.862,-73.928],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"bm":0,"ix":36,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.154,3.154],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-79.45,-76.66],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"bm":0,"ix":37,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[3.065,3.065],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.921768008961,0.377249983245,0.713619995117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-119.276,-70.263],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":38,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[163.258,63.649,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-163.5,-68],[164.5,-68]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.842815577984,0.842815577984,0.842815577984,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0.617739021778,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"rp","c":{"a":0,"k":39,"ix":1},"o":{"a":0,"k":0,"ix":2},"m":1,"ix":2,"tr":{"ty":"tr","p":{"a":0,"k":[0,6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"Transform"},"nm":"Repeater 1","mn":"ADBE Vector Filter - Repeater","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[267.826,71.985,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-163.5,-68],[164.5,-68]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.842815577984,0.842815577984,0.842815577984,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0.617739021778,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"rp","c":{"a":0,"k":88,"ix":1},"o":{"a":0,"k":0,"ix":2},"m":1,"ix":2,"tr":{"ty":"tr","p":{"a":0,"k":[0,6],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"Transform"},"nm":"Repeater 1","mn":"ADBE Vector Filter - Repeater","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Bar","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[164,0,0],"to":[0,34.667,0],"ti":[0,0,0]},{"i":{"x":0.333,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[164,208,0],"to":[0,0,0],"ti":[0,34.667,0]},{"t":60.0000024438501,"s":[164,0,0]}],"ix":2},"a":{"a":0,"k":[-0.059,-10.747,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[328,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.8156862745098039,0.00784313725490196,0.10588235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.059,-10.747],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,111.338],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Pre-comp 1","hd":true,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[164,104,0],"ix":2},"a":{"a":0,"k":[164,104,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":328,"h":208,"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Trail","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-0.059,-10.747,0],"ix":2},"a":{"a":0,"k":[0,-43.747,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1.062,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[-100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0.123,0]},"t":10,"s":[-100,-150,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,0.938,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[-100,0,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,-0.123,0]},"t":40,"s":[-100,150,100]},{"t":60.0000024438501,"s":[-100,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[328,60],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":60,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0,0,0,0.504,0.2901960784313726,0.2901960784313726,0.2901960784313726,1,0.2901960784313726,0.2901960784313726,0.2901960784313726,0,0.2901960784313726,0.2901960784313726,0.2901960784313726,1,0],"ix":9}},"s":{"a":0,"k":[0,-65],"ix":5},"e":{"a":0,"k":[0,30],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":true},{"ty":"fl","c":{"a":0,"k":[0.2901960784313726,0.2901960784313726,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":true},{"ty":"tr","p":{"a":0,"k":[-0.059,-10.747],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,111.338],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0}],"markers":[]} -------------------------------------------------------------------------------- /links_used_in_demo.txt: -------------------------------------------------------------------------------- 1 | Star_Trek_PADD.jpg (361×276) 2 | https://upload.wikimedia.org/wikipedia/en/8/88/Star_Trek_PADD.jpg 3 | 4 | Skia Graphics Engine - Wikipedia 5 | https://en.wikipedia.org/wiki/Skia_Graphics_Engine 6 | 7 | About Skia | Skia 8 | https://skia.org/about/ 9 | 10 | Skottie - Lottie Animation Player | Skia 11 | https://skia.org/docs/user/modules/skottie/ 12 | 13 | viniciusfbb/skia4delphi: Skia4Delphi is a cross-platform 2D graphics API for Delphi platforms based on Google's Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images. 14 | https://github.com/viniciusfbb/skia4delphi 15 | 16 | skia4delphi/LOTTIE.md at main · viniciusfbb/skia4delphi 17 | https://github.com/viniciusfbb/skia4delphi/blob/main/Documents/LOTTIE.md 18 | 19 | Star Trek fonts | Memory Alpha | Fandom 20 | https://memory-alpha.fandom.com/wiki/Star_Trek_fonts 21 | 22 | https://upload.wikimedia.org/wikipedia/commons/9/9a/Emblem.svg 23 | https://upload.wikimedia.org/wikipedia/commons/9/9a/Emblem.svg 24 | 25 | lcars - Google Search 26 | https://www.google.com/search?q=lcars 27 | 28 | Star_Trek_PADD.jpg (361×276) 29 | https://upload.wikimedia.org/wikipedia/en/8/88/Star_Trek_PADD.jpg 30 | 31 | TrekCore.com 32 | https://www.trekcore.com/audio/ 33 | 34 | Free Lottie Animation Files, Tools & Plugins - LottieFiles 35 | https://lottiefiles.com/ 36 | 37 | checkdigits/spacecomputer: A 'starship computer console from the future' - example of using Skia4Delphi 38 | https://github.com/checkdigits/spacecomputer 39 | 40 | Move Your UI to the 23rd Century - Building a Data Dashboard with Delphi and Skia. Engage! - DelphiCon 2021 by Embarcadero 41 | https://delphicon.embarcadero.com/talks/move-your-ui-to-the-23rd-century-building-a-data-dashboard-with-delphi-and-skia-engage/ 42 | 43 | Evertype: Klingon pIqaD fonts 44 | https://www.evertype.com/fonts/tlh/ 45 | 46 | ConScript Unicode Registry 47 | https://www.evertype.com/standards/csur/klingon.html 48 | 49 | -------------------------------------------------------------------------------- /slides/DelphiCon 2021 Ian Barker.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/slides/DelphiCon 2021 Ian Barker.pptx -------------------------------------------------------------------------------- /sounds/alert08.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/alert08.mp3 -------------------------------------------------------------------------------- /sounds/alert09.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/alert09.mp3 -------------------------------------------------------------------------------- /sounds/communications_end_transmission.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/communications_end_transmission.mp3 -------------------------------------------------------------------------------- /sounds/computer_work_beep.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/computer_work_beep.mp3 -------------------------------------------------------------------------------- /sounds/computerbeep_74.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/computerbeep_74.mp3 -------------------------------------------------------------------------------- /sounds/consolewarning.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/consolewarning.mp3 -------------------------------------------------------------------------------- /sounds/engage.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/checkdigits/spacecomputer/832af49d2881b2976bc8dfe48dcdbd449a86aade/sounds/engage.mp3 --------------------------------------------------------------------------------