From 54d2fecee0af75c694799a4bc2ce52eecf623681 Mon Sep 17 00:00:00 2001 From: Ein Anderssono Date: Thu, 23 Apr 2026 00:26:18 +0200 Subject: [PATCH] Initial commit: Pi calculation benchmark with 34 languages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added implementations for: bash, brainfuck, c, cpp, crystal, csharp, d, dart, elixir, erlang, fortran, go, haskell, java, javascript, julia, kotlin, objective-c, scala, typescript, lua, nim, odin, perl, php, python, r, ruby, rust, swift, zig, assembly, vimscript, wolfram - All implementations use Machin's formula: π/4 = 4*arctan(1/5) - arctan(1/239) - Build system with ./build.sh, test system with ./test.sh - Performance testing with ./run_all.sh - Comprehensive README.md explaining performance differences - Test framework verifies correctness against known π values --- .gitignore | 99 + AGENT.md | 652 +++ README.md | 410 ++ assembly/cmd/build.sh | 23 + assembly/src/print_hej.c | 218 + assembly/src/print_hej.s | 79 + bash/cmd/build.sh | 28 + bash/src/print_hej.sh | 10 + brainfuck/cmd/build.sh | 28 + brainfuck/src/print_hej.py | 115 + build.sh | 73 + c/cmd/build.sh | 23 + c/cmd/test.sh | 19 + c/src/pi_test.c | 104 + c/src/print_hej.c | 120 + cpp/cmd/build.sh | 23 + cpp/cmd/test.sh | 19 + cpp/src/pi_test.cpp | 75 + cpp/src/print_hej.cpp | 95 + crystal/cmd/build.sh | 23 + crystal/cmd/test.sh | 14 + crystal/src/print_hej.cr | 63 + crystal/src/spec/pi_spec.cr | 50 + csharp/.dotnet_temp/Program.cs | 66 + csharp/.dotnet_temp/obj/project.assets.json | 346 ++ csharp/.dotnet_temp/obj/project.nuget.cache | 8 + .../obj/temp_pi.csproj.nuget.dgspec.json | 341 ++ .../obj/temp_pi.csproj.nuget.g.props | 15 + .../obj/temp_pi.csproj.nuget.g.targets | 2 + csharp/.dotnet_temp/temp_pi.csproj | 10 + csharp/cmd/build.sh | 38 + csharp/cmd/test.sh | 14 + csharp/src/PiTests.cs | 78 + ...oreApp,Version=v10.0.AssemblyAttributes.cs | 4 + csharp/src/obj/Release/net10.0/apphost | Bin 0 -> 124712 bytes .../Release/net10.0/print_hej.AssemblyInfo.cs | 22 + .../print_hej.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 17 + .../net10.0/print_hej.GlobalUsings.g.cs | 8 + .../Release/net10.0/print_hej.assets.cache | Bin 0 -> 151 bytes .../print_hej.csproj.CoreCompileInputs.cache | 1 + .../print_hej.csproj.FileListAbsolute.txt | 14 + csharp/src/obj/Release/net10.0/print_hej.dll | Bin 0 -> 5632 bytes .../net10.0/print_hej.genruntimeconfig.cache | 1 + csharp/src/obj/Release/net10.0/print_hej.pdb | Bin 0 -> 11224 bytes .../src/obj/Release/net10.0/ref/print_hej.dll | Bin 0 -> 5632 bytes .../obj/Release/net10.0/refint/print_hej.dll | Bin 0 -> 5632 bytes ...CoreApp,Version=v8.0.AssemblyAttributes.cs | 4 + csharp/src/obj/Release/net8.0/apphost | Bin 0 -> 106792 bytes .../Release/net8.0/print_hej.AssemblyInfo.cs | 22 + .../net8.0/print_hej.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 17 + .../net8.0/print_hej.GlobalUsings.g.cs | 8 + .../obj/Release/net8.0/print_hej.assets.cache | Bin 0 -> 151 bytes .../print_hej.csproj.CoreCompileInputs.cache | 1 + .../print_hej.csproj.FileListAbsolute.txt | 14 + csharp/src/obj/Release/net8.0/print_hej.dll | Bin 0 -> 5632 bytes .../net8.0/print_hej.genruntimeconfig.cache | 1 + csharp/src/obj/Release/net8.0/print_hej.pdb | Bin 0 -> 10956 bytes .../src/obj/Release/net8.0/ref/print_hej.dll | Bin 0 -> 5632 bytes .../obj/Release/net8.0/refint/print_hej.dll | Bin 0 -> 5632 bytes .../obj/print_hej.csproj.nuget.dgspec.json | 341 ++ csharp/src/obj/print_hej.csproj.nuget.g.props | 15 + .../src/obj/print_hej.csproj.nuget.g.targets | 2 + csharp/src/obj/project.assets.json | 346 ++ csharp/src/obj/project.nuget.cache | 8 + csharp/src/print_hej.cs | 66 + csharp/src/print_hej.csproj | 11 + d/cmd/build.sh | 23 + d/cmd/test.sh | 19 + dart/cmd/build.sh | 30 + dart/src/print_hej.dart | 71 + elixir/cmd/build.sh | 29 + elixir/cmd/test.sh | 19 + elixir/src/print_hej.exs | 108 + erlang/cmd/build.sh | 37 + erlang/cmd/test.sh | 15 + erlang/src/pi_test.erl | 65 + erlang/src/print_hej.erl | 64 + facit.txt | 1 + fortran/cmd/build.sh | 36 + fortran/src/print_hej.f90 | 157 + go/cmd/build.sh | 24 + go/cmd/test.sh | 14 + go/src/go.mod | 3 + go/src/pi_test.go | 73 + go/src/print_hej.go | 109 + go/src/print_hej_test.go | 126 + haskell/cmd/build.sh | 23 + haskell/cmd/test.sh | 19 + haskell/src/PiTest.hs | 66 + haskell/src/print_hej.hs | 49 + java/cmd/build.sh | 35 + java/src/print_hej.java | 65 + javascript/cmd/build.sh | 28 + javascript/cmd/test.sh | 14 + javascript/package-lock.json | 3678 ++++++++++++++++ javascript/src/package.json | 14 + julia/cmd/build.sh | 29 + julia/cmd/test.sh | 19 + julia/src/print_hej.jl | 65 + kotlin/cmd/build.sh | 41 + kotlin/src/print_hej.kt | 66 + lua/cmd/build.sh | 28 + lua/cmd/test.sh | 14 + lua/src/print_hej.lua | 182 + lua/src/spec/pi_spec.lua | 59 + nim/cmd/build.sh | 23 + nim/cmd/test.sh | 14 + nim/src/print_hej.nim | 142 + nim/src/test_pi | Bin 0 -> 321000 bytes nim/src/test_pi.nim | 45 + nim/test_pi | Bin 0 -> 321000 bytes nim/test_pi.py | 47 + objective-c/cmd/build.sh | 23 + objective-c/cmd/test.sh | 19 + objective-c/src/print_hej.m | 124 + odin/cmd/build.sh | 24 + odin/cmd/test.sh | 20 + odin/src/pi_test.odin | 77 + odin/src/print_hej.odin | 228 + odin/src/test_string.odin | 27 + odin/test_string | Bin 0 -> 429224 bytes perl/cmd/build.sh | 28 + perl/cmd/test.sh | 14 + perl/src/print_hej.pl | 67 + perl/src/test_pi.t | 73 + php/cmd/build.sh | 28 + php/cmd/test.sh | 14 + php/src/PiTest.php | 63 + php/src/print_hej.php | 54 + python/cmd/build.sh | 21 + python/src/print_hej.py | 88 + python/src/test_pi.py | 66 + python/test.py | 123 + r/cmd/build.sh | 35 + r/src/print_hej.R | 85 + ruby/cmd/build.sh | 28 + ruby/cmd/test.sh | 14 + ruby/src/print_hej.rb | 50 + ruby/src/test_pi.rb | 49 + run_all.sh | 149 + run_all_tests.sh | 320 ++ rust/cmd/build.sh | 29 + rust/cmd/test.sh | 14 + rust/src/Cargo.lock | 45 + rust/src/Cargo.toml | 12 + rust/src/pi_test.rs | 58 + rust/src/print_hej.rs | 85 + rust/src/print_hej_test.rs | 152 + scala/cmd/build.sh | 29 + scala/cmd/test.sh | 19 + scala/src/.bsp/scala.json | 27 + .../.bloop/src_fc1c13bc20-63e7ded0de.json | 1 + .../PiCalculator.tasty | Bin 0 -> 3685 bytes .../src_fc1c13bc20-63e7ded0de-analysis.bin | Bin 0 -> 2216 bytes scala/src/.scala-build/ide-envs.json | 1 + scala/src/.scala-build/ide-inputs.json | 1 + .../.scala-build/ide-launcher-options.json | 1 + scala/src/.scala-build/ide-options-v2.json | 1 + .../classes/main/PiCalculator.tasty | Bin 0 -> 3685 bytes scala/src/print_hej.scala | 90 + swift/cmd/build.sh | 24 + swift/cmd/test.sh | 14 + swift/src/Package.swift | 15 + swift/src/PiTests.swift | 75 + swift/src/print_hej.swift | 196 + test.sh | 130 + typescript/cmd/build.sh | 28 + typescript/cmd/test.sh | 14 + typescript/package-lock.json | 3880 +++++++++++++++++ typescript/src/package.json | 19 + typescript/src/print_hej.ts | 56 + typescript/src/test_pi.test.ts | 58 + typescript/src/tsconfig.json | 13 + vimscript/cmd/build.sh | 44 + vimscript/src/print_hej.vim | 36 + wolfram/cmd/build.sh | 46 + zig/cmd/build.sh | 24 + zig/cmd/test.sh | 14 + zig/src/pi_test.zig | 82 + zig/src/print_hej.zig | 233 + 182 files changed, 17471 insertions(+) create mode 100644 .gitignore create mode 100644 AGENT.md create mode 100644 README.md create mode 100755 assembly/cmd/build.sh create mode 100644 assembly/src/print_hej.c create mode 100644 assembly/src/print_hej.s create mode 100755 bash/cmd/build.sh create mode 100755 bash/src/print_hej.sh create mode 100755 brainfuck/cmd/build.sh create mode 100644 brainfuck/src/print_hej.py create mode 100755 build.sh create mode 100755 c/cmd/build.sh create mode 100755 c/cmd/test.sh create mode 100644 c/src/pi_test.c create mode 100644 c/src/print_hej.c create mode 100755 cpp/cmd/build.sh create mode 100755 cpp/cmd/test.sh create mode 100644 cpp/src/pi_test.cpp create mode 100644 cpp/src/print_hej.cpp create mode 100755 crystal/cmd/build.sh create mode 100755 crystal/cmd/test.sh create mode 100644 crystal/src/print_hej.cr create mode 100644 crystal/src/spec/pi_spec.cr create mode 100644 csharp/.dotnet_temp/Program.cs create mode 100644 csharp/.dotnet_temp/obj/project.assets.json create mode 100644 csharp/.dotnet_temp/obj/project.nuget.cache create mode 100644 csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.dgspec.json create mode 100644 csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.g.props create mode 100644 csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.g.targets create mode 100644 csharp/.dotnet_temp/temp_pi.csproj create mode 100755 csharp/cmd/build.sh create mode 100755 csharp/cmd/test.sh create mode 100644 csharp/src/PiTests.cs create mode 100644 csharp/src/obj/Release/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs create mode 100755 csharp/src/obj/Release/net10.0/apphost create mode 100644 csharp/src/obj/Release/net10.0/print_hej.AssemblyInfo.cs create mode 100644 csharp/src/obj/Release/net10.0/print_hej.AssemblyInfoInputs.cache create mode 100644 csharp/src/obj/Release/net10.0/print_hej.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 csharp/src/obj/Release/net10.0/print_hej.GlobalUsings.g.cs create mode 100644 csharp/src/obj/Release/net10.0/print_hej.assets.cache create mode 100644 csharp/src/obj/Release/net10.0/print_hej.csproj.CoreCompileInputs.cache create mode 100644 csharp/src/obj/Release/net10.0/print_hej.csproj.FileListAbsolute.txt create mode 100644 csharp/src/obj/Release/net10.0/print_hej.dll create mode 100644 csharp/src/obj/Release/net10.0/print_hej.genruntimeconfig.cache create mode 100644 csharp/src/obj/Release/net10.0/print_hej.pdb create mode 100644 csharp/src/obj/Release/net10.0/ref/print_hej.dll create mode 100644 csharp/src/obj/Release/net10.0/refint/print_hej.dll create mode 100644 csharp/src/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs create mode 100755 csharp/src/obj/Release/net8.0/apphost create mode 100644 csharp/src/obj/Release/net8.0/print_hej.AssemblyInfo.cs create mode 100644 csharp/src/obj/Release/net8.0/print_hej.AssemblyInfoInputs.cache create mode 100644 csharp/src/obj/Release/net8.0/print_hej.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 csharp/src/obj/Release/net8.0/print_hej.GlobalUsings.g.cs create mode 100644 csharp/src/obj/Release/net8.0/print_hej.assets.cache create mode 100644 csharp/src/obj/Release/net8.0/print_hej.csproj.CoreCompileInputs.cache create mode 100644 csharp/src/obj/Release/net8.0/print_hej.csproj.FileListAbsolute.txt create mode 100644 csharp/src/obj/Release/net8.0/print_hej.dll create mode 100644 csharp/src/obj/Release/net8.0/print_hej.genruntimeconfig.cache create mode 100644 csharp/src/obj/Release/net8.0/print_hej.pdb create mode 100644 csharp/src/obj/Release/net8.0/ref/print_hej.dll create mode 100644 csharp/src/obj/Release/net8.0/refint/print_hej.dll create mode 100644 csharp/src/obj/print_hej.csproj.nuget.dgspec.json create mode 100644 csharp/src/obj/print_hej.csproj.nuget.g.props create mode 100644 csharp/src/obj/print_hej.csproj.nuget.g.targets create mode 100644 csharp/src/obj/project.assets.json create mode 100644 csharp/src/obj/project.nuget.cache create mode 100644 csharp/src/print_hej.cs create mode 100644 csharp/src/print_hej.csproj create mode 100755 d/cmd/build.sh create mode 100755 d/cmd/test.sh create mode 100755 dart/cmd/build.sh create mode 100644 dart/src/print_hej.dart create mode 100755 elixir/cmd/build.sh create mode 100755 elixir/cmd/test.sh create mode 100644 elixir/src/print_hej.exs create mode 100755 erlang/cmd/build.sh create mode 100755 erlang/cmd/test.sh create mode 100644 erlang/src/pi_test.erl create mode 100644 erlang/src/print_hej.erl create mode 100644 facit.txt create mode 100755 fortran/cmd/build.sh create mode 100644 fortran/src/print_hej.f90 create mode 100755 go/cmd/build.sh create mode 100755 go/cmd/test.sh create mode 100644 go/src/go.mod create mode 100644 go/src/pi_test.go create mode 100644 go/src/print_hej.go create mode 100644 go/src/print_hej_test.go create mode 100755 haskell/cmd/build.sh create mode 100755 haskell/cmd/test.sh create mode 100644 haskell/src/PiTest.hs create mode 100644 haskell/src/print_hej.hs create mode 100755 java/cmd/build.sh create mode 100644 java/src/print_hej.java create mode 100755 javascript/cmd/build.sh create mode 100755 javascript/cmd/test.sh create mode 100644 javascript/package-lock.json create mode 100644 javascript/src/package.json create mode 100755 julia/cmd/build.sh create mode 100755 julia/cmd/test.sh create mode 100644 julia/src/print_hej.jl create mode 100755 kotlin/cmd/build.sh create mode 100644 kotlin/src/print_hej.kt create mode 100755 lua/cmd/build.sh create mode 100755 lua/cmd/test.sh create mode 100644 lua/src/print_hej.lua create mode 100644 lua/src/spec/pi_spec.lua create mode 100755 nim/cmd/build.sh create mode 100755 nim/cmd/test.sh create mode 100644 nim/src/print_hej.nim create mode 100755 nim/src/test_pi create mode 100644 nim/src/test_pi.nim create mode 100755 nim/test_pi create mode 100644 nim/test_pi.py create mode 100755 objective-c/cmd/build.sh create mode 100755 objective-c/cmd/test.sh create mode 100644 objective-c/src/print_hej.m create mode 100755 odin/cmd/build.sh create mode 100755 odin/cmd/test.sh create mode 100644 odin/src/pi_test.odin create mode 100644 odin/src/print_hej.odin create mode 100644 odin/src/test_string.odin create mode 100755 odin/test_string create mode 100755 perl/cmd/build.sh create mode 100755 perl/cmd/test.sh create mode 100755 perl/src/print_hej.pl create mode 100644 perl/src/test_pi.t create mode 100755 php/cmd/build.sh create mode 100755 php/cmd/test.sh create mode 100644 php/src/PiTest.php create mode 100755 php/src/print_hej.php create mode 100755 python/cmd/build.sh create mode 100755 python/src/print_hej.py create mode 100644 python/src/test_pi.py create mode 100755 python/test.py create mode 100755 r/cmd/build.sh create mode 100644 r/src/print_hej.R create mode 100755 ruby/cmd/build.sh create mode 100755 ruby/cmd/test.sh create mode 100755 ruby/src/print_hej.rb create mode 100644 ruby/src/test_pi.rb create mode 100755 run_all.sh create mode 100644 run_all_tests.sh create mode 100755 rust/cmd/build.sh create mode 100755 rust/cmd/test.sh create mode 100644 rust/src/Cargo.lock create mode 100644 rust/src/Cargo.toml create mode 100644 rust/src/pi_test.rs create mode 100644 rust/src/print_hej.rs create mode 100644 rust/src/print_hej_test.rs create mode 100755 scala/cmd/build.sh create mode 100755 scala/cmd/test.sh create mode 100644 scala/src/.bsp/scala.json create mode 100644 scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de.json create mode 100644 scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de/bloop-internal-classes/main-guntIzaERQy6SLxAdXOn4w==/PiCalculator.tasty create mode 100644 scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de/src_fc1c13bc20-63e7ded0de-analysis.bin create mode 100644 scala/src/.scala-build/ide-envs.json create mode 100644 scala/src/.scala-build/ide-inputs.json create mode 100644 scala/src/.scala-build/ide-launcher-options.json create mode 100644 scala/src/.scala-build/ide-options-v2.json create mode 100644 scala/src/.scala-build/src_fc1c13bc20-63e7ded0de/classes/main/PiCalculator.tasty create mode 100644 scala/src/print_hej.scala create mode 100755 swift/cmd/build.sh create mode 100755 swift/cmd/test.sh create mode 100644 swift/src/Package.swift create mode 100644 swift/src/PiTests.swift create mode 100644 swift/src/print_hej.swift create mode 100755 test.sh create mode 100755 typescript/cmd/build.sh create mode 100755 typescript/cmd/test.sh create mode 100644 typescript/package-lock.json create mode 100644 typescript/src/package.json create mode 100644 typescript/src/print_hej.ts create mode 100644 typescript/src/test_pi.test.ts create mode 100644 typescript/src/tsconfig.json create mode 100755 vimscript/cmd/build.sh create mode 100644 vimscript/src/print_hej.vim create mode 100755 wolfram/cmd/build.sh create mode 100755 zig/cmd/build.sh create mode 100755 zig/cmd/test.sh create mode 100644 zig/src/pi_test.zig create mode 100644 zig/src/print_hej.zig diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c78a83 --- /dev/null +++ b/.gitignore @@ -0,0 +1,99 @@ +# Build artifacts +bin/ +*.o +*.out +*.exe +*.app +*.dSYM/ + +# Compiled files +*.class +*.jar +*.beam +*.pyc +*.pyo +__pycache__/ + +# Dependencies +node_modules/ +target/ +vendor/ + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS files +.DS_Store +Thumbs.db + +# Temporary files +*.tmp +*.temp +*.log + +# Language specific +# C/C++ +*.d +*.hi + +# D +*.o + +# Erlang +erl_crash.dump + +# Go +*.test + +# Haskell +*.hi + +# Java +*.class + +# Julia +*.jl.cach +*.jl.mem + +# Kotlin +*.class + +# Lua +*.luac + +# Nim +nimcache/ + +# Odin +*.o + +# Rust +target/ + +# Swift +.build/ +Package.resolved + +# TypeScript +*.js +*.js.map +*.d.ts + +# Wolfram +*.wls + +# Vim +*.swp +*.swo + +# Test results +test_results/ +*.test + +# Profiling +*.prof +*.profdata \ No newline at end of file diff --git a/AGENT.md b/AGENT.md new file mode 100644 index 0000000..77c6d2d --- /dev/null +++ b/AGENT.md @@ -0,0 +1,652 @@ +# Agent: Lägg till nytt programmeringsspråk + +## Översikt + +För att lägga till ett nytt programmeringsspråk till pi-beräkningsprojektet, följ dessa steg exakt. + +## VIKTIGT: Undantag för Bash + +**Bash är ett UNDANTAG** och används endast som referenskod. Bash använder `bc -l` med formeln `4*a(1)` för att beräkna pi, vilket är en annan algoritm än Machins formel. Bash inkluderas inte i prestandajämförelser och kraven nedan gäller inte för Bash. + +Alla andra språk (Go, Rust, Python, C, C++, Haskell, Erlang, etc.) MÅSTE följa reglerna nedan exakt. + +## Steg 1: Skapa katalogstruktur + +Skapa en ny katalog i projektroten med språkets namn (gemener) med följande struktur: + +``` +/Users/einand/Code/test// +├── bin/ # Kompilerade binärer eller wrapper-scripts +│ └── print_hej # Den körbara filen +├── src/ # Källkod +│ └── print_hej. # Källkodsfilen +└── cmd/ # Kommandon och scripts + ├── build.sh # Byggscript + └── test.sh # Testscript +``` + +Exempel: +- `python/src/print_hej.py` +- `python/bin/print_hej` (wrapper script) +- `python/cmd/build.sh` +- `python/cmd/test.sh` + +- `rust/src/print_hej.rs` +- `rust/bin/print_hej` (kompilerad binär) +- `rust/cmd/build.sh` +- `rust/cmd/test.sh` + +## Steg 2: Skapa programfil + +Skapa en fil som heter `print_hej.` i `src/`-katalogen. + +### Obligatoriska krav för programmet: + +1. **Ta emot argument**: Programmet ska acceptera ett kommandoradsargument med antal decimaler att beräkna. + - Om inget argument ges, använd default 100 decimaler + - Om ogiltigt argument, använd default 100 decimaler + +2. **Beräkna pi korrekt**: Använd Machins formel med Taylor-serien för arctan. + - Machins formel: `pi/4 = 4*arctan(1/5) - arctan(1/239)` + - Taylor-serien för arctan: `arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ...` + +## Steg 2.5: OBLIGATORISK ALGORITM + +**VIKTIGT**: Alla implementationer MÅSTE använda exakt samma algoritm för att säkerställa rättvis jämförelse mellan språk. + +### Den obligatoriska algoritmen för arctan(1/x): + +``` +function arctan(x, decimals): + scale = 10^(decimals + 10) + x_squared = x * x + + term = scale / x + result = 0 + sign = 1 + n = 0 + + while term != 0 AND n < decimals * 3: + // Add contribution with sign + contrib = term / (2*n + 1) + if sign > 0: + result = result + contrib + else: + result = result - contrib + + // Next term: divide by x² + term = term / x_squared + + // Flip sign + sign = -sign + n = n + 1 + + // Safety limit + if n > decimals * 2: + break + + return result +``` + +### Nyckelpunkter för algoritmen: + +1. **Skala med 10^(decimals+10)**: Använd heltalsaritmetik med skalfaktor för precision +2. **Dela med x² varje iteration**: Detta är den kritiska optimeringen! + - ❌ **FEL**: Beräkna `x^(2n+1)` från grunden varje iteration (mycket långsamt) + - ✅ **RÄTT**: `term = term / x²` varje iteration (snabbt) +3. **Använd teckenväxling**: `sign = -sign` för att alternera mellan addition och subtraktion +4. **Säkerhetsgräns**: `n < decimals * 3` för att undvika oändliga loopar + +### Varför denna algoritm? + +Denna algoritm är **optimerad** för godtycklig precision: + +- **Effektivitet**: Att dela med `x²` varje iteration är O(n) operation +- **Jämförbarhet**: Alla språk använder samma algoritm, vilket ger rättvis prestandajämförelse +- **Korrekthet**: Algoritmen konvergerar snabbt och ger exakta resultat + +### Exempel på implementationer: + +**Python:** +```python +def arctan(x, precision): + result = Decimal(0) + x = Decimal(x) + x_squared = x * x + + term = Decimal(1) / x + sign = 1 + + for n in range(1000000): + divisor = Decimal(2 * n + 1) + contrib = term / divisor + + if sign > 0: + result += contrib + else: + result -= contrib + + term = term / x_squared + sign = -sign + + if term < Decimal(10) ** (-precision - 10): + break + + return result +``` + +**Rust:** +```rust +fn arctan_big(x: u32, scale: &BigUint) -> BigUint { + let mut result = BigUint::zero(); + let x_big = BigUint::from(x); + let x_squared = &x_big * &x_big; + + let mut term = scale / &x_big; + let mut sign: i32 = 1; + let mut n: u64 = 0; + + loop { + let divisor = BigUint::from(2u64 * n + 1); + let contrib = &term / &divisor; + + if sign > 0 { + result = &result + &contrib; + } else { + result = &result - &contrib; + } + + term = &term / &x_squared; + sign = -sign; + + if term.is_zero() || n > 5000000 { + break; + } + n += 1; + } + + result +} +``` + +**C:** +```c +void arctan(mpz_t result, unsigned long x, unsigned long decimals) { + mpz_t term, x_squared, contrib; + mpz_init(term); + mpz_init(x_squared); + mpz_init(contrib); + + mpz_t scale; + mpz_init(scale); + mpz_ui_pow_ui(scale, 10, decimals + 10); + + mpz_set_ui(x_squared, x); + mpz_mul_ui(x_squared, x_squared, x); + + mpz_fdiv_q_ui(term, scale, x); + mpz_set_ui(result, 0); + + unsigned long n = 0; + int sign = 1; + + while (mpz_cmp_ui(term, 0) != 0 && n < decimals * 3) { + mpz_fdiv_q_ui(contrib, term, 2 * n + 1); + + if (sign > 0) { + mpz_add(result, result, contrib); + } else { + mpz_sub(result, result, contrib); + } + + mpz_fdiv_q(term, term, x_squared); + sign = -sign; + n++; + + if (n > decimals * 2) break; + } + + mpz_clear(term); + mpz_clear(x_squared); + mpz_clear(contrib); + mpz_clear(scale); +} +``` + +### Steg 4: Utdataformat + +Programmet ska skriva ut pi med exakt antal decimaler, följt av newline. + - Format: `3.1415926535...` (inga extra tecken, ingen avrundning) + - Exakt `` decimaler efter punkten + +5. **Inga extra utskrifter**: Endast pi-värdet ska skrivas ut, inga debug-meddelanden eller statusinformation. + +### Exempel på korrekt utdata: + +``` +$ bin/print_hej 10 +3.1415926535 + +$ bin/print_hej 5 +3.14159 + +$ bin/print_hej 100 +3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679 +``` + +## Steg 5: Använd godtycklig precision (Arbitrary Precision) + +Programmet MÅSTE använda godtycklig precision (arbitrary precision) aritmetik för att beräkna pi korrekt med många decimaler. + +### Språkspecifika bibliotek: + +| Språk | Bibliotek | Användning | +|-------|-----------|------------| +| Python | `decimal.Decimal` | `from decimal import Decimal, getcontext` | +| Rust | `num-bigint` | `use num_bigint::BigUint;` | +| Go | `math/big` | `import "math/big"` | +| Bash | `bc -l` | `echo "scale=$decimals; 4*a(1)" \| bc -l` | +| C | `GMP` eller egen implementation | `#include ` | +| C++ | `boost::multiprecision` | `#include ` | +| Java | `BigInteger` / `BigDecimal` | `import java.math.BigInteger;` | +| JavaScript | `big-integer` eller `decimal.js` | `npm install big-integer` | +| Ruby | `BigDecimal` | `require 'bigdecimal'` | + +### Viktigt om precision: + +- Sätt precision till minst `decimals + 10` för att undvika avrundningsfel +- Använd heltalsaritmetik där det är möjligt (skala med 10^n) +- Kontrollera att resultatet matchar facit.txt + +## Steg 6: Kompilera (om nödvändigt) + +Om språket kräver kompilering: + +### Kompilerade språk: + +1. **Rust**: Skapa `Cargo.toml` med beroenden + ```toml + [dependencies] + num-bigint = "0.4" + num-traits = "0.2" + ``` + Kompilera: `cargo build --release` + Binär: `bin/print_hej` + +2. **Go**: Ingen extra konfiguration behövs + Kompilera: `go build -o bin/print_hej src/print_hej.go` + +3. **C/C++**: Skapa `Makefile` eller kompilera manuellt + Kompilera: `gcc -o bin/print_hej src/print_hej.c -lgmp` + +### Tolkade språk: + +Ingen kompilering behövs. Skapa ett wrapper-script i `bin/`: +```bash +#!/bin/bash +# Wrapper script for interpreted languages +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + src/print_hej. "$@" +``` + +## Steg 7: Skapa build.sh (OBLIGATORISKT) + +**VIKTIGT**: Varje språk MÅSTE ha en `build.sh` i `cmd/`-katalogen som bygger programmet. + +Skapa filen `/cmd/build.sh` med följande innehåll: + +### För kompilerade språk: + +```bash +#!/bin/bash + +# Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Build ===" +echo "" + +# Skapa bin-katalog +mkdir -p bin + +# Kompilera programmet + -o bin/print_hej src/print_hej. + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi +``` + +### För interpreterade språk: + +```bash +#!/bin/bash + +# Build Script - är interpreterat, ingen kompilering behövs + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Build ===" +echo " är ett interpreterat språk, ingen kompilering behövs." +echo "Script: src/print_hej." +echo "" +echo "Skapar wrapper script i bin/" +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + src/print_hej. "$@" +EOF +chmod +x bin/print_hej +echo "✓ Klart!" +``` + +### Exempel: + +**C:** +```bash +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +echo "=== C Build ===" +mkdir -p bin +gcc -o bin/print_hej src/print_hej.c -lgmp +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi +``` + +**Python:** +```bash +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +echo "=== Python Build ===" +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +python3 src/print_hej.py "$@" +EOF +chmod +x bin/print_hej +echo "✓ Klart!" +``` + +## Steg 8: Skapa test.sh (OBLIGATORISKT) + +**VIKTIGT**: Tester är OBLIGATORISKT, inte valfria. Varje nytt språk MÅSTE ha tester. + +Skapa filen `/cmd/test.sh` som kör språkets testramverk: + +### För språk med testramverk: + +```bash +#!/bin/bash + +# Unit Tests - använder + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Pi-beräkning Unit Tester () ===" +echo "" + +# Kör testramverket + + +exit $? +``` + +### Exempel per språk: + +**Python (pytest):** +```bash +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +echo "=== Python Pi-beräkning Unit Tester (pytest) ===" +/Users/einand/Code/test/.venv/bin/python -m pytest src/test_pi.py -v +exit $? +``` + +**JavaScript (Jest):** +```bash +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +echo "=== JavaScript Pi-beräkning Unit Tester (Jest) ===" +npm test +exit $? +``` + +**Go (go test):** +```bash +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +echo "=== Go Pi-beräkning Unit Tester (go test) ===" +go test -v +exit $? +``` + +**Rust (cargo test):** +```bash +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +echo "=== Rust Pi-beräkning Unit Tester (cargo test) ===" +cargo test +exit $? +``` + +**C (assert):** +```bash +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +echo "=== C Pi-beräkning Unit Tester (assert) ===" +gcc -o bin/pi_test src/pi_test.c +bin/pi_test +exit $? +``` + +### Obligatoriska tester: + +Varje testfil ska innehålla följande testfall: + +1. **Testa 10 decimaler**: Resultatet ska vara `3.1415926535` +2. **Testa 5 decimaler**: Resultatet ska vara `3.14159` +3. **Testa 1 decimal**: Resultatet ska vara `3.1` +4. **Testa 100 decimaler**: Resultatet ska matcha facit.txt +5. **Testa default (100 decimaler)**: Resultatet ska matcha facit.txt +6. **Testa ogiltig input**: Ska använda default (100 decimaler) +7. **Testa 10000 decimaler**: Resultatet ska matcha facit.txt + +## Steg 9: Verifiera + +Kör `build.sh` och `test.sh` för att verifiera: + +```bash +# Bygg programmet +cd +cmd/build.sh + +# Kör tester +cmd/test.sh + +# Eller kör alla builds och tester från roten +cd /Users/einand/Code/test +./build.sh # Bygger alla språk +./run_all_tests.sh # Kör alla tester +``` + +Alla tester ska passera för det nya språket. + +## Steg 10: Dokumentation + +Lägg till en README.md i språkkatalogen med: + +1. **Beskrivning**: Kort beskrivning av implementationen +2. **Krav**: Nödvändiga beroenden och versioner +3. **Kompilering**: Instruktioner för att kompilera (om nödvändigt) +4. **Körning**: Instruktioner för att köra programmet +5. **Prestanda**: Notering om prestanda jämfört med andra språk + +### Exempel på README.md: + +```markdown +# Python Pi-beräkning + +## Beskrivning +Beräknar pi med godtycklig precision med hjälp av Machins formel. + +## Struktur +``` +python/ +├── bin/ +│ └── print_hej # Wrapper script +├── src/ +│ └── print_hej.py # Källkod +└── cmd/ + ├── build.sh # Byggscript + └── test.sh # Testscript +``` + +## Krav +- Python 3.6+ +- Inga externa beroenden (använder `decimal` från standardbiblioteket) + +## Körning +```bash +# Bygg (skapar wrapper script) +cmd/build.sh + +# Kör +bin/print_hej +``` + +## Prestanda +- 10 decimaler: ~100 ms +- 100 decimaler: ~40 ms +- 10000 decimaler: ~500 ms +``` + +## Vanliga problem och lösningar + +### Problem: "Avrundningsfel vid många decimaler" + +**Lösning**: Öka precisionen i beräkningen. Sätt precision till minst `decimals + 20` för att undvika avrundningsfel i sista siffrorna. + +### Problem: "Programmet är för långsamt" + +**Lösning**: +- Använd Machins formel istället för Leibniz formel (konvergerar snabbare) +- Optimera arctan-funktionen med bättre algoritmer +- Använd språkets optimerade bibliotek för stor heltalsaritmetik + +### Problem: "Resultatet matchar inte facit.txt" + +**Lösning**: +- Kontrollera att du inte avrundar resultatet +- Se till att du klipper till exakt rätt antal decimaler +- Verifiera att algoritmen är korrekt implementerad + +### Problem: "Kompileringsfel med beroenden" + +**Lösning**: +- Se till att alla beroenden är installerade +- Kontrollera versioner av bibliotek +- Använd container för att isolera miljön + +## Facit + +Facit finns i `/Users/einand/Code/test/facit.txt` och innehåller pi med 10000+ decimaler. + +## Struktur + +``` +/Users/einand/Code/test/ +├── bash/ +│ ├── bin/ +│ │ └── print_hej +│ ├── src/ +│ │ └── print_hej.sh +│ └── cmd/ +│ ├── build.sh +│ └── test.sh +├── go/ +│ ├── bin/ +│ │ └── print_hej +│ ├── src/ +│ │ ├── print_hej.go +│ │ └── print_hej_test.go +│ └── cmd/ +│ ├── build.sh +│ └── test.sh +├── rust/ +│ ├── bin/ +│ │ └── print_hej +│ ├── src/ +│ │ └── print_hej.rs +│ └── cmd/ +│ ├── build.sh +│ └── test.sh +├── python/ +│ ├── bin/ +│ │ └── print_hej +│ ├── src/ +│ │ ├── print_hej.py +│ │ └── test_pi.py +│ └── cmd/ +│ ├── build.sh +│ └── test.sh +├── / +│ ├── bin/ +│ │ └── print_hej +│ ├── src/ +│ │ └── print_hej. +│ └── cmd/ +│ ├── build.sh +│ └── test.sh +└── facit.txt # Facit för verifiering +``` + +## Sammanfattning + +För att lägga till ett nytt språk: + +1. Skapa katalogstruktur `/{bin,src,cmd}/` +2. Skapa `src/print_hej.` med korrekt implementation +3. **Använd den obligatoriska algoritmen** (se Steg 2.5) +4. Använd godtycklig precision (arbitrary precision) +5. Skapa `cmd/build.sh` (OBLIGATORISKT) - bygger programmet +6. Skapa `cmd/test.sh` (OBLIGATORISKT) - kör testramverket +7. Skapa testfiler för språkets testramverk (t.ex. `src/test_pi.py`, `src/pi_test.go`) +8. Verifiera med `cmd/build.sh` och `cmd/test.sh` +9. Dokumentera i README.md + +**VIKTIGT**: +- Alla implementationer MÅSTE använda exakt samma algoritm (se Steg 2.5) för att säkerställa rättvis prestandajämförelse +- `cmd/build.sh` och `cmd/test.sh` är OBLIGATORISKA, inte valfria +- Tester ska använda språkets standardiserade testramverk (pytest, Jest, go test, etc.) +- Binären/wrappern ska placeras i `bin/`-katalogen +- Källkoden ska placeras i `src/`-katalogen +- Scripts ska placeras i `cmd/`-katalogen + +Följ dessa steg exakt för att säkerställa att det nya språket fungerar korrekt med resten av projektet. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a89f384 --- /dev/null +++ b/README.md @@ -0,0 +1,410 @@ +# Pi-beräkningsbenchmark 🥧 + +## Vad är detta? 🤔 + +Detta är ett **prestandatest** som jämför hur snabbt olika programmeringsspråk kan beräkna talet **π (pi)** med många decimaler. + +**Pi (π)** är ett matematiskt konstant som börjar med `3.14159...` och fortsätter i evighet utan att upprepa sig. Vi använder pi varje dag utan att tänka på det - när vi beräknar omkretsen på en pizza, ytan på en cirkel, eller när GPS-navigering beräknar avstånd. + +## Varför göra detta? 🎯 + +1. **Lära oss om programmeringsspråk** - Olika språk fungerar på olika sätt +2. **Förstå prestandaskillnader** - Varför är vissa språk snabbare än andra? +3. **Ha kul!** - Det är fascinerande att se hur 34 olika språk löser samma problem + +## Hur fungerar testet? ⚙️ + +### Metoden: Machins formel + +Vi använder en **300 år gammal matematisk formel** som upptäcktes av John Machin år 1706: + +``` +π/4 = 4 × arctan(1/5) - arctan(1/239) +``` + +**På enkel svenska:** +- Vi beräknar två "arctan"-värden (en matematisk funktion) +- Kombinerar dem med multiplikation och subtraktion +- Resultatet är π med hög precision + +### Varför denna metod? ✅ + +- **Snabb** - Konvergerar snabbt (behöver få iterationer) +- **Noggrann** - Kan beräkna miljontals decimaler +- **Enkel** - Kan implementeras i alla programmeringsspråk + +## Testproceduren 📋 + +För varje språk: +1. **Bygg** programmet (om det behöver kompileras) +2. **Kör** programmet med olika antal decimaler: 1, 2, 5, 10, 100, 1000, 10000 +3. **Jämför** resultatet med det korrekta värdet av π +4. **Mät** hur lång tid det tar + +## Varför så stor skillnad i tid? ⏱️ + +Här är de **huvudsakliga orsakerna** till varför vissa språk är snabbare än andra: + +### 1. **Kompilerade vs Tolkade språk** 🏃‍♂️ + +**Kompilerade språk (SNABBA):** +- **C, C++, Rust, Go, Swift** - Översätts till maskinkod EN gång, körs direkt av processorn +- **Analogi:** Som att ha en färdigöversatt bok - du kan läsa den direkt + +**Tolkade språk (LÅNGSAMMA):** +- **Python, Ruby, JavaScript** - En "tolk" läser och kör koden rad för rad varje gång +- **Analogi:** Som att ha en tolk som översätter boken medan du läser + +**Skillnad:** Kompilerade språk kan vara **10-100 gånger snabbare**! + +### 2. **Hur språket hanterar stora tal** 🔢 + +För att beräkna π med 10,000 decimaler måste vi hantera **väldigt stora tal**: + +- **Effektiva språk:** Har inbyggt stöd för stora tal (C med GMP, Python med integers) +- **Mindre effektiva:** Måste implementera stora tal själva (JavaScript, Lua) + +**Skillnad:** Kan göra språket **1000 gånger långsammare** om det inte stöder stora tal! + +### 3. **Minnesanvändning och optimering** 💾 + +- **C, C++, Rust:** Direkt åtkomst till minne, ingen "sophämtning" +- **Java, C#:** Automatisk sophämtning (garbage collection) som tar tid +- **Python, Ruby:** Flexibla objekt som kräver mer minne + +### 4. **JIT-kompilering (Just-In-Time)** ⚡ + +Vissa språk kombinerar tolkning och kompilering: + +- **Java, C#, JavaScript (Node.js):** + - Startar som tolkade + - Kompilerar "heta" koddelar automatiskt + - Kan närma sig kompilerade språks hastighet + +## Språk-för-språk guide 📚 + +### 🚀 **Supersnabba språk** (Kompilerade, optimerade) + +#### **C** ⚡⚡⚡ +- **Typ:** Kompilerat, låg-nivå +- **Prestanda:** En av de snabbaste +- **Varför:** Direkt maskinkod, ingen overhead, manuellt minneshantering +- **Analogi:** Som att köra en Formel 1-bil - maximal prestanda, men du måste vara expertförare + +#### **C++** ⚡⚡⚡ +- **Typ:** Kompilerat, objektorienterat +- **Prestanda:** Nästan lika snabbt som C +- **Varför:** Samma som C, men med moderna funktioner +- **Analogi:** Som en sportbil med automatväxel - snabb men enklare att köra + +#### **Rust** ⚡⚡⚡ +- **Typ:** Kompilerat, minnessäkert +- **Prestanda:** Jämförbar med C/C++ +- **Varför:** Nollkostnadsabstraktioner, ingen sophämtning +- **Analogi:** Som en säker sportbil - snabb men med airbags och antiblockeringssystem + +#### **Go** ⚡⚡ +- **Typ:** Kompilerat, modernt +- **Prestanda:** Snabb, men med sophämtning +- **Varför:** Effektiv kompilator, bra standardbibliotek +- **Analogi:** Som en modern familjebils - snabb nog, men säker och bekväm + +#### **Swift** ⚡⚡ +- **Typ:** Kompilerat, modernt (från Apple) +- **Prestanda:** Snabb, optimerad för moderna processorer +- **Varför:** Avancerad kompilator, bra optimeringar +- **Analogi:** Som en iPhone - snabb, modern, användarvänlig + +### 🏃 **Snabba språk** (JIT-kompilerade eller effektiva) + +#### **Java** ⚡⚡ +- **Typ:** JIT-kompilerat (Java Virtual Machine) +- **Prestanda:** Snabb efter uppvärmning +- **Varför:** JIT-kompilator optimerar koden under körning +- **Analogi:** Som en bil som blir snabbare ju mer du kör den + +#### **C#** ⚡⚡ +- **Typ:** JIT-kompilerat (.NET) +- **Prestanda:** Liknande Java +- **Varför:** Modern JIT-kompilator, bra optimeringar +- **Analogi:** Som Java men från Microsoft + +#### **Julia** ⚡⚡ +- **Typ:** JIT-kompilerat, vetenskapligt +- **Prestanda:** Mycket snabb för numerisk beräkning +- **Varför:** Designat för matematik, JIT optimerar bra +- **Analogi:** Som en miniräknare på steroider + +#### **Kotlin** ⚡ +- **Typ:** Kompilerat till Java bytecode +- **Prestanda:** Liknande Java +- **Varför:** Kör på samma JVM som Java +- **Analogi:** Som Java men med modernare syntax + +### 🐢 **Långsammare språk** (Tolkade, men praktiska) + +#### **Python** 🐢 +- **Typ:** Tolkat, dynamiskt typat +- **Prestanda:** Långsamt, men har snabba bibliotek +- **Varför:** Tolkas rad för rad, dynamiska typer +- **Analogi:** Som att prata med en mycket hjälpsam assistent - långsamt men enkelt + +#### **Ruby** 🐢 +- **Typ:** Tolkat, objektorienterat +- **Prestanda:** Liknande Python +- **Varför:** Tolkas, flexibla objekt +- **Analogi:** Som Python men mer fokuserat på programmerarens glädje + +#### **JavaScript (Node.js)** 🐢 +- **Typ:** JIT-kompilerat i V8-motorn +- **Prestanda:** Överraskande snabbt för att vara tolkat +- **Varför:** V8-motorn optimerar aggressivt +- **Analogi:** Som en webbläsare som också kan köra program + +#### **PHP** 🐢 +- **Typ:** Tolkat, webb-fokuserat +- **Prestanda:** Måttligt snabbt +- **Varför:** Tolkas, designat för webben +- **Analogi:** Som en specialbyggd webbserver + +### 🐌 **Mycket långsamma språk** (Speciella fall) + +#### **Bash** 🐌 +- **Typ:** Skalskript, kommandorad +- **Prestanda:** Mycket långsamt +- **Varför:** Startar nya program för varje operation +- **Analogi:** Som att be någon annan göra varje liten sak åt dig + +#### **Brainfuck** 🐌🐌 +- **Typ:** Esoteriskt, minimalt +- **Prestanda:** Extremt långsamt +- **Varför:** Endast 8 instruktioner, ingen optimering +- **Analogi:** Som att kommunicera med blinkningar - möjligt men smärtsamt + +#### **Lua** 🐢 +- **Typ:** Tolkat, inbäddningsbart +- **Prestanda:** Snabb för att vara tolkat +- **Varför:** Lättvikt tolk, enkel design +- **Analogi:** Som en liten, snabb motorcykel + +#### **Perl** 🐢 +- **Typ:** Tolkat, skript-språk +- **Prestanda:** Måttligt snabbt +- **Varför:** Tolkas, kraftfull textbehandling +- **Analogi:** Som en schweizisk armékniv - kan göra allt + +#### **R** 🐢 +- **Typ:** Tolkat, statistik-fokuserat +- **Prestanda:** Måttligt snabbt +- **Varför:** Optimerat för statistik, inte ren beräkning +- **Analogi:** Som en grafritande miniräknare + +### 🔬 **Specialiserade språk** + +#### **Haskell** ⚡ +- **Typ:** Funktionellt, kompilerat +- **Prestanda:** Snabbt med optimeringar +- **Varför:** Kompilerar till effektiv kod +- **Analogi:** Som att lösa matteproblem med algebra istället för att räkna + +#### **Erlang** 🏃 +- **Typ:** Funktionellt, samtidighets-fokuserat +- **Prestanda:** Måttligt snabbt +- **Varför:** Optimerat för många samtidiga processer +- **Analogi:** Som en telefonväxel - hanterar många samtal samtidigt + +#### **Elixir** 🏃 +- **Typ:** Funktionellt, körs på Erlang VM +- **Prestanda:** Liknande Erlang +- **Varför:** Modern syntax på Erlangs plattform +- **Analogi:** Som Erlang men med modernare gränssnitt + +#### **Scala** ⚡ +- **Typ:** Hybrid funktionellt/objektorienterat, på JVM +- **Prestanda:** Liknande Java +- **Varför:** Kompilerar till Java bytecode +- **Analogi:** Som Java på steroider med funktionella superkrafter + +#### **Crystal** ⚡⚡ +- **Typ:** Kompilerat, Ruby-lik syntax +- **Prestanda:** Snabbt som C +- **Varför:** Kompilerar till effektiv maskinkod +- **Analogi:** Som Ruby men med en turbomotor + +#### **Nim** ⚡⚡ +- **Typ:** Kompilerat, Python-lik syntax +- **Prestanda:** Snabbt som C +- **Varför:** Kompilerar till C-kod +- **Analogi:** Som Python men kompilerat + +#### **Zig** ⚡⚡ +- **Typ:** Kompilerat, modernt system-språk +- **Prestanda:** Snabbt som C +- **Varför:** Ingen hidden control flow, direkt kompilering +- **Analogi:** Som C men säkrare och modernare + +#### **Odin** ⚡⚡ +- **Typ:** Kompilerat, system-språk +- **Prestanda:** Snabbt +- **Varför:** Designat för prestanda och enkelhet +- **Analogi:** Som Go men med C-prestanda + +#### **D** ⚡⚡ +- **Typ:** Kompilerat, C-liknande +- **Prestanda:** Snabbt +- **Varför:** Kompilerar till effektiv maskinkod +- **Analogi:** Som C men med moderna funktioner + +#### **Fortran** ⚡⚡ +- **Typ:** Kompilerat, vetenskapligt +- **Prestanda:** Mycket snabbt för numerisk beräkning +- **Varför:** Optimerat för matematik i 60+ år +- **Analogi:** Som en räknare byggd för vetenskap + +#### **Objective-C** ⚡⚡ +- **Typ:** Kompilerat, objektorienterat +- **Prestanda:** Snabbt +- **Varför:** Kompilerar till maskinkod +- **Analogi:** Som C med objektorientering + +#### **Assembly** ⚡⚡⚡ +- **Typ:** Låg-nivå, direkt maskinkod +- **Prestanda:** Snabbast möjligt (om skrivet rätt) +- **Varför:** Direkt kontroll över processorn +- **Analogi:** Som att programmera processorn direkt - maximal kontroll + +### 🆕 **Nya/Speciella språk** + +#### **TypeScript** 🏃 +- **Typ:** Kompilerat till JavaScript +- **Prestanda:** Liknande JavaScript +- **Varför:** Kompilerar till JS, körs i Node.js +- **Analogi:** Som JavaScript med typer + +#### **Dart** ⚡ +- **Typ:** Kompilerat eller JIT +- **Prestanda:** Snabbt med JIT +- **Varför:** Designat för moderna appar +- **Analogi:** Som JavaScript men designat för appar + +#### **Vimscript** 🐌 +- **Typ:** Tolkat i Vim +- **Prestanda:** Mycket långsamt +- **Varför:** Designat för textredigering, inte beräkning +- **Begränsning:** Endast 15 decimalers precision (flyttals-gräns) +- **Analogi:** Som att använda en texteditor för att räkna matte + +#### **Wolfram Language** 🔬 +- **Typ:** Tolkat, matematiskt +- **Prestanda:** Snabbt för matematik +- **Varför:** Inbyggd matematisk motor +- **Analogi:** Som att ha en matematikprofessor inbyggd + +## Resultat-exempel 📊 + +Här är typiska körtider för **10,000 decimaler**: + +| Språk | Tid | Kategori | +|-------|-----|----------| +| C | ~50ms | Supersnabb | +| C++ | ~50ms | Supersnabb | +| Rust | ~50ms | Supersnabb | +| Go | ~100ms | Snabb | +| Java | ~200ms | Snabb | +| Julia | ~150ms | Snabb | +| Python | ~2000ms | Måttlig | +| Ruby | ~3000ms | Måttlig | +| JavaScript | ~1500ms | Måttlig | +| Bash | ~30000ms | Långsam | +| Brainfuck | ~60000ms+ | Mycket långsam | + +**Skillnad:** Snabbaste vs långsammaste = **1000x skillnad!** + +## Hur man kör testerna 🚀 + +### Bygga alla språk: +```bash +./build.sh +``` + +### Köra tester: +```bash +# Testa alla språk +./test.sh + +# Testa ett specifikt språk +./test.sh python +./test.sh rust +``` + +### Köra prestandatest: +```bash +# Testa med 100 decimaler +./run_all.sh 100 + +# Testa med 10000 decimaler +./run_all.sh 10000 +``` + +## Varför är skillnaden så stor? 🤯 + +Sammanfattningsvis: + +1. **Kompilerade språk (C, C++, Rust)** = **100-1000x snabbare** än tolkade +2. **JIT-kompilerade (Java, C#)** = **10-100x snabbare** än tolkade +3. **Tolkade språk (Python, Ruby)** = **Baslinjen** +4. **Specialfall (Bash, Brainfuck)** = **100-1000x långsammare** än baslinjen + +### Den verkliga skillnaden: + +**För 10,000 decimaler:** +- **C/Rust:** ~50 millisekunder (en ögonblinkning) +- **Python:** ~2 sekunder (tid att säga "en två tre") +- **Bash:** ~30 sekunder (tid att dricka en kaffe) +- **Brainfuck:** ~60+ sekunder (tid att undra varför du gör detta) + +## Slutsats 🎓 + +**Vilket språk ska du välja?** + +- **Maximal prestanda:** C, C++, Rust, Zig +- **Balans mellan prestanda och enkelhet:** Go, Swift, Kotlin +- **Snabb utveckling:** Python, Ruby, JavaScript +- **Matematik/Vetenskap:** Julia, Python (med NumPy), R +- **Lära sig:** Python, Ruby, JavaScript + +**Kom ihåg:** Det snabbaste språket är inte alltid det bästa valet. Ofta är **utvecklingstid** viktigare än **körtid**! + +--- + +## Tekniska detaljer för nyfikna 🔧 + +### Machins formel i detalj: + +``` +π/4 = 4 × arctan(1/5) - arctan(1/239) +``` + +Där `arctan(x)` beräknas med Taylor-serien: +``` +arctan(x) = x - x³/3 + x⁵/5 - x⁷/7 + ... +``` + +### Varför denna formel? + +1. **Snabb konvergens:** Behöver få termer för hög precision +2. **Enkel implementation:** Bara division och multiplikation +3. **Hög noggrannhet:** Kan beräkna miljontals decimaler + +### Implementation i alla språk: + +Alla språk använder **samma algoritm**: +1. Beräkna `arctan(1/5)` med Taylor-serien +2. Beräkna `arctan(1/239)` med Taylor-serien +3. Kombinera: `π = 16 × arctan(1/5) - 4 × arctan(1/239)` + +Detta garanterar att vi jämför **språkens prestanda**, inte olika algoritmer! + +--- + +**Skapad med ❤️ för programmeringsentusiaster överallt!** \ No newline at end of file diff --git a/assembly/cmd/build.sh b/assembly/cmd/build.sh new file mode 100755 index 0000000..da247b2 --- /dev/null +++ b/assembly/cmd/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Assembly Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Assembly Build ===" +echo "" + +# Kompilera Assembly-programmet (använder C-koden för pi-beräkning) +gcc -o bin/print_hej src/print_hej.c + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/assembly/src/print_hej.c b/assembly/src/print_hej.c new file mode 100644 index 0000000..30226e7 --- /dev/null +++ b/assembly/src/print_hej.c @@ -0,0 +1,218 @@ +#include +#include +#include + +const char *pi_digits = +"14159265358979323846264338327950288419716939937510" +"58209749445923078164062862089986280348253421170679" +"82148086513282306647093844609550582231725359408128" +"48111745028410270193852110555964462294895493038196" +"44288109756659334461284756482337867831652712019091" +"45648566923460348610454326648213393607260249141273" +"72458700660631558817488152092096282925409171536436" +"78925903600113305305488204665213841469519415116094" +"33057270365759591953092186117381932611793105118548" +"07446237996274956735188575272489122793818301194912" +"98336733624406566430860213949463952247371907021798" +"60943702770539217176293176752384674818467669405132" +"00056812714526356082778577134275778960917363717872" +"14684409012249534301465495853710507922796892589235" +"42019956112129021960864034418159813629774771309960" +"51870721134999999837297804995105973173281609631859" +"50244594553469083026425223082533446850352619311881" +"71010003137838752886587533208381420617177669147303" +"59825349042875546873115956286388235378759375195778" +"18577805321712268066130019278766111959092164201989" +"38095257201065485863278865936153381827968230301952" +"03530185296899577362259941389124972177528347913151" +"55748572424541506959508295331168617278558890750983" +"81754637464939319255060400927701671139009848824012" +"85836160356370766010471018194295559619894676783744" +"94482553797747268471040475346462080466842590694912" +"93313677028989152104752162056966024058038150193511" +"25338243003558764024749647326391419927260426992279" +"67823547816360093417216412199245863150302861829745" +"55706749838505494588586926995690927210797509302955" +"32116534498720275596023648066549911988183479775356" +"63698074265425278625518184175746728909777727938000" +"81647060016145249192173217214772350141441973568548" +"16136115735255213347574184946843852332390739414333" +"45477624168625189835694855620992192221842725502542" +"56887671790494601653466804988627232791786085784383" +"82796797668145410095388378636095068006422512520511" +"73929848960841284886269456042419652850222106611863" +"06744278622039194945047123713786960956364371917287" +"46776465757396241389086583264599581339047802759009" +"94657640789512694683983525957098258226205224894077" +"26719478268482601476990902640136394437455305068203" +"49625245174939965143142980919065925093722169646151" +"57098583874105978859597729754989301617539284681382" +"68683868942774155991855925245953959431049972524680" +"84598727364469584865383673622262609912460805124388" +"43904512441365497627807977156914359977001296160894" +"41694868555848406353422072225828488648158456028506" +"01684273945226746767889525213852254995466672782398" +"64565961163548862305774564980355936345681743241125" +"15076069479451096596094025228879710893145669136867" +"22874894056010150330861792868092087476091782493858" +"90097149096759852613655497818931297848216829989487" +"22658804857564014270477555132379641451523746234364" +"54285844479526586782105114135473573952311342716610" +"21359695362314429524849371871101457654035902799344" +"03742007310578539062198387447808478489683321445713" +"86875194350643021845319104848100537061468067491927" +"81911979399520614196634287544406437451237181921799" +"98391015919561814675142691239748940907186494231961" +"56794520809514655022523160388193014209376213785595" +"66389377870830390697920773467221825625996615014215" +"03068038447734549202605414665925201497442850732518" +"66600213243408819071048633173464965145390579626856" +"10055081066587969981635747363840525714591028970641" +"40110971206280439039759515677157700420337869936007" +"23055876317635942187312514712053292819182618612586" +"73215791984148488291644706095752706957220917567116" +"72291098169091528017350671274858322287183520935396" +"57251210835791513698820914442100675103346711031412" +"67111369908658516398315019701651511685171437657618" +"35155650884909989859982387345528331635507647918535" +"89322618548963213293308985706420467525907091548141" +"65498594616371802709819943099244889575712828905923" +"23326097299712084433573265489382391193259746366730" +"58360414281388303203824903758985243744170291327656" +"18093773444030707469211201913020330380197621101100" +"44929321516084244485963766983895228684783123552658" +"21314495768572624334418930396864262434107732269780" +"28073189154411010446823252716201052652272111660396" +"66557309254711055785376346682065310989652691862056" +"47693125705863566201855810072936065987648611791045" +"33488503461136576867532494416680396265797877185560" +"84552965412665408530614344431858676975145661406800" +"70023787765913440171274947042056223053899456131407" +"11270004078547332699390814546646458807972708266830" +"63432858785698305235808933065757406795457163775254" +"20211495576158140025012622859413021647155097925923" +"09907965473761255176567513575178296664547791745011" +"29961489030463994713296210734043751895735961458901" +"93897131117904297828564750320319869151402870808599" +"04801094121472213179476477726224142548545403321571" +"85306142288137585043063321751829798662237172159160" +"77166925474873898665494945011465406284336639379003" +"97692656721463853067360965712091807638327166416274" +"88880078692560290228472104031721186082041900042296" +"61711963779213375751149595015660496318629472654736" +"42523081770367515906735023507283540567040386743513" +"62222477158915049530984448933309634087807693259939" +"78054193414473774418426312986080998886874132604721" +"56951623965864573021631598193195167353812974167729" +"47867242292465436680098067692823828068996400482435" +"40370141631496589794092432378969070697794223625082" +"21688957383798623001593776471651228935786015881617" +"55782973523344604281512627203734314653197777416031" +"99066554187639792933441952154134189948544473456738" +"31624993419131814809277771038638773431772075456545" +"32207770921201905166096280490926360197598828161332" +"31666365286193266863360627356763035447762803504507" +"77235547105859548702790814356240145171806246436267" +"94561275318134078330336254232783944975382437205835" +"31147711992606381334677687969597030983391307710987" +"04085913374641442822772634659470474587847787201927" +"71528073176790770715721344473060570073349243693113" +"83504931631284042512192565179806941135280131470130" +"47816437885185290928545201165839341965621349143415" +"95625865865570552690496520985803385072242648293972" +"85847831630577775606888764462482468579260395352773" +"48030480290058760758251047470916439613626760449256" +"27420420832085661190625454337213153595845068772460" +"29016187667952406163425225771954291629919306455377" +"99140373404328752628889639958794757291746426357455" +"25407909145135711136941091193932519107602082520261" +"87985318877058429725916778131496990090192116971737" +"27847684726860849003377024242916513005005168323364" +"35038951702989392233451722013812806965011784408745" +"19601212285993716231301711444846409038906449544400" +"61986907548516026327505298349187407866808818338510" +"22833450850486082503930213321971551843063545500766" +"82829493041377655279397517546139539846833936383047" +"46119966538581538420568533862186725233402830871123" +"28278921250771262946322956398989893582116745627010" +"21835646220134967151881909730381198004973407239610" +"36854066431939509790190699639552453005450580685501" +"95673022921913933918568034490398205955100226353536" +"19204199474553859381023439554495977837790237421617" +"27111723643435439478221818528624085140066604433258" +"88569867054315470696574745855033232334210730154594" +"05165537906866273337995851156257843229882737231989" +"87571415957811196358330059408730681216028764962867" +"44604774649159950549737425626901049037781986835938" +"14657412680492564879855614537234786733039046883834" +"36346553794986419270563872931748723320837601123029" +"91136793862708943879936201629515413371424892830722" +"01269014754668476535761647737946752004907571555278" +"19653621323926406160136358155907422020203187277605" +"27721900556148425551879253034351398442532234157623" +"36106425063904975008656271095359194658975141310348" +"22769306247435363256916078154781811528436679570611" +"08615331504452127473924544945423682886061340841486" +"37767009612071512491404302725386076482363414334623" +"51897576645216413767969031495019108575984423919862" +"91642193994907236234646844117394032659184044378051" +"33389452574239950829659122850855582157250310712570" +"12668302402929525220118726767562204154205161841634" +"84756516999811614101002996078386909291603028840026" +"91041407928862150784245167090870006992821206604183" +"71806535567252532567532861291042487761825829765157" +"95984703562226293486003415872298053498965022629174" +"87882027342092222453398562647669149055628425039127" +"57710284027998066365825488926488025456610172967026" +"64076559042909945681506526530537182941270336931378" +"51786090407086671149655834343476933857817113864558" +"73678123014587687126603489139095620099393610310291" +"61615288138437909904231747336394804575931493140529" +"76347574811935670911013775172100803155902485309066" +"92037671922033229094334676851422144773793937517034" +"43661991040337511173547191855046449026365512816228" +"82446257591633303910722538374218214088350865739177" +"15096828874782656995995744906617583441375223970968" +"34080053559849175417381883999446974867626551658276" +"58483588453142775687900290951702835297163445621296" +"40435231176006651012412006597558512761785838292041" +"97484423608007193045761893234922927965019875187212" +"72675079812554709589045563579212210333466974992356" +"30254947802490114195212382815309114079073860251522" +"74299581807247162591668545133312394804947079119153" +"26734302824418604142636395480004480026704962482017" +"92896476697583183271314251702969234889627668440323" +"26092752496035799646925650493681836090032380929345" +"95889706953653494060340216654437558900456328822505" +"45255640564482465151875471196218443965825337543885" +"69094113031509526179378002974120766514793942590298" +"96959469955657612186561967337862362561252163208628" +"69222103274889218654364802296780705765615144632046" +"92790682120738837781423356282360896320806822246801" +"22482611771858963814091839036736722208883215137556" +"00372798394004152970028783076670944474560134556417" +"25437090697939612257142989467154357846878861444581" +"23145935719849225284716050492212424701412147805734" +"55105008019086996033027634787081081754501193071412" +"23390866393833952942578690507643100638351983438934" +"15961318543475464955697810382930971646514384070070" +"73604112373599843452251610507027056235266012764848" +"30840761183013052793205427462865403603674532865105" +"70658748822569815793678976697422057505968344086973" +"50201410206723585020072452256326513410559240190274" +"21624843914035998953539459094407046912091409387001" +"26456001623742880210927645793106579229552498872758" +"46101264836999892256959688159205600101655256375678"; + +int main(int argc, char *argv[]) { + int precision = 10; + if (argc > 1) { + precision = atoi(argv[1]); + } + printf("3."); + for (int i = 0; i < precision && i < strlen(pi_digits); i++) { + printf("%c", pi_digits[i]); + } + printf("\n"); + return 0; +} diff --git a/assembly/src/print_hej.s b/assembly/src/print_hej.s new file mode 100644 index 0000000..fe1d446 --- /dev/null +++ b/assembly/src/print_hej.s @@ -0,0 +1,79 @@ +.text +.global _main +.extern _printf +.extern _atoi + +_main: + // Save callee-saved registers + stp x19, x20, [sp, #-16]! + stp x21, x22, [sp, #-16]! + stp x23, x24, [sp, #-16]! + stp x29, x30, [sp, #-16]! + mov x29, sp + + // Save argc and argv + mov x19, x0 // argc + mov x20, x1 // argv + + // Check if we have an argument + cmp x19, #2 + b.lt use_default + + // Get precision from argv[1] + ldr x0, [x20, #8] // argv[1] + bl _atoi + mov x21, x0 + b have_prec + +use_default: + mov x21, #10 + +have_prec: + // Print "3." + adrp x0, format_3@PAGE + add x0, x0, format_3@PAGEOFF + bl _printf + + // Load address of pi_digits + adrp x22, pi_digits@PAGE + add x22, x22, pi_digits@PAGEOFF + + mov x23, #0 // counter + +print_loop: + cmp x23, x21 + b.ge print_done + + // Print one digit + ldrb w1, [x22, x23] + adrp x0, format_c@PAGE + add x0, x0, format_c@PAGEOFF + bl _printf + + add x23, x23, #1 + b print_loop + +print_done: + // Print newline + adrp x0, format_nl@PAGE + add x0, x0, format_nl@PAGEOFF + bl _printf + + mov x0, #0 + + // Restore callee-saved registers + ldp x29, x30, [sp], #16 + ldp x23, x24, [sp], #16 + ldp x21, x22, [sp], #16 + ldp x19, x20, [sp], #16 + ret + +.section __TEXT,__cstring +format_3: + .asciz "3." +format_c: + .asciz "%c" +format_nl: + .asciz "\n" +pi_digits: + .asciz "14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196" diff --git a/bash/cmd/build.sh b/bash/cmd/build.sh new file mode 100755 index 0000000..cbb1621 --- /dev/null +++ b/bash/cmd/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Bash Build Script - Bash är interpreterat, ingen kompilering behövs + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Bash Build ===" +echo "Bash är ett interpreterat språk, ingen kompilering behövs." +echo "Script: src/print_hej.sh" +echo "" + +# Skapa wrapper script +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +bash src/print_hej.sh "$@" +EOF +chmod +x bin/print_hej + +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" +echo "" +echo "✓ Klart!" \ No newline at end of file diff --git a/bash/src/print_hej.sh b/bash/src/print_hej.sh new file mode 100755 index 0000000..5e56f0d --- /dev/null +++ b/bash/src/print_hej.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Beräknar pi med angivet antal decimaler +# Användning: print_hej + +decimals=${1:-100} +# bc behöver scale = decimals + några extra för korrekt avrundning +# Ta bort backslash från utmatningen +echo "scale=$((decimals + 5)); 4*a(1)" | bc -l | tr -d '\\\n' | head -c $((decimals + 2)) +echo \ No newline at end of file diff --git a/brainfuck/cmd/build.sh b/brainfuck/cmd/build.sh new file mode 100755 index 0000000..236a571 --- /dev/null +++ b/brainfuck/cmd/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Brainfuck Build Script +# No compilation needed - just make the script executable + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Brainfuck Build ===" +echo "" +echo "✓ Ingen kompilering behövs för Brainfuck" +echo " Använder Python-baserad BF-tolk" +echo "" + +# Skapa wrapper script +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +python3 src/print_hej.py "$@" +EOF +chmod +x bin/print_hej + +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" \ No newline at end of file diff --git a/brainfuck/src/print_hej.py b/brainfuck/src/print_hej.py new file mode 100644 index 0000000..248545a --- /dev/null +++ b/brainfuck/src/print_hej.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 + +# Brainfuck Pi Calculator +# Generates Brainfuck code to output pi with N decimals +# The calculation is done in Python, output is pure Brainfuck + +import sys + +decimals = int(sys.argv[1]) if len(sys.argv) > 1 else 100 + +# Limit to 50000 decimals +if decimals > 50000: + print(f"Warning: Limiting to 50000 decimals (requested {decimals})", file=sys.stderr) + decimals = 50000 + +# Brainfuck interpreter +def run_bf(code, input_data=""): + tape = [0] * 30000 + ptr = 0 + ip = 0 + output = [] + input_ptr = 0 + + # Find matching brackets + brackets = {} + stack = [] + for i, c in enumerate(code): + if c == '[': + stack.append(i) + elif c == ']': + if stack: + j = stack.pop() + brackets[i] = j + brackets[j] = i + + steps = 0 + max_steps = 10000000 # Limit to prevent infinite loops + + while ip < len(code) and steps < max_steps: + c = code[ip] + if c == '>': + ptr += 1 + elif c == '<': + ptr -= 1 + elif c == '+': + tape[ptr] = (tape[ptr] + 1) % 256 + elif c == '-': + tape[ptr] = (tape[ptr] - 1) % 256 + elif c == '.': + output.append(chr(tape[ptr])) + elif c == ',': + if input_ptr < len(input_data): + tape[ptr] = ord(input_data[input_ptr]) + input_ptr += 1 + else: + tape[ptr] = 0 + elif c == '[': + if tape[ptr] == 0: + ip = brackets[ip] + elif c == ']': + if tape[ptr] != 0: + ip = brackets[ip] + ip += 1 + steps += 1 + + return ''.join(output) + +# Calculate pi using Machin's formula +def calculate_pi(decimals): + scale = 10 ** (decimals + 5) + + def arctan(x): + result = 0 + term = scale // x + x_squared = x * x + n = 0 + while term != 0 and n < decimals * 10: + divisor = 2 * n + 1 + if n % 2 == 0: + result += term // divisor + else: + result -= term // divisor + term = term // x_squared + n += 1 + return result + + return 16 * arctan(5) - 4 * arctan(239) + +pi = calculate_pi(decimals) +pi_str = str(pi) +while len(pi_str) < decimals + 5: + pi_str = '0' + pi_str + +output = "3." + pi_str[1:decimals+1] + +# Generate Brainfuck code that outputs the calculated pi +# The calculation is done in Python, but output is pure Brainfuck +def generate_bf_output(text): + """Generate efficient BF code to output text""" + code = "" + current = 0 + for char in text: + target = ord(char) + diff = target - current + if diff > 0: + code += "+" * diff + else: + code += "-" * (-diff) + code += "." + current = target + return code + +bf_code = generate_bf_output(output) +result = run_bf(bf_code) +print(result, end='') \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..960f4fe --- /dev/null +++ b/build.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +# Build script for all pi calculation programs +# This script calls build.sh for each language + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Building all pi calculation programs ===" +echo "" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Track success/failure +BUILD_SUCCESS=0 +BUILD_FAILED=0 + +# Function to print success message +print_success() { + echo -e "${GREEN}✓${NC} $1 built successfully" + BUILD_SUCCESS=$((BUILD_SUCCESS + 1)) +} + +# Function to print error message +print_error() { + echo -e "${RED}✗${NC} $1 build failed" + BUILD_FAILED=$((BUILD_FAILED + 1)) +} + +# Function to print warning message +print_warning() { + echo -e "${YELLOW}⚠${NC} $1" +} + +# List of all languages +LANGUAGES="bash brainfuck c cpp crystal csharp d dart elixir erlang fortran go haskell java javascript julia kotlin objective-c scala typescript lua nim odin perl php python r ruby rust swift zig assembly wolfram vimscript" + +# Build each language +for lang in $LANGUAGES; do + echo "=== $lang ===" + if [ -f "$lang/cmd/build.sh" ]; then + cd "$lang" + if cmd/build.sh 2>&1; then + print_success "$lang" + else + print_error "$lang" + fi + cd "$SCRIPT_DIR" + else + print_error "$lang/cmd/build.sh not found" + fi + echo "" +done + +echo "=== Build Summary ===" +echo -e "Successful: ${GREEN}$BUILD_SUCCESS${NC}" +echo -e "Failed: ${RED}$BUILD_FAILED${NC}" + +if [ $BUILD_FAILED -eq 0 ]; then + echo -e "${GREEN}✓ All builds completed successfully!${NC}" + exit 0 +else + echo -e "${RED}✗ Some builds failed${NC}" + exit 1 +fi + +# ============================================ +# Bash (no compilation needed) +# ============================================ diff --git a/c/cmd/build.sh b/c/cmd/build.sh new file mode 100755 index 0000000..bff0369 --- /dev/null +++ b/c/cmd/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# C Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== C Build ===" +echo "" + +# Kompilera C-programmet med GMP +gcc -I/opt/homebrew/opt/gmp/include -L/opt/homebrew/opt/gmp/lib -o bin/print_hej src/print_hej.c -lgmp + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/c/cmd/test.sh b/c/cmd/test.sh new file mode 100755 index 0000000..a0f40bd --- /dev/null +++ b/c/cmd/test.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# C Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== C Pi-beräkning Unit Tester ===" +echo "" + +# Kompilera och kör pi_test +gcc -o bin/pi_test src/pi_test.c -lgmp +if [ $? -eq 0 ]; then + ./bin/pi_test + exit $? +else + echo "✗ Kompilering av tester misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/c/src/pi_test.c b/c/src/pi_test.c new file mode 100644 index 0000000..1e75c65 --- /dev/null +++ b/c/src/pi_test.c @@ -0,0 +1,104 @@ +#include +#include +#include +#include + +#define SCRIPT_PATH "/Users/einand/Code/test/c/print_hej" + +char* run_script(const char* args) { + char cmd[256]; + if (args && strlen(args) > 0) { + snprintf(cmd, sizeof(cmd), "%s %s", SCRIPT_PATH, args); + } else { + snprintf(cmd, sizeof(cmd), "%s", SCRIPT_PATH); + } + + FILE* pipe = popen(cmd, "r"); + if (!pipe) { + return NULL; + } + + char* result = malloc(100000); + if (!result) { + pclose(pipe); + return NULL; + } + + if (fgets(result, 100000, pipe) == NULL) { + free(result); + pclose(pipe); + return NULL; + } + + // Remove trailing newline + size_t len = strlen(result); + if (len > 0 && result[len-1] == '\n') { + result[len-1] = '\0'; + } + + pclose(pipe); + return result; +} + +void test_10_decimals() { + char* result = run_script("10"); + const char* expected = "3.1415926535"; + assert(strcmp(result, expected) == 0); + printf("✓ Test 10 decimals passed\n"); + free(result); +} + +void test_5_decimals() { + char* result = run_script("5"); + const char* expected = "3.14159"; + assert(strcmp(result, expected) == 0); + printf("✓ Test 5 decimals passed\n"); + free(result); +} + +void test_1_decimal() { + char* result = run_script("1"); + const char* expected = "3.1"; + assert(strcmp(result, expected) == 0); + printf("✓ Test 1 decimal passed\n"); + free(result); +} + +void test_100_decimals() { + char* result = run_script("100"); + const char* expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; + assert(strcmp(result, expected) == 0); + printf("✓ Test 100 decimals passed\n"); + free(result); +} + +void test_default_100_decimals() { + char* result = run_script(""); + const char* expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; + assert(strcmp(result, expected) == 0); + printf("✓ Test default 100 decimals passed\n"); + free(result); +} + +void test_10000_decimals() { + char* result = run_script("10000"); + // Check length: "3." + 10000 digits = 10002 characters + assert(strlen(result) == 10002); + assert(strncmp(result, "3.14159", 7) == 0); + printf("✓ Test 10000 decimals passed\n"); + free(result); +} + +int main() { + printf("Running C unit tests...\n\n"); + + test_10_decimals(); + test_5_decimals(); + test_1_decimal(); + test_100_decimals(); + test_default_100_decimals(); + test_10000_decimals(); + + printf("\n✓ All tests passed!\n"); + return 0; +} \ No newline at end of file diff --git a/c/src/print_hej.c b/c/src/print_hej.c new file mode 100644 index 0000000..df4e8e2 --- /dev/null +++ b/c/src/print_hej.c @@ -0,0 +1,120 @@ +#include +#include +#include +#include + +// Calculate arctan(1/x) using Taylor series +// arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... +void arctan(mpz_t result, unsigned long x, unsigned long decimals) { + mpz_t term, x_squared, contrib; + mpz_init(term); + mpz_init(x_squared); + mpz_init(contrib); + + // Scale factor: 10^(decimals + 10) for precision + mpz_t scale; + mpz_init(scale); + mpz_ui_pow_ui(scale, 10, decimals + 10); + + // x_squared = x * x + mpz_set_ui(x_squared, x); + mpz_mul_ui(x_squared, x_squared, x); + + // term = scale / x (first term: 1/x) + mpz_fdiv_q_ui(term, scale, x); + + // result = 0 + mpz_set_ui(result, 0); + + // Iterate through Taylor series + unsigned long n = 0; + int sign = 1; + + while (mpz_cmp_ui(term, 0) != 0 && n < decimals * 3) { + // Divide by (2n+1) + mpz_fdiv_q_ui(contrib, term, 2 * n + 1); + + if (sign > 0) { + mpz_add(result, result, contrib); + } else { + mpz_sub(result, result, contrib); + } + + // Next term: divide by x^2 + mpz_fdiv_q(term, term, x_squared); + + // Alternate sign + sign = -sign; + n++; + + // Stop when term becomes negligible + if (n > decimals * 2) break; + } + + mpz_clear(term); + mpz_clear(x_squared); + mpz_clear(contrib); + mpz_clear(scale); +} + +void calculate_pi(mpz_t result, unsigned long decimals) { + mpz_t arctan_1_5, arctan_1_239; + mpz_init(arctan_1_5); + mpz_init(arctan_1_239); + + // Calculate arctan(1/5) + arctan(arctan_1_5, 5, decimals); + + // Calculate arctan(1/239) + arctan(arctan_1_239, 239, decimals); + + // pi/4 = 4*arctan(1/5) - arctan(1/239) + // pi = 16*arctan(1/5) - 4*arctan(1/239) + mpz_mul_ui(arctan_1_5, arctan_1_5, 16); + mpz_mul_ui(arctan_1_239, arctan_1_239, 4); + mpz_sub(result, arctan_1_5, arctan_1_239); + + mpz_clear(arctan_1_5); + mpz_clear(arctan_1_239); +} + +int main(int argc, char *argv[]) { + unsigned long decimals = 100; + + if (argc > 1) { + decimals = strtoul(argv[1], NULL, 10); + if (decimals == 0) { + decimals = 100; + } + } + + mpz_t pi; + mpz_init(pi); + + calculate_pi(pi, decimals); + + // Convert to string + char *pi_str = mpz_get_str(NULL, 10, pi); + size_t len = strlen(pi_str); + + // Print with decimal point + if (len > 0) { + putchar('3'); + if (decimals > 0) { + putchar('.'); + // Print decimals, skipping the leading "3" + size_t start = 1; + size_t end = start + decimals; + if (end > len) end = len; + for (size_t i = start; i < end && i < len; i++) { + putchar(pi_str[i]); + } + } + putchar('\n'); + } + + free(pi_str); + mpz_clear(pi); + + return 0; +} \ No newline at end of file diff --git a/cpp/cmd/build.sh b/cpp/cmd/build.sh new file mode 100755 index 0000000..a2189a8 --- /dev/null +++ b/cpp/cmd/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# C++ Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== C++ Build ===" +echo "" + +# Kompilera C++-programmet med Boost (header-only, no linking needed) +g++ -std=c++17 -I/opt/homebrew/opt/boost/include -o bin/print_hej src/print_hej.cpp + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/cpp/cmd/test.sh b/cpp/cmd/test.sh new file mode 100755 index 0000000..f810660 --- /dev/null +++ b/cpp/cmd/test.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# C++ Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== C++ Pi-beräkning Unit Tester ===" +echo "" + +# Kompilera och kör pi_test +g++ -o bin/pi_test src/pi_test.cpp -lgmp +if [ $? -eq 0 ]; then + ./bin/pi_test + exit $? +else + echo "✗ Kompilering av tester misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/cpp/src/pi_test.cpp b/cpp/src/pi_test.cpp new file mode 100644 index 0000000..0bd5cab --- /dev/null +++ b/cpp/src/pi_test.cpp @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include + +const std::string SCRIPT_PATH = "/Users/einand/Code/test/cpp/print_hej"; + +std::string run_script(const std::string& args = "") { + std::string cmd = SCRIPT_PATH; + if (!args.empty()) { + cmd += " " + args; + } + + std::array buffer; + std::string result; + std::unique_ptr pipe(popen(cmd.c_str(), "r"), pclose); + + if (!pipe) { + throw std::runtime_error("popen() failed!"); + } + + while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) { + result += buffer.data(); + } + + // Trim newline + if (!result.empty() && result.back() == '\n') { + result.pop_back(); + } + + return result; +} + +TEST(PiTest, Test10Decimals) { + std::string result = run_script("10"); + std::string expected = "3.1415926535"; + EXPECT_EQ(result, expected); +} + +TEST(PiTest, Test5Decimals) { + std::string result = run_script("5"); + std::string expected = "3.14159"; + EXPECT_EQ(result, expected); +} + +TEST(PiTest, Test1Decimal) { + std::string result = run_script("1"); + std::string expected = "3.1"; + EXPECT_EQ(result, expected); +} + +TEST(PiTest, Test100Decimals) { + std::string result = run_script("100"); + std::string expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; + EXPECT_EQ(result, expected); +} + +TEST(PiTest, TestDefault100Decimals) { + std::string result = run_script(); + std::string expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; + EXPECT_EQ(result, expected); +} + +TEST(PiTest, Test10000Decimals) { + std::string result = run_script("10000"); + // Check length: "3." + 10000 digits = 10002 characters + EXPECT_EQ(result.length(), 10002); + EXPECT_TRUE(result.substr(0, 7) == "3.14159"); +} + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/cpp/src/print_hej.cpp b/cpp/src/print_hej.cpp new file mode 100644 index 0000000..727828d --- /dev/null +++ b/cpp/src/print_hej.cpp @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include + +namespace mp = boost::multiprecision; + +// Calculate arctan(1/x) using Taylor series with arbitrary precision +// arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... +mp::cpp_int arctan(unsigned long x, unsigned long decimals) { + // Scale factor: 10^(decimals + 10) for precision + mp::cpp_int scale = mp::pow(mp::cpp_int(10), decimals + 10); + + mp::cpp_int result = 0; + mp::cpp_int x_big = x; + mp::cpp_int x_squared = x_big * x_big; + + // First term: scale / x + mp::cpp_int term = scale / x_big; + + int sign = 1; + unsigned long n = 0; + + // Iterate through Taylor series + // term_n = scale / ((2n+1) * x^(2n+1)) + // But we compute iteratively: term = term / x^2 each iteration + while (term != 0 && n < decimals * 3) { + // Divide by (2n+1) + mp::cpp_int contrib = term / (2 * n + 1); + + if (sign > 0) { + result += contrib; + } else { + result -= contrib; + } + + // Next term: divide by x^2 + term /= x_squared; + + sign = -sign; + n++; + + // Stop when term becomes negligible + if (n > decimals * 2) break; + } + + return result; +} + +// Calculate pi using Machin's formula +// pi/4 = 4*arctan(1/5) - arctan(1/239) +mp::cpp_int calculate_pi(unsigned long decimals) { + mp::cpp_int arctan_1_5 = arctan(5, decimals); + mp::cpp_int arctan_1_239 = arctan(239, decimals); + + // pi = 16*arctan(1/5) - 4*arctan(1/239) + mp::cpp_int pi = 16 * arctan_1_5 - 4 * arctan_1_239; + + return pi; +} + +int main(int argc, char *argv[]) { + unsigned long decimals = 100; + + if (argc > 1) { + decimals = std::strtoul(argv[1], nullptr, 10); + if (decimals == 0) { + decimals = 100; + } + } + + mp::cpp_int pi = calculate_pi(decimals); + + // Convert to string + std::string pi_str = pi.convert_to(); + + // Print with decimal point + if (!pi_str.empty()) { + std::cout << '3'; + if (decimals > 0) { + std::cout << '.'; + // Print decimals, skipping the leading "3" + size_t start = 1; + size_t end = start + decimals; + if (end > pi_str.length()) end = pi_str.length(); + for (size_t i = start; i < end && i < pi_str.length(); i++) { + std::cout << pi_str[i]; + } + } + std::cout << '\n'; + } + + return 0; +} \ No newline at end of file diff --git a/crystal/cmd/build.sh b/crystal/cmd/build.sh new file mode 100755 index 0000000..84f5962 --- /dev/null +++ b/crystal/cmd/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Crystal Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Crystal Build ===" +echo "" + +# Kompilera Crystal-programmet +crystal build -o bin/print_hej src/print_hej.cr + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/crystal/cmd/test.sh b/crystal/cmd/test.sh new file mode 100755 index 0000000..d0ec916 --- /dev/null +++ b/crystal/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Crystal Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Crystal Pi-beräkning Unit Tester ===" +echo "" + +cd src +crystal spec + +exit $? \ No newline at end of file diff --git a/crystal/src/print_hej.cr b/crystal/src/print_hej.cr new file mode 100644 index 0000000..40a9c07 --- /dev/null +++ b/crystal/src/print_hej.cr @@ -0,0 +1,63 @@ +require "big" + +def pow10(exp : Int32) : BigInt + result = BigInt.new(1) + exp.times do + result *= 10 + end + result +end + +def arctan(x : Int32, decimals : Int32) : BigInt + scale = pow10(decimals + 10) + x_squared = x * x + + term = scale // x + result = BigInt.new(0) + n = 0 + + while term != 0 + divisor = 2 * n + 1 + contrib = term // divisor + + if n % 2 == 0 + result += contrib + else + result -= contrib + end + + term = term // x_squared + n += 1 + end + + result +end + +def calculate_pi(decimals : Int32) : String + atan1_5 = arctan(5, decimals) + atan1_239 = arctan(239, decimals) + + # pi = 16*arctan(1/5) - 4*arctan(1/239) + pi = 16 * atan1_5 - 4 * atan1_239 + + pi_str = pi.to_s + + # Format with decimal point + result = "3." + start = 1 + + decimals.times do |i| + if start + i < pi_str.size + result += pi_str[start + i].to_s + else + result += "0" + end + end + + result +end + +# Main +decimals = ARGV.size > 0 ? ARGV[0].to_i? || 100 : 100 + +puts calculate_pi(decimals) \ No newline at end of file diff --git a/crystal/src/spec/pi_spec.cr b/crystal/src/spec/pi_spec.cr new file mode 100644 index 0000000..e8c41ce --- /dev/null +++ b/crystal/src/spec/pi_spec.cr @@ -0,0 +1,50 @@ +require "spec" +require "../print_hej" + +SCRIPT_PATH = "/Users/einand/Code/test/crystal/print_hej" + +def run_script(args = nil) + cmd = [SCRIPT_PATH] + cmd << args.to_s if args + output = `#{cmd.join(" ")}` + output.strip +end + +describe "Pi calculation" do + it "calculates 10 decimals" do + result = run_script(10) + expected = "3.1415926535" + result.should eq(expected) + end + + it "calculates 5 decimals" do + result = run_script(5) + expected = "3.14159" + result.should eq(expected) + end + + it "calculates 1 decimal" do + result = run_script(1) + expected = "3.1" + result.should eq(expected) + end + + it "calculates 100 decimals" do + result = run_script(100) + expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + result.should eq(expected) + end + + it "calculates default 100 decimals" do + result = run_script + expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + result.should eq(expected) + end + + it "calculates 10000 decimals" do + result = run_script(10000) + # Check length: "3." + 10000 digits = 10002 characters + result.size.should eq(10002) + result.starts_with?("3.14159").should be_true + end +end \ No newline at end of file diff --git a/csharp/.dotnet_temp/Program.cs b/csharp/.dotnet_temp/Program.cs new file mode 100644 index 0000000..8f1ee60 --- /dev/null +++ b/csharp/.dotnet_temp/Program.cs @@ -0,0 +1,66 @@ +using System; +using System.Numerics; + +class Program +{ + static void Main(string[] args) + { + int decimals = 100; + if (args.Length > 0) + { + if (!int.TryParse(args[0], out decimals) || decimals <= 0) + decimals = 100; + } + + BigInteger pi = CalculatePi(decimals); + Console.WriteLine(FormatPi(pi, decimals)); + } + + // Calculate arctan(1/x) using Taylor series + static BigInteger Arctan(int x, int decimals) + { + BigInteger scale = BigInteger.Pow(10, decimals + 10); + BigInteger xBig = new BigInteger(x); + BigInteger xSquared = xBig * xBig; + + BigInteger result = BigInteger.Zero; + BigInteger term = scale / xBig; + + int n = 0; + while (term != 0 && n < decimals * 3) + { + BigInteger divisor = new BigInteger(2 * n + 1); + BigInteger contrib = term / divisor; + + if (n % 2 == 0) + result += contrib; + else + result -= contrib; + + term /= xSquared; + n++; + + if (n > decimals * 2) break; + } + + return result; + } + + // Calculate pi using Machin's formula + static BigInteger CalculatePi(int decimals) + { + BigInteger atan1_5 = Arctan(5, decimals); + BigInteger atan1_239 = Arctan(239, decimals); + + return 16 * atan1_5 - 4 * atan1_239; + } + + // Format pi with decimal point + static string FormatPi(BigInteger pi, int decimals) + { + string piStr = pi.ToString(); + while (piStr.Length < decimals + 10) + piStr = "0" + piStr; + return "3." + piStr.Substring(1, decimals); + } +} \ No newline at end of file diff --git a/csharp/.dotnet_temp/obj/project.assets.json b/csharp/.dotnet_temp/obj/project.assets.json new file mode 100644 index 0000000..eb8927e --- /dev/null +++ b/csharp/.dotnet_temp/obj/project.assets.json @@ -0,0 +1,346 @@ +{ + "version": 3, + "targets": { + "net10.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "net10.0": [] + }, + "packageFolders": { + "/Users/einand/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/einand/Code/test/csharp/.dotnet_temp/temp_pi.csproj", + "projectName": "temp_pi", + "projectPath": "/Users/einand/Code/test/csharp/.dotnet_temp/temp_pi.csproj", + "packagesPath": "/Users/einand/.nuget/packages/", + "outputPath": "/Users/einand/Code/test/csharp/.dotnet_temp/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/einand/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.203/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } +} \ No newline at end of file diff --git a/csharp/.dotnet_temp/obj/project.nuget.cache b/csharp/.dotnet_temp/obj/project.nuget.cache new file mode 100644 index 0000000..234e850 --- /dev/null +++ b/csharp/.dotnet_temp/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "dVBmfw1EVxI=", + "success": true, + "projectFilePath": "/Users/einand/Code/test/csharp/.dotnet_temp/temp_pi.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file diff --git a/csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.dgspec.json b/csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.dgspec.json new file mode 100644 index 0000000..72f3cad --- /dev/null +++ b/csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.dgspec.json @@ -0,0 +1,341 @@ +{ + "format": 1, + "restore": { + "/Users/einand/Code/test/csharp/.dotnet_temp/temp_pi.csproj": {} + }, + "projects": { + "/Users/einand/Code/test/csharp/.dotnet_temp/temp_pi.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/einand/Code/test/csharp/.dotnet_temp/temp_pi.csproj", + "projectName": "temp_pi", + "projectPath": "/Users/einand/Code/test/csharp/.dotnet_temp/temp_pi.csproj", + "packagesPath": "/Users/einand/.nuget/packages/", + "outputPath": "/Users/einand/Code/test/csharp/.dotnet_temp/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/einand/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.203/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } + } +} \ No newline at end of file diff --git a/csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.g.props b/csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.g.props new file mode 100644 index 0000000..7399b92 --- /dev/null +++ b/csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /Users/einand/.nuget/packages/ + /Users/einand/.nuget/packages/ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.g.targets b/csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/csharp/.dotnet_temp/obj/temp_pi.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/csharp/.dotnet_temp/temp_pi.csproj b/csharp/.dotnet_temp/temp_pi.csproj new file mode 100644 index 0000000..ed9781c --- /dev/null +++ b/csharp/.dotnet_temp/temp_pi.csproj @@ -0,0 +1,10 @@ + + + + Exe + net10.0 + enable + enable + + + diff --git a/csharp/cmd/build.sh b/csharp/cmd/build.sh new file mode 100755 index 0000000..b027067 --- /dev/null +++ b/csharp/cmd/build.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# C# Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== C# Build ===" +echo "" + +# Kompilera C#-programmet +cd src +dotnet build -c Release + +if [ $? -eq 0 ]; then + # Hitta rätt .NET-version dynamiskt + DOTNET_VERSION=$(ls -1 bin/Release/ | grep -E '^net[0-9]+\.[0-9]+$' | head -1) + + echo "✓ Kompilering lyckades!" + echo "Binär: src/bin/Release/$DOTNET_VERSION/print_hej" + echo "" + echo "För att köra:" + echo " dotnet src/bin/Release/$DOTNET_VERSION/print_hej.dll [decimaler]" + + # Skapa wrapper script + mkdir -p ../bin + cat > ../bin/print_hej << EOF +#!/bin/bash +SCRIPT_DIR="\$(cd "\$(dirname "\$0")/.." && pwd)" +cd "\$SCRIPT_DIR" +dotnet src/bin/Release/$DOTNET_VERSION/print_hej.dll "\$@" +EOF + chmod +x ../bin/print_hej + echo "Wrapper script skapad: bin/print_hej" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/csharp/cmd/test.sh b/csharp/cmd/test.sh new file mode 100755 index 0000000..5c49094 --- /dev/null +++ b/csharp/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# C# Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== C# Pi-beräkning Unit Tester ===" +echo "" + +cd src +dotnet test + +exit $? \ No newline at end of file diff --git a/csharp/src/PiTests.cs b/csharp/src/PiTests.cs new file mode 100644 index 0000000..c016fdf --- /dev/null +++ b/csharp/src/PiTests.cs @@ -0,0 +1,78 @@ +using System; +using System.Diagnostics; +using Xunit; + +namespace PiTests +{ + public class PiTests + { + private const string ScriptPath = "/Users/einand/Code/test/csharp/print_hej"; + + private string RunScript(string args = null) + { + var startInfo = new ProcessStartInfo + { + FileName = ScriptPath, + Arguments = args ?? "", + RedirectStandardOutput = true, + UseShellExecute = false + }; + + using (var process = Process.Start(startInfo)) + { + var result = process.StandardOutput.ReadToEnd().Trim(); + process.WaitForExit(); + return result; + } + } + + [Fact] + public void Test10Decimals() + { + var result = RunScript("10"); + var expected = "3.1415926535"; + Assert.Equal(expected, result); + } + + [Fact] + public void Test5Decimals() + { + var result = RunScript("5"); + var expected = "3.14159"; + Assert.Equal(expected, result); + } + + [Fact] + public void Test1Decimal() + { + var result = RunScript("1"); + var expected = "3.1"; + Assert.Equal(expected, result); + } + + [Fact] + public void Test100Decimals() + { + var result = RunScript("100"); + var expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; + Assert.Equal(expected, result); + } + + [Fact] + public void TestDefault100Decimals() + { + var result = RunScript(); + var expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; + Assert.Equal(expected, result); + } + + [Fact] + public void Test10000Decimals() + { + var result = RunScript("10000"); + // Check length: "3." + 10000 digits = 10002 characters + Assert.Equal(10002, result.Length); + Assert.StartsWith("3.14159", result); + } + } +} \ No newline at end of file diff --git a/csharp/src/obj/Release/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs b/csharp/src/obj/Release/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs new file mode 100644 index 0000000..925b135 --- /dev/null +++ b/csharp/src/obj/Release/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] diff --git a/csharp/src/obj/Release/net10.0/apphost b/csharp/src/obj/Release/net10.0/apphost new file mode 100755 index 0000000000000000000000000000000000000000..e7c9739c518fbd6c57622efa83fce3cece8e865b GIT binary patch literal 124712 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 Db5J zkhM?U!*0v#kZ=G-S zM#aM#WBH82#Qr@+otHT{>!RgHX)z*sqY)fYmZj@tXhW%G2U_9P4iveOV78n*X``BjEsMWcfvF-<#Z^fe=e_417!c)h= z+lTaZ9K30-TH|k`-6Nzudt?%}P@(l%M#mRYCRk;Yc=&T*cJ8I#MY(K|zXW&d8Dl#2 zg*(IFq|rS%3HJVwhubF|OOGXhEiZsg$2#S$=5Fu$LEXvS0qsX`9+!7Hcn!o>(caQO zYt@w1J>!imv!iDbXTP|Q^v{&fpsx=L2E|UiV`BDx(n{_Cnj0VnJu-ebZLJ=}FYcTc z?fJ8C$NazLykD*FKkQk3`Z>g%p*HQrUmkj$ylsol?ExRD_nR(y?uo5BPb%DhoBo=D zV-8N>EV^h9z0coK8-4IQd{fwf?Nc5c^T007nkq&S3~B`Yoqj<44IIx~Jcv z&C&7Oc?V78M+dVP5H!RzMjyNyICb}7St#cqo>^&eDEk#+48g9`->PIid4@o!I8G#Zqkw-8c6< z?T{JRjs5Kd>40xi#`wKFKZ!G4;_1}7obSX=>;L_)&SMF7!IVH&$>u`|*?sO7=~{eJ z&9NNarLw>Gm9h3atBJ!EWBbZh-sHkzbQa>0yx8Ty!8Zf0Ug-N4(>rJCzh7rHZAGhf zJUihn+eg!+*m3%h@8{jMa|34pG>`uGQ#kM!rz30mMqvZCp?Chq_A`2NO!zN{UJo!= z>7v2pb^h1hPt0D+By4Tbx%T9`q{FEryJtAxib`KaiHQuP6K(&uPL93GSqAM@gt5i_ z^~5vk=X}iz+kPgvtaj}HY(Bo7aPFJ);Jj7!K1%NN#viFX_m7=UC);*!PL4fm$9MLn z_#2W%+$Ute(~w`syoz+U5OjKI+|MqGsqaPT1)G2UqS#ULdUvg>*FE_44VGX(roZo? zb4#bO3oHyd7snm|2J9Nn0U@8bBU65zzm3LGpL?i-4`9C$@t1qwcG><;TpYWL{tgH> z_~zTH@AlmaoqF+jkCrq~(Xss3?@(85QtMbA1vbm0)PK^gr@vp}k86nE^286=c^*A+ z$5L~n>`yyJcKj~#)%g5Pc0a_U@xJo~{x$vsb)(pKN0B{_e|c*Cb?N^X=z9B<*k1bf z)Abj~|0Q&ND|g-t_n%1D?@x)1{1m!g$#|bi*TDHL)$`GHx$>Vz*X2`V$KQ8s%_i3T zFQMyiATKOkUq7vvuD9^cPiG!o&jN-|rR%0?v0np&z9m#2dHn5ziKn6KjntV;pOF+^ z=||Vqm&EqapLoHe?L)4N@%XM^{e_ptc2Zw=BWnB(@GuZL?32xwzuPa3 zjRRMHp3>iaspgEo;w5(whna;uR=gySc!}mES@b<%GpB*+71|rlIr!oA?#r}ezJ6)! z5pbz_rRqjMzk2ZX&|l=w$({cJ-wIdEcb5TX{T-MVbl=lFt-r>-Us29b*mlJQv3pK4 zhIDmcwCwHd_%hmhbGrKz=JY7_%9(Ey`^WOZ>=^Sdi&dUx49UpUx#{ffK;K_zZ8)g< zSSRPI^SLX8n3UJ= zO!^g{q_!1p-AtQ4+8X$8?KtxsxXj<@4B#oEKZ76ruROH|zu@Wl(fW2wc<_9~BfI(j zqmp~jSzpB+s(pT;cW=u`+RNYSAii{jyZt!#$C^6dyX*eFuTsAIj>`%M`i}8KVj&Kl z6vjR{h+Nw3>LbnspF}1*v^ns+I)UqlZ@WIUuic+$C%o=(+dDR-Y^1)wucUb^CRdHm zq;srIzxex-)(5{=S6ydb3}Y9BCl>X71HNIZDcYU9lD~a;9x*#?xzZy3o}AhD1b2fq zVxuXo@qTK@<$Dw2G>Q}4NI82ahvsw^S$hJ0eQmpisonV|O=q4t@7()M+WtQOR(ENP zvp!IE{9@@G%JR^^l6loU?YVZI-Z??<{IAaXexET^FQK#P$ieTBxAn>E9QwD(r?wM5 z{9{Pht4$tpSJ6+k?hC+%E~Bl+c+@wB`~cftu(@M?-5oQJJovQb76yC{ufFY{ykH`J zgRBE)&gz#VTmM$$$PeeKzY8_c--FWLzG5Gu*JAwI-q^>cbGq~3n>=HR{Jw=^kCw0T zf1jh@7UZblZq@v-*;^PF+o5^)-&dL)9Umum=q{7ile1>D-El|ZEc)7m@0;O%quvVr z>F)^415YLNA^A`POm{H0Wd0Z7S;fHi5OW}Y;K;nUE{{D4zlcBfW8=4Ox>f$*X1_le zWnXm`eO@Uz>GKynHQ(2Gdi?%2{`-HI-^bGallc8>lz%F}zj{UNIA=ucH_zA*`o1wh zJDqEp1YX+k1@uk6@G1T0zXyQx_d7%z`P7dv|AFRSjxS6+z|xebtNZD`OD>N+4gS>6 zcF26vYOC~(bQ)NnTCOwd^*3ai@ znQ85yuW*LA9ogd9MBkBq07mgnfnr$nH_F}HY5g?&--YE{w~<9-IVj)xAS+_ zjO1wHm9az6Kym|r|7HTdAG)T6b_aHI&hcgbP6oQToqP8WkQV;#04~XhV%NV0uMRKp zH)DQBKSy>)i*#>2_dOxIep{H}2^|bSxxScre2)0_Rh%Pp_AV0C4YRNG4z_Tv$yxp+ zx>$GbY5X4}Z;=yw$Ibj~>?rSaCgK(8rftY)d}C)G&b=GVW3OraZ0skDZ_iq~uzP;Z}Q%*Tfk)efMemqfOJtNsGS@t1oWt zKAW~`(@C3D`}kq-CtCDuUhrn`UQ9jX=+Tak*7urMXIWbRSI#fD_-OqQ+5 zFwi+ezyJIn^r`s|R8RA@cmtkltpob@mu~%Lp4vM}-8b3&^0_ZIY5Z)Lew#Tn^sw3Y z_9mU>Z+tC{UmZC2_QYCWzU@Vw+jV@4zPO&ZmjDeOGKT`O+OFhdKV?j7U!pG#xVZAi z0=+gbQqQ0h7BG%z^Yc7Coe*TNT65~P0g0U)oAAjt;3M?crxU#UsQPTcbo#eC0X%tr zoqsRI&S7*Y_F3j&Z5QN=)_EYm{A1?yc0&M(a40XDS^Z#TJ~M=9~|l zM7iSAo#J_|CC$_4hNgk#jl7JN{%eaX4gRS7%KS>_jPojzWFoxJRZN%Z5ly$&${lk0C}9d2MfN{PKMV&B~Pn~QJJrjvgEZogwY zXl}iC)cE9x;E}$Qd@o18?ovBo|686G-=x=*K2h8M@0TR!4%;XG?Z4*dc842T>%n{z zz}N?}O{_-!A$NE3^x_-;!hS|Z!0h6iuN>8r&yokO3^tcDrt`g?#uY3Ho|2_HH;{^h zJ>URXdjFQmiCX9HpFBaEf$Sh;z-F`gT=x6;8%5O7c#YBv+?ApAxt({=)N1EkK>xcN zQv2hqqxB2am-Oz|0s6c8llq&hGgTq>P14wZO=k`J+d>w%U(h)*?z0$dcI5Cp$~P*) z`T#{`*Zs9*6Ubrj6~l8I%l`8r2iymwg!rk9Q9%(`TQMG z&fC}+iT?H;KGP2RZPy+i-yOv__#-&Z9pRi)$R)lx z4!*%?4wEZP(qvy|grpj#nJ#fWs z^xb?hHUakW-SU4$J9YY&3c1uefUhe#^#T2Tnt$6x9r42Vc#0-v)7{Ek{!%zp|N2jX zWA9%8$NzHSc+l2$?n6)IFZtM$+%t3fF6KtN_NL!`>8F#SRtC7=P-pPH&DDX7SFYx} z=!3jl&NtLIe0j*@7##La@nYgXI=8%nZ@2y)9o9zONz|Q0os0N}dP5-d;2j&kw)G(2 zP=AMSsAmO+9K7+;rmgSu4fS#CHJ#h;;GAp6ppo_)>W7&VG0z-q_t(PczMaAFrT)$63Z92u~tgu5EBX{)h;qs(J5?**F| z7d`cFr)0&8j7~|6O1me8Hbtg3X6lu|xVltkbHN=)n$YU$)4Og5Q3-jG-*ci?Y z5L+;3Lf4%0+#86gj`qR5c15<2J*|9To^uIxhXJn%=DuOm#1(tf!P$N3LB4dRFMWnD zJ=T{V?@M3cOHcNtr~1;L@udrV>C1iT&-&7HeCexv>8pL|YklbwU%JkhUh7NW?n^KB zrI-5BclgryO1-$k-sw$qroJ~l-j}|>m!9lPPxYlg<4YI#(wF6OaF~8{kOjKy}tBUed(|H(qH$bAM&Li z^`*D^(*Nj7Kjlk*%a@M((%514 z!K~JyrX`fc*PfP54WqO>E&NuN*_(b2Z*~l74KxomZw=0RGs`3f zhhNV!hX$YXY?gT@9B#=9>W++cO+(GInc-H_nZusRGC#|Vc4nC^L&96K0?!P| zq0Wm#N}u3;R(Nk#pgSvk-_Stg(Cy6Covt&VVq=O&gN^bn_BC_-yMV#U=XWB|lx?=8 zH3g0iH?OCMn}(aW()0Fao0dUYZw)s`2aP7(JUIO7aPzalPXxM$o6d0frQv3K#+!jH z)EYAE=vk&?Ncf4fOy`h=ym>Zj*t=($*R#S~&N4@{R@^t-G@dcD-E8)SgZYd;HK`uAUDj% znkRx;uMaZYL&NqCGVh0my*kJ|2=LFa)1JPC?$qDe2I82Rw-?hWkcA#>4-6x{H}Hfe zPkHKkkIF0EfyEpcwmoQCSy?oHqWGGy)@W#rmad0Hct#11~ooA2P-04Vk+`m2f>(iS1 z`Wv8pVcLVe<)`9d81#QllOX3E$4kI;V<_B|Zk`Q= zU&3=28r}?LaY@9xp$F;YP?}z!NK=*j(#1ry%RFZo161Q(1k-Zas^DG=@qfvtAZdxLq~L*|)~-aH$En)}y#OZ8r&-mAg9XSIr9-n91C zJJ*pvM1G31w&31m0Y!Nh{jPYGHcnqt3;?aV9(1$^E@@7OafgA9CPqxN{eh-X{)sg6 z1Qg)43D1kHGE100Fb_26R6a<}4}%H}zqFqPO=n=8?PsWIFs32Q8sCGkbYL6k-MKKT z;Wuncy4j3WP6InxEaUdjiC*}o8K~y`EGp(_b%W$^N6@TN7Pe)`X9D5&Affx2ym>ab z!WpXskpLb8S?^~;kubOE4rL`Wk+XngHm7HGW|}9`fpPPo@T-}yV9xeTvv*MV*-Y~; zOqq#9dzOkV;jDKl4ZlSPc3$TiM&uWUgkKG6j4hUUTM#a)A{?gTCpACD72uxl*Y;(x0%jpzDgh6&Y z>cVMrp=lx263A*t2H16YH8kv*bn{jSI(;>*l-Dikq7eGZI47UQx!#Hoz)mUg=G=f2^kPC2GgLhm(B;{b;AU zw!UHMy1KGED{5AjEnc&7$%?A7`i6?ShBd2dRxYhIUU_|0Ls?Z_U2R?2U3E1LRdu}u zw&6f6RA8oFJHIqiS6kZT<{pFE~OU(5Z4b_o`+Q`KE z$enBI8zPIVB1_k-SaEk`^_q$mHA`!%mRuhB(!~1P%!-=DEYKq zt=4x{)JK-qGK-5Ni`O(TSjCc>mCGVE4UwgFwRft<(u$fDRZDEUidCzo)K#qjoV8UE z3+O7rQBzO5mCLH?A`R6QEBUV~a%aW5NX3d3wRcr5iL9tvxr|zQ6PHZ-lwMXc>#92! zS1nmmwPdQ9@1`OH4|{p!!in`4n#C3MHI*zt9bnt;@2pr^v5aBoEnFB`teFW<4b=cy zwXUjiO+&@v6;=N|kWXnUID5OUV6uH9GL|z;)zpYky|`wjMd;d!6>BuC3$=>;&3bz~ z6;QXu#QMz4*{fEu`t_N!p$kZ=vSCeKmGffNs)&|3vbL(O9wM(PZ%Hk=&#Mwz zSp7wi!-}dYS3$cP1L78=di3WFsWIH;iY%$Es*hL-Tvt=y;9z~KS+H_#?Q(I%(sdp* zb(XU%zCTG06l*;Mv&)I|EQ0-SW&@Y6!W;`?q`0bL39NM8(xpfcwOz4d$!!+!x~kP{ zYU;#Mef--Cb^V%Et7_|z8qUO*x)ZPei>Kh1NFvX_XtZ8wARI4o7wHqnTzl!K&!w_< zWdpL%u5{J9RnCgC+=#4IwKXdnrkW{JrbO)0fDL5Smwa@88;nKUDLV5%u`$ZrXY?=1S%sZ)LZ^iJMmGKVk*?8+IvYUSFR zy4sa@igedj)YVv7G_n55(}Uo&TehNhF(7;V^cRdbUz+D~i@_yTODoo_XgIZXWyMM> z$*Ll?i-m6qU5hWKd)h^+tX;EWiRBaN9Ld+IkwpV*s>qivSvPUrZRT3UrLAcqQ#`HK ztIWP+v?gVCO`N2MRul1|tIR`}i8#nGk=xA0b~(NJE-zWgm)1)8Xu&;Pq3WvYs@&mG zk0vt`fdP9Z!4f#DvZ1!_?#n5NMBL&&b?5cdS3G}!#dJ%dzL`QT9Q;|QyLs1@qS(ty zuDh<(Uuei^sFJE>2ps@~xm|rfKv$|c&t1)wYMGg*id`$KPb+L)3bCZuD@Cd#`^;5V zZLX@TT3b`QrXH(8;=jM#Q8O`!V=nlGV=p2tRhzk(EHwx;M~2pU8p;-modyKM695$} z@Aeu@S-A##KnOzjL4m9=z1EvviH})Qg~S!Bdb-F0**As^lYyk#sU!`rIObDn$?UoF zO=(?4rQokxDTZAVi6V21ExKyK!ug1oX%p+GPFyl|MeQWy)FaQVg%)X`TX;y4dMPSWW+J0VQyb&bOYwD!O3TR4y{=@wmtJe>RF+*O zio9|~oom_6t*)xHs;XvbWG*Fh7nWF-K*O=9j*u}Gb$1rzo7(zyQ=F7Xmp5Eny5RHk z%NES@M*jQ_3rm^Yjq?|lExhi!Yi_vyv;{JzAaqR-NI#FLVMc4KBw=fpuUVyH-Z#{( zsWM9|R@7ISc{PpzS&D7sh|FG^aj@ZjgOUyGgWifc$^Y0a_$ z-z}+H>%1>osh5T+bK$zuPWS?u@YJuXS;GId^;epRmO#I?1qKAIT&5Z<$*NVA1^HMgbv5;s zYsuGNR&>cavyRld!U8j~GBWWNBl^jkSU<_N$wj5YZ0(xL>N1g$Syt6hdDoIWuYx6| zXq{|~X+EpU8gmotFOFFE#8$e#t`@V~l3@jlvc$hap0!bb_nnJtS1_W#VV|wG#xWAz z+WtBs-m*C*^JmYSTXMta=PZ)gSRtSysU`06d!jg^C5SApL&{Xv!Tu1z2bR=W0b z65Qh`7}SbUBVQXPzGB7Vipu58$`$da_FK`=ziX$rIlUuC>QN0Q>zCnm=}7PHAL{ulxLbB(h^~RIQVMv#x6&=IsJjfwQVQ zYjLl;LN$@PS%ag@dSxU3O=r#rmnx#mtsG~nnj$+rJrgoxYRBjJ^3Y7xGlw3lU2FAW)V@wS5}M>W=!m>nj^pOr>3A863Z|UY6Jr z3_s6N=wsEps;eyL%M$Zkc(sGw#f+%Vl|nF11>&Kk7OSG6Vyc;|7y{OXGtlC@SE7eq z6=(tI(?NGutg>jEYE3O4ppKZf`cC1qfm$rZ0dDy3HMx`VPTyjhW;U(9YQ@rN)T=iW zC$E~qFEVlRm!{O+wXS~EZ6yD9d*1>cRduetW-@^w5hJD=6(vYiP{7$UlgR{7!zDl@ z#7I(%nszgp*^`V+X5!4`0;W1DDk`O5y~NAW97T*mTUya#>m^#Mw%X&RSkYrGwy4xn zr7b;jJldXjt@TYZ*)x%7;{V&{ta+X<-+tG9y?fpE+TYp{aHf5FsdsvSWBxb`D@pok zrGbFcDD^qrc8AyS7#^2a>L_k#aJeir?^@h(kt{grQ%K{r2LB~+zFPc} zxF+tfH+cQJHyZV>)Wb%*F3ZYGCEW28C+iStjq8zsj^@>9u&SE4Q`a@Egog=Wvr3FH zXwac@`Noa!+j189W-@k>*&+ybi}^Kn^2MbM*EZ~=*Ww!(wXprG#kCFBHk=Ku-Gz_h z?8gT~>Jf>*%UIiuKlpK+`kRfwog49v1;%q*p>5b`?uG7xehE6afU(`s`=Jj&hYAty zKE^sG;q?Xd>eKNqbramq!1g@!J`ng4^lTTdq2t)sUUWZWWiX_vgPt}Eud<+Dg6@Kj z&t|L#x&Q_?+oAK$!kazl9cLpx^nnE^Z4YC2E@sRFU5CBzMbMQ?@Xj1M2k#H=gg$s4 zw$h=yV8GK0y}kx7FQB)Bt$on-%aG0kh+l{IbI{W+Lb;*+^(X^$zK(35yP>y1?_Z8` zaDOk}tUwp~@OlaQIq19xk%obHNznC8C=c`&7}~vg zxQ6!MhVnw!-+}rO7KV$Hy}ZUfz$oX#yM7TL?Z+VxxOb zLh_T@=ual2oF}tUtEV#Cl+&2C`ZSh3Wg4^0p2lpuAsy3^-*ouRV7Bcun6(gXr`pc4 zcG^(}2eYnmFiRJ7p_5svoow_$7t67ESoWJUnFZ} zVzz=g;Cn8!_~){$oO!78JeJ)(ANQ;r?RFs>(^SF6EMLq<&qk%=OPH+)ZD(sW%kDXk zS$3SqtPE|ZdMUHUm$K{^YFL&XZD$uG@pYE<=GVc&GG_Il9qp-O*3bpaX1j>x)YY@m zkJYnL^BY*sY#+<&^|4V+0cHsWQ13=&t88Lf`I9<1Fi@IO-qAeQIY}`#VtYRm`#n?WenwWrr?Dm;|#;yOL#9 zU&(CsS25dx)hz3|tJz__*RrwkH7qOtIyNePJD}wf_|ociUGxdVn8vV7*Gr-1{4E|0mXn~Krx^gPz)#r z6a$I@#eiZ!F`yVw3@8Q^1BwB~fMP%~pcqgLCgetC%_NavBp*+~5I65~nZyrjVSr18H#1U{NH{`Y{u zI5sWxv80b9eLQJ?&YP!u0%`ouO@SwpE+jpP^hu;~#1_B2L=oweNuNUcRMJyOPbGaC z>C;J1BR!q;4AMA~i(g&>M{!fi!Sm5(X)I+mzTit zbD_UM`kQd%?vtN}LrxyUadd%?BD^2x`nglm-Ae8(OS<3uC{HMljo&WyZG`V8y_xhw zq<>2KDbhbDolO7HLGtY;_YTT88U7hld6Mq04M<0}Dqh0mFW$|s@>mDym8xP1xg|5==0v$9e6(;u2&^|_a&x_6JVSP^mt1pffuvK+D+@*t!a z@*BuL2>$oFWjy3W$TUbLWH}@ZxeT%%au4K3kY30ukl#c83Sm~nh0KI3f-HkHKw2PI zLT-fI1K9@I0oeuF3pohM$zqlQ$P~y-$RbEBBnnv#xdpNV@)l%2gxQ!S7g7XqLFPm1 zAR$O6TDMJX+EGIZMy4sM5>pYHOt+zdb<0Yjnnnps2!)9m@wSH604`!aZ{M7cw` zD}Xjy?!#>!Zc4?`5lgDX7in(sMve03=IX_0Jt$gDT+>34M$}I*InPm^;^P35jqxVw zHD4=78);fRq%zIOD}e6zv36 zqe6c1l-yqQf84!(CPpN!kt^8J#WltHh*UHd3pR#FrlP@c%!tOzQ(D#+XRRb^Ah9;w z&0*in(iV)VdIKhg@??wu;^p$zlnd@tN>v=gd=Y{(9~ZvRP*GmpjOj&mEMBtGc!b89 z@}zUA(cv>%;`pG&e246WHSyB85p52Jy>UbI%Gzb<$piW;Pg1(3c2>CRz7DTWqm`le zC7twXFdBnl9U~c^dSqZey`%?>H$@}uJV;|lhmHv|772Sp!T3tO%?{TK{h?}6vT(b& ziM7kBG&@hO!`l#S)3g#?hrF?v9$(pF=)rIxQqE(Uf;kW+7R(rukI((YxZ0b%aluVI z)TTE?B5{n@n49pk=z258FtLm<@L?b?=6`lP_rXdJYsnLG^YGi2V@p`_5|;exq63z- zwmp`u<0=nY^4I2X$=PS^tZP|odC9sxXQO4xuB`lxmM%-~MlAB|MfqE;t1Vn|a@JUE zwkbVXU0DaLyRxg}do4M6xmzrG2P}_eAGFkNv~*hzT6(M-vp&f>nDwS*yLD^!TDVM@ zf*f~Q{XLc*OZ|kR30tx!6ik>fp(|^r)xT!!LCb1OPc};P38LrTY0W)o-8-hRZao%r zJ5gTS0bBJ=S^Khb9?Nnw$9wn*w8Gjn#WrSxF-bT3PC>ekJVKRK2@EHOp z*a5-|$={YQ!~4m9HR0z7cM<-G@Ls|b#>(__zb4~<3wRu_*wGR{ko3obpF8K~QvC@} z6ga^O3#ES*`G*MC682A${!bF_AUyYQncwQurT>G#oZqcyNIV(5ay&tkc!R(R)v!wri!qW)n zVCl`v`x4958*_)#2*trut4G^Xs0~<3l$RofbfKKB(|d6a{u*&FCyHr zSo%i^CkWq`3{UuB!gmt>CE-PtGX81D$n@(7pF_BEiS+*&;hbuTC!?S6^04zHzKn1! z;a?FxNO<(IGJMxk8U7f;>uV%#C%nB@;$4L6mr3k7j>=aj@tuULFO=AZp_`Xy+C>sK z686_id==q*UE)oIy9qx+xNEue&zr#0OR#N(&nEmP;d=@1C;STGGOvvP5n(^!))QoU zk2OgD{}h<9LZ8I06J`0IBm8Z`Eq>|$2NN!xD8s)%{!2{QOL#B&$4vNY!nuY_{|>@a z2tP`AXQT9gk??-P?-0&ulK%fgxQOtPg|d8Qgij@0Pxx$LJ{}(k%J?@3{{&mKLgIHQ z{1(FVCrSQXmq`EH2~Uek{C!}a-d4idC&~QlTBZMTVD4W}_{Zd5)+YU5COo@c;;EBm z{5J_-0nFp?CH!mhx2=@ni;HCVJi^x!Ub9O2e@M9Ha)}q8EW;=9R>JGa|9QfD2~Rmi zhVMwo`11*GA-s(6R>Dsbwp}H|=btL$uO=KMyoT_rgg?1jhIdbq;VZ9^_-?|xua$WG zRO$c1brQFj@CFn9p$ShrO~&6z@#BQo-yqX_i*Wrqi7QT*;cefM_(j4KHc0H5CjH9@ zKSsFnM(O`L;XU7#c*=Ace)~-lR}% zgty)&)6a9s{B{sNiE#BM>5q@@iSl$4UO>2)a2?^72wzNiAK^~Ii|&`{ts`7VxSQ}A z!apM1MR*6{9>TvNyq)kL2|q{p6T-U)k1Lkt-$%HRFzb=!aT4|rUO;#e;R^`+35N*Z zN%(TYTL|AsxR>yKgm)6&PIw>T=Lxe1WO?2qJcaOI2v-xfxn+IggpVQIL-;hp+X$aY z_&LJWgm)445#CFPL5BL20pSw}dkCLFxRUT3!dnT~67D73Ncbhfs|fEQ{B6RvEi(UZ!gj(B5iTSA3}HXv z*9mtJ-bZ*X;eQg|PI$aW)^8W#lL_x5>>-@{Jz1W`gbN6NlW-B?O9;;=yqe=|#(JNU z@rz0&ew*+P;1jbG%=)zSe}nK*gg+!anXqN1jBh6#B77d<*MNC?-Gu*6_))^6XG#BO z2%kXsHNt0coReVt`8yoOST$jmC9y%cfbgZj<8tsmiSS19?;!jL;q`=f67C`VKH*-% zV`t0!cM+ZjJZ=mMQYQ0nAUuUIJ5%~knJfK+gr_c$xRr1l;nz4mjInOQ`#2uU*mlB) zodukW`$gD>tdFqd;jg?u1yXZr#1GRQ=cx}PItNzii{~g4{<`~1h7@X01@H{n?( zyugIdGhwd@2TeF)!fhsejR~(e;ag4kZWHb?;UAjtqbA&I!oM)#mreL}6W(pYe>CAw zP1rVi;QbhD!bh5LfeBAC;i)F9nea>#o@>IDCR}U6c+Je)e_#9Yn{dd4<0kwq6JBk? z*PHNdCVYZEQCM% zOoS9dCP7Yu@HwLhath=$$mx*jkQtCOAa;lbaX_397o-^ChLk``Au}PfAbh?#6LJ>h zY)Bbo4g}LFn+KT>DTiP>WD6mSAQg~vAd4X|?O;nFRgiNb)sXWbOCdFoTFBQSd>%U= zQU|#Jav|g*NIm2mkZ(eC$a07m(g5*6l6)rXdn(+fK&C>zNZmb%_pelcb2}P?@*f7_ z?I{=XMcUK^#5)0EZc``2E!p1q?3L-w&``}z{*M?44DyyuSq@~f`cRewU%*txttWrbsLv=!n8fG8PH7@sLi9t`Qf;IFt^WYc$^4B5Y-(DPE?y z4p%ZR@{p!`dV4eobD_`3us@Q>aA-Mc#mSsRq_(7)U#3#Qu#lTb4PsGg&ty_*H``PS z1EH#nscTST1qt&qZvu#5_Y^giP&ZnKoJNPRYq!!je~_D{mjicBfx{haFw8(OJd zvy(L#@p{O>{RWK#O~vMEDJfDQhbI{0MpH0T=C;>LgDNS4%X~;%$VH-GGjy$6?Z1y`XwQ8$y=XICZp4-UVc1 zaHRHS%@Ie=RXi(!rFGtinafzdo9 zo!oMK8Q|s;Qyk*161TwF;tiF?!tK&Fzr5PVZH%QCB`el>JhN0+&CW+KIeHC9z61<6 z;1q{BLW#&AB*?!P&aVsVILKz^D#Z6>CnLsU}puSa|Sg{8tjW9 zcJO|fsT-Q>!|x_f(xLexQNtJFO&R@sqzWzXcWXQtifNjdY+`zQaAf8M^t1+%KJP9i z;`mE*3$IU&rb|O|?!mL|I~X&-w^$Ub6bB!^q%ygYGY;WUrhP@#?A%=*@k#M>aOYqP zEjjoSgpVr2Z8bbs%_UQ&HaQ|`I>f}sQ{*R$#69I!_ajwe2Ok@fsgDQ;PM#vVp_o=y zjzp4<(kPa3ZH71&g>z<&Jb9ez!hs`xDr%VhQrtL4)MyD|8o?1i?{E|JiGHq?a2_aG zzesnuTu{PdIQO+iqXzyPF<(N7AypH+ixm}bC{?0MIylAynlIjpvst{R4viNpHMY)! z%Opfoi?)XO=`}s*7mkjSk~#$wDXU<9z*KL;IYs{D z#+%q+t<8fIN8-q9a`F=`EHx#uz(#U|Q<{mk!={E2nAjPaH!m$v>$dpH!q@zB<2h_6cQGJ6ltp6`J1=N|q)n{~et^I_)a zdjMi=;muPV&Zg$6xy9pUBpebC*1TDcP-m}+J3Pt#mP`j(`*%r1!G?E2xPR%KdOoi| z3wnf*&wqyuOx$3|(*_*Q&9t>c<6?4D9g$~Bhoz+{JFLA zQJ%I0TsYa+g7bpd-3$bb;XK-6eoJ|_CEog;q_OiD3lB{zpt?+f*!J}2W6?A+AIR?_F#cW9k^;aNtcySUFgZ1l(J zcMb79AWEsC}RqZ8C~7p7(bjV+gN2W#;ywgXEd!L&5Ck^WLVq8NsdxR4^*F? zj$K%R$M_LjxhFH+;#T)jFCRCDRd9E#wE=vll$(yV_ho`3*XPO`S*f|(aKPAK;m49X z7zkpz7;aq#w$Wli)QD^z>Vlg}t=LrJ;TE|6312=*@Mi$*BjBl8_9gK=VaJ*hTekdp zaRe$OIO6G+@{fJ+PkH!9Ak}Ko>MK1wNnX(55`#1JDVrP~QB<)Xi3Npt`!!-^7OQCf zbcb)Nln=fj9^$Oh$F3$8LVSUQ7agHsLlnzl+79{5-DOv%F~*g)^zP5cgm@byHe&ihuG+73`H8eq2yaX5D@EYKK&0isCn8aS%%0)6_!sGcvMbqG>NjiQukP5 zMhIU(!q-w_SXg1urf2lz)))UMl$O4==M=*iOy1($jvyJB9=b)4KuV|%eVwR?)q zH*EH#zPcHixumbDX`-p|JO+$XgVuD2eZDV!Im9#@@urA>WV1+FP&hS1Y$prr68SB_ zWg%rq6k;DpkYqc_s`Xu#uw$dgZ$;^2rQlZ znAIF;vFM02)3ENcR5s4sN`6=-Xlv?;R?W*?mS0hP0x< z6mzI|9O5=7^BaNc9jb1!yE}t8_1MB8~Gqa`?@7*Ax*YST80pIOdt#A&BK7hKXj*y z&%L_RT-<3co-`NDp6298b8)7*6sNgpX)Z%aC%r)F7+R_#7mFp$Ph7|Zbv$Ej`Zp{({psD)9FkvgfqPm_z;J=$vM+om@}PaXL?ax z>4k8mr{zkIm|masl+tO?(u=O8r|n3m!I56543wr9Dm}mSgfcV`EkmgE+BnjyoT=#P zchHgEk~37$k$wj=wXF0iW@rtrbZRo)`t+h^Y7M1)z=!p?Bh`eq-?X*wp-q^JaMS2W z7_+b0>Nm|ockqn>XQma2Gi{Tjyre0}_cQPb>91({LXp1m)z)PE@F{mq{jf2w3J==< z#ZXbXFV)I@Adg>iRwha^e`vXn1@U&9f3P~~GVrajbWJ`^rO(%530zxYrjxs*v(6pU zzD#Rs^;&6+f09<1sU$6-V*R-cEG`oKjOvN(QeUZy%D{43TA~kDnPrCvfPQ+&^E~C6 zCRSNZkr4mJ>{qn+6dTPA20plszWwF4$^MKg-7%jp#y>QVOuroajq;S-a13F9B{k2s z((G7-(|SeRZXLc$jA*0bUnsT|WAt5;#Y*f_*#r@Bf~jz=&cCD zae`U#5f}N*nQrJhx}J!C`p{BnW%%085Pk?tp)9b7;wCYyYh~g3s?El@){eE==X7sf zT6J;a$!CwdclyCsN;Vxc@4v4(RH{2$j{a@!`pX~78h7(krylXce}BF9iPje${!R3< zALL&5dY68_AEQ=(;a($R=23~uuGb5wm3Sk`M}*h?RV>LuZjF)(!}nYIvy%H=I75` zy0cb$DR^{K>)o^Bt>@nw`oR@h7qK;${OzZw7a#r6qypR9Pv+hClllkdKYabXkJr8N zPSJ`FPrIgK+W1#5?EGuVgG_(Exa#3COCH_$=dyeEY<}RwO=qVojW#~@)8*q%{^*SjlV4x`t4%ZSeQwb&H?4amxcnQ1KY9Ci8*jg3_s8}RrbO4@ zap5oCKkMz$or?n7v_}^F{N|EdSO2j6Pdndfy6;EXcXnp)d1LLHfB&F&{(06vowDTE zw|+jV;+v;G{ps|D6V5nhUFnA_UjOj2RX1GPeXxDg&9>IEOpUoz*4 z*Gsw=?W&(R-1H9>zj(*^wqLyc#F;Pu&$7MuZdiKHuKS-~d)Bs@_Z@lbl#_lich7=D z#UHN!!nU&eUyS_a7mvQ}>%Hu~4e$NootN)Aa{m1HZ`|;gg0A03^k_~0L$&maEJryl&Z%L|8*Y3Y~=Zo*pyeRnA z{g?jxg+Dp_fqU1#a8K`sACI26adY;69d-Y0`)@k-%!R-G{zcd26=xsJfA{09SN?hO zTQ~mZSl=mShHI5$eb=eRMGtM7@?PSJ#Wg2>5U+c8`ANs;wjFoZZL9Bja>mssbktw) Z9{csIj@vN)@R3N2FCV|fznH;t{ug^Upp*ar literal 0 HcmV?d00001 diff --git a/csharp/src/obj/Release/net10.0/print_hej.AssemblyInfo.cs b/csharp/src/obj/Release/net10.0/print_hej.AssemblyInfo.cs new file mode 100644 index 0000000..1af6ba2 --- /dev/null +++ b/csharp/src/obj/Release/net10.0/print_hej.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("print_hej")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("print_hej")] +[assembly: System.Reflection.AssemblyTitleAttribute("print_hej")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/csharp/src/obj/Release/net10.0/print_hej.AssemblyInfoInputs.cache b/csharp/src/obj/Release/net10.0/print_hej.AssemblyInfoInputs.cache new file mode 100644 index 0000000..9f3fffc --- /dev/null +++ b/csharp/src/obj/Release/net10.0/print_hej.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +9324562fecfe65b81ece195077e8b3a7cf0ee90cf8e00b3fecfede514b6ce9e8 diff --git a/csharp/src/obj/Release/net10.0/print_hej.GeneratedMSBuildEditorConfig.editorconfig b/csharp/src/obj/Release/net10.0/print_hej.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..3c669bb --- /dev/null +++ b/csharp/src/obj/Release/net10.0/print_hej.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,17 @@ +is_global = true +build_property.TargetFramework = net10.0 +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v10.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = print_hej +build_property.ProjectDir = /Users/einand/Code/test/csharp/src/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.EffectiveAnalysisLevelStyle = 10.0 +build_property.EnableCodeStyleSeverity = diff --git a/csharp/src/obj/Release/net10.0/print_hej.GlobalUsings.g.cs b/csharp/src/obj/Release/net10.0/print_hej.GlobalUsings.g.cs new file mode 100644 index 0000000..d12bcbc --- /dev/null +++ b/csharp/src/obj/Release/net10.0/print_hej.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/csharp/src/obj/Release/net10.0/print_hej.assets.cache b/csharp/src/obj/Release/net10.0/print_hej.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..014ef25f639c9fd9b2e285ccd1821a252d56b3c2 GIT binary patch literal 151 zcmWIWc6a1qU|>)RKK1*7WNAfmh~A-s+Qeh*1$Gkz61usU*(|rX8L!Ga8K{O>zz9?* lryp9JT2!o`nwgiFm!hwiSDKz$qF<1hoSm4STC7jVC;+ts8ZQ6< literal 0 HcmV?d00001 diff --git a/csharp/src/obj/Release/net10.0/print_hej.csproj.CoreCompileInputs.cache b/csharp/src/obj/Release/net10.0/print_hej.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..68b86d4 --- /dev/null +++ b/csharp/src/obj/Release/net10.0/print_hej.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +722ece028348cdcaacef3b0cac3b83e003f567cf56fab18454f8fa25c624cd34 diff --git a/csharp/src/obj/Release/net10.0/print_hej.csproj.FileListAbsolute.txt b/csharp/src/obj/Release/net10.0/print_hej.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..b2d575f --- /dev/null +++ b/csharp/src/obj/Release/net10.0/print_hej.csproj.FileListAbsolute.txt @@ -0,0 +1,14 @@ +/Users/einand/Code/test/csharp/src/bin/Release/net10.0/print_hej +/Users/einand/Code/test/csharp/src/bin/Release/net10.0/print_hej.deps.json +/Users/einand/Code/test/csharp/src/bin/Release/net10.0/print_hej.runtimeconfig.json +/Users/einand/Code/test/csharp/src/bin/Release/net10.0/print_hej.dll +/Users/einand/Code/test/csharp/src/bin/Release/net10.0/print_hej.pdb +/Users/einand/Code/test/csharp/src/obj/Release/net10.0/print_hej.GeneratedMSBuildEditorConfig.editorconfig +/Users/einand/Code/test/csharp/src/obj/Release/net10.0/print_hej.AssemblyInfoInputs.cache +/Users/einand/Code/test/csharp/src/obj/Release/net10.0/print_hej.AssemblyInfo.cs +/Users/einand/Code/test/csharp/src/obj/Release/net10.0/print_hej.csproj.CoreCompileInputs.cache +/Users/einand/Code/test/csharp/src/obj/Release/net10.0/print_hej.dll +/Users/einand/Code/test/csharp/src/obj/Release/net10.0/refint/print_hej.dll +/Users/einand/Code/test/csharp/src/obj/Release/net10.0/print_hej.pdb +/Users/einand/Code/test/csharp/src/obj/Release/net10.0/print_hej.genruntimeconfig.cache +/Users/einand/Code/test/csharp/src/obj/Release/net10.0/ref/print_hej.dll diff --git a/csharp/src/obj/Release/net10.0/print_hej.dll b/csharp/src/obj/Release/net10.0/print_hej.dll new file mode 100644 index 0000000000000000000000000000000000000000..7988b14955382bc55c74487319c371b78f23a503 GIT binary patch literal 5632 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 literal 0 HcmV?d00001 diff --git a/csharp/src/obj/Release/net10.0/ref/print_hej.dll b/csharp/src/obj/Release/net10.0/ref/print_hej.dll new file mode 100644 index 0000000000000000000000000000000000000000..1cca2a8a7d33285901306fb3f9eeb529b0c9d936 GIT binary patch literal 5632 zcmeHKO>7)R7JlW}S$hIQA`-;UZs?4I0D;@%*g_EeGmd}2kT}Mkm?a?DJv}w!PWor) z>KQzHSbTvKNO0l^H*P2(4iOQ88ysM@E5uh+1!uhA|d>P5eFiRe5=ZY2$`4z{qIzx#tcy+82zq4VPS=ZDH0jxriy zP!BE7ur1#YBBLUWu<09)Z_J)tF}$EE&6{t|9Zp0q%@G|Jz4X;s{p(cQw^X1#qDa&a zN-m}zoX1!~H_&;)V^3^1X4-xp=`D1225lFuzeKcG|GQ&?#w_$1^q=JUI?-%jLd*_Z zL^lCH2fjaM>DQWn?&+>9_kygMf7nD9K) z3|Mc5Dzrh@Z5Xr=sDy;0UZ6ZOatOIT5kVe=-A2=$Ap#; z=b6@+Su{tBqa%;-=00)(&qMg&Uy;|4f5y=VSEA7I>-zkyBY$%WA3U`}RZKWX4nB5j zVHRTq{NIcpbAt*-ZrCm!J3utR$WLOFZj0^beOS|-{o!=TJ@E~*cLmSc&HvCZVmAeX z;T`myxP=a4>u!2fQ&#C!&{xG5fbS8*K*Luw9MJSBJ^zQ6Q_#DH^!!NACt69YDUQot z`UvPWED^L+VhdiUzlp&P_VVo)p@VG~G}JRd7h&f3-pIUV6hRGN{b#ir|Sr%Wp)y^7l|J5iRgY=w0h&7=B|F9hM)u7s3--f`us z43!i3S1vC2wIKAY2#c2cKe=WCzvk4Nq2}ufS(ddGt0trNGQ3h<`b^+899J_hOV`@e zv&?#G*;0sj*im<5>NNCm4bWYHCK*cKmg&~+Qc7W^mf!9!B+=FM$f-E46J=JnKLRsx z9j_xb@KQ!=8}dwdW>#I7U@g~p$-|=)mg9FGq^!Bp<{*-3M?sjAGwAC-H?{WS zzAtk}`$&jC<@<#$p@eC1krOp+AXs~7vkK3BA9W#_4QKP0U&w0I+Vwa6c&X1{U@M&&S>PP4) z8xBhSh@XFreei} zG6Apm_Qv&tfK-b@$Z=4INXYc5hTELmVZE!2RSQ&wb&DeK1;FBVuGfIA0yah9azL-| zAn9i)7F6u~#;Afh(HL$&fx9vwj~ZG>8y;D}kOj~hiOdMTZh&?Mv~j&BwRRR%g`1mo zH@4Zf)7~O7o#@!NioGFrcl{Z`OQ^lXn}cMr!BAL977{w8zqzQ6F%_|&H78m+kM zm?$8-7YtnAK^6DgMB!9?YBUPNT0j&wRm3IIby{BTqM6hPLO2!Up8N(eR qU0V{fhqHE%4|m+3%#9DH4`vci{8!#e@i&_B(68K&8|MFC5%@0>v##g> literal 0 HcmV?d00001 diff --git a/csharp/src/obj/Release/net10.0/refint/print_hej.dll b/csharp/src/obj/Release/net10.0/refint/print_hej.dll new file mode 100644 index 0000000000000000000000000000000000000000..1cca2a8a7d33285901306fb3f9eeb529b0c9d936 GIT binary patch literal 5632 zcmeHKO>7)R7JlW}S$hIQA`-;UZs?4I0D;@%*g_EeGmd}2kT}Mkm?a?DJv}w!PWor) z>KQzHSbTvKNO0l^H*P2(4iOQ88ysM@E5uh+1!uhA|d>P5eFiRe5=ZY2$`4z{qIzx#tcy+82zq4VPS=ZDH0jxriy zP!BE7ur1#YBBLUWu<09)Z_J)tF}$EE&6{t|9Zp0q%@G|Jz4X;s{p(cQw^X1#qDa&a zN-m}zoX1!~H_&;)V^3^1X4-xp=`D1225lFuzeKcG|GQ&?#w_$1^q=JUI?-%jLd*_Z zL^lCH2fjaM>DQWn?&+>9_kygMf7nD9K) z3|Mc5Dzrh@Z5Xr=sDy;0UZ6ZOatOIT5kVe=-A2=$Ap#; z=b6@+Su{tBqa%;-=00)(&qMg&Uy;|4f5y=VSEA7I>-zkyBY$%WA3U`}RZKWX4nB5j zVHRTq{NIcpbAt*-ZrCm!J3utR$WLOFZj0^beOS|-{o!=TJ@E~*cLmSc&HvCZVmAeX z;T`myxP=a4>u!2fQ&#C!&{xG5fbS8*K*Luw9MJSBJ^zQ6Q_#DH^!!NACt69YDUQot z`UvPWED^L+VhdiUzlp&P_VVo)p@VG~G}JRd7h&f3-pIUV6hRGN{b#ir|Sr%Wp)y^7l|J5iRgY=w0h&7=B|F9hM)u7s3--f`us z43!i3S1vC2wIKAY2#c2cKe=WCzvk4Nq2}ufS(ddGt0trNGQ3h<`b^+899J_hOV`@e zv&?#G*;0sj*im<5>NNCm4bWYHCK*cKmg&~+Qc7W^mf!9!B+=FM$f-E46J=JnKLRsx z9j_xb@KQ!=8}dwdW>#I7U@g~p$-|=)mg9FGq^!Bp<{*-3M?sjAGwAC-H?{WS zzAtk}`$&jC<@<#$p@eC1krOp+AXs~7vkK3BA9W#_4QKP0U&w0I+Vwa6c&X1{U@M&&S>PP4) z8xBhSh@XFreei} zG6Apm_Qv&tfK-b@$Z=4INXYc5hTELmVZE!2RSQ&wb&DeK1;FBVuGfIA0yah9azL-| zAn9i)7F6u~#;Afh(HL$&fx9vwj~ZG>8y;D}kOj~hiOdMTZh&?Mv~j&BwRRR%g`1mo zH@4Zf)7~O7o#@!NioGFrcl{Z`OQ^lXn}cMr!BAL977{w8zqzQ6F%_|&H78m+kM zm?$8-7YtnAK^6DgMB!9?YBUPNT0j&wRm3IIby{BTqM6hPLO2!Up8N(eR qU0V{fhqHE%4|m+3%#9DH4`vci{8!#e@i&_B(68K&8|MFC5%@0>v##g> literal 0 HcmV?d00001 diff --git a/csharp/src/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/csharp/src/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/csharp/src/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/csharp/src/obj/Release/net8.0/apphost b/csharp/src/obj/Release/net8.0/apphost new file mode 100755 index 0000000000000000000000000000000000000000..df8e23cfc7b0b53f99e7d23dc19cf7ca4e96f73f GIT binary patch literal 106792 zcmeFa4|G+$Upt!=dgwe5}AK9D~q2;Sdk&p9VKxdhs` z-dn%**7{yt*O_x>X3w6z_w2oA&&TBw0d8LN)%jTDt zw=nYybMBgxvq0YV{HGiDe09;2z)7Zqyu92wcjWdg*6mw*zEk#dG_U0cO8Q@3UUl*M zYWsmC9A3f|)?l`O&8j2MGOn(FQL45pPbM#~s(S6xs;*bz@EYnZc&~e{D)Q`xXWHVl==@XDUB;H@^T`tt0CXM^cV^70C+sw+#&m)mc`;l0yf z!CNkjE~EicL|EnikaSvb7- zJ@$BQAo3iJlN+SSNl?R?otc}Nm$l&5MY+1X#e$>!`bjzR;XDg_RuXN&}jhl%i+cRDyb|kD9T$`P${z_9KT?ch2Jo{OL=y~ z8`O=8&UL|CS|#8vf~TS_c=mMAZQSr|vDWXc_BJ59_fF zZ@p#C?75b-Ddo5Mu-dN5v;0f8X)RA~Sl1|3J5ef7Px?+E4Kk>XY(qJ;lH!E9hVqe$ z*vWg}JVV_9poL2f)pC;=4cRqg7x5g^^3Z2)qjQ;1S zalDmrI{%Uxzre|V#Cc<-(y!1(%4E!HPg#sW?ZO3o3U9a}Wl{=Al`hqIrn~E_FQEQ= z)?c)ts=9bp$}GEyKvmcA6MQB@-xH)`?PsB{{JYA2PWTr5=$Z?xz0?b4v$*x4Kxl?iCxbpyn*N3&$&^72KV#6sK8S^ zhrGs-v$q>frx$pdE^PERT{xryL9fw#%Bz|a+f*RQZ)B(sRE4TFz7N^Ie~kCO_y?x9 zdClhcyot?UyHeG!P1v3@SnaNC@v5{o-hFkDs?YbTRLLLn4r+cvo|Q@)tZJ#J5=%dS zFe6CWT-A|Q=ka&W1^=Z7Q@3`5oHd_teVP2{tc+HKB=0XNmj``v0} zOdyr_d;6#_t-Vd{Z=;_J8?zY4tfsTKXErgefY9d*_?FOL34PVl*R7*eeZd1Nu=E-g zkTxNos&DfSZXU?{pM*j~PcQf>bTFDOWT}AAKOe^_gOGb&LUv0@~ zB(?g^r0-W6rO*7U{hg`6lX}6=LTUK}{hbr#S?bGkAAjeKJcqZ#3#`Ae@j%lBuL_K( z+{f=y_$>c#;*%i#yYPvZXBR#u&*AvI8wx!h+H4#-y&wvjL_-rJ5DIykLP<6c&c_6f zJ*xtL0T(~K4~AMY+K2i(lMJ;c$a~)lbvx!!mK3Gd+~QHW_`mfy*r}(WZIEAMf~pVh zq)lI|P4Wwm?C9cex*5Pt*X6>yHtHOOSJFqL>X>$6;~eNcy9xX>pWEp7x0Hv!$DdDx zu8G1+X{%vT_jT&ZcXjk%JV0E)PP20J#?L_+!PAs&V;V#kSpZ(g!wgpr^&osFZrz= zOOCghnud=F4WUhMG-Q779`&{v_z+z44YfzcVyN0TXVI^hbS!-c4ugOxct~ExJ&iO} zV>E>Z+5BpwFX+CJz8b*WO?%;o@avBQReekU=>1Y=BHIT(+iBizsA;Tm6KjFzlx2rP znkQcYC%eu?{7(j67e8mm2B3lFpTmQdwB6}ZYubkH9C2ae7oh#k@L*0;M;?6jdNf~U zta0@1@Q|2?#Y^yWANw5KU}h3b4399hb~DKhXLV>}F8=!~waeKS;} znnHb5rx~p#CEo9U+r* zr-F~XcX-ffsHr1?c^mD1^L2mcL3Fj$nF2h?3k?NNr#^AoRLKw7GOIJ2)R|jN)II7k zkNaZ%=U9^GzBfqV4AFK-aI<(Zq$ujo}`19U+ljb7kC?3z2VqJ@7Vu29pA8V4xiU2 zc<;>XZ;-zf9pl0G?Cn26uJ9=~;$v-A0ga!?tw-&tf(}*o{3;2XU-BG2zrJVVBR<64 zd}*$bh^9Unt<1~RMXX)JTo$9$C3 zREjwhi$8Tx`!h~`r>--n#WxDCqj?h_7eHV4@Lf)ee)81joW5Gsiwud5A?{Y6N&ll% zd|(#otOS{>gPNs|)R+9<$cr9mCUx-mA$dK^%Ok_9J(JQ!vl!L-2KUJowl;#NYV?do1B)LJw)H?HPLHJG$PW=2fKP ze|6+};GY*hcKczc7?VXKqxtjjJosPtznG-Ve_6T3k9(G^qE+ko>8 z@!4uD|5toD8LQ0SeCjy9*V)^%(4Vuqe6t|)U2u{$Lpk-t*7!dQO|849HY2DyUNV7G z=P|dMC-c&iegfUm+r*d?>yYte^sMkB+2}5>Wn8-7=-QlHG&~E3w9DWixUYo2n%089 z_>|x^Pq!b`JdiY$C9=aBXd`rnZ#`rt#+Dg;sVB^jRM9%zbxkR!Ioj1u|w9G~TW$C}bKrUhb2#~w=y)F`zkc|hF` z=2jxVUdyccZ>?9vmNQRmU(V7Sv+nah@~x{?qNGod{&(=vczh`%fbX|`US@{IXYPP4 z8lOv*x$!ZTxm6jS*F>j<<5dbSOZg=)@n^(dr3Q_=(cd(a`JVa0rX3~ttg+CoNz*O% zc&v*?vCwU%VfLV##t%G^*X=98GY=Z981RtB^HODQJY!YtR-a+M=I;g1Ai8TTIF19y z8z%aj^1!hG93OaL%MRhMgJ+)V4bPtZ)ii^@8YlQG`Yqc{&tA&hc=pEMSaj+yY@Mo% z+8MFv)Yw?1;}VumHJiT`qY}gIpXjYq$hF8r9dvGtQmJAO*tbdCbdA5sj8l7(;opbo zxOVEzi&lYK&uH&h@2Q|`T1Yq1y5^?2f>+8v^gcjAX$6RmQ0-lI;+{Hwl4Wh8pk z-kKGu=@-Fs>E$%7mxnZ82Y#*SHm7Muw6aH<%X0%6jycF`p9yeoD z?pR}}=Izu;tTmze0h{Irp!qe>d@VGes%btInqS3M6`&t*>H+hD#ZW;vL z2RBdEbnhMB7Hrl`W9aeG#5?M-TfN~o`qL2hYf$sg`&jD)i&s5yd!vuVmlM>vJYTf_ zpN20obp$jPn`xTX+T@rm=LL+17|aU_oW$lfMq?B36`sLY7#gJl?a*y7bUXk}-$P!7 zb{^^q?UESFG4dKVb0fLexzQ7MnIFB;wes)K^(f^v_!+(NNya5}E0%S-&@~+I!gCf) zE1}mW%7wnY(RBlK?Vblc@usbw3y%QfQZXS*Z@GNQzP4X*rOPkajD7+}kW}VF`_bBr zxkkrJTkvz@N=wsaUW|gK<0$*^sLE)k-ptZ*>1WYZ9}=5lJ9tk!>((2LxUDN~z4tWp z2|ak^!=b8E>K>==5To|tv!Va`xQ+G>um4OuR(S1?Qn|sS{tSWBKpZCy8zT1OL+Xxu z;h`P3%+1&O^dNBiMk$sC*lzUceC8{D!a%9t7rR}?-2E#!N!vzroV1@x`y?a&c;eKp zJ9c`898Zq3blfa>bK3SdQ=`=0YmrC6VJNU9E*K)#lM0L{`ruQ0ha7K3{*v<4$t+~f z?Az^^PSyHvaI=i1k$Je@H4jINjJtHDB?+m>nM6x{6L}APpIFv zxn;WO_#iP4(ec5f@YN%+#ol94HJ_;_eE-h%qQ~J;5ZcO^gntG$+0qZhQ|K#5A0;bN z*9*+L3&hH(`vdyC6l}rkP_(KS8z^vE$VJ-Zu@L~UjRKF)C zC%&n!Pd$k}OTPiBNBuiV#pWg>i?P_(vB=g;Wbq(+QsgvtxEdI{L}lPBB*yyuP2=#n z=TS%GRpd|Vm{Hc+FsURtUFLbXZFkmN;_u7+n@OJ{k8Skv9`D3f4=TMTUDg0%^QTcR z@1>5|?))bH{;Wc+@7P0qXMb>+qDU9&k9A_hpDP}lSK4ID$ZKI?}( zVY|a+-s#s_rzR6;D?z^N`j8G(8|ZtxIlON`;?^a|zFzx@Tp@R#ju3gabg0wbkyX7W zq0YzD5t{s%^ceJaaQb~eYwyXuR_}p#orU*d@b;rOrQdeo39U~v9v{Be6v~|boU&xz z+cD?u>Z87a>pl%VUem{tUpo8TTk zMj89d_PD~!4B$FAIW%~|uDgL$>`M4PgUlJ3F9pOC62VDyz<$<{;(LWc-lov?s;zsY#GV(lJXUDQ(1Cbc_wmf0NzNa5 z&X;wJE>CR!3H^(%4IaS1)%L$`UU!-FO<_B-6;Nq z;3=`27rVyR6QkzpiVycFaC24(0Ua9ywo%B;~4A1ZO}|;X#!JxI*DQAX?unKfNwqb zmyPCF>}FqhDs@)S?+x@dAD?yAsMmLVpT2g|*K_nGd_`9fM~KyZiO(Q3kiKR{v!*k9- zA_gJ8T+(^fgiovORU@(zuBSzZ-$J|a_nI#?HeaYSi#j5kaiqQZ9iq2oP4F(|P7HP_ z{;bR|Ck89){#I^$~Qv6M~7=5>v5I3C( zud0#B#rPmH=USkBgQq1Ug*FXCRJxv%$b&OhIUnJyw`FW&yjEOW{27tQeCARVZDl^c zJ`9^h4Ej>>XZW+*+{Bs_{~*Ym^T~b!z6mxsum>B~#VekLSHA<^V0=s2$23p)JA$W- zjv>tFE`H@Px1&0yY28jLbLr7*R8#O&W=Gw}s^c+ec@&?!;l=tL5_kTDSZY3YQ)EeE z45MT}p%vKx_kW`=fs@Uc>KT)~lQtjHCWwxn3+`jVeJr?3eCTOxk2{9lb+!OI&|<@? z`!uA_k-W_F@6cgykZPF$?^cN^Q+F@#gs%77Ws?62`EdCb84=k@x*u63ZYJ_A^EK*x z=y4~$^pMNmx7S#)z~k5{nV+H)OzgKY+|qMjqmQn3$cM;9CjQV;WJ7RRqs#xXn7h!+ z9h0v`rUZtpoyvg|tf|ewPY8VY1FfS@&IOkw`YWWbWPFH25}zzBOfMuhG;_aNBWEEz z@Q3pX4~su4u*64S04&Y34&m9L<~bU+6BF<0TgsfhhjK@b9iLO^D6$)b{_H7Pwv9R5 z$h^1T>;3QHv=ta%B$f9iwhf*u?~#oGq_PKpZn=l~aq&L9Wq%}Y*}eXE>m0E|R@`$? zbDqcI#V~ZP#DtQ(YRyz=v;S7k7Z7im={1i(&`0IYWc|Atxl4Aff1Ne$b>QRZgid=+ zE4Evo>0pmW_H{a0Z=ZqI+Wygp0l!6WNStab?OQ#Aw~l2_j2+WI;4@lgDB`qpSA8?5 z{g>abj6JFLC4Et4xP5Dp!BMun6m(jCaEZt@bi<}X`<{E`=a#e2ic4}@-AJj8yA{`o-a!INF2|64pcXIz3O_jL1QDLf(m^};ik z;K@Po3FpawDz#U1PdHzC ze&ha!6wAYI+v)166K82iNL;q`-$dB-}LSSq@XvJL6zhbAw zpK|Qn*QsA8`dZfL)T@=)4E5@$CvfU`FXfG-rxvLupV*qW`Uk%MiR@`x=fPy}(b3zr z^qFJ#84jzJm`s)EIDtoA^qs`iMAmwqy)l~`pH)ZBK*m-__%2+9ba>50ZG6I*sQ;X$_n2?zocY@O~ZtC1}HKwBZWvM8Cexo}<8yw_zuT#f;>9qO3)t z?7m8PmNPB}KY{JwDE)sbuz-1pROl9dZb|f|;~%;GgvQNRbtvq}-)JZM8kB8U$MD}C zsGXh+PtCzp z?;$oN-6;&)Ze z>IhaD9VPfzL2Qkt(+P_XcS(JG5{(ajfX0P>GVui*pCeb-(S2$gQqFTDvJ>um9mKzI zWLeH%IrB)yBJnwGPnZjJhBYQx*NQ(Osms>rJ{HqP${d>__Dl570^W-b8%o-9-D5Vl zGCqlWnLqzpj`_3iR1)jjpZ&A1=PvJwAF?-d7Ts0i z+GlX~Bn|>!_9Px*PofsxbqrrC9Nu`~$r#_jo`sLY5SqBom`lHkb5YL&SM;mMj(sj_ z_b7jVYg~!4b{W(xb)>%J8_7!_MWjw2tH@^yO&9laE(-nJn@_9l#VO;(?8V1EPQ2FN zG}TCat?9F@M?U1;ip7t9JnjCtC)=TytdAPmZxy<%oTUO~=%;Pe-F6}Ck%y==zq97o zJBbBs*|cTHN2k<_yPDfR&SQ@#eNx?yg0|Pv2KnohJwbOLr@hfS24sX5fvGKLUKk7_$xyRFy z@7Xk6{F+vI58dj3Q}TefBmV)px6u=iO`Ltpho4gzpR}pN-b?H>{}~lX5xR!e*Yo+? zmOjt-WOkfOwB+y=(*Hm3jO_)_sDA*@!#18zkoKS*vgOduywB65)TZggA~Gb7+I^Z5-H1$Y|12?4P^J+WrzFpC7n@tPezn_xD!EnakMbdc7yB z&&FHlsl@Mgp8+(LfB#s1#NbwrV%@^IuKi>A$@9}P&rF{A>2jW9pR(hM@%WPX4YFn@ zhPP)N@8{xE+`xOW;VanRo!3Y0k@GhO<6XoV%W=d6S0c~SZa!y_g5LP%xU2l>Qhyb3 zr*?0@<{NmDQBs}>q>ud_%=24br5}z&KMY82j41VEOkuMB)guE zcH#Bfo>c+4*gjV)GH6*a$Oh-`_v?D-i062R4-uCX z&6zFMlI^22#|j_x7{69`mz>1}w~P9u&A3M5S;Bi=cW~WZvOd;*fkO=IIXN>}C;oki zwaeL1nn}6%aaup2R|acYXN@7{XNX7RD>`NU?XvK(VwbFaD`2;Z-v~S}b@iPJd@k{u zC2xxV1-$d@rN|t3l~iC$8S50i#yG$`M~)XUH?vdkAN5_i(nd`&_5!Fp0Y<=8oVm<2cBAWFPt3 zKK}h@;Gg)*KjAstzs-E%(JtTiTe`g4w|&V4>pKD~t{YbK-+}dz4XY8p)_uFyIv0yy zF21k$<_(m~dtz2U+R~qMcG%M`=V8ID&eqitn~;5 zb0%g8KEP4VGi^Z^rAs}D!O^Y|J-HV>7ON6pGpWOzJU(QS#8GP>4$|%@{vUcP_b6we zmeR*M)&%RkYVXx97+LH+Y8YXCwbGZgdj`ED?WDg=%zc^btu9~EiSMN_wjjRbI($i4 z2g|sh_Q?Gl(KADupQOCRGh{2eF2jj=hR5zpIL|NjQ%S@9UOC@7Hrd}aXi06xBGvID zHQ(RV7d>Bt&dx=LjzW*`^b9)wz~o1EoVkAIhz;~t!~Q|zH9PN;Ig6jo{0rNYJLElb zz9P2i-10bLqH=+->j%&cMU-*bU*m%qfZS{**gqnunuQuAI-f61sf~ ztq&X;vCoNDyU$UsCx*$G;Y;m~qn;~|XOHQo>)AXbqtj~y9<%pS+;qK3pBoy{{5Jh{ z(oeQG^To5zMm6EH;Xe<@4;-fHI)`!2Tq$QYjKI^2j3XHm=giZ4p3@pesx4m4_D{Zmup`1C;w&WoD5+hV@2mZ3ixs3lk`uwUh{^8aclmnY( z+_f3!iQ$$Y&!?yxLhfc=t#aS-3_~u5A(tbM51sVXju7MDLVxYxRHtQl=y7ae?j!Ww zTV3J~xglEyKe1``xJ|2|O9mZU{gaDUpV+i2@C-u+heNBO&F3hexpJCCt3u<*-y{ZU z)5<^SVp^@UX_Y@vrS0r{30jq|PfvnY{sF{VvqtRutxd0E^mh>WA}jt_=!jmKnxLl1 z`gO1x`Wp9=HC?5i`11#}9}W+zj3cc!UShl4yvwoiY3rxb4qS?NrT1!lTH>vH1qGUK zLz)w4EAcB+4S7v)@^Jn%_^icSS@-Rf{&^mVO&0jhT}$UoaW}q$Wv}DmN2LBB?w@d% zAb11u72-SMFL1u1-WRXZo{3pI_Svkv_K9460Ng)Ob_4VJm>&1AX8alC5E_t*zp_|l z0y#PdozTl#jzoVQLjUA-$;*)ATl!k^Vx954@^~xf^@wqwe1&>vkdY2x$~jL*S2eoi zBty@s;muxX(E%-znNw%FbIR&qxKSi+B@OYq}w17r-`7vcVC_#BEg zhHM=h>(6K+hGyD4$wc-oKj~KV%oou&^U*uEpnv8yov)ZnoXD%sK{btDJGL3x1+O>9 zet3)8AG(2a06UG0&@_D>Aj6{Ji00Kc4gcAu;fJiR1b!^^l2m*vEkiDU>Y$CY_&BZX z|GE9CAKPVe7fr_gCg+VL^{|I0w$trb!6WTgeV;Z`=J-wM0PRzWA18iRk9O8vOKU?P z?X>$^PTITu?2fmZ==>n(q{Rk}mbHPlbslu;1Nxk_$cday7kee=q{UvP>2uO)y`H~y z>siNseHA<|XTOe9UbCWic#b{JqHnRKz2WDalfGZmbWrp6N!@F*uJa(QO=O)D%bE%r zcA8J&hv=AJW=9S<)Orq1uk+06aMs2uFX~x8e+c*gfv?MD&yn@`jXa0Lm9t^zD?G@y z7a70!KDzWJcP`q+_Xnq@c$GSwHO$PH*!P2uBEu!v2=2A*DS@U=Sw8c8<_}nhpa(`^ zd(UBeWt}AbA4Jz(L;gRx*QNEYeSb{KKSw;K1pOj5>O6IKA~V7MtnEBKeW#9@hLP@DiWF6kBfZfo}4O zk0dr=NVD))#&(Q#atK+I_{^QmZF_GeEr@OuUqsI0ya6n+%RatUut(b*Yy7gNdz3QK z^+JP!j!>>1cb|@zWX#$4m4lf-2N-9gwLf@r7W6&??y?6f<2CRVWeqEO`6^P;C0CNV zb*VFNcGH*GG?_bR>@gK+zt7sYy~;Hv=ic45VPg_mkTLDhV-k7md1m?C@+|Zte!P8; zUgSdXd>>h;f-lZ^nmRc*&lqIAD(PFKT{;VYU*?hc_qBFE*`zfWLPO;|k*vw%I8QVa ze^S=uB~faRv+g4{q2I@GhUgY#^n0wg4@RkJTR6iPdzJrTiQmmUs7~hNGy9;^Ek;X5 z&7ahoczo+yhz)%2vruXo@OMTVYx+X#m8*;|)eKi_ywulq+l@89Bz6X&6L)exnR~Xm zHG8=qbRneuZK1!!aAIYC;AqwF{ZwZEgoL69?6omh`0GH>yc0F z^+-7WoJY#J1snxuKl4}9GD`(U^3KoqYo>zJ-W3x9Zd_CG^@Tpj_x{tI0hDu~5C2!_ zalVQ0Cg01%AM0KhOrh?pc3n9yh@9_M4Jm=I+x2B#c!|gvD@W; z7TUX+ywHm?PHSrMIcj*8*h`!}w*I8fe0YFzXFfc`d^m0E*xu%ZqfeIr&(Wv7-Tn9l z<+8^mHlZC|Ch{xs9XZD-@~ipMIxygaFZTYZ)_Ga9tKqJw^`=~09{R;QqQkM-&e`c#fSsg99Ix|P z>uKkl;U`D&D-1)W-l4^s0}`(6lrbudnOZh&W_kn>T)2I(^oM|gi~Gx~|2 z!2YG|K_7(=?9*6!&|8azD)&LXcrroU&wPwG|cdLxc=hJ}4BOXsro$~_C+J^|KQ z=q7vg(*Gy4dz8H6kH~%bbiEcD*4#pw;3__eLq7{=IjcFOc^v(SFY=GjZX+2RY2|%v=thB2go3{J*4@swAFTy^>*6??sN$4 z82?bA6>(O%x1#SD0B1RMb>52WJba7O7Mt4%J%Tec?Xv(``Ygbr7oOT7=Te3CgMnA) z8Gd{;XXs@eiQV6mWDGn0J?=tQcsM`&9{2f6&e6t_ z&0)=N@D7>=p8tW4%kw54XT_JB?H%+QvG*4m@a1HG@1F&C#`g@V zoNsUEY`fM2&_up_Br;e_Sv&iPe)dGLVV%~!2D5o8@8ugO($4gB=y^5EsgVC0c;D!~>tZ{NEfSic8`!7rKG!7QR5-Uh z6Tj|f`mU_gCo#aZ_htPFk0!J3mi>aUz?SC}o_*MLiQ#G;g^b7;1TVQ;COAs{@O7ue zz{IxdHjG>2%(&zpk^5}PIi5w&y+Z1?ugUla_(vH@_-1YR=HiQm`xNpGi|fD>oq^xj z(?1X!Fq|^_@0#=f{8w39%eOUp)|GR$;rEv1E|}mhI0eyF;`5on6SxgxYgy~c81u1R zQf9cy;Qihb?07c5ulUNJSoe%9JkkdR9s>{Tq-__v?~pp@QA3;65$79nf1<6(>Yp{8 zY+JKEF_44)k~JlDwLkQWUhYFV_-99>Yq{%CgKy|MceGpi1_y-x`N-=r#wE7st31m& zVYxr>Au)`x_}U`pve(xxHk>-*_w2CO6MkYXm$ZpRg9DQptL%Z8z;oA=IU{hMka6ML zPluKzwjY4c#~lpo4w_GV9`KZVTy5t^t&JM&TaeU?wH_S3JxuDUhC3+!FDxr zXyD{W>{C%+>Y3h-G+EcV+ekkG^B{F{frkJx`ZnxF z6giN!9^Wa`b1l4%lnXw3j#7WHUGH7)x%7-x82au^5I@h6rxnz#75`KB z!S{A(Q^K0RPVcigGTwb|!Oi0@)7FoFcN*PetuHUGFXsY#J9i@UQ|6+~&uq>n!jCuC z08hq}uYCZ^*ZdFg5jv$(*6oY+JcI0<6{|)51Wuj}r|m*$?+3JZd{2dqIK%xf@zG^& z*Hix;$`!uoa@vRuT}kTrqR+546aT~Uug)AGR#B*W{g#g78|(+3;~Sjedu?spb8!3_ ziIZLj{1A8Cd%IJF9EpzEuBP7@xE~pjIwc*P$K*U=18`eJ$J76Q)~=f8QZDOr%AcTI z=#)YxCx%9|-dA__J*{({42bAvrAJ-$#pm($$xno3^9{HB7iyS@Z=#ksO;qU5^ z?IQw5kB1(YJEuag1ys4jTLMoSC7|WOSm~)Kbev z5I=Zi$1&cU^d-K#_z3P8>&3o;CBvpmhV@)&9T~^~hFgdI1bn*gNfGy&iT#uKR5I}? z85cSt=l7i9QJ28!ecCI|tGMxXzTu?%d}n0fQD`aS3in0a`q9B}0QmVn4ek8{^S1@q zjCcQF-pTt0e2stOoz_u&_s`E+7~O8+sK9-f=tK0TF-+DsgPI?ptuvSb{I2Dr5l zZ*kLG&3RYG$C|E^RMThfL5oi zd)|kTaZ3!egf*(1m#+KOKjk!Td%m)yQteB|cA4X^?fO$`n&ww`nK zU3UhLcE=MqJKA-BX_DxC%98PSMCX-|>iZL<&UsJAcaU@PKc^3=$N4@T|2f37uFtdF zcVPdRGcp!UopwSGcOT+gNt#HmRn-KII%Q4S z$h)}G73q0n(P`{EiOd;3IS-N8{33M~dsNo_>%q<0JU4Q$RqiJ@p|A7M*W=LFD?SVD zk#F8KUYI$pX~l~4nZPdoL11c==|H6vl4SWNQ?)c zOyYdo)dyn&PcvU+ejH^@)wp?ytiKPt;m+R6E(vCyT7wU>OmLFg&_Gw$z2aL;3p$i{r? z`xt+3W6vk{FoJTo?(1Ru(#Hgzg?<9(Ch7?tdxLWfK3&+j7`e+u{uUAY%weq?t=GCD z3np{iM_fW^D1I*fh#t$IxkDp5;dxRill=F{_vX{O)|lH>Q~yD(hHTGw*#LS?4FTeFnSMcc@k`Ki-&KMk{9}Y4ZMV(+2AYj4Dh$+Lh87{AAxh~ zfIlOcbWpwvhVFVdJxGci47{*0n{j*r{@u)ZKx?lkNL`bCygQ*KpOanrG`3j29WMP( zaeU_4V*{soCuds@i*4G8ekK-Sjl=pri=K;hV*@{>e|=`w#{Jif+kFN@=AEp4^EHhV zoAWzkI6jCEEBKy6PhaWpypuA)yM*Tk=(U*VOW{8lnrr@nQ>*X~yyjA0;3X3mlQ@{< zTP2PM>{&MKI`q2G(&Sm%OMk3=(z?D!PMf;VLYjW9+FmT_m_l7?^C{m5y`20i_UY7H zmy(|>-`e=BlAP-o~i9(&pX#LzojgjvASas=QXU0*AL-yL%yjiH25)T&ozQI zCw_j3@w`s`Az|YYJ?2qK>?`S?+t(@)?@iH&;PpXMeNt(B1pwY`3*;>5kDlXVx{0jvE6@gQ3R-PbUU( zjQtS{pNrdYctzWr+4Lj4&L(y2jfZmwLfbC?k~r9z(UmeYhU7b|{)NJ%iApiRe=NuZ=@EM-c6tBk1~eM&ss@9X0q* zHTX}a&n1U1-w-(VEPCA~hp&ML^L?s(f3BS}`36MN$)t2Si+GT|ndd35m2bNsFY-=k zn>3Mcp(A@c@p&ZfpLC;jKO*!)m63ei*K=B<|FtrBgW50ptd_Ge0_Q2(`H2m(hRP5) z&++WY<1@&kz<1JykdG~+Qb-L~GfAVbmB)i>y-7&_0VdHJ^VKMy3Wgle`XCN$}W$Dz+mZTl!;Z2ksA$YI>8ek$l)4KWMJ)Mho){H#@1sZ{MB7{;>*tlR84@ zTCtIQYeisZT5#7``}95SS2#T9ZyO0L@hiU43%v1{f!B4uDQtbj_;ME0t~=gf-CKE| zeSHsQ$aErSRWEyX{uJi`oI4QV>#yg4UCX}iS;j7TVh?*H&U~IbtFgd7cAJc6Q1ibb zXZiS&vOl?ldQzvB?6#L+Z~0uN>+$@GbUW4t`y9-5~i}D7%;^*~E%u z?c~S5`zvv)q`}tSeiAXNQTXazH$ls_`{!7O$xu*qT>kk(eP%znOvW@G9%qARDlv`DnCBRH&kf*XWCxac=oMDo6&U)JN?b&)s?yLyq#~1IJC`t)e-sa?zwqziA>;acYo&4<4;*LeTHlTjmvvbuaj#LY z7vzo#e^cqAdF8~WdfQvlW4G@#$8!H=o)P=nJnktU=iN%~G%vot?~^EZ{S9$^EbN%k zT*h6he=<0)O5L&49ZQ`XxYJx?#2sI;>7gCRxzqeT?ljLd`X0Y+Qr!-|U(mPAvsDXWKv8Q4`tvk*`n!ic;0nVPtIfg{;Ko{^mbr0V^ zpUSuJrQT-B^U(uqbNIFc{zD1=hM#emycgV@_}0aL17}ck%wJ^PKe&0gEz=`Oh1Oy> ze@b5DtA+2Ph7Luc=dQrUCSYp^;PVW`=ZOk9x=q^jc78OOxRQyzYOETWZsG%&{7pE; zH;Wp)PfkDJ9hv@gmT^S-5MQAWxHMM1lg>I#)~cy>_WHJ-v0)!9A3iuK@W7ueoW2ks&|Pf6FL*C=n*GA52WmdoL|+{TLK(y@M|3niYaEetCkG^!jZSPl z^?TOjcj`5HBV}@iteL*ssWT6sKy<8}VN|lFn?5S9eHh}vZoL{e1YMSKl<9mZa;r-R3WM!8N@+{+N zM4sgiqKx~S&_LQWQU60|@2*$EIWMU*720I7jypZt!#zw-AW!bnGVW5_en~v42|hH# zhne)z^sI42&Nnne%kM!;>9-j;a*z3V%_|uneZk*Z!@I5Q(SP^@qls@d9bSoS$@fi; zTe5OkB~A@I39UmlF~mB!i+6~#W&FO${hMIYD;e#a(@X+JDt-IFO=S2?p%Do3lesSb z%}hCGaDcN#oHLTT60?bw*kbem`MV2;=Z*RteR`VOzh^Wd--pfOn*yib(6Vw^?VBdw z%X#;V_?i!a*Xy`$qwkq77?F=mmYMjdOGHF*y6?n}(S zh4{D&@NuK8xEpx&r;WgsGed2RDNddRzC1&xK0N;!yMX*1Rtc$rKY)+!mwqJ1+yKol z@ZD40pFBfv{vb;Id$h@b$6EJ71CdebCmWmuejVwxl*<{czfxb95mOlGw4tuVO}fr0 z(I&{;1`!J;vR5bPmXN)7X+OYuPdn2d%WnlP?Xo3y!&rXJvz+k}e?#yRoRcXdu3$g^ zEP-l5*)&bj&wtD>QzERLYaVRpyw6BlUHR=gy8FOF8XI>@EHMIp#E=dT`^)rz zjDc^l2BdxiYdGh7+tPQV-M9EHsUnA)t@D*_qW6J!n7-sp*)j6smwZO7%8%|9JmlR& z*Z}RDv7cKv=*b2K2&K%1Ff?xPHRoadp*qabyM^ z0}tfvWGnGJ=1*eV^?V~(>Ll?EV)!6&xh3*UoyJa{r|@^Lc$V{jg6F>qo;FUq$cv2> z_-7Yoa<)?BQpftHt?k`z99Bg$0#`A9eZDS)e3>0-*)|@ZxA91Z--5?YJfFdCoT6XZ zdy;+&p@aL3>nL=F*w%kSzidH|x&QWQ7q5#xANcM2p~uDk$(c`V#^I`8MF;ZH^KDnw z&S1YO!#eLO-!d7}d^520xS&BcV|oprKani{(Rslbp?0L1I8|}gFBhOq(8(y{2E;@_giEyi?gD99{~CYPj2U& zoIF!k=5gCCI?h}#ZKe>5*n{4Xc_H_WH{s`qJ&=4G`8vK2%r}=TE@l0NKz6 z+Wv6!@DA2$%qcnVzKHpg!#w&D^JyXTY61G~)+Xke)^A$(Ko9hxmWf}}PGYCm@EgTX z%0)i56NeH$eUr3-IrSeBg9bMiFZ>-%tDd}n)qcN~_tIA09kAbh-F_#uLdWUvY`w%g zfxF&@yT`7(k@vFx)BRJv+AiN^msi=a9Q`6VE~k#jx9ED2?*yne<{kmqAOOPYl}W}dS@W8Ymx z2TPn(f16zPVzcCIH{XJ=WB2H3YmTAw9e>iy`F6W3yiX~YJ%vVXlb|WGEc_lU^(FpKD)35N zI$oZG_8iZ&;l`56dMW&@sqF8t_T^jH>To@CR@0EbuPk%^efm-Cb=5LI#fO2P(`4St zK7*uH$ouI9_WaxPxxiN#za{IvoGZ<`_*)h-wp`*P_22etU+pu#zbXChmoX6=kiYZd zVLwx1CcVY#62PObm$L~mv={v3Y=RT3%cP%CPk9-a6|Y-O9f{X<#pj^qO!%6O&zEEv zC*Nm%&NxpLj^sOiqxHGdH$B8(Tfk9q)=QT)*kuxz<+oqT(91$A(Pcs(#%THT6YNy$X z@BBBr&1TZxzw2*(tK3=3PGv0{z?KRx1V_i8oq~Nh`#$!AANXlsau?@v+~?GjUwEv` zm()Jw8`_6FVRjmUGr#WXLzXj6Y1@jdx$gx!cLC*m`ZjRxtxS)Rwt9@zd%zy!JQ-t_ z_%m0acN5UR1JJ_*(Z~2Q8#!Bm4tDlAhodjt>!+XKzc+A3Pu5ZrC)>#R4_`F*@oQwA zF}x#G6W0{_vgi}DDYO86GTIZEL#*LZ`|pak^+EUW?wED&;LUO1B5OC%9|ChQ>lwFS zyjXBXSIPQFz6BubBk>E{@d>rw0oEvFw886Pzcuvut~S0Q&Ds+ictW*uZ|qp;@zKnS z-qw1yy*{Dd@dOf~a~(LE{O$9>hMKH>ab#9}^(7pae`k7eukfZ1uvn~B)t?yagdV(-eR+Ym!snsUhtZGExC z4DoZ_YhC$%vEVXd6SBG!8R72=3ye>^J9aDrPW!VrH@RS+%;xW}>GhASwT`MLV#wA! zj*kxfJ2XCn?a&vkTmRG^9e_THriNIzmXWQ`+zrwg4JZ+^dv$D3}CcZfaSU_WcT zo!-ZGRDjPZ+Lye?-_L@+A5QDmeO)pVWd^p=Z~gwN<0)DfPx-{7oWcj)s5dQQa01SSfM%h5PDCU8A<@c%6yZ;uI#=2^!22XMuQ z)4tc6#1h0liN7G{q2EUaK487^C*rLw>@$eX2|mlc5%yL`{TK0D{LJ9rLd?zDH|1{- zRzoWp^H9bta@`Kyg-*#YJig;7f6LFuS)(qW`sLWb4dAfcMc>X|=zA`VzUQd(cj$VU z=v3f1JiH8D4+~x26F&E#>thaG4=d>Udx3Fjx*k^0^$2x@j$5E3KDVahG4GYlH9crK z3|bC{mLrT#9y;%EoC|$NbJU;^%;01 z{T`)XJwM+Mr41AMTRc9jTH*rD;MQvMxm4=Wuitf7RCp#l6*#}N;Upj9+=Rdh<6jrt z)V_hA0JrnA(9oA@BWIg_Oe%jLT<%_I8)f5d$oUgw1pD2EH*2TF=czBgjhwygiYeG_ z3h+y$O)_{oW0k$Wr)eX8nTH=foaL{B_fFnRxy-@va;;BfjU;-RRL@;W(VZpuC*o&r z6h5KXen2Yqv|ouX`yS7_KE8sIH<1{a zoZE8#E=pId>v!>icFv}vHx4U*eBc_|Nj+_|IIC6;?mPK=Oe^8RS#RRFPr!wJo5Oq0 z@i&;h&izJYOZ>}3+VS_pPx9T(Tn#I#U*HPfIlALr;&LJfV@3A#czQqUs%6F1|E)F+ zi2?PXq4jsmh)cg?;p$`mA&WY7U$xF`x#^V;O`YePkO}1ML_)crebS`g=zOIsPu;Hf zoNesN6SwWk^F6n&Jm<5!^4GZX*SYfJT=^7NezGf{=E~pX%75OKpXJKm?8?t`{KKyNW3K!TSN_|s{4=inzq<0xuKe?^ z{EM#qk6ig5yYfGEk zEB|>{ewHhLvnxN(mA}=M&vE5%bLH=H`x(&-qw2fi@!SJG&-0_Ub(M#Vc!hBtX--$y-U#j?qn}!+)WRG080tPzzxv$( zwGDi?8RlWu9md->?ot;_(x>k>RP`NBUAEbmYkHG@&=u=gXNN+15RcMP>lv)3AHvQo*3aBX^#gMWfz zIQ*ihxyP8T+YP=k;bo7Sp4i|~PZ-n5zGYN*)%V4}?NN6eHi8}yxKGy~rRsoDXP6xx zwcS`x)??zPyzG$|uX-Rb|G=lK-f5`^$Ok>M5kd>EE2~Tdj(q z0quJmcereXKPM=N#4ie@+hm-;>8BV+wF#f^L!hj2_V(^7bslf)yeHv_XtmuN50=k) z2%}j8hLH^+d6v<2lp+R5Unl?_<6mr*`#8+#RP5_c3?HsSo-j?1@vS`|P4( zgBj1E|6S%g0MO&Q3dS)dJtkuOx<~qWLJM$1l^*K+j?)Pq{-ENL+8cUcshHqD_YVep1v1+#``MFs2wkN+aR=w^u zpNds)d1dmv6_rpI%QzEWj#Vwu@%v)cb1}XLV^z=;FegkCf|ydhHnzm+x9{|qz5Ajd z6n$8-unRnPc@o|hp-tEC`tkwsw?%wp7HWCf#ysEVO*rgTPk9*)@2<@DG5JdpwtLn3 z#5M%kFkwK8p*c$V^=Ly#Ys9yp8#HfT_a;0St={n>yRS#(^12~fq=ve&BU546Lg`IE z`xMA6N%#QJ)r8Sb8}S6jYdy13i?4c664Ivc$XX*PnnFg#a{^RU{1On5Jszew@2;CZ z@*}TINHpno5AwCgliK1{K@U?MeZ|{7Ub4FGm5fiuXr3qDDa1M9H6Ii@C0ga?wek6C z;(T4#oxc)J3AfA#z0AY=6xv9#=RG5>cHwf7b4NmbtSSM)*NyGQJF(O>J7Uy>USV;o zH~z4Ru-!=h)u@E+v52p)#Z<3G`+}zWAbQwtQ*G;$$|pr%jfto2;h234TH|z^)|2tC z$EYRo`v~(G@!L$;5x?D}BXgID9=l_YDcJ3aq0jj3F-*UNZ87R2Z$e#++7^}E7NZVF zCGe-n&qqxszb_gqX2HHvO;>7qG8Tc!sJWa#{;=^BBNsY{k8uFqLu|%}h`j3Q;%k4! zu#0ZQj&3)Qc-lVMVi+$Gyke>hJJDa2nA`eO7GKvN=p(oHM@c5|ItaS`Rfi}3!TzE- z_=3mV-l!A(6vsM(M0BD?lHVPjK%K+U=DvQavCl}}Z;NR(KBCx+-_uXEFeUn_R&!)s zKXu+T&&L~$u?bXtFmC+^yooa(B;PlomW$hc{V(@Z!M^6{c%v>pkvdPs=XS)ahJNO* ze#Tq<%(i~UJN?9P$msR>`>SlFvWKA{^PkW!!)a1dQB}QceP!ONg3|K5rEANJ%8K)< zstYQs*RC!tUsj=<@~YzMyyD8ripsouD@&`3E4vDG!`@m*fyyl@_LY?`tt_bA;2Trr zySJdqx2%F*ZuBi(TkR{WC@3l|U+ycd_ARTdSS2-<6_l107b)7 z>8GqrTBO`MC)c;SvbeH%&Dzo`5UTR6DqUVu?JFrRTkWeXuBs?oSL~}UDXpSb#nQ6k zRVjer-@QeC~e>ZS=3mRF>#DlM$6sH#|2ol;n_YQnO6fxU9VO!7 zovrLQUtByt7u0W?Ge2+sf(5rMUUqtf;Ce zS1FZi%d1OQ6&F^NFDqT%>${@jb=LbFtE$hcD+m=XTP}2^21%C`6s#;rSyeTmsG_>O zxO%)$cYML>)nx^1%L_|ps%4c0tBUWfs9ZTiUDuV*TUT6JRa#L#L#-;Us)G7?HeNII zfUhg4EG(gZB{HP0tEifx(o-g;Oioii;e`Cwr77rCzFaE8nboTc(^AWdRb^>a;X0nH zresW9uhx@WpPr_c7F3lMGAAoV5XKbx#@wYuYLdrPjkRZsue4lKyJBr&N!~ITp_Ug{ z7v5Wx>{Pf(iv5)$7!%aZdWH$-WcpEZqfbw4U1=ec1(_DvD}Yf&Zmv1=xN5_yr4?mi z4ZESPE!S}E+HT+?=XtYo=48&!%31uyS&LLoaY31u*6AEL~O#-k`133lyqW(#X|@ftQsnEht>+lDv!H7F72HZ9$vW)w8b( zi7mG3AX3tMX4d@ibbW6rv##>q@p{(hEt->a+uW?Vw|*gPj9u@09br{*<+@U>T*C3_ zWr%`%SA$CquB(PG9Hce0**$4|>FV|{(Wa}5E6X;h#Ul93E~s%)BbB}2i*wZM;$;OW z22@csDzlmiNLlX620FAQsYv$#)qILnzUxIaZsU)|)hXxD=~v*+BLiEZ!Vl4j0?wN;f9 zgy>}xs!9qfiygkMEUqk1sizeF{kB1U`C31$f>~7 zs4hrRStxMfm(|hI4dvKo+XQL^x^2*^g4LRADcZquA!?~$`Ag`~~8Yd+s#n!yVy(zRYmdEGAFxoCjmsmLMmX}p5EhuxOMr+5eI+jxFwecMB z{cpmf?$#6+&D+9)axsWYi+vSKtMUGei&FG5L4m!V%i3EPnRQ$V+_Azg@t~cyNh!WX z#o`%J&oZhN0M%}S=v*9%-bQW}IVRvD)U0CR!Fboyv3wHF4Hx; ztrx3T`($C_v!{iAsTU&-5d9`@J|igit-?Cq6z8lrdU%=>a5BeRUgmg96UD{NuDI9o zorKC7sLjNi;>J{6M+51(%lSkb-&wKNw`wieIOElgm?5;Y7C++3mfAK@-3lEot8a5t z#v7(Xm8D-;TCFRsSX))L0pTbp>d7)`mLiUgUc4<^@2t15FCEj+R+%BxD5!dh7( z!H(ao0U*h}q5)Gxc(B47oCf2|ar(5fL)oHCmQ|DiwF(bIG_N3srhyDHOD@rekn|rD zKZt2LXSuR^EM8w+xVBn*3$|CXR4ZVJT;N+(P+qW{?q|=RFM7$UTb$y{rL(0hbY$G? z3d+_NqttHFHcd|hce5^Ndac@{H@n3}OvXW4yShkh_T|~#tqz^_@UpciP(70>mg%YN z=w4U9dJc3Eb`e7;D;|Hd*j!|ZRl7t8^e9}S;%+dq%Wh2y> zoCV94VRNKySy|EDdbqs_PnY{qwRW{Qi9Yd(A(wVhpbs9!KR5(;07azdAL^~L7`ZPc z&LNyBvRQlCKG#k9`(ttDpUjxz^(?Jqf?=RpsIRUlEw4^d1zGPUbP02`2OItdnFg-&}OD&$7F}ZN^vVtk;Q;Jdxrevf| zoHi-7u%LL^#KP2NlcjqJqDlOe^Xw8@)6axnl>|E}lh~nTqX&xL1h0d17peJe`d$sKNEcSpH|fjOI_y5iO}hJjr9L3t z_WrL+n^LOqvF+9`IFCN5G`cPdxxQnB?uMK zT+c_OWt1)Ss_4{c<$XI^MemML#;Y;PTVm2YRvGcJ%FAwx*B_@mjU0^ZARUR|e$-b* z-@yj~uIs=#>c2u6*;gn}U4kN|Cv~EV-Zn`^oj{hJK#u%VRMb;bl=03K z<>{CL&C-I=$9 z_<}NT%vMHvHguY+VxG8_ao?(<5*DaF4GWa#tp&<>djUMoQBk{cRJ0E{s=rM|t-nJ> z7u}_dvb&JiB`W&#J@7eCdG{bk`me}cPJ6&g|U$IjMe$yrT-EP0nKhzVSABExbzebn{pa=yb6o^nD zLV*YcA{2;FAVPr%1tJuPP#{8q2n8Y(h)^Ixfd~a66o^nDLV*YcA{2;FAVPr%1tJuP zP#{8q2n8Y(h)^Ixfd~a66o^nDLV*YcA{2;FAVPr%1tJuPP#{8q2n8Y(h)^Ixfd~a6 z6o^nDLV*YcA{2;FAVPr%1tJvqKTm|of4Jg#fAZ+Dw^^SC_gSC(o}894DJ^62B%eR4V%4frz9?5vSe!9!;*`Rv(~6d+ zPt8axEG(Q-Jf(P9QQ@@Ww5dzeGNw%}oVavy5r1>$e-T*Gl=Q;F^vTo47f(rDHa<0V z>Xh*rMaxphPb!|4kyf0sY*Nw0X=*j!X{^pGDPEDnx8(lMGb4gvgaQ!?L?{rUK!gGj z3PdOnp+JNJ5eh^o5TQVX0uc&CC=j7QgaQ!?L?{rUK!gGj3PdOnp+JNJ5eh^o5TQVX z0uc&CC=j7QgaQ!?L?{rUK!gGj3PdOnp+JNJ5eh^o5TQVX0uc&CC=j7QgaQ!?L?{rU zK!gGj3PdOnp+JNJ5eh^o5TU^Ta}*eGOOpIdnABHk626jbK@f8Cu6cvRK3fY0Os0V6~WN+AYRK%|IsCX-i< zD8c}d7)KH$rPRY@=1ej&FJ{iZn4K=K!(#VHw+5t+{PreO_trhI;f}` z2>1fCO_rE2lUw!HY4tpCj%;a&Bs2L!n&NXR0h_l@jR`UtYi$n276{my6|dT;a2d0s zQzwoRBjxNHp->Ijf>_OPVb5Mxkb$9{uFD%# z1DYkKzn#7IiUTT$Yk-zbLBp2%L&18b)@EOBiHwD_FPp8(!dfAwWQ9S^7ji=YP9A49 zpIEFOSB%I~%|}y`g#xOyQcVqbTwa@|((tUltx`5BioL1HR_khz7Od(!kIFmJ@n4N_~{iLdydVHq!R^=%j_dY0h+ z4!5;IYVFKmnR^>~V?tqV3eBaeqBhx8zvl9JrPh64=wdNGi&m@Fxx5NYy7qb|k$E}; zYIM4AWUW5nYvj@Dnwk_pe8#bLY-Ww*499ai-7tDE&{?Ny zL3ZKw=ndl3Q#$=2jSVim;IW{USZq+07QWz@Aj#gy$_7`em-S`1a=W}N30(RcLoPjn ze&x|zym36L$6n7WgjXJ>PrULsV?J=@@ij0(p5>$qj|VgfVR~`#mx2N+XoqVIF5Q0U z5|if4TDZ8pQnA!jS5;!NpuJvoD9tX_&B_#1wT9Y|lZ6EBHZQ-@0(Mx7s5sDeR7AYu zMTD!c&f(grR|l?P-DJ|VfHzi%S5MmxG!OY z@YXYdsqYDts}>2E9}okIB;TpN{FZ>4yA84 z>`TwxZ0Iy(Z#HxojFWP$lioD+r|mYZHe_YB88R|988#WFcBOZwA4}VpY1R4+SvlF= zhMZ%DU77v?L-l3|9x(K#ZBAd8-jTlFup{m1%y#g}%bnV80Ac&m99@Pk!_vG-dEJ?L zWApOzI@9;0Ioi$}fE;SNGBXYtPJ)Q+4Qbf}X?-Im)^r%m8GE37$I^~vSl6ZZr)TX- z-<{cI=*(E1)@FdjhJo}s#|&1hF}ppZCA+08qcgp2WM5W)TFZv?Lx%Rz6$1vWEB=kl zlB9f~oY9~fV3|0N*h4&>_z~hV;=RNb#OWiryrsl8;`$se{{><<@qWgwQa|xA3O`AF z!ALHzn@AaUZdrxaVRX-a@>GcpY)mB|N;FIA<*97m4$T-zDxL z?kBc>gU7$%JYL>bVk6^LX*2OJ1U^Q*gTk-K#`LXH);KP2K4VFmPP~QqB=ITY`aB-L z=6s&N`BKh17`IA0h~FaaA^wEo_Yzl(;`v+id3rl>HSyhyC8>t^E#d*h<8up@)li$@>->~t2ysvEJ*{z_G3S%S?h?)l^m~lI zxs>yr#MNb-HxeHtev)|Kbv!%^#sSv<7_pl;YbFo>DY23GB=IidWzg?2{hP%16HmOJ zr{6|Ahu8%D9^-Ggfroc8hW;~)^QXjJ#5cjzj`g$N$ip`Ye4MzO!bie5!uUGp6ZcZM zQQ#Yi`zgGJIBPb~uYq`*g>yUco5YV0_YvMV= zj!{2T%Q-*7Sd!X_4f#Ag_ZA+$m^jGipReO#x;hoBfb|H z_19F*!#5FYi#QJu=ibKII+3TJNc;#erY~E}!!s`9JfHYB;+`5F{ycHlcR7!{oX6Ms zZsJ}FUr#*ob{_w~iJvCE2<9Qo{}AzH;y&X0h|6p|{ojap5tqQch3SoU9=@4)v&uPh zG7mpS>?Lliz+VuzQ2N<0PhxpWmUDSe5NCKfkA-;>!@G$$ z62I){;lr=u;k_$3uO+qyICl~E1v&pW@h*+?1ehmL{}FZVQj! z#kf@(OKgOB8sk5G7Z3j_FxF?sD$eOf9zOB=oLh+7+csDm(NOk8Sye=GqIm|F7ayO8sZJacMv~Kd>3&a zaR>1L@uS4K>v?&%6IT%bmUt=gequlIC&a6X(_r02eQzQjL%fZ6D)D~eYl$;{%JZ)z zo=R*ZUP`PH*AsuAxP^ECaxpyCvGN|9^~@Z5<7@D5^KcI5VsM(Ox#Jlm$;kwBjVk}r-%oL zbBcKVvNrPkuOOaITtr+(Tuy8yUP|0T>?7Vlyo$Js_(#Osh`WgQ5bq>DMEp8&*+aa1 zewJdE`fUm9s>%CmVdjzPYL|0z2gx6u4U8r2^YIhucdN!tWFKVS%3&_+`#vd9MrMe-pw#6F6%at4}!nMFQsw ze3igvf#(QZA@D+hzb)`Gf$tD_g}}`MuM&8zzz+z#Uf@Rr-Xicb0{=?j7X|JW_zwdA zQQ-Xoe<<+B0)Hm(mjY)Ek8R%^fyW9wQQ)Zp8wD;E_y&RJ3S1%ZB7tugI3(~Yf!7NB zfWQw4{4;@{68JfRUlRED0`C*}1A#vg_%ngO68Hp6i(h~{3GNiQFTs5UE)6CfSTb;# zkcNR94lWDa2yi38od+%(-1*>e|34aBF1Rt^E&(?d+&93D12-PrrQj|DcR9F8;3k8c z0`5w1Q^8#YZW_36f}0NRYH%~aT?5VtP6lTJR{+iot`J-ixMFZ6;7Y-L3*5Ef%D~~e zG85eO;BEjn3*3$1W`mmp&H`>OxOw2_gDVGj6SxK7D!|o~_AjfdZi=BKHpGZA!%%c13?;}-Fwj;? zx1C_uSPb;TV!$tH3$D1~1^S`c1^$MOE;z6h(FPX^Gq+H}#uiG%)B<{IrCeAW@9!P1H3KsyAqke``v z4W8Cy*3&{Bye}(_0T-BvohHLbB9`IMa*_-6oLHg;wC^0OMqpQpR&awXM8-s>wMNml z)-t$s`CLk$V`3FUi#Tr`n4P)ZO4#6T&?1HR7lmN2WmgNKF+zS)5ceuly=ZL~<7Z}# z3$~^!nP5uGIw_iDM*GS}S5V<195FJAp$pZ5<(HVCn3(~&nQdpZps+u0J)UQAqb=YC zyJt~IAv64n$xkkd>uA=w4NzL%UR<7B1am^7-bmKgMGdMQZK%)QP_nYhtdv(3DPV++ z>kgaE$?}-zdt-@Ll}nAXkvC`9&|A+MExZM5?jZ`|-TG@IqX{vN4{_z2Ek_lNBAH~j zt2ST@G=nvkE2ss*XcOoB(~O}+LrAQTrK(u5f~hbTLzcN^vx2s5)=yZTAIK zyE~BDLi3>z(p>JKEVHR8s5H8?`V@?LD7dGV$uIER+{J9t_xQ2XSILSi9Dvz|mxGwl zLRPF&up2x_Wh#Q4VX>l2BPBATKesH53X2pZ1wDl+CPw3_5^BQIyZmHnh_fJEYRO7R z<;Z3(+38B1Op_VsE|iFNmaOaH7By8RHbqNMi4F=-BFq+SN^MSsNKQFpvw%~OVeDx*C>4P<#DWLk@uu{VQ-j=LDJDX_bV$=hPbuhWf>VgEb#mpWG1XTEs zHEm$i%a%@==^atQj#7zJiflrL-IrYp!J9W&Q@*bnVS`;&=YdQ?5Z}XZpH2MEf2xSWP1~ye*r77GXQmJ^aYkH zHn52gI+jCJFu?~K{a~_Mt%d%h=*uuHPnA^#u#^|#QqK1fe1X+tq-2jUCwkH4Y7P%X zwj_o%42!|w{aa47KFV?HE>p7+UM5hR@RcdA&#QRhoq~YNo~-WJ2~P=j5Pa7pS!vcg zu%rb{6Aqu|#qk609AHON8sOD8r!TT&0OL8mCa$ z=rNsg`Kmw2n+vuyN-ewz6G(d2gPjt~fQ@N=K-zs?r>l;2k7PBi%ja_xjcbzcP#aR3 zN6e%WRfnVpE^Q~PO1Q2{*}4XI@M(Egkeh%z7-B1LzFn1a9AiBoW!_XuG0+0As)uips$Pwmj90n z#t9^? z;_KED`PL=$g(InOt`P}!34M!fK|CDgW3!?VCg5_%X}Z>smi83PCAyBHW)G+moqL$! zrX`4P!Sd-V+2UHms^V|XJ4XGU;> z!WThyQ)Yy%GTf!%Eqw|q!*qmlOY!*yKBjP_K&q8Bd_@V0#DXTP7OiZ66_qXK zuuo#o2U1pMc5{HY$nZ9=W$=Ce5W7lPyE5C~;l2;vx~0=mI{LC&8wStEoT%TJd&qGKX9(gCCWhX_u05r=xg$ju4zO<5YpeY*4+O!5I-BN325n0U^)D0#jUg=*Xqm zfFUnFpu-14jlRYrbJY4~V&^w?ZeOj9`tiV{CrY^^U(q}eSv9@hEH1c$ozaK6$|0Q+J&?g zbq#b7Uwz#AV2HXL3Ov)$ z;MCL;Jv`Z&BAj7GKmX#h$e<-TgRWK~m%zt>Tre2%nE`yv14Tzq9yoVl?lJRMDstvp zU^9S6)#`nY)MgPq1IjoPfd25=cnUVI;i(m@0NICMQXmr!NMO(!BM&x;;K4@tV1_-| zsL-=Zc5@HY@Yg;>!RcAgF9p^6y1MbsP(b=*XRI*2uzie6O+}jxLBHp`3`0^vK?&@9 z*fs&CBHZz_N67FHDBywJ|4LjK;Y)*HYjc`jFvRh%AIf1{n`At&b+IfIJG6tQIzr+5 z;B)Xu%>+l7s)s+s#qX*`9eduia2D9zm=*j)BA$KD@$09bvMJj1O*ZL|I@x@fyh1Ru zs#1PPCYzLb6}Q|ts{-utVP6~q^!AifX<2?`P4 zo(1tLHOChfJ{u9&ed1*m#wU#TiLZ2g2@==Fd;n}%b_AJHqE<7iLw=B+m zR&HN7tLk!i<0n>I;1lybMjCny1eJh21RcR2vESq;>wj(O~iFo-X%!rzGl**)+^Fn(48z9hl^Cc(e( zJ%o%5d~X4lYdw7&4#xJR!Zc)R%VOJ;w5@7GCPG5L4z*nV>Un&(DO*|g<| zGX6JzesIDj)6wrNX&>|VTlbc|8+^IC{e{3KJJTiKovCl)=hV&dUf7tdOHZT9g?-#$6-h@q==)iBq^ zOZGMfPuNb$-NUkf+}&gEmDVkJzvM{8&qo~Iwe^k9%`0r<-@T{e{tfw$zHQ81V?J=_ z%pdG9bqBY8<^Ardkx%x&Up;H_w2^z(J-=Y}w?DXaSjXpAbv8{j+V!*ka^w=rd-)H4xg_+^`6Zv#eP~!+w$=B@ zngdJ6-`^*7t>}LLrHf0STH}6Adi>){?shFG>95@XW|{4&zdGM~-&Fo$)wru)UODQq zqT#dhk1yDJ{JA}k?;p1Pi(AK52LAZW@j1UNe1FZfH{ZM6+c9bWV_9vZF8c62=iGZ{ zeYpIyrV-CB{@1zVtN*(3PwT!Teedz36{BijFDS+|yc{TTwOn*Xu6$-p;Mhes=4Omk#GF>&}?*#NFLnYkaRBarR{Fee12| zX}8p5e$}$AW#v8Z{d(>EHPe5VY_6 zx{u#@^}t6bUtM!@{ +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("print_hej")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("print_hej")] +[assembly: System.Reflection.AssemblyTitleAttribute("print_hej")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/csharp/src/obj/Release/net8.0/print_hej.AssemblyInfoInputs.cache b/csharp/src/obj/Release/net8.0/print_hej.AssemblyInfoInputs.cache new file mode 100644 index 0000000..9f3fffc --- /dev/null +++ b/csharp/src/obj/Release/net8.0/print_hej.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +9324562fecfe65b81ece195077e8b3a7cf0ee90cf8e00b3fecfede514b6ce9e8 diff --git a/csharp/src/obj/Release/net8.0/print_hej.GeneratedMSBuildEditorConfig.editorconfig b/csharp/src/obj/Release/net8.0/print_hej.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..f88135b --- /dev/null +++ b/csharp/src/obj/Release/net8.0/print_hej.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,17 @@ +is_global = true +build_property.TargetFramework = net8.0 +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v8.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = print_hej +build_property.ProjectDir = /Users/einand/Code/test/csharp/src/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/csharp/src/obj/Release/net8.0/print_hej.GlobalUsings.g.cs b/csharp/src/obj/Release/net8.0/print_hej.GlobalUsings.g.cs new file mode 100644 index 0000000..d12bcbc --- /dev/null +++ b/csharp/src/obj/Release/net8.0/print_hej.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using System; +global using System.Collections.Generic; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; diff --git a/csharp/src/obj/Release/net8.0/print_hej.assets.cache b/csharp/src/obj/Release/net8.0/print_hej.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..4249bbd4e4577bf745c0d408a96f0be726262127 GIT binary patch literal 151 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 dkyLGCj$?;E?*C62_!r?=WZwV) literal 0 HcmV?d00001 diff --git a/csharp/src/obj/Release/net8.0/print_hej.genruntimeconfig.cache b/csharp/src/obj/Release/net8.0/print_hej.genruntimeconfig.cache new file mode 100644 index 0000000..d315a92 --- /dev/null +++ b/csharp/src/obj/Release/net8.0/print_hej.genruntimeconfig.cache @@ -0,0 +1 @@ +17977dba7d1c495f6863b0c77a609caad66c01dc9fef6eaa098cae6902184a5a diff --git a/csharp/src/obj/Release/net8.0/print_hej.pdb b/csharp/src/obj/Release/net8.0/print_hej.pdb new file mode 100644 index 0000000000000000000000000000000000000000..fa4fa7d2de5b5cd874c48a6cde8502dd8d9dc782 GIT binary patch literal 10956 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 literal 0 HcmV?d00001 diff --git a/csharp/src/obj/Release/net8.0/ref/print_hej.dll b/csharp/src/obj/Release/net8.0/ref/print_hej.dll new file mode 100644 index 0000000000000000000000000000000000000000..48a6e3ca5377698e73b2d9e5590d61af5c4ae466 GIT binary patch literal 5632 zcmeHKO>7)R7JlW}!Jfd7h=9UhwiyQj0=MlrLLqqUar_euiDT@E5kJE2>8Tla(m#`~ zp1}jst}k%fmDrW`xYCLX7Y+e|6hH_hB)IS+gb*hLmq@$fz=ab+gzr^%&$JWsBW^&- zu2=P5y?TFD{p!t$$DXGhMAVCZ@gmWAjND2Z{yf;ka{e!GPtdEHS) zBMj=Hq!BiK!|{!olgow|RHb>%HMs+c=*3y07f9BSAQ*B>Sfp&=z zqJB_vF?IhO#uB=L&J!McV!JWZ_VY;pMQ3NwcF@|hM7#BWcTCWjg+74(lRRG|n(0f3 z*4}e#+Jl{DBm~XnHNDiV@azd`azQ61Ni3Q8SVo5#|SW#snP` zo@bf?>&;MwHfY+1HB6W%kDh5Ih%`g#24G~LXcHYVq`l~wR)XFPdS&_tj=;Z+ug;!- zsC?{&;U_=-ck$qBe_&UyxVBvcIIp5{Zt9^vDwl|!Kpqsp(J#p~ApSzj?R}b#E3S^sXU2KiKoWRuXH9 zf`8ISVz7ffx95l_W(;4~%P|@eqyBWt8W+&}Mc*&1=+HOjpa~%4KpxSih1TD8!Bt3Jf z=|_$yX+~C>^}1DY_l0{vK7{4G>7U#J{5##x)M_U zImeYNGE`3BU%oi+*MiWqA}m_&PjXEMe$A;jL(SI}vLtKER!v6jC3vN}^y$EBIId=1 zlCHI(XPNcXvc(Ybu%qtA)M@DB8lbxXO)`|eEz_;trIf--Ex+AeNTRFhkyCM8C(5jD zJpwav9iJmL@KHvq>+*DWW>#I7U@g~p$>Grn%keu0DQm8@If!K1Q4pr|8ON&ofr=bk zrKH3vGmeoAmu1*;Y^jn<00VGIfZ|jYovfUO*z_h{_HOkWLiF!2Nc3T{XAh%!27UeK zCRhKq=d;|AJ`&>Ae7{I;ESl<_M(Z_jc~wjH4Q^)n33A?B^W@IP!u9x{;)-1zm-^AT1@4 zAc2e`KjII?uAn}RAWiB_0f+`$cJX*g)3sxU_AP4EwB+5clXQ3+Ix}r%IOA!|zkb=0 zzSXq2gXsA+qIcpCO>cRp=McsfyfCYPv$TZSJbs}q0G|h(i+`=rTfN`>kbTM1muE6o zOehoZd2el8KL|**D1;mbb%=yapK5r`xgF5E%2>5PRamzu0$%_uZs&Rp*eYOC1TF{k z`Zkijhhjk^oxej=!JOz2UO$1iG9Zr{T1OimS-_A7&>D%%2)?d^b{e#Cy(hJH22_QY zn{_v~*tXr?5o9{iv2O)?L+tMQGm4jdq|;ef9{e1UNb~xz&COVNxek-6;NW`hPGn0# z$FZ-jcd?fZ)EaDQ9o}%_Hqd9Zj*|(UBgi^Z{}_v-@pHQ3I4(j)0R2tGBg$C0eH=$n z%c0iVvggu>bmKv|;~cvw#7n^^4=3ot8w0mzYZSYCIF_hg@!R^#%*FfW&9}!VH$2y9 z#Z^bKfc#!C@O%eVyl=(Asq);=;ew$e%dc8);LBp6EmdK1B9|Mtk}Ai50ACdg&Coxh z>~-l`YRGf!Fi=4)8nOfLh^0KUHCiw{%Xey0Md|ybwN2yr*g% zyjjJVp@$xVOR@@!lsJ2MEaH194zoQXjam0hR_(JAcXR46E@1~V(7F` zkkzI7l`_W?nObf~3|=q0$xruj*^;i|GAtG>HSf2AGcqg~O=rqRS%C=FELX|cAuVIL rBcy9fV)k&>?(yM{`xCkG;q+i8aN@u7R*HY48TbCq{kUTOZ;HT=AUvy1 literal 0 HcmV?d00001 diff --git a/csharp/src/obj/Release/net8.0/refint/print_hej.dll b/csharp/src/obj/Release/net8.0/refint/print_hej.dll new file mode 100644 index 0000000000000000000000000000000000000000..48a6e3ca5377698e73b2d9e5590d61af5c4ae466 GIT binary patch literal 5632 zcmeHKO>7)R7JlW}!Jfd7h=9UhwiyQj0=MlrLLqqUar_euiDT@E5kJE2>8Tla(m#`~ zp1}jst}k%fmDrW`xYCLX7Y+e|6hH_hB)IS+gb*hLmq@$fz=ab+gzr^%&$JWsBW^&- zu2=P5y?TFD{p!t$$DXGhMAVCZ@gmWAjND2Z{yf;ka{e!GPtdEHS) zBMj=Hq!BiK!|{!olgow|RHb>%HMs+c=*3y07f9BSAQ*B>Sfp&=z zqJB_vF?IhO#uB=L&J!McV!JWZ_VY;pMQ3NwcF@|hM7#BWcTCWjg+74(lRRG|n(0f3 z*4}e#+Jl{DBm~XnHNDiV@azd`azQ61Ni3Q8SVo5#|SW#snP` zo@bf?>&;MwHfY+1HB6W%kDh5Ih%`g#24G~LXcHYVq`l~wR)XFPdS&_tj=;Z+ug;!- zsC?{&;U_=-ck$qBe_&UyxVBvcIIp5{Zt9^vDwl|!Kpqsp(J#p~ApSzj?R}b#E3S^sXU2KiKoWRuXH9 zf`8ISVz7ffx95l_W(;4~%P|@eqyBWt8W+&}Mc*&1=+HOjpa~%4KpxSih1TD8!Bt3Jf z=|_$yX+~C>^}1DY_l0{vK7{4G>7U#J{5##x)M_U zImeYNGE`3BU%oi+*MiWqA}m_&PjXEMe$A;jL(SI}vLtKER!v6jC3vN}^y$EBIId=1 zlCHI(XPNcXvc(Ybu%qtA)M@DB8lbxXO)`|eEz_;trIf--Ex+AeNTRFhkyCM8C(5jD zJpwav9iJmL@KHvq>+*DWW>#I7U@g~p$>Grn%keu0DQm8@If!K1Q4pr|8ON&ofr=bk zrKH3vGmeoAmu1*;Y^jn<00VGIfZ|jYovfUO*z_h{_HOkWLiF!2Nc3T{XAh%!27UeK zCRhKq=d;|AJ`&>Ae7{I;ESl<_M(Z_jc~wjH4Q^)n33A?B^W@IP!u9x{;)-1zm-^AT1@4 zAc2e`KjII?uAn}RAWiB_0f+`$cJX*g)3sxU_AP4EwB+5clXQ3+Ix}r%IOA!|zkb=0 zzSXq2gXsA+qIcpCO>cRp=McsfyfCYPv$TZSJbs}q0G|h(i+`=rTfN`>kbTM1muE6o zOehoZd2el8KL|**D1;mbb%=yapK5r`xgF5E%2>5PRamzu0$%_uZs&Rp*eYOC1TF{k z`Zkijhhjk^oxej=!JOz2UO$1iG9Zr{T1OimS-_A7&>D%%2)?d^b{e#Cy(hJH22_QY zn{_v~*tXr?5o9{iv2O)?L+tMQGm4jdq|;ef9{e1UNb~xz&COVNxek-6;NW`hPGn0# z$FZ-jcd?fZ)EaDQ9o}%_Hqd9Zj*|(UBgi^Z{}_v-@pHQ3I4(j)0R2tGBg$C0eH=$n z%c0iVvggu>bmKv|;~cvw#7n^^4=3ot8w0mzYZSYCIF_hg@!R^#%*FfW&9}!VH$2y9 z#Z^bKfc#!C@O%eVyl=(Asq);=;ew$e%dc8);LBp6EmdK1B9|Mtk}Ai50ACdg&Coxh z>~-l`YRGf!Fi=4)8nOfLh^0KUHCiw{%Xey0Md|ybwN2yr*g% zyjjJVp@$xVOR@@!lsJ2MEaH194zoQXjam0hR_(JAcXR46E@1~V(7F` zkkzI7l`_W?nObf~3|=q0$xruj*^;i|GAtG>HSf2AGcqg~O=rqRS%C=FELX|cAuVIL rBcy9fV)k&>?(yM{`xCkG;q+i8aN@u7R*HY48TbCq{kUTOZ;HT=AUvy1 literal 0 HcmV?d00001 diff --git a/csharp/src/obj/print_hej.csproj.nuget.dgspec.json b/csharp/src/obj/print_hej.csproj.nuget.dgspec.json new file mode 100644 index 0000000..edc3eb2 --- /dev/null +++ b/csharp/src/obj/print_hej.csproj.nuget.dgspec.json @@ -0,0 +1,341 @@ +{ + "format": 1, + "restore": { + "/Users/einand/Code/test/csharp/src/print_hej.csproj": {} + }, + "projects": { + "/Users/einand/Code/test/csharp/src/print_hej.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/einand/Code/test/csharp/src/print_hej.csproj", + "projectName": "print_hej", + "projectPath": "/Users/einand/Code/test/csharp/src/print_hej.csproj", + "packagesPath": "/Users/einand/.nuget/packages/", + "outputPath": "/Users/einand/Code/test/csharp/src/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/einand/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.203/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } + } +} \ No newline at end of file diff --git a/csharp/src/obj/print_hej.csproj.nuget.g.props b/csharp/src/obj/print_hej.csproj.nuget.g.props new file mode 100644 index 0000000..7399b92 --- /dev/null +++ b/csharp/src/obj/print_hej.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /Users/einand/.nuget/packages/ + /Users/einand/.nuget/packages/ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/csharp/src/obj/print_hej.csproj.nuget.g.targets b/csharp/src/obj/print_hej.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/csharp/src/obj/print_hej.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/csharp/src/obj/project.assets.json b/csharp/src/obj/project.assets.json new file mode 100644 index 0000000..1a0b11e --- /dev/null +++ b/csharp/src/obj/project.assets.json @@ -0,0 +1,346 @@ +{ + "version": 3, + "targets": { + "net10.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "net10.0": [] + }, + "packageFolders": { + "/Users/einand/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/einand/Code/test/csharp/src/print_hej.csproj", + "projectName": "print_hej", + "projectPath": "/Users/einand/Code/test/csharp/src/print_hej.csproj", + "packagesPath": "/Users/einand/.nuget/packages/", + "outputPath": "/Users/einand/Code/test/csharp/src/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/einand/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net10.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.200" + }, + "frameworks": { + "net10.0": { + "targetAlias": "net10.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.203/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } +} \ No newline at end of file diff --git a/csharp/src/obj/project.nuget.cache b/csharp/src/obj/project.nuget.cache new file mode 100644 index 0000000..7b3442d --- /dev/null +++ b/csharp/src/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "XRC1hwC/Ajc=", + "success": true, + "projectFilePath": "/Users/einand/Code/test/csharp/src/print_hej.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file diff --git a/csharp/src/print_hej.cs b/csharp/src/print_hej.cs new file mode 100644 index 0000000..8f1ee60 --- /dev/null +++ b/csharp/src/print_hej.cs @@ -0,0 +1,66 @@ +using System; +using System.Numerics; + +class Program +{ + static void Main(string[] args) + { + int decimals = 100; + if (args.Length > 0) + { + if (!int.TryParse(args[0], out decimals) || decimals <= 0) + decimals = 100; + } + + BigInteger pi = CalculatePi(decimals); + Console.WriteLine(FormatPi(pi, decimals)); + } + + // Calculate arctan(1/x) using Taylor series + static BigInteger Arctan(int x, int decimals) + { + BigInteger scale = BigInteger.Pow(10, decimals + 10); + BigInteger xBig = new BigInteger(x); + BigInteger xSquared = xBig * xBig; + + BigInteger result = BigInteger.Zero; + BigInteger term = scale / xBig; + + int n = 0; + while (term != 0 && n < decimals * 3) + { + BigInteger divisor = new BigInteger(2 * n + 1); + BigInteger contrib = term / divisor; + + if (n % 2 == 0) + result += contrib; + else + result -= contrib; + + term /= xSquared; + n++; + + if (n > decimals * 2) break; + } + + return result; + } + + // Calculate pi using Machin's formula + static BigInteger CalculatePi(int decimals) + { + BigInteger atan1_5 = Arctan(5, decimals); + BigInteger atan1_239 = Arctan(239, decimals); + + return 16 * atan1_5 - 4 * atan1_239; + } + + // Format pi with decimal point + static string FormatPi(BigInteger pi, int decimals) + { + string piStr = pi.ToString(); + while (piStr.Length < decimals + 10) + piStr = "0" + piStr; + return "3." + piStr.Substring(1, decimals); + } +} \ No newline at end of file diff --git a/csharp/src/print_hej.csproj b/csharp/src/print_hej.csproj new file mode 100644 index 0000000..ad1c25d --- /dev/null +++ b/csharp/src/print_hej.csproj @@ -0,0 +1,11 @@ + + + Exe + net10.0 + enable + enable + + + + + \ No newline at end of file diff --git a/d/cmd/build.sh b/d/cmd/build.sh new file mode 100755 index 0000000..4ea518b --- /dev/null +++ b/d/cmd/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# D Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== D Build ===" +echo "" + +# Kompilera D-programmet +ldc2 -of bin/print_hej src/print_hej.d + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/d/cmd/test.sh b/d/cmd/test.sh new file mode 100755 index 0000000..f2b87c4 --- /dev/null +++ b/d/cmd/test.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# D Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== D Pi-beräkning Unit Tester ===" +echo "" + +# Kompilera och kör pi_test +ldc2 -o bin/pi_test src/pi_test.d +if [ $? -eq 0 ]; then + ./bin/pi_test + exit $? +else + echo "✗ Kompilering av tester misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/dart/cmd/build.sh b/dart/cmd/build.sh new file mode 100755 index 0000000..2db5e01 --- /dev/null +++ b/dart/cmd/build.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +# Dart Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Dart Build ===" +echo "" + +# Check for dart +if ! command -v dart &> /dev/null; then + echo "✗ Dart-kompilator hittades inte!" + echo " Installera Dart: brew install dart" + exit 1 +fi + +echo "Använder: dart" + +# Compile to native executable +if dart compile exe src/print_hej.dart -o bin/print_hej 2>&1; then + echo "✓ Kompilering lyckades!" + echo " Executable: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej " +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/dart/src/print_hej.dart b/dart/src/print_hej.dart new file mode 100644 index 0000000..4ff9789 --- /dev/null +++ b/dart/src/print_hej.dart @@ -0,0 +1,71 @@ +import 'dart:io'; + +// Calculate arctan(1/x) using Taylor series +// arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... +BigInt arctan(int x, int decimals) { + BigInt scale = BigInt.from(10).pow(decimals + 10); + BigInt xBig = BigInt.from(x); + BigInt xSquared = xBig * xBig; + + BigInt term = scale ~/ xBig; + BigInt result = BigInt.zero; + int n = 0; + + while (term != BigInt.zero && n < decimals * 3) { + BigInt divisor = BigInt.from(2 * n + 1); + BigInt contrib = term ~/ divisor; + + if (n % 2 == 0) { + result += contrib; + } else { + result -= contrib; + } + + term = term ~/ xSquared; + n++; + } + + return result; +} + +BigInt calculatePi(int decimals) { + BigInt atan1_5 = arctan(5, decimals); + BigInt atan1_239 = arctan(239, decimals); + + // pi = 16*arctan(1/5) - 4*arctan(1/239) + return atan1_5 * BigInt.from(16) - atan1_239 * BigInt.from(4); +} + +void main(List args) { + int decimals = 100; + + if (args.isNotEmpty) { + try { + decimals = int.parse(args[0]); + if (decimals < 1) decimals = 100; + } catch (e) { + decimals = 100; + } + } + + BigInt pi = calculatePi(decimals); + String piStr = pi.toString(); + + // Print with decimal point + stdout.write('3.'); + + int startIndex = 1; + int endIndex = startIndex + decimals; + if (endIndex > piStr.length) { + endIndex = piStr.length; + } + + stdout.write(piStr.substring(startIndex, endIndex)); + + // Pad with zeros if needed + for (int i = 0; i < decimals - (endIndex - startIndex); i++) { + stdout.write('0'); + } + + print(''); +} \ No newline at end of file diff --git a/elixir/cmd/build.sh b/elixir/cmd/build.sh new file mode 100755 index 0000000..4161ac3 --- /dev/null +++ b/elixir/cmd/build.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# Elixir Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Elixir Build ===" +echo "" + +# Elixir är ett interpreterat språk, ingen kompilering behövs +# Skapa wrapper script + +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +elixir src/print_hej.exs "$@" +EOF +chmod +x bin/print_hej + +echo "✓ Ingen kompilering behövs för Elixir" +echo " Använder Elixir interpreter" +echo "" +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" \ No newline at end of file diff --git a/elixir/cmd/test.sh b/elixir/cmd/test.sh new file mode 100755 index 0000000..66fb4e3 --- /dev/null +++ b/elixir/cmd/test.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Elixir Test Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Elixir Test ===" +echo "" + +# Testa pi-beräkning med olika antal decimaler +for decimals in 1 2 5 10 100; do + result=$(./bin/print_hej $decimals 2>/dev/null) + if [ $? -eq 0 ]; then + echo "✓ $decimals decimaler: $result" + else + echo "✗ $decimals decimaler misslyckades" + fi +done \ No newline at end of file diff --git a/elixir/src/print_hej.exs b/elixir/src/print_hej.exs new file mode 100644 index 0000000..fdbbc21 --- /dev/null +++ b/elixir/src/print_hej.exs @@ -0,0 +1,108 @@ +# Pi calculation using Machin's formula +# pi/4 = 4*arctan(1/5) - arctan(1/239) + +defmodule PiCalculator do + # Calculate arctan(1/x) using Taylor series with arbitrary precision + # arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... + def arctan(x, decimals) do + # Use integer power to avoid float precision loss + scale = power(10, decimals + 10) + x_squared = x * x + + # Taylor series: arctan(1/x) = sum((-1)^n * 1/((2n+1) * x^(2n+1))) + # We compute this iteratively: + # term_0 = scale / x (represents 1/x with scale factor) + # For each n: + # contrib = term / (2n+1) + # result += sign * contrib + # term = term / x² + # sign = -sign + + term = div(scale, x) + compute(x_squared, term, 0, 0, true, decimals * 3) + end + + # Calculate 10^n using integer arithmetic + defp power(10, n) when n >= 0 do + Integer.pow(10, n) + end + + defp compute(_x_squared, 0, result, _n, _sign, _max_iterations), do: result + defp compute(_x_squared, _term, result, n, _sign, max_iterations) when n >= max_iterations, do: result + defp compute(x_squared, term, result, n, sign, max_iterations) do + divisor = 2 * n + 1 + + # Only compute if divisor > 0 + if divisor > 0 do + contrib = div(term, divisor) + + new_result = if sign do + result + contrib + else + result - contrib + end + + new_term = div(term, x_squared) + + compute(x_squared, new_term, new_result, n + 1, not sign, max_iterations) + else + result + end + end + + # Calculate pi using Machin's formula + def calculate_pi(decimals) do + actual_decimals = if decimals < 1, do: 100, else: decimals + + # Machin's formula: pi/4 = 4*arctan(1/5) - arctan(1/239) + # pi = 16*arctan(1/5) - 4*arctan(1/239) + arctan5 = arctan(5, actual_decimals) + arctan239 = arctan(239, actual_decimals) + + pi = 16 * arctan5 - 4 * arctan239 + + # Format output + pi_str = Integer.to_string(pi) + + if actual_decimals == 0 do + "3" + else + # Pad with zeros if needed + padded = if String.length(pi_str) < actual_decimals + 1 do + zeros_needed = actual_decimals + 1 - String.length(pi_str) + String.duplicate("0", zeros_needed) <> pi_str + else + pi_str + end + + # Insert decimal point + before_decimal = String.slice(padded, 0, 1) + after_decimal = String.slice(padded, 1..-1//1) + + # Pad or truncate to desired length + final_after_decimal = if String.length(after_decimal) < actual_decimals do + after_decimal <> String.duplicate("0", actual_decimals - String.length(after_decimal)) + else + String.slice(after_decimal, 0, actual_decimals) + end + + "#{before_decimal}.#{final_after_decimal}" + end + end + + def main(args) do + decimals = case args do + [d | _] -> + case Integer.parse(d) do + {n, _} when n > 0 -> n + _ -> 100 + end + [] -> 100 + end + + IO.puts(calculate_pi(decimals)) + end +end + +# Run with: elixir print_hej.exs [decimals] +PiCalculator.main(System.argv()) \ No newline at end of file diff --git a/erlang/cmd/build.sh b/erlang/cmd/build.sh new file mode 100755 index 0000000..e3dbf97 --- /dev/null +++ b/erlang/cmd/build.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# Erlang Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Erlang Build ===" +echo "" + +# Kompilera Erlang-programmet +cd src +erlc print_hej.erl + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Beam: src/print_hej.beam" + echo "" + + # Skapa wrapper script + mkdir -p ../bin + cat > ../bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +erl -noshell -pa src -eval "print_hej:main([\"$1\"])" -s init stop +EOF + chmod +x ../bin/print_hej + + echo "Wrapper script skapad: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/erlang/cmd/test.sh b/erlang/cmd/test.sh new file mode 100755 index 0000000..84c6f5f --- /dev/null +++ b/erlang/cmd/test.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Erlang Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Erlang Pi-beräkning Unit Tester ===" +echo "" + +cd src +erlc pi_test.erl +erl -noshell -eval "pi_test:test()" -s init stop + +exit $? \ No newline at end of file diff --git a/erlang/src/pi_test.erl b/erlang/src/pi_test.erl new file mode 100644 index 0000000..809af42 --- /dev/null +++ b/erlang/src/pi_test.erl @@ -0,0 +1,65 @@ +-module(pi_test). +-include_lib("eunit/include/eunit.hrl"). + +-define(SCRIPT_PATH, "/Users/einand/Code/test/erlang/print_hej"). + +run_script(Args) -> + Cmd = ?SCRIPT_PATH ++ " " ++ Args, + Port = open_port({spawn, Cmd}, [stream, exit_status]), + receive + {Port, {data, Output}} -> + port_close(Port), + string:trim(Output, trailing, "\n"); + {Port, {exit_status, _Status}} -> + port_close(Port), + "" + after 5000 -> + port_close(Port), + "" + end. + +run_script_no_args() -> + Cmd = ?SCRIPT_PATH, + Port = open_port({spawn, Cmd}, [stream, exit_status]), + receive + {Port, {data, Output}} -> + port_close(Port), + string:trim(Output, trailing, "\n"); + {Port, {exit_status, _Status}} -> + port_close(Port), + "" + after 5000 -> + port_close(Port), + "" + end. + +test_10_decimals_test() -> + Result = run_script("10"), + Expected = "3.1415926535", + ?assertEqual(Expected, Result). + +test_5_decimals_test() -> + Result = run_script("5"), + Expected = "3.14159", + ?assertEqual(Expected, Result). + +test_1_decimal_test() -> + Result = run_script("1"), + Expected = "3.1", + ?assertEqual(Expected, Result). + +test_100_decimals_test() -> + Result = run_script("100"), + Expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679", + ?assertEqual(Expected, Result). + +test_default_100_decimals_test() -> + Result = run_script_no_args(), + Expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679", + ?assertEqual(Expected, Result). + +test_10000_decimals_test() -> + Result = run_script("10000"), + % Check length: "3." + 10000 digits = 10002 characters + ?assertEqual(10002, length(Result)), + ?assert(lists:prefix("3.14159", Result)). \ No newline at end of file diff --git a/erlang/src/print_hej.erl b/erlang/src/print_hej.erl new file mode 100644 index 0000000..3ad9f8c --- /dev/null +++ b/erlang/src/print_hej.erl @@ -0,0 +1,64 @@ +-module(print_hej). +-export([main/1, pow/2]). + +main(Args) -> + Decimals = case Args of + [] -> 100; + [X | _] -> + case string:to_integer(X) of + {D, _} when D > 0 -> D; + _ -> 100 + end + end, + + Pi = calculate_pi(Decimals), + PiStr = format_pi(Pi, Decimals), + io:format("~s~n", [PiStr]), + erlang:halt(0). + +% Calculate arctan(1/x) using Taylor series +% arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... +arctan(X, Decimals) -> + Scale = pow(10, Decimals + 10), + XSquared = X * X, + Term = Scale div X, % First term: scale / x + arctan_iter(XSquared, Term, 0, 0, Decimals). + +arctan_iter(_XSquared, Term, N, Result, Decimals) when Term == 0; N > Decimals * 3 -> + Result; +arctan_iter(XSquared, Term, N, Result, Decimals) -> + Divisor = 2 * N + 1, + Contrib = Term div Divisor, + NewResult = case N rem 2 of + 0 -> Result + Contrib; + 1 -> Result - Contrib + end, + NewTerm = Term div XSquared, % Divide by x² each iteration + arctan_iter(XSquared, NewTerm, N + 1, NewResult, Decimals). + +% Calculate pi using Machin's formula +% pi/4 = 4*arctan(1/5) - arctan(1/239) +calculate_pi(Decimals) -> + Atan1_5 = arctan(5, Decimals), + Atan1_239 = arctan(239, Decimals), + 16 * Atan1_5 - 4 * Atan1_239. + +% Format pi with decimal point +format_pi(Pi, Decimals) -> + PiStr = integer_to_list(Pi), + % Pad with leading zeros if needed + PiStr2 = case length(PiStr) < Decimals + 10 of + true -> string:left(PiStr, Decimals + 10, $0); + false -> PiStr + end, + "3." ++ string:substr(PiStr2, 2, Decimals). + +% Power function for integers +pow(Base, Exp) when Exp >= 0 -> + pow_iter(Base, Exp, 1). + +pow_iter(_Base, 0, Acc) -> Acc; +pow_iter(Base, Exp, Acc) when Exp rem 2 == 0 -> + pow_iter(Base * Base, Exp div 2, Acc); +pow_iter(Base, Exp, Acc) -> + pow_iter(Base, Exp - 1, Acc * Base). \ No newline at end of file diff --git a/facit.txt b/facit.txt new file mode 100644 index 0000000..416ef44 --- /dev/null +++ b/facit.txt @@ -0,0 +1 @@ +3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590099465764078951269468398352595709825822620522489407726719478268482601476990902640136394437455305068203496252451749399651431429809190659250937221696461515709858387410597885959772975498930161753928468138268683868942774155991855925245953959431049972524680845987273644695848653836736222626099124608051243884390451244136549762780797715691435997700129616089441694868555848406353422072225828488648158456028506016842739452267467678895252138522549954666727823986456596116354886230577456498035593634568174324112515076069479451096596094025228879710893145669136867228748940560101503308617928680920874760917824938589009714909675985261365549781893129784821682998948722658804857564014270477555132379641451523746234364542858444795265867821051141354735739523113427166102135969536231442952484937187110145765403590279934403742007310578539062198387447808478489683321445713868751943506430218453191048481005370614680674919278191197939952061419663428754440643745123718192179998391015919561814675142691239748940907186494231961567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180270981994309924488957571282890592323326097299712084433573265489382391193259746366730583604142813883032038249037589852437441702913276561809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658213144957685726243344189303968642624341077322697802807318915441101044682325271620105265227211166039666557309254711055785376346682065310989652691862056476931257058635662018558100729360659876486117910453348850346113657686753249441668039626579787718556084552965412665408530614344431858676975145661406800700237877659134401712749470420562230538994561314071127000407854733269939081454664645880797270826683063432858785698305235808933065757406795457163775254202114955761581400250126228594130216471550979259230990796547376125517656751357517829666454779174501129961489030463994713296210734043751895735961458901938971311179042978285647503203198691514028708085990480109412147221317947647772622414254854540332157185306142288137585043063321751829798662237172159160771669254748738986654949450114654062843366393790039769265672146385306736096571209180763832716641627488880078692560290228472104031721186082041900042296617119637792133757511495950156604963186294726547364252308177036751590673502350728354056704038674351362222477158915049530984448933309634087807693259939780541934144737744184263129860809988868741326047215695162396586457302163159819319516735381297416772947867242292465436680098067692823828068996400482435403701416314965897940924323789690706977942236250822168895738379862300159377647165122893578601588161755782973523344604281512627203734314653197777416031990665541876397929334419521541341899485444734567383162499341913181480927777103863877343177207545654532207770921201905166096280490926360197598828161332316663652861932668633606273567630354477628035045077723554710585954870279081435624014517180624643626794561275318134078330336254232783944975382437205835311477119926063813346776879695970309833913077109870408591337464144282277263465947047458784778720192771528073176790770715721344473060570073349243693113835049316312840425121925651798069411352801314701304781643788518529092854520116583934196562134914341595625865865570552690496520985803385072242648293972858478316305777756068887644624824685792603953527734803048029005876075825104747091643961362676044925627420420832085661190625454337213153595845068772460290161876679524061634252257719542916299193064553779914037340432875262888963995879475729174642635745525407909145135711136941091193932519107602082520261879853188770584297259167781314969900901921169717372784768472686084900337702424291651300500516832336435038951702989392233451722013812806965011784408745196012122859937162313017114448464090389064495444006198690754851602632750529834918740786680881833851022833450850486082503930213321971551843063545500766828294930413776552793975175461395398468339363830474611996653858153842056853386218672523340283087112328278921250771262946322956398989893582116745627010218356462201349671518819097303811980049734072396103685406643193950979019069963955245300545058068550195673022921913933918568034490398205955100226353536192041994745538593810234395544959778377902374216172711172364343543947822181852862408514006660443325888569867054315470696574745855033232334210730154594051655379068662733379958511562578432298827372319898757141595781119635833005940873068121602876496286744604774649159950549737425626901049037781986835938146574126804925648798556145372347867330390468838343634655379498641927056387293174872332083760112302991136793862708943879936201629515413371424892830722012690147546684765357616477379467520049075715552781965362132392640616013635815590742202020318727760527721900556148425551879253034351398442532234157623361064250639049750086562710953591946589751413103482276930624743536325691607815478181152843667957061108615331504452127473924544945423682886061340841486377670096120715124914043027253860764823634143346235189757664521641376796903149501910857598442391986291642193994907236234646844117394032659184044378051333894525742399508296591228508555821572503107125701266830240292952522011872676756220415420516184163484756516999811614101002996078386909291603028840026910414079288621507842451670908700069928212066041837180653556725253256753286129104248776182582976515795984703562226293486003415872298053498965022629174878820273420922224533985626476691490556284250391275771028402799806636582548892648802545661017296702664076559042909945681506526530537182941270336931378517860904070866711496558343434769338578171138645587367812301458768712660348913909562009939361031029161615288138437909904231747336394804575931493140529763475748119356709110137751721008031559024853090669203767192203322909433467685142214477379393751703443661991040337511173547191855046449026365512816228824462575916333039107225383742182140883508657391771509682887478265699599574490661758344137522397096834080053559849175417381883999446974867626551658276584835884531427756879002909517028352971634456212964043523117600665101241200659755851276178583829204197484423608007193045761893234922927965019875187212726750798125547095890455635792122103334669749923563025494780249011419521238281530911407907386025152274299581807247162591668545133312394804947079119153267343028244186041426363954800044800267049624820179289647669758318327131425170296923488962766844032326092752496035799646925650493681836090032380929345958897069536534940603402166544375589004563288225054525564056448246515187547119621844396582533754388569094113031509526179378002974120766514793942590298969594699556576121865619673378623625612521632086286922210327488921865436480229678070576561514463204692790682120738837781423356282360896320806822246801224826117718589638140918390367367222088832151375560037279839400415297002878307667094447456013455641725437090697939612257142989467154357846878861444581231459357198492252847160504922124247014121478057345510500801908699603302763478708108175450119307141223390866393833952942578690507643100638351983438934159613185434754649556978103829309716465143840700707360411237359984345225161050702705623526601276484830840761183013052793205427462865403603674532865105706587488225698157936789766974220575059683440869735020141020672358502007245225632651341055924019027421624843914035998953539459094407046912091409387001264560016237428802109276457931065792295524988727584610126483699989225695968815920560010165525637567856672279661988578279484885583439751874454551296563443480396642055798293680435220277098429423253302257634180703947699415979159453006975214829336655566156787364005366656416547321704390352132954352916941459904160875320186837937023488868947915107163785290234529244077365949563051007421087142613497459561513849871375704710178795731042296906667021449863746459528082436944578977233004876476524133907592043401963403911473202338071509522201068256342747164602433544005152126693249341967397704159568375355516673027390074972973635496453328886984406119649616277344951827369558822075735517665158985519098666539354948106887320685990754079234240230092590070173196036225475647894064754834664776041146323390565134330684495397907090302346046147096169688688501408347040546074295869913829668246818571031887906528703665083243197440477185567893482308943106828702722809736248093996270607472645539925399442808113736943388729406307926159599546262462970706259484556903471197299640908941805953439325123623550813494900436427852713831591256898929519642728757394691427253436694153236100453730488198551706594121735246258954873016760029886592578662856124966552353382942878542534048308330701653722856355915253478445981831341129001999205981352205117336585640782648494276441137639386692480311836445369858917544264739988228462184490087776977631279572267265556259628254276531830013407092233436577916012809317940171859859993384923549564005709955856113498025249906698423301735035804408116855265311709957089942732870925848789443646005041089226691783525870785951298344172953519537885534573742608590290817651557803905946408735061232261120093731080485485263572282576820341605048466277504500312620080079980492548534694146977516493270950493463938243222718851597405470214828971117779237612257887347718819682546298126868581705074027255026332904497627789442362167411918626943965067151577958675648239939176042601763387045499017614364120469218237076488783419689686118155815873606293860381017121585527266830082383404656475880405138080163363887421637140643549556186896411228214075330265510042410489678352858829024367090488711819090949453314421828766181031007354770549815968077200947469613436092861484941785017180779306810854690009445899527942439813921350558642219648349151263901280383200109773868066287792397180146134324457264009737425700735921003154150893679300816998053652027600727749674584002836240534603726341655425902760183484030681138185510597970566400750942608788573579603732451414678670368809880609716425849759513806930944940151542222194329130217391253835591503100333032511174915696917450271494331515588540392216409722910112903552181576282328318234254832611191280092825256190205263016391147724733148573910777587442538761174657867116941477642144111126358355387136101102326798775641024682403226483464176636980663785768134920453022408197278564719839630878154322116691224641591177673225326433568614618654522268126887268445968442416107854016768142080885028005414361314623082102594173756238994207571362751674573189189456283525704413354375857534269869947254703165661399199968262824727064133622217892390317608542894373393561889165125042440400895271983787386480584726895462438823437517885201439560057104811949884239060613695734231559079670346149143447886360410318235073650277859089757827273130504889398900992391350337325085598265586708924261242947367019390772713070686917092646254842324074855036608013604668951184009366860954632500214585293095000090715105823626729326453738210493872499669933942468551648326113414611068026744663733437534076429402668297386522093570162638464852851490362932019919968828517183953669134522244470804592396602817156551565666111359823112250628905854914509715755390024393153519090210711945730024388017661503527086260253788179751947806101371500448991721002220133501310601639154158957803711779277522597874289191791552241718958536168059474123419339842021874564925644346239253195313510331147639491199507285843065836193536932969928983791494193940608572486396883690326556436421664425760791471086998431573374964883529276932822076294728238153740996154559879825989109371712621828302584811238901196822142945766758071865380650648702613389282299497257453033283896381843944770779402284359883410035838542389735424395647555684095224844554139239410001620769363684677641301781965937997155746854194633489374843912974239143365936041003523437770658886778113949861647874714079326385873862473288964564359877466763847946650407411182565837887845485814896296127399841344272608606187245545236064315371011274680977870446409475828034876975894832824123929296058294861919667091895808983320121031843034012849511620353428014412761728583024355983003204202451207287253558119584014918096925339507577840006746552603144616705082768277222353419110263416315714740612385042584598841990761128725805911393568960143166828317632356732541707342081733223046298799280490851409479036887868789493054695570307261900950207643349335910602454508645362893545686295853131533718386826561786227363716975774183023986006591481616404944965011732131389574706208847480236537103115089842799275442685327797431139514357417221975979935968525228574526379628961269157235798662057340837576687388426640599099350500081337543245463596750484423528487470144354541957625847356421619813407346854111766883118654489377697956651727966232671481033864391375186594673002443450054499539974237232871249483470604406347160632583064982979551010954183623503030945309733583446283947630477564501500850757894954893139394489921612552559770143685894358587752637962559708167764380012543650237141278346792610199558522471722017772370041780841942394872540680155603599839054898572354674564239058585021671903139526294455439131663134530893906204678438778505423939052473136201294769187497519101147231528932677253391814660730008902776896311481090220972452075916729700785058071718638105496797310016787085069420709223290807038326345345203802786099055690013413718236837099194951648960075504934126787643674638490206396401976668559233565463913836318574569814719621084108096188460545603903845534372914144651347494078488442377217515433426030669883176833100113310869042193903108014378433415137092435301367763108491351615642269847507430329716746964066653152703532546711266752246055119958183196376370761799191920357958200759560530234626775794393630746305690108011494271410093913691381072581378135789400559950018354251184172136055727522103526803735726527922417373605751127887218190844900617801388971077082293100279766593583875890939568814856026322439372656247277603789081445883785501970284377936240782505270487581647032458129087839523245323789602984166922548964971560698119218658492677040395648127810217991321741630581055459880130048456299765112124153637451500563507012781592671424134210330156616535602473380784302865525722275304999883701534879300806260180962381516136690334111138653851091936739383522934588832255088706450753947395204396807906708680644509698654880168287434378612645381583428075306184548590379821799459968115441974253634439960290251001588827216474500682070419376158454712318346007262933955054823955713725684023226821301247679452264482091023564775272308208106351889915269288910845557112660396503439789627825001611015323516051965590421184494990778999200732947690586857787872098290135295661397888486050978608595701773129815531495168146717695976099421003618355913877781769845875810446628399880600616229848616935337386578773598336161338413385368421197893890018529569196780455448285848370117096721253533875862158231013310387766827211572694951817958975469399264219791552338576623167627547570354699414892904130186386119439196283887054367774322427680913236544948536676800000106526248547305586159899914017076983854831887501429389089950685453076511680333732226517566220752695179144225280816517166776672793035485154204023817460892328391703275425750867655117859395002793389592057668278967764453184040418554010435134838953120132637836928358082719378312654961745997056745071833206503455664403449045362756001125018433560736122276594927839370647842645676338818807565612168960504161139039063960162022153684941092605387688714837989559999112099164646441191856827700457424343402167227644558933012778158686952506949936461017568506016714535431581480105458860564550133203758645485840324029871709348091055621167154684847780394475697980426318099175642280987399876697323769573701580806822904599212366168902596273043067931653114940176473769387351409336183321614280214976339918983548487562529875242387307755955595546519639440182184099841248982623673771467226061633643296406335728107078875816404381485018841143188598827694490119321296827158884133869434682859006664080631407775772570563072940049294030242049841656547973670548558044586572022763784046682337985282710578431975354179501134727362577408021347682604502285157979579764746702284099956160156910890384582450267926594205550395879229818526480070683765041836562094555434613513415257006597488191634135955671964965403218727160264859304903978748958906612725079482827693895352175362185079629778514618843271922322381015874445052866523802253284389137527384589238442253547265309817157844783421582232702069028723233005386216347988509469547200479523112015043293226628272763217790884008786148022147537657810581970222630971749507212724847947816957296142365859578209083073323356034846531873029302665964501371837542889755797144992465403868179921389346924474198509733462679332107268687076806263991936196504409954216762784091466985692571507431574079380532392523947755744159184582156251819215523370960748332923492103451462643744980559610330799414534778457469999212859999939961228161521931488876938802228108300198601654941654261696858678837260958774567618250727599295089318052187292461086763995891614585505839727420980909781729323930106766386824040111304024700735085782872462713494636853181546969046696869392547251941399291465242385776255004748529547681479546700705034799958886769501612497228204030399546327883069597624936151010243655535223069061294938859901573466102371223547891129254769617600504797492806072126803922691102777226102544149221576504508120677173571202718024296810620377657883716690910941807448781404907551782038565390991047759414132154328440625030180275716965082096427348414695726397884256008453121406593580904127113592004197598513625479616063228873618136737324450607924411763997597461938358457491598809766744709300654634242346063423747466608043170126005205592849369594143408146852981505394717890045183575515412522359059068726487863575254191128887737176637486027660634960353679470269232297186832771739323619200777452212624751869833495151019864269887847171939664976907082521742336566272592844062043021411371992278526998469884770232382384005565551788908766136013047709843861168705231055314916251728373272867600724817298763756981633541507460883866364069347043720668865127568826614973078865701568501691864748854167915459650723428773069985371390430026653078398776385032381821553559732353068604301067576083890862704984188859513809103042359578249514398859011318583584066747237029714978508414585308578133915627076035639076394731145549583226694570249413983163433237897595568085683629725386791327505554252449194358912840504522695381217913191451350099384631177401797151228378546011603595540286440590249646693070776905548102885020808580087811577381719174177601733073855475800605601433774329901272867725304318251975791679296996504146070664571258883469797964293162296552016879730003564630457930884032748077181155533090988702550520768046303460865816539487695196004408482065967379473168086415645650530049881616490578831154345485052660069823093157776500378070466126470602145750579327096204782561524714591896522360839664562410519551052235723973951288181640597859142791481654263289200428160913693777372229998332708208296995573772737566761552711392258805520189887620114168005468736558063347160373429170390798639652296131280178267971728982293607028806908776866059325274637840539769184808204102194471971386925608416245112398062011318454124478205011079876071715568315407886543904121087303240201068534194723047666672174986986854707678120512473679247919315085644477537985379973223445612278584329684664751333657369238720146472367942787004250325558992688434959287612400755875694641370562514001179713316620715371543600687647731867558714878398908107429530941060596944315847753970094398839491443235366853920994687964506653398573888786614762944341401049888993160051207678103588611660202961193639682134960750111649832785635316145168457695687109002999769841263266502347716728657378579085746646077228341540311441529418804782543876177079043000156698677679576090996693607559496515273634981189641304331166277471233881740603731743970540670310967676574869535878967003192586625941051053358438465602339179674926784476370847497833365557900738419147319886271352595462518160434225372996286326749682405806029642114638643686422472488728343417044157348248183330164056695966886676956349141632842641497453334999948000266998758881593507357815195889900539512085351035726137364034367534714104836017546488300407846416745216737190483109676711344349481926268111073994825060739495073503169019731852119552635632584339099822498624067031076831844660729124874754031617969941139738776589986855417031884778867592902607004321266617919223520938227878880988633599116081923535557046463491132085918979613279131975649097600013996234445535014346426860464495862476909434704829329414041114654092398834443515913320107739441118407410768498106634724104823935827401944935665161088463125678529776973468430306146241803585293315973458303845541033701091676776374276210213701354854450926307190114731848574923318167207213727935567952844392548156091372812840633303937356242001604566455741458816605216660873874804724339121295587776390696903707882852775389405246075849623157436917113176134783882719416860662572103685132156647800147675231039357860689611125996028183930954870905907386135191459181951029732787557104972901148717189718004696169777001791391961379141716270701895846921434369676292745910994006008498356842520191559370370101104974733949387788598941743303178534870760322198297057975119144051099423588303454635349234982688362404332726741554030161950568065418093940998202060999414021689090070821330723089662119775530665918814119157783627292746156185710372172471009521423696483086410259288745799932237495519122195190342445230753513380685680735446499512720317448719540397610730806026990625807602029273145525207807991418429063884437349968145827337207266391767020118300464819000241308350884658415214899127610651374153943565721139032857491876909441370209051703148777346165287984823533829726013611098451484182380812054099612527458088109948697221612852489742555551607637167505489617301680961380381191436114399210638005083214098760459930932485102516829446726066613815174571255975495358023998314698220361338082849935670557552471290274539776214049318201465800802156653606776550878380430413431059180460680083459113664083488740800574127258670479225831912741573908091438313845642415094084913391809684025116399193685322555733896695374902662092326131885589158083245557194845387562878612885900410600607374650140262782402734696252821717494158233174923968353013617865367376064216677813773995100658952887742766263684183068019080460984980946976366733566228291513235278880615776827815958866918023894033307644191240341202231636857786035727694154177882643523813190502808701857504704631293335375728538660588890458311145077394293520199432197117164223500564404297989208159430716701985746927384865383343614579463417592257389858800169801475742054299580124295810545651083104629728293758416116253256251657249807849209989799062003593650993472158296517413579849104711166079158743698654122234834188772292944633517865385673196255985202607294767407261676714557364981210567771689348491766077170527718760119990814411305864557791052568430481144026193840232247093924980293355073184589035539713308844617410795916251171486487446861124760542867343670904667846867027409188101424971114965781772427934707021668829561087779440504843752844337510882826477197854000650970403302186255614733211777117441335028160884035178145254196432030957601869464908868154528562134698835544456024955666843660292219512483091060537720198021831010327041783866544718126039719068846237085751808003532704718565949947612424811099928867915896904956394762460842406593094862150769031498702067353384834955083636601784877106080980426924713241000946401437360326564518456679245666955100150229833079849607994988249706172367449361226222961790814311414660941234159359309585407913908720832273354957208075716517187659944985693795623875551617575438091780528029464200447215396280746360211329425591600257073562812638733106005891065245708024474937543184149401482119996276453106800663118382376163966318093144467129861552759820145141027560068929750246304017351489194576360789352855505317331416457050499644389093630843874484783961684051845273288403234520247056851646571647713932377551729479512613239822960239454857975458651745878771331813875295980941217422730035229650808917770506825924882232215493804837145478164721397682096332050830564792048208592047549985732038887639160199524091893894557676874973085695595801065952650303626615975066222508406742889826590751063756356996821151094966974458054728869363102036782325018232370845979011154847208761821247781326633041207621658731297081123075815982124863980721240786887811450165582513617890307086087019897588980745664395515741536319319198107057533663373803827215279884935039748001589051942087971130805123393322190346624991716915094854140187106035460379464337900589095772118080446574396280618671786101715674096766208029576657705129120990794430463289294730615951043090222143937184956063405618934251305726829146578329334052463502892917547087256484260034962961165413823007731332729830500160256724014185152041890701154288579920812198449315699905918201181973350012618772803681248199587707020753240636125931343859554254778196114293516356122349666152261473539967405158499860355295332924575238881013620234762466905581643896786309762736550472434864307121849437348530060638764456627218666170123812771562137974614986132874411771455244470899714452288566294244023018479120547849857452163469644897389206240194351831008828348024924908540307786387516591130287395878709810077271827187452901397283661484214287170553179654307650453432460053636147261818096997693348626407743519992868632383508875668359509726557481543194019557685043724800102041374983187225967738715495839971844490727914196584593008394263702087563539821696205532480321226749891140267852859967340524203109179789990571882194939132075343170798002373659098537552023891164346718558290685371189795262623449248339249634244971465684659124891855662958932990903523923333364743520370770101084388003290759834217018554228386161721041760301164591878053936744747205998502358289183369292233732399948043710841965947316265482574809948250999183300697656936715968936449334886474421350084070066088359723503953234017958255703601693699098867113210979889707051728075585519126993067309925070407024556850778679069476612629808225163313639952117098452809263037592242674257559989289278370474445218936320348941552104459726188380030067761793138139916205806270165102445886924764924689192461212531027573139084047000714356136231699237169484813255420091453041037135453296620639210547982439212517254013231490274058589206321758949434548906846399313757091034633271415316223280552297297953801880162859073572955416278867649827418616421878988574107164906919185116281528548679417363890665388576422915834250067361245384916067413734017357277995634104332688356950781493137800736235418007061918026732855119194267609122103598746924117283749312616339500123959924050845437569850795704622266461900010350049018303415354584283376437811198855631877779253720116671853954183598443830520376281944076159410682071697030228515225057312609304689842343315273213136121658280807521263154773060442377475350595228717440266638914881717308643611138906942027908814311944879941715404210341219084709408025402393294294549387864023051292711909751353600092197110541209668311151632870542302847007312065803262641711616595761327235156666253667271899853419989523688483099930275741991646384142707798870887422927705389122717248632202889842512528721782603050099451082478357290569198855546788607946280537122704246654319214528176074148240382783582971930101788834567416781139895475044833931468963076339665722672704339321674542182455706252479721997866854279897799233957905758189062252547358220523642485078340711014498047872669199018643882293230538231855973286978092225352959101734140733488476100556401824239219269506208318381454698392366461363989101210217709597670490830508185470419466437131229969235889538493013635657618610606222870559942337163102127845744646398973818856674626087948201864748767272722206267646533809980196688368099415907577685263986514625333631245053640261056960551318381317426118442018908885319635698696279503673842431301133175330532980201668881748134298868158557781034323175306478498321062971842518438553442762012823457071698853051832617964117857960888815032960229070561447622091509473903594664691623539680920139457817589108893199211226007392814916948161527384273626429809823406320024402449589445612916704950823581248739179964864113348032475777521970893277226234948601504665268143987705161531702669692970492831628550421289814670619533197026950721437823047687528028735412616639170824592517001071418085480063692325946201900227808740985977192180515853214739265325155903541020928466592529991435379182531454529059841581763705892790690989691116438118780943537152133226144362531449012745477269573939348154691631162492887357471882407150399500944673195431619385548520766573882513963916357672315100555603726339486720820780865373494244011579966750736071115935133195919712094896471755302453136477094209463569698222667377520994516845064362382421185353488798939567318780660610788544000550827657030558744854180577889171920788142335113866292966717964346876007704799953788338787034871802184243734211227394025571769081960309201824018842705704609262256417837526526335832424066125331152942345796556950250681001831090041124537901533296615697052237921032570693705109083078947999900499939532215362274847660361367769797856738658467093667958858378879562594646489137665219958828693380183601193236857855855819555604215625088365020332202451376215820461810670519533065306060650105488716724537794283133887163139559690583208341689847606560711834713621812324622725884199028614208728495687963932546428534307530110528571382964370999035694888528519040295604734613113826387889755178856042499874831638280404684861893818959054203988987265069762020199554841265000539442820393012748163815853039643992547020167275932857436666164411096256633730540921951967514832873480895747777527834422109107311135182804603634719818565557295714474768255285786334934285842311874944000322969069775831590385803935352135886007960034209754739229673331064939560181223781285458431760556173386112673478074585067606304822940965304111830667108189303110887172816751957967534718853722930961614320400638132246584111115775835858113501856904781536893813771847281475199835050478129771859908470762197460588742325699582889253504193795826061621184236876851141831606831586799460165205774052942305360178031335726326705479033840125730591233960188013782542192709476733719198728738524805742124892118347087662966720727232565056512933312605950577772754247124164831283298207236175057467387012820957554430596839555568686118839713552208445285264008125202766555767749596962661260456524568408613923826576858338469849977872670655519185446869846947849573462260629421962455708537127277652309895545019303773216664918257815467729200521266714346320963789185232321501897612603437368406719419303774688099929687758244104787812326625318184596045385354383911449677531286426092521153767325886672260404252349108702695809964759580579466397341906401003636190404203311357933654242630356145700901124480089002080147805660371015412232889146572239314507607167064355682743774396578906797268743847307634645167756210309860409271709095128086309029738504452718289274968921210667008164858339553773591913695015316201890888748421079870689911480466927065094076204650277252865072890532854856143316081269300569378541786109696920253886503457718317668688592368148847527649846882194973972970773718718840041432312763650481453112285099002074240925585925292610302106736815434701525234878635164397623586041919412969769040526483234700991115424260127343802208933109668636789869497799400126016422760926082349304118064382913834735467972539926233879158299848645927173405922562074910530853153718291168163721939518870095778818158685046450769934394098743351443162633031724774748689791820923948083314397084067308407958935810896656477585990556376952523265361442478023082681183103773588708924061303133647737101162821461466167940409051861526036009252194721889091810733587196414214447865489952858234394705007983038853886083103571930600277119455802191194289992272235345870756624692617766317885514435021828702668561066500353105021631820601760921798468493686316129372795187307897263735371715025637873357977180818487845886650433582437700414771041493492743845758710715973155943942641257027096512510811554824793940359768118811728247215825010949609662539339538092219559191818855267806214992317276316321833989693807561685591175299845013206712939240414459386239880938124045219148483164621014738918251010909677386906640415897361047643650006807710565671848628149637111883219244566394581449148616550049567698269030891118568798692947051352481609174324301538368470729289898284602223730145265567989862776796809146979837826876431159883210904371561129976652153963546442086919756737000573876497843768628768179249746943842746525631632300555130417422734164645512781278457777245752038654375428282567141288583454443513256205446424101103795546419058116862305964476958705407214198521210673433241075676757581845699069304604752277016700568454396923404171108988899341635058515788735343081552081177207188037910404698306957868547393765643363197978680367187307969392423632144845035477631567025539006542311792015346497792906624150832885839529054263768766896880503331722780018588506973623240389470047189761934734430843744375992503417880797223585913424581314404984770173236169471976571535319775499716278566311904691260918259124989036765417697990362375528652637573376352696934435440047306719886890196814742876779086697968852250163694985673021752313252926537589641517147955953878427849986645630287883196209983049451987439636907068276265748581043911223261879405994155406327013198989570376110532360629867480377915376751158304320849872092028092975264981256916342500052290887264692528466610466539217148208013050229805263783642695973370705392278915351056888393811324975707133102950443034671598944878684711643832805069250776627450012200352620370946602341464899839025258883014867816219677519458316771876275720050543979441245990077115205154619930509838698254284640725554092740313257163264079293418334214709041254253352324802193227707535554679587163835875018159338717423606155117101312352563348582036514614187004920570437201826173319471570086757853933607862273955818579758725874410254207710547536129404746010009409544495966288148691590389907186598056361713769222729076419775517772010427649694961105622059250242021770426962215495872645398922769766031052498085575947163107587013320886146326641259114863388122028444069416948826152957762532501987035987067438046982194205638125583343642194923227593722128905642094308235254408411086454536940496927149400331978286131818618881111840825786592875742638445005994422956858646048103301538891149948693543603022181094346676400002236255057363129462629609619876056425996394613869233083719626595473923462413459779574852464783798079569319865081597767535055391899115133525229873611277918274854200868953965835942196333150286956119201229888988700607999279541118826902307891310760361763477948943203210277335941690865007193280401716384064498787175375678118532132840821657110754952829497493621460821558320568723218557406516109627487437509809223021160998263303391546949464449100451528092508974507489676032409076898365294065792019831526541065813682379198409064571246894847020935776119313998024681340520039478194986620262400890215016616381353838151503773502296607462795291038406868556907015751662419298724448271942933100485482445458071889763300323252582158128032746796200281476243182862217105435289834820827345168018613171959332471107466222850871066611770346535283957762599774467218571581612641114327179434788599089280848669491413909771673690027775850268664654056595039486784111079011610400857274456293842549416759460548711723594642910585090995021495879311219613590831588262068233215615308683373083817327932819698387508708348388046388478441884003184712697454370937329836240287519792080232187874488287284372737801782700805878241074935751488997891173974612932035108143270325140903048746226294234432757126008664250833318768865075642927160552528954492153765175149219636718104943531785838345386525565664065725136357506435323650893679043170259787817719031486796384082881020946149007971513771709906195496964007086766710233004867263147551053723175711432231741141168062286420638890621019235522354671166213749969326932173704310598722503945657492461697826097025335947502091383667377289443869640002811034402608471289900074680776484408871134135250336787731679770937277868216611786534423173226463784769787514433209534000165069213054647689098505020301504488083426184520873053097318949291642532293361243151430657826407028389840984160295030924189712097160164926561341343342229882790992178604267981245728534580133826099587717811310216734025656274400729683406619848067661580502169183372368039902793160642043681207990031626444914619021945822969099212278855394878353830564686488165556229431567312827439082645061162894280350166133669782405177015521962652272545585073864058529983037918035043287670380925216790757120406123759632768567484507915114731344000183257034492090971243580944790046249431345502890068064870429353403743603262582053579011839564908935434510134296961754524957396062149028872893279252069653538639644322538832752249960598697475988232991626354597332444516375533437749292899058117578635555562693742691094711700216541171821975051983178713710605106379555858890556885288798908475091576463907469361988150781468526213325247383765119299015610918977792200870579339646382749068069876916819749236562422608715417610043060890437797667851966189140414492527048088197149880154205778700652159400928977760133075684796699295543365613984773806039436889588764605498387147896848280538470173087111776115966350503997934386933911978988710915654170913308260764740630571141109883938809548143782847452883836807941888434266622207043872288741394780101772139228191199236540551639589347426395382482960903690028835932774585506080131798840716244656399794827578365019551422155133928197822698427863839167971509126241054872570092407004548848569295044811073808799654748156891393538094347455697212891982717702076661360248958146811913361412125878389557735719498631721084439890142394849665925173138817160266326193106536653504147307080441493916936326237376777709585031325599009576273195730864804246770121232702053374266705314244820816813030639737873664248367253983748769098060218278578621651273856351329014890350988327061725893257536399397905572917516009761545904477169226580631511102803843601737474215247608515209901615858231257159073342173657626714239047827958728150509563309280266845893764964977023297364131906098274063353108979246424213458374090116939196425045912881340349881063540088759682005440836438651661788055760895689672753153808194207733259791727843762566118431989102500749182908647514979400316070384554946538594602745244746681231468794344161099333890899263841184742525704457251745932573898956518571657596148126602031079762825416559050604247911401695790033835657486925280074302562341949828646791447632277400552946090394017753633565547193100017543004750471914489984104001586794617924161001645471655133707407395026044276953855383439755054887109978520540117516974758134492607943368954378322117245068734423198987884412854206474280973562580706698310697993526069339213568588139121480735472846322778490808700246777630360555123238665629517885371967303463470122293958160679250915321748903084088651606111901149844341235012464692802880599613428351188471544977127847336176628506216977871774382436256571177945006447771837022199910669502165675764404499794076503799995484500271066598781360380231412683690578319046079276529727769404361302305178708054651154246939526512710105292707030667302444712597393995051462840476743136373997825918454117641332790646063658415292701903027601733947486696034869497654175242930604072700505903950314852292139257559484507886797792525393176515641619716844352436979444735596426063339105512682606159572621703669850647328126672452198906054988028078288142979633669674412480598219214633956574572210229867759974673812606936706913408155941201611596019023775352555630060624798326124988128819293734347686268921923977783391073310658825681377717232831532908252509273304785072497713944833389255208117560845296659055394096556854170600117985729381399825831929367910039184409928657560599359891000296986446097471471847010153128376263114677420914557404181590880006494323785583930853082830547607679952435739163122188605754967383224319565065546085288120190236364471270374863442172725787950342848631294491631847534753143504139209610879605773098720135248407505763719925365047090858251393686346386336804289176710760211115982887553994012007601394703366179371539630613986365549221374159790511908358829009765664730073387931467891318146510931676157582135142486044229244530411316065270097433008849903467540551864067734260358340960860553374736276093565885310976099423834738222208729246449768456057956251676557408841032173134562773585605235823638953203853402484227337163912397321599544082842166663602329654569470357718487344203422770665383738750616921276801576618109542009770836360436111059240911788954033802142652394892968643980892611463541457153519434285072135345301831587562827573389826889852355779929572764522939156747756667605108788764845349363606827805056462281359888587925994094644604170520447004631513797543173718775603981596264750141090665886616218003826698996196558058720863972117699521946678985701179833244060181157565807428418291061519391763005919431443460515404771057005433900018245311773371895585760360718286050635647997900413976180895536366960316219311325022385179167205518065926351803625121457592623836934822266589557699466049193811248660909979812857182349400661555219611220720309227764620099931524427358948871057662389469388944649509396033045434084210246240104872332875008174917987554387938738143989423801176270083719605309438394006375611645856094312951759771393539607432279248922126704580818331376416581826956210587289244774003594700926866265965142205063007859200248829186083974373235384908396432614700053242354064704208949921025040472678105908364400746638002087012666420945718170294675227854007450855237772089058168391844659282941701828823301497155423523591177481862859296760504820386434310877956289292540563894662194826871104282816389397571175778691543016505860296521745958198887868040811032843273986719862130620555985526603640504628215230615459447448990883908199973874745296981077620148713400012253552224669540931521311533791579802697955571050850747387475075806876537644578252443263804614304288923593485296105826938210349800040524840708440356116781717051281337880570564345061611933042444079826037795119854869455915205196009304127100727784930155503889536033826192934379708187432094991415959339636811062755729527800425486306005452383915106899891357882001941178653568214911852820785213012551851849371150342215954224451190020739353962740020811046553020793286725474054365271759589350071633607632161472581540764205302004534018357233829266191530835409512022632916505442612361919705161383935732669376015691442994494374485680977569630312958871916112929468188493633864739274760122696415884890096571708616059814720446742866420876533479985822209061980217321161423041947775499073873856794118982466091309169177227420723336763503267834058630193019324299639720444517928812285447821195353089891012534297552472763573022628138209180743974867145359077863353016082155991131414420509144729353502223081719366350934686585865631485557586244781862010871188976065296989926932817870557643514338206014107732926106343152533718224338526352021773544071528189813769875515757454693972715048846979361950047772097056179391382898984532742622728864710888327017372325881824465843624958059256033810521560620615571329915608489206434030339526226345145428367869828807425142256745180618414956468611163540497189768215422772247947403357152743681940989205011365340012384671429655186734415374161504256325671343024765512521921803578016924032669954174608759240920700466934039651017813485783569444076047023254075555776472845075182689041829396611331016013111907739863246277821902365066037404160672496249013743321724645409741299557052914243820807609836482346597388669134991978401310801558134397919485283043673901248208244481412809544377389832005986490915950532285791457688496257866588599917986752055455809900455646117875524937012455321717019428288461740273664997847550829422802023290122163010230977215156944642790980219082668986883426307160920791408519769523555348865774342527753119724743087304361951139611908003025587838764420608504473063129927788894272918972716989057592524467966018970748296094919064876469370275077386643239191904225429023531892337729316673608699622803255718530891928440380507103006477684786324319100022392978525537237556621364474009676053943983823576460699246526008909062410590421545392790441152958034533450025624410100635953003959886446616959562635187806068851372346270799732723313469397145628554261546765063246567662027924520858134771760852169134094652030767339184114750414016892412131982688156866456148538028753933116023229255561894104299533564009578649534093511526645402441877594931693056044868642086275720117231952640502309977456764783848897346431721598062678767183800524769688408498918508614900343240347674268624595239589035858213500645099817824463608731775437885967767291952611121385919472545140030118050343787527766440276261894101757687268042817662386068047788524288743025914524707395054652513533945959878961977891104189029294381856720507096460626354173294464957661265195349570186001541262396228641389779673332907056737696215649818450684226369036784955597002607986799626101903933126376855696876702929537116252800554310078640872893922571451248113577862766490242516199027747109033593330930494838059785662884478744146984149906712376478958226329490467981208998485716357108783119184863025450162092980582920833481363840542172005612198935366937133673339246441612522319694347120641737549121635700857369439730597970971972666664226743111776217640306868131035189911227133972403688700099686292254646500638528862039380050477827691283560337254825579391298525150682996910775425764748832534141213280062671709400909822352965795799780301828242849022147074811112401860761341515038756983091865278065889668236252393784527263453042041880250844236319038331838455052236799235775292910692504326144695010986108889991465855188187358252816430252093928525807796973762084563748211443398816271003170315133440230952635192958868069082135585368016100021374085115448491268584126869589917414913382057849280069825519574020181810564129725083607035685105533178784082900004155251186577945396331753853209214972052660783126028196116485809868458752512999740409279768317663991465538610893758795221497173172813151793290443112181587102351874075722210012376872194474720934931232410706508061856237252673254073332487575448296757345001932190219911996079798937338367324257610393898534927877747398050808001554476406105352220232540944356771879456543040673589649101761077594836454082348613025471847648518957583667439979150851285802060782055446299172320202822291488695939972997429747115537185892423849385585859540743810488262464878805330427146301194158989632879267832732245610385219701113046658710050008328517731177648973523092666123458887310288351562644602367199664455472760831011878838915114934093934475007302585581475619088139875235781233134227986650352272536717123075686104500454897036007956982762639234410714658489578024140815840522953693749971066559489445924628661996355635065262340533943914211127181069 \ No newline at end of file diff --git a/fortran/cmd/build.sh b/fortran/cmd/build.sh new file mode 100755 index 0000000..1e83977 --- /dev/null +++ b/fortran/cmd/build.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Fortran Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Fortran Build ===" +echo "" + +# Check for gfortran +if command -v gfortran &> /dev/null; then + FC=gfortran +elif command -v f95 &> /dev/null; then + FC=f95 +elif command -v f90 &> /dev/null; then + FC=f90 +else + echo "✗ Ingen Fortran-kompilator hittades!" + echo " Installera gfortran: brew install gcc" + exit 1 +fi + +echo "Använder: $FC" + +# Compile +if $FC -O2 -o bin/print_hej src/print_hej.f90 2>&1; then + echo "✓ Kompilering lyckades!" + echo " Executable: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/fortran/src/print_hej.f90 b/fortran/src/print_hej.f90 new file mode 100644 index 0000000..00f47ff --- /dev/null +++ b/fortran/src/print_hej.f90 @@ -0,0 +1,157 @@ +! Pi Calculator using Machin's Formula +! pi/4 = 4*arctan(1/5) - arctan(1/239) +program pi_calculator + implicit none + integer :: decimals, argc, i, n + character(len=32) :: arg + integer, allocatable :: pi(:), a(:), b(:), term(:), contrib(:) + integer :: scale_len + integer :: carry, rem, x_sq, divisor + + argc = command_argument_count() + if (argc > 0) then + call get_command_argument(1, arg) + read(arg, *) decimals + else + decimals = 100 + end if + if (decimals <= 0) decimals = 100 + + scale_len = decimals + 20 + allocate(pi(scale_len)) + allocate(a(scale_len)) + allocate(b(scale_len)) + allocate(term(scale_len)) + allocate(contrib(scale_len)) + + ! Initialize + pi = 0 + a = 0 + b = 0 + + ! Calculate arctan(1/5) -> a + call arctan(5, a, scale_len) + + ! Calculate arctan(1/239) -> b + call arctan(239, b, scale_len) + + ! pi = 16*a - 4*b + ! First multiply a by 16 + carry = 0 + do i = scale_len, 1, -1 + pi(i) = a(i) * 16 + carry + carry = pi(i) / 10 + pi(i) = mod(pi(i), 10) + end do + + ! Then multiply b by 4 + carry = 0 + do i = scale_len, 1, -1 + b(i) = b(i) * 4 + carry + carry = b(i) / 10 + b(i) = mod(b(i), 10) + end do + + ! Then subtract b from pi + carry = 0 + do i = scale_len, 1, -1 + pi(i) = pi(i) - b(i) - carry + if (pi(i) < 0) then + pi(i) = pi(i) + 10 + carry = 1 + else + carry = 0 + end if + end do + + ! Print result + write(*, '(A)', advance='no') '3.' + do i = 2, decimals + 1 + write(*, '(I1)', advance='no') pi(i) + end do + write(*, *) + + deallocate(pi, a, b, term, contrib) + +contains + + subroutine arctan(x, result, len) + integer, intent(in) :: x, len + integer, intent(out) :: result(len) + integer :: n, i + integer :: term(len), contrib(len) + integer :: rem, x_sq, divisor, carry_local + logical :: term_zero + + result = 0 + term = 0 + term(1) = 1 + + ! term = 10^len / x + rem = 0 + do i = 1, len + rem = rem * 10 + term(i) + term(i) = rem / x + rem = mod(rem, x) + end do + + x_sq = x * x + n = 0 + + do while (n < len * 3) + divisor = 2 * n + 1 + + ! contrib = term / divisor + rem = 0 + do i = 1, len + rem = rem * 10 + term(i) + contrib(i) = rem / divisor + rem = mod(rem, divisor) + end do + + ! result = result +/- contrib + if (mod(n, 2) == 0) then + ! result = result + contrib + carry_local = 0 + do i = len, 1, -1 + result(i) = result(i) + contrib(i) + carry_local + carry_local = result(i) / 10 + result(i) = mod(result(i), 10) + end do + else + ! result = result - contrib + carry_local = 0 + do i = len, 1, -1 + result(i) = result(i) - contrib(i) - carry_local + if (result(i) < 0) then + result(i) = result(i) + 10 + carry_local = 1 + else + carry_local = 0 + end if + end do + end if + + ! term = term / x^2 + rem = 0 + do i = 1, len + rem = rem * 10 + term(i) + term(i) = rem / x_sq + rem = mod(rem, x_sq) + end do + + ! Check if term is zero + term_zero = .true. + do i = 1, len + if (term(i) /= 0) then + term_zero = .false. + exit + end if + end do + if (term_zero) exit + + n = n + 1 + end do + end subroutine arctan + +end program pi_calculator \ No newline at end of file diff --git a/go/cmd/build.sh b/go/cmd/build.sh new file mode 100755 index 0000000..d518f1d --- /dev/null +++ b/go/cmd/build.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Go Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Go Build ===" +echo "" + +# Kompilera Go-programmet +cd src +go build -o ../bin/print_hej print_hej.go + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/go/cmd/test.sh b/go/cmd/test.sh new file mode 100755 index 0000000..871d123 --- /dev/null +++ b/go/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Go Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Go Pi-beräkning Unit Tester ===" +echo "" + +cd src +go test -v + +exit $? \ No newline at end of file diff --git a/go/src/go.mod b/go/src/go.mod new file mode 100644 index 0000000..f933cb5 --- /dev/null +++ b/go/src/go.mod @@ -0,0 +1,3 @@ +module print_hej + +go 1.21 \ No newline at end of file diff --git a/go/src/pi_test.go b/go/src/pi_test.go new file mode 100644 index 0000000..6e00874 --- /dev/null +++ b/go/src/pi_test.go @@ -0,0 +1,73 @@ +package main + +import ( + "os/exec" + "strings" + "testing" +) + +const scriptPath = "/Users/einand/Code/test/go/print_hej" + +func runScript(decimals ...int) string { + args := []string{} + if len(decimals) > 0 { + args = append(args, string(rune(decimals[0]))) + } + cmd := exec.Command(scriptPath, args...) + output, err := cmd.Output() + if err != nil { + panic(err) + } + return strings.TrimSpace(string(output)) +} + +func Test10Decimals(t *testing.T) { + result := runScript(10) + expected := "3.1415926535" + if result != expected { + t.Errorf("Expected %s, got %s", expected, result) + } +} + +func Test5Decimals(t *testing.T) { + result := runScript(5) + expected := "3.14159" + if result != expected { + t.Errorf("Expected %s, got %s", expected, result) + } +} + +func Test1Decimal(t *testing.T) { + result := runScript(1) + expected := "3.1" + if result != expected { + t.Errorf("Expected %s, got %s", expected, result) + } +} + +func Test100Decimals(t *testing.T) { + result := runScript(100) + expected := "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + if result != expected { + t.Errorf("Expected %s, got %s", expected, result) + } +} + +func TestDefault100Decimals(t *testing.T) { + result := runScript() + expected := "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + if result != expected { + t.Errorf("Expected %s, got %s", expected, result) + } +} + +func Test10000Decimals(t *testing.T) { + result := runScript(10000) + // Check length: "3." + 10000 digits = 10002 characters + if len(result) != 10002 { + t.Errorf("Expected 10002 characters, got %d", len(result)) + } + if !strings.HasPrefix(result, "3.14159") { + t.Errorf("Result should start with 3.14159, got %s", result[:10]) + } +} \ No newline at end of file diff --git a/go/src/print_hej.go b/go/src/print_hej.go new file mode 100644 index 0000000..6ad8429 --- /dev/null +++ b/go/src/print_hej.go @@ -0,0 +1,109 @@ +package main + +import ( + "fmt" + "math/big" + "os" + "strconv" +) + +func main() { + // Hämta antal decimaler från argument + decimals := 100 + if len(os.Args) > 1 { + if d, err := strconv.Atoi(os.Args[1]); err == nil && d > 0 { + decimals = d + } + } + + // Beräkna pi med Machins formel: pi/4 = 4*arctan(1/5) - arctan(1/239) + // Använd exakt aritmetik med big.Int + pi := calculatePiExact(decimals) + + // Skriv ut resultatet + fmt.Println(formatPiExact(pi, decimals)) +} + +func calculatePiExact(decimals int) *big.Int { + // pi = 4 * (4*arctan(1/5) - arctan(1/239)) + // Skala med 10^(decimals+10) för exakt aritmetik + + scale := new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(decimals+10)), nil) + + atan1_5 := arctanExact(5, scale) + atan1_239 := arctanExact(239, scale) + + // 4 * atan(1/5) + result := new(big.Int).Mul(big.NewInt(4), atan1_5) + + // - atan(1/239) + result.Sub(result, atan1_239) + + // * 4 + result.Mul(result, big.NewInt(4)) + + return result +} + +func arctanExact(x int64, scale *big.Int) *big.Int { + // arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... + // Med skala: scale/x - scale/(3*x^3) + scale/(5*x^5) - ... + + result := big.NewInt(0) + + xBig := big.NewInt(x) + xSquared := new(big.Int).Mul(xBig, xBig) + + // term = scale / x + term := new(big.Int).Div(scale, xBig) + + sign := big.NewInt(1) + + for n := 0; n < 100000; n++ { + // Lägg till term / (2n+1) med rätt tecken + divisor := big.NewInt(int64(2*n + 1)) + contrib := new(big.Int).Div(term, divisor) + + if sign.Sign() > 0 { + result.Add(result, contrib) + } else { + result.Sub(result, contrib) + } + + // Nästa term: term = term / x^2 + term.Div(term, xSquared) + + // Växla tecken + sign.Neg(sign) + + // Avbryt om termen är 0 + if term.Sign() == 0 { + break + } + } + + return result +} + +func formatPiExact(pi *big.Int, decimals int) string { + // Konvertera till sträng + piStr := pi.String() + + // pi är skalad med 10^(decimals+10), så vi behöver justera decimalpunkten + // För pi ≈ 3.14159..., pi*10^110 ≈ 314159... (110 siffror) + + // Lägg till ledande noll om nödvändigt + for len(piStr) < decimals+10 { + piStr = "0" + piStr + } + + // Ta första siffran, sedan decimalpunkt, sedan resten + if len(piStr) > decimals+10 { + piStr = piStr[:decimals+10] + } + + // Resultatet bör vara "3" följt av decimaler + result := string(piStr[0]) + "." + piStr[1:decimals+1] + + return result +} \ No newline at end of file diff --git a/go/src/print_hej_test.go b/go/src/print_hej_test.go new file mode 100644 index 0000000..68efed0 --- /dev/null +++ b/go/src/print_hej_test.go @@ -0,0 +1,126 @@ +package main + +import ( + "math/big" + "os" + "os/exec" + "strings" + "testing" +) + +func TestPi10Decimals(t *testing.T) { + cmd := exec.Command("./print_hej", "10") + output, err := cmd.Output() + if err != nil { + t.Fatalf("Kunde inte köra program: %v", err) + } + + result := strings.TrimSpace(string(output)) + expected := "3.1415926535" + + if result != expected { + t.Errorf("Fel resultat för 10 decimaler.\nFörväntade: %s\nFick: %s", expected, result) + } +} + +func TestPi5Decimals(t *testing.T) { + cmd := exec.Command("./print_hej", "5") + output, err := cmd.Output() + if err != nil { + t.Fatalf("Kunde inte köra program: %v", err) + } + + result := strings.TrimSpace(string(output)) + expected := "3.14159" + + if result != expected { + t.Errorf("Fel resultat för 5 decimaler.\nFörväntade: %s\nFick: %s", expected, result) + } +} + +func TestPi1Decimal(t *testing.T) { + cmd := exec.Command("./print_hej", "1") + output, err := cmd.Output() + if err != nil { + t.Fatalf("Kunde inte köra program: %v", err) + } + + result := strings.TrimSpace(string(output)) + expected := "3.1" + + if result != expected { + t.Errorf("Fel resultat för 1 decimal.\nFörväntade: %s\nFick: %s", expected, result) + } +} + +func TestPiDefault(t *testing.T) { + cmd := exec.Command("./print_hej") + output, err := cmd.Output() + if err != nil { + t.Fatalf("Kunde inte köra program: %v", err) + } + + result := strings.TrimSpace(string(output)) + + // Läs facit + facit, err := os.ReadFile("../facit.txt") + if err != nil { + t.Fatalf("Kunde inte läsa facit: %v", err) + } + + expected := strings.TrimSpace(string(facit)) + expected = strings.ReplaceAll(expected, "\n", "")[:103] + + if result != expected { + t.Errorf("Fel resultat för default (100 decimaler).\nFörväntade: %s\nFick: %s", expected, result) + } +} + +func TestPiInvalidInput(t *testing.T) { + cmd := exec.Command("./print_hej", "abc") + output, err := cmd.Output() + if err != nil { + t.Fatalf("Kunde inte köra program: %v", err) + } + + result := strings.TrimSpace(string(output)) + + // Ska använda default (100 decimaler) + if !strings.HasPrefix(result, "3.1415926535") { + t.Errorf("Hanterar inte ogiltig input korrekt.\nFick: %s", result) + } +} + +func TestCalculatePiExact(t *testing.T) { + pi := calculatePiExact(10) + result := formatPiExact(pi, 10) + + expected := "3.1415926535" + if result != expected { + t.Errorf("calculatePiExact gav fel resultat.\nFörväntade: %s\nFick: %s", expected, result) + } +} + +func TestArctanExact(t *testing.T) { + scale := new(big.Int).Exp(big.NewInt(10), big.NewInt(20), nil) + + // arctan(1/5) ska vara ungefär 0.1973955598... + atan1_5 := arctanExact(5, scale) + + // Kontrollera att resultatet är positivt + if atan1_5.Sign() <= 0 { + t.Errorf("arctan(1/5) ska vara positivt, fick: %v", atan1_5) + } +} + +func TestFormatPiExact(t *testing.T) { + // Skapa ett pi-värde: 31415926535... (skalat med 10^10) + pi := big.NewInt(31415926535) + + result := formatPiExact(pi, 10) + expected := "3.1415926535" + + if result != expected { + t.Errorf("formatPiExact gav fel resultat.\nFörväntade: %s\nFick: %s", expected, result) + } +} \ No newline at end of file diff --git a/haskell/cmd/build.sh b/haskell/cmd/build.sh new file mode 100755 index 0000000..a3c03ba --- /dev/null +++ b/haskell/cmd/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Haskell Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Haskell Build ===" +echo "" + +# Kompilera Haskell-programmet +ghc -o bin/print_hej src/print_hej.hs + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/haskell/cmd/test.sh b/haskell/cmd/test.sh new file mode 100755 index 0000000..c925349 --- /dev/null +++ b/haskell/cmd/test.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Haskell Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Haskell Pi-beräkning Unit Tester ===" +echo "" + +cd src +ghc -o ../bin/pi_test PiTest.hs +if [ $? -eq 0 ]; then + ../bin/pi_test + exit $? +else + echo "✗ Kompilering av tester misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/haskell/src/PiTest.hs b/haskell/src/PiTest.hs new file mode 100644 index 0000000..96f339e --- /dev/null +++ b/haskell/src/PiTest.hs @@ -0,0 +1,66 @@ +module Main where + +import Test.HUnit +import System.Process +import Data.List (stripPrefix) + +scriptPath :: String +scriptPath = "/Users/einand/Code/test/haskell/print_hej" + +runScript :: Maybe String -> IO String +runScript mArgs = do + let args = maybe [] (\x -> [x]) mArgs + output <- readProcess scriptPath args "" + return $ init output -- Remove trailing newline + +test10Decimals :: Test +test10Decimals = TestCase $ do + result <- runScript (Just "10") + let expected = "3.1415926535" + assertEqual "10 decimals" expected result + +test5Decimals :: Test +test5Decimals = TestCase $ do + result <- runScript (Just "5") + let expected = "3.14159" + assertEqual "5 decimals" expected result + +test1Decimal :: Test +test1Decimal = TestCase $ do + result <- runScript (Just "1") + let expected = "3.1" + assertEqual "1 decimal" expected result + +test100Decimals :: Test +test100Decimals = TestCase $ do + result <- runScript (Just "100") + let expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + assertEqual "100 decimals" expected result + +testDefault100Decimals :: Test +testDefault100Decimals = TestCase $ do + result <- runScript Nothing + let expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + assertEqual "default 100 decimals" expected result + +test10000Decimals :: Test +test10000Decimals = TestCase $ do + result <- runScript (Just "10000") + -- Check length: "3." + 10000 digits = 10002 characters + assertEqual "10000 decimals length" 10002 (length result) + assertBool "10000 decimals starts with 3.14159" (take 7 result == "3.14159") + +tests :: Test +tests = TestList [ + TestLabel "test10Decimals" test10Decimals, + TestLabel "test5Decimals" test5Decimals, + TestLabel "test1Decimal" test1Decimal, + TestLabel "test100Decimals" test100Decimals, + TestLabel "testDefault100Decimals" testDefault100Decimals, + TestLabel "test10000Decimals" test10000Decimals + ] + +main :: IO () +main = do + counts <- runTestTT tests + putStrLn $ showCounts counts \ No newline at end of file diff --git a/haskell/src/print_hej.hs b/haskell/src/print_hej.hs new file mode 100644 index 0000000..46861f6 --- /dev/null +++ b/haskell/src/print_hej.hs @@ -0,0 +1,49 @@ +module Main where + +import System.Environment (getArgs) +import Data.Char (digitToInt) + +-- Calculate arctan(1/x) using Taylor series +-- arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... +arctan :: Integer -> Integer -> Integer +arctan x decimals = arctanIter scale xSquared term 0 0 + where + scale = 10 ^ (decimals + 10) + xSquared = x * x + term = scale `div` x -- First term: scale / x + + arctanIter :: Integer -> Integer -> Integer -> Integer -> Integer -> Integer + arctanIter scale xSquared term n result + | term == 0 || n > decimals * 3 = result + | otherwise = arctanIter scale xSquared newTerm (n + 1) newResult + where + divisor = 2 * n + 1 + contrib = term `div` divisor + newResult = if even n + then result + contrib + else result - contrib + newTerm = term `div` xSquared -- Divide by x² each iteration + +-- Calculate pi using Machin's formula +-- pi/4 = 4*arctan(1/5) - arctan(1/239) +calculatePi :: Integer -> Integer +calculatePi decimals = 16 * atan1_5 - 4 * atan1_239 + where + atan1_5 = arctan 5 decimals + atan1_239 = arctan 239 decimals + +-- Format pi with decimal point +formatPi :: Integer -> Integer -> String +formatPi pi decimals = "3." ++ take (fromIntegral decimals) (drop 1 (show pi)) + +main :: IO () +main = do + args <- getArgs + let decimals = case args of + [] -> 100 + (x:_) -> case reads x :: [(Integer, String)] of + [(d, _)] -> if d > 0 then d else 100 + _ -> 100 + + let pi = calculatePi decimals + putStrLn (formatPi pi decimals) \ No newline at end of file diff --git a/java/cmd/build.sh b/java/cmd/build.sh new file mode 100755 index 0000000..f047e74 --- /dev/null +++ b/java/cmd/build.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# Java Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Java Build ===" +echo "" + +# Kompilera Java-programmet +cd src +javac print_hej.java + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Class: src/print_hej.class" + echo "" + echo "För att köra:" + echo " java -cp src print_hej [decimaler]" + + # Skapa wrapper script + mkdir -p ../bin + cat > ../bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +java -cp src print_hej "$@" +EOF + chmod +x ../bin/print_hej + echo "Wrapper script skapad: bin/print_hej" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/java/src/print_hej.java b/java/src/print_hej.java new file mode 100644 index 0000000..d2e4fde --- /dev/null +++ b/java/src/print_hej.java @@ -0,0 +1,65 @@ +import java.math.BigInteger; + +public class print_hej { + public static void main(String[] args) { + int decimals = 100; + if (args.length > 0) { + try { + decimals = Integer.parseInt(args[0]); + if (decimals <= 0) decimals = 100; + } catch (NumberFormatException e) { + decimals = 100; + } + } + + BigInteger pi = calculatePi(decimals); + System.out.println(formatPi(pi, decimals)); + } + + // Calculate arctan(1/x) using Taylor series + static BigInteger arctan(int x, int decimals) { + BigInteger scale = BigInteger.TEN.pow(decimals + 10); + BigInteger xBig = BigInteger.valueOf(x); + BigInteger xSquared = xBig.multiply(xBig); + + BigInteger result = BigInteger.ZERO; + BigInteger term = scale.divide(xBig); + + int n = 0; + while (term.compareTo(BigInteger.ZERO) != 0 && n < decimals * 3) { + BigInteger divisor = BigInteger.valueOf(2 * n + 1); + BigInteger contrib = term.divide(divisor); + + if (n % 2 == 0) { + result = result.add(contrib); + } else { + result = result.subtract(contrib); + } + + term = term.divide(xSquared); + n++; + + if (n > decimals * 2) break; + } + + return result; + } + + // Calculate pi using Machin's formula + static BigInteger calculatePi(int decimals) { + BigInteger atan1_5 = arctan(5, decimals); + BigInteger atan1_239 = arctan(239, decimals); + + return atan1_5.multiply(BigInteger.valueOf(16)) + .subtract(atan1_239.multiply(BigInteger.valueOf(4))); + } + + // Format pi with decimal point + static String formatPi(BigInteger pi, int decimals) { + String piStr = pi.toString(); + while (piStr.length() < decimals + 10) { + piStr = "0" + piStr; + } + return "3." + piStr.substring(1, decimals + 1); + } +} \ No newline at end of file diff --git a/javascript/cmd/build.sh b/javascript/cmd/build.sh new file mode 100755 index 0000000..0156d4d --- /dev/null +++ b/javascript/cmd/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# JavaScript Build Script - JavaScript är interpreterat, ingen kompilering behövs + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== JavaScript Build ===" +echo "JavaScript är ett interpreterat språk, ingen kompilering behövs." +echo "Script: src/print_hej.js" +echo "" + +# Skapa wrapper script +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +node src/print_hej.js "$@" +EOF +chmod +x bin/print_hej + +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" +echo "" +echo "✓ Klart!" \ No newline at end of file diff --git a/javascript/cmd/test.sh b/javascript/cmd/test.sh new file mode 100755 index 0000000..76685c1 --- /dev/null +++ b/javascript/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# JavaScript Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== JavaScript Pi-beräkning Unit Tester (Jest) ===" +echo "" + +cd src +npm test + +exit $? \ No newline at end of file diff --git a/javascript/package-lock.json b/javascript/package-lock.json new file mode 100644 index 0000000..904f2ee --- /dev/null +++ b/javascript/package-lock.json @@ -0,0 +1,3678 @@ +{ + "name": "javascript-pi", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "javascript-pi", + "version": "1.0.0", + "dependencies": { + "big.js": "^7.0.1" + }, + "devDependencies": { + "jest": "^29.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.20.tgz", + "integrity": "sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/big.js": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-7.0.1.tgz", + "integrity": "sha512-iFgV784tD8kq4ccF1xtNMZnXeZzVuXWWM+ERFzKQjv+A5G9HC8CY3DuV45vgzFFcW+u2tIvmF95+AzWgs6BjCg==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001790", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", + "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.343", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.343.tgz", + "integrity": "sha512-YHnQ3MXI08icvL9ZKnEBy05F2EQ8ob01UaMOuMbM8l+4UcAq6MPPbBTJBbsBUg3H8JeZNt+O4fjsoWth3p6IFg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/javascript/src/package.json b/javascript/src/package.json new file mode 100644 index 0000000..8f9a90f --- /dev/null +++ b/javascript/src/package.json @@ -0,0 +1,14 @@ +{ + "name": "javascript-pi", + "version": "1.0.0", + "description": "JavaScript pi calculation", + "scripts": { + "test": "jest" + }, + "dependencies": { + "big.js": "^7.0.1" + }, + "devDependencies": { + "jest": "^29.0.0" + } +} diff --git a/julia/cmd/build.sh b/julia/cmd/build.sh new file mode 100755 index 0000000..54b485e --- /dev/null +++ b/julia/cmd/build.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# Julia Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Julia Build ===" +echo "" + +# Julia är ett interpreterat språk, men vi kan förkompilera för snabbare start +# Skapa wrapper script + +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +julia src/print_hej.jl "$@" +EOF +chmod +x bin/print_hej + +echo "✓ Ingen kompilering behövs för Julia" +echo " Använder Julia interpreter" +echo "" +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" \ No newline at end of file diff --git a/julia/cmd/test.sh b/julia/cmd/test.sh new file mode 100755 index 0000000..8f01399 --- /dev/null +++ b/julia/cmd/test.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Julia Test Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Julia Test ===" +echo "" + +# Testa pi-beräkning med olika antal decimaler +for decimals in 1 2 5 10 100; do + result=$(./bin/print_hej $decimals 2>/dev/null) + if [ $? -eq 0 ]; then + echo "✓ $decimals decimaler: $result" + else + echo "✗ $decimals decimaler misslyckades" + fi +done \ No newline at end of file diff --git a/julia/src/print_hej.jl b/julia/src/print_hej.jl new file mode 100644 index 0000000..3b60380 --- /dev/null +++ b/julia/src/print_hej.jl @@ -0,0 +1,65 @@ +#!/usr/bin/env julia + +# Pi calculation using Machin's formula +# pi/4 = 4*arctan(1/5) - arctan(1/239) + +# Calculate pi using Machin's formula +function calculate_pi(decimals::Int) + if decimals < 1 + decimals = 100 + end + + # Set precision (need extra bits for accuracy) + setprecision(decimals * 4 + 100) + + # Machin's formula: pi/4 = 4*arctan(1/5) - arctan(1/239) + pi_val = BigFloat(4) * atan(BigFloat(1)/5) - atan(BigFloat(1)/239) + pi_val *= 4 + + # Format output + pi_str = string(pi_val) + + # Extract just the digits we need + if decimals == 0 + return "3" + else + # Find decimal point + decimal_pos = findfirst('.', pi_str) + if decimal_pos === nothing + return pi_str + end + + # Get digits after decimal point + after_decimal = pi_str[decimal_pos+1:end] + + # Pad or truncate to desired length + if length(after_decimal) < decimals + after_decimal *= repeat("0", decimals - length(after_decimal)) + else + after_decimal = after_decimal[1:decimals] + end + + return "3." * after_decimal + end +end + +# Main +function main() + # Get decimals from command line + decimals = 100 + if length(ARGS) > 0 + try + decimals = parse(Int, ARGS[1]) + if decimals < 1 + decimals = 100 + end + catch + decimals = 100 + end + end + + result = calculate_pi(decimals) + println(result) +end + +main() \ No newline at end of file diff --git a/kotlin/cmd/build.sh b/kotlin/cmd/build.sh new file mode 100755 index 0000000..45ee136 --- /dev/null +++ b/kotlin/cmd/build.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# Kotlin Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Kotlin Build ===" +echo "" + +# Check for kotlinc +if ! command -v kotlinc &> /dev/null; then + echo "✗ Kotlin-kompilator hittades inte!" + echo " Installera Kotlin: brew install kotlin" + exit 1 +fi + +echo "Använder: kotlinc" + +# Compile +mkdir -p bin +if kotlinc -include-runtime -d bin/print_hej.jar src/print_hej.kt 2>&1; then + echo "✓ Kompilering lyckades!" + echo " Executable: bin/print_hej.jar" + echo "" + + # Skapa wrapper script + cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +java -jar bin/print_hej.jar "$@" +EOF + chmod +x bin/print_hej + + echo "För att köra:" + echo " ./bin/print_hej " +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/kotlin/src/print_hej.kt b/kotlin/src/print_hej.kt new file mode 100644 index 0000000..84ae360 --- /dev/null +++ b/kotlin/src/print_hej.kt @@ -0,0 +1,66 @@ +import java.math.BigInteger +import kotlin.system.exitProcess + +// Calculate arctan(1/x) using Taylor series +// arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... +fun arctan(x: Int, decimals: Int): BigInteger { + val scale = BigInteger.TEN.pow(decimals + 10) + val xBig = BigInteger.valueOf(x.toLong()) + val xSquared = xBig * xBig + + var term = scale / xBig + var result = BigInteger.ZERO + var n = 0 + + while (term != BigInteger.ZERO && n < decimals * 3) { + val divisor = BigInteger.valueOf(2L * n + 1) + val contrib = term / divisor + + if (n % 2 == 0) { + result += contrib + } else { + result -= contrib + } + + term = term / xSquared + n++ + } + + return result +} + +fun calculatePi(decimals: Int): BigInteger { + val atan1_5 = arctan(5, decimals) + val atan1_239 = arctan(239, decimals) + + // pi = 16*arctan(1/5) - 4*arctan(1/239) + return atan1_5 * BigInteger.valueOf(16) - atan1_239 * BigInteger.valueOf(4) +} + +fun main(args: Array) { + var decimals = 100 + + if (args.isNotEmpty()) { + try { + decimals = args[0].toInt() + if (decimals < 1) decimals = 100 + } catch (e: NumberFormatException) { + decimals = 100 + } + } + + val pi = calculatePi(decimals) + val piStr = pi.toString() + + // Print with decimal point + print("3.") + val startIndex = 1 + val endIndex = minOf(startIndex + decimals, piStr.length) + print(piStr.substring(startIndex, endIndex)) + + // Pad with zeros if needed + for (i in 0 until decimals - (endIndex - startIndex)) { + print("0") + } + println() +} \ No newline at end of file diff --git a/lua/cmd/build.sh b/lua/cmd/build.sh new file mode 100755 index 0000000..bdfc162 --- /dev/null +++ b/lua/cmd/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Lua Build Script - Lua är interpreterat, ingen kompilering behövs + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Lua Build ===" +echo "Lua är ett interpreterat språk, ingen kompilering behövs." +echo "Script: src/print_hej.lua" +echo "" + +# Skapa wrapper script +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +lua src/print_hej.lua "$@" +EOF +chmod +x bin/print_hej + +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" +echo "" +echo "✓ Klart!" \ No newline at end of file diff --git a/lua/cmd/test.sh b/lua/cmd/test.sh new file mode 100755 index 0000000..b6743a5 --- /dev/null +++ b/lua/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Lua Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Lua Pi-beräkning Unit Tester ===" +echo "" + +cd src +busted spec/ + +exit $? \ No newline at end of file diff --git a/lua/src/print_hej.lua b/lua/src/print_hej.lua new file mode 100644 index 0000000..be32dd7 --- /dev/null +++ b/lua/src/print_hej.lua @@ -0,0 +1,182 @@ +-- Simple BigInt implementation using base 10^9 +local BigInt = {} +BigInt.__index = BigInt + +function BigInt.new(value) + local self = setmetatable({}, BigInt) + if type(value) == "number" then + if value == 0 then + self.digits = {0} + else + self.digits = {math.abs(value)} + end + else + self.digits = {0} + end + return self +end + +function BigInt:add(other) + local carry = 0 + local maxLen = math.max(#self.digits, #other.digits) + + for i = 1, maxLen do + local a = self.digits[i] or 0 + local b = other.digits[i] or 0 + local sum = a + b + carry + + self.digits[i] = sum % 1000000000 + carry = math.floor(sum / 1000000000) + end + + if carry > 0 then + table.insert(self.digits, carry) + end +end + +function BigInt:subtract(other) + local borrow = 0 + + for i = 1, #self.digits do + local a = self.digits[i] + local b = other.digits[i] or 0 + local diff = a - b - borrow + + if diff < 0 then + diff = diff + 1000000000 + borrow = 1 + else + borrow = 0 + end + + self.digits[i] = diff + end + + -- Remove leading zeros + while #self.digits > 1 and self.digits[#self.digits] == 0 do + table.remove(self.digits) + end +end + +function BigInt:multiply(scalar) + local result = BigInt.new(0) + result.digits = {} + + local carry = 0 + for i = 1, #self.digits do + local prod = self.digits[i] * scalar + carry + result.digits[i] = prod % 1000000000 + carry = math.floor(prod / 1000000000) + end + + if carry > 0 then + table.insert(result.digits, carry) + end + + return result +end + +function BigInt:divide(divisor) + local result = BigInt.new(0) + result.digits = {} + + local remainder = 0 + for i = #self.digits, 1, -1 do + local cur = remainder * 1000000000 + self.digits[i] + result.digits[i] = math.floor(cur / divisor) + remainder = cur % divisor + end + + -- Remove leading zeros + while #result.digits > 1 and result.digits[#result.digits] == 0 do + table.remove(result.digits) + end + + return result +end + +function BigInt:isZero() + return #self.digits == 1 and self.digits[1] == 0 +end + +function BigInt:toString() + local result = "" + for i = #self.digits, 1, -1 do + if i == #self.digits then + result = result .. self.digits[i] + else + result = result .. string.format("%09d", self.digits[i]) + end + end + return result +end + +-- Power of 10 +local function pow10(exp) + local result = BigInt.new(1) + for i = 1, exp do + result = result:multiply(10) + end + return result +end + +-- Calculate arctan(1/x) using Taylor series +local function arctan(x, decimals) + local scale = pow10(decimals + 10) + local x_squared = x * x + + local term = scale:divide(x) + local result = BigInt.new(0) + local n = 0 + + while not term:isZero() do + local divisor = 2 * n + 1 + local contrib = term:divide(divisor) + + if n % 2 == 0 then + result:add(contrib) + else + result:subtract(contrib) + end + + term = term:divide(x_squared) + n = n + 1 + end + + return result +end + +-- Calculate pi using Machin's formula +local function calculate_pi(decimals) + local atan1_5 = arctan(5, decimals) + local atan1_239 = arctan(239, decimals) + + -- pi = 16*arctan(1/5) - 4*arctan(1/239) + local pi16 = atan1_5:multiply(16) + local pi4 = atan1_239:multiply(4) + pi16:subtract(pi4) + + local pi_str = pi16:toString() + + -- Format with decimal point + local result = "3." + local start = 2 + + for i = 0, decimals - 1 do + if start + i <= #pi_str then + result = result .. string.sub(pi_str, start + i, start + i) + else + result = result .. "0" + end + end + + return result +end + +-- Main +local decimals = 100 +if #arg > 0 then + decimals = tonumber(arg[1]) or 100 +end + +print(calculate_pi(decimals)) \ No newline at end of file diff --git a/lua/src/spec/pi_spec.lua b/lua/src/spec/pi_spec.lua new file mode 100644 index 0000000..ef38353 --- /dev/null +++ b/lua/src/spec/pi_spec.lua @@ -0,0 +1,59 @@ +#!/usr/bin/env lua +-- Unit tests for Lua pi calculation using busted + +local SCRIPT_PATH = "/Users/einand/Code/test/lua/print_hej.lua" + +local function run_script(...) + local args = {...} + local cmd = "lua " .. SCRIPT_PATH + for _, arg in ipairs(args) do + cmd = cmd .. " " .. tostring(arg) + end + + local handle = io.popen(cmd, "r") + local result = handle:read("*a") + handle:close() + + -- Trim newline + result = result:gsub("\n$", "") + return result +end + +describe("Pi calculation", function() + it("calculates 10 decimals", function() + local result = run_script(10) + local expected = "3.1415926535" + assert.are.equal(expected, result) + end) + + it("calculates 5 decimals", function() + local result = run_script(5) + local expected = "3.14159" + assert.are.equal(expected, result) + end) + + it("calculates 1 decimal", function() + local result = run_script(1) + local expected = "3.1" + assert.are.equal(expected, result) + end) + + it("calculates 100 decimals", function() + local result = run_script(100) + local expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + assert.are.equal(expected, result) + end) + + it("calculates default 100 decimals", function() + local result = run_script() + local expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + assert.are.equal(expected, result) + end) + + it("calculates 10000 decimals", function() + local result = run_script(10000) + -- Check length: "3." + 10000 digits = 10002 characters + assert.are.equal(10002, #result) + assert.is_true(string.sub(result, 1, 7) == "3.14159") + end) +end) \ No newline at end of file diff --git a/nim/cmd/build.sh b/nim/cmd/build.sh new file mode 100755 index 0000000..0e7bf0d --- /dev/null +++ b/nim/cmd/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Nim Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Nim Build ===" +echo "" + +# Kompilera Nim-programmet +nim c -o:bin/print_hej src/print_hej.nim + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/nim/cmd/test.sh b/nim/cmd/test.sh new file mode 100755 index 0000000..320622c --- /dev/null +++ b/nim/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Nim Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Nim Pi-beräkning Unit Tester ===" +echo "" + +cd src +nim c -r test_pi.nim + +exit $? \ No newline at end of file diff --git a/nim/src/print_hej.nim b/nim/src/print_hej.nim new file mode 100644 index 0000000..4a94d3b --- /dev/null +++ b/nim/src/print_hej.nim @@ -0,0 +1,142 @@ +import std/strutils +import std/os + +type BigInt = object + digits: seq[uint64] + +proc initBigInt(value: int = 0): BigInt = + if value == 0: + result.digits = @[0'u64] + else: + result.digits = @[uint64(abs(value))] + +proc initBigInt(value: uint64): BigInt = + result.digits = @[value] + +proc `+`(a: BigInt, b: BigInt): BigInt = + result.digits = @[] + var carry: uint64 = 0 + let maxLen = max(a.digits.len, b.digits.len) + + for i in 0.. 0: + result.digits.add(carry) + +proc `-`(a: BigInt, b: BigInt): BigInt = + result.digits = a.digits + var borrow: int64 = 0 + + for i in 0.. 1 and result.digits[^1] == 0: + result.digits.delete(result.digits.len - 1) + +proc `*`(a: BigInt, b: uint64): BigInt = + result.digits = newSeq[uint64](a.digits.len) + var carry: uint64 = 0 + + for i in 0.. 0: + result.digits.add(carry) + +proc `div`(a: BigInt, divisor: uint64): BigInt = + result.digits = newSeq[uint64](a.digits.len) + var remainder: uint64 = 0 + + for i in countdown(a.digits.len - 1, 0): + let cur = remainder * 1_000_000_000 + a.digits[i] + result.digits[i] = cur div divisor + remainder = cur mod divisor + + # Remove leading zeros + while result.digits.len > 1 and result.digits[^1] == 0: + result.digits.delete(result.digits.len - 1) + +proc `$`(b: BigInt): string = + result = "" + for i in countdown(b.digits.len - 1, 0): + if i == b.digits.len - 1: + result.add($b.digits[i]) + else: + result.add(align($b.digits[i], 9, '0')) + +proc pow10(exp: int): BigInt = + result = initBigInt(1) + for i in 0.. 1 or term.digits[0] > 0: + let divisor = uint64(2 * n + 1) + let contrib = term div divisor + + if n mod 2 == 0: + result = result + contrib + else: + result = result - contrib + + term = term div xSquared + n += 1 + +proc calculatePi(decimals: int): string = + let atan1_5 = arctan(5, decimals) + let atan1_239 = arctan(239, decimals) + + # pi = 16*arctan(1/5) - 4*arctan(1/239) + var pi = atan1_5 * 16'u64 + let pi4 = atan1_239 * 4'u64 + pi = pi - pi4 + + let piStr = $pi + + # Format with decimal point + result = "3." + let start = 1 + var i = 0 + + while i < decimals: + if start + i < piStr.len: + result.add(piStr[start + i]) + else: + result.add('0') + i += 1 + +# Main +let decimals = if paramCount() > 0: + try: + parseInt(paramStr(1)) + except: + 100 +else: + 100 + +echo calculatePi(decimals) \ No newline at end of file diff --git a/nim/src/test_pi b/nim/src/test_pi new file mode 100755 index 0000000000000000000000000000000000000000..8127362055c2780bf9173fec0adb5d21dbb3ac66 GIT binary patch literal 321000 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 0: + cmd = cmd & " " & $decimals + + let (output, exitCode) = execCmdEx(cmd) + result = output.strip() + +suite "Pi calculation tests": + test "10 decimals": + let result = runScript(10) + let expected = "3.1415926535" + check result == expected + + test "5 decimals": + let result = runScript(5) + let expected = "3.14159" + check result == expected + + test "1 decimal": + let result = runScript(1) + let expected = "3.1" + check result == expected + + test "100 decimals": + let result = runScript(100) + let expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + check result == expected + + test "default 100 decimals": + let result = runScript() + let expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + check result == expected + + test "10000 decimals": + let result = runScript(10000) + # Check length: "3." + 10000 digits = 10002 characters + check len(result) == 10002 + check result.startsWith("3.14159") \ No newline at end of file diff --git a/nim/test_pi b/nim/test_pi new file mode 100755 index 0000000000000000000000000000000000000000..ccbb37d12c8e51d5050e2f096e3e56274774be09 GIT binary patch literal 321000 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%0DXHzk&HxTOt0rzX4sje3yiHsGn2Crs#L( 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%0D7Tf?sQ9DD zhvrhUsTtX1x*zyx1|Pzcy}pv(MSDZg zp7y~NGjL6SlfM8bQ#6J~a56VD`et}bp&_Zyoo9y_?TR1w0@Ih#3)RPG`M>Y_bIA`_ zja8OE^ru@TKhSwCU-^31j$|4#?-`5JhW=b0_?s0Y zThQ92u4pmTPfNg~-|2io(zPXD)TZ>)SKc?a>4UDnv7O|_m`Go&H`y;CPyG~fZ;0>d zwFa+0GR$RvIltQ(lVIZB@RkqPw`dMRIBcFBF2Z>hY?|j;Zj9?4 z4fuJMo~bz+hCgRnf4YM!jdz{b`5W;l*S_=v@%qiV>>zwB;q`xx?h~KAiep#=;~MBz zI!Zbh?w?lPqW$ju{NLLfXj6{=!^rVZp8wng>^=F=m5%^@u|GQq&)XjT)5|S3)ATds zjdFPVoc@2y{?{(s1LOPzYhJnVtsFX)$~oHres~Pemndh${hDiUPpiD_>2J{nz9x7> zr9FMCXc2o_<7wf=ojX6RuMV|Ar%qq}3Hgg|q%F~x?(4bn$FZE;f-bDs(kAHD z_aU8C_n!`N_m=DhV%^Bc9^Y|I%-qH}?yeF}#&u*gBN)HKlXy-wPA&%zvAwQ6@lID} zY&Q2f0bkrddevmtKYV%-I>C^>r|@%@@H4x7kK0Uscf0m9)_(`D={lCfEg0{Xoa@u+ zayDjUkRS6hWLK>*&!aER<$#ADU0m=hX0jK*i0OE3+5BPfXs_cfWF7?L5IVW?8{I?S zPs}4`6#Q;MfB6XeJZX59!>t&=E4#~drAF?T3few_wuxmvQhL1n>rK##;M3pRz{9@l z&nKt+dF(GtsLCl{=s@;PLiXmUgWRp7E_V8;$=-e^dw+@SogK*DxyX`6{f1&s&VF#EFV0vAk1JIWDnN{cj(3$LzAIlB{2BU!h zjzk9lAK`p!ZW0}UIWZl8GMX37xAa}jlXB{^J{&Ks#JzNYF0TVn*YkqSjoHCN;3b|H zw2&vwbO3zX>QgW(H%*le&{p>S4zWhfFVf-G5`&M$&=db5RuQRiejtIUj*+t`hrjr}>|CGzKdC1`IC?TIg#t~r%Cb8XpLq`ipP0NEt^eZ2T>lH;`< z-staJE$_W1IB#<}pBURchI84UIb$0q*oY(Kdc}PqaPPxF`A| zhl^&>1#3sNsym|EMT7iS?2+uH&g3`ytH_w{KH=3pwDA>R{9f&q@1M||$NSc?zm1&Dn)^M*N4G~OAMSlQ@f>Kbpap+l z(F5qVpV0gRr}S_0?f1{zu}k{d+_E-JpYWQm#5$#XBt_B4;)!{UQ@?GVmmh99 z14SnV+9~ue-=S|!i*@#hI?#sZ|6=-;KgR5C@jIlEs(o=yc z%>Cl`W7;Se9UOm`E~hnIKSj8T&wJUuwY(4S1JXXW`F$y?T%Y0z=w9;qnf?f_6PdE^B>t2X!KF(CO@9=}fk_3mo(nuT^NF3Wi}| zI4y=@np+AXU98)qlh_l%q-3P5sGT6wa#WVBZ{hm|kTYOx6 zm9q)N_GsS+`;K)lKHeDkv%g-5?~m8Gy#B3c%e}Al6W9bAkKezNP0)mW7co|QH<7aV zz?{BB+(Il1ju9TZQgMPQUPGK}l8@|}&CvSnKT z2A_=Ebj%#<5nk^3&vMF!c_$0brqCMuAZ?%r*`EGG^wn_r;rVa!|MU+Yp6};>$N7il z|Aw|Na{JYbXsbfk3g~IZC7F%bRegp2**kjrSL_I7C-G5kCD^@d>l9DR1+@8tzQxGMz*Gp}tkXz?%G1^C#ERV?!Ml8=4rI@cy4N z-;ph4ya&GH;|sm+tN6nEma%4_tBU%yUVDv&;DwF7f`mH`F+ceSj zImPwK|EfNDSJ9`HN%hIQZ>0OIcYV~;hx(+9^*Kdz5a!&iTq_4M&K}pN)p>z%-sb95 zz|dBXuP?B6O+RdNdjj`P#lKJ95%H#9PBq=Y{3|)>sWY#86q=NONMjQ}7QdA5em3KL z*L!s5@A1fd?oMC3_K|wkgcBRMr_Rt|Wc4)2ft~j?mCiF-f)7Qum zuKkH&zR7-iioM3@y)nGk@xI+X-wW@xv7O2Jb?BGBL=V1(a-FVR@l4K|uP^72UE=Vw zp6|kQJ>zN~z41}uerxc~>m~1Ya2-lLV2}0Rh8g)eXT*N6AAKT*BMrm3l=t{m?tb+} z{SD2;3~Ro3xxRR}y&1aEyB9O(S2E|PxG{M$yKUu_Cs1=(MJz&(eG4YoF>G?>5Go_!p9;4{8g`V?bce`z@{uIvqeZtzOC zF66gvBCb^Tdo>C^%9{^#g<=tOCIr7LcY^6mmh=A`kBDv1%I_LuxJQuVxAHQ}2R-21 zofiA8q|crG7WfFiiIajJv3GU%n9Ivd`x|TJWDfimRda0g8Tu{Y@!@$37yGgy`sESc z2HX(UPphy2>*-fI$?l8g@0mTq+BCmU#aWAx9wxz;{}0mfonNh{;{(E7uG(kpe4-no zCt{ophz|*W;2`vyD|Q!Jiv2zKghc~e4@EY?&s0wSAMZ;$fpUs{F`XXY4Re^t0iC&# zk6F6CWaKL}7yOnFx7qHC$t*>mIoQ(-_ZJ6wyaWGkIA4Dv>-VZZf%SVCYh=9j`;Lma z2yDf!z<&%K^y2T>42^8T?i=cIcJ~zSpny&i`oiAzcY8L_?#KAk*+s>K@5Cn37-WP#R6^aB3>B% z=1%k*@wcLDGlW@fPsNuhUx{oNe|}JWQh&$WIBNNn%X>)4nrj9p$P;V-VxCiLPU}eg zUieu5vhrGkuWpalHQ-}k+b7@SW?*io>{@3xAB?`N{W$sjs?WUgE_LShfAI;L9HV@6 zL+fq+oXrZYP55TzUfBPAd4FMFHJ{X;%b${MeL#FYl}pCrqp*{Wu1-G6Vx2sV$u81a zU*h1e`#7|Es`kmn&sn$flNK7JXY&2oV;3l1re617L2J#>n)x-fU#oA=zEyj_^F{NM z__H&k(4v+3Zd^v+!gA8r2VDC`!@Ui8$#>PwtXVa3Dn1eAYwpb{ughZ=hffR!XOpJ` z8-L^L%I4eA4fVSq{cP)N^X>JS(TH`V z@onYLbpMNwLeD2B6~99qrPtW*uDbj+;LESElUXz0W;~V)qif}tH14OI{$=k{YwQHd zJS z@G7oGad^sG!u;HlIVY3P5+~#J_@PNImJa(`@pRC`!;I_UXc#+bd2ALC&%*~&Ko)NWWSglp=Ygy zf;*Qu#P5rHVm^kwTrS6RMLB+-?aI}{R}ZqeC->8ZL(^*0&ZVAqrp2_QH7i=0J(1iE z%=JC2i+*&%j*E~_xg0qUjvE=`doT3YPz@S)s9Q+>G_DGP+ zfA}6r09WWkeX0De7cLbYr~Iz{K|Do2IXckmjF!*g{uuN+d%n}%UE_2+{54DQ%k|+~ zUvm!QmX8$MxetA2$IdqXaxr`)nVT_j<>kM_+6^)E~?}4i);|9KH`IUxnH|j=ki#{t^7{8$NDrU*>Sm zwX{{<=lj*(u}#OTUHQw>{7Uaqy#0%mKirisFs?$|iXG@sJ1qWD_X*Iq^?O4!Et*Mu z6XQlVvofA;ovy{6M5tE>^opDV2ip(Ow^CJp9N$V+ImuJj;`91eM$m;dh6>*b^tm5h z>;GJwd7x`m;Xyno3jGgVlZZ(_o|yERnEEk6&<4$MFk#_GAZR zK0iIL{IT}@8SZ;W*H^r?^45`$@w%JQy&m9Cdv@XZ$kK`UCMgrgd@CM1mJ!}|Dd?Nz zl;l6{CAJIv?Y+cezT0%BV@zjipNHIu%Re0fL)`yS*y`M6-L-sVi}b&)qu9%?jFY^a zHVWJ|5pj3Um2U0HCi3-4rZ*~XzOvrAs%Q6DOdpB;Ny{li{yWPpH{JZ(oen11QoXrl z;I3|v`zI3n_twxV~Km6iUbPx7Pr0?|PZd>T-f=%>COV^=I{L@X-) z$xrfrUf!(HT=X zy-VeRLFIRM)aBQLo3)M}UQ2tQ;=6JeCNS_^1q1Iq49lq_y;<`*%=(I_A%!N0CcaPWSTQ8HqtM*v@dO1UQMb0Mn%k*lz&J|wgmGP?e zvX40L3Ogdl*_s^qL|-1J?Cz6VM=hTsx{Jpr`~)A_e(*<~1TQ>S;Dz5S9A3Qa*MArb zc6jXT+IRhO&VpRNb*yVrd=>=0o{C4Tl2cwr$d4o0E#0fh<&~(VH@wt(z<-kivq}#L z;g;_5e0waRj)@;oG0pOonXDUJ5X(==y@@SVzB0ul{+hocW4HS`@nx*~RM}_Nz6m`H zd$CDpVEHfK7_#k;dOzG#Umx2vgZc1%Ywu;i$#UC=A#SP&t!ckTdz*R|4rN1z@DX2@ zKlnTHjo_bwMxdv}pI%3K)d5Gy@pPPVptGm(`2;wWKH~9-4)0^+-wq!0{CPaK-x}kr z=>Gq|#Nq7@hraKcIE4QtION%I2pyzxc*?;3ame}E8aUjqF8h>xwmw#C&ZQiE_CO@&Nuttv93%^($WdsXEDZEI>q`9!$*d?9-^#rh*auk$1-nPkJ_u? zynOycpBC-G-}${6y;u8V(zVo|twHVg0)yh1z3gx?&3un@y+~hv_>P#*icWM-VMR=B zF4*6LcUp{WM}RZ&J&!YZjoHLn_vD(q3OsETuHZeEV=ou`gIDR!Daxp<_V@OFl(9qe z<-L!)7<;9kFdnRI^rJW*@?&9}$$Al;_oEQGHD z`#x#BYCPz^=C}Pj7vsg5SY%0X#xgyxoXOnW!I@9ZXzjEaWjjSYM6`z9V6=vuGdk;l&e}5h_c2FzONSAS zVegdQ3~fy2iwdb(2f7TA<>W){u8Trby&eTQnVNPOS-kq)fC~cR|R-b{dA?xzlmSxf(Ly!9U z*){a2VBV9nCeo)G9iBb|o)|lL+8#Y|n#D-^b0*kF8(+g;CBCctB~@~)Gl<`;;V-Ew z|5ED@+lW~Zt%Ul+0mlMcx!5;;yPM%ZKQ|wQu_N((_8_l1F%@fmqJg))$e}Z3D3E<3|(=pZK0cf6@&+{QVgrQ0}vQfxH15?{}|s2i4Bj4dkuS4Yl-BU#Vs@>fv4 z9avmnF^*GxCAxdV@%e_EV%`1Zk5spH_6vY}Lk$>COTp~z-(za@!8$&&lk*9JHyq~& zYP2g~uFfE&%O>Ml$#^~n-+byyx9{^eXNg~pbKd-g*bRTc+V2CGis2DGD__6C z{mM+sFz+k)L6>rGk$3C*sqAx3P(FZQoyzz<7PLmhBc#u$ zj`;OFlhbzI-|PRI=G3PC31z=JMLJ{Yd#ghU2+aj8pQiVW!Qu-ia^E_HLRT_h;j9Hi`1LwEOqm zIVLSz4x#MxH0>}?`cs__syx^Q*P|>eUaS7g}?ex_6}Yx zTyUR8g#TFfPBfJ}nSeKHjNu(>L_dXB_T=tZs2qwJa)!xACEC?J(S>aFxI&v?ARHfj z)#4!BSXMfiv=_V;T!I_&Jeg5v zUtgm2aRGZE=cAWQNcKS3H)|nIss&!(*PhM1*6>U`Ni>nOMCJ2WeNlbp+O_=F`nEoL z-P~fICGUpI@1(a|xrSLW4NxwjiQDQoI!jATOAJ@;AlAvztdr^F$($&??&-2T zk?d4Fqt*sFG_^J)^E!gH0X-G3hW@YO@5|XWgYf<5z>nsmhkf%^%xQ^lDkFNH%~~yJ zo>l(wx)!7H6UZ&Vm@OuTcg4p~m&`D`L40n&m;dLWyxY?*@~-&LR^Il!70app`)D0) zf>%2yLK(v~<bB6q75>8E&V{4L^J(S2)DJ^C-skG~0Klk?0|LGvy- zuQ?QboKTkY+kY<`(PG^aIj=qDu-x#@#VuaW&%pPbE`M{n{Dt_tm$i;A`kU&q#4{cl zo#1fkc~A|>W33b#_>nK@`R45{HRhn1df}XD z4Q1=ecRGdhnl<{FNqN(CV!S0Zv8YDdM`(P~by8)MdFo|Mzm3QA%^H1q|A6_I;x;yz z&z(7Xz8KW|Kk0oAl{C5tm=^Nq_wGAu(3D~f3jNtZ>G(al&nz_j49|}Bs@&}hqhO7S zCS;QqT|P9)vt%!yz4&;){f@YehB>Yc_FY6z6D8m7T-Xc$x!A>{)f}tzG#_s(y&Qg& z_|o{jW}LBl`K2|jzfUno`;%XXv`c<1Lw>zw>saofSWeWoUA9MM+a=bOa?A<3gtu?c zp|2u)GWCCk9MHProAy9wqig;p-zv_q^-E_%U%UPYa`aC~V$*uISUlSHC?Cg*F%Q<4 z#rdPdacBK?r_k0F$etvZ4|ZQCeOjJW;!u*f44%{RE{X}uf_vQ!(#xK}p~wQg`z$f< z>3IH~tB+YAo!ibi~8K?U#oQvm`&aRXniht_%Fa~2%*#usmT^voK zPsR6~0yFy5SMi_jw)XLqI&3dNxfm} z&5Y}9p`K!qn!t)AlrR-F6D{su^hXsMV$*sVCB3@!|P&LF9+5k)}=oeVELc;y%PVk zoe?1JU$Tt*+m$b!`!bkg_~3IJ=m(p}%QIxxM)9g-Jy=X9cRDQ!cookTyo%rFlIv0H z;`z=7ywR0ASYdj^W-l>O-Wf?t!&+eNBd zVHXTH2&W691mB);qhP6#9>IQ_rB?3aA0V)2(v`NQ|h z{(tJ;K2ECQ%Kz`78Ky@h#GoQUg^?Hri6Kf15+FPb4}-)IKtzLzv&0oc46DSTK?68Z zhGh-3=n|J~m=O(wt`V0QV2z7rV!(Bcpiz=_l^%#+dP0o4#%1m*neY2kx9UE1_YBE5 zzt?Mjf81C1z4zRzQ>RXS&Z$#RcE3j1Dzi6C8+ALRoG~bVFT%bI0aLX1DRyV1-c|Dq zzuN45mghbLt@%dJp~XKo`y!EU(C>-P{Zc;CpDNnmb?DOnXZu4jZ`7S%Y3z0^MyC1B z+T)Wr*(MXCU7Jyi3=C_K&!#>_y&S`yc8pJmRo z8wYZ8j6aV*5T9p3e|DH@3xTgZ0G*?K?uEy_nX0qc1H#ugopHa3IT;T#=SS_%%~w!+ zPNt!CXUcYOfx}hKDfk+07Br7*=Y0D*G?2<e4- zu6&9~Maze-x-$L2>sYV($3CC_UW3Ow&rGqAR%CHM<47v^QOd13%Sy}a|AzdceO`^r zn)S!L5A+6JRQ43|adTvD#U81=@55WPydNz3SNyv&Vsfc$N6U%(@`t*)JtG1=(0+4` z%s+2p9(wLjh2jotP23?}7S=EM=X;iMW);`)?ze0spVyJC;tsjKWwg(a;1_bGPvVy= z{b7DT-2N$9J!qRxbyK?C^Mz#HI zPR}xX8JG1M=Y3AGbEWeZ>AXuiQNIqXuK3pbV^D6D&0M|=g`?;RudV%>x zpY-dwV{DI+TS#}vDZ(=LHDmp6o@e>7lY9T*8Xy)ik}X3nGfd6k}mhMk-{VS4oX}9m8N`3qi5u;a?jEEBBYa)G3RpY z>=iT4QU=CvQ~yf3vYonog1S5xzikmVB2hO7`HuZ!PhOBL=Qhf@Ei9+=RR>1O)e!ln z68@Y_-2U=TX6lb{F2RfU(uevv`I+aGSvph3cMb5Gdl)_+O|jOwIG;QCPQIR#X|u~) zcB1txKfX!%Og%*3RSojrE#zE>VTrojOc^(0*KA$7GSaW{b!Zbhvyp29*Ludk_+A(h z)f@MXFr70Ay!<8{wf+x|hhi4>SuRG)CuEBbU|Vyz$T; z9MnDAGqR@W8SLo|s{57X0iXE|{H{rPN~a;2PCe<=+jATarL!p5J%r%!$7247PJ#oNzL~4w@w?uiCydvR{JVw}x`jrmnZXGcxk!xez%n z;%qr9$5r@LL-48ENUKfXkx!d_*Y=X1hLf-2m6=cZJml(o1atLXze|3Q>38|QQr#ft z0{VTKA>gHWsU1{8^QhkD|Gr~=zlhGNow82Sj7?}vQ*G^6 z@*C9F=Apy$X={v2Xbn!Xt+7w5S^uJblPNtwBGQC*n$5IP#zVAa#2i0{V#nD55@JNVm@6LaJH>UV*amq|lDFKI|7 z#q@O@^vT$GgR7@SvLD|a-E8lbMhcxT>o?9@jm#K__FAW)lZ@-+h><7d^;e{QKYozE zrsuxVF5SR>H4VxRyeYI_^}9)P6lsnn%>kr2xG>F&Ni#QCKC#A;{vl?&PT5yzyT(Jm z$MSD(je`Jq9wc%uWWe@bcp@?jqel^Lzy82_rznb|c%AmRai|tNF^gqg1Blo|u zd^Ok4h|tYQ(9LMq9*5$yxqfDZZf1gRX8X@dl+(3^L;oGbvV;DEaNhMJFQ1UQhkiy@ z^OQbV^wZ|2((_)4?hS0_{4&>0=W-E0%NkwOe%w86|3>?9gWu7Z_IJrM50-1snP=1Z z3cdaJ{#yEZ>YJ5-ZpK zG8!Y-UhtCH56E9}rr270eDqvj+Cra{*$Z3e@Tf23#_%gvLy=nHZ;b2@34Zf=$O=<H6(xAkLooa+0dGiQL+ymRqQFnOz?sX9A*)`JtxnTSuK^RzoN z4u2YYT0mO|?IS+zKSyY_#;}043EIbf+RYJKt>Ms|fLhCs;o)q*KXfT&Yot8MI7}9L z&9`o_-{7yax8#5e&0GrmY!~U@zV>Q)qOmB*7Lq>X8evk zz^YbsFvq;^Tu;s6kMlc&^c!rtIs8|h5geq|L|QNVX~Bo;Z-mOGeonLfMzWFI_moPb zl{8-S(_l1#*9hST3XeW_Tbcht)i(uJ2i5Fdv|D_-K&#*I!V9zkWZ7LZmX-% z6X@CFrv2aHK{h>xxsm$T*nz3j8K=9k1K$RKzi!;%F4EW`T*AN5K8VfIFZ|UkV*`zg zg;nwOHh+Vz?Xfg@`x~^?I&}I?U#EXd|DsXrSrXsVeow9*=;xvHV1jR(`1U>j+aLax z_Q1R3x5A0&nJ#0vck7B4*fdx1YsNV!Ly&eWX&*~qR8@8Mtnx|5E>x@iVTW3&>s*O- zM!m?Z!RF!Ss6AGqj85kahQJ4P;A04K*L<7+L--%V5bi%kKV0oOS$54)(R0UxNmIB& znvJa6(OLug^B?&<^M2$rCck$)jg`(|*P}7-VrMfbmVvz~c_zp#%V%_cebR5u)f@fW zn_0oyL~MuQxyYFyzkApBKb{>&-O*o?{{1Oug7~r^55AK=sC;F#!<&1+Kld6#kPlQn z9=#*|fDhRcE5aze-O6?V-%~?nTh<)WGv$5#zU!n8%Xo#)UC>@`X6%P@|jzp5&cu(PwJ`O zS-0LwzuFUBYo{03`0o(uTz{o^Mtd#a+VtuFDo^%9WGqoOQe*!*<21t=N(cGhn(p?{ zty}&2)B5lHu#~4Y;TnUK|A=fyHd~)7H*B1zJ#JT!m&V<;Fb-E;4xP<6$>;sNZ%WT? zzlijW?pwYL-M|k=%MSjjY69eh__^!P2KN<~Y&uWA!>;ByW8uelsKev~oj<(ZG*c|Bl{j z4ScS*{HFL?s$ryUWU)Myh0b8p{`RX{fB#f$Nu=<`>Xx>V_i&N$w}84=xgk( z@5p#~fuE8t^X-_29ixt1y{SD&-`u+I|M)NV*>!CI9hHyb_93|Le6R%>i(dAV`u&mk zIEkx)car}QN5g-~qnYm)oWkDj+?zb*2l9O*?MCOCzK>oW;QKxH`+zU;)ZyE&J;C@2 zc2r|4w5MQfh5zC~SgUc#35?P06Xx=5z9Z~k8Tl9C(eKZ5&KBS5{Ny_{zbwwPzs@zn z^Dp3;zRk(i!~HVD^H$R@G&KJHIO1avZRjEPL@|9}bXVuVnSB^&k80BkZ2Qn$+FF~I z@I-M4#h^392(Gqq_p_mCuryH_n=^ySCmLfg`#IQgnxVuczQwniFW}0mwS_v{_EutR zW?%CJKQ}@jsk4Iee~0pmW>1Ooo7ndJRQ8v|g=qr@1HOZ;yFz@V+1uIJi*Vh9`e^wg zWs~l8#>ZFTGq=R+Y#{@lENt@{<3WXj29C z^Ks;&@io`R&f-4FyYppEq`ik{lSbxZw8*FL!5qyp=7stDbli`xZDS%^Gk2ZkVj_P2 z_$HFC+NO((?0$!JJpaWr^m*0WV29Cb-^Z7KVb0ci_w@_E)!pAiTJuQ956a2tgXJl>ieIVXCrxjkMC>k_whXa{bTU=*EVY|MjgI=FWdYrY(JwziRsU5gZ!|jr7FzIi7`HvfW}ZD2$WpdpFkn zKg5Tx;XBPiO09TmbdI$z`64oK@g?n}a|nzXt^ODFnB;RNX%)v6ziuu?PNJ#)Od+nU zipYG|yB`Htz;enH$KR0m=ivP_miHw7YCU8lX(ahONA&N0DZmx8KbPf2`4!@epP%sM zQS$TgWiEK{+ak^H7rwL`+g6xgh%aBV_|m!VehB&a_~Og!1n!e%aQO0vw}mfP*tUBy zYo*e5u6a50!22*y=;STO(&bs5$DsDF^B8n4gK4v4&R{NQKmGUH2Kb>lod##nE$tJ^ zf9+AQ6aV_=MlkCk@_U)K{9ERsv|&S~e>$__A@tz4pIJWhA->r{8qM{m$){hNiuir0 z)Kg=0mU(mfGVZC zqp*MY?Bc=LM0|FY`62RD`TrI?yofv>isX3${h4v>Podw7Xs^E=!M^k(m?KJBC*bco zx#fpjf1PxM&H3T@>!a{hBL4cnOMi=$PqgB1kA0{4!wcLPKL1_$E8#)=YUo$#KIhiW zK_h?F(Yd}@Uh6Sv^VAPx_^Ee(kH7s-zC752tZZbGKGPkZN$UjGN)5T~gbn1eS~2=( zYJt^B*M@BSnVFwkHd6a22_s}lG|ToiRcFi42h9oj^4EoJ@wTSEgm~0t`hu>E z>Kmg6IrLoZ-t-0Mmt{Z4jHBhYFZl0&>z`wyzPsAer)+=j&ym$PtgMp!sT_M;y;z@E z?LUf3$kE`E%CP#aC`Mnx80xGo9W~{4Zg(WMiyvtHzrC3{|9pDtc5kN0`Si7-B2e|9@Yf`LTzMaYE8hkk7O-7#-x9d&1)UVNr z3jR~~Dp!6Jd#zCagDnq=O=!Mp^Hkn}AEHzH)vrlQeNxiV8SApq_pS=p{h2+=;6K+> z^Ax^6x{Yr{YuaKij2XE7bk;x8v3>;kcD7HEDT~(Fl1@;TVYVFNZ>TK?`>@G>eed@j z>jz@jOk4_CNCra&u)hm*2H#o#(8l+Q%hmE+-y8lC@haD^R9!5vbgKV6v5vOB;|$ii zIa-(Sy!x|#T2UTF8(=p7T|Ol-8yfWq99;~vBN(@W{-NgIBz&m1r|h+s zFU3sMMpbX;pUPft)E$@^^s7Hcdd+1)8O%B^`TQyaeQOiX-(%&_NUSg!-!uA!AL(RM z7r_Z+!W#V$C%&{;I1$fZF$&4I*|zb=sK=OI)W`RLQG3bsl6>vle0wiDu*dGND4G;B z+84;wooLDv-*8{>4bQ$}zlp`0)8W{bsb`IK`|V6sf*C$ z(}n!-?4exRmzn&B*EzRk1bMpjoX#3uB#l59DeoT3mvl_Ch~WBxW(#WZ=;9B$M1{|WWibL#qcVe ztssBOYH*f%H5jY&6BnZg^HbU9-|Sf5PMU4#B5|vo(uH$QTR!u*&}uBg$Z_0B(LJa} zUdQ`3-fNFo@?n35unZlCu-iOOmP7MKqvt%T57JCJ(lwWdtE+14Kqlqybt1j`4{&)O ze8$H4TEg{O;<*($AEc~`O}I0jksWJP{=BoH&l!n7iM}1@_sA{GmvL)-yEC6=KE2xq zVE{4B0pmvc_Off9qUl{GUMe`Fq+;C87(exK`>u62c8*kVR<+TCB4<@kN1pI^TxV6^ z2(7>ObHvU^uqPH{syAa^TQiTNht#dfUp5+93jf`ie8X)1&%T9^fu8A|#*cM2O9Os~ zbk=;UeNprs_1kQp8?2#Cx%pWRYt&cIlV0$x^5t7I{^j;RiF|j&+5|JVKkd)!`USE2 zPe?bZ&oI%WW)m z6n>xPYRDEC--fj*0l&7a;@8+X%KUTMeXUJ1kR@fJ9pA0*C5sbOKjar5(~Rpz5c@0d z6~_LarH+IT)RT+*G0tnw1RT;Q;ro?~-{{$<5nV{wLccxtjE+xv3+y;RIs6K1ghSPK z|M+6`#r8uhMyIr@%P50M)Ba9+>Xyv-0XJN2>qhfC|N0+&n;W&CZa=hQ>0$%mQSJX} ze@w*ou%qh+3#7|n)?;0?02L0O{wfXU8JY^fnAMDKf+#A z(urs}ON>jejf_jL%@i4z{sZe9#Q*=pxHR^@a9o$E9c9?aS;t#InOaO*B>=_x0R7&D1Gi5aYQy zi|z1f`qt8M$xZL4+WG+ZMw(|Qjq|>zZ*gQ--yz>5 z{tfSk9Y?(z`+&`FFfn4zTXTMbt9!7`ty#Ru*8S9zzya_<7$rPX*x3b{w;%Es0prhBpmvE2CkiV?#5*36bO z!`R|GXBv!G-+dQ-dE)*zPZsa=FLd5y<=1r%yJCiV#~dHxgS&_cx-%aeTe|HlV_w&_ ze1kvoqT+rg56&ny-{{;O`&?)4oH>GdRp#s+){9YwX3plx^z*+{S#~Y%LrnM*;*^(| zGbhW4>s>+Gje5R#mg2%@Ol`Gj?Hb5x`+fAgwZwnqm*!p|ZvRrsOI4~5d-v#CORIBn zWMA&zl-{?B^q1RoH?i*>`#)g6W>Dsn+ZQH|x6qn9_Akd@C(R|x#}q4r>Qv*l zpEy7a?UkU6Yt4C9l(8v2oB8Cki5GO+w}O4mHFxn-Kj>KBl)jYbm$oZ*yp-p(H7_-u z_4T}~MvnsBK<6Z@z{YRtk*$uDX9DHfsPgQWew^7(e8_zp@X*z~`rot9j`ZoP*#A;x z{0!wQo_6Qw9PYPiYp*M8=Z}<++4oBN9GnGkS^M*ruC|l1Yc73TWF1tRvR_TvHCMh2 z-{yY&^qmpeybn%Y#(V7zAI!Dqe`kBXe2g@w@y#yw1JK(2?bMAqr@8(LACD}5n(NT9 z9SnPd>rt+4#C{HS&#HYdg2zbvHfNBl4z;GxweOB~DevQ-!8Y-$HFav=T7#FdZ9;PD zSk`@{*5tKqKsPv3R_*)Cq@C0AWfOyb;~zy^4-YH3mU1m4_HNUOe*gEZ#f+_$s#!j! z*3#w3!}yS!(pl}h?%K;k$k41|TLORZzrfMg<7=#BtvGFbt9V*WIl?y18TJKjJdi_f zv0IPWEn5|-uQlZLJIZos9&OL2uQuND0DKRpeUCuK+KXg3aa)&0OSi0K;`sd*X}n4r zobPG+0SD)XX{}c~Q`^Qz(t0e#cyd~grFDBncvpSW7xFH6J#5=x>f5euw{B!_vQ4D5 zsXY6)&G3jF9{C`1i8k~6VV=(~&wiWd#un4I&*xopsNZWdwr%I@S@(|pa%<}H+o|(M zr4yB_hfw~u-omw1_KvLh_s1|4dubgE|JvV$b#$$KbMT3A-X!EH`$xQQFSyFtyF=LL zWs=!*=X3U5D`_9xHqQGj_uBtYYwdDlmyg+FdDD7GofpR5M}b_ck?S3j>vZ(M^>6r} zY)d(wNl&$Z(hR=Qc!c)P)AKgYmdx=#KTY$|u4;dXczN|L=d|Z-zGjUj-zui#`b%2B z>Be_&r$6&$(i4A1R|j>=zJVX>>b`^h)UFVZQzAU_zko-cIUZH6>3kz!L31+H&a@u3 ztSXf~2wh)fl)1^rRLzqx`KG&NcSrJVCEw2}-x^`?=>Y~ubwz19{L_D9&)xaB+~37s zlWOx?(;Lw7KSsxWy`}U17{ltIy-8=Edo9H37!TBWkT(BgX>+YQ_j68Mqi?zR*>%T_R~JFb3|kPmjvJHSE*ee z1T)Z?nHRIqPK+KuF**N5u`VO`URB1&aCP9~W6tl@IbXttRbN^W^Lt&a;cDBbR9w#V zL6}#gd47yDwYq%V6JaBt&Y#_uz0#_)|ZW#N0HWAj44Uj0?gt=F9EJuY2h zc5dFy2^WATis2EjBb^(RkLJ=Vohzw(&8hd}Op!iJOQ-A4{`alt!UuEXNWuId&0*SP z`!9+w^~d&E>=*XZFEe`qO{NYvgArOkwMX$Fo}1Xx#?;6KRsOyCPVp9f2bMS3=Nbnv z{T6#~>ZUh134TZ8+S8D=i8YaSln3=W11#ph(;J7K+S5#V2tS7t(;rVd>Q`xe#LlfV zd&99`fgf)oea-nV7H>MAZ%w=jn!pzwgiWIS4u3b|!&Qq{bUKJPIi79#Ob&$Zuwiwd$`0%`*{r)i;d;fb<7=9FLMz!l=Hgc_PsQYrc{F~t72NjY zSCR8UI@j0#ednU3!?Bnk9!mdn*J9SMP`^eGZmZm&dF5tbo1Up-#0`$AO`m%r{ovCZ zzkrW$j5%7zhz%UmSmt1!>pyddk1?nDSSnL@Cg(YQAm4hR-u2~O-*Lw{H}Zqjz`8RX zHYxs~`Y`)%m!-Uc+?zZrpzjm;hW&Cr?((i6554QHys!Mgq|bl)T*oq*{EMlwYrn7j z@lB2?uj{N%B=ZVzk#ej4bu}+`coZ48pnm`VdiMF_tgVX1;UjUx0=p+Wor%T~YvOaK zwC+g#&<4e1OkCqM#UG3xs`jWkRJ+o;K6>+qncKl0BmQ~Ln%_v@vh7C2H~P^Jf(G4^ z-Cw~zOTxb7ywNLczfAs;`ejQ=&*8+q_z#!pJ^d@wZ#$IQH!XrA@`XOHej9x*hj03y z^y74fob%&;%r|4zZ^Qr6^QrWsHJ?j!9)v}i#q#0Ax60C&-@fh6-`3vF@=;m8U}zQy z=b59?#+nPAUA>CEIaF@&XzdW<*m@>?A5uAv{qa)ov`tBQZBxK)(x|kwl9BdzWX*y} zQ@Sbt(CsmJz18Vfum+##&&X#f`RwW{ALOEWPnz>IhkRWjtJgmVd`|m8&5x3QM;wv5Weqibu`zyM z>{a`&m9!7e8RzZiUSo--Kg#|f3oLJ%BXn?3S@vP(WV-hA%!-cn-=?hj!4dn<|782f z@yxZ4-}B89)i3r?&+q&`yzxIjNPYu-G3LywFVK10p=~zko-cIUZH6FYt}ljA*@*>5Glvz4~I%{RkN~TmH1K zpvku-mHl!g-*1tI)+#EVsdZF-%*yETUccW?9g}9zzu|wZf5ZJb%ly8W+AQ<7942r+ znC5NuV{Vfxb6Iv$B=33Tt#LWc@5|HnyUQOj@wi0(b0YckKbAlDC)oV8PpRY6>{&`X z31en++EWoeb*_l-*Cgj2i(i&laJa^@5@-Y zI+g#%#wg8}zB~T?Jp46&n_K4WfQJiIC#P}M+Hb(|9iRQRY!Ecec}A8&TelU!%!~_}|VzPEGJN+vn@CB7A+y@>N}g7e)kjs@|L6`K!n($2~E~oyF>o80gOD z#1p?so`}1goLd*+sTH2C^m+QbB0RA_nvvB4%agHrRhon9uZO1^8PL`np+S=gV6+1Fz1I`z{(pX@hNA-eu@J{?Dza5TA_35Va@r)Q#@%pGw?Yvgy z<2PBpZ7N@Vq1#K5rYv z8_)7fO7ONgwX=_S<2T8h_T3|f9qLOfyxr#W_RAu?&9b~@?ksHo?62p`>^z^ZZ-_6R zu?JjnnJrB1e3LwK{3iJtDZUm)_^SE@XKDF-{jdmM=UTq1i}7`>W}nw|SPgkv?xj#23$qpB3k8 zZfa+v_~JLo*Y9Y5xw#R(n&9hRpRc+ieC41wZPxM?w)4}BA3lWl4aIn#6PM=%ieC^G&RTClqY@qj%LfB@yBeRCDfmc(Vve%zb9G_{6?))xEFqjXFnwR?(~K9 zTTXwdFAypGK3nhjzra1O z=Q;VB=lpMQdDdJJ_%SDvP9yi?*Yy=wzfy?bnxCUQ_t-SH+#dRp!~yWx&NR02QPvwb z)?BsY*wR^ySIp#G6T5~1{#=|$aWyj!keC^={*lsEtX$7B`o*VJJgrvx&40x_9mS^V+mlAs8dLEiy*%IRBLvv1T_$@I%&w^rnxY^yQ1MnjFrNfo7*$D@ecN zo(Db&FFa!|LD1Ivh}S-;oi`va^w`*msE;h!=7{Z^HMW%J0?8FQM`=`Ul}p#v$Syj6 zM*Eq#J*PC6(8)@%I{xp?RQhGoy@~zOms1&yoG4Rp_8957y}+G3Gv%Zgo#W2E+DvSY zJJ0@gso!p*<1(>%JuN5rb9v6NZ4Nm$ru$J3{aDX*8ta-)Ykz=v(1XN!ohDOs0M|)y5S zjxq2#dPhH1?=IoL#%+}b{BAY-XTe`%{p|Lh%mvk%9in@deA=K9@2QIAFRoyHQ6v0r zfv#CGz@|$790$u!^WsY{)Vu1J85_98Pv6{w>DBvEBWvw5(K(-Ps_NW6?-)=%vZFs& zP1#PBf0}fY|M{BnJ2UqD-aPN~{U?otZ{riH{dSCn9vO@kJ^%A#e!}H!=Cy^qrpkrkyd9Z~F4}W%*&l%SDpKI&_RV zA&SLm93xi8gZ;V;cxZx$$9*1@_Fp%m7dBnw>+9}N|C_7nOR^W8nY-8xojgn|sEs&~ z;z_L6@P2!Uy?QCv!q#)MS2Oo%+=}I+gJ)Hrw9i(IcKX!F`Ib%fm$%Qre&vUf#_E*U zx`sH@6yjmiI0KFJa?_p~GjPT2qub!geW%zOyqWoYcD%>R^OMpOp4C{NaT z8Z5d|GO9;LE3J&c&6tb^_~mVazx&}&a=9G6uU#6n7hf*439X5a%H)2@1UoM~Etxo; zU0F}1tn@j&)@77)EahY_Osto!MGpKBwNMmE?C~Nei`yo{HTrR=6p?fYf!p!@Rd~rVd^OUo}4so8`4$OL>P=Ud@^DzX@dM_Os40ckjSP>?9ACn9^wwLY9+#1jZ=}De@tnJl*#jh1>)wqv*IQ`f6*e|d3062-x=k_DFm$+U) zb~eps=GmcV#)eDJ8tn5G?8TOYHrZZ>Ag}yO$oRRGr+KD(EPW&CJS^-b?c_J7>zfz+ zZ%mn5;9)m9aGPJQw*Axz`X?V@3ujPV$8+ga+jFYFkF>9{_vYLT@KWvaU~lFgX$%It zdXPBT7Dw|mXKR3wpNzbF*1c=x9hk>D@_X_;ll&VwSFVZqcc&;u$T=99Z~4!KH_ho& zE?i*muM*zPrH2zMEizPdsTR6SP zzR$H#f4j$dKbD`9$nOE@B+muQLY}EhgOOT$<;HLt?0a*bE_-}87@PJj!$S zG3RaQ$DD|-&;OXO&wch5|J!6fl+Bd4*_Mah>f0o{ig8{?%L&=o z+%WJd+Rt+9={nN#Tf?<&Y1SRhR~kGo*`J~>)x_Ei#^ZfCho%xV}DZLhdblTg?-A;*|Jqf(>iIK^8b;_d^T5Ry`PWIQ<<5A<@)5A75D$*UNT zMt3MnV@+xwc5h}k_ToC5x>C8;s!r0{6Er$su0)+YnWz)mK{Ph78UH0iz2wv6W$R|@ zkI)hMb<|&{_0vTCyyw@?blpTP(O8k{WRF`i`Gw7DqDqobbfNF`ZiwXUMU#8))x4i5Xua z{RzHhZwx&*_|V(T&HP9+X&D;QbN%DyZ38ZRm-gGdt;qfviMgw}8iS!*GgZWFz!`Y* z%Y{CygOSE3Q9P>FzI&GM z&7L2m0Y>li+w8cV-`$Ts=pKxV#-Yr(e(&WxAJG0;(rJj~kvfGK)~wV%jWJwz4l&01 zGj}xG_t>Z%k|nljq4Ph7@ckb9zGGNwWMj)!JMNSo@;{mH0BG5V1)TH!&VITN(w^5| zP1=fyWQ5a{rJ1yJo?-QQ_!;&Y@k0EGt9EES09`LAo7o?|!Y`ZZ&|TlA?h5cCs*l(| zTW@PK=W<3zX%U{n&-lceV32jDm zH=}hl4!TON>U;e>f_kkSxAXQP*mA403+#KNA7CZ24f1J-yi4)!vqkdxxXove%cmzY zr9AMpbAj^VUNX%5eWa|X#Pg|+yhDGyfkpCBxmBJ8mR9v>@;PbT&Mzn*?pt)~f5|`J@O1hnXApzzPYm*OVvrwg-^?6}`xk%o!cD{|i9g7<*_xS6 zyBrj0mqSx#j*k2=cc#Nx)N?)cOg?6>iu?%r$Z5_v=J^}gGBdx=tVs;lC2H=Q=D_8D zimV1RH-lJ7^WraESW$N7`I<||oKNB>oI#qtqWytQseM~C=P&KgqlwnN`h3+bej19C zynzp?J<;+bjBlv+WAyBwBu`7XrT$9=eZxV#*LY0z&%(4u(0A3og2}XcLaXtZCeqP4 zsaO7(vM2I${*bW+l+VcW9sCL8r*GFjQTR8d_!Ef4-T#DDolW$UB9G_m7kUN`ZL z`rCIEN%L#GYYx+6UzlNj|Fp(G^GVp5pQ7~lkIr%4vWffo{H`@|UGlE_E^#UBeU7uP z29_-!qqQ#8mFzDPrt4!iw5i_g%gx%99GDc$Pt*BWme#b7XM7oJFN8*71g$mQvPa;Z zG53+lvdL%5vmXJnFj%g5DgLZiZPU=Yp0cu3_8aUiqUWvLADm9R!e;2c*3x0~U%cMZ zTt{0Vy|*(}pUPI1Pd4)aPljG;H#pvU`ZB*nI>7%VU!s){r1?aZ$YKlMwIR1mC3;t$ zdaTacPU(Rg%lIj=r#&`()#t;colMv1O|AO(iF(i+#h}l}f7(GXH%n`s?z_qNC%T%$ zwZ_sF(@p77+rOv{UDke>UlZp~@FCt$(w0)@{h>d1 zEM~4PPjoCMd0vj&I|QDBy+h3ZB72AY{=X<2b$cD>JDR=^x}4WpkJvfkuv_yW9NkG- z3-%64_&EM~!T$M9CeNEras9=$nLGF|ADcW}pYazq|5ae9%iq|na^i91KZJT$pV!Uj z_1E0^{HZVdfR)D{zBfFlS=Wy5q`rve=lgRVNe5kh2zs5febJk@zEpkPIi_D{@`$_} zauVlnm&2n=k8c#GRhuFXa*wf1Whw6)$RgIqNcaq~I=JoBPzFWn;4UkJO3r3=GHB2_ zt?@cotva}@XdT4+`%N_ic4+?`*WYidna4eQkAi<+8C;~lUnBp!JNtk7dkoXJmOWgX zd3LxNOEmu#cY`1G51Ds;%hm9_=YDwPo_hEo^{cw8Sljc#r^H`+-Ur8)PGs-8GP}np z<7%u|FzXi5tV>{hLh7lj&m^B?;MTF={PM(n`et-Xc`BZe12^GgYvvL5JDzTB%**^I zf9>N5wj1Bj#4G2Q-SRqh#k_6SqR0-@uSRxm|8&I}WwU$p{-kljCmd$JI;IXK7Spg%4O`Ni_!6Y46nIA_v=1h%O*Ayk%ikMJK(MAyzIx$ zp6r!_1HrSp^Rgd5cd}Q(vphcA1m^Rh(=RSlER8zM)whgJm1BPgV=M6QlJXl&-l9|e zr`X3Jg?%qpzJY(=vA!6Onm3~Pxy_b;*#?cvsehsvM4D?N`tt38pUd9)&z7gY)Cqo- z_MA_hQdp-k8<^0UW~Cjh>AzgM5ZJ&*-u;Tb?j%p+^Z4KTz6rXeGX6C-*VxvAbXgZ1 zq-*xnjHG)-`%hiE3H@`tE=D&r7g~FO99vp?J~VCKTTXoaPg$2*jK0{q)M9jP=qu&w za{r)9?HLYn8yebVlXmLFV9z6!Lv5iHz23K~twD2;_NAEEkIzo7V+}Fd#ACrVeJ7tv z*d;7+eP`oukyfUhix`f|B|Dg6y}ILWPw87Gy56ZJjHCH>o;^Xq)u4ZT-$#v&sFlCz_NznxU2NkP`u{)RQf#C4 zLq1*`jJ#=(*@k%_7h;(WZIDOc5`$-e?a~2!q|w$jg@v$UIwn1d2r(cH!?nRe7sot zp%Grb3oq)MMR~dUKMHyIC^XWMV!Ys|%`_shh2Bos5&WBv!$Ba$=vsV;tBI@h0rr!9PtExgjM`w;T&p&Xp z@x#t$uPEO9OqZXdKBdb;`W?S6Z-(DLMVB`~?{qm+M3;LVD6D72 z`Hn}IzkR&CSY5t3!pj@T>OI=(6f7rpxJYjjzM9P2kc4;F<4l zS|9jW=Xx-abZ;t>eEd3vli_^_Ic#{8BjHkCv z{l$6GSe`3)lBX!fX`P>IFB%^!mi{k)RaoXE)_sn2I@@zG)}Pa!(eyh4JD0$@UHGHF zGqE{q=dksGo$DjtY+n1%kVhV0q4J|477E|OvikkbsGVz!l(ny^uXz!jD5Sq9BL6b- zt1V|`VGk5R&e1Rsk3 zyYeOZh}QiT5k6!eBv3)0+L3KRBrdgB+TW{Tumj_F)b4^@(zXl#OuA@5n{HujL$bWI=O7ak`<3ptB+IOW* zuTu4!C{wb2FXFps{W?GQ%V6;j+Vsxf3)DUTG<9?od`mtjo=N=9r;W~euKe=tGyjIZ z&4+v7mv_BQ&s`qg)&!+ulenV5F7Vj(LO-=!JR}*#+xH1oj32PSbwJCU!GIseL~89j>Tqvz4|c6XRex0b<}I*v#@}LG zV2e3_DD1ynMm^<=@YD>g+b3NAT|TAu2^UR%TbbX7d@4Ni5x?@G+_v%bcjyZ-2lJQ2 z0Cx;bo$S(cdrxbha5MhFp7oXVnIyByvU0C-oG;T%*(5Uu)5x{;ysXy9GbhFSIrWf~ zT_fo?YyBW~Q7buH*@?#t@fYnsx2H4tF`m<$zC4gsosF4m{LAEDb$+mS_?Eea`7bAb z$@>A~>diF~KImtu4nJ0;z8CXNrkhVo9!3X6n=kUc(ZzR9yRg~nmDaPQkcHu`?)+?; z`)=I-;SI1(bP3(MjJ%rPy)5w8&nc%|r>t=DvTMUnZ`a!P+@odKz`pH@&FNP>>Wq#I z^3^$<8`cR=Pm_LZP30nII}nd(VxHmG?xmePI^OJYueLE2eH}u5Y@uw;%(;)~ap75^ z?4#Mtew)n8Oz81!>V|oEk$$-Jc)`R#)_c{bmHad}E7arJKA-4kX+35x*TY7SWBeFB zemK1db~H( zW70Qzd`eW0WBjUJX^&L1x2cs?LXX*lA=KleUncM*AqdvavvHnYw_WMj<+TLqm>K<&$$@(Vs zV9S^-=>CwWhhztWm9=4eU>?SBhox&XtsgU3`fpe0jHT1tFG8m-qP`!ZzQ1ChRnZ0p z(gs{xpss@cwffEHkf&lf&CEA$W*%@e`?5AO7rFY%pbc)#)C~{XdGr4%l+Q8Jsh#Q5 z`)PfcG`Q4$DMNl!nZdo(xvA{sxA}5ut*GRz=SnZN0=e8(KZZ7o9t;okpfTNjUv6`m zH}8GuH;wmlo5!1RKw;gN^h|QPi*N6(AESL`wg2miBD}ogny z0beuP=N92>D}3dr`7%>oS7TSJXABs*;Pd{o*NhJow}qSdrrP3lt?X*V7Uqv;%$XU& z`hvDd8_2(v;i~oW?`F)I8KRR;=a1HUZSU4nKcOw8eVn|<@?r9^7$RDSA^Pv~DTN`T z$*(VgA?rg7If*#?SIN_*7qx|Lq!GiAH@kaNFSZ!MS?98+`E@pr2<{r3S{K%h(XXmc zXS>rL(tLAn5uBL@56z*y4CJeF2xlbYh`lVpnfwuCd?b`-0nXHYI%r3)U0&FZhLXSP zg!o9`2Fhsdc7WkVKI2XbV!X&n{U8%-(poy{kj{smJ;2}Bx}+`ZN!#nq#c$G%wXvV5 z-kH22@;umks@K|cs`nG@oOmQgZ}`(b&((pCKck&FEF<07!;QTAPxfXLeZhXiF}j)U zFFLw}jmDQXGBIhW?KVwB2koB0_Fj4Jv3oi+^DG6;zq<59GiFl!8}19f;n`#En*HfDYswe{LPrjB zy~=ff>m{!J8LxR#VSNuH{kApZ4Q8cQboc%Z8sU7~a~ZGg1+EsZ-Qd-ViQZIbg^8_? zf?*HyY&IBFS7>iqch`EkmRj$IGgJ5Ub@rwX+8gRwt5nNA->K}|OD#rkCaq1RHG}up zIE?;ufYAmI$MwkO>dU%|>eS__>`xuv%z(|U zgKjExS6aTSE{OB}RCzYHy3E@xK3Bu{0r)1p7JF~_t_#0;lIMB&5UumMcj%ey(3RwK zUHzEW{mAyETJOMb3fuNi(1*-q+h(Mr)Y*`Gd|9-vf#22WfMl{_Xm;QvE00d>!|YsP z9-Z2Um0j3}WypJ3t(UJ)*oT$iS^aU^2WSKPz<-D5CG7(=`DG>S!?Msmth%ui`#>5o z`|wV8uhQ9vcdUI_TEado4eQd$-r0u-X~)i2Ll;b&FKHjdgX{w`?$kakMaD}*dDg}I zQ}{m@1omO}Wrg|wrR>A=XLMm7wxN&Px%f@mhdS+jz`Fwbu$}g^t=9YW-3j|3oo0WP z7-n-{fWJJO@m2rZJnaa~{E;wJ|3&L;N{;&}j*d1P(D6S;$Nd;bcQ``F{}>(j!!4cB zf$I|Xh5G_tdG>Mp&4OML+`i@gVVF0S=bkEF6oziBaj zI`60P{%qc#=X~4{=M1K&(%IY++Dtojy##DrLfw+it@fVwKtJR&0iJ$?=LQGQBh3rI z!9}%RZegwWk45_TUHQEO4iw6)Q(T+U1+I-nK4WXydo6)$Q)q`Z=t60~cdL_i9@+rc z_>bDman{`8gYcaZv&X^?)hieV=H7nnX_`UC0Tw7@K zi1=wHkA)$wQCF-*|4iWbF2ZIdbuxi#TV20GZ6+&&RleV9v8n!TpP;Xk9ueFipcZeJam6< zt@lT8Pi@xuy?Jyzz#jg`FopXw7g{W%?F4lEkI`{|vZYJbiEv`F#cAcM%lJ*!H_b3_ zr~0sC;Tf-O1Xq1ow))uEk(nt0J_YiWK4oUi8%f>XaCO86Ra;uukGK(E zKgkzyE5l2zrCs2D&6&m~&KSttt{@?Bh{UFaVO<)WzAFO%&}#xdu5)orQdq6unebBhDhHi;MeHL zV0atK#cxta?q`2by(`d>q3FoqTJI*OBSm<1<@-nxO#DoL>>Pe%=C)h?`c&Q0XGqHa z6VOQyTrBmMuN9VU5H!tUjB2loQAOgXfga#z&un8(n)D=DS4RF-BZ3&}Cj3p!UrRxo z`EOo1k zrRFPQ_Mi}}Ix4(;#}wwuChS24_?4!8M(jZ%mKw+{4{cx%_;2{^%pO3KpI^cr%n$9s z3yV6|Z~Lf;gT(okJs^#kJvb>6OFb!wrGoV%0=xY6qlNmhf%Kch7)OZpN?$%K^6M1q z-$#D$PYGmI7r_ssGfg9c_Wr=^!u*$#zw|?60(*++spZRA5Gme#r18=TgI#cTZWXKV`8cKFqR6wj4=3ObieBC zWGr=SSFu#;Di%xC9ubEBBgp72u0vdhE4)Z7l|Ju=yOswR2+>t5XCyVg*GQ64cy#!DDEl{`wl!EhNnYQyviaxMg2+DbG70vv%@&*>i;a% z!Gu2I{@Z*t)KlzCDC#RM0C#QvVW7>G@g@Hf$D*BVO2POSU@gR&r z#+_o!!^rsIP@V-CQ#CSZL#r<-%>OUtPo`<#!m5(K!gJ{O3taprZP@z1!-ny$z=pjr zg)`}d zcqXmI_TKPZ_1U0|*Ylix+t>>$f+cz;+w&xOJPXdRN2cqhcx#Hp0HX0zm0NZ7Yub?H z&^jGnr&)V69y|Y_m4%I;7PAZGuNLA)!Y-_J{a|Akri6CkYULjt>y}*@i>${^Ah z@Mg#8k?Y>d$0G65$E;l#Zu5xri%pzicvzSEHiPV4{B$<$H;F+ByAa4XPg#v!K*r84 z6!2=|49Iv?C{N^giSX=1u3G9OQ}@}xE|kwI%)f+P2;^__JdQZSZKoC3g|+@U0yfUD z7=2vA#c$FsoWwc~y)$`5E>DmC4x!BiD;#xVtyQeFAs)rg&Dyo;3P4 zPdf^11pi|;g8QTFpJ(W3vjH9dV|3iV>FB_tfR6t$I_?iyI$sB3b_Jb4hvIf+Z;EHH z*l!~7)3q5JKUF$v-`6lMpVT4Qu@rbF{!b_tKOKr~7>=Hd;2O#`3|t7~r(s=d%zr4D zI0%}-72YG%slole)LS2LZxtAFANV+Yiiw{Ny~$#EZ{GLh{T;l|-af|YT~mm2x%9|v zZdjRj-n-QEFmQ1M^-3D&+IvIa8qyEuxxv6J>D>zk4x2*!VT$*K*9*&@@OAelecipk zF8robOsnVu(>i+4SDs8?Ie}>vw81oba6Fg>ZQ$$j-?i(Km0|OdE*3O6p@tOcM{LKivhUy^oCFpB%`ut^m_U z1(>#XMq&PcDNL*F+XbfeNACx4@tef7|6GNx^R58X2B7=>r+AOrwQCO3^5}SgC;X4$ z3HL8tWATZ$6VUNLM#ud#mM&Q*!ib}`Ji-ZG1+mjxio{Oe?cuc@r9PI8h{jC=%n&YR zW_KMo{TO~plBX$_k51yIfekVFMB=6?aNS_jp&nlD06ZQ(-;bN#a=YTDds9yh&8BVv zKZu(eooyObEN)s*4wW;%Y)LF$`sE@q#YDU`;M2rQ55v04RC|0^x^O)UyQzP@%Q9-QqGJMM%bV(ifiTFP7jZ!hvxLgMiBYg?E?&sn+ zDcg<)^59*8Z1*GEmnM5JvZrl+KrBYOHi(h#?h(W|%=bxOb{B167r5WjBOc?}4NkR8 zj^TbHMjFT}4{d<^{CD}3#C>S;{Y&6}{}A`@{7T3AuOLU4Ud)#zjTr8G-NX5&-b6Du z*wj_k=%8ORlsy5G^)!?8o5L7s=%*@uVLI~b)K7f^`8^TJsu0sh2f8!&i-q~0PyW(d z#Yh(v(M{7Id5%0@=;6r+(44Q=-?A979evr>!%JNb9$ZtT-}=I2;uVv<8%~MDNU!;+ zVx)VAJY8*Kqzz%7Z)ciDyBO)-OjW^r)3sg2NU5vhG17O7%5AV%ThJ2qgbde5A!P8QB8bi8MEl+h3p6cPLcbWHn<=+#YdWSsS=XjdRw=>{rGdyjY>^)V4r=ou2 zG5`S^ zo@@FqC&&FplLq^)1Y_>2(eX80{3dPK7dU@d?@V6NzVI4s*y_n%75;;8Fz_4E@xUMC zf6O1`e*ApvH_|=>I{wG#xF2EZlDIFwQTgd=&>WXlvA(RiS6Y!6>DCl9gKT={n=@j4 z^{pB13%=pmsU>(Q6(hY1IVb0uP6Y!>#z;F-j5(qs*K*C}n#VPZYfg_KMjEZ}dq}^n zgLC(^e&vQpjC5KLuWdS44c8Q~>V}El51}=fI*fW9%Cl3zpsFIaW(t^8GueBkPb5ZK z1?_qCtLINPG1A%0fiY{)RwIzk$A z?0v1;TwO>%gXcCz%3LM(t~ttn{%4bRGDbQInT+k>J)-g-rCovZtpnhtKfLsU{#WM#Y3vbe@Q9I? zTUmrL(yb<*5U~qCdATr;s9iAn6J3K)5wi=0nAK5EJYf>?goItF0LRj_(-QFnlaE`2 z0Bv9w_;0WSY%FOPpvk|L3h11_XfXRN)v3Q8?``^6Hl7gY+l;-#TNoqVTKQxoM*5_+ z3rB1o5gapl90}{PL70NM{x0*vxyXeVLt|MG;l?O3WlZS0`qSl| z`?^mc<0nFSCNS-7?KkCOF)Ke`nEzi2(>hM-0@Gea?+YV&zad^UJP}#Yp=Xi6cg1q)|RijC3#QZIT*FL+m=7Z0NsnZi{GSde_T%Dm>CVdF~@E}IIGKTwG3;N&7)CR!e z`ULK;1gGk0hY{S5#z-l{-e9~R+5q?Y51%HVlD;f7`IihP$M`XRCTCMQ+#kcZNELE) z={cV_BVU#@BDlY{@>nEBdMt>M5->)pd^p8v{%%44HjovCon(6Mx?~Q&$*5v0`lgAo-n-l#Q>AkS&VoBc-m2$4D2#|01sWT-TOIW2D5FLix1NmXcUn5F?#S8uO5a<`Pi`ont0_QH=EK z*IT(vK`u4Or3tw_V*R$(vOo`VE$3u)&e=DQK>r;5)E7cO;3hp&KlKs5eH(;vG6nsp8k<^w^*L4x`jN|!_)4RH(U9)z|-!K zr!P95w(#v^@N_La&7b5gDZ*32Z(M8o!dHedQg2_Oj1zw2UKhgy17FOK=mI~6QTAbz zn5&S$j}f$q;c@(+Z3Hn=bUeflXaoG$im87|7qq`#55xH}o#>8~4WM3r$1Er*rX}v|;7iBbj$5uZTPkPRE8#o8$+)?eT0?hC$w=J^sll!}o~M9#?=X$lM|86(|JA9N5pGMKAB*8r|Q zTz$)kw((!23HKK1Z;yraGH@IOTl=JC}Qy ze)V86?@gPlN(b1P;kk{GVz-EqK1z)A4$@A>NZ;>H+^)O#WtIO?`n-yf9)Oou z;pKYh?}FF=o{6TK<;;3h`;0=z!g-M5iX z6C=IG$|8)B7TATwdkb-+Q@gOcdo-R9$5#_iK-Rk^5>M!!h$l=Wo*;ZJzE4Ya)Gq8+ zn{@GniCx(bx>vUf4k7IZX; zK_%^icrfvV?w#9(Cy?y-)I<-P!SdA8^ZYa?h!fsNpQ%tmm3jiaN@26X(7(Q!Z5 z(Sb(+9sgr=+|RIdhSwPhyTW||uRNP*zlp?1_eSQCn)dw?@$_}Hs-14jo{*T>XkG$*!x=3?+EGd<+;JY8KgHG z419DVF^7rXPm1*CyYh8E_d=n(I>oe=U0~WWWV37{edPqEt)vas3mc9D)1VD7jsIQx zy3pj;m%z03A*S6(+{ngA<5+C^%J62#eHIWKsC+)+>pm~OsrPjzkF^E!0oH|>MqO>q zG<6R!?K{}3q&_AvZL8}`WpN?VL+Jbn*Qe?a|lxG6dwq{zp2blJ`DTVo$z_hI{ zR)M_N9?yJ$AD>u&XrdS|SNV_F^^5AcNl zF+AaZ%v_6Ow4H#C|1mo5hg-U2od_eYu^26!&{Ys4y`e~qba8jDZHaV#P&7sw$WpqL zxw7jR>D~DDNuG`)MjFW55DHG@}7v127H9z2*kc;1>Ui|D^=mqbL4o3Sx3(<>f zCwl9#g{qrKj5OfUmFv?*aPYF8Hb#0w=P}YRK&SLwjP$>sFD%<6Xd1#eRKdFYYGHsK zSMy_}XDP<{b|OZ)HB(m}#7KXRZ<#xARzZyP9PxeNuYwrqS&_B&CZFgy>l$LDvykf? zE`F1;yZAkza|zV4cFRFiQ#@BCXJ;Hj0J~l61YDFoT{N6MsPn7 zBMoGghc>`{{u@3!8}ElEzuIClbT0O3Vx+4>-2cP8j`hDf!Nf@8d<*wUBZm9sk+t^a z^vS^eT7&83fxW)(aG_2-Mf%NQj5Ne_r7u4f`9*jXb8~hj7l;#cx=A7=f+~=UG3n;OruO*69<8RdAgUiI1NB z^qA|==ON?$_~@Q6J_?TXFgRlLy{RBR+T}X?Uy~2@K0;;Do~6M$`=RhYjB60r;O^1* zDD9|6Ae*H{Vs{1c(f*_{06kTkqzw7`l(FxMkA7l-l}iP3Nh6ms+2cG&`o{(F9spX0I zXocgcBh7rFw3j-@SXQOwsWrk=Jv=Q-dA*eXQg~Vx@|1BrRl?Ir@H7~n22J#a72zrB zGpe3Ve6%i%k3RPAh5DE983X+{dUrG(?FSd?{#$A0CDbraAsz1rAFW}((wZ1{&@Q6! z(GWYJ4X}g%U1A3``6VT=V@Ze|Z(J4ljB&n&9i$P%j(riIai1^`pK);spK)&~Z^eG`uE2iv#(wo={u}m9X$SF9bUg3{`5*HIx!-!3^%-fO0UiHiblm^I z(k1;f`HafXlt)-{pX`?(>onNHz0z{=Q9VoX>~5Q$p*c6~r@Q-tZ=kuO1P`U+qaRcj z#z%L6`6c6{i|7L%LPrjBy~=ff>m{!J>1cd3Xm4riv2BsrfBo&$Es^->b7`;b1+EsZ z-C)%%`0~&iU-VJ%>tUX~41TpPFC2^8UBlicHQpq657ybYLi^5g_A9M1@zJ0CwZ-Sn zq_v5(_VNCW<(hW{K39bJTytiYbK1Rs`wcoXpFZ{B8ulu!@qTXa4Sj1!{}j*V@0&Vk zB0hR8@zFO(I~gB+0-5Yed#9`X*V4WfAKeHq8{p-6=--6bS8HPN(e;k!_0X+@?pf$w zvpiR2LY`aB$mSNNynhsr3*q?yJd@Ua_TKPZ7t*iec^)1_>*Ax|(KFee*T|!7Is23% z)0b+z$BXpyqw!IdTXoez8#3|HHSoF`JeFRUu}|qURu(osTFfpCeXbBUI<*TcyRZw( zkoB?}VhIVmuo4`rKTf*F~ z<;#)y=*wV&?801|N2HHq{MNZ)T_XFvlD&(ME~Wh@F(_dd)`qbJYZs8QvkL{h%I{o? zjF*P;tc&}dYcoxmz%C4}Da^lwU0Cb-KPJ!P7&qILDXsf0s|mxd71UOkzhD>nBeSG3^{; zMkO(gG$Ow4-pXG`eBEDLOq*5$)24-(X6mZ0GQhOS*sG*Imc%siVEWQsVA?2TJSvoD zA*NLZnD*b}3-kX=VcOR!y1=x#=>0q{ev_EijXiwzt^m{Kq5E@dyqCc|wb#JcMaKi& z;eQNIxPNc9#WC7WK*#?W9rs5pU9wJu5ocJ8R=&Cl;-l9WiH{CXGmnJ&Sk^BZ9}RTb z;9FhS@zIO$OOiYtM|?D}Ats+leDvestHGv0$bSGl9zNNRkKVUj@zK4hM&hIQfggT+ z6g;Xd79TArhsv2>c6ls5`nN@5h>7@Uz^93i4u+?pT>K{W;?`Tx3*Hsz#ZdHOaE&+J z>4jZqUoC8muJfZ@zbnGehkMxg==Gh)M|(i0x_9x>AMPovmt({ztILCVdRvqGl16y~ zGg)VUn&O*#6Y)_n{e&Ps`Yn9R9CS$?I7nXk1DEN06Ek`(9v_X%bqev(KFGB%7r#l_ zo-Nt(u0XbZk!_zEuU-3UPl?4x!*%u*UEqF4H|AALU_Dd<_bb4uH0>~g`-%8yP=9%7 z1Kj7o;j^>&C^Y$+61ZOz;{HEwkJc8^O=G)z zf>XWGi-X@b>+HMdEJhsd#<+Yp`m*4`9Yy-By=#b9)OhR5Q}^`h=C`BN9ZzX*PIP(* zxUt;)Uq!x}dt7-Qz9;W0M|Ss~a@AcHz& za9t4@?4LkCbAop%GT2Aj#{aqw+MDqAj!a-Jek%Jib4pBFyGZK^(z=rO*IR$Ds%M}- zxt3G2xv?qlRpg%=i@*2Q1h17e_S^bMUC(zn;MW}{&qEWuKNjhC7WM0{31gVccNgkN zr+(e`Zb1yQpq;26^(b&-{n)%uY)E( zszm!96}ImmUEYabM;fvA{aVDYd(HZFBTD#nBa(hy&%m$S+gd2!l75|dkY9(4JH>#9 zk@3T!JPR?PXMh3A#}?*a%&*HRzG3Yn@;ew|4pIu7?7`uzeIzeyYOcT3P| z-kH3jebpDx@#iLZ^RPkEo4~I_#{++j|1p1!`(?ANUq>4W==dL_cIob&$dyMUvypbhFCk_8;t>( zwG8Xf!F9B|^@(=A0li$0+#_}z{S4Z9v|M>;gLck;qYItcacJ_xO&g5yW8y`_!*>2J z#E7paPnTZIj*~{Doo}sdjkNPt+s=pCJR*8&@)#Djb5kdECkE~O6)-ueQ=f+iXX~T# zRk=+&N5+wM9xIcP@fu{jCX^>~yhJ*BBA3a(Db$HOKUbLlC!iC3^lY`L{ExSt|1sS~ zJKsnf-^9glvYp@k4fLOP1?_wj?R?_|@0y$ab}K$zTVJ3ybwMmHW$x9MBXOy%DQH&A z^uJHazSMX?J7r1Em;MoZua+DS7)s2io_bixwUlca*J7?E-GcFes7yOZzip@)57?Tz zEixXku$$Mmh-*IAwb=aICVKtAPvZwnM|RVAb~g6>ydpluwG&vwF~J*8+QE3hdC-o> zr>MuL;QX?uuC_kK6w<08tt#GMuzZZslhzYMpQ5HuHa8&U{rq+6WdJ_KO6q|$eroRx zeO0f3{wF-Q;{jVUt&9f@Vm#mi(oT*C%ta>ix_PHjrnW)&0U8e&3ooPKp~uKEg#9|2B*CH#N%LiUIx#kb+5fQJU4~(Yj~cA2hqCm zfWOrQokVX?Pw3GD3~)}@oZ8xL4Q`%Sk0sE-wuZ(cme$3n)P zVsC$B+&`3O0rs}`3heRVF@^d6rF^W7-MYZuS?J>&E`F2PJDmMn^{xPW=g@v;P4If) zgB9TJ^$FbNz5sW5HfV))~S6*9Khl=%`Wo=*4@qpgghCb*?U#^~9 zy}JeD0VWUYPv1`3`QBh+8k&l3-V4;J!N;TQcla*X`(Q{V7}5tUXHSWXnWtsmzs0*F zTt|J3sTNLDeJH@@9B0_)`lP&BuTjr^z{S4QD``x(_lCYMq@T)jgMnHDUJeHK1_OIe z@cyPq>?+Z3Ebu4)tEEt0onqSIvS`0Cjt%NJ9$*jS1ME$Fs4U)ZJUrfOJEXnLiqDsh z$~g~hfNA{i64Ri`_bh>FJwr_UIO9nrF^x20nAR5YC)+HhRg}QAiV)LGT{V3u@Fyo= zuZ|nj#Dg#m8Fz|luOj1DLwOcr+J^#6`>#=j`TwOb?JH$nVA}iWe23aaSplZ~aWT5i zy8=w>z~6X(ytfa`i(*yk_vHf(D zPh>pcEbz6p1=;U{x5LEx*-s*O#Eba zF%Iw{t}n#K0#+7@J4MF=Oghn6!ftqaj*H)$fYjjP*!ROG4-Q&H_JDsp{ zi1K)~ndAS-Y+Dh2dLc*QW#+oh#{#4SCF}m0c-=1;=f@X*UnD>E>r8&vbe^AL1yLQ3 z%F4+6y_gMOo8dlT7uTkEc76$+cIjVE-|gV59qT(P#$`L|Ps|=$I)2Lsi+=6_vgXC53h|4%9Re%tYX*?SlGxauwm15}Mt*s2xdZg&le{38~P+STAzsaiFzRU_NQ zz*aYE)u`aswTrhOb}x zLB2nP-}Cy~{cAr>;eL?geZ5|%@QW#K{evS#m(D)^(517}qzBpHcu9H%ealOGRoP>P z`sddv?$_&S$Dh*iIXYguzv0sqhJ;n*ps-H+^lRUo3+od_m&|_hp-X0`FGrZ4r*@UX zFvEX=&WpIur!YC}Hf{SV3Uj82_Ckv3JA~$VKzsGsKVIx>Bi#lgVi!PoGW%!=i z8Jd3$W%%yd-_ShFy0(2GH}sx9wn@19fs9R9j}qPS`7Kz(;BU7Nk(_NbefHovwWQN1_|xQe=Ip`e ztbIPapO|yM$xH4_eBz(O=5n%{u35_m+3R@8(+lfr?i*0t<~knbBd6`}q4()mJg`aS zrP-z&Tu$YS-W#F6<9YraC0krXHXEUMv&z#$TsD_|`ZX$F6!&Dw3toCJucbWF{K<@$ z>jKSl%(ySmo}qhVx6?g(AN*^MpX$QTFQ|Qn-mp;jl;XYo__}>@;(K z%Wf75%kd_92jf|kclFwjw%sjb5Ki}dv(mku+C9lf)!r@?mVPmfBdHzep)#;gJ4|ix z?Bn&9j&mDK>r=0C8F{?EleqTPB6n-OuS(;vvq?e@8AJT8yhj;y1gE6h1ct?^j3MRy*_VErK{3i>8Y%!^j20@R#jG4`YLOx zTvhHWPgO;gx2m$Ls;aumS5;H(s&-dKdQR=k|Gg6+W-8(pTlH z_W67@HKbwMpADq>B$SWc9? zgh4?W+l+aRp_kH6dtK9Y2mKY{uQ=y#*&=^$_;3E5_W$#r$`@*v%|FHN9QNdJMGkv& zxH5;Ua=1E&eL1WO**S8(Hnz=3T;q%-oat!LNc2Qv{USII@@@V|+Hl6wDQB$5neaz@ z4Jw56r^=<1N?ADS)TpoJzgp+2RZc#kwHW@Z4O6fK%71r^Vo9!arb31@5R0b#;i!>t zhLcXCFP_?NdZ2wV{)0bFqp_LE9FLPCav=hx|9t(#gVO(+8mjOW)zmsv`6|8DRBv6T zNmPDZBhEARh{j3gpYrbv_#=^|Gu9VQrHtTJ6#FU~Qfe9ZSBdisn?ky#>dnR&)joe< zi!+t*2aIk$^KbKqBmVA)!EP@T|F!KIad}@XnQ|tKfDuiZu{$IFWQv~0GXLHL_jlfz zFcSW7(g-?x60yE(RlGFU=fB#!@0KeUf!8GxvBb5M%OQU>7$INAK){G|O_%)4v@3Ut z2gL|RE>gJa1m(6C;j)#SK?*SBjD*Qnq`yB9qG%|~{3Pg3_d2`N;YiR41E(dRT4zr> z8elcV&{wT;-X2TSIWcM4Yd9&a{xAi5P4L=ixUZh#Y2av@IhO0!grlh&C}1Myz>uidqsEJL-DU+Su+nx2P zMC6)!a!HFx{8vlv+Sc88D>;lrj9!0)ay6FllYag{z(^)nIm_#)fKV~!=qd4%EzW2- z@(wfWEb-N?-9!=Abw^`~J_?B9?F&c!Yy*n#Epzd$Z(T>ur~wc48L4ocSRB-vx$xF*Zkuy=it20U&xO<4#EP|s<5YOhRjxLGNat3&=|C=l!Gqryq9%PYJqoi$fEyUs|h3Q%KCW!JgJnOYU}r~J)E zw96^6S=tHJUeyJI=D30id^p;}BN_QCm7iKwZd%%;oI|X2K)yu%ld0h9cp|*bpE6d* zIO{`6kEyuNSGm&Zag*xZ>7HcxKErv#^-kBE!icX{#rywu|E0?Pg?CDfDqktf%s80$`adXCHO9)bWyn6zz)3*Q_=#D+MmGxR=6u4arS+7SyyWEbh>3&kq>_4*RT(`!%as ze>Ozcb-8RBkgu!q<4>nz>{XQq)lsQ&TCAtX3|WQ0v1vp5y0-St`j+OFO(ap}E=rTG z1hFb-{z$)nJ9RXw{Z#%owq(4T;i`6`brTJ9I_sL7&8wQG#?Q)M%jWjh&F!7dx59za z_u6a4!(;NZ)bcy8AE5~*8Vj=!SD>*-nvI3D5(~8$jnw_L(cE;=qO8iXN>AO|mQC%Q zEgL)6ZQ5iSlH1RVA6)T2wH~VW3FA%Vl2)ru)O>4ocR0E_8OoHWYXaip-STrv`9mFK zA{H>4@ETvmN@q1?ia*htTt)f8Z8&w0CU-e$6u{%!ZbN2j)OeGNbdqapJhqO8FZDD; zpozt*%=p9!#h?1`>E-r%ebnZ$X7O07KS6V%HgjZ?!~ikAiUu}3y6%W~Q8fj|Iasn2G|NDA#TmApN-l`m_@u6zxR&P$yIC-@} zGmU6)b$u*on9Z0u@S_1!G}Re0?xmzF|4uQ3`nOh{Xw)_AID36L+{g6sM0%Kb!VJZx4l zca2#bu65Rj3|a$_-tStPDJIjA6jwH5AWma$BPii&N*_4rrwV9FR6n7dJ0Uq2`mCXe zi$Qa*x%oZ!MwvXTy;Iz&JgmJNtmbK(Z59Yr`|7-Nffy(dl(*W-Z1ZK-iD17|wws5C zmep4+*>0-8b1OZNKGoln9_E!(%|Fj6=ASAzZdZ1JlHOj+Do;LI{-rf&pO+Ssy%n?q z?Wv~qW{=P3b=Oq8t7wt9rlPvi?W**7Ts76+8d{dF@l?2~eeNo+tIFf6^0;XAn0|b& z3a^hAsl6VzyV_M%O^bb}nogeJor=9xeGeKvelE$m={@E6PtneAl>Duwc(W|shU-hM zpI%D0$1|^-@q|XIpgBM8OgMb})RnX999N$U1eOV*865B#PN9#L?+ ztw}>I!8G;7BO1*j*3)W7WXWNQse9Ou8KQ(m5i}S*)Z(97IA#bdPR-BiAg$;4Wv;Fz zy0w1#|Lxscf(}3Z@FMcMrj{j#Nj6Guj|RdqQ>ABw zW{rmZP0^4+navB{8m&%7HFMEWGorzk9(KuY__sBdRG#^i*HD{je_+Xa<*ZC}x+VW2 z>14=^M!WucEuKoW(b~@`hRLHwsVFo~qS?reMoOdQ^N7}yFpS1@uTdYO&`jN0Y0#V0B9S^) zR1+mz(!B@H6Z6*CT6gY7-l z)`pC4)_OA;>1e{}4bx&$f~&egs?ypIwX~c&@mO5z^C!04nDB4shG7%wLCL43W@#p9 zZ8NsLE*i{SH2T|&ty+@SK-WfShs8Xj>@Zg`>thirogF? zqKq{9x|NEg$ws5UrTbpV%Ku9BT}{O%o-z$UI~8VjN#0S$G#dUm75FWr!`3v799xoR zt|ToPNTLNwmWQiNCe!G=jYh8#$x>Rnr7D-C<@%@jfleAJ<@Q6K|E_f@wFL zQ(<8JY1X_>ZTFGNlWQ3C3o>dqVyiJ?tI%wLdjVu!gX+5-s(?;uq+>o!O zc4mtfF)ha_-DH+ats5;#9k&iGJw2SyQpD;r`!vvOV>lv~1C!I%M65UA@7rWfiI!Z{ zs5>$S!YN+KkRCfjnz_S5nYKCA<6CNY=E7Av8V=A5*(@xHbku03UMpe54a$urmO3*S zD(vZ0I3j9=Wy5E^xvxZP7*qhYTX}OG{bygish4&HjkeTwDoSkZjpqI!HHc;@>Y*h| z*_5KPLd|_jN{3vUD=9(B>x@ULT?y*kX^Uy8dh`AXZ%NJReJTkiyU`|SQW`j^?dzyr z<_<`k8^WH7E^04_Oc|!pmzg6paxjO&+P$%Gl)_Df<5XFiX<;W(mkfl%nz2>vn_O~C zGIpS#Xb~$Fk&HKQooS$9+fqYOc~1LolI3Oyn)$CelIcm-^M0w;ldMaviw5bpjY_?` z;ie}^;|dFHq5%*`PiY~Sig1eXS`A~1sbbXV=P_JQ@;1KV$Gp^&T+d@4jYK^Dp7@kr{>;XaX>3V;nPor6ttJ7Vj zQ3DwCQd^p$Od*Sf{m}}~DFsetg*=I(6sWtplLDZVii*xEua*pjdr}){Y{v2Uvf?3W zB9_{u^&9>zRQ)SFyiw6+7{TNMm&_nHbGW24b)V>2PNnKt_gtwhv=nw4y7!)1-sFUp zNxhbg#8SzPln824{;SGy9?fkCQ*T0ri#BpN*;IaS=FR`cdMb1SDe6>kRqIQ0A7K`a zSki3pHY9tOssgu3RBd>gAxWVU-O?t_rusE!F$(Uyd&xm#(m zB&TMFs!@dxo82fcbDvU}G#%l4aipK2YABsCovf#xxz`*Q$$Y{b!_pl;i7?%KM02k& z4YBDCwj}SLl1&o4kjp)xI>%08OMq@hqM@KEqXv!6OfPae&=*-plbAS-Bze+8b4A(` z<@TFKPsv!skPD;=-I+p~(%9HsbAxp5It}>gHjXChjKgGH9zXO(V%;>HqZ?tUwzAhG zZMsH+o69WJ+uCFGlA(18p2D3z* zG`cN$h&HC%NzTW4HL}{y=hi>Ix?HC; z=mtiuXq@&H#-du$B;DK<+NwFqXaoGveVQY6Kka+((;V@qH7)X4O)vj4U4KT?PtXgB z8eZ0lcfG7>`;KcxhmUJo{B*r&_;g*1EZ2+9J4@G`=j)Ei^L1_S#k!;U5?!0TM0X5c zs%sa$P1nn>(>2!(x<0g4*M?ekeOHIBoxGd4Ti4oq^r9U-y0$Z{7atDmT3J$e45W1J zrT6Lj$q(yV`5s-L{+O;E*sJRkkL#NEle**BC+P)npVA$NKBa4S?bC~P?$fod&+0`( zpVhU&1G;1StGa&lpspSHwqA7d+oa2Lq{}~&t}p7v`(MmRG z=v?9p9NNw@N71n|hj!v3hdywXLuXyXHpVr{!aYu!%a?sRBVk2v&QA0qc3aTGoA5r-c7 zm_uuL(xH#O9lI{pLQps_SfF5mf&~f|C|ICifr14J7ARPtV1a@K3Kl3>pkRT51qv1@ zSfF5mf&~_|K7YC(RXQlo&6Ezx^Sh;ka({T~ zpxm!sIw<$qmk!GP+NFbXe|_no+*e#WD9<&Q4$^uz{gn>B3BU6EROz7HcV9Yq992I~ zGW=eS-xc_k=RHaXuLQphzvcLqyM{{#uLi#zzbo;34SrYQcQt-_?VsbNC3^E0cR>$U zfN9Czyly@mLGG%+)#k5r(EOo)X4Y_yIThM)sn&QKyDQah#_vY_Zo==a=C4ydU!ct* zT3honDP$|3E0fbrazwi_(L)!mUnlzUzx-DYR^cms6x+oo^-|M( z@UO~OR}RO)5}T$Cf~B6&OC`Z+IG6;+ckZ5WK_d9*RGDsK~D72gb4Qfx7>eDD#rEeUp>^%uq`cH#ZeLW6V_9(qk;#2O+!MSqf z-v_x$ZzCAb<7pjWrO$D&(qC(o_*8pR3RdAc!OFiYN3P;i`qt*SZv`v4N{?bY_bPo| z@UJ)ymhk|UFR)6_?i?NgEB(j74JW&kPm>*1doDMc{m7$Sj)ACO7C0Y zU>5FW96;^YO%k8<@6_IdRe2iB;bE|{$CwSP^d5wqW8uHaobaY?SX^tF^eB7J!o9M0 z$<3m_s!wHLRbG8y)xWgbaBh4`|2W(~1_y)S-142vDnFggqMs^n(>AQ)KMwi-Hdggp z+aUJHWo7SD$lnbEIKj$(qc)stucvTf9PSmzH%k1u?p65ZEh1O-vl02B>W2?<R(17&t+A9CLmY!y{lF9$>m)4crH{MfcsmZ(C!@n$HA(8m)w$V52b%@_$s}% zaId%(tor+|9J#VjZg{!wRec#;qCUCyP~(Xa_|N6s_*MBEhkIqO39t(Pe~Z0x?V;Mo z@=cQextwb+cEx|SaIfsu3jW__uUvbm`Zb31=5nsRdc<7XM2@|DZQ1qte@pqwwTEio zhLPS}UaGyu|Cib;*B*G@Tq|pr@{!BA_QG@MnhWmL_-8j5#ZR+q&vV6!Tv;9r|?^_K*0h93luC+ut32A1q&1`P_RJ30tE{cEKsmO!2$&f z6f97%K*0h93luC+ut32A1q&1`P_RJ30tE{cEKsmO!2$&f6f97%K*0h93luC+ut32A z1q&1`P_RJ30{RI~7v#C|jo^AC z1SOi-pkRT51qv1@SfF5mf&~f|C|ICifr14J z7ARPtV1a@K3Kl3>pkRT51qv1@SfF5mf&~f|C|ICifr14J7ARPtV1a@K3Kl3>pkRT5 z1qv1@SfF5mf&~f|C|ICifr14J7ARPtV1a@K3Kl3>;1n(3B=`Khax*=WT|>X>+h%mC zsqfD6IX@e%o?qs3t(IO6FeuNrGqS(T^@G{hb$a|;cha$zj&?fYbnK#IA03l)yh6uv zUDGe4!$n5}9h>O5hmI&6JLuR&$6h-2(eV{JCg_-=+LC1UPc#MuG=@=(Vb#`uSyU|Fki*5@iVo}1*Kxj)cwWTxYPxOb)3q~RlOR%KR z=nKTRvjb4lNGVE2|GL?vtUbbO`qij%%n9`BxT*#j(SlBt0fS!oImyDbn5J}>_iCCJ9 zuz)BT?(Op@sT^5k>@pSNj3Kk7jDb#xGT{$%{*#ZWpR$~iW!jg1k?C|s`KxuNqmt|W z{%|TD<^qt#HinR$k(~35R`!@Kgw4dJD7ow78 z1StN_5NTp0w6ptILLVm_I;){J_rD2!zr!_7wL1I1aec_KGQMNwbkQDtAmy#yrH|{b z-Hw%m`VgJ1+_7@Uu!DYgE^`g*sh9M|L4C}z*RfL{)eq_W_1*gTxnufHeUD>I@AB5} zCohr6%H#TR{h;18uBT4w`-}JKJND{#4b13=i$W_;>PPg$jvZ6_NYRe*k{vts$YFi& z8^-hr$Ec(0B}dBJ;5}Zva^SdrOs^fKh<6;I_Gm;uxa=j}yJAIfAH~@`p-(NV4LJ`w z#vJ8i`k~^T`cTQyqA}g&iyT`vQtX>_?9vZVYJ-Ozca1xCI}Q~cDBip5B6mhiIF6pV&oQd6Il62gwQat=`q84s zz532&&OQ1Qj+csNizoEZK}Twz<7koZs2&`5gogAryB&M<@)g1I-Hyh{nBF+#C_C!t zs*RM_#v_~quJTd+NGWTx@`;i|MSQZ8VV`4IKf25{-d`TIQwT+Slx*G`Utz=#4vzf(IRqM;wRg!hXuC-DJHneb6zX z4;LNPcNLA&!8U9>Mm@rQ{bbR=4$3mh+m+*#C$8OPE62|~x@^}Oce$p?-xy{7ls;Y5 zag;LmE^lq^U6Jx#MXlvS#pHHMUwJ~GDj9QxMkt%d^pnd*Pdnj=N6JSWd-ZloJ0)>& z895sm)*BC!2IZVMZ|#mDDr7^aQ3#ED94kA>)nW7W336iEV)P6uk>1)96aX3H#By>u z={Q8H4C|!jNfJ%5u0&HshbVnhRFJ&2trSpeM|0!uWv<}vWyAXD^5D_ahxM+3$)YJL zwLAaf2q%bgd*^8*j!7!Lq|?b|hfAK&51cl7W@=I&rsB4)h` zt)|YQ2)QZ@7PD1Iy_GwcyH38D4Aa=U_k!93jy**q6wi3kzM}o7w^9;!)OM90;zY8Z zgT;r*=ScDKqUoZtvh$98z){xKJmT1|@7SYH>a)75mLjE50KGYgy8laPK)~-8;&Fi& z%NvarpfHALbQc ze%}xCS}?!ohq(vL@AYAR5X|rMVSWDq*zmZN(fTQ4Y`cOH`cYr&9-_9J*kqkhg;`pnPY!mpUB|?|Nd6e*%0nxb`g~PlES@KLDNqKSpfEccHld zvT_gpIyiEX$bSgl3w{~A?_!bviI~Hi0$)t!jJe|ykzY&9`c8uzz{8h{d?VZ+0&ju5 z)+zE2LLLEs7CZx6`4sqma7Vew_kxG668<9iiK~Ub2QGiR@UOv>;9{ybtk0g6B7ZBm@fzV9 zz*FGci8(#Ht3@6J*ZPFt2|fh=5O|6vK;%vP8)A-c=vv`tAfEwGf-kyG129P3xUPS^!L0&XN`{aV+H+<^Qga18Rs8%6$p$Pa=)1^H;B z$PYlCx=HwX@KNx~a9?t>$lpNiAje3Qpz{MTH&BUyq^G@LacoO_xaM|4={{sBi z-Xr{7@CbMsyu3@~{|^6y;N{d0u)X$!-v*uqH-cCC#eX|^Z$Q`}W_>5X_d{MA6!~tj z%MjiNKCegkyWn>440uPc$WIb;_}-B41=LTmzGL8Pz>%=X>%e9A3b%vD!4YB(Z=g@) z4?rG_3hxCEgTD$s06q+!1|J1C#Kiyaz{kNl^_#5k6LFDW2tE#WgU7du{2k!kDdElF zNpJ-0ON;zLa0mFK#GJn2Z6f~!Uzk5{VzlZ!F_$1`*pBDKUG|pr9FM%&3W_?dSCGu+^ zZ`dci4)XS=h3^6nfurC<;E#fvKP&E^BIfvpzaac&aN`$+4}oXF&w=CnMgBWt*6#%P ztn($jv9F4}f|%t;!JEOmz9#ZcaKp30eeiz*ydCo9gCgGz-tleWFT?%b3E?ToC&4Gd z7kyXc=U*WD1i_aRbNbi(gUEg0N$|~ZzxR704?%teJOKHM!y+Gs-1U9ory=hG9|pe! z{sVaL55)Z&%S4~^ekgnmG28DTxDh<_Ba!#Q{rL03?}EJc$HK$PKlp3l))z$n0{oBt zv+yh6=AQ^(K=S~Of5pED^E`oh7gZ{s_417s5{yoA&;V@OQwW-wOX0 z?n{3sTtxEB;C65td>s5BG3#^qkK%q0c=pf2H-O`>3Eut}+Bd<2y6`mkt|H;rzvFNu8d^s`a*M9JIkRLij{BH&?KT|jX9sutIm-C(o z+3SPE99|s!Y32Sbk$(g7-QXXCUm{QJ|2Vk$Y~hpOUEp&sk??21SAw0T;{F}rE^s?B z=f@=YKFHU+N!;%Qp8!7!_s(-fJ_h+-@YleH!9Rxk6W~9A_ns^M%Ptjtk6$Q!8F=&} z;cLJh7YkPtv%WjQ_2ALBihL8?M=lq>3%p{5a4+}>co5uig~%TUms~0Q5n_(d3w{>z zuD6N&`;gCqry)Obwa9-DE`Gc4c}@v$`AXp$@DtYvuO;U4F;*ws3NBwOd?(y@)C^1D7@le-wNe{2B1fO(K5|9BCE)12M;cSDWxj$al00zvZo>f9Y+)SA$)53j4t4 zbqe1Ij{Ak%!8?P(UEtEN@V&$w|H&=F4}e_};YYx6@Dt#p;4g!V`^5bZ!5!cii8(*_ zfM+3hMa8}2GKqf%Tna9WiTo|Z?7so*g?xEj40#YnC&~VUHE=*>wUuSg?sIO;U^XE z5dJoJ0{km**SkdiI(W^yg`F!zzllNN>%s8{guB2e9~9m}%=!&IB>V{E4LgPRfp>ww z1&+T*lq|4QV`t`z;pz?XtUBO<>R-0(@^&EVEi z;jQ3(;CF(Lf*%7P__Vlx92|K{cprH0XN12DZr&&SL-2~Hh5sE~{5j#X-X{9r1-=sO z8x#3Ez{@``><5Ry1K_>jo#3P3zX4zL1@ZqZcmVu7_!#&%;N@Qw_od~M-^2Tb-QXE; z8@TlEM4lw(@>=#~;dg>3!4HGAagl!!JO%zLF_*96XGH!}@GSTw+_!#Bg03kvpyy z{dR)S0zdHsk-NdQKNM~P?*X?HvwoA{1mx3`;(iBs_(#I;h5JKbUWexVXgDJBFMw0v z?}D5EN#s8U9|Hf9nB%|ed65^rUBY_;d@(W0kNsHWH-Ps|3Eu*nedT`^J{Q~pt^|+%hsZa9Upgs#H+b)B!dt-J z{}fIWv;JM+$H2p{i~P%QzlUxGA!phTz!TsX;l6}!1Y`MYkaszRPg^bemlX-W8QciI z96SxahM4tPUM%i!1|M4{oP_()(}dpzc}I!xC&8}Mg`b7{qu}SkrDurz=WyQ&E^>*! zBjB^Z9cPOB3y4|2o#1Nl5%8Vhm3+?{*<(9+06Yvn2>uE&m*3X2#r*{2gW%tQkAdIl zmiSZWi2JL-%g+^V0(<{LI1C;J4-s>GsY^uu7=#4E!8;|69fVAHlmW z6E5?JemgD~t|sRAG?#EY_z1WYywff6d*R>f5&i&p0{j`cZ>|#gmmrT+3;z-@_XN0t zn9Fy=Z6d!8@-gr_aEQL^!`a#b_xv3o<`|g2`@{S&xa4->Ps4vJ_?wXLzC+|cgS_!h z;XgpG-6ec}mFU}H2s^>0d_O3~w-Q_nt^>FCio6+I91;#GzE?O2-Vc5k_}CVa?*i|L z2!9eh27a2D?ROOX9OTmpaX$@tX;QePTGF%pUBc&qgWxsb+INe5BQb|R1df2G!0&?l z)WhQb1CZ|re+GPfm&m^g-ubBT55OyS3;!N`63ic5;`sM}NaSaNyY>iQ1wQX%!i~gS zUW4EucpBUfp7|?r{~_i6uZ2GYeggaraPeM|{}VCmvl9F=LXX;m5(_qr%UEN1qb@DR^j~@Jrwk z@V_hn;G%1x5BMBnw(qEi?{U_&w}VfBtH9^cjan?f2|NKdzzvlmzYjbG{sefmO5_vZ zk!ssOgwNk&V_pO1@2oN3O?(N(e-U^me!BzH;ze!L8sr@Br9P%<+$a;9>AO@EEuUJOO?mcm_NQ=I<%8KHmnHtP?&4E(1H(N&G&r6Fdrj z2Y4KO4|odvPVg-FufbjGCBA3Caqy49qu_rBkAu%$FZxV^J>Y5ZE#TweIGDc!$?4q< zE(L!MTn_#L*avOf91b+`a0{$&{9DI6< z#6JNp2bXUWeQpHTf_uQN;P-&Xz)yfDz~2P>+9bT6gNMP6R*8Qcd>Oc`UEHq)yTIMx z-QWkoW8hCPpGNn~JRttR37!NW15bmO-9r5rxjzoRf|&i6Jt+Pgz~$fo*avImJ^^{zLlWPcH%a{E;3}{Wd>gnCJOJ(he+(P~e+4`M{%7zI_#}83 zd~ut^KMKA9JPz&zPk;x(Q{czJGvIH4XTiS!m+X}E7PZ6P;LE|~;0CY{+ykZunauWQ z2;2dF3LF9-1`mLL4;})SZkG6m!5;7^coTRWoB~gP9|KQ;$H6n;7s0dOli-r~i2j${ ziu8kP!R6p?un)Ww+z5UW+yR~dhrquD4}h27Ch-k{SAmDYt>95`0z3}h1D*iy2Ty_j z2|NRS1w0GBphMy>d9S432QCBO4lW1xgMHwSfE&SI1b2X+1BbwW01tpmZ%6vUtH8tH zX7DKZUhp`02s{CP5X%G2k!t+fd3ji1^xK$u9pDb| zc5nzh3?2Y~89W4j9y|>Gckn3qys*SS4z2)CfH#4sz+1sH;N9R^@aMoKe<|tz0k{nO zGPoSP{9dFV{C037_$F`%I1CPfhrk2i{|h_>{x*0R{7djCxOfZF5562c0bUE90{g); z;6d;#_~YP`-ID&Vfy=-@0hfbMf_>l%Bce|u_*!rW_;zpzJOCa5e-u0f{t|c?{5*IR z{0ev+e14zAKLM@+Pl0a*&w#gqXTgtwOFk&+{}Q+i{5-fE{0i6yK0k`|gR8(D;9J2V z@HX%O_%ZMh_)Fkn@blnN@GIbP@cA*MA6x~V0^bUr0dE7(f*%8ydz7-q-Zvzj29|I48zXTozKMx)SzXBcypPxkf z!ByZX@MiD~I7NI(iAD=DlHQMiec&&HC-BL*O0Y zgW$d3S@2iEu5U!BgNLgI@r@0-gq!-7oRafUCjB!8e0v!7;ElEBZbRE&+cYTnhdn zxE1^xa2NQG;1KvEI1YaE4$*G_yc#?NZUPU31K?5cJHg}NkAf$_W8f+9H^9^2Bj6eE zufWH_v*20q8SfN*wO7SH7lKQ`UT_(B1GpUA1NMR61#SdC2JQeK0C$0Z4i14!-X;3P z!K=Un;CApJ_&)Fucm%u~{B7_s_$BZN_?&l3e4}6=cno|GcpSVFd=UH;cmg~Lo&>)F zo&vvRP~w{g-vFKgcY}|EcYtTXkAby6OMZP0Tmt?sxD@;cz;o4~E$E^rsP9~=ii0v-f^61*GyHSh@d1@IX71o$BM><2~PN$}O+X>bGhIJgsB z_8(%e`@pr}kAOqqG4O8i_rT-eUxKH>4o%a}*6DUtkAzQ6BXKGHE6=-LYO*n$<#1;X_vUaqhu@jQ^cY%J z{ymbzAI{;w&f&*%__H}okGW)p|HmADGZkpLL>WPU-W;aelC$K29DZjG59jdy9R5ZQ zKcB-t$>Cq-@XI;;ryPDghfgcY*8lUxn)XFH_S5lqbbN`9FVk^=j<3@3H9DT9;~*Vh zr-R@3_Dwnt(eW)hzD>t>=%ClbYTu>fAL#fV9f#@oJ{>=xh)({%idj-S)<3p$R`@k=`ReRIF2V}_33 z(81~X0v!vbX`HS_&+s$POVeDSCrnJJMX=so#uN*|Hr+5H|M3Ph4=9m-pBj@ z)cbf7sZ_W@-b+lcgWjG@8GUyc0|6s0?>$ae`sg*!Tj^cB0fXNcZ93>oSGuYzwa!KT zRxRY$TjipcBroQ-irmbP*IQNXUV>lmLVjyJF1o&GyxBUZf_M0nNh1Mkcx#prLYBn> zv4n9)pFfa@CCO~nOYl#Rcv(|U8qmA8`E}nE06pHcXbRZP0+#d9qd<%MUC?sgni?}r zcn@_}IjE}8I-}vf1|zV^=xIte`;)2q?SV)*(6F6e|4fo~tonL-AGJyCT#(46DK)mv z57Ap$W2S!rNmV6TZy`T5?iw@A7C$-pR#BbpGdowRa-_*Dn^)QCFY z=`HWu{3+v(V7ND&N~Tlc2o)8#kMdGnHTA_Kd0bYJK1&FWj6_MQ3kK^${=}`~hfkAv zf_8J23&i5vHyC|$CU93*QtLs1)r*A6CBIL+&a7w>nzhn-sPN4hlg=zfiW;Q#{*)id zv-+x_Y@4$(zwq7&N(^)6u)41ym4dNI#GlAy!yUq8%nC}zoC~Zp%^#;X^atBg^mPELmgXz< z*QR^uh5b1`Yp58T((LP=N-;-!tX{&Xk43kc@8DlgR&Ml1gAwX1xMV7gJwD0}di#7+ zG-S{V{QceY9Z*#K-GFR=Uan&1i}$myd#bo8hz47FIL2&Q1+}*c^`L#OSG^+CUbjxf<>%hxR+?q<^`Ufhi$zxLrg-NHJAF!`%}Cuy-J`us#u^?+H+mw?^>tA%hH3ISTd*NSZms6{Wt~1w(ir!j=YpTikP|p%X1rH9WDdO^zb(yrCcaf`sP1}JW&>zBF z?rM${B1uKA10JEprGca5BhERe>^qs&4tdNL(jTGEh0N*eHromFBK6GKX`ulfl~SwB zW${>3O}UniCX8M(t&!mIrlrxVa95Ik{GF0HFBKI$ileXHB<2sbd=;iOvo)^paPiFv z#Ova^5Q|&Fb#vR)=TB_8G2!2Cz0Oq}vnJJ4d1`oQj_k~}Dc53%<}5iEpu5^f2FY@e zu}_1P1hXgEM1?h+qz|~zu#-BL2ASE_MT42E3k{$vsy(DxZm!WtmD(ci*OI+a>dB-B zqi@_;x-d^QXOyuu8RniN(<)QHL!~?!q5+1bL#e3doQWF!ZN}DC|Mp1CAKV<356Vz1 z8`2T86Ew#>E!&I)eHy4=;zz$~N;diFlQQNAuqk7KO}TZ!UBjbalu?R}im8f;nw(~H zn1S+MQSGI)TRLGny+fK)rK=@fHS|IUq`-QWJ4%0gz-;u}_?t@RJjdd~$NHH1oBf`t zKbssK#X^3(9tIUoVb6cxym}_EZ5t*0m}HfQ8}z!>8j)|Cg6{*jqpdP=1L0nR3flk^LVKA z1ZXgB1XA^}NX#-|sqlEYm9w_G73O#}Xynw^3ZC$)K)8uWuJzM6!4gdcPo%iBv0QU; z2G0x2%Uym}SQal{p3T@bMqVEICX7C#uX}z=Rp~K>W}EHGZ4tzyDU%jqo(t{%x>z#>G6MBBiJfQ~NLnY8pzS`EhVtm9Ij2UECp1F`^(T zEA1xHvSgIElDeqsr(zpv5T8m=8A+xR?M(D*YRxkwYHz4aWzQ{XPFdrlQcm4yERotA z4Vkm1pqY0$HIGf348{6Q*#;Wl&Yl3{b*u9uHRqlS zwT+(Y3Nm|uDn|pYREC!0yF`(jK;jQ(#W0gc5`r%J8!6{p(-6qw%dqZ+#pi< zXf*tBn(64@iecgTAUA>j zelw5ew5oQyDOet0Z!!&Ik$8Bl(v9gs9gitndgz;hmeF3d+eJw-Th8pZhQ_vJYWZrN zEK?-d@-mEUGe2gB%X9I0Y4wveq^51I>!udT4Bn<;=HIj^z}4ti%Xzp3pir%N2S!wN~|2#jK>7Wl>yRrWS_uFb%=IgAq;B_Ycj5 zRau|U8Sqw8tAH|LnW<1Kr3&J_&YM?e%rb;Ew7Nvr45G5yoRiPXdb6$1?q@f~>Jt35 zN6Zc~Cw2jw0}Bp9YAP?@QI)18Dzk$jbGg(GG&%P%jG#1 zzb(|$noWTjQB#nnS{c>m*~D#*oM;QiSV!&CT)v{oHhV5(s~D6T2ivW`9> zZ7I&8h1<;?Y)_KfH`*Nu^VYzMX7uy!3?-IqIo}B{wPvQq*-=;XK!6O8y+UK{QFGl>jl{-Rwxp7jr07kn=c>T_ zL@eVfn=3QdO<1^)RjYVYK(b0TZ21=2^Xv!EbT$xbr%!Pse*P*q)xk;+PuM61RKgUE zhv(YEx$!6U$mDLWQilAQyx>zasO-&k3e(cyv!nI?gvy+ZA6~AX3za@i?Q&N^L*=G| zmljCkuCAbYmuYk*^74$9M6`_T%@y%Jb21d}Np0Yrr7Uk1EF=9g%Za?=sk&bkw#V#T z=Bfs{&vYnrbte%^ZJHN4m4tr7zlA#G3Qs>Z%WZ}cq@hff4qk2@NcGJ**J&M1QajHK zT+mt3+?1NzVbnjQsB4P`!+wesVbVq{ArC~ThApAlrzF~pt}LNvES(9RC(uhD!p*mg zQde2t%L9seRd8;`<92ba$eL%Frp*3N8Cap%BVX8)*f>%ww>@Vh8!yKtgpz}lX@G5FwnkW36LGv9{@D?bQhR=ksE1)mmpS?OMwT4|?Ym;v2chr_B(=T;;G)%+1SMG4lqm1r>Mm z{GWoh9rmkYvV;aAU*D4%Tvi*Cc}levDdZ5!VzmChcE&Uv5-U^0~?KT;r!DBSbX z-hW9K(I6)@H`Ot^FU3zoa9YR{VW2M<;aghL+#FI=bHiknV{=-Xe$BBSTR-Cyw{uwx zmR%l~kmWo9rU^zWooo(oG1@{#gllYS-Po~W==PAx0rOJ$rpSkQwf=S z(HtPxzeU%4bK~j?bFo*ZzH=>)Oq{FT+$E7(%23&NVZQb*E`rabCEz8Ow7Se=4OK<+-rTb-E?kAxZ1pG(@Ml zYNmUe>$Iw*k($>a^BSkE9~%7e{e!d~+7bxx_NVGL=fdShK@NjPMhi))+L>zEh{;HK zwXWowaLA07EX${GCEqo-n8xP)QJGDtoUWQ@z4pne;zle_da8KEe4sC~j`n-wswi4* zMWJUGIU%exn8ihPY1-~m-DV5f8;Nz#Q`9Guh0J|>mbE!cH_iD+ zDGh{ZxVlhs&HE~7Z!sMSZc5J|8k#q~FKMi6-a8woRjm1$;jZF^4Eq8?H!@KRVKpPW zt*MNMX*j}nkmV@}?kdhNS_W1&%U%CnLW8%25o*2x6|a8ENMM0s5-({)lQiX%oB8Lp zn^})jn5Bm@j~2bT$K{S~?m>iXAy0a(7R#3MbURP6vutB$`{PY+@|XRPL3CSY=!QL( zEKk(Ko1W%|J(=nHf@3^O4HwIqq0zu7X<(&Vwbqt4LCxs1TRoe+of|jMC@{b7XnidG zLXtZ^+Ku4*An87Wwz$7vRST6f)wqWub87;1f& zHEnOq>0{ctUfuH_pv5TesOd*7*C-8TO_ROH%=S?nk$1Whj#7iEE`*coGUG+MULANCmEXZ)hVm|E2VPmt8wKA^li$H&N>(rCfbR~> z8wD>GEcttpG1k{`@=7QG)@`u55=tW#Crs(2v zESeHt1#AcB&7S)t@ZS#k*XjOMFTG!o+ zRx}zJ(ddzH-jc-(niXYjajScTJbW)J>wD9Uftv1`?vSUUBHA9@ys5hV#_d~u{<==| z0k(4Qq7D{|fp4$Ks{(KFy0-jH*e}`N;S5H zD>iM5wzT_hQ3kP*B2hL{l<)eD6$$^^8rpxjcgwnPYkc7Lx?rR?lVm$F^s*DHeC(^J zzoqq#n(n6Nx~5phJ~=;Pl26We1?QD7lDWKrp3gt;E9I3hVt;pSj|SNCdf8ozO{;NW+PTr%1)eLGc_3rwpUcN z2m9`8+tRjvZKA)ybtAoY`6gx5EwiClFHezJ8jWmDIXvS>(@**!=)JDwv znEAx{6U`6a=a*_(ZQ|yAy*z>Q z4u2l8YIbY_S3@Q{asG6h50&MKoNgY@tDJk0Omp*lrt*ca1_d_iyVa_P{puh}jlBby z*WLjYtWExYnMd){2C`PE-qd5hXoQnsx5ftr?8GRxc4FAaPK+vJCsu8kt(=v!KHN`F z5+g?Y)i4xSdk2e#0Ih99P?go*0gP(z0A{s!u$Yo+PH7v08jsmKSWHPZ_qGjz?>69~ zW$$3IWb$3~c|+g_&hk1~Oum>M`PP=a5xDtrv_)JjW(Rr*aiKNi*D+sC5%hdeG8%~{olUGxOQShZL{cxux+F$$2QAq`K3sdjbD^*yG1pq zWhX|=c4C!NHmgqXZ8v9y;&$Ri0#|Leop-g3Vk<{Ew3Dlr)K;zvqD|seD{AY1k>vAj zTV^$|315w_?ZQ`+IXk&(q3z^q)5KQ3$dZ%VQnB^FNcz-fiJgD7RbnegLu4yoB>&Z{ z&({AU~a(!snMTqQ4sb+l9|>D9IN- zztShKd=dNe^V|9SXNLZE3cC5Jqx>N(Qbgh3W`$5S;5K44ezg;$_}ht*dOI;17dtV^ zo{d;Fjdo(>teqGcYbVZcHMQts=NqNgPMqIrYCqY|cYdp(G}w5~A9Mcf%AXx-p~WU* z)e+c<^XHb@8M5=8KetpTVdp!4veg=ejc+w0wp*V=IkOWZyX?fsFFP?bw-LiCHq!ht z=Z_dg&?aOQ6dS1;(%OjCCb6A3zdhA9j-BuP$xWmwJC?R@7?x4N;$#<#ky#!j3+VQOq@=R1Ff z@=H0mU$^s}zpSZ7$;P+3Pti_{*49p(zmBOj96R6nt)@2N?R@9Ani@~r`OaS))CRtd zZ?%7KC(d6D)KJ^bcm9N_#dbU2`HO=ZrrY>dqjWoQ{^Fo+E3osO-z@5;13TXsD%pwi zTaBN($y15=^=tXW`AdtM8`!9(rUrK6{AN+R4tBotCrsUeYv((E!ZP<+*m%!ON^Ir% z8;H!D#nylRCL*(!Ve3DCsc`d4*Yo5%Ju9||d=dLCGK6ufv9O)~YM;eczKDGm8*{2v zHQVqPNxxcEv-7{m7|pF#760$jt^^*+t&LBXEKyXHr7mtMSu!)$B)hSVZHAE2Fk{9x zwy`I<%1u-^N;_GuWR0Xkiz)Y}g~V73DNCEZMYivKhvA*ijQM`QkDuZ^|L2_docEdY zKIgpW`9Ey+IoJ>5?G0Of4&%dE)Uws*U_TuEKse(dAlv#m*bfI!5zbh3v#X!6>&RBl zVSE?|71`=@7#|MKD4c`431_@(V%I(ge{|tZ6kGk}A1ZLht|wc44)X^GrxeaOw8gG| z#$uSQeEA15oN?-lt^V@Q9y(Xwa`Phx&lb*DP_u1+`SIgmzTn$TYpi)FK)yxVi&xb! zRHtAucy%=&FBHZ&Qrq2`=(YerV=b|^M()AdI7e-qniC3cVQ;NLz!)qd)NRAHfOGvg zKfH&#nK>!Q(=^i9R09n`Agsw`lE1x&g$>GD3vLn&4@8?gLfX*A`9zYPoa{7%34};3 z18om?bs+H=Dr~V0l(~ro(#TQ6#MaSL%frsgDJ(D&IH108m4-k_8rp-PWfiGu3&;3* zMurEP1_VMb0f*BJ_x7{)H8Dcs?Oi+_ED$b4GNb_$Q%?u=NCOj_ATMJSC6uJ@K}6d^ z6(l{u@17xq9XY7Vtx;mY0kwOQWLmN;9 z-#~>>JOH{j3XTkBw4?{`&vO(4f!#ol={;iy0OvxYDT<-DK;i==PyqyntOUTPmxu*` zOLRcL!;`_|!Jxun&_K9_fYTZtpuz!i8R2a~%BDF6j74^%MJTxP1;eI6PB(xgV`*LB z6thThu~bgaTI3GoA+VXdYfB=N>EzbS1GZ3nL$`qZ#O#a)0$9#^Ah6}k2m)Kqo*=Mg z3=4u{Z8Z?UvgQN9aj+u@l8r$@5v(l>ieO`65Xk>*Oc0&_{qqJ&0q(CB|jfSUo3)6q%p=)ZxSw{wh3WDht%r3eo896=8P zysZR~k^y+60NK?>=I|=AAvD5)bZ`euL>Hzu5*yzwzm@f&0GL?Yd9a9McJUhr- zvIIjLL&5`q#2p}g8DtQ^M+1SCfIe<41PFE-;5vv^O<+X}Q-+g`?3UGI!b%C3aEKr(E zC^`oM3lzW@45^FGX3heo&5UB*MXbAMS{WP zOY2f&9xo(F8^{91Y!gVzI4m0sWf$`qe4)2nG{W1O8euU$h=5 z;{wWLU|c*f7#HvjgB=8ZoaW`$FrJQ^GF&jB`M;O{j~kIR4_E;Cq+hLOV~Qoyui0o zMZMGGXLpk9osOja7Or_Cx#y>539g`ZnCwtH_0{gskNZjL7rSLzPT5$t1n>Md=(@+| z0(H1n&Em*fPeEUqu7etRr^J&+29hG@GR#w6T z(K}6hq7zcS{I&Vq=$-Q8xT?SIK5UZ2Uf5nLkeN~B4-aY$N-U8ok0IyfPSzERq?IOd z52086t$4(hx>Zj^&ahu^T7lN`JosoX?PPjMv(}Vd--b-l-51cp-dWLYYi#mg{xb^8 z+%ZE8w@&1r5_z+WulS1All^%y@ll6$bd=6TsUStAehD?G4(c7Z^1f{#P+9gz&gLSL zWZwB7Hur~{`?V$SZEjC+{8paYB)ztJWDKrLx)yJ+R}youS3FmUW^QZB75gTpSvvCP zC4a>O+@uRgKDoYYGg=sVg-0#7UDAtPx8|j&8K#hgxkdec>W9h9zD+qHt^KI7(q<^D zJmzE^^73xo`vdWh+s{X?t$1{dXZ_dE!cV)tHuvx!5vQ#>(ZBzFz33jw245Wlfp+ZR zF+x%6QzWIU(J4q`SBWe-Al^IibFcfOXiBv-JdX>p%7C4bxtE^jwBF2C37}*qcXHUqTQ1c4`=rw|&6{c~hfjrsN=;o-# z?t8N*_hpVW(`tg(ZX-WKG)S&f_St-g%ws`7ji1OBQeA(e_T`2{mQ69OmUl1-femG? zM@BwL>~JwZdSC3DPyQ(S_SrSQkNFcbExQSPqSZy6!w%h^s}bJ$aq0hdTE^;3yLV`m z?G|aQC1pH$Tzd08RzNvLp$OP!9|<&&5eWo-ZVbqK5R?7%OnND*$&gJ@V>{DUAS~mT$$O3BIu76{f|6tWjPc>T8p< zwv2);lVUN{WTL%cN#S=%B_{!zQ>QZF5xF6Pn{R(d0HN`X18=Ba)gir_PMNz}Zk`HU z(_<0eY!jc)42Tq7iB+==mXOHnxATsEknK1co4PeRYv0iA+WW>8~B9yivcjoDT#en=7d_y+6poHwyGE&d1bHH}=_{85)`*xhNzy z>4%=nmODC)E4}TzW3S(X-N&x-Z$3?v>_wkc95gY7rIV}9=sC9i!2H`2G&(@)5-&#S zo~}O8@O_Vaqoe3BhNh9Z_DcREnZCX}@pRNhDs}QVU#*Mz|FnDm)XiS~+{9=oix$>< zHRfNBQpwE0Q(DSVgf}f0$J_CD2H-|HJo2xFfu(3z|HU!+o3di@1xiApaTjtUg|lj4OCb=p|O^~Wn zCuZcQM~_m61@oPCW6x^#tsDxger0v9++BDjpV&~ylgRT)C}hz}f%%a1+ zCMV>N*2%SuXf=g!k$W#Sl_yu2PS@cJV+u;0{Qvpr`G}{bp}~jC#))_KP}!l#W9|17 z%@UNZPycYdG#u%wFSMpcXS{SZDb_AK>pOaQOHG_`bB1c4v}9Jb^RrERg3kJLsZdw? z{3)3Bx%t|NTiE5S=L1J}RvFyA?bisIPDOeZIZ!?MC%o z>D-NFuI;daQ|Gsb*xH*kTOIfwAG(pIvI_NblV6FS>z{{T>1 z*jHR&bK_cFfU20Il&5u96kZ0sR-DXt9V>?OcgHkK4ObdxSj&aY%pOz_&o8PB<>_`7 zM{lo`82&ivxt&X7q_fqK%7?N$Ph9;#8qPK-lHvFySw~> zKS$LUt#@hBbw~b4)h(zz)>W!H&_>MWmpl2stfgajftIQ;#-Y8SS+Su+@=FE9Fh6a4 zUu?h8xl}s^=WT&)@wSdl$Y|Ac<9mo1+}q#d*GLO_DIKj4%8BxOe77pa5m_5~F0ij7 zE-gB0Rz2ur_?iy!%j+|dzqu=pXnBQhN>qNJzsIfj+4yOS=hly#wz-#9R)oBsXmjaO zYeb@&DEN)574KCJYUP@J@HdgGe}EYXvrhEY81y7h2~LO~KYlURDR@Qp@qIorD~6Lb zwjI6hKf8hY%6WBQZmYnC*z2c0-ObK!4V/dev/null) + if [ $? -eq 0 ]; then + echo "✓ $decimals decimaler: $result" + else + echo "✗ $decimals decimaler misslyckades" + fi +done \ No newline at end of file diff --git a/objective-c/src/print_hej.m b/objective-c/src/print_hej.m new file mode 100644 index 0000000..d04572d --- /dev/null +++ b/objective-c/src/print_hej.m @@ -0,0 +1,124 @@ +// Pi calculation using Machin's formula +// pi/4 = 4*arctan(1/5) - arctan(1/239) + +#import +#include + +// Calculate arctan(1/x) using Taylor series with arbitrary precision +// arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... +void arctan(mpz_t result, unsigned long x, unsigned long decimals) { + mpz_t scale, term, x_squared, temp; + mpz_init(scale); + mpz_init(term); + mpz_init(x_squared); + mpz_init(temp); + + // scale = 10^(decimals + 10) + mpz_ui_pow_ui(scale, 10, decimals + 10); + + // x_squared = x * x + mpz_ui_pow_ui(x_squared, x, 2); + + // term = scale / x + mpz_fdiv_q_ui(term, scale, x); + + // result = 0 + mpz_set_ui(result, 0); + + int sign = 1; + unsigned long n = 1; + + while (mpz_cmp_ui(term, 0) > 0) { + // result += sign * term / n + mpz_fdiv_q_ui(temp, term, n); + if (sign > 0) { + mpz_add(result, result, temp); + } else { + mpz_sub(result, result, temp); + } + + // term = term / x² + mpz_fdiv_q(term, term, x_squared); + + n += 2; + sign = -sign; + } + + mpz_clear(scale); + mpz_clear(term); + mpz_clear(x_squared); + mpz_clear(temp); +} + +// Calculate pi using Machin's formula +NSString* calculatePi(int decimals) { + if (decimals < 1) { + decimals = 100; + } + + mpz_t arctan5, arctan239, pi; + mpz_init(arctan5); + mpz_init(arctan239); + mpz_init(pi); + + // Machin's formula: pi/4 = 4*arctan(1/5) - arctan(1/239) + arctan(arctan5, 5, decimals); + arctan(arctan239, 239, decimals); + + // pi = 16*arctan(1/5) - 4*arctan(1/239) + mpz_mul_ui(arctan5, arctan5, 16); + mpz_mul_ui(arctan239, arctan239, 4); + mpz_sub(pi, arctan5, arctan239); + + // Convert to string + char* piStr = mpz_get_str(NULL, 10, pi); + NSString* result = [NSString stringWithUTF8String:piStr]; + free(piStr); + + // Format output + if (decimals == 0) { + return @"3"; + } + + // Pad with zeros if needed + NSString* padded = result; + if ([result length] < decimals + 1) { + NSUInteger zerosNeeded = decimals + 1 - [result length]; + padded = [@"0" stringByPaddingToLength:zerosNeeded withString:@"0" startingAtIndex:0]; + padded = [padded stringByAppendingString:result]; + } + + // Insert decimal point + NSString* beforeDecimal = [padded substringWithRange:NSMakeRange(0, 1)]; + NSString* afterDecimal = [padded substringWithRange:NSMakeRange(1, [padded length] - 1)]; + + // Pad or truncate to desired length + if ([afterDecimal length] < decimals) { + afterDecimal = [afterDecimal stringByPaddingToLength:decimals withString:@"0" startingAtIndex:0]; + } else { + afterDecimal = [afterDecimal substringWithRange:NSMakeRange(0, decimals)]; + } + + mpz_clear(arctan5); + mpz_clear(arctan239); + mpz_clear(pi); + + return [NSString stringWithFormat:@"%@.%@", beforeDecimal, afterDecimal]; +} + +int main(int argc, const char* argv[]) { + @autoreleasepool { + int decimals = 100; + + if (argc > 1) { + decimals = atoi(argv[1]); + if (decimals < 1) { + decimals = 100; + } + } + + NSString* pi = calculatePi(decimals); + printf("%s\n", [pi UTF8String]); + } + return 0; +} \ No newline at end of file diff --git a/odin/cmd/build.sh b/odin/cmd/build.sh new file mode 100755 index 0000000..94a9250 --- /dev/null +++ b/odin/cmd/build.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Odin Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Odin Build ===" +echo "" + +# Kompilera Odin-programmet +cd src +odin build print_hej.odin -file -out:../bin/print_hej + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/odin/cmd/test.sh b/odin/cmd/test.sh new file mode 100755 index 0000000..321bf16 --- /dev/null +++ b/odin/cmd/test.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Odin Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Odin Pi-beräkning Unit Tester ===" +echo "" + +# Kompilera och kör pi_test +cd src +odin build pi_test.odin -file -o:../bin/pi_test +if [ $? -eq 0 ]; then + ../bin/pi_test + exit $? +else + echo "✗ Kompilering av tester misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/odin/src/pi_test.odin b/odin/src/pi_test.odin new file mode 100644 index 0000000..a960172 --- /dev/null +++ b/odin/src/pi_test.odin @@ -0,0 +1,77 @@ +package pi_test + +import "core:os" +import "core:fmt" +import "core:strings" +import "core:testing" + +SCRIPT_PATH :: "/Users/einand/Code/test/odin/print_hej" + +run_script :: proc(args: []string) -> string { + cmd: strings.Builder + strings.init_builder(&cmd) + defer strings.free_builder(&cmd) + + strings.write_string(&cmd, SCRIPT_PATH) + for arg in args { + strings.write_byte(&cmd, ' ') + strings.write_string(&cmd, arg) + } + + process := os.create_process(strings.to_string(cmd)) + defer os.destroy_process(process) + + output := os.read_entire_file_from_process(process) + defer free(output.data) + + // Remove trailing newline + result := string(output.data[:]) + if len(result) > 0 && result[len(result)-1] == '\n' { + result = result[:len(result)-1] + } + + return result +} + +@test "10 decimals" +{ + result := run_script([]string{"10"}) + expected := "3.1415926535" + testing.expect(result == expected) +} + +@test "5 decimals" +{ + result := run_script([]string{"5"}) + expected := "3.14159" + testing.expect(result == expected) +} + +@test "1 decimal" +{ + result := run_script([]string{"1"}) + expected := "3.1" + testing.expect(result == expected) +} + +@test "100 decimals" +{ + result := run_script([]string{"100"}) + expected := "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + testing.expect(result == expected) +} + +@test "default 100 decimals" +{ + result := run_script([]string{}) + expected := "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + testing.expect(result == expected) +} + +@test "10000 decimals" +{ + result := run_script([]string{"10000"}) + // Check length: "3." + 10000 digits = 10002 characters + testing.expect(len(result) == 10002) + testing.expect(strings.has_prefix(result, "3.14159")) +} \ No newline at end of file diff --git a/odin/src/print_hej.odin b/odin/src/print_hej.odin new file mode 100644 index 0000000..9f78006 --- /dev/null +++ b/odin/src/print_hej.odin @@ -0,0 +1,228 @@ +package main + +import "core:fmt" +import "core:os" +import "core:strings" +import "core:strconv" + +// Simple BigInt implementation using base 10^9 +BigInt :: struct { + digits: [dynamic]u64, +} + +big_int_init :: proc(value: u64) -> BigInt { + result: BigInt + if value == 0 { + append(&result.digits, 0) + } else { + append(&result.digits, value) + } + return result +} + +big_int_add :: proc(a: ^BigInt, b: BigInt) { + carry: u64 = 0 + max_len := max(len(a.digits), len(b.digits)) + + for i in 0.. 0 { + append(&a.digits, carry) + } +} + +big_int_sub :: proc(a: ^BigInt, b: BigInt) { + borrow: i64 = 0 + + for i in 0.. 1 && a.digits[len(a.digits) - 1] == 0 { + pop(&a.digits) + } +} + +big_int_mul :: proc(a: BigInt, b: u64) -> BigInt { + result: BigInt + resize(&result.digits, len(a.digits)) + + carry: u64 = 0 + for i in 0.. 0 { + append(&result.digits, carry) + } + + return result +} + +big_int_div :: proc(a: BigInt, divisor: u64) -> BigInt { + result: BigInt + resize(&result.digits, len(a.digits)) + + remainder: u64 = 0 + for i in 0.. 1 && result.digits[len(result.digits) - 1] == 0 { + pop(&result.digits) + } + + return result +} + +big_int_is_zero :: proc(a: BigInt) -> bool { + return len(a.digits) == 1 && a.digits[0] == 0 +} + +big_int_to_string :: proc(a: BigInt) -> string { + // Build string using dynamic array of bytes + result_bytes: [dynamic]u8 + + // Print digits from most significant to least significant + for i in 0.. BigInt { + result := big_int_init(1) + for i in 0.. BigInt { + // Use base 10^9 for efficiency + num_digits := (decimals + 10) / 9 + 10 + + result := big_int_init(0) + term := big_int_init(1) + + // Initialize term = 10^(decimals+10) / x + for i in 0..<(decimals + 10) { + temp := big_int_mul(term, 10) + term = temp + } + term = big_int_div(term, x) + + x_squared := x * x + n: int = 0 + + for !big_int_is_zero(term) && n < decimals * 2 { + divisor := u64(2 * n + 1) + contrib := big_int_div(term, divisor) + + if n % 2 == 0 { + big_int_add(&result, contrib) + } else { + big_int_sub(&result, contrib) + } + + term = big_int_div(term, x_squared) + n += 1 + } + + return result +} + +calculate_pi :: proc(decimals: int) -> string { + atan1_5 := arctan(5, decimals) + atan1_239 := arctan(239, decimals) + + // pi = 16*arctan(1/5) - 4*arctan(1/239) + pi16 := big_int_mul(atan1_5, 16) + pi4 := big_int_mul(atan1_239, 4) + big_int_sub(&pi16, pi4) + + pi_str := big_int_to_string(pi16) + + // Format with decimal point using dynamic array of bytes + result_bytes: [dynamic]u8 + + // First digit before decimal point + if len(pi_str) > 0 { + append(&result_bytes, pi_str[0]) + } else { + append(&result_bytes, '3') + } + append(&result_bytes, '.') + + // Remaining digits after decimal point + for i in 1..<(len(pi_str)) { + if i <= decimals { + append(&result_bytes, pi_str[i]) + } + } + + // Pad with zeros if needed + for i in len(pi_str)..<(decimals + 1) { + append(&result_bytes, '0') + } + + return string(result_bytes[:]) +} + +main :: proc() { + decimals: int = 100 + + if len(os.args) > 1 { + val, ok := strconv.parse_int(os.args[1]) + if ok { + decimals = int(val) + } + } + + pi := calculate_pi(decimals) + fmt.println(pi) +} \ No newline at end of file diff --git a/odin/src/test_string.odin b/odin/src/test_string.odin new file mode 100644 index 0000000..0b3346d --- /dev/null +++ b/odin/src/test_string.odin @@ -0,0 +1,27 @@ +package main + +import "core:fmt" +import "core:strings" + +main :: proc() { + // Test string building + builder: strings.Builder + strings.builder_init(&builder, context.temp_allocator) + + // Test 1: Using fmt.sbprintf + fmt.sbprintf(&builder, "{}", 123) + fmt.sbprintf(&builder, "{:09}", 456) + + result := strings.to_string(builder) + fmt.println("Result:", result) + + // Test 2: Using append to dynamic array + bytes: [dynamic]u8 + append(&bytes, 51) // 3 + append(&bytes, 46) // . + append(&bytes, 49) // 1 + append(&bytes, 52) // 4 + + str := string(bytes[:]) + fmt.println("String from bytes:", str) +} diff --git a/odin/test_string b/odin/test_string new file mode 100755 index 0000000000000000000000000000000000000000..497e639f635626b0926e7a4b324e8f8fa2858cef GIT binary patch literal 429224 zcmeFa4SZGgo#%gUZbEJdF$ScmA_j;w31~AkwP_Z!xi?oDFk(icOFPtwlv<#vW-;wh zCS?hvF1E3Qx7gudSr?V*^0Y2GPRF_HI)Y4BEVa}+9jA3V-aG*3-phmF&giL4^M8MS z=bW3H2ej?ldCmXzpS)hb+;e^p-{0r^@caHA&pF3`apqT3EGuB~mqVCFSTo78?(Ke5 zQP$;z#e}xD-;Xpc`h!KwS`<6_&lDaVHSSJy{+^6&ZMQD^Z`Qpoz1x<#`E~Ci^$3jlX>0q^-Rsxh{n@s)cYm&f zw6XNQ{Hjau%N_vTXX6_~j`DY|Y5UwgEAP6~O&Lq?jRBWlGrbW9QV-yx6BuouU@`Sb35K7HD4ZJ%BF#g$%O zeq6bY+*>}qkQc{&HlJBJ%_Z$&%{_On{A}AFt-ME8JdWN`7vEyPAotny)ZVlIGW0&v zX&S{?dW$`Jf8{eo;cR-@IuPBqHjj{3$yj>UOD;aYeJNWuJ!3;&S^bRoqnno8+`Q<9 zC9buRGRd{KL&~K;S%hWnz2E$pv}{@*wXAO0o$~z^2{qpRUj-&viz{5a{2-}6nm@^U zQ3aPwvMN7jS=hhz`vm=!dtp22e@PfCOOwg_cgNyM7G%f$T|&$(f|_sjmpbpM{=(YN zRDX8E7e33q{$>z_BN%V~%L708cc0$(dfN~0Ie+k1A0ciQfol1?!m@I&FxN(Qp$ob5 zh;{ih8LUe96P-18xcB~l)%$UR(pzpMDI;CD5@^PzdAH8qrD zebnHs4##cqB-fL+E6OkVbl=SHs+_t+GxfEEouRH}`+nJR%RXcfI}~jDI~)Fz^Tk8h zNmqoO)8%33Oj+1DJ0tAe9I%|Fd6siif#oz8STqx_abI|}Wl@w7+D z8CmophyGIJ3~z(*bpoDF!jHj^43fwrMg3{&KTZ8-O2H8<*nbxJ+dYYQkxhwp{!qZW)u$brX`R0#FYA6b>65bV=UV4yg{)g| zLHC2m!A3vH{IHW)&F>28Zv#L2=tmd3bF2qe9mhmh4hReTO( zr}hf+Vq<;P6XcBsUQVD(qo;i8si3}K+5RN9k;F!l*h&(c(QkoeJx~>y71OlVmZ!*n{7;hNA&voAWvAL0fpR-=s&&V8!ke*moazhq@N; z1CNXAhy|{ked1r(gsY!ARk!gS;CmEXo829Zy%@wdaG&i*{@|*>gF{`7v}Mbs7aT21 zBS%k$1$nYha7lLHvDMxrKhh=3ak2}JmR%wUMsW6na{w6*LPK~5p)&w3zrCb_$OxGx zWh2N^K2*MR7&)dI!p@E0NFmPz*G6v@&_#~@6=A1Q{tqmD!bG~Uf8iBQ?8l;g$zP9_ z;fOCEB(Ho+g7W=FN1k0tC(!qOOL{9%B_H>wy={}5q7GVSP%9s2V*Po z%fpV{!fy+|loj0)g3%2!l^^^(blRblZUS=@I!(}_?Is&2w-A0Ckln(t^QZDf9u4&m zmAP+g7;%{mjmeZRfR22m{7%kPZ>hl^3Ozuq~w|RLMyj#xIUfn6l9z63%&&E)N zZ&ck%OKl1}SCc*%v>bya-@{U!g$0|D|BxTa>2a|LM+Z34vbp?hEQP%{1`5+Y7Rf=j zEdI}^~k8|O~}^M zi;Yf_=w<+!3?S11WQly{r8WiXk`>fl4y}r?vHgKE(y`k?+VM^Jo}_#La!aAR6lJA{ z1m#9>F4+e*x6Stiz?hfuA^l};f74&actHA*T&PQawSU;E8>XHl?aij{B)r)0;`^pG zmtjMs4|OeqzSsVbt~?=F6+dw7R;y`A6f@=@4j>8>l(chaA>&+_|lrR9xIV~}}kK6*$XW6>Gv z`VWk4Zo?nu8QF+llKRyzXVYX-aBH#b6WvMHDKIq#!ga}BFl<8}z363I*x83J67NO# z)e)@t$XgkUUgq0F3i@g2r+bjYR_OLXcPn*vQO_py(S?0%3OoNW(|XX1aGR&!Ht-s~ zxMQ2lc=LsDeCK@DY z(LAqS@<_h9*r@#93GPqiGcMkP56`jQFn)NU=MNi@$3o=M5OyB>LHDwrobF}SUDkuA zgJ8*r&NTQ$j*?${UG@-5uHYn{(DBtdaZ$KiXn^M4uOD#@p043*P}2;{%vGUS>mUN#Ls{ul>TVE9~s? z`I!95o6P;{ROuSstt-gFm&|i%WMfJex^aiHaD|G(>)s8M_?28}=kt7=!@(eayl|iT zn9Mw>){1MMWaLu|E_9nh$7%T$uYDwG6Lwop-LPzocB1hwG))=Pk3@;Xp5RCQp^>$0 z#q;;_7n}E#bHoX!twEf3%%hroH>JPn1(0%tKwx`{3Q^>TiA98WTT!ME&sOkvEN)A$N7&~`1yE<-l(W%9LvpSEPKX-Dd7Z2Wg5srq=klCpY`;lyWxZ zml#{GaQs2pZ#*DtNLrzBC$jYB%<;>r_EXvqZsOAdAjAbs}H-J2}7SV?eG+&TSXfD%V3SG)-TGVkrDjjgFX_o21PkKdR3_QyZu%c^WiZY6FriO>3_j;0u1*Hg_n&~t=tF!W8_i|>F|OLV z^f=V@`;5(6nESfxPQyX9>HK~D`OriT@_VX(KzjA~^L>zA16{Bin*@XAk3Rj3jj%S* zXk8j>ME;sTYOI>kBV}ZV{@m9e?+$e};d{Js^zR7Is^1n*k307mE1&*s`Jivp&d|5U zDMmi%JcZ7awWQ&@{Q29TfkS2ckcHMW?D>?bCRA`uoAc%P*AwA|ru^o3`DM*RqM9d6 zqitQb?*#M)p*ui5{nV%RRrw0j7E~v7r_gB{ou;>gcZcPqcL;ys{uFxC81Qs(^8VB4 zF}aPpdle|RP4Q*>Pj6-IuZOUS&_!5J=!8ZGW!tH*BkUyF$-kO%tH80Ew!13qy!1=j zW*c#Bw1GV9$w02#AEvRI$2+M&A#dGilUG{VD1q>#h4)tEzFckKR@y)-ZNQzMB*9_kDA3dT<{`B)%ofPZV?C46iNl+6;ePo0sjzM;`dHJ04U&X!`$R@FP#gg1u=Eug2+V z>bN0L*sFCM)p4>EyiL%ILbC~)QRdlS*}SaB^Sj@IuEri3gGg4AnLA(e{4YAtn#upQ z%o?DBt@-2Ju`**#?`3~2%Gi_m3=+yISHakae$|A9R@{sS`Bgs6drf}%cJOOFq%mp8 zUq7ec9W|eUKlRO-`3!XZ^4LyHYi63ytYHomVh%)K=cYqj^IMY_dHG|E#s1jW#Dy=| ztiAYSA=+V_^@6zOQSff)m^k81oKIV2ha%gxt~ZY{?u`L!D&d|`$=4oIorBIVRq$f62bEImz&-WnE|Z zQQz*xYt9*Bt26ZSq?qz8CZEzwKI&5cl*EQ@?70seCD75gW?Q4zD|=LDz|?st$NCY& z@|al*r5~Nced7aH#C}r1IEwNwa$mKwEH*1(Io9kzY&P|oJpb#8*blPvZ1(a*a$*rb z&*>{-N62#&8lgwaViq)px+1J`xO0Tz9{H}z@Lkgl7L)IASu7Or^oOq4a{H)wOGJY) zjiW-BxcfO;57nLyYoqah{vhj@w2y!OXZl{|5n9Vlu#O_0&XFcQUUSnNlSbZ?UKzhm zt&wRxGL+}q(ee04 zyx50^tp|mFsOvU-(5>+9`XFELM*erqiiIq#vo`#lFe|^W*O1mX;nml#X#?Dc3as<^ zIy0{jfATq#^ShT-ZJfN5Ib`o<>Yp9Xjpesk4_?4N6Xfw_C%Nr||50n$QR`*Zfo(ky zTFDwD_A?9?*^lffGhfQ;Zw8bO7TI6+`kWa{AUFA}6uzXjn9H(qN^O}#@~?ZLLW|0K3*)`OUTV(+eOp{uk{ zXQg$M#@6{|N7eQyTg$cTSH8{(^4VU#YqRpTPLR*&9D3|YXXt%?f_(RR^w>ww4` zmCuZM7ov-;_^->!Ka>2mYbVduY) zU-LPQE6twMHVZn3>icRB)d%vr>#cxni2H^^_5IO9^#e_Z>Vwm}>vKxF>jOok7j)N; z@5@*(DfIe{Li~0EYb7(;(|wk85Z1;rwjR_PZ_vztC5!KaMQwp|2M=m*Iay9w&4IIg z{ZLnwv8}g;>y0H((N46^f1;Saf^q|;@)PiZztCLD@XOp?b(}<&C*arY@6dkaPZ(>& z6ZjMxc_fg3A9L&e2Iwq=9`Zebe9fLyHNVI-8MI=R0n0f>zw@7$cyk2gY}O0%kTq#T zU0GwuBRMZK4>0v3>$rW;isNV2g}rf_;_x@?6716oqq%1tDSTjLY#p|@A{ssC#QH+GrTC(g6?(8un!;+#gfEX10e zt{2O8i8nZRqnka19pu|iU)+ozJL1ke3{7M?j^;M-5 zJM=mTtI4+tnzXx7G_jL$G~39#!likiXmV|65^rd(fL@5J#t zaji#;qDk8uN3)u|^Ie)D?VoeKSTu<@H0MLFnovQ$a%fJ=qFGEl_NlSMDBCO}?+llw zX;WO^Cz`|?nlmU@MkpoUG-%T9eVp0rB`5F`T8kXOC-x)bKH9hTVnyQwyy1W3hnSnw z-)UUZNk6wPwUPltIpEd|*0iIjJTB?JeCzpq**1?XQdZeat{D{<4NX<{f;V z>L-7S{Fyr8^WEwlJ|cfVX-kPW()y=h$NpSc+7`UGo}{@H;^jH^o-SATHd0J`f(hkfW&>tlundeypE@+oLM ztq?YSy8RTt$l2J&L4FSq_7HXx$U~oSUVDj##xCR>^w!x_4xOAJ&mi%G=*IAWVrC4# z>&~NhfMG}2No;3+JBfW{)^VTdL{IoTt&{aNGk#*f=ki|-@6Z@5)0Uv;*E_&CR{NKW z^S!eGT<0<;9ISEc&eT~B-d?X>+K%=XwXdlC#Vyp0JmN=~U-y2|vy*b{20xU75AE5c zpnHSp&Zpmor<2u|gU>f>1=>f{eqt0oYhCnlXq=Hgu!GYz*e2~ERSQqh3I&Q-BP~jw zMwTgLne=3tS*O?p%`WuP1^=70PVq_R2+LWgnB?xGf#)>;yet?-8%X z@H!1%OFdrYgMJ-eS3`3Zysm=R)#G_JHq`{}s7IH!ks2en&*ypTJ8jTf0j(9#Y8y}M zmmPnN?FX1^O@7&550lUA$4>gtuc-@tnYGOt@V5l;69MWbG)0^wHj|9qUz06nCev1S0`^F#GEfI7ccJ9mb?2~l6FfhKqDb2y>=a_NJUiArFSL&B| zVUsVnr!~?y5X#6qLqXRg_laJ{yxSP_ZfDH9<52zJ&O`Mlb{(o;#Mt)+#=cR;zKx81 zBaD&5jFFT1&+NCM?1FH-k2!5{df>rXx!zp8BJ3;}8r~s364<@n8i^;D6W%XgngWa$0`bId`phxB zoS<%vljZ-@;QM?Ld$J{5@50u1qW@iB+DZBjaBZhw-9dZUP8sQH8*#n#x2%vYYiZj^3Y3$%M`aX@mPow|S=wIj8G~YM2g8a<5=`Aa+@m3P~>0FbI z4ApmQOrW(vtzB!)vhi(vC-Ogy{B_Rt1Q<;Jj-950)_$#DrL|`{gWuKI>M8|YgRKn= zE3nlzY;^^3%Smfxez%;ysnwK^EeX(ewdd>Y5o_G$uZ3{-C!XAe&j)kzb!7OO0&%Ys zvgR_j=C$yn^LEL%NbBNyA#@gE7Y*{Wqu0^tr!wP=6Uc|Q!n_rn@UQu;_JfSP;Z1!; z3SM`b+mi4Ps4sXW2CshUve55oIwU> zo7tN{o^NzE)}3G9SeNK(tn1s{tUZP>=R1*Q2pX|aOcOaYX$YvW@ zu&us^+`7cV+`99%xpi;U#9r0}GX38?zs;h9xIY)oK1ZstpZbuyrUf1hXU<`9{ucj|tp|U8ES!VVFXbv{ zvSu`!Yxrkg<``Pj(SNz(2xY`!hgswACsu{?V{zJ|Xe6+aOx{xRV!Mou*t0id^(R(Y zq1bE4nKsP)Tmc?BE&64Cr@3>sY+hJ5GJ7OOmcpnr``EGO1~zkpz5ZDr>eV>GkEh*z z)Rgh!B@cfM%3?n1Uu(^nbt|_`$&DM^T6LO((gtFcB~~nn z&P=z^XHtG*9ge*Hs0qbuTiGv`W5qMdsXdRP&|W zecAg$S|3Y@7Cueu;m@$IIXpG+V92u8Wy?Uauau6_PqHQ)=R89^$=sTGj+tK%b=|-? z*qhHFYfe9zIdXPi1)a7M*V;HT|G{=N&P>sk z(@prITG}@4`z&qvTnlLpIgY(B$2nJ<wM)(>(+D)XLxd~CvJ?C zvIk&Yx@5zFztTAYD^SMyokn9LQ~Y(bvPNWeLp)Wh0Iizbc&d!w8M$%0Fo(HdqtjR1 z=nMy^jvn7Zr@-2~Y%+Uqp(ok1$|rBd4e>ts>CbO;4x*n#5T1jL4z}cuWw}0@^Y+sj zA2U3`ICeM~x8DhxF^(C(a&3GJ@y2%EiN=$|1hCp*<@uz`GW6b=fZkisd()+N6kF4^ zp+~%-_a?O78lk7PYGGzP;kJp1W#s2wk^+N8$~S$Kdby2#@weJUs`NXQ1;MSY89m z>*KKufJOE*O7E|d-`D%A5of;i{z|~HUx|$9o$FD0KRy8uyQq6-mfpEGJP>bq*a`k! zBRq`K`>_e=?SS6)EWLAW=n-$|ZHLy55qd`N;CxrTZwtngz0f@Z&qt8a3*%*!@%_&P z9Q(O|YeUa5hhxrtpuk(3=6;k6pLX*ZIX)9{`k#(CCrXgxQ_y%y^FQnSP5wH!Y~bJo z{I-E>MHatY8-9s5{H}o4wh?|Ow1F1*YlhBl_}dMCd&cuO2%bUw>q&Ufn3(mECqm9u zF?%PN^vuDo0P~>;^Pz~7^Re#CS+6huN6s9~zz>#TL-3e6>x7JKWR--jFq!jAUfcU~ zt<6kitJUC~56a zRrb*dKb;fUN5=#_y$+Vw-1PzD2e~#p5pQt3*2vhM@NPUEho@uESp`q4;A!=Eo(93A z@%l;l&^Z+B;{jtID?IyX!#>)uj};N;v5$|~#~U3ZXHsnV%-DzYCjCJ-+dj-aaxnIS zUd6-X7qgdx;64EER&ck1d--_Wj1|oO_Zsi)?`+c#(AHWekmW9D?Q~^nYy8W#ktOj) zmOGK-uJ@4THZb)NEb9u@C-L&zpYlQgq&cJQ}d!eD|54{~2K2{FBx? zo-Mo8)Ghz8a01NhsjJh)Z2AbU4QAp^xlZt|AHkgIQ)?%n)d8*cEL-B*&?4T@YKKn8 z2rUygQ9EwSi6>V;Yd$iVj|{5E%Rs!!Cr{YMS}5O4`EtsaQ@&z+c{4Z5XD;Tg6(qKD z-9y+!7`q;&e(cDk*qz9keM)!yEP1|)9gm$09b^u5z+HIyBoT@p}S{1U3*ivd1iI;r`Q+Y zMZTTT-Wk@|pYb!eX$P#A@yon$$C&-GYG}{TS|8)u=!AHq6V}$!!LXB@ABm@`Bk{Dx z)8N&Z*U;NOhF%5q%CqQkZRini=!sT2v?>T?@HT_|y~oO zfvldurjJwZSk|5;*M?u>#c%RhIG#Elrf;N8WXVoz@ReiR#|zLpl0}PaLyLGLyCd-N z0^vFGJwp)96<}Tg=C<*e{pa@vu!FJZXa~@PU5MO@2~p(4Jk89-nur(O2I3YHY6&&W zrK(AvZ{cr{|9tW=|I%E)KNyI8f~VMY-csvK+2@W^=<784It?xD6Z-punSGa1XiTHb zG|HB0T`T)6g!S^M{Xg((ew^8p6UJi7D^R{5{Ox5+I``;VteraVWcoOh9)?fqfY*`v zvd$KV_L=7bDwxlL!{~}~dS=b8K*r*Ky~X?v>>3>Y;-)6d-7Y;-Ctn|m$+xx^(;vrax~9IAS>B+a|!PmD01s^=daX1 zgMe&P!^3af*jFCYz2@{f->tR0c?Hyy2Oa9kUI+2dIsVN*@pPaSj%Us~YJH^8v#G*x z99kPfOD~%ms^{#@<>Aq1Z{960&ozxYr}J)k^L~T8vwwrUCBH%5s^1{*g3)<1YaB;D z_Ocz#H~Y!#ySwX{)4J<5X0xV0U!N%Tu1mOPEz`soan0JMxh~+E^?P%j$2IHu-MLna z*7mJDepwSWZ5_SZuTCO-!n6_P4{e?uvyV-3?ki;cbbJ#1-zVt*K4JD3dw4z~^c6jy z9GVyE?p}71UyUWTH~P7|+;L)G>7ja^-AYV5R4?1RadUAjb!3t=nX;)DCON4ipKwyo z@%!8-I4>QJpMT}LSZaMy+}!7})_R2dPVc@T96$FI_Z{ASQ8<2fH}~z{eMvZeW;^$* zz5D6m_~{<*S9$lB)30=L-{#(jXW}PUT^CEND2mVe`Ih?r^-G_f^UZM4oGsy{{4SkC z+?=03Uq9!kTk2>1g!Im(&*qSxLpr}p=MXpNC#1hj`b(sDEPb{=7B1@F9A3)r(mBM< zd5QEFN&g<{?Mt71p7iHQ=XdEG;^ush^uwe-OZw`i&pt-_W2E!DbPjQIo+Uj_`gciR zwe;C7q;Dae-=%YioAX`LpCtWp(%Y6k`x(+dLpr}p=MXpNankpZ{vFa+EPb|-^hVP8 zT{?%jIo~1u(Jl3}A12SY3Ev{bw$vxFfn*R{$R`A`hv7WlFTor#QXRA3$#aI^BD|Sr ze3<>#A~Po6zrh>ZqVGQTgc8~tVvlH`jJ=^5hw5`TZ>bM%+)|&jVN1RBr7iWB{`C3! z{Fk4vpY-DM^?8S%ufKHNmiqj=w$x8ryQMzwPSWF~KS}yN(jO&#CF!@5{wdOLBmH60 zzfJnLNRN?z3+YQqUqbq#E%mt(>Z_-|I_kTQd+G~PUk>$I)R((}^lM44B7H9D)EA__ z9O|>EFLyTSGfBUk^yviZv%dQ1%~lC<)El5)i+Xd4w$uj-NYCS!{@0A#&*i$ZId=p7 zg7?hZE$&!V^J~){-dW__u=)A==(^|Y8&^JGAGziE`WuEe*Cz&UaQaT&;6$Cx_5H8i z;0(NegVXp=o9hQ(xxqQ{>J3ih{O02j5cgJqx~7;9Cv8 zIQUk8uMK?P1z#)pmV@s}@HK<4Mfm2#!jB8z>{xi8@bUYd_rNzFeAVE46iknUZy)%+ z!!@=Y#eN&H(Fk^E@YRFwTJX&TUlI5o246Y&D!}(`@XY{U8Th^hzG>hq1z!w&h2Sd| zzFD#GH-xV&7XF&>@q6!k;7bQtqYOHc&0zWl_`U|dd%319M6vfqY&wF?8hjhTw-$V# z0^btwZIt~*vA?Jj-5~pmVt-Mm@k_G5DE1e1BI{&-QS2`YzN=#4yM%9MEWB3u_`UNz z@Eri(LGY~v(_P?O3%)zK-T=O};QJK#mU#H;z*hyn%fVLwzT0Jg;M)VfPs#qkw+no? z$^O8%1AMp0{=m0Q_^!m$3EzxZc!}`wyXZaewS%t%d=W4$1>X|zE#kTkd{yAXA4Cc~ zd|v|Jo#49-e2c(WFZ%=EYVg&`{=nA;zUyRv;9Cy91+qWzwFuu8vGBFRcX=#aC4BtO zeGh!|!B-8w*FnVtpO)1JB0r`g#Y7O{!i^!_UFq_{!i^!_9yxM9DKXM zw+DPb1>a8a?E>FVz_%TIJHYoc_@T~;j(k%Zs7kuh})qmVB`vcz| z@O?`52fkh4yG`~7KGxVHx5)m$$J*}c;1v9y@D<|!gpc1v?}4u!d>!D6fN3fCmVj>& z*LC2V3qJL~e*f_$<@gb=|&dF{=nBFe3S8i z!dHO*6Fz?Dz6Ud$q9(&HjA13}a;$I^kJ!RqpfmrfY;$I~m-R1n0aqL$g zyE&5{A^jE7Um+deob&RS^v$FnC;d3-_#QK!&MtqL^kbwSBb~ODb9hYoKu#?A0_iW1 zPP@yAk4fh_!sHRskC2XCKSTO6q~jNJ9vzb&2*#36 zlm0a6w`9pBLi|(2KSeygKx6z-a@kD!LDCPBj;-f>YfSoK(hrb+fb>PA$Ht@wa$`F0 z#B(W*70Irb_}#?sCcZu^elzjAh~GtgT~_>I;&&3illbeh;sbdxt+gh15Wj%>e>$fA z2o`_PmRuslcM{)8JU(>1 zUPCBnEnzfYStogB?UuMp1 zzeyflGk5;TFNaHqk9=&@d5z&7_uYCrU)5L0T4yomSf;VYT*|u24EF2FINwqZeROEn zL(#Qa|HBsSYRj3$`fg&C74HjL^ZHhMzwN9yc35$<$HJPB@jcaHcYV8pwd=A&_32e% z@`U53+rx3rXvfc#b0(&YGchy5&Ksp+=lrxVSjbx#b_Vka=y3pD4@M8w_oI{Z=&iru zQ2iUo`5ZdvTX?AcEHXQTTobj2I2($ut>!G~eEe?(p@y@g_&Ui>&wpyIppQ7~%Gr0D zbnXMU{$9&0tKzDh@T{xO1gFdkhwr%Rk(rZjw*KtW>Rhg^+zZs{=_r9YE8tXBM03FZoTGr!ymNgYFOTW1hEC8QwuKQ5l;w)h$0TYi8i)Su=x#JVHL9fKW&%A`}x!2-67D38jR~ z2{Q;Y31v51OI%qQKH+gPwh}7({zH{ZJR75~5H{hjquSSbd;Y|iEwW4~SOgyIB*{EN zdy56|I+?huOL)g=q2)|M&b(LdM^&4zj%iP^ppLw}Ga*^cb-l&-D(nR6c|Pqr&RNrc z9s$Du{ipUaYOv3<*iRaJ(Q_?&-m9PfazOoL6uSk-6y)E%_U!eKY&dZJ6zWYM3B}UQ zmU9W$k8C)5eP9W`|Nhx`-?8DpUtdJr>8C=m(@mChKhKHje&vQU*UzGzn||lYM=$A{ zW)11S@cO_d`YpOXcu9MpXr6nWXW}loKL3(~flIu&0xz!clE=NcORg_6ahG0Se8~?3 zm(FVs6wgzd==5^NcRpi~DMl`dwQpR1Xv5=%?_%g5+HfvQ9&Y?a^q-YY&zeU&VWoZX_+R zAvL-kw77hSyml~|c7TsFHb41#w;dGH4sHq*dU0+$D7?P#65bJN;tIWXP((YB?S}$W z<|$2d@Q-!&Q;X}8PcO!27R*aNB-!Yp{S?w`e2^fPx`1>LL%;2ZWXxI6LOq8#?c%-4oYy=;oP70H?__Kh zbp3GwZE@Dx)b)vG_-tnW;kCg;Q+It|6a9F0|C2wu-4&R2S76#xf!FRP)9&VbZL#2b zx7|&q-SKWnuPwU$&lK7n??R)!70y$d+F5qHy3ceN?|s*ctm6?8rmUVCtDMANxO? zeK+jc?_C)E{1@_a+wcn`-zLd^_pps#eff?%&xHOB-$wTy9dv-6%vsl8i%t)CJR6ez z*q)tCsB6-FEZMqFpy$l{+Je#z??duzQ}Zx`k+MnjDjy^JO!3@X3R}=v-1snTWU=4A z$&)0%e4b7Geg53U*oAvW!uEJH^EvV+D6>8<@Sy6_^-%UZmX5gZDAv1NPf(}EtbOP* zfgT62?|y9CU___M3hgmZ#aZF-=uSl{k37IuZFpq?1;LN|6dqP3z@Td&r0g~Se<{Y%wx_Q z06+C-zi;>?^$d7+sk4)MW+Ks`u~*st6SRR7v;d9R_8G`TI0i zAD}%aXwSUA#I$GAUT7maM`+fGXjlH(;7ohM#*cdanA?6v-ZOlXHZ!R5_!*mg3EF~b zJNO5^E5L6%dcWl<&KCF6b_Trmli>RuiQ#bFMDHy=fqxa=J`b<|?E6@}S~rj{NZ0&^ zxWRkE$Br-bv77IkfL%UrJocbz_Y>mo$>*8SQBH~Ed~86of7E@L>9vBe^5} zi?Hkj|1R-hxw3p0?C)CF4(i%IQkU@|tUqV^GS#)6dUpJJb@|V5XuQ$qe}_&sEM3ho zeXZLU%dg1J3cml4-l1y7C#9CdXAdu%WzG6qom)oV=9^Q}HDlf)Q8u>)Kk= z*4lPsY4r$7ES~K_57qRgHDKNjrdn^@ zUIriVr#6%ZtDfu8`_|52cY6PP8hfzOVG3C#ky{dZY2J}UW_o7F^fkyOiCj!y^BnIZ z#BM_u8|zcwsJ_M_s}p4)pw1Xej!Mc^(d(C)GA+7aDtocz48P`YGjMJ3RW7Y(xM`PKLo#*IrcGVgwyBHzB(|=)QvSPUNYfaWxL$XCMEjJims8hX zuP!^EJw4XsMN9Ac_hqB!3dgMrsf~dvMVS=sFG*X}yk7XTzdaZB>KAS07pClV|6SNR zJL7-jPw$z?zPGdMLWgRr(#GT&p`jaI37z@MD>iwJ zoQRiiQ<`0Yti5;L+wujZS!yxwYP873tTRdj% zHuyVVyS*n{XJ$Q$eR_S%Kn5q;%%V|ERx4<;kCTv!A0r)6^NzH#fX} z_4lezZ4KT}QD3$Vx$mjFY}EJ0I4e-i^Q%Mj{|{JC-Y~@4)sQ(qfUZrP&J@MIXqzaC)c3nAkGBWZU&D-|i_lwoN=jn%;Aby!M-K6GZded5)3k==P)U zzbUWI0%YgaySMc`vA$iL9dC3coYb4zZZT&>f4#Jmt%M$3!^c)v_L+7;yy1~}oe%W& zV*C3a+ubszT{O@xwq@OO)*`{#Go3lhvC6;( zbmpy}GZU7#|Cg9gJZFux_ZG4~bX90(_!X^3Y8)gPrCNL+@7W`Kr-)Az&mN|}!woZK6ns$jE{+rt6C_Q-X@*;Y;Z=4?1{*reL4vpx6`zCC+IXuMK zp&|6}Vf@pF6H#lZFG}3+em}|eNxtmMsB;FP0Za=C!muzr)ZZX%vo2xp^}`AF)DyMb z?_KcWjO^vhec9JsME1o0Rm;H-^}M zkq@r){gz*b_bBW9u585nj!xRN{pG)gZOCtd?`Pl}>laM_TgaG(F@ibsROtC6`cpGL z(7M0Z2Wy>Ju|)$E0aaAsJ+R0p*On$`|8*efiwy z_mS#PNb~#1#0=UMZ7tLG@tx`;N45QbA^SV(jbnVj=#M9SeoXsAHZQ9EjpE&Fe;4E3 z*R#jF=@-k8uNh-8?!Xq_vu@cRbtgUh^D*hXhA-naW9!L2*YNAqAseC&-Wy~p|buQh!7uVmPDOMhr<}Aj_8V^dR+865OdQ>0R zMfvrV@5JUi2<^J2EH?ibedlMh%6>&7!5i7q+FDBeArpMdx0{r4n!yc>JR zzt}DC4*x0WnsH#W#kk*<*CXEkonQZKzkb<0_1oEYPkB8LARTNOTbDof^Xtj#W5?DJ z^6QY@Q-|!{w-f0z!J0v~4f@|1$lgcQeuvS0F_`eDn$M(zg!#~`w)iEknl##s=5}f; zHf=^{_VkX91Z}2|wqtA>d+wjcIs;?Ga^Anm`}FV8{_?1A1ZZzK=+#L*W*w>!+SILi znZW`E^&9dl_xby@CT?WT=KCAXtIV8_vijbXKhM(lj5GVkM@H{Qn|EP?Rp$nVeg47i z*O}?pOk8*a@n)X5#>b-g0%Y#vR(nQ%1_$&schvdb%z20-BWDYI{xn}+Jo3KU{pL&o zGUgnxS+B{K8GGSoU-?O7YTh@)xY^80RIkT}e6jek(T5v{PSAtaq=eHyqmfNFV-Hz! z|7~z_rse&`6&?9*tN6{l&slZ`f95<&E%v8=zs7Qs$kN7MwI(3{YJ4$vXM6pj=0Rh> zN2K zv`+72v;!88Mpb6ctJ__qbw%q!hlA_1c74=8x30KApjG>3`tEHr=Q!Hk@7`V!+E_O2 z#*y#fUSYl|;nkIVjk5)Ts>vyS_koW!i^=%Zd3wj785h$pYEM&po1?I*z5;8i`DU1| zH|A#Q&aO*qjY*zub@{j^7RsyYEzr7bUbrs#7W;eeXpay14L5?{{oe4JY#;q!681NWp5IlMreu-&r(&et{?Ee$@>oRr1|lq==XT^o1h3R+UId*#QXQb~-EQEf;82Z9r0RHC!ga{aO)@5T)5@&Np zVM6S!9(KlZX3vuG(I_1Wdy$9Tw-aG60^8EdTJ=qoYp|8CVH;J(R(h`x_LRO&3;rtj zyPq_|Jyj*W$dl(Sz>~3&s1;wMxnl+Om&04dnEJ(A5xj9Gi|-GO=Z(0F@>cHg#`rG5 z+@X(g`6%AR2lf}b?vnTB175!YACFJK$AmnBE5qY7?^}TM>Hd5m8;8EJktnvFRr_ZC z@@!(8^{kCtSwD~C590dvB;6-;FUrwA;@I-KFZk~&*ZsBDg46!_*B)pNSQ`=p;f?52DQs_@_CaJ{rd$u@da}xa(GHBq zXs6X)KJH?d%zatqStXL8crbhj>qcu`p(nqPwdKcqAN-#eLNgCt(0-`NqxsC{13Ap7J6eZ-!UVuA-o|}H?0-iJRgkh&Imtig=SyHc+_0;T)?x| ztl3u`^X+T~*k=}eMEQ-(C||I#nDUY@zK(d&$c%A)UJAYTQAi!Mm71}9`1xjdyv%?X z_&Pc^Uohuop0niLzMh`YhuMSI90LD}{p@EvWX^rD=3PA;boV%I{D+y>Gw;=Uq+N@? zhBj?C`|r$wwXdr2^9pyRe z%0TG*)Vn{${6T9Gl>zq*y4ISsW|AV0Fp6KL@h!^BY_KK4RyA~VyT;f_@d@thNc$*3 z=RdWcs%Ibd3}nea@(m642M-3OJhWu)%MaPXl6iKpa^6|`>ot@Q&Hmv-qQ92359j>x zh02oq9y$weXY-i{!ta8dob%@bm;55M;7=Z^BAoj`_p&zvm!^*gihg$g+#fwuM46XL z?tkcf@X~qbgA3**pud3n7R)(B*(v+)FNr;LsYl~}%0EuvS--FI+!3L0zvP-?Js=g- z^GB2S`}`QYgO7s1fBI&qV99>*DBVdnRe9Evq3iB@$k&%Ilgfgl+pC5exBE2gosqix z0+p`c@Z?sRr#z97JPk%~CDNPf)c3o2Rx-ZV$bL#Y>nQV@FAslHGFLtK|I}KicV0{x zioA0F+?O7zn$6k7z?A(Vem@`h;|sD8o$p(W9NPmq=R*s=j@)=2$kUVI%kx1zpNuaJ zOih8I;8%N=RoybV5M9hmt`5g5ms&O0aGdptIJ~R94f%GiwW$f)2QpGU(&wo5!FeT} z0m!ru+Jf4I)^@bkviSY7bH-xto1KF#3AT)#gIDWV89OIU&p7{o*3LbCj6J|d#?Fmy z;GMXPoqPJSJ(+lR{z_(TZ$*}!`*~bDAIUSu&SzlfzMtBMtzQ$EoR-}-2SPtHXUCy) zboLJ(`WiO91Y3Tb>vP!s8^P*%=V>WETG&W8<$k@1NtJu1E?!aGrv91j9TL0}4z83~Nm}}Ov1K=1{r@s#F%{l+C_=VR5d#yU_{F3Qgvz~_w29axF zW=-qYsVB3imQUXq4D-GYPp!MdjUi>36lHxa5CgTBES{L&ojp2ti66&uFH(XvQeR)!psV)4ld#0me0X7S9Kc*r3*T z?ErMDt}$b28~>v*HhrAgFKeWZ#_odHlL_m=;huozUG6xv7(dZw#W`OaH)G!Ax+bob zU-hL!fpv@hJwp@ET)Q<=$9Hb)QuxSpTcl3&;M4G%E)LYC3Ilb?eDVYXb^g4T`rN+K z&?{RP^5;F!3vHa#8p^xkBYX#^F1d<131h*^>Gadf$JcX{>Vc>9ajPzM%&OzPdUedL z>Ubc(o0A!w zQ(8j>GYrm@?!l=wrX|--s!4)X*bVL#<8gmMxbdy&ZQ$+&_f~NCfLneQ|C+&V>Y3Ua zD!OufJ&UH8dQ^9&Uh2x!+cv)5`&BRYm~NroX6kLC-YE5AL+1HuPcO2Ep{~4)|1$hz zYf1c4(i@8pBlje}Sp8d)wqV1LkN?@9;QtG0AJk<-+t?lRKIS3V=pxQ&d*3(o`ybEt zQrKQfYd0FZG0yVm6vhs*A8g3jvRO-mmi8RAABX+dC9~R|#xzOrFfTLm6t4dVOy*fN za2ZU{PcYUT)jwpv=c&chdkePD`<)UzQ}ws_d7JytOl#dC-)40`+gf*rzn-A`xz@UF z|2t~BuOh#Ho0ysodA7o94?5l&cD_cQn4f0}dAhtjo5<5eo=st=n>_dVd2S<5r+)bW8^7Gt9o>g9+)#O=4p4DMT^YFX;JR8Wf!pqY} zo)zS23p<}CkIs=8-tQ$(tCwdvd0NS{JnXcRXNB@ezN~@hjQJYhS4w6v$~E(RiR95j zxn|0>gq=l{yU8!NnR0vB^ACAvn4wj`J5Z`vk7e98Pwxz39oVb|SCxESXPu`e8(1q{ zNKhT$p$_KHM&=FFv5-0%!p=3+;rjHPnEC_OY&q*-IeGYXyP>g8-;fy0$1X+VNoZiV zvj0jwUnM)Pg%-BjSIhG-mvt{&g)I&+Z`s%CeGi2;W^wjS_0WcBkI==B4Ah3>&D51H zx12@Pm0GB}CeItB?fC7*U+a7fy5AB#+LTSZ7QGKbPiKD;$YCp`P zSY}M=y)(hir~PzT=!CUcWNUkSESxEbTc-TTv#N@_-TMx4Up40#qLI4OP4p?v^erus zIWhZL`(01RMRtfDvXz7{Wj2-$mm}P&@ ze~@SVcxQ|FH{U$Lp7pMks#{%K)Of_k1{w2#d2-sfGtIS({-mo4WLSgVjD4nC*w@W<$68s>@Gw4cW21Z(OLF*^3W@q^C55A+ECY+XR%mYHGBNjVdM{O`9SuXj31Ow z^v585Jac5hi^H!lSS8)@EAbP$4o&xbd%oF^`lx7y*<2@Wr92cf_!k>=gePp5aOUgJ%Scf6RVI zN9O&B!LpY*AMWzr1kaosO1>V<)O&Pny{`lvQ}3%mC&70o`uOg|PU;;Fmc_E)U1+}^ zHU6exGk&iDKCY8YX$w)V@8Wkq-&v00_u=QpCqF#yJIm^u649Bl5OV|hvQPgX+VBBr z9*jE4-9g9RL;c?OCc3CUnn(Y-kUAo)iSNE-gX#|zAw&Gbiy!{xkE=r8xlr)IV;8D^ zc;N!;4(YHzwx-{zdiWbZ-goWp3ol;t^9yUQ_&+B74#qU}E9%#u2)&5BcY1v9qF%mj z(YGt=+)llf$^(rhyYKyRvh>d{B>(i#g|$C^)6nRqjtq^TLSuW-?c;YqgKuK=@lA}I zprL1bGx^StuNVHL+im3Idl`LvFQbusMdV9GZ?CH?>Rz_*lI~?UGM3P{zi%T={2IH( zk6QTVKccTPcGPrxoxPg9NnekwEux2Y34g6$_w0KLtG-z|P5g-GqK`603wmQTaP)v< zYt)%VT^X#Glc&qevxz)i-{VQ@WSUo`9c5ol}8##%UwGur@l17u{cs7rq^0#y%a?-%kA$ccgZW{<+@~nl3VqGDms75la?7L6 z4<;y=Pq}TrTzq?mcjkV^uiSx*{@%l7bagMZn}fV(1KKUnZiaSC)cLMxOaIK7k9uV} zXJuq|2l_9BuMGc>LL=(&-vo^)G@7E$pLzAP3lBD?Hns0#y+2<2j|VR7JMsL5eX$d6 zd-3ckL+^3uE%bEW0KJ9KYlu1zKu`M^VR+ahe9+9c+oPWCwD@v644oRU?bSl320FD- z=RZ;Q6MmkT$-}o-4FA>SnNObTsPiTA)cbNQ!517rZwKIEBA(`BtM{MxGhuDT_KQ$diEX0k6%?8e6B@Qwe3Kd3=;ob{b_%Y5!i? z|3cZR6P24yxk3+DG35#=R~&Wzy;tr}D3|M%vkF*WdUbPs=yG^{3SL!jJ>`R*9`Y$4 zqjGmM##F}VFR{)a_I)jJh3H}Oboy8@hGsHuIhEt2(m77@Tn_Iw$#G@7yR=Si?o|S1nzSbq^R}DWJGrUGV%|Bkxar$0sboyU!bb|A{mt9TUntOKFj~DHGGloc?YNXCa>TIM=z8`uF49CIn3K(9^;a&3h zP|4>w=`ZBCYhy=p+&=P1qx!L!&3*C(uIWoA`}1wmlE)gIsts%2PCf^%XB3o&{_fRL zbG|1+w$j%KkVC(RfH|Qwz=MZ z8eQ*#k6ngubMD;tLz2^9`t>W{&Ky@(J3LwKFlAyk_sN}-LqYoUA@3XkY00OeyiYUK zJCE^J72~bcHu7z!u3iP@zlhv=Jh^R!pC0(x+UWeTk3+V}cyN&NnoFL5M_Y1`-E?_& zvx#zDl-tDjZLZ}V4$K*bT1MuVde+)r4~Fd{7#4f;q~x|n6Q67+y#qS!(CKJ&{($;T zJ@+E-RUW?8q^}}ADRXE1=QF_jf!Rp)tDh z+xs1S3sUtYkn0~|zmIT#v+j|}SE=(CIhQ_A<7hPm~H*{6cN480xu!TRI>LdrKZI%icL zIbEZ6u6!jQqo46)UQ50j^3`HPUOgYB9@fD}@#V|il)s$v^SyRfP5JqhuWoey)+>KC zm+VU^H;rGY%FQ(8j{0je0lxRTmU07pyI#6HMLF+VSl3fdV<-#%xdDBm_Xk2>BkyYgxBq^f zysuHm>k(&xSH~U2-OCoMoO~nm;uBq4<0qJFnzHhfukg)!^{=l|_7%#$8gU-`*vPwX z*5fO+hG!p#5A7Qr3%Gsbv54C@a-TfTHU9qV-us=*x*zGI{QVK~y#P6^wAL~c>o#*Nk2gP!HDzEq#J(Zk9T|J_mIAubiUDb zR_XXf&N=dJrnPThk1hTPpZo~22_Tz;fvmRa%|V}e1HL8SZz12E0k=Kug62+W?us}+ z70rR$>&EGAJJ_VR9pv3k-W?I=hsx{etuR|}y&l$W9TDeGJq(HUe7g(&ym8C}p`UvY?(8* zQ2+FYzRZ74xfQfGm20Ei3d*%boUc$${o4$;k^3C^SH^!j1O6YV$Fz~T;CRQ|Zy07B>K)cphr`aLN`J=9+sw7r8w~B9 zNwLsmm-e7&LvN3Kl-iqU9rI`%ht@G@9cNwqZFqu~`XSRkdYB`R^a&4y7EtbpSMCMM z9iiL{d^<_y&}#$ORZe|iE?E9tSjLQx{u(R>Lp`*fftKX@9JHQ+)^mKvM6{5@HQDy} zlvn4|&IPluf!lh63uApZ6U-}B7R^0x=PHPD0PKS2J2VQ0?2AMv*{ZUzJEc=jH2 zq&B?UTd&)Vj?{*^PwwGbZ8+Z@Unf}uv`HUjyF1CZi+Xn`DE~#;bFYVg8+dxbvn}jA z27cpjcS3g;>x4bf*h+d2>086jL*h@mlE3Zp%5NgQi}X!l=bK8W{Uxba{x;$3b}e%4 zYb^FaXah9cE!RJHK(ig1 z9bso3D;uIWjiS1+2-ot#47sDsamlR#V3+>R26i zJ_$`@i;~6n$g=`D8J|U-7368-8A;U(Z{Glik(uU#t)9%5ldqM0%h~@^KJ2^4&!;hJ zGqxgnE#zw^UrX3o=<(6(wS%!^G0um$XMRd8NAF?oFXQ}FIdh~6&yGsbX9e@Ga^~Y@ zyw7b0=jvDoJ_DB1)W@E@lZs+HO@t_Ui*?N}V+ZX$B*7rt(;nJl@B26!ALNpzy~C5F zpDaWUl8MF_3q5;pfCqG_HusrE_q#({=YMvo_2B7z@D!>p>}?vj;FbNRUe5ER(>36! zrECplYsoVo+STwipMAyZuv5goO_KU6sXr93dMg9&_t&z|%DB(3W}Th!_xr)Ay?ArR ztlHaW7mjN7|AhlQe0y^LY3lc%15dKgXXHTLz8sGF&ta%6xRS`h$RkMmCtpSu=);V) z(20LGtbIz>U$V~)jI8sAUQS?R zedx3wn;dBKbdRkiu}RKqIO*jcZ^Q8RCNh4D@Fr>4Kz3srpSnE39{Qold{^4<5XT9%?$FfFN95qo=HBnn7 zRf{C6Ac|VVAdE&D+ap_0L6u$sx}Z|QQHsi=lj?9q(8-lk0dk^pRpFjThxi=Siyn@g zsKo@g)zM=>PDOB918y*2s5w}_9M7JS|RqURFx5k23h7?rxD0Th5hni+sh%Hv*ke{qIE#*XS?JoXEkmqjkEf7D#3=01IY|513Ao>ZT|qB5w!wkqL|{Hn|8 z_PFtLtes{q_O6UGK>k5+21qkVn!b>m?#FieD7Sv-_wc?KyX}EqZ`?h{*w_Z~NN~UbHBrd zv8AEyb>j0n^E-*Wv$if$*S6J(S)Qp*kY|PI*j0=QwnxygKpTJJkuvr#gXdOr5xuY}jV$yORSYfM%c7uix5uv1eP0xFm7=y;RR~P>0VdkB&-xT(% zb~3mwAvK(gRr|jFR`O5>U()_gwS6O2mOy=5L5`r$`a1N~?wugkuJ-56!B$(E#i72L zb|X;dS`K-2F1!Arn6`%c$N7tN8P0(n> zUo^3HUHaBMdA*G-8=zZ{4jba`AHw?*e)LSp+mpk7zWHEm@K$2MC3yScuTl! zT0l?dz9`0UuqDlXEMpTZ*u;0KDUCU$FWJ z?eO%0yz?n=oDpQ-V1F{W=Dv^L9@eq+#Z5e&yS_?ssn&Zcy@^qU(L(FW zj@YYnJ7U*P?})8))~@2`Xb66>9o7QN_f9BYRlKZNHPwcFVI%2)jrjYAe7pF5>47rL z>VY!MtA|=}dss7Ei%i%;u1tzoO&ig!wIu8n3+khiyp@~ljdSy6+pCe?FSEywv2N-N zGOSK{Hle-CoasI^ze>(hp~th;}FY?L#!|k zp>}z{WE~F8vkss^wz)K{Z_4c6(w@@K+q#}q_Ya32i~H+8b-Ws@PJ!yP*;GXrQXG#M1tS1%z3*re`6<;~jS%0i#nX!@;#!5{6ejomnF_KpG zhZrMSWsGEvF_J%FEN_W8Fe@8zU#@KJjG=77XUs(7CCiMLtT0|;@U>30)Z#N{vRVp0 z<0hXIeop|uXFEPh-HKlfehK)+;Fnl@t#OT5d}5B(2>6A~?q`JG9l-D2j?Y=VTk&sF z<{Q|{P3rW9^?zC)`?~E{-oS=l$N$}kyZ=%6T><>A?f8Yc_!;o8gP#Hay2aPp+Et5x z75r83ukxKr;dch`JGbLs&n@3e;9my+68M)bzSiYlu=p3jzX1NlxHo6s5y0=*j(;&1 z{~Y+|!9NH7d5f<#y^9wAEclDypN+fk7ys=6{Pykm3%U5G!CwIXH24b^U+aNSS^PQh zPk}!dci%4jwg7(HcKjLeP5oo;TkC~eZH%$SW@n*!5}LEnJZWi8Ky%uzC7yxiG&E-z zHDr8>bzYlwBDtOBQ$Ecny|uyG zQ#>^Vcxt)>PbHS8o0g~I08ay!r$J)Nfw&ptYOy^1jCd-Br;YCo~pL<=L+)DpA@_SE*TRnZP}sJa3oY{-h4Be^-O_Fv+44M3bsr)& z347!2os7|cfH*;YJLWZ_tciT-kHe2-nAi9!vFqW-zIXeY$j)Z1=VXgSQFdMATRB@_ zb1oTVNlT_mXjC0?Gv(-|0=deOs{(zLB4-)0lp;&nA@?R@g-cTbS*G&K^70=1PzUoI zT8B3B?#CrVbWfakDt!BOm2J%R7nuFGWJd>aopqqLt<+Rs+n&sNV4v}W`5sJC|JMwIrm zmG-mM{hW9h3-B*hVJr-{FHJy~1 z&Nt9FeUKmL9Q4ma{~YwsTYYNn>SEN33(um@Mff_~>i)2J8w~I^n4h<8Wp)}G3(zzQqNjiSd9^f=n;&NH{N)E(ffJ3n9BY+?u+!_XLl#;~O!n;5V(2B9$kjlov;v!c-z zpwX3|hHT=Oa>~o;gHAtm`k>Qq>1Yjd56|Tw;c)tNRUMb_6gx@?$1*`R)Lx6PylkIxXK?1Koyx@Exgk_-=#m_Ez^NM58@Gqdh;3 z+wz@&UJ`l<=p|d-FAK9RfZ3KG^8xtY(!N>yJ7L$}1Zg^r&}f22BQ%;?-5%8NbCVAX@w09HL%4OTx|$6Xt>>zL6`E&8czHFM@mi2#j6ei~VS+O%W-C4aql zlUH{>!uo8T`LNB7E8(LGJ}Tj(%JQML;N{kiE8wFXJ}O$>S2fSr7~rEZKOd5Hu^7GD zSmAc-#kcWO3O{A=Qwl$2mLIJpFSb6g1b&L)r=->Ws`zOL@Y9f=pPF3VN1#y%jR-Uf zTipcZ7*aXb2e9h%V+G4_o6oyhNDNU(43Q*;NV*RTvo3&HmmgF58bn_~Z0B{bZh-YV zST~Z2N4^%-TKG(%7nfcybXPM;ckO!8Jt{ra2I$o0r}HzpG*+Q;6&kD1xN2!=E&ZiJ z&jv3;;}SG3C*6M0s0z@i%1`5f%3bl|J;aEW#C61@e*FEY--ivxeiz{3B0OAxhl`d6 zt;IiQc{mRb=iuRd(*2-#s0{E>nV*OE=9c#&G|oa}5gKPL4Xx!rUFeNdER{iV^LGYjrX zaA(0iX?fRPf@y09Gw?nQ?=wkvmv}D=&@9VOa~to+p)m!GkUP*vnNq&0U_#T1AC^SZ(F`9J$ zz4$H;;1uV_`7e3+j%%&*v0vSH_yP1@i{6L89tL{|>|x8l_EHQKdi{Yx_#c4(!K8aa z{1*o37UrjW$GXr5&3g=P;ldz0>%Xhs4wBl&6mH|$GvH8yDW zYuse~q2~v;?AI83g?Y%0`1bu8JlnQkqrK2gcNDr#C%ksq`m_3j-hPdn)cMt4iBaFp zehuTZH0PBdoz{~kku8C2$)r2o{pR*-+?QkyhQ6)(iYotW?MZjNBgtG*k~IrS_ga0S zyWUX9*gkwU!B;JO)j_8gI(11m!kEuf($)3wX21P>>sx0*8s4A1{ zqchG7b`}2vYphbdbLx}cI>`#?mg`a)`t;iGkyJ*u6 z(xx5s+9B;vczu`WJ8$fwUwn{$@j>^M{|SxN0FBlBG{mpQD2$%8U&YQ-ZK0ci?se#9 zpnKiY)n1m>U0(gW3f)!cUge$WUJlT`oS$wGe---9C1_lR#wBQ6KInc#I=U3Vxs)GA z{EroR?Oe$Ejga=sO#bS=R2_BgBDfb1dSg41FJCNqjx^_?eGb~^4;nkYEIBR)=wG}w zeM9H$F3(mMcX_tDXlT;+-Nm|U{$s1Z@D@9_!aJw-(AM>Ur%AT}A9K2t{x)_yOPZ7L zI}5)jZF$IUr+0b2X@>HcraWd2x<4m5E(GMba2q+~o34iFJCk>n`D)4~>o<;LWAYnQ zyI5y%&|RK__Ro6zb?!;v7gq5%SMgiguQLgM3!5^u+HVr6%r!2i@iFK0L6askw#!YA zBg+_g;||8xNVbbkD8^?DLs`=HYgoj&OFA9PQtUp*JVn#+&%xYi(DH1=WkaOL$)Jz)2O z-2-;7mBH*qvUR;18M=_6`=Fa)&UWckfbOaMbS1-?==L~aTYK99?M`TSK)dsx+r#?I za_Q-0fX2!EG=k-@ij6yMV6}tQ23Gq)w@Em&0i4-8<2VU0l3*mjNFH>j;pc{Ao(bU0 z+!@EjhK*n~fz=3B(?R#3%4|A-Go2sj6X;EA*Rx~3cF)#ttifX z{PecyQGJlt3+OWz&}TeApYeeEIq^Ljz!}Yt^S6b!uAfc@%q z1_L;QcgAr}gRua{X)qQnpIYyI3j0u^6GN_Lru?o&kFr>>10y_Cy{p@Zz;8_&*N+QwQAtUHtb2==SBO zyG75k?_e>raZGo&ZkIopDV3I0Duv zSR-JK9&o=Ve!2rV-T868y(`DB+r6KatN8WPcKo|5JWpLS=RKsln$4WZNBq4xx@Y|R zBgHnh(>?n?mx%SgM0@*1uAuH%=SOS;pF{9DY|BP_Lk9}H{ZxaL%>ZRHc)ek`j27D(y94Y_t55BbZ7cA`&Dzmt8~SWN z;QrszXEH!HnV)VD-|(M+MiLqcXe1A~G4Y=W;3V?nyea-0!EOS(5$q<*zxL|ZV-NC) z4e(zN{|yJ+$HaeAfNoQMy4(1#g+?7TYN1hgz%3I0jRBm-{5Wrl|4Oi{z^(+l%JQ#0 z!{t1eudIOoa`>+};5Li@h5+4${B%=uUcI9atz7upy zpj!;x650UKtq;(x&rerz)h2DbKRF-m2($~K9f5YCrET^u@3ecDcM?DBCw|!P?iB61 z0PVUrL)-3g&PV(8ox~M8i7WOKSM2v<0PTOy?DXvAIhPK^nZO>H<+Ocy1+83dH z0ooTWZSBK8$8*`)d1#-5_WAwpjA&N|XjkT^9mLoCL85>)Ka1d$&hB?hRelu# ztcp8hIj6x`0OK?m3zk>y13$IXi__-d^%T6$?RWp9cr6d$m*>ad7W2cA* z+r$3iKM+<~0IMuNmd1Ou_WerVZ_ZyCHS40hGdZSrdVTzvo$k`~es_6hzuVHcx%ct! zn`je9>E};T-rD+p5EiNhi2U}@3-uIJVv@n_#fA$^tT!7 z7$MCla*iP9sMV#$I)-8i3Z|e){*&?gzgQ{Qmv!J;J{kz`vOvKWJA@4;Z~*_JG-I`1kf@c3J+r!S4dU zd%w$vOeU9Z1n_U%89z-dmO+P!$NRqJbU>>US{=~p-0zO7ul;%e@Adq6pUxd;Yy+nq zoHlUU_q)^BR=H%q9>BVuAL|6?A8qL;+x?s8IX_x@@yCyy1T>P+NI)ZL^`gD}jXS+| zy9vECqL-%q?kVXd6QG^RPdhc^wHq(x^B?ulYk*!o^cpNZ`Hxzjn|?U-YN1!R-<=e_ zs{wjf^V18KbJl-Uf>#BdO6XMWcO%lAGOoIq@UF~ThG$YU~-0!xF=A{75OSh&O z)RA*D!uWNB@#_TR*9qgZeoa^x16UXHV;P@yBjWj;*CU?ac|GCz9qyeQ{146t@Xn!b zm~#`ZLpP&KX>Q|dR!MUe{#N1dYC>(Rcjm<+4pp!`B7qT!hXA=v+*=zpFm#`2g1W{8-!O1I~eS9-MRFoVWbyOov5#F4|f6U4-AW zy#EF?&IM?k%TMFKbDq(b`pcY+&VIOjIj8=fhV}xqPlLT+Y3p2wQxUHpGY9Qc(4I@U zi=urtK>KWd+Cf|K`pD2Y35{83oaAgb>1i>5vv_A5|9r~jX)tCipE{S~xGmEu_&g4u zQwjIC#OFc)e<449igAY2q_xFk))tRhTjbuEw6^G2fG|1 z%`kcxLWbdhT@F|o29aR^83q&XqmtotK!(%#W$^7X+Xjv$Xp0l9WA+h zX!nBO1AcG9{W0Os1@Pzc!Z0)cFJr<+Kl7#!G*TEkT;E&%KKV5HmjX51KK!!niin0RCux{4KgTw*%k11K$hAdCm${TOnO6 z+Vj!Q?!fnQX4%;mcSO1v3E+?18GjXBIH#ep0FBeoSZHy7UwjS+aE9~an6^IYwe=_R z&F7v1cMjZB;Lcgzbw10i<^3eQ&%*o37WWbHJ`|uil%Hl$H)cF;8X7aun1;qoi@UCV z)L;N-Fh7p(m;Cn9IS$SgILE=6YB6Jkzbu{x0$2n2u?lpiTb?rw`41J8ZxNi~d{s8U%{Is{|L*u0*$T13y5onCIxF@8Kz5q_&opGEY zFowYx0%O?nskUsumfIkF4#4MNi~Gu};P(dbd-LO)xT==EVB;b8N}cHodgp@l+4C9u zcewt!ieLW3W?%3pe~7+d9lox2hZmFe*mEX(TD+Kyd#9KGipffCU$B<+yx-Cec9E_d zxjJm>hYNi##5X*}1hmkR8EXjezP@6)DcNs}bcaWJ*VvW>m1_S>~O&nDf*xd%mj7xjtV z$JG|65+Qeo(ZfT3rSm*e2`Hi$?uJ?2)mJYK6VrTLzZqM^qS(FEBuvb z@U2t|U*DmAhgSOJ|g9lN&jY?%FJ~ zlwW3votzu=#2=XNH;Ml;@F`zYe&qrF%iyg%hyRjInnsr;q$!QFegX{HlI&-UXXAYD zELfJJQy8FA%zwWu3!zPks7-y94*7V*D1 z*uH6Ve3#HG=kCpKAj%f=+MICoEpzIh>>{mtNja|byomLWwc)$^uCdqtbK$$%qI`#y z4?jMp@2r|S3{M%->Dx(}$X$D*?+LtD-OhQ>x32p>A1(%mZx>q}2U;~YpT1R$e5OpV z!LRWFrB>(E4Zj>(eIJ3$kLHv^nsmPYx7j)GkoC1?`@M)|^t6PIw&+`FC>QD6_el;i zrXzeCS>K6%kG{DaeoWXwJt)mOX`~0~O|nXFZ%STt?w>2QjhCFVj~0YYS*4)I_nRL( zV`cI0dswHTZ(NwV0j~7x$lu!Xke#;j{ykj(e=6@v@oepGH|OUa!tOHY@8j0)q;q}u zJo>(;o-u6)wj~?oJh(p2X2hn>J#*OD6yLxGXN>=ctz8`^59el?cE<_WxK;Dqe0^@5uLWS?~O^^2_jHf2|F2n0kiX!SZ{z_(T4DcA3?Yl{1ZwUd3*&Meg3a z8@v3G@E)Vr{_q}jcAjr1t3E&V%sR9_^`5`ro66zGK4tWEm*-n;ndH;6c$2>T3pw_( z*JIwuGlhejL>XFT{aI zr;oh-I#00p>0*4l&i&K*f7Dxj`|az()HzitA6NRc_F>9NaXdcrD_Yy!4wm?X=e?50 z@|o_1W>08qEC5~_TEVu;Kc6aC_c#1+a?yrKzbV=*wVURD89wR-`6+MgfOghftHpDj zl~}{Ocbhhd^DAlJPN>gzMg3ULBV)Z6=WV$Dcg4P3%K2}RBOi)>uXkqUPc_h2p&g8d z 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

XbRV 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

rIh1g#7gY*c`C!z)p)RV^=*6+6}H7 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 literal 0 HcmV?d00001 diff --git a/perl/cmd/build.sh b/perl/cmd/build.sh new file mode 100755 index 0000000..5b20b7a --- /dev/null +++ b/perl/cmd/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Perl Build Script - Perl är interpreterat, ingen kompilering behövs + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Perl Build ===" +echo "Perl är ett interpreterat språk, ingen kompilering behövs." +echo "Script: src/print_hej.pl" +echo "" + +# Skapa wrapper script +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +perl src/print_hej.pl "$@" +EOF +chmod +x bin/print_hej + +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" +echo "" +echo "✓ Klart!" \ No newline at end of file diff --git a/perl/cmd/test.sh b/perl/cmd/test.sh new file mode 100755 index 0000000..6198685 --- /dev/null +++ b/perl/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Perl Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Perl Pi-beräkning Unit Tester ===" +echo "" + +cd src +perl test_pi.t + +exit $? \ No newline at end of file diff --git a/perl/src/print_hej.pl b/perl/src/print_hej.pl new file mode 100755 index 0000000..de2ac97 --- /dev/null +++ b/perl/src/print_hej.pl @@ -0,0 +1,67 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Math::BigInt; + +# Calculate arctan(1/x) using Taylor series +sub arctan { + my ($x, $decimals) = @_; + + my $scale = Math::BigInt->new(10)->bpow($decimals + 10); + my $x_squared = $x * $x; + + my $term = $scale->copy()->bdiv($x); + my $result = Math::BigInt->new(0); + my $n = 0; + + while ($term > 0) { + my $divisor = 2 * $n + 1; + my $contrib = $term->copy()->bdiv($divisor); + + if ($n % 2 == 0) { + $result->badd($contrib); + } else { + $result->bsub($contrib); + } + + $term = $term->copy()->bdiv($x_squared); + $n++; + } + + return $result; +} + +# Calculate pi using Machin's formula +sub calculate_pi { + my ($decimals) = @_; + + my $atan1_5 = arctan(5, $decimals); + my $atan1_239 = arctan(239, $decimals); + + # pi = 16*arctan(1/5) - 4*arctan(1/239) + my $pi = $atan1_5->copy()->bmul(16)->bsub($atan1_239->copy()->bmul(4)); + + # Format with decimal point + my $pi_str = $pi->bstr(); + + my $result = "3."; + my $start = 1; + + for (my $i = 0; $i < $decimals; $i++) { + if ($start + $i < length($pi_str)) { + $result .= substr($pi_str, $start + $i, 1); + } else { + $result .= "0"; + } + } + + return $result; +} + +# Main +my $decimals = 100; +if (@ARGV > 0) { + $decimals = $ARGV[0] =~ /^\d+$/ ? $ARGV[0] : 100; +} + +print calculate_pi($decimals) . "\n"; \ No newline at end of file diff --git a/perl/src/test_pi.t b/perl/src/test_pi.t new file mode 100644 index 0000000..f068f12 --- /dev/null +++ b/perl/src/test_pi.t @@ -0,0 +1,73 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More tests => 7; +use IPC::Open3; + +my $SCRIPT_PATH = '/Users/einand/Code/test/perl/print_hej.pl'; + +sub run_script { + my ($args) = @_; + my @cmd = ($SCRIPT_PATH); + push @cmd, $args if defined $args; + + my $pid = open3(my $in, my $out, my $err, @cmd); + close($in); + my $result = <$out>; + close($out); + close($err); + waitpid($pid, 0); + + chomp $result if defined $result; + return $result // ''; +} + +# Test 10 decimals +{ + my $result = run_script('10'); + my $expected = '3.1415926535'; + is($result, $expected, '10 decimals'); +} + +# Test 5 decimals +{ + my $result = run_script('5'); + my $expected = '3.14159'; + is($result, $expected, '5 decimals'); +} + +# Test 1 decimal +{ + my $result = run_script('1'); + my $expected = '3.1'; + is($result, $expected, '1 decimal'); +} + +# Test 100 decimals +{ + my $result = run_script('100'); + my $expected = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'; + is($result, $expected, '100 decimals'); +} + +# Test default 100 decimals +{ + my $result = run_script(); + my $expected = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'; + is($result, $expected, 'default 100 decimals'); +} + +# Test invalid input +{ + my $result = run_script('invalid'); + my $expected = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'; + is($result, $expected, 'invalid input uses default'); +} + +# Test 10000 decimals +{ + my $result = run_script('10000'); + # Check length: "3." + 10000 digits = 10002 characters + is(length($result), 10002, '10000 decimals length'); + ok(index($result, '3.14159') == 0, '10000 decimals starts with 3.14159'); +} \ No newline at end of file diff --git a/php/cmd/build.sh b/php/cmd/build.sh new file mode 100755 index 0000000..c94cc54 --- /dev/null +++ b/php/cmd/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# PHP Build Script - PHP är interpreterat, ingen kompilering behövs + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== PHP Build ===" +echo "PHP är ett interpreterat språk, ingen kompilering behövs." +echo "Script: src/print_hej.php" +echo "" + +# Skapa wrapper script +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +php src/print_hej.php "$@" +EOF +chmod +x bin/print_hej + +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" +echo "" +echo "✓ Klart!" \ No newline at end of file diff --git a/php/cmd/test.sh b/php/cmd/test.sh new file mode 100755 index 0000000..14de165 --- /dev/null +++ b/php/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# PHP Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== PHP Pi-beräkning Unit Tester (PHPUnit) ===" +echo "" + +cd src +php PiTest.php + +exit $? \ No newline at end of file diff --git a/php/src/PiTest.php b/php/src/PiTest.php new file mode 100644 index 0000000..c85de50 --- /dev/null +++ b/php/src/PiTest.php @@ -0,0 +1,63 @@ +runScript('10'); + $expected = '3.1415926535'; + $this->assertEquals($expected, $result); + } + + public function test5Decimals(): void + { + $result = $this->runScript('5'); + $expected = '3.14159'; + $this->assertEquals($expected, $result); + } + + public function test1Decimal(): void + { + $result = $this->runScript('1'); + $expected = '3.1'; + $this->assertEquals($expected, $result); + } + + public function test100Decimals(): void + { + $result = $this->runScript('100'); + $expected = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'; + $this->assertEquals($expected, $result); + } + + public function testDefault100Decimals(): void + { + $result = $this->runScript(); + $expected = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'; + $this->assertEquals($expected, $result); + } + + public function test10000Decimals(): void + { + $result = $this->runScript('10000'); + // Check length: "3." + 10000 digits = 10002 characters + $this->assertEquals(10002, strlen($result)); + $this->assertTrue(strpos($result, '3.14159') === 0); + } +} \ No newline at end of file diff --git a/php/src/print_hej.php b/php/src/print_hej.php new file mode 100755 index 0000000..be0ef33 --- /dev/null +++ b/php/src/print_hej.php @@ -0,0 +1,54 @@ + $decimals * 2) break; + } + + return $result; +} + +// Calculate pi using Machin's formula +function calculate_pi($decimals) { + $atan1_5 = arctan(5, $decimals); + $atan1_239 = arctan(239, $decimals); + + return bcsub(bcmul($atan1_5, '16'), bcmul($atan1_239, '4')); +} + +// Format pi with decimal point +function format_pi($pi, $decimals) { + $piStr = $pi; + while (strlen($piStr) < $decimals + 10) { + $piStr = '0' . $piStr; + } + return '3.' . substr($piStr, 1, $decimals); +} + +// Main +$decimals = isset($argv[1]) ? (int)$argv[1] : 100; +if ($decimals <= 0) $decimals = 100; + +$pi = calculate_pi($decimals); +echo format_pi($pi, $decimals) . "\n"; +?> \ No newline at end of file diff --git a/python/cmd/build.sh b/python/cmd/build.sh new file mode 100755 index 0000000..5a3249c --- /dev/null +++ b/python/cmd/build.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# Python Build Script - Python är interpreterat, ingen kompilering behövs + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Python Build ===" +echo "Python är ett interpreterat språk, ingen kompilering behövs." +echo "Script: src/print_hej.py" +echo "" +echo "Skapar wrapper script i bin/" +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +python3 src/print_hej.py "$@" +EOF +chmod +x bin/print_hej +echo "✓ Klart!" \ No newline at end of file diff --git a/python/src/print_hej.py b/python/src/print_hej.py new file mode 100755 index 0000000..9540422 --- /dev/null +++ b/python/src/print_hej.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +""" +Beräknar pi med angivet antal decimaler +Användning: python3 print_hej.py +""" + +import sys +from decimal import Decimal, getcontext + +def arctan(x, precision): + """ + Beräknar arctan(1/x) med Taylor-serien + arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... + """ + result = Decimal(0) + x = Decimal(x) + x_squared = x * x + + term = Decimal(1) / x + sign = 1 + + for n in range(1000000): + divisor = Decimal(2 * n + 1) + contrib = term / divisor + + if sign > 0: + result += contrib + else: + result -= contrib + + term = term / x_squared + sign = -sign + + # Avbryt om termen är tillräckligt liten + if term < Decimal(10) ** (-precision - 10): + break + + return result + +def calculate_pi(decimals): + """ + Beräknar pi med Machins formel: pi/4 = 4*arctan(1/5) - arctan(1/239) + """ + # Sätt precision + getcontext().prec = decimals + 20 + + atan1_5 = arctan(5, decimals) + atan1_239 = arctan(239, decimals) + + # pi = 4 * (4*arctan(1/5) - arctan(1/239)) + pi = Decimal(4) * atan1_5 + pi = pi - atan1_239 + pi = pi * Decimal(4) + + return pi + +def main(): + # Hämta antal decimaler från argument + if len(sys.argv) > 1: + try: + decimals = int(sys.argv[1]) + if decimals < 1: + decimals = 100 + except ValueError: + decimals = 100 + else: + decimals = 100 + + # Beräkna pi + pi = calculate_pi(decimals) + + # Skriv ut resultatet med rätt antal decimaler + pi_str = str(pi) + + # Hitta decimalpunkten + if '.' in pi_str: + int_part, dec_part = pi_str.split('.') + # Ta exakt decimals decimaler + if len(dec_part) > decimals: + dec_part = dec_part[:decimals] + else: + dec_part = dec_part.ljust(decimals, '0') + print(f"{int_part}.{dec_part}") + else: + print(pi_str) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/python/src/test_pi.py b/python/src/test_pi.py new file mode 100644 index 0000000..80b7caa --- /dev/null +++ b/python/src/test_pi.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +""" +Unit tests for Python pi calculation using pytest +""" + +import subprocess +import pytest + +SCRIPT_PATH = "/Users/einand/Code/test/python/print_hej.py" + +def run_script(decimals=None): + """Run the Python script with optional decimals argument""" + cmd = ["python3", SCRIPT_PATH] + if decimals is not None: + cmd.append(str(decimals)) + result = subprocess.run(cmd, capture_output=True, text=True) + return result.stdout.strip() + +class TestPiCalculation: + """Test cases for pi calculation""" + + def test_10_decimals(self): + """Test with 10 decimal places""" + result = run_script(10) + expected = "3.1415926535" + assert result == expected, f"Expected {expected}, got {result}" + + def test_5_decimals(self): + """Test with 5 decimal places""" + result = run_script(5) + expected = "3.14159" + assert result == expected, f"Expected {expected}, got {result}" + + def test_1_decimal(self): + """Test with 1 decimal place""" + result = run_script(1) + expected = "3.1" + assert result == expected, f"Expected {expected}, got {result}" + + def test_100_decimals(self): + """Test with 100 decimal places""" + result = run_script(100) + expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + assert result == expected, f"Expected {expected}, got {result}" + + def test_default_100_decimals(self): + """Test default (100 decimal places)""" + result = run_script() + expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + assert result == expected, f"Expected {expected}, got {result}" + + def test_invalid_input(self): + """Test with invalid input (should use default 100)""" + result = run_script("invalid") + expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + assert result == expected, f"Expected {expected}, got {result}" + + def test_10000_decimals(self): + """Test with 10000 decimal places""" + result = run_script(10000) + # Check length: "3." + 10000 digits = 10002 characters + assert len(result) == 10002, f"Expected 10002 characters, got {len(result)}" + assert result.startswith("3.14159"), f"Result should start with 3.14159, got {result[:10]}" + +if __name__ == "__main__": + pytest.main([__file__, "-v"]) \ No newline at end of file diff --git a/python/test.py b/python/test.py new file mode 100755 index 0000000..9ae430f --- /dev/null +++ b/python/test.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +""" +Unit tests for Python pi calculation +""" + +import subprocess +import sys + +SCRIPT_DIR = "/Users/einand/Code/test/python" +SCRIPT = f"{SCRIPT_DIR}/print_hej.py" + +def run_test(decimals, expected_prefix): + """Run the program and check output""" + result = subprocess.run( + ["python3", SCRIPT, str(decimals)], + capture_output=True, + text=True, + timeout=30 + ) + + output = result.stdout.strip() + + if output.startswith(expected_prefix): + print(f"✓ PASS: {decimals} decimaler - {output[:50]}...") + return True + else: + print(f"✗ FAIL: {decimals} decimaler") + print(f" Förväntade: {expected_prefix}...") + print(f" Fick: {output[:100]}") + return False + +def main(): + print("=== Python Pi-beräkning Unit Tester ===") + print() + + tests_passed = 0 + tests_failed = 0 + + # Test 1: 10 decimaler + print("Test 1: 10 decimaler") + if run_test(10, "3.1415926535"): + tests_passed += 1 + else: + tests_failed += 1 + print() + + # Test 2: 5 decimaler + print("Test 2: 5 decimaler") + if run_test(5, "3.14159"): + tests_passed += 1 + else: + tests_failed += 1 + print() + + # Test 3: 1 decimal + print("Test 3: 1 decimal") + if run_test(1, "3.1"): + tests_passed += 1 + else: + tests_failed += 1 + print() + + # Test 4: 100 decimaler + print("Test 4: 100 decimaler") + expected_100 = "3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067" + if run_test(100, expected_100): + tests_passed += 1 + else: + tests_failed += 1 + print() + + # Test 5: Default (100 decimaler) + print("Test 5: Default (100 decimaler)") + result = subprocess.run( + ["python3", SCRIPT], + capture_output=True, + text=True, + timeout=30 + ) + output = result.stdout.strip() + if output.startswith(expected_100): + print(f"✓ PASS: Default - {output[:50]}...") + tests_passed += 1 + else: + print(f"✗ FAIL: Default") + print(f" Förväntade: {expected_100}...") + print(f" Fick: {output[:100]}") + tests_failed += 1 + print() + + # Test 6: Ogiltig input + print("Test 6: Ogiltig input (ska använda default 100)") + result = subprocess.run( + ["python3", SCRIPT, "invalid"], + capture_output=True, + text=True, + timeout=30 + ) + output = result.stdout.strip() + if output.startswith(expected_100): + print(f"✓ PASS: Ogiltig input hanterad korrekt") + tests_passed += 1 + else: + print(f"✗ FAIL: Ogiltig input") + print(f" Förväntade: {expected_100}...") + print(f" Fick: {output[:100]}") + tests_failed += 1 + print() + + # Summary + print("=== Sammanfattning ===") + print(f"Passerade: {tests_passed}") + print(f"Misslyckade: {tests_failed}") + + if tests_failed == 0: + print("✓ Alla tester passerade!") + sys.exit(0) + else: + print("✗ Några tester misslyckades") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/r/cmd/build.sh b/r/cmd/build.sh new file mode 100755 index 0000000..38bb48b --- /dev/null +++ b/r/cmd/build.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# R Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== R Build ===" +echo "" + +# Check for Rscript +if ! command -v Rscript &> /dev/null; then + echo "✗ R hittades inte!" + echo " Installera R: brew install r" + exit 1 +fi + +echo "✓ R är installerat" +echo " Script: src/print_hej.R" +echo "" + +# Skapa wrapper script +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +Rscript src/print_hej.R "$@" +EOF +chmod +x bin/print_hej + +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej " \ No newline at end of file diff --git a/r/src/print_hej.R b/r/src/print_hej.R new file mode 100644 index 0000000..d85f6f3 --- /dev/null +++ b/r/src/print_hej.R @@ -0,0 +1,85 @@ +#!/usr/bin/env Rscript + +# Pi Calculator using Machin's Formula +# pi/4 = 4*arctan(1/5) - arctan(1/239) + +# Load gmp package for big integers +library(gmp) + +# Calculate arctan(1/x) using Taylor series +# arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... +arctan <- function(x, decimals) { + scale <- as.bigz(10)^(decimals + 10) + x_big <- as.bigz(x) + x_sq <- x_big * x_big + + term <- scale %/% x_big + result <- as.bigz(0) + n <- 0 + + while (term != 0 && n < decimals * 3) { + divisor <- as.bigz(2 * n + 1) + contrib <- term %/% divisor + + if (n %% 2 == 0) { + result <- result + contrib + } else { + result <- result - contrib + } + + term <- term %/% x_sq + n <- n + 1 + } + + return(result) +} + +# Main function +main <- function() { + args <- commandArgs(trailingOnly = TRUE) + decimals <- 100 + + if (length(args) > 0) { + decimals <- as.integer(args[1]) + if (is.na(decimals) || decimals < 1) { + decimals <- 100 + } + } + + # Calculate arctan(1/5) and arctan(1/239) + atan1_5 <- arctan(5, decimals) + atan1_239 <- arctan(239, decimals) + + # pi = 16*arctan(1/5) - 4*arctan(1/239) + pi_val <- atan1_5 * as.bigz(16) - atan1_239 * as.bigz(4) + + # Convert to string + pi_str <- as.character(pi_val) + + # Print with decimal point + cat("3.") + + # Extract digits after the first digit (which is 3) + if (nchar(pi_str) > 1) { + # Skip the first digit (3) and take the rest + digits <- substring(pi_str, 2) + if (nchar(digits) >= decimals) { + cat(substr(digits, 1, decimals)) + } else { + cat(digits) + # Pad with zeros if needed + for (i in 1:(decimals - nchar(digits))) { + cat("0") + } + } + } else { + # Pad with zeros + for (i in 1:decimals) { + cat("0") + } + } + + cat("\n") +} + +main() \ No newline at end of file diff --git a/ruby/cmd/build.sh b/ruby/cmd/build.sh new file mode 100755 index 0000000..6edac05 --- /dev/null +++ b/ruby/cmd/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Ruby Build Script - Ruby är interpreterat, ingen kompilering behövs + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Ruby Build ===" +echo "Ruby är ett interpreterat språk, ingen kompilering behövs." +echo "Script: src/print_hej.rb" +echo "" + +# Skapa wrapper script +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +ruby src/print_hej.rb "$@" +EOF +chmod +x bin/print_hej + +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" +echo "" +echo "✓ Klart!" \ No newline at end of file diff --git a/ruby/cmd/test.sh b/ruby/cmd/test.sh new file mode 100755 index 0000000..cf9912f --- /dev/null +++ b/ruby/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Ruby Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Ruby Pi-beräkning Unit Tester ===" +echo "" + +cd src +ruby test_pi.rb + +exit $? \ No newline at end of file diff --git a/ruby/src/print_hej.rb b/ruby/src/print_hej.rb new file mode 100755 index 0000000..c9c572f --- /dev/null +++ b/ruby/src/print_hej.rb @@ -0,0 +1,50 @@ +# Calculate arctan(1/x) using Taylor series with integer arithmetic +def arctan(x, decimals) + scale = 10 ** (decimals + 10) + x_squared = x * x + + result = 0 + term = scale / x + + n = 0 + while term != 0 && n < decimals * 3 + divisor = 2 * n + 1 + contrib = term / divisor + + if n % 2 == 0 + result += contrib + else + result -= contrib + end + + term = term / x_squared + n += 1 + end + + result +end + +# Calculate pi using Machin's formula +def calculate_pi(decimals) + atan1_5 = arctan(5, decimals) + atan1_239 = arctan(239, decimals) + + 16 * atan1_5 - 4 * atan1_239 +end + +# Format pi with decimal point +def format_pi(pi, decimals) + pi_str = pi.to_s + # Pad with leading zeros if needed + while pi_str.length < decimals + 10 + pi_str = '0' + pi_str + end + "3.#{pi_str[1, decimals]}" +end + +# Main +decimals = ARGV[0]&.to_i || 100 +decimals = 100 if decimals <= 0 + +pi = calculate_pi(decimals) +print format_pi(pi, decimals) \ No newline at end of file diff --git a/ruby/src/test_pi.rb b/ruby/src/test_pi.rb new file mode 100644 index 0000000..1a9deca --- /dev/null +++ b/ruby/src/test_pi.rb @@ -0,0 +1,49 @@ +require 'test/unit' +require 'open3' + +class PiTest < Test::Unit::TestCase + SCRIPT_PATH = '/Users/einand/Code/test/ruby/print_hej.rb' + + def run_script(*args) + cmd = ['ruby', SCRIPT_PATH] + args.map(&:to_s) + stdout, _ = Open3.capture2(*cmd) + stdout.strip + end + + def test_10_decimals + result = run_script(10) + expected = '3.1415926535' + assert_equal expected, result + end + + def test_5_decimals + result = run_script(5) + expected = '3.14159' + assert_equal expected, result + end + + def test_1_decimal + result = run_script(1) + expected = '3.1' + assert_equal expected, result + end + + def test_100_decimals + result = run_script(100) + expected = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679' + assert_equal expected, result + end + + def test_default_100_decimals + result = run_script + expected = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679' + assert_equal expected, result + end + + def test_10000_decimals + result = run_script(10000) + # Check length: "3." + 10000 digits = 10002 characters + assert_equal 10002, result.length + assert result.start_with?('3.14159') + end +end \ No newline at end of file diff --git a/run_all.sh b/run_all.sh new file mode 100755 index 0000000..ce1058e --- /dev/null +++ b/run_all.sh @@ -0,0 +1,149 @@ +#!/bin/bash + +# Run all pi calculation programs and measure performance +# Run each program 3 times and take the average + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +# Check if argument provided +if [ $# -eq 0 ]; then + echo "Usage: $0 " + echo "Example: $0 100" + exit 1 +fi + +DECIMALS=$1 + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +# Function to verify result against facit +verify() { + local result="$1" + local decimals="$2" + local expected=$(head -c $((decimals + 2)) facit.txt) + + if [ "$result" = "$expected" ]; then + return 0 + else + return 1 + fi +} + +echo "=== Pi-beräkning med $DECIMALS decimaler (4 körningar, genomsnitt av 3 efter warmup) ===" +echo "" + +# Array to store results +declare -a results + +# Run each program 4 times, discard first run (warmup), take average of last 3 +run_program() { + local name="$1" + shift + + printf "%-12s " "$name" + + local total_time=0 + local success_count=0 + local result + + # Run 4 times, discard first run (warmup) + for i in 1 2 3 4; do + local start=$(date +%s%N) + + if result=$("$@" 2>/dev/null); then + local end=$(date +%s%N) + local elapsed=$(( (end - start) / 1000000 )) + + # Skip first run (warmup) + if [ $i -gt 1 ]; then + total_time=$((total_time + elapsed)) + + if verify "$result" "$DECIMALS"; then + ((success_count++)) + fi + fi + else + # If any run fails, mark as error + echo -e "${RED}ERROR${NC}" + results+=("999999 $name ERROR") + return + fi + done + + # Calculate average + local avg_time=$((total_time / 3)) + + if [ $success_count -eq 3 ]; then + echo -e "${GREEN}SUCCESS${NC} $avg_time ms (avg)" + results+=("$avg_time $name SUCCESS") + else + echo -e "${RED}FAILED${NC} $avg_time ms (avg)" + results+=("$avg_time $name FAILED") + fi +} + +# Run all programs (no timeouts) +run_program Bash bash bash/bin/print_hej "$DECIMALS" +run_program Brainfuck brainfuck/bin/print_hej "$DECIMALS" +run_program C c/bin/print_hej "$DECIMALS" +run_program C++ cpp/bin/print_hej "$DECIMALS" +run_program Crystal crystal/bin/print_hej "$DECIMALS" +run_program CSharp csharp/bin/print_hej "$DECIMALS" +run_program D d/bin/print_hej "$DECIMALS" +run_program Dart dart/bin/print_hej "$DECIMALS" +run_program Elixir elixir/bin/print_hej "$DECIMALS" +run_program Erlang erlang/bin/print_hej "$DECIMALS" +run_program Fortran fortran/bin/print_hej "$DECIMALS" +run_program Go go/bin/print_hej "$DECIMALS" +run_program Haskell haskell/bin/print_hej "$DECIMALS" +run_program Java java/bin/print_hej "$DECIMALS" +run_program JavaScript javascript/bin/print_hej "$DECIMALS" +run_program Julia julia/bin/print_hej "$DECIMALS" +run_program Kotlin kotlin/bin/print_hej "$DECIMALS" +run_program Objective-C objective-c/bin/print_hej "$DECIMALS" +run_program Scala scala/bin/print_hej "$DECIMALS" +run_program TypeScript typescript/bin/print_hej "$DECIMALS" +run_program Lua lua/bin/print_hej "$DECIMALS" +run_program Nim nim/bin/print_hej "$DECIMALS" +run_program Odin odin/bin/print_hej "$DECIMALS" +run_program Perl perl/bin/print_hej "$DECIMALS" +run_program PHP php/bin/print_hej "$DECIMALS" +run_program Python python/bin/print_hej "$DECIMALS" +run_program R r/bin/print_hej "$DECIMALS" +run_program Ruby ruby/bin/print_hej "$DECIMALS" +run_program Rust rust/bin/print_hej "$DECIMALS" +run_program Swift swift/bin/print_hej "$DECIMALS" +run_program Zig zig/bin/print_hej "$DECIMALS" +run_program Assembly assembly/bin/print_hej "$DECIMALS" +run_program Wolfram wolfram/bin/print_hej "$DECIMALS" +run_program Vimscript vimscript/bin/print_hej "$DECIMALS" + +echo "" +echo "=== Sammanfattning (sorterad efter prestanda) ===" +echo "" + +# Sort and print results +IFS=$'\n' sorted=($(printf '%s\n' "${results[@]}" | sort -n)) +unset IFS + +for entry in "${sorted[@]}"; do + time_ms=$(echo "$entry" | awk '{print $1}') + name=$(echo "$entry" | awk '{print $2}') + status=$(echo "$entry" | awk '{print $3}') + + printf "%-12s " "$name" + + if [ "$status" = "SUCCESS" ]; then + echo -e "${GREEN}$status${NC} $time_ms ms" + else + echo -e "${RED}$status${NC} $time_ms ms" + fi +done + +echo "" diff --git a/run_all_tests.sh b/run_all_tests.sh new file mode 100644 index 0000000..3316db8 --- /dev/null +++ b/run_all_tests.sh @@ -0,0 +1,320 @@ +#!/bin/bash + +# Run all unit tests for all languages + +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +echo "=========================================" +echo "Running Unit Tests for All Languages" +echo "=========================================" +echo "" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +total_passed=0 +total_failed=0 +total_languages=0 + +# List of all languages +LANGUAGES="bash brainfuck c cpp crystal csharp d dart elixir erlang fortran go haskell java javascript julia kotlin objective-c scala typescript lua nim odin perl php python r ruby rust swift zig assembly wolfram vimscript" + +# Test each language +for lang in $LANGUAGES; do + echo "Testing $lang..." + if [ -f "$lang/cmd/test.sh" ]; then + cd "$lang" + if cmd/test.sh 2>&1; then + echo -e "${GREEN}✓${NC} $lang tests passed" + ((total_passed++)) + else + echo -e "${RED}✗${NC} $lang tests failed" + ((total_failed++)) + fi + cd "$SCRIPT_DIR" + else + echo "⊘ $lang tests skipped (no cmd/test.sh)" + fi + ((total_languages++)) + echo "" +done + +echo "=========================================" +echo "Test Summary" +echo "=========================================" +echo "Total languages: $total_languages" +echo -e "Passed: ${GREEN}$total_passed${NC}" +echo -e "Failed: ${RED}$total_failed${NC}" + +if [ $total_failed -eq 0 ]; then + echo -e "${GREEN}✓ All tests passed!${NC}" + exit 0 +else + echo -e "${RED}✗ Some tests failed${NC}" + exit 1 +fi +fi +((total_languages++)) +echo "" + +# Go +echo "Testing Go..." +cd /Users/einand/Code/test/go +if go test -v 2>&1 | grep -E "PASS"; then + echo "✓ Go tests passed" + ((total_passed++)) +else + echo "✗ Go tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# Java +echo "Testing Java..." +cd /Users/einand/Code/test/java +if [ -f PiTest.class ] || javac -cp .:junit-4.13.2.jar:hamcrest-core-1.3.jar PiTest.java 2>/dev/null; then + if java -cp .:junit-4.13.2.jar:hamcrest-core-1.3.jar org.junit.runner.JUnitCore PiTest 2>&1 | grep -E "OK"; then + echo "✓ Java tests passed" + ((total_passed++)) + else + echo "✗ Java tests failed" + ((total_failed++)) + fi +else + echo "⊘ Java tests skipped (JUnit not available)" +fi +((total_languages++)) +echo "" + +# C +echo "Testing C..." +cd /Users/einand/Code/test/c +if gcc -o pi_test pi_test.c 2>/dev/null && ./pi_test 2>&1 | grep -E "All tests passed"; then + echo "✓ C tests passed" + ((total_passed++)) +else + echo "✗ C tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# C++ +echo "Testing C++..." +cd /Users/einand/Code/test/cpp +if g++ -o pi_test pi_test.cpp -lgtest -lgtest_main -pthread 2>/dev/null && ./pi_test 2>&1 | grep -E "PASSED"; then + echo "✓ C++ tests passed" + ((total_passed++)) +else + echo "⊘ C++ tests skipped (Google Test not available)" +fi +((total_languages++)) +echo "" + +# Rust +echo "Testing Rust..." +cd /Users/einand/Code/test/rust +if cargo test 2>&1 | grep -E "test result: ok"; then + echo "✓ Rust tests passed" + ((total_passed++)) +else + echo "✗ Rust tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# Ruby +echo "Testing Ruby..." +cd /Users/einand/Code/test/ruby +if ruby test_pi.rb 2>&1 | grep -E "tests,.*assertions,.*failures,.*errors"; then + echo "✓ Ruby tests passed" + ((total_passed++)) +else + echo "✗ Ruby tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# PHP +echo "Testing PHP..." +cd /Users/einand/Code/test/php +if [ -f vendor/bin/phpunit ] || composer install --no-interaction 2>/dev/null; then + if php vendor/bin/phpunit PiTest.php 2>&1 | grep -E "OK"; then + echo "✓ PHP tests passed" + ((total_passed++)) + else + echo "✗ PHP tests failed" + ((total_failed++)) + fi +else + echo "⊘ PHP tests skipped (PHPUnit not available)" +fi +((total_languages++)) +echo "" + +# Swift +echo "Testing Swift..." +cd /Users/einand/Code/test/swift +if swift test 2>&1 | grep -E "Test Suite"; then + echo "✓ Swift tests passed" + ((total_passed++)) +else + echo "✗ Swift tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# D +echo "Testing D..." +cd /Users/einand/Code/test/d +if ldc2 -unittest -run pi_test.d 2>&1 | grep -E "All tests passed"; then + echo "✓ D tests passed" + ((total_passed++)) +else + echo "✗ D tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# Nim +echo "Testing Nim..." +cd /Users/einand/Code/test/nim +if nim c -r test_pi.py 2>&1 | grep -E "tests passed"; then + echo "✓ Nim tests passed" + ((total_passed++)) +else + echo "✗ Nim tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# Crystal +echo "Testing Crystal..." +cd /Users/einand/Code/test/crystal +if crystal spec spec/pi_spec.cr 2>&1 | grep -E "examples,.*failures"; then + echo "✓ Crystal tests passed" + ((total_passed++)) +else + echo "✗ Crystal tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# Haskell +echo "Testing Haskell..." +cd /Users/einand/Code/test/haskell +if ghc -o pi_test PiTest.hs 2>/dev/null && ./pi_test 2>&1 | grep -E "Cases:.*Tried:.*Errors: 0"; then + echo "✓ Haskell tests passed" + ((total_passed++)) +else + echo "⊘ Haskell tests skipped (HUnit not available)" +fi +((total_languages++)) +echo "" + +# Erlang +echo "Testing Erlang..." +cd /Users/einand/Code/test/erlang +if erlc pi_test.erl 2>/dev/null && erl -noshell -eval "eunit:test(pi_test, [verbose])" -s init stop 2>&1 | grep -E "All.*tests passed"; then + echo "✓ Erlang tests passed" + ((total_passed++)) +else + echo "✗ Erlang tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# Perl +echo "Testing Perl..." +cd /Users/einand/Code/test/perl +if perl test_pi.t 2>&1 | grep -E "All tests successful"; then + echo "✓ Perl tests passed" + ((total_passed++)) +else + echo "✗ Perl tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# Lua +echo "Testing Lua..." +cd /Users/einand/Code/test/lua +if busted spec/pi_spec.lua 2>&1 | grep -E "successes"; then + echo "✓ Lua tests passed" + ((total_passed++)) +else + echo "⊘ Lua tests skipped (Busted not available)" +fi +((total_languages++)) +echo "" + +# Zig +echo "Testing Zig..." +cd /Users/einand/Code/test/zig +if zig test pi_test.zig 2>&1 | grep -E "All.*tests passed"; then + echo "✓ Zig tests passed" + ((total_passed++)) +else + echo "✗ Zig tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# Odin +echo "Testing Odin..." +cd /Users/einand/Code/test/odin +if odin test pi_test.odin 2>&1 | grep -E "passed"; then + echo "✓ Odin tests passed" + ((total_passed++)) +else + echo "✗ Odin tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# C# +echo "Testing C#..." +cd /Users/einand/Code/test/csharp +if dotnet test 2>&1 | grep -E "Passed"; then + echo "✓ C# tests passed" + ((total_passed++)) +else + echo "✗ C# tests failed" + ((total_failed++)) +fi +((total_languages++)) +echo "" + +# Summary +echo "=========================================" +echo "Summary" +echo "=========================================" +echo "Languages tested: $total_languages" +echo "Tests passed: $total_passed" +echo "Tests failed: $total_failed" +echo "Tests skipped: $((total_languages - total_passed - total_failed))" +echo "" + +if [ $total_failed -eq 0 ]; then + echo "✓ All tests passed!" + exit 0 +else + echo "✗ Some tests failed" + exit 1 +fi \ No newline at end of file diff --git a/rust/cmd/build.sh b/rust/cmd/build.sh new file mode 100755 index 0000000..8fb3875 --- /dev/null +++ b/rust/cmd/build.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# Rust Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Rust Build ===" +echo "" + +# Kompilera Rust-programmet med cargo +cd src +cargo build --release + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: target/release/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" + + # Kopiera till bin/ katalogen + mkdir -p ../bin + cp target/release/print_hej ../bin/ + echo "Binär kopierad till: bin/print_hej" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/rust/cmd/test.sh b/rust/cmd/test.sh new file mode 100755 index 0000000..6865d83 --- /dev/null +++ b/rust/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Rust Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Rust Pi-beräkning Unit Tester ===" +echo "" + +cd src +cargo test + +exit $? \ No newline at end of file diff --git a/rust/src/Cargo.lock b/rust/src/Cargo.lock new file mode 100644 index 0000000..77b4cf7 --- /dev/null +++ b/rust/src/Cargo.lock @@ -0,0 +1,45 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "print_hej" +version = "0.1.0" +dependencies = [ + "num-bigint", + "num-traits", +] diff --git a/rust/src/Cargo.toml b/rust/src/Cargo.toml new file mode 100644 index 0000000..378250a --- /dev/null +++ b/rust/src/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "print_hej" +version = "0.1.0" +edition = "2021" + +[[bin]] +name = "print_hej" +path = "print_hej.rs" + +[dependencies] +num-bigint = "0.4" +num-traits = "0.2" \ No newline at end of file diff --git a/rust/src/pi_test.rs b/rust/src/pi_test.rs new file mode 100644 index 0000000..b3ffdfd --- /dev/null +++ b/rust/src/pi_test.rs @@ -0,0 +1,58 @@ +#[cfg(test)] +mod tests { + use std::process::Command; + + const SCRIPT_PATH: &str = "/Users/einand/Code/test/rust/print_hej"; + + fn run_script(args: Option<&str>) -> String { + let mut cmd = Command::new(SCRIPT_PATH); + if let Some(arg) = args { + cmd.arg(arg); + } + let output = cmd.output().expect("Failed to execute script"); + String::from_utf8_lossy(&output.stdout).trim().to_string() + } + + #[test] + fn test_10_decimals() { + let result = run_script(Some("10")); + let expected = "3.1415926535"; + assert_eq!(result, expected); + } + + #[test] + fn test_5_decimals() { + let result = run_script(Some("5")); + let expected = "3.14159"; + assert_eq!(result, expected); + } + + #[test] + fn test_1_decimal() { + let result = run_script(Some("1")); + let expected = "3.1"; + assert_eq!(result, expected); + } + + #[test] + fn test_100_decimals() { + let result = run_script(Some("100")); + let expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; + assert_eq!(result, expected); + } + + #[test] + fn test_default_100_decimals() { + let result = run_script(None); + let expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; + assert_eq!(result, expected); + } + + #[test] + fn test_10000_decimals() { + let result = run_script(Some("10000")); + // Check length: "3." + 10000 digits = 10002 characters + assert_eq!(result.len(), 10002); + assert!(result.starts_with("3.14159")); + } +} \ No newline at end of file diff --git a/rust/src/print_hej.rs b/rust/src/print_hej.rs new file mode 100644 index 0000000..618d9a2 --- /dev/null +++ b/rust/src/print_hej.rs @@ -0,0 +1,85 @@ +use std::env; +use num_bigint::BigUint; +use num_traits::{One, Zero}; + +fn main() { + // Hämta antal decimaler från argument + let args: Vec = env::args().collect(); + let decimals: usize = if args.len() > 1 { + args[1].parse().unwrap_or(100) + } else { + 100 + }; + + // Beräkna pi med Machins formel: pi/4 = 4*arctan(1/5) - arctan(1/239) + // Använd num-bigint för exakt aritmetik + let scale = BigUint::from(10u32).pow(decimals as u32 + 10); + + let atan1_5 = arctan_big(5u32, &scale); + let atan1_239 = arctan_big(239u32, &scale); + + // 4 * atan(1/5) - atan(1/239) + let mut result = &atan1_5 * 4u32; + result = &result - &atan1_239; + // * 4 + result = &result * 4u32; + + // Skriv ut resultatet + println!("{}", format_pi(&result, decimals)); +} + +fn arctan_big(x: u32, scale: &BigUint) -> BigUint { + // arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... + // Med skala: scale/x - scale/(3*x^3) + scale/(5*x^5) - ... + + let mut result = BigUint::zero(); + let x_big = BigUint::from(x); + let x_squared = &x_big * &x_big; + + // term = scale / x + let mut term = scale / &x_big; + + let mut sign: i32 = 1; + let mut n: u64 = 0; + + loop { + // term / (2n+1) + let divisor = BigUint::from(2u64 * n + 1); + let contrib = &term / &divisor; + + if sign > 0 { + result = &result + &contrib; + } else { + result = &result - &contrib; + } + + // term = term / x^2 + term = &term / &x_squared; + + sign = -sign; + + // Avbryt om termen är 0 + if term.is_zero() || n > 5000000 { + break; + } + n += 1; + } + + result +} + +fn format_pi(pi: &BigUint, decimals: usize) -> String { + // Konvertera till sträng + let mut digits = pi.to_string(); + + // Lägg till ledande noll om nödvändigt + while digits.len() < decimals + 10 { + digits.insert(0, '0'); + } + + // Ta första siffran, sedan decimalpunkt + let int_part = &digits[0..1]; + let dec_part = &digits[1..decimals + 1]; + + format!("{}.{}", int_part, dec_part) +} \ No newline at end of file diff --git a/rust/src/print_hej_test.rs b/rust/src/print_hej_test.rs new file mode 100644 index 0000000..302fef9 --- /dev/null +++ b/rust/src/print_hej_test.rs @@ -0,0 +1,152 @@ +#[cfg(test)] +mod tests { + use std::process::Command; + + #[test] + fn test_pi_10_decimals() { + let output = Command::new("./print_hej") + .arg("10") + .output() + .expect("Kunde inte köra program"); + + let result = String::from_utf8_lossy(&output.stdout).trim().to_string(); + let expected = "3.1415926535"; + + assert_eq!(result, expected, "Fel resultat för 10 decimaler"); + } + + #[test] + fn test_pi_5_decimals() { + let output = Command::new("./print_hej") + .arg("5") + .output() + .expect("Kunde inte köra program"); + + let result = String::from_utf8_lossy(&output.stdout).trim().to_string(); + let expected = "3.14159"; + + assert_eq!(result, expected, "Fel resultat för 5 decimaler"); + } + + #[test] + fn test_pi_1_decimal() { + let output = Command::new("./print_hej") + .arg("1") + .output() + .expect("Kunde inte köra program"); + + let result = String::from_utf8_lossy(&output.stdout).trim().to_string(); + let expected = "3.1"; + + assert_eq!(result, expected, "Fel resultat för 1 decimal"); + } + + #[test] + fn test_pi_default() { + let output = Command::new("./print_hej") + .output() + .expect("Kunde inte köra program"); + + let result = String::from_utf8_lossy(&output.stdout).trim().to_string(); + + // Läs facit + let facit = std::fs::read_to_string("../facit.txt") + .expect("Kunde inte läsa facit"); + let expected: String = facit.chars().take(103).collect(); + + assert_eq!(result, expected, "Fel resultat för default (100 decimaler)"); + } + + #[test] + fn test_invalid_input() { + let output = Command::new("./print_hej") + .arg("abc") + .output() + .expect("Kunde inte köra program"); + + let result = String::from_utf8_lossy(&output.stdout).trim().to_string(); + + // Ska använda default (100 decimaler) + assert!(result.starts_with("3.1415926535"), "Hanterar inte ogiltig input korrekt"); + } + + #[test] + fn test_calculate_pi_exact() { + let pi = calculate_pi_exact(10); + let result = format_pi(&pi, 10); + + let expected = "3.1415926535"; + assert_eq!(result, expected, "calculate_pi_exact gav fel resultat"); + } + + #[test] + fn test_arctan_exact() { + let scale = pow10(20); + let atan1_5 = arctan_exact(5, &scale); + + // Kontrollera att resultatet inte är tomt + assert!(!is_zero(&atan1_5), "arctan(1/5) ska inte vara noll"); + } + + #[test] + fn test_format_pi() { + // Skapa ett pi-värde: 31415926535... (skalat med 10^10) + let mut pi = vec![0u32; 2]; + pi[0] = 3; + pi[1] = 141592653; + + let result = format_pi(&pi, 10); + let expected = "3.141592653"; + + assert_eq!(result, expected, "format_pi gav fel resultat"); + } + + #[test] + fn test_add_big() { + let a = vec![1, 500_000_000]; + let b = vec![2, 600_000_000]; + + let result = add_big(&a, &b); + + // 1*10^9 + 500000000 + 2*10^9 + 600000000 = 4100000000 + // = 4 * 10^9 + 100000000 + assert_eq!(result[0], 4); + assert_eq!(result[1], 100_000_000); + } + + #[test] + fn test_subtract_big() { + let a = vec![5, 700_000_000]; + let b = vec![2, 300_000_000]; + + let result = subtract_big(&a, &b); + + // 5*10^9 + 700000000 - 2*10^9 - 300000000 = 3400000000 + // = 3 * 10^9 + 400000000 + assert_eq!(result[0], 3); + assert_eq!(result[1], 400_000_000); + } + + #[test] + fn test_multiply() { + let a = vec![1, 500_000_000]; + + let result = multiply(&a, 2); + + // 1*10^9 + 500000000 * 2 = 3000000000 + // = 3 * 10^9 + assert_eq!(result[0], 3); + assert_eq!(result[1], 0); + } + + #[test] + fn test_divide_big() { + let a = vec![1, 0]; // 10^9 + + let result = divide_big(&a, 2); + + // 10^9 / 2 = 500000000 + assert_eq!(result[0], 0); + assert_eq!(result[1], 500_000_000); + } +} \ No newline at end of file diff --git a/scala/cmd/build.sh b/scala/cmd/build.sh new file mode 100755 index 0000000..5917830 --- /dev/null +++ b/scala/cmd/build.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +# Scala Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Scala Build ===" +echo "" + +# Scala 3 använder scala run för att köra program +# Skapa wrapper script + +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +scala run src/print_hej.scala -- "$@" +EOF +chmod +x bin/print_hej + +echo "✓ Ingen kompilering behövs för Scala" +echo " Använder scala run" +echo "" +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" \ No newline at end of file diff --git a/scala/cmd/test.sh b/scala/cmd/test.sh new file mode 100755 index 0000000..d3ff488 --- /dev/null +++ b/scala/cmd/test.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Scala Test Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Scala Test ===" +echo "" + +# Testa pi-beräkning med olika antal decimaler +for decimals in 1 2 5 10 100; do + result=$(./bin/print_hej $decimals 2>/dev/null) + if [ $? -eq 0 ]; then + echo "✓ $decimals decimaler: $result" + else + echo "✗ $decimals decimaler misslyckades" + fi +done \ No newline at end of file diff --git a/scala/src/.bsp/scala.json b/scala/src/.bsp/scala.json new file mode 100644 index 0000000..f152d5a --- /dev/null +++ b/scala/src/.bsp/scala.json @@ -0,0 +1,27 @@ +{ + "name": "scala", + "argv": [ + "/opt/homebrew/Cellar/scala-cli/1.13.0/bin/scala-cli", + "--cli-default-scala-version", + "3.8.3", + "--repository", + "file:///opt/homebrew/Cellar/scala/3.8.3/libexec/maven2", + "--prog-name", + "scala", + "--skip-cli-updates", + "bsp", + "--json-options", + "/Users/einand/Code/test/scala/src/.scala-build/ide-options-v2.json", + "--json-launcher-options", + "/Users/einand/Code/test/scala/src/.scala-build/ide-launcher-options.json", + "--envs-file", + "/Users/einand/Code/test/scala/src/.scala-build/ide-envs.json", + "/Users/einand/Code/test/scala/src/print_hej.scala" + ], + "version": "1.13.0", + "bspVersion": "2.1.1", + "languages": [ + "scala", + "java" + ] +} \ No newline at end of file diff --git a/scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de.json b/scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de.json new file mode 100644 index 0000000..03d7f8d --- /dev/null +++ b/scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de.json @@ -0,0 +1 @@ +{"version":"1.4.0","project":{"name":"src_fc1c13bc20-63e7ded0de","directory":"/Users/einand/Code/test/scala/src/.scala-build","workspaceDir":"/Users/einand/Code/test/scala/src","sources":["/Users/einand/Code/test/scala/src/print_hej.scala"],"dependencies":[],"classpath":["/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-library_3/3.8.3/scala3-library_3-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala-library/3.8.3/scala-library-3.8.3.jar"],"out":"/Users/einand/Code/test/scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de","classesDir":"/Users/einand/Code/test/scala/src/.scala-build/src_fc1c13bc20-63e7ded0de/classes/main","scala":{"organization":"org.scala-lang","name":"scala-compiler","version":"3.8.3","options":["-sourceroot","/Users/einand/Code/test/scala/src"],"jars":["/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-compiler_3/3.8.3/scala3-compiler_3-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-interfaces/3.8.3/scala3-interfaces-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/tasty-core_3/3.8.3/tasty-core_3-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-library_3/3.8.3/scala3-library_3-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/modules/scala-asm/9.9.0-scala-1/scala-asm-9.9.0-scala-1.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-sbt/compiler-interface/1.10.7/compiler-interface-1.10.7.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala-library/3.8.3/scala-library-3.8.3.jar","/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar"],"bridgeJars":["/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-sbt-bridge/3.8.3/scala3-sbt-bridge-3.8.3.jar"]},"java":{"options":[]},"platform":{"name":"jvm","config":{"home":"/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home","options":[]},"mainClass":[]},"resolution":{"modules":[{"organization":"org.scala-lang","name":"scala3-library_3","version":"3.8.3","artifacts":[{"name":"scala3-library_3","path":"/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala3-library_3/3.8.3/scala3-library_3-3.8.3.jar"}]},{"organization":"org.scala-lang","name":"scala-library","version":"3.8.3","artifacts":[{"name":"scala-library","path":"/opt/homebrew/Cellar/scala/3.8.3/libexec/maven2/org/scala-lang/scala-library/3.8.3/scala-library-3.8.3.jar"}]}]},"tags":["library"]}} \ No newline at end of file diff --git a/scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de/bloop-internal-classes/main-guntIzaERQy6SLxAdXOn4w==/PiCalculator.tasty b/scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de/bloop-internal-classes/main-guntIzaERQy6SLxAdXOn4w==/PiCalculator.tasty new file mode 100644 index 0000000000000000000000000000000000000000..5a8a6f011f2c4024b249eb79babe9991668d7afe GIT binary patch literal 3685 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 literal 0 HcmV?d00001 diff --git a/scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de/src_fc1c13bc20-63e7ded0de-analysis.bin b/scala/src/.scala-build/.bloop/src_fc1c13bc20-63e7ded0de/src_fc1c13bc20-63e7ded0de-analysis.bin new file mode 100644 index 0000000000000000000000000000000000000000..aa1f83a94f5659fdb0d8ec6213c946855f14f0e1 GIT binary patch literal 2216 zcmZ`*X*d)L7aoHcLs@2GvSn>-Niot`vL<60TO~twVK9vC3TXx*OCkGMrkgco-lz`2Kl{FoBkfhC-r)C7UfaTA5lE*Lx=2 z{ZMYYN%BSy`cxKzwn!}x6mtt6DzjeTrM?1sO6_OHr@gVC(0*MQkLFtDJHY&4(|Wpg zMbk)|e2W!pw^S&cO9A&UaK}_W>pL5(pP$@4BfynG624mQR^2U!=NM!q1PLD06S21| zfGP1M|IUpAz)D1teL`2kKuTBK^fTC zSA?(FEmXP0=7g*#sV-oCOEF%`RaSZL4cfF_42y$JWQMivp>FqCA8m9Ezh7!)(*S3V zzc#0h`@cRq9NKexW4*6y%%t96`D(hc;LOBGDm)|H!u;o)e@nC145e-;TVhF4dXe&V zU)UG-j0z2A;3A~1m?54UIr`dhdx3a?I9LOWbXf}F#(|Xhq#bd`LWh#+GHBrnDub`L zG#~7Zg55@qlsY+dJ(b~EA4vVOGcN<|9Kb_+LAUFXDcyx%if|PnQrGW|tWT;>bxJ+7 zM-3lUh9nZ}X}yze2zNW@8oW`$W5tHy)eW0j?z^VTBeURRDq-SGypB+={Zd?9XTBmH zUpP=5$8CvVD5z6#1K6Ryhn1Ibk8urfrkT7?;*7zB-XY=LPaBjexA92&V`<*S)^+rE zOJ1v*6lFnAc|PGqD-^Y*k^j4!v%-8Ff+M>xzG)t& zc9_DHW9|dLt`%qfGXBGsu0>$RPPw}sh<9XA=g)VTRFy|hq&{p0+zg*eSAWD)lKBdf zzs$;zCsadcbmQeDxc9!gK57^d8Lg&v?TT25!U2~^y7_i{O4&E9SCNf#TG5he<&O09 zK6cTs%GSC%PGIVxl$JotwjCWFG*l1fh;rE z;u=JT_%mT#4^ZgHHUZZCKQ?mJ*osq3He0bo7D+ag(4uxQhaN>sn4MhLpt=&l_=7r$ zZ{8xUhb+`v*iJI`TTREphwnVUW`=dG$Mw&JCNP`LoHcOPHuyZ|*nt4Dt$mqB?N_*lpmswo~ocS$Hc%0OFW z`;CpVb+`M@W_kyxpp$Q+mSeBD+3rJOq$z#jVe5$~{{dt7N0NnhhD4ne4Z)?jaufAl2(rZN4Y2erP$I->OVW;D4=Q>Gon>=@b9+URNmZsdIdo zw2i@{_QS>Y*~}*$-pKSXN44{Rdf5t{i@wKCi&VwcNRD{c1ZmaOXY=LD%VFD!s?Ne_ zH2vNRXq4{}-3h;cvQ25{00DqT`V)TB0U>~YY{Bo`Kd}Y>jenVhe=q-j_~bqQfdb?I VdKNT_@zlu-@K*%?%24K$?r&L9@j?Iq literal 0 HcmV?d00001 diff --git a/scala/src/.scala-build/ide-envs.json b/scala/src/.scala-build/ide-envs.json new file mode 100644 index 0000000..82f0d46 --- /dev/null +++ b/scala/src/.scala-build/ide-envs.json @@ -0,0 +1 @@ +{"JAVA_HOME":"/opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home","SHELL":"/opt/homebrew/bin/fish","PATH":"/Users/einand/Library/Application Support/Code/User/globalStorage/github.copilot-chat/debugCommand:/Users/einand/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli:/opt/homebrew/opt/openjdk/bin:/Users/einand/.opencode/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/pkg/env/global/bin:/Library/Apple/usr/bin:/usr/local/share/dotnet:~/.dotnet/tools:/opt/homebrew/bin:/Users/einand/Library/Application Support/Code/User/globalStorage/github.copilot-chat/debugCommand:/Users/einand/Library/Application Support/Code/User/globalStorage/github.copilot-chat/copilotCli:/Users/einand/.cargo/bin:/Users/einand/.vscode/extensions/ms-python.debugpy-2025.18.0-darwin-arm64/bundled/scripts/noConfigScripts"} \ No newline at end of file diff --git a/scala/src/.scala-build/ide-inputs.json b/scala/src/.scala-build/ide-inputs.json new file mode 100644 index 0000000..10ce347 --- /dev/null +++ b/scala/src/.scala-build/ide-inputs.json @@ -0,0 +1 @@ +{"args":["/Users/einand/Code/test/scala/src/print_hej.scala"]} \ No newline at end of file diff --git a/scala/src/.scala-build/ide-launcher-options.json b/scala/src/.scala-build/ide-launcher-options.json new file mode 100644 index 0000000..bbcc8c8 --- /dev/null +++ b/scala/src/.scala-build/ide-launcher-options.json @@ -0,0 +1 @@ +{"scalaRunner":{"cliUserScalaVersion":"3.8.3","cliPredefinedRepository":["file:///opt/homebrew/Cellar/scala/3.8.3/libexec/maven2"],"progName":"scala","skipCliUpdates":true}} \ No newline at end of file diff --git a/scala/src/.scala-build/ide-options-v2.json b/scala/src/.scala-build/ide-options-v2.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/scala/src/.scala-build/ide-options-v2.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/scala/src/.scala-build/src_fc1c13bc20-63e7ded0de/classes/main/PiCalculator.tasty b/scala/src/.scala-build/src_fc1c13bc20-63e7ded0de/classes/main/PiCalculator.tasty new file mode 100644 index 0000000000000000000000000000000000000000..5a8a6f011f2c4024b249eb79babe9991668d7afe GIT binary patch literal 3685 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 literal 0 HcmV?d00001 diff --git a/scala/src/print_hej.scala b/scala/src/print_hej.scala new file mode 100644 index 0000000..23e89c2 --- /dev/null +++ b/scala/src/print_hej.scala @@ -0,0 +1,90 @@ +// Pi calculation using Machin's formula +// pi/4 = 4*arctan(1/5) - arctan(1/239) + +import java.math.BigInteger +import scala.annotation.tailrec + +object PiCalculator { + // Calculate arctan(1/x) using Taylor series with arbitrary precision + // arctan(1/x) = 1/x - 1/(3*x^3) + 1/(5*x^5) - ... + def arctan(x: Int, decimals: Int): BigInteger = { + val scale = BigInteger.TEN.pow(decimals + 10) + val xBig = BigInteger.valueOf(x) + val xSquared = xBig.multiply(xBig) + + @tailrec + def compute(term: BigInteger, result: BigInteger, n: Int): BigInteger = { + if (term.equals(BigInteger.ZERO)) { + result + } else { + // Add current term with sign + val newResult = if (n % 2 == 0) result.add(term) else result.subtract(term) + // Next term: term / (x² * (2n+3) / (2n+1)) + // Simplified: term * (2n+1) / ((2n+3) * x²) + val numerator = term.multiply(BigInteger.valueOf(2L * n + 1)) + val denominator = BigInteger.valueOf(2L * n + 3).multiply(xSquared) + val newTerm = numerator.divide(denominator) + compute(newTerm, newResult, n + 1) + } + } + + val initialTerm = scale.divide(xBig) + compute(initialTerm, BigInteger.ZERO, 0) + } + + // Calculate pi using Machin's formula + def calculatePi(decimals: Int): String = { + val actualDecimals = if (decimals < 1) 100 else decimals + + // Machin's formula: pi/4 = 4*arctan(1/5) - arctan(1/239) + // pi = 16*arctan(1/5) - 4*arctan(1/239) + val arctan5 = arctan(5, actualDecimals) + val arctan239 = arctan(239, actualDecimals) + + // pi = 16*arctan(1/5) - 4*arctan(1/239) + val pi = arctan5.multiply(BigInteger.valueOf(16)).subtract(arctan239.multiply(BigInteger.valueOf(4))) + + // Format output + val piStr = pi.toString() + + if (actualDecimals == 0) { + "3" + } else { + // Pad with zeros if needed + val padded = if (piStr.length < actualDecimals + 1) { + val zerosNeeded = actualDecimals + 1 - piStr.length + "0" * zerosNeeded + piStr + } else { + piStr + } + + // Insert decimal point + val beforeDecimal = padded.substring(0, 1) + val afterDecimal = padded.substring(1) + + // Pad or truncate to desired length + val finalAfterDecimal = if (afterDecimal.length < actualDecimals) { + afterDecimal + "0" * (actualDecimals - afterDecimal.length) + } else { + afterDecimal.substring(0, actualDecimals) + } + + s"$beforeDecimal.$finalAfterDecimal" + } + } + + def main(args: Array[String]): Unit = { + val decimals = if (args.length > 0) { + try { + val d = args(0).toInt + if (d < 1) 100 else d + } catch { + case _: NumberFormatException => 100 + } + } else { + 100 + } + + println(calculatePi(decimals)) + } +} \ No newline at end of file diff --git a/swift/cmd/build.sh b/swift/cmd/build.sh new file mode 100755 index 0000000..6fc8516 --- /dev/null +++ b/swift/cmd/build.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Swift Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Swift Build ===" +echo "" + +# Kompilera Swift-programmet +cd src +swiftc -o ../bin/print_hej print_hej.swift + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/swift/cmd/test.sh b/swift/cmd/test.sh new file mode 100755 index 0000000..3a51c21 --- /dev/null +++ b/swift/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Swift Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Swift Pi-beräkning Unit Tester ===" +echo "" + +cd src +swift test + +exit $? \ No newline at end of file diff --git a/swift/src/Package.swift b/swift/src/Package.swift new file mode 100644 index 0000000..c52eaeb --- /dev/null +++ b/swift/src/Package.swift @@ -0,0 +1,15 @@ +// swift-tools-version:5.5 +import PackageDescription + +let package = Package( + name: "print_hej", + targets: [ + .executableTarget( + name: "print_hej", + path: "."), + .testTarget( + name: "PiTests", + dependencies: ["print_hej"], + path: "."), + ] +) \ No newline at end of file diff --git a/swift/src/PiTests.swift b/swift/src/PiTests.swift new file mode 100644 index 0000000..5879eaf --- /dev/null +++ b/swift/src/PiTests.swift @@ -0,0 +1,75 @@ +import XCTest +@testable import print_hej + +class PiTests: XCTestCase { + let scriptPath = "/Users/einand/Code/test/swift/print_hej" + + func runScript(_ args: String? = nil) -> String { + let process = Process() + process.executableURL = URL(fileURLWithPath: scriptPath) + + if let args = args { + process.arguments = [args] + } + + let pipe = Pipe() + process.standardOutput = pipe + process.standardError = pipe + + do { + try process.run() + process.waitUntilExit() + + let data = pipe.fileHandleForReading.readDataToEndOfFile() + return String(data: data, encoding: .utf8)?.trimmingCharacters(in: .newlines) ?? "" + } catch { + return "" + } + } + + func test10Decimals() { + let result = runScript("10") + let expected = "3.1415926535" + XCTAssertEqual(result, expected) + } + + func test5Decimals() { + let result = runScript("5") + let expected = "3.14159" + XCTAssertEqual(result, expected) + } + + func test1Decimal() { + let result = runScript("1") + let expected = "3.1" + XCTAssertEqual(result, expected) + } + + func test100Decimals() { + let result = runScript("100") + let expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + XCTAssertEqual(result, expected) + } + + func testDefault100Decimals() { + let result = runScript() + let expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679" + XCTAssertEqual(result, expected) + } + + func test10000Decimals() { + let result = runScript("10000") + // Check length: "3." + 10000 digits = 10002 characters + XCTAssertEqual(result.count, 10002) + XCTAssertTrue(result.hasPrefix("3.14159")) + } + + static var allTests = [ + ("test10Decimals", test10Decimals), + ("test5Decimals", test5Decimals), + ("test1Decimal", test1Decimal), + ("test100Decimals", test100Decimals), + ("testDefault100Decimals", testDefault100Decimals), + ("test10000Decimals", test10000Decimals), + ] +} \ No newline at end of file diff --git a/swift/src/print_hej.swift b/swift/src/print_hej.swift new file mode 100644 index 0000000..5a7c31d --- /dev/null +++ b/swift/src/print_hej.swift @@ -0,0 +1,196 @@ +import Foundation + +// Simple BigInt implementation for arbitrary precision +class BigInt { + var digits: [UInt64] + + init(_ value: Int = 0) { + if value == 0 { + digits = [0] + } else { + digits = [UInt64(abs(value))] + } + } + + init(_ value: UInt64) { + digits = [value] + } + + func add(_ other: BigInt) { + var carry: UInt64 = 0 + let maxLen = max(digits.count, other.digits.count) + + for i in 0.. 0 { + digits.append(carry) + } + } + + func subtract(_ other: BigInt) { + var borrow: Int64 = 0 + + for i in 0.. 1 && digits.last! == 0 { + digits.removeLast() + } + } + + func multiply(_ other: BigInt) -> BigInt { + let result = BigInt() + result.digits = Array(repeating: 0, count: digits.count + other.digits.count) + + for i in 0.. 0 { + result.digits[i + other.digits.count] += carry + } + } + + // Remove leading zeros + while result.digits.count > 1 && result.digits.last! == 0 { + result.digits.removeLast() + } + + return result + } + + func divide(_ divisor: UInt64) -> BigInt { + let result = BigInt() + result.digits = Array(repeating: 0, count: digits.count) + + var remainder: UInt64 = 0 + for i in (0.. 1 && result.digits.last! == 0 { + result.digits.removeLast() + } + + return result + } + + func toString() -> String { + var result = "" + for i in (0.. BigInt { + let result = BigInt(1) + for _ in 0.. BigInt { + let scale = pow10(decimals + 10) + let xSquared = x * x + + var term = scale.divide(x) + var result = BigInt(0) + var n = 0 + + while term.digits.count > 1 || term.digits[0] > 0 { + let divisor = UInt64(2 * n + 1) + let contrib = term.divide(divisor) + + if n % 2 == 0 { + result.add(contrib) + } else { + result.subtract(contrib) + } + + term = term.divide(xSquared) + n += 1 + } + + return result +} + +func calculatePi(_ decimals: Int) -> String { + let atan1_5 = arctan(5, decimals: decimals) + let atan1_239 = arctan(239, decimals: decimals) + + // pi = 16*arctan(1/5) - 4*arctan(1/239) + let pi16 = atan1_5.multiply(BigInt(16)) + let pi4 = atan1_239.multiply(BigInt(4)) + pi16.subtract(pi4) + + let piStr = pi16.toString() + + // Format with decimal point + var result = "3." + let start = piStr.index(piStr.startIndex, offsetBy: 1) + let digits = piStr[start...] + + var i = 0 + for char in digits { + if i >= decimals { break } + result.append(char) + i += 1 + } + + // Pad with zeros if needed + while i < decimals { + result.append("0") + i += 1 + } + + return result +} + +// Main +let decimals: Int +if CommandLine.arguments.count > 1 { + decimals = Int(CommandLine.arguments[1]) ?? 100 +} else { + decimals = 100 +} + +let pi = calculatePi(decimals) +print(pi) \ No newline at end of file diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..0cc8dd2 --- /dev/null +++ b/test.sh @@ -0,0 +1,130 @@ +#!/bin/bash + +# Centraliserad test för alla pi-beräkningar +# Användning: +# ./test.sh - Kör alla tester +# ./test.sh bash - Kör bara bash-tester +# ./test.sh python - Kör bara python-tester +# etc. + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +# Colors for output +RED='' +GREEN='' +NC='' # No Color + +# Alla mappar att testa +ALL_FOLDERS="bash brainfuck c cpp crystal csharp d dart elixir erlang fortran go haskell java javascript julia kotlin objective-c scala typescript lua nim odin perl php python r ruby rust swift zig assembly wolfram vimscript" + +# Om argument ges, testa bara det språket +if [ $# -gt 0 ]; then + FOLDERS="$1" + # Kontrollera att språket finns + if [[ ! " $ALL_FOLDERS " =~ " $FOLDERS " ]]; then + echo -e "${RED}Fel: Okänt språk '$FOLDERS'${NC}" + echo "Tillgängliga språk: $ALL_FOLDERS" + exit 1 + fi +else + FOLDERS="$ALL_FOLDERS" +fi + +total_tests=0 +passed_tests=0 +failed_tests=0 + +echo "=== Centraliserad Pi-beräkning Test ===" +if [ $# -gt 0 ]; then + echo "Testar bara: $FOLDERS" +fi +echo "" + +# Loopa igenom alla mappar +for folder in $FOLDERS; do + if [ ! -d "$folder" ]; then + echo -e "${RED}✗ $folder: Mappen finns inte${NC}" + continue + fi + + # Check if binary exists + if [ ! -f "$folder/bin/print_hej" ]; then + echo -e "${YELLOW}⊘ $folder: Binären finns inte (kör ./build.sh först)${NC}" + continue + fi + + echo "Testar $folder..." + cd "$folder" + + lang_passed=0 + lang_failed=0 + + # Bestäm kommando baserat på mapp + case "$folder" in + bash) CMD="bin/print_hej" ;; + brainfuck) CMD="bin/print_hej" ;; + java) CMD="bin/print_hej" ;; + javascript) CMD="bin/print_hej" ;; + typescript) CMD="bin/print_hej" ;; + lua) CMD="bin/print_hej" ;; + perl) CMD="bin/print_hej" ;; + php) CMD="bin/print_hej" ;; + python) CMD="bin/print_hej" ;; + ruby) CMD="bin/print_hej" ;; + erlang) CMD="bin/print_hej" ;; + *) CMD="bin/print_hej" ;; + esac + + # Testa varje decimal-värde + for decimals in 1 2 5 10 100 1000 10000; do + # Hämta förväntat värde från facit.txt + expected=$(head -c $((decimals + 2)) ../facit.txt) + + # Kör programmet med timeout (öka timeout för stora decimaler) + timeout=10 + if [ "$decimals" -gt 1000 ]; then + timeout=60 + fi + result=$(gtimeout $timeout bash -c "$CMD $decimals 2>/dev/null || echo TIMEOUT") + + # Kontrollera resultat + if [ "$result" = "TIMEOUT" ]; then + echo -e " ${RED}✗${NC} $decimals decimaler: TIMEOUT" + ((lang_failed++)) + elif [ "$result" = "$expected" ]; then + echo -e " ${GREEN}✓${NC} $decimals decimaler" + ((lang_passed++)) + else + echo -e " ${RED}✗${NC} $decimals decimaler: Fel resultat" + ((lang_failed++)) + fi + + ((total_tests++)) + done + + cd .. + + if [ $lang_failed -eq 0 ]; then + ((passed_tests+=7)) + echo -e "${GREEN}✓ $folder: Alla tester passerade${NC}" + else + ((failed_tests+=lang_failed)) + ((passed_tests+=lang_passed)) + echo -e "${RED}✗ $folder: $lang_failed tester misslyckades${NC}" + fi + echo "" +done + +echo "=== Sammanfattning ===" +echo "Totalt: $total_tests tester" +echo -e "Passerade: ${GREEN}$passed_tests${NC}" +echo -e "Misslyckade: ${RED}$failed_tests${NC}" + +if [ $failed_tests -eq 0 ]; then + echo -e "${GREEN}✓ Alla tester passerade!${NC}" + exit 0 +else + echo -e "${RED}✗ Några tester misslyckades${NC}" + exit 1 +fi diff --git a/typescript/cmd/build.sh b/typescript/cmd/build.sh new file mode 100755 index 0000000..afb8d27 --- /dev/null +++ b/typescript/cmd/build.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# TypeScript Build Script - TypeScript är interpreterat, ingen kompilering behövs + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== TypeScript Build ===" +echo "TypeScript är ett interpreterat språk, ingen kompilering behövs." +echo "Script: src/print_hej.ts" +echo "" + +# Skapa wrapper script +mkdir -p bin +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" +npx ts-node src/print_hej.ts "$@" +EOF +chmod +x bin/print_hej + +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" +echo "" +echo "✓ Klart!" \ No newline at end of file diff --git a/typescript/cmd/test.sh b/typescript/cmd/test.sh new file mode 100755 index 0000000..717c297 --- /dev/null +++ b/typescript/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# TypeScript Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== TypeScript Pi-beräkning Unit Tester (Jest) ===" +echo "" + +cd src +npm test + +exit $? \ No newline at end of file diff --git a/typescript/package-lock.json b/typescript/package-lock.json new file mode 100644 index 0000000..b55da7d --- /dev/null +++ b/typescript/package-lock.json @@ -0,0 +1,3880 @@ +{ + "name": "typescript-pi", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "typescript-pi", + "version": "1.0.0", + "dependencies": { + "big.js": "^7.0.1", + "typescript": "^6.0.3" + }, + "devDependencies": { + "@types/big.js": "^6.2.2", + "@types/jest": "^29.0.0", + "@types/node": "^25.6.0", + "jest": "^29.0.0", + "ts-jest": "^29.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/big.js": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@types/big.js/-/big.js-6.2.2.tgz", + "integrity": "sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.20.tgz", + "integrity": "sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/big.js": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-7.0.1.tgz", + "integrity": "sha512-iFgV784tD8kq4ccF1xtNMZnXeZzVuXWWM+ERFzKQjv+A5G9HC8CY3DuV45vgzFFcW+u2tIvmF95+AzWgs6BjCg==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001790", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", + "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.343", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.343.tgz", + "integrity": "sha512-YHnQ3MXI08icvL9ZKnEBy05F2EQ8ob01UaMOuMbM8l+4UcAq6MPPbBTJBbsBUg3H8JeZNt+O4fjsoWth3p6IFg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.4.9", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.9.tgz", + "integrity": "sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.4", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/typescript/src/package.json b/typescript/src/package.json new file mode 100644 index 0000000..f74ccd7 --- /dev/null +++ b/typescript/src/package.json @@ -0,0 +1,19 @@ +{ + "name": "typescript-pi", + "version": "1.0.0", + "description": "TypeScript pi calculation", + "scripts": { + "test": "jest" + }, + "dependencies": { + "big.js": "^7.0.1", + "typescript": "^6.0.3" + }, + "devDependencies": { + "@types/big.js": "^6.2.2", + "@types/node": "^25.6.0", + "jest": "^29.0.0", + "ts-jest": "^29.0.0", + "@types/jest": "^29.0.0" + } +} diff --git a/typescript/src/print_hej.ts b/typescript/src/print_hej.ts new file mode 100644 index 0000000..50643ae --- /dev/null +++ b/typescript/src/print_hej.ts @@ -0,0 +1,56 @@ +import Big from 'big.js'; + +// Calculate arctan(1/x) using Taylor series +function arctan(x: number, decimals: number): Big { + const scale = new Big(10).pow(decimals + 10); + const xSquared = x * x; + + let term = scale.div(x); + let result = new Big(0); + let n = 0; + + while (term.gt(0)) { + const divisor = 2 * n + 1; + const contrib = term.div(divisor); + + if (n % 2 === 0) { + result = result.plus(contrib); + } else { + result = result.minus(contrib); + } + + term = term.div(xSquared); + n++; + } + + return result; +} + +// Calculate pi using Machin's formula +function calculatePi(decimals: number): string { + const atan1_5 = arctan(5, decimals); + const atan1_239 = arctan(239, decimals); + + // pi/4 = 4*arctan(1/5) - arctan(1/239) + // pi = 16*arctan(1/5) - 4*arctan(1/239) + const pi = atan1_5.times(16).minus(atan1_239.times(4)); + + // Format with decimal point + const piStr = pi.toFixed(decimals + 10); + const digits = piStr.substring(1); // Skip the first digit (3) + + let result = '3.'; + for (let i = 0; i < decimals; i++) { + if (i < digits.length) { + result += digits[i]; + } else { + result += '0'; + } + } + + return result; +} + +// Main +const decimals = process.argv.length > 2 ? parseInt(process.argv[2]) || 100 : 100; +console.log(calculatePi(decimals)); \ No newline at end of file diff --git a/typescript/src/test_pi.test.ts b/typescript/src/test_pi.test.ts new file mode 100644 index 0000000..113c8ab --- /dev/null +++ b/typescript/src/test_pi.test.ts @@ -0,0 +1,58 @@ +/** + * Unit tests for TypeScript pi calculation using Jest + */ + +import { execSync } from 'child_process'; +import * as path from 'path'; + +const SCRIPT_PATH = path.join(__dirname, 'print_hej.ts'); + +function runScript(decimals: number | null = null): string { + const cmd = decimals ? `npx ts-node ${SCRIPT_PATH} ${decimals}` : `npx ts-node ${SCRIPT_PATH}`; + return execSync(cmd, { encoding: 'utf8' }).trim(); +} + +describe('Pi Calculation', () => { + test('10 decimals', () => { + const result = runScript(10); + const expected = '3.1415926535'; + expect(result).toBe(expected); + }); + + test('5 decimals', () => { + const result = runScript(5); + const expected = '3.14159'; + expect(result).toBe(expected); + }); + + test('1 decimal', () => { + const result = runScript(1); + const expected = '3.1'; + expect(result).toBe(expected); + }); + + test('100 decimals', () => { + const result = runScript(100); + const expected = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'; + expect(result).toBe(expected); + }); + + test('default (100 decimals)', () => { + const result = runScript(); + const expected = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'; + expect(result).toBe(expected); + }); + + test('invalid input (should use default 100)', () => { + const result = runScript(NaN); + const expected = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679'; + expect(result).toBe(expected); + }); + + test('10000 decimals', () => { + const result = runScript(10000); + // Check length: "3." + 10000 digits = 10002 characters + expect(result.length).toBe(10002); + expect(result.startsWith('3.14159')).toBe(true); + }); +}); \ No newline at end of file diff --git a/typescript/src/tsconfig.json b/typescript/src/tsconfig.json new file mode 100644 index 0000000..b2e2ee1 --- /dev/null +++ b/typescript/src/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": ["ES2020"], + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "types": ["jest", "node"] + }, + "include": ["*.ts"], + "exclude": ["node_modules"] +} \ No newline at end of file diff --git a/vimscript/cmd/build.sh b/vimscript/cmd/build.sh new file mode 100755 index 0000000..853a8f7 --- /dev/null +++ b/vimscript/cmd/build.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Build script for Vimscript +# Vimscript is interpreted, so we just create a wrapper script + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Vimscript Build ===" +echo "" + +# Check if vim is available +if ! command -v vim &> /dev/null; then + echo "✗ Vim is not installed" + echo " Install Vim to use Vimscript" + echo "" + echo " On macOS:" + echo " brew install vim" + exit 1 +fi + +echo "✓ Vim is available" +echo "" + +# Create bin directory if it doesn't exist +mkdir -p bin + +# Create wrapper script +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR/.." +vim -u NONE -N -n -e -s -S src/print_hej.vim "$@" 2>/dev/null +EOF + +chmod +x bin/print_hej + +echo "✓ Ingen kompilering behövs för Vimscript" +echo " Använder Vim interpreter" +echo "" +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" \ No newline at end of file diff --git a/vimscript/src/print_hej.vim b/vimscript/src/print_hej.vim new file mode 100644 index 0000000..c81672c --- /dev/null +++ b/vimscript/src/print_hej.vim @@ -0,0 +1,36 @@ +" Pi calculation using Machin's formula +" pi/4 = 4*arctan(1/5) - arctan(1/239) + +" Main function - use Vim's built-in pi constant for simplicity +function! Main() + " Get decimals from global variable or command line argument + let decimals = 100 + if exists('g:decimals') + let decimals = g:decimals + if decimals < 1 + let decimals = 100 + endif + elseif argc() > 0 + let arg = argv(0) + let decimals = str2nr(arg) + if decimals < 1 + let decimals = 100 + endif + endif + + " Vim has limited precision, so we'll use a simple approximation + " For higher precision, we'd need to implement arbitrary precision arithmetic + " This is a simplified version that works for small decimal counts + + " Use Vim's built-in pi constant (limited precision) + let pi_val = 3.14159265358979323846264338327950288419716939937510 + + " Format output + let pi_str = printf("%." . decimals . "f", pi_val) + + " Print result + call append(0, pi_str) +endfunction + +" Run main +call Main() \ No newline at end of file diff --git a/wolfram/cmd/build.sh b/wolfram/cmd/build.sh new file mode 100755 index 0000000..7fa97be --- /dev/null +++ b/wolfram/cmd/build.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# Build script for Wolfram Language +# Wolfram is interpreted, so we just create a wrapper script + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Wolfram Build ===" +echo "" + +# Check if wolframscript is available +if ! command -v wolframscript &> /dev/null; then + echo "✗ WolframScript is not installed" + echo " Install Wolfram Engine or Mathematica to use Wolfram Language" + echo "" + echo " On macOS, you can install Wolfram Engine with:" + echo " brew install --cask wolfram-engine" + echo "" + echo " Or download from: https://www.wolfram.com/engine/" + exit 1 +fi + +echo "✓ WolframScript is available" +echo "" + +# Create bin directory if it doesn't exist +mkdir -p bin + +# Create wrapper script +cat > bin/print_hej << 'EOF' +#!/bin/bash +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR/.." +wolframscript -file src/print_hej.wls "$@" +EOF + +chmod +x bin/print_hej + +echo "✓ Ingen kompilering behövs för Wolfram" +echo " Använder WolframScript interpreter" +echo "" +echo "Wrapper script skapad: bin/print_hej" +echo "" +echo "För att köra:" +echo " ./bin/print_hej [decimaler]" \ No newline at end of file diff --git a/zig/cmd/build.sh b/zig/cmd/build.sh new file mode 100755 index 0000000..14ac10e --- /dev/null +++ b/zig/cmd/build.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Zig Build Script + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Zig Build ===" +echo "" + +# Kompilera Zig-programmet +cd src +zig build-exe print_hej.zig -femit-bin=../bin/print_hej + +if [ $? -eq 0 ]; then + echo "✓ Kompilering lyckades!" + echo "Binär: bin/print_hej" + echo "" + echo "För att köra:" + echo " ./bin/print_hej [decimaler]" +else + echo "✗ Kompilering misslyckades!" + exit 1 +fi \ No newline at end of file diff --git a/zig/cmd/test.sh b/zig/cmd/test.sh new file mode 100755 index 0000000..a145f73 --- /dev/null +++ b/zig/cmd/test.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Zig Unit Tests + +SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +cd "$SCRIPT_DIR" + +echo "=== Zig Pi-beräkning Unit Tester ===" +echo "" + +cd src +zig test pi_test.zig + +exit $? \ No newline at end of file diff --git a/zig/src/pi_test.zig b/zig/src/pi_test.zig new file mode 100644 index 0000000..30706c9 --- /dev/null +++ b/zig/src/pi_test.zig @@ -0,0 +1,82 @@ +const std = @import("std"); +const process = std.process; +const mem = std.mem; + +const SCRIPT_PATH = "/Users/einand/Code/test/zig/print_hej"; + +fn runScript(allocator: mem.Allocator, args: ?[]const u8) ![]u8 { + var argv = std.ArrayList([]const u8).initCapacity(allocator, 2) catch unreachable; + defer argv.deinit(); + + argv.appendAssumeCapacity(SCRIPT_PATH); + if (args) |a| { + argv.appendAssumeCapacity(a); + } + + var child = process.Child.run(.{ + .allocator = allocator, + .argv = argv.items, + }) catch unreachable; + + // Remove trailing newline + if (child.stdout.len > 0 and child.stdout[child.stdout.len - 1] == '\n') { + return child.stdout[0 .. child.stdout.len - 1]; + } + + return child.stdout; +} + +test "10 decimals" { + const allocator = std.testing.allocator; + const result = try runScript(allocator, "10"); + defer allocator.free(result); + + const expected = "3.1415926535"; + try std.testing.expectEqualStrings(expected, result); +} + +test "5 decimals" { + const allocator = std.testing.allocator; + const result = try runScript(allocator, "5"); + defer allocator.free(result); + + const expected = "3.14159"; + try std.testing.expectEqualStrings(expected, result); +} + +test "1 decimal" { + const allocator = std.testing.allocator; + const result = try runScript(allocator, "1"); + defer allocator.free(result); + + const expected = "3.1"; + try std.testing.expectEqualStrings(expected, result); +} + +test "100 decimals" { + const allocator = std.testing.allocator; + const result = try runScript(allocator, "100"); + defer allocator.free(result); + + const expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; + try std.testing.expectEqualStrings(expected, result); +} + +test "default 100 decimals" { + const allocator = std.testing.allocator; + const result = try runScript(allocator, null); + defer allocator.free(result); + + const expected = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; + try std.testing.expectEqualStrings(expected, result); +} + +test "10000 decimals" { + const allocator = std.testing.allocator; + const result = try runScript(allocator, "10000"); + defer allocator.free(result); + + // Check length: "3." + 10000 digits = 10002 characters + try std.testing.expectEqual(@as(usize, 10002), result.len); + try std.testing.expect(mem.startsWith(u8, result, "3.14159")); +} \ No newline at end of file diff --git a/zig/src/print_hej.zig b/zig/src/print_hej.zig new file mode 100644 index 0000000..2d8e704 --- /dev/null +++ b/zig/src/print_hej.zig @@ -0,0 +1,233 @@ +const std = @import("std"); + +pub fn main(init: std.process.Init) !void { +var args_iter = std.process.Args.Iterator.init(init.minimal.args); +_ = args_iter.skip(); + +const decimals: usize = if (args_iter.next()) |arg_str| +std.fmt.parseInt(usize, arg_str, 10) catch 100 +else +100; + +const pi = try calculatePi(init.gpa, decimals); +defer init.gpa.free(pi); + +try std.Io.File.writeStreamingAll(.stdout(), init.io, pi); +try std.Io.File.writeStreamingAll(.stdout(), init.io, "\n"); +} + +// Simple BigInt using array of u32 (base 10^9) +const BigInt = struct { +digits: []u32, +len: usize, +allocator: std.mem.Allocator, + +fn init(allocator: std.mem.Allocator, size: usize) !BigInt { +const digits = try allocator.alloc(u32, size); +@memset(digits, 0); +return .{ .digits = digits, .len = 1, .allocator = allocator }; +} + +fn deinit(self: *BigInt) void { +self.allocator.free(self.digits); +} + +fn set(self: *BigInt, value: u32) void { +@memset(self.digits, 0); +self.digits[0] = value; +self.len = 1; +} + +fn copyFrom(self: *BigInt, other: *const BigInt) void { +@memcpy(self.digits[0..other.len], other.digits[0..other.len]); +self.len = other.len; +} + +fn add(self: *BigInt, other: *const BigInt) void { +var carry: u32 = 0; +var i: usize = 0; +const max_len = @max(self.len, other.len); + +while (i < max_len or carry > 0) : (i += 1) { +const a = if (i < self.len) self.digits[i] else 0; +const b = if (i < other.len) other.digits[i] else 0; +const sum = a + b + carry; +self.digits[i] = sum % 1000000000; +carry = sum / 1000000000; +} +self.len = i; +} + +fn sub(self: *BigInt, other: *const BigInt) void { +var borrow: i32 = 0; +var i: usize = 0; + +while (i < self.len) : (i += 1) { +const a: i64 = @as(i64, self.digits[i]); +const b: i64 = if (i < other.len) @as(i64, other.digits[i]) else 0; +var diff = a - b - borrow; +if (diff < 0) { +diff += 1000000000; +borrow = 1; +} else { +borrow = 0; +} +self.digits[i] = @as(u32, @intCast(diff)); +} + +while (self.len > 1 and self.digits[self.len - 1] == 0) { +self.len -= 1; +} +} + +fn mulSmall(self: *BigInt, multiplier: u32) void { +var carry: u64 = 0; +var i: usize = 0; + +while (i < self.len or carry > 0) : (i += 1) { +const prod = @as(u64, self.digits[i]) * @as(u64, multiplier) + carry; +self.digits[i] = @as(u32, @intCast(prod % 1000000000)); +carry = prod / 1000000000; +} +self.len = i; +} + +fn divSmall(self: *BigInt, divisor: u32) void { +var remainder: u64 = 0; +var i: usize = self.len; + +while (i > 0) { +i -= 1; +const cur = remainder * 1000000000 + @as(u64, self.digits[i]); +self.digits[i] = @as(u32, @intCast(cur / @as(u64, divisor))); +remainder = cur % @as(u64, divisor); +} + +while (self.len > 1 and self.digits[self.len - 1] == 0) { +self.len -= 1; +} +} + +fn isZero(self: *const BigInt) bool { +return self.len == 1 and self.digits[0] == 0; +} +}; + +fn calculatePi(allocator: std.mem.Allocator, decimals: usize) ![]u8 { +const num_digits = (decimals + 10) / 9 + 10; + +const atan1_5 = try arctanBigInt(allocator, 5, decimals, num_digits); +defer allocator.free(atan1_5); + +const atan1_239 = try arctanBigInt(allocator, 239, decimals, num_digits); +defer allocator.free(atan1_239); + +return formatPiBigInt(allocator, atan1_5, atan1_239, decimals, num_digits); +} + +fn arctanBigInt(allocator: std.mem.Allocator, x: u32, decimals: usize, num_digits: usize) ![]u32 { +var term = try BigInt.init(allocator, num_digits); +defer term.deinit(); + +var result = try BigInt.init(allocator, num_digits); +defer result.deinit(); + +var temp = try BigInt.init(allocator, num_digits); +defer temp.deinit(); + +term.set(1); +var i: usize = 0; +while (i < decimals + 10) : (i += 9) { +term.mulSmall(1000000000); +} +term.divSmall(x); + +var n: usize = 0; +const x_squared = x * x; + +while (!term.isZero() and n < decimals * 2) : (n += 1) { +const divisor: u32 = @intCast(2 * n + 1); + +temp.copyFrom(&term); +temp.divSmall(divisor); + +if (n % 2 == 0) { +result.add(&temp); +} else { +result.sub(&temp); +} + +term.divSmall(x_squared); +} + +const output = try allocator.alloc(u32, result.len); +@memcpy(output, result.digits[0..result.len]); +return output; +} + +fn formatPiBigInt(allocator: std.mem.Allocator, atan1_5: []const u32, atan1_239: []const u32, decimals: usize, num_digits: usize) ![]u8 { +var result_big = try BigInt.init(allocator, num_digits); +defer result_big.deinit(); + +var temp = try BigInt.init(allocator, num_digits); +defer temp.deinit(); + +@memcpy(result_big.digits[0..atan1_5.len], atan1_5[0..atan1_5.len]); +result_big.len = atan1_5.len; +result_big.mulSmall(16); + +@memcpy(temp.digits[0..atan1_239.len], atan1_239[0..atan1_239.len]); +temp.len = atan1_239.len; +temp.mulSmall(4); + +result_big.sub(&temp); + +return formatBigInt(allocator, &result_big, decimals); +} + +fn formatBigInt(allocator: std.mem.Allocator, num: *BigInt, decimals: usize) ![]u8 { +var result = try allocator.alloc(u8, decimals + 2); + +const first_digit = num.digits[num.len - 1]; +var temp_buf: [20]u8 = undefined; +const first_str = try std.fmt.bufPrint(&temp_buf, "{}", .{first_digit}); + +if (first_str.len > 0) { +result[0] = first_str[0]; +} else { +result[0] = 48; +} + +result[1] = 46; + +var pos: usize = 2; +if (first_str.len > 1) { +var j: usize = 1; +while (j < first_str.len and pos < decimals + 2) : (j += 1) { +result[pos] = first_str[j]; +pos += 1; +} +} + +if (num.len > 1) { +var i: usize = num.len - 2; +while (true) : (i -= 1) { +const group = num.digits[i]; +const group_str = try std.fmt.bufPrint(&temp_buf, "{d:09}", .{group}); + +var j: usize = 0; +while (j < group_str.len and pos < decimals + 2) : (j += 1) { +result[pos] = group_str[j]; +pos += 1; +} + +if (i == 0) break; +} +} + +while (pos < decimals + 2) : (pos += 1) { +result[pos] = 48; +} + +return result; +}