├── .gitignore ├── .metadata ├── COPYING ├── README.md ├── android ├── .gitignore ├── app │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ └── nicolassiplis │ │ │ │ └── cyberpwned │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable │ │ │ └── launch_background.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── launcher_icon.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── launcher_icon.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── launcher_icon.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── launcher_icon.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── launcher_icon.png │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets └── icon │ └── icon.png ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── lib ├── cell.dart ├── main.dart ├── path.dart ├── score.dart ├── sequence.dart └── util.dart ├── media └── screenshot │ ├── error.jpg │ └── solved.jpg ├── pubspec.lock └── pubspec.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | .vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | windows/ 44 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 78910062997c3a836feee883712c241a5fd22983 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | 3 | Version 3, 29 June 2007 4 | 5 | 6 | Copyright (C) 2007 Free Software Foundation, Inc. 7 | 8 | Everyone is permitted to copy and distribute verbatim copies 9 | 10 | of this license document, but changing it is not allowed. 11 | 12 | 13 | 14 | Preamble 15 | 16 | 17 | 18 | The GNU General Public License is a free, copyleft license for 19 | 20 | software and other kinds of works. 21 | 22 | 23 | 24 | The licenses for most software and other practical works are designed 25 | 26 | to take away your freedom to share and change the works. By contrast, 27 | 28 | the GNU General Public License is intended to guarantee your freedom to 29 | 30 | share and change all versions of a program--to make sure it remains free 31 | 32 | software for all its users. We, the Free Software Foundation, use the 33 | 34 | GNU General Public License for most of our software; it applies also to 35 | 36 | any other work released this way by its authors. You can apply it to 37 | 38 | your programs, too. 39 | 40 | 41 | 42 | When we speak of free software, we are referring to freedom, not 43 | 44 | price. Our General Public Licenses are designed to make sure that you 45 | 46 | have the freedom to distribute copies of free software (and charge for 47 | 48 | them if you wish), that you receive source code or can get it if you 49 | 50 | want it, that you can change the software or use pieces of it in new 51 | 52 | free programs, and that you know you can do these things. 53 | 54 | 55 | 56 | To protect your rights, we need to prevent others from denying you 57 | 58 | these rights or asking you to surrender the rights. Therefore, you have 59 | 60 | certain responsibilities if you distribute copies of the software, or if 61 | 62 | you modify it: responsibilities to respect the freedom of others. 63 | 64 | 65 | 66 | For example, if you distribute copies of such a program, whether 67 | 68 | gratis or for a fee, you must pass on to the recipients the same 69 | 70 | freedoms that you received. You must make sure that they, too, receive 71 | 72 | or can get the source code. And you must show them these terms so they 73 | 74 | know their rights. 75 | 76 | 77 | 78 | Developers that use the GNU GPL protect your rights with two steps: 79 | 80 | (1) assert copyright on the software, and (2) offer you this License 81 | 82 | giving you legal permission to copy, distribute and/or modify it. 83 | 84 | 85 | 86 | For the developers' and authors' protection, the GPL clearly explains 87 | 88 | that there is no warranty for this free software. For both users' and 89 | 90 | authors' sake, the GPL requires that modified versions be marked as 91 | 92 | changed, so that their problems will not be attributed erroneously to 93 | 94 | authors of previous versions. 95 | 96 | 97 | 98 | Some devices are designed to deny users access to install or run 99 | 100 | modified versions of the software inside them, although the manufacturer 101 | 102 | can do so. This is fundamentally incompatible with the aim of 103 | 104 | protecting users' freedom to change the software. The systematic 105 | 106 | pattern of such abuse occurs in the area of products for individuals to 107 | 108 | use, which is precisely where it is most unacceptable. Therefore, we 109 | 110 | have designed this version of the GPL to prohibit the practice for those 111 | 112 | products. If such problems arise substantially in other domains, we 113 | 114 | stand ready to extend this provision to those domains in future versions 115 | 116 | of the GPL, as needed to protect the freedom of users. 117 | 118 | 119 | 120 | Finally, every program is threatened constantly by software patents. 121 | 122 | States should not allow patents to restrict development and use of 123 | 124 | software on general-purpose computers, but in those that do, we wish to 125 | 126 | avoid the special danger that patents applied to a free program could 127 | 128 | make it effectively proprietary. To prevent this, the GPL assures that 129 | 130 | patents cannot be used to render the program non-free. 131 | 132 | 133 | 134 | The precise terms and conditions for copying, distribution and 135 | 136 | modification follow. 137 | 138 | 139 | 140 | TERMS AND CONDITIONS 141 | 142 | 143 | 144 | 0. Definitions. 145 | 146 | 147 | 148 | "This License" refers to version 3 of the GNU General Public License. 149 | 150 | 151 | 152 | "Copyright" also means copyright-like laws that apply to other kinds of 153 | 154 | works, such as semiconductor masks. 155 | 156 | 157 | 158 | "The Program" refers to any copyrightable work licensed under this 159 | 160 | License. Each licensee is addressed as "you". "Licensees" and 161 | 162 | "recipients" may be individuals or organizations. 163 | 164 | 165 | 166 | To "modify" a work means to copy from or adapt all or part of the work 167 | 168 | in a fashion requiring copyright permission, other than the making of an 169 | 170 | exact copy. The resulting work is called a "modified version" of the 171 | 172 | earlier work or a work "based on" the earlier work. 173 | 174 | 175 | 176 | A "covered work" means either the unmodified Program or a work based 177 | 178 | on the Program. 179 | 180 | 181 | 182 | To "propagate" a work means to do anything with it that, without 183 | 184 | permission, would make you directly or secondarily liable for 185 | 186 | infringement under applicable copyright law, except executing it on a 187 | 188 | computer or modifying a private copy. Propagation includes copying, 189 | 190 | distribution (with or without modification), making available to the 191 | 192 | public, and in some countries other activities as well. 193 | 194 | 195 | 196 | To "convey" a work means any kind of propagation that enables other 197 | 198 | parties to make or receive copies. Mere interaction with a user through 199 | 200 | a computer network, with no transfer of a copy, is not conveying. 201 | 202 | 203 | 204 | An interactive user interface displays "Appropriate Legal Notices" 205 | 206 | to the extent that it includes a convenient and prominently visible 207 | 208 | feature that (1) displays an appropriate copyright notice, and (2) 209 | 210 | tells the user that there is no warranty for the work (except to the 211 | 212 | extent that warranties are provided), that licensees may convey the 213 | 214 | work under this License, and how to view a copy of this License. If 215 | 216 | the interface presents a list of user commands or options, such as a 217 | 218 | menu, a prominent item in the list meets this criterion. 219 | 220 | 221 | 222 | 1. Source Code. 223 | 224 | 225 | 226 | The "source code" for a work means the preferred form of the work 227 | 228 | for making modifications to it. "Object code" means any non-source 229 | 230 | form of a work. 231 | 232 | 233 | 234 | A "Standard Interface" means an interface that either is an official 235 | 236 | standard defined by a recognized standards body, or, in the case of 237 | 238 | interfaces specified for a particular programming language, one that 239 | 240 | is widely used among developers working in that language. 241 | 242 | 243 | 244 | The "System Libraries" of an executable work include anything, other 245 | 246 | than the work as a whole, that (a) is included in the normal form of 247 | 248 | packaging a Major Component, but which is not part of that Major 249 | 250 | Component, and (b) serves only to enable use of the work with that 251 | 252 | Major Component, or to implement a Standard Interface for which an 253 | 254 | implementation is available to the public in source code form. A 255 | 256 | "Major Component", in this context, means a major essential component 257 | 258 | (kernel, window system, and so on) of the specific operating system 259 | 260 | (if any) on which the executable work runs, or a compiler used to 261 | 262 | produce the work, or an object code interpreter used to run it. 263 | 264 | 265 | 266 | The "Corresponding Source" for a work in object code form means all 267 | 268 | the source code needed to generate, install, and (for an executable 269 | 270 | work) run the object code and to modify the work, including scripts to 271 | 272 | control those activities. However, it does not include the work's 273 | 274 | System Libraries, or general-purpose tools or generally available free 275 | 276 | programs which are used unmodified in performing those activities but 277 | 278 | which are not part of the work. For example, Corresponding Source 279 | 280 | includes interface definition files associated with source files for 281 | 282 | the work, and the source code for shared libraries and dynamically 283 | 284 | linked subprograms that the work is specifically designed to require, 285 | 286 | such as by intimate data communication or control flow between those 287 | 288 | subprograms and other parts of the work. 289 | 290 | 291 | 292 | The Corresponding Source need not include anything that users 293 | 294 | can regenerate automatically from other parts of the Corresponding 295 | 296 | Source. 297 | 298 | 299 | 300 | The Corresponding Source for a work in source code form is that 301 | 302 | same work. 303 | 304 | 305 | 306 | 2. Basic Permissions. 307 | 308 | 309 | 310 | All rights granted under this License are granted for the term of 311 | 312 | copyright on the Program, and are irrevocable provided the stated 313 | 314 | conditions are met. This License explicitly affirms your unlimited 315 | 316 | permission to run the unmodified Program. The output from running a 317 | 318 | covered work is covered by this License only if the output, given its 319 | 320 | content, constitutes a covered work. This License acknowledges your 321 | 322 | rights of fair use or other equivalent, as provided by copyright law. 323 | 324 | 325 | 326 | You may make, run and propagate covered works that you do not 327 | 328 | convey, without conditions so long as your license otherwise remains 329 | 330 | in force. You may convey covered works to others for the sole purpose 331 | 332 | of having them make modifications exclusively for you, or provide you 333 | 334 | with facilities for running those works, provided that you comply with 335 | 336 | the terms of this License in conveying all material for which you do 337 | 338 | not control copyright. Those thus making or running the covered works 339 | 340 | for you must do so exclusively on your behalf, under your direction 341 | 342 | and control, on terms that prohibit them from making any copies of 343 | 344 | your copyrighted material outside their relationship with you. 345 | 346 | 347 | 348 | Conveying under any other circumstances is permitted solely under 349 | 350 | the conditions stated below. Sublicensing is not allowed; section 10 351 | 352 | makes it unnecessary. 353 | 354 | 355 | 356 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 357 | 358 | 359 | 360 | No covered work shall be deemed part of an effective technological 361 | 362 | measure under any applicable law fulfilling obligations under article 363 | 364 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 365 | 366 | similar laws prohibiting or restricting circumvention of such 367 | 368 | measures. 369 | 370 | 371 | 372 | When you convey a covered work, you waive any legal power to forbid 373 | 374 | circumvention of technological measures to the extent such circumvention 375 | 376 | is effected by exercising rights under this License with respect to 377 | 378 | the covered work, and you disclaim any intention to limit operation or 379 | 380 | modification of the work as a means of enforcing, against the work's 381 | 382 | users, your or third parties' legal rights to forbid circumvention of 383 | 384 | technological measures. 385 | 386 | 387 | 388 | 4. Conveying Verbatim Copies. 389 | 390 | 391 | 392 | You may convey verbatim copies of the Program's source code as you 393 | 394 | receive it, in any medium, provided that you conspicuously and 395 | 396 | appropriately publish on each copy an appropriate copyright notice; 397 | 398 | keep intact all notices stating that this License and any 399 | 400 | non-permissive terms added in accord with section 7 apply to the code; 401 | 402 | keep intact all notices of the absence of any warranty; and give all 403 | 404 | recipients a copy of this License along with the Program. 405 | 406 | 407 | 408 | You may charge any price or no price for each copy that you convey, 409 | 410 | and you may offer support or warranty protection for a fee. 411 | 412 | 413 | 414 | 5. Conveying Modified Source Versions. 415 | 416 | 417 | 418 | You may convey a work based on the Program, or the modifications to 419 | 420 | produce it from the Program, in the form of source code under the 421 | 422 | terms of section 4, provided that you also meet all of these conditions: 423 | 424 | 425 | 426 | a) The work must carry prominent notices stating that you modified 427 | 428 | it, and giving a relevant date. 429 | 430 | 431 | 432 | b) The work must carry prominent notices stating that it is 433 | 434 | released under this License and any conditions added under section 435 | 436 | 7. This requirement modifies the requirement in section 4 to 437 | 438 | "keep intact all notices". 439 | 440 | 441 | 442 | c) You must license the entire work, as a whole, under this 443 | 444 | License to anyone who comes into possession of a copy. This 445 | 446 | License will therefore apply, along with any applicable section 7 447 | 448 | additional terms, to the whole of the work, and all its parts, 449 | 450 | regardless of how they are packaged. This License gives no 451 | 452 | permission to license the work in any other way, but it does not 453 | 454 | invalidate such permission if you have separately received it. 455 | 456 | 457 | 458 | d) If the work has interactive user interfaces, each must display 459 | 460 | Appropriate Legal Notices; however, if the Program has interactive 461 | 462 | interfaces that do not display Appropriate Legal Notices, your 463 | 464 | work need not make them do so. 465 | 466 | 467 | 468 | A compilation of a covered work with other separate and independent 469 | 470 | works, which are not by their nature extensions of the covered work, 471 | 472 | and which are not combined with it such as to form a larger program, 473 | 474 | in or on a volume of a storage or distribution medium, is called an 475 | 476 | "aggregate" if the compilation and its resulting copyright are not 477 | 478 | used to limit the access or legal rights of the compilation's users 479 | 480 | beyond what the individual works permit. Inclusion of a covered work 481 | 482 | in an aggregate does not cause this License to apply to the other 483 | 484 | parts of the aggregate. 485 | 486 | 487 | 488 | 6. Conveying Non-Source Forms. 489 | 490 | 491 | 492 | You may convey a covered work in object code form under the terms 493 | 494 | of sections 4 and 5, provided that you also convey the 495 | 496 | machine-readable Corresponding Source under the terms of this License, 497 | 498 | in one of these ways: 499 | 500 | 501 | 502 | a) Convey the object code in, or embodied in, a physical product 503 | 504 | (including a physical distribution medium), accompanied by the 505 | 506 | Corresponding Source fixed on a durable physical medium 507 | 508 | customarily used for software interchange. 509 | 510 | 511 | 512 | b) Convey the object code in, or embodied in, a physical product 513 | 514 | (including a physical distribution medium), accompanied by a 515 | 516 | written offer, valid for at least three years and valid for as 517 | 518 | long as you offer spare parts or customer support for that product 519 | 520 | model, to give anyone who possesses the object code either (1) a 521 | 522 | copy of the Corresponding Source for all the software in the 523 | 524 | product that is covered by this License, on a durable physical 525 | 526 | medium customarily used for software interchange, for a price no 527 | 528 | more than your reasonable cost of physically performing this 529 | 530 | conveying of source, or (2) access to copy the 531 | 532 | Corresponding Source from a network server at no charge. 533 | 534 | 535 | 536 | c) Convey individual copies of the object code with a copy of the 537 | 538 | written offer to provide the Corresponding Source. This 539 | 540 | alternative is allowed only occasionally and noncommercially, and 541 | 542 | only if you received the object code with such an offer, in accord 543 | 544 | with subsection 6b. 545 | 546 | 547 | 548 | d) Convey the object code by offering access from a designated 549 | 550 | place (gratis or for a charge), and offer equivalent access to the 551 | 552 | Corresponding Source in the same way through the same place at no 553 | 554 | further charge. You need not require recipients to copy the 555 | 556 | Corresponding Source along with the object code. If the place to 557 | 558 | copy the object code is a network server, the Corresponding Source 559 | 560 | may be on a different server (operated by you or a third party) 561 | 562 | that supports equivalent copying facilities, provided you maintain 563 | 564 | clear directions next to the object code saying where to find the 565 | 566 | Corresponding Source. Regardless of what server hosts the 567 | 568 | Corresponding Source, you remain obligated to ensure that it is 569 | 570 | available for as long as needed to satisfy these requirements. 571 | 572 | 573 | 574 | e) Convey the object code using peer-to-peer transmission, provided 575 | 576 | you inform other peers where the object code and Corresponding 577 | 578 | Source of the work are being offered to the general public at no 579 | 580 | charge under subsection 6d. 581 | 582 | 583 | 584 | A separable portion of the object code, whose source code is excluded 585 | 586 | from the Corresponding Source as a System Library, need not be 587 | 588 | included in conveying the object code work. 589 | 590 | 591 | 592 | A "User Product" is either (1) a "consumer product", which means any 593 | 594 | tangible personal property which is normally used for personal, family, 595 | 596 | or household purposes, or (2) anything designed or sold for incorporation 597 | 598 | into a dwelling. In determining whether a product is a consumer product, 599 | 600 | doubtful cases shall be resolved in favor of coverage. For a particular 601 | 602 | product received by a particular user, "normally used" refers to a 603 | 604 | typical or common use of that class of product, regardless of the status 605 | 606 | of the particular user or of the way in which the particular user 607 | 608 | actually uses, or expects or is expected to use, the product. A product 609 | 610 | is a consumer product regardless of whether the product has substantial 611 | 612 | commercial, industrial or non-consumer uses, unless such uses represent 613 | 614 | the only significant mode of use of the product. 615 | 616 | 617 | 618 | "Installation Information" for a User Product means any methods, 619 | 620 | procedures, authorization keys, or other information required to install 621 | 622 | and execute modified versions of a covered work in that User Product from 623 | 624 | a modified version of its Corresponding Source. The information must 625 | 626 | suffice to ensure that the continued functioning of the modified object 627 | 628 | code is in no case prevented or interfered with solely because 629 | 630 | modification has been made. 631 | 632 | 633 | 634 | If you convey an object code work under this section in, or with, or 635 | 636 | specifically for use in, a User Product, and the conveying occurs as 637 | 638 | part of a transaction in which the right of possession and use of the 639 | 640 | User Product is transferred to the recipient in perpetuity or for a 641 | 642 | fixed term (regardless of how the transaction is characterized), the 643 | 644 | Corresponding Source conveyed under this section must be accompanied 645 | 646 | by the Installation Information. But this requirement does not apply 647 | 648 | if neither you nor any third party retains the ability to install 649 | 650 | modified object code on the User Product (for example, the work has 651 | 652 | been installed in ROM). 653 | 654 | 655 | 656 | The requirement to provide Installation Information does not include a 657 | 658 | requirement to continue to provide support service, warranty, or updates 659 | 660 | for a work that has been modified or installed by the recipient, or for 661 | 662 | the User Product in which it has been modified or installed. Access to a 663 | 664 | network may be denied when the modification itself materially and 665 | 666 | adversely affects the operation of the network or violates the rules and 667 | 668 | protocols for communication across the network. 669 | 670 | 671 | 672 | Corresponding Source conveyed, and Installation Information provided, 673 | 674 | in accord with this section must be in a format that is publicly 675 | 676 | documented (and with an implementation available to the public in 677 | 678 | source code form), and must require no special password or key for 679 | 680 | unpacking, reading or copying. 681 | 682 | 683 | 684 | 7. Additional Terms. 685 | 686 | 687 | 688 | "Additional permissions" are terms that supplement the terms of this 689 | 690 | License by making exceptions from one or more of its conditions. 691 | 692 | Additional permissions that are applicable to the entire Program shall 693 | 694 | be treated as though they were included in this License, to the extent 695 | 696 | that they are valid under applicable law. If additional permissions 697 | 698 | apply only to part of the Program, that part may be used separately 699 | 700 | under those permissions, but the entire Program remains governed by 701 | 702 | this License without regard to the additional permissions. 703 | 704 | 705 | 706 | When you convey a copy of a covered work, you may at your option 707 | 708 | remove any additional permissions from that copy, or from any part of 709 | 710 | it. (Additional permissions may be written to require their own 711 | 712 | removal in certain cases when you modify the work.) You may place 713 | 714 | additional permissions on material, added by you to a covered work, 715 | 716 | for which you have or can give appropriate copyright permission. 717 | 718 | 719 | 720 | Notwithstanding any other provision of this License, for material you 721 | 722 | add to a covered work, you may (if authorized by the copyright holders of 723 | 724 | that material) supplement the terms of this License with terms: 725 | 726 | 727 | 728 | a) Disclaiming warranty or limiting liability differently from the 729 | 730 | terms of sections 15 and 16 of this License; or 731 | 732 | 733 | 734 | b) Requiring preservation of specified reasonable legal notices or 735 | 736 | author attributions in that material or in the Appropriate Legal 737 | 738 | Notices displayed by works containing it; or 739 | 740 | 741 | 742 | c) Prohibiting misrepresentation of the origin of that material, or 743 | 744 | requiring that modified versions of such material be marked in 745 | 746 | reasonable ways as different from the original version; or 747 | 748 | 749 | 750 | d) Limiting the use for publicity purposes of names of licensors or 751 | 752 | authors of the material; or 753 | 754 | 755 | 756 | e) Declining to grant rights under trademark law for use of some 757 | 758 | trade names, trademarks, or service marks; or 759 | 760 | 761 | 762 | f) Requiring indemnification of licensors and authors of that 763 | 764 | material by anyone who conveys the material (or modified versions of 765 | 766 | it) with contractual assumptions of liability to the recipient, for 767 | 768 | any liability that these contractual assumptions directly impose on 769 | 770 | those licensors and authors. 771 | 772 | 773 | 774 | All other non-permissive additional terms are considered "further 775 | 776 | restrictions" within the meaning of section 10. If the Program as you 777 | 778 | received it, or any part of it, contains a notice stating that it is 779 | 780 | governed by this License along with a term that is a further 781 | 782 | restriction, you may remove that term. If a license document contains 783 | 784 | a further restriction but permits relicensing or conveying under this 785 | 786 | License, you may add to a covered work material governed by the terms 787 | 788 | of that license document, provided that the further restriction does 789 | 790 | not survive such relicensing or conveying. 791 | 792 | 793 | 794 | If you add terms to a covered work in accord with this section, you 795 | 796 | must place, in the relevant source files, a statement of the 797 | 798 | additional terms that apply to those files, or a notice indicating 799 | 800 | where to find the applicable terms. 801 | 802 | 803 | 804 | Additional terms, permissive or non-permissive, may be stated in the 805 | 806 | form of a separately written license, or stated as exceptions; 807 | 808 | the above requirements apply either way. 809 | 810 | 811 | 812 | 8. Termination. 813 | 814 | 815 | 816 | You may not propagate or modify a covered work except as expressly 817 | 818 | provided under this License. Any attempt otherwise to propagate or 819 | 820 | modify it is void, and will automatically terminate your rights under 821 | 822 | this License (including any patent licenses granted under the third 823 | 824 | paragraph of section 11). 825 | 826 | 827 | 828 | However, if you cease all violation of this License, then your 829 | 830 | license from a particular copyright holder is reinstated (a) 831 | 832 | provisionally, unless and until the copyright holder explicitly and 833 | 834 | finally terminates your license, and (b) permanently, if the copyright 835 | 836 | holder fails to notify you of the violation by some reasonable means 837 | 838 | prior to 60 days after the cessation. 839 | 840 | 841 | 842 | Moreover, your license from a particular copyright holder is 843 | 844 | reinstated permanently if the copyright holder notifies you of the 845 | 846 | violation by some reasonable means, this is the first time you have 847 | 848 | received notice of violation of this License (for any work) from that 849 | 850 | copyright holder, and you cure the violation prior to 30 days after 851 | 852 | your receipt of the notice. 853 | 854 | 855 | 856 | Termination of your rights under this section does not terminate the 857 | 858 | licenses of parties who have received copies or rights from you under 859 | 860 | this License. If your rights have been terminated and not permanently 861 | 862 | reinstated, you do not qualify to receive new licenses for the same 863 | 864 | material under section 10. 865 | 866 | 867 | 868 | 9. Acceptance Not Required for Having Copies. 869 | 870 | 871 | 872 | You are not required to accept this License in order to receive or 873 | 874 | run a copy of the Program. Ancillary propagation of a covered work 875 | 876 | occurring solely as a consequence of using peer-to-peer transmission 877 | 878 | to receive a copy likewise does not require acceptance. However, 879 | 880 | nothing other than this License grants you permission to propagate or 881 | 882 | modify any covered work. These actions infringe copyright if you do 883 | 884 | not accept this License. Therefore, by modifying or propagating a 885 | 886 | covered work, you indicate your acceptance of this License to do so. 887 | 888 | 889 | 890 | 10. Automatic Licensing of Downstream Recipients. 891 | 892 | 893 | 894 | Each time you convey a covered work, the recipient automatically 895 | 896 | receives a license from the original licensors, to run, modify and 897 | 898 | propagate that work, subject to this License. You are not responsible 899 | 900 | for enforcing compliance by third parties with this License. 901 | 902 | 903 | 904 | An "entity transaction" is a transaction transferring control of an 905 | 906 | organization, or substantially all assets of one, or subdividing an 907 | 908 | organization, or merging organizations. If propagation of a covered 909 | 910 | work results from an entity transaction, each party to that 911 | 912 | transaction who receives a copy of the work also receives whatever 913 | 914 | licenses to the work the party's predecessor in interest had or could 915 | 916 | give under the previous paragraph, plus a right to possession of the 917 | 918 | Corresponding Source of the work from the predecessor in interest, if 919 | 920 | the predecessor has it or can get it with reasonable efforts. 921 | 922 | 923 | 924 | You may not impose any further restrictions on the exercise of the 925 | 926 | rights granted or affirmed under this License. For example, you may 927 | 928 | not impose a license fee, royalty, or other charge for exercise of 929 | 930 | rights granted under this License, and you may not initiate litigation 931 | 932 | (including a cross-claim or counterclaim in a lawsuit) alleging that 933 | 934 | any patent claim is infringed by making, using, selling, offering for 935 | 936 | sale, or importing the Program or any portion of it. 937 | 938 | 939 | 940 | 11. Patents. 941 | 942 | 943 | 944 | A "contributor" is a copyright holder who authorizes use under this 945 | 946 | License of the Program or a work on which the Program is based. The 947 | 948 | work thus licensed is called the contributor's "contributor version". 949 | 950 | 951 | 952 | A contributor's "essential patent claims" are all patent claims 953 | 954 | owned or controlled by the contributor, whether already acquired or 955 | 956 | hereafter acquired, that would be infringed by some manner, permitted 957 | 958 | by this License, of making, using, or selling its contributor version, 959 | 960 | but do not include claims that would be infringed only as a 961 | 962 | consequence of further modification of the contributor version. For 963 | 964 | purposes of this definition, "control" includes the right to grant 965 | 966 | patent sublicenses in a manner consistent with the requirements of 967 | 968 | this License. 969 | 970 | 971 | 972 | Each contributor grants you a non-exclusive, worldwide, royalty-free 973 | 974 | patent license under the contributor's essential patent claims, to 975 | 976 | make, use, sell, offer for sale, import and otherwise run, modify and 977 | 978 | propagate the contents of its contributor version. 979 | 980 | 981 | 982 | In the following three paragraphs, a "patent license" is any express 983 | 984 | agreement or commitment, however denominated, not to enforce a patent 985 | 986 | (such as an express permission to practice a patent or covenant not to 987 | 988 | sue for patent infringement). To "grant" such a patent license to a 989 | 990 | party means to make such an agreement or commitment not to enforce a 991 | 992 | patent against the party. 993 | 994 | 995 | 996 | If you convey a covered work, knowingly relying on a patent license, 997 | 998 | and the Corresponding Source of the work is not available for anyone 999 | 1000 | to copy, free of charge and under the terms of this License, through a 1001 | 1002 | publicly available network server or other readily accessible means, 1003 | 1004 | then you must either (1) cause the Corresponding Source to be so 1005 | 1006 | available, or (2) arrange to deprive yourself of the benefit of the 1007 | 1008 | patent license for this particular work, or (3) arrange, in a manner 1009 | 1010 | consistent with the requirements of this License, to extend the patent 1011 | 1012 | license to downstream recipients. "Knowingly relying" means you have 1013 | 1014 | actual knowledge that, but for the patent license, your conveying the 1015 | 1016 | covered work in a country, or your recipient's use of the covered work 1017 | 1018 | in a country, would infringe one or more identifiable patents in that 1019 | 1020 | country that you have reason to believe are valid. 1021 | 1022 | 1023 | 1024 | If, pursuant to or in connection with a single transaction or 1025 | 1026 | arrangement, you convey, or propagate by procuring conveyance of, a 1027 | 1028 | covered work, and grant a patent license to some of the parties 1029 | 1030 | receiving the covered work authorizing them to use, propagate, modify 1031 | 1032 | or convey a specific copy of the covered work, then the patent license 1033 | 1034 | you grant is automatically extended to all recipients of the covered 1035 | 1036 | work and works based on it. 1037 | 1038 | 1039 | 1040 | A patent license is "discriminatory" if it does not include within 1041 | 1042 | the scope of its coverage, prohibits the exercise of, or is 1043 | 1044 | conditioned on the non-exercise of one or more of the rights that are 1045 | 1046 | specifically granted under this License. You may not convey a covered 1047 | 1048 | work if you are a party to an arrangement with a third party that is 1049 | 1050 | in the business of distributing software, under which you make payment 1051 | 1052 | to the third party based on the extent of your activity of conveying 1053 | 1054 | the work, and under which the third party grants, to any of the 1055 | 1056 | parties who would receive the covered work from you, a discriminatory 1057 | 1058 | patent license (a) in connection with copies of the covered work 1059 | 1060 | conveyed by you (or copies made from those copies), or (b) primarily 1061 | 1062 | for and in connection with specific products or compilations that 1063 | 1064 | contain the covered work, unless you entered into that arrangement, 1065 | 1066 | or that patent license was granted, prior to 28 March 2007. 1067 | 1068 | 1069 | 1070 | Nothing in this License shall be construed as excluding or limiting 1071 | 1072 | any implied license or other defenses to infringement that may 1073 | 1074 | otherwise be available to you under applicable patent law. 1075 | 1076 | 1077 | 1078 | 12. No Surrender of Others' Freedom. 1079 | 1080 | 1081 | 1082 | If conditions are imposed on you (whether by court order, agreement or 1083 | 1084 | otherwise) that contradict the conditions of this License, they do not 1085 | 1086 | excuse you from the conditions of this License. If you cannot convey a 1087 | 1088 | covered work so as to satisfy simultaneously your obligations under this 1089 | 1090 | License and any other pertinent obligations, then as a consequence you may 1091 | 1092 | not convey it at all. For example, if you agree to terms that obligate you 1093 | 1094 | to collect a royalty for further conveying from those to whom you convey 1095 | 1096 | the Program, the only way you could satisfy both those terms and this 1097 | 1098 | License would be to refrain entirely from conveying the Program. 1099 | 1100 | 1101 | 1102 | 13. Use with the GNU Affero General Public License. 1103 | 1104 | 1105 | 1106 | Notwithstanding any other provision of this License, you have 1107 | 1108 | permission to link or combine any covered work with a work licensed 1109 | 1110 | under version 3 of the GNU Affero General Public License into a single 1111 | 1112 | combined work, and to convey the resulting work. The terms of this 1113 | 1114 | License will continue to apply to the part which is the covered work, 1115 | 1116 | but the special requirements of the GNU Affero General Public License, 1117 | 1118 | section 13, concerning interaction through a network will apply to the 1119 | 1120 | combination as such. 1121 | 1122 | 1123 | 1124 | 14. Revised Versions of this License. 1125 | 1126 | 1127 | 1128 | The Free Software Foundation may publish revised and/or new versions of 1129 | 1130 | the GNU General Public License from time to time. Such new versions will 1131 | 1132 | be similar in spirit to the present version, but may differ in detail to 1133 | 1134 | address new problems or concerns. 1135 | 1136 | 1137 | 1138 | Each version is given a distinguishing version number. If the 1139 | 1140 | Program specifies that a certain numbered version of the GNU General 1141 | 1142 | Public License "or any later version" applies to it, you have the 1143 | 1144 | option of following the terms and conditions either of that numbered 1145 | 1146 | version or of any later version published by the Free Software 1147 | 1148 | Foundation. If the Program does not specify a version number of the 1149 | 1150 | GNU General Public License, you may choose any version ever published 1151 | 1152 | by the Free Software Foundation. 1153 | 1154 | 1155 | 1156 | If the Program specifies that a proxy can decide which future 1157 | 1158 | versions of the GNU General Public License can be used, that proxy's 1159 | 1160 | public statement of acceptance of a version permanently authorizes you 1161 | 1162 | to choose that version for the Program. 1163 | 1164 | 1165 | 1166 | Later license versions may give you additional or different 1167 | 1168 | permissions. However, no additional obligations are imposed on any 1169 | 1170 | author or copyright holder as a result of your choosing to follow a 1171 | 1172 | later version. 1173 | 1174 | 1175 | 1176 | 15. Disclaimer of Warranty. 1177 | 1178 | 1179 | 1180 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 1181 | 1182 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 1183 | 1184 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 1185 | 1186 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 1187 | 1188 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1189 | 1190 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 1191 | 1192 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 1193 | 1194 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 1195 | 1196 | 1197 | 1198 | 16. Limitation of Liability. 1199 | 1200 | 1201 | 1202 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 1203 | 1204 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 1205 | 1206 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 1207 | 1208 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 1209 | 1210 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 1211 | 1212 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 1213 | 1214 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 1215 | 1216 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 1217 | 1218 | SUCH DAMAGES. 1219 | 1220 | 1221 | 1222 | 17. Interpretation of Sections 15 and 16. 1223 | 1224 | 1225 | 1226 | If the disclaimer of warranty and limitation of liability provided 1227 | 1228 | above cannot be given local legal effect according to their terms, 1229 | 1230 | reviewing courts shall apply local law that most closely approximates 1231 | 1232 | an absolute waiver of all civil liability in connection with the 1233 | 1234 | Program, unless a warranty or assumption of liability accompanies a 1235 | 1236 | copy of the Program in return for a fee. 1237 | 1238 | 1239 | 1240 | END OF TERMS AND CONDITIONS 1241 | 1242 | 1243 | 1244 | How to Apply These Terms to Your New Programs 1245 | 1246 | 1247 | 1248 | If you develop a new program, and you want it to be of the greatest 1249 | 1250 | possible use to the public, the best way to achieve this is to make it 1251 | 1252 | free software which everyone can redistribute and change under these terms. 1253 | 1254 | 1255 | 1256 | To do so, attach the following notices to the program. It is safest 1257 | 1258 | to attach them to the start of each source file to most effectively 1259 | 1260 | state the exclusion of warranty; and each file should have at least 1261 | 1262 | the "copyright" line and a pointer to where the full notice is found. 1263 | 1264 | 1265 | 1266 | 1267 | 1268 | Copyright (C) 1269 | 1270 | 1271 | 1272 | This program is free software: you can redistribute it and/or modify 1273 | 1274 | it under the terms of the GNU General Public License as published by 1275 | 1276 | the Free Software Foundation, either version 3 of the License, or 1277 | 1278 | (at your option) any later version. 1279 | 1280 | 1281 | 1282 | This program is distributed in the hope that it will be useful, 1283 | 1284 | but WITHOUT ANY WARRANTY; without even the implied warranty of 1285 | 1286 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1287 | 1288 | GNU General Public License for more details. 1289 | 1290 | 1291 | 1292 | You should have received a copy of the GNU General Public License 1293 | 1294 | along with this program. If not, see . 1295 | 1296 | 1297 | 1298 | Also add information on how to contact you by electronic and paper mail. 1299 | 1300 | 1301 | 1302 | If the program does terminal interaction, make it output a short 1303 | 1304 | notice like this when it starts in an interactive mode: 1305 | 1306 | 1307 | 1308 | Copyright (C) 1309 | 1310 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 1311 | 1312 | This is free software, and you are welcome to redistribute it 1313 | 1314 | under certain conditions; type `show c' for details. 1315 | 1316 | 1317 | 1318 | The hypothetical commands `show w' and `show c' should show the appropriate 1319 | 1320 | parts of the General Public License. Of course, your program's commands 1321 | 1322 | might be different; for a GUI interface, you would use an "about box". 1323 | 1324 | 1325 | 1326 | You should also get your employer (if you work as a programmer) or school, 1327 | 1328 | if any, to sign a "copyright disclaimer" for the program, if necessary. 1329 | 1330 | For more information on this, and how to apply and follow the GNU GPL, see 1331 | 1332 | . 1333 | 1334 | 1335 | 1336 | The GNU General Public License does not permit incorporating your program 1337 | 1338 | into proprietary programs. If your program is a subroutine library, you 1339 | 1340 | may consider it more useful to permit linking proprietary applications with 1341 | 1342 | the library. If this is what you want to do, use the GNU Lesser General 1343 | 1344 | Public License instead of this License. But first, please read 1345 | 1346 | . 1347 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cyberpwned 2 | 3 | Cyberpunk 2077 Hacking Minigame Resolver - Play Store: https://play.google.com/store/apps/details?id=com.nicolassiplis.cyberpwned 4 | 5 | ## Requirements 6 | - Flutter 7 | - Currently tested with version 2.0 8 | - https://flutter.dev/ 9 | - A personal Firebase project 10 | - Required to get a valid google-services.json file 11 | - https://support.google.com/firebase/answer/7015592?hl=en 12 | - Android Studio/IntelliJ with Flutter plugin 13 | - Not entirely required, but should allow you to test the app without having to side-load it into your phone 14 | 15 | ## Installing and running 16 | 17 | Make sure you copy your google-services.json file to android/app, otherwise you'll get a build error and won't be able to compile the application. 18 | 19 | There are several ways of trying out the app: 20 | * From the command line, you can do ```flutter build apk``` which should generate an app-release.apk file in build/outputs/apk/release. You should then be able to side-load the app into your phone. 21 | * If you're using Android Studio/IntelliJ with the Flutter plugin installed, take a look at the following guide: https://flutter.dev/docs/get-started/test-drive?tab=androidstudio#run-the-app. Assuming you're using an emulator, you'll need to configure a webcam to actually test the app: https://stackoverflow.com/a/30792615/4572619. 22 | * If you'd like to run the application on your device without having to side-load it: https://stackoverflow.com/a/54526682/4572619 23 | * If you're willing to side-load the APK file, download it from: https://github.com/nicolas-siplis/cyberpwned/releases 24 | 25 | ![Default breach screen](./media/screenshot/error.jpg) 26 | 27 | ![Solved breach screen](./media/screenshot/solved.jpg) 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | local.properties 13 | app/google-services.json 14 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | def keystoreProperties = new Properties() 29 | def keystorePropertiesFile = rootProject.file('key.properties') 30 | if (keystorePropertiesFile.exists()) { 31 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 32 | } 33 | 34 | rootProject.buildDir = '../build' 35 | subprojects { 36 | project.buildDir = "${rootProject.buildDir}/${project.name}" 37 | } 38 | subprojects { 39 | project.evaluationDependsOn(':app') 40 | } 41 | subprojects { 42 | afterEvaluate { project -> 43 | if (project.hasProperty('android')) { 44 | project.android { 45 | if (namespace == null) { 46 | namespace "com.nicolassiplis.cyberpwned" 47 | } 48 | } 49 | } 50 | } 51 | } 52 | 53 | android { 54 | 55 | namespace "com.nicolassiplis.cyberpwned" 56 | 57 | sourceSets { 58 | main.java.srcDirs += 'src/main/kotlin' 59 | } 60 | 61 | lintOptions { 62 | disable 'InvalidPackage' 63 | } 64 | 65 | defaultConfig { 66 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 67 | applicationId "com.nicolassiplis.cyberpwned" 68 | minSdkVersion 23 69 | targetSdkVersion 34 70 | compileSdkVersion 34 71 | versionCode flutterVersionCode.toInteger() 72 | versionName flutterVersionName 73 | } 74 | 75 | signingConfigs { 76 | release { 77 | keyAlias keystoreProperties['keyAlias'] 78 | keyPassword keystoreProperties['keyPassword'] 79 | storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null 80 | storePassword keystoreProperties['storePassword'] 81 | } 82 | } 83 | 84 | buildTypes { 85 | release { 86 | signingConfig signingConfigs.release 87 | shrinkResources false 88 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 89 | } 90 | } 91 | } 92 | 93 | flutter { 94 | source '../..' 95 | } 96 | 97 | dependencies { 98 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 99 | } 100 | 101 | apply plugin: 'com.google.gms.google-services' // Google Services plugin -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -keep class io.flutter.plugin.editing.** { *; } -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 8 | 13 | 14 | 21 | 25 | 29 | 34 | 38 | 39 | 40 | 41 | 42 | 43 | 45 | 48 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/nicolassiplis/cyberpwned/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.nicolassiplis.cyberpwned 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.9.23' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.4.2' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | classpath 'com.google.gms:google-services:4.4.1' // Google Services plugin 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | google() 18 | jcenter() 19 | } 20 | } 21 | 22 | rootProject.buildDir = '../build' 23 | subprojects { 24 | project.buildDir = "${rootProject.buildDir}/${project.name}" 25 | } 26 | subprojects { 27 | project.evaluationDependsOn(':app') 28 | } 29 | 30 | tasks.register("clean", Delete) { 31 | delete rootProject.buildDir 32 | } -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | android.enableR8=true 5 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-all.zip 7 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() 4 | 5 | def plugins = new Properties() 6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') 7 | if (pluginsFile.exists()) { 8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } 9 | } 10 | 11 | plugins.each { name, path -> 12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() 13 | include ":$name" 14 | project(":$name").projectDir = pluginDirectory 15 | } 16 | -------------------------------------------------------------------------------- /assets/icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/assets/icon/icon.png -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 97 | ); 98 | path = Runner; 99 | sourceTree = ""; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | 97C146ED1CF9000F007C117D /* Runner */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 107 | buildPhases = ( 108 | 9740EEB61CF901F6004384FC /* Run Script */, 109 | 97C146EA1CF9000F007C117D /* Sources */, 110 | 97C146EB1CF9000F007C117D /* Frameworks */, 111 | 97C146EC1CF9000F007C117D /* Resources */, 112 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = Runner; 120 | productName = Runner; 121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 97C146E61CF9000F007C117D /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastUpgradeCheck = 1020; 131 | ORGANIZATIONNAME = ""; 132 | TargetAttributes = { 133 | 97C146ED1CF9000F007C117D = { 134 | CreatedOnToolsVersion = 7.3.1; 135 | LastSwiftMigration = 1100; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 97C146E51CF9000F007C117D; 148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 97C146ED1CF9000F007C117D /* Runner */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 97C146EC1CF9000F007C117D /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXResourcesBuildPhase section */ 170 | 171 | /* Begin PBXShellScriptBuildPhase section */ 172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 173 | isa = PBXShellScriptBuildPhase; 174 | buildActionMask = 2147483647; 175 | files = ( 176 | ); 177 | inputPaths = ( 178 | ); 179 | name = "Thin Binary"; 180 | outputPaths = ( 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | shellPath = /bin/sh; 184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 185 | }; 186 | 9740EEB61CF901F6004384FC /* Run Script */ = { 187 | isa = PBXShellScriptBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | inputPaths = ( 192 | ); 193 | name = "Run Script"; 194 | outputPaths = ( 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | shellPath = /bin/sh; 198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 199 | }; 200 | /* End PBXShellScriptBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 97C146EA1CF9000F007C117D /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXSourcesBuildPhase section */ 213 | 214 | /* Begin PBXVariantGroup section */ 215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 216 | isa = PBXVariantGroup; 217 | children = ( 218 | 97C146FB1CF9000F007C117D /* Base */, 219 | ); 220 | name = Main.storyboard; 221 | sourceTree = ""; 222 | }; 223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C147001CF9000F007C117D /* Base */, 227 | ); 228 | name = LaunchScreen.storyboard; 229 | sourceTree = ""; 230 | }; 231 | /* End PBXVariantGroup section */ 232 | 233 | /* Begin XCBuildConfiguration section */ 234 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_ANALYZER_NONNULL = YES; 239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 240 | CLANG_CXX_LIBRARY = "libc++"; 241 | CLANG_ENABLE_MODULES = YES; 242 | CLANG_ENABLE_OBJC_ARC = YES; 243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 244 | CLANG_WARN_BOOL_CONVERSION = YES; 245 | CLANG_WARN_COMMA = YES; 246 | CLANG_WARN_CONSTANT_CONVERSION = YES; 247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INFINITE_RECURSION = YES; 252 | CLANG_WARN_INT_CONVERSION = YES; 253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 258 | CLANG_WARN_STRICT_PROTOTYPES = YES; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 263 | COPY_PHASE_STRIP = NO; 264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 265 | ENABLE_NS_ASSERTIONS = NO; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_NO_COMMON_BLOCKS = YES; 269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 271 | GCC_WARN_UNDECLARED_SELECTOR = YES; 272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 273 | GCC_WARN_UNUSED_FUNCTION = YES; 274 | GCC_WARN_UNUSED_VARIABLE = YES; 275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 276 | MTL_ENABLE_DEBUG_INFO = NO; 277 | SDKROOT = iphoneos; 278 | SUPPORTED_PLATFORMS = iphoneos; 279 | TARGETED_DEVICE_FAMILY = "1,2"; 280 | VALIDATE_PRODUCT = YES; 281 | }; 282 | name = Profile; 283 | }; 284 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 285 | isa = XCBuildConfiguration; 286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | CLANG_ENABLE_MODULES = YES; 290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 291 | ENABLE_BITCODE = NO; 292 | FRAMEWORK_SEARCH_PATHS = ( 293 | "$(inherited)", 294 | "$(PROJECT_DIR)/Flutter", 295 | ); 296 | INFOPLIST_FILE = Runner/Info.plist; 297 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 298 | LIBRARY_SEARCH_PATHS = ( 299 | "$(inherited)", 300 | "$(PROJECT_DIR)/Flutter", 301 | ); 302 | PRODUCT_BUNDLE_IDENTIFIER = com.nicolassiplis.cyberpwned; 303 | PRODUCT_NAME = "$(TARGET_NAME)"; 304 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 305 | SWIFT_VERSION = 5.0; 306 | VERSIONING_SYSTEM = "apple-generic"; 307 | }; 308 | name = Profile; 309 | }; 310 | 97C147031CF9000F007C117D /* Debug */ = { 311 | isa = XCBuildConfiguration; 312 | buildSettings = { 313 | ALWAYS_SEARCH_USER_PATHS = NO; 314 | CLANG_ANALYZER_NONNULL = YES; 315 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 316 | CLANG_CXX_LIBRARY = "libc++"; 317 | CLANG_ENABLE_MODULES = YES; 318 | CLANG_ENABLE_OBJC_ARC = YES; 319 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 320 | CLANG_WARN_BOOL_CONVERSION = YES; 321 | CLANG_WARN_COMMA = YES; 322 | CLANG_WARN_CONSTANT_CONVERSION = YES; 323 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 324 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 325 | CLANG_WARN_EMPTY_BODY = YES; 326 | CLANG_WARN_ENUM_CONVERSION = YES; 327 | CLANG_WARN_INFINITE_RECURSION = YES; 328 | CLANG_WARN_INT_CONVERSION = YES; 329 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 330 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 331 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 332 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 333 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 334 | CLANG_WARN_STRICT_PROTOTYPES = YES; 335 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 336 | CLANG_WARN_UNREACHABLE_CODE = YES; 337 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 338 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 339 | COPY_PHASE_STRIP = NO; 340 | DEBUG_INFORMATION_FORMAT = dwarf; 341 | ENABLE_STRICT_OBJC_MSGSEND = YES; 342 | ENABLE_TESTABILITY = YES; 343 | GCC_C_LANGUAGE_STANDARD = gnu99; 344 | GCC_DYNAMIC_NO_PIC = NO; 345 | GCC_NO_COMMON_BLOCKS = YES; 346 | GCC_OPTIMIZATION_LEVEL = 0; 347 | GCC_PREPROCESSOR_DEFINITIONS = ( 348 | "DEBUG=1", 349 | "$(inherited)", 350 | ); 351 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 352 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 353 | GCC_WARN_UNDECLARED_SELECTOR = YES; 354 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 355 | GCC_WARN_UNUSED_FUNCTION = YES; 356 | GCC_WARN_UNUSED_VARIABLE = YES; 357 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 358 | MTL_ENABLE_DEBUG_INFO = YES; 359 | ONLY_ACTIVE_ARCH = YES; 360 | SDKROOT = iphoneos; 361 | TARGETED_DEVICE_FAMILY = "1,2"; 362 | }; 363 | name = Debug; 364 | }; 365 | 97C147041CF9000F007C117D /* Release */ = { 366 | isa = XCBuildConfiguration; 367 | buildSettings = { 368 | ALWAYS_SEARCH_USER_PATHS = NO; 369 | CLANG_ANALYZER_NONNULL = YES; 370 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 371 | CLANG_CXX_LIBRARY = "libc++"; 372 | CLANG_ENABLE_MODULES = YES; 373 | CLANG_ENABLE_OBJC_ARC = YES; 374 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 375 | CLANG_WARN_BOOL_CONVERSION = YES; 376 | CLANG_WARN_COMMA = YES; 377 | CLANG_WARN_CONSTANT_CONVERSION = YES; 378 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 379 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 380 | CLANG_WARN_EMPTY_BODY = YES; 381 | CLANG_WARN_ENUM_CONVERSION = YES; 382 | CLANG_WARN_INFINITE_RECURSION = YES; 383 | CLANG_WARN_INT_CONVERSION = YES; 384 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 385 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 386 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 387 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 388 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 389 | CLANG_WARN_STRICT_PROTOTYPES = YES; 390 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 391 | CLANG_WARN_UNREACHABLE_CODE = YES; 392 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 393 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 394 | COPY_PHASE_STRIP = NO; 395 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 396 | ENABLE_NS_ASSERTIONS = NO; 397 | ENABLE_STRICT_OBJC_MSGSEND = YES; 398 | GCC_C_LANGUAGE_STANDARD = gnu99; 399 | GCC_NO_COMMON_BLOCKS = YES; 400 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 401 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 402 | GCC_WARN_UNDECLARED_SELECTOR = YES; 403 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 404 | GCC_WARN_UNUSED_FUNCTION = YES; 405 | GCC_WARN_UNUSED_VARIABLE = YES; 406 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 407 | MTL_ENABLE_DEBUG_INFO = NO; 408 | SDKROOT = iphoneos; 409 | SUPPORTED_PLATFORMS = iphoneos; 410 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 411 | TARGETED_DEVICE_FAMILY = "1,2"; 412 | VALIDATE_PRODUCT = YES; 413 | }; 414 | name = Release; 415 | }; 416 | 97C147061CF9000F007C117D /* Debug */ = { 417 | isa = XCBuildConfiguration; 418 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 419 | buildSettings = { 420 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 421 | CLANG_ENABLE_MODULES = YES; 422 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 423 | ENABLE_BITCODE = NO; 424 | FRAMEWORK_SEARCH_PATHS = ( 425 | "$(inherited)", 426 | "$(PROJECT_DIR)/Flutter", 427 | ); 428 | INFOPLIST_FILE = Runner/Info.plist; 429 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 430 | LIBRARY_SEARCH_PATHS = ( 431 | "$(inherited)", 432 | "$(PROJECT_DIR)/Flutter", 433 | ); 434 | PRODUCT_BUNDLE_IDENTIFIER = com.nicolassiplis.cyberpwned; 435 | PRODUCT_NAME = "$(TARGET_NAME)"; 436 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 437 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 438 | SWIFT_VERSION = 5.0; 439 | VERSIONING_SYSTEM = "apple-generic"; 440 | }; 441 | name = Debug; 442 | }; 443 | 97C147071CF9000F007C117D /* Release */ = { 444 | isa = XCBuildConfiguration; 445 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 446 | buildSettings = { 447 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 448 | CLANG_ENABLE_MODULES = YES; 449 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 450 | ENABLE_BITCODE = NO; 451 | FRAMEWORK_SEARCH_PATHS = ( 452 | "$(inherited)", 453 | "$(PROJECT_DIR)/Flutter", 454 | ); 455 | INFOPLIST_FILE = Runner/Info.plist; 456 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 457 | LIBRARY_SEARCH_PATHS = ( 458 | "$(inherited)", 459 | "$(PROJECT_DIR)/Flutter", 460 | ); 461 | PRODUCT_BUNDLE_IDENTIFIER = com.nicolassiplis.cyberpwned; 462 | PRODUCT_NAME = "$(TARGET_NAME)"; 463 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 464 | SWIFT_VERSION = 5.0; 465 | VERSIONING_SYSTEM = "apple-generic"; 466 | }; 467 | name = Release; 468 | }; 469 | /* End XCBuildConfiguration section */ 470 | 471 | /* Begin XCConfigurationList section */ 472 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 473 | isa = XCConfigurationList; 474 | buildConfigurations = ( 475 | 97C147031CF9000F007C117D /* Debug */, 476 | 97C147041CF9000F007C117D /* Release */, 477 | 249021D3217E4FDB00AE95B9 /* Profile */, 478 | ); 479 | defaultConfigurationIsVisible = 0; 480 | defaultConfigurationName = Release; 481 | }; 482 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 483 | isa = XCConfigurationList; 484 | buildConfigurations = ( 485 | 97C147061CF9000F007C117D /* Debug */, 486 | 97C147071CF9000F007C117D /* Release */, 487 | 249021D4217E4FDB00AE95B9 /* Profile */, 488 | ); 489 | defaultConfigurationIsVisible = 0; 490 | defaultConfigurationName = Release; 491 | }; 492 | /* End XCConfigurationList section */ 493 | }; 494 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 495 | } -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | cyberpwned 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | NSCameraUsageDescription 31 | UIViewControllerBasedStatusBarAppearance 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/cell.dart: -------------------------------------------------------------------------------- 1 | import 'package:Cyberpwned/path.dart'; 2 | import 'package:Cyberpwned/score.dart'; 3 | import 'package:Cyberpwned/util.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | import 'dart:ui'; 7 | 8 | import 'package:flutter/widgets.dart'; 9 | import 'package:google_fonts/google_fonts.dart'; 10 | 11 | class CellGroup implements Iterable> { 12 | Map state; 13 | 14 | CellGroup(this._group, this.state); 15 | 16 | List> _group = []; 17 | 18 | void clear() { 19 | _group.clear(); 20 | } 21 | 22 | Map> asMap() { 23 | return _group.asMap(); 24 | } 25 | 26 | List map(T Function(List) f) { 27 | return _group.map(f).toList(); 28 | } 29 | 30 | bool any(bool Function(List) f) { 31 | return _group.any(f); 32 | } 33 | 34 | bool remove(List elm) { 35 | return _group.remove(elm); 36 | } 37 | 38 | List removeAt(int idx) { 39 | return _group.removeAt(idx); 40 | } 41 | 42 | void add(List elm) { 43 | _group.add(elm); 44 | } 45 | 46 | void insert(int idx, List elm) { 47 | _group.insert(idx, elm); 48 | } 49 | 50 | void addAll(Iterable> it) { 51 | _group.addAll(it); 52 | } 53 | 54 | bool get isNotEmpty { return _group.isNotEmpty; } 55 | bool get isEmpty { return _group.isEmpty; } 56 | int get length { return _group.length; } 57 | 58 | 59 | @override 60 | String toString() { 61 | return _group.toString(); 62 | } 63 | 64 | String get(int r, int c) { 65 | return _group[r][c]; 66 | } 67 | 68 | List getRow(int r) { 69 | return _group[r]; 70 | } 71 | 72 | void set(int r, int c, String v) { 73 | _group[r][c] = v; 74 | } 75 | 76 | @override 77 | Iterable cast() { 78 | // TODO: implement cast 79 | throw UnimplementedError(); 80 | } 81 | 82 | @override 83 | bool contains(Object element) { 84 | return _group.contains(element); 85 | } 86 | 87 | @override 88 | Iterable elementAt(int index) { 89 | return _group.elementAt(index); 90 | } 91 | 92 | @override 93 | bool every(bool Function(Iterable element) test) { 94 | return _group.every(test); 95 | } 96 | 97 | @override 98 | Iterable expand(Iterable Function(Iterable element) f) { 99 | return _group.expand(f); 100 | } 101 | 102 | @override 103 | Iterable get first => _group.first; 104 | 105 | @override 106 | Iterable firstWhere(bool Function(Iterable element) test, {Iterable Function() orElse}) { 107 | return _group.firstWhere(test, orElse: orElse); 108 | } 109 | 110 | @override 111 | T fold(T initialValue, T Function(T previousValue, Iterable element) combine) { 112 | return _group.fold(initialValue, combine); 113 | } 114 | 115 | @override 116 | Iterable> followedBy(Iterable> other) { 117 | return _group.followedBy(other); 118 | } 119 | 120 | @override 121 | void forEach(void Function(Iterable element) f) { 122 | _group.forEach(f); 123 | } 124 | 125 | @override 126 | // TODO: implement iterator 127 | Iterator> get iterator => _group.iterator; 128 | 129 | @override 130 | String join([String separator = ""]) { 131 | return _group.join(separator); 132 | } 133 | 134 | @override 135 | // TODO: implement last 136 | Iterable get last => _group.last; 137 | 138 | @override 139 | Iterable lastWhere(bool Function(Iterable element) test, {Iterable Function() orElse}) { 140 | return _group.lastWhere(test, orElse: orElse); 141 | } 142 | 143 | @override 144 | Iterable reduce(Iterable Function(Iterable value, Iterable element) combine) { 145 | return _group.reduce((value, element) => combine(value, element)); 146 | } 147 | 148 | @override 149 | // TODO: implement single 150 | Iterable get single => _group.single; 151 | 152 | @override 153 | Iterable singleWhere(bool Function(Iterable element) test, {Iterable Function() orElse}) { 154 | return _group.singleWhere(test, orElse: orElse); 155 | } 156 | 157 | @override 158 | Iterable> skip(int count) { 159 | return _group.skip(count); 160 | } 161 | 162 | @override 163 | Iterable> skipWhile(bool Function(Iterable value) test) { 164 | return _group.skipWhile(test); 165 | } 166 | 167 | @override 168 | Iterable> take(int count) { 169 | return _group.take(count); 170 | } 171 | 172 | @override 173 | Iterable> takeWhile(bool Function(Iterable value) test) { 174 | return _group.takeWhile(test); 175 | } 176 | 177 | @override 178 | List> toList({bool growable = true}) { 179 | return _group.toList(growable: growable); 180 | } 181 | 182 | @override 183 | Set> toSet() { 184 | return _group.toSet(); 185 | } 186 | 187 | @override 188 | Iterable> where(bool Function(Iterable element) test) { 189 | return _group.where(test); 190 | } 191 | 192 | @override 193 | Iterable whereType() { 194 | return _group.whereType(); 195 | } 196 | } 197 | 198 | enum CellType { MATRIX, SEQUENCE, TOGGLE } 199 | 200 | class DisplayCell { 201 | int x; 202 | int y; 203 | int bufferSize; 204 | TraversedPath solution; 205 | bool showIndex = false; 206 | List sequences; 207 | CellGroup matrix; 208 | CellType _cellType; 209 | bool solutionFound; 210 | 211 | DisplayCell.forMatrix(this.x, this.y, this.bufferSize, this.sequences, this.solution, this.matrix, {this.showIndex = true}) { 212 | this._cellType = CellType.MATRIX; 213 | } 214 | 215 | DisplayCell.forSequence(this.x, this.y, this.bufferSize, this.sequences, this.solution, this.matrix, this.solutionFound, {this.showIndex = false}) { 216 | this._cellType = CellType.SEQUENCE; 217 | } 218 | 219 | DisplayCell.forToggle(this.x, this.y, this.bufferSize, this.sequences, this.solution, this.matrix, {this.showIndex = false}) { 220 | this._cellType = CellType.TOGGLE; 221 | } 222 | 223 | String _isPartOfSolution() { 224 | if (bufferSize == null) return null; 225 | if (solution.coords.length > bufferSize) return null; 226 | for (int i = 0; i < solution.coords.length; i++) { 227 | if (solution.coords[i][0] == x && solution.coords[i][1] == y) { 228 | return (i + 1).toString(); 229 | } 230 | } 231 | return null; 232 | } 233 | 234 | Color _colorForCell() { 235 | if (bufferSize == null) return AppColor.getDeactivated(); 236 | if (_cellType == CellType.SEQUENCE) { 237 | if (!(matrix.state[sequences.where((e) => e != "").toList().toString()] == null || matrix.state[sequences.where((e) => e != "").toList().toString()])) { 238 | return AppColor.getDeactivated(); 239 | } 240 | } 241 | if (solution.coords.isEmpty) return AppColor.getInteractable(); 242 | if (solution.coords.length > bufferSize || !solutionFound) return AppColor.getInteractable(); 243 | 244 | if (_cellType == CellType.SEQUENCE) { 245 | if (SequenceScore(sequences.where((element) => element.isNotEmpty && element != "-"), bufferSize).isCompletedBy(solution, matrix)) { 246 | return AppColor.getSuccess(); 247 | } 248 | return AppColor.getFailure(); 249 | } else if (_cellType != CellType.SEQUENCE) { 250 | return (_isPartOfSolution() != null) ? AppColor.getSuccess() : AppColor.getFailure(); 251 | } 252 | return AppColor.getInteractable(); 253 | } 254 | List _items = ['1C', '55', 'FF', '7A', 'BD', 'E9', '-']; 255 | 256 | Widget render({String elm, Color color, onTap, void Function() callback}) { 257 | if (matrix == null) { 258 | return InkWell( 259 | onTap: onTap, 260 | child: AnimatedContainer( 261 | decoration: BoxDecoration(color: color?.withOpacity(0.3) ?? _colorForCell().withOpacity(0.3), 262 | border: _cellType == CellType.MATRIX 263 | ? Border.all(color: color ?? _colorForCell(), width: 2) 264 | : Border.symmetric(horizontal: BorderSide(color: color ?? _colorForCell(), width: 2))), 265 | duration: Duration(milliseconds: 300), 266 | child: Text( 267 | elm ?? (showIndex ? (_isPartOfSolution() ?? matrix.get(x, y)) : (_cellType == CellType.MATRIX ? matrix.get(x, y) : sequences[y])), 268 | textAlign: TextAlign.center, 269 | style: TextStyle( 270 | color: color ?? _colorForCell(), 271 | fontSize: 22, 272 | fontWeight: FontWeight.bold, 273 | fontFamily: GoogleFonts 274 | .rajdhani() 275 | .fontFamily)))); 276 | } 277 | TextStyle style = TextStyle( 278 | color: _colorForCell(), 279 | fontSize: 22, 280 | fontWeight: FontWeight.bold, 281 | fontFamily: GoogleFonts.rajdhani().fontFamily); 282 | var value = y >= sequences.length ? "" : sequences[y]; 283 | value = value == "" ? "-" : value; 284 | return InkWell( 285 | onTap: onTap, 286 | child: AnimatedContainer( 287 | decoration: BoxDecoration(color: color?.withOpacity(0.3) ?? _colorForCell().withOpacity(0.3), border: _cellType == CellType.MATRIX ? Border.all(color: color ?? _colorForCell(), width: 2) : Border.symmetric(horizontal: BorderSide(color: color ?? _colorForCell(), width: 2))), 288 | duration: Duration(milliseconds: 300), 289 | child: DropdownButtonHideUnderline(child: DropdownButton( 290 | value: value, 291 | style: style, 292 | isExpanded: true, 293 | iconSize: 0, 294 | onChanged: (String newValue) { 295 | if (_items.contains(newValue)) { 296 | if (y >= sequences.length) { 297 | this.sequences.add(newValue); 298 | } else { 299 | this.sequences[y] = newValue; 300 | } 301 | } 302 | if (callback != null) callback(); 303 | }, 304 | items: _items.map((String each) { 305 | return DropdownMenuItem( 306 | value: each, 307 | child: Container(alignment: Alignment.center, child: Text(each, style: style, textAlign: TextAlign.center)), 308 | ); 309 | }).toList())))); 310 | } 311 | } 312 | 313 | enum OrderType { MATRIX, SEQUENCE } -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:Cyberpwned/path.dart'; 2 | import 'package:Cyberpwned/sequence.dart'; 3 | import 'package:Cyberpwned/util.dart'; 4 | import 'package:Cyberpwned/cell.dart'; 5 | import 'package:app_review/app_review.dart'; 6 | 7 | import 'dart:async'; 8 | import 'dart:math'; 9 | 10 | import 'package:firebase_ml_vision/firebase_ml_vision.dart'; 11 | import 'package:flutter/foundation.dart'; 12 | import 'package:flutter/material.dart'; 13 | import 'package:flutter/services.dart'; 14 | import 'package:image_picker/image_picker.dart'; 15 | import 'package:google_fonts/google_fonts.dart'; 16 | import 'package:shared_preferences/shared_preferences.dart'; 17 | 18 | import 'dart:io' show File, Platform; 19 | 20 | import 'package:url_launcher/url_launcher.dart'; 21 | 22 | /// If the current platform is desktop, override the default platform to 23 | /// a supported platform (iOS for macOS, Android for Linux and Windows). 24 | /// Otherwise, do nothing. 25 | void _setTargetPlatformForDesktop() { 26 | TargetPlatform targetPlatform; 27 | if (Platform.isMacOS) { 28 | targetPlatform = TargetPlatform.iOS; 29 | } else if (Platform.isLinux || Platform.isWindows) { 30 | targetPlatform = TargetPlatform.android; 31 | } 32 | if (targetPlatform != null) { 33 | debugDefaultTargetPlatformOverride = targetPlatform; 34 | } 35 | } 36 | 37 | Future main() async { 38 | if (!kIsWeb) _setTargetPlatformForDesktop(); 39 | 40 | runApp(MaterialApp( 41 | theme: ThemeData(primarySwatch: Colors.amber, fontFamily: GoogleFonts.rajdhani().fontFamily, textTheme: GoogleFonts.solwayTextTheme()), 42 | home: MyApp(), 43 | debugShowCheckedModeBanner: false)); 44 | } 45 | 46 | class MyApp extends StatefulWidget { 47 | @override 48 | _MyAppState createState() =>_MyAppState(); 49 | } 50 | 51 | class CyberpunkButtonPainter extends CustomPainter { 52 | final Color strokeColor; 53 | final PaintingStyle paintingStyle; 54 | final double strokeWidth; 55 | 56 | CyberpunkButtonPainter({this.strokeColor, this.strokeWidth = 3, this.paintingStyle = PaintingStyle.fill}); 57 | 58 | @override 59 | void paint(Canvas canvas, Size size) { 60 | Paint fillPaint = Paint() 61 | ..color = strokeColor.withOpacity(0.3) 62 | ..strokeWidth = strokeWidth 63 | ..style = PaintingStyle.fill; 64 | 65 | Paint strokePaint = Paint() 66 | ..color = strokeColor.withOpacity(1) 67 | ..strokeWidth = strokeWidth 68 | ..style = PaintingStyle.stroke; 69 | 70 | if (this.paintingStyle == PaintingStyle.fill) canvas.drawPath(getTrianglePath(size.width, size.height), fillPaint); 71 | canvas.drawPath(getTrianglePath(size.width, size.height), strokePaint); 72 | } 73 | 74 | Path getTrianglePath(double x, double y) { 75 | return Path()..lineTo(x, 0)..lineTo(x, y / 30 * 25)..lineTo(x / 30 * 28.5, y)..lineTo(0, y)..lineTo(0, 0); 76 | } 77 | 78 | @override 79 | bool shouldRepaint(CyberpunkButtonPainter oldDelegate) { 80 | return oldDelegate.strokeColor != strokeColor || oldDelegate.paintingStyle != paintingStyle || oldDelegate.strokeWidth != strokeWidth; 81 | } 82 | } 83 | 84 | class _MyAppState extends State { 85 | Map _error = {}; 86 | 87 | CellGroup _matrix; 88 | CellGroup _sequences; 89 | 90 | bool _solutionFound = false; 91 | 92 | String appID = ""; 93 | 94 | bool _firstScan = true; 95 | 96 | @override 97 | void initState() { 98 | _matrix = CellGroup([], _sequencesState); 99 | 100 | _sequences = CellGroup([], _sequencesState); 101 | verifyValidMatrix(); 102 | loadBufferSize(); 103 | super.initState(); 104 | } 105 | 106 | void loadBufferSize() async { 107 | _bufferSize = (await SharedPreferences.getInstance()).getInt("bufferSize"); 108 | if (_bufferSize != null) { 109 | _bufferSizeController = TextEditingController(text: _bufferSize.toString()); 110 | } else { 111 | _bufferSizeController = TextEditingController(); 112 | } 113 | _error["MISSING BUFFER SIZE"] = _bufferSize == null ? "Specify buffer size before calculating path." : ""; 114 | setState(() {}); 115 | } 116 | 117 | final TextRecognizer _textRecognizer = FirebaseVision.instance.textRecognizer(); 118 | 119 | int _bufferSize; 120 | TextEditingController _bufferSizeController; 121 | 122 | final List _validHex = ["1C", "FF", "E9", "BD", "55", "7A"]; 123 | 124 | Future _calculatePath() async { 125 | if (_solutionFound) return; 126 | _solution = TraversedPath([]); 127 | _solutionFound = false; 128 | setState(() {}); 129 | if (Solution.calculationEnabled(_error, _bufferSize, _matrix, _sequences)) { 130 | _computeSolution("CALCULATING OPTIMAL PATH...", "path"); 131 | } 132 | } 133 | 134 | Future _parseGroup(String entity, String processingMsg, CellGroup result, bool square, bool both) async { 135 | try { 136 | var file = await ImagePicker().getImage(source: ImageSource.camera); 137 | if (file == null) { 138 | return; 139 | } 140 | 141 | _processing[entity] = processingMsg; 142 | _error["SCREEN SCAN ERROR"] = ""; 143 | _error["${entity.toUpperCase()} SCAN ERROR"] = ""; 144 | _error["exception"] = ""; 145 | _solution = TraversedPath([]); 146 | _solutionFound = false; 147 | if (!both) result.clear(); 148 | _sequencesState.clear(); 149 | setState(() {}); 150 | 151 | final FirebaseVisionImage visionImage = FirebaseVisionImage.fromFilePath(file.path); 152 | final VisionText visionText = await _textRecognizer.processImage(visionImage); 153 | List captures = []; 154 | visionText.blocks.where((block) => block.text.split(" ").any((possibleHex) => _validHex.contains(possibleHex))).forEach((block) => 155 | block.lines.map((l) => l.elements).forEach((elms) => 156 | elms.forEach((e) { 157 | if (_validHex.contains(e.text.substring(0, min(e.text.length, 2)))) captures.add(SequenceCapture.fromElement(e, square)); 158 | }))); 159 | 160 | await File(file.path).delete(); 161 | 162 | if (both) { 163 | _matrix.clear(); 164 | _sequences.clear(); 165 | _matrix.addAll(SequenceGroup(captures, true, both).get().map((s) => s.sequence)); 166 | _sequences.addAll(SequenceGroup(captures, false, both).get().map((s) => s.sequence)); 167 | _error["MATRIX SCAN ERROR"] = ""; 168 | _error["SEQUENCE SCAN ERROR"] = ""; 169 | } else { 170 | result.clear(); 171 | var x = SequenceGroup(captures, square, both).get().map((s) => s.sequence); 172 | result.addAll(x); 173 | } 174 | 175 | if (_matrix.length == 0 || (_matrix.any((row) => row.length != _matrix.length))) { 176 | var e = Exception("Invalid matrix size: ${_matrix.map((r) => r.length).fold(0, (a, b) => a + b)} elements parsed."); 177 | _matrix.clear(); 178 | throw e; 179 | } 180 | 181 | if (_sequences.length == 0) { 182 | var e = Exception("No sequences parsed."); 183 | _sequences.clear(); 184 | throw e; 185 | } 186 | 187 | if (_bufferSize != null && both) { 188 | _computeSolution("CALCULATING OPTIMAL PATH...", "path"); 189 | } 190 | } on Exception catch(e) { 191 | if (result != null) result.clear(); 192 | _error["${entity.toUpperCase()} SCAN ERROR"] = Solution.parseError(entity); 193 | _error["exception"] = e.toString(); 194 | } 195 | _processing[entity] = null; 196 | _firstScan = false; 197 | verifyValidMatrix(); 198 | } 199 | 200 | void verifyValidMatrix() { 201 | if (_matrix.any((row) => row.any((e) => !_validHex.contains(e)))) { 202 | _error["INCOMPLETE MATRIX"] = "Some matrix elements couldn't be parsed. Any matrix value can be tapped and changed. You can also re-scan the matrix."; 203 | } else { 204 | _error["INCOMPLETE MATRIX"] = ""; 205 | } 206 | setState(() {}); 207 | } 208 | 209 | _launchURL() async { 210 | const url = 'https://www.buymeacoffee.com/nicolas.siplis'; 211 | if (await canLaunch(url)) { 212 | await launch(url, forceWebView: true, enableJavaScript: true); 213 | } else { 214 | throw 'Could not launch $url'; 215 | } 216 | } 217 | 218 | 219 | Map _processing = {}; 220 | 221 | RawMaterialButton _parseButton(String text, String entity, Color strokeColor, Future Function() onPressed, {fontSize: 20.0, padding: 5.0, opacity: 0.95}) { 222 | return RawMaterialButton( 223 | child: CustomPaint( 224 | painter: CyberpunkButtonPainter(strokeColor: strokeColor, paintingStyle: PaintingStyle.stroke), 225 | child: Padding( 226 | padding: EdgeInsets.all(padding), 227 | child: Text(_processing[entity] ?? text, 228 | style: TextStyle( 229 | color: strokeColor, 230 | fontWeight: FontWeight.bold, 231 | fontSize: fontSize, 232 | fontFamily: GoogleFonts.rajdhani().fontFamily)))), 233 | onPressed: onPressed); 234 | } 235 | 236 | TraversedPath _solution = TraversedPath([]); 237 | Map _sequencesState = {}; 238 | 239 | @override 240 | Widget build(BuildContext context) { 241 | return MaterialApp( 242 | home: Scaffold( 243 | appBar: AppBar( 244 | centerTitle: true, 245 | backgroundColor: Colors.black, 246 | title: Text('CYBERPWNED', 247 | style: TextStyle( 248 | color: AppColor.getNeutral(), fontFamily: GoogleFonts.rajdhani().fontFamily, fontWeight: FontWeight.bold, fontSize: 25)), 249 | ), 250 | body: Container( 251 | color: Colors.black, 252 | child: ListView( 253 | children: [ 254 | Padding( 255 | padding: EdgeInsets.symmetric(horizontal: 0), 256 | child: TextField( 257 | textAlignVertical: TextAlignVertical.center, 258 | maxLines: 1, 259 | textAlign: TextAlign.center, 260 | controller: _bufferSizeController, 261 | style: TextStyle( 262 | color: AppColor.getNeutral(), fontSize: 20, fontWeight: FontWeight.bold, fontFamily: GoogleFonts.rajdhani().fontFamily), 263 | decoration: new InputDecoration( 264 | filled: true, 265 | hoverColor: (_bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral()).withOpacity(0.3), 266 | focusColor: (_bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral()).withOpacity(0.3), 267 | fillColor: (_bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral()).withOpacity(0.3), 268 | enabledBorder: OutlineInputBorder( 269 | borderSide: BorderSide(color: _bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral(), width: 2), 270 | ), 271 | focusedBorder: OutlineInputBorder( 272 | borderSide: BorderSide(color: _bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral(), width: 2)), 273 | labelText: "BUFFER SIZE", 274 | labelStyle: TextStyle( 275 | fontSize: 20, 276 | height: 1.75, 277 | fontWeight: FontWeight.bold, 278 | color: _bufferSize == null ? AppColor.getInteractable() : AppColor.getNeutral(), 279 | fontFamily: GoogleFonts.rajdhani().fontFamily, 280 | )), 281 | keyboardType: TextInputType.number, 282 | cursorColor: Colors.white, 283 | inputFormatters: [FilteringTextInputFormatter.digitsOnly], 284 | onSubmitted: (buffer) async { 285 | int newBuffer = int.tryParse(buffer, radix: 10); 286 | _error["MISSING BUFFER SIZE"] = newBuffer != null ? "" : "Specify buffer size before calculating path."; 287 | if (newBuffer != _bufferSize) { 288 | _solutionFound = false; 289 | _bufferSize = newBuffer; 290 | (await SharedPreferences.getInstance()).setInt("bufferSize", newBuffer); 291 | _solution = TraversedPath([]); 292 | } 293 | setState(() {}); 294 | })), 295 | SizedBox(height: 8), 296 | Padding( 297 | padding: EdgeInsets.all(0), 298 | child: _parseButton(_processing["Screen"] ?? 'SCAN BREACH SCREEN', "Sequences", _matrix.isEmpty ? AppColor.getInteractable() : AppColor.getNeutral(), 299 | () => _parseGroup("Screen", "SCANNING SCREEN...", null, false, true), fontSize: 25.0, padding: 10.0, opacity: 1.0)), 300 | SizedBox(height: 8), 301 | Padding( 302 | padding: EdgeInsets.all(0), 303 | child: (_matrix.isNotEmpty || !_firstScan) ? AnimatedContainer( 304 | duration: Duration(milliseconds: 10000), 305 | child: _parseButton('RE-SCAN CODE MATRIX', "Matrix", _matrix.any((r) => r.contains("?")) ? AppColor.getInteractable() : AppColor.getNeutral(), 306 | () => _parseGroup("Matrix", "SCANNING CODE MATRIX...", _matrix, true, false))) : Container()), 307 | Padding( 308 | padding: EdgeInsets.all(0), 309 | child: Table( 310 | children: _matrix 311 | .asMap() // Need to know row's index 312 | .entries 313 | .map((row) => TableRow( 314 | children: row.value 315 | .asMap() // Need to know column's index 316 | .entries 317 | .map((column) => Padding( 318 | padding: EdgeInsets.all(2), 319 | child: Padding( 320 | padding: EdgeInsets.all(0), 321 | // Color cell depending on whether the coordinate is part of the optimal path 322 | // If the coordinate is part of the optimal path, show when it should be visited instead of displaying its value 323 | child: matrixCell(row.key, column.key, _bufferSize, _solution, _matrix.get(row.key, column.key))))) 324 | .toList())) 325 | .toList())), 326 | Padding( 327 | padding: EdgeInsets.all(0), 328 | child: (_sequences.isNotEmpty || !_firstScan) ? _parseButton('RE-SCAN SEQUENCES', "Sequences", AppColor.getInteractable(), 329 | () => _parseGroup("Sequence", "SCANNING SEQUENCES...", _sequences, false, false)) : Container()), 330 | Padding( 331 | padding: EdgeInsets.all(0), 332 | child: Table( 333 | children: _sequences 334 | .map((seq) => 335 | // Make all rows the same length to prevent rendering error. TODO: Find a layout which removes the need for doing this 336 | seq + List.filled(max(5, _sequences.map((r) => r.length).fold(0, max)) - seq.length, "")) 337 | .toList() 338 | .asMap() 339 | .entries 340 | .map((sequence) => TableRow( 341 | children: ([MapEntry(-1, "")] + (sequence.value.asMap().entries.toList())) 342 | .map((elm) => elm.key >= 0 343 | ? Padding( 344 | padding: EdgeInsets.symmetric(vertical: 2), 345 | child: DisplayCell.forSequence(sequence.key, elm.key, _bufferSize, _sequences.getRow(sequence.key), _solution, _matrix, _solutionFound) 346 | .render(callback: () { 347 | _solutionFound = false; 348 | setState((){}); 349 | })) 350 | : Padding( 351 | padding: EdgeInsets.symmetric(vertical: 2), 352 | child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [Container(height: 52.0, width: 52.0, child: DisplayCell.forToggle(null, null, _bufferSize, null, _solution, null).render( 353 | elm: _sequencesState[sequence.value.where((e) => e != "").toList().toString()] ?? true ? "✓" : "✗", 354 | color: _sequencesState[sequence.value.where((e) => e != "").toList().toString()] ?? true 355 | ? AppColor.getInteractable() 356 | : AppColor.getDeactivated(), 357 | onTap: () async { 358 | _solutionFound = false; 359 | var key = sequence.value.where((e) => e != "" && e != "-").toList().toString(); 360 | var enabled = _sequencesState[key]; 361 | _sequencesState[key] = !(enabled == null || enabled); 362 | setState(() {}); 363 | }))]))) 364 | .toList())) 365 | .toList())), 366 | Padding( 367 | padding: EdgeInsets.all(0), 368 | child: Row( 369 | crossAxisAlignment: CrossAxisAlignment.center, 370 | mainAxisAlignment: MainAxisAlignment.center, 371 | children: [ 372 | Expanded(flex: 10, child: _parseButton( 373 | _processing["path"] ?? 374 | (_error.keys.where((key) => _error[key] != "").map((key) => key + " ↓").toList() + ["CALCULATE PATH"])[0], 375 | "Path", 376 | _processing["path"] != null 377 | ? AppColor.getInteractable() 378 | : _error.keys.where((k) => _error[k] != "").length > 0 379 | ? AppColor.getFailure() 380 | : _solutionFound 381 | ? AppColor.getSuccess() 382 | : AppColor.getNeutral(), 383 | () => _calculatePath(), fontSize: 25.0)) 384 | ])), 385 | Padding( 386 | padding: EdgeInsets.all(0), 387 | child: Text(Solution.allErrors(_error), 388 | style: TextStyle( 389 | color: AppColor.getFailure(), fontSize: Solution.allErrors(_error).isEmpty ? 0 : 20, fontWeight: FontWeight.bold, fontFamily: GoogleFonts.rajdhani().fontFamily), 390 | textAlign: TextAlign.justify)), 391 | _parseButton( 392 | "☕", 393 | "Donate", 394 | Colors.transparent, 395 | () => _launchURL()) 396 | ], 397 | ), 398 | )), 399 | ); 400 | } 401 | 402 | int _reviewCounter = 0; 403 | 404 | void _computeSolution(String processingMsg, String processingKey) { 405 | _processing[processingKey] = processingMsg; 406 | setState(() {}); 407 | compute(Solution.calculateSolution, { 408 | "bufferSize": _bufferSize, 409 | "matrix": _matrix, 410 | "sequences": CellGroup( 411 | _sequences.map((row) => row.where((element) => element != "" && element != "-").toList()).where((element) => _sequencesState[element.toString()] == null || _sequencesState[element.toString()]).toList(), _sequencesState) 412 | }).then((solution) { 413 | _solution = solution; 414 | _solutionFound = true; 415 | _processing[processingKey] = null; 416 | _reviewCounter++; 417 | setState(() {}); 418 | if (_reviewCounter % 2 == 0) { 419 | AppReview.requestReview.then((onValue) => setState(() {})); 420 | } 421 | }, onError: (error) { 422 | _error["CALCULATION ERROR"] = error.toString(); 423 | }); 424 | } 425 | 426 | Color _colorForCell(int bufferSize, TraversedPath solution, int x, int y, String dropdownValue) { 427 | if (dropdownValue == "?") return AppColor.getInteractable(); 428 | if (bufferSize == null) return AppColor.getDeactivated(); 429 | return (_isPartOfSolution(bufferSize, solution, x, y, dropdownValue) != null) ? AppColor.getSuccess() : (_solutionFound ? AppColor.getFailure() : AppColor.getNeutral()); 430 | } 431 | 432 | String _isPartOfSolution(int bufferSize, TraversedPath solution, int x, int y, String dropdownValue) { 433 | if (!_solutionFound) return null; 434 | if (bufferSize == null) return null; 435 | if (solution.coords.length > bufferSize) return null; 436 | for (int i = 0; i < solution.coords.length; i++) { 437 | if (solution.coords[i][0] == x && solution.coords[i][1] == y) { 438 | return (i + 1).toString(); 439 | } 440 | } 441 | return null; 442 | } 443 | 444 | List _items = ['1C', '55', 'FF', '7A', 'BD', 'E9', '?']; 445 | Widget matrixCell(int x, int y, int bufferSize, TraversedPath solution, String dropdownValue) { 446 | TextStyle style = TextStyle( 447 | color: _colorForCell(bufferSize, solution, x, y, dropdownValue), 448 | fontSize: 22, 449 | fontWeight: FontWeight.bold, 450 | fontFamily: GoogleFonts.rajdhani().fontFamily); 451 | String isPart = _isPartOfSolution(bufferSize, solution, x, y, dropdownValue); 452 | return AnimatedContainer(duration: Duration(milliseconds: 1000), child: SizedBox(height: 27, child: DecoratedBox( 453 | decoration: BoxDecoration(color: _colorForCell(bufferSize, solution, x, y, dropdownValue).withOpacity(0), border: Border.all(color: _colorForCell(bufferSize, solution, x, y, dropdownValue), width: 1)), 454 | child: DropdownButtonHideUnderline(child: DropdownButton( 455 | value: _isPartOfSolution(bufferSize, solution, x, y, dropdownValue) ?? dropdownValue, 456 | style: style, 457 | isExpanded: true, 458 | iconSize: 0, 459 | onChanged: (String newValue) { 460 | dropdownValue = newValue; 461 | if (_items.contains(newValue)) { 462 | _matrix.set(x, y, newValue); 463 | } 464 | verifyValidMatrix(); 465 | }, 466 | items: (isPart != null ? [isPart] : _items).map((String value) { 467 | return DropdownMenuItem( 468 | value: value, 469 | child: Container(alignment: Alignment.center, child: Text("${isPart != null ? _matrix.get(x, y) : value}${isPart == null ? '' : '/$isPart'}", style: style, textAlign: TextAlign.center)), 470 | ); 471 | }).toList(), 472 | )) 473 | ))); 474 | } 475 | 476 | } 477 | -------------------------------------------------------------------------------- /lib/path.dart: -------------------------------------------------------------------------------- 1 | import 'package:Cyberpwned/score.dart'; 2 | import 'package:Cyberpwned/cell.dart'; 3 | 4 | class DuplicateCoordinateException implements Exception {} 5 | 6 | class TraversedPath { 7 | final List> coords; 8 | 9 | TraversedPath(this.coords); 10 | 11 | TraversedPath operator +(TraversedPath other) { 12 | List> newCoords = coords + other.coords; 13 | for (List otherCoord in other.coords) { 14 | for (List coord in coords) { 15 | if (coord[0] == otherCoord[0] && coord[1] == otherCoord[1]) { 16 | throw DuplicateCoordinateException(); 17 | } 18 | } 19 | } 20 | return TraversedPath(newCoords); 21 | } 22 | 23 | @override 24 | String toString() { 25 | return coords.toString(); 26 | } 27 | } 28 | 29 | class PathGenerator { 30 | int bufferSize; 31 | CellGroup matrix; 32 | CellGroup sequences; 33 | 34 | PathGenerator(this.matrix, this.sequences, this.bufferSize); 35 | 36 | List completedPaths = []; 37 | 38 | List> _candidateCoords(int turn, List coordinate) { 39 | List> coords = (turn % 2 == 0 40 | ? matrix.asMap().entries.map((column) => [coordinate[0], column.key]) 41 | : matrix.asMap().entries.map((row) => [row.key, coordinate[1]])) 42 | .toList(); 43 | return coords; 44 | } 45 | 46 | void _walkPaths(List partialPathsStack, int turn, List> candidates, {List ls}) { 47 | TraversedPath path = partialPathsStack.removeAt(partialPathsStack.length - 1); 48 | candidates = candidates.where((candidate) => !path.coords.any((coord) => coord[0] == candidate[0] && coord[1] == candidate[1])).toList(); 49 | for (List coord in candidates) { 50 | TraversedPath newPath; 51 | newPath = path + TraversedPath([coord]); 52 | 53 | PathScore score = PathScore(matrix, newPath, sequences, bufferSize); 54 | if (score.compute() == score.maxScore()) { 55 | completedPaths = [newPath]; 56 | throw PathCompletedException(); 57 | } 58 | 59 | if (score.compute() == score.minScore()) { 60 | ls.add(newPath); 61 | continue; 62 | } 63 | 64 | if (newPath.coords.length == bufferSize) { 65 | completedPaths.add(newPath); 66 | } else { 67 | partialPathsStack.add(newPath); 68 | _walkPaths(partialPathsStack, turn + 1, _candidateCoords(turn + 1, coord), ls: ls); 69 | } 70 | } 71 | } 72 | 73 | List generate() { 74 | completedPaths.clear(); 75 | if (bufferSize == 0) { 76 | return [TraversedPath([])]; 77 | } 78 | List ls = []; 79 | if (completedPaths.length == 0) { 80 | try { 81 | _walkPaths([TraversedPath([])], 0, _candidateCoords(0, [0, 0]), ls: ls); 82 | } on PathCompletedException { 83 | return completedPaths; 84 | } 85 | } 86 | return completedPaths; 87 | } 88 | } 89 | 90 | class PathCompletedException implements Exception{} -------------------------------------------------------------------------------- /lib/score.dart: -------------------------------------------------------------------------------- 1 | import 'package:Cyberpwned/cell.dart'; 2 | import 'package:Cyberpwned/path.dart'; 3 | 4 | import 'dart:math'; 5 | 6 | class SequenceScore { 7 | List sequence; 8 | int bufferSize; 9 | int rewardLevel; 10 | int progress = 0; 11 | int maxProgress; 12 | int score = 0; 13 | 14 | SequenceScore(Iterable sequence, this.bufferSize, {int progress: 0, int rewardLevel: 0}) { 15 | this.sequence = sequence.toList(); 16 | this.rewardLevel = rewardLevel; 17 | this.progress = progress; 18 | this.score = 0; 19 | this.maxProgress = this.sequence.length; 20 | } 21 | 22 | int compute(String compare) { 23 | if (_completed() || compare == null) { 24 | if (progress == maxProgress) { 25 | score = maxScore(); 26 | } else if (bufferSize < maxProgress - progress) { 27 | score = minScore(); 28 | } 29 | return score; 30 | } 31 | 32 | if (progress > 0 && sequence[progress] != compare && sequence[progress - 1] == compare) { 33 | bufferSize--; 34 | if (bufferSize < maxProgress - progress) { 35 | score = minScore(); 36 | } 37 | return score; 38 | } 39 | 40 | int oldProgress = progress; 41 | progress += sequence[progress] == compare ? _increase() : _decrease(compare); 42 | score += (progress - oldProgress) * pow(10, rewardLevel); 43 | bufferSize--; 44 | return score; 45 | } 46 | 47 | bool isCompletedBy(TraversedPath path, CellGroup matrix) { 48 | if (path.coords.isEmpty) return null; 49 | path.coords.forEach((coord) => compute(matrix.get(coord[0], coord[1]))); 50 | return compute(null) == maxScore(); 51 | } 52 | 53 | int maxScore() { 54 | // Can be adjusted to maximize either: 55 | // a) highest quality rewards, possibly lesser quantity 56 | return pow(10, rewardLevel + 1); 57 | // b) highest amount of rewards, possibly lesser quality 58 | // this.score = 100 * (this.rewardLevel + 1); 59 | } 60 | 61 | int minScore() { 62 | return -((rewardLevel+1) * (rewardLevel + 2) ~/ 2); 63 | } 64 | 65 | // When the head of the sequence matches the targeted node, increase the score by 1 66 | // If the sequence has been completed, set the score depending on the reward level 67 | int _increase() { 68 | if (_completed()) return 0; 69 | return 1; 70 | } 71 | 72 | // When an incorrect value is matched against the current head of the sequence, the score is decreased by 1 (can't go below 0) 73 | // If it's not possible to complete the sequence, set the score to a negative value depending on the reward 74 | int _decrease(String compare) { 75 | if (_completed()) return 0; 76 | if (progress == 0) return 0; 77 | int i = progress; 78 | while (i != 0 && sequence[--i] != compare) {} 79 | if (sequence[i] == compare) { 80 | return -progress + i + 1; 81 | } else { 82 | return -progress; 83 | } 84 | } 85 | 86 | // A sequence is considered completed if no further progress is possible or necessary 87 | bool _completed() { 88 | return progress == maxProgress || bufferSize == null || bufferSize < maxProgress - progress; 89 | } 90 | } 91 | 92 | class PathScore { 93 | int score; 94 | TraversedPath path; 95 | int bufferSize; 96 | List sequenceScores = List(); 97 | CellGroup matrix; 98 | static Map previousScores = {}; 99 | 100 | PathScore(this.matrix, this.path, CellGroup sequences, this.bufferSize) { 101 | sequences.asMap().forEach((rewardLevel, sequence) => sequenceScores.add(SequenceScore(sequence, bufferSize, rewardLevel: rewardLevel))); 102 | } 103 | 104 | int compute() { 105 | if (score != null) { 106 | return score; 107 | } 108 | path.coords.forEach((coord) { 109 | int row = coord[0]; 110 | int column = coord[1]; 111 | sequenceScores.forEach((seqScore) => seqScore.compute(matrix.get(row, column))); 112 | }); 113 | score = sequenceScores.map((seq) => seq.compute(null)).fold(0, (a, b) => a + b); 114 | return score; 115 | } 116 | 117 | int maxScore() { 118 | return sequenceScores.map((score) => score.maxScore()).fold(0, (a, b) => a + b); 119 | } 120 | 121 | int minScore() { 122 | return sequenceScores.map((score) => score.minScore()).fold(0, (a, b) => a + b); 123 | } 124 | } -------------------------------------------------------------------------------- /lib/sequence.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | 3 | class IncompleteSequenceException implements Exception {} 4 | 5 | class SequenceGroup { 6 | List _group = []; 7 | 8 | final bool square; 9 | final bool both; 10 | bool ordered = false; 11 | 12 | SequenceGroup(this._group, this.square, this.both); 13 | 14 | void _complete(List partial, int size) { 15 | if (!square) return; 16 | if (partial.map((s) => s.sequence.length).fold(0, (a, b) => a + b) == size) return; 17 | if (partial.length < 2) return; 18 | partial.sort((a, b) => a.left.compareTo(b.left)); 19 | partial.add(SequenceCapture(partial.last.right + 1, partial.last.right + 1 + partial.last.length(), partial.last.bottom, partial.last.top, ["?"], square)); 20 | if (partial.length == size) return; 21 | partial.insert(0, SequenceCapture(partial.first.left - partial.first.length(), partial.first.left - 1, partial.first.bottom, partial.first.top, ["?"], square)); 22 | _complete(partial, size); 23 | } 24 | 25 | void _divide(square) { 26 | _group.sort((a, b) => -(a.right.compareTo(b.right))); 27 | int idx; 28 | double maxDiff = 0; 29 | for (int i = 1; i < _group.length; i++) { 30 | double diff = (_group[i].right - _group[i - 1].right).abs(); 31 | if (diff > maxDiff) { 32 | idx = i; 33 | maxDiff = diff; 34 | } 35 | } 36 | _group = square ? _group.sublist(idx) : _group.sublist(0, idx); 37 | } 38 | 39 | void _order() { 40 | if (_group.length == 0) throw Exception("No elements were parsed, please try again."); 41 | 42 | _deduplicate(square); 43 | 44 | if (both) _divide(square); 45 | 46 | int size = sqrt(_group.map((s) => s.sequence.length).fold(0, (a, b) => a + b)).round(); 47 | 48 | if (square) sortGroup(size); else _group.sort((a, b) => a.top.compareTo(b.top)); 49 | 50 | List result = []; 51 | List partial = []; 52 | for (int i = 0; i < _group.length; i++) { 53 | SequenceCapture current = _group[i]; 54 | partial.sort((a, b) => a.left.compareTo(b.left)); 55 | if (square && partial.map((s) => s.sequence.length).fold(0, (a, b) => a + b) == size) { 56 | result.add(partial.reduce((a, b) => a + b)); 57 | partial.clear(); 58 | } else if (partial.isNotEmpty && partial.map((p) => p.bottom).reduce(max) < current.top) { 59 | _complete(partial, size); 60 | result.add(partial.reduce((a, b) => a + b)); 61 | partial.clear(); 62 | } 63 | partial.add(current); 64 | } 65 | if (partial.isNotEmpty) { 66 | _complete(partial, size); 67 | result.insert(0, partial.reduce((a, b) => a + b)); 68 | } 69 | _group.clear(); 70 | _group.addAll(result); 71 | ordered = true; 72 | } 73 | 74 | sortGroup(int size) { 75 | var keypoints = _group; 76 | List points = []; 77 | int hold = 0; 78 | List rowPoints = []; 79 | while (keypoints.length > 0) { 80 | keypoints.sort((p, q) => (p.left + p.top).compareTo(q.left + q.top)); 81 | var a = Vector([keypoints[0].left, keypoints[0].top, 0]); 82 | keypoints.sort((p, q) => (p.left/p.top).compareTo(q.left/q.top)); 83 | var b = Vector([keypoints.last.left, keypoints.last.top, 0]); 84 | List remainingPoints = []; 85 | 86 | keypoints.sort((a, b) => a.top.compareTo(b.top)); 87 | for (SequenceCapture k in keypoints) { 88 | var p = Vector([k.left, k.top, 0]); 89 | var d = sqrt((k.right - k.left) * (k.bottom - k.top)); 90 | var dist = ((p - a).cross(b - a)).euclideanNorm() / b.euclideanNorm(); 91 | if (d / 2 + hold > dist) { 92 | rowPoints.add(k); 93 | rowPoints.sort((a, b) => a.left.compareTo(b.left)); 94 | } else { 95 | remainingPoints.add(k); 96 | } 97 | } 98 | if ((square && rowPoints.length != size) || (!square && rowPoints.length == 0)) { 99 | hold += 25; 100 | } else { 101 | points.addAll(rowPoints); 102 | rowPoints.clear(); 103 | } 104 | 105 | keypoints = remainingPoints; 106 | } 107 | if (rowPoints.isNotEmpty) { 108 | points.addAll(rowPoints); 109 | } 110 | _group.clear(); 111 | _group.addAll(points); 112 | } 113 | 114 | void _deduplicate(bool square) { 115 | List result = []; 116 | for (SequenceCapture a in _group) { 117 | var found = false; 118 | for (SequenceCapture b in result) { 119 | if ((a.right - b.right).abs() + (a.top - b.top).abs() < (square ? 125 : 50) || 120 | (a.bottom - b.bottom).abs() + (a.left - b.left).abs() < (square ? 125 : 50) || 121 | (a.right - b.right).abs() + (a.bottom - b.bottom).abs() < (square ? 125 : 50) || 122 | (a.left - b.left).abs() + (a.top - b.top).abs() < (square ? 125 : 50)) { 123 | found = true; 124 | break; 125 | } 126 | } 127 | if (!found) result.add(a); 128 | } 129 | _group.clear(); 130 | _group.addAll(result); 131 | } 132 | 133 | List get() { 134 | if (!ordered) _order(); 135 | _group.sort((a, b) => a.top.compareTo(b.top)); // Sort result from top to bottom 136 | return _group; 137 | } 138 | } 139 | 140 | class SequenceCapture { 141 | double _left; 142 | double _right; 143 | double _top; 144 | double _bottom; 145 | List sequence; 146 | bool square; 147 | 148 | double get left => _left; 149 | 150 | double get right => _right; 151 | 152 | double get top => _top; 153 | 154 | double get bottom => _bottom; 155 | 156 | SequenceCapture(this._left, this._right, this._bottom, this._top, this.sequence, this.square); 157 | 158 | final List _validHex = ["1C", "FF", "E9", "BD", "55", "7A"]; 159 | 160 | SequenceCapture.fromElement(TextElement block, this.square) { 161 | _left = block.boundingBox.left; 162 | _right = block.boundingBox.right; 163 | _top = block.boundingBox.top; 164 | _bottom = block.boundingBox.bottom; 165 | sequence = block.text 166 | .split(" ") 167 | .map((e) => e.length == 4 ? e.substring(0, 2) + " " + e.substring(2, 4) : e.substring(0, min(e.length, 2))) 168 | .join(" ") 169 | .split(" ") 170 | .where((e) => _validHex.contains(e)) 171 | .toList(); 172 | } 173 | 174 | double height() { 175 | return bottom - top; 176 | } 177 | 178 | double length() { 179 | return (right - left) / sequence.length; 180 | } 181 | 182 | SequenceCapture operator +(SequenceCapture other) { 183 | return SequenceCapture( 184 | min(left, other.left), 185 | max(right, other.right), 186 | max(bottom, other.bottom), 187 | min(top, other.top), 188 | left < other.left 189 | ? sequence + other.sequence 190 | : left > other.left 191 | ? other.sequence + sequence 192 | : right > other.right 193 | ? other.sequence + sequence 194 | : sequence + other.sequence, 195 | square); 196 | } 197 | } 198 | -------------------------------------------------------------------------------- /lib/util.dart: -------------------------------------------------------------------------------- 1 | import 'package:Cyberpwned/score.dart'; 2 | import 'package:Cyberpwned/path.dart'; 3 | import 'package:Cyberpwned/cell.dart'; 4 | 5 | import 'dart:ui'; 6 | 7 | import 'package:flutter/material.dart'; 8 | 9 | 10 | class AppColor { 11 | 12 | static Color getDeactivated() { 13 | return Colors.grey; 14 | } 15 | 16 | static Color getInteractable() { 17 | return Colors.blueAccent; 18 | } 19 | 20 | static Color getNeutral() { 21 | return Colors.orange; 22 | } 23 | 24 | static Color getSuccess() { 25 | return Colors.teal; 26 | } 27 | 28 | static Color getFailure() { 29 | return Colors.red; 30 | } 31 | } 32 | 33 | class Solution { 34 | static bool calculationEnabled(Map error, int bufferSize, CellGroup matrix, CellGroup sequences) { 35 | return allErrors(error).isEmpty && bufferSize != null && matrix.isNotEmpty && sequences.isNotEmpty; 36 | } 37 | 38 | static String allErrors(Map _error) { 39 | String result = ""; 40 | for (String key in _error.keys) { 41 | if (_error[key] != "") { 42 | result += "\n" + _error[key]; 43 | } 44 | } 45 | return result.trim(); 46 | } 47 | 48 | static TraversedPath calculateSolution(map) { 49 | CellGroup matrix = map["matrix"]; 50 | CellGroup sequences = map["sequences"]; 51 | int bufferSize = map["bufferSize"]; 52 | List allPaths = PathGenerator(matrix, sequences, bufferSize).generate(); 53 | int maxScore = 0; 54 | TraversedPath maxPath = TraversedPath([]); 55 | for (TraversedPath path in allPaths) { 56 | int newScore = PathScore(matrix, path, sequences, bufferSize).compute(); 57 | if (newScore > maxScore) { 58 | maxScore = newScore; 59 | maxPath = path; 60 | } 61 | } 62 | return maxPath; 63 | } 64 | 65 | static String parseError(String s) { 66 | return "$s parsing failed, try to take another picture."; 67 | } 68 | } -------------------------------------------------------------------------------- /media/screenshot/error.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/media/screenshot/error.jpg -------------------------------------------------------------------------------- /media/screenshot/solved.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chiplis/cyberpwned/6b1369bec630a949ea0aea33559487e6cb835a4a/media/screenshot/solved.jpg -------------------------------------------------------------------------------- /pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | app_review: 5 | dependency: "direct main" 6 | description: 7 | name: app_review 8 | sha256: "936f286cd0bee4a1c49eaedeb30bef2252877868ac345506fbe2d67aa3e95c0b" 9 | url: "https://pub.dev" 10 | source: hosted 11 | version: "2.1.2+1" 12 | archive: 13 | dependency: transitive 14 | description: 15 | name: archive 16 | sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" 17 | url: "https://pub.dev" 18 | source: hosted 19 | version: "3.4.10" 20 | args: 21 | dependency: transitive 22 | description: 23 | name: args 24 | sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 25 | url: "https://pub.dev" 26 | source: hosted 27 | version: "2.4.2" 28 | async: 29 | dependency: transitive 30 | description: 31 | name: async 32 | sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" 33 | url: "https://pub.dev" 34 | source: hosted 35 | version: "2.11.0" 36 | boolean_selector: 37 | dependency: transitive 38 | description: 39 | name: boolean_selector 40 | sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" 41 | url: "https://pub.dev" 42 | source: hosted 43 | version: "2.1.1" 44 | characters: 45 | dependency: transitive 46 | description: 47 | name: characters 48 | sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" 49 | url: "https://pub.dev" 50 | source: hosted 51 | version: "1.3.0" 52 | checked_yaml: 53 | dependency: transitive 54 | description: 55 | name: checked_yaml 56 | sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff 57 | url: "https://pub.dev" 58 | source: hosted 59 | version: "2.0.3" 60 | cli_util: 61 | dependency: transitive 62 | description: 63 | name: cli_util 64 | sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 65 | url: "https://pub.dev" 66 | source: hosted 67 | version: "0.4.1" 68 | clock: 69 | dependency: transitive 70 | description: 71 | name: clock 72 | sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf 73 | url: "https://pub.dev" 74 | source: hosted 75 | version: "1.1.1" 76 | collection: 77 | dependency: transitive 78 | description: 79 | name: collection 80 | sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a 81 | url: "https://pub.dev" 82 | source: hosted 83 | version: "1.18.0" 84 | convert: 85 | dependency: transitive 86 | description: 87 | name: convert 88 | sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" 89 | url: "https://pub.dev" 90 | source: hosted 91 | version: "3.1.1" 92 | cross_file: 93 | dependency: transitive 94 | description: 95 | name: cross_file 96 | sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" 97 | url: "https://pub.dev" 98 | source: hosted 99 | version: "0.3.4+1" 100 | crypto: 101 | dependency: transitive 102 | description: 103 | name: crypto 104 | sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab 105 | url: "https://pub.dev" 106 | source: hosted 107 | version: "3.0.3" 108 | cupertino_icons: 109 | dependency: "direct main" 110 | description: 111 | name: cupertino_icons 112 | sha256: caac504f942f41dfadcf45229ce8c47065b93919a12739f20d6173a883c5ec73 113 | url: "https://pub.dev" 114 | source: hosted 115 | version: "1.0.2" 116 | fake_async: 117 | dependency: transitive 118 | description: 119 | name: fake_async 120 | sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" 121 | url: "https://pub.dev" 122 | source: hosted 123 | version: "1.3.1" 124 | ffi: 125 | dependency: transitive 126 | description: 127 | name: ffi 128 | sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" 129 | url: "https://pub.dev" 130 | source: hosted 131 | version: "2.1.2" 132 | file: 133 | dependency: transitive 134 | description: 135 | name: file 136 | sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" 137 | url: "https://pub.dev" 138 | source: hosted 139 | version: "7.0.0" 140 | file_selector_linux: 141 | dependency: transitive 142 | description: 143 | name: file_selector_linux 144 | sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" 145 | url: "https://pub.dev" 146 | source: hosted 147 | version: "0.9.2+1" 148 | file_selector_macos: 149 | dependency: transitive 150 | description: 151 | name: file_selector_macos 152 | sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 153 | url: "https://pub.dev" 154 | source: hosted 155 | version: "0.9.3+3" 156 | file_selector_platform_interface: 157 | dependency: transitive 158 | description: 159 | name: file_selector_platform_interface 160 | sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b 161 | url: "https://pub.dev" 162 | source: hosted 163 | version: "2.6.2" 164 | file_selector_windows: 165 | dependency: transitive 166 | description: 167 | name: file_selector_windows 168 | sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 169 | url: "https://pub.dev" 170 | source: hosted 171 | version: "0.9.3+1" 172 | firebase_core: 173 | dependency: "direct main" 174 | description: 175 | name: firebase_core 176 | sha256: "4b45655ec1b21a1783681f72f840a2e74d298046c2b7c286ab0e4f0efbf93d0a" 177 | url: "https://pub.dev" 178 | source: hosted 179 | version: "2.28.0" 180 | firebase_core_platform_interface: 181 | dependency: transitive 182 | description: 183 | name: firebase_core_platform_interface 184 | sha256: c437ae5d17e6b5cc7981cf6fd458a5db4d12979905f9aafd1fea930428a9fe63 185 | url: "https://pub.dev" 186 | source: hosted 187 | version: "5.0.0" 188 | firebase_core_web: 189 | dependency: transitive 190 | description: 191 | name: firebase_core_web 192 | sha256: "28e30e00748497b9a70db2025942a42c5d752534eb678e9b9b98db056cf404ba" 193 | url: "https://pub.dev" 194 | source: hosted 195 | version: "2.14.0" 196 | flutter: 197 | dependency: "direct main" 198 | description: flutter 199 | source: sdk 200 | version: "0.0.0" 201 | flutter_launcher_icons: 202 | dependency: "direct main" 203 | description: 204 | name: flutter_launcher_icons 205 | sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" 206 | url: "https://pub.dev" 207 | source: hosted 208 | version: "0.13.1" 209 | flutter_plugin_android_lifecycle: 210 | dependency: transitive 211 | description: 212 | name: flutter_plugin_android_lifecycle 213 | sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da 214 | url: "https://pub.dev" 215 | source: hosted 216 | version: "2.0.17" 217 | flutter_test: 218 | dependency: "direct dev" 219 | description: flutter 220 | source: sdk 221 | version: "0.0.0" 222 | flutter_web_plugins: 223 | dependency: transitive 224 | description: flutter 225 | source: sdk 226 | version: "0.0.0" 227 | google_fonts: 228 | dependency: "direct main" 229 | description: 230 | name: google_fonts 231 | sha256: "6b6f10f0ce3c42f6552d1c70d2c28d764cf22bb487f50f66cca31dcd5194f4d6" 232 | url: "https://pub.dev" 233 | source: hosted 234 | version: "4.0.4" 235 | http: 236 | dependency: transitive 237 | description: 238 | name: http 239 | sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" 240 | url: "https://pub.dev" 241 | source: hosted 242 | version: "0.13.6" 243 | http_parser: 244 | dependency: transitive 245 | description: 246 | name: http_parser 247 | sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" 248 | url: "https://pub.dev" 249 | source: hosted 250 | version: "4.0.2" 251 | image: 252 | dependency: transitive 253 | description: 254 | name: image 255 | sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" 256 | url: "https://pub.dev" 257 | source: hosted 258 | version: "4.1.7" 259 | image_picker: 260 | dependency: "direct main" 261 | description: 262 | name: image_picker 263 | sha256: "26222b01a0c9a2c8fe02fc90b8208bd3325da5ed1f4a2acabf75939031ac0bdd" 264 | url: "https://pub.dev" 265 | source: hosted 266 | version: "1.0.7" 267 | image_picker_android: 268 | dependency: transitive 269 | description: 270 | name: image_picker_android 271 | sha256: "42c098e7fb6334746be37cdc30369ade356ed4f14d48b7a0313f95a9159f4321" 272 | url: "https://pub.dev" 273 | source: hosted 274 | version: "0.8.9+5" 275 | image_picker_for_web: 276 | dependency: transitive 277 | description: 278 | name: image_picker_for_web 279 | sha256: "6a1704fdd75022272e7e7a897a9068e9c2ff3cd6a66820bf3ded810633eac954" 280 | url: "https://pub.dev" 281 | source: hosted 282 | version: "3.0.3" 283 | image_picker_ios: 284 | dependency: transitive 285 | description: 286 | name: image_picker_ios 287 | sha256: "917a5cadd67d052554cfb258595e54217de53fac5b52939426e26319a02e6297" 288 | url: "https://pub.dev" 289 | source: hosted 290 | version: "0.8.9+2" 291 | image_picker_linux: 292 | dependency: transitive 293 | description: 294 | name: image_picker_linux 295 | sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" 296 | url: "https://pub.dev" 297 | source: hosted 298 | version: "0.2.1+1" 299 | image_picker_macos: 300 | dependency: transitive 301 | description: 302 | name: image_picker_macos 303 | sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" 304 | url: "https://pub.dev" 305 | source: hosted 306 | version: "0.2.1+1" 307 | image_picker_platform_interface: 308 | dependency: transitive 309 | description: 310 | name: image_picker_platform_interface 311 | sha256: "3d2c323daea9d60608f1caf30be32a938916f4975434b8352e6f73dae496da38" 312 | url: "https://pub.dev" 313 | source: hosted 314 | version: "2.9.4" 315 | image_picker_windows: 316 | dependency: transitive 317 | description: 318 | name: image_picker_windows 319 | sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" 320 | url: "https://pub.dev" 321 | source: hosted 322 | version: "0.2.1+1" 323 | js: 324 | dependency: transitive 325 | description: 326 | name: js 327 | sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf 328 | url: "https://pub.dev" 329 | source: hosted 330 | version: "0.7.1" 331 | json_annotation: 332 | dependency: transitive 333 | description: 334 | name: json_annotation 335 | sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 336 | url: "https://pub.dev" 337 | source: hosted 338 | version: "4.8.1" 339 | leak_tracker: 340 | dependency: transitive 341 | description: 342 | name: leak_tracker 343 | sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" 344 | url: "https://pub.dev" 345 | source: hosted 346 | version: "10.0.0" 347 | leak_tracker_flutter_testing: 348 | dependency: transitive 349 | description: 350 | name: leak_tracker_flutter_testing 351 | sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 352 | url: "https://pub.dev" 353 | source: hosted 354 | version: "2.0.1" 355 | leak_tracker_testing: 356 | dependency: transitive 357 | description: 358 | name: leak_tracker_testing 359 | sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 360 | url: "https://pub.dev" 361 | source: hosted 362 | version: "2.0.1" 363 | matcher: 364 | dependency: transitive 365 | description: 366 | name: matcher 367 | sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb 368 | url: "https://pub.dev" 369 | source: hosted 370 | version: "0.12.16+1" 371 | material_color_utilities: 372 | dependency: transitive 373 | description: 374 | name: material_color_utilities 375 | sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" 376 | url: "https://pub.dev" 377 | source: hosted 378 | version: "0.8.0" 379 | meta: 380 | dependency: transitive 381 | description: 382 | name: meta 383 | sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 384 | url: "https://pub.dev" 385 | source: hosted 386 | version: "1.11.0" 387 | mime: 388 | dependency: transitive 389 | description: 390 | name: mime 391 | sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" 392 | url: "https://pub.dev" 393 | source: hosted 394 | version: "1.0.5" 395 | package_info_plus: 396 | dependency: transitive 397 | description: 398 | name: package_info_plus 399 | sha256: f62d7253edc197fe3c88d7c2ddab82d68f555e778d55390ccc3537eca8e8d637 400 | url: "https://pub.dev" 401 | source: hosted 402 | version: "1.4.3+1" 403 | package_info_plus_linux: 404 | dependency: transitive 405 | description: 406 | name: package_info_plus_linux 407 | sha256: "04b575f44233d30edbb80a94e57cad9107aada334fc02aabb42b6becd13c43fc" 408 | url: "https://pub.dev" 409 | source: hosted 410 | version: "1.0.5" 411 | package_info_plus_macos: 412 | dependency: transitive 413 | description: 414 | name: package_info_plus_macos 415 | sha256: a2ad8b4acf4cd479d4a0afa5a74ea3f5b1c7563b77e52cc32b3ee6956d5482a6 416 | url: "https://pub.dev" 417 | source: hosted 418 | version: "1.3.0" 419 | package_info_plus_platform_interface: 420 | dependency: transitive 421 | description: 422 | name: package_info_plus_platform_interface 423 | sha256: f7a0c8f1e7e981bc65f8b64137a53fd3c195b18d429fba960babc59a5a1c7ae8 424 | url: "https://pub.dev" 425 | source: hosted 426 | version: "1.0.2" 427 | package_info_plus_web: 428 | dependency: transitive 429 | description: 430 | name: package_info_plus_web 431 | sha256: f0829327eb534789e0a16ccac8936a80beed4e2401c4d3a74f3f39094a822d3b 432 | url: "https://pub.dev" 433 | source: hosted 434 | version: "1.0.6" 435 | package_info_plus_windows: 436 | dependency: transitive 437 | description: 438 | name: package_info_plus_windows 439 | sha256: "79524f11c42dd9078b96d797b3cf79c0a2883a50c4920dc43da8562c115089bc" 440 | url: "https://pub.dev" 441 | source: hosted 442 | version: "2.1.0" 443 | path: 444 | dependency: transitive 445 | description: 446 | name: path 447 | sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" 448 | url: "https://pub.dev" 449 | source: hosted 450 | version: "1.9.0" 451 | path_provider: 452 | dependency: transitive 453 | description: 454 | name: path_provider 455 | sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b 456 | url: "https://pub.dev" 457 | source: hosted 458 | version: "2.1.2" 459 | path_provider_android: 460 | dependency: transitive 461 | description: 462 | name: path_provider_android 463 | sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" 464 | url: "https://pub.dev" 465 | source: hosted 466 | version: "2.2.2" 467 | path_provider_foundation: 468 | dependency: transitive 469 | description: 470 | name: path_provider_foundation 471 | sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" 472 | url: "https://pub.dev" 473 | source: hosted 474 | version: "2.3.2" 475 | path_provider_linux: 476 | dependency: transitive 477 | description: 478 | name: path_provider_linux 479 | sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 480 | url: "https://pub.dev" 481 | source: hosted 482 | version: "2.2.1" 483 | path_provider_platform_interface: 484 | dependency: transitive 485 | description: 486 | name: path_provider_platform_interface 487 | sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" 488 | url: "https://pub.dev" 489 | source: hosted 490 | version: "2.1.2" 491 | path_provider_windows: 492 | dependency: transitive 493 | description: 494 | name: path_provider_windows 495 | sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" 496 | url: "https://pub.dev" 497 | source: hosted 498 | version: "2.2.1" 499 | petitparser: 500 | dependency: transitive 501 | description: 502 | name: petitparser 503 | sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 504 | url: "https://pub.dev" 505 | source: hosted 506 | version: "6.0.2" 507 | platform: 508 | dependency: transitive 509 | description: 510 | name: platform 511 | sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" 512 | url: "https://pub.dev" 513 | source: hosted 514 | version: "3.1.4" 515 | plugin_platform_interface: 516 | dependency: transitive 517 | description: 518 | name: plugin_platform_interface 519 | sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" 520 | url: "https://pub.dev" 521 | source: hosted 522 | version: "2.1.8" 523 | pointycastle: 524 | dependency: transitive 525 | description: 526 | name: pointycastle 527 | sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" 528 | url: "https://pub.dev" 529 | source: hosted 530 | version: "3.7.4" 531 | shared_preferences: 532 | dependency: "direct main" 533 | description: 534 | name: shared_preferences 535 | sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" 536 | url: "https://pub.dev" 537 | source: hosted 538 | version: "2.2.2" 539 | shared_preferences_android: 540 | dependency: transitive 541 | description: 542 | name: shared_preferences_android 543 | sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" 544 | url: "https://pub.dev" 545 | source: hosted 546 | version: "2.2.1" 547 | shared_preferences_foundation: 548 | dependency: transitive 549 | description: 550 | name: shared_preferences_foundation 551 | sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" 552 | url: "https://pub.dev" 553 | source: hosted 554 | version: "2.3.5" 555 | shared_preferences_linux: 556 | dependency: transitive 557 | description: 558 | name: shared_preferences_linux 559 | sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" 560 | url: "https://pub.dev" 561 | source: hosted 562 | version: "2.3.2" 563 | shared_preferences_platform_interface: 564 | dependency: transitive 565 | description: 566 | name: shared_preferences_platform_interface 567 | sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" 568 | url: "https://pub.dev" 569 | source: hosted 570 | version: "2.3.2" 571 | shared_preferences_web: 572 | dependency: transitive 573 | description: 574 | name: shared_preferences_web 575 | sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" 576 | url: "https://pub.dev" 577 | source: hosted 578 | version: "2.3.0" 579 | shared_preferences_windows: 580 | dependency: transitive 581 | description: 582 | name: shared_preferences_windows 583 | sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" 584 | url: "https://pub.dev" 585 | source: hosted 586 | version: "2.3.2" 587 | sky_engine: 588 | dependency: transitive 589 | description: flutter 590 | source: sdk 591 | version: "0.0.99" 592 | source_span: 593 | dependency: transitive 594 | description: 595 | name: source_span 596 | sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" 597 | url: "https://pub.dev" 598 | source: hosted 599 | version: "1.10.0" 600 | stack_trace: 601 | dependency: transitive 602 | description: 603 | name: stack_trace 604 | sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" 605 | url: "https://pub.dev" 606 | source: hosted 607 | version: "1.11.1" 608 | stream_channel: 609 | dependency: transitive 610 | description: 611 | name: stream_channel 612 | sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 613 | url: "https://pub.dev" 614 | source: hosted 615 | version: "2.1.2" 616 | string_scanner: 617 | dependency: transitive 618 | description: 619 | name: string_scanner 620 | sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" 621 | url: "https://pub.dev" 622 | source: hosted 623 | version: "1.2.0" 624 | term_glyph: 625 | dependency: transitive 626 | description: 627 | name: term_glyph 628 | sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 629 | url: "https://pub.dev" 630 | source: hosted 631 | version: "1.2.1" 632 | test_api: 633 | dependency: transitive 634 | description: 635 | name: test_api 636 | sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" 637 | url: "https://pub.dev" 638 | source: hosted 639 | version: "0.6.1" 640 | typed_data: 641 | dependency: transitive 642 | description: 643 | name: typed_data 644 | sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c 645 | url: "https://pub.dev" 646 | source: hosted 647 | version: "1.3.2" 648 | url_launcher: 649 | dependency: "direct main" 650 | description: 651 | name: url_launcher 652 | sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" 653 | url: "https://pub.dev" 654 | source: hosted 655 | version: "6.2.5" 656 | url_launcher_android: 657 | dependency: transitive 658 | description: 659 | name: url_launcher_android 660 | sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 661 | url: "https://pub.dev" 662 | source: hosted 663 | version: "6.3.0" 664 | url_launcher_ios: 665 | dependency: transitive 666 | description: 667 | name: url_launcher_ios 668 | sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" 669 | url: "https://pub.dev" 670 | source: hosted 671 | version: "6.2.5" 672 | url_launcher_linux: 673 | dependency: transitive 674 | description: 675 | name: url_launcher_linux 676 | sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 677 | url: "https://pub.dev" 678 | source: hosted 679 | version: "3.1.1" 680 | url_launcher_macos: 681 | dependency: transitive 682 | description: 683 | name: url_launcher_macos 684 | sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 685 | url: "https://pub.dev" 686 | source: hosted 687 | version: "3.1.0" 688 | url_launcher_platform_interface: 689 | dependency: transitive 690 | description: 691 | name: url_launcher_platform_interface 692 | sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" 693 | url: "https://pub.dev" 694 | source: hosted 695 | version: "2.3.2" 696 | url_launcher_web: 697 | dependency: transitive 698 | description: 699 | name: url_launcher_web 700 | sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" 701 | url: "https://pub.dev" 702 | source: hosted 703 | version: "2.3.0" 704 | url_launcher_windows: 705 | dependency: transitive 706 | description: 707 | name: url_launcher_windows 708 | sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 709 | url: "https://pub.dev" 710 | source: hosted 711 | version: "3.1.1" 712 | vector_math: 713 | dependency: transitive 714 | description: 715 | name: vector_math 716 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" 717 | url: "https://pub.dev" 718 | source: hosted 719 | version: "2.1.4" 720 | vm_service: 721 | dependency: transitive 722 | description: 723 | name: vm_service 724 | sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 725 | url: "https://pub.dev" 726 | source: hosted 727 | version: "13.0.0" 728 | web: 729 | dependency: transitive 730 | description: 731 | name: web 732 | sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" 733 | url: "https://pub.dev" 734 | source: hosted 735 | version: "0.5.1" 736 | win32: 737 | dependency: transitive 738 | description: 739 | name: win32 740 | sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 741 | url: "https://pub.dev" 742 | source: hosted 743 | version: "3.1.4" 744 | xdg_directories: 745 | dependency: transitive 746 | description: 747 | name: xdg_directories 748 | sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d 749 | url: "https://pub.dev" 750 | source: hosted 751 | version: "1.0.4" 752 | xml: 753 | dependency: transitive 754 | description: 755 | name: xml 756 | sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 757 | url: "https://pub.dev" 758 | source: hosted 759 | version: "6.5.0" 760 | yaml: 761 | dependency: transitive 762 | description: 763 | name: yaml 764 | sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" 765 | url: "https://pub.dev" 766 | source: hosted 767 | version: "3.1.2" 768 | sdks: 769 | dart: "3.3.3" 770 | flutter: ">=3.19.0" 771 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: Cyberpwned 2 | description: Cyberpunk 2077 Hacking Minigame Resolver 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.8.4+54 19 | 20 | environment: 21 | sdk: "3.3.3" 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | flutter_launcher_icons: ^0.13.1 27 | image_picker: ^1.0.7 28 | firebase_core: ^2.28.0 29 | google_fonts: ^4.0.4 30 | app_review: ^2.1.2+1 31 | url_launcher: ^6.2.5 32 | shared_preferences: ^2.2.2 33 | 34 | # The following adds the Cupertino Icons font to your application. 35 | # Use with the CupertinoIcons class for iOS style icons. 36 | cupertino_icons: ^1.0.0 37 | 38 | dev_dependencies: 39 | flutter_test: 40 | sdk: flutter 41 | 42 | flutter_icons: 43 | android: "launcher_icon" 44 | ios: true 45 | image_path: "assets/icon/icon.png" 46 | 47 | # For information on the generic Dart part of this file, see the 48 | # following page: https://dart.dev/tools/pub/pubspec 49 | 50 | # The following section is specific to Flutter. 51 | flutter: 52 | 53 | # The following line ensures that the Material Icons font is 54 | # included with your application, so that you can use the icons in 55 | # the material Icons class. 56 | uses-material-design: true 57 | 58 | # To add assets to your application, add an assets section, like this: 59 | #assets: 60 | #- assets/asd.jpg 61 | #- assets/dsa.png 62 | # An image asset can refer to one or more resolution-specific "variants", see 63 | # https://flutter.dev/assets-and-images/#resolution-aware. 64 | 65 | # For details regarding adding assets from package dependencies, see 66 | # https://flutter.dev/assets-and-images/#from-packages 67 | 68 | # To add custom fonts to your application, add a fonts section here, 69 | # in this "flutter" section. Each entry in this list should have a 70 | # "family" key with the font family name, and a "fonts" key with a 71 | # list giving the asset and other descriptors for the font. For 72 | # example: 73 | # fonts: 74 | # - family: Schyler 75 | # fonts: 76 | # - asset: fonts/Schyler-Regular.ttf 77 | # - asset: fonts/Schyler-Italic.ttf 78 | # style: italic 79 | # - family: Trajan Pro 80 | # fonts: 81 | # - asset: fonts/TrajanPro.ttf 82 | # - asset: fonts/TrajanPro_Bold.ttf 83 | # weight: 700 84 | # 85 | # For details regarding fonts from package dependencies, 86 | # see https://flutter.dev/custom-fonts/#from-packages 87 | --------------------------------------------------------------------------------