commit 24e44a3b50f1eac09fe246cbf8d6da84dae1b8d4 Author: Lewin Kelly Date: Sun Sep 10 01:51:41 2023 +0100 Initialise repository with SushiDesigner/Meteor-Front and SushiDesigner/Meteor-back diff --git a/Back/.env.example b/Back/.env.example new file mode 100644 index 0000000..a6419c5 --- /dev/null +++ b/Back/.env.example @@ -0,0 +1,7 @@ +JWT_SECRET= +RCC_HOST= +logshook= +PROD=true +LOCALCERTIFICATEPATH= +LOCALREDISCONNECTION= +DB_PASSWORD= \ No newline at end of file diff --git a/Back/.gitignore b/Back/.gitignore new file mode 100644 index 0000000..ff5b1b0 --- /dev/null +++ b/Back/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +assets/release.zip +assets/hash.txt diff --git a/Back/DefaultPrivateKey.pem b/Back/DefaultPrivateKey.pem new file mode 100644 index 0000000..9dbc1f1 --- /dev/null +++ b/Back/DefaultPrivateKey.pem @@ -0,0 +1,3 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQC04Nimx5hGYvQ54rZPWJ9qvvoPSsBXt3PREKhramu1gXpv+W4Mh/vdzlTsNqmedZ2gaX0rd9smy3Kp2lgxKsuyX1gc918k9L/PUzKvnfxy93RDwXdo6qJze+mdQlkDi9U5W4MAzcx6ann3YTHyiKHfs9DqF+kBJQiloPgcnk3HPQIDAQABAoGBAJsAR4h8aGiA6esk9bf/KPWP3Lf4BeXlRrF0xe7uzohHAYYtSHoimdqUsz+NBEPPZJmPbH0wg7O2Cne1rXfMxaqPoZAl/N5kN0uFFY6U7FS+rssF0/OXZPuehmBkOscVGGNM6glAzOfW2/3rZcm8Z3XhdhTQIzZq2D1rjhKU3YT9AkEA08e3BTsV3iqjf8kJhwdt7EGX9/QutNaUSkAoW1d/pRdjZbbfcFwLri2WcTA2taoIa892hSTz/qaHYWMfu3oy/wJBANqlVeqRxFX8YJ0yFZfblx/QEkA5ospJI5pd3J6kSqK9A3NqBCbFPxH6NO8rXBSHk8cE2vNVc0K7qSCzn6sqEcMCQCCHIlNJWfh/sBEmfbIhr/6DrKXG+Y2JD8m/xPMSo2ZmCzxKNFN7r8eW9O55q02HyjdU7C1TGa7ZQR3yLaOMB10CQAY3Iv0bDbDADuMJFHIPrPkbihlHSihj8d4mguoDk5eStfFm9x0/CC7zpOOToPd4byv+KFc4e6FPAlzKnmRYOs8CQQCDMYYdcIw5e5nf20yLUhwzJL4q8ZyR7OGXkjz6ACxoxQSncr/adjecz21ngdx3nq13RdpppWNuZ/2exvS3ObTG +-----END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/Back/PrivateKey2020.txt b/Back/PrivateKey2020.txt new file mode 100644 index 0000000..6f55a7f --- /dev/null +++ b/Back/PrivateKey2020.txt @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEApH8yULE5/DRBnSTqcOM3PplW2UGD4povfR8zCBNP1n69uKoG +mcJm4AiPAR18TpLXPNAyp8UwlrQc4+GCqU/ktipFp//W6r90BWyiY69flfTGU8Zs +Bcy2DNjQipilSaJoOjxUbT++D7qrQSCiMh6fzUfEcUyk2kx4ICErQ2/HqHOxHbLi ++R7L/bIU9pZYWB6aU0WM7ATuzDYFVETUSlXpMAVKeusEqae8lEfV5TqZxb3eIUPU +P1iz7eqd7jQH6UygOnjFksSYxOInbr4KK2rQYDt6507ohO/+AzhlH+FPM3/ziqN6 +LObRkLF4u4HCUaKZqPQTREIz8zYdNXuY43YeEQIDAQABAoIBABdUjv9Q04eIpdGy +3albIIe5Wc8AcsMd2SRm22cGzij+2supGbyPDOYzcIzY8Lt4KhzO7pBK8GQ/cWWE +o3J+CVMo1a5JI+MxejQWv0ViJy1uhP52wvVjnmJeEd3GXpL9/MhdrB++jadPc2CO +T1LKcyG7Two+s5beh58O9ULgRLIIU0m6n+svCIDHY0VlxuAh/i5axqk/aaCzvtAh +DeFNS6vrBRMhAY8Tzlhlm/SXEiIubHjrO+CYhLLe0hh0AmaLQNQ0JLFW/eJwMWxw +qEoT+tL1cMYZCudjfmffILXLxYWfd5HqOWz/ghFiSayAdKJZr1gcA3ZAQQVS5qUW +6VDRvF0CgYEA+LBOBLMWyG57PZAI2n85h4PDZKgn6hzJMVlXGelMiRhI/mNcCL/M +Ay006mZ22QyR0Fm59OTHeWxyz8AtCSrSn6rLi4fiLYlh3xxTN1O8Q4Rf7HqNgvTf +rgpjGJ8fIHTvzqQesclKN+MXhsaw3NpS/MyzGEc7ORTTtzqwRDHYKWcCgYEAqVU+ +C087RxG8v2ruNeIf+fxnDkrpeHeklfWzCVTNo18FnQhvmFkW0SpfjwhAhjfEEOHZ +VfsDp/kmXZTynkce1DTfWv8iAac990bgBVx6/rC4VoAYQ18jg72FcICGYX4rv9bo +gHi87rPJ1qsVVW2poJyYWr5ZpxIqNtQcQ8NaOccCgYBcS/q4rcrf2nks0P8oMJ2m +WNW0zt/5eHOHODQmbrq0CupUV4X5zU0nRKjl8d9cENkxLYvhguMxgnld92H/jAAd +uCLRBz5/TgSf7IBKAW7W1BNRze4lU0KM8lfy9GN2BVBXLfwiWaWM9mBt6eIMJY81 +ObeiZBVryvoEf+iZdrJWMwKBgQCAPkDJC+6W+oX6ap+SS3lwOIpMNsvvIp2RvQ0l +CgbbrgFwVo090msHapIIn3VOsTlal9Gj3oF8W6OEyGOfH7nneUuXfRZiLikt941+ +QfYcofZZ/JVjoNAi3AwNkikz+PxlQ/u+ILLmDV/Vpqh3lKAdNbvlLbh0Ybt63tWx +NGhGzQKBgC2gnP65oBbORgdCkMvrs+fbBX5LdCTrBUkxX4yVMr/25GS1oqX6LiGK +Oxjs326pGGns91cMEUbxSFQwaWPCcTWhEbK/epdlY3NkFQ4WPDPkEmhhp49ebMA7 +BYWSO7nSEMv4S6rRnVxts9lCihNclblbg3erXx77PRKnLtVbE+KG +-----END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/Back/README.md b/Back/README.md new file mode 100644 index 0000000..e971927 --- /dev/null +++ b/Back/README.md @@ -0,0 +1,24 @@ +# SushiBlox-Website +Website for sushiblox I guess. + +~~Private for now might open source.~~ + +The setup is ~~easy install required node modules and setup a nginx reverse proxy on port 9000.~~ + +Uses MongoDB for datastorage. Redis for special things + +# Advice +~~This uses hardcoded domain names in the code~~ and relies on cloudflare headers for IP configs. so yeahhhhhhhhhhhhhhhhhhhhhhhhhh + + +# Redis +idk set it up nerd + +# setup +easy enough + +# Example + +``` +PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host pm2 start server.mjs +``` diff --git a/Back/actualgameserver.lua b/Back/actualgameserver.lua new file mode 100644 index 0000000..0f7f2bd --- /dev/null +++ b/Back/actualgameserver.lua @@ -0,0 +1,235 @@ +local url = "http://mete0r.xyz" -- have to set to https for production +------------------- UTILITY FUNCTIONS -------------------------- + + + +function waitForChild(parent, childName) + while true do + local child = parent:findFirstChild(childName) + if child then + return child + end + parent.ChildAdded:wait() + end +end + +-----------------------------------END UTILITY FUNCTIONS ------------------------- + +-----------------------------------"CUSTOM" SHARED CODE---------------------------------- +--print(port) +pcall(function() settings().Network.UseInstancePacketCache = true end) +pcall(function() settings().Network.UsePhysicsPacketCache = true end) +--pcall(function() settings()["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.FIFO end) +pcall(function() settings()["Task Scheduler"].PriorityMethod = Enum.PriorityMethod.AccumulatedError end) + +--settings().Network.PhysicsSend = 1 -- 1==RoundRobin +--settings().Network.PhysicsSend = Enum.PhysicsSendMethod.ErrorComputation2 +settings().Network.PhysicsSend = Enum.PhysicsSendMethod.TopNErrors +settings().Network.ExperimentalPhysicsEnabled = true +settings().Network.WaitingForCharacterLogRate = 100 +pcall(function() settings().Diagnostics:LegacyScriptMode() end) + +-----------------------------------START GAME SHARED SCRIPT------------------------------ + +local assetId = placeId -- might be able to remove this now + +local scriptContext = game:GetService('ScriptContext') +pcall(function() scriptContext:AddStarterScript(37801172) end) +scriptContext.ScriptsDisabled = true + +game:SetPlaceID(assetId, false) +game:GetService("ChangeHistoryService"):SetEnabled(false) + +-- establish this peer as the Server +local ns = game:GetService("NetworkServer") + +if url~=nil then + pcall(function() game:GetService("Players"):SetAbuseReportUrl(url .. "/AbuseReport/InGameChatHandler.ashx") end) +---@diagnostic disable-next-line: invalid-class-name + pcall(function() game:GetService("ScriptInformationProvider"):SetAssetUrl(url .. "/Asset/") end) + pcall(function() game:GetService("ContentProvider"):SetBaseUrl(url .. "/") end) + --pcall(function() game:GetService("Players"):SetChatFilterUrl(url .. "/Game/ChatFilter.ashx") end) + + game:GetService("BadgeService"):SetPlaceId(placeId) + + game:GetService("BadgeService"):SetIsBadgeLegalUrl("") + game:GetService("InsertService"):SetBaseSetsUrl(url .. "/Game/Tools/InsertAsset.ashx?nsets=10&type=base") + game:GetService("InsertService"):SetUserSetsUrl(url .. "/Game/Tools/InsertAsset.ashx?nsets=20&type=user&userid=%d") + game:GetService("InsertService"):SetCollectionUrl(url .. "/Game/Tools/InsertAsset.ashx?sid=%d") + game:GetService("InsertService"):SetAssetUrl(url .. "/Asset/?id=%d") + game:GetService("InsertService"):SetAssetVersionUrl(url .. "/Asset/?assetversionid=%d") + + pcall(function() loadfile(url .. "/Game/LoadPlaceInfo.ashx?PlaceId=" .. placeId)() end) + + -- pcall(function() + -- if access then + -- loadfile(url .. "/Game/PlaceSpecificScript.ashx?PlaceId=" .. placeId .. "&" .. access)() + -- end + -- end) +end +pcall(function() game:GetService("NetworkServer"):SetIsPlayerAuthenticationRequired(true) end) +settings().Diagnostics.LuaRamLimit = 0 +--settings().Network:SetThroughputSensitivity(0.08, 0.01) +--settings().Network.SendRate = 35 +--settings().Network.PhysicsSend = 0 -- 1==RoundRobin + +if placeId~=nil and url~=nil then + -- yield so that file load happens in the heartbeat thread + wait() + + -- load the game + game:Load(url .. "/asset?id=" .. placeId .. "&method=rcc") +end + +-- Now start the connection + +local success, message = pcall(function() ns:Start(port) end) +if not success then +local HttpService = game:GetService("HttpService") +game:GetService("HttpService").HttpEnabled = true + -- failed job close it + local arguments = { + ["game"] = placeId + } + HttpService:PostAsync( + url .. "/api/updategameinfo/closejob", + HttpService:JSONEncode(arguments) + ) +else + local HttpService = game:GetService("HttpService") + local arguments = { + ["game"] = placeId + } + game:HttpPostAsync(url .. "/api/updategameinfo/gameloaded",HttpService:JSONEncode(arguments),"application/json") +end + +scriptContext:SetTimeout(10) +scriptContext.ScriptsDisabled = false + + +------------------------------END START GAME SHARED SCRIPT-------------------------- + + + +-- StartGame -- +game:GetService("RunService"):Run() + + +local HttpService = game:GetService("HttpService") +game:GetService("HttpService").HttpEnabled = true + +spawn(function() + -- if a player doesn't join in 60 seconds because of failed job or they didn't join close the job + wait(60) + if #game:GetService("Players"):GetPlayers() < 1 then + print("Shutdown time") + -- less than one player is in the game so lets shut down + local arguments = { + ["game"] = placeId + } + HttpService:PostAsync( + url .. "/api/updategameinfo/closejob", + HttpService:JSONEncode(arguments) + ) + end +end) + +local function addAttachment(part, name, position, orientation) + local attachment = Instance.new("Attachment") + attachment.Name = name + attachment.Parent = part + if position then + attachment.Position = position + end + if orientation then + attachment.Orientation = orientation + end + return attachment +end + +game:GetService("Players").PlayerAdded:connect(function(player) + print("Player " .. player.userId .. " joining") + player.CharacterAdded:connect(function(Character) + addAttachment(Character.HumanoidRootPart, "RootRigAttachment") + addAttachment(Character.Head, "FaceCenterAttachment") + addAttachment(Character.Head, "FaceFrontAttachment", Vector3.new(0, 0, -0.6)) + addAttachment(Character.Head, "HairAttachment", Vector3.new(0, 0.6, 0)) + addAttachment(Character.Head, "HatAttachment", Vector3.new(0, 0.6, 0)) + addAttachment(Character.Head, "NeckRigAttachment", Vector3.new(0, -0.5, 0)) + + end) + local presenceargs = { + ["game"] = placeId, + ["player"] = player.userId, + ["name"] = player.Name, + ["action"] = "joining" + } + HttpService:PostAsync( + url .. "/api/updategameinfo/updatepresence", + HttpService:JSONEncode(presenceargs) + ) + wait(2) + local arguments = { + ["game"] = placeId, + ["players"] = #game:GetService("Players"):GetPlayers() + } + HttpService:PostAsync( + url .. "/api/updategameinfo", + HttpService:JSONEncode(arguments) + ) + local visitarguments = { + ["game"] = placeId + } + HttpService:PostAsync( + url .. "/api/updategameinfo/updatevisits", + HttpService:JSONEncode(visitarguments) + ) +end) + +game:GetService("Players").PlayerRemoving:connect(function(player) + print("Player " .. player.userId .. " leaving") + local presenceargs = { + ["game"] = placeId, + ["player"] = player.userId, + ["name"] = player.Name, + ["action"] = "leaving" + } + HttpService:PostAsync( + url .. "/api/updategameinfo/updatepresence", + HttpService:JSONEncode(presenceargs) + ) + wait(2) + local arguments = { + ["game"] = placeId, + ["players"] = #game:GetService("Players"):GetPlayers() + } + HttpService:PostAsync( + url .. "/api/updategameinfo", + HttpService:JSONEncode(arguments) + ) + if #game:GetService("Players"):GetPlayers() < 1 then + print("Shutdown time") + -- less than one player is in the game so lets shut down + local arguments = { + ["game"] = placeId + } + HttpService:PostAsync( + url .. "/api/updategameinfo/closejob", + HttpService:JSONEncode(arguments) + ) + end +end) + + + +local StringToDetect = ";ec"; + +game:GetService("Players").PlayerAdded:connect(function(Player) + Player.Chatted:connect(function(Message) + if string.find(string.lower(Message), string.lower(StringToDetect)) then + if Player.Character then + Player.Character.Humanoid.Health = 0; + end; + end; + end); +end); \ No newline at end of file diff --git a/Back/assets/approval.png b/Back/assets/approval.png new file mode 100644 index 0000000..ec02dc3 Binary files /dev/null and b/Back/assets/approval.png differ diff --git a/Back/assets/audio/silence.mp3 b/Back/assets/audio/silence.mp3 new file mode 100644 index 0000000..482395f Binary files /dev/null and b/Back/assets/audio/silence.mp3 differ diff --git a/Back/assets/audio/wof.mp3 b/Back/assets/audio/wof.mp3 new file mode 100644 index 0000000..787ed3a Binary files /dev/null and b/Back/assets/audio/wof.mp3 differ diff --git a/Back/assets/default.png b/Back/assets/default.png new file mode 100644 index 0000000..c618ecf Binary files /dev/null and b/Back/assets/default.png differ diff --git a/Back/assets/defaultold.png b/Back/assets/defaultold.png new file mode 100644 index 0000000..7fd92cf Binary files /dev/null and b/Back/assets/defaultold.png differ diff --git a/Back/assets/gameassets/thumbnail-0.png b/Back/assets/gameassets/thumbnail-0.png new file mode 100644 index 0000000..58ccd81 Binary files /dev/null and b/Back/assets/gameassets/thumbnail-0.png differ diff --git a/Back/assets/hash2014.txt b/Back/assets/hash2014.txt new file mode 100644 index 0000000..145da6b --- /dev/null +++ b/Back/assets/hash2014.txt @@ -0,0 +1 @@ +3b5f1470aa859d3782f72ba07c72ed7d7bc2e461f5f85bb9fd007bf66349d5ee \ No newline at end of file diff --git a/Back/assets/hash2018.txt b/Back/assets/hash2018.txt new file mode 100644 index 0000000..01e173b --- /dev/null +++ b/Back/assets/hash2018.txt @@ -0,0 +1 @@ +4cd4d51885b3127d72cf4bbc3e889ec4afa5c4bd725dfba4beab239c2d51b7c5 \ No newline at end of file diff --git a/Back/assets/hash2020.txt b/Back/assets/hash2020.txt new file mode 100644 index 0000000..9206d3e --- /dev/null +++ b/Back/assets/hash2020.txt @@ -0,0 +1 @@ +ecfbc1e4cadd0167cddf1c9920adadf7183f690d7101c1b84d51616a35fada55 \ No newline at end of file diff --git a/Back/assets/hashlauncher.txt b/Back/assets/hashlauncher.txt new file mode 100644 index 0000000..22e737c --- /dev/null +++ b/Back/assets/hashlauncher.txt @@ -0,0 +1 @@ +d650fafa3e969e786d874def30f32208dc1ebe57d051fc719fe8a0e75af339eb \ No newline at end of file diff --git a/Back/assets/hashstudio2016.txt b/Back/assets/hashstudio2016.txt new file mode 100644 index 0000000..6fa43fc --- /dev/null +++ b/Back/assets/hashstudio2016.txt @@ -0,0 +1 @@ +f13b90a25b1d1d3ff7dfc0628d6fe554cb3b4eb809fe7289632e41670effb197 \ No newline at end of file diff --git a/Back/assets/images/BC_Icon.svg b/Back/assets/images/BC_Icon.svg new file mode 100644 index 0000000..c3996bd --- /dev/null +++ b/Back/assets/images/BC_Icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Back/assets/images/OBC_Icon.svg b/Back/assets/images/OBC_Icon.svg new file mode 100644 index 0000000..d417e9b --- /dev/null +++ b/Back/assets/images/OBC_Icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Back/assets/images/audio.png b/Back/assets/images/audio.png new file mode 100644 index 0000000..96e6ac0 Binary files /dev/null and b/Back/assets/images/audio.png differ diff --git a/Back/assets/images/bar.png b/Back/assets/images/bar.png new file mode 100644 index 0000000..cef621a Binary files /dev/null and b/Back/assets/images/bar.png differ diff --git a/Back/assets/images/defaultad.png b/Back/assets/images/defaultad.png new file mode 100644 index 0000000..d381a88 Binary files /dev/null and b/Back/assets/images/defaultad.png differ diff --git a/Back/assets/images/defaultadsky.png b/Back/assets/images/defaultadsky.png new file mode 100644 index 0000000..6cedea1 Binary files /dev/null and b/Back/assets/images/defaultadsky.png differ diff --git a/Back/assets/images/error.png b/Back/assets/images/error.png new file mode 100644 index 0000000..07207d5 Binary files /dev/null and b/Back/assets/images/error.png differ diff --git a/Back/assets/images/finobe.png b/Back/assets/images/finobe.png new file mode 100644 index 0000000..a688792 Binary files /dev/null and b/Back/assets/images/finobe.png differ diff --git a/Back/assets/images/finobelogo.png b/Back/assets/images/finobelogo.png new file mode 100644 index 0000000..9b2cc48 Binary files /dev/null and b/Back/assets/images/finobelogo.png differ diff --git a/Back/assets/images/gt.png b/Back/assets/images/gt.png new file mode 100644 index 0000000..5e3aee3 Binary files /dev/null and b/Back/assets/images/gt.png differ diff --git a/Back/assets/images/gtlogo.png b/Back/assets/images/gtlogo.png new file mode 100644 index 0000000..3ddd0ec Binary files /dev/null and b/Back/assets/images/gtlogo.png differ diff --git a/Back/assets/images/logo.png b/Back/assets/images/logo.png new file mode 100644 index 0000000..6190b8a Binary files /dev/null and b/Back/assets/images/logo.png differ diff --git a/Back/assets/images/logo600200.png b/Back/assets/images/logo600200.png new file mode 100644 index 0000000..1df9934 Binary files /dev/null and b/Back/assets/images/logo600200.png differ diff --git a/Back/assets/images/logosmall.png b/Back/assets/images/logosmall.png new file mode 100644 index 0000000..91e48c9 Binary files /dev/null and b/Back/assets/images/logosmall.png differ diff --git a/Back/assets/images/lol.png b/Back/assets/images/lol.png new file mode 100644 index 0000000..e0a4d80 Binary files /dev/null and b/Back/assets/images/lol.png differ diff --git a/Back/assets/images/menobg.png b/Back/assets/images/menobg.png new file mode 100644 index 0000000..dddd411 Binary files /dev/null and b/Back/assets/images/menobg.png differ diff --git a/Back/assets/images/meteor.png b/Back/assets/images/meteor.png new file mode 100644 index 0000000..e51e6c0 Binary files /dev/null and b/Back/assets/images/meteor.png differ diff --git a/Back/assets/images/oops.png b/Back/assets/images/oops.png new file mode 100644 index 0000000..dab1236 Binary files /dev/null and b/Back/assets/images/oops.png differ diff --git a/Back/assets/images/rocks.png b/Back/assets/images/rocks.png new file mode 100644 index 0000000..823cd4d Binary files /dev/null and b/Back/assets/images/rocks.png differ diff --git a/Back/assets/moderated.png b/Back/assets/moderated.png new file mode 100644 index 0000000..1276399 Binary files /dev/null and b/Back/assets/moderated.png differ diff --git a/Back/assets/release2018.zip b/Back/assets/release2018.zip new file mode 100644 index 0000000..e7006f6 Binary files /dev/null and b/Back/assets/release2018.zip differ diff --git a/Back/assets/releasestudio2016.zip b/Back/assets/releasestudio2016.zip new file mode 100644 index 0000000..8209985 Binary files /dev/null and b/Back/assets/releasestudio2016.zip differ diff --git a/Back/assets/ugc/common/itemfile-62633901.rbxm b/Back/assets/ugc/common/itemfile-62633901.rbxm new file mode 100644 index 0000000..174458f --- /dev/null +++ b/Back/assets/ugc/common/itemfile-62633901.rbxm @@ -0,0 +1,10 @@ + + null + nil + + + ScriptHashWhitelist + b3f0342949bc9635e34e278c04d6fd90;1cb5c76965c37c216582cee7e1433262;4c6721f4bea2341a4d4a684c7f966d90;8e56422fe1414961d2edff32f944bf92;786406a29a6e8490cb266c06201aa92e;b3ac4e73d3733a57dea03d692aa26e34;a53eba1de89dbfdb80b3254ee388531d;d15e92a3f0fc1e66cf41a5d73cebb840;f1dfdef5f37e69ddd3fd6333f26e88c8;433d57e8472a8a870e274598229a93d4;f5221aae14307e3bcb1a5d154c5ef2f5;5e18b9ddf23c4f03c0fd00ee9f74a6e8;e84848af1e7a5ef61fccd70017a1499c;ee2fda1680f29d1e15e9d70f9d061df3;a30f58b57cb09ac1655cde37c750b02b;8ee09525290e5fd8b1d7d90ff4e08772;;d39de7b8e14666fafed115fcac1bd42a;f9a3b2366970250006eb5871718d1386;d46bd2f63d3743df0d65fba0026b1b3e;79edcc2cec0a91fd1ba03de301277bf9;cae4b54d5a33a04fcc08b71a4910aa98;3a6bbcd590fb50a1ab2c96d4c5381354;047683e14c39fb0726d37978027e7e41;60fcf891d61f15810f7fc1fbc306085a;85da2a691ca195ba0c8b727be3708854;ab1d7c5bd750ad0445c5468199ba01c7;111a198bfda686f90c974c4bd51b0bbb;6b0f7786df852254ad76584baf51f8a7;aa5868b23b2df1bd213fc34f55daf17b;50fcb8a21a10b8125d4573eaf71318ad;c0a7d6ca6e952ec6ebcc37002cb8b290;9b726d1c7771bc42aa03175c6c8a43d0;9b726d1c7771bc42aa03175c6c8a43d0;f10d555101c69e7bc5445b363865835e;4a143d0239140a90a111a3f316ee3349;f52510d8205181ca455a559ec153be7acaa15d93952e7366992e31df5af18441;3fa1b59b140c7babcb10b61b186020ad;1ab108f066289efd10a903744e2d3fe1;fabd28d867d693e3e465703956169f81;22dbbfb129b56c2f44ed52daa5ae1739;eeaadc007ef349e545ea6cd8295ad541;7bb0d01aea154912c3200cf964766fd4;84bf56ebe05f1f5c78a7a9c4cad52f74;bf3cda0e4a61be31f3e628d60d409a84;3987ae32127e39d9a7703b024f931bcf;9a53dc1d8a18035c7500513833761fa9;66c6d6dcf60ba2cceb8a9e613587ca6b;dbae0bffeb10d9f2152d87d94db62496;89254cffbaa0282d6e5971c2a8c09e55;46cbe9b2a510f6257a7eac135aad5651;8b56bcdc48551aff9edeabae48d5141c;ff58e3a4e3f0e514ad0b6258432f4fcd;89254cffbaa0282d6e5971c2a8c09e55;0321b9659210929462de367df55322bb;1b011d0e9868c56338b00fc891895fc1;6c52a6ca7f539564dc7c0a4eb3969eeb;2c7a8324161637f30405729b19885573;92b59508c397fcb6086f287ebd1ea3cd;90846a9269ae1b0bada8b205d156cfc0;2f5206f708e95f55bbb1ea712267445b;0276a5c631983f84e676a6162dad4a11;b5c2f8dea2ab79fafa1139aa22e70588;193dcfdb1e760c52c4573873a441deab;0276a5c631983f84e676a6162dad4a11; + + + \ No newline at end of file diff --git a/Back/assets/userthumbnails/0.png b/Back/assets/userthumbnails/0.png new file mode 100644 index 0000000..1bdfa89 Binary files /dev/null and b/Back/assets/userthumbnails/0.png differ diff --git a/Back/assets/userthumbnails/1.png b/Back/assets/userthumbnails/1.png new file mode 100644 index 0000000..7ee3582 Binary files /dev/null and b/Back/assets/userthumbnails/1.png differ diff --git a/Back/assets/userthumbnailsheadshots/0.png b/Back/assets/userthumbnailsheadshots/0.png new file mode 100644 index 0000000..755d49e Binary files /dev/null and b/Back/assets/userthumbnailsheadshots/0.png differ diff --git a/Back/assets/video.png b/Back/assets/video.png new file mode 100644 index 0000000..b0e44a9 Binary files /dev/null and b/Back/assets/video.png differ diff --git a/Back/assets/videos/logo.webm b/Back/assets/videos/logo.webm new file mode 100644 index 0000000..3746d30 Binary files /dev/null and b/Back/assets/videos/logo.webm differ diff --git a/Back/assets/videos/test.mp4 b/Back/assets/videos/test.mp4 new file mode 100644 index 0000000..37d9b75 Binary files /dev/null and b/Back/assets/videos/test.mp4 differ diff --git a/Back/assetthumbnailrenderer.lua b/Back/assetthumbnailrenderer.lua new file mode 100644 index 0000000..5cd414c --- /dev/null +++ b/Back/assetthumbnailrenderer.lua @@ -0,0 +1,66 @@ +-- This is the thumbnail script for R6 avatars. Straight up and down, with the right arm out if they have a gear. +local asset = 0 +local baseurl = "http://mete0r.xyz" -- have to set to https for production +local HttpService = game:GetService("HttpService") +HttpService.HttpEnabled = true + +---@diagnostic disable-next-line: invalid-class-name +local ThumbnailGenerator = game:GetService("ThumbnailGenerator") + +pcall(function() game:GetService("ContentProvider"):SetBaseUrl(baseurl) end) +game:GetService("InsertService"):SetBaseSetsUrl(baseurl .. "/Game/Tools/InsertAsset.ashx?nsets=10&type=base") +game:GetService("InsertService"):SetUserSetsUrl(baseurl .. "/Game/Tools/InsertAsset.ashx?nsets=20&type=user&userid=%d") +game:GetService("InsertService"):SetCollectionUrl(baseurl .. "/Game/Tools/InsertAsset.ashx?sid=%d") +game:GetService("InsertService"):SetAssetUrl(baseurl .. "/Asset/?id=%d") +game:GetService("InsertService"):SetAssetVersionUrl(baseurl .. "/Asset/?assetversionid=%d") +---@diagnostic disable-next-line: invalid-class-name +pcall(function() game:GetService("ScriptInformationProvider"):SetAssetUrl(url .. "/Asset/") end) + +game:GetService("ScriptContext").ScriptsDisabled = true + +thing = game:GetService("InsertService"):LoadAsset(asset) +if thing:GetChildren()[1]:IsA("Shirt") or thing:GetChildren()[1]:IsA("Pants") then + local player = game:GetService("Players"):CreateLocalPlayer(0) + player:LoadCharacter() + thing:GetChildren()[1].Parent = player.Character + bcolor = Instance.new("BodyColors", player.Character) +bcolor.HeadColor = BrickColor.new(1001) +bcolor.TorsoColor = BrickColor.new(1001) +bcolor.LeftArmColor = BrickColor.new(1001) +bcolor.RightArmColor = BrickColor.new(1001) +bcolor.LeftLegColor = BrickColor.new(1001) +bcolor.RightLegColor = BrickColor.new(1001) +elseif thing:GetChildren()[1]:IsA("Decal") then + local player = game:GetService("Players"):CreateLocalPlayer(0) + player:LoadCharacter() + player.Character.Head.face:Destroy() + thing:GetChildren()[1].Parent = player.Character.Head + bcolor = Instance.new("BodyColors", player.Character) +bcolor.HeadColor = BrickColor.new(1001) +bcolor.TorsoColor = BrickColor.new(1001) +bcolor.LeftArmColor = BrickColor.new(1001) +bcolor.RightArmColor = BrickColor.new(1001) +bcolor.LeftLegColor = BrickColor.new(1001) +bcolor.RightLegColor = BrickColor.new(1001) + + for _, child in pairs(player.Character:GetChildren()) do +if child.Name ~= "Head" and child:IsA("BasePart") then +child:Destroy() +end +end + +else + thing.Parent = game.workspace +end + +local arguments = { + ["thumbnail"] = ThumbnailGenerator:Click("PNG", 400, 400, --[[hideSky = ]] true), + ["asset"] = asset + } + +HttpService:PostAsync( + baseurl .. "/api/thumbnailrender/rccasset", + HttpService:JSONEncode(arguments) + ) + + diff --git a/Back/clientid.txt b/Back/clientid.txt new file mode 100644 index 0000000..3342aa4 --- /dev/null +++ b/Back/clientid.txt @@ -0,0 +1 @@ +7c9f615b-8535-4e9c-96d0-dff4cecabdd1 \ No newline at end of file diff --git a/Back/middleware/authmiddleware.js b/Back/middleware/authmiddleware.js new file mode 100644 index 0000000..adf8c78 --- /dev/null +++ b/Back/middleware/authmiddleware.js @@ -0,0 +1,89 @@ +const jwt = require('jsonwebtoken') +require('dotenv').config() +const JWT_SECRET = process.env.JWT_SECRET +const atob = require("atob"); +const model = require("./../model/user.js") + +const requireAuth = (req,res,next) => { + if (!req.cookies && req.headers['authorization']) { + return res.json({status: "error", error: "Unauthorized"}) + } + let token = req.cookies.jwt??req.cookies['.ROBLOSECURITY']??req.headers['authorization']??req.headers['roblox-session-id'] + + if (!token) { + return res.status(401).json({status: "error", error: "Unauthorized"}) + } + + + jwt.verify(token,JWT_SECRET, (err,decodedtoken) => { + if (err){ + res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) + return res.status(401).json({status: "error", error: "Unauthorized"}) + }else{ + var tokendata = decodedtoken + var name = tokendata.userid + try { + model.findOne({userid: name},async function(err, doc) { + req.numberofcoins = doc.coins + req.tokenData = tokendata + req.userdocument = doc + moderationstatus = JSON.parse(doc.moderation) + const actualTimeMilliseconds = new Date().getTime() + if (actualTimeMilliseconds - doc.timesincelastrequest >= 60000 * 1 || !doc.timesincelastrequest /*2 minutes make sure to update*/){ + doc.timesincelastrequest = actualTimeMilliseconds + doc.markModified('timesincelastrequest') + await doc.save() + } + // check if they are eligble for daily login reward + if (actualTimeMilliseconds - req.userdocument.lastclaimofcurrency > 86400000){ // 24 hours + req.userdocument.lastclaimofcurrency = actualTimeMilliseconds + if (req.userdocument.membership === "TurboBuildersClub"){ + req.userdocument.coins += 90 + }else if (req.userdocument.membership === "BuildersClub"){ + req.userdocument.coins += 60 + }else if (req.userdocument.membership === "OutrageousBuildersClub"){ + req.userdocument.coins += 150 + } + else{ + req.userdocument.coins += 35 + } + req.userdocument.markModified('coins') + req.userdocument.markModified('lastclaimofcurrency') + await req.userdocument.save() + } + + if (moderationstatus.status !== "ok") { + // if they are moderated then we invalidate the cookie and proceed + //res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) + //return res.send("You have been moderated for "+moderationstatus.Reason+" expires at"+moderationstatus.ExpiresIn+" Moderated by "+moderationstatus.BannedBy ) + var date = Date.parse(moderationstatus.ExpiresIn) + var datetime = new Date(); + var datetime2 = Date.parse(datetime) + /*if (date <= datetime2){ + // they have served there time + + model.updateOne({userid: doc.userid}, { + $set: { + moderation: JSON.stringify({"status":"ok","Reason":"none","ExpiresIn":"none", "BannedBy": "none"}) + } + }, + function(err, doc) { + //console.log(err) + }) + return next() + + }*/ + return res.json({status: "error", error:"Moderated", moderationstatus}) + } + next() + })/*.lean() rip*/} + catch (error) { + console.error(error); + } + + } + + }) +} + +module.exports = {requireAuth} \ No newline at end of file diff --git a/Back/middleware/authmiddlewaregame.js b/Back/middleware/authmiddlewaregame.js new file mode 100644 index 0000000..bacb7f5 --- /dev/null +++ b/Back/middleware/authmiddlewaregame.js @@ -0,0 +1,79 @@ +const jwt = require('jsonwebtoken') +require('dotenv').config() +const JWT_SECRET = process.env.JWT_SECRET +const atob = require("atob"); +const model = require("./../model/user.js") +// exactly the same as normal authimddleware but uses req.query instead of cookies for our client +const requireAuth = (req,res,next) => { + let token = req.query.auth + if (req.cookies && req.headers?.['user-agent'] != "Roblox/WinInet") { // Mobile + if (req.cookies.jwt) { + token = req.cookies.jwt + } + } + if (req.headers['roblox-session-id']) { // TeleportService + token = req.headers['roblox-session-id'] + } + if (req.headers?.['user-agent']?.includes("Android") === true || req.headers?.['user-agent']?.includes("iPhone") === true){ + console.log(token) + console.log(req.headers) + } + //console.log(req.headers) + + + + + + if (!token) { + return res.status(405).end() + } + + + jwt.verify(token,JWT_SECRET, (err,decodedtoken) => { + if (err){ + res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) + return res.status(405) + }else{ + var tokendata = decodedtoken + var name = tokendata.userid + try { + model.findOne({userid: name}, function(err, doc) { + req.numberofcoins = doc.coins + req.tokenData = tokendata + req.userdocument = doc + moderationstatus = JSON.parse(doc.moderation) + if (moderationstatus.status !== "ok") { + // if they are moderated then we invalidate the cookie and proceed + //res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) + //return res.send("You have been moderated for "+moderationstatus.Reason+" expires at"+moderationstatus.ExpiresIn+" Moderated by "+moderationstatus.BannedBy ) + var date = Date.parse(moderationstatus.ExpiresIn) + var datetime = new Date(); + var datetime2 = Date.parse(datetime) + /*if (date <= datetime2){ + // they have served there time + + model.updateOne({userid: doc.userid}, { + $set: { + moderation: JSON.stringify({"status":"ok","Reason":"none","ExpiresIn":"none", "BannedBy": "none"}) + } + }, + function(err, doc) { + //console.log(err) + }) + + + }*/ + return res.json({status: "error", error:"Moderated", moderationstatus}) + } + next() + })/*.lean() rip*/} + catch (error) { + console.error(error); + } + + } + + }) +} + +module.exports = {requireAuth} \ No newline at end of file diff --git a/Back/middleware/grabauth.js b/Back/middleware/grabauth.js new file mode 100644 index 0000000..7a0a564 --- /dev/null +++ b/Back/middleware/grabauth.js @@ -0,0 +1,64 @@ +const jwt = require('jsonwebtoken') +require('dotenv').config() +const JWT_SECRET = process.env.JWT_SECRET +const atob = require("atob"); +const model = require("./../model/user.js") + +const grabAuth = (req,res,next) => { + if (!req.cookies && req.headers['authorization']) { + return next() + } + const token = req.cookies.jwt??req.cookies['.ROBLOSECURITY']??req.headers['authorization'] + + if (!token) { + return next() + } + + jwt.verify(token,JWT_SECRET, (err,decodedtoken) => { + if (err){ + next() + }else{ + var tokendata = decodedtoken + var name = tokendata.username + try { + model.findOne({username: new RegExp('^'+name+'$', "i")}, function(err, doc) { + req.numberofcoins = doc.coins + req.admin = doc.admin + req.tokenData = tokendata + req.userdocument = doc + moderationstatus = JSON.parse(doc.moderation) + if (moderationstatus.status !== "ok") { + // if they are moderated then we invalidate the cookie and proceed + //res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) + //return res.send("You have been moderated for "+moderationstatus.Reason+" expires at"+moderationstatus.ExpiresIn+" Moderated by "+moderationstatus.BannedBy ) + var date = Date.parse(moderationstatus.ExpiresIn) + var datetime = new Date(); + var datetime2 = Date.parse(datetime) + if (date <= datetime2){ + // they have served there time + + model.updateOne({userid: doc.userid}, { + $set: { + moderation: JSON.stringify({"status":"ok","Reason":"none","ExpiresIn":"none", "BannedBy": "none"}) + } + }, + function(err, doc) { + //console.log(err) + }) + + + } + return res.json({status: "error", error:"Moderated", moderationstatus}) + } + next() + })/*.lean() rip*/} + catch (error) { + console.error(error); + } + + } + + }) +} + +module.exports = {grabAuth} \ No newline at end of file diff --git a/Back/middleware/requirediscord.js b/Back/middleware/requirediscord.js new file mode 100644 index 0000000..604f733 --- /dev/null +++ b/Back/middleware/requirediscord.js @@ -0,0 +1,11 @@ +const requirediscord = (req,res,next) => { + const discordid = req.userdocument.discordid + if (!discordid) { + return res.json({status: "error", error: "Discord link required for develop. Link your discord in the settings panel."}) + }else{ + next(); + } + +}; + +module.exports = {requirediscord} \ No newline at end of file diff --git a/Back/model/bank.js b/Back/model/bank.js new file mode 100644 index 0000000..882b470 --- /dev/null +++ b/Back/model/bank.js @@ -0,0 +1,9 @@ +const mongoose = require('mongoose') +const bankSchema = new mongoose.Schema({ + balance: {type: Number, required: true}, +}, +{collection: 'bank'} +) +const model = mongoose.model('bank', bankSchema) + +module.exports = model \ No newline at end of file diff --git a/Back/model/comment.js b/Back/model/comment.js new file mode 100644 index 0000000..ce95fb5 --- /dev/null +++ b/Back/model/comment.js @@ -0,0 +1,22 @@ +const mongoose = require('mongoose') +const CommentSchema = new mongoose.Schema({ + associatedassetid: {type: Number, required: true, index: true}, + associatedassettype: {type: String, required: true, index: true}, + posterid: {type: Number, required: true}, + content: {type: String, required: true}, + date: {type: Number, required: true}, + moderated: {type: Boolean, required: true} +}, +{collection: 'comments'} +) + +CommentSchema.virtual('poster', { + ref: 'UserSchema', + localField: 'posterid', + foreignField: 'userid', + justOne: true +}) + +const model = mongoose.model('CommentSchema', CommentSchema) + +module.exports = model \ No newline at end of file diff --git a/Back/model/config.js b/Back/model/config.js new file mode 100644 index 0000000..973fd82 --- /dev/null +++ b/Back/model/config.js @@ -0,0 +1,13 @@ +const mongoose = require('mongoose') +const ConfigSchema = new mongoose.Schema({ + RegistrationEnabled: {type: Boolean, required: true}, + MaintenanceEnabled: {type: Boolean, required: true}, + KeysEnabled: {type: Boolean, required: true}, + GamesEnabled: {type: Boolean, required: true} +}, +{collection: 'config'} +) + +const model = mongoose.model('ConfigSchema', ConfigSchema) + +module.exports = model \ No newline at end of file diff --git a/Back/model/games.js b/Back/model/games.js new file mode 100644 index 0000000..c69becb --- /dev/null +++ b/Back/model/games.js @@ -0,0 +1,29 @@ +const mongoose = require('mongoose') +const GamesSchema = new mongoose.Schema({ + useridofowner: {type: Number, required: true}, + idofgame: {type: Number, required: true, index: true}, + nameofgame: {type: String, required: true}, + numberofplayers: {type: String, required: true}, + descrption: {type: String, required: true}, + datastore: {type: String, required: false}, + visits: {type: Number, required: false}, + version: {type: String, required: true}, + featured: {type: Boolean, required: false}, + players: {type: Object, required: false}, + avatartype: {type: Object, required: false}, + gearallowed: {type: Boolean, required: false}, + comments: {type: Object, required: false} +}, +{collection: 'games'} +) + +GamesSchema.virtual('owner', { + ref: 'UserSchema', + localField: 'useridofowner', + foreignField: 'userid', + justOne: true +}) + +const model = mongoose.model('GamesSchema', GamesSchema) + +module.exports = model \ No newline at end of file diff --git a/Back/model/groups.js b/Back/model/groups.js new file mode 100644 index 0000000..eadf619 --- /dev/null +++ b/Back/model/groups.js @@ -0,0 +1,33 @@ +const mongoose = require('mongoose') +const GroupSchema = new mongoose.Schema({ + Name: {type: String, required: true}, + Description: {type: String, required: true}, + Public: {type: Boolean, required: true}, + IconApproved: {type: Boolean, required: true}, + denied: {type: Boolean, required: false}, + Hidden: {type: Boolean, required: false}, + groupid: {type: Number, required: true}, + ownerid : {type: Number, required: true}, + memberscount: {type: Number, required: true}, + members: {type: [{userId: Number, rank: Number}], required: true}, + currentshout: {type: {content: String, shouter: Number}, required: false}, + Roles: {type: [{RoleName: String, Permissions: {Shout: Boolean, Kick: Boolean, ChangeRoles: Boolean, ModerateWall: Boolean, ManageAllies: Boolean, All: Boolean}, Rank: Number}], required: true}, // default {} +}, +{collection: 'groups'} +) +const model = mongoose.model('GroupSchema', GroupSchema) + +GroupSchema.virtual('owner', { + ref: 'UserSchema', + localField: 'ownerid', + foreignField: 'userid', + justOne: true +}) + +GroupSchema.virtual('memberspoly', { + ref: 'UserSchema', + localField: 'members.userId', + foreignField: 'userid' +}) + +module.exports = model \ No newline at end of file diff --git a/Back/model/ipWhitelist.mjs b/Back/model/ipWhitelist.mjs new file mode 100644 index 0000000..a4f0234 --- /dev/null +++ b/Back/model/ipWhitelist.mjs @@ -0,0 +1,7 @@ +import { Schema } from 'redis-om' + +const ipWhiteListSchema = new Schema('ipWhiteListSchema', { + ip: { type: 'string' }, +}) + +export default ipWhiteListSchema \ No newline at end of file diff --git a/Back/model/item.js b/Back/model/item.js new file mode 100644 index 0000000..cf8982c --- /dev/null +++ b/Back/model/item.js @@ -0,0 +1,23 @@ +const mongoose = require('mongoose') +const CatalogSchema = new mongoose.Schema({ + Name: {type: String, required: true}, + Description: {type: String, required: false}, + Price: {type: String, required: true}, + Type: {type: String, required: true}, + Creator: {type: Number, required: false}, + Hidden: {type: Boolean, required: false}, + ItemId: {type: String, required: true}, + Sales: {type: Number, required: false}, + ActiveAd: {type: Boolean, required: false}, // these 4 are for user generated ads + adtype: {type: String, required: false}, + adredirectid: {type: String, required: false}, + adstartedtime: {type: Number, required: false}, + approved: {type: Boolean, required: true}, + denied: {type: Boolean, required: false}, + associatedgameid: {type: Number, required: false}, +}, +{collection: 'catalog'} +) +const model = mongoose.model('CatalogSchema', CatalogSchema) + +module.exports = model \ No newline at end of file diff --git a/Back/model/keys.js b/Back/model/keys.js new file mode 100644 index 0000000..906a089 --- /dev/null +++ b/Back/model/keys.js @@ -0,0 +1,13 @@ +const mongoose = require('mongoose') +const KeysSchema = new mongoose.Schema({ + Creator: {type: String, required: true}, + Key: {type: String, required: true}, + Used: {type: Boolean, required: true}, + UsedBy: {type: String, required: false} +}, +{collection: 'keys'} +) + +const model = mongoose.model('KeysSchema', KeysSchema) + +module.exports = model \ No newline at end of file diff --git a/Back/model/rcc.js b/Back/model/rcc.js new file mode 100644 index 0000000..72d6a1f --- /dev/null +++ b/Back/model/rcc.js @@ -0,0 +1,11 @@ +const mongoose = require('mongoose') +const RccSchema = new mongoose.Schema({ + PlaceId: {type: Number, required: true}, + Port: {type: Number, required: true}, + Status: {type: Number, required: true}, +}, +{collection: 'RCC'} +) +const model = mongoose.model('RccSchema', RccSchema) + +module.exports = model \ No newline at end of file diff --git a/Back/model/rcc2014.js b/Back/model/rcc2014.js new file mode 100644 index 0000000..cf4cbec --- /dev/null +++ b/Back/model/rcc2014.js @@ -0,0 +1,10 @@ +const mongoose = require('mongoose') +const Rcc2014Schema = new mongoose.Schema({ + PlaceId: {type: Number, required: true}, + Port: {type: Number, required: true} +}, +{collection: 'RCC2014'} +) +const model = mongoose.model('Rcc2014Schema', Rcc2014Schema) + +module.exports = model \ No newline at end of file diff --git a/Back/model/rcc2018.js b/Back/model/rcc2018.js new file mode 100644 index 0000000..cda04c5 --- /dev/null +++ b/Back/model/rcc2018.js @@ -0,0 +1,11 @@ +const mongoose = require('mongoose') +const Rcc2018Schema = new mongoose.Schema({ + PlaceId: {type: Number, required: true}, + Port: {type: Number, required: true}, + Status: {type: Number, required: true}, +}, +{collection: 'RCC2018'} +) +const model = mongoose.model('Rcc2018Schema', Rcc2018Schema) + +module.exports = model \ No newline at end of file diff --git a/Back/model/rcc2020.js b/Back/model/rcc2020.js new file mode 100644 index 0000000..3cebd7c --- /dev/null +++ b/Back/model/rcc2020.js @@ -0,0 +1,11 @@ +const mongoose = require('mongoose') +const Rcc2020Schema = new mongoose.Schema({ + PlaceId: {type: Number, required: true}, + Port: {type: Number, required: true}, + Status: {type: Number, required: true}, +}, +{collection: 'RCC2020'} +) +const model = mongoose.model('Rcc2020Schema', Rcc2020Schema) + +module.exports = model \ No newline at end of file diff --git a/Back/model/user.js b/Back/model/user.js new file mode 100644 index 0000000..699a4ae --- /dev/null +++ b/Back/model/user.js @@ -0,0 +1,62 @@ +const mongoose = require('mongoose') +var uniqueValidator = require('mongoose-unique-validator'); +const UserSchema = new mongoose.Schema({ + username: {type: String, required: true, unique: true,uniqueCaseInsensitive: true}, + password: {type: String, required: true}, + coins: {type: Number, required: true}, + admin: {type: Boolean, required: true}, + ugcpermission: {type: Boolean, required: false}, + userid: {type: Number, required: true, index: true}, + moderation: {type: String, required: true}, + moderationhistory: {type: Object, required: false}, + inventory: {type: Object, required: false}, + colors: {type: Object, required: false}, + joindate: {type: String, required: true}, + lastclaimofcurrency: {type: Number, required: true}, + discordid: {type: String, required: false}, + gamejoin: {type: String, required: false}, + gamejoin2018: {type: String, required: false}, + gamejoin2020: {type: String, required: false}, + twofasecrets: {type: String, required: false}, + followers: {type: Object, required: false}, + friends: {type: Object, required: false}, + friendrequests: {type: Object, required: false}, + membership: {type: String, required: true}, + badges: {type: Object, required: false}, + status: {type: String, required: false}, + timesincelastrequest: {type: Number, required: true}, + avatartype: {type: String, required: false}, + bio: {type: String, required: false}, + recentlyplayed: {type: [{id: Number}], required: false}, + css: {type: String, required: false}, + aboutme: {type: String, required: false}, + lastfeedsharetime: {type: Number, required: false}, + feed: [{posterid: Number, content: String, date: Number, moderated: Boolean}], required: false}, + +{collection: 'users'} +) +UserSchema.plugin(uniqueValidator) + +UserSchema.virtual('recentlyplayedgames', { + ref: 'GamesSchema', + localField: 'recentlyplayed.id', + foreignField: 'idofgame' +}) + +UserSchema.virtual('friendsdata', { + ref: 'UserSchema', + localField: 'friends.userid', + foreignField: 'userid' +}) + +UserSchema.virtual('feed.userdata', { + ref: 'UserSchema', + localField: 'feed.posterid', + foreignField: 'userid', + justOne: true +}) + + +const model = mongoose.model('UserSchema', UserSchema) + +module.exports = model \ No newline at end of file diff --git a/Back/package-lock.json b/Back/package-lock.json new file mode 100644 index 0000000..c805eb2 --- /dev/null +++ b/Back/package-lock.json @@ -0,0 +1,8812 @@ +{ + "name": "datastoreservice", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "datastoreservice", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@mfd/rbxdatastoreservice": "^2.3.10", + "@yaireo/relative-time": "^1.0.3", + "atob": "^2.1.2", + "bcrypt": "^5.0.1", + "body-parser": "^1.20.0", + "connect-flash": "^0.1.1", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "daisyui": "^2.24.2", + "dotenv": "^16.0.1", + "easy-soap-request": "^4.8.0", + "esbuild": "0.17.4", + "express": "^4.18.1", + "express-flash-message": "^2.1.0", + "express-prom-bundle": "^6.5.0", + "express-rate-limit": "^6.7.0", + "express-session": "^1.17.3", + "file-type-checker": "^1.0.4", + "get-port": "^6.1.2", + "get-port-please": "^2.6.1", + "helmet": "^5.1.1", + "jsonwebtoken": "^9.0.0", + "mongo-sanitize": "^1.1.0", + "mongoose": "^6.5.2", + "mongoose-unique-validator": "^3.1.0", + "multer": "^1.4.5-lts.1", + "node-fetch": "^3.2.10", + "png-validator": "^1.1.0", + "prom-client": "^14.1.0", + "qrcode": "^1.5.1", + "redis": "^4.6.5", + "redis-om": "^0.4.0-beta.3", + "req-flash": "^0.0.3", + "speakeasy": "^2.0.0", + "xml-js": "^1.6.11", + "xss": "^1.0.13" + }, + "devDependencies": { + "cross-env": "^7.0.3", + "nodemon": "^2.0.19" + } + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "optional": true, + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "optional": true, + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-sdk/abort-controller": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz", + "integrity": "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz", + "integrity": "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.272.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz", + "integrity": "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz", + "integrity": "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz", + "integrity": "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-sdk-sts": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/config-resolver": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz", + "integrity": "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==", + "optional": true, + "dependencies": { + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz", + "integrity": "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz", + "integrity": "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz", + "integrity": "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==", + "optional": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz", + "integrity": "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz", + "integrity": "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-ini": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz", + "integrity": "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz", + "integrity": "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/token-providers": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz", + "integrity": "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz", + "integrity": "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.272.0", + "@aws-sdk/client-sso": "3.272.0", + "@aws-sdk/client-sts": "3.272.0", + "@aws-sdk/credential-provider-cognito-identity": "3.272.0", + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-ini": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz", + "integrity": "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/querystring-builder": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz", + "integrity": "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/invalid-dependency": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz", + "integrity": "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-content-length": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz", + "integrity": "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz", + "integrity": "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz", + "integrity": "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz", + "integrity": "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz", + "integrity": "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz", + "integrity": "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/service-error-classification": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-middleware": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz", + "integrity": "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz", + "integrity": "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz", + "integrity": "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz", + "integrity": "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz", + "integrity": "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz", + "integrity": "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz", + "integrity": "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==", + "optional": true, + "dependencies": { + "@aws-sdk/abort-controller": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/querystring-builder": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz", + "integrity": "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz", + "integrity": "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz", + "integrity": "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-parser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz", + "integrity": "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz", + "integrity": "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz", + "integrity": "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz", + "integrity": "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==", + "optional": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.272.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/smithy-client": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz", + "integrity": "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz", + "integrity": "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz", + "integrity": "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/url-parser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz", + "integrity": "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==", + "optional": true, + "dependencies": { + "@aws-sdk/querystring-parser": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-base64": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", + "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "optional": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "optional": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-browser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz", + "integrity": "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz", + "integrity": "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==", + "optional": true, + "dependencies": { + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz", + "integrity": "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", + "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-middleware": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz", + "integrity": "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-retry": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz", + "integrity": "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==", + "optional": true, + "dependencies": { + "@aws-sdk/service-error-classification": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz", + "integrity": "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.272.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz", + "integrity": "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==", + "optional": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8": { + "version": "3.254.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", + "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", + "optional": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.4.tgz", + "integrity": "sha512-R9GCe2xl2XDSc2XbQB63mFiFXHIVkOP+ltIxICKXqUPrFX97z6Z7vONCLQM1pSOLGqfLrGi3B7nbhxmFY/fomg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.4.tgz", + "integrity": "sha512-91VwDrl4EpxBCiG6h2LZZEkuNvVZYJkv2T9gyLG/mhGG1qrM7i5SwUcg/hlSPnL/4hDT0TFcF35/XMGSn0bemg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.4.tgz", + "integrity": "sha512-mGSqhEPL7029XL7QHNPxPs15JVa02hvZvysUcyMP9UXdGFwncl2WU0bqx+Ysgzd+WAbv8rfNa73QveOxAnAM2w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.4.tgz", + "integrity": "sha512-tTyJRM9dHvlMPt1KrBFVB5OW1kXOsRNvAPtbzoKazd5RhD5/wKlXk1qR2MpaZRYwf4WDMadt0Pv0GwxB41CVow==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.4.tgz", + "integrity": "sha512-phQuC2Imrb3TjOJwLN8EO50nb2FHe8Ew0OwgZDH1SV6asIPGudnwTQtighDF2EAYlXChLoMJwqjAp4vAaACq6w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.4.tgz", + "integrity": "sha512-oH6JUZkocgmjzzYaP5juERLpJQSwazdjZrTPgLRmAU2bzJ688x0vfMB/WTv4r58RiecdHvXOPC46VtsMy/mepg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.4.tgz", + "integrity": "sha512-U4iWGn/9TrAfpAdfd56eO0pRxIgb0a8Wj9jClrhT8hvZnOnS4dfMPW7o4fn15D/KqoiVYHRm43jjBaTt3g/2KA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.4.tgz", + "integrity": "sha512-S2s9xWTGMTa/fG5EyMGDeL0wrWVgOSQcNddJWgu6rG1NCSXJHs76ZP9AsxjB3f2nZow9fWOyApklIgiTGZKhiw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.4.tgz", + "integrity": "sha512-UkGfQvYlwOaeYJzZG4cLV0hCASzQZnKNktRXUo3/BMZvdau40AOz9GzmGA063n1piq6VrFFh43apRDQx8hMP2w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.4.tgz", + "integrity": "sha512-3lqFi4VFo/Vwvn77FZXeLd0ctolIJH/uXkH3yNgEk89Eh6D3XXAC9/iTPEzeEpsNE5IqGIsFa5Z0iPeOh25IyA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.4.tgz", + "integrity": "sha512-HqpWZkVslDHIwdQ9D+gk7NuAulgQvRxF9no54ut/M55KEb3mi7sQS3GwpPJzSyzzP0UkjQVN7/tbk88/CaX4EQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.4.tgz", + "integrity": "sha512-d/nMCKKh/SVDbqR9ju+b78vOr0tNXtfBjcp5vfHONCCOAL9ad8gN9dC/u+UnH939pz7wO+0u/x9y1MaZcb/lKA==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.4.tgz", + "integrity": "sha512-lOD9p2dmjZcNiTU+sGe9Nn6G3aYw3k0HBJies1PU0j5IGfp6tdKOQ6mzfACRFCqXjnBuTqK7eTYpwx09O5LLfg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.4.tgz", + "integrity": "sha512-mTGnwWwVshAjGsd8rP+K6583cPDgxOunsqqldEYij7T5/ysluMHKqUIT4TJHfrDFadUwrghAL6QjER4FeqQXoA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.4.tgz", + "integrity": "sha512-AQYuUGp50XM29/N/dehADxvc2bUqDcoqrVuijop1Wv72SyxT6dDB9wjUxuPZm2HwIM876UoNNBMVd+iX/UTKVQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.4.tgz", + "integrity": "sha512-+AsFBwKgQuhV2shfGgA9YloxLDVjXgUEWZum7glR5lLmV94IThu/u2JZGxTgjYby6kyXEx8lKOqP5rTEVBR0Rw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.4.tgz", + "integrity": "sha512-zD1TKYX9553OiLS/qkXPMlWoELYkH/VkzRYNKEU+GwFiqkq0SuxsKnsCg5UCdxN3cqd+1KZ8SS3R+WG/Hxy2jQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.4.tgz", + "integrity": "sha512-PY1NjEsLRhPEFFg1AV0/4Or/gR+q2dOb9s5rXcPuCjyHRzbt8vnHJl3vYj+641TgWZzTFmSUnZbzs1zwTzjeqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.4.tgz", + "integrity": "sha512-B3Z7s8QZQW9tKGleMRXvVmwwLPAUoDCHs4WZ2ElVMWiortLJFowU1NjAhXOKjDgC7o9ByeVcwyOlJ+F2r6ZgmQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.4.tgz", + "integrity": "sha512-0HCu8R3mY/H5V7N6kdlsJkvrT591bO/oRZy8ztF1dhgNU5xD5tAh5bKByT1UjTGjp/VVBsl1PDQ3L18SfvtnBQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.4.tgz", + "integrity": "sha512-VUjhVDQycse1gLbe06pC/uaA0M+piQXJpdpNdhg8sPmeIZZqu5xPoGWVCmcsOO2gaM2cywuTYTHkXRozo3/Nkg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.4.tgz", + "integrity": "sha512-0kLAjs+xN5OjhTt/aUA6t48SfENSCKgGPfExADYTOo/UCn0ivxos9/anUVeSfg+L+2O9xkFxvJXIJfG+Q4sYSg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/@mfd/rbxdatastoreservice": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@mfd/rbxdatastoreservice/-/rbxdatastoreservice-2.3.11.tgz", + "integrity": "sha512-sZkBwBolSwHT2RDz4//7K0Vkxdjo2Zg1RSdSaUasTUKWj+BMeANgyLv/baMFHcJFE/Z+3kCcCkU/VHqfiQAHgA==", + "hasInstallScript": true, + "dependencies": { + "axios": "^0.27.2", + "crypto-js": "^4.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.6.tgz", + "integrity": "sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA==", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", + "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@yaireo/relative-time": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yaireo/relative-time/-/relative-time-1.0.3.tgz", + "integrity": "sha512-CJGxyWjb4SnkqubyfiPNQeg0YrJKnVu+11DOP65ltXFxDsjjnm3IByXS9O1Ny9AU9Oxqg0a7Gt26tzXtcijicg==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "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==", + "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==", + "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==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "peer": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.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==" + }, + "node_modules/base32.js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.0.1.tgz", + "integrity": "sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bson": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "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==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001441", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", + "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "peer": true + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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==", + "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==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-flash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", + "integrity": "sha512-2rcfELQt/ZMP+SM/pG8PyhJRaLKp+6Hk2IUBNkEit09X+vwn3QsAL3ZbYtxUn7NVPzbMTSLRDhqe0B/eh30RYA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + }, + "node_modules/daisyui": { + "version": "2.46.1", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.46.1.tgz", + "integrity": "sha512-i59+nLuzzPAVOhNhot3KLtt6stfYeCIPXs9uiLcpXjykpqxHfBA3W6hQWOUWPMwfqhyQd0WKub3sydtPGjzLtA==", + "dependencies": { + "color": "^4.2", + "css-selector-tokenizer": "^0.8.0", + "postcss-js": "^4.0.0", + "tailwindcss": "^3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/daisyui" + }, + "peerDependencies": { + "autoprefixer": "^10.0.2", + "postcss": "^8.1.6" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dijkstrajs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", + "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/easy-soap-request": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/easy-soap-request/-/easy-soap-request-4.8.0.tgz", + "integrity": "sha512-fD1NXRv14P4IdAoyYpGJ2kB+292vYfvU7qLbmUw2x2HA+U74LWVyErjyNf2Jxn1mUAwp+sRdMlkmrUrPY0/wAg==", + "dependencies": { + "axios": "^0.27.2" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "peer": true + }, + "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==" + }, + "node_modules/encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/esbuild": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.4.tgz", + "integrity": "sha512-zBn9MeCwT7W5F1a3lXClD61ip6vQM+H8Msb0w8zMT4ZKBpDg+rFAraNyWCDelB/2L6M3g6AXHPnsyvjMFnxtFw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.4", + "@esbuild/android-arm64": "0.17.4", + "@esbuild/android-x64": "0.17.4", + "@esbuild/darwin-arm64": "0.17.4", + "@esbuild/darwin-x64": "0.17.4", + "@esbuild/freebsd-arm64": "0.17.4", + "@esbuild/freebsd-x64": "0.17.4", + "@esbuild/linux-arm": "0.17.4", + "@esbuild/linux-arm64": "0.17.4", + "@esbuild/linux-ia32": "0.17.4", + "@esbuild/linux-loong64": "0.17.4", + "@esbuild/linux-mips64el": "0.17.4", + "@esbuild/linux-ppc64": "0.17.4", + "@esbuild/linux-riscv64": "0.17.4", + "@esbuild/linux-s390x": "0.17.4", + "@esbuild/linux-x64": "0.17.4", + "@esbuild/netbsd-x64": "0.17.4", + "@esbuild/openbsd-x64": "0.17.4", + "@esbuild/sunos-x64": "0.17.4", + "@esbuild/win32-arm64": "0.17.4", + "@esbuild/win32-ia32": "0.17.4", + "@esbuild/win32-x64": "0.17.4" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-flash-message": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/express-flash-message/-/express-flash-message-2.1.0.tgz", + "integrity": "sha512-oR/cwzt7CfjSUt7XwEZCCyOegylHuTF8/by6+jAshZh2TzREqDIjfU0JU5M6usurSk/ep3lUxxyaCbujyERyTQ==" + }, + "node_modules/express-prom-bundle": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/express-prom-bundle/-/express-prom-bundle-6.6.0.tgz", + "integrity": "sha512-tZh2P2p5a8/yxQ5VbRav011Poa4R0mHqdFwn9Swe/obXDe5F0jY9wtRAfNYnqk4LXY7akyvR/nrvAHxQPWUjsQ==", + "dependencies": { + "on-finished": "^2.3.0", + "url-value-parser": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "prom-client": ">=12.0.0" + } + }, + "node_modules/express-rate-limit": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz", + "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==", + "engines": { + "node": ">= 12.9.0" + }, + "peerDependencies": { + "express": "^4 || ^5" + } + }, + "node_modules/express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/file-type-checker": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/file-type-checker/-/file-type-checker-1.0.4.tgz", + "integrity": "sha512-hhleilG34kfSjlSfAAj8DVvqXxMwEIVY/pkWnkMVbqdmly6jUv7jjNw/dmvdcbMt6joXlQgavCJCtNDRzODOsQ==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.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==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "peer": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-memo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fs-memo/-/fs-memo-1.2.0.tgz", + "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^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==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", + "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-port-please": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-2.6.1.tgz", + "integrity": "sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==", + "dependencies": { + "fs-memo": "^1.2.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/helmet": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-5.1.1.tgz", + "integrity": "sha512-/yX0oVZBggA9cLJh8aw3PPCfedBnbd7J2aowjzsaWwZh7/UFY0nccn/aHAggIgWUFfnykX8GKd3a1pSbrmlcVQ==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "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==", + "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==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/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==" + }, + "node_modules/just-clone": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz", + "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mongo-sanitize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mongo-sanitize/-/mongo-sanitize-1.1.0.tgz", + "integrity": "sha512-6gB9AiJD+om2eZLxaPKIP5Q8P3Fr+s+17rVWso7hU0+MAzmIvIMlgTYuyvalDLTtE/p0gczcvJ8A3pbN1XmQ/A==" + }, + "node_modules/mongodb": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz", + "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==", + "dependencies": { + "bson": "^4.7.0", + "mongodb-connection-string-url": "^2.5.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "@aws-sdk/credential-providers": "^3.186.0", + "saslprep": "^1.0.3" + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.9.1.tgz", + "integrity": "sha512-hOz1ZWV0w6WEVLrj89Wpk7PXDYtDDF6k7/NX79lY5iKqeFtZsceBXW8xW59YFNcW5O3cH32hQ8IbDlhgyBsDMA==", + "dependencies": { + "bson": "^4.7.0", + "kareem": "2.5.1", + "mongodb": "4.13.0", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose-unique-validator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", + "integrity": "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==", + "dependencies": { + "lodash.foreach": "^4.1.0", + "lodash.get": "^4.0.2", + "lodash.merge": "^4.6.2" + }, + "peerDependencies": { + "mongoose": "^6.0.0" + } + }, + "node_modules/mongoose/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==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", + "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "peer": true + }, + "node_modules/nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nodemon/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 + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.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==", + "dependencies": { + "wrappy": "1" + } + }, + "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==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "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==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "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==", + "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, + "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==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/png-validator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/png-validator/-/png-validator-1.1.0.tgz", + "integrity": "sha512-MlRLyPI1p3/dJbsjVH+4xOPucycrz8T3EvO0BzCXaNtrUhZkZROtzib9J6mnC81AJO8eBIwiDZwTFel2cMmSuQ==" + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss": { + "version": "8.4.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", + "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/prom-client": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz", + "integrity": "sha512-hFU32q7UZQ59bVJQGUtm3I2PrJ3gWvoCkilX9sF165ks1qflhugVCeK+S1JjJYHvyt3o5kj68+q3bchormjnzw==", + "dependencies": { + "tdigest": "^0.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz", + "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==", + "dependencies": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redis": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.5.tgz", + "integrity": "sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg==", + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.6", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.2", + "@redis/time-series": "1.0.4" + } + }, + "node_modules/redis-om": { + "version": "0.4.0-beta.3", + "resolved": "https://registry.npmjs.org/redis-om/-/redis-om-0.4.0-beta.3.tgz", + "integrity": "sha512-zGWBMGoe3exrvkbFjWqAFG8UJL3tdby5UkfPKiZLvA67d7FsR0ScEpsBaaWGL33y5EQUWnYL+pI8jzZaQ6brtA==", + "dependencies": { + "jsonpath-plus": "^7.2.0", + "just-clone": "^6.1.1", + "redis": "^4.6.4", + "ulid": "^2.3.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/req-flash": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/req-flash/-/req-flash-0.0.3.tgz", + "integrity": "sha512-c5ouPRJ6OVc4ecL5cgdwd51nYOFQiOTfl7UWk+VlgUHgfsh7TMRFPN/OJ5ETnOYFyswprT8C2a6ctMvJgms9ng==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/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==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "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==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/speakeasy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/speakeasy/-/speakeasy-2.0.0.tgz", + "integrity": "sha512-lW2A2s5LKi8rwu77ewisuUOtlCydF/hmQSOJjpTqTj1gZLkNgTaYnyvfxy2WBr4T/h+9c4g8HIITfj83OkFQFw==", + "dependencies": { + "base32.js": "0.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "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==", + "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.18", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "dependencies": { + "bintrees": "1.0.2" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "optional": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ulid": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", + "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==", + "bin": { + "ulid": "bin/cli.js" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url-value-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/url-value-parser/-/url-value-parser-2.2.0.tgz", + "integrity": "sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xss": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "dependencies": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "bin": { + "xss": "bin/xss" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "optional": true, + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "optional": true, + "requires": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } + } + }, + "@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "optional": true, + "requires": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "optional": true, + "requires": { + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } + } + }, + "@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "optional": true, + "requires": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + } + } + }, + "@aws-sdk/abort-controller": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz", + "integrity": "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz", + "integrity": "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.272.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz", + "integrity": "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz", + "integrity": "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sts": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz", + "integrity": "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/fetch-http-handler": "3.272.0", + "@aws-sdk/hash-node": "3.272.0", + "@aws-sdk/invalid-dependency": "3.272.0", + "@aws-sdk/middleware-content-length": "3.272.0", + "@aws-sdk/middleware-endpoint": "3.272.0", + "@aws-sdk/middleware-host-header": "3.272.0", + "@aws-sdk/middleware-logger": "3.272.0", + "@aws-sdk/middleware-recursion-detection": "3.272.0", + "@aws-sdk/middleware-retry": "3.272.0", + "@aws-sdk/middleware-sdk-sts": "3.272.0", + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/middleware-user-agent": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/node-http-handler": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/smithy-client": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.272.0", + "@aws-sdk/util-defaults-mode-node": "3.272.0", + "@aws-sdk/util-endpoints": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "@aws-sdk/util-user-agent-browser": "3.272.0", + "@aws-sdk/util-user-agent-node": "3.272.0", + "@aws-sdk/util-utf8": "3.254.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz", + "integrity": "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==", + "optional": true, + "requires": { + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz", + "integrity": "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz", + "integrity": "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz", + "integrity": "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==", + "optional": true, + "requires": { + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz", + "integrity": "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz", + "integrity": "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-ini": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz", + "integrity": "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz", + "integrity": "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==", + "optional": true, + "requires": { + "@aws-sdk/client-sso": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/token-providers": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz", + "integrity": "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-providers": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz", + "integrity": "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.272.0", + "@aws-sdk/client-sso": "3.272.0", + "@aws-sdk/client-sts": "3.272.0", + "@aws-sdk/credential-provider-cognito-identity": "3.272.0", + "@aws-sdk/credential-provider-env": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/credential-provider-ini": "3.272.0", + "@aws-sdk/credential-provider-node": "3.272.0", + "@aws-sdk/credential-provider-process": "3.272.0", + "@aws-sdk/credential-provider-sso": "3.272.0", + "@aws-sdk/credential-provider-web-identity": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz", + "integrity": "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/querystring-builder": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/hash-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz", + "integrity": "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz", + "integrity": "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz", + "integrity": "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-endpoint": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz", + "integrity": "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==", + "optional": true, + "requires": { + "@aws-sdk/middleware-serde": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/url-parser": "3.272.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz", + "integrity": "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz", + "integrity": "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz", + "integrity": "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz", + "integrity": "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/service-error-classification": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-middleware": "3.272.0", + "@aws-sdk/util-retry": "3.272.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz", + "integrity": "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==", + "optional": true, + "requires": { + "@aws-sdk/middleware-signing": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz", + "integrity": "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz", + "integrity": "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/signature-v4": "3.272.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-middleware": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz", + "integrity": "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz", + "integrity": "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz", + "integrity": "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz", + "integrity": "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==", + "optional": true, + "requires": { + "@aws-sdk/abort-controller": "3.272.0", + "@aws-sdk/protocol-http": "3.272.0", + "@aws-sdk/querystring-builder": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/property-provider": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz", + "integrity": "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz", + "integrity": "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz", + "integrity": "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz", + "integrity": "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz", + "integrity": "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==", + "optional": true + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz", + "integrity": "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz", + "integrity": "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==", + "optional": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.272.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.272.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "@aws-sdk/util-utf8": "3.254.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz", + "integrity": "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==", + "optional": true, + "requires": { + "@aws-sdk/middleware-stack": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/token-providers": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz", + "integrity": "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==", + "optional": true, + "requires": { + "@aws-sdk/client-sso-oidc": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/shared-ini-file-loader": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/types": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz", + "integrity": "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/url-parser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz", + "integrity": "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==", + "optional": true, + "requires": { + "@aws-sdk/querystring-parser": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-base64": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", + "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "optional": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "optional": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-browser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz", + "integrity": "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz", + "integrity": "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==", + "optional": true, + "requires": { + "@aws-sdk/config-resolver": "3.272.0", + "@aws-sdk/credential-provider-imds": "3.272.0", + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/property-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz", + "integrity": "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", + "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-middleware": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz", + "integrity": "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-retry": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz", + "integrity": "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==", + "optional": true, + "requires": { + "@aws-sdk/service-error-classification": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz", + "integrity": "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.272.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.272.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz", + "integrity": "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==", + "optional": true, + "requires": { + "@aws-sdk/node-config-provider": "3.272.0", + "@aws-sdk/types": "3.272.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-utf8": { + "version": "3.254.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", + "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", + "optional": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@esbuild/android-arm": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.4.tgz", + "integrity": "sha512-R9GCe2xl2XDSc2XbQB63mFiFXHIVkOP+ltIxICKXqUPrFX97z6Z7vONCLQM1pSOLGqfLrGi3B7nbhxmFY/fomg==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.4.tgz", + "integrity": "sha512-91VwDrl4EpxBCiG6h2LZZEkuNvVZYJkv2T9gyLG/mhGG1qrM7i5SwUcg/hlSPnL/4hDT0TFcF35/XMGSn0bemg==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.4.tgz", + "integrity": "sha512-mGSqhEPL7029XL7QHNPxPs15JVa02hvZvysUcyMP9UXdGFwncl2WU0bqx+Ysgzd+WAbv8rfNa73QveOxAnAM2w==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.4.tgz", + "integrity": "sha512-tTyJRM9dHvlMPt1KrBFVB5OW1kXOsRNvAPtbzoKazd5RhD5/wKlXk1qR2MpaZRYwf4WDMadt0Pv0GwxB41CVow==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.4.tgz", + "integrity": "sha512-phQuC2Imrb3TjOJwLN8EO50nb2FHe8Ew0OwgZDH1SV6asIPGudnwTQtighDF2EAYlXChLoMJwqjAp4vAaACq6w==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.4.tgz", + "integrity": "sha512-oH6JUZkocgmjzzYaP5juERLpJQSwazdjZrTPgLRmAU2bzJ688x0vfMB/WTv4r58RiecdHvXOPC46VtsMy/mepg==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.4.tgz", + "integrity": "sha512-U4iWGn/9TrAfpAdfd56eO0pRxIgb0a8Wj9jClrhT8hvZnOnS4dfMPW7o4fn15D/KqoiVYHRm43jjBaTt3g/2KA==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.4.tgz", + "integrity": "sha512-S2s9xWTGMTa/fG5EyMGDeL0wrWVgOSQcNddJWgu6rG1NCSXJHs76ZP9AsxjB3f2nZow9fWOyApklIgiTGZKhiw==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.4.tgz", + "integrity": "sha512-UkGfQvYlwOaeYJzZG4cLV0hCASzQZnKNktRXUo3/BMZvdau40AOz9GzmGA063n1piq6VrFFh43apRDQx8hMP2w==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.4.tgz", + "integrity": "sha512-3lqFi4VFo/Vwvn77FZXeLd0ctolIJH/uXkH3yNgEk89Eh6D3XXAC9/iTPEzeEpsNE5IqGIsFa5Z0iPeOh25IyA==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.4.tgz", + "integrity": "sha512-HqpWZkVslDHIwdQ9D+gk7NuAulgQvRxF9no54ut/M55KEb3mi7sQS3GwpPJzSyzzP0UkjQVN7/tbk88/CaX4EQ==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.4.tgz", + "integrity": "sha512-d/nMCKKh/SVDbqR9ju+b78vOr0tNXtfBjcp5vfHONCCOAL9ad8gN9dC/u+UnH939pz7wO+0u/x9y1MaZcb/lKA==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.4.tgz", + "integrity": "sha512-lOD9p2dmjZcNiTU+sGe9Nn6G3aYw3k0HBJies1PU0j5IGfp6tdKOQ6mzfACRFCqXjnBuTqK7eTYpwx09O5LLfg==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.4.tgz", + "integrity": "sha512-mTGnwWwVshAjGsd8rP+K6583cPDgxOunsqqldEYij7T5/ysluMHKqUIT4TJHfrDFadUwrghAL6QjER4FeqQXoA==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.4.tgz", + "integrity": "sha512-AQYuUGp50XM29/N/dehADxvc2bUqDcoqrVuijop1Wv72SyxT6dDB9wjUxuPZm2HwIM876UoNNBMVd+iX/UTKVQ==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.4.tgz", + "integrity": "sha512-+AsFBwKgQuhV2shfGgA9YloxLDVjXgUEWZum7glR5lLmV94IThu/u2JZGxTgjYby6kyXEx8lKOqP5rTEVBR0Rw==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.4.tgz", + "integrity": "sha512-zD1TKYX9553OiLS/qkXPMlWoELYkH/VkzRYNKEU+GwFiqkq0SuxsKnsCg5UCdxN3cqd+1KZ8SS3R+WG/Hxy2jQ==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.4.tgz", + "integrity": "sha512-PY1NjEsLRhPEFFg1AV0/4Or/gR+q2dOb9s5rXcPuCjyHRzbt8vnHJl3vYj+641TgWZzTFmSUnZbzs1zwTzjeqw==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.4.tgz", + "integrity": "sha512-B3Z7s8QZQW9tKGleMRXvVmwwLPAUoDCHs4WZ2ElVMWiortLJFowU1NjAhXOKjDgC7o9ByeVcwyOlJ+F2r6ZgmQ==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.4.tgz", + "integrity": "sha512-0HCu8R3mY/H5V7N6kdlsJkvrT591bO/oRZy8ztF1dhgNU5xD5tAh5bKByT1UjTGjp/VVBsl1PDQ3L18SfvtnBQ==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.4.tgz", + "integrity": "sha512-VUjhVDQycse1gLbe06pC/uaA0M+piQXJpdpNdhg8sPmeIZZqu5xPoGWVCmcsOO2gaM2cywuTYTHkXRozo3/Nkg==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.4.tgz", + "integrity": "sha512-0kLAjs+xN5OjhTt/aUA6t48SfENSCKgGPfExADYTOo/UCn0ivxos9/anUVeSfg+L+2O9xkFxvJXIJfG+Q4sYSg==", + "optional": true + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "@mfd/rbxdatastoreservice": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@mfd/rbxdatastoreservice/-/rbxdatastoreservice-2.3.11.tgz", + "integrity": "sha512-sZkBwBolSwHT2RDz4//7K0Vkxdjo2Zg1RSdSaUasTUKWj+BMeANgyLv/baMFHcJFE/Z+3kCcCkU/VHqfiQAHgA==", + "requires": { + "axios": "^0.27.2", + "crypto-js": "^4.0.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "requires": {} + }, + "@redis/client": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.6.tgz", + "integrity": "sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA==", + "requires": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + } + }, + "@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "requires": {} + }, + "@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "requires": {} + }, + "@redis/search": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz", + "integrity": "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==", + "requires": {} + }, + "@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "requires": {} + }, + "@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" + }, + "@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "@yaireo/relative-time": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yaireo/relative-time/-/relative-time-1.0.3.tgz", + "integrity": "sha512-CJGxyWjb4SnkqubyfiPNQeg0YrJKnVu+11DOP65ltXFxDsjjnm3IByXS9O1Ny9AU9Oxqg0a7Gt26tzXtcijicg==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "peer": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "requires": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base32.js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/base32.js/-/base32.js-0.0.1.tgz", + "integrity": "sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "peer": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "bson": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", + "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "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==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-lite": { + "version": "1.0.30001441", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", + "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "peer": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" + }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-flash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz", + "integrity": "sha512-2rcfELQt/ZMP+SM/pG8PyhJRaLKp+6Hk2IUBNkEit09X+vwn3QsAL3ZbYtxUn7NVPzbMTSLRDhqe0B/eh30RYA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "requires": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + }, + "daisyui": { + "version": "2.46.1", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.46.1.tgz", + "integrity": "sha512-i59+nLuzzPAVOhNhot3KLtt6stfYeCIPXs9uiLcpXjykpqxHfBA3W6hQWOUWPMwfqhyQd0WKub3sydtPGjzLtA==", + "requires": { + "color": "^4.2", + "css-selector-tokenizer": "^0.8.0", + "postcss-js": "^4.0.0", + "tailwindcss": "^3" + } + }, + "data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "dijkstrajs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", + "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "easy-soap-request": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/easy-soap-request/-/easy-soap-request-4.8.0.tgz", + "integrity": "sha512-fD1NXRv14P4IdAoyYpGJ2kB+292vYfvU7qLbmUw2x2HA+U74LWVyErjyNf2Jxn1mUAwp+sRdMlkmrUrPY0/wAg==", + "requires": { + "axios": "^0.27.2" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "peer": true + }, + "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==" + }, + "encode-utf8": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "esbuild": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.4.tgz", + "integrity": "sha512-zBn9MeCwT7W5F1a3lXClD61ip6vQM+H8Msb0w8zMT4ZKBpDg+rFAraNyWCDelB/2L6M3g6AXHPnsyvjMFnxtFw==", + "requires": { + "@esbuild/android-arm": "0.17.4", + "@esbuild/android-arm64": "0.17.4", + "@esbuild/android-x64": "0.17.4", + "@esbuild/darwin-arm64": "0.17.4", + "@esbuild/darwin-x64": "0.17.4", + "@esbuild/freebsd-arm64": "0.17.4", + "@esbuild/freebsd-x64": "0.17.4", + "@esbuild/linux-arm": "0.17.4", + "@esbuild/linux-arm64": "0.17.4", + "@esbuild/linux-ia32": "0.17.4", + "@esbuild/linux-loong64": "0.17.4", + "@esbuild/linux-mips64el": "0.17.4", + "@esbuild/linux-ppc64": "0.17.4", + "@esbuild/linux-riscv64": "0.17.4", + "@esbuild/linux-s390x": "0.17.4", + "@esbuild/linux-x64": "0.17.4", + "@esbuild/netbsd-x64": "0.17.4", + "@esbuild/openbsd-x64": "0.17.4", + "@esbuild/sunos-x64": "0.17.4", + "@esbuild/win32-arm64": "0.17.4", + "@esbuild/win32-ia32": "0.17.4", + "@esbuild/win32-x64": "0.17.4" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "peer": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + } + } + }, + "express-flash-message": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/express-flash-message/-/express-flash-message-2.1.0.tgz", + "integrity": "sha512-oR/cwzt7CfjSUt7XwEZCCyOegylHuTF8/by6+jAshZh2TzREqDIjfU0JU5M6usurSk/ep3lUxxyaCbujyERyTQ==" + }, + "express-prom-bundle": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/express-prom-bundle/-/express-prom-bundle-6.6.0.tgz", + "integrity": "sha512-tZh2P2p5a8/yxQ5VbRav011Poa4R0mHqdFwn9Swe/obXDe5F0jY9wtRAfNYnqk4LXY7akyvR/nrvAHxQPWUjsQ==", + "requires": { + "on-finished": "^2.3.0", + "url-value-parser": "^2.0.0" + } + }, + "express-rate-limit": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz", + "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==", + "requires": {} + }, + "express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "requires": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + } + } + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "optional": true, + "requires": { + "strnum": "^1.0.5" + } + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, + "file-type-checker": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/file-type-checker/-/file-type-checker-1.0.4.tgz", + "integrity": "sha512-hhleilG34kfSjlSfAAj8DVvqXxMwEIVY/pkWnkMVbqdmly6jUv7jjNw/dmvdcbMt6joXlQgavCJCtNDRzODOsQ==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "peer": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-memo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fs-memo/-/fs-memo-1.2.0.tgz", + "integrity": "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==" + }, + "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==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz", + "integrity": "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==" + }, + "get-port-please": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-2.6.1.tgz", + "integrity": "sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==", + "requires": { + "fs-memo": "^1.2.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "helmet": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-5.1.1.tgz", + "integrity": "sha512-/yX0oVZBggA9cLJh8aw3PPCfedBnbd7J2aowjzsaWwZh7/UFY0nccn/aHAggIgWUFfnykX8GKd3a1pSbrmlcVQ==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "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==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==" + }, + "jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "requires": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "just-clone": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz", + "integrity": "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==" + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==" + }, + "lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "mongo-sanitize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mongo-sanitize/-/mongo-sanitize-1.1.0.tgz", + "integrity": "sha512-6gB9AiJD+om2eZLxaPKIP5Q8P3Fr+s+17rVWso7hU0+MAzmIvIMlgTYuyvalDLTtE/p0gczcvJ8A3pbN1XmQ/A==" + }, + "mongodb": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz", + "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==", + "requires": { + "@aws-sdk/credential-providers": "^3.186.0", + "bson": "^4.7.0", + "mongodb-connection-string-url": "^2.5.4", + "saslprep": "^1.0.3", + "socks": "^2.7.1" + } + }, + "mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "mongoose": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.9.1.tgz", + "integrity": "sha512-hOz1ZWV0w6WEVLrj89Wpk7PXDYtDDF6k7/NX79lY5iKqeFtZsceBXW8xW59YFNcW5O3cH32hQ8IbDlhgyBsDMA==", + "requires": { + "bson": "^4.7.0", + "kareem": "2.5.1", + "mongodb": "4.13.0", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "mongoose-unique-validator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz", + "integrity": "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==", + "requires": { + "lodash.foreach": "^4.1.0", + "lodash.get": "^4.0.2", + "lodash.merge": "^4.6.2" + } + }, + "mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" + }, + "mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "requires": { + "debug": "4.x" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + }, + "node-fetch": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", + "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, + "node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "peer": true + }, + "nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "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 + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "peer": true + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "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==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "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==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "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==" + }, + "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==" + }, + "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 + }, + "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==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "png-validator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/png-validator/-/png-validator-1.1.0.tgz", + "integrity": "sha512-MlRLyPI1p3/dJbsjVH+4xOPucycrz8T3EvO0BzCXaNtrUhZkZROtzib9J6mnC81AJO8eBIwiDZwTFel2cMmSuQ==" + }, + "pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==" + }, + "postcss": { + "version": "8.4.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", + "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", + "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "prom-client": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz", + "integrity": "sha512-hFU32q7UZQ59bVJQGUtm3I2PrJ3gWvoCkilX9sF165ks1qflhugVCeK+S1JjJYHvyt3o5kj68+q3bchormjnzw==", + "requires": { + "tdigest": "^0.1.1" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "qrcode": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz", + "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==", + "requires": { + "dijkstrajs": "^1.0.1", + "encode-utf8": "^1.0.3", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "redis": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.5.tgz", + "integrity": "sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg==", + "requires": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.6", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.2", + "@redis/time-series": "1.0.4" + } + }, + "redis-om": { + "version": "0.4.0-beta.3", + "resolved": "https://registry.npmjs.org/redis-om/-/redis-om-0.4.0-beta.3.tgz", + "integrity": "sha512-zGWBMGoe3exrvkbFjWqAFG8UJL3tdby5UkfPKiZLvA67d7FsR0ScEpsBaaWGL33y5EQUWnYL+pI8jzZaQ6brtA==", + "requires": { + "jsonpath-plus": "^7.2.0", + "just-clone": "^6.1.1", + "redis": "^4.6.4", + "ulid": "^2.3.0" + } + }, + "req-flash": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/req-flash/-/req-flash-0.0.3.tgz", + "integrity": "sha512-c5ouPRJ6OVc4ecL5cgdwd51nYOFQiOTfl7UWk+VlgUHgfsh7TMRFPN/OJ5ETnOYFyswprT8C2a6ctMvJgms9ng==" + }, + "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==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "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" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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 + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "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==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "speakeasy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/speakeasy/-/speakeasy-2.0.0.tgz", + "integrity": "sha512-lW2A2s5LKi8rwu77ewisuUOtlCydF/hmQSOJjpTqTj1gZLkNgTaYnyvfxy2WBr4T/h+9c4g8HIITfj83OkFQFw==", + "requires": { + "base32.js": "0.0.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "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==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "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==" + }, + "tailwindcss": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz", + "integrity": "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==", + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.18", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "requires": { + "bintrees": "1.0.2" + } + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "optional": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, + "ulid": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz", + "integrity": "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==" + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "peer": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "url-value-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/url-value-parser/-/url-value-parser-2.2.0.tgz", + "integrity": "sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "optional": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } + }, + "xss": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz", + "integrity": "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==", + "requires": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/Back/package.json b/Back/package.json new file mode 100644 index 0000000..d47414c --- /dev/null +++ b/Back/package.json @@ -0,0 +1,56 @@ +{ + "name": "datastoreservice", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "devStart": "cross-env PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host nodemon server.mjs", + "prod": "PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host pm2 start server.mjs", + "prodreload": "PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host pm2 reload server.mjs" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@mfd/rbxdatastoreservice": "^2.3.10", + "@yaireo/relative-time": "^1.0.3", + "atob": "^2.1.2", + "bcrypt": "^5.0.1", + "body-parser": "^1.20.0", + "connect-flash": "^0.1.1", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "daisyui": "^2.24.2", + "dotenv": "^16.0.1", + "easy-soap-request": "^4.8.0", + "esbuild": "0.17.4", + "express": "^4.18.1", + "express-flash-message": "^2.1.0", + "express-prom-bundle": "^6.5.0", + "express-rate-limit": "^6.7.0", + "express-session": "^1.17.3", + "file-type-checker": "^1.0.4", + "get-port": "^6.1.2", + "get-port-please": "^2.6.1", + "helmet": "^5.1.1", + "jsonwebtoken": "^9.0.0", + "mongo-sanitize": "^1.1.0", + "mongoose": "^6.5.2", + "mongoose-unique-validator": "^3.1.0", + "multer": "^1.4.5-lts.1", + "node-fetch": "^3.2.10", + "png-validator": "^1.1.0", + "prom-client": "^14.1.0", + "qrcode": "^1.5.1", + "redis": "^4.6.5", + "redis-om": "^0.4.0-beta.3", + "req-flash": "^0.0.3", + "speakeasy": "^2.0.0", + "xml-js": "^1.6.11", + "xss": "^1.0.13" + }, + "devDependencies": { + "cross-env": "^7.0.3", + "nodemon": "^2.0.19" + } +} diff --git a/Back/rcctalk.js b/Back/rcctalk.js new file mode 100644 index 0000000..b6dd4b1 --- /dev/null +++ b/Back/rcctalk.js @@ -0,0 +1,320 @@ +const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); +let controller = new AbortController(); +require('dotenv').config() +const RCC_HOST = process.env.RCC_HOST + + const url = 'http://'+RCC_HOST+':64989'; // change this to rcc soap + +var convert = require('xml-js'); +const sampleHeaders = { + 'Content-Type': 'text/xml;charset=UTF-8', +}; + + + +async function OpenJob(jobid,script,expiration){ + return new Promise(async (resolve, reject) => { + // this is all boilerplate because soap sucks +var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/' + }, + 'SOAP-ENV:Body': { + 'ns1:OpenJobEx': { + 'ns1:job': { + 'ns1:id': { _text: 'StringTest11' }, + 'ns1:expirationInSeconds': { _text: '10' }, + 'ns1:category': { _text: '0' }, + 'ns1:cores': { _text: '1' } + }, + 'ns1:script': { + 'ns1:name': { _text: 'StringTest11-Script' }, + 'ns1:script': { + _text: 'print("Recieved job with ID " .. game.JobId)\r\n' + }, + 'ns1:arguments': {} + } + } + } + } + } +xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:id']._text = jobid +xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:expirationInSeconds']._text = expiration +if (!expiration) { + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:expirationInSeconds']._text = "60" +} +xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:script']['ns1:script']._text = script +const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + +async function GetAllJobs() { + return new Promise(async (resolve, reject) => { + const xmlData = (xml = { + _declaration: { + _attributes: { version: '1.0', encoding: 'UTF - 8' }, + }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', + 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12', + }, + 'SOAP-ENV:Body': { 'ns1:GetAllJobsEx': {} }, + }, + }) + + const body = convert.js2xml(xmlData, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:GetAllJobsExResponse']['ns1:GetAllJobsExResult'] + ) + } catch (error) { + return reject(error) + } + }) +} + + + +async function Execute(jobid,script) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF - 8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', + 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12' + }, + 'SOAP-ENV:Body': { + 'ns1:ExecuteEx': { + 'ns1:jobID': { _text: 'Test' }, + 'ns1:script': { + 'ns1:name': { _text: 'Script' }, + 'ns1:script': { _text: 'print("no")' }, + 'ns1:arguments': { _text: '' } + } + } + } + } + } +xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:ExecuteEx']['ns1:jobID']._text = jobid +xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:ExecuteEx']['ns1:script']['ns1:script']._text = script + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) + +} +async function CloseJob(jobid) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF - 8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', + 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12' + }, + 'SOAP-ENV:Body': { + 'ns1:CloseJob': { + 'ns1:jobID': { _text: 'Test' } + } + } + } + } + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:CloseJob']['ns1:jobID']._text = jobid + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + + +async function RenewLease(jobid,expiration) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance' + }, + 'SOAP-ENV:Body': { + 'ns1:RenewLease': { + 'ns1:jobID': { + _attributes: { 'xsi:type': 'ns1:Job' }, + 'ns1:id': { _text: 'StringTest11' }, + 'ns1:expirationInSeconds': { _text: '10' }, + 'ns1:category': { _text: '0' }, + 'ns1:cores': { _text: '1' } + }, + 'ns1:expirationInSeconds': { _text: '100' } + } + } + } + } + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:jobID']['ns1:id']._text = jobid + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:expirationInSeconds']._text = expiration + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + +async function GetExpiration(jobid){ + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/' + }, + 'SOAP-ENV:Body': { 'ns1:GetExpiration': { 'ns1:jobID': { _text: 'Test' } } } + } + } + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:GetExpiration']['ns1:jobID']._text = jobid + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} +//var gameservertxt = fs.readFileSync('actualgameserver.txt','utf-8') +//gameservertxt = gameservertxt.replace('function start(placeId, port, url)','function start(1111, port)') + +async function CloseExpiredJobs(){ + return new Promise(async (resolve, reject) => { + var xml = xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/' + }, + 'SOAP-ENV:Body': { 'ns1:CloseExpiredJobs': {} } + } + } + + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + +async function CloseAllJobs(){ + return new Promise(async (resolve, reject) => { + var xml = xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/' + }, + 'SOAP-ENV:Body': { 'ns1:CloseAllJobs': {} } + } + } + + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + + +module.exports = {OpenJob, GetAllJobs,Execute,CloseJob,RenewLease,GetExpiration,CloseExpiredJobs,CloseAllJobs} + + + + + + + + + diff --git a/Back/rcctalk2018.js b/Back/rcctalk2018.js new file mode 100644 index 0000000..1c5ef18 --- /dev/null +++ b/Back/rcctalk2018.js @@ -0,0 +1,300 @@ +const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); +let controller = new AbortController(); +require('dotenv').config() +const RCC_HOST = process.env.RCC_HOST +var convert = require('xml-js'); + + let url = 'http://'+RCC_HOST+':8000'; // change this to rcc soap + +async function OpenGame(jobid,port,ip,placeid,creatorid){ + return new Promise(async (resolve, reject) => { + let json = {"Mode":"GameServer","GameId":"game1","Settings":{"IsRobloxPlace":false,"PlaceId":1,"CreatorId":1,"GameId":"00000000-0000-0000-0000-000000000132","GsmInterval":50,"MaxPlayers":100,"MaxGameInstances":52,"ApiKey":"egg","GameCode":"AAAAAAAAAAAAAA-a","PreferredPlayerCapacity":10,"DatacenterId":1,"PlaceVisitAccessKey":"rbx_evt_ftp","UniverseId":13058,"PlaceFetchUrl":"https://mete0r.xyz/asset?id=11","MatchmakingContextId":1,"CreatorType":"User","PlaceVersion":123,"BaseUrl":"mete0r.xyz","MachineAddress":"localhost","JobId":"game1","PreferredPort":53640}} + json.GameId = jobid + json.Settings.PreferredPort = port + json.Settings.MachineAddress = ip + json.Settings.JobId = jobid + json.Settings.PlaceId = parseFloat(placeid) + json.Settings.UniverseId = json.Settings.PlaceId + json.Settings.CreatorId = creatorid + json.Settings.GameId = jobid + + let xml = ` + + + + + ${jobid} + 60 + 2 + 1 + + + game1 + ${JSON.stringify(json)} + + + + ` + + +//console.log(encodeURIComponent(JSON.stringify(json))) + try { + const result = await fetch(url+"/opengame/"+jobid+"/"+encodeURIComponent(JSON.stringify(json))) + const data = await result.text() + return resolve( + data + ) + } catch (error) { + return reject(error) + } + }) +} + +async function OpenGame2020(jobid,port,ip,placeid,creatorid){ + return new Promise(async (resolve, reject) => { +let json = {"Mode":"GameServer","GameId":"game1","Settings":{"IsRobloxPlace":false,"PlaceId":1,"CreatorId":1,"GameId":"00000000-0000-0000-0000-000000000132","GsmInterval":50,"MaxPlayers":100,"MaxGameInstances":52,"ApiKey":"egg","GameCode":"AAAAAAAAAAAAAA-a","PreferredPlayerCapacity":10,"DatacenterId":1,"PlaceVisitAccessKey":"rbx_evt_ftp","UniverseId":13058,"PlaceFetchUrl":"https://mete0r.xyz/asset?id=11","MatchmakingContextId":1,"CreatorType":"User","PlaceVersion":123,"BaseUrl":"mete0r.xyz","MachineAddress":"localhost","JobId":"game1","PreferredPort":53640}} + json.GameId = jobid + json.Settings.PreferredPort = port + json.Settings.MachineAddress = ip + json.Settings.JobId = jobid + json.Settings.PlaceId = parseFloat(placeid) + json.Settings.UniverseId = json.Settings.PlaceId + json.Settings.CreatorId = creatorid + json.Settings.GameId = jobid + json.Settings.PlaceFetchUrl = "https://mete0r.xyz/asset?id="+parseFloat(placeid) + + let xml = ` + + + + + ${jobid} + 60 + 2 + 1 + + + game1 + ${JSON.stringify(json)} + + + + ` + + +//console.log(encodeURIComponent(JSON.stringify(json))) + try { + const result = await fetch(url+"/opengame2020/"+jobid+"/"+encodeURIComponent(JSON.stringify(json))) + const data = await result.text() + return resolve( + data + ) + } catch (error) { + return reject(error) + } + }) +} + +async function CloseJob(jobid) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF - 8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', + 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12' + }, + 'SOAP-ENV:Body': { + 'ns1:CloseJob': { + 'ns1:jobID': { _text: 'Test' } + } + } + } + } + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:CloseJob']['ns1:jobID']._text = jobid + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url+"/closejob/"+jobid) + const data = await result.text() + return resolve( + data + ) + } catch (error) { + return reject(error) + } + }) +} + +async function OpenRender(userid,closeup) { + return new Promise(async (resolve, reject) => { + try { + const result = await fetch(url+"/openrender/"+userid+"/"+closeup) + const data = await result.text() + //console.log(data) + if (data === '{"status": "error","error":"Already started"}'){ + return resolve( + JSON.parse(data) + ) + } + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + +async function OpenRenderAsset(assetid,type) { + return new Promise(async (resolve, reject) => { + try { + const result = await fetch(url+"/openrenderasset/"+assetid+"/"+type) + const data = await result.text() + //console.log(data) + if (data === '{"status": "error","error":"Already started"}'){ + return resolve( + JSON.parse(data) + ) + } + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + +async function lol2(){ + const lol = await OpenRender(0) + console.log(lol['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobResponse']['ns1:OpenJobResult'][0]['ns1:value']._text) +} + +async function RenewLease(jobid,expiration) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance' + }, + 'SOAP-ENV:Body': { + 'ns1:RenewLease': { + 'ns1:jobID': { _text: 'Test' }, + 'ns1:expirationInSeconds': { _text: '100' } + } + } + } + } + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:jobID']._text = jobid + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:expirationInSeconds']._text = expiration + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url+"/renewlease/"+jobid+"/"+expiration) + const data = await result.text() + return resolve( + data + ) + } catch (error) { + return reject(error) + } + }) +} + +async function Execute(jobid,json) { + return new Promise(async (resolve, reject) => { + try { + const result = await fetch(url+"/executejson/"+jobid+"/"+encodeURIComponent(JSON.stringify(json))) + const data = await result.text() + return resolve( + data + ) + } catch (error) { + return reject(error) + } + }) +} + +async function GetAllJobs() { + return new Promise(async (resolve, reject) => { + const xmlData = (xml = { + _declaration: { + _attributes: { version: '1.0', encoding: 'UTF - 8' }, + }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', + 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12', + }, + 'SOAP-ENV:Body': { 'ns1:GetAllJobsEx': {} }, + }, + }) + + const body = convert.js2xml(xmlData, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:GetAllJobsExResponse']['ns1:GetAllJobsExResult'] + ) + } catch (error) { + return reject(error) + } + }) +} + +//RenewLease('game2',"69530318916789546987353800") +async function lol(){ +let res = await GetAllJobs() +//console.dir(res,{ depth: null }) +let exists = false +if (res != "{}"){ + if (Array.isArray(res['ns1:Job']) === false){ + console.log('asd') + //console.log(res['ns1:Job']['ns1:id']._text) + if (res['ns1:Job']['ns1:id']._text === 'game2'){ + exists = true + } + }else{ + res['ns1:Job'].forEach(element => { + if (element['ns1:id']?._text === 'game2'){ + exists = true + } + }) + } + + +} +console.log(exists) +} +//lol() +//GetAllJobs() +//OpenGame('game2','3333','127.0.0.1','2') +module.exports = {OpenGame,CloseJob,RenewLease,GetAllJobs,OpenRender,OpenRenderAsset,OpenGame2020,Execute} + + + + + + + + + diff --git a/Back/routes/2018/game.js b/Back/routes/2018/game.js new file mode 100644 index 0000000..3a0b752 --- /dev/null +++ b/Back/routes/2018/game.js @@ -0,0 +1,110 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('../../middleware/authmiddlewaregame') +const crypto = require('crypto'); +const fs = require('fs') +const key = fs.readFileSync('DefaultPrivateKey.pem') +const { getPort, checkPort, getRandomPort, waitForPort } = require('get-port-please') +const RCC_HOST = process.env.RCC_HOST +var sanitize = require('mongo-sanitize'); +const games = require('./../../model/games.js') +const signatures = require("./../signatures.js") +const rcc = require('../../model/rcc2018.js') +const rcctalk = require('../../rcctalk2018') +const User = require('../../model/user.js') + +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + const _2018placelauncher = async(req,res,next) => { + var enabled = req.config + if (enabled.GamesEnabled === false){ + return res.json({status:"error",error:"Games are disabled bad boy"}) + } + var joinJson = {"ClientPort":0,"MachineAddress":"localhost","ServerPort":25564,"PingUrl":"","PingInterval":120,"UserName":"default","SeleniumTestMode":false,"UserId":0,"SuperSafeChat":false,"CharacterAppearance":"http://shitncumblox.gq/game/charapp?name=default","ClientTicket":"","GameId":1,"PlaceId":1818,"MeasurementUrl":"","WaitingForCharacterGuid":"cad99b30-7983-434b-b24c-eac12595e5fd","BaseUrl":"http://www.mete0r.xyz/","ChatStyle":"ClassicAndBubble","VendorId":0,"ScreenShotInfo":"","VideoInfo":"GamesROBLOX, video, free game, online virtual world","CreatorId":0,"CreatorTypeEnum":"User","MembershipType":"None","AccountAge":365,"CookieStoreFirstTimePlayKey":"rbx_evt_ftp","CookieStoreFiveMinutePlayKey":"rbx_evt_fmp","CookieStoreEnabled":true,"IsRobloxPlace":false,"GenerateTeleportJoin":false,"IsUnknownOrUnder13":false,"SessionId":"c25fd620-bbaa-4fb2-b022-3f053cdd1abd|00000000-0000-0000-0000-000000000000|0|204.236.226.210|8|2016-08-17T01:05:05.7115837Z|0|null|null|null|null","DataCenterId":0,"UniverseId":0,"BrowserTrackerId":0,"UsePortraitMode":false,"FollowUserId":0,"CharacterAppearanceId":1} + if (!req.query.name && !req.query.placeId && !req.query.placeid){ + return res.json({status:"error",error:"no placeid bad"}) + } + if (req.userdocument.gamejoin2018){ + return res.json({"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2018&auth="+req.query.auth??req.cookies.jwt,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""}) + } + var sanitizedplaceid = sanitize(req.query.name??req.query.placeId??req.query.placeid) + const game = await games.findOne({idofgame: sanitizedplaceid}).lean() + if (!game){ + return res.json({status:"error",error:"that game doesn't exist!"}) + } + if (game.version != "2018"){ + return next() + } + let instance = await rcc.findOne({PlaceId: sanitizedplaceid}).lean() + if (instance && instance.Status === 2){ + + + // if an rcc instance already exists we don't need to create a new one so we will just drag them into the existing game + joinJson.UserName = req.userdocument.username + joinJson.UserId = req.userdocument.userid + joinJson.CharacterAppearance = "http://mete0r.xyz/v1.1/avatar-fetch?userId" + req.userdocument.userid + joinJson.MachineAddress = RCC_HOST // need to put rcc host here lol + joinJson.ServerPort = instance.Port + joinJson.PlaceId = instance.PlaceId + joinJson.GameId = sanitizedplaceid + joinJson.CharacterAppearanceId = req.userdocument.userid + joinJson.MembershipType = req.userdocument.membership + joinJson.CreatorId = game.useridofowner + joinJson.SessionId = req.query.auth??req.cookies.jwt + + const timestamp = Date.now() + joinJson.ClientTicket = timestamp+";" // timestamp + //create signature 1 + const sign1 = crypto.createSign('SHA1'); + sign1.update(`${req.userdocument.userid}\n`/*userid*/+`${req.userdocument.username}\n`/*username*/+`http://mete0r.xyz/v1.1/avatar-fetch?userId=${req.userdocument.userid}\n`/*charapp*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) + var signature1 = sign1.sign(key, "base64") + joinJson.ClientTicket += signature1 + ";" + + //create signature 2 + const sign2 = crypto.createSign('SHA1'); + sign2.update(`${req.userdocument.userid}\n`/*userid*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) + var signature2 = sign2.sign(key, "base64") + joinJson.ClientTicket += signature2 + + req.userdocument.gamejoin2018 = JSON.stringify(joinJson) + req.userdocument.markModified('gamejoin2018') + await req.userdocument.save() + var joinScriptJson = {"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2018&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + + + return res.send(JSON.stringify(joinScriptJson)) + } + if (instance && instance.Status === 1){ + var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2018&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + return res.send(JSON.stringify(joinScriptJson)) + } + + + var port = await getPort({random: true}) + // launch job + rcctalk.OpenGame("game"+sanitizedplaceid,port,RCC_HOST,sanitizedplaceid,game.useridofowner) + //console.dir(response,{ depth: null }) + //console.dir(response,{ depth: null }) + + await rcc.create({ + PlaceId: sanitizedplaceid, + Port: port, + Status: 1 // 1 means loading + }) + + //console.log(newrenderscript) + + var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2020&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + return res.send(JSON.stringify(joinScriptJson)) + + } + +router.all("/2018/join",requireAuth,_2018placelauncher,async (req, res) => { + return res.json({status:"error",error:"Version different than client requested."}) +}) + +//rcctalk.CloseJob('game2') +module.exports = {router: router, _2018placelauncher:_2018placelauncher} \ No newline at end of file diff --git a/Back/routes/2020/game.js b/Back/routes/2020/game.js new file mode 100644 index 0000000..d374c60 --- /dev/null +++ b/Back/routes/2020/game.js @@ -0,0 +1,207 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('../../middleware/authmiddlewaregame') +const crypto = require('crypto'); +const fs = require('fs') +const key = fs.readFileSync('PrivateKey2020.txt') +const { getPort, checkPort, getRandomPort, waitForPort } = require('get-port-please') +const RCC_HOST = process.env.RCC_HOST +var sanitize = require('mongo-sanitize'); +const games = require('./../../model/games.js') +const signatures = require("./../signatures.js") +const rcc = require('../../model/rcc2020.js') +const rcctalk = require('../../rcctalk2018') +const User = require('../../model/user.js') +const bodyParser = require('body-parser') +router.use(bodyParser.json()) + +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + +const _2020placelauncher = async(req,res,next) => { + var enabled = req.config + if (enabled.GamesEnabled === false){ + return res.json({status:"error",error:"Games are disabled bad boy"}) + } + if (req.headers?.['user-agent']?.includes("Android") === true || req.headers?.['user-agent']?.includes("iPhone") === true){ + console.log(req.headers) + console.log(req.userdocument.username) + } + + if (req.method === "POST"){ // mobile join-game + req.query.name = req.body.placeId + } + var joinJson = {"ClientPort":0,"MachineAddress":"localhost","ServerPort":25564,"PingUrl":"","PingInterval":120,"UserName":"default","SeleniumTestMode":false,"UserId":0,"SuperSafeChat":false,"CharacterAppearance":"http://shitncumblox.gq/game/charapp?name=default","ClientTicket":"","GameId":1,"PlaceId":1818,"MeasurementUrl":"","WaitingForCharacterGuid":"cad99b30-7983-434b-b24c-eac12595e5fd","BaseUrl":"http://www.mete0r.xyz/","ChatStyle":"ClassicAndBubble","VendorId":0,"ScreenShotInfo":"","VideoInfo":"GamesROBLOX, video, free game, online virtual world","CreatorId":0,"CreatorTypeEnum":"User","MembershipType":"None","AccountAge":365,"CookieStoreFirstTimePlayKey":"rbx_evt_ftp","CookieStoreFiveMinutePlayKey":"rbx_evt_fmp","CookieStoreEnabled":true,"IsRobloxPlace":false,"GenerateTeleportJoin":false,"IsUnknownOrUnder13":false,"SessionId":"c25fd620-bbaa-4fb2-b022-3f053cdd1abd|00000000-0000-0000-0000-000000000000|0|204.236.226.210|8|2016-08-17T01:05:05.7115837Z|0|null|null|null|null","DataCenterId":0,"UniverseId":0,"BrowserTrackerId":0,"UsePortraitMode":false,"FollowUserId":0,"CharacterAppearanceId":1} + if (!req.query.name && !req.query.placeId && !req.query.placeid){ + return res.json({status:"error",error:"no placeid bad"}) + } + if (req.userdocument.gamejoin2020){ + return res.json({"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2020&auth="+req.query.auth??req.cookies.jwt,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""}) + } + var sanitizedplaceid = sanitize(req.query.name??req.query.placeId??req.query.placeid) + const game = await games.findOne({idofgame: sanitizedplaceid}).lean() + if (!game){ + return res.json({status:"error",error:"that game doesn't exist!"}) + } + if (game.version != "2020"){ + return next() + } + let instance = await rcc.findOne({PlaceId: sanitizedplaceid}).lean() + if (instance && instance.Status === 2){ + + + // if an rcc instance already exists we don't need to create a new one so we will just drag them into the existing game + joinJson.UserName = req.userdocument.username + joinJson.UserId = req.userdocument.userid + joinJson.CharacterAppearance = "http://mete0r.xyz/v1.1/avatar-fetch?userId=" + req.userdocument.userid + joinJson.MachineAddress = RCC_HOST // need to put rcc host here lol + joinJson.ServerPort = instance.Port + joinJson.PlaceId = instance.PlaceId + joinJson.GameId = sanitizedplaceid + joinJson.CharacterAppearanceId = req.userdocument.userid + joinJson.MembershipType = req.userdocument.membership + joinJson.CreatorId = game.useridofowner + joinJson.SessionId = req.query.auth??req.cookies.jwt + + const timestamp = Date.now() + joinJson.ClientTicket = timestamp+";" // timestamp + //create signature 1 + const sign1 = crypto.createSign('SHA1'); + sign1.update(`${req.userdocument.userid}\n`/*userid*/+`${req.userdocument.username}\n`/*username*/+`${"0"}\n`/*userid 2 that 0k wants for some reason what a retard*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) + var signature1 = sign1.sign(key, "base64") + joinJson.ClientTicket += signature1 + ";" + //create signature 2 + const sign2 = crypto.createSign('SHA1'); + sign2.update(`${req.userdocument.userid}\n`/*userid*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) + var signature2 = sign2.sign(key, "base64") + joinJson.ClientTicket += signature2 + ";4" + + if (req.method === "POST" && req.body.isTeleport){ // mobile join-game + const mobileJoin = + { + "ClientPort": 0, + "MachineAddress": RCC_HOST, + "ServerPort": instance.Port, + "ServerConnections": [ + { + "Address": RCC_HOST, + "Port": instance.Port + } + ], + "DirectServerReturn": true, + "TokenGenAlgorithm": 0, + "PepperId": 0, + "TokenValue": "vg", + "PingUrl": "", + "PingInterval": 0, + "UserName": req.userdocument.username, + "SeleniumTestMode": false, + "UserId": req.userdocument.userid, + "RobloxLocale": "", + "GameLocale": "", + "SuperSafeChat": false, + "CharacterAppearance": "http://mete0r.xyz/v1.1/avatar-fetch?userId=" + req.userdocument.userid, + "ClientTicket": joinJson.ClientTicket, + "GameId": ""+sanitizedplaceid, + "PlaceId": sanitizedplaceid, + "BaseUrl": "http://www.mete0r.xyz/", + "ChatStyle": "ClassicAndBubble", + "CreatorId": game.useridofowner, + "CreatorTypeEnum": "User", + "MembershipType": req.userdocument.membership, + "AccountAge": 365, + "CookieStoreFirstTimePlayKey": "rbx_evt_ftp", + "CookieStoreFiveMinutePlayKey": "rbx_evt_fmp", + "CookieStoreEnabled": false, + "IsUnknownOrUnder13": false, + "GameChatType": "AllUsers", + "SessionId": req.query.auth??req.cookies.jwt, + "AnalyticsSessionId": "", + "DataCenterId": 0, + "UniverseId": sanitizedplaceid, + "FollowUserId": 0, + "characterAppearanceId": req.userdocument.userid, + "CountryCode": "US", + "AlternateName": "", + "RandomSeed1": "57575745353", + "ClientPublicKeyData": "" + } + + console.log(mobileJoin) + return res.json({ + "jobId": "Test", + "status": 2, + "joinScriptUrl": `http://mete0r.xyz/game/join.ashx?ver=2020&auth=${req.query.auth??req.cookies.jwt}`, + "authenticationUrl": "http://mete0r.xyz/Login/Negotiate.ashx", + "authenticationTicket": "SomeTicketThatDosentCrash", + "message": "", + "joinScript": mobileJoin + }) + + } + + req.userdocument.gamejoin2020 = JSON.stringify(joinJson) + req.userdocument.markModified('gamejoin2020') + await req.userdocument.save() + var joinScriptJson = {"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2020&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + + + return res.send(JSON.stringify(joinScriptJson)) + } + + if (instance && instance.Status === 1){ + var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2020&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + + if (req.method === "POST" && req.body.isTeleport){ // mobile join-game + return res.json({ + "jobId": "Test", + "status": 0, + "joinScriptUrl": "http://mete0r.xyz/game/join.ashx?ver=2020&auth="+req.query.auth??req.cookies.jwt, + "authenticationUrl": "http://mete0r.xyz/Login/Negotiate.ashx", + "authenticationTicket": "SomeTicketThatDosentCrash", + "message": "" + }) + + } + return res.send(JSON.stringify(joinScriptJson)) + } + + var port = 53640 + Math.floor(Math.random() * 100) + // launch job + rcctalk.OpenGame2020("game"+sanitizedplaceid,port,RCC_HOST,sanitizedplaceid,game.useridofowner) + //console.dir(response,{ depth: null }) + + await rcc.create({ + PlaceId: sanitizedplaceid, + Port: port, + Status: 1 // 1 means loading + }) + + //console.log(newrenderscript) + + var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?ver=2020&auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + + if (req.method === "POST" && req.body.isTeleport){ // mobile join-game + return res.json({ + "jobId": "Test", + "status": 0, + "joinScriptUrl": "http://mete0r.xyz/game/join.ashx?ver=2020&auth="+req.query.auth??req.cookies.jwt, + "authenticationUrl": "http://mete0r.xyz/Login/Negotiate.ashx", + "authenticationTicket": "SomeTicketThatDosentCrash", + "message": "" + }) + + } + + return res.send(JSON.stringify(joinScriptJson)) +} + +router.all(["/MTwentyTwenty.ashx","/2020/join","/join-game"],requireAuth,_2020placelauncher,async (req, res) => { + return res.json({status:"error",error:"Version different than client requested."}) +}) + +//rcctalk.CloseJob('game2') +module.exports = {router: router, _2020placelauncher:_2020placelauncher} \ No newline at end of file diff --git a/Back/routes/admin.js b/Back/routes/admin.js new file mode 100644 index 0000000..8c8c62a --- /dev/null +++ b/Back/routes/admin.js @@ -0,0 +1,188 @@ +const express = require("express") +const router = express.Router() +var path = require('path') +const { requireAuth } = require('./../middleware/authmiddleware') +var multer = require('multer'); +const bodyParser = require('body-parser') +router.use(bodyParser.json()) +const User = require('./../model/games.js') +const ActualUser = require('./../model/user.js') +const catalog = require('./../model/item.js') +const games = require('./../model/games.js') +const rcc = require('./../model/rcc.js') +var numbtest = /^\d+\.?\d*$/; +const rcctalk = require('./../rcctalk') +require('dotenv').config() +const RCCDIR = process.env.RCC_Content + +var thisistheplaceid = "1" +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + // Uploads is the Upload_folder_name + if (file.mimetype == "image/png"){ + cb(null, "./assets/gameassets") + }else{ + cb(null, "./assets/ugc") + } + + }, + filename: async function (req, file, cb) { + if (path.extname(file.originalname) === ".rbxl"){ + const placeid = await User.countDocuments(); + cb(null, file.fieldname + "-" + placeid +path.extname(file.originalname)) + }else if (file.mimetype == "image/png"){ + const placeid = await User.countDocuments(); + cb(null, file.fieldname + "-" + placeid +path.extname(file.originalname)) + + }else if (file.mimetype == "application/octet-stream"){ + const itemid = await catalog.countDocuments(); + cb(null, file.fieldname + "-" + itemid +path.extname(file.originalname)) + } + + } + }) + const upload = multer({storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname); + if(ext !== '.png' && ext !== '.png' && ext !== '.rbxl') { + return callback('Only pngs and rbxl are allowed') + } + callback(null, true) + }, + }) + + + const itemupload = multer({storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname); + if (req.userdocument.admin === "false"){ + return callback('LEAVE') + } + if(ext !== '.png' && ext !== '.png' && ext !== '.rbxm') { + return callback('Only pngs and rbxm are allowed') + } + callback(null, true) + }, + }) + +router.post("/uploaditem", requireAuth,itemupload.single("itemfile"),async (req, res) => { + if (req.userdocument.admin == false && req.userdocument?.ugcpermission == false) { + return res.redirect('/') + } + const xss = require('xss') + //console.log(req.body) + const {itemname, description, price,Type} = req.body + if (numbtest.test(price) == false){ + return res.json({status: 'error', error: 'Price can only be a number!'}) + } + + try{ + const itemid = await catalog.countDocuments(); + const response = await catalog.create({ + Name: xss(itemname), + Description: xss(description), + Price: price, + Type: Type, + Creator: req.userdocument.userid, + ItemId: itemid, + approved: true + }) + }catch(error){ + throw error + } + return res.json({status: "success", message: "Action completed."}) +}) + + +router.post("/moderateuser", requireAuth,async (req, res) => { + if (req.userdocument.admin == false) { + return res.redirect('/') + } + let {userid, reason, unbantime,Type} = req.body + + if (numbtest.test(userid) == false){ + return res.json({status: "error", error: "Userid can only be a number!"}) + } + + const lookupuser = await ActualUser.findOne({userid: userid}).lean() + + if (!lookupuser) { + return res.json({status: "error", error: "User not found"}) + } + if (Type === "Permanent Ban"){ + unbantime = "2100-01-01" + } + if (Type === "Warning"){ + unbantime = "2000-01-01" + } + //console.log(req.body) + //console.log(unbantime) + + // if all above checks have passed lets set their moderation status and also log this entry for later lookup + var datetime = new Date(); + ActualUser.updateOne({userid: userid}, { + $set: { + moderation: JSON.stringify({"status":Type,"Reason":reason,"ExpiresIn":unbantime, "BannedBy": req.userdocument.username}) + }, + $push: { + moderationhistory: {"status":Type,"Reason":reason, "BannedBy": req.userdocument.username, "Date": datetime.toISOString().slice(0,10)} + } + }, + function(err, doc) { + //console.log(err) + }) + + return res.json({status: "success", message: "Action completed."}) +}) + +router.post("/moderateuserlookup", requireAuth,async (req, res) => { + if (req.userdocument.admin == false) { + return res.redirect('/') + } + const {userid,username} = req.body + const whitelist = ["username","coins","userid","admin","moderation","colors","inventory","joindate","lastclaimofcurrency","membership","friendrequests","friends","badges","status","timesincelastrequest","avatartype","discordid","moderationhistory"] + if (numbtest.test(userid) == false && !username){ + return res.json({status: "error", error: "Userid can only be a number!"}) + } + + let lookupuser + + if (userid != ""){ + lookupuser = await ActualUser.findOne({userid: userid}).lean().select(whitelist) + }else if (username){ + lookupuser = await ActualUser.findOne({username: username}).lean().select(whitelist) + } + + if (!lookupuser) { + return res.json({status: "error", error: "User not found reenter"}) + } + return res.json({status: "success", data: lookupuser}) +}) + +router.post("/queue", requireAuth,async (req, res) => { + if (req.userdocument.admin == false) { + return res.redirect('/') + } + const resultsPerPage = 30 + let page = req.body.page ?? 0 + if (page != 0){ + page-=1 + } + let {sort} = req.body + let response + let responsecount + + if (sort != "All"){ + response = await catalog.find({Type: sort, approved: false, Type: {$ne: "Image"}, denied: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) + responsecount = await catalog.countDocuments({Type: sort, approved: false, Type: {$ne: "Image"}, denied: {$exists:false}}) + } + if (sort === "All"){ + response = await catalog.find({approved: false, Type: {$ne: "Image"}, denied: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) + responsecount = await catalog.countDocuments({approved: false, Type: {$ne: "Image"}, denied: {$exists:false}}) + } + + + return res.json({data: response, pages: Math.ceil(Math.max(responsecount/resultsPerPage, 1)), count: responsecount }) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/advertise.js b/Back/routes/api/advertise.js new file mode 100644 index 0000000..4ca7d4f --- /dev/null +++ b/Back/routes/api/advertise.js @@ -0,0 +1,101 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const bodyParser = require('body-parser') +const User = require('./../../model/user.js') +const catalog = require('./../../model/item.js') +const games = require('./../../model/games.js') +router.use(bodyParser.json()) + +router.post("/",requireAuth,async (req, res) => { + let {itemid, AdId, type} = req.body + if (typeof itemid == "undefined"){ + return res.json({status: "error", error: "ItemId not sent!"}) + } + if (typeof AdId == "undefined"){ + return res.json({status: "error", error: "Ad ID not sent!"}) + } + if (typeof type == "undefined"){ + return res.json({status: "error", error: "Type not sent!"}) + } + if (type != "game" && type != "item"){ + return res.json({status: "error", error: "Invalid Type!"}) + } + + if (req.userdocument.coins < 10){ + return res.json({status: "error", error: "You don't have enough Rocks!"}) + } + + const Addoc = await catalog.findOne({ItemId: AdId}) + + if (!Addoc || Addoc?.Type != "User Ad"){ + return res.json({status: "error", error: "Not found"}) + } + + if (Addoc.Creator != req.userdocument.userid){ + return res.json({status: "error", error: "Not Authorized"}) // tried to use someone elses ad + } + + if (Addoc.ActiveAd === true){ // ad is already running + return res.json({status: "error", error: "You are already running this ad!"}) + } + + if (Addoc.Hidden){ + return res.json({status: "error", error: "Ad is moderated!"}) + } + + if (Addoc.approved === false){ + return res.json({status: "error", error: "Ad is pending approval!"}) + } + + + let itemdoc + + if (type === "game"){ + itemdoc = await games.findOne({idofgame: itemid}).lean() + } + + if (!itemdoc){ + return res.json({status: "error", error: "Not found"}) + } + + if (type === "game"){ + + if (itemdoc.useridofowner != req.userdocument.userid){ // make sure we only let game owners advertise there game + return res.json({status: "error", error: "Not Authorized"}) + } + + } + + if (type === "item"){ + + if (itemdoc.Creator != req.userdocument.userid){ // make sure we only let item owners advertise there item + return res.json({status: "error", error: "Not Authorized"}) + } + + } + + req.userdocument.coins -= 10 + req.userdocument.markModified('coins') + await req.userdocument.save() + + Addoc.adtype = type + Addoc.adredirectid = itemid + Addoc.ActiveAd = true + Addoc.adstartedtime = Date.now() + + Addoc.markModified('adtype') + Addoc.markModified('adredirectid') + Addoc.markModified('ActiveAd') + Addoc.markModified('adstartedtime') + await Addoc.save() + + + + + + return res.json({status: "success", message: "Done!"}) + +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/auth.js b/Back/routes/api/auth.js new file mode 100644 index 0000000..7ef6037 --- /dev/null +++ b/Back/routes/api/auth.js @@ -0,0 +1,80 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const bodyParser = require('body-parser') +const User = require('./../../model/user.js') +router.use(bodyParser.json()) + +function selectKeys(obj, keysArray) { + let result = {}; + for (let i = 0; i < keysArray.length; i++) { + if (keysArray[i] in obj === true) { + result[keysArray[i]] = obj[keysArray[i]]; + } + } + return result; + } + +router.get("/",requireAuth,async (req, res) => { + const filtered = selectKeys(req.userdocument,["username","coins","userid","admin","ugcpermission","moderation","colors","inventory","joindate","lastclaimofcurrency","membership","friendrequests","friends","badges","status","timesincelastrequest","avatartype","discordid","bio","recentlyplayed","css"]) + //console.log(filtered.recentlyplayedgames) + filtered._2faenabled = false + if (req.userdocument?.twofasecrets){ + const json = JSON.parse(req.userdocument.twofasecrets) + if (json.verified === true){ + filtered._2faenabled = true + } + } + return res.json(filtered) + +}) + +router.post("/recentgames",requireAuth,async (req, res) => { + const response = await User.findOne({userid: req.userdocument.userid}).lean().populate({path: "recentlyplayedgames",select: ["useridofowner","nameofgame","numberofplayers","version","visits"] , populate: {path: "owner", select: ["username"]}}).select("recentlyplayed") + return res.json(response.recentlyplayedgames) +}) + +router.post("/requestfriends",requireAuth,async (req, res) => { + let response = await User.findOne({userid: req.userdocument.userid}).lean().populate({path: "friendsdata",select: ["username","status","timesincelastrequest"]}).select("friends") + let friendsdata = [] +if (response.friendsdata){ + response.friendsdata.forEach(function (item, index) { + let status = {status: "Offline"} + if (item.status){ + status = JSON.parse(item.status) + } + const actualTimeMilliseconds = new Date().getTime() + if (item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false || item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && !status){ + // been 3 minutes since last request mark as offline make sure we don't mark them offline while they are playing a game + status.status = "Offline" + item.status = JSON.stringify(status) + status = JSON.parse(item.status) + } + if (item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false || item.timesincelastrequest && actualTimeMilliseconds - item.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && !status){ + status.status = "Online" + item.status = JSON.stringify(status) + status = JSON.parse(item.status) + } + item.status = status + friendsdata.push(item) + }) +} + // playing is 1st online is second and offline is last :) + friendsdata.sort((a, b) => { + if (a.status.status.includes("Playing") === true && b.status.status !== 'Playing') { + return -1; // a should appear before b + } else if (a.status.status.includes("Playing") === false && b.status.status.includes("Playing") === true) { + return 1; // a should appear after b + } else if (a.status.status === 'Online' && b.status.status === 'Offline') { + return -1; // a should appear before b + } else if (a.status.status === 'Offline' && b.status.status === 'Online') { + return 1; // a should appear after b + } else { + return 0; // the order of a and b doesn't matter + } + }) + + return res.json(friendsdata) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/bank.js b/Back/routes/api/bank.js new file mode 100644 index 0000000..fd438e2 --- /dev/null +++ b/Back/routes/api/bank.js @@ -0,0 +1,80 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const bodyParser = require('body-parser') +var numbtest = /^\d+\.?\d*$/; +const bank = require('./../../model/bank.js') +const User = require('./../../model/user.js') +router.use(bodyParser.json()) +const speakeasy = require('speakeasy') + +async function Fill(){ +if (!await bank.findOne()) { + await bank.create({ + balance: 5000 + }) +} +} +Fill() + +router.get("/value",async (req, res) => { + const response = await bank.findOne() + return res.json({status: "success", balance: response.balance}) +}) + +router.post("/transaction/:id",async (req, res) => { + const {apiKey, amount} = req.body + if (!apiKey || !amount){ + return res.json({status: "error", error: "Missing parameters"}) + } + + if (apiKey !== "5#t#!aH52QAzY4@HF0C1k5quK&piuY9C"){ + return res.json({status: "error", error: "Missing parameters"}) + } + + if (isNaN(amount) === true){ + return res.json({status: "error", error: "Amount must be a number!"}) + } + + + const response = await bank.findOne() + + + if (amount > response.balance){ + return res.json({status: "error", error: "Not enough money"}) + } + + const user = await User.findOne({userid: req.params.id}) + + if (!user){ + return res.json({status: "error", error: "User not found"}) + } + + if (amount < 0){ // negative + + if (user.coins - Math.abs(amount) < 0){ // they will have negative coins + return res.json({status: "error", error: "User will have negative coins."}) + }else{ + user.coins += amount + user.markModified('coins') + await user.save() + } + } + + if (amount > 0){ + user.coins += amount + + user.markModified('coins') + + await user.save() + } + + response.balance += amount * -1 + response.markModified('balance') + await response.save() + + + return res.json({status: "success", balance: response.balance}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/bodycolorupdate.js b/Back/routes/api/bodycolorupdate.js new file mode 100644 index 0000000..b55ddf0 --- /dev/null +++ b/Back/routes/api/bodycolorupdate.js @@ -0,0 +1,51 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const User = require('./../../model/user.js') +const bodyParser = require('body-parser') +const validTypes = [ + 'all', + 'Head', + 'Torso', + 'Left Arm', + 'Right Arm', + 'Left Leg', + 'Right Leg' +] +router.use(bodyParser.json()) + +router.post("/",requireAuth,async (req, res) => { + const {Type,color} = req.body + if (typeof Type == "undefined"){ + return res.json("Send Type Please") + } + if (typeof color == "undefined"){ + return res.json("Send Color Please") + } + if (!isNaN(color) === false){ + return res.json("Color needs to be a number lol") + } + if (validTypes.includes(Type) === true){ + try{ + for (const obj of req.userdocument.colors) { + if (Type === "all"){ + obj.value = color + req.userdocument.markModified('colors') + await req.userdocument.save() + } + if (obj.name === Type){ + obj.value = color + req.userdocument.markModified('colors') + await req.userdocument.save() + } + } + }catch(err){ + console.log(err) + } + return res.json({status: 'success', message: "Color change successful"}) + } + // they tried to submit an invalid form + return res.json({status: "error", error: "Invalid Type"}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/changepassword.js b/Back/routes/api/changepassword.js new file mode 100644 index 0000000..dc6eb33 --- /dev/null +++ b/Back/routes/api/changepassword.js @@ -0,0 +1,37 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const User = require('./../../model/user.js') +const bodyParser = require('body-parser') +const bcrypt = require('bcrypt') +router.use(bodyParser.json()) + +router.post("/",requireAuth,async (req, res) => { + const {oldpassword,newpassword} = req.body + if (!oldpassword || typeof oldpassword !== 'string') { + return res.json({status: 'error', error: 'Old password needs to be sent and it needs to be a string'}) + } + if (!newpassword || typeof newpassword !== 'string') { + return res.json({status: 'error', error: 'New password needs to be sent and it needs to be a string'}) + } + + if(newpassword.length < 4) { + return res.json({status: 'error', error: 'Password needs to be at least 5 characters'}) + } + if(await bcrypt.compare(oldpassword, req.userdocument.password)) { + // password matches + const newhashedpassword = (await bcrypt.hash(newpassword, 10)) + try{ + req.userdocument.password = newhashedpassword + req.userdocument.markModified('password') + await req.userdocument.save() + + }catch{ + + } + return res.json({status: 'success', message: 'Changed Password!'}) + } + res.json({status: 'error', error: 'Invalid old password'}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/comment.js b/Back/routes/api/comment.js new file mode 100644 index 0000000..1aabdf6 --- /dev/null +++ b/Back/routes/api/comment.js @@ -0,0 +1,103 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const games = require('./../../model/games.js') +const catalog = require('./../../model/item.js') +const comments = require('./../../model/comment.js') +const bodyParser = require('body-parser') +router.use(bodyParser.json()) +const rateLimit = require('express-rate-limit') +const limiter = rateLimit({ + windowMs: 10 * 1000, // 10 seconds + max: 1, // Limit each IP to 1 requests per `window` + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: false, // Disable the `X-RateLimit-*` headers + handler: (request, response, next, options) =>{ + return response.json({status: 'error', error: 'Too many requests try again later.'}) + } +}) + +router.post("/post", requireAuth,limiter,async (req, res) => { + let {comment, AssociatedAssetType, AssociatedAssetId} = req.body + + AssociatedAssetId = parseInt(AssociatedAssetId) + if (!comment || typeof AssociatedAssetType !== "string"){ + return res.json("Send comment and associated asset id please") + } + if (comment.length > 200){ + return res.json({status: 'error', error: "Comment too long!"}) + } + + if (AssociatedAssetType !== "game" && AssociatedAssetType !== "item"){ + return res.json({status: 'error', error: "Invalid asset type!"}) + } + + if (AssociatedAssetType === "game"){ + const game = await games.findOne({idofgame: AssociatedAssetId}).lean() + if (!game){ + return res.json({status: 'error', error: "Game not found!"}) + } + } + + if (AssociatedAssetType === "item"){ + const item = await catalog.findOne({ItemId: AssociatedAssetId}).lean() + if (!item){ + return res.json({status: 'error', error: "Game not found!"}) + } + } + + await comments.create({ + associatedassetid: AssociatedAssetId, + associatedassettype: AssociatedAssetType, + posterid: req.userdocument.userid, + content: comment, + date: new Date().getTime(), + moderated: false + }) + + return res.json({status: 'success', message: "Comment posted!"}) + +}) + + +router.post("/get", requireAuth,async (req, res) => { + let {AssociatedAssetType, AssociatedAssetId} = req.body + AssociatedAssetId = parseInt(AssociatedAssetId) + const resultsPerPage = 20 + let cursor = req.body.page >= 0 ? req.body.page : 0 + if (cursor != 0){ + cursor-=1 + } + + if (!AssociatedAssetType || typeof AssociatedAssetId === undefined){ + return res.json({status: 'error', error: "Send comment and associated asset id please"}) + } + + if (AssociatedAssetType !== "game" && AssociatedAssetType !== "item"){ + return res.json({status: 'error', error: "Invalid asset type!"}) + } + + let commentsarray + let commentscount + + if (AssociatedAssetType === "game"){ + const game = await games.findOne({idofgame: AssociatedAssetId}).lean() + if (!game){ + return res.json({status: 'error', error: "Game not found!"}) + } + } + + if (AssociatedAssetType === "item"){ + const item = await catalog.findOne({ItemId: AssociatedAssetId}).lean() + if (!item){ + return res.json({status: 'error', error: "Game not found!"}) + } + } + + commentsarray = await comments.find({associatedassetid: AssociatedAssetId, associatedassettype: AssociatedAssetType}).lean().sort({date: 'descending'}).populate({path: "poster",select: ["username"]}).select(["posterid", "content", "date", "poster"]).skip(0+parseFloat(cursor)*resultsPerPage).limit(resultsPerPage) + commentscount = await comments.countDocuments({associatedassetid: AssociatedAssetId, associatedassettype: AssociatedAssetType}) + + return res.json({status: 'success', data: commentsarray, pages: Math.ceil(Math.max(commentscount/resultsPerPage, 1))}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/feed.js b/Back/routes/api/feed.js new file mode 100644 index 0000000..36dc460 --- /dev/null +++ b/Back/routes/api/feed.js @@ -0,0 +1,55 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const User = require('./../../model/user.js') +const bodyParser = require('body-parser') + +router.use(bodyParser.json()) + +router.post("/share",requireAuth,async (req, res) => { + let { sharevalue } = req.body + if (!sharevalue || typeof sharevalue !== 'string'){ + return res.json({status: "error", error: "Share value not sent!"}) + } + if (sharevalue.length > 100){ + return res.json({status: "error", error: "Share value too long!"}) + } + const date = new Date().getTime() + if (date - req.userdocument?.lastfeedsharetime < 3600000){ + return res.json({status: "error", error: "You can only share once an hour!"}) + } + + let posterid = req.userdocument.userid + User.updateOne({userid: req.userdocument.userid}, { + $push: { + feed: {posterid, content: sharevalue, date, moderated: false} + }, + $set: { + lastfeedsharetime: date + } + }, + function(err, doc) { + }) + res.json({status: "success", message: "Done!"}) // the next operation could take some time and we wouldn't want the client to cancel during that!! + + if (req.userdocument.friends){ + //console.log(req.userdocument.friends) + for (let item of req.userdocument.friends) { + User.updateOne({userid: item.userid}, { + $push: { + feed: {posterid, content: sharevalue, date, moderated: false} + } + }, + function(err, doc) { + }) + } + } + +}) + +router.post("/fetch",requireAuth,async (req, res) => { + let feed = await User.findOne({userid: req.userdocument.userid}).lean().populate({path: "feed.userdata",select: ["username"]}).select('feed') + return res.json({status: "success", data: feed.feed}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/friends.js b/Back/routes/api/friends.js new file mode 100644 index 0000000..e0aca09 --- /dev/null +++ b/Back/routes/api/friends.js @@ -0,0 +1,188 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const games = require('./../../model/games.js') +const User = require('./../../model/user.js') +const bodyParser = require('body-parser') +router.use(bodyParser.json()) + +router.post("/request-friendship", requireAuth,async (req, res) => { + const tofriend = req.body.recipientUserId + + if (!tofriend){ + return res.json({status:"error",error:"Recipent not sent!"}) + } + + const usertofriend = await User.findOne({userid: tofriend}).lean() + if (!usertofriend){ + return res.json({status:"error",error:"Can't find Recipent!"}) + } + + + if (usertofriend.friends){ + const friends = usertofriend.friends.some(word => word.userid == req.userdocument.userid) + if (friends === true){ + + return res.json({status:"error",error:"You are already friends!"}) + } + // already friends + } + if (req.userdocument.friendrequests){ + // check if the other user is already requesting to friend the player so then they both want to be firends so we can interperept this as an accept request + + const bothwantobefriends = req.userdocument.friendrequests.some(word => word.userid == usertofriend.userid) + if (bothwantobefriends === true){ + console.log(tofriend) + User.updateOne({userid: req.userdocument.userid}, { + $push: { + friends: {userid: usertofriend.userid, username: usertofriend.username} + }, + $pull: { + friendrequests: {userid: usertofriend.userid, username: usertofriend.username} + } + }, + function(err, doc) { + + }) + + User.updateOne({userid: tofriend}, { + $push: { + friends: {userid: req.userdocument.userid, username: req.userdocument.username} + }, + $pull: { + friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} + } + }, + function(err, doc) { + + }) + + return res.json({status:"success",message:"You are now friends :D"}) + } + + } + if (usertofriend.friendrequests){ + const alreadyrequested = usertofriend.friendrequests.some(word => word.userid == req.userdocument.userid) + + // already friend requested + if (alreadyrequested === true){ + + return res.json({status:"error",error:"You already sent this request!"}) + } + } + User.updateOne({userid: usertofriend.userid}, { + $push: { + friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} + } + }, + function(err, doc) { + + }) + + return res.json({status:"success",message:"Friend request sent!"}) + + + +}) + +router.post("/decline-friend-request",requireAuth,async (req, res) => { + const tounfriend = req.body.recipientUserId + //console.log(tounfriend+" nerd") + if (!tounfriend){ + return res.json({status:"error",error:"Recipent not sent!"}) + } + const usertofriend = await User.findOne({userid: tounfriend}).lean() + if (!usertofriend){ + return res.json({status:"error",error:"Can't find Recipent!"}) + } + + const alreadyfriends = req.userdocument?.friends?.some(word => word.userid == tounfriend ) + if (alreadyfriends === true){ + // already friends with the person so they want ro remove their friend + User.updateOne({userid: tounfriend}, { + $pull: { + friends: {userid: req.userdocument.userid, username: req.userdocument.username} + } + }, + function(err, doc) { + //console.log(err) + }) + User.updateOne({userid: req.userdocument.userid}, { + $pull: { + friends: {userid:usertofriend.userid, username: usertofriend.username} + } + }, + function(err, doc) { + //console.log(err) + }) + return res.json({status:"error",error:"Unfriended friend!"}) + } + + + + //otherwise the user isn't friends but still declines the friend request + + User.updateOne({userid: tounfriend}, { + $pull: { + friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} + } + }, + function(err, doc) { + //console.log(err) + }) + User.updateOne({userid: req.userdocument.userid}, { + $pull: { + friendrequests: {userid: usertofriend.userid, username: usertofriend.username} + } + }, + function(err, doc) { + //console.log(err) + }) + + return res.json({status:"success",message:"Declined friend request!"}) + + + +}) + +router.post("/has-sent-request",requireAuth,async (req, res) => { + const tofriend = req.body.recipientUserId + + if (!tofriend){ + return res.json({status:"error",error:"Recipent not sent!"}) + } + + const usertofriend = await User.findOne({userid: tofriend}).lean() + if (!usertofriend){ + return res.json({status:"error",error:"Can't find Recipent!"}) + } + + const friends = usertofriend?.friends?.some(word => word.userid == req.userdocument.userid) + if (friends === true){ + + return res.json({status:"error",error:"You are already friends!"}) + } + // already friends + + const alreadyrequested = usertofriend?.friendrequests?.some(word => word.userid == req.userdocument.userid) + + // already friend requested + if (alreadyrequested === true){ + + return res.json({status:"success",message:true}) + } + + const bothwantobefriends = req.userdocument?.friendrequests?.some(word => word.userid == usertofriend.userid) + if (bothwantobefriends === true){ + return res.json({status:"success",message:"Other user wants to be friends."}) + } + + return res.json({status:"success",message:false}) +}) + + +router.post('/friend-requests',requireAuth, async (req, res) => { + res.json({data: req.userdocument?.friendrequests}) +}); + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/generatekey.js b/Back/routes/api/generatekey.js new file mode 100644 index 0000000..26c4b28 --- /dev/null +++ b/Back/routes/api/generatekey.js @@ -0,0 +1,49 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const bodyParser = require('body-parser') +const keys = require('./../../model/keys.js') +router.use(bodyParser.json()) + +// hay this code hasn't been updated so it contains very old code because I haven't bothered to add key support since the last time they existed 2 months ago? + +function stringGen(len) { + var text = ""; + + var charset = "abcdefghijklmnopqrstuvwxyz0123456789"; + + for (var i = 0; i < len; i++) + text += charset.charAt(Math.floor(Math.random() * charset.length)); + + return text; + } + +router.post("/",requireAuth,async (req, res) => { + if (req.userdocument.admin === true){ + var key = stringGen(10) + const response = await keys.create({ + Creator: req.userdocument.username, + Key: key, + Used: false + }) + return res.redirect(req.get('referer')); + } + if (req.userdocument.coins >= 100){ + // they have enough + req.userdocument.coins -= 100 + req.userdocument.markModified('coins') + await req.userdocument.save() + var key = stringGen(10) + const response = await keys.create({ + Creator: req.userdocument.username, + Key: key, + Used: false +}) +return res.redirect(req.get('referer')); + + } + + return res.redirect(req.get('referer')); +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/groups.js b/Back/routes/api/groups.js new file mode 100644 index 0000000..815e811 --- /dev/null +++ b/Back/routes/api/groups.js @@ -0,0 +1,182 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const bodyParser = require('body-parser') +const groups = require('./../../model/groups.js') +var multer = require('multer'); +const fs = require('fs'); +const path = require('path') +router.use(bodyParser.json()) + +router.post("/", requireAuth,async (req, res) => { + let mygroups = await groups.find({"members.userId": req.userdocument.userid}).lean().select(["Name","Description","Public","groupid","ownerid","memberscount"]) + return res.json(mygroups) +}) + +router.post("/:id", requireAuth,async (req, res) => { + const groupid = parseInt(req.params.id) + if (isNaN(groupid)){ + return res.json({status: "error", error: "Not found"}) + } + + let groupresponse = await groups.findOne({groupid}).lean().select(["Name","Description","Public","groupid","ownerid","memberscount","currentshout"]).populate({path: "owner",select: ["username", "userid"]}) + + if (!groupresponse){ + return res.json({status: "error", error: "Not found"}) + } + + return res.json({status: "success", data: groupresponse}) +}) + +router.post("/:id/members", requireAuth,async (req, res) => { + const groupid = parseInt(req.params.id) + const {rank} = req.body + if (!rank){ + return res.json({status: "error", error: "Rank not sent"}) + } + + const resultsPerPage = 5 + let page = req.body.page ?? 0 + if (page != 0){ + page-=1 + } + let skip = 0+parseFloat(page)*resultsPerPage + + if (isNaN(groupid)){ + return res.json({status: "error", error: "Not found"}) + } + + let groupresponse = await groups.findOne({groupid}).lean().select({"members": { "$slice" : [ skip, resultsPerPage ] }}).populate({path: "memberspoly",select: ["username", "userid"]}) + + if (!groupresponse){ + return res.json({status: "error", error: "Not found"}) + } + + return res.json({status: "success", data: groupresponse.memberspoly}) +}) + +async function validateImage(groupid,res){ + return new Promise(async (resolve) => { + + try { + const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/groupicons/icon-${groupid}.png`), null) + pngValidator(myArrayBuffer); + // success + } catch { + // file is invalid or corrupt + fs.unlink(path.resolve(`assets/groupicons/icon-${groupid}.png`), (err => { + if (err) console.log(err) + })); + + return res.json({status: 'error', error: 'Image is invalid.'}) + } + + resolve() + + }) +} + +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + // Uploads is the Upload_folder_name + cb(null, "./assets/groupicons") + + }, + filename: async function (req, file, cb) { + const groupid = await groups.countDocuments(); + cb(null, "icon-" + groupid + ".png") + + + } + }) + const uploadicon = multer({storage: storage, + fileFilter: function (req, file, callback) { + if(file.mimetype != 'image/png') { + return callback('Invalid file type') + } + callback(null, true) + }, + limits: { fileSize: 1024 * 1024 } // 1mb + }) + +router.post("/create", requireAuth,async (req, res) => { + if (req.userdocument.coins < 100){ + return res.json({status: "error", error: "You don't have enough Rocks!"}) + } + uploadicon.single("groupicon")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large"){ + return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"}) + } + if (err === "Invalid file type"){ + return res.status(400).send({status: 'error', error: "Invalid file type"}) + } + return res.status(400).send({status: 'error', error: err.message}) + } + + + var xss = require("xss") + const {groupname, description,publicgroup} = req.body + + if (!groupname){ + return res.json({status: 'error', error: 'Group name needs to be sent.'}) + } + if (!description){ + return res.json({status: 'error', error: 'Description needs to be sent.'}) + } + if (!publicgroup){ + return res.json({status: 'error', error: 'Public group needs to be sent.'}) + } + if (publicgroup != "true" && type != "false"){ + return res.json({status: 'error', error: 'Public group needs to be a true or false value.'}) + } + + const groupid = await groups.countDocuments(); + // check if the file they just uploaded is valid + await validateImage(groupid,res) + let IconApproved = req.userdocument.admin === false ? false : true + + await groups.create({ + Name: xss(groupname), + Description: xss(description), + Public: publicgroup, + IconApproved, + groupid, + ownerid: req.userdocument.userid, + memberscount: 1, + members: [{userId: req.userdocument.userid, rank: 3}], + Roles: [{RoleName: "Members", Permissions: {Shout: false, Kick: false, ChangeRoles: false, ModerateWall: false, ManageAllies: false}, Rank: 1}, {RoleName: "Admin", Permissions: {Shout: true, Kick: true, ChangeRoles: true, ModerateWall: true, ManageAllies: false}, Rank: 2}, {RoleName: "Owner", Permissions: {All: true}, Rank: 3}] + }) + + return res.json({status: "success", message: "Group created!"}) + + +}) +}) + +router.post("/editgroup", requireAuth,async (req, res) => { + + +}) + +router.post("/postshout", requireAuth,async (req, res) => { + + +}) + +router.post("/joingroup", requireAuth,async (req, res) => { + + +}) + +router.post("/leavegroup", requireAuth,async (req, res) => { + + +}) + +router.post("/exile", requireAuth,async (req, res) => { + + +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/itemaction.js b/Back/routes/api/itemaction.js new file mode 100644 index 0000000..0225fd8 --- /dev/null +++ b/Back/routes/api/itemaction.js @@ -0,0 +1,82 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const User = require('./../../model/user.js') +const bodyParser = require('body-parser') +router.use(bodyParser.json()) + +router.post("/", requireAuth,async (req, res) => { + const {action,itemid} = req.body + if (typeof action == "undefined"){ + return res.json("Send Action Please") + } + if (typeof itemid == "undefined"){ + return res.json("Send Itemid Please") + } + if (action === "wear"){ + + + for (const obj of req.userdocument.inventory) { + if (parseInt(obj.ItemId) === itemid){ + // they own it + // lets check if they already have it equipped + + + + if (obj.Equipped === true){ + return res.json({status: 'error', error: "You already have this Equipped!"}) + } + // they own it and don't have it equipped already so lets add it + try{ + obj.Equipped = true + req.userdocument.markModified('inventory') + await req.userdocument.save() + }catch(err){ + console.log(err) + } + return res.json({status: 'ok', error: "Equipped!"}) + + + } + + + + } + // they don't own it + return res.json({status: 'error', error: "You don't own this!"}) + } + + + + if (action === "remove"){ + for (const obj of req.userdocument.inventory) { + if (parseInt(obj.ItemId) === itemid){ + // they own it + // lets check if they don't already don't it equipped + + if (obj.Equipped === false){ + return res.json({status: 'error', error: "You already don't this Equipped!"}) + } + // they own it and don't have it not equipped already lets remove it + try{ + obj.Equipped = false + req.userdocument.markModified('inventory') + await req.userdocument.save() + }catch(err){ + console.log(err) + } +return res.json({status: 'ok', error: "Equipped!"}) + + + + } + + + + } + // they don't own it + return res.json({status: 'error', error: "You don't own this!"}) + } +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/moderate.js b/Back/routes/api/moderate.js new file mode 100644 index 0000000..a126110 --- /dev/null +++ b/Back/routes/api/moderate.js @@ -0,0 +1,91 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const items = require('./../../model/item.js') +const bodyParser = require('body-parser') +const fs = require('fs') +const path = require("path"); +router.use(bodyParser.json()) + +router.post("/", requireAuth,async (req, res) => { + let {itemid} = req.body + if (typeof itemid == "undefined"){ + return res.json({status: 'error', error: "itemid not sent!"}) + } + itemid = parseInt(itemid) + if (req.userdocument.admin == false && req.userdocument?.ugcpermission == false) { + return res.redirect('/') + } + const item = await items.findOne({ItemId: itemid}) + + if (item.Creator != req.userdocument.userid && req.userdocument.admin === false){ // basically we want ugc uploaders to be able to delete there own items but not other peoples items + return res.json({status: 'error', error: "You don't own this item!"}) + } + try{ + items.updateOne({ItemId: itemid}, { + $set: { + Hidden: true + } + }, + function(err, doc) { + //console.log(err) + }) + // delete the item from our servers + fs.unlink(path.resolve(path.resolve(__dirname, "../../assets/ugc/itemfile-"+itemid+".rbxm")), (err => { + if (err) console.log(err) + })); + }catch(err){ + console.log(err) + } + + return res.json({status: 'success'}) + +}) + +router.post("/queue", requireAuth,async (req, res) => { + const {action,itemid} = req.body + if (typeof action == "undefined"){ + return res.json("Send Action Please") + } + if (typeof itemid == "undefined"){ + return res.json("Send Itemid Please") + } + if (req.userdocument.admin == false) { + return res.redirect('/') + } + const item = await items.findOne({ItemId: itemid}) + + if (!item){ + return res.json({status: "error", error: "Send Itemid Please"}) + } + + console.log(action) + + if (action === "deny"){ + item.Hidden = true + item.denied = true + item.markModified("Hidden") + item.markModified("denied") + await item.save() + fs.unlink(path.resolve(path.resolve(__dirname, "../../assets/ugc/itemfile-"+itemid+".rbxm")), (err => { + if (err) console.log(err) + })); + } + if (action === "approve"){ + item.approved = true + item.markModified("approved") + await item.save() + if (item.Type === "Shirts" || item.Type === "Pants"){ + // we also have to approve the associated image + const image = await items.findOne({ItemId: parseInt(itemid)-1}) + image.approved = true + image.markModified("approved") + await image.save() + } + + } + // finish this LMAO pretty ez tho + return res.json({status: "success", message: "Done!"}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/purchase.js b/Back/routes/api/purchase.js new file mode 100644 index 0000000..f463e13 --- /dev/null +++ b/Back/routes/api/purchase.js @@ -0,0 +1,83 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const bodyParser = require('body-parser') +var numbtest = /^\d+\.?\d*$/; +const items = require('./../../model/item.js') +const User = require('./../../model/user.js') +router.use(bodyParser.json()) + +router.post("/", requireAuth,async (req, res) => { + if (!req.userdocument.discordid) { + return res.json({status: "error", error: "Discord link required for purchasing. Link your discord in the settings panel."}) + } + const {itemid} = req.body + if (typeof itemid == "undefined"){ + return res.json({status: "error", error: "You need sum itemids bozo"}) + } + if (numbtest.test(itemid) == false){ + return res.json({status: "error", error: "You need sum itemids bozo"}) + } + + + const itemdoc = await items.findOne({ItemId: itemid})//.lean() + if (typeof req.userdocument.inventory !== "undefined"){ + // check if user already owns item + for (var v of req.userdocument.inventory){ + if (v.ItemId === itemdoc.ItemId){ + // they already own it + return res.json({status: 'error', error: "You already own this!"}) + } + } + } + if (itemdoc.Type === "Mesh" || itemdoc.Type === "Audio" || itemdoc.Type === "Mesh"){ + return res.json({status: 'error', error: "You can't buy assets."}) + } + + if (itemdoc.Hidden){ + return res.json({status: 'error', error: "You can't buy this."}) + } + + + if (req.userdocument.coins >= itemdoc.Price){ + // has enough money to purcahse item + try{ + User.updateOne({userid: req.userdocument.userid}, { + $set: { + coins: req.userdocument.coins - itemdoc.Price + }, + $push: { + inventory: {Type: itemdoc.Type,ItemId: itemdoc.ItemId, ItemName: itemdoc.Name, Equipped: false} + } + }, + function(err, doc) { + //console.log(err) + }) + // give owner cash + User.updateOne({userid: itemdoc.Creator}, { + $inc: { + coins: itemdoc.Price + } + }, + function(err, doc) { + //console.log(err) + }) + + itemdoc.Sales += 1 + if (!itemdoc.Sales){ + itemdoc.Sales = 1 + } + //console.log(itemdoc.Sales) + itemdoc.markModified('Sales') + await itemdoc.save() + }catch{ + + } + return res.json({status: 'success', message: 'Purchase successful'}) + } + // too poor + return res.json({status: 'error', error: "You don't have enough rocks"}) + +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/renderthumbnail.js b/Back/routes/api/renderthumbnail.js new file mode 100644 index 0000000..5442061 --- /dev/null +++ b/Back/routes/api/renderthumbnail.js @@ -0,0 +1,249 @@ +const express = require("express") +const router = express.Router() +const rcctalk = require('./../../thumbnailrcctalk') +const rcctalk2018 = require('./../../rcctalk2018') +const fs = require('fs') +const assetrenderscript = fs.readFileSync('assetthumbnailrenderer.lua','utf-8') +var path = require("path"); +const User = require('./../../model/user.js') +const item = require('./../../model/item.js') +var rgx = /^[0-9]*\.?[0-9]*$/; +router.use(express.json({limit: '200mb'})); +const { requireAuth } = require('./../../middleware/authmiddleware.js') +const { grabAuth } = require('./../../middleware/grabauth.js') +const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); +require('dotenv').config() +const RCC_HOST = process.env.RCC_HOST +const rateLimit = require('express-rate-limit') +const limiter = rateLimit({ + windowMs: 2 * 1000, // 5 seconds + max: 1, // Limit each IP to 1 requests per `window` + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: false, // Disable the `X-RateLimit-*` headers + handler: (request, response, next, options) =>{ + return response.sendFile(path.resolve("./assets/default.png")) + } +}) + +router.get("/",grabAuth,async (req, res) => { + if (!req.query.id && !req.query.userId) { + return res.status(400) + } + let headshot = false + if (req.query.type === "headshot"){ + headshot = true + } + let id = req.query.id??req.query.userId + + var sanitizedid = id.match(rgx) + + const user = await User.findOne({userid: sanitizedid}).lean() + if (!user) { + return res.json({status: 'error', error: 'User does not exist'}) + } + + +// lets get our file path with sanitized id + let path2=path.resolve(__dirname, "../../assets/userthumbnails/"+sanitizedid+".png") + if (headshot === true){ + path2=path.resolve(__dirname, "../../assets/userthumbnailsheadshots/"+sanitizedid+".png") + } + + fs.access(path2, fs.F_OK,async (err) => { + if (err) { + + + let newrender = await rcctalk2018.OpenRender(sanitizedid,headshot) + if (newrender.error){ + return res.sendFile(path.resolve("./assets/default.png")) + } + newrender = newrender['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobResponse']['ns1:OpenJobResult'][0]['ns1:value']._text + + res.writeHead(200, {'Content-Type': 'image/png'}) + + fs.writeFile(path2,newrender,'base64',function(err){ + if (err) { + console.log("error") + } + + }) + return res.end(Buffer.from(newrender, 'base64')) + + // if this timeouts and rcc doesn't return the image feor some reason then send the default fallback + //return res.sendFile(path.resolve("./assets/default.png")) + } + + //file exists + if (req.query.method && req.userdocument && req.userdocument.userid == sanitizedid){ // don't allow unauthenticated users to regenerate avatars and don't allow authenticated users to regenerate other peoples avatars + if (req.query.method === "regenerate"){ + fs.unlink(path2,async function (err) { + if (err){ + console.log(err) + } + + + let newrender = await rcctalk2018.OpenRender(sanitizedid,headshot) + if (newrender.error){ + return res.sendFile(path.resolve("./assets/default.png")) + } + newrender = newrender['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobResponse']['ns1:OpenJobResult'][0]['ns1:value']._text + + res.writeHead(200, {'Content-Type': 'image/png'}) + + fs.writeFile(path2,newrender,'base64',function(err){ + if (err) { + console.log("error") + } + + }) + return res.end(Buffer.from(newrender, 'base64')) + + + + }); + } + }else{ + res.sendFile(path.resolve(path2)) + return + } + + + }) + +}) + +router.post("/rcc", (req, res) => { + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { + const {player, thumbnail} = req.body + let path2=path.resolve(__dirname, "../../assets/userthumbnails/"+player+".png") + fs.writeFile(path2,thumbnail,'base64',function(err){ + if (err) { + console.log("error") + // if writing fails we can still fallback + return res.sendFile(path.resolve("./../../assets/default.png")) + } + // if it succeeds then we can send the userthumbnail + // close the job after + rcctalk.CloseJob("Thumbnailfor"+player) + }) + } +}) + + + + +router.get(["/asset","/asset.ashx"],grabAuth,async (req, res) => { + if (!req.query.id && !req.query.assetid) { + return res.status(400) + } + let id = req.query.id??req.query.assetid + + var sanitizedid = id.match(rgx) + + const user = await item.findOne({ItemId: sanitizedid}).lean() + if (!user) { + return res.json({status: 'error', error: 'Item does not exist'}) + } + if (user.Type === "Audio"){ + return res.sendFile(path.resolve("./assets/images/audio.png")) + } + if (user.Hidden === true){ + // if item isn't supposed to have a thumbnail + return res.sendFile(path.resolve("./assets/moderated.png")) + } + if (user.approved === false && !req.query.nonapproved){ + return res.sendFile(path.resolve("./assets/approval.png")) + } + if (req.query.nonapproved && req?.userdocument?.admin === false){ // we only want admins to be able to see non approved assets anyways + return res.sendFile(path.resolve("./assets/approval.png")) + } + if (req.query.nonapproved && (user.Type === "Pants" || user.Type === "Shirts")){ + sanitizedid -= 1 + return res.sendFile(path.resolve(__dirname, "../../assets/ugc/itemfile-"+sanitizedid+".rbxm")) + } + if (req.query.nonapproved && user.Type === "Video"){ + return res.sendFile(path.resolve(__dirname, "../../assets/ugc/itemfile-"+sanitizedid+".rbxm")) + } + if (user.Type === "Video"){ + return res.sendFile(path.resolve("./assets/video.png")) + } + if (user.Type === "User Ad" || user.Type === "Gamepass"){ + try{ + await fs.promises.access(path.resolve(__dirname, "../../assets/ugc/itemfile-"+sanitizedid+".rbxm"), fs.constants.W_OK) + return res.sendFile(path.resolve(__dirname, "../../assets/ugc/itemfile-"+sanitizedid+".rbxm")) + }catch{ + return res.sendFile(path.resolve("./assets/images/defaultadsky.png")) + } + + } + + +// lets get our file path with sanitized id + let path2=path.resolve(__dirname, "../../assets/ugc/asset-"+sanitizedid+".png") + + fs.access(path2, fs.F_OK,async (err) => { + if (err) { + + + // get our renderscript with the new character app + var newrenderscript = assetrenderscript.replace('local asset = 0','local asset = "'+sanitizedid+'"') + //open a new job for our thumbnail render request + var response = await rcctalk.OpenJob("Thumbnailfor"+sanitizedid,newrenderscript,"120") + if (response['SOAP-ENV:Envelope']['SOAP-ENV:Body']['SOAP-ENV:Fault']){ + // if failed then print out error close job then send a fallback image + //console.dir(response,{ depth: null }) + rcctalk.CloseJob("Thumbnailfor"+sanitizedid) + return res.sendFile(path.resolve("./assets/default.png")) + }else{ + // send image to user + // wait for image to be uploaded by rcc + function check() { + setTimeout(() => { + fs.access(path2, fs.constants.F_OK, error => { + if (error) { + check() + } else { + return res.sendFile(path2) + } + }); + },3000) + } + } + check() + + // if this timeouts and rcc doesn't return the image feor some reason then send the default fallback + return res.sendFile(path.resolve("./assets/default.png")) + } + + res.sendFile(path.resolve(path2)) + return + + + + }) + +}) + + + +router.post("/rccasset", (req, res) => { + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { + const {asset, thumbnail} = req.body + console.log(asset) + let path2=path.resolve(__dirname, "../../assets/ugc/asset-"+asset+".png") + fs.writeFile(path2,thumbnail,'base64',function(err){ + if (err) { + console.log("error") + // if writing fails we can still fallback + return res.sendFile(path.resolve("./../../assets/default.png")) + } + // if it succeeds then we can send the userthumbnail + // close the job after + rcctalk.CloseJob("Thumbnailforasset"+asset) + }) + } +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/requestad.js b/Back/routes/api/requestad.js new file mode 100644 index 0000000..ddbfc1c --- /dev/null +++ b/Back/routes/api/requestad.js @@ -0,0 +1,40 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const bodyParser = require('body-parser') +const catalog = require('./../../model/item.js') +//const path = require('path'); +router.use(bodyParser.json()) +// only supports skyscraper ads for now + +router.get("/",async (req, res) => { + + const activeAdCount = await catalog.countDocuments({ActiveAd: true}) + + //console.log(activeAdCount) + + let random = Math.floor(Math.random() * activeAdCount) + + const Addoc = await catalog.findOne({ActiveAd: true}).skip(random) + if (!Addoc){ + // no ads are running! + return res.json({imageUrl: "/assets/images/defaultadsky.png", redirectUrl: "#", AdID: 0}) + } + + if (Addoc.adstartedtime <= new Date(new Date().getTime() - (24 * 60 * 60 * 1000)).getTime() || Addoc.Hidden){ + // more than 24 hours old invalidate ad OR ad was moderated + Addoc.ActiveAd = false + Addoc.markModified('ActiveAd') + await Addoc.save() + } + let redirectUrl + + if (Addoc.adtype === "game"){ + redirectUrl = "/games/"+Addoc.adredirectid + } + + return res.json({imageUrl: "/api/thumbnailrender/asset?id="+Addoc.ItemId, redirectUrl, AdID: Addoc.ItemId}) + +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/updategameinfo.js b/Back/routes/api/updategameinfo.js new file mode 100644 index 0000000..7fdcd75 --- /dev/null +++ b/Back/routes/api/updategameinfo.js @@ -0,0 +1,270 @@ +const express = require("express") +const router = express.Router() +const bodyParser = require('body-parser') +const rcc = require('./../../model/rcc.js') +const rcc2018 = require('./../../model/rcc2018.js') +const rcc2020 = require('./../../model/rcc2020.js') +const games = require('./../../model/games.js') +const rcctalk = require('./../../rcctalk') +const rcctalk2018 = require('./../../rcctalk2018') +const User = require('../../model/user.js') +router.use(bodyParser.json()) +require('dotenv').config() +const RCC_HOST = process.env.RCC_HOST + +router.post("/api/updategameinfo", async (req, res) => { + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { + const {game,players} = req.body + //const instance = await rcc.findOne({PlaceId: game}).lean() + + games.updateOne({idofgame: game}, { + $set: { + numberofplayers: parseInt(players).toString() + } + }, + function(err, doc) { + //console.log(err) + }) + + res.send("good") + } +}) + +router.all(["/api/updategameinfo/updatevisits","/game/placevisit.ashx"], async (req, res) => { + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { + let {game} = req.body + if (req.query.AssociatedPlaceID){ + game = req.query.AssociatedPlaceID + } + //const instance = await rcc.findOne({PlaceId: game}).lean() + + games.updateOne({idofgame: game}, { + $inc: { + visits: 1 + } + }, + function(err, doc) { + //console.log(err) + }) + + res.send("good") + } +}) + +router.all("/api/updategameinfo/gameloaded", async (req, res) => { + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { + let {game} = req.body + const gamedoc = await games.findOne({idofgame: game}).lean() + if (gamedoc.version === "2020"){ + + rcc2020.updateOne({PlaceId: game}, { + $set: { + Status: 2 + } + }, + function(err, doc) { + //console.log(err) + }) + + } + if (gamedoc.version === "2018"){ + + rcc2018.updateOne({PlaceId: game}, { + $set: { + Status: 2 + } + }, + function(err, doc) { + //console.log(err) + }) + + } + if (gamedoc.version === "2016"){ + + rcc.updateOne({PlaceId: game}, { + $set: { + Status: 2 + } + }, + function(err, doc) { + //console.log(err) + }) + + } + + + res.send("good") + } +}) + + +router.post("/api/updategameinfo/closejob", async (req, res) => { + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { + console.log("closed") + let {game} = req.body + if(typeof game === 'string'){ + game = game.replace('game','') + } + //const instance = await rcc.findOne({PlaceId: game}).lean() + games.updateOne({idofgame: game}, { + $set: { + numberofplayers: "0" + } + }, + function(err, doc) { + //console.log(err) + }) + games.updateOne({idofgame: game}, { + $set: { + players: [] + } + }, + function(err, doc) { + //console.log(err) + }) + const gamedoc = await games.findOne({idofgame: game}).lean() + try{ + if (gamedoc.version === "2018"){ + await rcc2018.deleteOne({PlaceId: game}) + rcctalk2018.CloseJob("game"+game) + } + }catch{} + try{ + if (gamedoc.version === "2020"){ + await rcc2020.deleteOne({PlaceId: game}) + rcctalk2018.CloseJob("game"+game) + } + }catch{} + try{ + if (gamedoc.version === "2016"){ + await rcc.deleteOne({PlaceId: game}) + + rcctalk.CloseJob("game"+game) + } + }catch{} + +res.send("good") + } +}) + +router.get("/api/updategameinfo/closealljobs", async (req, res) => { + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { + console.log("closed all") + //const instance = await rcc.findOne({PlaceId: game}).lean() + + await rcc.deleteMany({}) + games.updateMany({version: "2016"}, { + $set: { + numberofplayers: "0" + } + }, + function(err, doc) { + //console.log(err) + }) + games.updateMany({version: "2016"}, { + $set: { + players: [] + } + }, + function(err, doc) { + //console.log(err) + }) + rcctalk.CloseAllJobs() +res.send("good") + } +}) + +router.all(["/api/updategameinfo/updatepresence"], async (req, res) => { + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + if (ip == RCC_HOST || ip == "::ffff:"+RCC_HOST) { + let {game,player,name,action} = req.body + game = await games.findOne({idofgame: game}) + if (action === "joining" || action === "connect"){ + const updatedcount = parseFloat(game.numberofplayers)+1 + games.updateOne({idofgame: game.idofgame}, { + $push: { + players: {userid: player, name: name} + }, + $set: { + numberofplayers: updatedcount.toString() + } + }, + function(err, doc) { + //console.log(err) + }) + User.updateOne({userid: player}, { + $set: { + status: JSON.stringify({status: "Playing "+game.nameofgame,id: game.idofgame}) + }, + $addToSet: { + recentlyplayed: {id: game.idofgame} + }, + }, + function(err, doc) { + //console.log(err) + }) + User.updateOne({userid: player}, { + $set: { + status: JSON.stringify({status: "Playing "+game.nameofgame,id: game.idofgame}) + }, + $push: { + recentlyplayed: {$each: [], $slice: -10}// limit for recently played is 10 so slice anything older than that + }, + }, + function(err, doc) { + //console.log(err) + }) + if (game.version === "2018" || game.version === "2020"){ + rcctalk2018.RenewLease("game"+game.idofgame,"69530318916789546987353800") // if someone joins we want to renew the lease so it doesn't expire + // mostly just for stopping people from spamming urls and keeping games loaded + } + if (game.version === "2020"){ // 2020 doesn't do visits for some reason + games.updateOne({idofgame: game.idofgame}, { + $inc: { + visits: 1 + } + }, + function(err, doc) { + //console.log(err) + }) + } + + + } + + if (action === "leaving"|| action === "disconnect"){ + const updatedcount = parseFloat(game.numberofplayers)-1 + games.updateOne({idofgame: game.idofgame}, { + $pull: { + players: {userid: player, name: name} + }, + $set: { + numberofplayers: updatedcount.toString() + } + }, + function(err, doc) { + //console.log(err) + }) + + + User.updateOne({userid: player}, { + $set: { + status: JSON.stringify({status: "Offline"}) + } + }, + function(err, doc) { + //console.log(err) + }) + } + + +res.send("good") + } +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/updateusermembership.js b/Back/routes/api/updateusermembership.js new file mode 100644 index 0000000..831ff99 --- /dev/null +++ b/Back/routes/api/updateusermembership.js @@ -0,0 +1,57 @@ +const express = require("express") +const router = express.Router() +const user = require('./../..//model/user.js') +const { requireAuth } = require('./../../middleware/authmiddleware') + +router.post("/buymembership",requireAuth,async (req, res) => { + + if (req.userdocument?.membership != "None"){ + return res.json({status:"error",error:"You already have membership!"}) + } + + if (req.userdocument.coins >= 200){ + + req.userdocument.coins -= 200 + req.userdocument.membership = "BuildersClub" + + req.userdocument.markModified('coins') + req.userdocument.markModified('membership') + await req.userdocument.save() + + return res.json({status:"success",message:"You have builders club now!"}) + + } + + return res.json({status: "error",error:"Not enough rocks!"}) +}) + +router.post("/:id",async (req, res) => { + var id = req.params.id; + if (isNaN(parseFloat(id)) === true){ + return res.json({error: true}) + } + + var key = req.query.key; + if (isNaN(parseFloat(key)) === true){ + return res.json({error: true}) + } + if (key !== "33808292371407362400921749206284699231416675010973"){ + return res.json({error: true}) + } + + const response = await user.findOne({userid: id}) + + if (!response){ + console.log(response) + return res.json({error: true}) + } + + response.membership = req.query.newmembership + response.markModified('membership') + await response.save() + return res.json({error: false}) + + +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/userinfo.js b/Back/routes/api/userinfo.js new file mode 100644 index 0000000..afc09d5 --- /dev/null +++ b/Back/routes/api/userinfo.js @@ -0,0 +1,116 @@ +const express = require("express") +const router = express.Router() +const user = require('./../..//model/user.js') +const games = require("./../../model/games.js") +const RelativeTime = require("@yaireo/relative-time") +const relativeTime = new RelativeTime() + +router.get("/:id",async (req, res) => { + var id = req.params.id; + if (isNaN(parseFloat(id)) === true){ + return res.json({error: true}) + } + const response = await user.findOne({userid: id}).lean() + + if (!response){ + return res.json({error: true, message: "404"}) + } + + let status = {status: "Offline"} + if (response.status){ + status = JSON.parse(response.status) + } + const actualTimeMilliseconds = new Date().getTime() + if (response.timesincelastrequest && actualTimeMilliseconds - response.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false || response.timesincelastrequest && actualTimeMilliseconds - response.timesincelastrequest >= 60000 * 3 /*3 minutes*/ && !status){ + // been 3 minutes since last request mark as offline make sure we don't mark them offline while they are playing a game + status.status = "Offline" + response.status = JSON.stringify(status) + status = JSON.parse(response.status) + } + if (response.timesincelastrequest && actualTimeMilliseconds - response.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && status && status.status.includes("Playing") === false || response.timesincelastrequest && actualTimeMilliseconds - response.timesincelastrequest <= 60000 * 3 /*3 minutes*/ && !status){ + status.status = "Online" + response.status = JSON.stringify(status) + status = JSON.parse(response.status) + } + + return res.json({error:false, userinfo: {joindate: response.joindate, joindateepoch:new Date(response._id.getTimestamp()).getTime(), lastonline: relativeTime.from(new Date(response.timesincelastrequest)), lastonlineepoch: response.timesincelastrequest, coins: response.coins, username: response.username,userid: response.userid,friends: response.friends, admin: response.admin, discordid: response.discordid, membership: response.membership, inventory: response.inventory, bio: response.bio, status,followers: response.followers?.length, css: response.css, aboutme: response.aboutme}}) + + +}) + +router.get("/:id/creations",async (req, res) => { + var id = req.params.id; + if (isNaN(parseFloat(id)) === true){ + return res.json({error: true}) + } + const response = await user.findOne({userid: id}).lean() + + if (!response){ + return res.status(404).json({error: true, message: "Not found"}) + } + + const gameresponse = await games.find({useridofowner: id}).lean().select(['idofgame', 'version', 'nameofgame', 'numberofplayers', 'visits', 'useridofowner']) + + return res.json(gameresponse) + + +}) + +router.get("/:id/visits",async (req, res) => { + var id = req.params.id; + if (isNaN(parseFloat(id)) === true){ + return res.json({error: true}) + } + const response = await user.findOne({userid: id}).lean() + + if (!response){ + return res.status(404).json({error: true, message: "Not found"}) + } + + const visits = await games.aggregate([ + { $match: { useridofowner: parseFloat(id) } }, + { + "$group": { + "_id": null, + "visits": { + '$sum': "$visits" + } + } + } + ]) + + return res.json({error: false,visits: visits[0]?.visits || 0}) + + +}) + + +router.get("/usernametoid/:id",async (req, res) => { + + var id = req.params.id; + + const response = await user.findOne({username: {'$regex': id,$options:'i'}}).lean() + + if (!response){ + console.log(response) + return res.json({error: true}) + } + + return res.json({error:false, userid: response.userid}) +}) + +router.get("/discordidtouserid/:id",async (req, res) => { + + var id = req.params.id; + + const response = await user.findOne({discordid: id}).lean() + + if (!response){ + console.log(response) + return res.json({error: true}) + } + + return res.json({error:false, userid: response.userid}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/api/verify.js b/Back/routes/api/verify.js new file mode 100644 index 0000000..ca6d62e --- /dev/null +++ b/Back/routes/api/verify.js @@ -0,0 +1,33 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../../middleware/authmiddleware') +const games = require('./../../model/games.js') +const bodyParser = require('body-parser') +router.use(bodyParser.json()) + +router.post("/", requireAuth,async (req, res) => { + const {gameid} = req.body + if (typeof gameid == "undefined"){ + return res.json("Send gameid Please") + } + if (req.userdocument.admin == false) { + return res.redirect('/') + } + try{ + games.updateOne({idofgame: gameid}, { + $set: { + featured: true + } + }, + function(err, doc) { + //console.log(err) + }) + }catch(err){ + console.log(err) + } + + return res.json({status: 'ok'}) + +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/assets.js b/Back/routes/assets.js new file mode 100644 index 0000000..32d30e0 --- /dev/null +++ b/Back/routes/assets.js @@ -0,0 +1,130 @@ +const { response } = require("express") +const express = require("express") +const router = express.Router() +const fs = require('fs') +var path = require('path'); +const crypto = require('crypto'); +require('dotenv').config() +const RCC_HOST = process.env.RCC_HOST +const User = require('../model/user.js') +const catalog = require("../model/item") +const games = require('./../model/games.js') +const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); + +//redirect hmmmm +var rgx = /^[0-9]*\.?[0-9]*$/; +router.get("/",async (req, res) => { +if (req.query.name){ + const user = await User.findOne({userid: req.query.name}).lean() + if (!user) { + return res.json({status: 'error', error: 'User not found!'}) + } + + if (req.query.rcc){ + var empty = [] + for (var key of user.colors) { + empty.push(key.value) + } + return res.json(empty) + } + + + res.type('application/xml'); + var colorsxml = ` + null + nil + + + `+user.colors.find(x => x.name === 'Head').value+` + `+user.colors.find(x => x.name === 'Left Arm').value+` + `+user.colors.find(x => x.name === 'Left Leg').value+` + Body Colors + `+user.colors.find(x => x.name === 'Right Arm').value+` + `+user.colors.find(x => x.name === 'Right Leg').value+` + `+user.colors.find(x => x.name === 'Torso').value+` + true + + + ` + + return res.send(colorsxml) +} + if (req.query.method || /*req.headers?.["requester"] === "Server" &&*/ req.headers?.["assettype"] === "Place"){ + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + console.log(ip) + var sanitizedid = req.query.id.match(rgx) + if (ip === RCC_HOST || ip === "::ffff:"+RCC_HOST){ + fs.access("./assets/ugc/gamefile-"+sanitizedid+".rbxl", fs.F_OK, (err) => { + if (err) { + + res.status(404).send("not found") + return + } + + + //file exists + res.sendFile(path.resolve("./assets/ugc/gamefile-"+sanitizedid+".rbxl")) + return + }) + } + }else{ + if (!req.query.id){ + req.query.id = req.query.assetversionid + } + if (isNaN(parseFloat(req.query.id)) === true){ + res.writeHead(302, {'Location': 'https://assetdelivery.roblox.com/v1/asset?id=' + req.query.id}); + return res.end(); + } + var sanitizedid = parseFloat(req.query.id) + const response = await catalog.findOne({ItemId: sanitizedid}).lean() + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + if (response?.approved === false && (ip != RCC_HOST || ip === "::ffff:"+RCC_HOST) && !req.query.nonapproved){ + return res.status(401).end() + } + //this will only allow numbers in our system so that we don't allow nodejs to expose our whole server filesystem + fs.access("./assets/ugc/itemfile-"+sanitizedid+".rbxm", fs.F_OK,async (err) => { + //console.log("./assets/ugc/itemfile-"+sanitizedid+".rbxm") + if (err) { + if (req.headers?.['user-agent']?.includes("Android") === true || req.headers?.['user-agent']?.includes("iPhone") === true){ + const response = await fetch('https://assetdelivery.roblox.com/v1/assetId/' + req.query.id,{headers: {'User-Agent': 'Roblox/WinInet'}}); + const data = await response.json(); + if (data){ + if (data.location){ + res.writeHead(302, {'Location': data.location}); + res.end(); + return + } + } + } + if (req.query.id === "507766666"){ // 2018 r15 animation use legacy + res.writeHead(302, {'Location': 'https://assetdelivery.roblox.com/v1/asset?id=' + req.query.id + '&version=3'}); + return res.end() + } + if (req.query.id === "507766388"){ + res.writeHead(302, {'Location': 'https://assetdelivery.roblox.com/v1/asset?id=' + req.query.id + '&version=2'}); + return res.end() + } + if (req.query.id === "62633901"){ + return res.sendFile(path.resolve('./assets/ugc/common/itemfile-'+sanitizedid+".rbxm")) + } + res.writeHead(302, {'Location': 'https://assetdelivery.roblox.com/v1/asset?id=' + req.query.id}); + res.end(); + return + } + + res.sendFile(path.resolve('./assets/ugc/itemfile-'+sanitizedid+".rbxm")) + return + + + + + }) + } + + +}) + + + + +module.exports = router \ No newline at end of file diff --git a/Back/routes/avatar.js b/Back/routes/avatar.js new file mode 100644 index 0000000..86a203b --- /dev/null +++ b/Back/routes/avatar.js @@ -0,0 +1,20 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../middleware/authmiddleware') +const User = require('./../model/user.js') + +router.post("/updateavatartype", requireAuth,async (req, res) => { + let newavatartype + if (req.userdocument?.avatartype === "R15"){ + newavatartype = "R6" + }else{ + newavatartype = "R15" + } + req.userdocument.avatartype = newavatartype + req.userdocument.markModified('avatartype') + await req.userdocument.save() + return res.json({status: "success", message: "Done!"}) + +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/catalog.js b/Back/routes/catalog.js new file mode 100644 index 0000000..4c18242 --- /dev/null +++ b/Back/routes/catalog.js @@ -0,0 +1,101 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../middleware/authmiddleware') +const User = require('./../model/item.js') +const bodyParser = require('body-parser') +router.use(bodyParser.json()) + +router.post("/fetch", async (req, res) => { + const resultsPerPage = 30 + let page = req.body.page ?? 0 + if (page != 0){ + page-=1 + } + let {filter, sort} = req.body + //console.log(req.body) + try{ + if (filter === "Best Selling"){ + if (sort != "All"){ + response = await User.find({Type: sort,Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).sort({Sales: "descending"}).lean().select(['-_id']) + responsecount = await User.countDocuments({Type: sort, Hidden: {$exists:false}}) + } + if (sort === "All"){ + response = await User.find({Hidden: {$exists:false}, Type: { $ne: "User Ad" } }).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).sort({Sales: "descending"}).lean().select(['-_id']) + responsecount = await User.countDocuments({Hidden: {$exists:false}, Type: { $ne: "User Ad" }}) + } + }else{ + if (sort != "All"){ + response = await User.find({Type: sort, Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) + responsecount = await User.countDocuments({Type: sort, Hidden: {$exists:false}}) + } + if (sort === "All"){ + response = await User.find({Hidden: {$exists:false}, Type: { $ne: "User Ad" }}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) + responsecount = await User.countDocuments({Hidden: {$exists:false}, Type: { $ne: "User Ad" }}) + } + } + + //console.log(response.length) + res.json({data: response, pages: Math.ceil(Math.max(responsecount/resultsPerPage, 1))}) + } catch (error) { + res.json({status: "error", error:"idk"}) + } + +}) + + +router.get('/iteminfo/:id', async (req, res) => { + var id = req.params.id; + + if (isNaN(parseFloat(id)) === true){ + return res.json({status: "error", error: "Must be number"}) + } + const response = await User.findOne({ItemId: id}).lean() + + if (!response){ + return res.json({status: "error", error: "Not found"}) + } + return res.json({error: false, iteminfo: response}) + +}); + +router.post("/search", async (req, res) => { + const resultsPerPage = 30 + let page = req.body.page ?? 0 + if (page != 0){ + page-=1 + } + let {filter, sort, searchquery} = req.body + function escapeRegex(text) { + return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + } + const regex = new RegExp(escapeRegex(searchquery), 'gi'); + //console.log(req.body) + try{ + if (filter === "Best Selling"){ + if (sort != "All"){ + response = await User.find({Name: regex,Type: sort,Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).sort({Sales: "descending"}).lean().select(['-_id']) + responsecount = await User.countDocuments({Type: sort, Hidden: {$exists:false}}) + } + if (sort === "All"){ + response = await User.find({Name: regex,Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).sort({Sales: "descending"}).lean().select(['-_id']) + responsecount = await User.countDocuments({Hidden: {$exists:false}}) + } + }else{ + if (sort != "All"){ + response = await User.find({Name: regex,Type: sort, Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) + responsecount = await User.countDocuments({Type: sort, Hidden: {$exists:false}}) + } + if (sort === "All"){ + response = await User.find({Name: regex,Hidden: {$exists:false}}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).lean().select(['-_id']) + responsecount = await User.countDocuments({Hidden: {$exists:false}}) + } + } + + //console.log(response.length) + res.json({data: response, pages: Math.ceil(Math.max(responsecount/resultsPerPage, 1))}) + } catch (error) { + res.json({status: "error", error:"idk"}) + } +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/clientsettings.js b/Back/routes/clientsettings.js new file mode 100644 index 0000000..6cf8e0e --- /dev/null +++ b/Back/routes/clientsettings.js @@ -0,0 +1,16 @@ +const express = require("express") +const router = express.Router() + +/*router.get("/Setting/QuietGet/RCCService", (req, res) => { + res.json() +})*/ + +router.get(["/Setting/QuietGet/ClientAppSettings","//Setting/QuietGet/ClientSharedSettings","/Setting/QuietGet/ClientSharedSettings","/Setting/QuietGet/RCCService","/Setting/QuietGet/AndroidAppSettings","/Setting/QuietGet/iOSAppSettings","/Setting/QuietGet/StudioAppSettings"], (req, res) => { + return res.json({ "FFlagNewPlayerListScript": "True", "FFlagCoreScriptShowVisibleAgeV2": "False", "DFFlagFindFirstChildOfClassEnabled": "True", "FFlagStudioCSGAssets": "True", "FFlagCSGLoadBlocking": "False", "FFlagCSGPhysicsLevelOfDetailEnabled": "True", "FFlagFormFactorDeprecated": "False", "FFlagFontSmoothScalling": "True", "FFlagAlternateFontKerning": "True", "FFlagFontSourceSans": "True", "FFlagRenderNewFonts": "True", "FFlagDMFeatherweightEnabled": "True", "FFlagRenderFeatherweightEnabled": "True", "FFlagRenderFeatherweightUseGeometryGenerator": "True", "FFlagScaleExplosionLifetime": "True", "FFlagEnableNonleathalExplosions": "True", "DFFlagHttpCurlHandle301": "True", "FFlagSearchToolboxByDataModelSearchString": "True", "FFlagClientABTestingEnabled": "False", "FFlagStudioSmoothTerrainForNewPlaces": "True", "FFlagUsePGSSolver": "True", "FFlagSimplifyKeyboardInputPath": "False", "FFlagNewInGameDevConsole": "True", "FFlagTextFieldUTF8": "True", "FFlagTypesettersReleaseResources": "True", "FFlagLuaBasedBubbleChat": "True", "FFlagUseCanManageApiToDetermineConsoleAccess": "False", "FFlagConsoleCodeExecutionEnabled": "True", "DFFlagCustomEmitterInstanceEnabled": "True", "FFlagCustomEmitterRenderEnabled": "True", "FFlagCustomEmitterLuaTypesEnabled": "True", "FFlagStudioInSyncWebKitAuthentication": "False", "FFlagGlowEnabled": "True", "FFlagUseNewAppBridgeInputWindows": "False", "DFFlagUseNewFullscreenLogic": "True", "FFlagRenderMaterialsOnMobile": "True", "FFlagMaterialPropertiesEnabled": "True", "FFlagSurfaceLightEnabled": "True", "FFlagStudioPropertyErrorOutput": "True", "DFFlagUseR15Character": "True", "DFFlagEnableHipHeight": "True", "DFFlagUseStarterPlayerCharacter": "True", "DFFlagFilteringEnabledDialogFix": "True", "FFlagCSGMeshColorToolsEnabled": "True", "FFlagStudioEnableGameAnimationsTab": "True", "DFFlagScriptExecutionContextApi": "True", "FFlagStudioVariableIntellesense": "True", "FFlagLuaDebugger": "True", "FFlagUseUserListMenu": "True", "FFlagEnableSetCoreTopbarEnabled": "True", "FFlagPlayerDropDownEnabled": "True", "FFlagSetCoreMoveChat": "True", "FFlagSetCoreDisableChatBar": "True", "FFlagGraphicsGL3": "True", "DFFlagUserUseLuaVehicleController": "True", "FFlagTextBoxUnicodeAware": "True", "FFlagLetLegacyScriptsWork": "True", "FFlagDep": "True", "DFFlagDisableBackendInsertConnection": "True", "FFlagPhysicsAnalyzerEnabled": "True", "DFFlagGetGroupsAsyncEnabled": "True", "DFFlagGetFocusedTextBoxEnabled": "True", "DFFlagTextBoxIsFocusedEnabled": "True", "DFFlagGetCharacterAppearanceEnabled": "True", "FFlagNewLayoutAndConstraintsEnabled": "True", "GoogleAnalyticsAccountPropertyID": "UA-43420590-3", "GoogleAnalyticsAccountPropertyIDPlayer": "UA-43420590-14", "AllowVideoPreRoll": "True", "FLogAsserts": "0", "FLogCloseDataModel": "3", "CaptureQTStudioCountersEnabled": "True", "CaptureMFCStudioCountersEnabled": "True", "CaptureCountersIntervalInMinutes": "5", "FLogServiceVectorResize": "4", "FLogServiceCreation": "4", "AxisAdornmentGrabSize": "12", "FFlagProcessAllPacketsPerStep": "True", "FFlagUS14116": "True", "FFlagBlockBlockNarrowPhaseRefactor": "True", "FFlagEnableRubberBandSelection": "True", "FFlagQtStudioScreenshotEnabled": "True", "FFlagFixNoPhysicsGlitchWithGyro": "True", "FLogFullRenderObjects": "0", "PublishedProjectsPageHeight": "535", "PublishedProjectsPageUrl": "/ide/publish", "StartPageUrl": "/ide/welcome", "FFlagOpenNewWindowsInDefaultBrowser": "True", "FFlagOnScreenProfiler": "True", "FFlagInitializeNewPlace": "True", "PrizeAssetIDs": "", "PrizeAwarderURL": "/ostara/boon", "MinNumberScriptExecutionsToGetPrize": "500", "FFlagDebugCrashEnabled": "False", "FLogHangDetection": "3", "FFlagCharAnimationStats": "False", "FFlagRenderOpenGLForcePOTTextures": "True", "FFlagUseNewCameraZoomPath": "True", "FFlagQTStudioPublishFailure": "True", "ExcludeContactWithInteriorTerrainMinusYFace": "True", "FFlagFixUphillClimb": "True", "FFlagUseAveragedFloorHeight": "True", "PublishedProjectsPageWidth": "950", "FFlagRenderFastClusterEverywhere": "True", "FLogPlayerShutdownLuaTimeoutSeconds": "1", "FFlagQtFixToolDragging": "True", "FFlagSelectPartOnUndoRedo": "True", "FFlagStatusBarProgress": "True", "FFlagStudioCheckForUpgrade": "True", "FFlagStudioInsertModelCounterEnabled": "True", "FFlagStudioAuthenticationFailureCounterEnabled": "True", "FFlagRenderCheckTextureContentProvider": "True", "FFlagRenderLightGridEnabled": "True", "FFlagStudioLightGridAPIVisible": "True", "FFlagBetterSleepingJobErrorComputation": "True", "FLogDXVideoMemory": "4", "FFlagRenderNoLegacy": "True", "FFlagStudioLightGridOnForNewPlaces": "True", "FFlagPhysicsSkipRedundantJoinAll": "True", "FFlagTerrainOptimizedLoad": "True", "FFlagTerrainOptimizedStorage": "True", "FFlagTerrainOptimizedCHS": "True", "FFlagRenderGLES2": "True", "FFlagStudioMacAddressValidationEnabled": "True", "FFlagDoNotPassSunkEventsToPlayerMouse": "True", "FFlagQtAutoSave": "True", "FFlagRenderLoopExplicit": "True", "FFlagStudioUseBinaryFormatForPlay": "True", "FFlagPhysicsRemoveWorldAssemble_US16512": "True", "FFlagNativeSafeChatRendering": "True", "FFlagRenderNewMegaCluster": "True", "FFlagAutoJumpForTouchDevices": "True", "FLogOutlineBrightnessMin": "50", "FLogOutlineBrightnessMax": "160", "FLogOutlineThickness": "40", "FFlagDE5511FixEnabled": "True", "FFlagDE4423Fixed": "True", "FFlagSymmetricContact": "True", "FFlagLocalMD5": "True", "FFlagStudioCookieParsingDisabled": "False", "FFlagLastWakeTimeSleepingJobError": "True", "FFlagPhysicsAllowAutoJointsWithSmallParts_DE6056": "True", "FFlagPhysicsLockGroupDraggerHitPointOntoSurface_DE6174": "True", "FFlagOutlineControlEnabled": "True", "FFlagAllowCommentedScriptSigs": "True", "FFlagDataModelUseBinaryFormatForSave": "True", "FFlagStudioUseBinaryFormatForSave": "True", "FFlagDebugAdornableCrash": "True", "FFlagOverlayDataModelEnabled": "True", "DFFlagFixInstanceParentDesyncBug": "True", "FFlagPromoteAssemblyModifications": "False", "DFFlagCreateHumanoidRootNode": "True", "FFlagStudioCookieDesegregation": "True", "FFlagResponsiveJump": "True", "FFlagGoogleAnalyticsTrackingEnabled": "True", "FFlagNoCollideLadderFilter": "True", "FFlagFlexibleTipping": "True", "FFlagUseStrongerBalancer": "True", "FFlagClampControllerVelocityMag": "True", "DFFlagUseSaferChatMetadataLoading": "True", "FFlagSinkActiveGuiObjectMouseEvents": "False", "FLogLuaBridge": "2", "DFFlagPromoteAssemblyModifications": "True", "FFlagDeferredContacts": "True", "FFlagFRMUse60FPSLockstepTable": "True", "FFlagFRMAdjustForMultiCore": "True", "FFlagPhysics60HZ": "True", "FFlagQtRightClickContextMenu": "True", "FFlagUseTopmostSettingToBringWindowToFront": "True", "FFlagNewLightAPI": "True", "FFlagRenderLightGridShadows": "True", "FFlagRenderLightGridShadowsSmooth": "True", "DFFlagSanitizeKeyframeUrl": "True", "DFFlagDisableGetKeyframeSequence": "False", "FFlagCreateServerScriptServiceInStudio": "True", "FFlagCreateServerStorageInStudio": "True", "FFlagCreateReplicatedStorageInStudio": "True", "FFlagFilterEmoteChat": "True", "DFFlagUseCharacterRootforCameraTarget": "True", "FFlagImageRectEnabled": "True", "FFlagNewWaterMaterialEnable": "True", "DFFlagUserHttpAPIEnabled": "True", "DFIntUserHttpAccessUserId0": "0", "FFlagUserHttpAPIVisible": "True", "FFlagCameraChangeHistory": "True", "FFlagDE4640Fixed": "True", "FFlagShowStreamingEnabledProp": "True", "FFlagOptimizedDragger": "True", "FFlagRenderNewMaterials": "True", "FFlagRenderAnisotropy": "True", "FFlagStudioInitializeViewOnPaint": "True", "DFFlagPartsStreamingEnabled": "True", "FFlagStudioLuaDebugger": "True", "FFlagStudioLocalSpaceDragger": "True", "FFlagGuiRotationEnabled": "True", "FFlagDataStoreEnabled": "True", "DFFlagDisableTeleportConfirmation": "True", "DFFlagAllowTeleportFromServer": "True", "DFFlagNonBlockingTeleport": "True", "FFlagD3D9CrashOnError": "False", "FFlagRibbonBarEnabled": "True", "SFFlagInfiniteTerrain": "True", "FFlagStudioScriptBlockAutocomplete": "True", "FFlagRenderFixAnchoredLag": "True", "DFFlagAllowAllUsersToUseHttpService": "True", "GoogleAnalyticsAccountPropertyIDClient": "", "FFlagSurfaceGuiVisible": "True", "FFlagStudioIntellesenseEnabled": "True", "FFlagAsyncPostMachineInfo": "True", "FFlagModuleScriptsVisible": "True", "FFlagModelPluginsEnabled": "True", "FFlagGetUserIdFromPluginEnabled": "True", "FFlagStudioPluginUIActionEnabled": "True", "DFFlagRemoveAdornFromBucketInDtor": "True", "FFlagRapidJSONEnabled": "True", "DFFlagDE6959Fixed": "True", "DFFlagScopedMutexOnJSONParser": "True", "FFlagSupressNavOnTextBoxFocus": "True", "DFFlagExplicitPostContentType": "True", "DFFlagAddPlaceIdToAnimationRequests": "True", "FFlagCreatePlaceEnabled": "True", "DFFlagClientAdditionalPOSTHeaders": "True", "FFlagEnableAnimationExport": "True", "DFFlagAnimationAllowProdUrls": "True", "FFlagGetUserIDFromPluginEnabled": "True", "FFlagStudioContextualHelpEnabled": "True", "FFlagLogServiceEnabled": "True", "FFlagQtPlaySoloOptimization": "True", "FFlagStudioBuildGui": "True", "DFFlagListenForZVectorChanges": "True", "DFFlagUserInputServiceProcessOnRender": "True", "FFlagDE7421Fixed": "True", "FFlagStudioExplorerActionsEnabledInScriptView": "True", "FFlagHumanoidNetworkOptEnabled": "False", "DFFlagEnableNPCServerAnimation": "True", "DFFlagDataStoreUseUForGlobalDataStore": "True", "DFFlagDataStoreAllowedForEveryone": "True", "DFFlagBadTypeOnConnectErrorEnabled": "True", "FFlagStudioRemoveUpdateUIThread": "True", "FFlagPhysicsSkipUnnecessaryContactCreation": "False", "FFlagUseNewHumanoidCache": "True", "FFlagSecureReceiptsBackendEnabled": "True", "FFlagOrderedDataStoreEnabled": "True", "FFlagStudioLuaDebuggerGA": "True", "FFlagNPSSetScriptDocsReadOnly": "True", "FFlagRDBGHashStringComparison": "True", "FFlagStudioDebuggerVisitDescendants": "True", "FFlagDeprecateScriptInfoService": "True", "FFlagIntellisenseScriptContextDatamodelSearchingEnabled": "True", "FFlagSecureReceiptsFrontendEnabled": "True", "DFFlagCreatePlaceEnabledForEveryone": "True", "FFlagCreatePlaceInPlayerInventoryEnabled": "True", "DFFlagAddRequestIdToDeveloperProductPurchases": "True", "DFFlagUseYPCallInsteadOfPCallEnabled": "True", "FFlagStudioMouseOffsetFixEnabled": "True", "DFFlagPlaceValidation": "True", "FFlagReconstructAssetUrl": "True", "FFlagUseNewSoundEngine": "True", "FIntMinMillisecondLengthForLongSoundChannel": "5000", "FFlagStudioHideInsertedServices": "True", "FFlagStudioAlwaysSetActionEnabledState": "True", "FFlagRenderNew": "True", "FIntRenderNewPercentWin": "100", "FIntRenderNewPercentMac": "100", "FLogGraphics": "6", "DFFlagDisallowHopperServerScriptReplication": "True", "FFlagInterpolationFix": "False", "FFlagHeartbeatAt60Hz": "False", "DFFlagFixProcessReceiptValueTypes": "True", "DFFlagPhysicsSkipUnnecessaryContactCreation": "True", "FFlagStudioLiveCoding": "True", "FFlagPlayerHumanoidStep60Hz": "True", "DFFlagCrispFilteringEnabled": "False", "SFFlagProtocolSynchronization": "True", "FFlagUserInputServicePipelineStudio": "True", "FFlagUserInputServicePipelineWindowsClient": "True", "FFlagUserInputServicePipelineMacClient": "True", "FFlagStudioKeyboardMouseConfig": "True", "DFFlagLogServiceEnabled": "True", "DFFlagLoadAnimationsThroughInsertService": "True", "FFlagFRMFogEnabled": "True", "FLogBrowserActivity": "3", "DFFlagPhysicsPacketAlwaysUseCurrentTime": "True", "FFlagFixedStudioRotateTool": "True", "FFlagRibbonBarEnabledGA": "True", "FFlagRenderSafeChat": "False", "DFFlagPhysicsAllowSimRadiusToDecreaseToOne": "True", "DFFlagPhysicsAggressiveSimRadiusReduction": "True", "DFFlagLuaYieldErrorNoResumeEnabled": "True", "DFFlagEnableJointCache": "False", "DFFlagOnCloseTimeoutEnabled": "True", "FFlagStudioQuickInsertEnabled": "True", "FFlagStudioPropertiesRespectCollisionToggle": "True", "FFlagTweenServiceUsesRenderStep": "True", "FFlagUseNewSoundEngine3dFix": "True", "FFlagDebugUseDefaultGlobalSettings": "True", "FFlagStudioMiddleMouseTrackCamera": "False", "FFlagTurnOffiOSNativeControls": "True", "DFFlagUseNewHumanoidHealthGui": "True", "DFFlagLoggingConsoleEnabled": "True", "DFFlagAllowModuleLoadingFromAssetId": "True", "FFlagStudioZoomExtentsExplorerFixEnabled": "True", "FFlagLuaDebuggerBreakOnError": "True", "FFlagRetentionTrackingEnabled": "True", "FFlagShowAlmostAllItemsInExplorer": "True", "FFlagStudioFindInAllScriptsEnabled": "True", "FFlagImprovedNameOcclusion": "True", "FFlagHumanoidMoveToDefaultValueEnabled": "True", "FFlagEnableDisplayDistances": "True", "FFlagUseMinMaxZoomDistance": "True", "SFFlagAllowPhysicsPacketCompression": "False", "FFlagStudioOneClickColorPickerEnabled": "True", "DFFlagHumanoidMoveToDefaultValueEnabled": "True", "VideoPreRollWaitTimeSeconds": "45", "FFlagBalancingRateLimit": "True", "FFlagLadderCheckRate": "True", "FFlagStateSpecificAutoJump": "True", "SFFlagOneWaySimRadiusReplication": "True", "DFFlagApiDictionaryCompression": "True", "SFFlagPathBasedPartMovement": "True", "FFlagEnsureInputIsCorrectState": "False", "DFFlagLuaLoadStringStrictSecurity": "True", "DFFlagCrossPacketCompression": "True", "FFlagWorkspaceLoadStringEnabledHidden": "True", "FFlagStudioPasteAsSiblingEnabled": "True", "FFlagStudioDuplicateActionEnabled": "True", "FFlagPreventInterpolationOnCFrameChange": "True", "FLogNetworkPacketsReceive": "5", "FFlagPlayPauseFix": "True", "DFFlagCrashOnNetworkPacketError": "False", "FFlagHumanoidStateInterfaces": "True", "FFlagRenderDownloadAssets": "True", "FFlagBreakOnErrorConfirmationDialog": "True", "FFlagStudioAnalyticsEnabled": "True", "FFlagAutoRotateFlag": "True", "DFFlagUseImprovedLadderClimb": "True", "FFlagUseCameraOffset": "True", "FFlagRenderBlobShadows": "True", "DFFlagWebParserDisableInstances": "False", "FFlagStudioNewWiki": "True", "DFFlagLogPacketErrorDetails": "False", "FFlagLimitHorizontalDragForce": "True", "DFFlagCreateSeatWeldOnServer": "True", "FFlagGraphicsUseRetina": "True", "FFlagDynamicEnvmapEnabled": "True", "DFFlagDeferredTouchReplication": "True", "DFFlagCreatePlayerGuiEarlier": "True", "DFFlagProjectileOwnershipOptimization": "True", "DFFlagLoadSourceForCoreScriptsBeforeInserting": "False", "GoogleAnalyticsLoadStudio": "1", "DFFlagTaskSchedulerFindJobOpt": "True", "SFFlagPreventInterpolationOnCFrameChange": "True", "DFIntNumPhysicsPacketsPerStep": "2", "DFFlagDataStoreUrlEncodingEnabled": "True", "FFlagShowWebPlaceNameOnTabWhenOpeningFromWeb": "True", "DFFlagTrackTimesScriptLoadedFromLinkedSource": "True", "FFlagToggleDevConsoleThroughChatCommandEnabled": "True", "FFlagEnableFullMonitorsResolution": "True", "DFFlagAlwaysUseHumanoidMass": "True", "DFFlagUseStrongerGroundControl": "True", "DFFlagCorrectlyReportSpeedOnRunStart": "True", "FFlagLuaDebuggerImprovedToolTip": "True", "FFlagLuaDebuggerPopulateFuncName": "True", "FFlagLuaDebuggerNewCodeFlow": "True", "DFFlagValidateCharacterAppearanceUrl": "false", "FFlagStudioQuickAccessCustomization": "True", "DFFlagTaskSchedulerUpdateJobPriorityOnWake": "True", "DFFlagTaskSchedulerNotUpdateErrorOnPreStep": "True", "FFlagWikiSelectionSearch": "True", "DFIntTaskSchedularBatchErrorCalcFPS": "1200", "FFlagSuppressNavOnTextBoxFocus": "False", "FFlagEnabledMouseIconStack": "True", "DFFlagFastClone": "True", "DFFlagLuaNoTailCalls": "True", "DFFlagFilterStreamingProps": "True", "DFFlagNetworkOwnerOptEnabled": "True", "DFFlagPathfindingEnabled": "True", "FFlagEnableiOSSettingsLeave": "True", "FFlagUseFollowCamera": "True", "FFlagDefaultToFollowCameraOnTouch": "True", "DFFlagAllowMoveToInMouseLookMove": "True", "DFFlagAllowHumanoidDecalTransparency": "True", "DFFlagSupportCsrfHeaders": "True", "DFFlagConfigureInsertServiceFromSettings": "True", "FFlagPathfindingClientComputeEnabled": "True", "DFFlagLuaResumeSupportsCeeCalls": "True", "DFFlagPhysicsSenderErrorCalcOpt": "True", "DFFlagClearPlayerReceivingServerLogsOnLeave": "True", "DFFlagConsoleCodeExecutionEnabled": "True", "DFFlagCSGDictionaryReplication": "True", "FFlagCSGToolsEnabled": "True", "FFlagCSGDictionaryServiceEnabled": "True", "FFlagCSGMeshRenderEnable": "True", "FFlagCSGChangeHistory": "True", "FFlagCSGMeshColorEnable": "True", "FFlagCSGScaleEnabled": "True", "FFlagCylinderUsesConstantTessellation": "True", "FFlagStudioDraggersScaleFixes": "True", "FFlagCSGDecalsEnabled": "True", "FFlagCSGMigrateChildData": "True", "SFFlagBinaryStringReplicationFix": "True", "FFlagHummanoidScaleEnable": "True", "FFlagStudioDataModelIsStudioFix": "True", "DFFlagWebParserEnforceASCIIEnabled": "True", "DFFlagScriptDefaultSourceIsEmpty": "True", "FFlagFixCaptureFocusInput": "True", "FFlagFireUserInputServiceEventsAfterDMEvents": "True", "FFlagVectorErrorOnNilArithmetic": "True", "DFFlagUseImageColor": "True", "FFlagStopNoPhysicsStrafe": "True", "DFFlagDebugLogNetworkErrorToDB": "False", "FFlagLowQMaterialsEnable": "True", "FFLagEnableFullMonitorsResolution": "True", "FFlagStudioChildProcessCleanEnabled": "True", "DFFlagAllowFullModelsWhenLoadingModules": "True", "DFFlagRealWinInetHttpCacheBypassingEnabled": "True", "FFlagNewUniverseInfoEndpointEnabled": "True", "FFlagGameExplorerEnabled": "True", "FFlagStudioUseBinaryFormatForModelPublish": "True", "FFlagGraphicsFeatureLvlStatsEnable": "True", "FFlagStudioEnableWebKitPlugins": "True", "DFFlagSendHumanoidTouchedSignal": "True", "DFFlagReduceHumanoidBounce": "True", "DFFlagUseNewSounds": "True", "FFlagFixHumanoidRootPartCollision": "True", "FFlagEnableAndroidMenuLeave": "True", "FFlagOnlyProcessGestureEventsWhenSunk": "True", "FFlagAdServiceReportImpressions": "True", "FFlagStudioUseExtendedHTTPTimeout": "True", "FFlagStudioSeparateActionByActivationMethod": "False", "DFFlagPhysicsSenderThrottleBasedOnBufferHealth": "True", "DFFlagGetGroupInfoEnabled": "True", "DFFlagGetGroupRelationsEnabled": "True", "SFFlagTopRepContSync": "True", "FFlagStudioUseBinaryFormatForModelSave": "True", "EnableFullMonitorsResolution": "True", "DFFlagRenderSteppedServerExceptionEnabled": "True", "FFlagUseWindowSizeFromGameSettings": "True", "DFFlagCheckStudioApiAccess": "True", "FFlagGameExplorerPublishEnabled": "True", "DFFlagKeepXmlIdsBetweenLoads": "True", "DFFlagReadXmlCDataEnabled": "True", "FFlagStudioRemoveToolSounds": "True", "FFlagStudioOneStudGridDefault": "True", "FFlagStudioPartSymmetricByDefault": "True", "FFlagStudioIncreasedBaseplateSize": "True", "FFlagSkipSilentAudioOps": "True", "SFFlagGuid64Bit": "False", "FIntValidateLauncherPercent": "0", "FFlagCSGDataLossFixEnabled": "True", "DFStringRobloxAnalyticsURL": "https://www.mete0r.xyz/", "DFFlagRobloxAnalyticsTrackingEnabled": "False", "FFlagStudioOpenLastSaved": "False", "FFlagStudioShowTutorialsByDefault": "True", "FFlagStudioForceToolboxSize": "True", "FFlagStudioExplorerDisabledByDefault": "True", "FFlagStudioDefaultWidgetSizeChangesEnabled": "True", "FFlagStudioUseScriptAnalyzer": "True", "FFlagNoClimbPeople": "True", "DFFlagAnimationFormatAssetId": "True", "FFlagGetCorrectScreenResolutionFaster": "True", "DFFlagFixTouchEndedReporting": "False", "FFlagStudioTeleportPlaySolo": "True", "FFlagStudioDE7928FixEnabled": "True", "FFlagDE8768FixEnabled": "True", "FFlagStudioDE9108FixEnabled": "True", "FFlagStudioPlaySoloMapDebuggerData": "True", "FFlagLuaDebuggerCloneDebugger": "True", "FFlagRenderLightgridInPerformEnable": "True", "SFFlagStateBasedAnimationReplication": "True", "FFlagVolumeControlInGameEnabled": "True", "FFlagGameConfigurerUseStatsService": "True", "FFlagStudioUseHttpAuthentication": "True", "FFlagDetectTemplatesWhenSettingUpGameExplorerEnabled": "True", "FFlagEntityNameEditingEnabled": "True", "FFlagNewCreatePlaceFlowEnabled": "True", "FFlagFakePlayableDevices": "False", "FFlagMutePreRollSoundService": "True", "DFFlagBodyMoverParentingFix": "True", "DFFlagBroadcastServerOnAllInterfaces": "True", "HttpUseCurlPercentageWinClient": "100", "HttpUseCurlPercentageMacClient": "100", "HttpUseCurlPercentageWinStudio": "100", "HttpUseCurlPercentageMacStudio": "100", "SFFlagReplicatedFirstEnabled": "True", "DFFlagCSGShrinkForMargin": "True", "FFlagPhysicsBulletConnectorPointRecalc": "True", "DFIntBulletContactBreakThresholdPercent": "200", "DFIntBulletContactBreakOrthogonalThresholdPercent": "200", "FFlagPhysicsBulletConnectorMatching": "True", "FFlagPhysicsBulletUseProximityMatching": "False", "FFlagPhysicsCSGUsesBullet": "True", "DFFlagCSGPhysicsDeserializeRefactor": "True", "FFlagWedgeEnableDecalOnTop": "True", "FFlagFrustumTestGUI": "True", "FFlagFeatureLvlsDX11BeforeDeviceCreate": "True", "FFlagStudioPasteSyncEnabled": "True", "FFlagResetMouseCursorOnToolUnequip": "True", "DFFlagUpdateCameraTarget": "True", "DFFlagFixGhostClimb": "True", "DFFlagUseStarterPlayer": "True", "FFlagStudioFindCrashFixEnabled": "True", "FFlagFixPartOffset": "True", "DFFlagLuaCloseUpvalues": "True", "FFlagRenderTextureCompositorUseBudgetForSize": "True", "FFlagAllowOutOfBoxAssets": "False", "FFlagRemoveTintingWhenActiveIsFalseOnImageButton": "True", "FFlagStudioModuleScriptDefaultContents": "True", "FFlagStudioHomeKeyChangeEnabled": "True", "FFlagStudioOpenStartPageForLogin": "True", "FFlagStudioNativeKeepSavedChanges": "True", "FFlagSerializeCurrentlyOpenPlaceWhenPublishingGame": "True", "FFlagGameNameLabelEnabled": "True", "FFlagStudioValidateBootstrapper": "True", "FFlagRakNetReadFast": "True", "DFFlagPhysicsSenderSleepingUpdate": "True", "FFlagUseShortShingles": "True", "FFlagKKTChecks": "False", "DFFlagUseApiProxyThrottling": "True", "DFFlagValidateSetCharacter": "True", "DFFlagUpdateHumanoidSimBodyInComputeForce": "True", "DFFlagNetworkPendingItemsPreserveTimestamp": "True", "FFlagStudioCSGRotationalFix": "True", "FFlagNewLoadingScreen": "True", "FFlagScrollingFrameOverridesButtonsOnTouch": "True", "DFFlagStreamLargeAudioFiles": "True", "DFFlagNewLuaChatScript": "True", "DFFlagLoopedDefaultHumanoidAnimation": "True", "FFlagSoundsRespectDelayedStop": "False", "DFFlagCSGPhysicsErrorCatchingEnabled": "True", "DFFlagFireStoppedAnimSignal": "True", "FFlagStudioFixToolboxReload": "True", "FFlagCSGDecalsV2": "True", "FFlagLocalOptimizer": "True", "DFFlagClearFailedUrlsWhenClearingCacheEnabled": "True", "DFFlagSupportNamedAssetsShortcutUrl": "True", "DFFlagUseW3CURIParser": "True", "DFFlagContentProviderHttpCaching": "True", "FFlagNoWallClimb": "False", "FFlagSmoothMouseLock": "False", "DFFlagCSGPhysicsNanPrevention": "True", "FFlagStudioDE9818FixEnabled": "True", "FFlagGameExplorerImagesEnabled": "True", "FFlagStudioInsertOrientationFix": "True", "FFlagStudioTabOrderingEnabled": "True", "FFlagFramerateDeviationDroppedReport": "True", "FFlagModuleScriptsPerVmEnabled": "False", "FFlagGameExplorerImagesInsertEnabled": "True", "FFlagTexturePropertyWidgetEnabled": "True", "FFlagReloadAllImagesOnDataReload": "True", "FFlagModuleScriptsPerVmEnabledFix2": "True", "DFFlagFixBufferZoneContainsCheck": "False", "FFlagStudioPlaceAssetFromToolbox": "True", "FFlagChannelMasterMuting": "True", "FFlagStudioUseDelayedSyntaxCheck": "True", "FFlagStudioCommandLineSaveEditText": "True", "FFlagStudioAddHelpInContextMenu": "True", "DFIntHttpCacheCleanMinFilesRequired": "10000", "DFIntHttpCacheCleanMaxFilesToKeep": "7500", "FFlagCSGVoxelizer": "True", "DFFlagCheckApiAccessInTransactionProcessing": "True", "FFlagBindPurchaseValidateCallbackInMarketplaceService": "True", "FFlagSetDataModelUniverseIdAfterPublishing": "True", "FFlagOpenScriptWorksOnModulesEnabled": "True", "FFlagStudioRibbonBarNewLayout": "True", "FFlagStudioRibbonBarLayoutFixes": "True", "FFlagStudioPlaceOnlineIndicator": "True", "FFlagRenderWangTiles": "True", "FFlagDisableBadUrl": "True", "FFlagPrimalSolverLogBarrierIP": "True", "FFlagDualSolverSimplex": "True", "FFlagPrimalSolverSimplex": "True", "FIntNumSmoothingPasses": "3", "FFlagVerifyConnection": "True", "FIntRegLambda": "1400", "FFlagScriptAnalyzerPlaceholder": "True", "FFlagCSGStripPublishedData": "True", "DFFlagRaycastReturnSurfaceNormal": "True", "FFlagMoveGameExplorerActionsIntoContextMenu": "True", "FFlagStudioAdvanceCookieExpirationBugFixEnabled": "True", "FFlagNewBackpackScript": "True", "FFlagGameNameAtTopOfExplorer": "True", "FFlagStudioActActionsAsTools": "True", "FFlagStudioInsertAtMouseClick": "True", "FFlagStopLoadingStockSounds": "True", "DFFlagFixTimePositionReplication": "True", "DFFlagHttpReportStatistics": "True", "DFFlagEnableChatTestingInStudio": "True", "DFIntHttpSendStatsEveryXSeconds": "300", "FLogStepAnimatedJoints": "5", "DFFlagLuaDisconnectFailingSlots": "False", "DFFlagEnsureSoundPosIsUpdated": "True", "DFFlagLoadStarterGearEarlier": "False", "DFFlagBlockUsersInLuaChat": "True", "FFlagRibbonPartInsertNotAllowedInModel": "True", "DFFlagUsePlayerScripts": "True", "DFFlagUserAccessUserSettings": "True", "DFFlagUseLuaCameraAndControl": "True", "DFFlagUseLuaPCInput": "True", "DFFlagFixLuaMoveDirection": "True", "DFFlagUseDecalLocalTransparencyModifier": "True", "DFFlagUseFolder": "True", "DFFlagUsePreferredSpawnInPlaySoloTeleport": "True", "DFFlagFilterAddSelectionToSameDataModel": "False", "FFlagGameExplorerAutofillImageNameFromFileName": "True", "FFlagGameExplorerBulkImageUpload": "True", "FFlagStudioAllowAudioSettings": "True", "DFFlagUsePlayerInGroupLuaChat": "True", "FFlagStudioDecalPasteFix": "True", "FFlagStudioCtrlTabDocSwitchEnabled": "True", "DFIntDraggerMaxMovePercent": "60", "FFlagUseUniverseGetInfoCallToDetermineUniverseAccess": "True", "FFlagMaxFriendsCount": "True", "DFIntPercentApiRequestsRecordGoogleAnalytics": "0", "FFlagSelectSpinlock": "True", "FFlagFastZlibPath": "True", "DFFlagWriteXmlCDataEnabled": "True", "DFFlagUseSpawnPointOrientation": "True", "DFFlagUsePlayerSpawnPoint": "True", "DFFlagCSGPhysicsRecalculateBadContactsInConnectors": "True", "FFlagStudioPartAlignmentChangeEnabled": "True", "FFlagStudioToolBoxModelDragFix": "True", "DFFlagOrder66": "False","FFlagCloudIconFixEnabled": "True", "DFFlagFixHealthReplication": "True", "DFFlagReplicateAnimationSpeed": "True", "FFlagLuaFollowers": "True", "FFlagNewNotificationsScript": "True", "FFlagStudioSendMouseIdleToPluginMouse": "True", "DFFlagPhysicsOptimizeAssemblyHistory": "True", "DFFlagPhysicsOptimizeBallBallContact": "True", "DFFlagUseNewBubbleSkin": "True", "DFFlagUse9FrameBackgroundTransparency": "True", "DFFlagCheckForHeadHit": "False", "DFFlagUseHttpsForAllCalls": "True", "DFFlagLoadCoreModules": "True", "FFlagStudioRecentSavesEnabled": "True", "FFlagStudioToolBoxInsertUseRayTrace": "True", "FFlagInterpolationUseWightedDelay": "True", "FFlagUseInGameTopBar": "True", "FFlagNewPurchaseScript": "True", "FFlagStudioEnableGamepadSupport": "True", "FFlagStudioRemoveDuplicateParts": "True", "FFlagStudioLaunchDecalToolAfterDrag": "True", "DFFlagHumanoidFloorPVUpdateSignal": "True", "DFFlagHumanoidFloorDetectTeleport": "True", "DFFlagHumanoidFloorForceBufferZone": "False", "DFFlagHumanoidFloorManualDeltaUpdateManagment": "True", "DFFlagHumanoidFloorManualFrictionLimitation": "True", "DFFlagUpdateHumanoidNameAndHealth": "True", "DFFlagEnableHumanoidDisplayDistances": "True", "FFlagFixTouchInputEventStates": "False", "DFFlagInterpolationTimingFix": "True", "FIntRenderGBufferMinQLvl": "16", "FFlagResizeGuiOnStep": "True", "FFlagDontFireFakeMouseEventsOnUIS": "True", "FFlagCameraUseOwnViewport": "True", "FFlagGameExplorerMoveImagesUnderAssetsGroup": "True", "DFFlagNetworkFilterAllowToolWelds": "True", "DFIntHttpInfluxHundredthsPercentage": "5", "DFStringHttpInfluxURL": "https://www.mete0r.xyz/", "DFStringHttpInfluxDatabase": "main", "DFStringHttpInfluxUser": "user", "DFStringHttpInfluxPassword": "password", "FFlagStudioSpawnLocationsDefaultValues": "True", "FFlagStudioDE11536FixEnabled": "True", "FFlagStudioRibbonGroupResizeFixEnabled": "True", "FFlagGradientStep": "True", "FFlagUseNewContentProvider": "False", "SFFlagEquipToolOnClient": "True", "FFlagStartWindowMaximizedDefault": "True", "FFlagUseNewKeyboardHandling": "True", "FFlagCameraZoomNoModifier": "True", "DFFlagRemoteValidateSubscribersError": "True", "FFlagNewMenuSettingsScript": "True", "DFFlagHttpCurlSanitizeUrl": "True", "DFFlagRemoveDataModelDependenceInWaitForChild": "True", "FFlagFilterAddSelectionToSameDataModel": "True", "DFFlagUseCanManageApiToDetermineConsoleAccess": "False", "DFIntMoveInGameChatToTopPlaceId": "1", "FFlagStudioProgressIndicatorForInsertEnabled": "True", "FFlagTerrainLazyGrid": "True", "FFlagHintsRenderInUserGuiRect": "True", "FFlagCallSetFocusFromCorrectThread": "True", "FFlagFastRevert": "True", "FFlagSleepBeforeSpinlock": "True", "FFlagSparseCheckFastFail": "True", "FFlagStudioSmoothTerrainPlugin": "True", "FFlagStudioLoadPluginsLate": "True", "FFlagStudioInsertIntoStarterPack": "True", "FFlagStudioIgnoreSSLErrors": "True", "DFFlagFixJointReparentingDE11763": "True", "DFFlagPhysicsInvalidateContactCache": "True", "FFlagLuaMathNoise": "True", "FFlagArcHandlesBidirectional": "True", "FFlagChangeHistoryFixPendingChanges": "True", "DFFlagWorkspaceSkipTerrainRaycastForSurfaceGui": "True", "FFlagStudioBatchItemMapAddChild": "True", "FFlagRenderCameraFocusFix": "True", "DFFlagReplicatorWorkspaceProperties": "True", "FFlagDirectX11Enable": "True", "FFlagCheckDegenerateCases": "True", "DFFlagUseServerCoreScripts": "True", "DFFlagCorrectFloorNormal": "True", "FFlagNewBadgeServiceUrlEnabled": "True", "FFlagBubbleChatbarDocksAtTop": "True", "FFlagSmoothTerrainClient": "True", "FFlagLuaUseBuiltinEqForEnum": "True", "FFlagPlaceLauncherThreadCheckDmClosed": "True", "DFFlagAppendTrackerIdToTeleportUrl": "True", "FFlagPlayerMouseRespectGuiOffset": "True", "DFFlagReportElevatedPhysicsFPSToGA": "True", "DFFlagPreventReturnOfElevatedPhysicsFPS": "True", "FFlagStudioIgnoreMouseMoveOnIdle": "True", "FFlagStudioDraggerFixes": "True", "FLogUseLuaMemoryPool": "0", "FFlagCSGNewTriangulate": "True", "DFFlagLuaFixResumeWaiting": "True", "FFlagFRMInStudio": "True", "DFFlagFixLadderClimbSpeed": "True", "DFFlagNoWalkAnimWeld": "False", "DFFlagImprovedKick": "True", "FFlagRenderFixLightGridDirty": "True", "FFlagLoadLinkedScriptsOnDataModelLoad": "True", "FFlagFixMeshOffset": "True", "FIntLaunchInfluxHundredthsPercentage": "0", "DFIntJoinInfluxHundredthsPercentage": "100", "FFlagSmoothTerrain": "True", "FFlagNewVehicleHud": "True", "DFFlagHumanoidStandOnSeatDestroyed": "True", "DFFlagGuiBase3dReplicateColor3WithBrickColor": "True", "FFlagTaskSchedulerCyclicExecutiveStudio": "True", "DFIntElevatedPhysicsFPSReportThresholdTenths": "585", "DFIntExpireMarketPlaceServiceCacheSeconds": "60", "DFFlagEnableMarketPlaceServiceCaching": "True", "DFFlagUseNewAnalyticsApi": "True", "DFFlagSmoothTerrainDebounceUpdates": "True", "FFlagStudioAuthenticationCleanup": "True", "FFlagRenderFixGBufferLOD": "True", "FFlagStudioDraggerCrashFixEnabled": "True", "FFlagDraggerCrashFixEnabled": "True", "DFFlagEnableRapidJSONParser": "True", "DFFlagPushLuaWorldRayOriginToNearClipPlane": "True", "FFlagLoadTimeModificationTestFlag": "True", "DFFlagPhysicsFastSmoothTerrainUpdate": "True", "DFFlagSmoothTerrainPhysicsExpandPrimitiveOptimal": "True", "DFFlagFixBytesOnJoinReporting": "True", "FFlagRenderGBufferEverywhere": "False", "DFFlagSmoothTerrainPhysicsRayAabbExact": "True", "DFIntSmoothTerrainPhysicsRayAabbSlop": "1", "DFIntMaxClusterKBPerSecond": "300", "FLogLuaAssert": "0", "FFlagSmoothTerrainCountCellVolume": "True", "DFFlagSmoothTerrainWorldToCellUseDiagonals": "True", "DFFlagFireSelectionChangeOncePerChange": "True", "FIntLuaAssertCrash": "0", "FFlagRenderFixCameraFocus": "False", "DFFlagCSGPhysicsSphereRotationIdentity": "True", "DFFlagCSGPhysicsRefreshContactsManually": "True", "FFlagStudioUndoEnabledForEdit": "True", "DFIntLuaChatFloodCheckMessages": "7", "DFIntLuaChatFloodCheckInterval": "15", "FFlagLuaChatFiltering": "True", "FFlagMobileToggleChatVisibleIcon": "True", "FFlagStudioDE9132FixEnabled": "True", "DFFlagGetUserIdEnabled": "True", "DFFlagGetUserNameEnabled": "True", "DFFlagEnableAnimationInformationAccess": "True", "DFFlagEnableAnimationTrackExtendedAPI": "True", "FFlagRequestServerStatsV2Enabled": "True", "FFlagPhysicsPreventGroupDraggerPlacementToMinus400_DE6267": "True", "FFlagSpecificUserdataTypeErrors": "True", "DFFlagScrollingFrameDraggingFix": "True", "FFlagAutodetectCPU": "True", "DFFlagSetRenderedFrameOnClumpChanged": "True", "DFFlagDisableTimeoutDuringJoin": "True", "DFFlagDesiredAltitudeDefaultInf": "True", "DFFlagRCCDE13316CrashFix": "True", "DFFlagUseStarterPlayerGA": "True", "FFlagScrollingFrameMouseUpFix": "True", "DFFlagDebrisServiceUseDestroy": "True", "DFFlagAccessUserFeatureSetting": "True", "DFFlagAllowBindActivate": "True", "FFlagEnableControllerGuiSelection": "True", "FFlagUseNewSoftwareMouseRender": "True", "DFFlagDoNotHoldTagItemsForInitialData": "True", "FFlagAltSpinlock": "True", "FFlagSpinlock": "True", "FFlagGraphicsGLReduceLatency": "True", "DFFlagMovingHumananoidWakesFloor": "True", "DFFlagSetNetworkOwnerAPIEnabled": "True", "DFFlagSetNetworkOwnerAPIEnabledV2": "True", "DFFlagGetFriendsEnabled": "True", "DFFlagGetFriendsOnlineEnabled": "True", "DFFlagUseNewTextBoxLogic": "True", "FFlagOnScreenProfilerGPU": "True", "FFlagConfigurableLineThickness": "True", "DFFlagSpawnPointEnableProperty": "True", "DFFlagConfigurableFallenPartDestroyHeight": "True", "DFFlagMiddleMouseButtonEvent": "True", "DFFlagEnablePreloadAsync": "True", "DFFlagFoldersInGUIs": "True", "DFIntAndroidInfluxHundredthsPercentage": "0", "DFFlagNoOwnershipLogicOnKernelJoint": "True", "DFFlagEnableGetPlayingAnimationTracks": "True", "FFlagCyclicExecutivePriorityJobs": "True", "DFIntMaxMissedWorldStepsRemembered": "16", "DFIntMacInfluxHundredthsPercentage": "0", "DFIntiOSInfluxHundredthsPercentage": "100", "FFlagStudioLockServiceParents": "True", "DFFlagFirePlayerAddedAndPlayerRemovingOnClient": "True", "DFFlagRecursiveWakeForBodyMovers": "True", "DFFlagEnableHumanoidSetStateEnabled": "True", "DFFlagSoundEndedEnabled": "True", "DFFlagUseIntersectingOthersForSpawnEnabled": "True", "DFFlagMoveToDontAlignToGrid": "True", "DFFlagIsBestFriendsWithReturnFriendsWith": "True", "DFFlagPlayerOwnsAssetFalseForInvalidUsers": "True", "DFFlagIsUrlCheckAssetStringLength": "True", "DFFlagEnableGoodbyeDialog": "True", "DFFlagEnableReverseAnimations": "True", "DFFlagEnableAnimationSetTimePosition": "True", "DFFlagEnableMobileAutoJumpFlag": "True", "DFFlagHttpDelaySendInfluxStats": "True", "DFFlagDisableRequestMarker": "True", "DFFlagDisableCharacterRequest": "True", "FFlagStudioCollapsibleTutorials": "True", "FStringStudioTutorialsUrl": "http://wiki.roblox.com/index.php?title=Studio_Tutorials_Test&studiomode=true", "FStringStudioTutorialsTOCUrl": "http://wiki.roblox.com/index.php?title=Studio_Tutorials_Landing&studiomode=true", "FFlagSandboxHash": "True", "FFlagDE14316CrashFix": "True", "FFlagDE14317CrashFix": "True", "DFFlagSetNetworkOwnerCanSetCheck": "True", "DFFlagLiveColorUpdatesCanceling": "True", "DFFlagLuaGcPerVm": "True", "FFlagStudioDeviceEmulationTouchInputFix": "True", "FFlagTaskSchedulerCyclicExecutive": "True", "DFFlagMakeWebPendingFriendRequests": "True", "DFFlagGetLastestAssetVersionEnabled": "True", "FFlagHideDeprecatedEnums": "False", "FFlagSubmitEditedColor3WhenFocusLost": "True", "DFFlagFixScriptableCameraRoll": "True", "DFFlagSeparateBulletNarrowPhaseAndMidStepUpdates": "True", "DFFlagUsePGSSolverSpringConstantScale": "True", "DFFlagToolRequiresHandleProperty": "True", "FFlagPlayerScriptsNotArchivable": "True", "DFFlagClearAllChildrenUseDestroy": "True", "DFFlagMaxPlayersEnabled": "True", "DFFlagPreferredPlayersEnabled": "True", "DFFlagLocalHumanoidSoundsEnabled": "True", "DFFlagIncreaseSoundPositionClampLimit": "True", "DFFlagNameOcculsionIgnoreTransparent": "True", "DFFlagReconstructAssetUrlNew": "True", "DFFlagAdjustFloorForce": "True", "DFFlagFixAnimationPhaseInitialization": "True", "FFlagLuaChatPhoneFontSize": "True", "DFFlagUseAssetTypeHeader": "True", "FFlagCSGUnionCatchUnknownExceptions": "False", "FIntGamePerfMonitorPercentage": "10", "FFlagSoundTypeCheck": "True", "DFFlagIncreaseScrollWheelMultiplyTime": "True", "FFlagMacRemoveUserInputJob": "True", "FFlagStudioNewFonts": "True", "DFFlagApiCapitalizationChanges": "True", "FFlagParticleCullFix": "True", "DFFlagVideoCaptureTeleportFix": "False", "DFFlagCoreGuiCustomizationApi": "True", "DFFlagCustomTeleportLoadingScreen": "True", "DFFlagCharacterAppearanceLoadedEnabled": "True", "DFFlagVIPServerOwnerIdEnabled": "True", "DFFlagEnableParticleVelocityInheritance": "True", "DFFlagEnableParticleEmissionDirection": "True", "DFFlagFixParticleDistribution": "True", "DFFlagEnableParticleNewBoundingBox": "True", "DFFlagEnableParticlePartLock": "True", "DFFlagEnableParticleBurst": "True", "DFFlagNoRunSteepSlope": "True", "DFFlagHumanoidJumpPower": "True", "FFlagControllerMenu": "True", "FFlagFlyCamOnRenderStep": "True", "DFFlagFullscreenEnabledWhileRecording": "True", "DFFlagPreProcessTextBoxEvents": "True", "DFFlagAllowHideHudShortcut": "False", "DFFlagFixBallInsideBlockCollision": "True", "FFlagPGSSolverBodyCacheLeakFix": "True", "FFlagFixCrashAtShutdown": "True", "DFFlagEquipClonedToolFix": "True", "FFlagGamepadCursorChanges": "True", "DFFlagCreatePlayerGuiLocal": "False", "DFFlagDontUseInsertServiceOnAnimLoad": "True", "DFFlagCyclicExecutiveFixNonCyclicJobRun": "True", "DFFlagPhysicsFPSTimerFix": "True", "FFlagCyclicExecutiveRenderJobRunsFirst": "True", "FFlagPhysicsCylinders": "True", "DFFlagPhysicsUseNewBulletContact": "True", "FFlagReadCoordinateFrameFast": "False", "DFFlagRayHitMaterial": "True", "DFFlagPromptPurchaseOnGuestHandledInCoreScript": "True", "DFFlagNonEmptyPcallError": "True", "DFFlagDisplayTextBoxTextWhileTypingMobile": "False", "DFFlagOverrideScollingDisabledWhenRecalulateNeeded": "True", "DFFlagFixScrollingOffSurfaceGUIs": "True", "DFFlagTextScaleDontWrapInWords": "True", "DFFlagListenPositionEnabled": "True", "DFFlagBackTabInputInStudio": "True", "DFFlagTrackLastDownGUI": "True", "DFFlagBulletFixCacheReuse": "True", "DFFlagFastFilterHumanoidParts": "False", "DFFlagProcessAcceleratorsBeforeGUINaviagtion": "True", "DFFlagImageFailedToLoadContext": "True", "DFFlagDontReorderScreenGuisWhenDescendantRemoving": "True", "DFFlagSoundFailedToLoadContext": "True", "DFFlagAnimationFailedToLoadContext": "True", "DFFlagElasticEasingUseTwoPi": "True", "SFFlagNetworkUseServerScope": "True", "DFFlagHttpZeroLatencyCaching": "True", "DFFlagPasteWithCapsLockOn": "True", "DFFlagHttpCurlDomainTrimmingWithBaseURL": "False", "DFFlagLoadFileUseRegularHttp": "True", "DFFlagReplicatorCheckBadRebinding": "True", "FFlagFastClusterThrottleUpdateWaiting": "True", "DFFlagDeserializePacketThreadEnabled": "True", "FFlagFontSizeUseLargest": "True", "DFFlagRejectHashesInLinkedSource": "True", "FFlagUpdatePrimitiveStateForceSleep": "True", "FFlagPhysicsUseKDTreeForCSG": "True", "DFFlagCSGLeftoverDataFix": "True", "FFlagStudioTutorialSeeAll": "True", "DFFlagLimitScrollWheelMaxToHalfWindowSize": "True", "FFlagGameExplorerCopyPath": "True", "DFFlagFixRotatedHorizontalScrollBar": "True", "DFFlagFixAnchoredSeatingPosition": "True", "FFlagFixSlice9Scale": "True", "DFFlagFullscreenRefocusingFix": "True", "DFFlagEnableClimbingDirection": "True", "FFlagPGSGlueJoint": "True", "FFlagTweenCallbacksDuringRenderStep": "True", "FFlagFRMFixCullFlicker": "True", "DFFlagDisableProcessPacketsJobReschedule": "True", "FFlagCSGVoxelizerPrecompute": "False", "FFlagLazyRenderingCoordinateFrame": "True", "FFlagPGSSteppingMotorFix": "True", "DFFlagLockViolationScriptCrash": "False", "DFFlagLockViolationInstanceCrash": "False", "FFlagSpheresAllowedCustom": "True", "DFFlagHumanoidCookieRecursive": "True", "FFlagRwxFailReport": "True", "FIntStudioInsertDeletionCheckTimeMS": "30000", "DFFlagClampRocketThrustOnPGS": "True", "DFFlagPGSWakePrimitivesWithBodyMoverPropertyChanges": "True", "FFlagPGSUsesConstraintBasedBodyMovers": "True", "FFlagUseNewSubdomainsInCoreScripts": "True", "DFFlagEnableShowStatsLua": "True", "FFlagSmoothTerrainPacked": "True", "DFFlagUrlReconstructToAssetGame": "False", "FFlagPGSApplyImpulsesAtMidpoints": "True", "FFlagModifyDefaultMaterialProperties": "True", "FIntPhysicalPropFriction_SMOOTH_PLASTIC_MATERIAL": "200", "FIntPhysicalPropFriction_PLASTIC_MATERIAL": "300", "FIntPhysicalPropFriction_NEON_MATERIAL": "300", "FIntPhysicalPropFriction_SNOW_MATERIAL": "300", "FIntPhysicalPropFriction_ALUMINUM_MATERIAL": "400", "FIntPhysicalPropFriction_BRICK_MATERIAL": "800", "FIntPhysicalPropFriction_CONCRETE_MATERIAL": "700", "FIntPhysicalPropFriction_DIAMONDPLATE_MATERIAL": "350", "FIntPhysicalPropFriction_SANDSTONE_MATERIAL": "500", "FIntPhysicalPropFriction_SAND_MATERIAL": "500", "FIntPhysicalPropFWeight_ICE_MATERIAL": "3000", "FIntPhysicalPropFWeight_BRICK_MATERIAL": "300", "FIntPhysicalPropFWeight_CONCRETE_MATERIAL": "300", "FIntPhysicalPropFWeight_SANDSTONE_MATERIAL": "5000", "FIntPhysicalPropFWeight_BASALT_MATERIAL": "300", "FIntPhysicalPropFWeight_SAND_MATERIAL": "5000", "FIntPhysicalPropElasticity_SAND_MATERIAL": "50", "FIntPhysicalPropElasticity_SNOW_MATERIAL": "30", "FIntPhysicalPropElasticity_MUD_MATERIAL": "70", "FIntPhysicalPropElasticity_GROUND_MATERIAL": "100", "FIntPhysicalPropElasticity_MARBLE_MATERIAL": "170", "FIntPhysicalPropElasticity_BRICK_MATERIAL": "150", "FIntPhysicalPropElasticity_PEBBLE_MATERIAL": "170", "FIntPhysicalPropElasticity_COBBLESTONE_MATERIAL": "170", "FIntPhysicalPropElasticity_ROCK_MATERIAL": "170", "FIntPhysicalPropElasticity_SANDSTONE_MATERIAL": "150", "FIntPhysicalPropElasticity_BASALT_MATERIAL": "150", "FIntPhysicalPropElasticity_CRACKED_LAVA_MATERIAL": "150", "FIntPhysicalPropElasticity_FABRIC_MATERIAL": "50", "FIntPhysicalPropElasticity_WOOD_MATERIAL": "200", "FIntPhysicalPropElasticity_WOODPLANKS_MATERIAL": "200", "FIntPhysicalPropElasticity_ICE_MATERIAL": "150", "FIntPhysicalPropElasticity_GLACIER_MATERIAL": "150", "FIntPhysicalPropElasticity_RUST_MATERIAL": "200", "FIntPhysicalPropElasticity_DIAMONDPLATE_MATERIAL": "250", "FIntPhysicalPropElasticity_ALUMINUM_MATERIAL": "250", "FIntPhysicalPropElasticity_METAL_MATERIAL": "250", "FIntPhysicalPropElasticity_GRASS_MATERIAL": "100", "DFFlagFixSeatingWhileSitting": "True", "FFlagPGSSolverDefaultOnNewPlaces": "True", "FFlagPGSVariablePenetrationMargin": "False", "FIntPGSPentrationMarginMax": "50000", "FFlagStudioHideMouseCoursorOnCommand": "True", "SFFlagNewPhysicalPropertiesForcedOnAll": "True", "SFFlagMaterialPropertiesNewIsDefault": "True", "DFFlagMaterialPropertiesEnabled": "True", "FFlagWaterParams": "True", "FFlagSpatialHashMoreRoots": "True", "FFlagSkipAdornIfWorldIsNull": "True", "DFStringWorkspaceMessageLink": "http://discord.gg/4uN3tKX9v5", "DFStringWorkspaceMessageText": "Click here to join our Discord server!", "DFIntStudioWorkspaceNotificationLevel": "0", "DFFlagNetworkOwnershipRuleReplicates": "True", "DFFlagSmoothTerrainWriteVoxelsOccupancyFix": "True", "DFFlagCloudEditByPassCheckForServer": "True", "DFFlagDraggerUsesNewPartOnDuplicate": "True", "DFFlagRestoreTransparencyOnToolChange": "False", "FFlagEnableLuaFollowers": "False", "DFFlagUserServerFollowers": "True", "FFlagNetworkReplicateTerrainProperties": "True", "FFlagAllowInsertFreeModels": "True", "FFlagInsertUnderFolder": "True", "DFFlagPGSWakeOtherAssemblyForJoints": "True", "FFlagStudioPropertySliderEnabled": "True", "DFFlagSetNetworkOwnerFixAnchoring": "True", "FFlagFixBulletGJKOptimization": "True", "FFlagOSXUseSDL": "False", "DFFlagPhysicalPropMassCalcOnJoin": "False", "DFFlagBrickColorParseNonDeprecatedMatchEnabled": "True", "FFlagWindowsUseSDL": "False", "FFlagPhysicsOptimizeSendClumpChanged": "True", "DFFlagHumanoidFeetIsPlastic": "True", "DFFlagUseTerrainCustomPhysicalProperties": "True", "DFFlagFormFactorDeprecated": "False", "FFlagPGSVariablePenetrationMarginFix": "True", "DFIntDataStoreMaxValueSize": "262144", "DFFlagFixShapeChangeBug": "True", "FFlagScriptAnalyzerFixLocalScope": "True", "FFlagRenderVRBBGUI": "True", "FFlagRenderVR": "True", "DFFlagNetworkFixJoinDataItemOrder": "True", "FFlagStudioImproveModelDragFidelity": "True", "FFlagStudioOrthonormalizeSafeRotate": "True", "FFlagMacInferredCrashReporting": "True", "FFlagWindowsInferredCrashReporting": "True", "FFlagCloudEditDoNotLoadCoreScripts": "True", "FFlagStudioEmbeddedFindDialogEnabled": "True", "FFlagUserAllCamerasInLua": "False", "DFFlagMacInferredCrashReporting": "True", "DFFlagWindowsInferredCrashReporting": "True", "FFlagUseNewPromptEndHandling": "True", "FFlagPhysPropConstructFromMaterial": "True", "FFlagStudioToolboxModelDragToCastPoint": "True", "FFlagStudioPushTreeWidgetUpdatesToMainThread": "True", "DFFlagFixYieldThrottling": "True", "FFlagCheckSleepOptimization": "True", "DFFlagContactManagerOptimizedQueryExtents": "True", "FFlagUseBuildGenericGameUrl": "True", "DFFlagFixFallenPartsNotDeleted": "True", "DFFlagTrackPhysicalPropertiesGA": "True", "DFFlagSetNetworkOwnerFixAnchoring2": "True", "FFlagUseSimpleRapidJson": "True", "DFFlagTurnOffFakeEventsForCAS": "True", "DFFlagTurnOffFakeEventsForInputEvents": "True", "FFlagCancelPendingTextureLoads": "False", "DFFlagCachedPoseInitialized": "True", "DFFlagFixJumpGracePeriod": "True", "FFlagFilterSinglePass": "True", "DFFlagOrthonormalizeJointCoords": "True", "DFFlagPhysicsSenderUseOwnerTimestamp": "False", "DFFlagNamesOccludedAsDefault": "True", "FFlagUserUseNewControlScript": "True", "FFlagUseDynamicTypesetterUTF8": "True", "DFFlagUseNewPersistenceSubdomain": "True", "DFFlagUseNewDataStoreLogging": "True", "FFlagPlaceLauncherUsePOST": "False", "FFlagStudioUpdateSAResultsInUIThread": "True", "FFlagBillboardGuiVR": "True", "FFlagHumanoidRenderBillboard": "True", "FLogVR": "6", "FFlagStudioRemoveDebuggerResumeLock": "True", "FFlagAnalyzerGroupUIEnabled": "True", "DFFlagVariableHeartbeat": "True", "DFFlagScreenShotDuplicationFix": "True", "FFlagCSGDelayParentingOperationToEnd": "True", "FFlagStudioTreeWidgetCheckDeletingFlagWhenDoingUpdates": "True", "DFFlagUseComSiftUpdatedWebChatFilterParamsAndHeader": "False", "DFFlagConstructModerationFilterTextParamsAndHeadersUseLegacyFilterParams": "False", "FFlagMinMaxDistanceEnabled": "True", "FFlagRollOffModeEnabled": "True", "DFFlagGetLocalTeleportData": "True", "FFlagUseNewXboxLoginFlow": "True", "DFFlagFixSlowLadderClimb": "True", "DFFlagHumanoidCheckForNegatives": "True", "DFFlagFixMatrixToAxisAngle": "True", "DFFlagMaskWeightCleared": "True", "DFFlagUseStarterPlayerCharacterScripts": "True", "DFFlagUseStarterPlayerHumanoid": "True", "DFFlagAccessoriesAndAttachments": "True", "FFlagTeamCreateOptimizeRemoteSelection": "True", "FFlagReportInGameAssetSales": "True", "FFlagFilterDoublePass": "False", "DFFlagRaiseSendPriority": "False", "FFlagUsePreferredSoundDevice": "True", "FFlagRenderLowLatencyLoop": "False", "DFFlagLocalScriptSpawnPartAlwaysSetOwner": "True", "DFFlagCloudEditSupportImmediatePublish": "True", "FFlagFixSurfaceGuiGamepadNav": "True", "DFFlagEnableAdColony": "False", "FFlagEnableAdServiceVideoAds": "False", "DFFlagInfluxDb09Enabled": "True", "DFFlagTeleportSignalConnectOnServiceProvider": "True", "DFFlagScriptContextGuardAgainstCStackOverflow": "True", "FFlagFixPhysicalPropertiesComponentSet": "True", "DFFlagMaterialPropertiesDivideByZeroWeights": "True", "FFlagRemoveUnusedPhysicsSenders": "True", "FFlagRemoveInterpolationReciever": "True", "DFFlagActivatePGSMechanicalJoints": "True", "FIntPhysicalPropDensity_ALUMINUM_MATERIAL": "2700", "FFlagTreatCloudEditAsEditGameMode": "True", "FFlagSendFilteredExceptionOnInferredStep": "True", "DFFlagUrlReconstructToAssetGameSecure": "False", "DFFlagUseModerationFilterTextV2": "True", "FFlagGraphicsD3D10": "True", "FFlagRenderFixFog": "True", "FFlagUseNewAppBridgeWindows": "True", "DFFlagNullCheckJointStepWithNullPrim": "True", "FFlagJNIEnvScopeOptimization": "True", "DFFlagSanitizeLoadingGUICorrected": "True", "FFlagSendLegacyMachineConfigInfo": "False", "FFlagUseNewBadgesCreatePage": "True", "FFlagRetryWhenCloudEditEnabledEndpointFails": "True", "DFFlagTeamCreateDoNotReplicateShowDevGuiProp": "True", "FFlagStudioAddBackoffToNotificationsReconnects": "True", "DFFlagInsertServiceForceLocalInTeamCreate": "True", "FFlagGraphicsMacFix": "True", "FFlagUseNewAppBridgeOSX": "True", "FFlagNewColor3Functions": "True", "DFFlagSmootherVehicleSeatControlSystem": "True", "FFlagGameExplorerUseV2AliasEndpoint": "True", "FFlagDisableAbortRender": "True", "DFFlagInstancePredeleteNuke": "True", "DFFlagSimpleHermiteSplineInterpolate": "False", "DFFlagCleanUpInterpolationTimestamps": "True", "SFFlagPhysicsPacketSendWorldStepTimestamp": "True", "DFFlagUpdateTimeOnDelayedSamples": "False", "DFFlagDisableMovementHistory": "True", "DFFlagLookForDuplicateCoordinateFrameInBuffer": "True", "DFFlagDoNotForwardClientTimestamp": "True", "DFFlagZeroVelocityOnDelayedSamples": "True", "DFFlagUpdateHermiteLastFrameWhenUpdatePrevFrame": "True", "DFFlagCatchThrottledVelocityComponents": "True", "DFIntThrottledVelocityThresholdTenths": "15", "DFFlagShowFormFactorDeprecatedWarning": "False", "FFlagStudioTeamCreateWebChatBackendEnabled": "True", "DFFlagAnimationEasingStylesEnabled": "True", "FFlagUseVRKeyboardInLua": "True", "DFFlagCheckDataModelOnTeleportRetry": "True", "DFStringHttpInfluxWriterPassword": "faster1Play", "DFFlagOptimizeAnimator": "True", "FFlagOptimizeAnimatorCalcJoints": "True", "DFFlagStopUsingMaskWeight": "True", "FFlagRenderNoDepthLast": "True", "DFFlagFixTimeStampsForRunningNoThrottle": "True", "DFIntInterpolationDelayFactorTenths": "10", "DFFlagUseHermiteSplineInterpolation": "True", "DFFlagChatServiceFilterStringForPlayerFromAndToStudioBypass": "True", "FFlagCameraInterpolateMethodEnhancement": "False", "DFFlagBlendPosesWithIsOver": "True", "FFlagRestrictSales": "True", "FFlagBadTypeOnPcallEnabled": "True", "FFlagFixMouseFireOnEmulatingTouch": "True", "FFlagUseUpdatedSyntaxHighlighting": "True", "FFlagFixStickyDragBelowOrigin": "True", "FFlagFixBadMemoryOnStreamingGarbageCollection": "True", "DFFlagFixAllCharacterStreaming": "True", "FFlagDisableChangedServiceInTestMode": "True", "FFlagAllowFullColorSequences": "True", "FFlagStudioAllowFullColorSequences": "True", "DFFlagDynamicGravity": "True", "FFlagUseNewAppBridgeAndroid": "True", "FFlagFixSurfaceGuiGazeSelect": "True", "FFlagFixAlwaysOnTopSurfaceGuiInput": "True", "DFFlagCSGPreventCrashesWhenPartOperationsNotInDataModel": "True", "DFFlagUsePointsNewBatchingImpl": "True", "FFlagUseUpdatedKeyboardSettings": "False", "DFFlagFixAnimationControllerAnimator": "True", "DFFlagNoAnimationTrackState": "True", "DFFlagFixNestedAnimators": "True", "DFFlagWaitForToolHandleToEquip": "True", "DFFlagUseNewFetchFriendsFunction": "True", "FFlagWindowsNoDmpRetry": "False", "FFlagDeleteLogsOnMac": "True", "FFlagDeleteLogsByDate": "True", "FFlagTestMenuEnabledOnAllWindows": "True", "FFlagSoundServiceGameConfigurerConfigureRunServiceRun": "True", "DFFlagDoUpdateStepDetachedChannels": "True", "FFlagSoundChannelMaxDistanceStopFMODChannel": "True", "FFlagRenderSoftParticles": "True", "FFlagScriptContextSinglePendingThreadsQueue": "False", "DFIntTeleportExceptionInfluxHundredthsPercentage": "9000", "FIntStartupInfluxHundredthsPercentage": "100", "FFlagCSGAllowUnorderedProperties": "False", "DFFlagGamepadProcessMouseEvents": "False", "DFFlagCrashTouchTransmitterIfRefDtor": "False", "FFlagRenderUserGuiIn3DSpace": "True", "FFlagScreenGuisClipDescendants": "True", "FFlagUseNewNotificationPathLua": "True", "FFlagVideoDocumentationPluginEnabled": "True", "FFlagStudioBreakOnInfiniteLoops": "True", "FFlagMessageOnLoadScriptValidationFail": "True", "FFlagStudioMockPurchasesEnabled": "True", "FFlagStudioUseMarketplaceApiClient": "True", "DFFlagUseGameAvatarTypeEnum": "False", "FFlagStudioUsePlaySoloConfigurer": "True", "DFFlagUseAvatarFetchAPI": "False", "DFFlagSetHumanoidRegardlessOfNetworkOwnership": "True", "FFlagFixStudioCursorJitter": "True", "FFlagVoxelCompressedStorage": "True", "FFlagSmoothTerrainLODEnabled": "True", "FFlagBetterTabManagement": "True", "DFFlagBlockCustomHttpHeaders": "False", "FFlagStudioInsertAtTopCenterOfSelection": "True", "DFFlagCloudEditRemoveEditorOnPlayerRemove": "True", "FFlagWaitForChildTimeOut": "True", "FFlagDeviceEmulationStatistics": "True", "FFlagFixBoxSelectWithCtrl": "True", "FFlagStudioTrimPropertyWhitespace": "True", "FFlagDebugCSGExportFailure": "False", "FFlagFixCrashOnEmptyTextOnAutoComplete": "True", "FFlagCancelInputOnGuiNavigation": "True", "FFlagRemoveOldAnalyticsImplementation": "True", "FFlagRemoveOldCountersImplementation": "True", "FFlagUseNewAppBridgeStudio": "True", "FFlagStudioAnalyticsRefactoring": "True", "DFFlagRCCUseMarketplaceApiClient": "False", "FFlagStudioIntellesenseOnAllMembersEnabled": "True", "DFFlagDataStoreDisableReFetchingRecentKeys": "True", "FFlagNewDefaultScriptSource": "True", "FFlagStudioEnableDebuggerPerfImprovements": "True", "FFlagRecordForceStereo": "True", "FFlagStudioVideoRecordFix": "True", "FFlagStudioUseHttpsForUserInfo": "True", "FFlagUseHttpsForGameserverAshx": "True", "FFlagDisableScriptContextScriptsDisabled": "True", "DFFlagDuplicateInstanceReferenceFix": "True", "FFlagRakNetSupportIpV6": "False", "FFlagUseToStringN": "True", "FFlagStudioRenderRemotePlayerSelection": "True", "FFlagStackTraceLinks": "True", "FFlagStudioUpdateRestoreBehavior": "True", "FFlagTouchTransmitterWeakPtr": "True", "FFlagAdvancedRCCLoadFMODRetry": "True", "FFlagAdvancedRCCLoadFMODReportDeviceInfo": "True", "FFlagAdvancedRCCLoadFMODAttemptReportDeviceInfoOnFailure": "True", "FFlagClientLoadFMODReportDeviceInfo": "True", "DFIntReportDeviceInfoRate": "100", "DFFlagSoundV2LogOnSetSoundId": "True", "FFlagMouseUseUserInputServiceMouse": "True", "SFFlagSoundChannelUseV2Implementation": "True", "SFFlagUseNewSetFMOD3D": "True", "FFlagCSGReportSuccessFailure": "True", "FFlagUseAvatarFetchThumbnailLogic": "True", "FFlagDoIncrementalLoadingForR6AvatarFetch": "True", "FFlagUseAvatarFetchAPI": "True", "FFlagUseGameAvatarTypeEnum": "True", "FFlagSmoothTerrainLODFalseCoarseNeighbor": "True", "FFlagStudioPublishToRobloxActionUXAlwaysAvailable": "True", "FFlagFixArraysNotUnmarkedFromCyclicTableDetection": "True", "FFlagSoundIgnoreReplicatorJoinDataItemCache": "True", "FFlagStudioReportCachedRecentActions": "True", "FFlagStudioCacheRecentAction": "True", "FFlagRenderMeshReturnsCorrectly": "False", "FFlagEnableRenderCSGTrianglesDebug": "False", "FFlagStudioBreakOnInfiniteLoopsThreadingFixEnabled": "True", "SFFlagNetworkStreamRotationAsFloat": "False", "DFFlagStarterGuiMethodsWarnServer": "True", "DFFlagStarterGuiPropertiesReplicate": "True", "DFFlagClickDetectorReplicate": "True", "FFlagTeleportDetailedInfluxHttpStatusError": "True", "DFFlagHttpStatusCodeErrorIncludeBody": "True", "FFlagEnableVoiceASR": "False", "DFFlagFMODSetAccurateTime": "True", "FFlagRenderFixGuiOrder": "True", "FFlagExplosionsVisiblePropertyEnabled": "True", "FFlagEnableVoiceRecording": "False", "FFlagStudioReopenClosedTabsShortcut": "True", "FFlagStudioShowNotSavingScriptEditsOnce": "True", "FFlagHttpCurlCacheHandles": "True", "DFFlagAvatarFetchCanLoadCharacterAppearanceFix": "True", "FFlagGraphicsTextureCommitChanges": "False", "DFFlagLoadInstancesAsyncUseDataModelTasks": "False", "DFFlagInfluxOverUDP": "True", "FFlagUseLegacyEnumItemLookup": "True", "DFFlagInfluxOverTCP": "False", "DFFlagCFrameRightAndUpVectors": "True", "DFFlagLegacyBodyColorsOnCharacterLoadFailure": "True", "DFFlagUseMeshPartR15": "True", "FFlagStudioFixLockingScriptDisablesMenuOptions": "True", "FFlagUseCorrectDoppler": "True", "DFFlagFixJumpRequestOnLand": "True", "DFFlagNullStarterCharacterPrimaryPartFix": "True", "SFFlagR15CompositingEnabled": "True", "FFlagStudioFixPropertiesWindowScrollBarNotShowing": "True", "FFlagFixCollisionFidelityTeamCreate": "True", "DFFlagSendHttpBodyOnFailure": "True", "DFFlagCSGPreventNoContextCSGCrashes": "False", "FFlagConstraintPropertyReplicationRaceConditionFixEnabled": "True", "FFlagFixLogCulling": "True", "FFlagSmoothTerrainLODFixSeams": "True", "DFFlagDontCacheHumanoids": "True", "FFlagStudioPlaySoloConfigurerLegacyPlayerName": "True", "DFFlagPartForRegion3NoMaxLimit": "True", "FFlagRCCSupportTeamTest": "True", "FFlagStudioSupportBytecodeDeserialize": "True", "DFFlagStackTraceHasNewLines": "True", "DFFlagCleanCacheMoveMutex": "True", "FFlagFastFontMeasure": "False", "FFlagRenderMoreFonts": "True", "FFlagCleanFilteringEnabledLocalSpawnParts": "True", "FFlagFetchJoinScriptWithHttp": "False", "FFlagCheckPlayerProcessMutexCreation": "True", "FFlagCheckRegisterSoundChannelUniqueness": "True", "FFlagUseCommonModules": "True", "DFFlagRemoteFixDisconnectedPlayer": "True", "FFlagWarnForLegacyTerrain": "True", "FFlagFastClusterDisableReuse": "True", "FFlagStudioRespectMeshOffset": "False", "DFFlagRevisedClientJoinMetrics": "True", "FFlagRestoreScriptSourceWhenRedoingScriptCreation": "True", "DFFlagStudioFixPastingDecalsIntoMultiple": "True", "FFlagMeshPartMaterialTextureSupport": "True", "FFlagStudioPlaySoloCharacterAutoLoadsNullTool": "True", "DFFlagPGSWakeOtherIfOneAssemblyIsAwake": "False", "DFFlagFixR15BodyPhysics": "True", "FFlagLoadCharacterSoundFromCorescriptsRepo": "True", "DFFlagSoundV2LoadUseParamContext": "True", "DFFlagSoundV2LoadedRunCallbacks": "True", "FFlagFixPlayerProcessMutexDeadlock": "True", "FFlagImprovedJoinScriptFlow": "True", "FFlagRCCLoadFMOD": "True", "FFlagStudioDeadCodeOnMouseDown": "True", "DFFlagFireCharacterAddedAfterSpawn": "False", "FFlagChatVisiblePropertyEnabled": "True", "FFlagChatLayoutChange": "False", "FFlagCorescriptNewLoadChat": "True", "DFLogLuaTypeErrors": "4", "DFFlagLuaInstanceBridgeNewCamelCaseFixerEnabled": "True", "FFlagConstraintUIEnabled": "True", "FFlagStudioSetObjectsFromPropertiesWindow": "True", "FFlagStudioPromptWhenInsertingConstraints": "True", "DFFlagFixExperimentalSolverSetter": "True", "DFFlagShowRedForAutoJointsForPartsWithConstraint": "True", "FFlagTrackOriginalClientID": "True", "FFlagStudioHiddenPropertyCrashFixEnabled": "True", "FFlagStudioPropertyChangedSignalHandlerFix": "True", "FFlagStudioScriptAnalysisGetOrCreateRefactoring": "True", "DFFlagAllowHttpServiceInTeamCreate": "True", "DFFlagAllowRequireByAssetIdInTeamCreate": "True", "DFFlagLuaSignalCamelCaseAPI": "True", "FFlagFixLogManagerWritingToTempDir": "True", "FFlagTrackModuleScripts": "True", "FFlagUserJumpButtonPositionChange": "True", "FFlagLoadCommonModules": "True", "FFlagMouseCommandChangedSignalEnabled": "True", "DFIntInfluxTattletalePerUserHundredthsPercent": "1", "DFIntInfluxTattletalePerEventHundredthsPercent": "2000", "DFIntInfluxTattletaleCooldownSeconds": "300", "DFFlagSendHttpInfluxDatabaseField": "True", "FFlagGraphicsD3D11HandleDeviceRemoved": "True", "FFlagFixPlayerProcessMutexDeadlockForReal": "True", "FFlagNetworkKeepItemPools": "True", "FLogNetworkItemQueueDtor": "1", "FFlagFixLoadingScreenAngle": "False", "FFlagFixStudioInGamePaste": "True", "FFlagStudioSetViewportSizeOfClone": "True", "FFlagStudioTreeWidgetPotentialMemoryLeak": "True", "FFlagStudioEnableLayersForNSView": "True", "FFlagEnableViewportScaling": "True", "FFlagStudioDisableScrollingOnEarlyMac": "True", "FFlagPerformanceStatsCollectionEnabled": "True", "FFlagStudioStopSoundPlaybackAfterRemoval": "True", "FFlagStudioAllowSoundDraggingFromToolbox": "True", "FFlagStudioRelocateSoundJob": "True", "FFlagLuaDebugProfileEnabled": "True", "FFlagRemoveSoundServiceSoundDisabledProperty": "True", "FFlagRecordInGameDeaths": "False", "FFlagStudio3DGridUseAALines": "False", "FFlagFixIsCurrentlyVisibleSurfaceGuis": "True", "FFlagSurfaceGuiObjectEnabledCheck": "True", "FStringPlaceFilter_InterpolationAwareTargetTime": "True;249779150;333368740;444708274;64542766;248207867;171391948;360589910;388599755;163865146;127243303;162537373;6597705;332248116;348681325;196235086;13822889;189707", "DFFlagUseR15Character3": "True", "DFFlagAllowCustomR15Character": "True", "DFFlagFixDoubleJointR15Character": "True", "DFFlagFixR15SphereHead": "False", "DFFlagUseR15SwimFreestyle": "True", "DFFlagFixBodyColorsR15": "True", "DFFlagPlayerDescendantsDeleteOnDisconnectOff": "True", "DFFlagSpringConstraintInGameAdornFixEnabled": "True", "DFFlagDontPrintMalformedUrls": "True", "DFFlagUseMultiFormatCharacterAppearanceLoading": "True", "FFlagStudioFlycamAppBridgeFix": "True", "FFlagAllowCopyUnArchivableObjects": "True", "FFlagStudioReduceTeamCreateStuttering": "True", "DFFlagPGSSolverUsesIslandizableCode": "True", "DFFlagResetScreenGuiEnabled": "True", "FFlagGraphicsD3DPointOne": "True", "FFlagGraphicsNoMainDepth": "True", "FFlagCollectClientIDUpdateStatistics": "True", "FFlagStudioFixTestApis": "True", "FFlagAllowInsertConstrainedValuesAnywhere": "True", "FFlagStudioResizeMeshPartOnImport": "True", "FFlagStudioReportVitalParameters": "True", "FFlagSoundGroupsAndEffectsEnabled": "True", "FFlagSoundscapeReplicateChildren": "True", "FFlagLoadCorescriptsPlatformDefMode": "True", "FFlagEnableGetHitWhitelist": "True", "FFlagStudioUpdatePropertiesWithoutJob": "True", "FFlagOverrideTypeFunction": "True", "DFFlagEnableBindToClose": "True", "FFlagStudioFixUndeletingSoundCausesPlayback": "True", "FFlagServerSenderDontSendInterpolatedPhysics": "False", "FFlagGraphicsD3D9ComputeIndexRange": "True", "FFlagCrashOnScriptCloseFixEnabled": "True", "FFlagShowCoreGUIInExplorer": "True", "FFlagStudioUseServerConfigurer": "True", "FFlagUDim2LerpEnabled": "True", "FFlagDisableLayersForNSViewOnEarlyMac": "True", "FFlagStudioCorrectForRetinaScreensOnEarlyMac": "True", "FFlagStudioConsistentGuiInitalisation": "True", "FFlagStudioSanitizeInstancesOnLoad": "True", "FFlagStudioOnlyUpdateTeamTestActionsIfChanged": "True", "FFlagChatServiceReplicates": "True", "DFFlagICMPPingHundrethsPercentage": "100", "DFFlagUsePasiveOnlyForBind": "False", "DFFlagFavorIPV4Connections": "False", "DFFlagUsegetFamilyandMapAddress": "False", "FFlagBetterPlaceLauncherStatusHandling": "True", "FStringPlaceFilter_NewLayoutAndConstraintsEnabled": "True;534842009;20213796;379132413;485971234;515782100;248207867;360699282;498699944;540764930;534808604;520456996;552894983;551169796;560164377;599021441;609763195;609918169;599392478;614429353;337448601;615210477;606827239;19481228;19827397;26953764;561540866;20397851;626302497;402593749;589006000;461274216;129419469;478459751;460710135;464914388;481987774;610775332;567211827;636396993", "FFlagInformClientInsertFiltering": "True", "FStringClientInsertFilterMoreInfoUrl": "http://devforum.roblox.com/t/coming-changes-to-insert-service/30327", "FFlagSoundChannelOnAncestorChangedUseGameLaunchIntent": "True", "DFFlagAllowResetButtonCustomization": "True", "FFlagTattletaleFixTextValue": "True", "DFIntInfluxTattletaleInstancePathMaxLength": "200", "DFFlagFixRetriesExhaustedHandling": "True", "DFFlagBetterGetPlayerPlaceInstanceError": "True", "DFFlagCharacterScriptsLoadingRefactor": "True", "FFlagStudioPropertyWidgetRemoveUpdateEvents": "True", "FFlagStudioUserNotificationIgnoreSequenceNumber": "True", "FFlagStudioOnlyOneToolboxPreviewAtATime": "True", "FFlagStudioFixPauseDuringLoad": "True", "DFFlagStudioUseNewActiveToolEffect": "True", "FFlagGraphicsD3D11PickAdapter": "True", "FFlagChatFilterWorksLocally": "True", "FFlagFilterMessageWithCallbackNoTryCatch": "True", "FStringPlaceFilter_SetPhysicsToLastRealStateWhenBecomingOwner": "True;13822889;189707", "FFlagMetaliOS": "True", "FFlagUseNewAppBridgeIOS": "True", "FFlagTextBoundRespectTextScaled": "True", "FFlagRenderFastResolve": "True", "DFFlagLoadingGuiTeleportCrashFix": "True", "FFlagPluginSaveSelection": "True", "FFlagHandleSoundPreviewWidgetWithNoSelectedSound": "True", "FFlagDontSwallowInputForStudioShortcuts": "True", "FFlagStudioFireStickyMouseCommandChangedOnly": "True", "FFlagStudioDisableEditingCurrentEditor": "True", "FFlagFixCorruptionInLogFiles": "True", "FFlagStudioLockScriptsWithoutBlocking": "True", "FFlagSetPhysicsToLastRealStateWhenBecomingOwner": "True", "FFlagInterpolationAwareTargetTime": "True", "DFFlagServerSenderDontSendInterpolatedPhysics": "True", "FFlagSyncRenderingAndPhysicsInterpolation": "True", "DFIntTargetTimeDelayFacctorTenths": "20", "FFlagNewIncomingPhysicsManagement": "True", "DFFlagGetAssetIdsFromPackageAPI": "True", "DFFlagGoodbyeChoiceActiveProperty": "True", "FFlagAllowResizeRenderBufferiOS": "True", "FIntEnableAvatarEditoriOS": "100", "FIntEnableAvatarEditorAndroid": "1", "FIntAvatarEditorAndroidRollout": "1", "DFFlagFixScaledR15Physics": "True", "DFFlagScaleR15Character": "True" } ) +}) + +router.get(["/v1/settings/application"], (req, res) => { + return res.json({"applicationSettings":{"DFFlagRCCKickDuplicatePlayersOnJoin":"True","FFlagRCCKickDuplicatePlayersOnJoin":"True","DFFlagDebugAllowLocalRccKicks":"True","FFlagDebugLocalRccServerConnection":"False","FFlagChinaLicensingApp":"False","FFlagShowConnectionErrorCode":"True","FFlagCoreScriptFasterCreate":"True","FFlagLocalizeErrorCodeString":"False","DFFlagAccoutrementWeldingFilteringEnabled":"False","DFFlagAddOSToPlayerInfoTable":"True","DFFlagAddSoundEnabledInitializationParam":"True","DFFlagAddStreamingAndResourceUsageUrlParams":"True","DFFlagAllowJoinsToWait":"True","DFFlagAllowPackageLinkAncestoryClone":"True","DFFlagAnalyticsCDNProbeOnlyQueryOneHost":"True","DFFlagAnalyticsReportHttpStatsAtExit":"True","DFFlagAnalyticsServiceMonitoring":"True","DFFlagAnimationLoadSimplification":"False","DFFlagAnimationLoadSimplification2":"True","DFFlagAnimatorOnSteppedKeepAlive":"True","DFFlagAssumeNoBreakableJoints":"True","DFFlagAttemptFixXBoxCrash":"True","DFFlagAvoidResetCurrentRegion4":"True","DFFlagBatchApiAssetArchiving":"False","DFFlagBatchAssetApiNoFallbackOnFail":"True","DFFlagBatchAssetApiTrackFailedUrls2":"True","DFFlagBetterTimeStamp":"True","DFFlagBetterTypeErrors":"True","DFFlagCSGMeshDeserializationFix":"True","DFFlagCSGMeshLevelOfDetailV2_PlaceFilter":"True;2434889832;2568147212","DFFlagCSGMeshLevelOfDetail_Fix2":"True","DFFlagCSGMeshV4DeserializerEnabled":"True","DFFlagCSGv2SkipDegenerateTriangles":"True","DFFlagCSGv2StatisticsFix":"True","DFFlagCSGv2UseMegaAssetFetcher":"True","DFFlagCSGv2UsePositionClustering":"True","DFFlagCacheAverageClientPing":"True","DFFlagCacheInAssemblyForSending":"True","DFFlagCatchCharacterLoadingErrors":"True","DFFlagCheckCoreLocalizationLoading":"True","DFFlagCheckForNullSoundChannel":"True","DFFlagCheckForNullWhenCloningInstances":"True","DFFlagCheckGameValidityInDoTeleport":"True","DFFlagCheckMultipleLoadCharacterCalls":"True","DFFlagCheckPVDifferencesForInterpolationChoice":"True","DFFlagClampPitch2":"True","DFFlagCleanCacheMoveMutex":"True","DFFlagClearUnusedLuaRefsWithJob":"True","DFFlagClientHappyNewYear1":"True","DFFlagClientJoinProcessToEventIngest":"True","DFFlagCloudTablesEnforceAccountAge":"True","DFFlagCloudTablesPhase2_AddCloudTableToListOnCreate":"True","DFFlagCloudTablesPhase2_CreateTableEarly":"True","DFFlagCloudTablesPhase2_IgnoreEmptyManifestReport":"True","DFFlagCloudTablesPhase2_MissingSourceTextScraperFix":"True","DFFlagCloudTablesPhase2_TrackLocaleFetchCallsites":"True","DFFlagCloudTablesPhase2_WaitForSourceFix":"True","DFFlagCollectSoundInfo":"True","DFFlagContactManifoldCountReportingEnabled":"True","DFFlagContentProviderAssetdeliveryRolloutEnabled2":"True","DFFlagContentProviderUseLambdas":"True","DFFlagDarwinIncludeMemReusable":"True","DFFlagDataModelSetAnalyticsDatacenterId":"True","DFFlagDataStoreAutoHttpRetry":"False","DFFlagDataStoreDontTouchCachedRecordOnGetAsync":"True","DFFlagDebugAnalyticsForXBoxCrash":"True","DFFlagDebugAnalyticsForXBoxCrashOnSuccessAlso":"True","DFFlagDebugEnableRemoteProfiling2":"True","DFFlagDebugGAReportThrottledSessions":"True","DFFlagDebugLaunchTimeByCountryPlaceSpecific_PlaceFilter":"true;189707","DFFlagDebugReportSoundAssetsFromList":"True","DFFlagDeleteEventInvocationArgsSerially":"True","DFFlagDidNotEatPizzaToday":"True","DFFlagDoNotInvalidateMe":"True","DFFlagDoNotRepositionSeated":"True","DFFlagDoNotRunAnimationEditorInPlayMode":"True","DFFlagDoParallelInterpolationFixUnguardedBufferClear":"True","DFFlagDoParallelInterpolationSetPV2":"True","DFFlagDontCallOnMovingAssemblyRoot":"False","DFFlagDontWhitelistUserInputConnectionCounts":"True","DFFlagDynamicFastVariableSupportFileSource":"True","DFFlagDynamicLocalizationTablesNonBlocking2":"True","DFFlagDynamicReloaderDoWork":"True","DFFlagEmoteLoadingEnabled":"True","DFFlagEmotesApiEnabled":"True","DFFlagEnableFillCylinder":"True","DFFlagEnableMeshHeadAttachments":"True","DFFlagEnableMeshHeadNative":"True","DFFlagEnableMessagingService":"True","DFFlagEnableMessagingServiceAnalysis":"True","DFFlagEnablePlayFabBatchEventCompression":"False","DFFlagEnablePrintJoinSizeBreakdown":"True","DFFlagEnableWakingPGSJointsForNonSolverPrimitives":"True","DFFlagEnforceSlaveStateEnabledStatus":"True","DFFlagEvenBetterTimeStamp":"True","DFFlagExternalWakeOtherAssembly2":"False","DFFlagFasterResetRoot":"True","DFFlagFasterVectorIndex":"True","DFFlagFileSystemReadDirFix":"True","DFFlagFileWatcherMultipleEventPerUpdateCall":"True","DFFlagFireHealthChangedLater":"True","DFFlagFixCLI28389":"True","DFFlagFixCharacterAppearanceLoadedEvent2":"True","DFFlagFixDataStoreWarningKeyEmpty":"True","DFFlagFixEmotesInventoryOverwrite":"True","DFFlagFixEquipToolAssertWhenHumanoidNotInDataModel":"True","DFFlagFixExtractFirstLOD":"True","DFFlagFixInvalidateCache":"True","DFFlagFixManualJointAdornCrash":"False","DFFlagFixMasslessInertiaContribution":"True","DFFlagFixMeshNormalsForNonUniformScaling":"True","DFFlagFixMoveToSlowAfterAnalogControls":"True","DFFlagFixNewTriangleMeshCreation":"True","DFFlagFixPVSpaceTransform":"True","DFFlagFixReadCache":"True","DFFlagFixRootPartCollisionForR6":"True","DFFlagFixSetupAnimationWeights":"True","DFFlagFixSpawningPerformanceAndInaccuracies":"True","DFFlagFixThrottlingCalculationForRot":"True","DFFlagFixTimeConversion":"True","DFFlagForwardRefCheckMegaReplicator":"True","DFFlagGenericPublicKeyIndex2":"True","DFFlagGetAutoTranslationEntriesEnabled2":"True","DFFlagGetBundleDetailsAPI":"True","DFFlagGetCountryRegionForPlayerAsyncEnabled":"True","DFFlagGetPolicyInfoForPlayerAsyncEnabled":"True","DFFlagGetTeamLazyEvaluation":"True","DFFlagGetTranslatorForLocaleAsyncEnabled2":"True","DFFlagGroupTeleportAddTeleportIdParameter":"True","DFFlagGroupTeleportJoinDataOverWrite":"True","DFFlagHoldTrottleValue":"True","DFFlagHttpAssetArchiveWarning":"False","DFFlagHttpBatchApiSupportAssetdeliveryInputUrls":"True","DFFlagHttpBatchCompress":"True","DFFlagHttpCacheAsync":"True","DFFlagHttpCacheCleanupNew":"True","DFFlagHttpCacheMissingRedirects":"True","DFFlagHttpClientCleanTimedCallbacks":"True","DFFlagHttpClientDisabledSkipCache":"True","DFFlagHttpErrMessageFix":"True","DFFlagHttpErrorNestingFix":"True","DFFlagHttpMarkExternalRequests":"True","DFFlagHttpStatisticsFix":"True","DFFlagHttpTcpKeepalive":"True","DFFlagHumanoidWithPGSConstraintsUsePhysicsState":"True","DFFlagInWithTheNew_PlaceFilter":"true;1034242130;2528277338","DFFlagInventoryFetchUseInventoryApi":"True","DFFlagJoinDataCacheChecksClientOwnedParts":"True","DFFlagJsonParsePrimitives":"True","DFFlagLDLPGSStatsEnabled":"True","DFFlagLetTouchFlush":"True","DFFlagLinkedSourceLoadSimplification":"True","DFFlagLocServiceTrackPlayerTextScraping1":"True","DFFlagLocService_InvalidateTranslationsOnChildAdded":"True","DFFlagLocTableNormalizeLocaleAttemptTranslation":"True","DFFlagLocalizationLanguageDelimiterFix":"True","DFFlagLockTheftInstanceCrash":"True","DFFlagLogMemoryStatsOnCompressionError":"True","DFFlagLuaTableMove":"True","DFFlagLuauFixFenv":"True","DFFlagMechanismInterpolationLikesLocalSpace":"True","DFFlagMegaReplicatorOnlyTrackReplicatableProperties":"True","DFFlagMegaReplicatorOptimizePendingNewInstanceItemTracking":"True","DFFlagMessagingServiceFixErrorMessage":"True","DFFlagMessagingServiceFixUnsubscribeTwiceOnClose":"True","DFFlagMessagingServiceForTest":"True","DFFlagMessagingServiceSentUtcTime2":"True","DFFlagMessagingServiceSuggestedErrorMessage":"True","DFFlagMessagingServiceTopicEmptyChecking":"True","DFFlagMiscIndividualAssetRequestUseAssetdelivery2":"True","DFFlagMoreWeldRestrictions":"False","DFFlagMoveAssetFetchEndpointToAssetDelivery":"True","DFFlagMoveAudioDeviceReporting":"True","DFFlagMpsRateLimit":"True","DFFlagMpsRateLimitReport":"True","DFFlagMpsRateLimitReport_PlaceFilter":"false;370731277","DFFlagMpsRateLimitWarn":"True","DFFlagNPCUnequipTools":"True","DFFlagNamesOccludedAsDefault":"True","DFFlagNavigationServiceAnalytics":"True","DFFlagNetworkParallelPhysicsOut":"True","DFFlagNewRejoinMessage_PlaceFilter":"True;1034242130;2528277338","DFFlagNewShowStreamedRegionDiag":"True","DFFlagNewSortAndFilter":"True","DFFlagNoFaceHeadMeshTagR6":"True","DFFlagNoInfiniteLoopOnChatInfoLoadFailure":"True","DFFlagNoMoreSinglePhysicsSenderJob":"True","DFFlagNoStringDump":"True","DFFlagNoYieldCaptured":"True","DFFlagNonBlockingAnalyticsExit":"True","DFFlagOnlyFireHealthChangedWhenHealthChanges":"True","DFFlagOwnershipDistributionCheckIgnoredJoint":"True","DFFlagPGSSolverSimIslandsEnabled2":"True","DFFlagPGSWakeOtherAssemblyForJoints":"True","DFFlagPGSWakeOtherIfOneAssemblyIsAwake":"False","DFFlagPLTIGetLocaleFallback":"True","DFFlagPackageMoveModificationToRCCStage3":"True","DFFlagPackageMoveModificationToRCCStage4":"True","DFFlagPackageMoveModificationToRCCStage5":"True","DFFlagParallelCollisionDoNothingFaster":"True","DFFlagParallelCollisions2":"True","DFFlagParallelCollisionsUseBetterGImpactCaching":"True","DFFlagParameterizeHandlerNamedParameterEnabled":"True","DFFlagParameterizeHandlerPureUsernameFix":"True","DFFlagParameterizeInThread":"True","DFFlagPreloadAsyncCallbackFunction":"True","DFFlagPreventLuaFunctionMigration":"True","DFFlagProfileAvoidRecordingEmptyFrames":"False","DFFlagRaiseCorrectException":"True","DFFlagRbxFormatMultiByteSizeFix":"True","DFFlagRccDoNotSetZeroPlaceIdFilter":"True","DFFlagRccUseHttpRequestForPlaceFetch":"True","DFFlagReduceSendDataCriticalSection":"True","DFFlagReduceTrussSearchDistance2":"False","DFFlagRejectRebelReceipt":"True","DFFlagRemovePrepareInstancesLocks":"True","DFFlagRemoveRedundantQueryParams":"True","DFFlagReplicatorCollectItemCountOnSend":"True","DFFlagReplicatorJDIOnlyUpdateCacheWhenParentIsUpToDate":"True","DFFlagReplicatorLabelItemTypesProcessed":"True","DFFlagReplicatorOptimizeDescendantOfWorkspace":"True","DFFlagReportCharacterLoadTimeMetrics2":"True","DFFlagReportCoalescingStats":"True","DFFlagReportCollisionDetectionTime":"True","DFFlagReportCounterToGameInstancesApi":"True","DFFlagReportDataStoreErrorCases":"True","DFFlagReportGALightingTechnology":"True","DFFlagReportGPUMetrics":"True","DFFlagReportInfluxLightingTechnology":"True","DFFlagReportInterpolationPerformance":"True","DFFlagReportInterpolationPerformanceClient":"True","DFFlagReportJoinTimeImpactStats":"True","DFFlagReportLightingTechnology":"True","DFFlagReportMp3ParsingAnomalies":"True","DFFlagReportOggParsingAnomalies":"True","DFFlagReportParsingAnomalies":"True","DFFlagReportPhysicsFPSStatsPlaceSpecific_PlaceFilter":"True;606849621;171391948;189707","DFFlagReportPhysicsSolverStatsPlaceSpecific_PlaceFilter":"True;606849621;171391948;189707","DFFlagReportPhysicsStatsToHUD":"True","DFFlagReportReplicatorStatsToInflux":"True","DFFlagReportSolverUsageStats":"True","DFFlagReportStatsCurrentLessThanMin2":"True","DFFlagReportStatsPauseDuration":"True","DFFlagReportTriangleMeshPartMigrationData":"True","DFFlagRomarkAdjustCharacterReportThrottle":"True","DFFlagRoundToScreenScaleUseFloor":"True","DFFlagSanitizeCofmVariablesNanInf":"True","DFFlagScriptContextImproveValidateThreadAccess":"True","DFFlagScriptContextTraceLocalTime":"True","DFFlagSendClientNewJoinData":"True","DFFlagSendPackageRequestFailureMessageOnlyOneTime":"True","DFFlagSendTypeAsStringDuringCacheValidation":"True","DFFlagServerConfigurerDoCDNProbe":"True","DFFlagServerCopiesPlayerGui3":"True","DFFlagServerProfileSeparateThread":"True","DFFlagServerReportPhysicsThrottleWithDatacenterId":"True","DFFlagSetNumberEmotesLoaded":"True","DFFlagSignalRCrashFix":"True","DFFlagSimDecisionBaseOnExtents2":"True","DFFlagSimplifyRakNetConnectionHandshake":"False","DFFlagSkipContainerCheckOnJoin":"True","DFFlagSkipLowRes":"True","DFFlagSkipLowRes_PlaceFilter":"True;3027055174","DFFlagSkipSDILogName":"True","DFFlagSocialServiceDevPromptGameInvites":"True","DFFlagSpecialCaseSupportRbxCdnInAppDataModel2":"True","DFFlagSpecificGravityDummyFunctionGA":"True","DFFlagSpecificGravityDummyReturnsZero":"False","DFFlagStreamingExtentsForceUpdateOnlyWhenAlive":"True","DFFlagStreamingGameplayPausedAPI":"True","DFFlagStreamingGameplayPausedAPIStudioProperties":"True","DFFlagStreamingSetPlayerPausedFirst":"True","DFFlagStreamingUpdateWorldExtentsWhenPlayerMoves":"True","DFFlagStrictMp3Parsing":"True","DFFlagStrictOggParsing":"True","DFFlagStrictOggParsingFix":"True","DFFlagSupportYouTubeInAppDataModelIfRbxCdnAllowed":"True","DFFlagTeamCreateSaveAnalyticsServiceApiKey":"True","DFFlagTextScraperEnableCaptureDateTime":"True","DFFlagTextScraperParameterizeV2":"True","DFFlagTextScraperReportOSPlatform":"True","DFFlagTextScraperReportSessionId":"True","DFFlagTextScraperStopReportPureParameterFix":"True","DFFlagThrottleGetUserThumbnailAsync":"True","DFFlagThrowErrorWhenRequestedURLFailed":"True","DFFlagThumbnailSupportFocusOnPart":"True","DFFlagUpdateCofmOnMasslessRootChange":"True","DFFlagUpdateHipHeightClamping":"True","DFFlagUseAssemblyExternalEdgeListCachedForWake":"True","DFFlagUseBaseUrlNotHardcodedUrl":"True","DFFlagUseDistanceThinning":"True","DFFlagUseLowResTerrain":"True","DFFlagUseLowResTerrain_PlaceFilter":"True;3027055174","DFFlagUseMomentumThinning":"True","DFFlagUseMomentumThinning_PlaceFilter":"False;1694497805;1225846869","DFFlagUseNewPemKeys":"True","DFFlagUseNewQueryParamUtility":"True","DFFlagUseNewTerrainProtocol":"True","DFFlagUseNewTerrainProtocol_PlaceFilter":"True;3027055174","DFFlagUseNoneLuaBuildRigFromAttachments":"True","DFFlagUsePemKeyFormat":"True","DFFlagUsePositionPropWhenKnown":"True","DFFlagUsePositionPropWhenKnown_PlaceFilter":"True;3027055174","DFFlagUsePugiXmlForSettings":"False","DFFlagUseRoundRobin":"False","DFFlagUseSort":"False","DFFlagUserAccessUserSettings":"True","DFFlagUserAdjustHumanoidRootPartToHipPosition":"True","DFFlagUserAllowDisableCustomAnims2":"True","DFFlagUserChatPrivacySetting":"True","DFFlagUserFixCharacterSoundIssues":"True","DFFlagUserHttpAPIEnabled":"True","DFFlagUserPlayCharacterLoopSoundWhenFE":"True","DFFlagUserPlayCharacterSoundWhenFE":"True","DFFlagUserPreloadAnimations":"True","DFFlagUserServerFollowers":"True","DFFlagUserUseLuaVehicleController":"True","DFFlagUserUseSoundDispatcher":"True","DFFlagUsingHeadsIsBadForOwningThings":"True","DFFlagUsingHeadsIsBadForPhysicsReplication":"True","DFFlagVerifyWorldInTryFloor":"True","DFFlagVersionedIdSync":"True","DFFlagViewportFrameLight":"True","DFFlagWebParserAddIsNumberCatchall":"True","DFFlagWhitelistStreamingPauseState":"True","DFFlagWhitelistUserInputEvents":"True","DFFlagXboxDisableTextChat":"True","DFIntAnalyticsForXBoxCrash_JoinInfluxHundredthsPercentage":"1","DFIntAnalyticsMaxSendWaitTimeMs":"1500","DFIntBatchApiAssetArchivingErrorDateSec":"1565895600","DFIntBulletContactBreakOrthogonalThresholdPercent":"200","DFIntBulletContactBreakThresholdPercent":"200","DFIntCSGLevelOfDetailSwitchingDistanceL12_PlaceFilter":"500;2434889832;2568147212","DFIntCSGLevelOfDetailSwitchingDistance_PlaceFilter":"250;2434889832;2568147212","DFIntCSGv2LodMinTriangleCount":"100","DFIntCSGv2LodsToGenerate":"3","DFIntCSGv2OperationInfluxHundredthsPercentage":"100","DFIntCanHideGuiGroupId":"4358041","DFIntChatCap":"100","DFIntChatTime":"10","DFIntClientJoinProcessPositiveSamplesThousandths":"10","DFIntClientNetworkInfluxHundredthsPercentage":"500","DFIntContentProviderAssetdeliveryRolloutPercentage":"100","DFIntCrashUploadHttpResponseDefaultTimeoutMillis":"80000","DFIntCrashUploadToBacktracePercentage":"10","DFIntDataStoreInfluxReportNonParsableDataPerMyriad":"10000","DFIntDataStoreMaxValueSize":"262144","DFIntDefaultBalanceD":"100","DFIntDefaultBalanceP":"7000","DFIntDynamicReloaderFailureInfluxHundrethsPercentage":"10000","DFIntDynamicReloaderFileFailureInfluxHundrethsPercentage":"10000","DFIntExpireMarketPlaceServiceCacheSeconds":"60","DFIntGamePassOwnershipCacheSeconds":"30","DFIntGetUserThumbnailAsyncThrottleTime":"3","DFIntHttpCacheStatsReportingIntervalSeconds":"180","DFIntHttpConnMaxAge":"600000","DFIntHttpConnectDefaultTimeoutMillis":"60000","DFIntHttpCurlConnectionCacheSize":"-1","DFIntInfluxReportLocalFilterStringPermyriad":"500","DFIntInfluxReportRCCStatsHundredthsPercentage":"5000","DFIntJSONOverflowDepth":"200","DFIntJoinInfluxHundredthsPercentage":"100","DFIntLDLPGSStatsRatePercentPlaceSpecific":"25","DFIntLocalizationServiceContentLoadErrorHundredthsPercentage":"1000","DFIntLogGroupTeleportInfluxPerTenThousand":"1000","DFIntMaxClusterKBPerSecond":"400","DFIntMaxDataOutJobScaling_PlaceFilter":"20;3260091322","DFIntMaxDataPayloadSize":"96000000","DFIntMaxFramesToSend":"2","DFIntMaxReceiptSize":"100","DFIntMpsRateLimitCapacity":"10","DFIntMpsRateLimitDuration":"10","DFIntNewSettingsEndpointExceptionInfluxPermyriad":"10000","DFIntNumberFramesSubmergedBeforeVSquaredViscocity_PlaceFilter":"0; 1221071288; 1107780422; 1223560318","DFIntOnDisconnectHTTPTimeout":"500","DFIntPercentApiRequestsRecordGoogleAnalytics":"5","DFIntPlayerConfigurerCDNProbeDelayMs":"10000","DFIntPrimStatsGANumDelimited":"3000","DFIntRakNetConnectionStartWindow_HundredthsPercentage":"1000","DFIntRakNetResendMaxThresholdTimeInUs":"2000000","DFIntRakNetResendScaleBackFactorHundredthsPercent":"6500","DFIntReplicatorAnimationTrackLimitPerAnimator":"50","DFIntReplicatorAnimationTrackLimitPerAnimator_PlaceFilter":"120;2116452049","DFIntReplicatorCountLimitInfluxHundrethsPercentage":"10000","DFIntReplicatorMaxPacketBytesSentToInfluxOnError":"256","DFIntReportAnimationTrackSpamInfluxHundrethsPercent":"500","DFIntReportDeviceInfoRate":"100","DFIntReportParsingAnomalyRate":"1","DFIntReportSoundAssetsRate":"1","DFIntS2NumPhysicsPacketsPerStep":"2","DFIntS2NumPhysicsPacketsPerStep_PlaceFilter":"8;3260091322","DFIntSendJoinTimesToDiag_HundredthsPercentage_PlaceFilter":"4000;370731277","DFIntSendRakNetStatsInterval":"300","DFIntServerBandwidthPlayerSampleRate":"20","DFIntSmoothTerrainPhysicsRayAabbSlop":"1","DFIntStepsToJoin":"2","DFIntStreamPauseVelBufFactorHundredths":"100","DFIntTextScraperReportUserIdSize":"5","DFIntThrottledVelocityThresholdTenths":"15","DFIntTimePermyriad":"10000","DFIntWaterViscosityDragFudgeFactor_PlaceFilter":"500; 1221071288; 1107780422; 1223560318","DFIntWebParserInfluxWriteNanInfPerMyriad":"1000","DFIntWeldPermyriad":"100","DFIntWorldStepDtAveExpFactorHundredth":"1","DFLogErrorDescription":"6","DFLogMessagingService":"6","DFLogSignalRConnection":"6","DFLogSoundCheckResult":"4","DFStringAdditionalBlacklistHeaders":"SOAPAction","DFStringAnalyticsNS1BeaconConfig":"https://web.archive.org/web/20200624170102/https://c0ll.rbxcdn.com/test-50kb.png|g2kd2s|https://c0hw.rbxcdn.com/test-50kb.png|g2iyic|https://c0cfly.rbxcdn.com/test-50kb.png|g2hjxw|https://c0ak.rbxcdn.com/test-50kb.png|g2g5dg","DFStringDataStoreThrottleMsg":"DataStore request was added to queue. If request queue fills, further requests will be dropped. Try sending fewer requests.","DFStringR15CollisionTypeField":"universeAvatarCollisionType","DFStringReportSoundAssetsAssetList":"rbxassetid://1837038213,rbxassetid://1846492029,rbxassetid://1841601627,rbxassetid://1845571507,rbxassetid://1836362602,rbxassetid://1846368341,rbxassetid://1847611722,rbxassetid://1845891180,rbxassetid://1845891141,rbxassetid://1842957560,rbxassetid://1836553363","DFStringRobloxAnalyticsURL":"https://web.archive.org/web/20200624170102/http://ecsv2.roblox.com/","DFStringSendPingForCnConnectingToDcList":"111,174,191,133","FFlagAddEndedSignalToSoundJobStudio":"True","FFlagAdjustHipTranslationBasedOnHipHeight":"True","FFlagAllowCatalogItemCreatorAssetConfig":"True","FFlagAllowMeToParseMyOwnJoinBlob":"True","FFlagAllowNegativeDisplayOrder":"True","FFlagAlwaysLuau":"True","FFlagAnimationSampleCorrection":"True","FFlagAnthroArtistIntentFBXImporterIntermediateState":"False","FFlagAppShellReporterMonitorFrameTimeIOS":"True","FFlagAvatarEditorAnthroSlidersUIOnly":"True","FFlagAvatarEditorCostumeSignalR":"True","FFlagAvatarEditorFixLegCameraPosition":"True","FFlagAvatarEditorFixSliderSensitivity":"True","FFlagAvatarEditorInitializeModelEarly":"True","FFlagAvatarEditorKeepYourColor":"True","FFlagAvatarEditorRefactorPageType":"True","FFlagAvatarEditorRemoveDefaultClothingMessage":"True","FFlagAvatarEditorSelectivelyUseDefaultAsset":"True","FFlagAvatarPartScaleTypeFix":"True","FFlagAvoidCrashOnThreadResourceError":"False","FFlagAvoidFindFirstChildCallsInGuiBase2d":"True","FFlagBackpackScriptUseFormatByKey":"False","FFlagBadgeReadDisabledFromInfo":"True","FFlagBatchAssetApi":"False","FFlagBestProximatePartFix":"True","FFlagBillboardGuiDistanceStepping2":"False","FFlagBreakJointsOnDeath":"True","FFlagCJVNotFallbackToEnglishForCoreGuiEnabled":"True","FFlagCMSEndPointsAPI":"True","FFlagCSGv2ControlSignificands":"False","FFlagCSGv2EnableEmptyMeshError":"True","FFlagCSGv2EnablePerPrimitiveBoxMaps":"True","FFlagCSGv2ForceEnabled":"True","FFlagCSGv2InGameEnabled":"True","FFlagChangeNarrowToSlender":"True","FFlagChatServiceAnalyticsOnFilterStringCalls":"False","FFlagCheckIntentWhenInitDefaultScripts":"True","FFlagClickDetectorCursorIconEnabled":"True","FFlagCloudEditServerGeneratesPlayerCameraPosition":"True","FFlagConnectionScriptEnabled":"True","FFlagConstraintAdornCleanup":"True","FFlagContentProviderTempDirWithPid2":"True","FFlagCoreScriptEnableInspectAndBuy":"True","FFlagCoreScriptEnableInspectAndBuy_PlaceFilter":"True;3155066112;3157761435;3204147952;189707","FFlagCoreScriptEnableRobloxTranslatorFallback":"True","FFlagCoreScriptEnableRobloxTranslatorFallback_PlaceFilter":"True;3155066112;3157761435;3204147952;189707","FFlagCoreScriptNoPosthumousHurtOverlay":"True","FFlagCoreScriptTranslateGameText2":"True","FFlagCoreScriptsUseLocalizationModule":"True","FFlagCoreUseRoact1_x":"True","FFlagCrashReporterNew":"False","FFlagCurlOption53":"True","FFlagCurlProbe4":"True","FFlagDatamodelServicesConnectionFix2":"True","FFlagDebugClientNetworkPerPlaceMetrics":"False","FFlagDebugClientNetworkPerPlaceMetrics_PlaceFilter":"True;1818;3498890;189707","FFlagDelayPurchasePromptActivation":"True","FFlagDisableDrawingStudsInEdit":"True","FFlagDisableReJoinForSurfaceTool":"True","FFlagDontInsertGroundJoints":"True","FFlagDontStoreCharacterModelBeingLoadedInPlayer":"False","FFlagEasingExpansion":"True","FFlagEnableAbsoluteCellSizeAndCellCount":"True","FFlagEnableAssetConfigVersionCheckForModels":"True","FFlagEnableAssetPreviewDynamicVote":"True","FFlagEnableAvatarEditoriOSTablet":"True","FFlagEnableCatelogForAPIService":"True","FFlagEnableDataForAssetConfig":"True","FFlagEnableDataModelFetchAssetAsync":"True","FFlagEnableDeveloperGetManageGroupUrl":"True","FFlagEnableFSEventWatcher":"True","FFlagEnableInsertAssetCategoryAnalytics":"True","FFlagEnableLuaBottomBarWithTextOnPhone":"False","FFlagEnableLuaBottomBarWithTextOnTablet":"False","FFlagEnableMarketplaceFavorite":"True","FFlagEnableMouseUpEventFireForCurrentDragGuiObj":"True","FFlagEnableNewChatApi":"True","FFlagEnablePreviewTabSelection":"True","FFlagEnableReplaceBodyPartR15":"True","FFlagEnableStudioServiceGetUserId":"True","FFlagEnableSurfaceGuiPixelsPerStud":"True","FFlagEnableTextBoxPasswordDev":"True","FFlagEnableTextSelection2":"True","FFlagEnableToolboxGetAssetsFailedCaseFix":"True","FFlagEnableToolboxUploadReport":"True","FFlagEnableToolboxVoteFix":"True","FFlagEndKeyboardEventsOnFocusChange3":"True","FFlagExitProcessOnExit":"True","FFlagFasterInstanceCheck":"True","FFlagFireAncestryChangedJointSignalAfterWorldInsert4":"True","FFlagFireChangedForCursorPosition":"True","FFlagFixAssetUploadSuccssMessage":"True","FFlagFixBadDirtyStateSetForUIConstraint":"True","FFlagFixButtonR2MouseClickOnGui":"True","FFlagFixCrashChangingHierarchyInRelayout":"False","FFlagFixG3DFpChecks":"True","FFlagFixIAdornableCollectorCrash3":"False","FFlagFixInspectMenuAnalytics":"True","FFlagFixLoadTimeReporting":"True","FFlagFixLoadableImageDoesNotLoadCachedImage":"True","FFlagFixLuaAppAvatarDraggable":"True","FFlagFixModalGuisInFoldersBeingIgnored":"True","FFlagFixModelPreviewSelection":"True","FFlagFixMousePositionInWindowCheck":"True","FFlagFixMultiWindowMouseMovements":"True","FFlagFixPluginQWidgetInitialization2":"True","FFlagFixPromiseUtilitiesBatch":"True","FFlagFixScalingValueRename":"True","FFlagFixScalingValueRename_PlaceFilter":"False;370731277","FFlagFixToggleOffDarkName":"True","FFlagFixXSwipe":"True","FFlagFlyweightServiceDataRecievedCallbackCrashFixEnabled":"True","FFlagFreeCameraForAdmins":"True","FFlagFreecamInTestServers":"True","FFlagGameMediaEntryIDOptional":"True","FFlagGamePerfMonitorGameCloseFix":"True","FFlagGamePerfMonitorStatsWindowFix":"True","FFlagGameinternationalizationApiWhitelist":"True","FFlagGamepadInputRaceConditionFix":"True","FFlagGetFVariableThrowsAgain":"True","FFlagGraphicsGLFixCopyFramebufferMip":"True","FFlagGraphicsGLHD3000DisableGL3":"False","FFlagGraphicsGLHD3000DisableUBO":"True","FFlagGraphicsGLSeparateCB":"True","FFlagGreyOutPublishForAssetConfigIfServiceIsSelected":"False","FFlagGuestFriendCheckFailImmediate":"True","FFlagHttpClientDisconnectResultSignals":"True","FFlagHttpUseContentCacheFlag3":"True","FFlagHttpUseMinGzip":"False","FFlagHumanoidPreventDuplicateAnimatorChildren":"True","FFlagIESuppressErrors":"True","FFlagIOSNowSupportsAussieMode":"True","FFlagIgnoreCollisionPairs":"True","FFlagInGameUIForceDefaultLocaleOnOSX":"True","FFlagInGameUIForceDefaultLocaleOnWin10":"True","FFlagInGameUIForceDefaultLocaleOnWin32":"True","FFlagInitializeModCodesForWindows":"True","FFlagInspectMenuEnableEmotes":"True","FFlagInspectMenuProgressiveLoading":"True","FFlagInspectMenuUpdateDisabledColor":"True","FFlagIsPasswordTextRendering":"True","FFlagJoinTime_AvatarFastClusterSignal":"True","FFlagJoinTime_AvatarTextureCompositorSignal":"True","FFlagJoinTime_HttpQueuePrio":"True","FFlagJoinTime_LocalUserAnimationPriority":"True","FFlagJoinTime_LocalUserClusterPriority":"True","FFlagJoinTime_LocalUserMeshPriority":"True","FFlagJoinTime_LocalUserTexturePriority":"True","FFlagJoinTime_PassTexturePriority":"True","FFlagJointsUseNoCollideJointCount3":"True","FFlagKeyDownAcrossAllWindows":"False","FFlagKeyframeSequenceEnableFrozen":"True","FFlagKillDownAwayState":"True","FFlagKillSurfaceJointsPart1":"True","FFlagLineHeightEnabled":"True","FFlagLoadCoreScriptsEvenInTeamCreate":"True","FFlagLoadTheLoadingScreenFaster":"False","FFlagLoadTimesFromAppShellReporter":"True","FFlagLocalesInUserInfoOniOS":"True","FFlagLocalizationTableTruncateFix":"True","FFlagLuaAppEnableHomePageWithAvatarABTest3":"False","FFlagLuaAppEnablePageBlur":"True","FFlagLuaAppEnableStopWatchReporter":"False","FFlagLuaAppFixAndroidNavigation":"True","FFlagLuaAppFixInfiniteRerender":"True","FFlagLuaAppGameDetailsHideEmptySections":"True","FFlagLuaAppGameSetTargetIdAnalytics":"True","FFlagLuaAppGamesPagePreloadingDisabled":"False","FFlagLuaAppHandlePurchaseFailWhenOwned":"True","FFlagLuaAppHomeIconPolicy":"True","FFlagLuaAppHttpsWebViews":"True","FFlagLuaAppMakeAvatarThumbnailTypesEnum":"True","FFlagLuaAppNewEconomyApi2":"True","FFlagLuaAppPolicyRoactConnector":"True","FFlagLuaAppPurchaseErrorToastRefactor2":"True","FFlagLuaAppRefreshScrollingFrameRefactor":"False","FFlagLuaAppSeeAllFriendsWebPage":"True","FFlagLuaAppSocialLinksSplitGroup":"True","FFlagLuaAppTabNameGamesToDiscoverOnIOS":"True","FFlagLuaAppUseGameSetTargetId":"True","FFlagLuaAppUseUIBloxToasts":"False","FFlagLuaAppUseWithLocalization":"False","FFlagLuaGameDetailsPolishV367":"True","FFlagLuaGameDetailsRenderTransparentBackground2":"True","FFlagLuaGameDetailsUseGothamInDarkTheme":"True","FFlagLuaHomeMoveMyFeedToMore":"True","FFlagLuaHomePeopleListV1V361":"True","FFlagLuaHttpUrlBuilder":"True","FFlagLuaInviteGameFixMessageAlignment":"True","FFlagLuaInviteGameTextLocalization":"True","FFlagLuaPageLoadEvent":"True","FFlagLuauBuiltinCalls":"True","FFlagLuauTypesInCoreScripts":"False","FFlagLuauTypesInCoreScripts2":"True","FFlagMakeAEGetAssetInfoPromise":"True","FFlagMalformedJoinBlobIsUnknownError":"True","FFlagMeasureJoinToOutsidersUse":"True","FFlagMegaReplicatorIsCloudEditInitialize":"True","FFlagMemoryFromAppShellReporterAndroid":"False","FFlagMigrateTriangleMeshData3":"True","FFlagMobileChatOneIcon":"True","FFlagModelInstanceCompletenessRefactor":"True","FFlagMouseServiceWantsToBeIndependent":"True","FFlagNavigationDebugDrawIterateSpiral":"True","FFlagNavigationFixPathUpdateEventCall":"True","FFlagNavigationFixPathUpdateImplCall":"True","FFlagNetworkDeprecateScopeNames":"True","FFlagNetworkDeserializePacketsInAJob":"True","FFlagNetworkStreamingPhysicsObserverInit2":"False","FFlagNoCollisionConstraintHumanoidFix":"True","FFlagNoFaceHeadMeshTag":"True","FFlagNoMoreCursorErrors":"True","FFlagNoSpaceAfterReturnInTextBox":"True","FFlagNotificationScript2UseFormatByKey":"True","FFlagOnlyCheckHeadAccessoryInHeadShot":"True","FFlagOptimizedPrimitivesHere":"True","FFlagOptmizedVec3Int32HasherEnabled":"True","FFlagPGSAdaptiveCollisionMarginFixEnabled":"False","FFlagPGSConstraintAlign2AxesCompliantCacheFix":"True","FFlagPartCastShadow":"True","FFlagPassDataModelDPIScale":"True","FFlagPluginActionSetChecked":"True","FFlagPluginActionSetDefaultShortcut":"True","FFlagPluginActionSetEnabled":"True","FFlagPluginManagementInStudio2":"True","FFlagPointsServiceNewEndpoints":"True","FFlagPurchasePromptPremiumEnabled2":"True","FFlagQuantumGuiClipScreenGuiToViewport2":"False","FFlagQuantumScrollingFrame4":"False","FFlagQueueUIEventsDuringLayout":"False","FFlagRCCSupportTeamTest":"True","FFlagRealtimeFriendsContextualMenuRefactor":"True","FFlagRecalculateAbsolutePlacementFix":"True","FFlagRecordHopperServiceStats":"True","FFlagRecordInGameDeaths":"False","FFlagRemoveKeyboardOnShutdownIOS":"True","FFlagRemoveOldPhysicsPacketCache":"True","FFlagRemoveUnlocalizedButtonText":"True","FFlagRemoveVehicleSeatCameraCFrameSet":"True","FFlagRenderAdornFixMdrColor":"True","FFlagRenderBiasGlassTint":"True","FFlagRenderFixDDSCubeLoad":"True","FFlagRenderFixEmojiPadding":"True","FFlagRenderMessagesAsGui":"True","FFlagReportExplicitAutoJointsJoinAll":"True","FFlagReportJoinAllCount":"True","FFlagReportRuntimeJoinCount":"True","FFlagReportTimeToPlay":"True","FFlagRetranslateOnTextScraperStart":"True","FFlagRoactPurchasePromptAllowBundles":"True","FFlagRoactPurchasePromptAllowBundles_PlaceFilter":"True;3155066112;3157761435;3204147952;189707","FFlagRotateCameraForRightPart":"True","FFlagSHAllowArbitraryLevelCount":"True","FFlagSHComputeExtentsTimeReportingEnabled":"True","FFlagSHStatReportingEnabled":"True","FFlagScrollingFrameDoNotProcessMouseCancel":"True","FFlagSendJoinTimesToDiag_PlaceFilter":"true;370731277","FFlagSeparateSendFromProcessMouseMove":"True","FFlagSignalStopForZeroWeight":"True","FFlagStartClearUnusedRefsJob":"True","FFlagStartWarningStoppers":"True","FFlagStopTheBrokenCursors":"True","FFlagStoreInstalledPluginsInCloud":"True","FFlagStreamingUISkipFirstPause":"True","FFlagStudioAnimationEditorCheckForSavedChanges":"False","FFlagStudioAnimationEditorClearEventNames":"True","FFlagStudioAnimationEditorContinueScrollingWithSelectionArea":"True","FFlagStudioAnimationEditorEnableRigSwitching2":"True","FFlagStudioAnimationEditorFixAnimationsWithLongNames":"True","FFlagStudioAnimationEditorFixEventsTooltips":"True","FFlagStudioAnimationEditorFixRenameKeyOption2":"True","FFlagStudioAnimationEditorFixRigSelection":"True","FFlagStudioAnimationEditorFixScalingBarPosition":"True","FFlagStudioAnimationEditorFixWorldSpaceJointPanel":"True","FFlagStudioAnimationEditorIKMode":"True","FFlagStudioAnimationEditorKeepClipboardAfterMove":"True","FFlagStudioAnimationEditorScaleKeys":"True","FFlagStudioAnimationEditorSelectEventsOnEdge":"True","FFlagStudioAnimationEditorShiftSelectJointsOn":"True","FFlagStudioAnimationEditorUseQWidgetsForPopups":"True","FFlagStudioAnimationEdtiorOptimizationsEnabled2":"True","FFlagStudioEnableSurfaceJoinChangeBeta":"False","FFlagStudioFixToolboxDialog":"True","FFlagStudioFixUnhandledRunTimeError":"True","FFlagStudioGameSettingsBindToClose":"True","FFlagStudioRemoveAxisWidget":"True","FFlagStudioUILibraryRoundTextBoxNoTooltip":"True","FFlagSurfaceGuiDefaultPixelsPerStud":"True","FFlagTSMk2ThrottleStreamJob":"True","FFlagTaskSchedulerSTDThreadwrapper":"True","FFlagTeamCreateSaveAnalyticsServiceApiKeyReplicator":"True","FFlagTenaciousGamePerfMonitor":"True","FFlagThrowDetailedMessageForBadEntries":"True","FFlagThwartPurchasePromptScams":"True","FFlagTighterCylinderBoundingSpheres":"True","FFlagTolerantLexerForStudio":"True","FFlagToolboxJointMigrationApi":"True","FFlagToolboxWithCMSV2":"True","FFlagTouchEventSameSHCellBugFixEnabled":"True","FFlagTrackCurlTimeProfile":"True","FFlagTrackEventWithArgsEnabled":"True","FFlagTrackResetCharacterButtonUsage":"True","FFlagTweenServiceGetValueEnabled":"True","FFlagUDim2FromScaleAndOffsetConstructors":"True","FFlagUIInlineLayout2_PlaceFilter":"True;3299508970;3299511698;3299515879","FFlagUIViewportFrameSetCameraNearZ":"True","FFlagUniverseIdChangedEvent":"True","FFlagUpdateExtentsForManualStep":"True","FFlagUpdateInspectAndBuyOffsaleText":"True","FFlagUpdateScaleBeforeBuildRig":"True","FFlagUrlSupportNewGamesAPI":"True","FFlagUseAccuratePlaySoloForced":"True","FFlagUseAdvancedCharacterScales3":"True","FFlagUseBaseUrlInPlugins":"True","FFlagUseHipHeightInKeyframeSequences2":"False","FFlagUseKeyframeMarkersForEvents2":"True","FFlagUseLDLPGSSolver4":"True","FFlagUseLuaGameDetailsOnIPad":"True","FFlagUseLuaGameDetailsOnIPhone":"True","FFlagUseMTSolver":"True","FFlagUseMatrix3ForInertiaTensor2":"True","FFlagUseNewSpatialHash5":"True","FFlagUseNewTriangleMeshPart":"True","FFlagUseNormalWeld":"True","FFlagUseOptimizedGetPartsObscuringTarget":"True","FFlagUseOtterMasterForLuaApp":"True","FFlagUseVectorForDirtyMechanisms":"True","FFlagUserAllCamerasInLua":"True","FFlagUserAnimationSpeedDampening":"True","FFlagUserClickToMoveFollowPathRefactor":"True","FFlagUserFixChatMessageLogPerformance":"False","FFlagUserFixChatMessageLogPerformance2":"False","FFlagUserInGameChatUseNewFilterAPIV2":"True","FFlagUserIsNowADynamicThumbstick":"True","FFlagUserJSONConvertInfAndNanToNull":"True","FFlagUserJumpButtonPositionChange":"True","FFlagUserNavigationClickToMoveNoDirectPath2":"True","FFlagUserNavigationClickToMoveSkipPassedWaypoints":"True","FFlagUserNavigationClickToMoveUsePathBlocked":"True","FFlagUserNavigationFixClickToMoveJump":"True","FFlagUserNewCameraRaycastingAPIsEnabled":"True","FFlagUserNoMoreKeyboardPan":"True","FFlagUserNoUpdateOnLoop":"True","FFlagUserRbxUtilityCreateSetParentLast":"True","FFlagUserShouldClipInGameChat":"True","FFlagUserShouldLocalizeGameChatBubble":"True","FFlagUserShouldLocalizeServerMessages":"True","FFlagUserTheMovementModeInquisition":"True","FFlagUserThirdGamepadZoomStep":"True","FFlagUserToolR15Fix":"True","FFlagUserTouchSensitivityAdjust":"True","FFlagUserUseCachedFriendChecksForChat":"False","FFlagUsingSendMeasureBatch2":"True","FFlagVerifyBuiltInPlugins":"True","FFlagWebLocMarkLocTableListDirtyOnServer":"True","FFlagWhateverFloatsYourContact":"True","FFlagWhitelistThumbnailsAPI":"True","FFlagXboxAppBridgeRewrite2":"False","FFlagXboxDetachShowAccountPicker2":"True","FFlagXboxFixAwardedBadges":"True","FFlagXboxGetLocaleFromAccount":"True","FFlagXboxKeyboardInitInCallbacks":"True","FFlagXboxStartGameRefactor":"True","FFlagXboxValidateConnectPeer":"True","FFlagXboxVoiceChatFixes":"True","FFlagXboxVolumeFadesInCallbacks":"True","FFlagYouDontKnowMe":"True","FIntAntiSpamSpamLimit":"1000","FIntAppShellFPSReportPeriod":"120","FIntAppShellMemoryReportPeriodicity":"120","FIntAvatarEditorNewCatalogButton2":"100","FIntCameraFarZPlane":"100000","FIntCameraMaxZoomDistance":"400","FIntCurlProbePermyriad":"10000","FIntDelayBeforeFirstPostStatsSeconds":"180","FIntEnableFriendFooterOnHomePageV369":"100","FIntJointTime_TextureCooldown":"0","FIntLuaAppNonFinalThumbnailMaxRetries":"1","FIntLuaAppPercentRollOutNewThumbnailsApiV3":"100","FIntLuaAppRenderTransparentPageMaxCount":"1","FIntLuaAppUseNewAvatarThumbnailsApi4":"0","FIntMaxCameraMaxZoomDistance":"100000","FIntMaxLevelForAnchored":"3","FIntPGSAngularDampingPermilPersecond":"950","FIntPGSPStageStiffnessWorseFitnessThreshold":"2","FIntPGSVStageStiffnessAggressiveValue":"99995","FIntPGSVStageStiffnessConservativeValue":"99000","FIntPGSVStageStiffnessWorseFitnessThreshold":"2","FIntPartMinSizeMul1000":"50","FIntPercentLuaGameDetailsPageOnAndroidPhone":"100","FIntPercentLuaGameDetailsPageOnAndroidTablet":"100","FIntPercentReportingByCountryCode":"100","FIntPercentReportingGamesListRTT":"5","FIntPercentReportingGamesSortsRTT":"50","FIntPercentReportingLeaveGameAnalytics":"10","FIntTaskSchedulerAutoThreadLimit":"8","FIntTeleportMethodAnalyticsHundredthPct":"100","FLogFastLogValueChanged":"0","FLogNetwork":"7","FStringABTestNameIPhoneLuaGameDetails":"iPhone.AllUsers.LuaGameDetails2","FStringStudioUrlSurfaceJoinChange":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/changes-to-part-surfaces-beta-feature/334420","SFFlagFixBallRaycasts":"True","SFFlagFixRaysInWedges":"True","SFFlagNetworkUsePeerId":"True","SFFlagPgsForAll":"True","SFFlagUseNativePathWaypoint":"True","EnableBackupCookie":"True","FFlagFixGamepadNavigationWithACM":"True","DFFlagSpawningDontIgnoreCanCollide":"True","FFlagFixBackpackDraggingReset":"True","FFlagFixBindActionTouchButtonError":"True","FFlagFixGetStringForKeyCodeDeadKeyState":"True","DFFlagEmoteThumbnailsRotationEnabled":"True","DFFlagDataStoreInitialThrottlingBudgetFix":"True","DFFlagStreamQuotaRoundUp":"True","DFFlagNaivePacking":"True","DFIntPercentageThresholdUsingFriendsV2":"0","DFFlagNetworkUseSharedStreamingObserver2":"False","FFlagStudioLogPluginSettingsFileAccess":"True","DFFlagTrackRunUpdateCycleTime":"False","DFIntTrackRunUpdateCycleReportInfluxPermyriad":"1000","FFlagXboxAppBridgeRewrite3":"False","DFFlagFixStudioDegenerateMouseRaycast":"True","FFlagStudioDisableAutoClosingInComments2":"True","FFlagVersionControlServiceForceDraftsUsage_PlaceFilter":"True;4203193037;2772125205;3069606769;4094440665;2413179002;3344058302;3566618597;4041475807;2061558182;4074515213;2309740430;2670461983;4137940225;3096515841;4133172402;4163865257","FFlagStudioCrashOnInvalidColor3Cast":"True","FFlagStudioFixAnimEditorDescendants":"True","FFlagStudioHoldDataModelLockAtBreakpointHit":"True","FFlagBadgeApiV1UserHasBadge":"True","FIntBadgeApiV1UserHasBadgePercentage":"100","FFlagLuaAppRefreshScrollingFrameRefactor2":"False","FFlagEnableGameSignalRWithOSX1":"True","DFFlagDoNotDecrementPendingNewInstancesWhenProcessingDelete":"True","FFlagStudioDoNotSaveWhenUserSaysNo":"True","FFlagRoactGameSharePageV2":"False","FFlagStreamingParallel2":"False","DFIntDesiredStreamJobTimeMS":"24","FFlagLuauTranspilerCompliance":"True","FFlagCanWeAddContinue2":"True","FIntLuaChatUseNewFriendsEndpoints":"25","DFFlagSDISkipJDINetworkStream":"True","FFlagFixAnimEditorManipulators":"True","FFlagFixRigUtils":"True","FFlagNewCharacterSoundScript":"True","DFFlagFixManualJointAdornCrash2":"True","DFFlagUpdateCofmUseHeapStack2":"True","FFlagFixLightgridAsyncInvalidations":"True","FFlagUseCorrectLocaleForPluginGuis":"True","FFlagCLI29967":"True","FFlagLocalizePlaceholderText":"True","FFlagGraphicsMetalFixD16Check":"True","FFlagGraphicsAdrenoDisableExtFmt":"False","FFlagGraphicsVulkanAndroidExtendedFormats2":"False","FFlagGraphicsGLAndroidExtendedFormats2":"False","FFlagStudioLuauLinter":"True","FFlagLuauExtendedLiterals":"True","FFlagCLI27641B":"False","DFFlagAnalyticsNS1BeaconSupportLimitedRobloxUrls":"True","DFFlagFixPriorityAscDesc":"True","FFlagLuaAppSecondaryButtonSpecifiesFont":"True","FFlagNetworkDeserializePacketsInAJob_PlaceFilter":"False;2291717546","DFFlagAsyncPublishImprovement":"True","FFlagQuantumScrollingFrame5":"True","FFlagClampCanvasPositionInLayoutStep":"False","FIntStudioBFRolesetSaveToCloudV2":"4","FFlagSocialLibraryEnabled":"True","FFlagStudioMeasureRigidJointsNotInWorld":"True","FFlagStudioDoNotShowHideAutoCompleteMenuV2":"true","FFlagStudioClearCallStackWidgetOnGSTChange":"true","FFlagEnableInputObjectIsModifierKeyDown":"True","FFlagStudioRefactorPlaceSessionModel3":"true","FFlagApplyModifiersToInputObjects":"False","FFlagStudioRelayQtModifiersToRobloxInput":"False","FFlagUseRoactPlayerList":"False","FFlagStudioFixCannotSetBreakPoint":"True","DFFlagDontSendEmptyTouchPackets":"True","DFFlagParallelAddInstanceWhenParalleStream":"True","FFlagStudioLoadLesserQtTranslationFiles":"True","DFFlagLuaDebuggerDoNotResetStackForLuaThreadWithError":"True","FFlagStudioGamePresenceToFixSyncCallHangWhenQuit":"True","FFlagStudioFileLockRelatedFixes":"True","FFlagEnableReturnKeyPressedEvent":"True","FFlagMultipleBoxesManualFocusRelease2":"True","FFlagXboxLocV2":"True","FFlagStudioShowVariableTooltipOnErrorLine":"True","FFlagEnableLegalText":"True","FFlagStudioCheckArgPhraseForInFunctionCall":"True","FFlagStudioNewFoldState":"True","FFlagDoNotLoadUnverifiedBuiltInPlugins":"true","FFlagLuaAppPreloadChatRefactor":"True","FFlagLuaAppDeepLinkEventReceiver":"True","FIntAvatarEditorRedesignRolloutPercentageAndroidPhone":"100","FIntAvatarEditorRedesignRolloutPercentageAndroidTablet":"100","FIntAvatarEditorRedesignRolloutPercentageIphone":"100","FIntAvatarEditorRedesignRolloutPercentageIpad":"100","FIntAvatarEditorRedesignRolloutPercentageOther":"100","FIntLuaCatalogRolloutPercentageAndroidPhone":"100","FIntLuaCatalogRolloutPercentageAndroidTablet":"100","FIntLuaCatalogRolloutPercentageIphone":"100","FIntLuaCatalogRolloutPercentageIpad":"100","FIntLuaCatalogRolloutPercentageOther":"100","FFlagLuaAppEnableAERedesign3":"True","FFlagLuaAppEnableLuaCatalogPage3":"True","FFlagUseCreationToFetchMyOverrideData2":"True","FStringStudioUrlAnimationEditor":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/keyframes-animate-everything-around-me/360033","FFlagGraphicsVulkanPixelbookDisable":"True","FFlagLuaAppGameplayIntentReferralSource":"True","FFlagEnableAndroidSetPendingTagOnContactFriendRequest":"True","DFFlagUseDefaltShirtAndPants2":"True","FIntLuaChatAliasesRolloutV3":"0","FFlagEnableContactsApiServiceV2":"True","DFFlagESGamePerfMonitorEnabled":"True","DFIntESGamePerfMonitorDelayBeforeFirstReportInSeconds":"60","DFIntESGamePerfMonitorHundredthsPercentage":"200","DFIntESGamePerfMonitorReportTimerInSeconds":"30","DFFlagStrictOggParsingFix2":"True","DFFlagStrictOggParsingSeekFix":"True","DFFlagReportMoreParsingAnomalies":"True","DFIntReplicatorJoinSnapInfluxHundrethsPercentage":"50","FFlagPackageRemoveJointInstanceWhenHashing":"True","FFlagStudioPackageVersionCheckInEditDMOnly":"True","FFlagStudioAddPackagePermissions":"True","DFFlagHandleLowTriggerStreamingGC":"True","DFFlagAvoidVelBufWhenGC":"True","DFFlagInitialSourceHashConsistencyFix":"True","FFlagStudioShowDotsForScriptEditors":"True","FFlagStudioDraftsServiceGetEditors":"True","FFlagMeasureRigidJointsNotInWorld":"True","FFlagCMSRemoveAssetTypeBackendMap":"True","FFlagCMSRemoveUGCContentEnabledBoolean":"True","FFlagStudioUseNewMergeDialog":"True","DFFlagVersionControlServiceBroadcastOnEditorsChange":"False","FFlagUserFixMouseCapture":"False","FFlagNotGroundhogsDay":"True","FFlagCrossDmScriptingInPlugins":"False","FFlagPluginMDIInterface":"False","FFlagStandalonePluginsSupport":"False","FFlagUnfocusTextBoxBeforeAncestorEvent":"true","FLogError":"6","FFlagRenderShadowmapCheckCB":"True","FFlagRenderFixEvsmFiltering":"True","FIntLuaAppUseNewAvatarThumbnailsApi5":"100","FFlagRenderFixHamArray":"False","FFlagCautiouslyInitilaizeSoftwareCursorVisible":"True","DFFlagLuaTableExts":"True","DFFlagLuaMathLog2":"True","FFlagStudioCheckCanPublishBeforePublishing":"False","DFFlagCacheExistingPackageVersionData":"True","FFlagStudioPackageLinkAutoUpdateIndicatorFixes":"True","FFlagStudioAddUpdatePublishedPackageReturnResult":"True","FFlagReportGameJoinLoadTime":"True","FFlagNoJoinForMoveTo":"True","FFlagUserSiblingTouchGui":"True","FFlagStudioUseNewDefaultNameEndpoint":"True","DFFlagPlayerConfigurerDoCDNProbe2":"True","FIntAppBridgeNewGameJoinAPIPercent":"0","EnableLuaAppOnChrome":"True","FFlagLuaChatAddButtonThemeFixEnabled":"True","FStringGraphicsVulkanBlacklist":"","EnableAndroidSetTagOnContactAcceptFriendRequest":"True","FFlagUseNewFriendsDomainCoreScripts":"True","FFlagStudioLoadPluginsAtRightTime":"False","FFlagStudioRestoreWindowsASAP":"False","FFlagLuaAppFixPrimaryStatIconColor":"True","FFlagAvatarEditorRTranslations":"False","DFFlagPolicyServicePlayerCallbackQueuesEnabled":"True","FFlagNoDisconnectEventBeforeUnmountWorkaround":"True","FFlagNewABTestFramework2":"True","FFlagLuaChatShareGameThumbnailMigrationV2":"False","FFlagShareGameEventConsolidationEnabled":"True","DFFlagLoadLibraryWarn":"True","FFlagLuauLimitRecursiveBlocks":"True","FIntCLI30390":"2","DFFlagNetworkUseSharedStreamingObserver4":"False","FFlagNetworkStreamingPhysicsObserverInit4":"False","DFFlagReportPhysicsReplicationRatio":"True","FFlagStreamingParallel3":"True","DFFlagFixPhysSenderParallelSimDistanceUpdateValue":"True","DFFlagGCJobInitNegativeLastSentServerRadius":"True","DFFlagServerPlaceIdKnownAssetEndpoints":"False","FIntStudioBFRolesetAsyncPublish":"4","FFlagAvatarEditorSimultaneousFullViewAvatarTypeFix":"True","FFlagLuaAppFixCancelButton":"True","FFlagLuaChatAliasesV3":"False","DFStringLoadLibraryWarnLink":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/loadlibrary-is-going-to-be-removed-on-january-6th/382516","FFlagLuauBetterTypeLint":"True","DFFlagFixGetPropertyChangedSignalMemoryLeak":"True","FFlagStudioAsyncSingletonManagement":"False","FFlagStudioAsyncSaveAs":"False","FFlagStudioCloudEditUserDataloadDataAsyncCrashFix":"True","DFFlagPackageFixJsonParserCrash":"True","FFlagEditAssetForManagedAssets":"True","FFlagShowReportOptionInToolbox":"True","DFIntReportReplicatorStatsToInfluxHundredthsPercent_PlaceFilter":"10000;3027055174;3917136599;2291717546","FFlagStudioAutoSaveReportNullCheck":"True","FFlagStudioCloseDocumentsOnce":"true","FFlagStudioCheckForBadTeamTestResponse":"true","FFlagStudioWhatsNewWindow":"True","FFlagStudioAddWhatsNewWindowToStartPage":"True","EnableTencentLinkingFeature":"False","LuaAppHideGameDetailsDeveloperRow":"True","FFlagGridUseConstRows":"True","DFFlagInvokePreloadCallbackFromDMJob":"True","FFlagFixColorPickerAppearingInWrongLocation":"True","FFlagAdditionalFallbackFonts":"True","FFlagDefaultThumbnailForRBXThumb":"True","FFlagEnableCredentialsValidationMigration":"True","FFlagEnableAccountSettingsMigration":"True","FFlagManualFocusReleaseDisablesSinking":"True","FFlagEnablePackageMassUpdateNestedPackage":"True","FFlagNewAwardBadgeEndpoint_PlaceFilter":"True;2534981557","DFStringAltTelegrafAddress":"100.20.191.133","DFIntAltTelegrafHundredthsPercent":"10000","DFIntClientJoinProcessPositiveSamplesThousandths_PlaceFilter":"1000;3027055174;3917136599;2291717546","FFlagMacStudioReportBFsAndPlugins":"True","FFlagPCStudioReportBFsAndPlugins":"True","DFFlagStudioShowToastNotificationInMainThreadAsync":"True","FFlagEnableGameSignalRWithWindows1":"False","FFlagUserFixZoomClampingIssues":"True","FFlagRbxThumbAllowAnyParamsOrder":"True","FFlagBetterRbxThumbRetryLogic":"True","DFIntBatchThumbnailMaxRetries":"5","FFlagUserChatNewMessageLengthCheck":"False","DFFlagTrackStencilBufferSupport":"False","DFFlagEnableSSEClamp":"True","FFlagCMSEnableCatalogTags":"False","FFlagAvatarEditorEnableLuaAuthenticationCheck":"True","FFlagParentWeldToOtherPart":"True","FFlagEnableLargeRobuxAndroidUpsellV3":"True","FStringStudioBuiltinPluginDefaultFont":"SourceSans","FFlagStudioLogTestUsage":"True","FFlagEnableRobuxHexIconV2":"True","FFlagStudioGameSettingsUseNewSettingsImpl2":"False","FFlagStudioStopHardcodingDecadeOfDifferentDevhubDomains":"True","FFlagResetKeyStatesOnWindowGainFocus":"True","FFlagApplyModifiersToInputObjects2":"True","DFFlagCurlReportResolvedIp":"True","DFFlagInfluxReportLastVisitedUrl":"False","FFlagUsingBrowserServiceCaptcha":"True","FFlagBrowserServiceForAllPlatforms":"True","DFFlagFixGuardTiming":"True","FFlagUseNewDocumentationUrls":"True","FFlagStopCaringAboutIsTouchDevice":"False","FFlagScrollingFrameSinkMouseDownOnScrollbar":"True","FFlagRoundInUDimLerp":"True","DFFlagUseAPIAssetsVersionsV2":"True","DFFlagVersionControlServiceBroadcastOnEditorsChangeExplicit":"true","FFlagStudioSandboxUtf8Fix":"true","DFFlagHttpClientCacheStatsLock":"True","FFlagAnimEditorUseCustomFPS":"True","FFlagDevConsoleLogMemoryButton":"True","DFFlagEnableHttpProxy":"False","FFlagPlayerListDontSinkTouchUnnecessarily":"True","FFlagPlayerListBetterGroupCheck":"True","FFlagPlayerListDontSortTeamsByScore":"True","DFFlagBetterAddInstance":"True","DFFlagEasingRefactor":"True","FFlagStudioFixConstantReconnectPopups":"True","FFlagStudioUpdateWhatsNewDevForumUrl":"True","DFFlagFixSoundReplicationForTeamCreate":"True","FFlagEnableSetStageNoneInDestroy":"True","DFFlagTaskSchedulerEraseDone":"True","DFFlagTaskQueueLinger":"True","FFlagLuaAppNewThumbnailFinalState":"True","FFlagGraphicsMetalMacIncMinSpec":"True","FFlagQueueUIEventsDuringLayout2":"True","FFlagLuaAppUseGameMediaV2":"True","LuaAppHideGamesDropDownList":"True","FFlagNotEraseCallbackQueueOnPlayerRemoving":"True","DFFlagModifySoundAssetsAssetListStringSeparator":"True","DFIntReportFMODInitThreadingRate":"0","DFFlagCheckFMODInitThreading":"False","DFFlagHttpRequestClearRes":"True","DFFlagSignalRControlExcStringFix":"True","DFFlagFileSystemCheckReadSize":"True","FFlagInfiniteTriangleMeshRecalcFixEnabled":"True","FFlagStudioReportOSVersionDiag":"True","FFlagSolverRemoveBadDebugCode":"True","DFFlagLDLEliminationPerformanceFixEnabled":"True","DFFlagOptimizeTerrainStreamOut":"False","DFFlagTerrainPhysicsDataDeferredSquared":"True","FFlagTerrainUseClumpedPhysicsData":"True","FFlagStudioFixSelectAll":"True","FFlagStudioEnsureEditDataModel":"True","FFlagGetVersionHistoryAssetFailure":"True","DFFlagReportReplicatorJoinDataItemStatsToInflux":"True","DFIntReplicatorJoinDataItemStatsInfluxHundrethsPercentage":"1000","FFlagStudioUseStandaloneTransformTool2":"True","FFlagGraphicsClampDepthBias":"True","EnableManualFocusReleaseSupport":"True","FFlagAnimEditorRenameKeyOptionFix":"True","FFlagStudioToolboxEnablePlaceIDInAnalytics":"True","FFlagStudioToolboxInsertAssetCategoryAnalytics":"True","FFlagStudioEnableSaveToCloudV2BetaFeature":"False","FFlagStudioSaveToCloudV2":"False","FFlagStudioSaveToCloudV3":"False","FFlagStudioSaveToCloudV3SpotFixes":"False","FFlagAvatarEditorUseUserIdFromStore":"True","FFlagUseLocalStorage3":"True","DFFlagPlayerPolicyNotSwallowingError":"True","DFFlagDontWalkOnReparent":"False","FFlagStudioWhatsNewWindowBeta":"False","FFlagCreateAndUpdateDataReplicationCache":"False","DFFlagSupportJoinDataItemV2i":"False","DFIntReplicatorJoinDataItemV2StatsInfluxHundrethsPercentage":"1000","FFlagFutureIsBrightPhase2_5_v3":"True","FFlagFlipTerrainNormalMap":"True","FFlagUIViewportFrameDeviceRestore":"True","FFlagStudioTextEntryRoactBugPatch":"True","FFlagStudioGameSettingsUseNewSettingsImpl3":"True","DFFlagLoadLibraryTrack":"True","DFFlagRCCTeamCreateSaveOnZeroPlayers":"True","FFlagCLI30496":"True","FFlagStudioEnableAsyncPublishBeta":"False","FFlagStudioMassUpdateWaitForAsync":"False","FFlagStudioCheckFailedPublishOnClose":"False","FFlagStudioMakePublishingAsync":"True","FFlagStudioPruneModeratedInstalledPlugins":"False","FFlagStudioWaitForContentLoadedToLoadPlugins":"False","FFlagSetContentLoadedBitBeforeEmittingSignal":"True","FFlagStudioLoadPluginsAtRightTime2":"False","FFlagStudioUseStandaloneCollisionEditor2":"True","FFlagStudioFixCancelTeamCreate":"True","FFlagGraphicsVulkanAndroidExtendedFormats3":"True","FFlagGraphicsGLAndroidExtendedFormats3":"True","FFlagGraphicsAdrenoDisableExtFmt2":"True","DFFlagEvenMorePhysicsSenderStats":"True","DFFlagAddStreamingAdornDebugger":"True","FFlagVersionControlServiceScriptCollabEnabled":"True","FFlagCMSEnableCatalogTags2":"True","FFlagStudioRemoveCouldNotFetchAssetVersionData":"True","FFlagStudioPackagePermissionRGEFix":"True","FFlagStudioEnablePackagePermissionsBetaFeature":"False","FFlagHideNoAccessGroupPackages":"true","FFlagPackagePermissionsAddDefaultNone":"true","FFlagStudioEnableAnimationEditorBeta":"False","FFlagEnableRoactAnimationEditor2":"True","FFlagFixGameSettingsThumbnailDrag":"True","DFFlagFixParallelCoarseMovementCallbacks":"True","FFlagUseStudioLocaleForForceLocale":"True","FFlagFixUnicodeTextSelection2":"True","FFlagStudioEnableNewScriptFoldStateBeta":"False","FFlagDarwinUseNewMemoryMetrics":"True","FFlagStudioCheckIfDefaultFontLoaded":"True","DFIntPackagePermissionPullingIntervalInSeconds":"10","FFlagPlayerPolicyHttpRequestHealthReportEnabled":"True","DFFlagPlayerPolicyHttpRequestRetryEnabled":"True","DFFlagDressInLayers2":"true","DFFlagRCC29411p3":"true","FFlagReduceRelentlessRemoteReminders":"true","FFlagAlwaysGenerateGuid":"true","DFFlagRebuildR6AccoutrementsWhenEnteringWorkspace":"True","FIntPlayerPolicyHttpRequestRetryTimes":"3","FFlagTerrainToolsFixScrollBarResize":"True","DFFlagFixPerSecDivideStats":"True","DFIntRccLinuxMemoryMegaByteLimit":"7000","FFlagStudioValidateToSAcceptance":"True","FFlagLuaAppSingleTriggerForLocalPlayerManager":"True","FIntStudioBFRolesetPackagePermissions":"4","FFlagGlslesMediump1":"False","FFlagGlsles3Mediump1":"False","FFlagStudioCheckLocaleNameBeforUse":"True","FFlagBypassDoubleInitialization":"True","FFlagFixGameViewControllerViewRecreation":"True","FFlagFetchLocalUserHeadshotInFetchHomePageData2":"True","FFlagStudioMoveAboutWindowCode":"True","FIntLuaChatUseNewFriendsEndpointsV2":"100","FFlagLuaCatalogFixLongPriceText":"True","FFlagLuaCatalogUseOriginalInsufficentRobuxIcon":"False","FFlagCatalogResellerUseNewGridView":"True","FFlagPasswordFieldIntegrationEnabled":"True","FFlagLuaAppCanDisableBackNavigation2":"True","DFFlagStopRestreamInstancesWithoutParent":"True","FIntRenderGrassHeightScaler":"50","FFlagRenderDecorationGrass":"True","DFFlagLDLPGSCollisionStatsEnabled":"True","DFFlagPlayerPolicyUseClientIpAddressFromSessionId":"True","FFlagAppBridgeRewritePatch1":"True","FFlagPlayerListDesignUpdate":"True","FFlagUseRoactPlayerList2":"False","FFlagUpdateLeaderboardIconPriority":"True","FFlagNewPlayerListFixBackpackMemoryLeak":"True","FFlagStudioFixPackageKeepsPullingAssetVersionId":"True","FFlagStudioFixBindToClose2":"True","FFlagStudioFixUILibDropdownStyle":"True","FFlagStudioUseDevelopAPIForPackages":"True","FFlagStudioGetSharedPackagesInToolbox":"True","FFlagExtTrackpadsMasterSwitch":"True","FFlagExtTrackpadsUseHeuristics":"True","FFlagLuaAppEnableBacktraceErrorReport":"True","FFlagStudioCorrectlyDeprecateProp_UITheme":"True","FFlagStudioCheckDataModelAfterSave":"True","FFlagStudioTranslateThemePropertyItem":"True","FFlagTerrainToolsImproveColorImport":"True","DFFlagStudioThrowExceptionForCyclicTables":"True","FFlagStudioIntInBoolContextWarningFixEnabled":"True","FFlagStudioCorrectPublishAnalytics":"False","FFlagStudioDisableAutoSaveToCloud":"True","FFlagStudioConnectPublishAsClose":"False","FFlagStudioFixDMThreadingIssueForPublishAs":"False","FFlagStudioCloseScriptsOnUiThread":"True","FFlagStudioAnalyticsIdeDocCheck":"True","FFlagFixOverZealousTextWrapping":"True","FFlagStudioReplaceDMLockWithTask":"True","FFlagDisableDecorationForLeafyGrass":"True","FFlagTerrainToolsClearConfirmationDialog":"True","FFlagTerrainToolsFixSmoothDesiredMaterial":"True","UseSetForegroundWindowForPlayer2":"True","FFlagTerrainToolsUIUpdate":"True","FFlagEnableiOSFriendFinderAndContactFriendingAnalytics":"True","DFFlagFixCharPosNaNCompare":"true","FFlagBulletInitialContactDivideByAxisLength":"True","FFlagStudioAddLoadUserPluginsArgument":"True","FFlagStudioCheckForBadTeamTestResponse2":"True","FFlagAvatarExperienceConsistentRolloutValue":"True","FFlagDebugDeleteDiscrimination":"True","FFlagStopCaringAboutIsTouchDevice2":"True","FFlagSkipLowResFix":"False","DFFlagTaskSchedulerEnsureCOMIsInitialized":"True","FFlagFutureIsBrightPhase2GL3":"False","FFlagFutureIsBrightPhase2GLES3":"False","DFFlagFixNullTask":"True","FIntLuaAppBacktraceErrorReportPercentage":"20","FFlagLuaAppInputValidationActionUsesCurrentText":"True","DFFlagPGSConstraintThreadSafeUpdatePVEnabled":"True","FFlagArrayDynamicPopBackBugFix":"True","FFlagStudioDeprecateRecentSave":"True","FFlagStudioConvertToPackageUploadErrorDisplay":"True","FFlagStudioRemoveDuplicatePackageStatusChangedSignal":"True","DFFlagHideProxySettings":"True","FFlagFixBuiltinPluginSecurityLevels":"True","FFlagStudioGameSettingsUseRoact1_2":"True","FFlagLuaCatalogLimitSellPriceDigitsTo10":"True","FFlagEnableLumberyak":"True","DFFlagHumanoidOnlyStepInWorkspace":"False","DFFlagRemoveUsesOfIsAutoJoint":"True","DFFlagAnimatorNewModelSearchAnalytics":"False","FFlagFixTableLayoutMinorAxisSortOrder":"True","DFFlagBetterStreamingHumanoidSimulationFiltering":"True","FFlagUIGradientEnabled":"True","FFlagLuaAppGameGridNewMetrics":"True","FFlagShowModeratedPluginInfo":"True","FFlagGameDetailsPeekViewAnalyticsEvents":"True","FFlagLuaAppABTestGameDetailsPeekView":"True","FFlagLuaAppInitializeABTests":"False","FFlagRemoveItemASHX":"True","DFLogTrackTeamCreateSaveMD5HashOutput":"6","FLogStudioLocalSaveMD5HashOutput":"6","DFFlagAnimatorAnimationPlayed":"True","FFlagUserMakeThumbstickDynamic":"False","FFlagCLI30497":"True","FFlagCLI30497R":"True","FFlagCLI30497B":"false","FFlagCLI30497W":"True","FFlagCLI30497H":"True","FFlagCLI30497S":"True","FFlagLuaAppFriendsAnalyticsOnStartup":"True","DFFlagNoExceptionForSimulatingOwnCharacterOutsideStreamingRegion2":"True","FFlagNetworkStreamingPhysicsObserverInit6":"True","DFFlagNetworkUseSharedStreamingObserver6":"True","DFFlagOptimizeTerrainStreamOut2":"True","DFFlagPartInstanceCofMPropertyExposed":"True","DFFlagLDLPGSAdditionalStatsEnabled":"True","DFFlagHttpServiceUseIpBlacklist":"True","DFFlagNotifyModelCompleteness3":"True","DFFlagCompletenessClientCreatesInstanceFix":"True","FIntCLI30497I":"2048","DFFlagJumpScaresP2":"True","FFlagAvatarExperienceUnselectTryOnFix":"True","FFlagAvatarEditorUpdateRecommendations":"True","FFlagAvatarEditorTweenMinimizeButton":"True","DFIntDesiredStreamJobTimeMSPerThread":"6","FFlagWindowsTouchEnabled":"False","FFlagTouchscreenSupport":"False","FFlagUserChatHistorySinksInput":"True","FFlagLinearFXBlurFix":"true","FFlagRenderEnableDepthClamp":"True","DFFlagFixExtraMemoryComputation":"true","FFlagXboxFixEngagementLayout":"True","FFlagLDLAkisMethodEnabled":"True","FFlagCheckGameStateOnResume":"True","FFlagLuaCatalogInfoRowEclispe":"True","FFlagLuaCatalogKeepSellAlertPositionWithKeyboard":"True","FFlagGlsles3MediumpNoHQ1":"True","FFlagCheckDataModelStateInTeleport":"True","FFlagFixACMOverlappingIssues":"True","FFlagVideoSupport":"True","DFFlagHttpsTextFilter":"True","DFIntHttpsTextFilterPercentRollout":"100","DFFlagNoSharedPinocchio":"True","DFFlagSupportMeshV4Read":"True","FFlagIssueTrackerRefactor":"True","FFlagApplyPlaceFilterEarly":"True","DFFlagAniCombinedServerPassthrough":"True","FFlagOverrideMouseBehaviourFireChanged":"True","FFlagUpdateSettingsHubGameText":"False","DFFlagNewMemoryLevelCheck":"True","DFFlagFixPreloadAsyncCallbackCrash":"True","FFlagSmallerToolboxMinWidth":"True","DFFlagRakNetUseSelect":"True","FFlagDeliverLowMemoryWarningsViaPolling":"False","FFlagStudioDraftsServiceRemovedScriptsFix":"True","FFlagEnableScaleIndependentBulletCollision2":"False","FFlagStudioLogPlaceIdOnPlaceOpen":"True","FFlagStudioDraftsDeletePreferSafeOption":"False","FFlagStudioLoadPluginsAtRightTime3":"True","FFlagStudioFixOgreWidgetCheckInPlaceSessionMainView":"True","FFlagStudioReplaceDMLockWithTaskIfNotOnMainThread":"True","FFlagStudioTranslationsTail001":"True","FFlagStudioTranslationsTail002":"True","FFlagFixMouseInStandaloneWidgets":"True","FFlagStudioPruneModeratedInstalledPlugins2":"True","FFlagStudioDoNotStoreSelectionListInPropertyWidget":"True","FFlagStudioCleanupPluginWidgetRelayViewBase":"True","FFlagGraphicsD3D9GracefullyHandleBadWindowHandle":"True","FFlagStudioCleanupPluginRefresh":"True","FFlagStudioDisconnectIDEDoc":"True","FFlagAllowLuauTypes":"True","FFlagUserChatValidateFirst":"True","FFlagDontCountHorizontalScrollsForExtTrackpad":"True","FFlagLuauOptimizeTableVarargs":"True","DFFlagLuauFasterTableLibrary":"True","FFlagLuauImproveLineInfo":"True","DFFlagNetworkUseSharedStreamingObserver6_PlaceFilter":"True;2096931771;900578327;2096931771;2293712847;4498778926","DFFlagStrictParsingFix":"True","FFlagTerrainToolsFixNilBrushProperties":"True","FFlagTerrainToolsUseFragmentsForToolPanel":"True","FFlagTerrainToolsFixPlanePositionErrorMessage":"True","FFlagTerrainToolsFixGettingTerrain":"True","FFlagTerrainToolsOffsetGenerationNoise":"True","FFlagPlayerPolicyHttpRequestHealthReportToInfluxEnabled":"True","FFlagLDLUseStasisCache":"True","FFlagIgnoreModalGuiWhenScreenGuiIsDisabled":"True","FFlagMarkAppearanceDirtyWhenUIPaddingChanges":"True","FFlagFixHorizontalScrollBarGaps":"True","DFFlagFixScalingValueReplicationWarn":"True","DFFlagStudioFixJoinSurfacesDisabled":"True","FFlagStudioEnableLuauTypeCheckingBetaFeature":"True","FFlagLuaAppBacktraceReportBaseUrl":"True","FFlagLuaChatAliasConfig_GlobalErrorWillDisable":"True","FFlagLuaChatAliasConfig_UserIdErrorWillDisable":"True","FFlagLuaChatPlayTogetherGameIconFix":"True","FFlagFetchAliasesOnStartup":"True","FIntLuaChatAliasesRolloutV5":"100","DFFlagUsePugiForAbuseReport":"True","FFlagXboxUpdateSessionChecker":"True","FFlagAvatarExperienceEnableAvatarModelLoadTime":"True","FFlagUseGenericRBXThumbUrl":"True","FFlagImplementIMEInStudio":"True","FFlagLuaCatalogPremiumUpsellModal":"True","DFFlagHttpAddSetMethodPatch":"True","DFFlagPubKeyExchange":"True","FIntNumSmoothingPasses":"3","FFlagPerPeerSnfWhitelist":"True","FFlagStopRelatives":"True","FFlagUseRoactPlayerList3":"True","FFlagFindNestedParts":"True","FFlagRTMemoryless":"True","FFlagPartMaterialTableReload":"True","FFlagBeamTextureDesyncFix":"True","FFlagFixAdornRenderNullCrash":"True","FFlagRemoveReflectionScaleValue":"True","FFlagFutureIsBrightPhase2_5EnableControls":"True","FFlagPresetLightRefactor":"True","FFlagLuaAppDisplayFriendInGame":"True","FFlagUserChatAddServerSideChecks":"True","FFlagStudioDraftsServiceHostCrashFix":"True","FFlagTerrainToolsAutoFormatNum":"True","FFlagTerrainToolMetrics":"True","FFlagTextScaledRespectUIPadding":"True","FFlagOnlyFireFocusedOnce":"True","DFIntPercentageThresholdUsingFriendsV2A3":"100","FFlagStudioGameSettingsDisablePlayabilityForDrafts":"false","FFlagCLI31175":"True","FFlagStudioDraftsDeletePreferSafeOption2":"True","DFFlagTryGCifNeedGC":"True","FFlagStudioFixInitialEnabledPluginGui2":"True","FFlagBuildGuiOnServerInStudio":"True","FFlagStudioHandlePreloadAsyncInPluginDataModels":"True","DFFlagLDLBuildProgramTimeReportEnabled":"True","DFFlagLDLProgramOpsReportingEnabled":"True","FFlagABTestLoadingDeadlockFix":"True","FFlagStopTheDefaultTeleporter":"True","DFFlagCompletenessParentMFDFix":"True","FFlagStudioGameSettingsPermissionUpdateWarning":"True","FFlagLuaLogInDisableAutoFocus":"True","DFFlagRccPassThroughMatchmakingMetadata":"True","DFFlagRccRemoveMaxGameInstances":"True","DFIntHttpInfluxHundredthsPercentage":"2","FFlagEnableAppInstallationId":"True","FFlagInitializeVideoManager":"True","DFIntLDLBuildProgramTimeReportRate":"100000","FFlagPlayerListAdjustHeightToMatchLegacy":"True","FFlagStudioEnableSafeUpdatesBetaFeature":"True","FFlagCatalogUpdateRecommendations":"True","FFlagAvatarExperienceNavigationFix":"True","FFlagLDLUnrollMatrixOperations":"True","FFlagLuaPickyScrollingPicker":"True","FFlagLuaCatalogRefactorSpawns":"True","FFlagLuaCatalogShowFloodcheckErrorToast":"True","FFlagLuaCatalogEnableFullViewToggleAnalytics":"True","FFlagLuaAppABTestFeaturedGameTileInSearch":"False","FFlagLuaAppGamesAPISetFeaturedGame":"True","FFlagLuaAppGameSortGridABTestEnabled":"True","DFFlagReportLuaKicks":"True","FFlagEnableScaleIndependentBulletCollision4":"False","FFlagGraphicsVulkanEnableDepthBiasClamp":"True","DFFlagLDLUseMinimalLocalFillElimination":"True","DFFlagFixTerrainStreamOutOptOrder":"True","FStringLuaAppGameSortGridABTestJSON":"{\"ABTestData\" : { \"Control\" : { \"UseGrid\" : false, \"GridRows\" : 0, \"UseGridMediumTile\" : false }, \"Variation1\" : { \"UseGrid\" : false, \"GridRows\" : 0, \"UseGridMediumTile\" : false }, \"Variation2\" : { \"UseGrid\" : true, \"GridRows\" : 3, \"UseGridMediumTile\" : true }, \"Variation3\" : { \"UseGrid\" : true, \"GridRows\" : 2, \"UseGridMediumTile\" : true }, \"Variation4\" : { \"UseGrid\" : true, \"GridRows\" : 3, \"UseGridMediumTile\" : false }, \"Variation5\" : { \"UseGrid\" : true, \"GridRows\" : 2, \"UseGridMediumTile\" : false } }}","FFlagMeasureSleepAssemblies":"False","FFlagFixReplaceTerrainAir":"True","FFlagStudioProperCheckForServerContentLoaded":"True","FFlagFixScrollActionOffset":"True","FFlagFixEmotesMenuInputPassthrough":"True","FFlagStudioPlaceSessionMainViewCleanupEventFilter":"True","FFlagEnablePurchasePromptV2":"True","FFlagIfYouDidntKnowNowYouKnow":"True","DFFlagUseCorrectIncompatibleVersionMessage":"True","FFlagIsPasswordValidationV2Enabled":"True","FFlagIsTwoStepValidationV2Enabled":"True","FFlagIsTwoStepResendV2Enabled":"True","DFFlagStreamingCheckParentBeforeAddingNewInstanceItem":"True","DFFlagDeprecateConnectionRejected":"True","DFFlagStreamingScaleBufByQuota":"True","DFFlagCheckFMODInitThreading2":"True","FFlagStudioGameSettingsFixDescriptionFetch":"True","FFlagStudioDeferCGESelectionListener":"True","DFFlagLuauFailFaster":"True","DFFlagGetRidOfPointlessSytemCheck":"True","DFFlagVideoFixPossibleBufferingHang":"True","DFFlagParameterValidationForLoadSoundForChannel":"True","DFFlagVideoBetterHandlingOfUnsupportedCodecs":"True","DFFlagDoNotCreatePlaybackChannelForNullSoundChannel":"True","DFFlagValidateSoundChannelInTryToLoadSound":"True","DFFlagVideoAllowNonNativeResolutions":"True","DFFlagVideoBetterCleanupOnOpenFailure":"True","DFFlagVideoStreamAlternateStopAudio":"True","DFFlagUpdateQuotaAfterMemoryUpdate":"true","DFFlagUpdateStreamingInfoWhenGC":"true","FFlagFixDuplicateChildNames":"true","FFlagLuaAppNilUserPresenceFix":"True","DFFlagLDLPGSReportCachedMemory":"True","FFlagImagePickerNow":"True","FFlagTerrainToolsFixMaterialTooltipClipping":"True","FFlagLuaSignUpBDayRefactor2":"True","FFlagStudioMitigateTemplateModerationHash":"True","FFlagGraphicsD3D11PerFrameQuery":"true","FFlagGraphicsVulkanPerFrameQuery":"true","FFlagPlayerListDontCreateUIWhenDisabled_PlaceFilter":"True;3411100258","DFFlagLoadLibraryError":"True","FFlagLuaCatalogRedirectOwnedBundleToCorrectCategory2":"True","FFlagStudioFixAutoCompleteClosingParensAnonyFuncDef":"True","DFIntNetworkStreamingGCUrgentMaxMicroSecondLimit":"8000","FFlagStudioAlwaysSendActiveSessionAnalytics":"True","FFlagEnableJavascriptHybrid2":"True","FFlagPlayerListMorePermissiveLeaderstatsCheck":"True","FFlagFixGetStringForKeycodeCrash":"False","DFFlagLaterPlayerTeamRemovingSignal":"True","FFlagEnableGameI18nForClients":"True","FFlagEnableLocaleHostForClients":"True","FFlagStudioQuickOpenPatch":"True","FFlagStudioQuickOpenFilterHiddenInstances":"True","FFlagStudioQuickOpenFixPosition":"True","FFlagStudioScriptEditorTelemetry":"True","FFlagStudioCatchUploadExceptionForAsync":"True","FFlagTerrainToolsRefactor":"True","FFlagTerrainToolsFlattenUseBaseBrush":"True","FFlagEnableScaleIndependentBulletCollision5":"True","DFFlagHideStreamingPropsWhenNotStreaming":"true","FFlagUseStudioServiceInPluginGetUserId":"True","FFlagPrefetchCharacterInfoForSignUp":"True","FFlagHttpServiceLogPluginDomains":"True","FFlagCtrlPinchRejection":"True","FFlagExtraDatamodelServicesForPluginDms":"False","DFFlagContentProviderLocalAssetPath":"True","FFlagLuaCatalogFixSearchParameterAnalytics":"True","FFlagLuauContinue":"True","FFlagLuaChatDateContentOverlapFix":"True","FFlagDataStoreCacheLimitEnabled":"True","FFlagBytecodeSerialization":"True","FFlagSignatureSerialization":"True","DFFlagReplicatorStreamingReportGCStepPercentage":"True","DFIntStreamedRegionGCUrgentFactor":"20","FFlagAvatarExperienceSaveManagerInitialization":"True","FFlagAvatarExperienceEmptyHistoryFix":"True","FFlagStudioEnableLuaPublishWorkflowBetaFeature":"False","FIntStudioBFRolesetLuaPublishWorkflow":"4","FFlagChangeHistoryIgnoreArchivable":"True","DFFlagEnableFillWedge":"True","FFlagEnableNonWhitelistedToggle":"True","FFlagEnablePurchaseV2":"True","FFlagGraphicsVulkanBetterTransferBarriers":"True","FFlagStopRenderTransparentGlyph":"True","FFlagStudioFixModuleScriptLuaStateInBacktrace_2":"True","FIntStudioDeprecateQuickFindScriptStep":"2","DFFlagStudioShowMixedTablesInWatchedVariables":"True","DFFlagReplicatePlaceVersion":"True","FFlagStudioFixIntellisenseTooltipCutoff":"True","FFlagPlayerListPerformanceImprovements":"True","FFlagStudioDontShowNilTooltip":"True","FFlagFixGetStringForKeycodeCrash2":"True","FFlagPlayerListFixUnexpectedLeaderstatsTypes":"True","FFlagPlayerListFixBlockedInitalization":"True","FFlagPlayerListFixTouchInputState":"True","FFlagPlayerListInitalizePerformanceStatsVisible":"True","FFlagMeasureSleepAssemblies2":"True","FFlagEnableToolboxInsertWithJoin":"True","DFFlagBodySafeUpdatePVEnabled":"True","FFlagStudioDraftsUseMultiselect2":"True","FFlagStudioDraftsServiceFullNameInDiff":"True","FFlagRemoveCommittedDraftsFromSelection":"True","FFlagDisableContextMenuDuringCommit":"True","DFFlagVersionControlServiceBatchCommit":"True","FFlagStudioQuickOpenSelectFirstByDefault":"True","FFlagTerrainToolsGeneratorSkipAir":"True","FFlagTerrainToolsMaterialGenerateFragments":"True","FFlagTerrainToolsFixOffsetGenerationNoise":"True","FFlagAllowDuplicateNamesOnNonAnimatedParts":"True","FFlagStudioGameSettingsFixUserSearch":"True","DFFlagDisableAncientNetworkSettings":"True","DFFlagDisableReplicatorLuaCloseConnection":"True","DFFlagDisableReplicatorLuaGetRakStatsString":"True","DFIntClientReportLuaTicketInfluxHundrethsPercentage":"10000","DFIntClientReportLuaConnectionSignalsInfluxHundrethsPercentage":"10000","DFIntServerReportLuaGetPortInfluxHundrethsPercentage":"1000","FFlagTerrainTightBoxes":"False","DFFlagTopGamesPhysicsReportingEnabled2":"True","DFIntTopGamesPhysicsReportingRatePercent":"1","DFIntTopGamesPhysicsAveExpFactorPercent":"10","DFIntTopGamesPhysicsReportingDelay":"300","FFlagStudioMeshCopyIdUseMeshId":"True","FFlagStudioSettingsDialogOnlyShowCancelWithContent":"True","FFlagStudioWatchListCheckForEditable":"True","FFlagEnableDefaultSortFix":"False","FLogPluginOnInvoke":"0","FFlagPhysicsSleepImprovementsBeta":"False","DFFlagNoExceptionsToPartsInStreaming":"true","FStringStudioUrlPhysicsSleepImprovements":"\"https://devforum.roblox.com/t/beta-test-me-sleeping-part-behavior-improvements/456931\"","FFlagLuauWarnOnUtf8":"True","FFlagUsePolicyServiceForCoreScripts2":"False","FFlagFFlagUsePolicyServiceForCoreScripts":"False","FFlagStudioFixStripedTableSelectionHover":"True","FFlagHandleMouseDownWhenFocused":"True","FFlagUseSaneScrollWheelDelta":"True","FFlagLuaChatAliasesSizingFix":"False","FFlagABTestMultipleWaitsFix":"True","FFlagSwipeNeverResetsTouchFocusEventFix":"True","FFlagAppBridgeDestroyAppOnTermination":"True","FFlagRenderForceContext":"True","DFFlagRejectEarlyHumanoidChanges":"False","FFlagSteerFloatAndThrottleFloatReplicationFix":"True","FFlagSkipLowResFix2":"True","FFlagStudioFixStringHighlightingWithBackslashZ":"False","FFlagStudioAllowDuplicateWatchVariables":"True","DFFlagStudioStopDeepLuaTableStackOverflow":"True","FFlagUsingNewCaptchaApi":"True","FFlagLuaAppInitializeABTests2":"True","DFFlagServerDisableLuaGetPort":"True","FFlagQuickOpenFixSpinner":"True","DFIntRccLinuxMemoryMegaByteLimit_PlaceFilter":"16000;4599786547;4677926228","DFFlagPremiumUpsellEnabledV2":"True","FFlagPremiumLuaUpsellEnabled":"True","FFlagPremiumLuaUpsellEnabledV2":"True","FFlagReQueryPremiumOnError":"True","FFlagAllowTGAImageAssetExtension":"True","DFFlagGCReducesQuota2":"True","FFlagAvatarSizeFixForReorganizeHeaders":"True","FFlagTerrainToolsRefactorSculptOperations":"True","FFlagUseAnalyticalElasticSpring":"True","DFFlagClientNetworkReportIpVersion":"True","FFlagFixStudioEmulatorDeviceOrientation":"True","FFlagBroadPhaseIslandAcceleratedFilterStep":"True","FFlagStudioFixShortcutSorting":"True","DFFlagDontClearForwardRefMapOnGC":"True","FFlagFIB25Update2":"True","DFFlagContentProviderLocalAssetPath3":"True","DFFlagContentProviderLocalAssetPathRCCFix":"True","FFlagExtraDatamodelServicesForPluginDms2":"True","DFFlagDontImmediatelyDeparentReplicator":"true","DFFlagStopPlayersTraverseForPhysics":"true","DFFlagAllowAnimateScripts":"true","FFlagStudioRefactorAssetPreview":"true","FFlagLuaPackagePermissions":"True","FFlagUserCameraToggle":"true","DFFlagFriendsV2BadAccessFix":"True","FFlagNewAwardBadgeEndpoint2":"True","FFlagLocalizeVideoRecordAndScreenshotText":"true","FFlagFixGamepadContextActionServiceOverride":"False","DFFlagComputeSolverDisplacementForWake":"True","FFlagUseSolverDisplacementForWake":"True","DFFlagDeferTickleAssemblyWakes":"False","FFlagUseNewSleepStage":"True","FFlagAvatarEditorUpdateCamera2":"True","FFlagAnalyticsCatalogSearchEventContext":"True","DFFlagHttpAdditionalBandwidthMetrics":"True","DFFlagHttpNetworkType":"False","DFFlagHttpDynamicSuccessStatusCode":"True","DFFlagClientNetworkReportGameInstanceId":"False","DFFlagVideoCircularBufferFix":"True","FFlagVideoUseAudioAsMasterClock":"True","DFIntUserHttpRequestsPerMinuteLimitZ_PlaceFilter":"500;4686746335;4702658078;1067560271;1067660288;735030788;2033617470;4709927839;2033617613;1765700510;1187101243;4728133914;4728134592;4728135073;4728136238;4728136475;4728136681;4728136927;4728137133;4728137352;4728137581","DFFlagAvoidVelBufWhenGC2":"True","DFFlagClientStreamingRadiusRoundConsistency":"True","FFlagCMSUseSharedUGCValidation":"True","FFlagStudioFixAutoCompleteInAnonymousFunctionDef":"True","FIntNotMovingSleepThresholdMult":"1","DFIntFriendshipEndpointMigrationRolloutPercentage":"0","FFlagGraphicsGLPerFrameQuery":"False","FFlagStudioCheckPlaceVersionMatchInTeamCreate":"True","FFlagStudioOpenModuleScriptIfNotFoundWhileDebugging":"True","FFlagFixModuleScriptBreakpointNotHitWhenParentScriptNotOpened":"False","FFlagStudioQuickOpenReopenShowHistory":"True","FFlagTrailClearCrashFix":"True","DFFlagComputeSolverDisplacementForWake_PlaceFilter":"True;679715583","FFlagUseSolverDisplacementForWake_PlaceFilter":"True;679715583","FFlagUseNewSleepStage_PlaceFilter":"True;679715583","DFFlagDeferTickleAssemblyWakes_PlaceFilter":"False;679715583","DFFlagRaknetBandwidthMetrics":"False","DFIntRaknetBandwidthInfluxHundredthsPercentage":"0","DFFlagEnableCallingWakeUpMechanicalJointsForAssembly":"True","FIntESGamePerfMonitorReportDetails":"1","FFlagLegacyShadowMapFormatRG8":"True","DFFlagUseRaisePropertyChangeForSoundPlaying":"True","FFlagRefactorPluginLoading":"False","FFlagFixWeakFunctionRefInPlugin":"True","FStringStudioUrlInsertObjectStreamlining":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/object-insertion-workflow-improvements-beta-2/468307","DFFlagPremiumGameIdFix":"True","FFlagUpsellDirectToPackage":"True","DFFlagStreamingFasterTargetRadiusIncreaseAfterGC":"True","FFlagFixNotificationScriptError":"True","FFlagUserRemoveTheCameraApi":"True","DFIntVideoStreamMaxBufferMs":"200","DFIntVideoStreamMinBufferMs":"100","DFFlagUseThresholdForMotor6DWakes":"False","DFFlagWakePartsOnGravityChange":"True","FFlagStudioFixPublishSuccessNameIcon":"True","FFlagPublishPlaceToRobloxLuaPlugin":"True","FFlagStudioRefactorStudioVerbsSavePublishDuplicateCode":"False","FFlagStudioFixPhantomBreakpointOnLineDelete":"True","DFStringGlobalUniverse17sIds":"14743789;1482020489","DFFlagGlobalToggle17sApis":"True","DFFlagHttpRbxApiEnable17sApis":"True","DFFlagEnableMacWindowCloseButton":"True","DFFlagJointInstanceEnabled":"True","DFFlagEconomyCreatorStatsApiWhitelist":"True","DFFlagPostPremiumUpsells":"True","FFlagLogPremiumImpressions":"True","FFlagEnableRobuxIconXbox":"True","FFlagXboxReportPlayerLocFix":"True","FFlagStudioScriptEditorContentsChangingRefine":"False","DFFlagUseRaisePropertyChangeForSoundTimePosition":"True","FFlagStudioScriptFindElideCopies":"True","LuaAppPercentRolloutGameDetailMoreAnalytics":"100","FFlagXboxLessInfiniteFunctionMarshaller":"True","FFlagFixRobloxInputBadArrayLengthChecks":"True","FFlagUserChatNewMessageLengthCheck2":"True","FFlagAvatarEditorFixCutOffItemName":"True","FFlagLuaChatAliasesSizingFixV2":"True","FIntLuaAppLogoutUserOnUnauthorizedPercentRollout":"100","FFlagStudioPressEndToEndOfLine":"True","FFlagStudioFoldSafeLexer":"True","FFlagStudioFixGetClassIcon":"True","FFlagDoTeleportCloseCurrentDMBlocking":"False","FFlagRemoveDmCheckInSetLocalPlayerInfo":"True","DFFlagSimLDLProgramNewStatsEnabled":"False","DFFlagRejectEarlyHumanoidChanges2":"True","FFlagAssetManagerLuaCleanup1":"True","FFlagTrailLockFailCrashFix":"True","DFFlagDebugRealityCheck3":"True","DFFlagRemoveOldNFWL":"True","FFlagAlwaysGenerateGuid2":"True","DFIntStreamingPauseVelBufMaxDurationMS":"4000","FFlagStudioReportOpenPlace":"True","FFlagStudioReportLoginAnalytics":"True","FFlagStudioReportBaseUrl":"True","FFlagStudioGameSettingsGroupGamePermissionChanges":"True","DFFlagVideoModifyMutexes":"True","DFFlagVideoEnableDeviceTuning":"True","DFFlagVideoFixAbsurdlySlowDataCopy":"True","DFFlagVideoEnableGetInfo_PlaceFilter":"True;4587054145;4521759066;4589144917;1921623329;4710199611;4786133739","DFFlagAlwaysLongStep":"True","FFlagStudioConfirmPublishWithDirtyDrafts":"True","FFlagStudioQuickImproveResponsiveness":"True","FFlagJIRA_RIDE_184_V2":"True","FFlagVersionControlServiceScriptCollabEnabledByDefault":"True","FFlagStudioFixAssetPreviewTreeView":"True","DFFlagSimDontResetContactsOnNotifyAssemblyPrimitiveMoved":"True","DFFlagTweenServiceOnStepped":"False","FFlagLocalizationToolsLocalizationEnabled":"True","DFFlagFixRijndaelCBC":"True","FFlagLoadTheLoadingScreenEvenFaster":"true","DFFlagClientNetworkSendGameInstanceId":"True","FFlagOutputWidgetFindEnabled":"False","FFlagCoreScriptOverrideRefactor":"true","FFlagXboxUseNewBundleEndpoints2":"True","DFFlagVectorMinMax":"True","FFlagXboxHardwareBundleEnabled":"True","FFlagStudioEnhanceEmulationDeviceManager":"True","FFlagBindToAllInterfaces":"True","DFFlagConnectIPv6ServerInLAN":"True","FFlagRakNetSupportIpV6":"True","FFlagImproveCatalogPerformance":"True","DFFlagPremiumUpsellUserId":"True","FFlagLuauImmutableUpvalues":"True","FFlagLuauCaptureOp":"True","FFlagPremiumUpsellPrecheck":"True","FFlagRefactorPluginLoadingForDeadlock":"True","FFlagScaleToolUseBinarySearch":"True","DFFlagUseRefactoredHitTest":"False","DFFlagUseRefactoredRaycast":"False","DFFlagRefactoredIkSolve":"True","FFlagDisableAutoTranslateForKeyTranslatedContent":"True","FFlagDisableReconnectAfterPotentialTimeout":"True","DFFlagFixCoreScriptModuleDebuggerDataNotMappingOnBaseLevelScript":"True","FFlagStudioFixOpenCoreScriptDocDatamodelMapping":"True","DFLogPartStreamingRequests_PlaceFilter":"6;2291717546;2623652930;2753554889;3027055174;4599786547","FFlagStudioEnableProjectConfig":"True","FFlagScriptContextEnableDetailedErrorSignal":"True","FFlagLuaAppUseDetailedErrorSignal2":"True","FIntInstrumentGuacRollout":"100","FFlagLuaAppPolicyMockRefactor":"True","FFlagLuaAppPolicyUseGuac":"True","FFlagEnableAppPolicyDefaultsFile":"True","FFlagLuaAppMorePagePolicyFix":"True","FFlagLuaAppTopBarCustomBackButton":"True","DFFlagSimLDLProgramNewStatsEnabled2":"True","FFlagCJVNotFallbackToEnglishForUGCEnabled":"True","FFlagStudioDisplayNameCrashFixEnabled":"True","FFlagSimLDLProgramMemoryOptimization":"True","FFlagStudioDeprecateQuickFindScriptTotally":"True","FFlagStudioFixNullptrTeamCreateDCCrash":"True","FFlagStudioEnableCoreScriptOpeningForInternalDevs":"True","FFlagStudioDisablePluginButtonsInProgress":"False","FFlagStudioCreateGroupOwner":"False","FFlagStudioGameSettingsUserGameEditPermissionsRestriction":"True","FIntStudioBFRolesetAccessPermissions":"4","FFlagEnableStartupControllerOnWindows":"True","FFlagCFrameVectors":"True","FFlagNoMoreDraggerFloatingPointError":"True","FFlagRemoveImplicitIkDraggerUndoWaypoint":"True","FFlagStudioServiceShowConstraintDetails":"True","FFlagStudioAllowBuiltinActionOverride":"True","FFlagStudioDisablePublishButtonsInProgress":"True","FFlagStudioCreateGameGroupOwner":"True","FFlagUWPLocaleManagerEnabled":"True","DFFlagSimEnableTouchEventManager":"True","FFlagStudioReportPlaceSize":"True","DFFlagFasterHasNanInf":"True","DFFlagBodyAtomicUpdate":"True","DFFlagParallelCollisionsFaster":"True","FFlagStudioLanguageService":"False","DFFlagMegaRepOnlyClearWhenNewlyAlive":"true","DFFlagInstanceOrderCheck":"False","FFlagStudioAutoFocusNewScripts":"True","FFlagStudioDefaultPopulateFindWidget":"True","FFlagStudioFixLocalShutdownRequest":"False","DFFlagLogIsAPVAdornment":"False","FFlagLuauHighlightContinue":"true","FFlagStudioLuauWarningTelemetry":"False","FFlagRankMatchByMatchedLength":"True","FFlagTryTranslateParameterOnSourceMatch":"True","DFFlagReportParameterContent":"True","FFlagAllowPasteKeysBetweenAnimations":"True","FFlagFixMockStudioTheme":"True","FFlagUseGetKeyframeSequenceIgnoreCache":"True","FFlagAddStatCounters":"True","FFlagStudioEnableResume":"False","FFlagRefactorPluginLoading2":"False","DFFlagFastVisuallyMovingCounters":"False","FFlagAndroidSetSafeZoneOffsets":"True","FFlagStudioDeviceEmulatorSetSafeZone":"True","FFlagFixRunServiceStopFromPlugin":"True","FFlagStudioGameSettingsAccessPermissions":"True","FFlagStudioCloseOnMiddleButtonRelease":"True","FFlagStudioFixMacFileOpen":"True","FFlagStudioUseAnimationEditorAnalytics2":"True","FFlagLuauNewResume":"False","FFlagEnableDoubleClickSupport":"True","FFlagInGameMenuSinglePaneDesign":"True","FFlagInvalidateNanTimeStamp":"True","DFIntTrackCountryRegionAPIHundredthsPercent":"100","FFlagMacStudioInitCrashHandlingFirstAfterFlagLoaded":"True","FFlagGraphicsGLProperCheckForFramebuffer":"True","FFlagAccountReplicatorQueueItemTypes":"True","FFlagStudioQuickOpenSearchActions":"True","FFlagStudioTightenSaveMutexLocks":"True","DFFlagRCCMonitoringInitializeCpuVariables":"True","DFFlagRaknetBandwidthMetricsAddServerIp":"False","FFlagCollectAnalyticsForSystemMenu":"True","DFFlagRCCMonitoringCustomTimeouts":"True","DFIntHttpRbxApiMaxRetryBudgetPerMinute":"10","DFIntHttpRbxApiMaxRetryCount":"3","FFlagPlayerListFixStatFlickering":"True","FFlagCorescriptThumbnailsRespectBaseUrl":"True","FFlagPlayerListBetterDropDownPositioning2":"True","FFlagPlayerListUseUIBloxIcons":"True","FFlagPlayerListFixTouchInputState2":"True","FFlagNewIrradianceCalculation":"True","DFFlagRccUseCmdLineLimits":"True","DFFlagRaknetBandwidthAddDataCenterId":"False","DFFlagRequireModulesTypeCheckAnalyticsEnabled":"True","DFIntRequireModulesTypeMismatchWarningCount":"8","DFIntAssetTypeCheckPermyriad":"1000","FFlagDoesNotLoadCachedFileSyncItemsForLuaApp":"True","FFlagStudioFixCDNUrlForProjectConfig":"True","FFlagStudioSandboxCrashFix":"True","DFFlagTouchQueueMetrics":"True","DFIntTouchQueueMetricsSendEveryXSeconds":"300","DFIntTouchQueueMetricsInfluxHundredthsPercentage":"10000","FFlagStudioFixTemplateModerationHashRemovalOnTCEnable":"True","DFFlagSimLDLComponentMemoryUseComputationFix":"True","FFlagStudioEnableAssetManagerService":"True","FFlagStudioAddBulkImportView":"True","FFlagStudioEnableBulkImportFromLua":"True","FFlagDoNotGetAntiAddictionPolicyInRenderStep":"False","FFlagStudioMakeActivityCounterListCrashDueToLocale":"True","FFlagStudioPlaceSessionModelIncorrectLocaleCountryCrash":"True","FFlagStudioIncorrectLocaleInLogFile":"True","FFlagGraphicsGLDisableTimerQueryAdreno":"False","FFlagGraphicsGLPerFrameQuery2":"False","FFlagStudioEnableEmulationDeviceEditor":"True","FFlagStudioAssetManagerBetaFeature":"true","FIntStudioBFRolesetAssetManager":"2","DFIntReportParameterContentHundredthsPercent":"8000","DFFlagLocalizationServiceGetCountryCodeAPINullptrCheckFix":"True","DFFlagPlayerPolicyGetApiUrlForRequestPolicyInfoFix":"True","DFFlagPlayFabPlayerLoginLogoutAsServerEvents":"False","DFFlagPlayFabEmitMarketplaceEvents":"False","FFlagPackageDiffBugFix":"True","FFlagStudioChatSessionHandlerCrashFix":"True","FFlagLuaAppSiteBannerLinks":"True","FFlagTopBarHideSiteBanner":"True","FFlagWebViewsUseLuaGameDetails":"False","FFlagEnableAppsFlyerLinks":"True","EnableAppsFlyerDeferredLinks":"True","FFlagEnableGameStartUniversalLink":"True","FFlagLuaAppRefactorInAppLinks2":"True","FFlagAppBridgeExplicitDefaultPlayerParams":"False","DFFlagClientDisableLuaTicket":"True","FFlagStudioUpdateRuiDialog":"True","FIntDataModelPatcherEventPercentage":"1","FFlagEnablePluginPermissionsPage2":"True","FFlagPluginIdentityFix":"True","FFlagPluginManagementPrettifyDesign2":"True","FFlagStudioFetchPluginName":"True","FFlagStudioHttpServiceUsePluginPermissions":"True","FFlagStudioPermissionsServiceEnabled":"True","FixChromebookEnterKeyIssue":"True","FFlagStudioDontHideWatchItems":"True","FFlagAlwaysWriteLegacyLock":"True","FFlagAppShellReporterMonitorFrameTime2":"True","FFlagMemoryFromAppShellReporter2":"True","FFlagGameDetailsPeekViewAnalyticsEvents2":"True","FIntTaskSchedulerThreadMin":"0","FFlagStudioTimerRefactor":"False","FFlagDumbSpatialHash":"False","DFFlagTweecall":"True","FFlagStudioInsertObjectStreamliningv0_Consolidated":"True","FFlagStudioInsertObjectStreamliningv2_TranslatedToolTips":"True","FFlagStudioInsertObjectStreamliningv2_SharedModelBugFix":"True","FFlagStudioInsertObjectStreamliningv2_MultiWindowContextPlacementBugFix":"True","FFlagStudioInsertObjectStreamliningv2_DataModelLifetimeBugFix":"True","FFlagStudioInsertObjectStreamliningv2_ShowRecommendedObjectsOnly":"True","FFlagStudioInsertObjectStreamliningv2_ExpandedView":"True","FFlagStudioInsertObjectStreamliningv2_InsertMenuShortcut":"True","DFFlagBallSocketMaxFrictionTorqueEnabled":"False","DFFlagAngularVelocityReactionTorqueEnabled":"True","FFlagStudioDefaultGroupInDropdownPublish":"True","DFFlagStopSoundTaskOnChannelTreeNullified":"True","FFlagRemoveLinkFromKinematicJoints":"False","FFlagSpanningEdgeCacheIsInTree":"True","FFlagConsistentCofmForAnimatedAssemblies":"True","DFFlagParallelSendTouches":"False","DFFlagDoNotRepeatRedundantPlayingEvents":"True","DFFlagDoNotRepeatRedundantVideoPlayingEvents":"True","DFFlagReportReplicationVariantLimitHit":"True","DFIntClientSendEventStringDataLimitBytes":"75000000","DFIntClientSendEventVariantCountLimit":"1500000","DFIntRCCReceiveEventStringDataLimitBytes":"75000000","DFIntRCCReceiveEventVariantCountLimit":"1500000","DFFlagSimLDLProgramForceUnroll":"True","DFFlagLuaNoResetStack":"True","FFlagLuauTypeAnnotationsEverywhere":"True","FFlagAvatarExperienceImproveBackgroundTransition":"True","FFlagAvatarExperienceUseInternalBackgroundAsset":"True","FFlagStudioEnablePhoneAndTableDefault":"True","DFFlagBallSocketMaxFrictionTorqueEnabled_PlaceFilter":"True;4588303397","DFFlagDisableDebuggerDisconnect":"True","FFlagStudioInsertObjectStreamliningv2_Consolidated":"True","DFFlagAllowLuauUpdates":"True","DFFlagWarnTypeCheckOnRequire":"False","DFFlagForceTypeCheckOnRequire":"True","FFlagAddSidToGameJoinLoadTime":"True","FFlagEnableConvertToTerrainBeta":"True","FFlagSerializerIgnoresMD5":"True","FFlagStudioDeviceManagerAddPreview":"true","DFFlagPlayFabEmitTeleportEvents":"True","FFlagPeekPreviewMenuClose":"True","FFlagCatalogAnimationIdlePreview":"True","DFFlagSimLDLPGSStatsBufferBreakdownReporting":"True","FFlagAvatarExperienceOutfitRecommendations":"False","FFlagRenderImproveStreaming":"False","FFlagTerrainToolsImportImproveColorMapToggle":"True","FFlagTerrainToolsRefactorAssetIdSelector2":"True","FFlagTerrainToolsSmoothToolIgnoreWater":"True","DFFlagEnable17sNotifications":"True","FFlagPlayerListFixLeaderboardDisabledError":"True","FIntNumberParalleNarrowPhaseThreads":"16","FIntParalleNarrowPhaseThreads":"16","FIntLDLPGSMaxParallelTasks":"16","FFlagUnlockOnlyCountTheRecentGamesOnce":"True","FFlagCheckInstanceIsInScope":"True","FFlagFixModuleScriptBreakpointNotHitWhenParentScriptNotOpened2":"True","FFlagStudioFixStringHighlightingWithBackslashZ2":"True","FFlagStudioRefactorStudioVerbsSavePublishDuplicateCode2":"True","FFlagImmHandlerFixJapaneseAndKorean":"False","FFlagReportInputMethodAnalytics":"False","FFlagFixTextSelectionForHighDpi":"True","FFlagStopCheckingFrontendProcessingInTextLayout":"True","FFlagStudioUILibFixAssetTypeMap":"True","FFlagEnableUIGradientEnabledProperty":"False","FFlagStudioEnableVirtualKeyboardAnimation":"True","DFFlagConsumePlatformNameOverAlternateName":"False","FFlagSuperSmoothMouseWheelScrolling":"True","DFIntReplicationVariantLimitHundredthPercent":"10000","FStringEnableiCloudWebCredentialsBtIdsList":"49593556386,49593556386,44219219422,49373021284,49849080647","FIntSmoothMouseSpringFrequencyTenths":"45","FFlagDefaultLocDelimFix":"True","DFFlagPremiumUpsellRecheckPremium":"True","FFlagPluginManagementFixRemovePlugins":"True","FFlagLuaAppMorePageFixEventLoading":"True","FFlagLuaAppMorePageMoveEventsToPosition6":"True","FFlagLuaAppUseNewMorePage":"False","DFFlagRenameDisplayNameToPlatformName":"True","DFFlagVisualEngineTrackHeadless":"True","DFFlagPartMassEnabled":"True","DFFlagAnimatorApplyJointVelocities":"True","FFlagLuauPreciseLocals":"True","FFlagCoreScriptTopBarStartup":"False","FFlagStudioInfoBar2":"True","FFlagStudioInfoBarOnDraftCreation":"True","FFlagLuauNewResume2":"True","FFlagLuauNewDebugger":"True","FFlagEnableLuaDraggersBetaFeature":"True","FFlagXboxAppShellSiblingZIndex2":"True","DFFlagFixPlayerGetTeamNeutral":"True","FFlagPlayerListFixTeamUpdates":"True","FStringNewTopBarForcedUserIds":"959520514,656046844,146914182,975669155,344925094,247305679,956690111,1026207482,485327537,166540505,1300488959,1220631541,169775909,1498251806,401950003,751568948,2231221,7210880,931389991,1478764079,597663806,1298953044,1542933305,1182179679,1516442,1155027644,648897862","FFlagEnableOverrideAssetCursorFix":"True","FFlagStudioNewDirtyPublishWarningDialog":"True","FFlagDataModelPatcherAlwaysRecordErrors":"True","FFlagReplicatorInitializeSharedSchema":"True","DFFlagReplicatorUseSharedSchema":"True","FFlagStudioSandboxVerifyIntegrityOnInitialize":"True","FFlagStudioScriptEditorEventsCrashFix":"True","FFlagStudioReportSavePlaceTime":"True","FFlagStudioFixSessionLengthCap":"True","FFlagReportMechanismChangeDuringGameplayCount":"True","DFFlagUseRefactoredRaycast3":"True","DFFlagUseRefactoredHitTest2":"True","DFFlagDebugForcePubKeyExchange":"True","DFFlagNetworkAuditEn2":"True","DFFlagPreventDeepTuples":"True","DFFlagMoreNfPlayer":"True","DFFlagReplicateAllowLuauOnly":"True","DFFlagUseThresholdForMotor6DWakes2":"False","FFlagStudioFixMeshPartPreview":"True","FFlagStudioAssetPreviewTreeFix2":"True","FFlagTruncateDevFrameworkHyperlinkText":"True","FFlagWorldModelV4":"False","FFlagAllowWorldModelCreationV2":"True","FFlagWorldModelRefactorV3":"False","DFFlagInstanceOrderCheck2":"True","FFlagRenderEmitterRecomputeOnChange2":"False","FFlagEnableReadingNewConvexDecompositionPath":"True","FFlagStudioChangeMinimumSizeOfPublishWindow":"True","FFlagStudioCreateNewGameRewritesName":"True","FFlagLuaAppMediumTileInGameSearchPage":"True","FIntLuaAppPercentRolloutFeaturedGameTileInSearch":"100","FFlagLuaAppPreloadDataInProgressWait":"True","FFlagLeaveStartingCoreScriptsToPlaceLauncher":"True","FFlagFixNavigationToChatFromPN":"True","FFlagDataModelPatcherBootstrapEnabled":"True","FFlagRenderShadowDisableBottomClip":"True","FFlagRenderMetalFixMaxFP16Samples":"True","FFlagRenderHalfresShadowsVulkan":"True","FFlagRenderGrassUpdateBudgetFix":"True","FFlagRenderShadowmapNoMSAADepth":"True","DFFlagBallSocketMaxFrictionTorqueEnabled2":"True","FFlagJointInstanceRenderAdornCheck":"True","FFlagLuaAppUseSessionization":"True","FFlagLaunchAppWaitForABTestsInitialized":"True","FFlagEnableAvatarExperienceLandingPageABTest3":"True","FFlagAELandingPageAnalytics":"True","FFlagPerformPurchaseNewBundleInfoTypeEnabled":"True","FFlagEmotesMenuNewKeybinds":"True","FFlagStudioPreventAccidentalTyposWhenHittingBreakpoint":"True","FFlagLuaAppSendLogsToBacktrace":"True","FFlagLuauFixSetMetatableType":"True","FFlagUseNewSleepStage2":"True","FStringFeature_NewGameJoinTeleport":"426;100","DFFlagOnlyOneRightGrip_PlaceFilter":"True;189707;4837595186;4586741827;3487742603;2747834912;4388574342","FFlagStudioLuauWarningTelemetry2":"True","DFIntParallelNarrowPhaseSerialCutoff":"50","DFFlagPlayerPolicyGetDMFromService":"True","DFFlagPlayerPolicyReportHttpFailureOnEveryAttempt":"True","FFlagMobileUseApplicationDirectories":"True","FFlagQtReadSystemProxy":"True","FFlagLuaAppUseNewEventsPage":"True","FFlagAvatarExperienceBackgroundThemeFix":"True","DFFlagDeferTickleAssemblyWakes2":"True","FFlagStudioFixDisappearingVirtualKeyboard":"True","FFlagGfxPartInvalidationLimitToTime":"False","FFlagGraphicsVulkanPreRotate":"False","FFlagStudioSavePlaceAs":"False","FFlagFixStartupGameLaunchFromLink":"True","FFlagGameSettingsUseUILibraryCheckBox":"True","FFlagGameSettingsUsesNewIconEndpoint":"True","FFlagWebViewsUseLuaGameDetails2":"True","FFlagLuauLookupImportedTypeCorrectly":"True","FFlagStudioFixMultipleAssetsImportLogic":"True","FFlagAvatarEditorAttachmentCameraFocus":"False","FFlagRenderMsaaShadowsVulkan":"True","FFlagLuauNewDebuggerGracefulYields":"True","DFFlagUseThresholdForMotor6DWakes2_PlaceFilter":"False;679715583","DFFlagAlwaysLogTcDisco":"True","FFlagAvatarCatalogCloseSearchWhenAvatarIsTapped":"True","DFFlagDeferTickleAssemblyWakes2_PlaceFilter":"False;441585237","DFFlagVideoCleanUpTimeHandling":"True","FFlagPassPointerActionsToGuiObjects":"True","FFlagIgnoreActiveWhenProcessingPointerActions":"True","FFlagScrollingFrameTrackpadSupport":"True","FFlagPublicIKSolve":"True","FFlagColor3ToHSVMethod":"True","FFlagStudioServiceDrawConstraintsOnTop":"True","FFlagEnableRaycastParams":"True","FFlagEnableGizmoRaycast":"True","FFlagFixAdvancedObjectsDragDropAssert":"True","FFlagExtendSelectionBoxAdornee":"True","FFlagStudioReportTCStatusWhenOpenPlace":"True","FFlagStudioAddTCConnectTimeout":"True","FFlagStudioFixTextBoxFocusAndToolTipCloseClashHang":"False","DFFlagPhysicsServiceCorrectPlayerCountForTouch_PlaceFilter":"True;4599786547;467050215","DFFlagParallelSendTouches2_PlaceFilter":"True;4599786547","FFlagAvatarEditorRecommendedUIBloxButton":"True","FFlagStudioInsertObjectStreamliningv2_FeedbackImprovements":"True","FStringStudioUrlAssetManager":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/asset-manager-is-here-beta/517475","FFlagStudioAddBulkImportView2":"True","DFFlagAssetManagerPackageSymbolicLinkFix":"True","DFFlagSimLDLProgramWorkspaceAndRSIStats":"True","FFlagFixTreeViewFlatListDefault":"True","FFlagStudioFixTreeViewForSquish":"True","FFlagStudioFixUILibraryRequireForPreviewInToolbox":"True","FFlagStudioFixAssetPreviewCloseButton":"True","FFlagStudioFixTreeViewForFlatList":"True","DFFlagCacheSoundStats":"True","DFFlagReplicatorProcessPacketMicroprofilerCleanup":"True","DFFlagUseUniqueProfilePorts":"True","FFlagAvatarExperienceAnimationLookAroundFix":"True","FFlagAvatarExperienceCatalogAnimationIdleFix":"True","FFlagStudioAlwaysCompleteFunctionEnd":"True","DFFlagOnlyOneRightGrip":"True","FFlagGetTranslatorApiOnlyForPublishedGame":"True","FFlagEnableAuthV2Login":"True","DFFlagStudioRefactorSaveToRoblox":"True","FFlagSkipFirstMechanismChangeReport":"True","FFlagTerrainToolsTerrainBrushNotSingleton":"True","FFlagTextViewStdReplace":"True","FFlagAvatarExperienceUseUIBloxAlerts":"True","FFlagPlayerListMorePerfImprovements":"False","FFlagHumanoidCacheNameplate":"True","FFlagStudioAllowCorePackagesAndStarterScriptDebugOnStart":"True","FFlagLuauParseArgTypesRefactor":"True","FFlagLuauSkinnyArrows":"True","FFlagAppBridgeNewGameJoinTeleport":"False","DFIntFriendshipEndpointMigrationRolloutPercentageV2":"100","FFlagUGCValidateTags":"True","FFlagUGCValidateMeshBounds":"False","FFlagUGCValidateTextureSize":"True","FFlagUGCValidateHandleSize":"False","FFlagUGCValidateProperties":"True","FFlagUGCAllowThumbnailCameraValue":"False","FFlagUGCUseNewAssetTypeInfoSchema":"True","FFlagEnableThumbnailCameraValue":"False","FFlagRemoveLinkFromKinematicJoints2":"True","FFlagStudioFixPluginWidgetEnabledSignal":"True","FFlagStudioDebuggerLazyLoadVariables":"True","FFlagStudioRewriteEmulatorWithMask2":"False","DFIntGetFriendsOnlineEndpointMigrationRolloutPercentage":"100","DFFlagVideoFixDeviceTuningForAudioOnlyFiles_PlaceFilter":"True;4898980405","FFlagCMSTabErrorIcon":"True","FFlagStudioHashtagIsNotAComment":"True","FFlagImmediatelyApplyFlagsButton":"True","FFlagEnableFRMInSoloMode":"True","FFlagUseInitialTerrainCacheForNonStreaming_PlaceFilter":"True;2317712696","DFFlagDisableLegacyPlayerJoin":"True","FFlagMouseWheelEventSinkingPropagatesToGUI":"True","FFlagMultiBinaryAssets":"True","FFlagUserFixZoomInZoomOutDiscrepancy":"True","FFlagClickDetectorUsesHRPForDistanceCalculation":"True","FFlagDumbSpatialHash2":"True","FFlagModifiedMinimumDistance":"True","FFlagCullByDistanceToPOI":"True","FFlagTopBarUseNewIcons":"True","FFlagInGameMenuSmallerSideBar":"True","FFlagTopBarBetterStateInit":"True","DFFlagSimSolverBufferPurgeEnabled":"True","DFFlagSimLDLProgramFlopCountStats":"True","DFFlagRejectInvalidToolParentChanges2":"True","FFlagUseBlake2BHashInSharedString":"False","DFFlagCompletenessDeadParentRemovingChildFix":"True","FFlagLuauFixConditionRepeatUntil":"True","FFlagAvatarEditorShowEquippedItem":"True","FFlagItemDetailsClosePeekViewFixes":"True","FFlagPeekViewSinkInputTo3dView":"True","FFlagRefactorPluginLoading3":"False","FFlagParallelFetchInternalPermission":"True","FFlagStudioEnableFileWatcherDelay":"True","FFlagDataModelPatcherFixMajorVersionReporting":"True","FFlagDragWeirdConstraints":"True","FFlagDraggerUseModelCFrame":"True","FFlagDontReselectSelectTool":"True","FFlagLazyBoxSelect":"True","FFlagTrackMouseDownState":"True","FFlagTrackAttachmentBounds":"True","FFlagDragOutsideWorkspace":"True","FFlagMinScaleSizeFix":"True","FFlagClearHoverBoxOnDelete":"True","FFlagSinglePartAlwaysLocalSpace":"True","FFlagContextMenuSupportLuaDraggers":"True","FFlagEnableMotor6DTransformFixBetaFeature":"False","FFlagXboxCheck2sv":"True","FStringMotor6DTransformFixBetaUrl":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/changes-to-motor6d-transform-coming-monday/526807","DFFlagReplicatorKickReadEventStringDataAndVariantLimit":"False","DFFlagReplicatorKickWriteEventStringDataAndVariantLimit":"False","FFlagFixPlaybackWithEndFrameAtZero":"True","FFlagUseInitialTerrainCacheForNonStreaming":"True","DFFlagPubKeyExchange22":"False","FFlagStudioFixVirtualKeyboardRect":"True","FFlagAccelerateDuplicateCollisionFidelityReprocess":"True","FFlagFixHACDHullPointLoss":"True","FFlagPhysicsNewConvexDecompositionEnabled":"False","FFlagStudioDraftsWidgetCommitButton":"True","FFlagStudioMigrateGlobalToCJVInChina":"False","FFlagStudioEnableEmergencyMessageDisplayV2":"True","FFlagStudioEnableUrlLinkForEmergencyMessage":"True","FFlagStudioCheckEmergencyMessageOnUserLogIn":"True","FFlagStudioMoveMorpherEditorInsideGameSettings":"True","FFlagStudioPopulateIntlInfo":"False","FFlagStudioRestrictUiLibraryUsage":"True","FFlagStudioUiLibraryErrorOnNilIncludes":"True","FFlagStudioFixNullUniverseInGetResourceByCategory":"True","FFlagTerrainToolsOnlyImportInEditMode":"True","FFlagTerrainToolsFixMergeEmpty":"True","FFlagTerrainToolsFixRegionEditorCleanup":"True","FFlagPromptRobloxPurchaseEnabled":"True","FFlagCanvasPosChangedOnStepElasticBounds":"True","FFlagLuaUIBloxModalWindowAnchorPoint":"True","FFlagCatalogSortAndFilters2":"True","FFlagStudioQuitMessingWithHotKeys":"True","FFlagFixTestServiceWithDebugging":"True","FFlagStudioWrapScriptTextEditorInQPointer":"True","FFlagStudioFixTCTimeoutReport":"True","FFlagStudioAlignBlockEnderOuter":"True","FFlagAvatarEditorClearTryOnFix":"True","DFFlagUseTaskSchedulerThreadLimit":"True","FFlagLuauCompileError":"True","DFFlagDontClearTouchEventsDuringInterpolation":"True","FFlagStudioEncodeEmergencyMessage":"True","FFlagEnableiOSGameTimerFix2":"True","FFlagMaterialGeneratorRefactorV1":"True","FFlagEnableParamsBasedRaycast":"True","DFFlagMotor6DTransformFix":"True","DFFlagMotor6DParentNameEnabled":"True","FFlagSystemAddressIsPeerId":"False","FIntABTestRequestTimeoutMilliseconds":"5000","DFFlagHumanoidInstanceGuard":"True","DFIntRCCLoadPackageRetryTimeDelay":"0","DFIntRCCLoadPackageRetryTimes":"4","FFlagAppBridgeNewGameEvents":"True","FFlagPremiumSettingsLabel":"True","DFFlagDeprecateRakNetRand":"True","FFlagDataStoreAdditionalMetricsEnabled":"True","FFlagTerrainToolsUseDevFramework":"False","DFFlagContactStepAsyncFaster":"True","FFlagLuaAppReportConnectFailSeparately":"True","FFlagLuaAppAEUseAppPolicyForCustomCostumeNames":"True","FFlagLocalStorageQueuePendingFlush":"True","FFlagEnableUIGradientEnabledProperty2":"True","FFlagFixMakeFriendsNavCrash":"True","FFlagStudioPublishMediatorFailedConnection":"True","FFlagStudioCreateNewGameRewritesName2":"True","FFlagStudioAssetManagerDisableTileOverlay":"True","FFlagStudioAssetManagerBulkImportUniverseLoadError":"True","DFFlagHandleFMODConstructorReturningNonNullInvalidPtr":"True","FFlagFixDisplayScriptsFolderInAssetManager":"True","FFlagVersionControlServiceScriptCollabEnabledByDefaultFalse":"True","DFFlagFastVisuallyMovingCounters2":"False","FFlagAdditionalExtJoinData":"True","DFFlagEnableExtendedAnalytics":"True","FFlagFixZeroNormalInDecompositeGeometry":"True","FFlagScrollingFrameLayoutV3":"False","FFlagDevConsoleUseZeroCanvasWidthLogOutput":"True","FFlagScrollingFrameFixElasticBoundingDecrease":"True","FFlagInGameMenuUseUIBloxButtons":"True","FFlagFixLocalShutdownRequest":"False","FFlagDedupePackagesInAssetManager":"True","FFlagDetailedRequireErrorMsg":"True","DFFlagPlayFabEventsV2":"True","DFFlagPlayFabEmitMarketplaceEvents2":"True","FFlagStudioLocalizationInGameSettingsEnabled":"False","FFlagCatalogFullAvatarWifiIcon":"True","FFlagDropToolCaptureMouse":"True","FFlagMoverSwapWeld":"True","FFlagScaleAlwaysAnchors":"True","FFlagTreatToolAsModel":"True","FFlagFixHoverBoxThickness":"True","FFlagLuaDraggerIconBandaid":"True","FFlagTakeAScreenshotOfThis":"True","FFlagStudioCommandBarAlwaysEnabled":"True","FFlagTerrainToolsTweakBrushPower":"True","FFlagFixDevFrameworkDockWidgetRestore":"True","FFlagStudioApplyFiltersToReplaceAll":"True","FFlagScriptEditorEnableShowWhitespace":"True","FFlagResellersListClickThrough":"True","FFlagUseBlake2BHashInSharedString_PlaceFilter":"True;4939501074","DFFlagHACDUseDistancePlaneChecks":"True","DFFlagUseLockFreeVoronoiSimplexContainer":"True","DFFlagVideoFixTextureInitialization":"True","DFFlagVideoFixFrameSizing":"True","FFlagEnableThumbnailConfiguration":"True","FFlagUGCAllowThumbnailConfiguration":"True","DFFlagVideoShowInitialFrameAsTexture2":"True","DFFlagVideoFixDeviceTuningForAudioOnlyFiles":"True","DFFlagVideoCleanUpAudioDeviceStartStop":"True","FFlagPlayerListMorePerfImprovements2":"True","FFlagMinimizePlayerListWhenTopBarOpen":"True","FFlagXboxAppShellSiblingZIndex3":"True","FFlagRobloxGuiSiblingZindexs2":"True","FFlagFixRobloxInputBadArrayLengthChecksTheSagaContinues":"True","FFlagStudioAddDebuggingFlowLocation":"True","FFlagStudioStopRBXASSERTOnDeleteStandalonePlugin":"True","FFlagStudioFixMultilineCommentEditingBehavior":"True","DFFlagCreateServerPlayerSetsIdAndName":"True","FIntAppConfigurationExpiry":"86400","FFlagFixKeepingFolderAcquiredInStudioThroughTheFileSystem":"True","FFlagStudioMigrateGlobalToCJVInChina2":"True","FStringStudioEmergencyMessageV3":"eyAicmVnaXN0cnlLZXkiOiAiRW1lcmdlbmN5TWVzc2FnZUZvckNoaW5lc2VTdHVkaW8iLCAicGxhdGZvcm1zIjogWyAiV2luZG93cyIgXSwgIm1lc3NhZ2UiOiB7ImVuIjogIlRvIGdldCB0aGUgYmVzdCBTdHVkaW8gZXhwZXJpZW5jZSBhbmQgcGVyZm9ybWFuY2UgaW4gQ2hpbmEgdXNlIHRoZSBDaGluZXNlIHZlcnNpb24gb2YgU3R1ZGlvIGF2YWlsYWJsZSBvbiA8YSBocmVmPWh0dHA6Ly93d3cucm9ibG94ZGV2LmNuPmh0dHA6Ly93d3cucm9ibG94ZGV2LmNuPC9hPiIsICJ6aF9DTiI6ICJcdTU5ODJcdTY3OWNcdTRmNjBcdTYwZjNcdTRmNTNcdTlhOGNcdTU3MjhcdTRlMmRcdTU2ZmRcdTY3MDBcdTdhMzNcdTViOWFcdTc2ODRcdTAwNTNcdTAwNzRcdTAwNzVcdTAwNjRcdTAwNjlcdTAwNmZcdTcyNDhcdTY3MmNcdWZmMGNcdThiZjdcdTRmNjBcdTUyNGRcdTVmODAgXHUwMDNjXHUwMDYxIFx1MDA2OFx1MDA3Mlx1MDA2NVx1MDA2Nlx1MDAzZFx1MDA2OFx1MDA3NFx1MDA3NFx1MDA3MFx1MDAzYVx1MDAyZlx1MDAyZlx1MDA3N1x1MDA3N1x1MDA3N1x1MDAyZVx1MDA3Mlx1MDA2Zlx1MDA2Mlx1MDA2Y1x1MDA2Zlx1MDA3OFx1MDA2NFx1MDA2NVx1MDA3Nlx1MDAyZVx1MDA2M1x1MDA2ZVx1MDAzZVx1MDA2OFx1MDA3NFx1MDA3NFx1MDA3MFx1MDAzYVx1MDAyZlx1MDAyZlx1MDA3N1x1MDA3N1x1MDA3N1x1MDAyZVx1MDA3Mlx1MDA2Zlx1MDA2Mlx1MDA2Y1x1MDA2Zlx1MDA3OFx1MDA2NFx1MDA2NVx1MDA3Nlx1MDAyZVx1MDA2M1x1MDA2ZVx1MDAzY1x1MDAyZlx1MDA2MVx1MDAzZSBcdTRlMGJcdThmN2RcdTdmNTdcdTVlMDNcdTRlNTBcdTYwMWRcdTcyNDggXHUwMDUzXHUwMDc0XHUwMDc1XHUwMDY0XHUwMDY5XHUwMDZmXHUzMDAyIn0sICJzaHV0ZG93biI6IGZhbHNlIH0=","FFlagStudioCheckEmergencyMessageAtStart":"True","FFlagRenderFixSun3TimesRender":"True","FFlagRenderImproveStreaming2":"False","FFlagCatalogSnFResetButtonFix":"True","FFlagUGCFixModerationCheck":"True","FFlagCatalogFilteredSearch":"True","FFlagLuaAppFillScrollingFrameWithLoadMore2":"False","FFlagAvatarExperienceOutfitRecommendations2":"False","FFlagUserChatAddServerSideChecks2":"True","FFlagToolboxTruncateOverrideAssetNames":"True","DFFlagParallelSendTouches2":"True","FFlagNoRedrawWindow":"True","DFFlagHttpRbxApiServiceDontRetryOn429":"True","FFlagCancelButtonTouchEventOnMouseDragOff":"True","FFlagFixFirstPersonMouseCursorSnapping_CenterPos":"True","FFlagFixFirstPersonMouseCursorSnapping_ForceCursor":"True","FFlagFixFirstPersonMouseCursorSnapping_UWP":"True","FFlagStudioStartServerIfNotStartedWhenStartingClient":"False","DFFlagDontHandlePlayerReplicationDataAsSpecialCase":"False","FFlagAvatarExperienceCharacterManagerOnSlowNetwork":"True","FFlagAvatarImporterRoact":"True","FFlagUseRebroadcastEventSharedQueue":"False","FFlagMegaReplicatorInitializeTaskQueue":"True","DFFlagMegaReplicatorParallelDisconnect":"True","FFlagDisableFollowInGameMenu":"True","FFlagEnableCorePackagesOverride":"True","FFlagJIRA_RIDE_192":"True","FFlagStudioPopulateInsertObjectMenuAfterLogin":"True","FFlagJIRA_RIDE_630":"True","FFlagShowWarningsForUnregisteredOptions":"True","FFlagStudioAllowCoreScriptReloads2":"True","DFFlagStudioReportPackageRequestWebCopyError":"True","FFlagReportStudioPublishSaveFailure":"True","FFlagWorldModelV5":"True","FFlagWorldModelCatchInsertRawErrors":"True","FFlagWorldModelRefactorV4":"True","FFlagGetScreenPositionOffsetCamPtrGuard":"True","FFlagEnableAvatarExperienceLandingPageForAll":"True","FFlagIgnoreLocaleInJoinScriptData":"True","FFlagRemoveInGameFollowingEvents":"True","FFlagRemoveInGameFollowingServer":"True","FFlagFixPluginInvoke":"True","DFFlagMegaReplicatorDisconnectSwapAndPop":"False","FFlagCreateAndUpdateDataReplicationCache2":"False","DFFlagSupportJoinDataItemV2ii":"False","FFlagNoCostumeSaveButtonFix":"True","FFlagLuaAppUseUIBloxToasts2":"True","FFlagStandardizeVector3Case":"True","DFIntRCCFailedToEvictPlayerInfluxHundrethsPercentage":"100","FFlagGameSettingsPreventClosingDialogWhileSaveInProgress":"True","FFlagEnableBackgroundModeWhenInactive":"False","DFFlagUseNewTelegrafPriorityTag":"True","DFIntTelegrafPriorityThrottleHundredthsPercent":"500","DFFlagUseNewTelegrafMethod":"True","DFFlagEnablePerfDataMemoryCollection":"True","DFIntPerfDataGlobalThrottleHundredthsPercent":"10000","DFStringPerfFilterPlaceId":"4599786547","DFStringPerfTelegrafAddress":"100.20.191.133","FFlagLuaAppChatPageWaitUntilUserABTestsInitialized":"True","FFlagLuaChatShareGameToChatFromChatABTestEnabled":"True","FFlagLuaChatPlayTogetherABTestEnabled":"True","FFlagResetPluginMouseIcon":"False","FFlagSetInsertPoint":"True","FFlagStudioTrimBeforeToggleComment":"True","FFlagStudioDontMoveCursorToEofWhenOpening":"True","FFlagStudioFixProjectConfigForStartInPlayMode":"True","FFlagAllowReturnToConfirmRespawnCharacter":"True","DFFlagPhysicsPacketCountUnderLimit":"False","FFlagAvatarShopFixBlankResellersPage2":"True","FFlagAvatarEditorAttachmentCameraFocus2":"True","FFlagUserDontAdjustSensitvityForPortrait":"True","FFlagLuaAppAddGameSearchSessions":"True","FFlagSystemAddressIsPeerId2":"True","FFlagPlaceLauncherCollectOnMainThread":"True","FFlagRenderDXT_KTX":"True","FFlagStudioEnableCSGv2SmoothingBeta":"False","FFlagLuaAppABTestSearchResultsQ2DGameEmphasis":"True","FFlagLuaAppABTestUseSearchResultsQ2DHideBadGames":"True","FFlagAppConfigurationEnableMultiBehaviorSupport2":"False","FFlagLuaChatAliasesSizingFixAgainV1":"False","DFFlagPhysicsSenderNoEmptyPackets":"True","DFFlagLuaFastToFloat":"True","FFlagLuaTaggedUdataGc":"True","FFlagViewSelectorLightUpdate":"True","DFIntDetailedBandwidthStatsInfluxHundrethsPercentage":"10000","DFFlagDetailedBandwidthStatsInflux_PlaceFilter":"true;4599786547","DFIntDetailedBandwidthStatsPlayerLotteryHundrethsPercentage_PlaceFilter":"10000;4599786547","FFlagFixGettingAssetOwnerNameInAssetPreview":"True","FFlagAppUsesAutomaticQualityLevel":"True","FFlagDepthOfField":"True","FFlagDontLoadCoreScriptsForEditDM":"True","FFlagStudioMuteOnlyOnUnfocus":"True","FFlagStudioRewriteEmulatorWithMask3":"True","FFlagUseCanManageForDeveloperIconServer":"False","FFlagGraphicsMetalCompactGeometry2":"True","FFlagTopBarHightightIconsOnHover":"True","FFlagTopBarCloseContextMenuWhenHotkeysUsed":"True","FFlagStudioUseNewAnimationImportExportFlow":"True","FFlagTapAwayToCloseBackpack":"True","FFlagTopBarEscapeCloseMenu":"True","FFlagAddCopyIDToResultPage":"True","FFlagStudioEnableResume3":"True","FFlagStudioMacOverrideStepIntoShortcut":"True","FFlagScrollingFrameLayoutV3_2":"True","FFlagEnableFavoritesForAssetPreviewInAssetManager":"True","FFlagLuaCatalogFixRemoveSellToastIcon":"True","FFlagLuaAppFixToastNotchOverlap":"True","FFlagStudioToolboxShowNoPluginResultsDetail":"False","FFlagStudioAssetCopySaleStatusFix":"True","FFlagFixAssetUploadFailedColor":"True","FStringRENAME_ABTEST_AllUsers_GameSearch_Q2DRankingEmphasisHideBad":"AllUsers.GameSearch.Q2DRankingEmphasisHideBadV2","FFlagLuaAppGameSearchQ2DEvents":"True","FFlagSimEnablePreciseConvexDecomposition":"True","FStringLuaDraggersBetaUrl":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/say-hello-to-the-new-lua-dragger-beta/504815","FFlagPlayTogetherFromGameCard":"True","FFlagSupportDeathTypeClient":"True","FFlagSupportDeathTypeServer":"True","DFFlagWaitForChildThrowNan":"True","DFFlagWaitForChildNoInfiniteTimerTask":"True","FFlagLuaAppGameImpressionsAnalyticsV2":"True","DFFlagEveryJointIsManualJoint":"True","FFlagLuaAppGameSearchImpressionsEvent":"True","FFlagInternalGameLocaleEnabled":"True","FFlagUseCanManageForDeveloperIconClient":"False","FFlagRemoveAssetUploadUrlSuffix":"True","FFlagEnableOverrideAssetGroupCreationApi":"True","FFlagLuaPublishFlowFixCreateButtonInChinese":"True","FFlagUserHandleChatHotKeyWithContextActionService_PlaceFilter":"True;4738806136","FFlagRenderSurfaceAppearance_v2_PlaceFilter":"True;5004798193","FFlagTerrainOpenCloseMetrics":"True","FFlagTerrainToolTabMetrics":"True","FFlagStudioServiceHoverInstance":"True","FFlagOnlyReadyHover":"True","FFlagFFlagFixMenuIcons":"True","DFFlagUseNewPostAuthenticationRequest":"True","DFFlagMicroprofileGroupAtLastStack":"True","FFlagRenderSurfaceAppearance_v1_ColorMapOnly_PlaceFilter":"True;5004798193","FFlagRenderAtmosphere":"True","FFlagCMSConsolidateAssetTypeInfo":"True","FFlagAssetConfigDarkerScrollBar":"True","FFlagUGCRemoveLearnMoreText":"True","FFlagToolboxUseNewAssetType":"True","FFlagStudioResizeEmulationDeviceWriteLock":"True","FFlagLuaAppRefreshScrollingFrameRefactor3":"False","FFlagStopDriveBySwipesOnScrollingFrames":"True","DFFlagAdminServerLogs":"True","FFlagPlayerDisplayName":"True","FFlagUserServiceWhiteListV2":"True","FFlagUserServiceEnabledV2":"True","FFlagTopBarFixCloseButtonMobile":"True","FFlagHideTopBarWhenInspectOpen":"True","FFlagNewInGameTopBarForEveryone":"True","FFlagABTestLoadingTimeStats":"True","FStringStudioUrlCSGv2SmoothingBeta":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/introducing-smoothingangle-property-for-partoperation/552810","FFlagUseRebroadcastEventSharedQueue2":"True","DFFlagGCNotAlwaysMemory":"True","DFIntStreamingMaxTargetPercentage_PlaceFilter":"200;4599786547","FFlagHandleCanceledToolboxDrag":"True","DFFlagTranslatorApiCloudAssetLoadingFix":"True","FFlagFixPackageDragSlow":"True","FFlagStudioCollectLocationType":"True","DFFlagReportBaseUrlForHttpAnalytics":"True","DFFlagDisablePackageRequestCache":"True","DFFlagStudioDelayModificationCheck":"True","DFFlagInitiateMultipleParallelConnection":"True","FFlagStudioSupportNilContextServices":"True","FFlagStudioGameSettingsResetStoreAction":"False","FFlagMoveViaSelectionCenter":"True","FFlagStudioMinorFixesForAssetPreview":"True","FFlagFixGetAssetTypeErrorHandling":"True","DFFlagEnableGetPlayFabTitleFromService":"True","DFFlagEnableAnalyticsServiceSetApiKeyEventSteam":"True","DFIntGetPlayFabTitleFromServiceRolloutPercentage":"100","FFlagCMSPremiumBenefitsLink":"False","FFlagStudioBetaFeaturesHideInfoButtonForMissingUrls":"True","FFlagStudioFixCrashInSendMockKeyboardNotificationsToLua":"true","FFlagRefactorPluginLoading4":"False","FFlagFuzzyTerrainNormal":"True","FFlagHandleFlakeyMouseEvents":"True","FFlagImprovedHandleParams":"False","DFIntLoadPackageFirstTimeDelayMs":"0","FFlagScriptEditorEnableRulers":"True","FFlagRenderImproveStreaming3":"True","FFlagNavHighlightUseUIBloxAnimatedItem":"True","FFlagAvatarExpereienceUseShimmerPanel":"True","FFlagAvatarExpereienceReplaceFitScrollingFrame":"True","FFlagSellPageUseVerticalScrollView":"True","DFFlagHumanoidDisplayNameEnabled":"True","FFlagAvatarExperienceBodySizeIndicator":"True","FFlagStudioAssetManagerDisableMagicCharacters":"True","FFlagAssetManagerContextMenuActionFixes":"True","DFFlagUseTimeoutMessage":"True","DFFlagEnsureNullCheckOnDisconnect":"True","DIntPackagePermissionPullingIntervalInSeconds":"10","FFlagFixAssetUploadName":"True","FFlagAssetConfigUseItemConfig":"True","DFFlagRemovePackageSymbolicLinkKId":"True","FFlagUserHandleChatHotKeyWithContextActionService":"False","FFlagDataModelPatcherReportToInflux":"True","FFlagLocalStorageDisablePathChangeChecks":"True","FFlagLuaAppUseLoadableEventTile":"True","FFlagPlayerListUseDisplayNameChina":"True","FFlagStudioSavePlaceAs2":"True","FFlagStudioPublishMediatorFailedConnection2":"True","DFFlagVideoLoadAssetsInStudioEdit":"True","FFlagLuauStringFastcall":"True","DFFlagLuauFasterUnpack":"True","FFlagScriptContextLastResume":"True","FFlagLuauNoGcDebt":"True","FFlagRenderTerrainGrassNoSpecular2":"False","DFFlagSupportIPv6MappedIPv4ForFloodCheck":"True","DFFlagVideoDoNotResetTimePositionOnStop":"True","FFlagNavigationTabBarVisibilityWithBack":"False","FFlagLuaAppSearchBarNoWrap":"True","FFlagStudioCloudEditShowErrorCode":"True","FFlagLuaAppDisplayNamesEnabled":"True","FIntMaxClients":"1023","FFlagUseInitialTerrainCache":"False","FFlagStudioThunkWithArgsMiddleware":"True","FFlagLuaCalculateJumpHeight":"True","DFFlagIPV6RobloxStudioCleanUp1":"True","FFlagAllowTextEntryToTakeSizeAndPositionProp":"True","FFlagStudioRestoreWatchTab":"True","FFlagRenderCorrectLinearUnderWaterFog":"True","FFlagRenderAtmosphereRefreshSky":"True","FFlagRenderAtmosphereRefreshSky2":"True","FFlagGameSettingsFixNameWhitespace":"True","DFFlagEnableDateTimeInReplicator":"True","FFlagEnableDateTimeInNetworkValueFormat":"True","FFlagUseDateTimeType3":"True","FFlagUseCorrectEndpointForPlaceVersion":"True","FFlagStudioCloudEditLogErrorCode":"True","FFlagAddHWModelForMac":"True","FFlagFixAssetManagerInsertWithLocation":"True","FFlagLuauCoroutineC":"True","FFlagHandleNoRotateTarget":"True","FFlagStudioHideStartPageUrlLinksCJV":"True","FFlagStudioShowUserFacingWebsiteCJV":"True","DFIntVideoImageReductionFactor":"1","DFFlagHttpServiceBetterUserAgent":"False","FFlagStudioCloudEditFixErrorCode":"True","FFlagHttpServiceNeverCache":"True","FFlagPolicyServiceStoreHttpResponseToLocalStorage":"True","FFlagEventIngestServiceRefactor":"True","FFlagLuaAppSidePaddingInChildren":"False","FFlagAvatarExperienceRemoveTempRouterFix":"True","FFlagPlayerListFixTitleBarTransparency":"True","FFlagStudioTransferBreakpointsFromBothPlayDMsToEditMode":"True","FFlagStudioUseInternalScriptDescendantForAllCases":"True","DFFlagFixAnalyticsServiceSetApiKey":"True","DFFlagPolicyServiceLuaApiAdaptiveToHttpResponse":"True","DFFlagPlayerPolicyReportHttpFailureToInfluxOnEveryAttempt":"True","DFFlagMeshLODVertexNormalFix":"True","FFlagSimBulletContactInitilizesConnector":"False","FFlagSimSolverOptimizedIslandizer2":"False","FFlagPackageFixDiffRootNameChange":"True","DFFlagFixPackageModificationCheckForPendingState":"True","DFFlagStudioDelayPackageAutoUpdate":"True","DFIntPackageAutoUpdateDelayMs":"0","DFFlagEphemeralCounterInfluxReportingEnabled":"True","DFIntEphemeralCounterInfluxReportingThrottleHundredthsPercent":"10000","DFIntEphemeralCounterInfluxReportingPriorityHundredthsPercent":"10000","DFFlagEphemeralStatsInfluxReportingEnabled":"True","DFIntEphemeralStatsInfluxReportingThrottleHundredthsPercent":"50","DFIntEphemeralStatsInfluxReportingPriorityHundredthsPercent":"10000","DFFlagInfluxEnableTypeEventTag":"True","DFFlagFixClientNetworkMetricsForParallelConnection":"True","FFlagVerifySliceCenterOnRenderNotSet":"True","FFlagFixInGameMenuMissingAssets":"True","FFlagPlayerListFixContextMenuFlashing":"True","FFlagFixActivatedEventDoubleFire":"True","DFFlagStreamingPrefetch":"True","FFlagRenderFixGrassUpdates":"True","FStringFeature_NewGameJoinInstance":"431;100","DFFlagFreeFmodGroupIfUnusuable":"True","DFFlagGetContextFreeDSPs":"True","DFFlagGetContextFreeSoundGroup":"True","DFFlagFreeDSPsIfUnusable":"True","FFlagLuauRequireTracer":"True","FFlagStudioLuauWarningTelemetry4":"True","FFlagStudioLSP_V1_1":"False","FFlagAppConfigurationEnableMultiBehaviorSupport3":"True","FFlagStudioLuauWarningTelemetry3":"True","FFlagDataModelPatcherReportToInflux2":"True","DFIntDataModelPatcherFunnelInfluxHundredthsPercentage":"1000","DFIntDataModelPatcherErrorInfluxHundredthsPercentage":"10000","DFIntDataModelPatcherFunnelInfluxPriorityHundredthsPercentage":"10000","DFIntDataModelPatcherErrorInfluxPriorityHundredthsPercentage":"10000","FFlagUseBlake2BHashInSharedString2":"True","DFFlagVideoFixSeekingBeyondTheEnd":"True","DFFlagVideoFixTextureLeak":"True","FFlagFixDraggerCursors":"True","FFlagLuaDraggerTerrainFixes":"True","FFlagDisallowFloatingPointErrorMove":"True","FFlagHandleOddNesting":"True","DFFlagVideoFixWebmParsing":"True","DFFlagVideoCacheTimePosition":"True","DFFlagVideoFixServerTimekeeping":"True","FFlagImprovedHandleParams2":"True","FFlagMinCursorChange":"True","FFlagRetainHoverPart":"True","FFlagStudioDeviceManagerDesignTweak":"True","DFFlagInstanceGuard":"True","FFlagShowAssetConfigReasons2":"False","DFIntStudioLuauIceInfluxHundredthsPercentage":"10000","DFIntStudioLuauWarningInfluxHundredthsPercentage":"10000","FFlagFixInspectAndBuyGamepad":"True","FFlagStudioTestServiceRunStateRecovery":"True","FFlagLuaAppGridViewRemoveStateDelay":"True","FFlagStudioRemoveExtraFindAction":"True","FFlagABTestResponseCounter":"True","FFlagProtectedStringUsesSharedString2":"True","FFlagStudioFixHashFromFileContentsLeak":"True","FFlagStudioShowCursorWhenSwitchingScripts":"True","FFlagUseCentralTime":"True","FFlagABTestControllerListener":"False","DFFlagFixUncaughtModuleContentSetParentException":"True","DFFlagStudioAddIsPackageAtTheEndOfRequestURL":"True","FFlagStudioSupportLinkForChina":"True","DFFlagUseSharedStringForScriptReplication2":"False","FFlagWaterReflectionWaveFix":"True","FFlagSortsAndFiltersFitComponentFix":"True","FFlagFastClusterCachePrimitive":"True","FFlagStudioGameSettingsNewUseRoactRodux":"True","FFlagStudioGameSettingsResetStoreAction2":"True","FFlagStudioConvertGameSettingsToDevFramework":"True","FFlagStudioStandaloneGameMetadata":"True","FFlagStudioUnrestrictPluginGuiService":"True","FFlagPublishPlaceSupportUnicodeTextLength":"True","DFFlagHttpTlsVerificationErrorCode":"True","DFFlagHttpServiceTlsProbeRetry":"True","DFIntHttpServiceTransportFailureInfluxHundrethsPercentage":"10000","FFlagStudioFixQPointerForTooltipView":"True","DFFlagStreamingAddAncestors2":"False","DFFlagReplicatorStreamingReportAncestorsSentWithoutAllDescendants":"False","FFlagStudioNewTableOutputWidgetSourceStr2":"True","DFFlagStreamingAddAncestors2_PlaceFilter":"True;4923553838;4923599624","FFlagLuaAppQ2DUXAdjustmentsBugfixes":"True","FFlagLuaAppUseNewGameTileGridStyle":"False","FFlagAEFitComponentMigration":"False","FFlagStudioEnablePVHBetaFeature":"True","FStringStudioUrlPlaceVersionHistory":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/beta-place-version-history-in-studio/607597","FStringStudioPlaceVersionHistoryHelpLink":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/beta-place-version-history-in-studio/607597","FFlagLuauCompoundAssignment":"True","FFlagLuauCompactLineInfo":"True","FFlagAvatarExperienceUseContextualMenu":"True","FFlagStudioFixFlatTerrainDefaultSaveLocation":"True","FFlagEnableUIBloxIcons":"True","FFlagRenderSuperLQTerrainGLES2":"True","DFFlagHttpServiceTlsProbe":"True","DFIntHttpServiceTlsProbePercent":"10","DFFlagDataStoreMoreInfoForVagueError":"True","FFlagFixShadowBiasYetAgain":"True","FFlagRenderShadowmapBatchUpdates":"True","FFlagLuaAppSidePaddingInChildren2":"True","FFlagLocalizationToolsPluginV3Enabled":"True","FFlagLuaAppsLocalizationToolsDeprecated":"True","FFlagEnableLuaStartupManager":"False","DFIntHttpServiceTlsProbeInfluxHundrethsPercentage":"10000","FFlagHideOneChildTreeviewButton":"False","FFlagCLIAPPBRIDGE414":"True","FFlagAvatarExperienceUseNewCharacterManager":"False","FFlagJIRA_RIDE_697":"False","FFlagJIRA_RIDE_711":"False","FFlagJIRA_RIDE_785":"True","FFlagXboxAppBridgeRewrite5":"False","DFIntJoinInfluxHundredthsPercentage_PlaceFilter":"10000;5064251723","FFlagCoreScriptsUseRoactRoduxNewConnectionOrder":"True","FFlagLuaAppUseRoactRoduxNewConnectionOrder":"True","FFlagXboxUseRoactRoduxNewConnectionOrder":"True","FFlagFixBlockedListInitLogic":"True","FFlagFixGamepadOldMenuOpening":"True","FFlagCoreScriptsNoHotKeysWhenMenuOpen":"True","FFlagLuauNativeTypeof":"True","FFlagLuauTypeofFastcall":"True","DFFlagCantSendTheseAnymore":"True","FFlagStudioLSP_V1_2":"True","FFlagGraphicsDisableMetalIntel":"True","FFlagStudioReportOpenPlaceTime":"True","FStringStudioReportOpenPlaceTimeFilter":"95206881","FFlagStudioCloudEditAddReadyAnalytics":"True","FFlagMegaReplicatorSharedClassInfo":"True","FFlagConnectErrorHandlerInLoadingScript":"True","DFFlagFixPrintJoinSizeBreakdown":"True","DFFlagOnlyReadPlayerOsOnServer":"True","DFLogClientRecvFromRaknet":"10","DFFlagDebugRakPeerReceive":"True","DFIntDebugRakPeerReceiveAfterSeconds":"10","DFFlagDebugRakPeerReceiveCountDistributedPackets":"True","DFIntHttpClientExternalTlsPeerVerificationFailHundrethsPercentage":"10000","FFlagQueryFrustumAndUpdateRange":"False","FFlagInterpolateCullDistance":"False","DFFlagCSGOperationStatisticsGA":"False","DFFlagCSGOperationsRespectsCollisionFidelityAtCreation":"True","FFlagImmHandlerFixJapaneseAndKorean_PlaceFilter":"False; 252877716","FFlagLuauEndMismatch":"True","FFlagRewriteScriptDocumentChangeEvent":"True","FFlagScriptEditorEnableMoveLinesCmd":"True","FFlagBatchBoundsChanged":"True","FFlagScaleUnionsUniformly":"True","FFlagDraggerBasisRotate":"True","FFlagLuaDraggerHandleScale":"True","FFlagAllowDragContinuation":"True","FFlagInventoryApiInHttpWhitelist":"True","DFStringHttpRbxApi17sAllowedHosts":"chat.roblox.com;presence.roblox.com;avatar.roblox.com;catalog.roblox.com;inventory.roblox.com","FFlagLuaDraggerPerf":"True","FFlagUseBulkMove":"True","DFFlagStreamingDontGCLocal":"True","DFFlagGetFriendsOnlineCachingEnabled":"True","DFFlagSimSolverLargeWorkloadReporting":"True","FFlagAddCountryCodeToUserModel":"True","FFlagToolboxUseNewPluginEndpoint":"False","DFFlagDataStoreNoSerializedDataInCache_PlaceFilter":"True;1052132952","FFlagRenderTerrainGrassNoSpecular3":"False","FFlagLuaAppGameSortGridABTestEnabledV2":"True","FStringLuaAppGameSortGridABTestJSONV2":"{\"ABTestData\" : { \"Control\" : {\"GridEnabled\" : false, \"GridRows\" : 0, \"UseGridMediumTile\" : false }, \"Variation1\" : { \"GridEnabled\" : false, \"GridRows\" : 0, \"UseGridMediumTile\" : false }, \"Variation2\" : { \"GridEnabled\" : true, \"GridRows\" : 2, \"UseGridMediumTile\" : false, \"ExcludedSorts\" : [\"MyRecent\"], \"SeeAllButtonType\" : 1 }, \"Variation3\" : { \"GridEnabled\" : true, \"GridRows\" : 2, \"UseGridMediumTile\" : false, \"ExcludedSorts\" : [\"MyRecent\"], \"SeeAllButtonType\" : 2 }, \"Variation4\" : { \"GridEnabled\" : true, \"GridRows\" : 2, \"UseGridMediumTile\" : false, \"ExcludedSorts\" : [\"MyRecent\"], \"SeeAllButtonType\" : 3 } }}","FFlagLoadCoreScriptsBeforeLock":"True","FFlagSimSolverOptimizedIslandizer3":"False","FFlagSupportContentIdDictionaryRemoval":"True","FFlagStudioEnablePVHBetaFeature2":"True","FFlagFixKeyframeDetectionV2":"True","FFlagStudioHideStandalonePluginScripts":"True","FFlagStudioFixTimingOnTeamCreateRestart":"True","FFlagEnableStudioProfiler":"True","FFlagAssetManagerFixAssetRemoval":"True","DFFlagPlayHereFix":"True","FFlagSingleSurfaceAppMarshallerDoTeleport":"True","FFlagRenderMarkDirtyOnlyRenderableChunks":"True","FFlagStudioFetchABTestForLuaApp":"True","FFlagFixTopBarOverLoadingScreen":"True","FFlagUseCanManageForDeveloperIconServer2":"True","DFFlagStudioHttpServiceProtectLegacyPathsForPlugins":"False","FFlagStudioServiceDraggerSolveConstraints":"True","FFlagFixOverriddenDragAssert":"True","FFlagAdultConfirmationEnabled":"False","FFlagAvatarExperienceRunSceneFix":"True","DFFlagDontHandlePlayerReplicationDataAsSpecialCase2":"True","FFlagJoinDataCacheOptimizeBlobCount":"True","FFlagJoinDataCacheCompressionImprovement":"True","FFlagArePartsTouchingOthers":"True","DFFlagDataStoreNoSerializedDataInCache":"False","FFlagCreateAndUpdateDataReplicationCache3":"True","DFFlagAnalyticsServiceMonitoring2":"True","FFlagScriptEditorRCityTelemetry":"True","FFlagRenderGlassTintLOD2FogFix":"True","FFlagRenderFixIncompleteMipChain":"True","FFlagAssetManagerLocalizationUpdate":"True","FFlagGameSettingsOnlyInPublishedGames":"True","DFFlagStreamingGCJobFixCharacterCheck":"True","FFlagAEReplaceFitImageTextFrame":"True","FFlagTopBarNewGamepadMenu_PlaceFilter":"True;2567750478","FFlagAddMissingConsoleAgreementTextInGameSettings":"True","FFlagFixFitToContentOnCloseError":"True","FFlagFixTextChangedFromEmptyForTextEntry":"True","DFFlagTeamCreatePublishToEventIngest":"True","FFlagStudioLoadCoreScriptsFromModel":"True","DFFlagEnableHumanoidControllerSubstepping_PlaceFilter":"True;4306999063","DFFlagEnableLowerFrequencyWorldSteps_PlaceFilter":"True;4306999063","FFlagUseSteppingParamsInsteadOfConstants_PlaceFilter":"True;4306999063","FFlagDebugDontForceCollisionsOnHumanoidParts_PlaceFilter":"True;4306999063","DFIntDebugDefaultTargetWorldStepsPerFrame_PlaceFilter":"1;4306999063","FFlagToolboxHideSearchForRecent":"True","FFlagStudioEnableBFSupportPluginDebugging":"True","FFlagLanguageServiceDoesntDirtyDataModel":"True","FFlagRefactorPluginLoading5":"True","FFlagSimDeprecateConstraintLegacyAngularVelocity":"True","FFlagResetPluginMouseIcon2":"True","FFlagStudioServiceHoverInstanceFix":"True","FFlagSelectWeldConstraints":"True","FFlagEnableUICornerBetaFeature":"True","FFlagFixInGameMenuSliderClamping":"True","FFlagCameraSensitivityAllowGranularKeyboardInput":"True","FFlagStudioPluginManagerInterface":"True","FFlagStudioTeleportServiceSanitize":"True","FFlagWrappedDevFrameworkLinkText":"True","FFlagUseCanManageForDeveloperIconClient2":"True","FFlagFixBadNormal":"True","FFlagFrameStepJointsParallel":"False","FFlagStudioSupportUploadGroupAnimations":"True","SFFlagTerrainRaycastsRespectCollisionGroups":"True","FFlagStudioTimeStampFix":"True","DFFlagRaknetBandwidthMetricsReportValidPing":"False","DFFlagRaknetBandwidthMetricsV2":"True","DFIntRaknetBandwidthInfluxHundredthsPercentageV2":"1000","DFFlagRaknetBandwidthAddPhyPacketsLossPercent":"True","DFIntRaknetBandwidthPingSendEveryXSeconds":"300","FFlagDeveloperEventIngestVerifyFeature_PlaceFilter":"True;3182856628","DFIntAnalyticsServiceEventIngestSwitchPercentage_PlaceFilter":"100;3182856628","DFFlagEnableAnalyticsSeriveEventIngest_PlaceFilter":"True;3182856628","FFlagABTestSystemShutoff":"False","FFlagStudioFixUndoAfterInsertByDrag":"True","FFlagFixOverrideAssetGroupPlugins":"True","FFlagStudioFixGroupCreatorInfo":"False","FFlagFixHorizontalScrollBarInControlsPage":"True","FFlagScrollInOnlyDirectionAvailable":"True","FFlagLuaAppEventsWithSession":"True","FFlagLuauBuiltinOs":"True","FFlagAllowGamepadConnectionEventsWhenNotFocused":"True","FFlagResetMobileGamepadsOnDataModelLoad":"True","FFlagAllowMobileGamepadCursor":"True","FFlagFixGamepadR3LastInputType":"True","FFlagEnableR3ButtonIOS":"True","FFlagFixGamepadMenuButtonIOS":"True","FFlagFixCaseSensitiveAssetNames":"True","FFlagFixGamepadCursorIdlePosition":"True","TreatAndroidInputSourceAsBitmask":"True","DFFlagCSGv2NormalSmoothing":"True","FFlagABTestControllerListener2":"True","FFlagFixOutBoundAccessInBoxMappedMesh":"False","FFlagLuaAppGameDetailsMorePWF":"True","FFlagLuaAppGameDetailsPlayWithFriendsABTest":"True","DFFlagEnableTelegrafPriorityTag":"True","FFlagStudioRemoveStudioInfluxHundredthsPercentage":"True","FFlagStudioAddDistTypeToUserAgent":"True","FFlagStudioExternalLoginEnabled":"False","FFlagStudioUserAgreementCheckEnabled":"False","FFlagStudioAddReloadOptionInLoginDialog":"False","FFlagMakePluginsActivatableInScripts":"True","FFlagLuaPremiumCatalogIGIAB":"True","FFlagLuaPremiumCatalogTileFix":"True","FFlagIAPProductReducerV2":"True","FFlagLuaAppNativePurchase":"True","FFlagLuaAppBulletSizeFix":"True","FFlagLuaFixEconomyCreatorStatsUrl":"True","FFlagLuaAppPremiumUpsellCancelFix":"True","FFlagLuaAppPeekViewHeightChangeFix":"True","FFlagIGPPPremiumPrice":"False","FFlagPremiumCatalogAESort":"True","FFlagLuaPremiumCatalogAEV2":"True","FFlagLuaPremiumCatalogIGPP":"True","DFFlagEnableSoapMicroprofiles":"True","FFlagLuaAppUseNewAccordion":"True","FFlagLuaAppUseNewLoadableImage":"True","DFFlagSupportEncryptedAssets":"False","DFFlagPerformAssetDecryptionOnAnAsyncTask":"True","FFlagDisableSpecialShapeInMeshPart":"True","FFlagGfxPartInvalidationLimitToTime2":"True","FFlagLuauStricterLib":"True","FFlagLuauInternalAlloc":"True","FFlagLuauVersion":"True","FFlagLuauFasterHash":"True","FFlagRemoveUILibraryTimeline":"True","FFlagDataModelPatcherConfigurerEnabled3":"True","FFlagRemoveEndOfScrollMessage":"True","FIntHttpCacheRedirectsTimeoutMs":"14400000","FFlagPlayerListFixXboxLayout":"True","AllowVideoPreRoll":"True","AxisAdornmentGrabSize":"12","CaptureCountersIntervalInMinutes":"5","CaptureQTStudioCountersEnabled":"True","DFFlagBoxMappedMeshLODFix_v2":"True","DFFlagCLI120342":"False","DFFlagCLI120342p7":"True","DFFlagCLI120342p72":"True","DFFlagCSGMeshLevelOfDetailV2":"True","DFFlagCyclicExecutiveThrottlingCancelWorldStepAccum":"False","DFFlagDebugVisualizerTrackRotationPredictions":"True","DFFlagDoNotRenderMeshLODByDefault":"True","DFFlagEnableRemoteProfiling":"True","DFFlagEnableRemoteProfilingForDevConsole":"True","DFFlagFavorIPV4Connections":"False","DFFlagFindClosestHandleHitTestFixEnabled":"True","DFFlagFixCutAndUndoAfterSavingCSGUnionToNewFile":"True","DFFlagForceNoBloomInThumbnail":"True","DFFlagGenerateMeshLOD_Fix1":"True","DFFlagGetPolicyInfoForPlayerAsyncEnabledClient":"True","DFFlagGoodbyeChoiceActiveProperty":"True","DFFlagHttpCleanupRbxCurl":"True","DFFlagLockViolationInstanceCrash":"False","DFFlagLockViolationScriptCrash":"False","DFFlagOrder66":"False","DFFlagPreventReturnOfElevatedPhysicsFPS":"True","DFFlagPugiCrashOnUnhandledXml":"True","DFFlagRakNetDetectNetUnreachable":"True","DFFlagReflectionLoggingEnabledClientWin32_3":"True","DFFlagReflectionLoggingEnabledGlobal":"True","DFFlagReflectionLoggingpPlacelauncherInitialization":"True","DFFlagRenderGatherMsFrame2":"True","DFFlagReportClientMemoryCat":"True","DFFlagReportInfluxRenderMsFrameMetrics2":"False","DFFlagReportOutlines":"True","DFFlagScrollWhenInsideFocusedTextBox":"True","DFFlagServerCopiesPlayerGui3_PlaceFilter":"false;142823291","DFFlagSkipLQNeonWhenOff":"True","DFFlagStudioSendOnlyOneShutdownEvent":"True","DFFlagSupportMeshLOD":"True","DFFlagSupportMeshLOD_PlaceFilter":"True; 2900823006","DFFlagTextBoxesNeverSinkMouseEvents":"True","DFFlagThrottleDebuggerMetrics":"True","DFFlagThumbnailFixSrgb":"True","DFFlagUsePugiXmlForPlaces":"True","DFFlagUserInputServiceProcessOnRender":"True","DFFlagYouAreNotSupposedToBeHere":"True","DFIntAnalyticsCDNProbeInfluxPermyriad":"100","DFIntAnalyticsNS1CDNProbeChancePercent":"5","DFIntAndroidInfluxHundredthsPercentage":"0","DFIntApiRateLimit":"200","DFIntBgUpdateRedirectsHttpErrInfluxHundredthsPercentage":"100","DFIntBroadPhaseIslandBufferZoneMinPartLimit":"0","DFIntBroadPhaseIslandBufferZoneMinPartLimit_PlaceFilter":"5;1105449649","DFIntCSGLevelOfDetailSwitchingDistance":"250","DFIntCSGLevelOfDetailSwitchingDistanceL12":"500","DFIntDraggerMaxMovePercent":"60","DFIntElevatedPhysicsFPSReportThresholdTenths":"585","DFIntGroupServiceRolesApiV2":"0","DFIntHttpCacheCleanMaxFilesToKeep":"7500","DFIntHttpCacheCleanMinFilesRequired":"10000","DFIntHttpParallelLimit_RequestContentProvider":"0","DFIntHttpSendStatsEveryXSeconds":"300","DFIntICMPPingHundrethsPercentage":"0","DFIntLocServicePerformanceAnalyticsHundredthsPercentage":"1000","DFIntMacInfluxHundredthsPercentage":"0","DFIntMaxMissedWorldStepsRemembered":"16","DFIntReflectionLoggingRolloutPerMil":"2000","DFIntRenderMsFrameInfluxHundredthsPercentage":"1000","DFIntReportReplicatorStatsToInfluxHundredthsPercent":"5000","DFIntS2PhysicsSenderRate":"15","DFIntSendJoinTimeDeltasToDiag_HundredthsPercentage":"100","DFIntSendRakNetStatsThrottle":"2","DFIntStreamJobMaxBufferHealthThresholdHundredths":"75","DFIntStreamJobMaxBufferHealthThresholdHundredths_PlaceFilter":"50;1526666203","DFIntStreamJobMinBufferHealthThresholdHundredths":"40","DFIntStreamJobMinBufferHealthThresholdHundredths_PlaceFilter":"30;1526666203","DFIntTargetTimeDelayFacctorTenths":"20","DFIntTeleportExceptionInfluxHundredthsPercentage":"9000","DFLogPlaceLauncherTeleportLog":"6","DFLogSoundTrace":"4","DFStringCrashUploadToBacktraceBlackholeToken":"7705528468a303e4e34a13fbcf9e42e219633ed6868e143e5ab16cd33bd2a069","DFStringCrashUploadToBacktraceMacPlayerToken":"24cb37449e120c3a0618b1bf0585e339571828cae4dc73c7b8c99f67fcd751e9","DFStringCrashUploadToBacktraceWindowsPlayerToken":"417ecb0fbc032ce087e6af3b780c298e3356089f050c8130d2318109e80417a4","DFStringGamePerfMonitorPercentageCountryOverride":"CN,50,AU,50,NZ,50","DFStringHttpInfluxDatabase":"prod","DFStringOverrideSendRakNetStatsThrottleCountries":"CN,50,JP,20,NO,20,FI,20,SE,20,NZ,20","DFStringSendJoinTimeDeltasHundPrecCountryOverride":"CN,5000,US,100,AU,3000,KR,2000,NZ,3000,JP,4000,NO,2000,FI,2000,SE,1000,FR,1000,DK,1000","DFStringSendJoinTimeStatsHundPrecCountryOverride":"CN,5000,US,100,AU,3000,KR,2000,NZ,3000","DFStringSendJoinTimeStatsHundPrecCountryOverride_PlaceFilter":"CN,10000,US,10000,AU,10000,KR,10000,NZ,10000;189707","DFStringWorkspaceMessageLink":"https://web.archive.org/web/20200624170102/https://devforum.roblox.com/t/physics-deprecating-the-legacy-spring-physics-solver/163521","DFStringWorkspaceMessageText":"We are in the process of disabling and removing the legacy solver. Click here for more info...","EnableRemoteThemeCheckOnAndroidV3":"True","FFlagAdditionalTextBoxShortcuts":"True","FFlagAdvancedMouseSensitivityEnabled":"True","FFlagAllowBackpackBinding":"True","FFlagAppBackgroundMode2":"True","FFlagApplyPlaceFilterEarly2":"True","FFlagAvatarEditorEmotesSupport":"True","FFlagAvatarEditorEnableThemes2":"True","FFlagAvatarEditorHideSliderHighlightOnInit":"True","FFlagAvatarEditorLightThemeFix2":"True","FFlagBrilliantBorders":"True","FFlagCLI18241":"True","FFlagCLI18241A":"True","FFlagCLI18241B":"True","FFlagCLI21289":"True","FFlagCLI23302":"True","FFlagCLI26327":"True","FFlagCLI26526":"True","FFlagCLI26775":"True","FFlagCLI26856":"True","FFlagCLI26858":"False","FFlagCLI27641A":"True","FFlagCLI27760":"True","FFlagCLI28630":"True","FFlagCLI28759":"True","FFlagCSGv2BalanceExponents":"False","FFlagCSGv2FixOrientationWhenSeparatingNegates":"True","FFlagCSGv2UnionOrientationFromFirstPart":"True","FFlagCSGv2UnparentPartsBeforeModifyingCFrames":"True","FFlagCSGv2UseImprovedSphereAndCylinder":"True","FFlagCSGv2UseIterativeSimplification":"True","FFlagClientFireEventPlaceLauncherFail3":"True","FFlagCompatibilityUseSpecularMult":"True","FFlagConnectionScriptEnabled_PlaceFilter":"False;1608755154","FFlagCoreScriptBetterEmotesErrorMessaging":"True","FFlagCoreScriptEmotesMenuAnalytics":"True","FFlagCoreScriptEmotesMenuBetterMouseBehavior":"True","FFlagCoreScriptEmotesMenuEnabled2":"True","FFlagCoreScriptPlayerListPremiumIcon2":"True","FFlagCoreScriptSettingsHelpRightKeys":"True","FFlagDebugCSGExportFailure":"False","FFlagDebugCrashEnabled":"False","FFlagDebugGraphicsIntelCrash":"False","FFlagDebugUseDefaultGlobalSettings":"True","FFlagDevConsoleBetterResize":"True","FFlagDevConsoleFixCommandBarForNonOwners":"True","FFlagDevConsoleFixMicroprofilerSyncIssues":"True","FFlagDevConsoleFixTopBarDragging":"True","FFlagDevConsoleFixTopBarIcons":"True","FFlagDevConsoleIsVeryStickyWhyWillItNotLetGo":"False","FFlagDevConsoleLogNewLineFix":"False","FFlagDevConsoleNoDisableAllFilters":"True","FFlagDevConsoleTabMetrics":"True","FFlagDevConsoleUpdateLayering":"True","FFlagDisabledLayerCollectorsShouldNotSinkInput":"True","FFlagDontDisconnectJointUpdateUnlessNecessary":"False","FFlagDontSubmitBlankGameReports":"True","FFlagDontUseUploadUrlForPublish":"True","FFlagEmotesMenuRemoveOpenKeybinds":"True","FFlagEmotesMenuShowUiOnlyWhenAvailable":"True","FFlagEnableAndroidVsync":"True","FFlagEnableContactsApiService":"False","FFlagEnableDisablingNetworkPause":"True","FFlagEnableGameSignalRWithAllPlatforms1":"False","FFlagEnableGranularMemoryTabStats":"True","FFlagEnableIsPremiumSettings":"True","FFlagEnableLuaEventStreamRelease":"True","FFlagEnableNetworkPauseGui":"True","FFlagEnableRbxThumbAPI":"True","FFlagEnableRemoteThemeCheckOniOSV2":"True","FFlagErrorPromptTakeExtraConfigurations":"True","FFlagFFlagAvatarEditorFixToolStuckOnRightArmEquip":"True","FFlagFetchPremiumMigrationNoticeOnlyForBcUsers":"True","FFlagFixAndroidKeyboardInput":"True","FFlagFixFolderDescendantSelection":"True","FFlagFixGamepadReportPlayer":"True","FFlagFixGamepadVibrationNotEnding":"True","FFlagFixIECompatiblityBug":"True","FFlagFixMacFullscreenTrackingInMenu":"True","FFlagFixOutOfBoundsMouseLocation":"True","FFlagFixQuickCancelPurchase":"False","FFlagFixScrollingFrameClipRect":"True","FFlagFixSmallSurfaceGuiMouseInput":"True","FFlagFixTerrainAnisoVoxelisation":"True","FFlagFixTextureCubeFramebuffers":"True","FFlagForceCursorVisibleOnPurchasePrompt":"True","FFlagFutureIsBrightCompatibilityMode":"True","FFlagFutureIsBrightForceCompatibilityOverLegacy":"True","FFlagFutureIsBrightPhase2Android":"True","FFlagFutureIsBrightPhase2FPCheck":"True","FFlagFutureIsBrightPhase2iOS":"True","FFlagGameExplorerCopyPath":"True","FFlagGraphicsGL3InstancingEnabled5":"True","FFlagGraphicsGL3UseUBO3":"True","FFlagGraphicsGLDisableVAO":"True","FFlagGraphicsGLDoubleBufferDynamic":"True","FFlagGraphicsMetalPrivateMemory":"True","FFlagGroupEditDevConsoleButton":"True","FFlagHelpMenuShowPlaceVersion":"True","FFlagHowToSendAMessage":"True","FFlagHttpServiceWorldsMostOverkillFlagForMovingCodeFourLines":"True","FFlagInterpolationAwareTargetTime":"True","FFlagJoinTimeCounters":"True","FFlagLocServiceNullPtrCheckGetTranslator":"True","FFlagLocServicePerformanceAnalyticsEnabled":"True","FFlagLuaAppConvertUniverseIdToStringV364":"False","FFlagLuaAppEnableErrorReporterRateLimit":"True","FFlagLuaAppEnableStyleProvider":"True","FFlagLuaAppGameSearchPlayerSuggestion376":"True","FFlagLuaAppPremiumUpdatePrompt3":"True","FFlagLuaAppSiteMessageBannerEnabled":"True","FFlagLuaAppSizesWithValidDefaults":"True","FFlagLuaAppUseGraphicWithBorderForPresenceV373":"True","FFlagLuaAppUseNewPremiumIcon2":"True","FFlagLuaChatAnalyticsEnabled":"True","FFlagLuaChatBoldUnreadMessageText":"True","FFlagLuaChatCenterAndroidHeader":"True","FFlagLuaChatEnableFrequentUsersDiag":"True","FFlagLuaChatFixConversationHubHeaders369":"True","FFlagLuaChatHeaderEnableHomeButton":"True","FFlagLuaChatOnlyMarkUnreadWhenChatIsFocused":"True","FFlagLuaChatPressEnterToSend":"True","FFlagLuaChatRecoverSignalRConnection":"True","FFlagLuaChatResizeUserChatBubbleModerationError":"True","FFlagLuaChatRoactAssetCard":"True","FFlagLuaChatScreenManagerAlwaysUpdatesWithDefaultsV390":"True","FFlagLuaChatScreenManagerResumeAndPauseAfterNavigation":"True","FFlagLuaChatShareGameBottomBarOverride":"True","FFlagLuaChatSwipeToGoBackFromConversation369":"True","FFlagLuaChatToastRefactor369":"True","FFlagLuaDebuggerBreakOnError":"True","FFlagLuaEnableRemoteThemeCheckV4":"True","FFlagLuaHomePageShowAddFriendsButtonV361":"True","FFlagLuaInviteFailOnZeroPlaceIdV384":"True","FFlagLuaInviteGameHandleUnknownResponse":"True","FFlagLuaInviteGameMockTextLocalization":"True","FFlagLuaInviteModalEnabledV384":"True","FFlagLuaInviteNewAnalytics":"True","FFlagMainBufferGuiLayoutTextAt1x":"False","FFlagMainBufferGuiLayoutTextAt1x2":"True","FFlagMemoryFromAppShellReporterIOS":"True","FFlagMeshLODFixOutOfBoundAccess":"True","FFlagMeshLODUseAsyncHttpPost":"True","FFlagMetricCorrection":"True","FFlagMicroProfilerSessionAnalytics":"True","FFlagMonitorBatteryLevel":"True","FFlagNewDefaultScriptSource":"True","FFlagPGSAlwaysActiveMasterSwitch":"True","FFlagPerformPurchaseAcceptsGamePassInfoType":"True","FFlagPerformanceProfilerAnalytics":"True","FFlagPhoneHomeSooner":"True","FFlagPlaceLauncherScriptShutdownTimeout":"True","FFlagPlayerListNewIcons":"False","FFlagPlayerListPremiumPadding":"True","FFlagPointerActions2":"True","FFlagPreCoreBlurChunksMdrSpace":"True","FFlagReconnectToStarterPlace":"True","FFlagRemoveWakeForRenderJob":"True","FFlagRenderEmitterRecomputeOnChange":"False","FFlagRenderEnableMSAAShadows":"True","FFlagRenderForcefieldCacheFix":"True","FFlagRenderForcefieldFix":"True","FFlagRenderForcefieldMaterial2":"True","FFlagRenderInstancingEnabled8":"True","FFlagRenderMetalMemorylessTargets":"True","FFlagRenderNewMinShadingLevel":"True","FFlagRenderPartInstancingEnabled6":"True","FFlagRenderShadowClearFix":"True","FFlagRenderShadowDynamicInstancing":"True","FFlagRenderShadowLODFix":"True","FFlagRenderShadowSingleCascade":"True","FFlagRenderUseShadowGeometryForLegacyShadows":"True","FFlagReportDevConsoleOpenClose":"True","FFlagReportInGameAssetSales":"True","FFlagReportLocalizationDataLoadingException":"True","FFlagReportWndGestures":"False","FFlagResetMouseDeltaFix":"True","FFlagRobloxGuiSiblingZindexs":"True","FFlagScrollingFrameSinkMoreInput":"False","FFlagSetClientJobId":"True","FFlagSetPlaceIdInAdvance3":"True","FFlagSettingsHubInviteReleaseStreamTimeAs10":"True","FFlagSettingsHubInviteToGameDefaultThumbnailSize150x150":"True","FFlagSkyNoTranslationAndSaturate":"True","FFlagStudioABTestFramework":"True","FFlagStudioCollectGPUInfo":"True","FFlagStudioEnableWebKitPlugins":"True","FFlagStudioFixSciptOpenBehavior":"False","FFlagStudioImagePickerFix":"True","FFlagStudioOutputSaveFileAsLink":"True","FFlagStudioShowTutorialsByDefault":"True","FFlagStudioTrustsPlayersImmediately":"True","FFlagStudioTutorialSeeAll":"True","FFlagTextBoxOverrideManualFocusRelease":"False","FFlagTextMeasureTemporaryPatch":"True","FFlagTrackWindowsVideoRecording":"True","FFlagTranslateAvatarContextMenu":"True","FFlagUSC180727A":"True","FFlagUSC180727C":"True","FFlagUSC180727D":"True","FFlagUSC24644":"True","FFlagUSC26572":"True","FFlagUnlockMouseIfKicked":"True","FFlagUnlockedTopbarTransparency":"True","FFlagUseNewErrorStrings":"True","FFlagUseRBXThumbInToolbox":"True","FFlagUseSetForegroundWindowForPlayer":"False","FFlagUserAnimateScriptEmoteHook":"True","FFlagUserBetterDynamicTouchstickCamera":"True","FFlagUserBetterHandlingVehicleInputStates":"True","FFlagUserBetterInertialScrolling":"False","FFlagUserClickToMoveBetterCleanup":"True","FFlagUserClickToMoveCancelOnMenuOpened":"True","FFlagUserDTDoesNotForceAutoJump":"True","FFlagUserDTDoesNotTrackTools":"True","FFlagUserDTFastInit":"True","FFlagUserDynamicThumbstickUseContextActionSevice":"True","FFlagUserEnableDynamicThumbstickIntro_PlaceFilter":"True;1817743405","FFlagUserFixCharacterRemovingControlModule":"True","FFlagUserFixChatMessageLogPerformance3":"False","FFlagUserFixChatMessageLogPerformance4":"True","FFlagUserFixChatMessageLogPerformance_PlaceFilter":"True;370731277","FFlagUserFixClickToMoveWithACM":"True","FFlagUserFixMovementCameraStraightDown":"True","FFlagUserFixTouchGuiWhenNoCharacter":"True","FFlagUserHttpAPIVisible":"True","FFlagUserInputServicePipelineMacClient":"True","FFlagUserInputServicePipelineStudio":"True","FFlagUserInputServicePipelineWindowsClient":"True","FFlagUserNavigationFixClickToMoveInterruption":"True","FFlagUserNewClickToMoveDisplay":"True","FFlagUserNewDefaultCameraAngle":"True","FFlagUserNewPoppercam":"False","FFlagUserNewPoppercam3":"True","FFlagUserNewPoppercam3_PlaceFilter":"False;1997193809;734159876","FFlagUserNewPoppercam4":"True","FFlagUserNewPoppercam_PlaceFilter":"False;855499080;606849621;537413528;402122991","FFlagUserNoCameraClickToMove":"True","FFlagUserNoDynamicThumbstickRecenter":"True","FFlagUserPlayEmoteBySlotEnabled":"True","FFlagUserPlayEmoteChatCommand":"True","FFlagUserPlayerScriptsBindAtPriority":"False","FFlagUserPlayerScriptsBindAtPriority2":"True","FFlagUserPointerActionsInPlayerScripts":"True","FFlagUserPoppercamLooseOpacityThreshold":"True","FFlagUserThumbstickFrameIsActuallyFrame":"True","FFlagUserUpdateCameraConstants":"True","FFlagUserUseNewControlScript":"True","FFlagVideoDocumentationPluginEnabled":"True","FFlagVideoRecordDeadlockFix":"True","FFlagVideoRecordFix":"True","FFlagVideoRecordFix2":"True","FFlagWorldAvatarLocalization":"True","FIntCLI20390_2":"16","FIntCompatibilityModeSpecularMultiplierDiv100":"30","FIntGamePerfMonitorPercentage":"10","FIntGraphicsVulkanARMVaryingBufferMb":"160","FIntGraphicsVulkanMinAndroidVersion":"25","FIntGraphicsVulkanMinDriverVersionPVR":"4981305","FIntHttpCurlMaxCachedHandlesPerHost":"8","FIntLocalizationAnalyticsSamplesPerMillion":"1000000","FIntLuaAppMorePagePremiumIcon":"2","FIntNewDevConsoleMaxHttpCount":"300","FIntNewDevConsoleMaxLogCount":"500","FIntNumberParallelNarrowPhaseTasks_PlaceFilter":"10;189707;3229213183;654732683","FIntPercentReportingNetworkProfileAfterStartup":"20","FIntRegLambda":"1400","FIntSendScreenOrientationToEventIngestHundredthsPercentage":"100","FIntStartupInfluxHundredthsPercentage":"100","FIntStudioInsertDeletionCheckTimeMS":"30000","FIntUSC180727B":"32","FIntValidateLauncherPercent":"100","FIntWeldConstraintAdornSize":"10","FIntZoomOutDistance":"500","FLogBrowserActivity":"3","FLogCloseDataModel":"3","FLogDXVideoMemory":"4","FLogFullRenderObjects":"0","FLogGraphics":"6","FLogHangDetection":"3","FLogLuaBridge":"2","FLogNetworkItemQueueDtor":"1","FLogPlayerShutdownLuaTimeoutSeconds":"1","FLogVR":"6","FStringCLI27760S":"nn62qq5r3q8n9sn537r1r00o43nq1p458391556o","FStringGamesUrlPath":"/games/?referrer=roblox-player","FStringSettingsHubInviteToGameThumbnailSize":"Size150x150","FStringStudioTutorialsTOCUrl":"https://web.archive.org/web/20200624170102/http://wiki.roblox.com/index.php?title=Studio_Tutorials_Landing&studiomode=true","FStringStudioTutorialsUrl":"https://web.archive.org/web/20200624170102/http://wiki.roblox.com/index.php?title=Studio_Tutorials_Test&studiomode=true","GoogleAnalyticsAccountPropertyID":"UA-43420590-3","GoogleAnalyticsAccountPropertyIDPlayer":"UA-43420590-14","GoogleAnalyticsLoadStudio":"1","PublishedProjectsPageHeight":"535","PublishedProjectsPageUrl":"/ide/publish","PublishedProjectsPageWidth":"950","StartPageUrl":"/ide/welcome","VideoPreRollWaitTimeSeconds":"45","FFlagFutureIsBrightPhase2_5_v1":"True","FFlagEnableRobuxABTest":"True","FFlagFutureIsBrightPhase2_5_v2":"False","DFFlagTattletaleUseStrstr":"True","DFFlagDebugCurlOption12":"True","DFFlagDebugCurlOption22":"True","FFlagRecordRecording":"True","FFlagTheseAreSomeOfMyBestAttributes":"True","DFFlagTheseAreSomeOfMyBestAttributes":"True","FIntDebugForceMSAASamples":"1000","DFIntDebugForceMSAASamples":"1000"}}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/develop.js b/Back/routes/develop.js new file mode 100644 index 0000000..5254dcb --- /dev/null +++ b/Back/routes/develop.js @@ -0,0 +1,854 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../middleware/authmiddleware') +const User = require('./../model/user.js') +const games = require('./../model/games.js') +const catalog = require('./../model/item.js') +const { requirediscord } = require('./../middleware/requirediscord.js') +var multer = require('multer'); +const fs = require('fs'); +const path = require('path') +var numbtest = /^\d+\.?\d*$/; +const bodyParser = require('body-parser') +const {pngValidator} = require('png-validator') +const fileTypeChecker = require("file-type-checker") + +const rateLimit = require('express-rate-limit') +const limiter = rateLimit({ + windowMs: 3 * 1000, // 3 seconds + max: 1, // Limit each IP to 1 requests per `window` + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: false, // Disable the `X-RateLimit-*` headers + handler: (request, response, next, options) =>{ + response.json({status: 'error', error: 'Too many requests try again later.'}) + } +}) + +async function validateImage(itemid,res){ + return new Promise(async (resolve) => { + + try { + const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), null) + pngValidator(myArrayBuffer); + // success + } catch { + // file is invalid or corrupt + fs.unlink(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), (err => { + if (err) console.log(err) + })); + + return res.json({status: 'error', error: 'Image is invalid.'}) + } + + resolve() + + }) +} + + +const pages = [ + 'shirts', + 'pants', + 'audios', + 'games', + 'badges', + 'meshes' +] + +router.use(bodyParser.json()) + +router.post("/creations", requireAuth,async (req, res) => { + const { type } = req.body + let items = await catalog.find({Creator: req.userdocument.userid, Type: type}).lean().select(['Name',"Description",'ItemId']) + if (type === "games"){ + items = await games.find({useridofowner: req.userdocument.userid}).lean().select(['nameofgame','idofgame','Description','avatartype','gearallowed']) + } + + if (type === "audios"){ + items = await catalog.find({Creator: req.userdocument.userid, Type: "Audio"}).lean().select(['Name',"Description",'ItemId']) + }else if (type === "badges"){ + items = await catalog.find({Creator: req.userdocument.userid, Type: "Badge"}).lean().select(['Name',"Description",'ItemId']) + }else if (type === "meshes"){ + items = await catalog.find({Creator: req.userdocument.userid, Type: "Mesh"}).lean().select(['Name',"Description",'ItemId']) + }else if (type === "userads"){ + items = await catalog.find({Creator: req.userdocument.userid, Type: "User Ad"}).lean().select(['Name',"Description",'ItemId']) + }else if (type === "gamepasses"){ + items = await catalog.find({Creator: req.userdocument.userid, Type: "Gamepass"}).lean().select(['Name',"Description",'ItemId']) + }else if (type === "videos"){ + items = await catalog.find({Creator: req.userdocument.userid, Type: "Video"}).lean().select(['Name',"Description",'ItemId']) + } + + return res.json(items) + + +}) + +var storage = multer.diskStorage({ + destination: function (req, file, cb) { + // Uploads is the Upload_folder_name + if(file.fieldname === "thumbnail"){ // is a game thumbnail + cb(null, "./assets/gameassets") + }else{ + cb(null, "./assets/ugc") + } + + }, + filename: async function (req, file, cb) { + //console.log(path.basename(file.originalname,'.png')) + if (path.extname(file.originalname) === ".rbxl"){ + const placeid = await games.countDocuments(); + cb(null, "gamefile" + "-" + placeid +path.extname(file.originalname)) + }else if(file.fieldname === "thumbnail"){ // is a game thumbnail + const placeid = await games.countDocuments(); + cb(null, "thumbnail" + "-" + placeid + ".png") + } + else if (file.mimetype == "image/png"){ + const itemid = await catalog.countDocuments(); + cb(null, "itemfile" + "-" + itemid + ".rbxm") + }else if (path.extname(file.originalname) === ".mp3"){ + const itemid = await catalog.countDocuments(); + cb(null, "itemfile" + "-" + itemid + ".rbxm") + }else if (path.extname(file.originalname) === ".mesh"){ + const itemid = await catalog.countDocuments(); + cb(null, "itemfile" + "-" + itemid + ".rbxm") + }else if (path.extname(file.originalname) === ".webm"){ + const itemid = await catalog.countDocuments(); + cb(null, "itemfile" + "-" + itemid + ".rbxm") + } + + + } + }) + const uploadcloth = multer({storage: storage, + fileFilter: function (req, file, callback) { + if(file.mimetype !== 'image/png' /*&& ext !== '.mp3' && ext !== '.rbxl'*/) { + return callback('Invalid file type') + } + callback(null, true) + }, + limits: { fileSize: 1024 * 1024 } // 1mb + }) + +router.post("/uploadclothing", requireAuth,requirediscord,async (req, res) => { + uploadcloth.single("clothingfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large"){ + return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"}) + } + if (err === "Invalid file type"){ + return res.status(400).send({status: 'error', error: "Invalid file type"}) + } + return res.status(400).send({status: 'error', error: err.message}) + } + var xss = require("xss") + const {clothingname, description,price,type} = req.body + // save shirt template + if (!clothingname){ + return res.json({status: 'error', error: 'Clothing name needs to be sent.'}) + } + if (!description){ + return res.json({status: 'error', error: 'Description needs to be sent.'}) + } + if (!price){ + return res.json({status: 'error', error: 'Price needs to be sent.'}) + } + if (type != "Shirts" && type != "Pants"){ + return res.json({status: 'error', error: 'Type needs to be a shirt or pant value'}) + } + + if (numbtest.test(price) == false){ + return res.json({status: 'error', error: 'Price can only be a number!'}) + } + + if (price < 5){ + return res.json({status: 'error', error: 'Minimum price is 5 rocks.'}) + } + if (req.userdocument.coins < 5) { // less than + return res.json({status: 'error', error: 'You don\'t have 5 rocks >:(!'}) + }else if (req.userdocument.admin === false){ + req.userdocument.coins -= 5 + req.userdocument.markModified('coins') + await req.userdocument.save() + } + + const itemid = await catalog.countDocuments(); + // check if the file they just uploaded is valid + await validateImage(itemid,res) + let approved = req.userdocument.admin === false ? false : true + + try{ + await catalog.create({ + Name: xss(clothingname), + Description: xss(description), + Price: Math.ceil(price), + Type: "Image", + Hidden: true, + ItemId: itemid, + approved + }) + + + }catch{ + + } + +// save actual item + let xml = ` + null + nil + + + + http://mete0r.xyz/asset/?id=`+itemid+` + + Shirt + true + + + ` +if (type === "Pants"){ +xml = ` + null + nil + + + + http://mete0r.xyz/asset/?id=`+itemid+` + + Pants + true + + +` +} + let shirtid = itemid + 1 // prevent any race conditions + shirtid = shirtid.toString() + fs.writeFile("./assets/ugc/itemfile-"+shirtid+".rbxm", xml,async function(err) { + if(err) { + return console.log(err); + } + let approved = req.userdocument.admin === false ? false : true + try{ + await catalog.create({ + Name: xss(clothingname), + Description: xss(description), + Price: Math.ceil(price), + Creator: req.userdocument.userid, + Type: type, + ItemId: shirtid, + approved + }) + + + }catch{ + + } +}); +// give player shirt +User.updateOne({userid: req.userdocument.userid}, { + $push: { + inventory: {Type: type,ItemId: shirtid, ItemName: xss(clothingname), Equipped: false} + } +}, +function(err, doc) { + //console.log(err) +}) +return res.json({status: 'success', message: 'Done!'}) + + + +}) +}) + +// upload game WOW +const uploadgame = multer({storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname); + if(ext !== '.png' && ext !== '.rbxl'/* && ext !== '.mp3'*/) { + return callback('Invalid file type') + } + callback(null, true) + }, + limits: { fileSize: 5120 * 1024 * 2 } // 10mb +}) + +const uploadaudio = multer({storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname); + if(ext !== '.mp3' && ext !== '.ogg') { + return callback('Invalid file type') + } + callback(null, true) + }, + limits: { fileSize: 5120 * 1024 } // 5mb +}) + +var editgamestorage = multer.diskStorage({ + destination: function (req, file, cb) { + // Uploads is the Upload_folder_name + if(file.fieldname === "thumbnail"){ // is a game thumbnail + cb(null, "./assets/gameassets") + }else{ + cb(null, "./assets/ugc") + } + + }, + filename: async function (req, file, cb) { + //console.log(path.basename(file.originalname,'.png')) + if (path.extname(file.originalname) === ".rbxl"){ + + const item = await games.findOne({idofgame: req.body.gameid}).lean() + if (!item){ + + return cb("Item doesn't exist!") + } + + //console.log(item) + + if (item.useridofowner != req.userdocument.userid){ + // player doesn't own this item + return cb("You don't own this") + } + cb(null, "gamefile" + "-" + req.body.gameid +path.extname(file.originalname)) + } + + } + }) + +const editgame = multer({storage: editgamestorage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname); + + if(ext !== '.rbxl'/* && ext !== '.mp3'*/) { + return callback('Invalid file type') + } + callback(null, true) + }, + limits: { fileSize: 5120 * 1024 * 2 } // 10mb +}) + +router.post("/editgame", requireAuth,requirediscord,async (req, res) => { + const {nameofgame, description, gameid} = req.body + var xss = require("xss") + if (!gameid){ + return res.json({status: 'error', error: 'GameID required'}) + } + + const item = await games.findOne({idofgame: gameid}) + if (!item){ + + return res.json({status: 'error', error: "Game doesn't exist."}) + } + + //console.log(item) + + if (item.useridofowner != req.userdocument.userid){ + // player doesn't own this item + return res.json({status: 'error', error: "You don't have permissions for this!"}) + } + + if (nameofgame && nameofgame != ""){ + item.nameofgame = xss(nameofgame) + item.markModified('nameofgame') + await item.save() + } + + if (description && description != ""){ + item.descrption = xss(description) + item.markModified('descrption') + await item.save() + } + + return res.json({status: 'success',message:'Done!'}) + + + }) + + router.post("/editavatartype", requireAuth,requirediscord,async (req, res) => { + const {avatartype, gameid} = req.body + if (!gameid){ + return res.json({status: 'error', error: 'GameID required'}) + } + if (!avatartype){ + return res.json({status: 'error', error: 'Avatar type required'}) + } + + if (avatartype != "R6" && avatartype != "R15" && avatartype != "PC"){ + return res.json({status: 'error', error: 'Avatar type required'}) + } + const item = await games.findOne({idofgame: gameid}) + if (!item){ + + return res.json({status: 'error', error: "Game doesn't exist."}) + } + + //console.log(item) + + if (item.useridofowner != req.userdocument.userid){ + // player doesn't own this item + return res.json({status: 'error', error: "You don't have permissions for this!"}) + } + + item.avatartype = avatartype + item.markModified('avatartype') + await item.save() + + + + return res.json({status: 'success',message:'Done!'}) + + + }) + + router.post("/editgearstatus", requireAuth,requirediscord,async (req, res) => { + const {newgearstatus, gameid} = req.body + if (!gameid){ + return res.json({status: 'error', error: 'GameID required'}) + } + + if (newgearstatus != true && newgearstatus != false){ + return res.json({status: 'error', error: 'Gear status required'}) + } + const item = await games.findOne({idofgame: gameid}) + if (!item){ + + return res.json({status: 'error', error: "Game doesn't exist."}) + } + + //console.log(item) + + if (item.useridofowner != req.userdocument.userid){ + // player doesn't own this item + return res.json({status: 'error', error: "You don't have permissions for this!"}) + } + + item.gearallowed = newgearstatus + item.markModified('gearallowed') + await item.save() + + + + return res.json({status: 'success',message:'Done!'}) + + + }) + +router.post("/editgameupload", requireAuth,requirediscord,async (req, res) => { + editgame.single("gamefile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large"){ + return res.status(400).send({status: 'error', error: "File too large! 10MB Limit"}) + } + if (err === "Invalid file type"){ + return res.status(400).send({status: 'error', error: "Invalid file type"}) + } + return res.status(400).send({status: 'error', error: err.message}) + } + + return res.json({status: 'success',message:'Done!'}) +}) +}) + +router.post("/uploadgame", requireAuth,requirediscord,async (req, res) => { + uploadgame.fields([ + {name: 'gamefile', maxCount: 1}, + {name: 'thumbnail', maxCount: 1} + ])(req, res, async function (err) { + if (err) { + if (err?.message === "File too large"){ + return res.status(400).send({status: 'error', error: "File too large! 10MB Limit"}) + } + if (err === "Invalid file type"){ + return res.status(400).send({status: 'error', error: "Invalid file type"}) + } + return res.status(400).send({status: 'error', error: err.message}) + } + var xss = require("xss") + const {gamename, description, version} = req.body + // save game + if (!gamename){ + return res.json({status: 'error', error: 'Game name needs to be sent.'}) + } + + if (gamename?.length > 50) { + return res.json({status: 'error', error: 'Game name can not be more than 50 characters'}) + } + + if (!description){ + return res.json({status: 'error', error: 'Description needs to be sent.'}) + } + + if (description?.length > 1000) { + return res.json({status: 'error', error: 'Description can not be more than 1000 characters'}) + } + + if (!version){ + return res.json({status: 'error', error: 'Version needs to be sent.'}) + } + const versions = [ + //"2014", + "2016", + "2018", + "2020" + ] + + if (versions.includes(version) === false){ + return res.json({status: 'error', error: 'Invalid version sent.'}) + } + if (req.userdocument.coins < 5) { // less than + return res.json({status: 'error', error: 'You don\'t have 5 rocks >:(!'}) + }else if (req.userdocument.admin === false){ + req.userdocument.coins -= 5 + req.userdocument.markModified('coins') + await req.userdocument.save() + } + + const placeid = await games.countDocuments(); + try{ + await games.create({ + useridofowner: req.userdocument.userid, + idofgame: placeid, + nameofgame: xss(gamename), + numberofplayers: "0", + descrption: xss(description), + version: version + }) + + + }catch{ + throw error + } + return res.json({status: 'success', message: 'Done!'}) +}) +}) + + +const uploadasset = multer({storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname); + if(ext !== '.png' && ext !== '.mesh') { + return callback('Invalid file type') + } + callback(null, true) + }, + limits: { fileSize: 5120 * 1024 } // 1mb +}) + +router.post("/uploadmeshes", requireAuth,requirediscord,limiter,async (req, res) => { + uploadasset.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large"){ + return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"}) + } + if (err === "Invalid file type"){ + return res.status(400).send({status: 'error', error: "Invalid file type"}) + } + return res.status(400).send({status: 'error', error: err.message}) + } + var xss = require("xss") + const {itemname} = req.body + // save mesh + if (!itemname){ + return res.json({status: 'error', error: 'Mesh name needs to be sent.'}) + } + const itemid = await catalog.countDocuments(); + const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), null) + + if (fileTypeChecker.detectFile(myArrayBuffer)){ + // not a mesh + fs.unlink(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), (err => { + if (err) console.log(err) + })) + + return res.json({status: 'error', error: 'Mesh is invalid.'}) + } + + try{ + await catalog.create({ + Name: xss(itemname), + Price: "0", + Type: "Mesh", + Creator: req.userdocument.userid, + Hidden: true, + ItemId: itemid, + approved: true + }) + + + }catch(err){ + throw(err) + } + + return res.json({status: 'success', message: "Done! Mesh ID : "+itemid}) +}) +}) + +router.post("/uploadbadges", requireAuth,requirediscord,limiter,async (req, res) => { + uploadasset.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large"){ + return res.status(400).json({status: 'error', error: "File too large! 1MB Limit"}) + } + if (err === "Invalid file type"){ + return res.status(400).json({status: 'error', error: "Invalid file type"}) + } + return res.status(400).json({status: 'error', error: err.message}) + } + var xss = require("xss") + const {itemname} = req.body + // save badge + if (!itemname){ + return res.json({status: 'error', error: 'Badge name needs to be sent.'}) + } + const itemid = await catalog.countDocuments(); + + //check if the file thye just uploaded is valid + await validateImage(itemid,res) + try{ + let approved = req.userdocument.admin === false ? false : true + await catalog.create({ + Name: xss(itemname), + Price: "0", + Type: "Badge", + Creator: req.userdocument.userid, + Hidden: true, + ItemId: itemid, + approved + }) + + + }catch(err){ + throw(err) + } + + return res.json({status: 'success', message: "Done! Badge ID : "+itemid}) +}) +}) + +router.post("/uploaduserads", requireAuth,requirediscord,limiter,async (req, res) => { + uploadasset.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large"){ + return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"}) + } + if (err === "Invalid file type"){ + return res.status(400).send({status: 'error', error: "Invalid file type"}) + } + return res.status(400).send({status: 'error', error: err.message}) + } + var xss = require("xss") + const {itemname} = req.body + // save userad + if (!itemname){ + return res.json({status: 'error', error: 'User Ad name needs to be sent.'}) + } + const itemid = await catalog.countDocuments(); + + // check if the file they just uploaded is valid + await validateImage(itemid,res) + + try{ + let approved = req.userdocument.admin === false ? false : true + await catalog.create({ + Name: xss(itemname), + Price: "0", + Type: "User Ad", + Creator: req.userdocument.userid, + ItemId: itemid, + ActiveAd: false, + approved + }) + + + }catch(err){ + throw(err) + } + + return res.json({status: 'success', message: "Done!"}) +}) +}) + +router.post("/uploadgamepasses", requireAuth,requirediscord,limiter,async (req, res) => { + uploadasset.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large"){ + return res.status(400).send({status: 'error', error: "File too large! 1MB Limit"}) + } + if (err === "Invalid file type"){ + return res.status(400).send({status: 'error', error: "Invalid file type"}) + } + return res.status(400).send({status: 'error', error: err.message}) + } + var xss = require("xss") + const {itemname,price,gameid} = req.body + // save game pass + if (!itemname){ + return res.json({status: 'error', error: 'Gamepass name needs to be sent.'}) + } + if (!price){ + return res.json({status: 'error', error: 'Price needs to be sent.'}) + } + if (!gameid){ + return res.json({status: 'error', error: 'Gameid needs to be sent.'}) + } + if (numbtest.test(price) == false){ + return res.json({status: 'error', error: 'Price can only be a number!'}) + } + + if (price < 1){ + return res.json({status: 'error', error: 'Minimum price is 1 rock.'}) + } + const gamedoc = await games.findOne({idofgame: gameid}) + + if (!gamedoc){ + return res.json({status: 'error', error: 'Game not found'}) + } + + if (gamedoc.useridofowner != req.userdocument.userid){ + return res.json({status: 'error', error: "You don't own this game!"}) + } + + const currentgamepasscount = await catalog.countDocuments({associatedgameid: gamedoc.idofgame}) + + if (currentgamepasscount >= 20){ + return res.json({status: 'error', error: 'No more than 20 game passes per game.'}) + } + + const itemid = await catalog.countDocuments() + + // check if the file they just uploaded is valid + await validateImage(itemid,res) + + try{ + let approved = req.userdocument.admin === false ? false : true + await catalog.create({ + Name: xss(itemname), + Description: "", + Price: Math.ceil(price), + Creator: req.userdocument.userid, + Type: "Gamepass", + ItemId: itemid, + approved, + associatedgameid: gamedoc.idofgame + }) + + + }catch(err){ + throw(err) + } + + return res.json({status: 'success', message: "Done!"}) +}) +}) + +router.post("/uploadaudios", requireAuth,requirediscord,limiter,async (req, res) => { + uploadaudio.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large"){ + return res.status(400).send({status: 'error', error: "File too large! 5MB Limit"}) + } + if (err === "Invalid file type"){ + return res.status(400).send({status: 'error', error: "Invalid file type"}) + } + return res.status(400).send({status: 'error', error: err.message}) + } + var xss = require("xss") + const {itemname} = req.body + // save audio + if (!itemname){ + return res.json({status: 'error', error: 'Audio name needs to be sent.'}) + } + const itemid = await catalog.countDocuments(); + + const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), null) + + if (fileTypeChecker.isMP3(myArrayBuffer) === false && fileTypeChecker.isOGG(myArrayBuffer) === false){ + fs.unlink(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), (err => { + if (err) console.log(err) + })) + + return res.json({status: 'error', error: 'Audio is invalid.'}) + } + + try{ + let approved = req.userdocument.admin === false ? false : true + await catalog.create({ + Name: xss(itemname), + Price: "0", + Type: "Audio", + Creator: req.userdocument.userid, + Hidden: true, + ItemId: itemid, + approved + }) + + + }catch(err){ + throw(err) + } + + return res.json({status: 'success', message: "Done! Audio ID : "+itemid}) +}) +}) + +const uploadvideo = multer({storage: storage, + fileFilter: function (req, file, callback) { + var ext = path.extname(file.originalname); + if(ext !== '.webm') { + return callback('Invalid file type') + } + callback(null, true) + }, + limits: { fileSize: 10240 * 1024 } // 10mb +}) + +router.post("/uploadvideos", requireAuth,requirediscord,limiter,async (req, res) => { + uploadvideo.single("assetfile")(req, res, async function (err) { + if (err) { + if (err?.message === "File too large"){ + return res.status(400).send({status: 'error', error: "File too large! 10MB Limit"}) + } + if (err === "Invalid file type"){ + return res.status(400).send({status: 'error', error: "Invalid file type"}) + } + return res.status(400).send({status: 'error', error: err.message}) + } + var xss = require("xss") + const {itemname} = req.body + // save audio + if (!itemname){ + return res.json({status: 'error', error: 'Video name needs to be sent.'}) + } + const itemid = await catalog.countDocuments(); + + const myArrayBuffer = await fs.promises.readFile(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), null) + + if (fileTypeChecker.isWEBM(myArrayBuffer) === false){ + fs.unlink(path.resolve(`assets/ugc/itemfile-${itemid}.rbxm`), (err => { + if (err) console.log(err) + })) + + return res.json({status: 'error', error: 'Video is invalid.'}) + } + + try{ + let approved = req.userdocument.admin === false ? false : true + await catalog.create({ + Name: xss(itemname), + Price: "0", + Type: "Video", + Creator: req.userdocument.userid, + ItemId: itemid, + approved + }) + + + }catch(err){ + throw(err) + } + + return res.json({status: 'success', message: "Done! Video ID : "+itemid}) +}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/game.js b/Back/routes/game.js new file mode 100644 index 0000000..341eb39 --- /dev/null +++ b/Back/routes/game.js @@ -0,0 +1,413 @@ +const express = require("express") +const router = express.Router() +const signatures = require("./signatures.js") +const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); +const User = require('../model/user.js') +const { requireAuth } = require('../middleware/authmiddlewaregame') +const rcctalk = require('../rcctalk') +const games = require('../model/games.js') +const catalog = require('../model/item.js') +const rcc = require('../model/rcc.js') +var sanitize = require('mongo-sanitize'); +const { getPort, checkPort, getRandomPort, waitForPort } = require('get-port-please') +const fs = require('fs') +const gamescript = fs.readFileSync('actualgameserver.lua','utf-8') +require('dotenv').config() +const RCC_HOST = process.env.RCC_HOST +const logshook = process.env.logshook +const crypto = require('crypto'); +const key = fs.readFileSync('DefaultPrivateKey.pem') +const key2 = fs.readFileSync('DefaultPrivateKey.pem') +const key2020 = fs.readFileSync('PrivateKey2020.txt') +const { _2020placelauncher } = require('../routes/2020/game') +const { _2018placelauncher } = require('../routes/2018/game') + +//join and placelauncher +function sleep(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); + } + + router.get("/visit",async (req, res) => { + // studio + const string = `local RS = game:GetService("RunService") + local P = game:GetService("Players") + local LP = P:CreateLocalPlayer(0) + LP.CharacterAppearance = "" + LP.CharacterAdded:connect( + function(c) + repeat + wait() + until c:FindFirstChild("Humanoid") + local h = c:FindFirstChild("Humanoid") + h.Died:connect( + function() + wait(5) + LP:LoadCharacter() + end + ) + end + ) + game:GetService("InsertService"):SetBaseSetsUrl("http://mete0r.xyz/Game/Tools/InsertAsset.ashx?nsets=10&type=base") +game:GetService("InsertService"):SetUserSetsUrl("http://mete0r.xyz/Game/Tools/InsertAsset.ashx?nsets=20&type=user&userid=%d") +game:GetService("InsertService"):SetCollectionUrl("http://mete0r.xyz/Game/Tools/InsertAsset.ashx?sid=%d") +pcall(function() game:GetService("InsertService"):SetFreeModelUrl("http://mete0r.xyz/Game/Tools/InsertAsset.ashx?type=fm&q=%s&pg=%d&rs=%d") end) +pcall(function() game:GetService("InsertService"):SetFreeDecalUrl("http://mete0r.xyz/Game/Tools/InsertAsset.ashx?type=fd&q=%s&pg=%d&rs=%d") end) + RS:Run() + LP:LoadCharacter() + pcall( + function() + game:GetService("ContentProvider"):SetBaseUrl("http://mete0r.xyz" .. "/") + end + ) + + + + ` + const sign = crypto.createSign('SHA1'); + sign.update("\r\n" + string) + var signature = sign.sign(key, "base64") + + res.send("--rbxsig%"+signature+"%\r\n" +string) + }) + + + router.get(["/GetCurrentUser","/GetCurrentUser.ashx"],async (req, res) => { + + res.send("1") // 1 means logged in and null means logged out + }) // don't send 404 error but i don't think we will have studio publishing + + router.post("/validate-machine",async (req, res) => { + + res.json({"success":true,"message":""}) + }) + +router.get(["/join","/join.ashx"],requireAuth,async (req, res) => { + if (!req.userdocument.discordid){ + return res.json({status:"error",error:"Link your discord account stinky"}) + } + if (req.query.ver === "2018"){ + if (!req.userdocument.gamejoin2018 || req.userdocument.gamejoin2018 === "{}"){ + return res.json({status:"error",error:"no placelauncher"}) + } + var joinJson = JSON.parse(req.userdocument.gamejoin2018) + req.userdocument.gamejoin2018 = undefined + req.userdocument.markModified('gamejoin2018') + await req.userdocument.save() + //sign with our sign module + var signature = signatures.signer(joinJson) + //console.log(signature) + + return res.send("--rbxsig%"+signature+"%\r\n"+JSON.stringify(joinJson)) + } + if (req.query.ver === "2020"){ + if (!req.userdocument.gamejoin2020 || req.userdocument.gamejoin2020 === "{}"){ + return res.json({status:"error",error:"no placelauncher"}) + } + var joinJson = JSON.parse(req.userdocument.gamejoin2020) + req.userdocument.gamejoin2020 = undefined + req.userdocument.markModified('gamejoin2020') + await req.userdocument.save() + //sign with our sign module + const sign = crypto.createSign('SHA1'); + sign.update("\r\n" + JSON.stringify(joinJson)) + var signature = sign.sign(key2020, "base64") + + //console.log(signature) + + return res.send("--rbxsig2%"+signature+"%\r\n"+JSON.stringify(joinJson)) + } + if (!req.userdocument.gamejoin || req.userdocument.gamejoin === "{}"){ + return res.json({status:"error",error:"no placelauncher"}) + } + var joinJson = JSON.parse(req.userdocument.gamejoin) + req.userdocument.gamejoin = undefined + req.userdocument.markModified('gamejoin') + await req.userdocument.save() + //sign with our sign module + var signature = signatures.signer(joinJson) + //console.log(signature) + + res.send("--rbxsig%"+signature+"%\r\n"+JSON.stringify(joinJson)) +}) + +router.all(["/placelauncher","/placelauncher.ashx"],requireAuth,_2020placelauncher,_2018placelauncher,async (req, res, next) => { + var enabled = req.config + if (enabled.GamesEnabled === false){ + return res.json({status:"error",error:"Games are disabled bad boy"}) + } + var joinJson = {"ClientPort":0,"MachineAddress":"localhost","ServerPort":25564,"PingUrl":"","PingInterval":120,"UserName":"default","SeleniumTestMode":false,"UserId":0,"SuperSafeChat":false,"CharacterAppearance":"http://shitncumblox.gq/game/charapp?name=default","ClientTicket":"","GameId":1,"PlaceId":1818,"MeasurementUrl":"","WaitingForCharacterGuid":"cad99b30-7983-434b-b24c-eac12595e5fd","BaseUrl":"http://www.mete0r.xyz/","ChatStyle":"ClassicAndBubble","VendorId":0,"ScreenShotInfo":"","VideoInfo":"GamesROBLOX, video, free game, online virtual world","CreatorId":0,"CreatorTypeEnum":"User","MembershipType":"None","AccountAge":365,"CookieStoreFirstTimePlayKey":"rbx_evt_ftp","CookieStoreFiveMinutePlayKey":"rbx_evt_fmp","CookieStoreEnabled":true,"IsRobloxPlace":false,"GenerateTeleportJoin":false,"IsUnknownOrUnder13":false,"SessionId":"c25fd620-bbaa-4fb2-b022-3f053cdd1abd|00000000-0000-0000-0000-000000000000|0|204.236.226.210|8|2016-08-17T01:05:05.7115837Z|0|null|null|null|null","DataCenterId":0,"UniverseId":0,"BrowserTrackerId":0,"UsePortraitMode":false,"FollowUserId":0,"CharacterAppearanceId":1} + if (!req.query.name && !req.query.placeId){ + return res.json({status:"error",error:"no placeid bad"}) + } + if (req.userdocument.gamejoin){ + return res.json({"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?auth="+req.query.auth??req.cookies.jwt,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""}) + } + var sanitizedplaceid = sanitize(req.query.name??req.query.placeId) + const game = await games.findOne({idofgame: sanitizedplaceid}).lean() + if (!game){ + return res.json({status:"error",error:"that game doesn't exist!"}) + } + if (game.version != "2016"){ + return res.json({status: "error",error:"game version is different than client requested"}) + } + const instance = await rcc.findOne({PlaceId: sanitizedplaceid}).lean() + if (instance && instance.Status === 2){ + // if an rcc instance already exists we don't need to create a new one so we will just drag them into the existing game + joinJson.UserName = req.userdocument.username + joinJson.UserId = req.userdocument.userid + joinJson.CharacterAppearance = "http://mete0r.xyz/game/charapp?name=" + req.userdocument.userid + joinJson.MachineAddress = RCC_HOST // need to put rcc host here lol + joinJson.ServerPort = instance.Port + joinJson.PlaceId = instance.PlaceId + joinJson.GameId = sanitizedplaceid + joinJson.CharacterAppearanceId = req.userdocument.userid + joinJson.MembershipType = req.userdocument.membership + joinJson.CreatorId = game.useridofowner + joinJson.SessionId = req.query.auth??req.cookies.jwt + + const timestamp = Date.now() + joinJson.ClientTicket = timestamp+";" // timestamp + //create signature 1 + const sign1 = crypto.createSign('SHA1'); + sign1.update(`${req.userdocument.userid}\n`/*userid*/+`${req.userdocument.username}\n`/*username*/+`http://mete0r.xyz/game/charapp?name=${req.userdocument.userid}\n`/*charapp*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) + var signature1 = sign1.sign(key, "base64") + joinJson.ClientTicket += signature1 + ";" + + //create signature 2 + const sign2 = crypto.createSign('SHA1'); + sign2.update(`${req.userdocument.userid}\n`/*userid*/+`game${sanitizedplaceid}\n`/*jobid*/+ timestamp/*timestamp*/) + var signature2 = sign2.sign(key, "base64") + joinJson.ClientTicket += signature2 + + req.userdocument.gamejoin = JSON.stringify(joinJson) + req.userdocument.markModified('gamejoin') + await req.userdocument.save() + var joinScriptJson = {"jobId":"Test","status":2,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + + + return res.send(JSON.stringify(joinScriptJson)) + } + if (instance && instance.Status === 1){ + var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + return res.send(JSON.stringify(joinScriptJson)) + } + + + var port = await getPort({random: true}) + var newgamescript = "local placeId = "+sanitizedplaceid+"\n"+ gamescript + newgamescript = "local port = "+port+"\n"+ newgamescript + // launch job + var response = await rcctalk.OpenJob("game"+sanitizedplaceid,newgamescript,"99999") + await rcc.create({ + PlaceId: sanitizedplaceid, + Port: port, + Status: 1 // 1 means loading + }) + + //console.log(newrenderscript) + + var joinScriptJson = {"jobId":"Test","status":1,"joinScriptUrl":"http://mete0r.xyz/game/join.ashx?auth="+joinJson.SessionId,"authenticationUrl":"http://mete0r.xyz/Login/Negotiate.ashx","authenticationTicket":"SomeTicketThatDosentCrash","message":""} + res.send(JSON.stringify(joinScriptJson)) + +} +) + +//charapp and colors stealing from roblox + + +router.get("/charapp", async (req, res) => { + if (Object.keys(req.query).length === 0) { + res.status(404).send('No variables :('); + } else{ + const user = await User.findOne({userid: req.query.name}).lean() + const placeid = req.headers?.['roblox-place-id']??0 + const placedoc = await games.findOne({idofgame: placeid}) + if (!placedoc){ + return res.json({status:"error",error:"Place not found."}) + } + + if (!user) { + return res.json({status: 'error', error: 'User not found!'}) + } + + if (!user.inventory){ + if (req.query.rcc){ + return res.json([]) + } + return res.send('http://mete0r.xyz/game/colors?name='+req.query.name+';') + } + + if (req.query.rcc){ + var empty = [] + for (var key of user.inventory) { + if (key.Equipped === true){ + empty.push({"item": {itemid: key.ItemId, type: key.Type}}) + } + } + return res.json(empty) + } + + + var charapp = 'http://mete0r.xyz/asset?name='+req.query.name+';' + // add to charapp string by adding json to it + for (var key of user.inventory) { + if (key.Equipped === true){ + if (placedoc.gearallowed??false === true){ + charapp += "http://mete0r.xyz/asset?id=" + key.ItemId + ";" + }else{ + if (key.Type != "Gears"){ + charapp += "http://mete0r.xyz/asset?id=" + key.ItemId + ";" + } + } + } + } + + res.write(charapp) + res.end() + } +}) + +router.get("/colors", async (req, res) => { + if (Object.keys(req.query).length === 0) { + res.status(404).send('No variables :('); + } else{ + const user = await User.findOne({userid: req.query.name}).lean() + if (!user) { + return res.json({status: 'error', error: 'User not found!'}) + } + + if (req.query.rcc){ + var empty = [] + for (var key of user.colors) { + empty.push(key.value) + } + return res.json(empty) + } + + + res.type('application/xml'); + var colorsxml = ` + null + nil + + + `+user.colors.find(x => x.name === 'Head').value+` + `+user.colors.find(x => x.name === 'Left Arm').value+` + `+user.colors.find(x => x.name === 'Left Leg').value+` + Body Colors + `+user.colors.find(x => x.name === 'Right Arm').value+` + `+user.colors.find(x => x.name === 'Right Leg').value+` + `+user.colors.find(x => x.name === 'Torso').value+` + true + + + ` + + res.send(colorsxml) + + } +}) + +router.get("/", (req, res) => { + res.status(404).send('hmmm? kinda sus'); +}) + +router.get("/players/:id", (req, res) => { + res.json({"ChatFilter":"whitelist"}) +}) + +router.post("/load-place-info", (req, res) => { + res.json({"CreatorId": 0, "CreatorType": "User", "PlaceVersion": 1}) +}) + +router.post("/badge/awardbadge",async (req, res) => { + const userid = req.query.UserID + const badgeid = req.query.BadgeID + const placeid = req.query.PlaceID + + const badge = await catalog.findOne({ItemId: badgeid}).lean() + const user = await User.findOne({userid: userid}).lean() + + if(!badge){ + //Badge doesn't exist! + return res.send("0") + } + + if(!user){ + return res.send("0") + } + + const badgecreator = await User.findOne({userid: badge.Creator}).lean() + + if (typeof user.badges !== "undefined"){ + // check if user already owns item + for (var v of user.badges){ + if (v.badgeid === badgeid){ + // they already own it + return res.send("0") + } + } + } + + User.updateOne({userid: req.query.UserID}, { + $push: { + badges: {badgeid: badgeid, badgename: badge.Name, creator: badge.Creator, placeid: placeid} + } + }, + function(err, doc) { + if (err){ + return res.send("0") + } + }) + + return res.send(user.username+" won "+badgecreator.username+"'s "+badge.Name+" award!") +}) + + +router.get(["/LuaWebService/HandleSocialRequest","/LuaWebService/HandleSocialRequest.ashx"],async (req, res) => { + res.type('application/xml'); + if (req.query.method === "IsInGroup"){ + if (req.query.groupid === '0' || req.query.groupid === '1200769'){ // 1200769 admin group + const user = await User.findOne({userid: req.query.playerid}).lean() + if (user){ + return res.send(`${user.admin}`) + } + } + return res.send('false') + } + if (req.query.method === "GetGroupRank"){ + if (req.query.groupid === '0'|| req.query.groupid === '1200769'){ + const user = await User.findOne({userid: req.query.playerid}).lean() + if (user){ + if (user.admin === true){ + return res.send(`255`) + } + } + } + return res.send('0') + } + if (req.query.method === "IsBestFriendsWith"){ + return res.send('false') + } + if (req.query.method === "IsFriendsWith"){ + return res.send('false') + } + res.type('html'); + return res.status(404).end() +}) + +router.get("/Tools/InsertAsset.ashx",async (req, res) => { + const lol = await fetch('http://sets.pizzaboxer.xyz/Game'+req.url); + if (lol.status === 400){ + return res.send(``) + } + return res.send(await lol.text()) +}) + +router.post("/MachineConfiguration.ashx", (req,res) => { + res.json({"success": true}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/games.js b/Back/routes/games.js new file mode 100644 index 0000000..5f34821 --- /dev/null +++ b/Back/routes/games.js @@ -0,0 +1,214 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../middleware/authmiddleware') +const games = require('./../model/games.js') +const catalog = require("./../model/item.js") +const { grabAuth } = require('./../middleware/grabauth.js') +const rcc = require('./../model/rcc.js') +const rcc2018 = require('./../model/rcc2018.js') +const rcc2020 = require('./../model/rcc2020.js') +const rcctalk = require('./../rcctalk') +const rcctalk2018 = require('./../rcctalk2018') +const bodyParser = require('body-parser') +router.use(bodyParser.json()) + +router.post("/scroll", async (req, res) => { + const resultsPerPage = 10 + let cursor = req.body.cursor >= 0 ? req.body.cursor : 0 + let type = req.body.type ? req.body.type : "Popular" + let allowed = ['idofgame', 'version', 'nameofgame', 'numberofplayers', 'visits', 'useridofowner'] + try{ + if (type === "Popular"){ + const response = await games.find().sort({numberofplayers: "descending", idofgame: 1}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") + return res.json(response) + } + if (type === "OurRecommendations"){ + const featured = await games.find({featured: true}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") + return res.json(featured) + } + if (type === "Visits"){ + const mostvisitedresponse = await games.find().sort({visits: "descending", idofgame: 1}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") + return res.json(mostvisitedresponse) + } + if (type === "NewestArrivals"){ + const newest = await games.find().sort({idofgame: "descending"}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") + return res.json(newest) + } + return res.json({status: "error", error: "wtf"}) + + + + + } catch (error) { + console.log(error) + return res.json({status: "error", error: "wtf"}) + } + +}) + +router.post("/firstpaint", async (req, res) => { + const resultsPerPage = 10 + let cursor = 0 + let allowed = ['idofgame', 'version', 'nameofgame', 'numberofplayers', 'visits', 'useridofowner'] + try{ + const response = await games.find().sort({numberofplayers: "descending", idofgame: 1}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") + const featured = await games.find({featured: true}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") + const mostvisitedresponse = await games.find().sort({visits: "descending", idofgame: 1}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") + const newest = await games.find().sort({idofgame: "descending"}).skip(0+parseFloat(cursor)*resultsPerPage).limit(10).lean().select(allowed).populate("owner", "username") + return res.json({Popular: {array: response},OurRecommendations: {array: featured}, Visits: {array: mostvisitedresponse}, NewestArrivals: {array: newest} }) + + } catch (error) { + console.log(error) + return res.json({status: "error", error: "wtf"}) + } + +}) + +router.post("/shutdown",requireAuth, async (req, res) => { + const {gameid} = req.body + if (isNaN(parseFloat(gameid)) === true){ + return res.json({status: "error", error: "Not found"}) + } + + const gamedoc = await games.findOne({idofgame: gameid}).lean() + + //console.log(response) + + if (!gamedoc){ + return res.json({status: "error", error: "Not found"}) + } + if (gamedoc.useridofowner != req.userdocument.userid && req.userdocument.admin === false){ // make sure we only let game owners and admins shut down the game + return res.json({status: "error", error: "Not Authorized"}) + } + + if (gamedoc.version === "2018" || gamedoc.version === "2020"){ + let instance = await rcc2018.findOne({PlaceId: gamedoc.idofgame}).lean() + if (!instance){ + instance = await rcc2020.findOne({PlaceId: gamedoc.idofgame}).lean() + if (!instance){ + return res.json({status: "error", error: "Game not open."}) + } + } + + await rcc2018.deleteOne({PlaceId: gamedoc.idofgame}) + await rcc2020.deleteOne({PlaceId: gamedoc.idofgame}) + rcctalk2018.CloseJob("game"+gamedoc.idofgame) + } + if (gamedoc.version === "2016"){ + const instance = await rcc.findOne({PlaceId: gamedoc.idofgame}).lean() + if (!instance){ + return res.json({status: "error", error: "Game not open."}) + } + + await rcc.deleteOne({PlaceId: gamedoc.idofgame}) + + rcctalk.CloseJob("game"+gamedoc.idofgame) + } + + return res.json({status: "success", message:"Done!"}) + + +}) + +router.post("/evictplayer",requireAuth, async (req, res) => { + const {gameid,userid} = req.body + if (isNaN(parseFloat(userid)) === true){ + return res.json({status: "error", error: "Not found"}) + } + + const gamedoc = await games.findOne({idofgame: gameid}).lean() + + //console.log(response) + + if (!gamedoc){ + return res.json({status: "error", error: "Not found"}) + } + if (gamedoc.useridofowner != req.userdocument.userid && req.userdocument.admin === false){ // make sure we only let game owners and admins shut down the game + return res.json({status: "error", error: "Not Authorized"}) + } + + if (gamedoc.version === "2018" || gamedoc.version === "2020"){ + let instance = await rcc2018.findOne({PlaceId: gamedoc.idofgame}).lean() + if (!instance){ + instance = await rcc2020.findOne({PlaceId: gamedoc.idofgame}).lean() + if (!instance){ + return res.json({status: "error", error: "Game not open."}) + } + } + + rcctalk2018.Execute("game"+gamedoc.idofgame,{"Mode":"EvictPlayer","Settings":{"PlayerId":userid}}) + } + if (gamedoc.version === "2016"){ + const instance = await rcc.findOne({PlaceId: gamedoc.idofgame}).lean() + if (!instance){ + return res.json({status: "error", error: "Game not open."}) + } + let kickscript = `for v, player in pairs(game:GetService("Players"):GetChildren()) do + print(player.UserId) + local tokick = ${userid} + if player.UserId == tokick then + player:Kick() + end + end` + rcctalk.Execute("game"+gamedoc.idofgame,kickscript) + } + + return res.json({status: "success", message:"Done!"}) + + +}) + +router.get('/gameinfo/:id', async (req, res) => { + var id = req.params.id; + if (isNaN(parseFloat(id)) === true){ + return res.json({status: "error", error: "Not found"}) + } + + const response = await games.findOne({idofgame: id}).lean().select(['idofgame', 'version', 'nameofgame', 'numberofplayers', 'visits', 'useridofowner', 'players','descrption']).populate("owner", "username") + //console.log(response) + + if (!response){ + return res.json({status: "error", error: "Not found"}) + } + const date = new Date(response._id.getTimestamp()) + response.creationdate = (date.getMonth()+1) + '/' + date.getDate() + '/' + date.getFullYear() + + + return res.json({error: false, gameinfo: response}) +}) + +router.get('/gameinfo/:id/store', async (req, res) => { + var id = req.params.id; + if (isNaN(parseFloat(id)) === true){ + return res.json({status: "error", error: "Not found"}) + } + + const response = await catalog.find({associatedgameid: id}).lean() + //console.log(response) + + if (!response){ + return res.json({status: "error", error: "Not found"}) + } + + return res.json({status: "success", gameinfo: response}) +}) + +router.post('/search', async (req, res) => { + const resultsPerPage = 100 + let cursor = req.body.cursor >= 0 ? req.body.cursor : 0 + + function escapeRegex(text) { + return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + } + const regex = new RegExp(escapeRegex(req.body.searchquery), 'gi'); + + //const pages = await User.countDocuments({username: regex})/resultsPerPage + + const response = await games.find({nameofgame: regex}).limit(resultsPerPage).skip(0+parseFloat(cursor)*resultsPerPage).lean().select(['idofgame', 'version', 'nameofgame', 'numberofplayers', 'visits', 'useridofowner', 'players','descrption']) + + return res.json(response) + + +}); + +module.exports = router \ No newline at end of file diff --git a/Back/routes/login.js b/Back/routes/login.js new file mode 100644 index 0000000..eef810a --- /dev/null +++ b/Back/routes/login.js @@ -0,0 +1,168 @@ +const express = require("express") +const router = express.Router() +const bodyParser = require('body-parser') +var sanitize = require('mongo-sanitize'); +const mongoose = require('mongoose'); +const User = require('./../model/user.js') +const bcrypt = require('bcrypt') +const jwt = require('jsonwebtoken') +require('dotenv').config() +const JWT_SECRET = process.env.JWT_SECRET +const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); +const speakeasy = require('speakeasy') +const rateLimit = require('express-rate-limit') +const limiter = rateLimit({ + windowMs: 5 * 1000, // 5 seconds + max: 1, // Limit each IP to 1 requests per `window` + standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers + legacyHeaders: false, // Disable the `X-RateLimit-*` headers + handler: (request, response, next, options) =>{ + return response.json({status: 'error', error: 'Too many requests try again later.'}) + } +}) + +router.use(bodyParser.json()) + +router.get("/", (req, res) => { + res.redirect('/') +}) + +router.get(["/RequestAuth","/RequestAuth.ashx"], (req, res) => { + if (!req.cookies['.ROBLOSECURITY']){ + res.status(403).end() + } + res.send('https://www.mete0r.xyz/Login/Negotiate.ashx?suggest='+req.cookies['.ROBLOSECURITY']) +}) // studio + +router.get(["/Negotiate","/Negotiate.ashx"], (req, res) => { + if (!req.query.suggest){ + res.status(403).end() + } + //res.cookie('jwt', req.query.suggest) // maxage is 24 hours + res.cookie('.ROBLOSECURITY', req.query.suggest) + res.cookie('.RBXID', req.query.suggest) + res.send(req.query.suggest) +}) // studio + + +router.post("/",limiter,async (req, res) => { + //console.log(req.headers) + let {username, password, _2fa} = req.body + if (!username && req.headers?.["user-agent"]?.includes("RobloxStudio/WinInet") === true){ // Studio login + username = req.body.cvalue??req.body.username + password = req.body.password??req.body.ticket + _2fa = req.body.code + } + if (!username || typeof username !== 'string') { + return res.json({status: 'error', error: 'Usernames needs to be sent and it needs to be a string'}) + } + if (!password || typeof password !== 'string') { + return res.json({status: 'error', error: 'Password needs to be sent and it needs to be a string'}) + } + + if(password.length < 4) { + return res.json({status: 'error', error: 'Password needs to be at least 5 characters'}) + } + + sanitizedusername = sanitize(username) + + const user = await User.findOne({username: sanitizedusername})/*.lean()*/ + if (!user) { + if (req.headers?.["user-agent"] === "RobloxStudio/WinInet"){ // studio response + return res.json({ + "errors": [ + { + "code": 1, + "message": "Incorrect password" + } + ] + }) + } + return res.json({status: 'error', error: 'Invalid username/password'}) + } + + if (user.twofasecrets){ + const json = JSON.parse(user.twofasecrets) + if (json.verified === true){ + if (!_2fa){ + if (req.headers?.["user-agent"] === "RobloxStudio/WinInet"){ // studio response + return res.json({ + "user": { + "id": user.userid, + "name": user.username, + }, + "twoStepVerificationData": { + "mediaType": "Email", + "ticket": password + }, + "isBanned": false + }) + } + return res.json({status: 'error', error: '2FA Enabled on account but 2fa not sent'}) + } + const valid = speakeasy.totp.verify({ + secret: json.secret, + encoding: 'ascii', + token: _2fa + }) + if (valid === false){ + if (req.headers?.["user-agent"] === "RobloxStudio/WinInet"){ // studio response + return res.json({ + "errors": [ + { + "code": 6, + "message": "Invalid two step verify code." + } + ] + }) + } + return res.json({status: 'error', error: 'Invalid 2FA Code'}) + } + + }else{ + // basically if they haven't verified that they know the secret before we will just remove it for them + user.twofasecrets = undefined + user.markModified('twofasecrets') + user.save() + } + } + + if(await bcrypt.compare(password, user.password) || password === user.password) { + // the username and password match + // lets make a token for them using the data from our database + const ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + const token = jwt.sign({ id: user._id, username: user.username, admin: user.admin, userid: user.userid, ip, furry: true },JWT_SECRET,{expiresIn: '24h'}) + if (req.headers?.["user-agent"] != "RobloxStudio/WinInet"){ + res.cookie('jwt', token, {SameSite: "Strict",httpOnly: true,maxAge: 24 * 60 * 60 * 1000 }) // maxage is 24 hours + } + res.cookie('.ROBLOSECURITY', token, {SameSite: "Strict",httpOnly: true,maxAge: 24 * 60 * 60 * 1000 }) + res.cookie('.RBXID', token, {SameSite: "Strict",httpOnly: true,maxAge: 24 * 60 * 60 * 1000 }) + if (req.url === "/v2/twostepverification/verify"){ + return res.json({}) + } + if (req.headers?.["user-agent"] === "RobloxStudio/WinInet"){ // studio response + return res.json({ + "user": { + "id": user.userid, + "name": user.username, + }, + "isBanned": false + }) + } + return res.json({status: 'ok', cookie: token}) + } + if (req.headers?.["user-agent"] === "RobloxStudio/WinInet"){ // studio response + return res.json({ + "errors": [ + { + "code": 1, + "message": "Incorrect password" + } + ] + }) + } + + res.status(403).json({status: 'error', error: 'Invalid username/password'}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/logout.js b/Back/routes/logout.js new file mode 100644 index 0000000..43c2c29 --- /dev/null +++ b/Back/routes/logout.js @@ -0,0 +1,9 @@ +const express = require("express") +const router = express.Router() + +router.get("/", (req, res) => { + res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) + res.redirect('/') +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/marketplace.js b/Back/routes/marketplace.js new file mode 100644 index 0000000..e696773 --- /dev/null +++ b/Back/routes/marketplace.js @@ -0,0 +1,260 @@ +const express = require("express") +const router = express.Router() +const games = require('./../model/games.js') +const User = require('./../model/user.js') +const item = require("./../model/item.js") +const { requireAuth } = require("../middleware/authmiddleware.js") + +var rgx = /^[0-9]*\.?[0-9]*$/; +router.get("/marketplace/productinfo", async (req, res) => { + const sanitizedid = req.query.assetId.match(rgx) + let json = {"TargetId":5009,"ProductType":"User Product","AssetId":93722443,"ProductId":13831621,"Name":"rrr","Description":"","AssetTypeId":19,"Creator":{"Id":1,"Name":"","CreatorType":"User","CreatorTargetId":1},"IconImageAssetId":0,"Created":"2012-09-28T01:09:47.077Z","Updated":"2017-01-03T00:25:45.8813192Z","PriceInRobux":null,"PriceInTickets":null,"Sales":0,"IsNew":false,"IsForSale":true,"IsPublicDomain":false,"IsLimited":false,"IsLimitedUnique":false,"Remaining":null,"MinimumMembershipLevel":0,"ContentRatingTypeId":0} + + + let response = await games.findOne({idofgame: parseFloat(sanitizedid)}).lean() + if (!response){ + response = await item.findOne({ItemId: parseFloat(sanitizedid)}).lean() + json.PriceInRobux = parseFloat(response.Price) + json.AssetTypeId = 34 + json.IconImageAssetId = parseFloat(req.query.assetId) + if (!response){ + return res.status(404).end() + } + } + + const creator = await User.findOne({userid: parseFloat(response.useridofowner??response.Creator)}).lean() + json.AssetId = parseFloat(req.query.assetId) + json.ProductId = parseFloat(req.query.assetId) + json.TargetId = parseFloat(req.query.assetId) + json.Name = response.nameofgame??response.Name + json.Description = response.descrption??"" + json.Creator.Id = parseFloat(response.useridofowner??response.Creator) + json.Creator.Name = creator.username + json.Creator.CreatorTargetId = parseFloat(response.useridofowner??response.Creator) + res.json(json) +}) + +router.post("/marketplace/purchase",requireAuth, async (req, res) => { + const productId = parseInt(req.body.productId) + if (!productId){ + res.json({success: false,status: "Error",receipt: ""}) + } + + + const itemdoc = await item.findOne({ItemId: productId})//.lean() + if (typeof req.userdocument.inventory !== "undefined"){ + // check if user already owns item + for (var v of req.userdocument.inventory){ + if (v.ItemId === itemdoc.ItemId){ + // they already own it + return res.json({status: 'error', error: "You already own this!"}) + } + } + } + if (itemdoc.Type === "Mesh" || itemdoc.Type === "Audio" || itemdoc.Type === "Mesh"){ + return res.json({status: 'error', error: "You can't buy assets."}) + } + + if (itemdoc.Hidden){ + return res.json({success: false,status: "Error",receipt: ""}) + } + + + if (req.userdocument.coins >= itemdoc.Price){ + // has enough money to purcahse item + try{ + User.updateOne({userid: req.userdocument.userid}, { + $set: { + coins: req.userdocument.coins - itemdoc.Price + }, + $push: { + inventory: {Type: itemdoc.Type,ItemId: itemdoc.ItemId, ItemName: itemdoc.Name, Equipped: false} + } + }, + function(err, doc) { + //console.log(err) + }) + // give owner cash + User.updateOne({userid: itemdoc.Creator}, { + $inc: { + coins: itemdoc.Price + } + }, + function(err, doc) { + //console.log(err) + }) + + itemdoc.Sales += 1 + if (!itemdoc.Sales){ + itemdoc.Sales = 1 + } + //console.log(itemdoc.Sales) + itemdoc.markModified('Sales') + await itemdoc.save() + }catch{ + + } + return res.json(({success: true,status: "Bought",receipt: ""})) + } + // too poor + return res.json({success: false,status: "Error",receipt: ""}) + +}) + +router.get('/ownership/hasasset',async (req, res) => { + const userid = req.query?.userId + const assetId = req.query?.assetId + const doc = await User.findOne({userid: userid}) + const itemdoc = await item.findOne({ItemId: assetId}) + if (!doc){ + return res.send("false") + } + if (!itemdoc){ + return res.send("false") + } + + if (typeof doc.inventory !== "undefined"){ + // check if user already owns item + for (var v of doc.inventory){ + if (v.ItemId === itemdoc.ItemId){ + // they already own it + return res.send("true") + } + } + } + + return res.send("false") +}) + +router.get('/v1/users/:userId/items/gamepass/:assetId',async (req, res) => { + const userid = req.params?.userId + const assetId = req.params?.assetId + const doc = await User.findOne({userid: userid}) + const itemdoc = await item.findOne({ItemId: assetId}) + let data = {"previousPageCursor":null,"nextPageCursor":null,"data":[]} + + if (!doc){ + return res.json(data) + } + if (!itemdoc){ + return res.json(data) + } + + if (typeof doc.inventory !== "undefined"){ + // check if user already owns item + for (var v of doc.inventory){ + if (v.ItemId === itemdoc.ItemId){ + // they already own it + data.data.push({"type": "GamePass","id": req.params?.assetId,"name": itemdoc.Name,"instanceId": null}) + return res.json(data) + } + } + } + + return res.json(data) +}) + +router.post('/v1/purchases/products/:assetId',requireAuth,async (req, res) => { + const assetId = req.params?.assetId + const itemdoc = await item.findOne({ItemId: assetId}) + let error = { + "purchased": false, + "reason": "InsufficientFunds", + "productId": 15194787, + "statusCode": 500, + "title": "Not Enough Robux", + "errorMsg": "You do not have enough Robux to purchase this item.", + "showDivId": "InsufficientFundsView", + "shortfallPrice": 29, + "balanceAfterSale": -29, + "expectedPrice": 150, + "currency": 1, + "price": 150, + "assetId": 106690045 + } + + if (!itemdoc){ + error.productId = assetId + error.title = "Not found" + return res.json(error) + } + error.price = itemdoc.Price + error.productId = assetId + error.assetId = assetId + error.expectedPrice = itemdoc.Price + error.balanceAfterSale = req.userdocument.coins - itemdoc.Price + error.shortfallPrice = Math.abs(req.userdocument.coins - itemdoc.Price) + + + if (typeof req.userdocument.inventory !== "undefined"){ + // check if user already owns item + for (var v of req.userdocument.inventory){ + if (v.ItemId === itemdoc.ItemId){ + // they already own it + return res.json({status: 'error', error: "You already own this!"}) + } + } + } + if (itemdoc.Type === "Mesh" || itemdoc.Type === "Audio" || itemdoc.Type === "Mesh"){ + return res.json({status: 'error', error: "You can't buy assets."}) + } + + if (itemdoc.Hidden){ + return res.json({status: 'error', error: "You can't buy this!"}) + } + + if (req.userdocument.coins >= itemdoc.Price){ + // has enough money to purcahse item + try{ + User.updateOne({userid: req.userdocument.userid}, { + $set: { + coins: req.userdocument.coins - itemdoc.Price + }, + $push: { + inventory: {Type: itemdoc.Type,ItemId: itemdoc.ItemId, ItemName: itemdoc.Name, Equipped: false} + } + }, + function(err, doc) { + //console.log(err) + }) + // give owner cash + User.updateOne({userid: itemdoc.Creator}, { + $inc: { + coins: itemdoc.Price + } + }, + function(err, doc) { + //console.log(err) + }) + + itemdoc.Sales += 1 + if (!itemdoc.Sales){ + itemdoc.Sales = 1 + } + //console.log(itemdoc.Sales) + itemdoc.markModified('Sales') + await itemdoc.save() + }catch{ + + } + return res.json({ + "purchased": true, + "reason": "Success", + "productId": assetId, + "currency": 1, + "price": itemdoc.Price, + "assetId": assetId, + "assetName": itemdoc.Name, + "assetType": "Gamepass", + "assetTypeDisplayName": "Gamepass", + "assetIsWearable": false, + "sellerName": "Robloxxx", + "transactionVerb": "bought", + "isMultiPrivateSale": false + }) + } + + return res.json(error) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/mobileapi.js b/Back/routes/mobileapi.js new file mode 100644 index 0000000..319ed8f --- /dev/null +++ b/Back/routes/mobileapi.js @@ -0,0 +1,44 @@ +const express = require("express") +const router = express.Router() + +router.get('/check-app-version',async (req, res) => { + return res.json({Response: {"data":{"UpgradeAction":"NotRequired"}}}) +}) + +router.post('/login',async (req, res) => { + return res.json({ + "Status":"OK", + "UserInfo": { + "UserName":"meteorite", + "RobuxBalance":"69420", + "TicketsBalance":"69420", + "IsAnyBuildersClubMember":false, + "ThumbnailUrl":"http://www.mete0r.xyz/", + "UserID":1 + } + }) +}) + + + +router.get('/userinfo',async (req, res) => { + return res.json({ + "Status":"OK", + "UserInfo": { + "UserName":"meteorite", + "RobuxBalance":"69420", + "TicketsBalance":"69420", + "IsAnyBuildersClubMember":false, + "ThumbnailUrl":"http://www.mete0r.xyz/", + "UserID":1 + } + }) +}) + +router.all('/logout',async (req, res) => { + res.cookie('jwt', "", {SameSite: "Strict",maxAge: 1 }) + res.cookie('.ROBLOSECURITY', "", {SameSite: "Strict",maxAge: 1 }) + return res.json({}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/persistence.js b/Back/routes/persistence.js new file mode 100644 index 0000000..e5aae35 --- /dev/null +++ b/Back/routes/persistence.js @@ -0,0 +1,209 @@ +const express = require("express") +const router = express.Router() +const bodyParser = require('body-parser') +const games = require('./../model/games.js') +require('dotenv').config() +const RCC_HOST = process.env.RCC_HOST +router.use(bodyParser.text({limit: '100mb'})) +router.use(async function (req, res, next) { + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress.replace(/^.*:/, '') + console.log(ip) + + if (ip === RCC_HOST || ip == "::ffff:"+RCC_HOST){ + return next() + } + return res.status(403) + }) + router.post('/getV2', async (req, res)=>{ + const placeid = req.query.placeId + const scope = req.query.scope + const game = await games.findOne({idofgame: placeid}).lean() + if (!game.datastore){ + return res.json({"data": [{"Key": {"Scope": req.body.qkeys[0], "Target": "KEY", "Key": req.body.qkeys[1]}, "Value": "nil"}]}) + } + const datastore = JSON.parse(game.datastore) + // first make sure database exists then make sure scope exists finally make sure key exists inside scope + if (datastore[req.body.qkeys[2]] && datastore[req.body.qkeys[2]][req.body.qkeys[0]] && datastore[req.body.qkeys[2]][req.body.qkeys[0]][req.body.qkeys[1]]){ + + // 2 = database name + // 1 = Key name + // 0 = scope + +var wow = {"data": [{"Key": {"Scope": req.body.qkeys[0], "Target": "KEY", "Key": req.body.qkeys[1]}, "Value": datastore[req.body.qkeys[2]][req.body.qkeys[0]][req.body.qkeys[1]].value}]}; +//console.log(req.body) + +console.dir(wow,{ depth: null }) + + + +return res.json(wow) + } + + + + return res.json({"data": [{"Key": {"Scope": req.body.qkeys[0], "Target": "KEY", "Key": req.body.qkeys[1]}, "Value": "nil"}]}) + + + }); + router.post('/set', async (req, res)=>{ + const placeid = req.query.placeId + const game = await games.findOne({idofgame: placeid}).lean() + if (!game){ + return res.sendStatus(404) + } + + let currentdatastore + if (!game.datastore){ + try{ + await games.updateOne({idofgame: placeid}, { + $set: { + datastore: JSON.stringify({[req.query.key]: {[req.query.scope]: {[req.query.target]: {value: req.body.value}},type: req.query.type}}) + } + }, + function(err, doc) { + //console.log(err) + }) + }catch{ + + } + return res.json({"data": [{"Key": {"Scope": req.query.key, "Target": "KEY", "Key": [req.query.target]}, "Value": req.body.value}]}) + } + currentdatastore = JSON.parse(game.datastore) + + if (currentdatastore[req.query.key]){ // if database name already exists + console.log('1') + if (currentdatastore[req.query.key][[req.query.scope]]){ // if database scope already exists + console.log('2') + if (currentdatastore[req.query.key][req.query.scope][req.query.target]){ // key already stored overwrite it + console.log('3') + currentdatastore[req.query.key][req.query.scope][req.query.target] = {value: req.body.value} + }else{ + console.log('4') + currentdatastore[req.query.key][req.query.scope][req.query.target] = {value: req.body.value} // database scope exists but key doesn't so generate it + } + }else{ + currentdatastore[req.query.key][req.query.scope] = {[req.query.target]: {value: req.body.value}} // scope doesn't exist + } + + }else{ + currentdatastore[req.query.key] = {[req.query.scope]: {[req.query.target]: {value: req.body.value}},type: req.query.type} // database doesn't exist make sure to pass database type as well + } + + try{ + await games.updateOne({idofgame: placeid}, { + $set: { + datastore: JSON.stringify(currentdatastore) + } + }, + function(err, doc) { + //console.log(err) + }) + }catch{ + + } + //console.log(req.body) + res.json({"data": [{"Key": {"Scope": req.query.key, "Target": "KEY", "Key": [req.query.target]}, "Value": req.body.value}]}) + }) + + + +router.post("/increment", async (req, res) => { + const placeid = req.query.placeId + const game = await games.findOne({idofgame: placeid}).lean() + if (!game){ + return res.sendStatus(404) + } + let currentdatastore + if (!game.datastore){ + res.json({"data": {}}) + } + currentdatastore = JSON.parse(game.datastore) + + if (currentdatastore[req.query.key] && currentdatastore[req.query.key][req.query.scope] && currentdatastore[req.query.key][req.query.scope][req.query.target]){ + let value = parseFloat(currentdatastore[req.query.key][req.query.scope][req.query.target].value) + if (!isNaN(parseFloat(value)) === true){ + // is number + let newvalue = value += parseFloat(req.query.value) + currentdatastore[req.query.key][req.query.scope][req.query.target].value = newvalue.toString() + try{ + await games.updateOne({idofgame: placeid}, { + $set: { + datastore: JSON.stringify(currentdatastore) + } + }, + function(err, doc) { + //console.log(err) + }) + }catch{ + + } + //console.log(req.body) + return res.json({"data": [{"Key": {"Scope": req.query.key, "Target": "KEY", "Key": [req.query.target]}, "Value": parseFloat(currentdatastore[req.query.key][req.query.scope][req.query.target].value)}]}) + + } + } + res.json({"data": {}}) + +}) + + +router.post("/getSortedValues", async (req, res) => { + const placeid = req.query.placeId + const game = await games.findOne({idofgame: placeid}).lean() + if (!game){ + return res.sendStatus(404) + } + if (!game.datastore){ + return res.json({"data":{"Entries":[],"ExclusiveStartKey":null}}) + } + + const datastore = JSON.parse(game.datastore) + // first make sure database exists then make sure scope exists + if (datastore[req.query.key] && datastore[req.query.key][req.query.scope]){ + + function paginate(array, page_size, page_number) { + // human-readable page numbers usually start with 1, so we reduce 1 in the first argument + return array.slice((page_number - 1) * page_size, page_number * page_size); + } + + +let wow = {"data":{"Entries":[],"ExclusiveStartKey":null}} + +//console.log(datastore[req.query.key][req.query.scope]) + +const pageNumber = req.query.exclusiveStartKey??1 + +for (const [key, value] of Object.entries(datastore[req.query.key][req.query.scope])) { + wow.data.Entries.push({Target: key,Value: value.value}) + } + + if (req.query.ascending === "False"){ + // descending order + wow.data.Entries.sort((a, b) => a.Value - b.Value).reverse(); + }else{ + //ascending + wow.data.Entries.sort((a, b) => a.Value - b.Value) + } + +wow.data.Entries = paginate(wow.data.Entries,req.query.pageSize,pageNumber) + +if (Object.entries(datastore[req.query.key][req.query.scope]).length > pageNumber * req.query.pageSize ){ // if the next page exists fill the exclusivestartkey + wow.data.ExclusiveStartKey = (parseFloat(pageNumber) + 1).toString() +} + +//console.log(req.body) + +//console.dir(wow,{ depth: null }) + + + +return res.json(wow) + } + + return res.json({"data":{"Entries":[],"ExclusiveStartKey":null}}) + + +}) + + +module.exports = router \ No newline at end of file diff --git a/Back/routes/register.js b/Back/routes/register.js new file mode 100644 index 0000000..f5025b6 --- /dev/null +++ b/Back/routes/register.js @@ -0,0 +1,142 @@ +const { response } = require("express") +const express = require("express") +const router = express.Router() +const bodyParser = require('body-parser') +const mongoose = require('mongoose'); +const User = require('./../model/user.js') +const keys = require('./../model/keys.js') +const bcrypt = require('bcrypt') +var sanitize = require('mongo-sanitize'); +const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); +var xss = require("xss") + +function isAlphaNumeric(str) { + var code, i, len; + + for (i = 0, len = str.length; i < len; i++) { + code = str.charCodeAt(i); + if (!(code > 47 && code < 58) && // numeric (0-9) + !(code > 64 && code < 91) && // upper alpha (A-Z) + !(code === 95) && // underscore + !(code > 96 && code < 123)) { // lower alpha (a-z) + return false; + } + } + return true; + } + +router.use(bodyParser.json()) + +router.post("/",async (req, res) => { + //console.log(req.body) + let {username, password: plainTextPassword} = req.body + if (!req.body.captcha) { + return res.json({status: 'error', error: 'Need a valid captcha bozo'}) + } + if (!username || typeof username !== 'string') { + return res.json({status: 'error', error: 'Usernames needs to be sent and it needs to be a string'}) + } + if (!plainTextPassword || typeof plainTextPassword !== 'string') { + return res.json({status: 'error', error: 'Password needs to be sent and it needs to be a string'}) + } + + if(plainTextPassword.length < 4) { + return res.json({status: 'error', error: 'Password needs to be at least 5 characters'}) + } + + if(username.length > 20) { + return res.json({status: 'error', error: 'Username can not be more than 20 characters'}) + } + + if (isAlphaNumeric(username) === false){ + return res.json({status: 'error', error: 'Usernames can not have special symbols except for underscores'}) + } +// verify our captcha + var captchaverifyreq = await fetch('https://hcaptcha.com/siteverify', { + method: 'POST', + headers:{ + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: new URLSearchParams({ + 'secret': '0xE05AB1CFB83252696175FA69E526a3048547Cf0d', + 'response': req.body.captcha, + 'sitekey': '30f6dee1-f765-42d0-ae34-29697c4aa623' + }) +}); + var captcha = await captchaverifyreq.json() +if (captcha.success == false) { + return res.json({status: 'error', error: 'Invalid Captcha. Try again.'}) +} + +// check if keys are enabled +var registration = req.config +if (registration.RegistrationEnabled === false){ + return res.json({status: 'error', error: 'Registration has been temporarily disabled. Please join our discord.'}) +} +if (registration.KeysEnabled === true){ + + if (!req.body.invitekey){ + return res.json({status: 'error', error: 'Invite key needs to be sent.'}) + } + + sanitizedkey = sanitize(req.body.invitekey) + const key = await keys.findOne({Key: sanitizedkey}).lean() + + if (!key){ + // key is invalid + return res.json({status: 'error', error: 'Invalid Key.'}) + } + + if (key.Used === true){ + // key has been used already + return res.json({status: 'error', error: 'Key has been used already.'}) + } + + keys.updateOne({Key: sanitizedkey}, { + $set: { + Used: true, + UsedBy: username + } + }, + function(err, doc) { + //console.log(err) + }) +} + + + +// if all checks above have succceeded we can proceed with registering in our database +username = xss(username) // stop anyone doing anything silly :) + try{ + const password = (await bcrypt.hash(plainTextPassword, 10)) + const userid = await User.countDocuments(); + var datetime = new Date() + var datetimeepoch = new Date().getTime() + const response = await User.create({ + username, + password, + admin: false, + coins: 15, + userid, + moderation: JSON.stringify({status: "ok", Reason: "None", ExpiresIn: "None"}), + joindate: datetime.toISOString().slice(0,10), + colors: [{name: "Head",value: 1001 },{name: "Torso",value: 1001 },{name: "Left Arm",value: 1001 },{name: "Right Arm",value: 1001 },{name: "Left Leg",value: 1001 },{name: "Right Leg",value: 1001 }], + lastclaimofcurrency: datetimeepoch, + membership: "None", + timesincelastrequest: datetimeepoch + + }) + //console.log(response) + }catch(error){ + if (error.code === 11000) { + return res.json({status: 'error', error: 'Username already in use'}) + }else if (error.errors.username.kind === "unique") { + return res.json({status: 'error', error: 'Username already in use'}) + } + throw error + } + + res.json({status: 'ok'}) +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/settings.js b/Back/routes/settings.js new file mode 100644 index 0000000..3681d28 --- /dev/null +++ b/Back/routes/settings.js @@ -0,0 +1,169 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../middleware/authmiddleware') +const clientid = "1008206768989544449" +const secret = "M2ixbjumSA6o1Qgt7KvCNcPb_giJHyp3" +const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); +const User = require('./../model/user.js') +const speakeasy = require('speakeasy') +const qrcode = require('qrcode') +const bodyParser = require('body-parser') +const xss = require('xss') +router.use(bodyParser.json()) + +router.get('/authenticate',requireAuth,async function(req,rep){ + const code = req.query.code + //console.log(code) + if (code){ + const response = await fetch("https://discord.com/api/oauth2/token",{ + body: new URLSearchParams({ + client_id: clientid, + client_secret: secret, + code, + grant_type: 'authorization_code', + redirect_uri: `http://mete0r.xyz/settings/authenticate`, + scope: 'identify', + }), + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded" + } + }) + + const son = await response.json() + //console.log(son) + //console.log(son["access_token"]) + + const resp2 = await fetch("https://discord.com/api/users/@me",{ + headers: { + "authorization": `${son["token_type"]} ${son["access_token"]}` + } + }) + + const final = await resp2.json() + + const dcid = final.id + //console.log(dcid) + const user = await User.findOne({discordid: dcid})/*.lean()*/ + if (user) { + return rep.redirect("/settings?error=alreadyused") + } + const milliseconds = BigInt(dcid) >> 22n + if (new Date(Number(milliseconds) + 1420070400000)> Date.now() - (1000 * 60 * 60 * 24 * 7 * 4) === true){ // 1 month + return rep.redirect("/settings?error=toonew") + } + req.userdocument.discordid = dcid.toString() + req.userdocument.markModified('discordid') + await req.userdocument.save() + + rep.redirect('/settings') + + } +}) + + +/*router.get("/unlink", requireAuth,async (req, res) => { + req.userdocument.discordid = undefined + req.userdocument.markModified('discordid') + await req.userdocument.save() + res.redirect('/settings') +})*/ + +router.get("/2fa", requireAuth,async (req, res) => { + if (req.userdocument.twofasecrets){ + const json = JSON.parse(req.userdocument.twofasecrets) + if (json.verified === true){ + return res.json({status: "success", message: "2FA already set sorry."}) + }else{ + // basically if they haven't verified that they know the secret before we will just remove it for them + req.userdocument.twofasecrets = undefined + req.userdocument.markModified('twofasecrets') + req.userdocument.save() + } + } + const secret = speakeasy.generateSecret({ + name: "Meteorite" + }) + qrcode.toDataURL(secret.otpauth_url, function(err, data) { + + req.userdocument.twofasecrets = JSON.stringify({secret: secret.ascii, verified: false}) + req.userdocument.markModified('twofasecrets') + req.userdocument.save() + return res.json({status: "success", message: "2FA set please verify to complete.", qrcode: data}) + }); + +}) + + +router.post("/verify2fa", requireAuth,async (req, res) => { + const {code} = req.body + if (req.userdocument.twofasecrets){ + const json = JSON.parse(req.userdocument.twofasecrets) + if (json.verified === true){ + return res.json({status: "success", message: "2FA already set sorry."}) + }else{ + + const valid = speakeasy.totp.verify({ + secret: json.secret, + encoding: 'ascii', + token: code + }) + if (valid === false){ + return res.json({status: 'error', error: 'Invalid 2FA Code'}) + }else{ + json.verified = true + req.userdocument.twofasecrets = JSON.stringify(json) + req.userdocument.markModified('twofasecrets') + req.userdocument.save() + return res.json({status: "success", message:"2FA verified."}) + } + + + } + } +}) + +router.post("/setbio", requireAuth,async (req, res) => { + const { bio } = req.body + if (typeof bio !== 'string'){ + return res.json({status: 'error', error: 'Bio not sent'}) + } + if (bio.length>100){ + return res.json({status: 'error', error: 'Length over 100.'}) + } + req.userdocument.bio = xss(bio) + req.userdocument.markModified('bio') + req.userdocument.save() + return res.json({status: "success", message:"Done."}) +}) + +router.post("/changecss", requireAuth,async (req, res) => { + const { customcss } = req.body + if (typeof customcss !== 'string'){ + return res.json({status: 'error', error: 'Bio not sent'}) + } + if (customcss.length>5000){ + return res.json({status: 'error', error: 'Length over 5000.'}) + } + req.userdocument.css = xss(customcss) + req.userdocument.markModified('css') + req.userdocument.save() + return res.json({status: "success", message:"Done."}) +}) + +router.post("/aboutme", requireAuth,async (req, res) => { + const { about } = req.body + if (typeof about !== 'string'){ + return res.json({status: 'error', error: 'Bio not sent'}) + } + if (about.length>200){ + return res.json({status: 'error', error: 'Length over 200.'}) + } + req.userdocument.aboutme = xss(about) + req.userdocument.markModified('aboutme') + req.userdocument.save() + return res.json({status: "success", message:"Done."}) +}) + + +module.exports = router \ No newline at end of file diff --git a/Back/routes/signatures.js b/Back/routes/signatures.js new file mode 100644 index 0000000..bcbb98d --- /dev/null +++ b/Back/routes/signatures.js @@ -0,0 +1,14 @@ +const crypto = require('crypto'); +const fs = require('fs') +const key = fs.readFileSync('DefaultPrivateKey.pem') +// signature API for roblos , used to bless scripts from site to client/rcc/studio and will grant +// FULL Lua permissions to scripts, and allow CoreGui access. +function signer(wow){ + const sign = crypto.createSign('SHA1'); + sign.update("\r\n" + JSON.stringify(wow)) + var signature_b64 = sign.sign(key, "base64") + //console.log(signature_b64) + + return(signature_b64) +} +module.exports = {signer} \ No newline at end of file diff --git a/Back/routes/userinfoclient.js b/Back/routes/userinfoclient.js new file mode 100644 index 0000000..df29568 --- /dev/null +++ b/Back/routes/userinfoclient.js @@ -0,0 +1,257 @@ +const express = require("express") +const router = express.Router() +const User = require('./../model/user.js') +var bodyParser = require('body-parser'); +router.use(bodyParser.json()); // support json encoded bodies +router.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies +router.use(bodyParser.text()); // support encoded bodies +const JWT_SECRET = process.env.JWT_SECRET +const jwt = require('jsonwebtoken') +const jwtverify = (req,res,next) => { + jwt.verify(req.headers['roblox-session-id'],JWT_SECRET, (err,decodedtoken) => { + if (err){ + return res.status(403).end() + }else{ + var tokendata = decodedtoken + var name = tokendata.username + try { + User.findOne({username: new RegExp('^'+name+'$', "i")}, function(err, doc) { + + req.userdocument = doc + next() + + })/*.lean()*/} + catch (error) { + console.error(error); + } + + } + + }) + +}; + + +// below is follow code +router.get("/user/following-exists",async (req, res) => { + //console.log("My userid"+req.query.userId) + //console.log("their userid"+req.query.followerUserId) + const user = await User.findOne({userid: req.query.userId}).lean() + if(!user){ + return res.json({isFollowing:"false"}) + } + if (!user.followers){ + return res.json({isFollowing:"false"}) + } + + const follower = user.followers.some(word => word.userid == req.query.followerUserId ) + + if (follower === false){ + return res.json({isFollowing:"false"}) + } + + res.json({success:"true",isFollowing:"true"}) +}) + +router.post("/user/follow",jwtverify,async (req, res) => { + const tofollow = req.body.followedUserId + if (!tofollow){ + return res.json({isFollowing:"false"}) + } + let follower = false + if (req.userdocument.followers){ + follower = req.userdocument.followers.some(word => word.userid == req.query.followerUserId ) + } + + + if (follower === true){ + // already following + res.json({success:"true",isFollowing:"true"}) + } + + + User.updateOne({userid: tofollow}, { + $push: { + followers: {userid: req.userdocument.userid, username: req.userdocument.username} + } + }, + function(err, doc) { + //console.log(err) + }) + + res.json({success:"true",isFollowing:"true"}) + + + +}) + +router.post("/user/unfollow",jwtverify,async (req, res) => { + const tofollow = req.body.followedUserId + if (!tofollow){ + return res.json({isFollowing:"false"}) + } + + + User.updateOne({userid: tofollow}, { + $pull: { + followers: {userid: req.userdocument.userid, username: req.userdocument.username} + } + }, + function(err, doc) { + //console.log(err) + }) + + res.json({success:"true",isFollowing:"false"}) + + + +}) + +//below is friend code + +router.get("/user/get-friendship-count",async (req, res) => { + // this is used to limit friends on the client but since we won't have friends limits we can leave it here + res.json({success:"true",count:1}) +}) + +router.post("/user/request-friendship",jwtverify,async (req, res) => { + const tofriend = req.query.recipientUserId + + if (!tofriend){ + return res.json({isFollowing:"false"}) + } + + const usertofriend = await User.findOne({userid: tofriend}).lean() + if (!usertofriend){ + return res.json({success:"true",isFollowing:"true"}) + } + + + if (usertofriend.friends){ + const friends = usertofriend.friends.some(word => word.userid == req.userdocument.userid) + if (friends === true){ + + return res.json({success:"true",isFollowing:"true"}) + } + // already friends + } + if (req.userdocument.friendrequests){ + // check if the other user is already requesting to friend the player so then they both want to be firends so we can interperept this as an accept request + + const bothwantobefriends = req.userdocument.friendrequests.some(word => word.userid == usertofriend.userid) + if (bothwantobefriends === true){ + console.log(tofriend) + User.updateOne({userid: req.userdocument.userid}, { + $push: { + friends: {userid: usertofriend.userid, username: usertofriend.username} + }, + $pull: { + friendrequests: {userid: usertofriend.userid, username: usertofriend.username} + } + }, + function(err, doc) { + + }) + + User.updateOne({userid: tofriend}, { + $push: { + friends: {userid: req.userdocument.userid, username: req.userdocument.username} + }, + $pull: { + friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} + } + }, + function(err, doc) { + + }) + + return res.json({success:"true",isFollowing:"true"}) + } + + } + if (usertofriend.friendrequests){ + const alreadyrequested = usertofriend.friendrequests.some(word => word.userid == req.userdocument.userid) + + // already friend requested + if (alreadyrequested === true){ + + return res.json({success:"true",isFollowing:"true"}) + } + } + + User.updateOne({userid: usertofriend.userid}, { + $push: { + friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} + } + }, + function(err, doc) { + + }) + + res.json({success:"true",isFollowing:"true"}) + + + +}) + +router.post("/user/decline-friend-request",jwtverify,async (req, res) => { + const tounfriend = req.query.requesterUserId + //console.log(tounfriend+" nerd") + if (!tounfriend){ + return res.json({isFollowing:"false"}) + } + const usertofriend = await User.findOne({userid: tounfriend}).lean() + if (!usertofriend){ + return res.json({success:"true",isFollowing:"true"}) + } + + const alreadyfriends = req.userdocument.friends.some(word => word.userid == tounfriend ) + if (alreadyfriends === true){ + // already friends with the person so they want ro remove their friend + User.updateOne({userid: tounfriend}, { + $pull: { + friends: {userid: req.userdocument.userid, username: req.userdocument.username} + } + }, + function(err, doc) { + //console.log(err) + }) + User.updateOne({userid: req.userdocument.userid}, { + $pull: { + friends: {userid:usertofriend.userid, username: usertofriend.username} + } + }, + function(err, doc) { + //console.log(err) + }) + return res.json({success:"true",isFollowing:"true"}) + } + + + + //otherwise the user isn't friends but still declines the friend request + + User.updateOne({userid: tounfriend}, { + $pull: { + friendrequests: {userid: req.userdocument.userid, username: req.userdocument.username} + } + }, + function(err, doc) { + //console.log(err) + }) + User.updateOne({userid: req.userdocument.userid}, { + $pull: { + friendrequests: {userid: usertofriend.userid, username: usertofriend.username} + } + }, + function(err, doc) { + //console.log(err) + }) + + res.json({success:"true",isFollowing:"true"}) + + + +}) + +module.exports = router \ No newline at end of file diff --git a/Back/routes/users.js b/Back/routes/users.js new file mode 100644 index 0000000..f2cf3ac --- /dev/null +++ b/Back/routes/users.js @@ -0,0 +1,49 @@ +const express = require("express") +const router = express.Router() +const { requireAuth } = require('./../middleware/authmiddleware') +const User = require('./../model/user.js') +const games = require('./../model/games.js') +const bodyParser = require('body-parser') +router.use(bodyParser.json()) + +router.post('/api/users/search', async (req, res) => { + const resultsPerPage = 12 + let page = req.body.page ?? 0 + if (page != 0){ + page-=1 + } + let {searchquery} = req.body + + function escapeRegex(text) { + return text?.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + } + const regex = new RegExp(escapeRegex(searchquery), 'gi'); + + //const pages = await User.countDocuments({username: regex})/resultsPerPage + + const response = await User.find({username: regex}).limit(resultsPerPage).skip(0+parseFloat(page)*resultsPerPage).select(['userid','username']).lean() + let responsecount = await User.countDocuments({username: regex}) + + res.json({data: response, pages: Math.ceil(Math.max(responsecount/resultsPerPage, 1))}) +}); + +router.get(['/users/:userid/canmanage/:gameid','//users/:userid/canmanage/:gameid'], async (req, res) => { + + const user = await User.findOne({userid: req.params.userid})/*.lean()*/ + if (!user) { + return res.json({"Success":false,"CanManage":false}) + } + + const game = await games.findOne({idofgame: req.params.gameid}).lean() + if (!game) { + return res.json({"Success":false,"CanManage":false}) + } + + if (game.useridofowner === user.userid || user.userid === 0 || user.userid === 18){ + return res.json({"Success":true,"CanManage":true}) + } + + return res.json({"Success":true,"CanManage":false}) +}); + +module.exports = router \ No newline at end of file diff --git a/Back/routes/versioncompatibility.js b/Back/routes/versioncompatibility.js new file mode 100644 index 0000000..7b5f1bf --- /dev/null +++ b/Back/routes/versioncompatibility.js @@ -0,0 +1,16 @@ +const express = require("express") +const router = express.Router() + +//router.get("/GetAllowedSecurityVersions", async (req, res) => { +// res.json({"data":["0.384.0macplayer","0.384.0pcplayer","0.226.0win10player","INTERNALiosapp"]}) +//}) + +//router.get("/GetAllowedMD5Hashes", async (req, res) => { +// res.json({"data":["37e2512ce73ced8ad0ff72fa6a711dd0"]}) +//}) + +router.get("/universes/validate-place-join", async (req, res) => { + res.send("true") +}) + +module.exports = router \ No newline at end of file diff --git a/Back/server.mjs b/Back/server.mjs new file mode 100644 index 0000000..f417149 --- /dev/null +++ b/Back/server.mjs @@ -0,0 +1,705 @@ +import Module from "node:module"; + +const require = Module.createRequire(import.meta.url); +import path from 'path'; +import { fileURLToPath } from 'url'; +import { requireAuth } from "./middleware/authmiddleware.js"; + +const __filename = fileURLToPath(import.meta.url); + +const __dirname = path.dirname(__filename); + + +var express = require('express'); +const app = require("express")(); +var cookieParser = require('cookie-parser') +var session = require('express-session') +const helmet = require("helmet"); +const mongoose = require('mongoose'); +const config = require('./model/config.js') +import ipWhitelist from './model/ipWhitelist.mjs' +const user = require('./model/user.js') +const model = require("./model/user.js") +const jwt = require('jsonwebtoken') +const rcctalk = require('./rcctalk') +const { grabAuth } = require('./middleware/grabauth.js') +const games = require('./model/games.js') +require('dotenv').config() +const https = require('https') +const PROD = process.env.PROD +const client = require('prom-client') +const { handler } = await import('../meteoriterewrite/build/handler.js') + +app.use((req, res, next) => { + const allowedOrigins = ['m.mete0r.xyz', 'mete0r.xyz', 'assetgame.mete0r.xyz', 'www.mete0r.xyz', 'api.mete0r.xyz', 'dinnerbone.mete0r.xyz' /* funny */, 'assetgame.mete0r.xyz', 'clientsettingscdn.mete0r.xyz', 'http://127.0.0.1:5173'] + const origin = req.get('host') + if (allowedOrigins.includes(origin)) { + res.setHeader('Access-Control-Allow-Origin', req.headers['x-forwarded-proto']??"http"+"://"+origin) + } + if (origin === "mete0r.xyz"){ + res.setHeader('Access-Control-Allow-Origin', '*'); + } + //res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8020'); + res.header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS'); + res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization') + res.header('Access-Control-Allow-Credentials', true); + return next(); + }); + +import { createClient } from 'redis' +let redis +// on prod we can just use a locally hosted redisStack I'm too lazy to use docker on windows to host one for local dev +if (PROD === "true"){ + redis = createClient() +}else{ + redis = createClient({url: "redis://default:2BxaAV7Dcbt8d6QqNm58TdUfdIQtEY5q@redis-15195.c53.west-us.azure.cloud.redislabs.com:15195"}) +} +redis.on('error', (err) => console.log('Redis Client Error', err)); +await redis.connect() + +import { Repository } from 'redis-om' + + +const ipWhiteListRepository = new Repository(ipWhitelist, redis) + +const collectDefaultMetrics = client.collectDefaultMetrics +collectDefaultMetrics({timeout: 5000}) + +const counter = new client.Counter({ + name: 'node_request_operations_total', + help: 'The total number of processed requests' +}) + +const playercounter = new client.Gauge({ + name: 'node_players', + help: 'Amount of players every minute', + async collect() { + // Invoked when the registry collects its metrics' values. + const currentValue = await games.aggregate([ + { + "$group": { + "_id": null, + "numberofplayers": { + '$sum': { + '$convert': { 'input': '$numberofplayers', 'to': 'int' } + } + } + } + } + ]) + this.set(currentValue[0].numberofplayers); + }, +}) + +const histogram = new client.Histogram({ + name: 'node_request_duration_seconds', + help: 'Histogram for the duration in seconds', + buckets: [1,2,5,6,10] +}) +const getDurationInMilliseconds = (start) => { + const NS_PER_SEC = 1e9 + const NS_TO_MS = 1e6 + const diff = process.hrtime(start) + + return (diff[0] * NS_PER_SEC + diff[1]) / NS_TO_MS +} + +app.use((req, res, next) => { + const start = process.hrtime() + counter.inc() + + res.on('finish', () => { + const durationInMilliseconds = getDurationInMilliseconds (start) + histogram.observe(durationInMilliseconds) + }) + + next() +}) + + +const JWT_SECRET = process.env.JWT_SECRET +const RCC_HOST = process.env.RCC_HOST +const DB_PASSWORD = process.env.DB_PASSWORD +console.log(RCC_HOST) +if (PROD === "true"){ + mongoose.connect('mongodb://localhost:27017/meteoritedb', { + useNewUrlParser: true, + useUnifiedTopology: true, + authSource: "admin", + user: "server", + pass: DB_PASSWORD, +}) +}else{ + mongoose.connect('mongodb://localhost:27017/meteoritedb', { + useNewUrlParser: true, + useUnifiedTopology: true, + }) +} + +app.disable('x-powered-by') // we don't wanna tell potential attackers our exact framework yet lol +// automatically create a default document in mongodb for our config +// if the config document doesn't exist auto create one these are also the default settings your site will start with +async function createconfig(){ +try { + var resp = await config.findOne() + if (!resp) { + const response = await config.create({ + RegistrationEnabled: true, + MaintenanceEnabled: false, + KeysEnabled: false, + GamesEnabled: true + }) + } + } catch (err) { + throw(err) + } +} +createconfig() +app.use(cookieParser()) +// maintenance mode middleware +app.use(async function (req, res, next) { + if (req.url === "/assets/audio/wof.mp3"){ + return next() + } + res.header("Cache-Control", "no-store,no-cache,must-revalidate"); + var resp = await config.findOne().lean() + req.config = resp + + //console.log(req.headers['x-forwarded-proto']) + if (!req.headers['x-forwarded-proto']){ + if (req.secure === true){ + req.headers['x-forwarded-proto'] = "https" + }else{ + req.headers['x-forwarded-proto'] = "http" + } + } + if (!req.headers['cf-connecting-ip']){ //localhost + res.header("Access-Control-Allow-Origin", "*"); + } + if (req.headers['x-forwarded-host'] === "www.mete0r.xyz" && req.headers['x-forwarded-host'] && req.headers?.["user-agent"] != "RobloxStudio/WinInet" && req.headers?.["user-agent"] != "Roblox/WinInet"){ + if (req.method === "GET" && req.url.startsWith('/game/') === false && req.url.startsWith("/login/") === false){ + return res.redirect(302, req.headers['x-forwarded-proto']+"://mete0r.xyz"+req.url) + } + } + //console.log(req.headers['x-forwarded-host']) + //req.headers['x-forwarded-host'] = "mete0r.xyz" + //console.log(req.headers?.['cf-connecting-ip']) + //console.log(req.socket.remoteAddress) + //console.log(req.url) + if (req.url === "/assets/2020.zip"){ + return res.redirect("https://www.youtube.com/watch?v=dQw4w9WgXcQ") + } + //return res.sendFile(path.join(__dirname, '/under_maintenance.html')); + + if (resp.MaintenanceEnabled === true && req.headers?.['cf-connecting-ip'] != RCC_HOST && req.headers?.['cf-connecting-ip']){ + if (!req.cookies) { + return res.sendFile(path.join(__dirname, '/under_maintenance.html')); + } + + if (req?.cookies?.real === "2fKMlOumsNSnbuVJkLonCOYZXYZbWrGrdDeRTIeWAbXeOiFGyAY"){ + return next() + } + return res.sendFile(path.join(__dirname, '/under_maintenance.html')); + } + + if (req.headers?.['cf-connecting-ip'] != RCC_HOST && req.headers?.['cf-connecting-ip'] && req.url != "/initialize" && req.headers?.["user-agent"] != "Roblox/WinInet" && req.headers?.["user-agent"] != "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/605.1.15"){ + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + var resp = await redis.exists('ipWhiteListSchema:'+ip.toString()) + if (resp === 0){ + return res.status(401).send("Not allowed visit the discord. discord.gg/5r6ZjG57kU") + } + } + next() + }) + +app.use(express.urlencoded({ extended: true })) +async function lol(){ + try { + const res= await rcctalk.GetAllJobs() + //console.dir(res,{ depth: null }) + } catch (error) { + throw("RCC Test run failed please have rcc soap running on port 64989") + } +} +//lol() +app.set('trust proxy', true) + +// routes lol +const assetRouter = require('./routes/assets.js') + +app.use(['/asset','/v1/asset'], assetRouter) + +const gameRouter = require('./routes/game.js') + +app.use(['/game','//game'],gameRouter) + +const persistenceRouter = require('./routes/persistence.js') + +app.use('/persistence',persistenceRouter) + +const clientSettingsRouter = require('./routes/clientsettings.js') + +app.use('/',clientSettingsRouter) + +const registerRouter = require('./routes/register.js') + +app.use('/register',registerRouter) + +const loginRouter = require('./routes/login.js') + +app.use(['/login',"/v2/login","/v2/twostepverification/verify"],loginRouter) + +const logoutRouter = require('./routes/logout.js'); + +app.use('/logout',logoutRouter) + +const gamesRouter = require('./routes/games.js'); + +app.use('/games',gamesRouter) + +const adminRouter = require('./routes/admin.js'); + +app.use('/admin',adminRouter) + +app.get('/users/account-info', (req, res) => { + return res.json({ + AgeBracket : 0, + Email : { + IsVerified : 1, + Value : "kmulherin@roblox.com", + }, + HasPasswordSet : 1, + Username : "iMightBeLying", + RobuxBalance: 9999999 + }) +}) + +const usersRouter = require('./routes/users.js'); + +app.use('/',usersRouter) + +const avatarRouter = require('./routes/avatar.js'); + +app.use('/api/avatar',avatarRouter) + +const settingsRouter = require('./routes/settings.js'); + +app.use('/settings',settingsRouter) + +const developRouter = require('./routes/develop.js'); + +app.use('/develop',developRouter) + +const thumbnailRenderRouter = require('./routes/api/renderthumbnail.js'); + +app.use(['/api/thumbnailrender','/thumbs'/*2016 asset thumbs*/, '/avatar-thumbnail/image'],thumbnailRenderRouter) + +const purchaseRouter = require('./routes/api/purchase.js'); + +app.use('/api/purchase',purchaseRouter) + +const moderateRouter = require('./routes/api/moderate.js'); + +app.use('/api/moderate',moderateRouter) + +const verifyRouter = require('./routes/api/verify.js'); + +app.use('/api/verify',verifyRouter) + +const itemactionRouter = require('./routes/api/itemaction.js'); + +app.use('/api/itemaction',itemactionRouter) + +const bodycolorupdateRouter = require('./routes/api/bodycolorupdate.js'); + +app.use('/api/bodycolorupdate',bodycolorupdateRouter) + +const changepasswordRouter = require('./routes/api/changepassword.js'); + +app.use('/api/changepassword',changepasswordRouter) + +const generatekeyRouter = require('./routes/api/generatekey.js'); + +app.use('/api/generatekey',generatekeyRouter) + +const authRouter = require('./routes/api/auth.js'); + +app.use('/api/auth',authRouter) + +const catalogRouter = require('./routes/catalog.js'); + +app.use('/api/catalog',catalogRouter) + +const updategameinfoRouter = require('./routes/api/updategameinfo.js'); + +app.use('/',updategameinfoRouter) + +const userinfoRouter = require('./routes/api/userinfo.js'); + +app.use('/api/userinfo',userinfoRouter) + +const updateusermembershipRouter = require('./routes/api/updateusermembership.js'); + +app.use('/api/updateusermembership',updateusermembershipRouter) + +const marketplaceRouter = require('./routes/marketplace.js'); + +app.use('/',marketplaceRouter) + +const versioncompatibilityRouter = require('./routes/versioncompatibility.js'); + +app.use('/',versioncompatibilityRouter) + +const t8gameRouter = require('./routes/2018/game.js'); + +app.use('/game/',t8gameRouter.router) + +const t20gameRouter = require('./routes/2020/game.js') + +app.use(['/game/','/v1'],t20gameRouter.router) + +const mobileApiRouter = require('./routes/mobileapi.js'); + +app.use('/mobileapi',mobileApiRouter) + +const friendsApiRouter = require('./routes/api/friends.js'); + +app.use('/api/friends',friendsApiRouter) + +const advertiseApiRouter = require('./routes/api/advertise.js'); + +app.use('/api/advertise',advertiseApiRouter) + +const requestAdRouter = require('./routes/api/requestad.js'); + +app.use('/api/requestad',requestAdRouter) + +/*const bankRouter = require('./routes/api/bank.js'); + +app.use('/api/bank',bankRouter)*/ + +/*const groupRouter = require('./routes/api/groups.js'); + +app.use('/api/groups',groupRouter)*/ + +const feedRouter = require('./routes/api/feed.js'); + +app.use('/api/feed',feedRouter) + +const commentRouter = require('./routes/api/comment.js'); + +app.use('/api/comments',commentRouter) + + +/* +app.get("/My/Places", (req, res) => { + res.send("No editing sorry") +})*/ + +app.get("/studio/e.png", (req, res) => { + res.send() +}) + +app.get("/tags/c/36/studio.json", (req, res) => { + res.json({"users":[{"id":306443,"username":"Hajimalago","avatar_template":"/user_avatar/devforum.roblox.com/hajimalago/{size}/724795_2.png"},{"id":36263,"username":"rickje139","avatar_template":"/user_avatar/devforum.roblox.com/rickje139/{size}/1459648_2.png"},{"id":120450,"username":"GodSysAdmin","avatar_template":"/user_avatar/devforum.roblox.com/godsysadmin/{size}/1540208_2.png"},{"id":472489,"username":"ItsMeFelixAccept","avatar_template":"/user_avatar/devforum.roblox.com/itsmefelixaccept/{size}/1551006_2.png"},{"id":44883,"username":"iSyriux","avatar_template":"/user_avatar/devforum.roblox.com/isyriux/{size}/1464807_2.png"},{"id":351893,"username":"JoshSedai","avatar_template":"/user_avatar/devforum.roblox.com/joshsedai/{size}/842420_2.png"},{"id":376200,"username":"Logimite","avatar_template":"/user_avatar/devforum.roblox.com/logimite/{size}/1573532_2.png"},{"id":598293,"username":"jmkd3v","avatar_template":"/user_avatar/devforum.roblox.com/jmkd3v/{size}/1572236_2.png"},{"id":249742,"username":"zachary108181","avatar_template":"/user_avatar/devforum.roblox.com/zachary108181/{size}/1376998_2.png"},{"id":557246,"username":"Miles_1king","avatar_template":"/user_avatar/devforum.roblox.com/miles_1king/{size}/1558993_2.png"},{"id":341046,"username":"tnavarts","avatar_template":"/user_avatar/devforum.roblox.com/tnavarts/{size}/797168_2.png"},{"id":164536,"username":"LucasTutoriaisSaimo","avatar_template":"/user_avatar/devforum.roblox.com/lucastutoriaissaimo/{size}/1572474_2.png"},{"id":300,"username":"Tomarty","avatar_template":"/user_avatar/devforum.roblox.com/tomarty/{size}/1557837_2.png"},{"id":27022,"username":"nooneisback","avatar_template":"/user_avatar/devforum.roblox.com/nooneisback/{size}/1488960_2.png"},{"id":11348,"username":"Hexcede","avatar_template":"/user_avatar/devforum.roblox.com/hexcede/{size}/1152765_2.png"},{"id":350909,"username":"crypto_mancer","avatar_template":"/user_avatar/devforum.roblox.com/crypto_mancer/{size}/822643_2.png"},{"id":200305,"username":"Kyxino","avatar_template":"/user_avatar/devforum.roblox.com/kyxino/{size}/1526293_2.png"},{"id":176552,"username":"7z99","avatar_template":"/user_avatar/devforum.roblox.com/7z99/{size}/1375229_2.png"},{"id":17304,"username":"FilteredStudio","avatar_template":"/user_avatar/devforum.roblox.com/filteredstudio/{size}/1555102_2.png"},{"id":461567,"username":"Optiplex3020SFF","avatar_template":"/user_avatar/devforum.roblox.com/optiplex3020sff/{size}/1498767_2.png"},{"id":260389,"username":"WallsAreForClimbing","avatar_template":"/user_avatar/devforum.roblox.com/wallsareforclimbing/{size}/1041671_2.png"},{"id":163116,"username":"SillyMeTimbers","avatar_template":"/user_avatar/devforum.roblox.com/sillymetimbers/{size}/1395188_2.png"},{"id":396736,"username":"HugeCoolboy2007","avatar_template":"/user_avatar/devforum.roblox.com/hugecoolboy2007/{size}/1533064_2.png"},{"id":105134,"username":"Fire540Games","avatar_template":"/user_avatar/devforum.roblox.com/fire540games/{size}/1539762_2.png"},{"id":17941,"username":"RBLXImagineer","avatar_template":"/user_avatar/devforum.roblox.com/rblximagineer/{size}/1417349_2.png"},{"id":395244,"username":"IdontPlayz343","avatar_template":"/user_avatar/devforum.roblox.com/idontplayz343/{size}/1379043_2.png"},{"id":351579,"username":"SimonEnderB","avatar_template":"/user_avatar/devforum.roblox.com/simonenderb/{size}/1533230_2.png"},{"id":194130,"username":"cunpliy","avatar_template":"/user_avatar/devforum.roblox.com/cunpliy/{size}/1426008_2.png"},{"id":7289,"username":"ittrgrey","avatar_template":"/user_avatar/devforum.roblox.com/ittrgrey/{size}/1570588_2.png"},{"id":451394,"username":"parker02311","avatar_template":"/user_avatar/devforum.roblox.com/parker02311/{size}/1103926_2.png"},{"id":312723,"username":"ihavoc101","avatar_template":"/user_avatar/devforum.roblox.com/ihavoc101/{size}/1574065_2.png"},{"id":51619,"username":"G2_funny","avatar_template":"/user_avatar/devforum.roblox.com/g2_funny/{size}/1528742_2.png"},{"id":285060,"username":"RainingSwordFire","avatar_template":"/user_avatar/devforum.roblox.com/rainingswordfire/{size}/1311775_2.png"},{"id":417018,"username":"SoaringKeyy","avatar_template":"/user_avatar/devforum.roblox.com/soaringkeyy/{size}/1551178_2.png"},{"id":32451,"username":"Clueless_Brick","avatar_template":"/user_avatar/devforum.roblox.com/clueless_brick/{size}/1556141_2.png"},{"id":45822,"username":"Vulkarin","avatar_template":"/user_avatar/devforum.roblox.com/vulkarin/{size}/1533760_2.png"},{"id":100697,"username":"ItzDaSniper_ALT","avatar_template":"/user_avatar/devforum.roblox.com/itzdasniper_alt/{size}/1111052_2.png"},{"id":192817,"username":"GeneralRelish","avatar_template":"/user_avatar/devforum.roblox.com/generalrelish/{size}/882303_2.png"},{"id":3657,"username":"Maxx_J","avatar_template":"/user_avatar/devforum.roblox.com/maxx_j/{size}/1257582_2.png"},{"id":778,"username":"gillern","avatar_template":"/user_avatar/devforum.roblox.com/gillern/{size}/1063851_2.png"},{"id":5316,"username":"unmiss","avatar_template":"/user_avatar/devforum.roblox.com/unmiss/{size}/1275904_2.png"},{"id":230186,"username":"overflowed","avatar_template":"/user_avatar/devforum.roblox.com/overflowed/{size}/1518666_2.png"},{"id":119859,"username":"kleptonaut","avatar_template":"/user_avatar/devforum.roblox.com/kleptonaut/{size}/1534225_2.png"},{"id":222257,"username":"ko_ch4","avatar_template":"/user_avatar/devforum.roblox.com/ko_ch4/{size}/1277003_2.png"},{"id":96898,"username":"Phoninian","avatar_template":"/user_avatar/devforum.roblox.com/phoninian/{size}/1505728_2.png"},{"id":130,"username":"zeuxcg","avatar_template":"/user_avatar/devforum.roblox.com/zeuxcg/{size}/759527_2.png"},{"id":346894,"username":"XOLT1268","avatar_template":"/user_avatar/devforum.roblox.com/xolt1268/{size}/1081693_2.png"},{"id":223,"username":"Dekkonot","avatar_template":"/user_avatar/devforum.roblox.com/dekkonot/{size}/1268788_2.png"},{"id":431,"username":"DataBrain","avatar_template":"/user_avatar/devforum.roblox.com/databrain/{size}/1346532_2.png"},{"id":87089,"username":"ForgotenR4","avatar_template":"/user_avatar/devforum.roblox.com/forgotenr4/{size}/993976_2.png"},{"id":134567,"username":"RoxyBloxyy","avatar_template":"/user_avatar/devforum.roblox.com/roxybloxyy/{size}/1063572_2.png"},{"id":214043,"username":"DavidNet22","avatar_template":"/user_avatar/devforum.roblox.com/davidnet22/{size}/1561725_2.png"},{"id":393053,"username":"jumbopushpop112","avatar_template":"/user_avatar/devforum.roblox.com/jumbopushpop112/{size}/1448545_2.png"},{"id":9518,"username":"jacklollz2","avatar_template":"/user_avatar/devforum.roblox.com/jacklollz2/{size}/1453855_2.png"},{"id":34253,"username":"incapaz","avatar_template":"/user_avatar/devforum.roblox.com/incapaz/{size}/1097885_2.png"},{"id":32226,"username":"Optikk","avatar_template":"/user_avatar/devforum.roblox.com/optikk/{size}/1515061_2.png"},{"id":317122,"username":"DoctorNO2106","avatar_template":"/user_avatar/devforum.roblox.com/doctorno2106/{size}/1439049_2.png"},{"id":33762,"username":"RuizuKun_Dev","avatar_template":"/user_avatar/devforum.roblox.com/ruizukun_dev/{size}/1587315_2.png"},{"id":237547,"username":"darkmodeonn","avatar_template":"/user_avatar/devforum.roblox.com/darkmodeonn/{size}/975957_2.png"},{"id":1045,"username":"WingItMan","avatar_template":"/user_avatar/devforum.roblox.com/wingitman/{size}/1288630_2.png"},{"id":27530,"username":"swmaniac","avatar_template":"/user_avatar/devforum.roblox.com/swmaniac/{size}/1054812_2.png"},{"id":47029,"username":"PH_OENlX","avatar_template":"/user_avatar/devforum.roblox.com/ph_oenlx/{size}/1462687_2.png"},{"id":231587,"username":"KrYn0MoRe","avatar_template":"/user_avatar/devforum.roblox.com/kryn0more/{size}/1347965_2.png"},{"id":347486,"username":"CanadianCrepe","avatar_template":"/user_avatar/devforum.roblox.com/canadiancrepe/{size}/1544739_2.png"},{"id":416893,"username":"FirewolfYT_751Adult","avatar_template":"/user_avatar/devforum.roblox.com/firewolfyt_751adult/{size}/1002940_2.png"},{"id":33422,"username":"nsgriff","avatar_template":"/user_avatar/devforum.roblox.com/nsgriff/{size}/648586_2.png"},{"id":-1,"username":"system","avatar_template":"/user_avatar/devforum.roblox.com/system/{size}/278369_2.png"},{"id":112950,"username":"coefficients","avatar_template":"/user_avatar/devforum.roblox.com/coefficients/{size}/1344844_2.png"},{"id":419793,"username":"ORLANDOMAGIC00","avatar_template":"/user_avatar/devforum.roblox.com/orlandomagic00/{size}/1583711_2.png"},{"id":57718,"username":"rogchamp","avatar_template":"/user_avatar/devforum.roblox.com/rogchamp/{size}/1359144_2.png"},{"id":3052,"username":"ziplocBag","avatar_template":"/user_avatar/devforum.roblox.com/ziplocbag/{size}/909305_2.png"},{"id":26244,"username":"mxdanger","avatar_template":"/user_avatar/devforum.roblox.com/mxdanger/{size}/1457829_2.png"},{"id":2791,"username":"Dogutsune","avatar_template":"/user_avatar/devforum.roblox.com/dogutsune/{size}/1053710_2.png"},{"id":431740,"username":"TheSenorDuck","avatar_template":"/user_avatar/devforum.roblox.com/thesenorduck/{size}/933266_2.png"},{"id":155602,"username":"RobieTheCat","avatar_template":"/user_avatar/devforum.roblox.com/robiethecat/{size}/1572265_2.png"},{"id":6350,"username":"The_Aliens","avatar_template":"/user_avatar/devforum.roblox.com/the_aliens/{size}/1369228_2.png"},{"id":8849,"username":"lateregistration","avatar_template":"/user_avatar/devforum.roblox.com/lateregistration/{size}/964581_2.png"},{"id":241899,"username":"CringeEngineer","avatar_template":"/user_avatar/devforum.roblox.com/cringeengineer/{size}/1141949_2.png"},{"id":789,"username":"mothmage","avatar_template":"/user_avatar/devforum.roblox.com/mothmage/{size}/1387000_2.png"},{"id":273497,"username":"Voxelinator","avatar_template":"/user_avatar/devforum.roblox.com/voxelinator/{size}/1083723_2.png"},{"id":120247,"username":"MeaxisDev","avatar_template":"/user_avatar/devforum.roblox.com/meaxisdev/{size}/1454273_2.png"},{"id":38549,"username":"NickoSCP","avatar_template":"/user_avatar/devforum.roblox.com/nickoscp/{size}/1128258_2.png"},{"id":139902,"username":"LuukOriginal","avatar_template":"/user_avatar/devforum.roblox.com/luukoriginal/{size}/1314121_2.png"},{"id":38606,"username":"Homeomorph","avatar_template":"/user_avatar/devforum.roblox.com/homeomorph/{size}/1521085_2.png"},{"id":31496,"username":"Sentross","avatar_template":"/user_avatar/devforum.roblox.com/sentross/{size}/1485711_2.png"},{"id":326221,"username":"so1ehee","avatar_template":"/user_avatar/devforum.roblox.com/so1ehee/{size}/1494050_2.png"},{"id":304229,"username":"RawEggTheGreatIX","avatar_template":"/user_avatar/devforum.roblox.com/raweggthegreatix/{size}/1534316_2.png"},{"id":357,"username":"Plutonem","avatar_template":"/user_avatar/devforum.roblox.com/plutonem/{size}/1214626_2.png"},{"id":281177,"username":"meshadapt","avatar_template":"/user_avatar/devforum.roblox.com/meshadapt/{size}/1024879_2.png"},{"id":1227,"username":"Rocky28447","avatar_template":"/user_avatar/devforum.roblox.com/rocky28447/{size}/1025963_2.png"},{"id":439104,"username":"meblec","avatar_template":"/user_avatar/devforum.roblox.com/meblec/{size}/1582125_2.png"},{"id":224996,"username":"TheCrypticRunner","avatar_template":"/user_avatar/devforum.roblox.com/thecrypticrunner/{size}/1457066_2.png"},{"id":92183,"username":"Vasilakious","avatar_template":"/user_avatar/devforum.roblox.com/vasilakious/{size}/1117302_2.png"},{"id":9593,"username":"BanTech","avatar_template":"/user_avatar/devforum.roblox.com/bantech/{size}/1534999_2.png"},{"id":7351,"username":"Sublivion","avatar_template":"/user_avatar/devforum.roblox.com/sublivion/{size}/629555_2.png"},{"id":643,"username":"buildthomas","avatar_template":"/user_avatar/devforum.roblox.com/buildthomas/{size}/1146835_2.png"},{"id":153142,"username":"Blokhampster34","avatar_template":"/user_avatar/devforum.roblox.com/blokhampster34/{size}/1170235_2.png"},{"id":86089,"username":"Vmena","avatar_template":"/user_avatar/devforum.roblox.com/vmena/{size}/1155786_2.png"},{"id":220864,"username":"rogeriodec_games","avatar_template":"/user_avatar/devforum.roblox.com/rogeriodec_games/{size}/957129_2.png"},{"id":186756,"username":"Dummy_Tested","avatar_template":"/user_avatar/devforum.roblox.com/dummy_tested/{size}/399575_2.png"},{"id":23710,"username":"DarthChadius","avatar_template":"/user_avatar/devforum.roblox.com/darthchadius/{size}/734631_2.png"},{"id":77150,"username":"CAP7A1N","avatar_template":"/user_avatar/devforum.roblox.com/cap7a1n/{size}/1428937_2.png"},{"id":306008,"username":"Stelth155_Dev","avatar_template":"/user_avatar/devforum.roblox.com/stelth155_dev/{size}/1127802_2.png"},{"id":103015,"username":"Cruizer_Snowman","avatar_template":"/user_avatar/devforum.roblox.com/cruizer_snowman/{size}/1441731_2.png"},{"id":210201,"username":"vrtblox","avatar_template":"/user_avatar/devforum.roblox.com/vrtblox/{size}/580542_2.png"},{"id":12817,"username":"anon66957764","avatar_template":"https://www.roblox.com/headshot-thumbnail/image?userId=463253&width=150&height=150"},{"id":380713,"username":"Vargogram","avatar_template":"/user_avatar/devforum.roblox.com/vargogram/{size}/1475193_2.png"},{"id":289807,"username":"Crazedbrick1","avatar_template":"/user_avatar/devforum.roblox.com/crazedbrick1/{size}/1571206_2.png"},{"id":10734,"username":"CycloneUprising","avatar_template":"/user_avatar/devforum.roblox.com/cycloneuprising/{size}/1327682_2.png"},{"id":363802,"username":"Kairomatic","avatar_template":"/user_avatar/devforum.roblox.com/kairomatic/{size}/1482469_2.png"},{"id":224243,"username":"Eternalove_fan32","avatar_template":"/user_avatar/devforum.roblox.com/eternalove_fan32/{size}/1426044_2.png"},{"id":84276,"username":"Phlegethon5778","avatar_template":"/user_avatar/devforum.roblox.com/phlegethon5778/{size}/1232567_2.png"},{"id":317063,"username":"umpireboy","avatar_template":"/user_avatar/devforum.roblox.com/umpireboy/{size}/1418322_2.png"},{"id":14154,"username":"Hadiisepic","avatar_template":"/user_avatar/devforum.roblox.com/hadiisepic/{size}/1472103_2.png"},{"id":202896,"username":"vrs2210","avatar_template":"/user_avatar/devforum.roblox.com/vrs2210/{size}/1570268_2.png"},{"id":201,"username":"Khanovich","avatar_template":"/user_avatar/devforum.roblox.com/khanovich/{size}/540780_2.png"},{"id":85229,"username":"Oficcer_F","avatar_template":"/user_avatar/devforum.roblox.com/oficcer_f/{size}/1545789_2.png"},{"id":186768,"username":"Cald_fan","avatar_template":"/user_avatar/devforum.roblox.com/cald_fan/{size}/1561054_2.png"},{"id":286481,"username":"TheGreat_Scott","avatar_template":"/user_avatar/devforum.roblox.com/thegreat_scott/{size}/1350329_2.png"}],"primary_groups":[{"id":41,"name":"Roblox_Staff","flair_url":"/uploads/default/original/4X/9/e/7/9e76ae2dd3aa25dc7a42e6443ec4cc57dd999ffe.png","flair_bg_color":"","flair_color":""},{"id":50,"name":"DevRelationsTeam","flair_url":"/uploads/default/original/4X/9/e/7/9e76ae2dd3aa25dc7a42e6443ec4cc57dd999ffe.png","flair_bg_color":"","flair_color":""}],"topic_list":{"can_create_topic":true,"more_topics_url":"/tags/c/updates/announcements/36/studio?match_all_tags=true&page=1&tags%5B%5D=studio","draft":null,"draft_key":"new_topic","draft_sequence":1681,"per_page":30,"top_tags":["studio","physics","scripting","maintenance","avatar","beta","accelerator","building","welds","gui","modeling","wiki","animation","humanoid","luau","terrain","api","events","intern","internship","motor6d","r15","smoothterrain","accessories","analytics","animation-editor","animations","incubator","rdc","rendering"],"tags":[{"id":68,"name":"studio","topic_count":7872,"staff":false}],"topics":[{"id":1038853,"title":"New Physics Stepping Method: Adaptive Timestepping","fancy_title":"New Physics Stepping Method: Adaptive Timestepping","slug":"new-physics-stepping-method-adaptive-timestepping","posts_count":65,"reply_count":33,"highest_post_number":68,"image_url":null,"created_at":"2021-02-10T22:51:55.427Z","last_posted_at":"2021-02-16T20:18:25.918Z","bumped":true,"bumped_at":"2021-02-18T03:52:19.710Z","archetype":"regular","unseen":false,"last_read_post_number":12,"unread":34,"new_posts":22,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","beta"],"views":15049,"like_count":663,"has_summary":true,"last_poster_username":"iSyriux","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":306443,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":36263,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":120450,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":472489,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":44883,"primary_group_id":null}]},{"id":1025033,"title":"Heightmaps Go to New Altitudes!","fancy_title":"Heightmaps Go to New Altitudes!","slug":"heightmaps-go-to-new-altitudes","posts_count":108,"reply_count":69,"highest_post_number":141,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/0/c/c/0cca114c25efbe61d257c9580c3cd7413278b84d_2_1024x779.jpeg","created_at":"2021-02-04T18:31:29.269Z","last_posted_at":"2021-02-17T09:20:13.946Z","bumped":true,"bumped_at":"2021-02-17T09:20:13.946Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","beta"],"views":16743,"like_count":1093,"has_summary":true,"last_poster_username":"Miles_1king","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":351893,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":376200,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":598293,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":249742,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":557246,"primary_group_id":null}]},{"id":1007452,"title":"Upcoming Potential Property Name Conflict: \"Pivot\"","fancy_title":"Upcoming Potential Property Name Conflict: “Pivot”","slug":"upcoming-potential-property-name-conflict-pivot","posts_count":74,"reply_count":51,"highest_post_number":76,"image_url":null,"created_at":"2021-01-26T17:37:55.868Z","last_posted_at":"2021-02-11T19:12:41.189Z","bumped":true,"bumped_at":"2021-02-11T19:12:41.189Z","archetype":"regular","unseen":false,"last_read_post_number":5,"unread":6,"new_posts":65,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":16748,"like_count":490,"has_summary":true,"last_poster_username":"tnavarts","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":"latest","description":"Автор, Последний автор","user_id":341046,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":164536,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":300,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":27022,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":11348,"primary_group_id":null}]},{"id":993767,"title":"Changing the Mac Studio Command Keycode: Control vs Meta","fancy_title":"Changing the Mac Studio Command Keycode: Control vs Meta","slug":"changing-the-mac-studio-command-keycode-control-vs-meta","posts_count":16,"reply_count":5,"highest_post_number":17,"image_url":null,"created_at":"2021-01-19T22:05:17.218Z","last_posted_at":"2021-01-22T01:22:09.206Z","bumped":true,"bumped_at":"2021-01-22T01:22:09.206Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio"],"views":14308,"like_count":166,"has_summary":false,"last_poster_username":"Optiplex3020SFF","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":350909,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":200305,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":176552,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":17304,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":461567,"primary_group_id":null}]},{"id":984141,"title":"New Studio Beta: Attributes!","fancy_title":"New Studio Beta: Attributes!","slug":"new-studio-beta-attributes","posts_count":353,"reply_count":140,"highest_post_number":372,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/f/0/4/f04ea572324df16f6eb86f657ab0765c3b7c4779.png","created_at":"2021-01-14T23:57:24.805Z","last_posted_at":"2021-02-17T21:39:05.229Z","bumped":true,"bumped_at":"2021-02-17T21:39:05.229Z","archetype":"regular","unseen":false,"last_read_post_number":30,"unread":314,"new_posts":28,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","beta"],"views":36468,"like_count":1942,"has_summary":true,"last_poster_username":"Fire540Games","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":260389,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":11348,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":163116,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":396736,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":105134,"primary_group_id":null}]},{"id":932576,"title":"New Terrain, and Parts, and Built-In Materials, Oh my!","fancy_title":"New Terrain, and Parts, and Built-In Materials, Oh my!","slug":"new-terrain-and-parts-and-built-in-materials-oh-my","posts_count":1155,"reply_count":358,"highest_post_number":1341,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/5/2/2/52240686713d0ec0b1b9ab802268030a8cb15627_2_1024x420.jpeg","created_at":"2020-12-19T00:22:20.801Z","last_posted_at":"2021-02-17T22:45:44.156Z","bumped":true,"bumped_at":"2021-02-17T22:45:44.156Z","archetype":"regular","unseen":false,"last_read_post_number":20,"unread":849,"new_posts":472,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","beta"],"views":100027,"like_count":7467,"has_summary":true,"last_poster_username":"ittrgrey","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":17941,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":395244,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":351579,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":194130,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":7289,"primary_group_id":null}]},{"id":919991,"title":"Proximity Prompt Release","fancy_title":"Proximity Prompt Release","slug":"proximity-prompt-release","posts_count":161,"reply_count":96,"highest_post_number":228,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/5/a/8/5a8617595bc32d070053437b78e722f12f01e78a.gif","created_at":"2020-12-12T02:06:19.525Z","last_posted_at":"2021-02-16T02:45:15.238Z","bumped":true,"bumped_at":"2021-02-16T02:45:15.238Z","archetype":"regular","unseen":false,"last_read_post_number":205,"unread":22,"new_posts":1,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":33224,"like_count":941,"has_summary":true,"last_poster_username":"Miles_1king","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":350909,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":451394,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":312723,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":51619,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":557246,"primary_group_id":null}]},{"id":904022,"title":"Asset Manager Phased Rollout","fancy_title":"Asset Manager Phased Rollout","slug":"asset-manager-phased-rollout","posts_count":75,"reply_count":42,"highest_post_number":82,"image_url":null,"created_at":"2020-12-03T19:15:44.962Z","last_posted_at":"2021-02-13T04:08:21.822Z","bumped":true,"bumped_at":"2021-02-13T04:08:21.822Z","archetype":"regular","unseen":false,"last_read_post_number":17,"unread":0,"new_posts":65,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","beta"],"views":20262,"like_count":339,"has_summary":true,"last_poster_username":"ItzDaSniper_ALT","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":285060,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":417018,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":32451,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":45822,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":100697,"primary_group_id":null}]},{"id":898436,"title":"Expressive Output Window - Phased Rollout","fancy_title":"Expressive Output Window - Phased Rollout","slug":"expressive-output-window-phased-rollout","posts_count":35,"reply_count":9,"highest_post_number":38,"image_url":null,"created_at":"2020-11-30T21:14:57.519Z","last_posted_at":"2021-02-09T02:19:01.395Z","bumped":true,"bumped_at":"2021-02-09T02:19:01.395Z","archetype":"regular","unseen":false,"last_read_post_number":1,"unread":0,"new_posts":37,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","beta","output-window","output"],"views":11811,"like_count":255,"has_summary":false,"last_poster_username":"overflowed","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":192817,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":3657,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":778,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":5316,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":230186,"primary_group_id":null}]},{"id":897999,"title":"[Activated!] New Part Physics API","fancy_title":"[Activated!] New Part Physics API","slug":"activated-new-part-physics-api","posts_count":80,"reply_count":43,"highest_post_number":83,"image_url":null,"created_at":"2020-11-30T18:30:16.161Z","last_posted_at":"2021-02-08T20:31:36.781Z","bumped":true,"bumped_at":"2021-02-08T20:31:36.781Z","archetype":"regular","unseen":false,"last_read_post_number":33,"unread":0,"new_posts":50,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","physics"],"views":15373,"like_count":456,"has_summary":true,"last_poster_username":"Phoninian","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":true,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":119859,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":341046,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":222257,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":36263,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":96898,"primary_group_id":null}]},{"id":878947,"title":"Luau Type Checking Release","fancy_title":"Luau Type Checking Release","slug":"luau-type-checking-release","posts_count":130,"reply_count":51,"highest_post_number":135,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/1/0/b/10b42bc7cc1bef0f79f6a79415c8a87435edf0c1.png","created_at":"2020-11-19T18:21:13.701Z","last_posted_at":"2021-02-09T20:39:33.667Z","bumped":true,"bumped_at":"2021-02-09T20:39:33.667Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["scripting","studio","luau"],"views":15216,"like_count":507,"has_summary":true,"last_poster_username":"zeuxcg","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":"latest","description":"Автор, Последний автор","user_id":130,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":346894,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":223,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":431,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":87089,"primary_group_id":null}]},{"id":877873,"title":"Introducing Bulk Audio Importing in Studio!","fancy_title":"Introducing Bulk Audio Importing in Studio!","slug":"introducing-bulk-audio-importing-in-studio","posts_count":55,"reply_count":19,"highest_post_number":60,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/e/f/b/efbc663dd66369ccc18459d2ec642cc45cff3414.png","created_at":"2020-11-19T00:00:47.997Z","last_posted_at":"2021-02-07T00:36:38.741Z","bumped":true,"bumped_at":"2021-02-07T00:36:38.741Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio"],"views":13730,"like_count":562,"has_summary":true,"last_poster_username":"jacklollz2","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":134567,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":214043,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":451394,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":393053,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":9518,"primary_group_id":null}]},{"id":877312,"title":"Introducing Plugin Script Modification Permissions","fancy_title":"Introducing Plugin Script Modification Permissions","slug":"introducing-plugin-script-modification-permissions","posts_count":76,"reply_count":28,"highest_post_number":86,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/5/a/6/5a645ea86f19c66297c1b763bf4e77541d5ed8ca_2_1024x401.png","created_at":"2020-11-18T18:26:04.109Z","last_posted_at":"2021-01-15T23:17:58.252Z","bumped":true,"bumped_at":"2021-01-15T23:17:58.252Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio"],"views":11452,"like_count":422,"has_summary":true,"last_poster_username":"RuizuKun_Dev","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":134567,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":34253,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":32226,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":317122,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":33762,"primary_group_id":null}]},{"id":874260,"title":"Script Editor - Semantic Highlighting and Temporary Tabs are now in Beta!","fancy_title":"Script Editor - Semantic Highlighting and Temporary Tabs are now in Beta!","slug":"script-editor-semantic-highlighting-and-temporary-tabs-are-now-in-beta","posts_count":201,"reply_count":99,"highest_post_number":205,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/5/d/c/5dce483b91353355e69c03ffd023388cfbbbeca2_2_1024x526.jpeg","created_at":"2020-11-16T21:18:47.223Z","last_posted_at":"2021-02-07T08:17:42.638Z","bumped":true,"bumped_at":"2021-02-07T08:17:42.638Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","beta"],"views":13036,"like_count":1056,"has_summary":true,"last_poster_username":"KrYn0MoRe","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":237547,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":1045,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":27530,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":47029,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":231587,"primary_group_id":null}]},{"id":744534,"title":"Studio is Ending Support for Mac OS X 10.10 (Yosemite)","fancy_title":"Studio is Ending Support for Mac OS X 10.10 (Yosemite)","slug":"studio-is-ending-support-for-mac-os-x-10-10-yosemite","posts_count":66,"reply_count":31,"highest_post_number":76,"image_url":null,"created_at":"2020-08-31T17:34:00.000Z","last_posted_at":"2021-01-26T22:14:45.165Z","bumped":true,"bumped_at":"2020-09-28T22:14:43.451Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["studio"],"views":50641,"like_count":451,"has_summary":true,"last_poster_username":"system","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":285060,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":347486,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":416893,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":33422,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":-1,"primary_group_id":null}]},{"id":746146,"title":"Display All Permissions for Group Games","fancy_title":"Display All Permissions for Group Games","slug":"display-all-permissions-for-group-games","posts_count":12,"reply_count":8,"highest_post_number":20,"image_url":null,"created_at":"2020-08-28T17:31:49.301Z","last_posted_at":"2021-01-22T17:15:00.609Z","bumped":true,"bumped_at":"2020-09-24T17:15:00.254Z","archetype":"regular","unseen":false,"last_read_post_number":20,"unread":0,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":43683,"like_count":251,"has_summary":false,"last_poster_username":"coefficients","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":"latest","description":"Автор, Последний автор","user_id":112950,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":419793,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":57718,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":3052,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":26244,"primary_group_id":null}]},{"id":722215,"title":"Finale of Part Surface Changes: No More Hinges","fancy_title":"Finale of Part Surface Changes: No More Hinges","slug":"finale-of-part-surface-changes-no-more-hinges","posts_count":133,"reply_count":67,"highest_post_number":143,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/d/9/b/d9bdfde1668446e0037867a9dcbd49dcc685b7eb.gif","created_at":"2020-08-13T18:09:27.690Z","last_posted_at":"2020-12-08T19:04:09.193Z","bumped":true,"bumped_at":"2020-12-08T19:04:09.193Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["building","studio","physics"],"views":25124,"like_count":885,"has_summary":true,"last_poster_username":"TheSenorDuck","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":119859,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":2791,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":11348,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":341046,"primary_group_id":41},{"extras":"latest","description":"Последний автор","user_id":431740,"primary_group_id":null}]},{"id":705528,"title":"Skinned MeshPart Studio Beta","fancy_title":"Skinned MeshPart Studio Beta","slug":"skinned-meshpart-studio-beta","posts_count":345,"reply_count":207,"highest_post_number":358,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/a/8/7/a8786999b226cbb244060442b7e3fc04154267ae.png","created_at":"2020-08-03T22:59:46.002Z","last_posted_at":"2020-12-02T00:04:48.733Z","bumped":true,"bumped_at":"2020-12-01T21:30:40.306Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","modeling","rendering"],"views":49892,"like_count":2218,"has_summary":true,"last_poster_username":"mothmage","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":155602,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":6350,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":8849,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":241899,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":789,"primary_group_id":null}]},{"id":674209,"title":"Introducing Two Game Security Settings: Third Party Sales & Cross Game Teleports","fancy_title":"Introducing Two Game Security Settings: Third Party Sales & Cross Game Teleports","slug":"introducing-two-game-security-settings-third-party-sales-cross-game-teleports","posts_count":100,"reply_count":28,"highest_post_number":120,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/0/c/7/0c776e4648a634d0c17287869c13fbdb790f7f36.png","created_at":"2020-07-16T00:43:28.114Z","last_posted_at":"2020-11-11T21:06:01.454Z","bumped":true,"bumped_at":"2021-01-22T16:14:45.381Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio"],"views":33642,"like_count":735,"has_summary":true,"last_poster_username":"LuukOriginal","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":134567,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":273497,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":120247,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":38549,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":139902,"primary_group_id":null}]},{"id":663449,"title":"SurfaceAppearance Studio Beta","fancy_title":"SurfaceAppearance Studio Beta","slug":"surfaceappearance-studio-beta","posts_count":415,"reply_count":186,"highest_post_number":437,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/5/f/c/5fca97d93e86876dbb3ee5bd2adfa3b5f699bcfd.png","created_at":"2020-07-09T18:58:00.000Z","last_posted_at":"2021-02-15T21:51:59.958Z","bumped":true,"bumped_at":"2021-02-15T21:51:59.958Z","archetype":"regular","unseen":false,"last_read_post_number":43,"unread":55,"new_posts":339,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":68064,"like_count":4562,"has_summary":true,"last_poster_username":"Plutonem","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":38606,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":31496,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":326221,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":304229,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":357,"primary_group_id":null}]},{"id":662464,"title":"New Beta Feature: LevelOfDetail Property for Models (Enabled Globally)","fancy_title":"New Beta Feature: LevelOfDetail Property for Models (Enabled Globally)","slug":"new-beta-feature-levelofdetail-property-for-models-enabled-globally","posts_count":51,"reply_count":18,"highest_post_number":52,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/d/e/b/deb938a882c680f766fa49d5a3b8a16f2e56b39f.png","created_at":"2020-07-08T05:12:01.996Z","last_posted_at":"2021-01-06T09:49:20.839Z","bumped":true,"bumped_at":"2021-01-06T09:49:20.839Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","modeling","rendering","networking"],"views":11907,"like_count":502,"has_summary":true,"last_poster_username":"Vasilakious","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":281177,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":1227,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":439104,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":224996,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":92183,"primary_group_id":null}]},{"id":644467,"title":"New RaycastParams Property, Deprecating Old Raycast Functions","fancy_title":"New RaycastParams Property, Deprecating Old Raycast Functions","slug":"new-raycastparams-property-deprecating-old-raycast-functions","posts_count":91,"reply_count":53,"highest_post_number":95,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/d/3/2/d32b1ab64c2f0a4da24ffbe7450e8c6b251010f6.png","created_at":"2020-06-26T00:21:46.173Z","last_posted_at":"2021-01-01T22:29:39.110Z","bumped":true,"bumped_at":"2021-01-01T21:59:42.756Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","physics"],"views":13036,"like_count":396,"has_summary":true,"last_poster_username":"buildthomas","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":119859,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":431,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":9593,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":7351,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":643,"primary_group_id":null}]},{"id":642684,"title":"Expressive Output Window - Beta","fancy_title":"Expressive Output Window - Beta","slug":"expressive-output-window-beta","posts_count":153,"reply_count":44,"highest_post_number":170,"image_url":null,"created_at":"2020-06-25T19:30:00.000Z","last_posted_at":"2020-12-05T18:24:48.359Z","bumped":true,"bumped_at":"2020-12-05T18:32:03.488Z","archetype":"regular","unseen":false,"last_read_post_number":107,"unread":0,"new_posts":63,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","output-window"],"views":23650,"like_count":1181,"has_summary":true,"last_poster_username":"Dummy_Tested","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":192817,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":153142,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":86089,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":220864,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":186756,"primary_group_id":null}]},{"id":643907,"title":"Universal Breakpoints Beta - One Breakpoint to Rule Them All","fancy_title":"Universal Breakpoints Beta - One Breakpoint to Rule Them All","slug":"universal-breakpoints-beta-one-breakpoint-to-rule-them-all","posts_count":18,"reply_count":3,"highest_post_number":21,"image_url":null,"created_at":"2020-06-25T18:28:25.069Z","last_posted_at":"2020-11-26T15:43:44.683Z","bumped":true,"bumped_at":"2020-07-29T15:43:43.770Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","debugger"],"views":11147,"like_count":140,"has_summary":false,"last_poster_username":"system","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":192817,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":112950,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":120247,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":23710,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":-1,"primary_group_id":null}]},{"id":642282,"title":"Additional Game Management in Roblox Studio","fancy_title":"Additional Game Management in Roblox Studio","slug":"additional-game-management-in-roblox-studio","posts_count":88,"reply_count":21,"highest_post_number":92,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/optimized/4X/e/2/4/e24da11e138f564733aabacad3558b95a720830c_2_1023x638.png","created_at":"2020-06-24T23:21:00.000Z","last_posted_at":"2020-12-22T12:36:54.093Z","bumped":true,"bumped_at":"2020-08-24T12:36:47.186Z","archetype":"regular","unseen":false,"last_read_post_number":82,"unread":2,"new_posts":8,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":12540,"like_count":421,"has_summary":true,"last_poster_username":"system","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":true,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":33422,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":77150,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":306008,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":103015,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":-1,"primary_group_id":null}]},{"id":639903,"title":"Future Is Bright: Phase 3 - Studio Beta","fancy_title":"Future Is Bright: Phase 3 - Studio Beta","slug":"future-is-bright-phase-3-studio-beta","posts_count":1160,"reply_count":657,"highest_post_number":1233,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/e/6/4/e643cf506a8ac153c7720bab4af414a88eaf0a9a.png","created_at":"2020-06-23T09:13:23.197Z","last_posted_at":"2021-02-04T17:43:41.911Z","bumped":true,"bumped_at":"2021-02-04T17:43:41.911Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"bookmarked":null,"liked":null,"tags":["building","studio"],"views":97604,"like_count":12547,"has_summary":true,"last_poster_username":"DoctorNO2106","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":210201,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":12817,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":380713,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":289807,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":317122,"primary_group_id":null}]},{"id":623350,"title":"Plugin Debugging: New Beta Feature!","fancy_title":"Plugin Debugging: New Beta Feature!","slug":"plugin-debugging-new-beta-feature","posts_count":42,"reply_count":13,"highest_post_number":42,"image_url":null,"created_at":"2020-06-12T22:29:13.391Z","last_posted_at":"2020-12-18T17:38:25.942Z","bumped":true,"bumped_at":"2021-02-13T17:57:38.712Z","archetype":"regular","unseen":false,"last_read_post_number":6,"unread":36,"new_posts":0,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":12535,"like_count":287,"has_summary":false,"last_poster_username":"Eternalove_fan32","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":10734,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":363802,"primary_group_id":50},{"extras":null,"description":"Частый автор","user_id":341046,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":223,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":224243,"primary_group_id":null}]},{"id":582921,"title":"Script Editor - New Foundation and First Features","fancy_title":"Script Editor - New Foundation and First Features","slug":"script-editor-new-foundation-and-first-features","posts_count":104,"reply_count":42,"highest_post_number":106,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/1/9/1/191215aedf29cd0902640dcd2faffcdcfe1faeda.jpeg","created_at":"2020-06-11T18:09:00.000Z","last_posted_at":"2020-11-18T13:40:56.854Z","bumped":true,"bumped_at":"2020-07-21T13:40:56.784Z","archetype":"regular","unseen":false,"last_read_post_number":6,"unread":94,"new_posts":6,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio","script-editor"],"views":23750,"like_count":602,"has_summary":true,"last_poster_username":"system","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":192817,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":778,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":12817,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":84276,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":-1,"primary_group_id":null}]},{"id":552810,"title":"Introducing SmoothingAngle property for PartOperation (Enabled Globally)","fancy_title":"Introducing SmoothingAngle property for PartOperation (Enabled Globally)","slug":"introducing-smoothingangle-property-for-partoperation-enabled-globally","posts_count":103,"reply_count":33,"highest_post_number":106,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/0/7/c/07c3ad00b386afbf9cc8924d69c86bceecfe003c.png","created_at":"2020-05-06T21:42:00.000Z","last_posted_at":"2020-09-09T11:12:18.309Z","bumped":true,"bumped_at":"2020-08-04T18:46:27.868Z","archetype":"regular","unseen":false,"pinned":false,"unpinned":null,"visible":true,"closed":true,"archived":false,"bookmarked":null,"liked":null,"tags":["studio","csg","csgv2"],"views":36298,"like_count":855,"has_summary":true,"last_poster_username":"system","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":281177,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":317063,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":14154,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":202896,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":-1,"primary_group_id":null}]},{"id":529077,"title":"New Studio Feature - CollisionFidelity.PreciseConvexDecomposition (Enabled Globally)","fancy_title":"New Studio Feature - CollisionFidelity.PreciseConvexDecomposition (Enabled Globally)","slug":"new-studio-feature-collisionfidelity-preciseconvexdecomposition-enabled-globally","posts_count":140,"reply_count":59,"highest_post_number":146,"image_url":"https://doy2mn9upadnk.cloudfront.net/uploads/default/original/4X/1/f/d/1fd823f35f415e8e12eee67d842f70f638f38c5a.png","created_at":"2020-04-17T14:59:53.209Z","last_posted_at":"2021-01-03T23:10:39.815Z","bumped":true,"bumped_at":"2021-01-03T23:14:21.658Z","archetype":"regular","unseen":false,"last_read_post_number":2,"unread":136,"new_posts":8,"pinned":false,"unpinned":null,"visible":true,"closed":false,"archived":false,"notification_level":3,"bookmarked":false,"liked":false,"tags":["studio"],"views":50555,"like_count":862,"has_summary":true,"last_poster_username":"TheGreat_Scott","category_id":36,"pinned_globally":false,"featured_link":null,"has_accepted_answer":false,"vote_count":0,"can_vote":false,"user_voted":false,"posters":[{"extras":null,"description":"Автор","user_id":201,"primary_group_id":41},{"extras":null,"description":"Частый автор","user_id":300,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":85229,"primary_group_id":null},{"extras":null,"description":"Частый автор","user_id":186768,"primary_group_id":null},{"extras":"latest","description":"Последний автор","user_id":286481,"primary_group_id":null}]}]}}) +}) + +app.get("/my/settings/json", (req, res) => { + res.json({"PreviousUserNames":"","UserId":1,"Name":"df","UseSuperSafePrivacyMode":false,"IsSuperSafeModeEnabledForPrivacySetting":false,"UseSuperSafeChat":false,"IsAppChatSettingEnabled":true,"IsGameChatSettingEnabled":true,"IsAccountPrivacySettingsV2Enabled":true,"IsSetPasswordNotificationEnabled":false,"ChangePasswordRequiresTwoStepVerification":false,"ChangeEmailRequiresTwoStepVerification":false,"UserEmail":"","IsEmailOnFile":false,"UserEmailMasked":true,"IsEmailVerified":false,"UserEmailVerified":false,"CanHideInventory":false,"CanTrade":false,"MissingParentEmail":false,"IsUpdateEmailSectionShown":false,"IsUnder13UpdateEmailMessageSectionShown":false,"IsUserConnectedToFacebook":false,"IsTwoStepToggleEnabled":false,"AgeBracket":0,"UserAbove13":true,"ClientIpAddress":"123.123.123.123","AccountAgeInDays":0,"IsOBC":false,"IsTBC":false,"IsAnyBC":false,"IsPremium":false,"IsBcRenewalMembership":false,"BcExpireDate":"/Date(-0)/","BcRenewalPeriod":null,"BcLevel":null,"HasCurrencyOperationError":false,"CurrencyOperationErrorMessage":null,"BlockedUsersModel":{"BlockedUserIds":[],"BlockedUsers":[],"MaxBlockedUsers":50,"Total":1,"Page":1},"Tab":null,"ChangePassword":false,"IsAccountPinEnabled":false,"IsAccountRestrictionsFeatureEnabled":true,"IsAccountRestrictionsSettingEnabled":false,"IsAccountSettingsSocialNetworksV2Enabled":false,"IsUiBootstrapModalV2Enabled":true,"IsI18nBirthdayPickerInAccountSettingsEnabled":true,"InApp":false,"MyAccountSecurityModel":{"IsEmailSet":false,"IsEmailVerified":false,"IsTwoStepEnabled":false,"ShowSignOutFromAllSessions":true,"TwoStepVerificationViewModel":{"UserId":1,"IsEnabled":true,"CodeLength":0,"ValidCodeCharacters":null}},"ApiProxyDomain":"https://www.mete0r.xyz","AccountSettingsApiDomain":"https://www.mete0r.xyz","AuthDomain":"https://www.mete0r.xyz","IsDisconnectFbSocialSignOnEnabled":true,"IsDisconnectXboxEnabled":true,"NotificationSettingsDomain":"https://www.mete0r.xyz","AllowedNotificationSourceTypes":["Test","FriendRequestReceived","FriendRequestAccepted","PartyInviteReceived","PartyMemberJoined","ChatNewMessage","PrivateMessageReceived","UserAddedToPrivateServerWhiteList","ConversationUniverseChanged","TeamCreateInvite","GameUpdate","DeveloperMetricsAvailable"],"AllowedReceiverDestinationTypes":["DesktopPush","NotificationStream"],"BlacklistedNotificationSourceTypesForMobilePush":[],"MinimumChromeVersionForPushNotifications":50,"PushNotificationsEnabledOnFirefox":true,"LocaleApiDomain":"https://www.mete0r.xyz","HasValidPasswordSet":true,"IsUpdateEmailApiEndpointEnabled":true,"FastTrackMember":null,"IsFastTrackAccessible":false,"HasFreeNameChange":false,"IsAgeDownEnabled":true,"IsSendVerifyEmailApiEndpointEnabled":true,"IsPromotionChannelsEndpointEnabled":true,"ReceiveNewsletter":false,"SocialNetworksVisibilityPrivacy":6,"SocialNetworksVisibilityPrivacyValue":"AllUsers","Facebook":null,"Twitter":null,"YouTube":null,"Twitch":null}) +}) + +const userinfoClient = require('./routes/userinfoclient.js'); + +app.use('/',userinfoClient) + +app.get('/metrics',async (req, res) => { + res.set('Content-Type', client.register.contentType) + res.end(await client.register.metrics()) + }) + +app.disable('etag'); + +app.get('/currency/balance',requireAuth, (req, res) => { + return res.json({ + "robux": req.userdocument.coins, + "tickets": 0 + }) +}) + +app.post('/device/initialize', (req, res) => { + return res.json({"browserTrackerId":1,"appDeviceIdentifier":null}) +}) +app.post('/login/v1/', (req, res) => { + return res.json({ + "userId": "12345" + }) +}) +app.get('/my/account/json', (req, res) => { + return res.json({ + AgeBracket : 0, + Email : { + IsVerified : 1, + Value : "kmulherin@roblox.com", + }, + HasPasswordSet : 1, + Username : "iMightBeLying" + }) +}) +app.get('/ab/v1/enroll', (req, res) => { + return res.json({"baller":"baller"}) +}) + +app.get('/GetAllowedMD5Hashes', (req, res) => { + return res.json({"data":["7ede9e9841e46b0538c3b684d979f759","268b4bb9ffcc0586cc13fbbb3e4de16f"]}) +}) + +app.get('/GetAllowedSecurityVersions', (req, res) => { + return res.json({"data":["0.347.0pcplayer"]}) +}) + +app.get('/asset-thumbnail/json', (req, res) => { + return res.json({"Url":"https://mete0r.xyz/assets/images/lol.png","Final":true,"SubstitutionType":0}) +}) + +app.get('/avatar-thumbnail/json', (req, res) => { + return res.json({"Url":"https://mete0r.xyz/api/thumbnailrender/?id="+req.query.userId,"Final":true,"SubstitutionType":0}) +}) + +app.get('/v1.1/avatar-fetch',async (req, res) => { // 2018 charapp + //console.log(req.headers) + const userid = req.query?.userId + const placeId = req.query?.placeId??0 + const doc = await user.findOne({userid: userid}) + const placedoc = await games.findOne({idofgame: placeId}) + if (!doc){ + return res.json({status:"error",error:"User not found."}) + } + if (!placedoc){ + return res.json({status:"error",error:"Place not found."}) + } + //console.log(doc.colors) + let json = {"resolvedAvatarType":doc.avatartype??"R6","accessoryVersionIds":[],"equippedGearVersionIds":[],"backpackGearVersionIds":[],"bodyColors":{"HeadColor":parseFloat(doc.colors.find(x => x.name === 'Head').value),"LeftArmColor":parseFloat(doc.colors.find(x => x.name === 'Left Arm').value),"LeftLegColor":parseFloat(doc.colors.find(x => x.name === 'Left Leg').value),"RightArmColor":parseFloat(doc.colors.find(x => x.name === 'Right Arm').value),"RightLegColor":parseFloat(doc.colors.find(x => x.name === 'Right Leg').value),"TorsoColor":parseFloat(doc.colors.find(x => x.name === 'Torso').value)},"animations":{},"scales":{"Width":1.0000,"Height":1.0000,"Head":1.0000,"Depth":1.00,"Proportion":0.0000,"BodyType":0.0000}} + if (!doc.inventory){ + return res.json(json) + } + for (var key of doc.inventory) { + if (key.Equipped === true){ + if (placedoc.gearallowed??false === true){ + json.accessoryVersionIds.push(parseFloat(key.ItemId)) + }else{ + if (key.Type != "Gears"){ + json.accessoryVersionIds.push(parseFloat(key.ItemId)) + } + } + } + } + //console.log(json.accessoryVersionIds) + return res.json(json) +}) + +app.get('/v1/avatar-fetch',async (req, res) => { // 2020 charapp + //console.log(req.headers) + const userid = req.query?.userId + const placeId = req.query?.placeId??0 + const doc = await user.findOne({userid: userid}) + const placedoc = await games.findOne({idofgame: placeId}) + if (!doc){ + return res.json({status:"error",error:"User not found."}) + } + if (!placedoc){ + return res.json({status:"error",error:"Place not found."}) + } + if (req.headers?.['roblox-game-id'] === "render"){ + // 2020 render needs v1.1 colors + let json = {"resolvedAvatarType":doc.avatartype??"R6","accessoryVersionIds":[],"equippedGearVersionIds":[],"backpackGearVersionIds":[],"bodyColors":{"HeadColor":parseFloat(doc.colors.find(x => x.name === 'Head').value),"LeftArmColor":parseFloat(doc.colors.find(x => x.name === 'Left Arm').value),"LeftLegColor":parseFloat(doc.colors.find(x => x.name === 'Left Leg').value),"RightArmColor":parseFloat(doc.colors.find(x => x.name === 'Right Arm').value),"RightLegColor":parseFloat(doc.colors.find(x => x.name === 'Right Leg').value),"TorsoColor":parseFloat(doc.colors.find(x => x.name === 'Torso').value)},"animations":{},"scales":{"Width":1.0000,"Height":1.0000,"Head":1.0000,"Depth":1.00,"Proportion":0.0000,"BodyType":0.0000}} + if (!doc.inventory){ + return res.json(json) + } + for (var key of doc.inventory) { + if (key.Equipped === true){ + json.accessoryVersionIds.push(parseFloat(key.ItemId)) + } + } + //console.log(json.accessoryVersionIds) + return res.json(json) + } + //console.log(doc.colors) + let json = {"resolvedAvatarType":doc.avatartype??"R6","assetAndAssetTypeIds":[],"equippedGearVersionIds":[],"backpackGearVersionIds":[],"bodyColors":{"headColorId":parseFloat(doc.colors.find(x => x.name === 'Head').value),"leftArmColorId":parseFloat(doc.colors.find(x => x.name === 'Left Arm').value),"leftLegColorId":parseFloat(doc.colors.find(x => x.name === 'Left Leg').value),"rightArmColorId":parseFloat(doc.colors.find(x => x.name === 'Right Arm').value),"rightLegColorId":parseFloat(doc.colors.find(x => x.name === 'Right Leg').value),"torsoColorId":parseFloat(doc.colors.find(x => x.name === 'Torso').value)},"animations":{},"scales":{"Width":1.0000,"Height":1.0000,"Head":1.0000,"Depth":1.00,"Proportion":0.0000,"BodyType":0.0000}, "emotes":[]} + if (!doc.inventory){ + return res.json(json) + } + let currentEmotePosition = 1 + for (var key of doc.inventory) { + if (key.Equipped === true){ + + if (key.Type === "Emotes" && currentEmotePosition <= 8){ + json.emotes.push({"assetId":parseFloat(key.ItemId),"assetName":key.ItemName,"position": currentEmotePosition}) + currentEmotePosition += 1 + } + let gearallowed = placedoc.gearallowed??false + + if ((gearallowed === true) && key.Type != "Emotes"){ + json.assetAndAssetTypeIds.push({"assetId":parseFloat(key.ItemId),"assetTypeId":8}) + }else if ((gearallowed === false) && key.Type != "Emotes"){ + if (key.Type != "Gears"){ + json.assetAndAssetTypeIds.push({"assetId":parseFloat(key.ItemId),"assetTypeId":8}) + } + } + } + } + //console.log(json.accessoryVersionIds) + return res.json(json) +}) + +app.get('/v2/users/:id/groups/roles',async (req, res) => { // 2020 admin badge + + const userid = req.params?.id + const doc = await user.findOne({userid: userid}) + if (!doc){ + return res.json({status:"error",error:"User not found."}) + } + if (doc.admin === true){ + return res.json({ + "data": [ + { + "group": { + "id": 1200769, + "name": "Official Group of Roblox", + "memberCount": 1976, + "hasVerifiedBadge": false + }, + "role": { + "id": 41221804, + "name": "Team Member", + "rank": 20 + } + } + ] + }) + } + return res.json({ + "data": [] + }) + + + +}) + +app.all('/v1.1/game-start-info/',async (req, res) => { // 2020 game settings + const placeid = req.query.universeId??0 + const doc = await games.findOne({idofgame: placeid}) + if (!doc){ + return res.json({status:"error",error:"Game not found."}) + } + const json = {"gameAvatarType":"PlayerChoice","allowCustomAnimations":"True","universeAvatarCollisionType":"OuterBox","universeAvatarBodyType":"Standard","jointPositioningType":"ArtistIntent","message":"","universeAvatarMinScales":{"height":0.90,"width":0.70,"head":0.95,"depth":0.0,"proportion":0.00,"bodyType":0.00},"universeAvatarMaxScales":{"height":1.05,"width":1.00,"head":1.00,"depth":0.0,"proportion":0.00,"bodyType":0.00},"universeAvatarAssetOverrides":[],"moderationStatus":null} + + json.gameAvatarType = doc.avatartype??"PlayerChoice" + if (doc.avatartype){ + json.gameAvatarType = "MorphTo"+json.gameAvatarType + } + return res.json(json) +}) + +app.all(['//moderation/v2/filtertext','/moderation/v2/filtertext'], (req, res) => { + const filtered = [ + 'faggot', + 'nigger', + 'nigga', + 'sex' + ] + let filteredtext = req.body?.text + if (filtered.includes(filteredtext) === true || filtered.some(substr => filteredtext.toLowerCase().startsWith(substr.toLowerCase())) === true){ + //filteredtext = '#'.repeat(req.body?.text?.length) + //filteredtext = filteredtext.replaceAll(filtered,"#") + let regex + for (var i = 0; i < filtered.length; i++) { + regex = new RegExp(filtered[i], "g"); + filteredtext = filteredtext.replace(regex, "#".repeat(filtered[i].length)); + } + } + //console.log(req.body) + return res.json({ + "data": { + "AgeUnder13": filteredtext, + "Age13OrOver": filteredtext + }, + "success": true + }) +}) + +app.post("/v2/login", (req, res) => { + //console.log(req.body) + return res.json({ + "user": { + "id": 1, + "name": "bruh" + }, + "isBanned": false + }) +}) + +app.all('/v1/login', (req, res) => { + //console.log(req.body) + res.cookie('.ROBLOSECURITY','_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items.|_DGJJD464646464dfgdgdgdCUdgjneth4iht4ih64uh4uihy4y4yuhi4yhuiyhui4yhui4uihy4huiyhu4iyhuihu4hhdghdgihdigdhuigdhuigidhugihugdgidojgijodijogdijogdjoigdjoidijogijodgijdgiojdgijodgijoF') + res.cookie('.RBXID','_|WARNING:-DO-NOT-SHARE-THIS.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items.|_eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI2NDA3MGQyNC0zYWR4LTQ5NzMtODAxYy0yOWNhNzUyNTA5NjIiLCJzdWfdijogdoijdijogijodcB6YExhM') + return res.json({ "user":{ "id":1, "name":"Shit", "displayName":"Shitter" } }) +}) + +app.get('/initialize',async (req, res) => { + var ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress + ip = ip.toString() + await ipWhiteListRepository.save(ip, { + ip: ip + }) + //await ipWhiteListRepository.expire(ip, 24 * 60 * 60 * 7 * 4) + return res.redirect("/") +}) + +app.get('/Usapi/:id', async (req,res) => { + const userid = req.params?.id + const doc = await user.findOne({userid: userid}) + if (!doc){ + return res.json({status:"error",error:"User not found."}) + } + + return res.json({"Id":doc.userid,"Username":doc.username,"AvatarUri":null,"AvatarFinal":false,"IsOnline":false}) +}) // TODO remove this + +app.get('/assets/ugc/*', async (req,res) => { + return res.status(404).end() +}) // protect this route + +app.use('/assets', express.static('assets')) + +app.use(handler) + +console.log('here') +if (PROD === "true"){ + app.listen(9000,'localhost') +}else{ + app.listen(80) // don't forget to change to 9000 for production + const localPrivateKeyPath = process.env.PRIVATEKEYLOCAL + const localCertificatePath = process.env.LOCALCERTIFICATEPATH + var privateKey = require('fs').readFileSync( localPrivateKeyPath ); + var certificate = require('fs').readFileSync( localCertificatePath ); + https.createServer({ + key: privateKey, + cert: certificate + }, app).listen(443); // remove this for prod +} + +const f = { + "Mode":"Thumbnail", + "Settings": { + "Type":"Avatar_R15_Action", + "PlaceId":1818, + "UserId":0, + "BaseUrl":"mete0r.xyz", + "MatchmakingContextId":1, + "Arguments": ["https://www.mete0r.xyz","https://api.mete0r.xyz/v1.1/avatar-fetch?userId=0","PNG",420,420] + }, + "Arguments":{ + "PrefferedPort":53640, + "MachineAddress":"localhost" + } + } \ No newline at end of file diff --git a/Back/thumbnailrcctalk.js b/Back/thumbnailrcctalk.js new file mode 100644 index 0000000..9e4a8f3 --- /dev/null +++ b/Back/thumbnailrcctalk.js @@ -0,0 +1,319 @@ +const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args)); +let controller = new AbortController(); +require('dotenv').config() +const RCC_HOST = process.env.RCC_HOST + + const url = 'http://'+RCC_HOST+':64990'; // change this to rcc soap +var convert = require('xml-js'); +const sampleHeaders = { + 'Content-Type': 'text/xml;charset=UTF-8', +}; + + + +async function OpenJob(jobid,script,expiration){ + return new Promise(async (resolve, reject) => { + // this is all boilerplate because soap sucks +var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/' + }, + 'SOAP-ENV:Body': { + 'ns1:OpenJobEx': { + 'ns1:job': { + 'ns1:id': { _text: 'StringTest11' }, + 'ns1:expirationInSeconds': { _text: '10' }, + 'ns1:category': { _text: '0' }, + 'ns1:cores': { _text: '1' } + }, + 'ns1:script': { + 'ns1:name': { _text: 'StringTest11-Script' }, + 'ns1:script': { + _text: 'print("Recieved job with ID " .. game.JobId)\r\n' + }, + 'ns1:arguments': {} + } + } + } + } + } +xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:id']._text = jobid +xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:expirationInSeconds']._text = expiration +if (!expiration) { + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:job']['ns1:expirationInSeconds']._text = "60" +} +xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:OpenJobEx']['ns1:script']['ns1:script']._text = script +const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + + + +async function GetAllJobs() { + return new Promise(async (resolve, reject) => { + const xmlData = (xml = { + _declaration: { + _attributes: { version: '1.0', encoding: 'UTF - 8' }, + }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', + 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12', + }, + 'SOAP-ENV:Body': { 'ns1:GetAllJobsEx': {} }, + }, + }) + + const body = convert.js2xml(xmlData, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:GetAllJobsExResponse']['ns1:GetAllJobsExResult'] + ) + } catch (error) { + return reject(error) + } + }) +} + +async function Execute(jobid,script) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF - 8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', + 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12' + }, + 'SOAP-ENV:Body': { + 'ns1:ExecuteEx': { + 'ns1:jobID': { _text: 'Test' }, + 'ns1:script': { + 'ns1:name': { _text: 'Script' }, + 'ns1:script': { _text: 'print("no")' }, + 'ns1:arguments': { _text: '' } + } + } + } + } + } +xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:ExecuteEx']['ns1:jobID']._text = jobid +xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:ExecuteEx']['ns1:script']['ns1:script']._text = script + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) + +} +async function CloseJob(jobid) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF - 8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:SOAP-ENC': 'http://schemas.xmlsoap.org/soap/encoding/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema', + 'xmlns:ns2': 'http://roblox.com/RCCServiceSoap', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:ns3': 'http://roblox.com/RCCServiceSoap12' + }, + 'SOAP-ENV:Body': { + 'ns1:CloseJob': { + 'ns1:jobID': { _text: 'Test' } + } + } + } + } + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:CloseJob']['ns1:jobID']._text = jobid + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + + +async function RenewLease(jobid,expiration) { + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance' + }, + 'SOAP-ENV:Body': { + 'ns1:RenewLease': { + 'ns1:jobID': { + _attributes: { 'xsi:type': 'ns1:Job' }, + 'ns1:id': { _text: 'StringTest11' }, + 'ns1:expirationInSeconds': { _text: '10' }, + 'ns1:category': { _text: '0' }, + 'ns1:cores': { _text: '1' } + }, + 'ns1:expirationInSeconds': { _text: '100' } + } + } + } + } + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:jobID']['ns1:id']._text = jobid + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:RenewLease']['ns1:expirationInSeconds']._text = expiration + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + +async function GetExpiration(jobid){ + return new Promise(async (resolve, reject) => { + var xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/' + }, + 'SOAP-ENV:Body': { 'ns1:GetExpiration': { 'ns1:jobID': { _text: 'Test' } } } + } + } + xml['SOAP-ENV:Envelope']['SOAP-ENV:Body']['ns1:GetExpiration']['ns1:jobID']._text = jobid + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} +//var gameservertxt = fs.readFileSync('actualgameserver.txt','utf-8') +//gameservertxt = gameservertxt.replace('function start(placeId, port, url)','function start(1111, port)') + +async function CloseExpiredJobs(){ + return new Promise(async (resolve, reject) => { + var xml = xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/' + }, + 'SOAP-ENV:Body': { 'ns1:CloseExpiredJobs': {} } + } + } + + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + +async function CloseAllJobs(){ + return new Promise(async (resolve, reject) => { + var xml = xml = { + _declaration: { _attributes: { version: '1.0', encoding: 'UTF-8' } }, + 'SOAP-ENV:Envelope': { + _attributes: { + 'xmlns:SOAP-ENV': 'http://schemas.xmlsoap.org/soap/envelope/', + 'xmlns:ns1': 'http://roblox.com/' + }, + 'SOAP-ENV:Body': { 'ns1:CloseAllJobs': {} } + } + } + + const body = convert.js2xml(xml, { compact: true, spaces: 4 }) + + try { + const result = await fetch(url, { method: 'POST', body }) + const data = await result.text() + const convertedData = convert.xml2js(data, { compact: true, spaces: 4 }) + return resolve( + convertedData + ) + } catch (error) { + return reject(error) + } + }) +} + + +module.exports = {OpenJob, GetAllJobs,Execute,CloseJob,RenewLease,GetExpiration,CloseExpiredJobs,CloseAllJobs} + + + + + + + + + diff --git a/Back/thumbnailrenderer.lua b/Back/thumbnailrenderer.lua new file mode 100644 index 0000000..84d3861 --- /dev/null +++ b/Back/thumbnailrenderer.lua @@ -0,0 +1,77 @@ +-- This is the thumbnail script for R6 avatars. Straight up and down, with the right arm out if they have a gear. +local person = 0 +local baseurl = "http://mete0r.xyz" -- have to set to https for production +local HttpService = game:GetService("HttpService") +HttpService.HttpEnabled = true + +---@diagnostic disable-next-line: invalid-class-name +local ThumbnailGenerator = game:GetService("ThumbnailGenerator") + +pcall(function() game:GetService("ContentProvider"):SetBaseUrl(baseurl) end) +game:GetService("ScriptContext").ScriptsDisabled = true + +local player = game:GetService("Players"):CreateLocalPlayer(0) +player:LoadCharacter() + +-- bodycolors +a = HttpService:JSONDecode(HttpService:GetAsync("http://mete0r.xyz/game/colors?name="..person.."&rcc=''")) +bcolor = Instance.new("BodyColors", player.Character) +bcolor.HeadColor = BrickColor.new(a[1]) +bcolor.TorsoColor = BrickColor.new(a[2]) +bcolor.LeftArmColor = BrickColor.new(a[3]) +bcolor.RightArmColor = BrickColor.new(a[4]) +bcolor.LeftLegColor = BrickColor.new(a[5]) +bcolor.RightLegColor = BrickColor.new(a[6]) + + +-- charapp +b = HttpService:JSONDecode(HttpService:GetAsync("http://mete0r.xyz/game/charapp?name="..person.."&rcc=''")) +tool = false +pcall(function() + +for i,v in pairs(b) do +pcall(function() + print(v.item.itemid) +---@diagnostic disable-next-line: undefined-global + thing = game:GetService("InsertService"):LoadAsset(v.item.itemid) + + if thing:GetChildren()[1].ClassName == "Tool" then + if tool == false then + tool = true + thing:GetChildren()[1].Parent = player.Character + end + elseif thing:GetChildren()[1]:IsA("Decal") then + --face + player.Character.Head.face:Destroy() + thing:GetChildren()[1].Parent = player.Character.Head + else + thing:GetChildren()[1].Parent = player.Character + +end +end) +end + +end) + + +-- Raise up the character's arm if they have gear. +if player.Character then + for _, child in pairs(player.Character:GetChildren()) do + if child:IsA("Tool") then + player.Character.Torso["Right Shoulder"].CurrentAngle = math.rad(90) + break + end + end +end +game.CoreGui.RobloxGui.HealthGui:Destroy() +game.CoreGui.RobloxGui.Backpack:Destroy() + +local arguments = { + ["thumbnail"] = ThumbnailGenerator:Click("PNG", 400, 400, --[[hideSky = ]] true), + ["player"] = person + } + +HttpService:PostAsync( + baseurl .. "/api/thumbnailrender/rcc", + HttpService:JSONEncode(arguments) + ) \ No newline at end of file diff --git a/Back/under_maintenance.html b/Back/under_maintenance.html new file mode 100644 index 0000000..0973e38 --- /dev/null +++ b/Back/under_maintenance.html @@ -0,0 +1,93 @@ + + + +
+

What happened to Meteorite?

+

In short I had lost motivation to keep it open. Now let me give you some reasons why.

+
+ + +
+ +

To clear some things up of accusations against me since I know there is a lot of noise.

+
+
First of all, I had already decided to shut down before the document even came out. It didn't influence this decision in any way. Now, we will skip over criticisms of the website itself as that doesn't matter. Two problematic individuals in the community were a result of my bad management and staff favoritism over members. Security of Meteorite was compromised from a lazy config error but I did my best to minimize the damage and as far as I'm aware only around 70 places leaked on the internet.
+
+
Thanks, sushi. it's been fun. Maybe we meet again 2020 RCC
+ + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/Back/yarn.lock b/Back/yarn.lock new file mode 100644 index 0000000..de179c9 --- /dev/null +++ b/Back/yarn.lock @@ -0,0 +1,3108 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aws-crypto/ie11-detection@^3.0.0": + "integrity" "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==" + "resolved" "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "tslib" "^1.11.1" + +"@aws-crypto/sha256-browser@3.0.0": + "integrity" "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==" + "resolved" "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "@aws-crypto/ie11-detection" "^3.0.0" + "@aws-crypto/sha256-js" "^3.0.0" + "@aws-crypto/supports-web-crypto" "^3.0.0" + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + "tslib" "^1.11.1" + +"@aws-crypto/sha256-js@^3.0.0", "@aws-crypto/sha256-js@3.0.0": + "integrity" "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==" + "resolved" "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "@aws-crypto/util" "^3.0.0" + "@aws-sdk/types" "^3.222.0" + "tslib" "^1.11.1" + +"@aws-crypto/supports-web-crypto@^3.0.0": + "integrity" "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==" + "resolved" "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "tslib" "^1.11.1" + +"@aws-crypto/util@^3.0.0": + "integrity" "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==" + "resolved" "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-utf8-browser" "^3.0.0" + "tslib" "^1.11.1" + +"@aws-sdk/abort-controller@3.272.0": + "integrity" "sha512-s2TV3phapcTwZNr4qLxbfuQuE9ZMP4RoJdkvRRCkKdm6jslsWLJf2Zlcxti/23hOlINUMYv2iXE2pftIgWGdpg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/client-cognito-identity@3.272.0": + "integrity" "sha512-uMjRWcNvX7SoGaVn0mXWD43+Z1awPahQwGW3riDLfXHZdOgw2oFDhD3Jg5jQ8OzQLUfDvArhE3WyZwlS4muMuQ==" + "resolved" "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.272.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-node" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.272.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.272.0" + "@aws-sdk/util-defaults-mode-node" "3.272.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + "tslib" "^2.3.1" + +"@aws-sdk/client-sso-oidc@3.272.0": + "integrity" "sha512-ECcXu3xoa1yggnGKMTh29eWNHiF/wC6r5Uqbla22eOOosyh0+Z6lkJ3JUSLOUKCkBXA4Cs/tJL9UDFBrKbSlvA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.272.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.272.0" + "@aws-sdk/util-defaults-mode-node" "3.272.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + "tslib" "^2.3.1" + +"@aws-sdk/client-sso@3.272.0": + "integrity" "sha512-xn9a0IGONwQIARmngThoRhF1lLGjHAD67sUaShgIMaIMc6ipVYN6alWG1VuUpoUQ6iiwMEt0CHdfCyLyUV/fTA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.272.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.272.0" + "@aws-sdk/util-defaults-mode-node" "3.272.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + "tslib" "^2.3.1" + +"@aws-sdk/client-sts@3.272.0": + "integrity" "sha512-kigxCxURp3WupufGaL/LABMb7UQfzAQkKcj9royizL3ItJ0vw5kW/JFrPje5IW1mfLgdPF7PI9ShOjE0fCLTqA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-node" "3.272.0" + "@aws-sdk/fetch-http-handler" "3.272.0" + "@aws-sdk/hash-node" "3.272.0" + "@aws-sdk/invalid-dependency" "3.272.0" + "@aws-sdk/middleware-content-length" "3.272.0" + "@aws-sdk/middleware-endpoint" "3.272.0" + "@aws-sdk/middleware-host-header" "3.272.0" + "@aws-sdk/middleware-logger" "3.272.0" + "@aws-sdk/middleware-recursion-detection" "3.272.0" + "@aws-sdk/middleware-retry" "3.272.0" + "@aws-sdk/middleware-sdk-sts" "3.272.0" + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/middleware-user-agent" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/node-http-handler" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/smithy-client" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "@aws-sdk/util-body-length-browser" "3.188.0" + "@aws-sdk/util-body-length-node" "3.208.0" + "@aws-sdk/util-defaults-mode-browser" "3.272.0" + "@aws-sdk/util-defaults-mode-node" "3.272.0" + "@aws-sdk/util-endpoints" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "@aws-sdk/util-user-agent-browser" "3.272.0" + "@aws-sdk/util-user-agent-node" "3.272.0" + "@aws-sdk/util-utf8" "3.254.0" + "fast-xml-parser" "4.0.11" + "tslib" "^2.3.1" + +"@aws-sdk/config-resolver@3.272.0": + "integrity" "sha512-Dr4CffRVNsOp3LRNdpvcH6XuSgXOSLblWliCy/5I86cNl567KVMxujVx6uPrdTXYs2h1rt3MNl6jQGnAiJeTbw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-config-provider" "3.208.0" + "@aws-sdk/util-middleware" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/credential-provider-cognito-identity@3.272.0": + "integrity" "sha512-rVx0rtQjbiYCM0nah2rB/2ut2YJYPpRr1AbW/Hd4r/PI+yiusrmXAwuT4HIW2yr34zsQMPi1jZ3WHN9Rn9mzlg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/client-cognito-identity" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/credential-provider-env@3.272.0": + "integrity" "sha512-QI65NbLnKLYHyTYhXaaUrq6eVsCCrMUb05WDA7+TJkWkjXesovpjc8vUKgFiLSxmgKmb2uOhHNcDyObKMrYQFw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/credential-provider-imds@3.272.0": + "integrity" "sha512-wwAfVY1jTFQEfxVfdYD5r5ieYGl+0g4nhekVxNMqE8E1JeRDd18OqiwAflzpgBIqxfqvCUkf+vl5JYyacMkNAQ==" + "resolved" "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/credential-provider-ini@3.272.0": + "integrity" "sha512-iE3CDzK5NcupHYjfYjBdY1JCy8NLEoRUsboEjG0i0gy3S3jVpDeVHX1dLVcL/slBFj6GiM7SoNV/UfKnJf3Gaw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/credential-provider-env" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/credential-provider-process" "3.272.0" + "@aws-sdk/credential-provider-sso" "3.272.0" + "@aws-sdk/credential-provider-web-identity" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/credential-provider-node@3.272.0": + "integrity" "sha512-FI8uvwM1IxiRSvbkdKv8DZG5vxU3ezaseTaB1fHWTxEUFb0pWIoHX9oeOKer9Fj31SOZTCNAaYFURbSRuZlm/w==" + "resolved" "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/credential-provider-env" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/credential-provider-ini" "3.272.0" + "@aws-sdk/credential-provider-process" "3.272.0" + "@aws-sdk/credential-provider-sso" "3.272.0" + "@aws-sdk/credential-provider-web-identity" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/credential-provider-process@3.272.0": + "integrity" "sha512-hiCAjWWm2PeBFp5cjkxqyam/XADjiS+e7GzwC34TbZn3LisS0uoweLojj9tD11NnnUhyhbLteUvu5+rotOLwrg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/credential-provider-sso@3.272.0": + "integrity" "sha512-hwYaulyiU/7chKKFecxCeo0ls6Dxs7h+5EtoYcJJGvfpvCncyOZF35t00OAsCd3Wo7HkhhgfpGdb6dmvCNQAZQ==" + "resolved" "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/client-sso" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/token-providers" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/credential-provider-web-identity@3.272.0": + "integrity" "sha512-ImrHMkcgneGa/HadHAQXPwOrX26sAKuB8qlMxZF/ZCM2B55u8deY+ZVkVuraeKb7YsahMGehPFOfRAF6mvFI5Q==" + "resolved" "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/credential-providers@^3.186.0": + "integrity" "sha512-ucd6Xq6aBMf+nM4uz5zkjL11mwaE5BV1Q4hkulaGu2v1dRA8n6zhLJk/sb4hOJ7leelqMJMErlbQ2T3MkYvlJQ==" + "resolved" "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/client-cognito-identity" "3.272.0" + "@aws-sdk/client-sso" "3.272.0" + "@aws-sdk/client-sts" "3.272.0" + "@aws-sdk/credential-provider-cognito-identity" "3.272.0" + "@aws-sdk/credential-provider-env" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/credential-provider-ini" "3.272.0" + "@aws-sdk/credential-provider-node" "3.272.0" + "@aws-sdk/credential-provider-process" "3.272.0" + "@aws-sdk/credential-provider-sso" "3.272.0" + "@aws-sdk/credential-provider-web-identity" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/fetch-http-handler@3.272.0": + "integrity" "sha512-1Qhm9e0RbS1Xf4CZqUbQyUMkDLd7GrsRXWIvm9b86/vgeV8/WnjO3CMue9D51nYgcyQORhYXv6uVjAYCWbUExA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/querystring-builder" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-base64" "3.208.0" + "tslib" "^2.3.1" + +"@aws-sdk/hash-node@3.272.0": + "integrity" "sha512-40dwND+iAm3VtPHPZu7/+CIdVJFk2s0cWZt1lOiMPMSXycSYJ45wMk7Lly3uoqRx0uWfFK5iT2OCv+fJi5jTng==" + "resolved" "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-buffer-from" "3.208.0" + "@aws-sdk/util-utf8" "3.254.0" + "tslib" "^2.3.1" + +"@aws-sdk/invalid-dependency@3.272.0": + "integrity" "sha512-ysW6wbjl1Y78txHUQ/Tldj2Rg1BI7rpMO9B9xAF6yAX3mQ7t6SUPQG/ewOGvH2208NBIl3qP5e/hDf0Q6r/1iw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/is-array-buffer@3.201.0": + "integrity" "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz" + "version" "3.201.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/middleware-content-length@3.272.0": + "integrity" "sha512-sAbDZSTNmLX+UTGwlUHJBWy0QGQkiClpHwVFXACon+aG0ySLNeRKEVYs6NCPYldw4cj6hveLUn50cX44ukHErw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/middleware-endpoint@3.272.0": + "integrity" "sha512-Dk3JVjj7SxxoUKv3xGiOeBksvPtFhTDrVW75XJ98Ymv8gJH5L1sq4hIeJAHRKogGiRFq2J73mnZSlM9FVXEylg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/middleware-serde" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/url-parser" "3.272.0" + "@aws-sdk/util-config-provider" "3.208.0" + "@aws-sdk/util-middleware" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/middleware-host-header@3.272.0": + "integrity" "sha512-Q8K7bMMFZnioUXpxn57HIt4p+I63XaNAawMLIZ5B4F2piyukbQeM9q2XVKMGwqLvijHR8CyP5nHrtKqVuINogQ==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/middleware-logger@3.272.0": + "integrity" "sha512-u2SQ0hWrFwxbxxYMG5uMEgf01pQY5jauK/LYWgGIvuCmFgiyRQQP3oN7kkmsxnS9MWmNmhbyQguX2NY02s5e9w==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/middleware-recursion-detection@3.272.0": + "integrity" "sha512-Gp/eKWeUWVNiiBdmUM2qLkBv+VLSJKoWAO+aKmyxxwjjmWhE0FrfA1NQ1a3g+NGMhRbAfQdaYswRAKsul70ISg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/middleware-retry@3.272.0": + "integrity" "sha512-pCGvHM7C76VbO/dFerH+Vwf7tGv7j+e+eGrvhQ35mRghCtfIou/WMfTZlD1TNee93crrAQQVZKjtW3dMB3WCzg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/service-error-classification" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-middleware" "3.272.0" + "@aws-sdk/util-retry" "3.272.0" + "tslib" "^2.3.1" + "uuid" "^8.3.2" + +"@aws-sdk/middleware-sdk-sts@3.272.0": + "integrity" "sha512-VvYPg7LrDIjUOWueSzo2wBzcNG7dw+cmzV6zAKaLxf0RC5jeAP4hE0OzDiiZfDrjNghEzgq/V+0NO+LewqYL9Q==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/middleware-signing" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/middleware-serde@3.272.0": + "integrity" "sha512-kW1uOxgPSwtXPB5rm3QLdWomu42lkYpQL94tM1BjyFOWmBLO2lQhk5a7Dw6HkTozT9a+vxtscLChRa6KZe61Hw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/middleware-signing@3.272.0": + "integrity" "sha512-4LChFK4VAR91X+dupqM8fQqYhFGE0G4Bf9rQlVTgGSbi2KUOmpqXzH0/WKE228nKuEhmH8+Qd2VPSAE2JcyAUA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/signature-v4" "3.272.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-middleware" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/middleware-stack@3.272.0": + "integrity" "sha512-jhwhknnPBGhfXAGV5GXUWfEhDFoP/DN8MPCO2yC5OAxyp6oVJ8lTPLkZYMTW5VL0c0eG44dXpF4Ib01V+PlDrQ==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/middleware-user-agent@3.272.0": + "integrity" "sha512-Qy7/0fsDJxY5l0bEk7WKDfqb4Os/sCAgFR2zEvrhDtbkhYPf72ysvg/nRUTncmCbo8tOok4SJii2myk8KMfjjw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/node-config-provider@3.272.0": + "integrity" "sha512-YYCIBh9g1EQo7hm2l22HX5Yr9RoPQ2RCvhzKvF1n1e8t1QH4iObQrYUtqHG4khcm64Cft8C5MwZmgzHbya5Z6Q==" + "resolved" "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/node-http-handler@3.272.0": + "integrity" "sha512-VrW9PjhhngeyYp4yGYPe5S0vgZH6NwU3Po9xAgayUeE37Inr7LS1YteFMHdpgsUUeNXnh7d06CXqHo1XjtqOKA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/abort-controller" "3.272.0" + "@aws-sdk/protocol-http" "3.272.0" + "@aws-sdk/querystring-builder" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/property-provider@3.272.0": + "integrity" "sha512-V1pZTaH5eqpAt8O8CzbItHhOtzIfFuWymvwZFkAtwKuaHpnl7jjrTouV482zoq8AD/fF+VVSshwBKYA7bhidIw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/protocol-http@3.272.0": + "integrity" "sha512-4JQ54v5Yn08jspNDeHo45CaSn1CvTJqS1Ywgr79eU6jBExtguOWv6LNtwVSBD9X37v88iqaxt8iu1Z3pZZAJeg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/querystring-builder@3.272.0": + "integrity" "sha512-ndo++7GkdCj5tBXE6rGcITpSpZS4PfyV38wntGYAlj9liL1omk3bLZRY6uzqqkJpVHqbg2fD7O2qHNItzZgqhw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-uri-escape" "3.201.0" + "tslib" "^2.3.1" + +"@aws-sdk/querystring-parser@3.272.0": + "integrity" "sha512-5oS4/9n6N1LZW9tI3qq/0GnCuWoOXRgcHVB+AJLRBvDbEe+GI+C/xK1tKLsfpDNgsQJHc4IPQoIt4megyZ/1+A==" + "resolved" "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/service-error-classification@3.272.0": + "integrity" "sha512-REoltM1LK9byyIufLqx9znhSolPcHQgVHIA2S0zu5sdt5qER4OubkLAXuo4MBbisUTmh8VOOvIyUb5ijZCXq1w==" + "resolved" "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.272.0.tgz" + "version" "3.272.0" + +"@aws-sdk/shared-ini-file-loader@3.272.0": + "integrity" "sha512-lzFPohp5sy2XvwFjZIzLVCRpC0i5cwBiaXmFzXYQZJm6FSCszHO4ax+m9yrtlyVFF/2YPWl+/bzNthy4aJtseA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/signature-v4@3.272.0": + "integrity" "sha512-pWxnHG1NqJWMwlhJ6NHNiUikOL00DHROmxah6krJPMPq4I3am2KY2Rs/8ouWhnEXKaHAv4EQhSALJ+7Mq5S4/A==" + "resolved" "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + "@aws-sdk/types" "3.272.0" + "@aws-sdk/util-hex-encoding" "3.201.0" + "@aws-sdk/util-middleware" "3.272.0" + "@aws-sdk/util-uri-escape" "3.201.0" + "@aws-sdk/util-utf8" "3.254.0" + "tslib" "^2.3.1" + +"@aws-sdk/smithy-client@3.272.0": + "integrity" "sha512-pvdleJ3kaRvyRw2pIZnqL85ZlWBOZrPKmR9I69GCvlyrfdjRBhbSjIEZ+sdhZudw0vdHxq25AGoLUXhofVLf5Q==" + "resolved" "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/middleware-stack" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/token-providers@3.272.0": + "integrity" "sha512-0GISJ4IKN2rXvbSddB775VjBGSKhYIGQnAdMqbvxi9LB6pSvVxcH9aIL28G0spiuL+dy3yGQZ8RlJPAyP9JW9A==" + "resolved" "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/client-sso-oidc" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/shared-ini-file-loader" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/types@^3.222.0", "@aws-sdk/types@3.272.0": + "integrity" "sha512-MmmL6vxMGP5Bsi+4wRx4mxYlU/LX6M0noOXrDh/x5FfG7/4ZOar/nDxqDadhJtNM88cuWVHZWY59P54JzkGWmA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/types/-/types-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/url-parser@3.272.0": + "integrity" "sha512-vX/Tx02PlnQ/Kgtf5TnrNDHPNbY+amLZjW0Z1d9vzAvSZhQ4i9Y18yxoRDIaDTCNVRDjdhV8iuctW+05PB5JtQ==" + "resolved" "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/querystring-parser" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/util-base64@3.208.0": + "integrity" "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz" + "version" "3.208.0" + dependencies: + "@aws-sdk/util-buffer-from" "3.208.0" + "tslib" "^2.3.1" + +"@aws-sdk/util-body-length-browser@3.188.0": + "integrity" "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz" + "version" "3.188.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/util-body-length-node@3.208.0": + "integrity" "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz" + "version" "3.208.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/util-buffer-from@3.208.0": + "integrity" "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz" + "version" "3.208.0" + dependencies: + "@aws-sdk/is-array-buffer" "3.201.0" + "tslib" "^2.3.1" + +"@aws-sdk/util-config-provider@3.208.0": + "integrity" "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz" + "version" "3.208.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/util-defaults-mode-browser@3.272.0": + "integrity" "sha512-W8ZVJSZRuUBg8l0JEZzUc+9fKlthVp/cdE+pFeF8ArhZelOLCiaeCrMaZAeJusaFzIpa6cmOYQAjtSMVyrwRtg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + "bowser" "^2.11.0" + "tslib" "^2.3.1" + +"@aws-sdk/util-defaults-mode-node@3.272.0": + "integrity" "sha512-U0NTcbMw6KFk7uz/avBmfxQSTREEiX6JDMH68oN/3ux4AICd2I4jHyxnloSWGuiER1FxZf1dEJ8ZTwy8Ibl21Q==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/config-resolver" "3.272.0" + "@aws-sdk/credential-provider-imds" "3.272.0" + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/property-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/util-endpoints@3.272.0": + "integrity" "sha512-c4MPUaJt2G6gGpoiwIOqDfUa98c1J63RpYvf/spQEKOtC/tF5Gfqlxuq8FnAl5lHnrqj1B9ZXLLxFhHtDR0IiQ==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/util-hex-encoding@3.201.0": + "integrity" "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz" + "version" "3.201.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/util-locate-window@^3.0.0": + "integrity" "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz" + "version" "3.208.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/util-middleware@3.272.0": + "integrity" "sha512-Abw8m30arbwxqmeMMha5J11ESpHUNmCeSqSzE8/C4B8jZQtHY4kq7f+upzcNIQ11lsd+uzBEzNG3+dDRi0XOJQ==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/util-retry@3.272.0": + "integrity" "sha512-Ngha5414LR4gRHURVKC9ZYXsEJhMkm+SJ+44wlzOhavglfdcKKPUsibz5cKY1jpUV7oKECwaxHWpBB8r6h+hOg==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/service-error-classification" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/util-uri-escape@3.201.0": + "integrity" "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz" + "version" "3.201.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/util-user-agent-browser@3.272.0": + "integrity" "sha512-Lp5QX5bH6uuwBlIdr7w7OAcAI50ttyskb++yUr9i+SPvj6RI2dsfIBaK4mDg1qUdM5LeUdvIyqwj3XHjFKAAvA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/types" "3.272.0" + "bowser" "^2.11.0" + "tslib" "^2.3.1" + +"@aws-sdk/util-user-agent-node@3.272.0": + "integrity" "sha512-ljK+R3l+Q1LIHrcR+Knhk0rmcSkfFadZ8V+crEGpABf/QUQRg7NkZMsoe814tfBO5F7tMxo8wwwSdaVNNHtoRA==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.272.0.tgz" + "version" "3.272.0" + dependencies: + "@aws-sdk/node-config-provider" "3.272.0" + "@aws-sdk/types" "3.272.0" + "tslib" "^2.3.1" + +"@aws-sdk/util-utf8-browser@^3.0.0": + "integrity" "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz" + "version" "3.259.0" + dependencies: + "tslib" "^2.3.1" + +"@aws-sdk/util-utf8@3.254.0": + "integrity" "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==" + "resolved" "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz" + "version" "3.254.0" + dependencies: + "@aws-sdk/util-buffer-from" "3.208.0" + "tslib" "^2.3.1" + +"@esbuild/win32-x64@0.17.4": + "integrity" "sha512-0kLAjs+xN5OjhTt/aUA6t48SfENSCKgGPfExADYTOo/UCn0ivxos9/anUVeSfg+L+2O9xkFxvJXIJfG+Q4sYSg==" + "resolved" "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.4.tgz" + "version" "0.17.4" + +"@mapbox/node-pre-gyp@^1.0.10": + "integrity" "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==" + "resolved" "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "detect-libc" "^2.0.0" + "https-proxy-agent" "^5.0.0" + "make-dir" "^3.1.0" + "node-fetch" "^2.6.7" + "nopt" "^5.0.0" + "npmlog" "^5.0.1" + "rimraf" "^3.0.2" + "semver" "^7.3.5" + "tar" "^6.1.11" + +"@mfd/rbxdatastoreservice@^2.3.10": + "integrity" "sha512-sZkBwBolSwHT2RDz4//7K0Vkxdjo2Zg1RSdSaUasTUKWj+BMeANgyLv/baMFHcJFE/Z+3kCcCkU/VHqfiQAHgA==" + "resolved" "https://registry.npmjs.org/@mfd/rbxdatastoreservice/-/rbxdatastoreservice-2.3.11.tgz" + "version" "2.3.11" + dependencies: + "axios" "^0.27.2" + "crypto-js" "^4.0.0" + +"@nodelib/fs.scandir@2.1.5": + "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + "version" "2.1.5" + dependencies: + "@nodelib/fs.stat" "2.0.5" + "run-parallel" "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + "version" "2.0.5" + +"@nodelib/fs.walk@^1.2.3": + "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" + "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + "version" "1.2.8" + dependencies: + "@nodelib/fs.scandir" "2.1.5" + "fastq" "^1.6.0" + +"@redis/bloom@1.2.0": + "integrity" "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==" + "resolved" "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz" + "version" "1.2.0" + +"@redis/client@^1.0.0", "@redis/client@1.5.6": + "integrity" "sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA==" + "resolved" "https://registry.npmjs.org/@redis/client/-/client-1.5.6.tgz" + "version" "1.5.6" + dependencies: + "cluster-key-slot" "1.1.2" + "generic-pool" "3.9.0" + "yallist" "4.0.0" + +"@redis/graph@1.1.0": + "integrity" "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==" + "resolved" "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz" + "version" "1.1.0" + +"@redis/json@1.0.4": + "integrity" "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==" + "resolved" "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz" + "version" "1.0.4" + +"@redis/search@1.1.2": + "integrity" "sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA==" + "resolved" "https://registry.npmjs.org/@redis/search/-/search-1.1.2.tgz" + "version" "1.1.2" + +"@redis/time-series@1.0.4": + "integrity" "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==" + "resolved" "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz" + "version" "1.0.4" + +"@types/node@*": + "integrity" "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz" + "version" "18.13.0" + +"@types/webidl-conversions@*": + "integrity" "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + "resolved" "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + "version" "7.0.0" + +"@types/whatwg-url@^8.2.1": + "integrity" "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==" + "resolved" "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz" + "version" "8.2.2" + dependencies: + "@types/node" "*" + "@types/webidl-conversions" "*" + +"@yaireo/relative-time@^1.0.3": + "integrity" "sha512-CJGxyWjb4SnkqubyfiPNQeg0YrJKnVu+11DOP65ltXFxDsjjnm3IByXS9O1Ny9AU9Oxqg0a7Gt26tzXtcijicg==" + "resolved" "https://registry.npmjs.org/@yaireo/relative-time/-/relative-time-1.0.3.tgz" + "version" "1.0.3" + +"abbrev@1": + "integrity" "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + "version" "1.1.1" + +"accepts@~1.3.8": + "integrity" "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==" + "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + "version" "1.3.8" + dependencies: + "mime-types" "~2.1.34" + "negotiator" "0.6.3" + +"acorn-node@^1.8.2": + "integrity" "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==" + "resolved" "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" + "version" "1.8.2" + dependencies: + "acorn" "^7.0.0" + "acorn-walk" "^7.0.0" + "xtend" "^4.0.2" + +"acorn-walk@^7.0.0": + "integrity" "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + "version" "7.2.0" + +"acorn@^7.0.0": + "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + "version" "7.4.1" + +"agent-base@6": + "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==" + "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "debug" "4" + +"ansi-regex@^5.0.1": + "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + "version" "5.0.1" + +"ansi-styles@^4.0.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "^2.0.1" + +"anymatch@~3.1.2": + "integrity" "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==" + "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + "version" "3.1.3" + dependencies: + "normalize-path" "^3.0.0" + "picomatch" "^2.0.4" + +"append-field@^1.0.0": + "integrity" "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + "resolved" "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz" + "version" "1.0.0" + +"aproba@^1.0.3 || ^2.0.0": + "integrity" "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + "resolved" "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" + "version" "2.0.0" + +"are-we-there-yet@^2.0.0": + "integrity" "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==" + "resolved" "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "delegates" "^1.0.0" + "readable-stream" "^3.6.0" + +"arg@^5.0.2": + "integrity" "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + "resolved" "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + "version" "5.0.2" + +"array-flatten@1.1.1": + "integrity" "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + "version" "1.1.1" + +"asynckit@^0.4.0": + "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + "version" "0.4.0" + +"atob@^2.1.2": + "integrity" "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "resolved" "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" + "version" "2.1.2" + +"autoprefixer@^10.0.2": + "integrity" "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==" + "resolved" "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" + "version" "10.4.13" + dependencies: + "browserslist" "^4.21.4" + "caniuse-lite" "^1.0.30001426" + "fraction.js" "^4.2.0" + "normalize-range" "^0.1.2" + "picocolors" "^1.0.0" + "postcss-value-parser" "^4.2.0" + +"axios@^0.27.2": + "integrity" "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==" + "resolved" "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" + "version" "0.27.2" + dependencies: + "follow-redirects" "^1.14.9" + "form-data" "^4.0.0" + +"balanced-match@^1.0.0": + "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + "version" "1.0.2" + +"base32.js@0.0.1": + "integrity" "sha512-EGHIRiegFa62/SsA1J+Xs2tIzludPdzM064N9wjbiEgHnGnJ1V0WEpA4pEwCYT5nDvZk3ubf0shqaCS7k6xeUQ==" + "resolved" "https://registry.npmjs.org/base32.js/-/base32.js-0.0.1.tgz" + "version" "0.0.1" + +"base64-js@^1.3.1": + "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + "version" "1.5.1" + +"bcrypt@^5.0.1": + "integrity" "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==" + "resolved" "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "@mapbox/node-pre-gyp" "^1.0.10" + "node-addon-api" "^5.0.0" + +"binary-extensions@^2.0.0": + "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + "version" "2.2.0" + +"bintrees@1.0.2": + "integrity" "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" + "resolved" "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz" + "version" "1.0.2" + +"body-parser@^1.20.0", "body-parser@1.20.1": + "integrity" "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==" + "resolved" "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" + "version" "1.20.1" + dependencies: + "bytes" "3.1.2" + "content-type" "~1.0.4" + "debug" "2.6.9" + "depd" "2.0.0" + "destroy" "1.2.0" + "http-errors" "2.0.0" + "iconv-lite" "0.4.24" + "on-finished" "2.4.1" + "qs" "6.11.0" + "raw-body" "2.5.1" + "type-is" "~1.6.18" + "unpipe" "1.0.0" + +"bowser@^2.11.0": + "integrity" "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "resolved" "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz" + "version" "2.11.0" + +"brace-expansion@^1.1.7": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" + dependencies: + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" + +"braces@^3.0.2", "braces@~3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "fill-range" "^7.0.1" + +"browserslist@^4.21.4", "browserslist@>= 4.21.0": + "integrity" "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==" + "resolved" "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" + "version" "4.21.4" + dependencies: + "caniuse-lite" "^1.0.30001400" + "electron-to-chromium" "^1.4.251" + "node-releases" "^2.0.6" + "update-browserslist-db" "^1.0.9" + +"bson@^4.7.0": + "integrity" "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==" + "resolved" "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz" + "version" "4.7.2" + dependencies: + "buffer" "^5.6.0" + +"buffer-equal-constant-time@1.0.1": + "integrity" "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + "resolved" "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" + "version" "1.0.1" + +"buffer-from@^1.0.0": + "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + "version" "1.1.2" + +"buffer@^5.6.0": + "integrity" "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==" + "resolved" "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + "version" "5.7.1" + dependencies: + "base64-js" "^1.3.1" + "ieee754" "^1.1.13" + +"busboy@^1.0.0": + "integrity" "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==" + "resolved" "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + "version" "1.6.0" + dependencies: + "streamsearch" "^1.1.0" + +"bytes@3.1.2": + "integrity" "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + "version" "3.1.2" + +"call-bind@^1.0.0": + "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" + "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "function-bind" "^1.1.1" + "get-intrinsic" "^1.0.2" + +"camelcase-css@^2.0.1": + "integrity" "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + "resolved" "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" + "version" "2.0.1" + +"camelcase@^5.0.0": + "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + "version" "5.3.1" + +"caniuse-lite@^1.0.30001400", "caniuse-lite@^1.0.30001426": + "integrity" "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==" + "resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz" + "version" "1.0.30001441" + +"chokidar@^3.5.2", "chokidar@^3.5.3": + "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==" + "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + "version" "3.5.3" + dependencies: + "anymatch" "~3.1.2" + "braces" "~3.0.2" + "glob-parent" "~5.1.2" + "is-binary-path" "~2.1.0" + "is-glob" "~4.0.1" + "normalize-path" "~3.0.0" + "readdirp" "~3.6.0" + optionalDependencies: + "fsevents" "~2.3.2" + +"chownr@^2.0.0": + "integrity" "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + "resolved" "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + "version" "2.0.0" + +"cliui@^6.0.0": + "integrity" "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==" + "resolved" "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "string-width" "^4.2.0" + "strip-ansi" "^6.0.0" + "wrap-ansi" "^6.2.0" + +"cluster-key-slot@1.1.2": + "integrity" "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" + "resolved" "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz" + "version" "1.1.2" + +"color-convert@^2.0.1": + "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "color-name" "~1.1.4" + +"color-name@^1.0.0", "color-name@^1.1.4", "color-name@~1.1.4": + "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + "version" "1.1.4" + +"color-string@^1.9.0": + "integrity" "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==" + "resolved" "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + "version" "1.9.1" + dependencies: + "color-name" "^1.0.0" + "simple-swizzle" "^0.2.2" + +"color-support@^1.1.2": + "integrity" "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + "resolved" "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz" + "version" "1.1.3" + +"color@^4.2": + "integrity" "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==" + "resolved" "https://registry.npmjs.org/color/-/color-4.2.3.tgz" + "version" "4.2.3" + dependencies: + "color-convert" "^2.0.1" + "color-string" "^1.9.0" + +"combined-stream@^1.0.8": + "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" + "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + "version" "1.0.8" + dependencies: + "delayed-stream" "~1.0.0" + +"commander@^2.20.3": + "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + "version" "2.20.3" + +"concat-map@0.0.1": + "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" + +"concat-stream@^1.5.2": + "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==" + "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + "version" "1.6.2" + dependencies: + "buffer-from" "^1.0.0" + "inherits" "^2.0.3" + "readable-stream" "^2.2.2" + "typedarray" "^0.0.6" + +"connect-flash@^0.1.1": + "integrity" "sha512-2rcfELQt/ZMP+SM/pG8PyhJRaLKp+6Hk2IUBNkEit09X+vwn3QsAL3ZbYtxUn7NVPzbMTSLRDhqe0B/eh30RYA==" + "resolved" "https://registry.npmjs.org/connect-flash/-/connect-flash-0.1.1.tgz" + "version" "0.1.1" + +"console-control-strings@^1.0.0", "console-control-strings@^1.1.0": + "integrity" "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "resolved" "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + "version" "1.1.0" + +"content-disposition@0.5.4": + "integrity" "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==" + "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + "version" "0.5.4" + dependencies: + "safe-buffer" "5.2.1" + +"content-type@~1.0.4": + "integrity" "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "resolved" "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + "version" "1.0.4" + +"cookie-parser@^1.4.6": + "integrity" "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==" + "resolved" "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz" + "version" "1.4.6" + dependencies: + "cookie" "0.4.1" + "cookie-signature" "1.0.6" + +"cookie-signature@1.0.6": + "integrity" "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "resolved" "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + "version" "1.0.6" + +"cookie@0.4.1": + "integrity" "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz" + "version" "0.4.1" + +"cookie@0.4.2": + "integrity" "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + "version" "0.4.2" + +"cookie@0.5.0": + "integrity" "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + "version" "0.5.0" + +"core-util-is@~1.0.0": + "integrity" "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + "version" "1.0.3" + +"cors@^2.8.5": + "integrity" "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==" + "resolved" "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + "version" "2.8.5" + dependencies: + "object-assign" "^4" + "vary" "^1" + +"cross-env@^7.0.3": + "integrity" "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==" + "resolved" "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz" + "version" "7.0.3" + dependencies: + "cross-spawn" "^7.0.1" + +"cross-spawn@^7.0.1": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + "version" "7.0.3" + dependencies: + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" + +"crypto-js@^4.0.0": + "integrity" "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + "resolved" "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz" + "version" "4.1.1" + +"css-selector-tokenizer@^0.8.0": + "integrity" "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==" + "resolved" "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz" + "version" "0.8.0" + dependencies: + "cssesc" "^3.0.0" + "fastparse" "^1.1.2" + +"cssesc@^3.0.0": + "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + "version" "3.0.0" + +"cssfilter@0.0.10": + "integrity" "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==" + "resolved" "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz" + "version" "0.0.10" + +"daisyui@^2.24.2": + "integrity" "sha512-i59+nLuzzPAVOhNhot3KLtt6stfYeCIPXs9uiLcpXjykpqxHfBA3W6hQWOUWPMwfqhyQd0WKub3sydtPGjzLtA==" + "resolved" "https://registry.npmjs.org/daisyui/-/daisyui-2.46.1.tgz" + "version" "2.46.1" + dependencies: + "color" "^4.2" + "css-selector-tokenizer" "^0.8.0" + "postcss-js" "^4.0.0" + "tailwindcss" "^3" + +"data-uri-to-buffer@^4.0.0": + "integrity" "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" + "resolved" "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz" + "version" "4.0.0" + +"debug@^3.2.7": + "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + "version" "3.2.7" + dependencies: + "ms" "^2.1.1" + +"debug@2.6.9": + "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + "version" "2.6.9" + dependencies: + "ms" "2.0.0" + +"debug@4.x": + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" + dependencies: + "ms" "2.1.2" + +"debug@4": + "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + "version" "4.3.4" + dependencies: + "ms" "2.1.2" + +"decamelize@^1.2.0": + "integrity" "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + "version" "1.2.0" + +"defined@^1.0.0": + "integrity" "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" + "resolved" "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz" + "version" "1.0.1" + +"delayed-stream@~1.0.0": + "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + "version" "1.0.0" + +"delegates@^1.0.0": + "integrity" "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "resolved" "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + "version" "1.0.0" + +"depd@~2.0.0", "depd@2.0.0": + "integrity" "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + "resolved" "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + "version" "2.0.0" + +"destroy@1.2.0": + "integrity" "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + "resolved" "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + "version" "1.2.0" + +"detect-libc@^2.0.0": + "integrity" "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + "resolved" "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz" + "version" "2.0.1" + +"detective@^5.2.1": + "integrity" "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==" + "resolved" "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz" + "version" "5.2.1" + dependencies: + "acorn-node" "^1.8.2" + "defined" "^1.0.0" + "minimist" "^1.2.6" + +"didyoumean@^1.2.2": + "integrity" "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + "resolved" "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + "version" "1.2.2" + +"dijkstrajs@^1.0.1": + "integrity" "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + "resolved" "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz" + "version" "1.0.2" + +"dlv@^1.1.3": + "integrity" "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + "resolved" "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + "version" "1.1.3" + +"dotenv@^16.0.1": + "integrity" "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" + "version" "16.0.3" + +"easy-soap-request@^4.8.0": + "integrity" "sha512-fD1NXRv14P4IdAoyYpGJ2kB+292vYfvU7qLbmUw2x2HA+U74LWVyErjyNf2Jxn1mUAwp+sRdMlkmrUrPY0/wAg==" + "resolved" "https://registry.npmjs.org/easy-soap-request/-/easy-soap-request-4.8.0.tgz" + "version" "4.8.0" + dependencies: + "axios" "^0.27.2" + +"ecdsa-sig-formatter@1.0.11": + "integrity" "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==" + "resolved" "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" + "version" "1.0.11" + dependencies: + "safe-buffer" "^5.0.1" + +"ee-first@1.1.1": + "integrity" "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + "version" "1.1.1" + +"electron-to-chromium@^1.4.251": + "integrity" "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + "resolved" "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" + "version" "1.4.284" + +"emoji-regex@^8.0.0": + "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + "version" "8.0.0" + +"encode-utf8@^1.0.3": + "integrity" "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" + "resolved" "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz" + "version" "1.0.3" + +"encodeurl@~1.0.2": + "integrity" "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + "version" "1.0.2" + +"esbuild@0.17.4": + "integrity" "sha512-zBn9MeCwT7W5F1a3lXClD61ip6vQM+H8Msb0w8zMT4ZKBpDg+rFAraNyWCDelB/2L6M3g6AXHPnsyvjMFnxtFw==" + "resolved" "https://registry.npmjs.org/esbuild/-/esbuild-0.17.4.tgz" + "version" "0.17.4" + optionalDependencies: + "@esbuild/android-arm" "0.17.4" + "@esbuild/android-arm64" "0.17.4" + "@esbuild/android-x64" "0.17.4" + "@esbuild/darwin-arm64" "0.17.4" + "@esbuild/darwin-x64" "0.17.4" + "@esbuild/freebsd-arm64" "0.17.4" + "@esbuild/freebsd-x64" "0.17.4" + "@esbuild/linux-arm" "0.17.4" + "@esbuild/linux-arm64" "0.17.4" + "@esbuild/linux-ia32" "0.17.4" + "@esbuild/linux-loong64" "0.17.4" + "@esbuild/linux-mips64el" "0.17.4" + "@esbuild/linux-ppc64" "0.17.4" + "@esbuild/linux-riscv64" "0.17.4" + "@esbuild/linux-s390x" "0.17.4" + "@esbuild/linux-x64" "0.17.4" + "@esbuild/netbsd-x64" "0.17.4" + "@esbuild/openbsd-x64" "0.17.4" + "@esbuild/sunos-x64" "0.17.4" + "@esbuild/win32-arm64" "0.17.4" + "@esbuild/win32-ia32" "0.17.4" + "@esbuild/win32-x64" "0.17.4" + +"escalade@^3.1.1": + "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + "version" "3.1.1" + +"escape-html@~1.0.3": + "integrity" "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + "version" "1.0.3" + +"etag@~1.8.1": + "integrity" "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + "version" "1.8.1" + +"express-flash-message@^2.1.0": + "integrity" "sha512-oR/cwzt7CfjSUt7XwEZCCyOegylHuTF8/by6+jAshZh2TzREqDIjfU0JU5M6usurSk/ep3lUxxyaCbujyERyTQ==" + "resolved" "https://registry.npmjs.org/express-flash-message/-/express-flash-message-2.1.0.tgz" + "version" "2.1.0" + +"express-prom-bundle@^6.5.0": + "integrity" "sha512-tZh2P2p5a8/yxQ5VbRav011Poa4R0mHqdFwn9Swe/obXDe5F0jY9wtRAfNYnqk4LXY7akyvR/nrvAHxQPWUjsQ==" + "resolved" "https://registry.npmjs.org/express-prom-bundle/-/express-prom-bundle-6.6.0.tgz" + "version" "6.6.0" + dependencies: + "on-finished" "^2.3.0" + "url-value-parser" "^2.0.0" + +"express-rate-limit@^6.7.0": + "integrity" "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==" + "resolved" "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz" + "version" "6.7.0" + +"express-session@^1.17.3": + "integrity" "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==" + "resolved" "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz" + "version" "1.17.3" + dependencies: + "cookie" "0.4.2" + "cookie-signature" "1.0.6" + "debug" "2.6.9" + "depd" "~2.0.0" + "on-headers" "~1.0.2" + "parseurl" "~1.3.3" + "safe-buffer" "5.2.1" + "uid-safe" "~2.1.5" + +"express@^4 || ^5", "express@^4.18.1": + "integrity" "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==" + "resolved" "https://registry.npmjs.org/express/-/express-4.18.2.tgz" + "version" "4.18.2" + dependencies: + "accepts" "~1.3.8" + "array-flatten" "1.1.1" + "body-parser" "1.20.1" + "content-disposition" "0.5.4" + "content-type" "~1.0.4" + "cookie" "0.5.0" + "cookie-signature" "1.0.6" + "debug" "2.6.9" + "depd" "2.0.0" + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "etag" "~1.8.1" + "finalhandler" "1.2.0" + "fresh" "0.5.2" + "http-errors" "2.0.0" + "merge-descriptors" "1.0.1" + "methods" "~1.1.2" + "on-finished" "2.4.1" + "parseurl" "~1.3.3" + "path-to-regexp" "0.1.7" + "proxy-addr" "~2.0.7" + "qs" "6.11.0" + "range-parser" "~1.2.1" + "safe-buffer" "5.2.1" + "send" "0.18.0" + "serve-static" "1.15.0" + "setprototypeof" "1.2.0" + "statuses" "2.0.1" + "type-is" "~1.6.18" + "utils-merge" "1.0.1" + "vary" "~1.1.2" + +"fast-glob@^3.2.12": + "integrity" "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==" + "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + "version" "3.2.12" + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + "glob-parent" "^5.1.2" + "merge2" "^1.3.0" + "micromatch" "^4.0.4" + +"fast-xml-parser@4.0.11": + "integrity" "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==" + "resolved" "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz" + "version" "4.0.11" + dependencies: + "strnum" "^1.0.5" + +"fastparse@^1.1.2": + "integrity" "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + "resolved" "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz" + "version" "1.1.2" + +"fastq@^1.6.0": + "integrity" "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==" + "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + "version" "1.15.0" + dependencies: + "reusify" "^1.0.4" + +"fetch-blob@^3.1.2", "fetch-blob@^3.1.4": + "integrity" "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==" + "resolved" "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" + "version" "3.2.0" + dependencies: + "node-domexception" "^1.0.0" + "web-streams-polyfill" "^3.0.3" + +"file-type-checker@^1.0.4": + "integrity" "sha512-hhleilG34kfSjlSfAAj8DVvqXxMwEIVY/pkWnkMVbqdmly6jUv7jjNw/dmvdcbMt6joXlQgavCJCtNDRzODOsQ==" + "resolved" "https://registry.npmjs.org/file-type-checker/-/file-type-checker-1.0.4.tgz" + "version" "1.0.4" + +"fill-range@^7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "to-regex-range" "^5.0.1" + +"finalhandler@1.2.0": + "integrity" "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==" + "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "debug" "2.6.9" + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "on-finished" "2.4.1" + "parseurl" "~1.3.3" + "statuses" "2.0.1" + "unpipe" "~1.0.0" + +"find-up@^4.1.0": + "integrity" "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "locate-path" "^5.0.0" + "path-exists" "^4.0.0" + +"follow-redirects@^1.14.9": + "integrity" "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + "version" "1.15.2" + +"form-data@^4.0.0": + "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" + "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "asynckit" "^0.4.0" + "combined-stream" "^1.0.8" + "mime-types" "^2.1.12" + +"formdata-polyfill@^4.0.10": + "integrity" "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==" + "resolved" "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" + "version" "4.0.10" + dependencies: + "fetch-blob" "^3.1.2" + +"forwarded@0.2.0": + "integrity" "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + "resolved" "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + "version" "0.2.0" + +"fraction.js@^4.2.0": + "integrity" "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" + "resolved" "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + "version" "4.2.0" + +"fresh@0.5.2": + "integrity" "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + "version" "0.5.2" + +"fs-memo@^1.2.0": + "integrity" "sha512-YEexkCpL4j03jn5SxaMHqcO6IuWuqm8JFUYhyCep7Ao89JIYmB8xoKhK7zXXJ9cCaNXpyNH5L3QtAmoxjoHW2w==" + "resolved" "https://registry.npmjs.org/fs-memo/-/fs-memo-1.2.0.tgz" + "version" "1.2.0" + +"fs-minipass@^2.0.0": + "integrity" "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==" + "resolved" "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "minipass" "^3.0.0" + +"fs.realpath@^1.0.0": + "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"function-bind@^1.1.1": + "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + "version" "1.1.1" + +"gauge@^3.0.0": + "integrity" "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==" + "resolved" "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "aproba" "^1.0.3 || ^2.0.0" + "color-support" "^1.1.2" + "console-control-strings" "^1.0.0" + "has-unicode" "^2.0.1" + "object-assign" "^4.1.1" + "signal-exit" "^3.0.0" + "string-width" "^4.2.3" + "strip-ansi" "^6.0.1" + "wide-align" "^1.1.2" + +"generic-pool@3.9.0": + "integrity" "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==" + "resolved" "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz" + "version" "3.9.0" + +"get-caller-file@^2.0.1": + "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + "version" "2.0.5" + +"get-intrinsic@^1.0.2": + "integrity" "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==" + "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "function-bind" "^1.1.1" + "has" "^1.0.3" + "has-symbols" "^1.0.3" + +"get-port-please@^2.6.1": + "integrity" "sha512-4PDSrL6+cuMM1xs6w36ZIkaKzzE0xzfVBCfebHIJ3FE8iB9oic/ECwPw3iNiD4h1AoJ5XLLBhEviFAVrZsDC5A==" + "resolved" "https://registry.npmjs.org/get-port-please/-/get-port-please-2.6.1.tgz" + "version" "2.6.1" + dependencies: + "fs-memo" "^1.2.0" + +"get-port@^6.1.2": + "integrity" "sha512-BrGGraKm2uPqurfGVj/z97/zv8dPleC6x9JBNRTrDNtCkkRF4rPwrQXFgL7+I+q8QSdU4ntLQX2D7KIxSy8nGw==" + "resolved" "https://registry.npmjs.org/get-port/-/get-port-6.1.2.tgz" + "version" "6.1.2" + +"glob-parent@^5.1.2", "glob-parent@~5.1.2": + "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "is-glob" "^4.0.1" + +"glob-parent@^6.0.2": + "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + "version" "6.0.2" + dependencies: + "is-glob" "^4.0.3" + +"glob@^7.1.3": + "integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + "version" "7.2.3" + 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" + +"has-flag@^3.0.0": + "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" + +"has-symbols@^1.0.3": + "integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + "version" "1.0.3" + +"has-unicode@^2.0.1": + "integrity" "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "resolved" "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + "version" "2.0.1" + +"has@^1.0.3": + "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" + "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "function-bind" "^1.1.1" + +"helmet@^5.1.1": + "integrity" "sha512-/yX0oVZBggA9cLJh8aw3PPCfedBnbd7J2aowjzsaWwZh7/UFY0nccn/aHAggIgWUFfnykX8GKd3a1pSbrmlcVQ==" + "resolved" "https://registry.npmjs.org/helmet/-/helmet-5.1.1.tgz" + "version" "5.1.1" + +"http-errors@2.0.0": + "integrity" "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==" + "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "depd" "2.0.0" + "inherits" "2.0.4" + "setprototypeof" "1.2.0" + "statuses" "2.0.1" + "toidentifier" "1.0.1" + +"https-proxy-agent@^5.0.0": + "integrity" "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==" + "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "agent-base" "6" + "debug" "4" + +"iconv-lite@0.4.24": + "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" + "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + "version" "0.4.24" + dependencies: + "safer-buffer" ">= 2.1.2 < 3" + +"ieee754@^1.1.13": + "integrity" "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + "version" "1.2.1" + +"ignore-by-default@^1.0.1": + "integrity" "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + "resolved" "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz" + "version" "1.0.1" + +"inflight@^1.0.4": + "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" + "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "once" "^1.3.0" + "wrappy" "1" + +"inherits@^2.0.3", "inherits@~2.0.3", "inherits@2", "inherits@2.0.4": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" + +"ip@^2.0.0": + "integrity" "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "resolved" "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz" + "version" "2.0.0" + +"ipaddr.js@1.9.1": + "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + "resolved" "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + "version" "1.9.1" + +"is-arrayish@^0.3.1": + "integrity" "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + "version" "0.3.2" + +"is-binary-path@~2.1.0": + "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "binary-extensions" "^2.0.0" + +"is-core-module@^2.9.0": + "integrity" "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==" + "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + "version" "2.11.0" + dependencies: + "has" "^1.0.3" + +"is-extglob@^2.1.1": + "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" + +"is-fullwidth-code-point@^3.0.0": + "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + "version" "3.0.0" + +"is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1": + "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "is-extglob" "^2.1.1" + +"is-number@^7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" + +"isarray@~1.0.0": + "integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "version" "1.0.0" + +"isexe@^2.0.0": + "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" + +"jsonpath-plus@^7.2.0": + "integrity" "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==" + "resolved" "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz" + "version" "7.2.0" + +"jsonwebtoken@^9.0.0": + "integrity" "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==" + "resolved" "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz" + "version" "9.0.0" + dependencies: + "jws" "^3.2.2" + "lodash" "^4.17.21" + "ms" "^2.1.1" + "semver" "^7.3.8" + +"just-clone@^6.1.1": + "integrity" "sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==" + "resolved" "https://registry.npmjs.org/just-clone/-/just-clone-6.2.0.tgz" + "version" "6.2.0" + +"jwa@^1.4.1": + "integrity" "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==" + "resolved" "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" + "version" "1.4.1" + dependencies: + "buffer-equal-constant-time" "1.0.1" + "ecdsa-sig-formatter" "1.0.11" + "safe-buffer" "^5.0.1" + +"jws@^3.2.2": + "integrity" "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==" + "resolved" "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" + "version" "3.2.2" + dependencies: + "jwa" "^1.4.1" + "safe-buffer" "^5.0.1" + +"kareem@2.5.1": + "integrity" "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==" + "resolved" "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz" + "version" "2.5.1" + +"lilconfig@^2.0.5", "lilconfig@^2.0.6": + "integrity" "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==" + "resolved" "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz" + "version" "2.0.6" + +"locate-path@^5.0.0": + "integrity" "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==" + "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "p-locate" "^4.1.0" + +"lodash.foreach@^4.1.0": + "integrity" "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + "resolved" "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz" + "version" "4.5.0" + +"lodash.get@^4.0.2": + "integrity" "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + "resolved" "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" + "version" "4.4.2" + +"lodash.merge@^4.6.2": + "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + "version" "4.6.2" + +"lodash@^4.17.21": + "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + "version" "4.17.21" + +"lru-cache@^6.0.0": + "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "yallist" "^4.0.0" + +"make-dir@^3.1.0": + "integrity" "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==" + "resolved" "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "semver" "^6.0.0" + +"media-typer@0.3.0": + "integrity" "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + "resolved" "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + "version" "0.3.0" + +"memory-pager@^1.0.2": + "integrity" "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + "resolved" "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz" + "version" "1.5.0" + +"merge-descriptors@1.0.1": + "integrity" "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "resolved" "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + "version" "1.0.1" + +"merge2@^1.3.0": + "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + "version" "1.4.1" + +"methods@~1.1.2": + "integrity" "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + "resolved" "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + "version" "1.1.2" + +"micromatch@^4.0.4", "micromatch@^4.0.5": + "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" + "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + "version" "4.0.5" + dependencies: + "braces" "^3.0.2" + "picomatch" "^2.3.1" + +"mime-db@1.52.0": + "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + "version" "1.52.0" + +"mime-types@^2.1.12", "mime-types@~2.1.24", "mime-types@~2.1.34": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"mime@1.6.0": + "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + "version" "1.6.0" + +"minimatch@^3.1.1": + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "brace-expansion" "^1.1.7" + +"minimatch@^3.1.2": + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "brace-expansion" "^1.1.7" + +"minimist@^1.2.6": + "integrity" "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" + "version" "1.2.7" + +"minipass@^3.0.0": + "integrity" "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==" + "resolved" "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + "version" "3.3.6" + dependencies: + "yallist" "^4.0.0" + +"minipass@^4.0.0": + "integrity" "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==" + "resolved" "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "yallist" "^4.0.0" + +"minizlib@^2.1.1": + "integrity" "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==" + "resolved" "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + "version" "2.1.2" + dependencies: + "minipass" "^3.0.0" + "yallist" "^4.0.0" + +"mkdirp@^0.5.4": + "integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + "version" "0.5.6" + dependencies: + "minimist" "^1.2.6" + +"mkdirp@^1.0.3": + "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + "version" "1.0.4" + +"mongo-sanitize@^1.1.0": + "integrity" "sha512-6gB9AiJD+om2eZLxaPKIP5Q8P3Fr+s+17rVWso7hU0+MAzmIvIMlgTYuyvalDLTtE/p0gczcvJ8A3pbN1XmQ/A==" + "resolved" "https://registry.npmjs.org/mongo-sanitize/-/mongo-sanitize-1.1.0.tgz" + "version" "1.1.0" + +"mongodb-connection-string-url@^2.5.4": + "integrity" "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==" + "resolved" "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz" + "version" "2.6.0" + dependencies: + "@types/whatwg-url" "^8.2.1" + "whatwg-url" "^11.0.0" + +"mongodb@4.13.0": + "integrity" "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==" + "resolved" "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz" + "version" "4.13.0" + dependencies: + "bson" "^4.7.0" + "mongodb-connection-string-url" "^2.5.4" + "socks" "^2.7.1" + optionalDependencies: + "@aws-sdk/credential-providers" "^3.186.0" + "saslprep" "^1.0.3" + +"mongoose-unique-validator@^3.1.0": + "integrity" "sha512-UsBBlFapip8gc8x1h+nLWnkOy+GTy9Z+zmTyZ35icLV3EoLIVz180vJzepfMM9yBy2AJh+maeuoM8CWtqejGUg==" + "resolved" "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "lodash.foreach" "^4.1.0" + "lodash.get" "^4.0.2" + "lodash.merge" "^4.6.2" + +"mongoose@^6.0.0", "mongoose@^6.5.2": + "integrity" "sha512-hOz1ZWV0w6WEVLrj89Wpk7PXDYtDDF6k7/NX79lY5iKqeFtZsceBXW8xW59YFNcW5O3cH32hQ8IbDlhgyBsDMA==" + "resolved" "https://registry.npmjs.org/mongoose/-/mongoose-6.9.1.tgz" + "version" "6.9.1" + dependencies: + "bson" "^4.7.0" + "kareem" "2.5.1" + "mongodb" "4.13.0" + "mpath" "0.9.0" + "mquery" "4.0.3" + "ms" "2.1.3" + "sift" "16.0.1" + +"mpath@0.9.0": + "integrity" "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" + "resolved" "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz" + "version" "0.9.0" + +"mquery@4.0.3": + "integrity" "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==" + "resolved" "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "debug" "4.x" + +"ms@^2.1.1": + "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + "version" "2.1.3" + +"ms@2.0.0": + "integrity" "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + "version" "2.0.0" + +"ms@2.1.2": + "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + "version" "2.1.2" + +"ms@2.1.3": + "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + "version" "2.1.3" + +"multer@^1.4.5-lts.1": + "integrity" "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==" + "resolved" "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz" + "version" "1.4.5-lts.1" + dependencies: + "append-field" "^1.0.0" + "busboy" "^1.0.0" + "concat-stream" "^1.5.2" + "mkdirp" "^0.5.4" + "object-assign" "^4.1.1" + "type-is" "^1.6.4" + "xtend" "^4.0.0" + +"nanoid@^3.3.4": + "integrity" "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + "version" "3.3.4" + +"negotiator@0.6.3": + "integrity" "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + "version" "0.6.3" + +"node-addon-api@^5.0.0": + "integrity" "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + "resolved" "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz" + "version" "5.0.0" + +"node-domexception@^1.0.0": + "integrity" "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" + "resolved" "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" + "version" "1.0.0" + +"node-fetch@^2.6.7": + "integrity" "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==" + "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" + "version" "2.6.9" + dependencies: + "whatwg-url" "^5.0.0" + +"node-fetch@^3.2.10": + "integrity" "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==" + "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "data-uri-to-buffer" "^4.0.0" + "fetch-blob" "^3.1.4" + "formdata-polyfill" "^4.0.10" + +"node-releases@^2.0.6": + "integrity" "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" + "resolved" "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz" + "version" "2.0.8" + +"nodemon@^2.0.19": + "integrity" "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==" + "resolved" "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz" + "version" "2.0.20" + dependencies: + "chokidar" "^3.5.2" + "debug" "^3.2.7" + "ignore-by-default" "^1.0.1" + "minimatch" "^3.1.2" + "pstree.remy" "^1.1.8" + "semver" "^5.7.1" + "simple-update-notifier" "^1.0.7" + "supports-color" "^5.5.0" + "touch" "^3.1.0" + "undefsafe" "^2.0.5" + +"nopt@^5.0.0": + "integrity" "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==" + "resolved" "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "abbrev" "1" + +"nopt@~1.0.10": + "integrity" "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==" + "resolved" "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "abbrev" "1" + +"normalize-path@^3.0.0", "normalize-path@~3.0.0": + "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + "version" "3.0.0" + +"normalize-range@^0.1.2": + "integrity" "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + "resolved" "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + "version" "0.1.2" + +"npmlog@^5.0.1": + "integrity" "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==" + "resolved" "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "are-we-there-yet" "^2.0.0" + "console-control-strings" "^1.1.0" + "gauge" "^3.0.0" + "set-blocking" "^2.0.0" + +"object-assign@^4", "object-assign@^4.1.1": + "integrity" "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "version" "4.1.1" + +"object-hash@^3.0.0": + "integrity" "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + "resolved" "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + "version" "3.0.0" + +"object-inspect@^1.9.0": + "integrity" "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz" + "version" "1.12.2" + +"on-finished@^2.3.0", "on-finished@2.4.1": + "integrity" "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==" + "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + "version" "2.4.1" + dependencies: + "ee-first" "1.1.1" + +"on-headers@~1.0.2": + "integrity" "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + "resolved" "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + "version" "1.0.2" + +"once@^1.3.0": + "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "wrappy" "1" + +"p-limit@^2.2.0": + "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + "version" "2.3.0" + dependencies: + "p-try" "^2.0.0" + +"p-locate@^4.1.0": + "integrity" "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==" + "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "p-limit" "^2.2.0" + +"p-try@^2.0.0": + "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + "version" "2.2.0" + +"parseurl@~1.3.3": + "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "resolved" "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + "version" "1.3.3" + +"path-exists@^4.0.0": + "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + "version" "4.0.0" + +"path-is-absolute@^1.0.0": + "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" + +"path-key@^3.1.0": + "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" + +"path-parse@^1.0.7": + "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + "version" "1.0.7" + +"path-to-regexp@0.1.7": + "integrity" "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + "version" "0.1.7" + +"picocolors@^1.0.0": + "integrity" "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "resolved" "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + "version" "1.0.0" + +"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1": + "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + "version" "2.3.1" + +"pify@^2.3.0": + "integrity" "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + "version" "2.3.0" + +"png-validator@^1.1.0": + "integrity" "sha512-MlRLyPI1p3/dJbsjVH+4xOPucycrz8T3EvO0BzCXaNtrUhZkZROtzib9J6mnC81AJO8eBIwiDZwTFel2cMmSuQ==" + "resolved" "https://registry.npmjs.org/png-validator/-/png-validator-1.1.0.tgz" + "version" "1.1.0" + +"pngjs@^5.0.0": + "integrity" "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==" + "resolved" "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz" + "version" "5.0.0" + +"postcss-import@^14.1.0": + "integrity" "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==" + "resolved" "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz" + "version" "14.1.0" + dependencies: + "postcss-value-parser" "^4.0.0" + "read-cache" "^1.0.0" + "resolve" "^1.1.7" + +"postcss-js@^4.0.0": + "integrity" "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==" + "resolved" "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "camelcase-css" "^2.0.1" + +"postcss-load-config@^3.1.4": + "integrity" "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==" + "resolved" "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" + "version" "3.1.4" + dependencies: + "lilconfig" "^2.0.5" + "yaml" "^1.10.2" + +"postcss-nested@6.0.0": + "integrity" "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==" + "resolved" "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "postcss-selector-parser" "^6.0.10" + +"postcss-selector-parser@^6.0.10": + "integrity" "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==" + "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" + "version" "6.0.10" + dependencies: + "cssesc" "^3.0.0" + "util-deprecate" "^1.0.2" + +"postcss-value-parser@^4.0.0", "postcss-value-parser@^4.2.0": + "integrity" "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "resolved" "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + "version" "4.2.0" + +"postcss@^8.0.0", "postcss@^8.1.0", "postcss@^8.1.6", "postcss@^8.2.14", "postcss@^8.3.3", "postcss@^8.4.18", "postcss@>=8.0.9": + "integrity" "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==" + "resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz" + "version" "8.4.20" + dependencies: + "nanoid" "^3.3.4" + "picocolors" "^1.0.0" + "source-map-js" "^1.0.2" + +"process-nextick-args@~2.0.0": + "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + "version" "2.0.1" + +"prom-client@^14.1.0", "prom-client@>=12.0.0": + "integrity" "sha512-hFU32q7UZQ59bVJQGUtm3I2PrJ3gWvoCkilX9sF165ks1qflhugVCeK+S1JjJYHvyt3o5kj68+q3bchormjnzw==" + "resolved" "https://registry.npmjs.org/prom-client/-/prom-client-14.1.1.tgz" + "version" "14.1.1" + dependencies: + "tdigest" "^0.1.1" + +"proxy-addr@~2.0.7": + "integrity" "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==" + "resolved" "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + "version" "2.0.7" + dependencies: + "forwarded" "0.2.0" + "ipaddr.js" "1.9.1" + +"pstree.remy@^1.1.8": + "integrity" "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + "resolved" "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz" + "version" "1.1.8" + +"punycode@^2.1.1": + "integrity" "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + "version" "2.3.0" + +"qrcode@^1.5.1": + "integrity" "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==" + "resolved" "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz" + "version" "1.5.1" + dependencies: + "dijkstrajs" "^1.0.1" + "encode-utf8" "^1.0.3" + "pngjs" "^5.0.0" + "yargs" "^15.3.1" + +"qs@6.11.0": + "integrity" "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==" + "resolved" "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + "version" "6.11.0" + dependencies: + "side-channel" "^1.0.4" + +"queue-microtask@^1.2.2": + "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + "version" "1.2.3" + +"quick-lru@^5.1.1": + "integrity" "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + "resolved" "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + "version" "5.1.1" + +"random-bytes@~1.0.0": + "integrity" "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==" + "resolved" "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" + "version" "1.0.0" + +"range-parser@~1.2.1": + "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + "version" "1.2.1" + +"raw-body@2.5.1": + "integrity" "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==" + "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + "version" "2.5.1" + dependencies: + "bytes" "3.1.2" + "http-errors" "2.0.0" + "iconv-lite" "0.4.24" + "unpipe" "1.0.0" + +"read-cache@^1.0.0": + "integrity" "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==" + "resolved" "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "pify" "^2.3.0" + +"readable-stream@^2.2.2": + "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + "version" "2.3.7" + dependencies: + "core-util-is" "~1.0.0" + "inherits" "~2.0.3" + "isarray" "~1.0.0" + "process-nextick-args" "~2.0.0" + "safe-buffer" "~5.1.1" + "string_decoder" "~1.1.1" + "util-deprecate" "~1.0.1" + +"readable-stream@^3.6.0": + "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + "version" "3.6.0" + dependencies: + "inherits" "^2.0.3" + "string_decoder" "^1.1.1" + "util-deprecate" "^1.0.1" + +"readdirp@~3.6.0": + "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" + "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + "version" "3.6.0" + dependencies: + "picomatch" "^2.2.1" + +"redis-om@^0.4.0-beta.3": + "integrity" "sha512-zGWBMGoe3exrvkbFjWqAFG8UJL3tdby5UkfPKiZLvA67d7FsR0ScEpsBaaWGL33y5EQUWnYL+pI8jzZaQ6brtA==" + "resolved" "https://registry.npmjs.org/redis-om/-/redis-om-0.4.0-beta.3.tgz" + "version" "0.4.0-beta.3" + dependencies: + "jsonpath-plus" "^7.2.0" + "just-clone" "^6.1.1" + "redis" "^4.6.4" + "ulid" "^2.3.0" + +"redis@^4.6.4", "redis@^4.6.5": + "integrity" "sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg==" + "resolved" "https://registry.npmjs.org/redis/-/redis-4.6.5.tgz" + "version" "4.6.5" + dependencies: + "@redis/bloom" "1.2.0" + "@redis/client" "1.5.6" + "@redis/graph" "1.1.0" + "@redis/json" "1.0.4" + "@redis/search" "1.1.2" + "@redis/time-series" "1.0.4" + +"req-flash@^0.0.3": + "integrity" "sha512-c5ouPRJ6OVc4ecL5cgdwd51nYOFQiOTfl7UWk+VlgUHgfsh7TMRFPN/OJ5ETnOYFyswprT8C2a6ctMvJgms9ng==" + "resolved" "https://registry.npmjs.org/req-flash/-/req-flash-0.0.3.tgz" + "version" "0.0.3" + +"require-directory@^2.1.1": + "integrity" "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + "version" "2.1.1" + +"require-main-filename@^2.0.0": + "integrity" "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + "version" "2.0.0" + +"resolve@^1.1.7", "resolve@^1.22.1": + "integrity" "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==" + "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + "version" "1.22.1" + dependencies: + "is-core-module" "^2.9.0" + "path-parse" "^1.0.7" + "supports-preserve-symlinks-flag" "^1.0.0" + +"reusify@^1.0.4": + "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + "version" "1.0.4" + +"rimraf@^3.0.2": + "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "glob" "^7.1.3" + +"run-parallel@^1.1.9": + "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" + "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "queue-microtask" "^1.2.2" + +"safe-buffer@^5.0.1", "safe-buffer@5.2.1": + "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + "version" "5.2.1" + +"safe-buffer@~5.1.0": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"safe-buffer@~5.1.1": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"safer-buffer@>= 2.1.2 < 3": + "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + "version" "2.1.2" + +"saslprep@^1.0.3": + "integrity" "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==" + "resolved" "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "sparse-bitfield" "^3.0.3" + +"sax@^1.2.4": + "integrity" "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "resolved" "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + "version" "1.2.4" + +"semver@^5.7.1": + "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + "version" "5.7.1" + +"semver@^6.0.0": + "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + "version" "6.3.0" + +"semver@^7.3.5", "semver@^7.3.8": + "integrity" "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + "version" "7.3.8" + dependencies: + "lru-cache" "^6.0.0" + +"semver@~7.0.0": + "integrity" "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" + "version" "7.0.0" + +"send@0.18.0": + "integrity" "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==" + "resolved" "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + "version" "0.18.0" + dependencies: + "debug" "2.6.9" + "depd" "2.0.0" + "destroy" "1.2.0" + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "etag" "~1.8.1" + "fresh" "0.5.2" + "http-errors" "2.0.0" + "mime" "1.6.0" + "ms" "2.1.3" + "on-finished" "2.4.1" + "range-parser" "~1.2.1" + "statuses" "2.0.1" + +"serve-static@1.15.0": + "integrity" "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==" + "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + "version" "1.15.0" + dependencies: + "encodeurl" "~1.0.2" + "escape-html" "~1.0.3" + "parseurl" "~1.3.3" + "send" "0.18.0" + +"set-blocking@^2.0.0": + "integrity" "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + "version" "2.0.0" + +"setprototypeof@1.2.0": + "integrity" "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + "version" "1.2.0" + +"shebang-command@^2.0.0": + "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "shebang-regex" "^3.0.0" + +"shebang-regex@^3.0.0": + "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" + +"side-channel@^1.0.4": + "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" + "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "call-bind" "^1.0.0" + "get-intrinsic" "^1.0.2" + "object-inspect" "^1.9.0" + +"sift@16.0.1": + "integrity" "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + "resolved" "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz" + "version" "16.0.1" + +"signal-exit@^3.0.0": + "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + "version" "3.0.7" + +"simple-swizzle@^0.2.2": + "integrity" "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==" + "resolved" "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + "version" "0.2.2" + dependencies: + "is-arrayish" "^0.3.1" + +"simple-update-notifier@^1.0.7": + "integrity" "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==" + "resolved" "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "semver" "~7.0.0" + +"smart-buffer@^4.2.0": + "integrity" "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + "resolved" "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + "version" "4.2.0" + +"socks@^2.7.1": + "integrity" "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==" + "resolved" "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz" + "version" "2.7.1" + dependencies: + "ip" "^2.0.0" + "smart-buffer" "^4.2.0" + +"source-map-js@^1.0.2": + "integrity" "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + "resolved" "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + "version" "1.0.2" + +"sparse-bitfield@^3.0.3": + "integrity" "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==" + "resolved" "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz" + "version" "3.0.3" + dependencies: + "memory-pager" "^1.0.2" + +"speakeasy@^2.0.0": + "integrity" "sha512-lW2A2s5LKi8rwu77ewisuUOtlCydF/hmQSOJjpTqTj1gZLkNgTaYnyvfxy2WBr4T/h+9c4g8HIITfj83OkFQFw==" + "resolved" "https://registry.npmjs.org/speakeasy/-/speakeasy-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "base32.js" "0.0.1" + +"statuses@2.0.1": + "integrity" "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "resolved" "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + "version" "2.0.1" + +"streamsearch@^1.1.0": + "integrity" "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + "resolved" "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + "version" "1.1.0" + +"string_decoder@^1.1.1", "string_decoder@~1.1.1": + "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" + "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "safe-buffer" "~5.1.0" + +"string-width@^1.0.2 || 2 || 3 || 4", "string-width@^4.1.0", "string-width@^4.2.0", "string-width@^4.2.3": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" + dependencies: + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" + +"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": + "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + "version" "6.0.1" + dependencies: + "ansi-regex" "^5.0.1" + +"strnum@^1.0.5": + "integrity" "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + "resolved" "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" + "version" "1.0.5" + +"supports-color@^5.5.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" + dependencies: + "has-flag" "^3.0.0" + +"supports-preserve-symlinks-flag@^1.0.0": + "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + "version" "1.0.0" + +"tailwindcss@^3": + "integrity" "sha512-AhwtHCKMtR71JgeYDaswmZXhPcW9iuI9Sp2LvZPo9upDZ7231ZJ7eA9RaURbhpXGVlrjX4cFNlB4ieTetEb7hQ==" + "resolved" "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.4.tgz" + "version" "3.2.4" + dependencies: + "arg" "^5.0.2" + "chokidar" "^3.5.3" + "color-name" "^1.1.4" + "detective" "^5.2.1" + "didyoumean" "^1.2.2" + "dlv" "^1.1.3" + "fast-glob" "^3.2.12" + "glob-parent" "^6.0.2" + "is-glob" "^4.0.3" + "lilconfig" "^2.0.6" + "micromatch" "^4.0.5" + "normalize-path" "^3.0.0" + "object-hash" "^3.0.0" + "picocolors" "^1.0.0" + "postcss" "^8.4.18" + "postcss-import" "^14.1.0" + "postcss-js" "^4.0.0" + "postcss-load-config" "^3.1.4" + "postcss-nested" "6.0.0" + "postcss-selector-parser" "^6.0.10" + "postcss-value-parser" "^4.2.0" + "quick-lru" "^5.1.1" + "resolve" "^1.22.1" + +"tar@^6.1.11": + "integrity" "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==" + "resolved" "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" + "version" "6.1.13" + dependencies: + "chownr" "^2.0.0" + "fs-minipass" "^2.0.0" + "minipass" "^4.0.0" + "minizlib" "^2.1.1" + "mkdirp" "^1.0.3" + "yallist" "^4.0.0" + +"tdigest@^0.1.1": + "integrity" "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==" + "resolved" "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz" + "version" "0.1.2" + dependencies: + "bintrees" "1.0.2" + +"to-regex-range@^5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "is-number" "^7.0.0" + +"toidentifier@1.0.1": + "integrity" "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + "version" "1.0.1" + +"touch@^3.1.0": + "integrity" "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==" + "resolved" "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "nopt" "~1.0.10" + +"tr46@^3.0.0": + "integrity" "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==" + "resolved" "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "punycode" "^2.1.1" + +"tr46@~0.0.3": + "integrity" "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "resolved" "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + "version" "0.0.3" + +"tslib@^1.11.1": + "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + "version" "1.14.1" + +"tslib@^2.3.1": + "integrity" "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + "version" "2.5.0" + +"type-is@^1.6.4", "type-is@~1.6.18": + "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==" + "resolved" "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + "version" "1.6.18" + dependencies: + "media-typer" "0.3.0" + "mime-types" "~2.1.24" + +"typedarray@^0.0.6": + "integrity" "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + "version" "0.0.6" + +"uid-safe@~2.1.5": + "integrity" "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==" + "resolved" "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz" + "version" "2.1.5" + dependencies: + "random-bytes" "~1.0.0" + +"ulid@^2.3.0": + "integrity" "sha512-keqHubrlpvT6G2wH0OEfSW4mquYRcbe/J8NMmveoQOjUqmo+hXtO+ORCpWhdbZ7k72UtY61BL7haGxW6enBnjw==" + "resolved" "https://registry.npmjs.org/ulid/-/ulid-2.3.0.tgz" + "version" "2.3.0" + +"undefsafe@^2.0.5": + "integrity" "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + "resolved" "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz" + "version" "2.0.5" + +"unpipe@~1.0.0", "unpipe@1.0.0": + "integrity" "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + "version" "1.0.0" + +"update-browserslist-db@^1.0.9": + "integrity" "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==" + "resolved" "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "escalade" "^3.1.1" + "picocolors" "^1.0.0" + +"url-value-parser@^2.0.0": + "integrity" "sha512-yIQdxJpgkPamPPAPuGdS7Q548rLhny42tg8d4vyTNzFqvOnwqrgHXvgehT09U7fwrzxi3RxCiXjoNUNnNOlQ8A==" + "resolved" "https://registry.npmjs.org/url-value-parser/-/url-value-parser-2.2.0.tgz" + "version" "2.2.0" + +"util-deprecate@^1.0.1", "util-deprecate@^1.0.2", "util-deprecate@~1.0.1": + "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"utils-merge@1.0.1": + "integrity" "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "resolved" "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + "version" "1.0.1" + +"uuid@^8.3.2": + "integrity" "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + "version" "8.3.2" + +"vary@^1", "vary@~1.1.2": + "integrity" "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + "version" "1.1.2" + +"web-streams-polyfill@^3.0.3": + "integrity" "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + "resolved" "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz" + "version" "3.2.1" + +"webidl-conversions@^3.0.0": + "integrity" "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + "version" "3.0.1" + +"webidl-conversions@^7.0.0": + "integrity" "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + "version" "7.0.0" + +"whatwg-url@^11.0.0": + "integrity" "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==" + "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz" + "version" "11.0.0" + dependencies: + "tr46" "^3.0.0" + "webidl-conversions" "^7.0.0" + +"whatwg-url@^5.0.0": + "integrity" "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" + "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "tr46" "~0.0.3" + "webidl-conversions" "^3.0.0" + +"which-module@^2.0.0": + "integrity" "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + "resolved" "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" + "version" "2.0.0" + +"which@^2.0.1": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0" + +"wide-align@^1.1.2": + "integrity" "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==" + "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + "version" "1.1.5" + dependencies: + "string-width" "^1.0.2 || 2 || 3 || 4" + +"wrap-ansi@^6.2.0": + "integrity" "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==" + "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + "version" "6.2.0" + dependencies: + "ansi-styles" "^4.0.0" + "string-width" "^4.1.0" + "strip-ansi" "^6.0.0" + +"wrappy@1": + "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" + +"xml-js@^1.6.11": + "integrity" "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==" + "resolved" "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" + "version" "1.6.11" + dependencies: + "sax" "^1.2.4" + +"xss@^1.0.13": + "integrity" "sha512-og7TEJhXvn1a7kzZGQ7ETjdQVS2UfZyTlsEdDOqvQF7GoxNfY+0YLCzBy1kPdsDDx4QuNAonQPddpsn6Xl/7sw==" + "resolved" "https://registry.npmjs.org/xss/-/xss-1.0.14.tgz" + "version" "1.0.14" + dependencies: + "commander" "^2.20.3" + "cssfilter" "0.0.10" + +"xtend@^4.0.0", "xtend@^4.0.2": + "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + "version" "4.0.2" + +"y18n@^4.0.0": + "integrity" "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "resolved" "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + "version" "4.0.3" + +"yallist@^4.0.0", "yallist@4.0.0": + "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + "version" "4.0.0" + +"yaml@^1.10.2": + "integrity" "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + "resolved" "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + "version" "1.10.2" + +"yargs-parser@^18.1.2": + "integrity" "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==" + "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + "version" "18.1.3" + dependencies: + "camelcase" "^5.0.0" + "decamelize" "^1.2.0" + +"yargs@^15.3.1": + "integrity" "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==" + "resolved" "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + "version" "15.4.1" + dependencies: + "cliui" "^6.0.0" + "decamelize" "^1.2.0" + "find-up" "^4.1.0" + "get-caller-file" "^2.0.1" + "require-directory" "^2.1.1" + "require-main-filename" "^2.0.0" + "set-blocking" "^2.0.0" + "string-width" "^4.2.0" + "which-module" "^2.0.0" + "y18n" "^4.0.0" + "yargs-parser" "^18.1.2" diff --git a/Front/.github/workflows/svelte.js.yml b/Front/.github/workflows/svelte.js.yml new file mode 100644 index 0000000..33c8b57 --- /dev/null +++ b/Front/.github/workflows/svelte.js.yml @@ -0,0 +1,52 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs + +name: Meteorite Push to Prod + +on: + workflow_dispatch + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v3 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run build --if-present + + - name: Copy files to serv + uses: garygrossgarten/github-action-scp@release + with: + local: build + remote: /root/meteoriterewrite/temp + host: ${{secrets.IPCLOUD}} + username: root + concurrency: 10 + privateKey: ${{secrets.SSH}} + + - name: restart server and shit + # You may pin to the exact commit or the version. + # uses: appleboy/ssh-action@b60142998894e495c513803efc6d5d72a72c968a + uses: appleboy/ssh-action@v0.1.8 + with: + key: ${{secrets.SSH}} + host: ${{secrets.IPCLOUD}} + username: root + script: | + cd /root/meteoriterewrite + rm -rf build + mv temp build + cd /root/SushiBlox-Website + npm run prodreload diff --git a/Front/.gitignore b/Front/.gitignore new file mode 100644 index 0000000..6635cf5 --- /dev/null +++ b/Front/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/Front/.npmrc b/Front/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/Front/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/Front/README.md b/Front/README.md new file mode 100644 index 0000000..0c73e89 --- /dev/null +++ b/Front/README.md @@ -0,0 +1,39 @@ +# create-svelte +## Hey idiots to push to PRODUCTION go to actions tab and use Meteorite Push to Prod ONLY USE THIS WHEN READY + +Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```bash +# create a new project in the current directory +npm create svelte@latest + +# create a new project in my-app +npm create svelte@latest my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```bash +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```bash +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. diff --git a/Front/package-lock.json b/Front/package-lock.json new file mode 100644 index 0000000..f43301b --- /dev/null +++ b/Front/package-lock.json @@ -0,0 +1,4066 @@ +{ + "name": "meteoriterewrite", + "version": "0.0.1", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "meteoriterewrite", + "version": "0.0.1", + "dependencies": { + "@yaireo/relative-time": "^1.0.3", + "dotenv": "^16.0.3", + "lucide-svelte": "^0.216.0" + }, + "devDependencies": { + "@skeletonlabs/skeleton": "^0.124.2", + "@sveltejs/adapter-auto": "^2.0.0", + "@sveltejs/adapter-node": "^1.1.4", + "@sveltejs/kit": "^1.5.0", + "@tailwindcss/forms": "^0.5.3", + "@tailwindcss/typography": "^0.5.8", + "autoprefixer": "^10.4.13", + "postcss": "^8.4.21", + "svelte": "^3.56.0", + "svelte-check": "^3.0.3", + "svelte-feather-icons": "^4.0.0", + "svelte-hcaptcha": "^0.1.1", + "svelte-preprocess": "^5.0.1", + "tailwindcss": "^3.2.4", + "tslib": "^2.4.1", + "typescript": "^4.9.3", + "vite": "^4.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz", + "integrity": "sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", + "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", + "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.0", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@skeletonlabs/skeleton": { + "version": "0.124.2", + "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-0.124.2.tgz", + "integrity": "sha512-SQ0tgXXEj/QJ5BSA+UwKdSMADW5Xt+5iNpks1y94YnX2iwAY80MlffEfip+//VXYayeGvzx4xiU4//MpK9+Zgg==", + "dev": true, + "dependencies": { + "svelte": "^3.55.1" + } + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.0.0.tgz", + "integrity": "sha512-b+gkHFZgD771kgV3aO4avHFd7y1zhmMYy9i6xOK7m/rwmwaRO8gnF5zBc0Rgca80B2PMU1bKNxyBTHA14OzUAQ==", + "dev": true, + "dependencies": { + "import-meta-resolve": "^2.2.0" + }, + "peerDependencies": { + "@sveltejs/kit": "^1.0.0" + } + }, + "node_modules/@sveltejs/adapter-node": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-1.1.8.tgz", + "integrity": "sha512-jxvj+E24SziP/0IhNWDxNeleC/S5yeEMhAYKuuKIyygw7C8NjyrbwUEizBjn4sb/XyGfJWw1/yoXqtCANoyl4g==", + "dev": true, + "dependencies": { + "@rollup/plugin-commonjs": "^24.0.0", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.1", + "rollup": "^3.7.0" + }, + "peerDependencies": { + "@sveltejs/kit": "^1.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.16.3.tgz", + "integrity": "sha512-8uv0udYRpVuE1BweFidcWHfL+u2gAANKmvIal1dN/FWPBl7DJYbt9zYEtr3bNTiXystT8Sn0Wp54RfwpbPqHjQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte": "^2.1.1", + "@types/cookie": "^0.5.1", + "cookie": "^0.5.0", + "devalue": "^4.3.0", + "esm-env": "^1.0.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "mime": "^3.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^2.0.2", + "tiny-glob": "^0.2.9", + "undici": "~5.22.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": "^16.14 || >=18" + }, + "peerDependencies": { + "svelte": "^3.54.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/kit/node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.2.0.tgz", + "integrity": "sha512-KDtdva+FZrZlyug15KlbXuubntAPKcBau0K7QhAIqC5SAy0uDbjZwoexDRx0L0J2T4niEfC6FnA9GuQQJKg+Aw==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "svelte-hmr": "^0.15.1", + "vitefu": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.54.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", + "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz", + "integrity": "sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==", + "dev": true, + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/@types/cookie": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", + "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", + "dev": true + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/@types/sass": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", + "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@yaireo/relative-time": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yaireo/relative-time/-/relative-time-1.0.3.tgz", + "integrity": "sha512-CJGxyWjb4SnkqubyfiPNQeg0YrJKnVu+11DOP65ltXFxDsjjnm3IByXS9O1Ny9AU9Oxqg0a7Gt26tzXtcijicg==" + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "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, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.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 + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001451", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", + "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "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 + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "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 + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/devalue": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz", + "integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.295", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz", + "integrity": "sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw==", + "dev": true + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/esm-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", + "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", + "dev": true + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "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 + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.1.tgz", + "integrity": "sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "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 + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lucide-svelte": { + "version": "0.216.0", + "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.216.0.tgz", + "integrity": "sha512-e7uFIf3H1Tpoq+RRvAXLBCEe1YgZwOu1LEZY8lkdja3djJBHNsk2/Pgkec/ptT9nzU9oLK/D5lrVxtyvMua0BQ==", + "peerDependencies": { + "svelte": "^3.49.0" + } + }, + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "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 + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rollup": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz", + "integrity": "sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "dev": true + }, + "node_modules/sirv": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", + "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0" + }, + "bin": { + "sorcery": "bin/sorcery" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "3.56.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.56.0.tgz", + "integrity": "sha512-LvXiJbjdvJKwB/0CQyYpDX0q+hFqCyWmybzC2G6eK1tJJA/RSRCytTfNmjHv+RHlLuA70vWG7nXp6gbeErYvRA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/svelte-check": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.0.3.tgz", + "integrity": "sha512-ByBFXo3bfHRGIsYEasHkdMhLkNleVfszX/Ns1oip58tPJlKdo5Ssr8kgVIuo5oq00hss8AIcdesuy0Xt0BcTvg==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^5.0.0", + "typescript": "^4.9.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.55.0" + } + }, + "node_modules/svelte-feather-icons": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svelte-feather-icons/-/svelte-feather-icons-4.0.0.tgz", + "integrity": "sha512-4ieUsjp+VYa1r6y80jDt9zRiRUZyJNbESpRdHdJJhiBubyuXX96A7f1UZSK4olxzP6Qsg5ZAuyZlnmvD+/swAA==", + "dev": true, + "dependencies": { + "svelte": "^3.38.2" + } + }, + "node_modules/svelte-hcaptcha": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/svelte-hcaptcha/-/svelte-hcaptcha-0.1.1.tgz", + "integrity": "sha512-iFF3HwfrCRciJnDs4Y9/rpP/BM2U/5zt+vh+9d4tALPAHVkcANiJIKqYuS835pIaTm6gt+xOzjfFI3cgiRI29A==", + "dev": true + }, + "node_modules/svelte-hmr": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", + "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": ">=3.19.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.1.tgz", + "integrity": "sha512-0HXyhCoc9rsW4zGOgtInylC6qj259E1hpFnJMJWTf+aIfeqh4O/QHT31KT2hvPEqQfdjmqBR/kO2JDkkciBLrQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.6", + "@types/sass": "^1.43.1", + "detect-indent": "^6.1.0", + "magic-string": "^0.27.0", + "sorcery": "^0.11.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 14.10.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^3.23.0", + "typescript": "^3.9.5 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.6.tgz", + "integrity": "sha512-BfgQWZrtqowOQMC2bwaSNe7xcIjdDEgixWGYOd6AL0CbKHJlvhfdbINeAW76l1sO+1ov/MJ93ODJ9yluRituIw==", + "dev": true, + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.0.9", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", + "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "dev": true, + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "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 + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + } + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "dev": true, + "optional": true + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "dev": true + }, + "@rollup/plugin-commonjs": { + "version": "24.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-24.0.1.tgz", + "integrity": "sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.27.0" + } + }, + "@rollup/plugin-json": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", + "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1" + } + }, + "@rollup/plugin-node-resolve": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", + "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.0", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + } + }, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@skeletonlabs/skeleton": { + "version": "0.124.2", + "resolved": "https://registry.npmjs.org/@skeletonlabs/skeleton/-/skeleton-0.124.2.tgz", + "integrity": "sha512-SQ0tgXXEj/QJ5BSA+UwKdSMADW5Xt+5iNpks1y94YnX2iwAY80MlffEfip+//VXYayeGvzx4xiU4//MpK9+Zgg==", + "dev": true, + "requires": { + "svelte": "^3.55.1" + } + }, + "@sveltejs/adapter-auto": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.0.0.tgz", + "integrity": "sha512-b+gkHFZgD771kgV3aO4avHFd7y1zhmMYy9i6xOK7m/rwmwaRO8gnF5zBc0Rgca80B2PMU1bKNxyBTHA14OzUAQ==", + "dev": true, + "requires": { + "import-meta-resolve": "^2.2.0" + } + }, + "@sveltejs/adapter-node": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-node/-/adapter-node-1.1.8.tgz", + "integrity": "sha512-jxvj+E24SziP/0IhNWDxNeleC/S5yeEMhAYKuuKIyygw7C8NjyrbwUEizBjn4sb/XyGfJWw1/yoXqtCANoyl4g==", + "dev": true, + "requires": { + "@rollup/plugin-commonjs": "^24.0.0", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.1", + "rollup": "^3.7.0" + } + }, + "@sveltejs/kit": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.16.3.tgz", + "integrity": "sha512-8uv0udYRpVuE1BweFidcWHfL+u2gAANKmvIal1dN/FWPBl7DJYbt9zYEtr3bNTiXystT8Sn0Wp54RfwpbPqHjQ==", + "dev": true, + "requires": { + "@sveltejs/vite-plugin-svelte": "^2.1.1", + "@types/cookie": "^0.5.1", + "cookie": "^0.5.0", + "devalue": "^4.3.0", + "esm-env": "^1.0.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "mime": "^3.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^2.0.2", + "tiny-glob": "^0.2.9", + "undici": "~5.22.0" + }, + "dependencies": { + "magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + } + } + }, + "@sveltejs/vite-plugin-svelte": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.2.0.tgz", + "integrity": "sha512-KDtdva+FZrZlyug15KlbXuubntAPKcBau0K7QhAIqC5SAy0uDbjZwoexDRx0L0J2T4niEfC6FnA9GuQQJKg+Aw==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "svelte-hmr": "^0.15.1", + "vitefu": "^0.2.4" + }, + "dependencies": { + "magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + } + } + }, + "@tailwindcss/forms": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.3.tgz", + "integrity": "sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==", + "dev": true, + "requires": { + "mini-svg-data-uri": "^1.2.3" + } + }, + "@tailwindcss/typography": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz", + "integrity": "sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==", + "dev": true, + "requires": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + } + }, + "@types/cookie": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.1.tgz", + "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", + "dev": true + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", + "dev": true + }, + "@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "@types/sass": { + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz", + "integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@yaireo/relative-time": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yaireo/relative-time/-/relative-time-1.0.3.tgz", + "integrity": "sha512-CJGxyWjb4SnkqubyfiPNQeg0YrJKnVu+11DOP65ltXFxDsjjnm3IByXS9O1Ny9AU9Oxqg0a7Gt26tzXtcijicg==" + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "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, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "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 + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "requires": { + "streamsearch": "^1.1.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001451", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", + "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "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 + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, + "devalue": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz", + "integrity": "sha512-n94yQo4LI3w7erwf84mhRUkUJfhLoCZiLyoOZ/QFsDbcWNZePrLwbQpvZBUG2TNxwV3VjCKPxkiiQA6pe3TrTA==", + "dev": true + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "electron-to-chromium": { + "version": "1.4.295", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz", + "integrity": "sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw==", + "dev": true + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "esm-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", + "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "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 + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-meta-resolve": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.1.tgz", + "integrity": "sha512-C6lLL7EJPY44kBvA80gq4uMsVFw5x3oSKfuMl1cuZ2RkI5+UJqQXgn+6hlUew0y4ig7Ypt4CObAAIzU53Nfpuw==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "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 + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true + }, + "lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true + }, + "lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lucide-svelte": { + "version": "0.216.0", + "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.216.0.tgz", + "integrity": "sha512-e7uFIf3H1Tpoq+RRvAXLBCEe1YgZwOu1LEZY8lkdja3djJBHNsk2/Pgkec/ptT9nzU9oLK/D5lrVxtyvMua0BQ==", + "requires": {} + }, + "magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true + }, + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "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 + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true + }, + "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, + "requires": { + "wrappy": "1" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "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 + }, + "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 + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "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" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "rollup": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.1.tgz", + "integrity": "sha512-tywOR+rwIt5m2ZAWSe5AIJcTat8vGlnPFAv15ycCrw33t6iFsXZ6mzHVFh2psSjxQPmI+xgzMZZizUAukBI4aQ==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "requires": { + "mri": "^1.1.0" + } + }, + "sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "requires": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "dev": true + }, + "sirv": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", + "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", + "dev": true, + "requires": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + } + }, + "sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "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 + }, + "svelte": { + "version": "3.56.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.56.0.tgz", + "integrity": "sha512-LvXiJbjdvJKwB/0CQyYpDX0q+hFqCyWmybzC2G6eK1tJJA/RSRCytTfNmjHv+RHlLuA70vWG7nXp6gbeErYvRA==" + }, + "svelte-check": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.0.3.tgz", + "integrity": "sha512-ByBFXo3bfHRGIsYEasHkdMhLkNleVfszX/Ns1oip58tPJlKdo5Ssr8kgVIuo5oq00hss8AIcdesuy0Xt0BcTvg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^5.0.0", + "typescript": "^4.9.4" + } + }, + "svelte-feather-icons": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svelte-feather-icons/-/svelte-feather-icons-4.0.0.tgz", + "integrity": "sha512-4ieUsjp+VYa1r6y80jDt9zRiRUZyJNbESpRdHdJJhiBubyuXX96A7f1UZSK4olxzP6Qsg5ZAuyZlnmvD+/swAA==", + "dev": true, + "requires": { + "svelte": "^3.38.2" + } + }, + "svelte-hcaptcha": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/svelte-hcaptcha/-/svelte-hcaptcha-0.1.1.tgz", + "integrity": "sha512-iFF3HwfrCRciJnDs4Y9/rpP/BM2U/5zt+vh+9d4tALPAHVkcANiJIKqYuS835pIaTm6gt+xOzjfFI3cgiRI29A==", + "dev": true + }, + "svelte-hmr": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", + "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", + "dev": true, + "requires": {} + }, + "svelte-preprocess": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.1.tgz", + "integrity": "sha512-0HXyhCoc9rsW4zGOgtInylC6qj259E1hpFnJMJWTf+aIfeqh4O/QHT31KT2hvPEqQfdjmqBR/kO2JDkkciBLrQ==", + "dev": true, + "requires": { + "@types/pug": "^2.0.6", + "@types/sass": "^1.43.1", + "detect-indent": "^6.1.0", + "magic-string": "^0.27.0", + "sorcery": "^0.11.0", + "strip-indent": "^3.0.0" + } + }, + "tailwindcss": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.6.tgz", + "integrity": "sha512-BfgQWZrtqowOQMC2bwaSNe7xcIjdDEgixWGYOd6AL0CbKHJlvhfdbINeAW76l1sO+1ov/MJ93ODJ9yluRituIw==", + "dev": true, + "requires": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.0.9", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "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, + "requires": { + "is-number": "^7.0.0" + } + }, + "totalist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", + "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", + "dev": true + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "undici": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "dev": true, + "requires": { + "busboy": "^1.6.0" + } + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "dev": true, + "requires": { + "esbuild": "^0.17.5", + "fsevents": "~2.3.2", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + } + }, + "vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "dev": true, + "requires": {} + }, + "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 + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } +} diff --git a/Front/package.json b/Front/package.json new file mode 100644 index 0000000..331631c --- /dev/null +++ b/Front/package.json @@ -0,0 +1,37 @@ +{ + "name": "meteoriterewrite", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" + }, + "devDependencies": { + "@skeletonlabs/skeleton": "^0.124.2", + "@sveltejs/adapter-auto": "^2.0.0", + "@sveltejs/adapter-node": "^1.1.4", + "@sveltejs/kit": "^1.5.0", + "@tailwindcss/forms": "^0.5.3", + "@tailwindcss/typography": "^0.5.8", + "autoprefixer": "^10.4.13", + "postcss": "^8.4.21", + "svelte": "^3.56.0", + "svelte-check": "^3.0.3", + "svelte-feather-icons": "^4.0.0", + "svelte-hcaptcha": "^0.1.1", + "svelte-preprocess": "^5.0.1", + "tailwindcss": "^3.2.4", + "tslib": "^2.4.1", + "typescript": "^4.9.3", + "vite": "^4.0.0" + }, + "type": "module", + "dependencies": { + "@yaireo/relative-time": "^1.0.3", + "dotenv": "^16.0.3", + "lucide-svelte": "^0.216.0" + } +} diff --git a/Front/postcss.config.cjs b/Front/postcss.config.cjs new file mode 100644 index 0000000..16dce0b --- /dev/null +++ b/Front/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} \ No newline at end of file diff --git a/Front/src/app.d.ts b/Front/src/app.d.ts new file mode 100644 index 0000000..cb2e5fa --- /dev/null +++ b/Front/src/app.d.ts @@ -0,0 +1,15 @@ +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +// and what to do when importing types +declare namespace App { + + interface Locals { + user: User | null + jwt: cookie | null + useragent: useragent | null + } + // interface Locals {} + // interface PageData {} + // interface Error {} + // interface Platform {} +} diff --git a/Front/src/app.html b/Front/src/app.html new file mode 100644 index 0000000..53e9133 --- /dev/null +++ b/Front/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/Front/src/app.postcss b/Front/src/app.postcss new file mode 100644 index 0000000..95b488c --- /dev/null +++ b/Front/src/app.postcss @@ -0,0 +1,2 @@ +/*place global styles here */ +html, body { @apply h-full overflow-hidden; } \ No newline at end of file diff --git a/Front/src/components/admin/assetqueue.svelte b/Front/src/components/admin/assetqueue.svelte new file mode 100644 index 0000000..7e1e6b3 --- /dev/null +++ b/Front/src/components/admin/assetqueue.svelte @@ -0,0 +1,78 @@ + + +
+

Queue Count: {queuecount}

+
+ {#if items} + {#each items as {Name, ItemId, Creator, Type}} + + {/each} + {/if} +
+
+ +
{currentPage} / {maxiumumPage}
+ +
+ + +
\ No newline at end of file diff --git a/Front/src/components/admin/lookup.svelte b/Front/src/components/admin/lookup.svelte new file mode 100644 index 0000000..0e2b98a --- /dev/null +++ b/Front/src/components/admin/lookup.svelte @@ -0,0 +1,58 @@ + + +
+ + +
or
+ +
{message.message??""}
+ + +
\ No newline at end of file diff --git a/Front/src/components/admin/lookupdone.svelte b/Front/src/components/admin/lookupdone.svelte new file mode 100644 index 0000000..cf9650f --- /dev/null +++ b/Front/src/components/admin/lookupdone.svelte @@ -0,0 +1,144 @@ + +
+ +
+ +
Action:
+ + + + + + + + {#if lookupaction === "Banned"} + + {/if} + +
+ +
+ +
Auto Fill:
+ + +
+ +
+
Moderator Note:
+ +
{message.message??""}
+
+ + +
+ +
+ +
+ +
+
+
+
{lookupdata.username}
+
+ +
+ + +
+ + {#if JSON.parse(lookupdata.moderation).status.toUpperCase() != "OK"} +
Moderation Status:
{JSON.parse(lookupdata.moderation).status}
+ {:else} +
Moderation Status:
{JSON.parse(lookupdata.moderation).status}
+ {/if} +
Rocks: {lookupdata.coins}
+
Discord ID: {lookupdata.discordid??"Not Linked"}
+
View Screenshots
+
View Identity
+
+ +
+ + +
+
+
Moderation History
+ + + + + + + + + + + {#if lookupdata.moderationhistory} + {#each lookupdata.moderationhistory as {status, Reason, BannedBy, Date}} + + + + + + + {/each} + {/if} + +
TypeReasonBannedByDate
{status}{Reason}{BannedBy}{Date}
+
+
\ No newline at end of file diff --git a/Front/src/components/assets/advertisemodal.svelte b/Front/src/components/assets/advertisemodal.svelte new file mode 100644 index 0000000..c8b42ce --- /dev/null +++ b/Front/src/components/assets/advertisemodal.svelte @@ -0,0 +1,58 @@ + +
Advertise
+ +
+ + +
+ +
{message.message??""}
+ + +
+
\ No newline at end of file diff --git a/Front/src/components/colorpicker.svelte b/Front/src/components/colorpicker.svelte new file mode 100644 index 0000000..8134e92 --- /dev/null +++ b/Front/src/components/colorpicker.svelte @@ -0,0 +1,298 @@ + +
Skin Tone by Body Parts
+ +
+ +
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
\ No newline at end of file diff --git a/Front/src/components/commentcard.svelte b/Front/src/components/commentcard.svelte new file mode 100644 index 0000000..36e5ec8 --- /dev/null +++ b/Front/src/components/commentcard.svelte @@ -0,0 +1,110 @@ + +
+
+ + + + + +
{message.message??""}
+ + + +
+

Games

+ +{#each creations as {nameofgame, idofgame, Description, avatartype, gearallowed}} + +{/each} +
+ +
\ No newline at end of file diff --git a/Front/src/components/develop/modals/editgamemodal.svelte b/Front/src/components/develop/modals/editgamemodal.svelte new file mode 100644 index 0000000..8205544 --- /dev/null +++ b/Front/src/components/develop/modals/editgamemodal.svelte @@ -0,0 +1,192 @@ + + +
+ + + +
+ +
+
Edit Game
+ + + + + + +
{message.message??""}
+
+ +
+
Edit File
+ + +
{messageupload.message??""}
+
+ +
+ +
+ + + +
+ + + + + +
+ \ No newline at end of file diff --git a/Front/src/components/gamecard.svelte b/Front/src/components/gamecard.svelte new file mode 100644 index 0000000..3b59919 --- /dev/null +++ b/Front/src/components/gamecard.svelte @@ -0,0 +1,61 @@ + + {#if useragent.includes("Android") === true || useragent.includes("iPhone") === true} + +
{document.location.href="/games/"+idofgame+"/"+gamename.replace(/[^a-zA-Z ]/g, "").replaceAll(' ', '-')}}> +
+ {#if imageloading} +
+ {/if} + imageloading=false} src="/assets/gameassets/thumbnail-{idofgame}.png#" /> +

{gamename}

+
{playercount} Playing
+
{version}
+ +
+
+ {:else} + +
+ {#if imageloading} +
+ {/if} + imageloading=false} src="/assets/gameassets/thumbnail-{idofgame}.png#" /> +

{gamename}

+
{playercount} Playing
+
{version}
+ {#if username}{/if} +
+
+ {/if} diff --git a/Front/src/components/games/launchmodal.svelte b/Front/src/components/games/launchmodal.svelte new file mode 100644 index 0000000..e34b5a4 --- /dev/null +++ b/Front/src/components/games/launchmodal.svelte @@ -0,0 +1,9 @@ + +
+
meteorite
+
Do you have Meteorite Installed? If not install now!
+ + Download +
diff --git a/Front/src/components/games/linkdiscordmodal.svelte b/Front/src/components/games/linkdiscordmodal.svelte new file mode 100644 index 0000000..d0fecca --- /dev/null +++ b/Front/src/components/games/linkdiscordmodal.svelte @@ -0,0 +1,6 @@ +
+ +
Hi! In order to play games here at Meteorite you must link your discord account.
+
Thank you...
+ Link +
\ No newline at end of file diff --git a/Front/src/components/groups/groupbar.svelte b/Front/src/components/groups/groupbar.svelte new file mode 100644 index 0000000..113d769 --- /dev/null +++ b/Front/src/components/groups/groupbar.svelte @@ -0,0 +1,27 @@ + + \ No newline at end of file diff --git a/Front/src/components/itemcard.svelte b/Front/src/components/itemcard.svelte new file mode 100644 index 0000000..3aeff05 --- /dev/null +++ b/Front/src/components/itemcard.svelte @@ -0,0 +1,92 @@ + + + \ No newline at end of file diff --git a/Front/src/components/login/2famodal.svelte b/Front/src/components/login/2famodal.svelte new file mode 100644 index 0000000..4d879e2 --- /dev/null +++ b/Front/src/components/login/2famodal.svelte @@ -0,0 +1,82 @@ + + +
+ +
Confirm 2FA
+ + + + +
Enter the code generated by your authenticator app.
+ +
+ +
{message.message??""}
+
+ + + + + +
diff --git a/Front/src/components/progressbar.svelte b/Front/src/components/progressbar.svelte new file mode 100644 index 0000000..098d143 --- /dev/null +++ b/Front/src/components/progressbar.svelte @@ -0,0 +1,72 @@ + + +{#if $p > 0 && $p < 1 && isVisible} + +{/if} + + \ No newline at end of file diff --git a/Front/src/components/rocks.svelte b/Front/src/components/rocks.svelte new file mode 100644 index 0000000..e2091c7 --- /dev/null +++ b/Front/src/components/rocks.svelte @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/Front/src/components/scrollbutton.svelte b/Front/src/components/scrollbutton.svelte new file mode 100644 index 0000000..7c98c3f --- /dev/null +++ b/Front/src/components/scrollbutton.svelte @@ -0,0 +1,27 @@ + + \ No newline at end of file diff --git a/Front/src/components/settingsmodals/_2fa.svelte b/Front/src/components/settingsmodals/_2fa.svelte new file mode 100644 index 0000000..a80ba52 --- /dev/null +++ b/Front/src/components/settingsmodals/_2fa.svelte @@ -0,0 +1,60 @@ + + +
+ +
Confirm 2FA
+ + {qrcode} + +
+ +
{message.message??""}
+
+ + + + + +
+ \ No newline at end of file diff --git a/Front/src/components/settingsmodals/changepassword.svelte b/Front/src/components/settingsmodals/changepassword.svelte new file mode 100644 index 0000000..faab9b3 --- /dev/null +++ b/Front/src/components/settingsmodals/changepassword.svelte @@ -0,0 +1,60 @@ + + +
+ +
Change Password
+ +
+ + + +
{message.message??""}
+
+ + + + + +
diff --git a/Front/src/components/skybanner.svelte b/Front/src/components/skybanner.svelte new file mode 100644 index 0000000..a90729f --- /dev/null +++ b/Front/src/components/skybanner.svelte @@ -0,0 +1,28 @@ + + +{#if loading} + +{/if} + + {loading = false}} alt="Ad" src={imageUrl}/> \ No newline at end of file diff --git a/Front/src/components/statusbubble.svelte b/Front/src/components/statusbubble.svelte new file mode 100644 index 0000000..1278e9b --- /dev/null +++ b/Front/src/components/statusbubble.svelte @@ -0,0 +1,22 @@ + + {#if status === "Offline"} +
+ +{:else if status === "Online"} +
+{:else if status.includes('Playing') === true} +
+{/if} \ No newline at end of file diff --git a/Front/src/components/usercard.svelte b/Front/src/components/usercard.svelte new file mode 100644 index 0000000..e1e2d88 --- /dev/null +++ b/Front/src/components/usercard.svelte @@ -0,0 +1,69 @@ + + +
+ +
+ +
{username}
+
+
+ {#if friendRequest === true} + +
+ + + + + +
+ + {/if} + + +
\ No newline at end of file diff --git a/Front/src/hooks.server.ts b/Front/src/hooks.server.ts new file mode 100644 index 0000000..f1d00dd --- /dev/null +++ b/Front/src/hooks.server.ts @@ -0,0 +1,49 @@ +import { authenticateUser } from "$lib/auth" +import { redirect, type Handle } from "@sveltejs/kit" +const protectedroutes = [ + '/home', + '/catalog', + '/develop', + '/users', + '/avatar', + '/settings', + '/admin' +] + +export const handle: Handle = async ({ event, resolve }) => { + // Stage 1 + event.locals.user = await authenticateUser(event) + event.locals.jwt = event.cookies.get('jwt')??"" + event.locals.useragent = event.request.headers.get('user-agent') + //console.log(event.locals.user) + + if (protectedroutes.includes(event.url.pathname) === true || protectedroutes.some(substr => event.url.pathname.toLowerCase().startsWith(substr.toLowerCase())) === true) { + if (!event.locals.user) { + throw redirect(303, "/") + } + if (event.locals.user?.moderationstatus && event.locals.user.moderationstatus?.status.toUpperCase() != "OK" && event.url.pathname != "moderated"){ + throw redirect(303, '/moderated') + } + } + if (event.url.pathname.toLowerCase().startsWith('/admin') === true){ + // admin route + if (!event.locals.user) { + throw redirect(303, "/") + } + if (event.locals.user.admin === false){ + throw redirect(303, "/") + } + } + + const response = await resolve(event) // Stage 2 + + // Stage 3 + //console.log(event.url.protocol) + if (event.url.protocol === 'https:'){ + response.headers.append("Content-Security-Policy","img-src 'self' data: wsrv.nl images.weserv.nl;upgrade-insecure-requests;") + }else{ + response.headers.append("Content-Security-Policy","img-src 'self' data: wsrv.nl images.weserv.nl;") + } + + return response +} \ No newline at end of file diff --git a/Front/src/lib/auth.ts b/Front/src/lib/auth.ts new file mode 100644 index 0000000..43defed --- /dev/null +++ b/Front/src/lib/auth.ts @@ -0,0 +1,25 @@ +import type { RequestEvent } from "@sveltejs/kit" + +export const authenticateUser = async (event: RequestEvent) => { + // get the cookies from the request + const { cookies } = event + const { route } = event + + // get the user token from the cookie + const userToken = cookies.get("jwt") + if (!userToken){ + return null + } + // if the user token is not valid, return null + // this is where you would check the user token against your database + // to see if it is valid and return the user object + const res = await fetch("http://mete0r.xyz/api/auth",{credentials: 'include', headers: {cookie: "jwt="+userToken,route: route.id as string}}) + const data = await res.json() + if (!data.error){ + return data + }else if (data.moderationstatus){ + return data + } + + return null +} \ No newline at end of file diff --git a/Front/src/lib/avatarstore.ts b/Front/src/lib/avatarstore.ts new file mode 100644 index 0000000..5c7f377 --- /dev/null +++ b/Front/src/lib/avatarstore.ts @@ -0,0 +1,3 @@ +import { writable } from 'svelte/store'; + +export const avatarstore = writable(""); \ No newline at end of file diff --git a/Front/src/lib/coinstore.ts b/Front/src/lib/coinstore.ts new file mode 100644 index 0000000..9ff71d2 --- /dev/null +++ b/Front/src/lib/coinstore.ts @@ -0,0 +1,3 @@ +import { writable } from 'svelte/store'; + +export const coinstore = writable(0); \ No newline at end of file diff --git a/Front/src/lib/url.ts b/Front/src/lib/url.ts new file mode 100644 index 0000000..5a61e38 --- /dev/null +++ b/Front/src/lib/url.ts @@ -0,0 +1,3 @@ +import { browser } from '$app/environment'; + +export const url = !browser ? "http://mete0r.xyz": "" // if no browser return "http://mete0r.xyz" otherwise nothing \ No newline at end of file diff --git a/Front/src/routes/+error.svelte b/Front/src/routes/+error.svelte new file mode 100644 index 0000000..ac93e1f --- /dev/null +++ b/Front/src/routes/+error.svelte @@ -0,0 +1,15 @@ + + + +
+
+

{$page.status} :(

+
Oops!
+
{$page?.error?.message}
+ + + +
+
\ No newline at end of file diff --git a/Front/src/routes/+layout.server.ts b/Front/src/routes/+layout.server.ts new file mode 100644 index 0000000..63efa3a --- /dev/null +++ b/Front/src/routes/+layout.server.ts @@ -0,0 +1,47 @@ +import { redirect } from '@sveltejs/kit'; +import type { LayoutServerLoad } from './$types'; +const protectedroutes = [ + '/home', + '/catalog', + '/develop', + '/users', + '/avatar', + '/settings', + '/admin' +] + +export const load: LayoutServerLoad = (async ({ url, locals }) => { + //console.log(locals) + //await parent; + if (!locals.user){ + if (protectedroutes.includes(url.pathname) === true || protectedroutes.some(substr => url.pathname.toLowerCase().startsWith(substr.toLowerCase())) === true){ + throw redirect(303, "/") + } + } + + if (locals.user?.moderationstatus && locals?.user?.moderationstatus?.status.toUpperCase() != "OK" && url.pathname != '/moderated'){ + throw redirect(303, '/moderated') + } + if (url.pathname.toLowerCase().startsWith('/admin') === true){ + // admin route + if (!locals.user) { + throw redirect(303, "/") + } + if (locals.user.admin === false){ + throw redirect(303, "/") + } + } + + if (url.pathname === "/" && locals.user){ + throw redirect(303, "/home") + } + + return { + user: locals.user, + jwt : locals.jwt, + useragent: locals.useragent, + protocol: url.protocol, + url: url.pathname + } +}) satisfies LayoutServerLoad; + diff --git a/Front/src/routes/+layout.svelte b/Front/src/routes/+layout.svelte new file mode 100644 index 0000000..3812886 --- /dev/null +++ b/Front/src/routes/+layout.svelte @@ -0,0 +1,309 @@ + + + Meteorite - { ( (data?.url?.replace("/",""))?.[0]?.toUpperCase() + data?.url?.slice(2) )?.split("/")?.[0] } + + + + + + + + + + + +
+ +
+
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+
+
+ {search = previousearch}} placeholder="Search" class="input input-bordered input-primary pr-8 w-full rounded-none" maxlength=50 required> + {#if search} + {search=""}} class="w-8 h-8 absolute inset-y-0 right-0 pt-2 pr-3" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> + {:else} + + {/if} +
+{#if search} + + +{/if} +
+ + + + + + + + + meteorite + + + + + + {#if data.user} + + {coins??"0"} + + + + + {/if} + + + + + + + + + + + + + {#if data.user} + + {/if} + + + +
+
Copyright © Meteorite 2023
+ Terms of Service + Privacy Policy +
+
+ +
diff --git a/Front/src/routes/+page.svelte b/Front/src/routes/+page.svelte new file mode 100644 index 0000000..e38f352 --- /dev/null +++ b/Front/src/routes/+page.svelte @@ -0,0 +1,139 @@ + + + +
+ +meteorite! + + + +
+ {#if current === "signup"} +

Sign up!

+ + + + + + + +
By clicking Sign Up, you are agreeing to the Terms of Use including the arbitration clause and you are acknowledging the Privacy Policy
+ +
+ + {:else} +

Login

+ + + +
By clicking Login, you are agreeing to the Terms of Use including the arbitration clause and you are acknowledging the Privacy Policy
+
+ + {/if} +
+ + +
+{scroll+=1}} /> \ No newline at end of file diff --git a/Front/src/routes/admin/+page.svelte b/Front/src/routes/admin/+page.svelte new file mode 100644 index 0000000..b73524e --- /dev/null +++ b/Front/src/routes/admin/+page.svelte @@ -0,0 +1,66 @@ + + +
+

Admin Panel

+
+ +
People
+
{data.user.username}
+
+ Lookup Users +
+ +
+ Asset Queue +
+ +
Forums
+ +
Website
+ +
+ Set Banner +
+ +
+{#if storeTab === "lookup"} +
+ + {#if !lookupdata} + + {/if} + + {#if lookupdata} + + + +{/if} +
+ + + +{/if} + + +{#if storeTab === "queue"} + +{/if} + +
+
\ No newline at end of file diff --git a/Front/src/routes/avatar/+page.svelte b/Front/src/routes/avatar/+page.svelte new file mode 100644 index 0000000..4f35b5b --- /dev/null +++ b/Front/src/routes/avatar/+page.svelte @@ -0,0 +1,175 @@ + + +
+ +
+ + {updateBodyType("R15")}} value="R15">R15 + {updateBodyType("R6")}} value="R6">R6 + + {data.user.username} + +
+ +
+ + + +
+ + Shirts + Pants + Hats + Faces + Packages + Heads + Gears + Emotes + 🖌️ + +
+ {#if currentItems && avatarfilter != "bodycolors"} + {#each currentItems as {ItemName, ItemId, Hidden, Equipped}} + {#if !Hidden} + +
+ L +
+

{ItemName}

+
+ {#if Equipped === true} + + {:else} + + {/if} +
+ + {/if} + {/each} + {/if} +
+
+ +
+ + + +
\ No newline at end of file diff --git a/Front/src/routes/catalog/+page.svelte b/Front/src/routes/catalog/+page.svelte new file mode 100644 index 0000000..f2e4e26 --- /dev/null +++ b/Front/src/routes/catalog/+page.svelte @@ -0,0 +1,152 @@ + + + + + +
+ + +
+ +
+
+ + + + {#if accessories} +
+ + + + +
+ {/if} + + {#if bodyparts} +
+ + + +
+ {/if} + + {#if animations} +
+ +
+ {/if} +
+
+ + + +

{currentFilter}

+

{currentCategory}

+
+ {#if items} + {#each items as {Name, Price, ItemId, Hidden, Sales}} + +
+ L +
+

{Name}

+
+ +

{Price??"0"}

+
+
+
+ {/each} + {/if} +
+
+ +
{currentPage} / {maxiumumPage}
+ +
+ + + + +
+ +
\ No newline at end of file diff --git a/Front/src/routes/catalog/+page.ts b/Front/src/routes/catalog/+page.ts new file mode 100644 index 0000000..f253740 --- /dev/null +++ b/Front/src/routes/catalog/+page.ts @@ -0,0 +1,25 @@ +import { error } from '@sveltejs/kit'; +import type { PageLoad } from './$types'; +import { url as url2 } from '$lib/url'; + + +export const load = (async ({ fetch, url }) => { + let items: []; + const currentPage = Number(url.searchParams.get('page') ?? '1'); + const currentCategory = String(url.searchParams.get('category') ?? 'All'); + const currentFilter = String(url.searchParams.get('filter') ?? 'Featured'); + + const response = await fetch(url2+'/api/catalog/fetch',{method: "POST", body: JSON.stringify({filter: currentFilter,sort: currentCategory, page: currentPage}),headers: {"content-type": "application/json"}}); + const data = await response.json() + + if (!data.error){ + return { + items: data.data, + maxiumumPage: data.pages, + currentPage, + currentFilter, + currentCategory + } + } + +}) satisfies PageLoad; \ No newline at end of file diff --git a/Front/src/routes/catalog/[slug]/+page.ts b/Front/src/routes/catalog/[slug]/+page.ts new file mode 100644 index 0000000..129a2ec --- /dev/null +++ b/Front/src/routes/catalog/[slug]/+page.ts @@ -0,0 +1,11 @@ +import { error, redirect } from '@sveltejs/kit'; +import type { PageLoad } from './$types'; + +export const load = (async ({ fetch, params }) => { + const res = await fetch(`http://mete0r.xyz/api/catalog/iteminfo/${params.slug}`) + const data = await res.json() + if (data.error === false){ + throw redirect(301,'/catalog/'+params.slug+'/'+data.iteminfo.Name.replace(/[^a-zA-Z ]/g, "").replaceAll(' ', '-')) + } + throw error(404, 'Not found'); +}) satisfies PageLoad; \ No newline at end of file diff --git a/Front/src/routes/catalog/[slug]/[name]/+page.svelte b/Front/src/routes/catalog/[slug]/[name]/+page.svelte new file mode 100644 index 0000000..e035f57 --- /dev/null +++ b/Front/src/routes/catalog/[slug]/[name]/+page.svelte @@ -0,0 +1,137 @@ + + + + Meteorite - {data.item.Name} + + +
+ +
+ {data.item.Name} + {#if data.user.admin === true} + + {/if} +
+
+ +

{data.item.Name}

+ + +
By {data.creatorusername??"SushiWasNotHere"}
+ + + +
+
+ +
+ +
+ +

{data.item.Price}

+
+
+ + + +
+
Type
+
+
{data.item.Type}
+
+
+
Description
+
+
{data.item?.Description??""}
+
+
+
+
+
+ + +
+ +
+ + +

Commentary

+ + \ No newline at end of file diff --git a/Front/src/routes/catalog/[slug]/[name]/+page.ts b/Front/src/routes/catalog/[slug]/[name]/+page.ts new file mode 100644 index 0000000..2b437a2 --- /dev/null +++ b/Front/src/routes/catalog/[slug]/[name]/+page.ts @@ -0,0 +1,21 @@ +import { error, redirect } from '@sveltejs/kit'; +import type { PageLoad } from './$types'; + +export const load = (async ({ fetch, params }) => { + const res = await fetch(`http://mete0r.xyz/api/catalog/iteminfo/${params.slug}`) + const data = await res.json() + + if (params.name != data.iteminfo.Name.replace(/[^a-zA-Z ]/g, "").replaceAll(' ', '-')){ + throw redirect(301,'/catalog/'+params.slug+'/'+data.iteminfo.Name.replace(/[^a-zA-Z ]/g, "").replaceAll(' ', '-')) + } + + if (data.error === false){ + const creatorusernameresp = await fetch(`http://mete0r.xyz/api/userinfo/${data.iteminfo.Creator??"0"}`) + const creatorusername = await creatorusernameresp.json() + return { + item: data.iteminfo, + creatorusername: creatorusername.userinfo.username + } + } + throw error(404, 'Not found'); +}) satisfies PageLoad; \ No newline at end of file diff --git a/Front/src/routes/catalog/search/[slug]/+page.svelte b/Front/src/routes/catalog/search/[slug]/+page.svelte new file mode 100644 index 0000000..9a93c62 --- /dev/null +++ b/Front/src/routes/catalog/search/[slug]/+page.svelte @@ -0,0 +1,150 @@ + + + + + +
+ + +
+ +
+
+ + + + {#if accessories} +
+ + + + +
+ {/if} + + {#if bodyparts} +
+ + + +
+ {/if} +
+
+ + + +

{currentFilter}

+

{currentCategory}

+
+ {#if items} + {#each items as {Name, Price, ItemId, Hidden, Sales}} + +
+ L +
+

{Name}

+
+ +

{Price??"0"}

+
+
+
+ {/each} + {/if} +
+
+ +
{currentPage} / {maxiumumPage}
+ +
+ + + + +
+ +
\ No newline at end of file diff --git a/Front/src/routes/catalog/search/[slug]/+page.ts b/Front/src/routes/catalog/search/[slug]/+page.ts new file mode 100644 index 0000000..c068cfa --- /dev/null +++ b/Front/src/routes/catalog/search/[slug]/+page.ts @@ -0,0 +1,5 @@ +export const load = ({ params }) => { + return { + slug: params.slug + } +} \ No newline at end of file diff --git a/Front/src/routes/develop/+page.svelte b/Front/src/routes/develop/+page.svelte new file mode 100644 index 0000000..9307c84 --- /dev/null +++ b/Front/src/routes/develop/+page.svelte @@ -0,0 +1,142 @@ + +
+ +
+ +

Develop

+ +
+ + +{#if openstudio} +
+ + +
+{/if} + +
+ +
+ + +
+ Shirts +
+
+ Pants +
+
+ Games +
+
+ Audios +
+
+ Badges +
+
+ Meshes +
+
+ User Ads +
+
+ Videos +
+
+ Game Passes +
+
+ Developer Products +
+ {#if data.user.admin === true || data.user.ugcpermission === true} +

Admin

+
+ Hats +
+
+ Gears +
+
+ Faces +
+
+ Packages +
+
+ Animation Bundles +
+
+ Emotes +
+ {/if} +
+ {#if storeTab === "Shirts" || storeTab === "Pants"} + + {/if} + + {#if storeTab === "games"} + + {/if} + + {#if storeTab === "audios" || storeTab === "badges" || storeTab === "meshes" || storeTab === "userads" || storeTab === "gamepasses" || storeTab === "videos"} + + {/if} + + {#if storeTab === "Packagess"} + + {/if} + + {#if storeTab === "Hats" || storeTab === "Gears" || storeTab === "Faces" || storeTab === "Emotes"} + + {/if} + + {#if storeTab === "userads"} + + {/if} + + +
\ No newline at end of file diff --git a/Front/src/routes/friends/+page.svelte b/Front/src/routes/friends/+page.svelte new file mode 100644 index 0000000..28bbb8b --- /dev/null +++ b/Front/src/routes/friends/+page.svelte @@ -0,0 +1,33 @@ + + +
+
+

My Friend Requests

+ +
+ +
+ {#if data.friendRequests} + {#each data.friendRequests as {userid, username}} + + {/each} + {/if} +
+ + +
\ No newline at end of file diff --git a/Front/src/routes/friends/+page.ts b/Front/src/routes/friends/+page.ts new file mode 100644 index 0000000..07fcb40 --- /dev/null +++ b/Front/src/routes/friends/+page.ts @@ -0,0 +1,14 @@ +import { error } from '@sveltejs/kit'; +import type { PageLoad } from './$types'; + +export const load = (async ({ fetch, parent }) => { + let data = await parent() + + const response = await fetch('http://mete0r.xyz/api/friends/friend-requests',{method: "POST",headers: {"content-type": "application/json",'Authorization': data.jwt,}}); + const friendata = await response.json() + + return { + friendRequests: friendata.data + } + +}) satisfies PageLoad; \ No newline at end of file diff --git a/Front/src/routes/games/+page.svelte b/Front/src/routes/games/+page.svelte new file mode 100644 index 0000000..75d6c4e --- /dev/null +++ b/Front/src/routes/games/+page.svelte @@ -0,0 +1,120 @@ + +
+

Popular

+
+ + + +
scrolled(e.target?.scrollLeft,e.target?.clientWidth,e.target?.scrollWidth,"Popular")} class="grid grid-flow-col grid-rows-none overflow-hidden auto-cols-max gap-4 snap-mandatory snap-x scroll-smooth h-40 sm:h-60"> + {#each gamearrays.Popular.array as {nameofgame, idofgame, version, visits, numberofplayers, useridofowner, owner}} + + {/each} + +
+ +
+

Our Recommendations

+
+ + + +
scrolled(e.target?.scrollLeft,e.target?.clientWidth,e.target?.scrollWidth,"OurRecommendations")} class="grid grid-flow-col grid-rows-none overflow-hidden auto-cols-max gap-4 snap-mandatory snap-x scroll-smooth h-40 sm:h-60"> + {#each gamearrays.OurRecommendations.array as {nameofgame, idofgame, version, visits, numberofplayers, useridofowner, owner}} + + {/each} + +
+ +
+

Most Visited

+
+ + + +
scrolled(e.target?.scrollLeft,e.target?.clientWidth,e.target?.scrollWidth,"Visits")} class="grid grid-flow-col grid-rows-none overflow-hidden auto-cols-max gap-4 snap-mandatory snap-x scroll-smooth h-40 sm:h-60"> + {#each gamearrays.Visits.array as {nameofgame, idofgame, version, visits, numberofplayers, useridofowner, owner}} + + {/each} + +
+ +
+

Newest Arrivals

+
+ + + +
scrolled(e.target?.scrollLeft,e.target?.clientWidth,e.target?.scrollWidth,"NewestArrivals")} class="grid grid-flow-col grid-rows-none overflow-hidden auto-cols-max gap-4 snap-mandatory snap-x scroll-smooth h-40 sm:h-60"> + {#each gamearrays.NewestArrivals.array as {nameofgame, idofgame, version, visits, numberofplayers, useridofowner, owner}} + + {/each} + +
+ +
+ + +
\ No newline at end of file diff --git a/Front/src/routes/games/+page.ts b/Front/src/routes/games/+page.ts new file mode 100644 index 0000000..0bbb6cb --- /dev/null +++ b/Front/src/routes/games/+page.ts @@ -0,0 +1,21 @@ +import type { PageLoad } from './$types'; +import { url } from "$lib/url" + +export const load = (async ({ fetch }) => { + let gamearrays:any = {Popular: {array: []},OurRecommendations: {array: []}, Visits: {array: []}, NewestArrivals: {array: []} } + + async function addToArray(){ + const response = await fetch(url+'/games/firstpaint',{method: "POST",headers: {"content-type": "application/json"}}); + const data = await response.json() + if (!data.error && data != "[]"){ + gamearrays = data + } + + } + await addToArray() + + return { + firstpaint: gamearrays + } + +}) satisfies PageLoad; \ No newline at end of file diff --git a/Front/src/routes/games/[slug]/+page.ts b/Front/src/routes/games/[slug]/+page.ts new file mode 100644 index 0000000..2bd3dc8 --- /dev/null +++ b/Front/src/routes/games/[slug]/+page.ts @@ -0,0 +1,11 @@ +import { error, redirect } from '@sveltejs/kit'; +import type { PageLoad } from './$types'; + +export const load = (async ({ fetch, params }) => { + const res = await fetch(`http://mete0r.xyz/games/gameinfo/${params.slug}`) + const data = await res.json() + if (data.error === false){ + throw redirect(301,'/games/'+params.slug+'/'+data.gameinfo.nameofgame.replace(/[^a-zA-Z ]/g, "").replaceAll(' ', '-')) + } + throw error(404, 'Not found'); +}) satisfies PageLoad; \ No newline at end of file diff --git a/Front/src/routes/games/[slug]/[name]/+page.svelte b/Front/src/routes/games/[slug]/[name]/+page.svelte new file mode 100644 index 0000000..2c35f96 --- /dev/null +++ b/Front/src/routes/games/[slug]/[name]/+page.svelte @@ -0,0 +1,248 @@ + + + + Meteorite - {data.game.nameofgame} + + + + + + + + + + + +
+ + +
+ {data.game.nameofgame} +
+
+

{data.game.nameofgame}

+ {#if data?.user?.admin === true || data.game?.useridofowner === data?.user?.userid} + + + + + {/if} +
+ +
By {data.creatorusername}
+
+ {#if data.user} + {#if data.useragent.includes("Android") === true || data.useragent.includes("iPhone") === true && data.game.version != "2020"} + Play + {:else if data.useragent.includes("Android") === true || data.useragent.includes("iPhone") === true} + Play + {:else} + + {/if} + + {:else} + Register + + {/if} +
+
+
+ +
0
+
+
+ +
0
+
+
+
+
+ +
+ + About + Store + Players + + +
+

{storeTab}

+{#if storeTab === "About"} + +
+
{data.game?.descrption??"No Description"}
+ +
+
+

Playing

+

{data.game.numberofplayers}

+
+ +
+

Visits

+

{data.game?.visits??"0"}

+
+ +
+

Created

+

{data.game.creationdate}

+
+
+ +
+

Commentary

+ + + {/if} + + {#if storeTab === "Players"} +
+
+ {#if data.game.players} + {#each data.game.players as {userid, name}} +
+ {#if data?.user?.admin === true || data.game?.useridofowner === data?.user?.userid} + + {/if} + + {name}
+ {/each} + {/if} +
+
+ {/if} + + {#if storeTab === "Store"} +
+
+ {#if gamepasses} + {#each gamepasses as {Name, Price, ItemId, Hidden, Sales}} + + {/each} + {/if} +
+
+ {/if} +
\ No newline at end of file diff --git a/Front/src/routes/games/[slug]/[name]/+page.ts b/Front/src/routes/games/[slug]/[name]/+page.ts new file mode 100644 index 0000000..b63d415 --- /dev/null +++ b/Front/src/routes/games/[slug]/[name]/+page.ts @@ -0,0 +1,19 @@ +import { error, redirect } from '@sveltejs/kit'; +import type { PageLoad } from './$types'; + +export const load = (async ({ fetch, params }) => { + const res = await fetch(`http://mete0r.xyz/games/gameinfo/${params.slug}`) + const data = await res.json() + + if (params.name != data.gameinfo.nameofgame.replace(/[^a-zA-Z ]/g, "").replaceAll(' ', '-')){ + throw redirect(301,'/games/'+params.slug+'/'+data.gameinfo.nameofgame.replace(/[^a-zA-Z ]/g, "").replaceAll(' ', '-')) + } + + if (data.error === false){ + return { + game: data.gameinfo, + creatorusername: data.gameinfo.owner.username + } + } + throw error(404, 'Not found'); +}) satisfies PageLoad; \ No newline at end of file diff --git a/Front/src/routes/games/search/[slug]/+page.svelte b/Front/src/routes/games/search/[slug]/+page.svelte new file mode 100644 index 0000000..2630528 --- /dev/null +++ b/Front/src/routes/games/search/[slug]/+page.svelte @@ -0,0 +1,59 @@ + + +
+

Results for {search}:

+
+ {#each gamearray as {nameofgame, idofgame, version, visits, numberofplayers, useridofowner}} + + {/each} + +
+ + +
\ No newline at end of file diff --git a/Front/src/routes/games/search/[slug]/+page.ts b/Front/src/routes/games/search/[slug]/+page.ts new file mode 100644 index 0000000..c068cfa --- /dev/null +++ b/Front/src/routes/games/search/[slug]/+page.ts @@ -0,0 +1,5 @@ +export const load = ({ params }) => { + return { + slug: params.slug + } +} \ No newline at end of file diff --git a/Front/src/routes/groupss/+page.svelte b/Front/src/routes/groupss/+page.svelte new file mode 100644 index 0000000..4ce42c9 --- /dev/null +++ b/Front/src/routes/groupss/+page.svelte @@ -0,0 +1,22 @@ + + + + + +
+ {#if data.groups} + + {/if} + +
+ +
+ +
\ No newline at end of file diff --git a/Front/src/routes/groupss/+page.ts b/Front/src/routes/groupss/+page.ts new file mode 100644 index 0000000..08fd64d --- /dev/null +++ b/Front/src/routes/groupss/+page.ts @@ -0,0 +1,14 @@ +import type { PageLoad } from './$types'; +import { url } from "$lib/url" + +export const load = (async ({ fetch, parent }) => { + let data = await parent() + + const response = await fetch(url+'/api/groups',{method: "POST",headers: {"content-type": "application/json",'Authorization': data.jwt,}}); + const groups = await response.json() + + return { + groups + } + +}) satisfies PageLoad; \ No newline at end of file diff --git a/Front/src/routes/groupss/[slug]/+page.svelte b/Front/src/routes/groupss/[slug]/+page.svelte new file mode 100644 index 0000000..01f4f3a --- /dev/null +++ b/Front/src/routes/groupss/[slug]/+page.svelte @@ -0,0 +1,122 @@ + + + + + +
+ + +
+
+ +
+
+ + +
+

{data.group.Name}

+
By {data.group.owner.username}
+
+ +
+ +
+
Description
+
{data.group.Description}
+
+ +
+ + +
+ +

Shout

+ +
+ +
+ + +
+
SushiWasNotHere
+
Hello, world!
+ +
+ +
+
+ + + + + +

Settings

+ +
+ + + +
+ +
+ + Cancel + + +
+ +
+ +
\ No newline at end of file diff --git a/Front/src/routes/home/+page.svelte b/Front/src/routes/home/+page.svelte new file mode 100644 index 0000000..379a424 --- /dev/null +++ b/Front/src/routes/home/+page.svelte @@ -0,0 +1,136 @@ + +
+ + +
+ +
+ + {#if data.user.membership === "BuildersClub"} + {data.user.membership} + {:else if data.user.membership === "TurboBuildersClub"} + {data.user.membership} + {:else if data.user.membership === "OutrageousBuildersClub"} + {data.user.membership} + {/if} +

Hello, {data.user.username}!

+
+ +

Friends ({data.user?.friends?.length??0})

+ +
+ {#if data.friendsdata} + {#each friends as { userid, username, status }} + +
+
+ +
+
{username}
+ +
+
+ {/each} + {/if} +
+ +

Recently Played

+ +
+ {#if data.recentlyplayed} + {#each [...data.recentlyplayed].reverse() as { nameofgame, idofgame, version, visits, numberofplayers, useridofowner, owner }} + + {/each} + {/if} + + +
+ +
+ +
+

My Feed

+
+ + + + +
+
If you wish to use Images. Prepend your image url with https://wsrv.nl/?url=
+ +
{message.message??""}
+ +
+ {/if} + + {#if settingfilter === "security"} + +
+ +

2 Step Verification

+ +
+
+
Authenticator App (Very Secure)
+
+ + +
+ +
+ + {/if} + + {#if settingfilter === "bc"} + +
+

Builders Club

+ +
+ +
+

Classic

+ Classic + + +
+ +
+

Turbo

+ Classic + + Boost + + +
+ +
+

Outrageous

+ Classic + + Donate + + +
+ +
+ +
+ + {/if} + +
+ +{#if settingfilter === "bc"} +
+

How does Builders Club work?

+ +
Classic - Obtain with 200 rocks a lifetime purchase.
+ +
+
  • Increases your daily stipend to 60 rocks.
  • +
    + +
    Turbo - Obtain by boosting the discord server.
    + +
    +
  • Increases your daily stipend to 90 rocks.
  • +
    + +
    Outrageous - Obtain by donating here.
    + +
    +
  • Increases your daily stipend to 150 rocks.
  • +
    + +
    +{/if} \ No newline at end of file diff --git a/Front/src/routes/users/+page.svelte b/Front/src/routes/users/+page.svelte new file mode 100644 index 0000000..e69de29 diff --git a/Front/src/routes/users/[slug]/+page.svelte b/Front/src/routes/users/[slug]/+page.svelte new file mode 100644 index 0000000..2a611d8 --- /dev/null +++ b/Front/src/routes/users/[slug]/+page.svelte @@ -0,0 +1,311 @@ + + + + Meteorite - {data.profile.username} + {#if data.profile.css} + {@html `<`+`style>${data.profile.css}`} + {/if} + +
    + {#if data.profile.userid === 18} + + + {/if} + +
    + +
    +
    + + +
    +
    + + +
    +
    +
    +

    {data.profile.username}

    + + {#if data.profile.membership === "BuildersClub"} + {data.user.membership} + {:else if data.profile.membership === "TurboBuildersClub"} + {data.user.membership} + {:else if data.profile.membership === "OutrageousBuildersClub"} + {data.user.membership} + {/if} +
    + +
    "{data.profile.bio??"Set your bio in settings!"}"
    + {#if data.profile.status.status.includes('Playing') === true} +
    Playing {gamename}
    + {/if} + +
    + +
    +
    +
    Friends
    +
    {data.profile?.friends?.length??0}
    +
    +
    +
    Followers
    +
    {data.profile?.followers??0}
    +
    + +
    + {#if data.user.userid != data.profile.userid} + + {:else} + + {/if} + +
    + + + +
    + +
    + +
    + +
    + + About + Games + + +
    +{#if storeTab === "About"} +
    +

    About

    + {#if data.user.userid === data.profile.userid} + {editAbout = true,about=data.profile.aboutme}} on:keydown xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="mt-2 hover:stroke-white"> + {/if} +
    +{#if editAbout} +