reflekt 0.9.6 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/Accessor.rb +9 -10
- data/lib/Aggregator.rb +238 -0
- data/lib/Clone.rb +31 -0
- data/lib/Config.rb +41 -0
- data/lib/Control.rb +53 -14
- data/lib/Execution.rb +48 -7
- data/lib/Meta.rb +39 -0
- data/lib/MetaBuilder.rb +83 -0
- data/lib/Reflection.rb +124 -106
- data/lib/Reflekt.rb +120 -96
- data/lib/Renderer.rb +20 -19
- data/lib/Rule.rb +37 -17
- data/lib/RuleSet.rb +66 -42
- data/lib/ShadowStack.rb +9 -21
- data/lib/meta/ArrayMeta.rb +34 -0
- data/lib/meta/BooleanMeta.rb +26 -0
- data/lib/meta/FloatMeta.rb +26 -0
- data/lib/meta/IntegerMeta.rb +26 -0
- data/lib/meta/StringMeta.rb +26 -0
- data/lib/rules/ArrayRule.rb +88 -0
- data/lib/rules/BooleanRule.rb +45 -0
- data/lib/rules/FloatRule.rb +40 -11
- data/lib/rules/IntegerRule.rb +36 -10
- data/lib/rules/StringRule.rb +60 -8
- data/lib/web/README.md +11 -0
- data/lib/web/bundle.js +30 -0
- data/lib/web/gitignore.txt +7 -0
- data/lib/web/index.html +26 -0
- data/lib/web/package-lock.json +1347 -0
- data/lib/web/package.json +26 -0
- data/lib/web/server.js +118 -0
- metadata +26 -11
- data/lib/Ruler.rb +0 -197
- data/lib/web/script.js +0 -8
- data/lib/web/style.css +0 -151
- data/lib/web/template.html.erb +0 -266
| @@ -0,0 +1,26 @@ | |
| 1 | 
            +
            {
         | 
| 2 | 
            +
              "name": "reflekt-server",
         | 
| 3 | 
            +
              "version": "1.0.0",
         | 
| 4 | 
            +
              "description": "Serves the UI and writes to the DB.",
         | 
| 5 | 
            +
              "main": "server.js",
         | 
| 6 | 
            +
              "scripts": {
         | 
| 7 | 
            +
                "test": "echo \"Error: no test specified\" && exit 1",
         | 
| 8 | 
            +
                "start": "nodemon server.js"
         | 
| 9 | 
            +
              },
         | 
| 10 | 
            +
              "repository": {
         | 
| 11 | 
            +
                "type": "git",
         | 
| 12 | 
            +
                "url": "git+https://github.com/refIekt/reflekt-ui.git"
         | 
| 13 | 
            +
              },
         | 
| 14 | 
            +
              "author": "Maedi Prichard",
         | 
| 15 | 
            +
              "license": "MPL-2.0",
         | 
| 16 | 
            +
              "bugs": {
         | 
| 17 | 
            +
                "url": "https://github.com/refIekt/reflekt-ui/issues"
         | 
| 18 | 
            +
              },
         | 
| 19 | 
            +
              "homepage": "https://reflekt.dev",
         | 
| 20 | 
            +
              "dependencies": {
         | 
| 21 | 
            +
                "express": "^4.17.1"
         | 
| 22 | 
            +
              },
         | 
| 23 | 
            +
              "devDependencies": {
         | 
| 24 | 
            +
                "nodemon": "^2.0.5"
         | 
| 25 | 
            +
              }
         | 
| 26 | 
            +
            }
         | 
    
        data/lib/web/server.js
    ADDED
    
    | @@ -0,0 +1,118 @@ | |
| 1 | 
            +
            const express = require('express')
         | 
| 2 | 
            +
            const path = require('path')
         | 
| 3 | 
            +
            const vm = require("vm");
         | 
| 4 | 
            +
            const fs = require('fs');
         | 
| 5 | 
            +
            const app = express();
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            // Config.
         | 
| 8 | 
            +
            const port = 3001;
         | 
| 9 | 
            +
            const db_path = 'db.js';
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            // Configure express.
         | 
| 12 | 
            +
            app.use(express.json());
         | 
| 13 | 
            +
            app.use(express.static('.'));
         | 
| 14 | 
            +
            app.use('/dist', express.static('../dist'));
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            // Respond with React app.
         | 
| 17 | 
            +
            app.get('/', (req, res) => {
         | 
| 18 | 
            +
              res.sendFile(path.join(__dirname, 'index.html'))
         | 
| 19 | 
            +
            })
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            ////
         | 
| 22 | 
            +
            // READ
         | 
| 23 | 
            +
            ////
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            var load_db = () => {
         | 
| 26 | 
            +
             | 
| 27 | 
            +
              const data = fs.readFileSync(db_path);
         | 
| 28 | 
            +
              const script = new vm.Script(data);
         | 
| 29 | 
            +
              script.runInThisContext();
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              return JSON.parse(db);
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            }
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            ////
         | 
| 36 | 
            +
            // WRITE
         | 
| 37 | 
            +
            ////
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            var save_db = (db) => {
         | 
| 40 | 
            +
              // Save JS file to disk.
         | 
| 41 | 
            +
              try {
         | 
| 42 | 
            +
                fs.writeFileSync(db_path, 'var db = ' + JSON.stringify(JSON.stringify(db)) + ';');
         | 
| 43 | 
            +
              }
         | 
| 44 | 
            +
              catch (err) {
         | 
| 45 | 
            +
                console.log("ERROR: save_db() failed to save.");
         | 
| 46 | 
            +
                console.error(err);
         | 
| 47 | 
            +
              }
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            }
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            ////
         | 
| 52 | 
            +
            // DELETE.
         | 
| 53 | 
            +
            ////
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            // Handle controls delete request.
         | 
| 56 | 
            +
            app.post('/controls/delete', (req, res) => {
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              // Get execution ID that controls share.
         | 
| 59 | 
            +
              var exe_id = req.body.exe_id;
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              // Get database.
         | 
| 62 | 
            +
              db = load_db();
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              // Delete controls.
         | 
| 65 | 
            +
              for (let [index, control] of db.controls.entries()) {
         | 
| 66 | 
            +
                if (control.exe_id == exe_id) {
         | 
| 67 | 
            +
                  console.log("DELETE CONTROL:");
         | 
| 68 | 
            +
                  console.log(db.controls[index]);
         | 
| 69 | 
            +
                  db.controls.splice(index, 1);
         | 
| 70 | 
            +
                }
         | 
| 71 | 
            +
                if (control.base_id != null && control.base_id == exe_id) {
         | 
| 72 | 
            +
                  console.log("DELETE:");
         | 
| 73 | 
            +
                  console.log(db.controls[index]);
         | 
| 74 | 
            +
                  db.controls.splice(index, 1);
         | 
| 75 | 
            +
                }
         | 
| 76 | 
            +
              }
         | 
| 77 | 
            +
             | 
| 78 | 
            +
              // Save database.
         | 
| 79 | 
            +
              save_db(db)
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              res.status(200).send({ message: 'ok' });
         | 
| 82 | 
            +
             | 
| 83 | 
            +
            })
         | 
| 84 | 
            +
             | 
| 85 | 
            +
            // Handle control delete request.
         | 
| 86 | 
            +
            app.post('/control/delete', (req, res) => {
         | 
| 87 | 
            +
             | 
| 88 | 
            +
              // Get control ID.
         | 
| 89 | 
            +
              ref_id = req.body.ref_id;
         | 
| 90 | 
            +
             | 
| 91 | 
            +
              // Get database.
         | 
| 92 | 
            +
              db = load_db();
         | 
| 93 | 
            +
             | 
| 94 | 
            +
              // Delete control.
         | 
| 95 | 
            +
              for (let [index, control] of db.controls.entries()) {
         | 
| 96 | 
            +
                if (control.r == ref_id) {
         | 
| 97 | 
            +
                  console.log("DELETE CONTROL:")
         | 
| 98 | 
            +
                  console.log(db.controls[index]);
         | 
| 99 | 
            +
                  db.controls.splice(index, 1);
         | 
| 100 | 
            +
                  break;
         | 
| 101 | 
            +
                }
         | 
| 102 | 
            +
              }
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              // Save database.
         | 
| 105 | 
            +
              save_db(db)
         | 
| 106 | 
            +
             | 
| 107 | 
            +
              res.status(200).send({ message: 'ok' });
         | 
| 108 | 
            +
             | 
| 109 | 
            +
            })
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            ////
         | 
| 112 | 
            +
            // SERVE
         | 
| 113 | 
            +
            ////
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            // Listen for requests.
         | 
| 116 | 
            +
            app.listen(port, () => {
         | 
| 117 | 
            +
              console.log(`Example app listening at http://localhost:${port}`)
         | 
| 118 | 
            +
            })
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: reflekt
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 1.0.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Maedi Prichard
         | 
| 8 | 
            -
            autorequire: | 
| 8 | 
            +
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2020- | 
| 11 | 
            +
            date: 2020-12-06 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rowdb
         | 
| @@ -25,32 +25,47 @@ dependencies: | |
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: '0'
         | 
| 27 27 | 
             
            description: Testing that's completely automated.
         | 
| 28 | 
            -
            email: maediprichard@ | 
| 28 | 
            +
            email: maediprichard@gmail.com
         | 
| 29 29 | 
             
            executables: []
         | 
| 30 30 | 
             
            extensions: []
         | 
| 31 31 | 
             
            extra_rdoc_files: []
         | 
| 32 32 | 
             
            files:
         | 
| 33 33 | 
             
            - lib/Accessor.rb
         | 
| 34 | 
            +
            - lib/Aggregator.rb
         | 
| 35 | 
            +
            - lib/Clone.rb
         | 
| 36 | 
            +
            - lib/Config.rb
         | 
| 34 37 | 
             
            - lib/Control.rb
         | 
| 35 38 | 
             
            - lib/Execution.rb
         | 
| 39 | 
            +
            - lib/Meta.rb
         | 
| 40 | 
            +
            - lib/MetaBuilder.rb
         | 
| 36 41 | 
             
            - lib/Reflection.rb
         | 
| 37 42 | 
             
            - lib/Reflekt.rb
         | 
| 38 43 | 
             
            - lib/Renderer.rb
         | 
| 39 44 | 
             
            - lib/Rule.rb
         | 
| 40 45 | 
             
            - lib/RuleSet.rb
         | 
| 41 | 
            -
            - lib/Ruler.rb
         | 
| 42 46 | 
             
            - lib/ShadowStack.rb
         | 
| 47 | 
            +
            - lib/meta/ArrayMeta.rb
         | 
| 48 | 
            +
            - lib/meta/BooleanMeta.rb
         | 
| 49 | 
            +
            - lib/meta/FloatMeta.rb
         | 
| 50 | 
            +
            - lib/meta/IntegerMeta.rb
         | 
| 51 | 
            +
            - lib/meta/StringMeta.rb
         | 
| 52 | 
            +
            - lib/rules/ArrayRule.rb
         | 
| 53 | 
            +
            - lib/rules/BooleanRule.rb
         | 
| 43 54 | 
             
            - lib/rules/FloatRule.rb
         | 
| 44 55 | 
             
            - lib/rules/IntegerRule.rb
         | 
| 45 56 | 
             
            - lib/rules/StringRule.rb
         | 
| 46 | 
            -
            - lib/web/ | 
| 47 | 
            -
            - lib/web/ | 
| 48 | 
            -
            - lib/web/ | 
| 57 | 
            +
            - lib/web/README.md
         | 
| 58 | 
            +
            - lib/web/bundle.js
         | 
| 59 | 
            +
            - lib/web/gitignore.txt
         | 
| 60 | 
            +
            - lib/web/index.html
         | 
| 61 | 
            +
            - lib/web/package-lock.json
         | 
| 62 | 
            +
            - lib/web/package.json
         | 
| 63 | 
            +
            - lib/web/server.js
         | 
| 49 64 | 
             
            homepage: https://github.com/refIekt/reflekt
         | 
| 50 65 | 
             
            licenses:
         | 
| 51 66 | 
             
            - MPL-2.0
         | 
| 52 67 | 
             
            metadata: {}
         | 
| 53 | 
            -
            post_install_message: | 
| 68 | 
            +
            post_install_message:
         | 
| 54 69 | 
             
            rdoc_options: []
         | 
| 55 70 | 
             
            require_paths:
         | 
| 56 71 | 
             
            - lib
         | 
| @@ -65,8 +80,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 65 80 | 
             
                - !ruby/object:Gem::Version
         | 
| 66 81 | 
             
                  version: '0'
         | 
| 67 82 | 
             
            requirements: []
         | 
| 68 | 
            -
            rubygems_version: 3. | 
| 69 | 
            -
            signing_key: | 
| 83 | 
            +
            rubygems_version: 3.1.4
         | 
| 84 | 
            +
            signing_key:
         | 
| 70 85 | 
             
            specification_version: 4
         | 
| 71 86 | 
             
            summary: Reflective testing.
         | 
| 72 87 | 
             
            test_files: []
         | 
    
        data/lib/Ruler.rb
    DELETED
    
    | @@ -1,197 +0,0 @@ | |
| 1 | 
            -
            ################################################################################
         | 
| 2 | 
            -
            # RULER
         | 
| 3 | 
            -
            #
         | 
| 4 | 
            -
            # Aggregates input/output from controls.
         | 
| 5 | 
            -
            # Creates and trains RuleSets from aggregated input/output.
         | 
| 6 | 
            -
            # Validates reflection input/output against RuleSets.
         | 
| 7 | 
            -
            ################################################################################
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            require 'RuleSet'
         | 
| 10 | 
            -
             | 
| 11 | 
            -
            class Ruler
         | 
| 12 | 
            -
             | 
| 13 | 
            -
              INPUTS = "i"
         | 
| 14 | 
            -
              OUTPUT = "o"
         | 
| 15 | 
            -
              TYPE   = "T"
         | 
| 16 | 
            -
              VALUE  = "V"
         | 
| 17 | 
            -
             | 
| 18 | 
            -
              def initialize()
         | 
| 19 | 
            -
                @rule_sets = {}
         | 
| 20 | 
            -
              end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
              ##
         | 
| 23 | 
            -
              # Get input RuleSets.
         | 
| 24 | 
            -
              #
         | 
| 25 | 
            -
              # @param Symbol klass
         | 
| 26 | 
            -
              # @param Symbol method
         | 
| 27 | 
            -
              #
         | 
| 28 | 
            -
              # @return Array
         | 
| 29 | 
            -
              ##
         | 
| 30 | 
            -
              def get_input_rule_sets(klass, method)
         | 
| 31 | 
            -
                return @rule_sets.dig(klass, method, :inputs)
         | 
| 32 | 
            -
              end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
              ##
         | 
| 35 | 
            -
              # Get input RuleSet.
         | 
| 36 | 
            -
              #
         | 
| 37 | 
            -
              # @param Symbol klass
         | 
| 38 | 
            -
              # @param Symbol method
         | 
| 39 | 
            -
              #
         | 
| 40 | 
            -
              # @return RuleSet
         | 
| 41 | 
            -
              ##
         | 
| 42 | 
            -
              def get_input_rule_set(klass, method, arg_num)
         | 
| 43 | 
            -
                @rule_sets.dig(klass, method, :inputs, arg_num)
         | 
| 44 | 
            -
              end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
              ##
         | 
| 47 | 
            -
              # Get output RuleSet.
         | 
| 48 | 
            -
              #
         | 
| 49 | 
            -
              # @param Symbol klass
         | 
| 50 | 
            -
              # @param Symbol method
         | 
| 51 | 
            -
              #
         | 
| 52 | 
            -
              # @return RuleSet.
         | 
| 53 | 
            -
              ##
         | 
| 54 | 
            -
              def get_output_rule_set(klass, method)
         | 
| 55 | 
            -
                @rule_sets.dig(klass, method, :output)
         | 
| 56 | 
            -
              end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
              ##
         | 
| 59 | 
            -
              # Set input RuleSet.
         | 
| 60 | 
            -
              #
         | 
| 61 | 
            -
              # @param Symbol klass
         | 
| 62 | 
            -
              # @param Symbol method
         | 
| 63 | 
            -
              ##
         | 
| 64 | 
            -
              def set_input_rule_set(klass, method, arg_num, rule_set)
         | 
| 65 | 
            -
                # Set defaults.
         | 
| 66 | 
            -
                @rule_sets[klass] = {} unless @rule_sets.key? klass
         | 
| 67 | 
            -
                @rule_sets[klass][method] = {} unless @rule_sets[klass].key? method
         | 
| 68 | 
            -
                @rule_sets[klass][method][:inputs] = [] unless @rule_sets[klass][method].key? :inputs
         | 
| 69 | 
            -
                # Set value.
         | 
| 70 | 
            -
                @rule_sets[klass][method][:inputs][arg_num] = rule_set
         | 
| 71 | 
            -
              end
         | 
| 72 | 
            -
             | 
| 73 | 
            -
              ##
         | 
| 74 | 
            -
              # Set output RuleSet.
         | 
| 75 | 
            -
              #
         | 
| 76 | 
            -
              # @param Symbol klass
         | 
| 77 | 
            -
              # @param Symbol method
         | 
| 78 | 
            -
              # @param RuleSet rule_set
         | 
| 79 | 
            -
              ##
         | 
| 80 | 
            -
              def set_output_rule_set(klass, method, rule_set)
         | 
| 81 | 
            -
                # Set defaults.
         | 
| 82 | 
            -
                @rule_sets[klass] = {} unless @rule_sets.key? klass
         | 
| 83 | 
            -
                @rule_sets[klass][method] = {} unless @rule_sets[klass].key? method
         | 
| 84 | 
            -
                # Set value.
         | 
| 85 | 
            -
                @rule_sets[klass][method][:output] = rule_set
         | 
| 86 | 
            -
              end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
              ##
         | 
| 89 | 
            -
              # Load RuleSets.
         | 
| 90 | 
            -
              #
         | 
| 91 | 
            -
              # @param Symbol klass
         | 
| 92 | 
            -
              # @param Symbol method
         | 
| 93 | 
            -
              # @param Array controls
         | 
| 94 | 
            -
              ##
         | 
| 95 | 
            -
              def load(klass, method, controls)
         | 
| 96 | 
            -
             | 
| 97 | 
            -
                # Create a RuleSet for each control's inputs/output.
         | 
| 98 | 
            -
                controls.each_with_index do |control, index|
         | 
| 99 | 
            -
             | 
| 100 | 
            -
                  # Process inputs.
         | 
| 101 | 
            -
                  control[INPUTS].each_with_index do |input, arg_num|
         | 
| 102 | 
            -
                    rule_set = get_input_rule_set(klass, method, arg_num)
         | 
| 103 | 
            -
                    if rule_set.nil?
         | 
| 104 | 
            -
                      rule_set = RuleSet.new()
         | 
| 105 | 
            -
                      set_input_rule_set(klass, method, arg_num, rule_set)
         | 
| 106 | 
            -
                    end
         | 
| 107 | 
            -
                    rule_set.load(input[TYPE], input[VALUE])
         | 
| 108 | 
            -
                  end
         | 
| 109 | 
            -
             | 
| 110 | 
            -
                  # Process output.
         | 
| 111 | 
            -
                  output_rule_set = get_output_rule_set(klass, method)
         | 
| 112 | 
            -
                  if output_rule_set.nil?
         | 
| 113 | 
            -
                    output_rule_set = RuleSet.new()
         | 
| 114 | 
            -
                    set_output_rule_set(klass, method, output_rule_set)
         | 
| 115 | 
            -
                  end
         | 
| 116 | 
            -
                  output_rule_set.load(control[OUTPUT][TYPE], control[OUTPUT][VALUE])
         | 
| 117 | 
            -
             | 
| 118 | 
            -
                end
         | 
| 119 | 
            -
             | 
| 120 | 
            -
              end
         | 
| 121 | 
            -
             | 
| 122 | 
            -
              ##
         | 
| 123 | 
            -
              # Train RuleSets from controls.
         | 
| 124 | 
            -
              #
         | 
| 125 | 
            -
              # @param Symbol klass
         | 
| 126 | 
            -
              # @param Symbol method
         | 
| 127 | 
            -
              ##
         | 
| 128 | 
            -
              def train(klass, method)
         | 
| 129 | 
            -
             | 
| 130 | 
            -
                input_rule_sets = get_input_rule_sets(klass, method)
         | 
| 131 | 
            -
                unless input_rule_sets.nil?
         | 
| 132 | 
            -
                  input_rule_sets.each do |input_rule_set|
         | 
| 133 | 
            -
                    input_rule_set.train()
         | 
| 134 | 
            -
                  end
         | 
| 135 | 
            -
                end
         | 
| 136 | 
            -
             | 
| 137 | 
            -
                output_rule_set = get_output_rule_set(klass, method)
         | 
| 138 | 
            -
                unless output_rule_set.nil?
         | 
| 139 | 
            -
                  output_rule_set.train()
         | 
| 140 | 
            -
                end
         | 
| 141 | 
            -
             | 
| 142 | 
            -
              end
         | 
| 143 | 
            -
             | 
| 144 | 
            -
              ##
         | 
| 145 | 
            -
              # Validate inputs.
         | 
| 146 | 
            -
              #
         | 
| 147 | 
            -
              # @param Array inputs - The method's arguments.
         | 
| 148 | 
            -
              # @param Array input_rule_sets - The RuleSets to validate each input with.
         | 
| 149 | 
            -
              ##
         | 
| 150 | 
            -
              def validate_inputs(inputs, input_rule_sets)
         | 
| 151 | 
            -
             | 
| 152 | 
            -
                # Default to a PASS result.
         | 
| 153 | 
            -
                result = true
         | 
| 154 | 
            -
             | 
| 155 | 
            -
                # Validate each argument against each rule set for that argument.
         | 
| 156 | 
            -
                inputs.each_with_index do |input, arg_num|
         | 
| 157 | 
            -
             | 
| 158 | 
            -
                  unless input_rule_sets[arg_num].nil?
         | 
| 159 | 
            -
             | 
| 160 | 
            -
                    rule_set = input_rule_sets[arg_num]
         | 
| 161 | 
            -
             | 
| 162 | 
            -
                    unless rule_set.validate_rule(input)
         | 
| 163 | 
            -
                      result = false
         | 
| 164 | 
            -
                    end
         | 
| 165 | 
            -
             | 
| 166 | 
            -
                  end
         | 
| 167 | 
            -
                end
         | 
| 168 | 
            -
             | 
| 169 | 
            -
                return result
         | 
| 170 | 
            -
             | 
| 171 | 
            -
              end
         | 
| 172 | 
            -
             | 
| 173 | 
            -
              ##
         | 
| 174 | 
            -
              # Validate output.
         | 
| 175 | 
            -
              #
         | 
| 176 | 
            -
              # @param dynamic output - The method's return value.
         | 
| 177 | 
            -
              # @param RuleSet output_rule_set - The RuleSet to validate the output with.
         | 
| 178 | 
            -
              ##
         | 
| 179 | 
            -
              def validate_output(output, output_rule_set)
         | 
| 180 | 
            -
             | 
| 181 | 
            -
                # Default to a PASS result.
         | 
| 182 | 
            -
                result = true
         | 
| 183 | 
            -
             | 
| 184 | 
            -
                unless output_rule_set.nil?
         | 
| 185 | 
            -
             | 
| 186 | 
            -
                  # Validate output RuleSet for that argument.
         | 
| 187 | 
            -
                  unless output_rule_set.validate_rule(output)
         | 
| 188 | 
            -
                    result = false
         | 
| 189 | 
            -
                  end
         | 
| 190 | 
            -
             | 
| 191 | 
            -
                end
         | 
| 192 | 
            -
             | 
| 193 | 
            -
                return result
         | 
| 194 | 
            -
             | 
| 195 | 
            -
              end
         | 
| 196 | 
            -
             | 
| 197 | 
            -
            end
         | 
    
        data/lib/web/script.js
    DELETED
    
    | @@ -1,8 +0,0 @@ | |
| 1 | 
            -
            /**
         | 
| 2 | 
            -
             * Minified by jsDelivr using Terser v3.14.1.
         | 
| 3 | 
            -
             * Original file: /gh/alpinejs/alpine@2.6.0/dist/alpine.js
         | 
| 4 | 
            -
             *
         | 
| 5 | 
            -
             * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
         | 
| 6 | 
            -
             */
         | 
| 7 | 
            -
            !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Alpine=t()}(this,function(){"use strict";function e(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,i)}return n}function n(n){for(var i=1;i<arguments.length;i++){var r=null!=arguments[i]?arguments[i]:{};i%2?t(Object(r),!0).forEach(function(t){e(n,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(r)):t(Object(r)).forEach(function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(r,e))})}return n}function i(e){return Array.from(new Set(e))}function r(){return navigator.userAgent.includes("Node.js")||navigator.userAgent.includes("jsdom")}function s(e,t){"template"!==e.tagName.toLowerCase()?console.warn(`Alpine: [${t}] directive should only be added to <template> tags. See https://github.com/alpinejs/alpine#${t}`):1!==e.content.childElementCount&&console.warn(`Alpine: <template> tag with [${t}] encountered with multiple element roots. Make sure <template> only has a single child node.`)}function o(e){return e.toLowerCase().replace(/-(\w)/g,(e,t)=>t.toUpperCase())}function a(e,t){var n;return function(){var i=this,r=arguments;clearTimeout(n),n=setTimeout(function(){n=null,e.apply(i,r)},t)}}function l(e,t,n={}){return"function"==typeof e?e.call(t):new Function(["$data",...Object.keys(n)],`var __alpine_result; with($data) { __alpine_result = ${e} }; return __alpine_result`)(t,...Object.values(n))}const c=/^x-(on|bind|data|text|html|model|if|for|show|cloak|transition|ref|spread)\b/;function u(e){const t=m(e.name);return c.test(t)}function d(e,t,n){let i=Array.from(e.attributes).filter(u).map(f),r=i.filter(e=>"spread"===e.type)[0];if(r){let e=l(r.expression,t.$data);i=i.concat(Object.entries(e).map(([e,t])=>f({name:e,value:t})))}return n?i.filter(e=>e.type===n):function(e){let t=["bind","model","show","catch-all"];return e.sort((e,n)=>{let i=-1===t.indexOf(e.type)?"catch-all":e.type,r=-1===t.indexOf(n.type)?"catch-all":n.type;return t.indexOf(i)-t.indexOf(r)})}(i)}function f({name:e,value:t}){const n=m(e),i=n.match(c),r=n.match(/:([a-zA-Z0-9\-:]+)/),s=n.match(/\.[^.\]]+(?=[^\]]*$)/g)||[];return{type:i?i[1]:null,value:r?r[1]:null,modifiers:s.map(e=>e.replace(".","")),expression:t}}function m(e){return e.startsWith("@")?e.replace("@","x-on:"):e.startsWith(":")?e.replace(":","x-bind:"):e}function p(e,t=Boolean){return e.split(" ").filter(t)}const h="in",v="out";function b(e,t,n,i=!1){if(i)return t();if(e.__x_transition&&e.__x_transition.type===h)return;const r=d(e,n,"transition"),s=d(e,n,"show")[0];if(s&&s.modifiers.includes("transition")){let n=s.modifiers;if(n.includes("out")&&!n.includes("in"))return t();const i=n.includes("in")&&n.includes("out");(function(e,t,n){const i={duration:g(t,"duration",150),origin:g(t,"origin","center"),first:{opacity:0,scale:g(t,"scale",95)},second:{opacity:1,scale:100}};x(e,t,n,()=>{},i,h)})(e,n=i?n.filter((e,t)=>t<n.indexOf("out")):n,t)}else r.some(e=>["enter","enter-start","enter-end"].includes(e.value))?function(e,t,n,i){let r=n=>"function"==typeof n?t.evaluateReturnExpression(e,n):n;const s=p(r((n.find(e=>"enter"===e.value)||{expression:""}).expression)),o=p(r((n.find(e=>"enter-start"===e.value)||{expression:""}).expression)),a=p(r((n.find(e=>"enter-end"===e.value)||{expression:""}).expression));_(e,s,o,a,i,()=>{},h)}(e,n,r,t):t()}function y(e,t,n,i=!1){if(i)return t();if(e.__x_transition&&e.__x_transition.type===v)return;const r=d(e,n,"transition"),s=d(e,n,"show")[0];if(s&&s.modifiers.includes("transition")){let n=s.modifiers;if(n.includes("in")&&!n.includes("out"))return t();const i=n.includes("in")&&n.includes("out");(function(e,t,n,i){const r={duration:n?g(t,"duration",150):g(t,"duration",150)/2,origin:g(t,"origin","center"),first:{opacity:1,scale:100},second:{opacity:0,scale:g(t,"scale",95)}};x(e,t,()=>{},i,r,v)})(e,n=i?n.filter((e,t)=>t>n.indexOf("out")):n,i,t)}else r.some(e=>["leave","leave-start","leave-end"].includes(e.value))?function(e,t,n,i){const r=p((n.find(e=>"leave"===e.value)||{expression:""}).expression),s=p((n.find(e=>"leave-start"===e.value)||{expression:""}).expression),o=p((n.find(e=>"leave-end"===e.value)||{expression:""}).expression);_(e,r,s,o,()=>{},i,v)}(e,0,r,t):t()}function g(e,t,n){if(-1===e.indexOf(t))return n;const i=e[e.indexOf(t)+1];if(!i)return n;if("scale"===t&&!E(i))return n;if("duration"===t){let e=i.match(/([0-9]+)ms/);if(e)return e[1]}return"origin"===t&&["top","right","left","center","bottom"].includes(e[e.indexOf(t)+2])?[i,e[e.indexOf(t)+2]].join(" "):i}function x(e,t,n,i,r,s){e.__x_transition&&(cancelAnimationFrame(e.__x_transition.nextFrame),e.__x_transition.callback&&e.__x_transition.callback());const o=e.style.opacity,a=e.style.transform,l=e.style.transformOrigin,c=!t.includes("opacity")&&!t.includes("scale"),u=c||t.includes("opacity"),d=c||t.includes("scale"),f={start(){u&&(e.style.opacity=r.first.opacity),d&&(e.style.transform=`scale(${r.first.scale/100})`)},during(){d&&(e.style.transformOrigin=r.origin),e.style.transitionProperty=[u?"opacity":"",d?"transform":""].join(" ").trim(),e.style.transitionDuration=`${r.duration/1e3}s`,e.style.transitionTimingFunction="cubic-bezier(0.4, 0.0, 0.2, 1)"},show(){n()},end(){u&&(e.style.opacity=r.second.opacity),d&&(e.style.transform=`scale(${r.second.scale/100})`)},hide(){i()},cleanup(){u&&(e.style.opacity=o),d&&(e.style.transform=a),d&&(e.style.transformOrigin=l),e.style.transitionProperty=null,e.style.transitionDuration=null,e.style.transitionTimingFunction=null}};w(e,f,s)}function _(e,t,n,i,r,s,o){e.__x_transition&&(cancelAnimationFrame(e.__x_transition.nextFrame),e.__x_transition.callback&&e.__x_transition.callback());const a=e.__x_original_classes||[],l={start(){e.classList.add(...n)},during(){e.classList.add(...t)},show(){r()},end(){e.classList.remove(...n.filter(e=>!a.includes(e))),e.classList.add(...i)},hide(){s()},cleanup(){e.classList.remove(...t.filter(e=>!a.includes(e))),e.classList.remove(...i.filter(e=>!a.includes(e)))}};w(e,l,o)}function w(e,t,n){e.__x_transition={type:n,callback:O(()=>{t.hide(),e.isConnected&&t.cleanup(),delete e.__x_transition}),nextFrame:null},t.start(),t.during(),e.__x_transition.nextFrame=requestAnimationFrame(()=>{let n=1e3*Number(getComputedStyle(e).transitionDuration.replace(/,.*/,"").replace("s",""));0===n&&(n=1e3*Number(getComputedStyle(e).animationDuration.replace("s",""))),t.show(),e.__x_transition.nextFrame=requestAnimationFrame(()=>{t.end(),setTimeout(e.__x_transition.callback,n)})})}function E(e){return!isNaN(e)}function O(e){let t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}function k(e,t,i,r,o){s(t,"x-for");let a=A("function"==typeof i?e.evaluateReturnExpression(t,i):i),l=function(e,t,n,i){let r=d(t,e,"if")[0];if(r&&!e.evaluateReturnExpression(t,r.expression))return[];return e.evaluateReturnExpression(t,n.items,i)}(e,t,a,o),c=t;l.forEach((i,s)=>{let u=function(e,t,i,r,s){let o=s?n({},s):{};o[e.item]=t,e.index&&(o[e.index]=i);e.collection&&(o[e.collection]=r);return o}(a,i,s,l,o()),f=function(e,t,n,i){let r=d(t,e,"bind").filter(e=>"key"===e.value)[0];return r?e.evaluateReturnExpression(t,r.expression,()=>i):n}(e,t,s,u),m=function(e,t){if(!e)return;if(e.__x_for_key===t)return e;let n=e;for(;n;){if(n.__x_for_key===t)return n.parentElement.insertBefore(n,e);n=!(!n.nextElementSibling||void 0===n.nextElementSibling.__x_for_key)&&n.nextElementSibling}}(c.nextElementSibling,f);m?(delete m.__x_for_key,m.__x_for=u,e.updateElements(m,()=>m.__x_for)):(b(m=function(e,t){let n=document.importNode(e.content,!0);return t.parentElement.insertBefore(n,t.nextElementSibling),t.nextElementSibling}(t,c),()=>{},e,r),m.__x_for=u,e.initializeElements(m,()=>m.__x_for)),(c=m).__x_for_key=f}),function(e,t){var n=!(!e.nextElementSibling||void 0===e.nextElementSibling.__x_for_key)&&e.nextElementSibling;for(;n;){let e=n,i=n.nextElementSibling;y(n,()=>{e.remove()},t),n=!(!i||void 0===i.__x_for_key)&&i}}(c,e)}function A(e){let t=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,n=e.match(/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/);if(!n)return;let i={};i.items=n[2].trim();let r=n[1].trim().replace(/^\(|\)$/g,""),s=r.match(t);return s?(i.item=r.replace(t,"").trim(),i.index=s[1].trim(),s[2]&&(i.collection=s[2].trim())):i.item=r,i}function S(e,t,n,r,s,a,l){var c=e.evaluateReturnExpression(t,r,s);if("value"===n){if(me.ignoreFocusedForValueBinding&&document.activeElement.isSameNode(t))return;if(void 0===c&&r.match(/\./)&&(c=""),"radio"===t.type)void 0===t.attributes.value&&"bind"===a?t.value=c:"bind"!==a&&(t.checked=t.value==c);else if("checkbox"===t.type)"string"==typeof c&&"bind"===a?t.value=c:"bind"!==a&&(Array.isArray(c)?t.checked=c.some(e=>e==t.value):t.checked=!!c);else if("SELECT"===t.tagName)!function(e,t){const n=[].concat(t).map(e=>e+"");Array.from(e.options).forEach(e=>{e.selected=n.includes(e.value||e.text)})}(t,c);else{if(t.value===c)return;t.value=c}}else if("class"===n)if(Array.isArray(c)){const e=t.__x_original_classes||[];t.setAttribute("class",i(e.concat(c)).join(" "))}else if("object"==typeof c){Object.keys(c).sort((e,t)=>c[e]-c[t]).forEach(e=>{c[e]?p(e).forEach(e=>t.classList.add(e)):p(e).forEach(e=>t.classList.remove(e))})}else{const e=t.__x_original_classes||[],n=p(c);t.setAttribute("class",i(e.concat(n)).join(" "))}else n=l.includes("camel")?o(n):n,[null,void 0,!1].includes(c)?t.removeAttribute(n):!function(e){return["disabled","checked","required","readonly","hidden","open","selected","autofocus","itemscope","multiple","novalidate","allowfullscreen","allowpaymentrequest","formnovalidate","autoplay","controls","loop","muted","playsinline","default","ismap","reversed","async","defer","nomodule"].includes(e)}(n)?$(t,n,c):$(t,n,n)}function $(e,t,n){e.getAttribute(t)!=n&&e.setAttribute(t,n)}function P(e,t,n,i,r,s={}){const l={passive:i.includes("passive")};if(i.includes("camel")&&(n=o(n)),i.includes("away")){let o=a=>{t.contains(a.target)||t.offsetWidth<1&&t.offsetHeight<1||(C(e,r,a,s),i.includes("once")&&document.removeEventListener(n,o,l))};document.addEventListener(n,o,l)}else{let o=i.includes("window")?window:i.includes("document")?document:t,c=a=>{if(o!==window&&o!==document||document.body.contains(t)){if(!(function(e){return["keydown","keyup"].includes(e)}(n)&&function(e,t){let n=t.filter(e=>!["window","document","prevent","stop"].includes(e));if(n.includes("debounce")){let e=n.indexOf("debounce");n.splice(e,E((n[e+1]||"invalid-wait").split("ms")[0])?2:1)}if(0===n.length)return!1;if(1===n.length&&n[0]===D(e.key))return!1;const i=["ctrl","shift","alt","meta","cmd","super"].filter(e=>n.includes(e));if(n=n.filter(e=>!i.includes(e)),i.length>0){const t=i.filter(t=>("cmd"!==t&&"super"!==t||(t="meta"),e[`${t}Key`]));if(t.length===i.length&&n[0]===D(e.key))return!1}return!0}(a,i)||(i.includes("prevent")&&a.preventDefault(),i.includes("stop")&&a.stopPropagation(),i.includes("self")&&a.target!==t))){C(e,r,a,s).then(e=>{!1===e?a.preventDefault():i.includes("once")&&o.removeEventListener(n,c,l)})}}else o.removeEventListener(n,c,l)};if(i.includes("debounce")){let e=i[i.indexOf("debounce")+1]||"invalid-wait",t=E(e.split("ms")[0])?Number(e.split("ms")[0]):250;c=a(c,t)}o.addEventListener(n,c,l)}}function C(e,t,i,r){return e.evaluateCommandExpression(i.target,t,()=>n(n({},r()),{},{$event:i}))}function D(e){switch(e){case"/":return"slash";case" ":case"Spacebar":return"space";default:return e&&e.replace(/([a-z])([A-Z])/g,"$1-$2").replace(/[_\s]/,"-").toLowerCase()}}function j(e,t,n){return"radio"===e.type&&(e.hasAttribute("name")||e.setAttribute("name",n)),(n,i)=>{if(n instanceof CustomEvent&&n.detail)return n.detail;if("checkbox"===e.type){if(Array.isArray(i)){const e=t.includes("number")?T(n.target.value):n.target.value;return n.target.checked?i.concat([e]):i.filter(t=>t!==e)}return n.target.checked}if("select"===e.tagName.toLowerCase()&&e.multiple)return t.includes("number")?Array.from(n.target.selectedOptions).map(e=>{return T(e.value||e.text)}):Array.from(n.target.selectedOptions).map(e=>e.value||e.text);{const e=n.target.value;return t.includes("number")?T(e):t.includes("trim")?e.trim():e}}}function T(e){const t=e?parseFloat(e):null;return E(t)?t:e}const{isArray:L}=Array,{getPrototypeOf:N,create:z,defineProperty:R,defineProperties:F,isExtensible:I,getOwnPropertyDescriptor:M,getOwnPropertyNames:B,getOwnPropertySymbols:U,preventExtensions:q,hasOwnProperty:W}=Object,{push:K,concat:G,map:H}=Array.prototype;function V(e){return void 0===e}function Z(e){return"function"==typeof e}const J=new WeakMap;function Q(e,t){J.set(e,t)}const X=e=>J.get(e)||e;function Y(e,t){return e.valueIsObservable(t)?e.getProxy(t):t}function ee(e,t,n){G.call(B(n),U(n)).forEach(i=>{let r=M(n,i);r.configurable||(r=ue(e,r,Y)),R(t,i,r)}),q(t)}class te{constructor(e,t){this.originalTarget=t,this.membrane=e}get(e,t){const{originalTarget:n,membrane:i}=this,r=n[t],{valueObserved:s}=i;return s(n,t),i.getProxy(r)}set(e,t,n){const{originalTarget:i,membrane:{valueMutated:r}}=this;return i[t]!==n?(i[t]=n,r(i,t)):"length"===t&&L(i)&&r(i,t),!0}deleteProperty(e,t){const{originalTarget:n,membrane:{valueMutated:i}}=this;return delete n[t],i(n,t),!0}apply(e,t,n){}construct(e,t,n){}has(e,t){const{originalTarget:n,membrane:{valueObserved:i}}=this;return i(n,t),t in n}ownKeys(e){const{originalTarget:t}=this;return G.call(B(t),U(t))}isExtensible(e){const t=I(e);if(!t)return t;const{originalTarget:n,membrane:i}=this,r=I(n);return r||ee(i,e,n),r}setPrototypeOf(e,t){}getPrototypeOf(e){const{originalTarget:t}=this;return N(t)}getOwnPropertyDescriptor(e,t){const{originalTarget:n,membrane:i}=this,{valueObserved:r}=this.membrane;r(n,t);let s=M(n,t);if(V(s))return s;const o=M(e,t);return V(o)?((s=ue(i,s,Y)).configurable||R(e,t,s),s):o}preventExtensions(e){const{originalTarget:t,membrane:n}=this;return ee(n,e,t),q(t),!0}defineProperty(e,t,n){const{originalTarget:i,membrane:r}=this,{valueMutated:s}=r,{configurable:o}=n;if(W.call(n,"writable")&&!W.call(n,"value")){const e=M(i,t);n.value=e.value}return R(i,t,function(e){return W.call(e,"value")&&(e.value=X(e.value)),e}(n)),!1===o&&R(e,t,ue(r,n,Y)),s(i,t),!0}}function ne(e,t){return e.valueIsObservable(t)?e.getReadOnlyProxy(t):t}class ie{constructor(e,t){this.originalTarget=t,this.membrane=e}get(e,t){const{membrane:n,originalTarget:i}=this,r=i[t],{valueObserved:s}=n;return s(i,t),n.getReadOnlyProxy(r)}set(e,t,n){return!1}deleteProperty(e,t){return!1}apply(e,t,n){}construct(e,t,n){}has(e,t){const{originalTarget:n,membrane:{valueObserved:i}}=this;return i(n,t),t in n}ownKeys(e){const{originalTarget:t}=this;return G.call(B(t),U(t))}setPrototypeOf(e,t){}getOwnPropertyDescriptor(e,t){const{originalTarget:n,membrane:i}=this,{valueObserved:r}=i;r(n,t);let s=M(n,t);if(V(s))return s;const o=M(e,t);return V(o)?(s=ue(i,s,ne),W.call(s,"set")&&(s.set=void 0),s.configurable||R(e,t,s),s):o}preventExtensions(e){return!1}defineProperty(e,t,n){return!1}}function re(e){let t=void 0;return L(e)?t=[]:"object"==typeof e&&(t={}),t}const se=Object.prototype;function oe(e){if(null===e)return!1;if("object"!=typeof e)return!1;if(L(e))return!0;const t=N(e);return t===se||null===t||null===N(t)}const ae=(e,t)=>{},le=(e,t)=>{},ce=e=>e;function ue(e,t,n){const{set:i,get:r}=t;return W.call(t,"value")?t.value=n(e,t.value):(V(r)||(t.get=function(){return n(e,r.call(X(this)))}),V(i)||(t.set=function(t){i.call(X(this),e.unwrapProxy(t))})),t}class de{constructor(e){if(this.valueDistortion=ce,this.valueMutated=le,this.valueObserved=ae,this.valueIsObservable=oe,this.objectGraph=new WeakMap,!V(e)){const{valueDistortion:t,valueMutated:n,valueObserved:i,valueIsObservable:r}=e;this.valueDistortion=Z(t)?t:ce,this.valueMutated=Z(n)?n:le,this.valueObserved=Z(i)?i:ae,this.valueIsObservable=Z(r)?r:oe}}getProxy(e){const t=X(e),n=this.valueDistortion(t);if(this.valueIsObservable(n)){const i=this.getReactiveState(t,n);return i.readOnly===e?e:i.reactive}return n}getReadOnlyProxy(e){e=X(e);const t=this.valueDistortion(e);return this.valueIsObservable(t)?this.getReactiveState(e,t).readOnly:t}unwrapProxy(e){return X(e)}getReactiveState(e,t){const{objectGraph:n}=this;let i=n.get(t);if(i)return i;const r=this;return i={get reactive(){const n=new te(r,t),i=new Proxy(re(t),n);return Q(i,e),R(this,"reactive",{value:i}),i},get readOnly(){const n=new ie(r,t),i=new Proxy(re(t),n);return Q(i,e),R(this,"readOnly",{value:i}),i}},n.set(t,i),i}}class fe{constructor(e,t=null){this.$el=e;const n=this.$el.getAttribute("x-data"),i=""===n?"{}":n,r=this.$el.getAttribute("x-init");let s={$el:this.$el},o=t?t.$el:this.$el;Object.entries(me.magicProperties).forEach(([e,t])=>{Object.defineProperty(s,`$${e}`,{get:function(){return t(o)}})}),this.unobservedData=t?t.getUnobservedData():l(i,s);let{membrane:a,data:c}=this.wrapDataInObservable(this.unobservedData);var u;this.$data=c,this.membrane=a,this.unobservedData.$el=this.$el,this.unobservedData.$refs=this.getRefsProxy(),this.nextTickStack=[],this.unobservedData.$nextTick=(e=>{this.nextTickStack.push(e)}),this.watchers={},this.unobservedData.$watch=((e,t)=>{this.watchers[e]||(this.watchers[e]=[]),this.watchers[e].push(t)}),Object.entries(me.magicProperties).forEach(([e,t])=>{Object.defineProperty(this.unobservedData,`$${e}`,{get:function(){return t(o)}})}),this.showDirectiveStack=[],this.showDirectiveLastElement,t||me.onBeforeComponentInitializeds.forEach(e=>e(this)),r&&!t&&(this.pauseReactivity=!0,u=this.evaluateReturnExpression(this.$el,r),this.pauseReactivity=!1),this.initializeElements(this.$el),this.listenForNewElementsToInitialize(),"function"==typeof u&&u.call(this.$data),t||setTimeout(()=>{me.onComponentInitializeds.forEach(e=>e(this))},0)}getUnobservedData(){return function(e,t){let n=e.unwrapProxy(t),i={};return Object.keys(n).forEach(e=>{["$el","$refs","$nextTick","$watch"].includes(e)||(i[e]=n[e])}),i}(this.membrane,this.$data)}wrapDataInObservable(e){var t=this;let n=a(function(){t.updateElements(t.$el)},0);return function(e,t){let n=new de({valueMutated(e,n){t(e,n)}});return{data:n.getProxy(e),membrane:n}}(e,(e,i)=>{t.watchers[i]?t.watchers[i].forEach(t=>t(e[i])):Object.keys(t.watchers).filter(e=>e.includes(".")).forEach(n=>{let r=n.split(".");i===r[r.length-1]&&r.reduce((r,s)=>(Object.is(e,r)&&t.watchers[n].forEach(t=>t(e[i])),r[s]),t.getUnobservedData())}),t.pauseReactivity||n()})}walkAndSkipNestedComponents(e,t,n=(()=>{})){!function e(t,n){if(!1===n(t))return;let i=t.firstElementChild;for(;i;)e(i,n),i=i.nextElementSibling}(e,e=>e.hasAttribute("x-data")&&!e.isSameNode(this.$el)?(e.__x||n(e),!1):t(e))}initializeElements(e,t=(()=>{})){this.walkAndSkipNestedComponents(e,e=>void 0===e.__x_for_key&&(void 0===e.__x_inserted_me&&void this.initializeElement(e,t)),e=>{e.__x=new fe(e)}),this.executeAndClearRemainingShowDirectiveStack(),this.executeAndClearNextTickStack(e)}initializeElement(e,t){e.hasAttribute("class")&&d(e,this).length>0&&(e.__x_original_classes=p(e.getAttribute("class"))),this.registerListeners(e,t),this.resolveBoundAttributes(e,!0,t)}updateElements(e,t=(()=>{})){this.walkAndSkipNestedComponents(e,e=>{if(void 0!==e.__x_for_key&&!e.isSameNode(this.$el))return!1;this.updateElement(e,t)},e=>{e.__x=new fe(e)}),this.executeAndClearRemainingShowDirectiveStack(),this.executeAndClearNextTickStack(e)}executeAndClearNextTickStack(e){e===this.$el&&this.nextTickStack.length>0&&requestAnimationFrame(()=>{for(;this.nextTickStack.length>0;)this.nextTickStack.shift()()})}executeAndClearRemainingShowDirectiveStack(){this.showDirectiveStack.reverse().map(e=>new Promise(t=>{e(e=>{t(e)})})).reduce((e,t)=>e.then(()=>t.then(e=>e())),Promise.resolve(()=>{})),this.showDirectiveStack=[],this.showDirectiveLastElement=void 0}updateElement(e,t){this.resolveBoundAttributes(e,!1,t)}registerListeners(e,t){d(e,this).forEach(({type:i,value:r,modifiers:s,expression:o})=>{switch(i){case"on":P(this,e,r,s,o,t);break;case"model":!function(e,t,i,r,s){var o="select"===t.tagName.toLowerCase()||["checkbox","radio"].includes(t.type)||i.includes("lazy")?"change":"input";P(e,t,o,i,`${r} = rightSideOfExpression($event, ${r})`,()=>n(n({},s()),{},{rightSideOfExpression:j(t,i,r)}))}(this,e,s,o,t)}})}resolveBoundAttributes(e,t=!1,n){let i=d(e,this);i.forEach(({type:r,value:o,modifiers:a,expression:l})=>{switch(r){case"model":S(this,e,"value",l,n,r,a);break;case"bind":if("template"===e.tagName.toLowerCase()&&"key"===o)return;S(this,e,o,l,n,r,a);break;case"text":var c=this.evaluateReturnExpression(e,l,n);!function(e,t,n){void 0===t&&n.match(/\./)&&(t=""),e.innerText=t}(e,c,l);break;case"html":!function(e,t,n,i){t.innerHTML=e.evaluateReturnExpression(t,n,i)}(this,e,l,n);break;case"show":c=this.evaluateReturnExpression(e,l,n);!function(e,t,n,i,r=!1){const s=()=>{t.style.display="none"},o=()=>{1===t.style.length&&"none"===t.style.display?t.removeAttribute("style"):t.style.removeProperty("display")};if(!0===r)return void(n?o():s());const a=i=>{n?(("none"===t.style.display||t.__x_transition)&&b(t,()=>{o()},e),i(()=>{})):"none"!==t.style.display?y(t,()=>{i(()=>{s()})},e):i(()=>{})};i.includes("immediate")?a(e=>e()):(e.showDirectiveLastElement&&!e.showDirectiveLastElement.contains(t)&&e.executeAndClearRemainingShowDirectiveStack(),e.showDirectiveStack.push(a),e.showDirectiveLastElement=t)}(this,e,c,a,t);break;case"if":if(i.some(e=>"for"===e.type))return;c=this.evaluateReturnExpression(e,l,n);!function(e,t,n,i,r){s(t,"x-if");const o=t.nextElementSibling&&!0===t.nextElementSibling.__x_inserted_me;if(!n||o&&!t.__x_transition)!n&&o&&y(t.nextElementSibling,()=>{t.nextElementSibling.remove()},e,i);else{const n=document.importNode(t.content,!0);t.parentElement.insertBefore(n,t.nextElementSibling),b(t.nextElementSibling,()=>{},e,i),e.initializeElements(t.nextElementSibling,r),t.nextElementSibling.__x_inserted_me=!0}}(this,e,c,t,n);break;case"for":k(this,e,l,t,n);break;case"cloak":e.removeAttribute("x-cloak")}})}evaluateReturnExpression(e,t,i=(()=>{})){return l(t,this.$data,n(n({},i()),{},{$dispatch:this.getDispatchFunction(e)}))}evaluateCommandExpression(e,t,i=(()=>{})){return function(e,t,n={}){if("function"==typeof e)return Promise.resolve(e.call(t,n.$event));let i=Function;if(i=Object.getPrototypeOf(async function(){}).constructor,Object.keys(t).includes(e)){let i=new Function(["dataContext",...Object.keys(n)],`with(dataContext) { return ${e} }`)(t,...Object.values(n));return"function"==typeof i?Promise.resolve(i.call(t,n.$event)):Promise.resolve()}return Promise.resolve(new i(["dataContext",...Object.keys(n)],`with(dataContext) { ${e} }`)(t,...Object.values(n)))}(t,this.$data,n(n({},i()),{},{$dispatch:this.getDispatchFunction(e)}))}getDispatchFunction(e){return(t,n={})=>{e.dispatchEvent(new CustomEvent(t,{detail:n,bubbles:!0}))}}listenForNewElementsToInitialize(){const e=this.$el;new MutationObserver(e=>{for(let t=0;t<e.length;t++){const n=e[t].target.closest("[x-data]");if(n&&n.isSameNode(this.$el)){if("attributes"===e[t].type&&"x-data"===e[t].attributeName){const n=l(e[t].target.getAttribute("x-data")||"{}",{$el:this.$el});Object.keys(n).forEach(e=>{this.$data[e]!==n[e]&&(this.$data[e]=n[e])})}e[t].addedNodes.length>0&&e[t].addedNodes.forEach(e=>{1!==e.nodeType||e.__x_inserted_me||(!e.matches("[x-data]")||e.__x?this.initializeElements(e):e.__x=new fe(e))})}}}).observe(e,{childList:!0,attributes:!0,subtree:!0})}getRefsProxy(){var e=this;return new Proxy({},{get(t,n){return"$isAlpineProxy"===n||(e.walkAndSkipNestedComponents(e.$el,e=>{e.hasAttribute("x-ref")&&e.getAttribute("x-ref")===n&&(i=e)}),i);var i}})}}const me={version:"2.6.0",pauseMutationObserver:!1,magicProperties:{},onComponentInitializeds:[],onBeforeComponentInitializeds:[],ignoreFocusedForValueBinding:!1,start:async function(){r()||await new Promise(e=>{"loading"==document.readyState?document.addEventListener("DOMContentLoaded",e):e()}),this.discoverComponents(e=>{this.initializeComponent(e)}),document.addEventListener("turbolinks:load",()=>{this.discoverUninitializedComponents(e=>{this.initializeComponent(e)})}),this.listenForNewUninitializedComponentsAtRunTime(e=>{this.initializeComponent(e)})},discoverComponents:function(e){document.querySelectorAll("[x-data]").forEach(t=>{e(t)})},discoverUninitializedComponents:function(e,t=null){const n=(t||document).querySelectorAll("[x-data]");Array.from(n).filter(e=>void 0===e.__x).forEach(t=>{e(t)})},listenForNewUninitializedComponentsAtRunTime:function(e){const t=document.querySelector("body");new MutationObserver(e=>{if(!this.pauseMutationObserver)for(let t=0;t<e.length;t++)e[t].addedNodes.length>0&&e[t].addedNodes.forEach(e=>{1===e.nodeType&&(e.parentElement&&e.parentElement.closest("[x-data]")||this.discoverUninitializedComponents(e=>{this.initializeComponent(e)},e.parentElement))})}).observe(t,{childList:!0,attributes:!0,subtree:!0})},initializeComponent:function(e){if(!e.__x)try{e.__x=new fe(e)}catch(e){setTimeout(()=>{throw e},0)}},clone:function(e,t){t.__x||(t.__x=new fe(t,e))},addMagicProperty:function(e,t){this.magicProperties[e]=t},onComponentInitialized:function(e){this.onComponentInitializeds.push(e)},onBeforeComponentInitialized:function(e){this.onBeforeComponentInitializeds.push(e)}};return r()||(window.Alpine=me,window.deferLoadingAlpine?window.deferLoadingAlpine(function(){window.Alpine.start()}):window.Alpine.start()),me});
         | 
| 8 | 
            -
            //# sourceMappingURL=/sm/54d8acf4bec59c2ac38179fad55c741f03c418f9ea483b114454c0827631f4ba.map
         | 
    
        data/lib/web/style.css
    DELETED
    
    | @@ -1,151 +0,0 @@ | |
| 1 | 
            -
            /* Layout. */
         | 
| 2 | 
            -
            body {
         | 
| 3 | 
            -
              padding: 0.5rem;
         | 
| 4 | 
            -
              background: #C9D2E6;
         | 
| 5 | 
            -
              font-family: 'Roboto', sans-serif;
         | 
| 6 | 
            -
            }
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            .container {
         | 
| 9 | 
            -
              margin: 0 auto;
         | 
| 10 | 
            -
              max-width: 1000px;
         | 
| 11 | 
            -
              padding: 2rem;
         | 
| 12 | 
            -
              background: white;
         | 
| 13 | 
            -
            }
         | 
| 14 | 
            -
             | 
| 15 | 
            -
            /* Header. */
         | 
| 16 | 
            -
            #logo {
         | 
| 17 | 
            -
              display: block;
         | 
| 18 | 
            -
              margin: 0 auto;
         | 
| 19 | 
            -
              max-width: 100px;
         | 
| 20 | 
            -
            }
         | 
| 21 | 
            -
             | 
| 22 | 
            -
            /* Structure */
         | 
| 23 | 
            -
            ul.classes,
         | 
| 24 | 
            -
            ul.methods,
         | 
| 25 | 
            -
            ul.controls,
         | 
| 26 | 
            -
            ul.reflections {
         | 
| 27 | 
            -
              padding-left: 0;
         | 
| 28 | 
            -
            }
         | 
| 29 | 
            -
             | 
| 30 | 
            -
            li.class-container,
         | 
| 31 | 
            -
            li.method-container {
         | 
| 32 | 
            -
              list-style: none;
         | 
| 33 | 
            -
              padding: 1rem;
         | 
| 34 | 
            -
              border: 5px solid #dadcdc;
         | 
| 35 | 
            -
            }
         | 
| 36 | 
            -
             | 
| 37 | 
            -
            /* State. */
         | 
| 38 | 
            -
            .status-row {
         | 
| 39 | 
            -
              width: 100%;
         | 
| 40 | 
            -
              display: flex;
         | 
| 41 | 
            -
              align-items: center;
         | 
| 42 | 
            -
              flex-direction: row;
         | 
| 43 | 
            -
              color: white;
         | 
| 44 | 
            -
              background: #A9B6D2;
         | 
| 45 | 
            -
            }
         | 
| 46 | 
            -
            .status-row.pass {
         | 
| 47 | 
            -
              background: #008C32;
         | 
| 48 | 
            -
            }
         | 
| 49 | 
            -
            .status-row.fail {
         | 
| 50 | 
            -
              background: #D04700;
         | 
| 51 | 
            -
            }
         | 
| 52 | 
            -
             | 
| 53 | 
            -
            /* Buttons. */
         | 
| 54 | 
            -
            .method .buttons {
         | 
| 55 | 
            -
              margin-left: auto;
         | 
| 56 | 
            -
              margin-right: 1rem;
         | 
| 57 | 
            -
            }
         | 
| 58 | 
            -
            .buttons button {
         | 
| 59 | 
            -
              padding: 1rem 2rem;
         | 
| 60 | 
            -
            }
         | 
| 61 | 
            -
             | 
| 62 | 
            -
            /* Stats. */
         | 
| 63 | 
            -
            .class .stats {
         | 
| 64 | 
            -
              margin-left: auto;
         | 
| 65 | 
            -
            }
         | 
| 66 | 
            -
            .stat {
         | 
| 67 | 
            -
              color: #efefef;
         | 
| 68 | 
            -
              font-size: 3.5rem;
         | 
| 69 | 
            -
              font-family: 'Merriweather', serif;
         | 
| 70 | 
            -
            }
         | 
| 71 | 
            -
             | 
| 72 | 
            -
            /* Class. */
         | 
| 73 | 
            -
            .class {
         | 
| 74 | 
            -
              padding: 2rem;
         | 
| 75 | 
            -
              margin-bottom: 1rem;
         | 
| 76 | 
            -
            }
         | 
| 77 | 
            -
            .class:hover {
         | 
| 78 | 
            -
              cursor: pointer;
         | 
| 79 | 
            -
            }
         | 
| 80 | 
            -
            .class h2 {
         | 
| 81 | 
            -
              margin: 0;
         | 
| 82 | 
            -
            }
         | 
| 83 | 
            -
             | 
| 84 | 
            -
            /* Method. */
         | 
| 85 | 
            -
            .method {
         | 
| 86 | 
            -
              padding: 2rem;
         | 
| 87 | 
            -
              margin-left: 1rem;
         | 
| 88 | 
            -
              margin-bottom: 1rem;
         | 
| 89 | 
            -
            }
         | 
| 90 | 
            -
            .method:hover {
         | 
| 91 | 
            -
              cursor: pointer;
         | 
| 92 | 
            -
            }
         | 
| 93 | 
            -
            .method .stat {
         | 
| 94 | 
            -
              font-size: 2.5rem;
         | 
| 95 | 
            -
            }
         | 
| 96 | 
            -
             | 
| 97 | 
            -
            /* Reflection. */
         | 
| 98 | 
            -
            .control,
         | 
| 99 | 
            -
            .reflection {
         | 
| 100 | 
            -
              list-style: none;
         | 
| 101 | 
            -
              margin-left: 2rem;
         | 
| 102 | 
            -
              display: flex;
         | 
| 103 | 
            -
              flex-direction: row;
         | 
| 104 | 
            -
              align-items: center;
         | 
| 105 | 
            -
              background: #EFEFEF;
         | 
| 106 | 
            -
              padding: 0.5rem 1.5rem;
         | 
| 107 | 
            -
              margin-bottom: 0.3rem;
         | 
| 108 | 
            -
            }
         | 
| 109 | 
            -
            .control .time,
         | 
| 110 | 
            -
            .reflection .time {
         | 
| 111 | 
            -
              color: #777777;
         | 
| 112 | 
            -
              margin-right: 2rem;
         | 
| 113 | 
            -
            }
         | 
| 114 | 
            -
             | 
| 115 | 
            -
            .info {
         | 
| 116 | 
            -
              display: flex;
         | 
| 117 | 
            -
              flex-direction: row;
         | 
| 118 | 
            -
              align-items: center;
         | 
| 119 | 
            -
              padding: 0.5rem 1rem;
         | 
| 120 | 
            -
              border: 1px solid #aaa;
         | 
| 121 | 
            -
              border-radius: 5px;
         | 
| 122 | 
            -
            }
         | 
| 123 | 
            -
            .info:not(:last-child) {
         | 
| 124 | 
            -
              margin-right: 0.5rem;
         | 
| 125 | 
            -
            }
         | 
| 126 | 
            -
            .info h4 {
         | 
| 127 | 
            -
              margin: 0;
         | 
| 128 | 
            -
              color: #777777;
         | 
| 129 | 
            -
              font-size: 1.2rem;
         | 
| 130 | 
            -
              font-weight: normal;
         | 
| 131 | 
            -
            }
         | 
| 132 | 
            -
             | 
| 133 | 
            -
            .info-items {
         | 
| 134 | 
            -
              display: flex;
         | 
| 135 | 
            -
              flex-direction: row;
         | 
| 136 | 
            -
            }
         | 
| 137 | 
            -
            .info-item {
         | 
| 138 | 
            -
              padding-left: 1rem;
         | 
| 139 | 
            -
              padding-right: 1rem;
         | 
| 140 | 
            -
              border-right: 1px solid #ccc;
         | 
| 141 | 
            -
            }
         | 
| 142 | 
            -
            .info-item:last-of-type {
         | 
| 143 | 
            -
              padding-right: 0;
         | 
| 144 | 
            -
              border-right: 0;
         | 
| 145 | 
            -
            }
         | 
| 146 | 
            -
            .info-item strong {
         | 
| 147 | 
            -
              padding-bottom: 0.1rem;
         | 
| 148 | 
            -
            }
         | 
| 149 | 
            -
            .info-item pre {
         | 
| 150 | 
            -
              margin: 0;
         | 
| 151 | 
            -
            }
         |