├── .gitignore ├── docs ├── public │ ├── favicon.ico │ ├── schema.jpg │ ├── schema-dark.png │ ├── schema-light.png │ └── logo.svg ├── pages │ ├── _meta.json │ ├── guide │ │ ├── _meta.json │ │ ├── data-model.mdx │ │ ├── data-controller.mdx │ │ └── display.mdx │ ├── _app.js │ ├── start.mdx │ ├── how.mdx │ └── index.mdx ├── next.config.js ├── package.json ├── components │ ├── features.module.scss │ └── features.js ├── .gitignore ├── theme.config.js └── yarn.lock ├── Sources └── Gravity │ ├── RemoteRepresentable.swift │ ├── DataCache │ ├── RemoteData.swift │ └── DataCache.swift │ ├── Store │ ├── Scheduler.swift │ ├── Cache │ │ ├── WrappedKey.swift │ │ ├── CachePersistency.swift │ │ └── Cache.swift │ ├── Realtime │ │ └── RealtimeController.swift │ └── Store.swift │ ├── RemoteBinding.swift │ ├── Utility │ └── Logger.swift │ ├── RemoteObjects.swift │ ├── RemoteObject.swift │ ├── RemoteRequest.swift │ └── RemoteObjectDelegate.swift ├── Tests └── GravityTests │ ├── Utility.swift │ ├── CacheCodable.swift │ └── StorePerformance.swift ├── Package.swift └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | /*.xcodeproj 5 | xcuserdata/ 6 | .swiftpm/ 7 | -------------------------------------------------------------------------------- /docs/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pr1mer-tech/Gravity/HEAD/docs/public/favicon.ico -------------------------------------------------------------------------------- /docs/public/schema.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pr1mer-tech/Gravity/HEAD/docs/public/schema.jpg -------------------------------------------------------------------------------- /docs/public/schema-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pr1mer-tech/Gravity/HEAD/docs/public/schema-dark.png -------------------------------------------------------------------------------- /docs/public/schema-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pr1mer-tech/Gravity/HEAD/docs/public/schema-light.png -------------------------------------------------------------------------------- /docs/pages/_meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "index": "Gravity", 3 | "start": "Installation", 4 | "guide": "Tutorial", 5 | "how": "How it works" 6 | } -------------------------------------------------------------------------------- /docs/pages/guide/_meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "data-model": "1. Data Model", 3 | "data-controller": "2. Data Controller", 4 | "display": "3. Display your data" 5 | } -------------------------------------------------------------------------------- /docs/next.config.js: -------------------------------------------------------------------------------- 1 | const withNextra = require('nextra')('nextra-theme-docs', './theme.config.js') 2 | module.exports = withNextra({ 3 | images: { 4 | unoptimized: true 5 | } 6 | }) 7 | -------------------------------------------------------------------------------- /Sources/Gravity/RemoteRepresentable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 09/04/2023. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol RemoteRepresentable: Codable, Hashable, Identifiable where ID: Codable & Hashable {} 11 | -------------------------------------------------------------------------------- /docs/pages/_app.js: -------------------------------------------------------------------------------- 1 | import 'nextra-theme-docs/style.css' 2 | 3 | import Prism from 'prism-react-renderer/prism' 4 | (typeof global !== "undefined" ? global : window).Prism = Prism 5 | require("prismjs/components/prism-swift") 6 | 7 | export default function Nextra({ Component, pageProps }) { 8 | return 9 | } -------------------------------------------------------------------------------- /Sources/Gravity/DataCache/RemoteData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 09/04/2023. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol RemoteData: Codable, Hashable, Identifiable where ID: Codable & Hashable { 11 | associatedtype ObjectData 12 | 13 | static func object(from: Data) -> ObjectData 14 | } 15 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "author": "Arthur Guiot", 6 | "license": "MIT", 7 | "scripts": { 8 | "dev": "next dev", 9 | "build": "next build", 10 | "start": "next start" 11 | }, 12 | "dependencies": { 13 | "next": "^13.2.3", 14 | "nextra": "^2.2.17", 15 | "nextra-theme-docs": "^2.2.17", 16 | "react": "^18.2.0", 17 | "react-dom": "^18.2.0", 18 | "sass": "^1.32.8", 19 | "prism-react-renderer": "^1.2.0", 20 | "prismjs": "^1.23.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /docs/pages/start.mdx: -------------------------------------------------------------------------------- 1 | # Installation 2 | 3 | The [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler. 4 | 5 | It is the recommended way to install Gravity. 6 | 7 | Once you have your Swift package set up, adding Gravity as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`. 8 | 9 | ```swift 10 | dependencies: [ 11 | .package(url: "https://github.com/pr1mer-tech/Gravity.git", .upToNextMajor(from: "2.0.0")) 12 | ] 13 | ``` -------------------------------------------------------------------------------- /docs/components/features.module.scss: -------------------------------------------------------------------------------- 1 | .features { 2 | display: flex; 3 | flex-wrap: wrap; 4 | margin: 2.5rem -.5rem 2rem; 5 | } 6 | 7 | .feature { 8 | flex: 0 0 33%; 9 | align-items: center; 10 | display: inline-flex; 11 | padding: 0 0.5rem 1.5rem; 12 | margin: 0 auto; 13 | } 14 | 15 | .feature h4 { 16 | margin: 0 0 0 0.5rem; 17 | font-weight: 700; 18 | font-size: 0.95rem; 19 | white-space: nowrap; 20 | } 21 | 22 | @media (max-width: 860px) { 23 | .feature { 24 | padding-left: 0; 25 | } 26 | 27 | .feature h4 { 28 | font-size: 0.75rem; 29 | } 30 | } -------------------------------------------------------------------------------- /docs/pages/guide/data-model.mdx: -------------------------------------------------------------------------------- 1 | import { Callout } from 'nextra-theme-docs' 2 | import Link from 'next/link' 3 | 4 | # 1. Define your model 5 | 6 | For normal RESTful APIs with JSON data, first you need to create a model structure, which represents the expected result: 7 | 8 | ```swift 9 | import Gravity 10 | 11 | struct Landmark: RemoteRepresentable { 12 | var id: Int 13 | var name: String 14 | var park: String 15 | var state: String 16 | var description: String 17 | } 18 | ``` 19 | 20 | 21 | The `RemoteRepresentable` protocol is a special protocol that makes it possible to cache the data in the local storage. It automatically conforms to the `Codable`, `Hashable`, `Identifiable` protocols, so you don't need to implement them manually. 22 | -------------------------------------------------------------------------------- /Sources/Gravity/Store/Scheduler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RateLimiter.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 21/03/2023. 6 | // 7 | 8 | import Foundation 9 | 10 | class Scheduler where Delegate: RemoteObjectDelegate { 11 | var task: Task? = nil 12 | 13 | func requestSync(delay: TimeInterval = 5) throws { 14 | guard task == nil else { return } 15 | self.task = Task { 16 | // Sleep for N second 17 | if delay > 0 { 18 | try await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000)) 19 | } 20 | // Sync 21 | do { 22 | try await Delegate.shared.sync() 23 | } catch { 24 | Delegate.shared.store.logger.log(error) 25 | } 26 | } 27 | Task { 28 | let result = await self.task?.result 29 | self.task = nil 30 | if case .failure(let error) = result { 31 | throw error 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Tests/GravityTests/Utility.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Utility.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 23/03/2023. 6 | // 7 | 8 | import Foundation 9 | @testable import Gravity 10 | 11 | struct User: RemoteRepresentable { 12 | var id: UUID 13 | var name: String? 14 | var email: String 15 | var birthday: Date? 16 | var gender: Gender? 17 | var profilePicture: String? 18 | 19 | enum Gender: String, Codable { 20 | case male 21 | case female 22 | } 23 | } 24 | 25 | struct UserBase: RemoteObjectDelegate { 26 | typealias Element = User 27 | 28 | var store = try! Store(reference: "users", maximumEntryCount: 1100) 29 | 30 | func pull(request: Gravity.RemoteRequest) async throws -> [User] { 31 | return request.ids.map { id in 32 | User(id: id, email: "hello@world.com") 33 | } 34 | } 35 | 36 | func push(elements: [User]) async throws { 37 | fatalError("Not implemented") 38 | } 39 | 40 | static var shared = UserBase() 41 | } 42 | -------------------------------------------------------------------------------- /Sources/Gravity/RemoteBinding.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RemoteBinding.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 24/03/2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @MainActor 11 | @dynamicMemberLookup 12 | public struct RemoteBinding where Delegate: RemoteObjectDelegate { 13 | var id: Delegate.Element.ID 14 | var request: RemoteRequest 15 | 16 | public subscript(dynamicMember keyPath: WritableKeyPath) -> Binding { 17 | return Binding { 18 | return Delegate.shared.store.object(id: id)![keyPath: keyPath] 19 | } set: { newValue, transaction in 20 | try? Delegate.shared.store.update(id: id, with: request) { (object: inout Delegate.Element) in 21 | object[keyPath: keyPath] = newValue 22 | } 23 | } 24 | } 25 | } 26 | 27 | public extension Binding { 28 | func unwrap(defaultValue: T) -> Binding! where Value == Optional { 29 | Binding(get: { self.wrappedValue ?? defaultValue }, set: { self.wrappedValue = $0 }) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /docs/pages/how.mdx: -------------------------------------------------------------------------------- 1 | # How it works 2 | 3 | Gravity provides critical functionality in all kinds of SwiftUI apps, so **performance** is a top priority. 4 | 5 | Gravity’s built-in **caching** and **[deduplication](/how#deduplication)** skips unnecessary network requests, but 6 | the performance of the `SWR` hook itself still matters. In a complex app, there could be hundreds of `SWR` calls in a single page render. 7 | 8 | Gravity ensures that your app has: 9 | - _no unnecessary requests_ 10 | - _no unnecessary re-renders_ 11 | - _no unnecessary data revalidation_ 12 | 13 | without any code changes from you. 14 | 15 | 16 | 17 | ## Deduplication 18 | 19 | It’s very common to reuse Gravity hooks in your app. For example, an app that renders the current user’s avatar 5 time. Each `Avatar` view has a `SWR` hook inside. Since they have the same key and are rendered at the almost same time, **only 1 network request will be made**. Same goes with `GravityStream`, where only one WebSocket connection will be active. One thing that is great about Gravity, is that even though 1 connection will be active, you can use different data processor, as WebSockets can transfer different type of information. 20 | -------------------------------------------------------------------------------- /Sources/Gravity/Store/Cache/WrappedKey.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 23/03/2023. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Cache { 11 | final class WrappedKey: NSObject { 12 | let key: ID 13 | 14 | init(_ key: ID) { self.key = key } 15 | 16 | override var hash: Int { return key.hashValue } 17 | 18 | override func isEqual(_ object: Any?) -> Bool { 19 | guard let value = object as? WrappedKey else { 20 | return false 21 | } 22 | 23 | return value.key == key 24 | } 25 | } 26 | 27 | final class WrappedKeys: NSObject, Codable { 28 | var keys: Set 29 | 30 | init(_ keys: Set) { self.keys = keys } 31 | 32 | override var hash: Int { return keys.hashValue } 33 | 34 | override func isEqual(_ object: Any?) -> Bool { 35 | guard let value = object as? WrappedKeys else { 36 | return false 37 | } 38 | 39 | return value.keys == keys 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /docs/pages/guide/data-controller.mdx: -------------------------------------------------------------------------------- 1 | import { Callout } from 'nextra-theme-docs' 2 | import Link from 'next/link' 3 | 4 | # 2. Define the controller 5 | In order to pull and push the data from the database, we need to define the controller. The controller is the place where we define the logic of the application. 6 | 7 | ```swift 8 | import Gravity 9 | 10 | final class LandmarkBase: RemoteObjectDelegate { 11 | typealias Element = Landmark // Tells the RemoteObjectDelegate which type of object it is working with 12 | 13 | var store = try! Store(reference: "landmarks") // Defines the store where the data will be stored and cached 14 | 15 | func pull(request: RemoteRequest) async throws -> [Landmark] { 16 | // Fetches the data from the database 17 | } 18 | 19 | func push(elements: [Landmark]) async throws { 20 | // Pushes the data to the database 21 | } 22 | 23 | static var shared = LandmarkBase() // Defines the shared instance of the controller 24 | } 25 | ``` 26 | 27 | The `RemoteObjectDelegate` protocol also supports other methods, and you can find more information about them in the RemoteObjectDelegate page. 28 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "Gravity", 8 | platforms: [ 9 | .macOS(.v11), 10 | .iOS(.v13), 11 | .tvOS(.v13), 12 | .watchOS(.v6) 13 | ], 14 | products: [ 15 | // Products define the executables and libraries a package produces, and make them visible to other packages. 16 | .library( 17 | name: "Gravity", 18 | targets: ["Gravity"]), 19 | ], 20 | dependencies: [ 21 | // Dependencies declare other packages that this package depends on. 22 | // .package(url: /* package url */, from: "1.0.0"), 23 | ], 24 | targets: [ 25 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 26 | // Targets can depend on other targets in this package, and on products in packages this package depends on. 27 | .target( 28 | name: "Gravity", 29 | dependencies: [] 30 | ), 31 | .testTarget( 32 | name: "GravityTests", 33 | dependencies: ["Gravity"] 34 | ) 35 | ] 36 | ) 37 | -------------------------------------------------------------------------------- /Tests/GravityTests/CacheCodable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CacheCodable.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 22/03/2023. 6 | // 7 | 8 | import XCTest 9 | @testable import Gravity 10 | 11 | @MainActor 12 | final class CacheCodable: XCTestCase { 13 | 14 | override func setUpWithError() throws { 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | } 17 | 18 | override func tearDownWithError() throws { 19 | // Put teardown code here. This method is called after the invocation of each test method in the class. 20 | } 21 | 22 | func testCoding() throws { 23 | let store = UserBase.shared.store 24 | var uuids = [UUID]() 25 | for _ in 0...1000 { 26 | let id = UUID() 27 | try? store.save(User(id: id, email: "example@example.com"), with: .id(id), requestPushWithInterval: nil) 28 | uuids.append(id) 29 | } 30 | 31 | self.measure { 32 | guard let data = try? JSONEncoder().encode(UserBase.shared.store.cache) else { return } 33 | let decoded = try? JSONDecoder().decode(Cache.self, from: data) 34 | 35 | XCTAssertEqual(UserBase.shared.store.cache, decoded) 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Tests/GravityTests/StorePerformance.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StorePerformance.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 22/03/2023. 6 | // 7 | 8 | import XCTest 9 | @testable import Gravity 10 | 11 | @MainActor 12 | final class StorePerformance: XCTestCase { 13 | 14 | func testSavePerformance() throws { 15 | // This is an example of a performance test case. 16 | let store = UserBase.shared.store 17 | self.measure { 18 | for _ in 0...2000 { 19 | let id = UUID() 20 | try? store.save(User(id: id, email: "example@example.com"), with: .id(id), requestPushWithInterval: nil) 21 | } 22 | } 23 | } 24 | 25 | func testReadPerformance() throws { 26 | // This is an example of a performance test case. 27 | let store = UserBase.shared.store 28 | var uuids = [UUID]() 29 | for _ in 0...1000 { 30 | let id = UUID() 31 | try? store.save(User(id: id, email: "example@example.com"), with: .id(id), requestPushWithInterval: nil) 32 | uuids.append(id) 33 | } 34 | self.measure { 35 | for id in uuids { 36 | guard !store.objects(request: .id(id)).isEmpty else { return XCTFail("Empty object") } 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /docs/pages/index.mdx: -------------------------------------------------------------------------------- 1 | import { Callout } from 'nextra-theme-docs' 2 | import Features from '../components/features' 3 | 4 | 5 | 6 | # Gravity 7 | 8 | 9 | 10 | Gravity is a SwiftUI library for remote data fetching. I acts as a Network Layer for your SwiftUI app, providing a simple and declarative way to fetch data from the server. It uses `stale-while-revalidate` technonology to fetch data from the server, a cache invalidation strategy popularized by [HTTP RFC 5861](https://tools.ietf.org/html/rfc5861). 11 | Gravity first returns the data from cache (stale), then sends the fetch request (revalidate), and finally comes with the up-to-date data again. 12 | 13 | 14 | With Gravity, components will get a stream of data updates constantly and automatically. 15 | And the UI will be always fast and reactive. 16 | 17 | 18 | ## Overview 19 | 20 | ```swift 21 | import SwiftUI 22 | import Gravity 23 | 24 | struct LandmarkList: View { 25 | @RemoteObjects(request: .all) var landmarks 26 | var body: some View { 27 | List(landmarks, id: \.id) { landmark in 28 | LandmarkRow(landmark: landmark) 29 | } 30 | } 31 | } 32 | ``` 33 | 34 | In this example, the property wrapper `@RemoteObjects` accepts a `request` and returns an array of all the `Landmark`. 35 | 36 | `LandmarkBase` acts as a controller for the `Landmark` model. It is responsible for fetching the data from the server and returning it to Gravity. The rest is handled by Gravity. -------------------------------------------------------------------------------- /docs/pages/guide/display.mdx: -------------------------------------------------------------------------------- 1 | import { Callout } from 'nextra-theme-docs' 2 | 3 | # 3. Display your data 4 | Now that you have your data model & controller set up, you can display your data in your views. There are two ways to do this, depending on the type of data you want to display. 5 | 6 | ## Displaying a single record 7 | If you want to display a single record, you can use the `RemoteObject` property wrapper. This property wrapper will fetch the data from the server depending on your request, and will update the view when the data changes. You can use this property wrapper in your view almost like a `@State` property wrapper. 8 | ```swift 9 | @RemoteObject(request: .id("any-id")) var landmark 10 | ``` 11 | Sometimes, you also might want to wait for the request before loading the data. In that case, you can use the `RemoteObject` property wrapper with the `waitForRequest` parameter. 12 | ```swift 13 | @RemoteObject(waitForRequest: true) var landmark 14 | 15 | init(id: String) { 16 | _landmark.updateRequest(request: .id(id)) 17 | } 18 | ``` 19 | 20 | ## Displaying multiple records 21 | If you want to display multiple records, you can use the `RemoteObjects` property wrapper. It works almost the same as the `RemoteObject` property wrapper, but it will fetch multiple records instead of a single record. 22 | ```swift 23 | @RemoteObjects(request: .all) var landmarks 24 | ``` 25 | You can also use the `RemoteObjects` property wrapper with the `waitForRequest` parameter. 26 | ```swift 27 | @RemoteObjects(waitForRequest: true) var landmarks 28 | 29 | init(ids: [String]) { 30 | _landmarks.updateRequest(request: .ids(ids)) // Or you can use .all to fetch all records 31 | } 32 | ``` -------------------------------------------------------------------------------- /Sources/Gravity/Store/Cache/CachePersistency.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CachePersistency.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 22/03/2023. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol CacheDecodable: Codable { 11 | init(referenceID: String) 12 | var reference: String { get } 13 | static func cacheURL(for reference: String) -> URL 14 | } 15 | 16 | extension CacheDecodable { 17 | init(withReference reference: String) throws { 18 | // Check if file exists 19 | let fileManager = FileManager.default 20 | let url = Self.cacheURL(for: reference) 21 | 22 | if fileManager.fileExists(atPath: url.path) { 23 | // File exists 24 | let data = try Data(contentsOf: url) 25 | do { 26 | self = try JSONDecoder().decode(Self.self, from: data) 27 | } catch { 28 | try fileManager.removeItem(atPath: url.path) 29 | throw error 30 | } 31 | } else { 32 | self.init(referenceID: reference) 33 | } 34 | } 35 | } 36 | extension Cache: CacheDecodable { 37 | convenience init(referenceID: String) { 38 | self.init(reference: referenceID, dateProvider: Date.init, entryLifetime: 12 * 60 * 60, maximumEntryCount: 50) 39 | } 40 | 41 | static func cacheURL(for reference: String) -> URL { 42 | let folderURLs = FileManager.default.urls( 43 | for: .cachesDirectory, 44 | in: .userDomainMask 45 | ) 46 | 47 | return folderURLs[0].appendingPathComponent(reference + ".cache") 48 | } 49 | 50 | var cacheURL: URL { 51 | Cache.cacheURL(for: reference) 52 | } 53 | 54 | func saveToDisk() throws { 55 | let data = try JSONEncoder().encode(self) 56 | try data.write(to: cacheURL) 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Sources/Gravity/Utility/Logger.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Logger.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 22/03/2023. 6 | // 7 | 8 | import Foundation 9 | 10 | /// A helper class used to log errors to console and perform actions that might throw an error. 11 | public final class Logger { 12 | /// Create a new logger. 13 | public init() {} 14 | 15 | /// Last console output. 16 | public private(set) var lastOutput: String? 17 | 18 | var error: Error? 19 | 20 | /// Log an error to console. 21 | /// - Parameters: 22 | /// - error: error to be logged to console. 23 | /// - fileName: file name of where the error occurred. 24 | /// - functionName: function name of where the error occurred. 25 | /// - Returns: the string that was printed to console. 26 | @discardableResult public func log( 27 | _ error: Error, 28 | fileName: String = #file, 29 | functionName: String = #function 30 | ) -> String { 31 | let file = fileName 32 | .split(separator: "/") 33 | .last? 34 | .replacingOccurrences(of: ".swift", with: "") ?? fileName 35 | let location = "`\(file).\(functionName)`" 36 | let errorDescription = error.localizedDescription 37 | let message = "An error occurred in \(location). Error: \(errorDescription)" 38 | #if DEBUG 39 | print(message) 40 | #endif 41 | lastOutput = message 42 | return message 43 | } 44 | 45 | /// Perform an action and return its result. 46 | /// - Returns: Action to be performed. 47 | @discardableResult public func perform( 48 | _ action: @autoclosure () throws -> Output 49 | ) throws -> Output { 50 | if let error = error { 51 | throw error 52 | } 53 | let result = try action() 54 | return result 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Sources/Gravity/RemoteObjects.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RemoteObjects.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 21/03/2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @propertyWrapper 11 | public struct RemoteObjects : DynamicProperty where Delegate: RemoteObjectDelegate { 12 | 13 | @ObservedObject var store: Store 14 | 15 | var waitForRequest = false 16 | var request: RemoteRequest! 17 | 18 | public init(request: RemoteRequest) { 19 | self.store = Delegate.shared.store 20 | self.request = request 21 | self.store.realtimeController.subscribe(to: request) 22 | // Revalidate 23 | self.revalidate() 24 | } 25 | 26 | public init(waitForRequest: Bool) { 27 | self.store = Delegate.shared.store 28 | self.waitForRequest = true 29 | } 30 | 31 | public mutating func updateRequest(request: RemoteRequest) { 32 | if !waitForRequest { 33 | self.store.realtimeController.unsubscribe(to: self.request) // unsubscribe to old one 34 | self.store.realtimeController.subscribe(to: request) 35 | } 36 | self.waitForRequest = false 37 | self.request = request 38 | // Revalidate 39 | self.revalidate() 40 | } 41 | 42 | public func revalidate() { 43 | self.store.revalidate(request: request) 44 | } 45 | 46 | public var wrappedValue: [Delegate.Element] { 47 | get { 48 | return store.objects(request: request) 49 | } 50 | nonmutating set { 51 | do { 52 | try store.save(elements: newValue, with: request) 53 | } catch { 54 | print("### Save to \(Delegate.Element.self) Store Error: \(error)") 55 | } 56 | } 57 | } 58 | 59 | public var projectedValue: Binding<[Delegate.Element]> { 60 | return .init(get: { self.wrappedValue }, set: { self.wrappedValue = $0 }) 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Sources/Gravity/RemoteObject.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RemoteObject.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 21/03/2023. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @propertyWrapper 11 | public struct RemoteObject : DynamicProperty where Delegate: RemoteObjectDelegate { 12 | 13 | @ObservedObject var store: Store 14 | 15 | var waitForRequest = false 16 | var request: RemoteRequest! 17 | 18 | public init(request: RemoteRequest) { 19 | self.store = Delegate.shared.store 20 | self.request = request 21 | self.store.realtimeController.subscribe(to: request) 22 | // Revalidate 23 | self.revalidate() 24 | } 25 | 26 | public init(waitForRequest: Bool) { 27 | self.store = Delegate.shared.store 28 | self.waitForRequest = true 29 | } 30 | 31 | public mutating func updateRequest(request: RemoteRequest) { 32 | if !waitForRequest { 33 | self.store.realtimeController.unsubscribe(to: self.request) 34 | self.store.realtimeController.subscribe(to: request) 35 | } 36 | self.waitForRequest = false 37 | self.request = request 38 | // Revalidate 39 | self.revalidate() 40 | } 41 | 42 | public func revalidate() { 43 | self.store.revalidate(request: request) 44 | } 45 | 46 | public var wrappedValue: Delegate.Element? { 47 | get { 48 | return store.objects(request: request).first 49 | } 50 | nonmutating set { 51 | guard let newValue = newValue else { return } 52 | do { 53 | try store.save(newValue, with: request) 54 | } catch { 55 | print("### Save to \(Delegate.Element.self) Store Error: \(error)") 56 | } 57 | } 58 | } 59 | 60 | public var projectedValue: Binding? { 61 | guard self.wrappedValue != nil else { return nil } 62 | return .init(get: { self.wrappedValue! }, set: { self.wrappedValue = $0 }) 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

Gravity

4 |

5 | 6 | 7 | ## Introduction 8 | 9 | Gravity is a SwiftUI library for remote data fetching. It uses **SWR** technonology to fetch data from the server. 10 | 11 | The name “**SWR**” is derived from `stale-while-revalidate`, a cache invalidation strategy popularized by [HTTP RFC 5861](https://tools.ietf.org/html/rfc5861). 12 | Gravity first returns the data from cache (stale), then sends the fetch request (revalidate), and finally comes with the up-to-date data again. 13 | 14 | With Gravity, components will get **a stream of data updates constantly and automatically**. Thus, the UI will be always **fast** and **reactive**. 15 | 16 |
17 | 18 | ## Quick Start 19 | 20 | #### Installation 21 | 22 | The [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler. 23 | 24 | It is the recommended way to install Gravity. 25 | 26 | Once you have your Swift package set up, adding Gravity as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`. 27 | 28 | ```swift 29 | dependencies: [ 30 | .package(url: "https://github.com/pr1mer-tech/Gravity.git", .upToNextMajor(from: "0.1.0")) 31 | ] 32 | ``` 33 | You can then import and use Gravity: 34 | ```swift 35 | import SwiftUI 36 | import Gravity 37 | 38 | struct LandmarkList: View { 39 | @SWR(url: "https://example.org/api/endpoint") var api 40 | var body: some View { 41 | if let landmarks = api.data { 42 | List(landmarks, id: \.id) { landmark in 43 | LandmarkRow(landmark: landmark) 44 | } 45 | } 46 | } 47 | } 48 | ``` 49 | 50 | In this example, the property wrapper `@SWR` accepts a `url` and a `model`. 51 | 52 | The `url` is the URL of the API. And the `model` is a `Codable` object. 53 | 54 | `api` will be a `StateResponse` object that has three children: `data` that will contain the decoded data, `error` in case there is an error and `awaiting` when the app is loading. 55 | -------------------------------------------------------------------------------- /Sources/Gravity/RemoteRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 23/03/2023. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum RemoteRequest: Hashable { 11 | case ids([T]) 12 | case id(T) 13 | case all 14 | 15 | static func +(lhs: RemoteRequest, rhs: RemoteRequest) -> RemoteRequest { 16 | switch (lhs, rhs) { 17 | case (.all, _), (_, .all): 18 | return .all 19 | case let (.id(id1), .id(id2)): 20 | return .ids([id1, id2]) 21 | case let (.id(id), .ids(ids)) where !ids.contains(id): 22 | return .ids([id] + ids) 23 | case let (.ids(ids), .id(id)) where !ids.contains(id): 24 | return .ids([id] + ids) 25 | case let (.ids(ids1), .ids(ids2)): 26 | return .ids(Array(Set(ids1 + ids2))) 27 | default: 28 | return lhs 29 | } 30 | } 31 | 32 | static func +=(lhs: inout RemoteRequest, rhs: RemoteRequest) { 33 | lhs = lhs + rhs 34 | } 35 | 36 | static func -(lhs: RemoteRequest, rhs: RemoteRequest) -> RemoteRequest { 37 | switch (lhs, rhs) { 38 | case (_, .all): 39 | return .ids([]) 40 | case let (.ids(ids), .ids(idsToRemove)): 41 | let idsSetToRemove = Set(idsToRemove) 42 | let filteredIds = ids.filter { !idsSetToRemove.contains($0) } 43 | return filteredIds.isEmpty ? .all : .ids(filteredIds) 44 | default: 45 | return lhs 46 | } 47 | } 48 | 49 | static func -=(lhs: inout RemoteRequest, rhs: RemoteRequest) { 50 | lhs = lhs - rhs 51 | } 52 | 53 | public var ids: [T] { 54 | switch self { 55 | case .ids(let ids): 56 | return ids 57 | case .id(let id): 58 | return [id] 59 | case .all: 60 | return [] 61 | } 62 | } 63 | 64 | public var isEmpty: Bool { 65 | switch self { 66 | case .ids(let array): 67 | return array.isEmpty 68 | case .id(let t): 69 | return false 70 | case .all: 71 | return false 72 | } 73 | } 74 | 75 | public var isAll: Bool { 76 | if case .all = self { 77 | return true 78 | } 79 | return false 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /Sources/Gravity/DataCache/DataCache.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataCache.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 08/04/2023. 6 | // 7 | 8 | import Foundation 9 | import Combine 10 | 11 | public protocol DataCache: ObservableObject { 12 | associatedtype Object: RemoteData 13 | 14 | var cacheDirectoryName: String { get } 15 | var objectWillChange: ObservableObjectPublisher { get } 16 | 17 | func fetch(using request: URLRequest) async throws -> Data 18 | 19 | func urlRequests(for request: RemoteRequest) -> [URLRequest] 20 | } 21 | 22 | extension DataCache { 23 | public var cacheDirectory: URL { 24 | let fileManager = FileManager.default 25 | let urls = fileManager.urls(for: .cachesDirectory, in: .userDomainMask) 26 | let directoryURL = urls[0].appendingPathComponent(cacheDirectoryName) 27 | if !fileManager.fileExists(atPath: directoryURL.path) { 28 | try? fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true, attributes: nil) 29 | } 30 | return directoryURL 31 | } 32 | 33 | public var logger: Logger { 34 | return Logger() 35 | } 36 | 37 | private func cachedData(for request: URLRequest) -> Data? { 38 | guard let url = request.url, let fileName = url.absoluteString.addingPercentEncoding(withAllowedCharacters: .alphanumerics) else { 39 | return nil 40 | } 41 | let fileURL = cacheDirectory.appendingPathComponent(fileName) 42 | return try? Data(contentsOf: fileURL) 43 | } 44 | 45 | private func storeCachedData(_ data: Data, for request: URLRequest) { 46 | guard let url = request.url, let fileName = url.absoluteString.addingPercentEncoding(withAllowedCharacters: .alphanumerics) else { 47 | return 48 | } 49 | let fileURL = cacheDirectory.appendingPathComponent(fileName) 50 | do { 51 | try data.write(to: fileURL) 52 | } catch { 53 | logger.log(error) 54 | } 55 | } 56 | 57 | public func pull(for request: RemoteRequest) -> [Object.ObjectData] { 58 | let urlRequests = urlRequests(for: request) 59 | var objects: [Object.ObjectData] = [] 60 | 61 | for req in urlRequests { 62 | if let data = cachedData(for: req) { 63 | let object = Object.object(from: data) 64 | objects.append(object) 65 | } else { 66 | Task.detached { 67 | do { 68 | let fetchedData = try await self.fetch(using: req) 69 | self.storeCachedData(fetchedData, for: req) 70 | await MainActor.run { 71 | self.objectWillChange.send() 72 | } 73 | } catch { 74 | self.logger.log(error) 75 | } 76 | } 77 | } 78 | } 79 | 80 | return objects 81 | } 82 | 83 | public func pullSingle(for id: Object.ID) -> Object.ObjectData? { 84 | return pull(for: .id(id)).first 85 | } 86 | 87 | public func removeAllData() { 88 | try? FileManager.default.removeItem(at: cacheDirectory) 89 | objectWillChange.send() 90 | } 91 | } 92 | 93 | public enum DataCacheError: Error { 94 | case urlRequestCreationFailed 95 | } 96 | 97 | public extension DataCache { 98 | func fetch(using request: URLRequest) async throws -> Data { 99 | let (data, response) = try await URLSession.shared.data(for: request) 100 | guard let httpResponse = response as? HTTPURLResponse, 200..<300 ~= httpResponse.statusCode else { 101 | throw DataCacheError.urlRequestCreationFailed 102 | } 103 | return data 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/macos,windows,next,node 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=macos,windows,next,node 3 | 4 | ### macOS ### 5 | # General 6 | .DS_Store 7 | .AppleDouble 8 | .LSOverride 9 | 10 | # Icon must end with two \r 11 | Icon 12 | 13 | 14 | # Thumbnails 15 | ._* 16 | 17 | # Files that might appear in the root of a volume 18 | .DocumentRevisions-V100 19 | .fseventsd 20 | .Spotlight-V100 21 | .TemporaryItems 22 | .Trashes 23 | .VolumeIcon.icns 24 | .com.apple.timemachine.donotpresent 25 | 26 | # Directories potentially created on remote AFP share 27 | .AppleDB 28 | .AppleDesktop 29 | Network Trash Folder 30 | Temporary Items 31 | .apdisk 32 | 33 | ### macOS Patch ### 34 | # iCloud generated files 35 | *.icloud 36 | 37 | #!! ERROR: next is undefined. Use list command to see defined gitignore types !!# 38 | 39 | ### Node ### 40 | # Logs 41 | logs 42 | *.log 43 | npm-debug.log* 44 | yarn-debug.log* 45 | yarn-error.log* 46 | lerna-debug.log* 47 | .pnpm-debug.log* 48 | 49 | # Diagnostic reports (https://nodejs.org/api/report.html) 50 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 51 | 52 | # Runtime data 53 | pids 54 | *.pid 55 | *.seed 56 | *.pid.lock 57 | 58 | # Directory for instrumented libs generated by jscoverage/JSCover 59 | lib-cov 60 | 61 | # Coverage directory used by tools like istanbul 62 | coverage 63 | *.lcov 64 | 65 | # nyc test coverage 66 | .nyc_output 67 | 68 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 69 | .grunt 70 | 71 | # Bower dependency directory (https://bower.io/) 72 | bower_components 73 | 74 | # node-waf configuration 75 | .lock-wscript 76 | 77 | # Compiled binary addons (https://nodejs.org/api/addons.html) 78 | build/Release 79 | 80 | # Dependency directories 81 | node_modules/ 82 | jspm_packages/ 83 | 84 | # Snowpack dependency directory (https://snowpack.dev/) 85 | web_modules/ 86 | 87 | # TypeScript cache 88 | *.tsbuildinfo 89 | 90 | # Optional npm cache directory 91 | .npm 92 | 93 | # Optional eslint cache 94 | .eslintcache 95 | 96 | # Optional stylelint cache 97 | .stylelintcache 98 | 99 | # Microbundle cache 100 | .rpt2_cache/ 101 | .rts2_cache_cjs/ 102 | .rts2_cache_es/ 103 | .rts2_cache_umd/ 104 | 105 | # Optional REPL history 106 | .node_repl_history 107 | 108 | # Output of 'npm pack' 109 | *.tgz 110 | 111 | # Yarn Integrity file 112 | .yarn-integrity 113 | 114 | # dotenv environment variable files 115 | .env 116 | .env.development.local 117 | .env.test.local 118 | .env.production.local 119 | .env.local 120 | 121 | # parcel-bundler cache (https://parceljs.org/) 122 | .cache 123 | .parcel-cache 124 | 125 | # Next.js build output 126 | .next 127 | out 128 | 129 | # Nuxt.js build / generate output 130 | .nuxt 131 | dist 132 | 133 | # Gatsby files 134 | .cache/ 135 | # Comment in the public line in if your project uses Gatsby and not Next.js 136 | # https://nextjs.org/blog/next-9-1#public-directory-support 137 | # public 138 | 139 | # vuepress build output 140 | .vuepress/dist 141 | 142 | # vuepress v2.x temp and cache directory 143 | .temp 144 | 145 | # Docusaurus cache and generated files 146 | .docusaurus 147 | 148 | # Serverless directories 149 | .serverless/ 150 | 151 | # FuseBox cache 152 | .fusebox/ 153 | 154 | # DynamoDB Local files 155 | .dynamodb/ 156 | 157 | # TernJS port file 158 | .tern-port 159 | 160 | # Stores VSCode versions used for testing VSCode extensions 161 | .vscode-test 162 | 163 | # yarn v2 164 | .yarn/cache 165 | .yarn/unplugged 166 | .yarn/build-state.yml 167 | .yarn/install-state.gz 168 | .pnp.* 169 | 170 | ### Node Patch ### 171 | # Serverless Webpack directories 172 | .webpack/ 173 | 174 | # Optional stylelint cache 175 | 176 | # SvelteKit build / generate output 177 | .svelte-kit 178 | 179 | ### Windows ### 180 | # Windows thumbnail cache files 181 | Thumbs.db 182 | Thumbs.db:encryptable 183 | ehthumbs.db 184 | ehthumbs_vista.db 185 | 186 | # Dump file 187 | *.stackdump 188 | 189 | # Folder config file 190 | [Dd]esktop.ini 191 | 192 | # Recycle Bin used on file shares 193 | $RECYCLE.BIN/ 194 | 195 | # Windows Installer files 196 | *.cab 197 | *.msi 198 | *.msix 199 | *.msm 200 | *.msp 201 | 202 | # Windows shortcuts 203 | *.lnk 204 | 205 | # End of https://www.toptal.com/developers/gitignore/api/macos,windows,next,node 206 | n -------------------------------------------------------------------------------- /Sources/Gravity/RemoteObjectDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 21/03/2023. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol RemoteObjectDelegate { 11 | associatedtype Element: RemoteRepresentable 12 | static var shared: Self { get } 13 | 14 | var store: Store { get } // Where the DB data will be stored 15 | 16 | // Data processing 17 | func process(elements: [Element], for request: RemoteRequest) -> [Element] 18 | 19 | // CRUD 20 | func pull(request: RemoteRequest) async throws -> [Element] 21 | func push(elements: [Element]) async throws 22 | func pop(elements: [Element]) async throws 23 | 24 | // Reactivity 25 | func connect(heartbeat: Bool) async -> Connection? 26 | func subscribe(request: RemoteRequest) -> Bool 27 | func unsubscribe(request: RemoteRequest) 28 | } 29 | 30 | public enum Connection { 31 | case connecting 32 | case connected 33 | case disconnected 34 | } 35 | 36 | public extension RemoteObjectDelegate { 37 | func process(elements: [Element], for request: RemoteRequest) -> [Element] { 38 | return elements 39 | } 40 | 41 | func push(elements: [Element]) async throws { 42 | fatalError("Not Implemented") 43 | } 44 | func pop(elements: [Element]) async throws { 45 | fatalError("Not Implemented") 46 | } 47 | 48 | func connect(heartbeat: Bool) async -> Connection? { 49 | return nil // No WebSockets to be conencted 50 | } 51 | func subscribe(request: RemoteRequest) -> Bool { 52 | return false 53 | } 54 | func unsubscribe(request: RemoteRequest) {} 55 | } 56 | 57 | internal extension RemoteObjectDelegate { 58 | 59 | func sync() async throws { 60 | let needPush = await self.store.needPush 61 | let needPull = await self.store.needPull 62 | let needPop = await self.store.needPop 63 | 64 | if !needPush.isEmpty { 65 | try await requestPush(needPush: needPush) 66 | } 67 | 68 | if !needPop.isEmpty { 69 | try await requestPop(needPop: needPop) 70 | } 71 | 72 | if !needPull.isEmpty { 73 | try await requestPull(needPull: needPull) 74 | } 75 | 76 | // Time to save to disk 77 | try await self.store.saveToDisk() 78 | } 79 | 80 | func requestPush(needPush: Set) async throws { 81 | let objects = try await needPush.compactAsyncMap { await self.store.object(id: $0) } 82 | guard objects.count > 0 else { return } 83 | try await self.push(elements: objects) 84 | // Remove from needPush 85 | await self.store.purgePush(needPush) 86 | } 87 | 88 | func requestPull(needPull: Set>) async throws { 89 | for pull in needPull { 90 | let results = try await self.pull(request: pull) 91 | try await self.store.save(elements: results, with: pull, requestPushWithInterval: nil) 92 | // Remove from needPull 93 | await self.store.purgePull(pull) 94 | } 95 | } 96 | 97 | func requestPop(needPop: Set) async throws { 98 | try await self.pop(elements: Array(needPop)) 99 | // Remove from needPop 100 | await self.store.purgePop(needPop) 101 | } 102 | } 103 | 104 | internal extension Sequence { 105 | func compactAsyncMap( 106 | _ transform: @escaping (Element) async throws -> T? 107 | ) async throws -> [T] { 108 | let tasks = map { element in 109 | Task { 110 | try await transform(element) 111 | } 112 | } 113 | 114 | let results = try await tasks.asyncMap { task in 115 | try await task.value 116 | } 117 | 118 | return results.compactMap { $0 } 119 | } 120 | 121 | func asyncMap( 122 | _ transform: (Element) async throws -> T 123 | ) async rethrows -> [T] { 124 | var values = [T]() 125 | 126 | for element in self { 127 | try await values.append(transform(element)) 128 | } 129 | 130 | return values 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /docs/components/features.js: -------------------------------------------------------------------------------- 1 | import styles from './features.module.scss' 2 | 3 | const Feature = ({ text, icon }) => ( 4 |
5 | {icon} 6 |

{text}

7 |
8 | ) 9 | 10 | export default function Features() { 11 | return ( 12 |
13 |

SwiftUI library for data fetching

14 |
15 | 30 | 31 | 32 | } 33 | /> 34 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | } 57 | /> 58 | 72 | 73 | 74 | } 75 | /> 76 | 90 | 91 | 92 | } 93 | /> 94 | 108 | 109 | 110 | 111 | } 112 | /> 113 | 127 | 128 | 129 | 130 | } 131 | /> 132 |
133 |
134 | ) 135 | } -------------------------------------------------------------------------------- /Sources/Gravity/Store/Realtime/RealtimeController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RealtimeController.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 08/04/2023. 6 | // 7 | 8 | import Foundation 9 | import Network 10 | 11 | public final class RealtimeController where Delegate: RemoteObjectDelegate { 12 | var subscriptions = Set>() 13 | var subscribed = Set>() 14 | 15 | var heartbeatTimer: Timer? = nil 16 | var heartbeatInterval: TimeInterval = 5 17 | 18 | let pathMonitor = NWPathMonitor() 19 | var isMonitoring = false 20 | 21 | var isConnected = false 22 | 23 | init() { 24 | self.startMonitoring() 25 | Task { await self.connect() } 26 | } 27 | 28 | deinit { 29 | self.stopMonitoring() 30 | } 31 | 32 | func startMonitoring() { 33 | guard !isMonitoring else { return } 34 | isMonitoring = true 35 | 36 | pathMonitor.pathUpdateHandler = { [weak self] path in 37 | DispatchQueue.main.async { 38 | self?.networkChanged() 39 | } 40 | } 41 | 42 | let queue = DispatchQueue(label: "NetworkMonitor") 43 | pathMonitor.start(queue: queue) 44 | } 45 | 46 | func stopMonitoring() { 47 | self.heartbeatTimer?.invalidate() 48 | self.heartbeatTimer = nil 49 | guard isMonitoring else { return } 50 | isMonitoring = false 51 | 52 | pathMonitor.cancel() 53 | } 54 | 55 | func networkChanged() { 56 | if pathMonitor.currentPath.status == .satisfied { 57 | Task { await self.connect() } 58 | } else { 59 | self.heartbeatTimer?.invalidate() 60 | self.heartbeatTimer = nil 61 | } 62 | } 63 | 64 | func connect(retryingAfter: TimeInterval = 0) async { 65 | let connect = await Delegate.shared.connect(heartbeat: false) 66 | guard connect != nil else { return } 67 | guard connect != .connecting else { 68 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 69 | Task { await self.connect(retryingAfter: 0) } 70 | } 71 | return 72 | } 73 | if connect == .disconnected { 74 | print("Gravity: Connection failed") 75 | // Retry exponentially 76 | guard retryingAfter < 60 else { return } // Too many retries 77 | let retryingAfter = retryingAfter == 0 ? 1 : retryingAfter * 2 78 | DispatchQueue.main.asyncAfter(deadline: .now() + retryingAfter) { 79 | Task { await self.connect(retryingAfter: retryingAfter) } 80 | } 81 | return 82 | } 83 | self.isConnected = connect == .connected 84 | guard self.isConnected else { return } 85 | // Start heartbeat 86 | if self.heartbeatTimer == nil || !(self.heartbeatTimer?.isValid ?? false) { 87 | await MainActor.run { 88 | self.heartbeatTimer = Timer.scheduledTimer(withTimeInterval: heartbeatInterval, repeats: true) { _ in 89 | Task { await self.heartbeat() } 90 | } 91 | self.heartbeatTimer?.tolerance = 1 92 | } 93 | } 94 | self.heartbeatTimer?.fire() 95 | } 96 | 97 | func heartbeat() async { 98 | let connect = await Delegate.shared.connect(heartbeat: true) 99 | guard connect != nil else { return } 100 | guard connect != .connecting else { 101 | DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { 102 | Task { await self.connect(retryingAfter: 0) } 103 | } 104 | return 105 | } 106 | if connect == .disconnected { 107 | print("Gravity: Heartbeat failed") 108 | // Unsubscribe from all 109 | self.subscriptions.forEach { self.subscribed.remove($0) } 110 | // Reconnect 111 | await self.connect() 112 | } 113 | self.isConnected = connect == .connected 114 | guard self.isConnected else { return } 115 | 116 | self.subscriptions.subtracting(self.subscribed).forEach { sub in 117 | // Ask delegate 118 | if Delegate.shared.subscribe(request: sub) { 119 | self.subscribed.insert(sub) 120 | } 121 | } 122 | } 123 | 124 | public func subscribe(to request: RemoteRequest) { 125 | guard !self.subscriptions.contains(request) else { return } 126 | self.subscriptions.insert(request) 127 | } 128 | 129 | public func unsubscribe(to request: RemoteRequest) { 130 | guard self.subscriptions.contains(request) else { return } 131 | Delegate.shared.unsubscribe(request: request) 132 | self.subscriptions.remove(request) 133 | self.subscribed.remove(request) 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /Sources/Gravity/Store/Store.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Store.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 21/03/2023. 6 | // 7 | 8 | import Foundation 9 | 10 | @MainActor 11 | public class Store: ObservableObject where Delegate: RemoteObjectDelegate { 12 | typealias T = Delegate.Element 13 | 14 | let logger = Logger() 15 | 16 | let cache: Cache 17 | 18 | let scheduler = Scheduler() 19 | 20 | public let realtimeController = RealtimeController() 21 | 22 | var needPush = Set() 23 | var needPull = Set>() 24 | var needPop = Set() 25 | 26 | public nonisolated init(reference: String, 27 | entryLifetime: TimeInterval = 12 * 60 * 60, 28 | maximumEntryCount: Int = 50) throws { 29 | self.cache = try Cache(withReference: reference) 30 | self.cache.entryLifetime = entryLifetime 31 | self.cache.entryCache.countLimit = maximumEntryCount 32 | } 33 | 34 | func purgePush(_ pushed: Set) { 35 | self.needPush.subtract(pushed) 36 | } 37 | 38 | func purgePull(_ pulled: RemoteRequest) { 39 | self.needPull.remove(pulled) 40 | } 41 | 42 | func purgePop(_ popped: Set) { 43 | self.needPop.subtract(popped) 44 | } 45 | 46 | /// Revalidate request 47 | /// - Parameter request: the request you need to invalidate 48 | public func revalidate(request: RemoteRequest) { 49 | needPull.insert(request) 50 | try? self.scheduler.requestSync(delay: 0) 51 | } 52 | 53 | public func saveToDisk() throws { 54 | try self.cache.saveToDisk() 55 | } 56 | 57 | func save(_ element: T, with request: RemoteRequest, requestPushWithInterval interval: TimeInterval? = 5) throws { 58 | cache.insert(element, with: request) 59 | if let interval = interval { 60 | self.needPush.insert(element.id) 61 | try scheduler.requestSync(delay: interval) 62 | } 63 | // Notify all views that something has changed 64 | self.objectWillChange.send() 65 | } 66 | 67 | func save(elements: [T], with request: RemoteRequest, requestPushWithInterval interval: TimeInterval? = 5) throws { 68 | try elements.forEach { element in 69 | try save(element, with: request, requestPushWithInterval: interval) 70 | } 71 | } 72 | 73 | 74 | /// Adds element to the store, and updates all the views subscribed to the request, or displaying this element. 75 | /// - Parameters: 76 | /// - element: Whatever element 77 | /// - request: The request you're subscribing to 78 | /// - interval: the delay at which Gravity will push the elements to your backend. This is useful when you expect a lot of updates, and want to wait until you have a final object. 79 | public func add(_ element: Delegate.Element, with request: RemoteRequest, requestPushWithInterval interval: TimeInterval? = nil) throws { 80 | try save(element, with: request, requestPushWithInterval: interval) 81 | } 82 | 83 | /// Updates element in the store, and updates all the views subscribed to the request, or displaying this element. 84 | /// - Parameters: 85 | /// - id: The id/key of the element you need to update. 86 | /// - request: The request you're subscribing to 87 | /// - update: The inout function to update the element. 88 | public func update(elementWithID id: Delegate.Element.ID, with request: RemoteRequest, requestPushWithInterval interval: TimeInterval? = nil, _ update: (inout Delegate.Element) -> Void) throws { 89 | guard var object = self.object(id: id) else { return } 90 | update(&object) 91 | try self.save(object, with: request, requestPushWithInterval: interval) 92 | } 93 | 94 | /// Removes object from the cache, and updates all the views displaying this element. 95 | /// - Parameter id: the id of the element 96 | public func delete(element: Delegate.Element, requestPopWithInterval interval: TimeInterval? = nil) throws { 97 | if let interval = interval { 98 | self.needPop.insert(element) 99 | try scheduler.requestSync(delay: interval) 100 | } 101 | cache.removeValue(forKey: element.id) 102 | try? cache.saveToDisk() 103 | // Notify all views that something has changed 104 | self.objectWillChange.send() 105 | } 106 | 107 | func update(id: T.ID, with request: RemoteRequest, _ update: (inout T) -> Void) throws { 108 | guard var object = self.object(id: id) else { return } 109 | update(&object) 110 | try self.save(object, with: request) 111 | } 112 | 113 | internal func object(id: T.ID) -> T? { 114 | cache.value(forKey: id) 115 | } 116 | 117 | /// Get elements from the store 118 | /// - Parameter request: The request you're making to the store 119 | /// - Returns: An array of elements. If an element is not in cache or expired, it will be added to the revalidation queue, but not returned in the array. 120 | public func objects(request: RemoteRequest) -> [Delegate.Element] { 121 | guard let ids = request.isAll ? self.cache.allKeys : self.cache.keys(forRequest: request) else { 122 | self.revalidate(request: request) 123 | return [] 124 | } 125 | let objects = ids.map { self.object(id: $0) } 126 | 127 | if objects.contains(nil) { 128 | self.revalidate(request: request) 129 | } 130 | return Delegate.shared.process(elements: objects.compactMap { $0 }, for: request) 131 | } 132 | 133 | /// Reset cache 134 | public func reset() { 135 | cache.entryCache.removeAllObjects() 136 | cache.keyTracker.keys.removeAll() 137 | cache.keyTracker.requestCache.removeAll() 138 | try? cache.saveToDisk() 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /Sources/Gravity/Store/Cache/Cache.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Database.swift 3 | // 4 | // 5 | // Created by Arthur Guiot on 22/03/2023. 6 | // 7 | 8 | import CoreData 9 | import Foundation 10 | 11 | final class Cache where Element: RemoteRepresentable { 12 | typealias Key = Element.ID 13 | typealias Value = Element 14 | 15 | let entryCache = NSCache, Entry>() 16 | 17 | 18 | private let dateProvider: () -> Date 19 | var entryLifetime: TimeInterval 20 | let keyTracker = KeyTracker() 21 | 22 | internal var reference: String 23 | 24 | internal init(reference: String, 25 | dateProvider: @escaping () -> Date = Date.init, 26 | entryLifetime: TimeInterval = 12 * 60 * 60, 27 | maximumEntryCount: Int = 50) { 28 | self.reference = reference 29 | self.dateProvider = dateProvider 30 | self.entryLifetime = entryLifetime 31 | entryCache.countLimit = maximumEntryCount 32 | entryCache.delegate = keyTracker 33 | } 34 | 35 | deinit { 36 | try? self.saveToDisk() 37 | } 38 | 39 | func insert(_ value: Value, with request: RemoteRequest) { 40 | let date = dateProvider().addingTimeInterval(entryLifetime) 41 | let entry = Entry(value: value, expirationDate: date) 42 | entryCache.setObject(entry, forKey: WrappedKey(value.id)) 43 | let reqIds = request.ids 44 | if keyTracker.requestCache[reqIds] == nil { 45 | keyTracker.requestCache[reqIds] = WrappedKeys(.init(arrayLiteral: value.id)) 46 | } else { 47 | keyTracker.requestCache[reqIds]?.keys.insert(value.id) 48 | } 49 | keyTracker.keys.insert(value.id) 50 | } 51 | 52 | func value(forKey key: Key) -> Value? { 53 | guard let entry = entryCache.object(forKey: WrappedKey(key)) else { 54 | return nil 55 | } 56 | 57 | guard dateProvider() < entry.expirationDate else { 58 | // Discard values that have expired 59 | removeValue(forKey: key) 60 | return nil 61 | } 62 | 63 | return entry.value 64 | } 65 | 66 | func keys(forRequest request: RemoteRequest) -> [Key]? { 67 | guard let keys = keyTracker.requestCache[request.ids]?.keys else { return nil } 68 | return Array(keys) 69 | } 70 | 71 | func removeValue(forKey key: Key) { 72 | entryCache.removeObject(forKey: WrappedKey(key)) 73 | keyTracker.requestCache = keyTracker.requestCache.filter { !$1.keys.contains(key) } // Removing all request where entry was dropped 74 | } 75 | 76 | var allKeys: [Key]? { 77 | let keys = keyTracker.keys 78 | guard !keys.isEmpty else { return nil } 79 | return Array(keys) 80 | } 81 | } 82 | 83 | extension Cache { 84 | final class Entry: Codable, Equatable { 85 | static func == (lhs: Cache.Entry, rhs: Cache.Entry) -> Bool { 86 | guard lhs.value.id == rhs.value.id else { return false } 87 | return true 88 | } 89 | 90 | let value: Value 91 | let expirationDate: Date 92 | 93 | init(value: Value, expirationDate: Date) { 94 | self.value = value 95 | self.expirationDate = expirationDate 96 | } 97 | } 98 | } 99 | 100 | extension Cache { 101 | final class KeyTracker: NSObject, NSCacheDelegate { 102 | var keys = Set() 103 | 104 | var requestCache = Dictionary<[Key], WrappedKeys>() 105 | 106 | func cache(_ cache: NSCache, 107 | willEvictObject object: Any) { 108 | guard let entry = object as? Entry else { 109 | return 110 | } 111 | 112 | keys.remove(entry.value.id) 113 | // requestCache.forEach { $1.keys.remove(entry.value.id) } 114 | // requestCache = requestCache.filter { !$1.keys.contains(entry.value.id) } // Removing all request where entry was dropped 115 | } 116 | } 117 | } 118 | 119 | extension Cache: Codable { 120 | fileprivate func insert(entry: Entry) { 121 | entryCache.setObject(entry, forKey: WrappedKey(entry.value.id)) 122 | keyTracker.keys.insert(entry.value.id) 123 | } 124 | fileprivate func entry(forKey key: Key) -> Entry? { 125 | guard let entry = entryCache.object(forKey: WrappedKey(key)) else { 126 | return nil 127 | } 128 | 129 | guard dateProvider() < entry.expirationDate else { 130 | removeValue(forKey: key) 131 | return nil 132 | } 133 | 134 | return entry 135 | } 136 | 137 | private enum CodingKeys: String, CodingKey { 138 | case entries 139 | case requestCache 140 | case entryLifetime 141 | case maximumEntryCount 142 | case reference 143 | } 144 | 145 | 146 | convenience init(from decoder: Decoder) throws { 147 | let container = try decoder.container(keyedBy: CodingKeys.self) 148 | let reference = try container.decode(String.self, forKey: .reference) 149 | let entryLifetime = try container.decode(TimeInterval.self, forKey: .entryLifetime) 150 | let maximumEntryCount = try container.decode(Int.self, forKey: .maximumEntryCount) 151 | 152 | self.init(reference: reference, entryLifetime: entryLifetime, maximumEntryCount: maximumEntryCount) 153 | 154 | keyTracker.requestCache = try container.decode( 155 | Dictionary<[Key], WrappedKeys>.self, 156 | forKey: .requestCache 157 | ).filter { !$0.value.keys.isEmpty } 158 | 159 | let entries = try container.decode([Entry].self, forKey: .entries) 160 | entries.forEach(insert) 161 | } 162 | 163 | 164 | func encode(to encoder: Encoder) throws { 165 | var container = encoder.container(keyedBy: CodingKeys.self) 166 | try container.encode(keyTracker.keys.compactMap(entry), forKey: .entries) 167 | try container.encode(keyTracker.requestCache, forKey: .requestCache) 168 | try container.encode(self.entryLifetime, forKey: .entryLifetime) 169 | try container.encode(self.entryCache.countLimit, forKey: .maximumEntryCount) 170 | try container.encode(self.reference, forKey: .reference) 171 | } 172 | } 173 | 174 | 175 | extension Cache: Equatable { 176 | static func == (lhs: Gravity.Cache, rhs: Gravity.Cache) -> Bool { 177 | guard lhs.keyTracker.keys.count == rhs.keyTracker.keys.count else { return false } 178 | // Use reduce to check if all keys are equal 179 | guard lhs.keyTracker.keys.reduce(true, { $0 && (rhs.entry(forKey: $1) == lhs.entry(forKey: $1)) }) else { 180 | return false 181 | } 182 | 183 | guard lhs.keyTracker.requestCache == rhs.keyTracker.requestCache else { return false } 184 | return true 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /docs/theme.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | project: { 3 | link: 'https://github.com/pr1mer-tech/Gravity', 4 | }, 5 | footer: { 6 | text: `Copyright ${new Date().getFullYear()} © Pr1mer Tech.` 7 | }, 8 | docsRepositoryBase: 'https://github.com/pr1mer-tech/Gravity/tree/main/', // will link to the docs repo 9 | logo: <> 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | Gravity 26 | SwiftUI library for remote data fetching 27 | , 28 | head: <> 29 | 30 | 31 | 32 | 33 | } -------------------------------------------------------------------------------- /docs/public/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /docs/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.12.5": 6 | version "7.21.0" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" 8 | integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== 9 | dependencies: 10 | regenerator-runtime "^0.13.11" 11 | 12 | "@headlessui/react@^1.7.10": 13 | version "1.7.13" 14 | resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-1.7.13.tgz#fd150b394954e9f1d86ed2340cffd1217d6e7628" 15 | integrity sha512-9n+EQKRtD9266xIHXdY5MfiXPDfYwl7zBM7KOx2Ae3Gdgxy8QML1FkCMjq6AsOf0l6N9uvI4HcFtuFlenaldKg== 16 | dependencies: 17 | client-only "^0.0.1" 18 | 19 | "@mdx-js/mdx@^2.2.1", "@mdx-js/mdx@^2.3.0": 20 | version "2.3.0" 21 | resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-2.3.0.tgz#d65d8c3c28f3f46bb0e7cb3bf7613b39980671a9" 22 | integrity sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA== 23 | dependencies: 24 | "@types/estree-jsx" "^1.0.0" 25 | "@types/mdx" "^2.0.0" 26 | estree-util-build-jsx "^2.0.0" 27 | estree-util-is-identifier-name "^2.0.0" 28 | estree-util-to-js "^1.1.0" 29 | estree-walker "^3.0.0" 30 | hast-util-to-estree "^2.0.0" 31 | markdown-extensions "^1.0.0" 32 | periscopic "^3.0.0" 33 | remark-mdx "^2.0.0" 34 | remark-parse "^10.0.0" 35 | remark-rehype "^10.0.0" 36 | unified "^10.0.0" 37 | unist-util-position-from-estree "^1.0.0" 38 | unist-util-stringify-position "^3.0.0" 39 | unist-util-visit "^4.0.0" 40 | vfile "^5.0.0" 41 | 42 | "@mdx-js/react@^2.2.1", "@mdx-js/react@^2.3.0": 43 | version "2.3.0" 44 | resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3" 45 | integrity sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g== 46 | dependencies: 47 | "@types/mdx" "^2.0.0" 48 | "@types/react" ">=16" 49 | 50 | "@napi-rs/simple-git-android-arm-eabi@0.1.8": 51 | version "0.1.8" 52 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.8.tgz#303bea1ec00db24466e3b3ba13de337d87c5371b" 53 | integrity sha512-JJCejHBB1G6O8nxjQLT4quWCcvLpC3oRdJJ9G3MFYSCoYS8i1bWCWeU+K7Br+xT+D6s1t9q8kNJAwJv9Ygpi0g== 54 | 55 | "@napi-rs/simple-git-android-arm64@0.1.8": 56 | version "0.1.8" 57 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.8.tgz#42c8d04287364fd1619002629fa52183dcf462ee" 58 | integrity sha512-mraHzwWBw3tdRetNOS5KnFSjvdAbNBnjFLA8I4PwTCPJj3Q4txrigcPp2d59cJ0TC51xpnPXnZjYdNwwSI9g6g== 59 | 60 | "@napi-rs/simple-git-darwin-arm64@0.1.8": 61 | version "0.1.8" 62 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.8.tgz#e210808e6d646d6efecea84c67ced8eb44a8f821" 63 | integrity sha512-ufy/36eI/j4UskEuvqSH7uXtp3oXeLDmjQCfKJz3u5Vx98KmOMKrqAm2H81AB2WOtCo5mqS6PbBeUXR8BJX8lQ== 64 | 65 | "@napi-rs/simple-git-darwin-x64@0.1.8": 66 | version "0.1.8" 67 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.8.tgz#d717525c33e0dfd8a6d6215da2fcbc0ad40011e1" 68 | integrity sha512-Vb21U+v3tPJNl+8JtIHHT8HGe6WZ8o1Tq3f6p+Jx9Cz71zEbcIiB9FCEMY1knS/jwQEOuhhlI9Qk7d4HY+rprA== 69 | 70 | "@napi-rs/simple-git-linux-arm-gnueabihf@0.1.8": 71 | version "0.1.8" 72 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.8.tgz#03e7b2dd299c10e61bbf29f405ea74f6571cf6a1" 73 | integrity sha512-6BPTJ7CzpSm2t54mRLVaUr3S7ORJfVJoCk2rQ8v8oDg0XAMKvmQQxOsAgqKBo9gYNHJnqrOx3AEuEgvB586BuQ== 74 | 75 | "@napi-rs/simple-git-linux-arm64-gnu@0.1.8": 76 | version "0.1.8" 77 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.8.tgz#945123f75c9a36fd0364e789ce06cd29a74a43cc" 78 | integrity sha512-qfESqUCAA/XoQpRXHptSQ8gIFnETCQt1zY9VOkplx6tgYk9PCeaX4B1Xuzrh3eZamSCMJFn+1YB9Ut8NwyGgAA== 79 | 80 | "@napi-rs/simple-git-linux-arm64-musl@0.1.8": 81 | version "0.1.8" 82 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.8.tgz#2c20a0bff7c08f60b033ed7056dcb07bbbff8310" 83 | integrity sha512-G80BQPpaRmQpn8dJGHp4I2/YVhWDUNJwcCrJAtAdbKFDCMyCHJBln2ERL/+IEUlIAT05zK/c1Z5WEprvXEdXow== 84 | 85 | "@napi-rs/simple-git-linux-x64-gnu@0.1.8": 86 | version "0.1.8" 87 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.8.tgz#980e22b7376252a0767298ec801d374d97553da1" 88 | integrity sha512-NI6o1sZYEf6vPtNWJAm9w8BxJt+LlSFW0liSjYe3lc3e4dhMfV240f0ALeqlwdIldRPaDFwZSJX5/QbS7nMzhw== 89 | 90 | "@napi-rs/simple-git-linux-x64-musl@0.1.8": 91 | version "0.1.8" 92 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.8.tgz#edca3b2833dc5d3fc9151f5b931f7b14478ccca4" 93 | integrity sha512-wljGAEOW41er45VTiU8kXJmO480pQKzsgRCvPlJJSCaEVBbmo6XXbFIXnZy1a2J3Zyy2IOsRB4PVkUZaNuPkZQ== 94 | 95 | "@napi-rs/simple-git-win32-arm64-msvc@0.1.8": 96 | version "0.1.8" 97 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.8.tgz#3ac4c7fe816a2cdafabd091ded76161d1ba1fe88" 98 | integrity sha512-QuV4QILyKPfbWHoQKrhXqjiCClx0SxbCTVogkR89BwivekqJMd9UlMxZdoCmwLWutRx4z9KmzQqokvYI5QeepA== 99 | 100 | "@napi-rs/simple-git-win32-x64-msvc@0.1.8": 101 | version "0.1.8" 102 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.8.tgz#3b825bc2cb1c7ff535a3ca03768142d68bbf5c19" 103 | integrity sha512-UzNS4JtjhZhZ5hRLq7BIUq+4JOwt1ThIKv11CsF1ag2l99f0123XvfEpjczKTaa94nHtjXYc2Mv9TjccBqYOew== 104 | 105 | "@napi-rs/simple-git@^0.1.8": 106 | version "0.1.8" 107 | resolved "https://registry.yarnpkg.com/@napi-rs/simple-git/-/simple-git-0.1.8.tgz#391cb58436d50bd32d924611d45bdc41f5e7607a" 108 | integrity sha512-BvOMdkkofTz6lEE35itJ/laUokPhr/5ToMGlOH25YnhLD2yN1KpRAT4blW9tT8281/1aZjW3xyi73bs//IrDKA== 109 | optionalDependencies: 110 | "@napi-rs/simple-git-android-arm-eabi" "0.1.8" 111 | "@napi-rs/simple-git-android-arm64" "0.1.8" 112 | "@napi-rs/simple-git-darwin-arm64" "0.1.8" 113 | "@napi-rs/simple-git-darwin-x64" "0.1.8" 114 | "@napi-rs/simple-git-linux-arm-gnueabihf" "0.1.8" 115 | "@napi-rs/simple-git-linux-arm64-gnu" "0.1.8" 116 | "@napi-rs/simple-git-linux-arm64-musl" "0.1.8" 117 | "@napi-rs/simple-git-linux-x64-gnu" "0.1.8" 118 | "@napi-rs/simple-git-linux-x64-musl" "0.1.8" 119 | "@napi-rs/simple-git-win32-arm64-msvc" "0.1.8" 120 | "@napi-rs/simple-git-win32-x64-msvc" "0.1.8" 121 | 122 | "@next/env@13.2.4": 123 | version "13.2.4" 124 | resolved "https://registry.yarnpkg.com/@next/env/-/env-13.2.4.tgz#8b763700262b2445140a44a8c8d088cef676dbae" 125 | integrity sha512-+Mq3TtpkeeKFZanPturjcXt+KHfKYnLlX6jMLyCrmpq6OOs4i1GqBOAauSkii9QeKCMTYzGppar21JU57b/GEA== 126 | 127 | "@next/swc-android-arm-eabi@13.2.4": 128 | version "13.2.4" 129 | resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.4.tgz#758d0403771e549f9cee71cbabc0cb16a6c947c0" 130 | integrity sha512-DWlalTSkLjDU11MY11jg17O1gGQzpRccM9Oes2yTqj2DpHndajrXHGxj9HGtJ+idq2k7ImUdJVWS2h2l/EDJOw== 131 | 132 | "@next/swc-android-arm64@13.2.4": 133 | version "13.2.4" 134 | resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.4.tgz#834d586523045110d5602e0c8aae9028835ac427" 135 | integrity sha512-sRavmUImUCf332Gy+PjIfLkMhiRX1Ez4SI+3vFDRs1N5eXp+uNzjFUK/oLMMOzk6KFSkbiK/3Wt8+dHQR/flNg== 136 | 137 | "@next/swc-darwin-arm64@13.2.4": 138 | version "13.2.4" 139 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.4.tgz#5006fca179a36ef3a24d293abadec7438dbb48c6" 140 | integrity sha512-S6vBl+OrInP47TM3LlYx65betocKUUlTZDDKzTiRDbsRESeyIkBtZ6Qi5uT2zQs4imqllJznVjFd1bXLx3Aa6A== 141 | 142 | "@next/swc-darwin-x64@13.2.4": 143 | version "13.2.4" 144 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.4.tgz#6549c7c04322766acc3264ccdb3e1b43fcaf7946" 145 | integrity sha512-a6LBuoYGcFOPGd4o8TPo7wmv5FnMr+Prz+vYHopEDuhDoMSHOnC+v+Ab4D7F0NMZkvQjEJQdJS3rqgFhlZmKlw== 146 | 147 | "@next/swc-freebsd-x64@13.2.4": 148 | version "13.2.4" 149 | resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.4.tgz#0bbe28979e3e868debc2cc06e45e186ce195b7f4" 150 | integrity sha512-kkbzKVZGPaXRBPisoAQkh3xh22r+TD+5HwoC5bOkALraJ0dsOQgSMAvzMXKsN3tMzJUPS0tjtRf1cTzrQ0I5vQ== 151 | 152 | "@next/swc-linux-arm-gnueabihf@13.2.4": 153 | version "13.2.4" 154 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.4.tgz#1d28d2203f5a7427d6e7119d7bcb5fc40959fb3e" 155 | integrity sha512-7qA1++UY0fjprqtjBZaOA6cas/7GekpjVsZn/0uHvquuITFCdKGFCsKNBx3S0Rpxmx6WYo0GcmhNRM9ru08BGg== 156 | 157 | "@next/swc-linux-arm64-gnu@13.2.4": 158 | version "13.2.4" 159 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.4.tgz#eb26448190948cdf4c44b8f34110a3ecea32f1d0" 160 | integrity sha512-xzYZdAeq883MwXgcwc72hqo/F/dwUxCukpDOkx/j1HTq/J0wJthMGjinN9wH5bPR98Mfeh1MZJ91WWPnZOedOg== 161 | 162 | "@next/swc-linux-arm64-musl@13.2.4": 163 | version "13.2.4" 164 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.4.tgz#c4227c0acd94a420bb14924820710e6284d234d3" 165 | integrity sha512-8rXr3WfmqSiYkb71qzuDP6I6R2T2tpkmf83elDN8z783N9nvTJf2E7eLx86wu2OJCi4T05nuxCsh4IOU3LQ5xw== 166 | 167 | "@next/swc-linux-x64-gnu@13.2.4": 168 | version "13.2.4" 169 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.4.tgz#6bcb540944ee9b0209b33bfc23b240c2044dfc3e" 170 | integrity sha512-Ngxh51zGSlYJ4EfpKG4LI6WfquulNdtmHg1yuOYlaAr33KyPJp4HeN/tivBnAHcZkoNy0hh/SbwDyCnz5PFJQQ== 171 | 172 | "@next/swc-linux-x64-musl@13.2.4": 173 | version "13.2.4" 174 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.4.tgz#ce21e43251eaf09a09df39372b2c3e38028c30ff" 175 | integrity sha512-gOvwIYoSxd+j14LOcvJr+ekd9fwYT1RyMAHOp7znA10+l40wkFiMONPLWiZuHxfRk+Dy7YdNdDh3ImumvL6VwA== 176 | 177 | "@next/swc-win32-arm64-msvc@13.2.4": 178 | version "13.2.4" 179 | resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.4.tgz#68220063d8e5e082f5465498675640dedb670ff1" 180 | integrity sha512-q3NJzcfClgBm4HvdcnoEncmztxrA5GXqKeiZ/hADvC56pwNALt3ngDC6t6qr1YW9V/EPDxCYeaX4zYxHciW4Dw== 181 | 182 | "@next/swc-win32-ia32-msvc@13.2.4": 183 | version "13.2.4" 184 | resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.4.tgz#7c120ab54a081be9566df310bed834f168252990" 185 | integrity sha512-/eZ5ncmHUYtD2fc6EUmAIZlAJnVT2YmxDsKs1Ourx0ttTtvtma/WKlMV5NoUsyOez0f9ExLyOpeCoz5aj+MPXw== 186 | 187 | "@next/swc-win32-x64-msvc@13.2.4": 188 | version "13.2.4" 189 | resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.4.tgz#5abda92fe12b9829bf7951c4a221282c56041144" 190 | integrity sha512-0MffFmyv7tBLlji01qc0IaPP/LVExzvj7/R5x1Jph1bTAIj4Vu81yFQWHHQAP6r4ff9Ukj1mBK6MDNVXm7Tcvw== 191 | 192 | "@popperjs/core@^2.11.6": 193 | version "2.11.7" 194 | resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" 195 | integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== 196 | 197 | "@swc/helpers@0.4.14": 198 | version "0.4.14" 199 | resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" 200 | integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== 201 | dependencies: 202 | tslib "^2.4.0" 203 | 204 | "@types/acorn@^4.0.0": 205 | version "4.0.6" 206 | resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.6.tgz#d61ca5480300ac41a7d973dd5b84d0a591154a22" 207 | integrity sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ== 208 | dependencies: 209 | "@types/estree" "*" 210 | 211 | "@types/debug@^4.0.0": 212 | version "4.1.7" 213 | resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" 214 | integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== 215 | dependencies: 216 | "@types/ms" "*" 217 | 218 | "@types/estree-jsx@^1.0.0": 219 | version "1.0.0" 220 | resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-1.0.0.tgz#7bfc979ab9f692b492017df42520f7f765e98df1" 221 | integrity sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ== 222 | dependencies: 223 | "@types/estree" "*" 224 | 225 | "@types/estree@*", "@types/estree@^1.0.0": 226 | version "1.0.0" 227 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" 228 | integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== 229 | 230 | "@types/hast@^2.0.0": 231 | version "2.3.4" 232 | resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" 233 | integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== 234 | dependencies: 235 | "@types/unist" "*" 236 | 237 | "@types/js-yaml@^4.0.0": 238 | version "4.0.5" 239 | resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" 240 | integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== 241 | 242 | "@types/katex@^0.11.0": 243 | version "0.11.1" 244 | resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.11.1.tgz#34de04477dcf79e2ef6c8d23b41a3d81f9ebeaf5" 245 | integrity sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg== 246 | 247 | "@types/mdast@^3.0.0": 248 | version "3.0.11" 249 | resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" 250 | integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== 251 | dependencies: 252 | "@types/unist" "*" 253 | 254 | "@types/mdx@^2.0.0": 255 | version "2.0.3" 256 | resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.3.tgz#43fd32414f17fcbeced3578109a6edd877a2d96e" 257 | integrity sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ== 258 | 259 | "@types/ms@*": 260 | version "0.7.31" 261 | resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" 262 | integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== 263 | 264 | "@types/prop-types@*": 265 | version "15.7.5" 266 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" 267 | integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== 268 | 269 | "@types/react@>=16": 270 | version "18.0.29" 271 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.29.tgz#4cead505172c0020c5b51940199e31fc6ff2f63a" 272 | integrity sha512-wXHktgUABxplw1+UnljseDq4+uztQyp2tlWZRIxHlpchsCFqiYkvaDS8JR7eKOQm8wziTH/el5qL7D6gYNkYcw== 273 | dependencies: 274 | "@types/prop-types" "*" 275 | "@types/scheduler" "*" 276 | csstype "^3.0.2" 277 | 278 | "@types/scheduler@*": 279 | version "0.16.3" 280 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" 281 | integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== 282 | 283 | "@types/unist@*", "@types/unist@^2.0.0": 284 | version "2.0.6" 285 | resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" 286 | integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== 287 | 288 | acorn-jsx@^5.0.0: 289 | version "5.3.2" 290 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 291 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 292 | 293 | acorn@^8.0.0: 294 | version "8.8.2" 295 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" 296 | integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== 297 | 298 | ansi-sequence-parser@^1.1.0: 299 | version "1.1.0" 300 | resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed" 301 | integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ== 302 | 303 | ansi-styles@^3.1.0: 304 | version "3.2.1" 305 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 306 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 307 | dependencies: 308 | color-convert "^1.9.0" 309 | 310 | anymatch@~3.1.2: 311 | version "3.1.3" 312 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 313 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 314 | dependencies: 315 | normalize-path "^3.0.0" 316 | picomatch "^2.0.4" 317 | 318 | arch@^2.1.0: 319 | version "2.2.0" 320 | resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" 321 | integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== 322 | 323 | arg@1.0.0: 324 | version "1.0.0" 325 | resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.0.tgz#444d885a4e25b121640b55155ef7cd03975d6050" 326 | integrity sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw== 327 | 328 | argparse@^1.0.7: 329 | version "1.0.10" 330 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 331 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 332 | dependencies: 333 | sprintf-js "~1.0.2" 334 | 335 | argparse@^2.0.1: 336 | version "2.0.1" 337 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 338 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 339 | 340 | astring@^1.8.0: 341 | version "1.8.4" 342 | resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.4.tgz#6d4c5d8de7be2ead9e4a3cc0e2efb8d759378904" 343 | integrity sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw== 344 | 345 | bail@^2.0.0: 346 | version "2.0.2" 347 | resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" 348 | integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== 349 | 350 | binary-extensions@^2.0.0: 351 | version "2.2.0" 352 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 353 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 354 | 355 | braces@~3.0.2: 356 | version "3.0.2" 357 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 358 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 359 | dependencies: 360 | fill-range "^7.0.1" 361 | 362 | caniuse-lite@^1.0.30001406: 363 | version "1.0.30001470" 364 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz#09c8e87c711f75ff5d39804db2613dd593feeb10" 365 | integrity sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA== 366 | 367 | ccount@^2.0.0: 368 | version "2.0.1" 369 | resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" 370 | integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== 371 | 372 | chalk@2.3.0: 373 | version "2.3.0" 374 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" 375 | integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q== 376 | dependencies: 377 | ansi-styles "^3.1.0" 378 | escape-string-regexp "^1.0.5" 379 | supports-color "^4.0.0" 380 | 381 | character-entities-html4@^2.0.0: 382 | version "2.1.0" 383 | resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" 384 | integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== 385 | 386 | character-entities-legacy@^3.0.0: 387 | version "3.0.0" 388 | resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" 389 | integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== 390 | 391 | character-entities@^2.0.0: 392 | version "2.0.2" 393 | resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" 394 | integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== 395 | 396 | character-reference-invalid@^2.0.0: 397 | version "2.0.1" 398 | resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" 399 | integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== 400 | 401 | "chokidar@>=3.0.0 <4.0.0": 402 | version "3.5.3" 403 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 404 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 405 | dependencies: 406 | anymatch "~3.1.2" 407 | braces "~3.0.2" 408 | glob-parent "~5.1.2" 409 | is-binary-path "~2.1.0" 410 | is-glob "~4.0.1" 411 | normalize-path "~3.0.0" 412 | readdirp "~3.6.0" 413 | optionalDependencies: 414 | fsevents "~2.3.2" 415 | 416 | client-only@0.0.1, client-only@^0.0.1: 417 | version "0.0.1" 418 | resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" 419 | integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== 420 | 421 | clipboardy@1.2.2: 422 | version "1.2.2" 423 | resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.2.tgz#2ce320b9ed9be1514f79878b53ff9765420903e2" 424 | integrity sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw== 425 | dependencies: 426 | arch "^2.1.0" 427 | execa "^0.8.0" 428 | 429 | clsx@^1.2.1: 430 | version "1.2.1" 431 | resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" 432 | integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== 433 | 434 | color-convert@^1.9.0: 435 | version "1.9.3" 436 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 437 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 438 | dependencies: 439 | color-name "1.1.3" 440 | 441 | color-name@1.1.3: 442 | version "1.1.3" 443 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 444 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 445 | 446 | comma-separated-tokens@^2.0.0: 447 | version "2.0.3" 448 | resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" 449 | integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== 450 | 451 | commander@^8.0.0: 452 | version "8.3.0" 453 | resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" 454 | integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== 455 | 456 | compute-scroll-into-view@^3.0.0: 457 | version "3.0.0" 458 | resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.0.0.tgz#95d2f2f4653e7edda74dd1e38edaaa897918e0f0" 459 | integrity sha512-Yk1An4qzo5++Cu6peT9PsmRKIU8tALpmdoE09n//AfGQFcPfx21/tMGMsmKYmLJWaBJrGOJ5Jz5hoU+7cZZUWQ== 460 | 461 | cross-spawn@^5.0.1: 462 | version "5.1.0" 463 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 464 | integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== 465 | dependencies: 466 | lru-cache "^4.0.1" 467 | shebang-command "^1.2.0" 468 | which "^1.2.9" 469 | 470 | csstype@^3.0.2: 471 | version "3.1.1" 472 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" 473 | integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== 474 | 475 | debug@^4.0.0: 476 | version "4.3.4" 477 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 478 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 479 | dependencies: 480 | ms "2.1.2" 481 | 482 | decode-named-character-reference@^1.0.0: 483 | version "1.0.2" 484 | resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" 485 | integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== 486 | dependencies: 487 | character-entities "^2.0.0" 488 | 489 | dequal@^2.0.0: 490 | version "2.0.3" 491 | resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" 492 | integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== 493 | 494 | diff@^5.0.0: 495 | version "5.1.0" 496 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" 497 | integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== 498 | 499 | escape-string-regexp@^1.0.5: 500 | version "1.0.5" 501 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 502 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 503 | 504 | escape-string-regexp@^5.0.0: 505 | version "5.0.0" 506 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" 507 | integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== 508 | 509 | esprima@^4.0.0: 510 | version "4.0.1" 511 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 512 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 513 | 514 | estree-util-attach-comments@^2.0.0: 515 | version "2.1.1" 516 | resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.1.1.tgz#ee44f4ff6890ee7dfb3237ac7810154c94c63f84" 517 | integrity sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w== 518 | dependencies: 519 | "@types/estree" "^1.0.0" 520 | 521 | estree-util-build-jsx@^2.0.0: 522 | version "2.2.2" 523 | resolved "https://registry.yarnpkg.com/estree-util-build-jsx/-/estree-util-build-jsx-2.2.2.tgz#32f8a239fb40dc3f3dca75bb5dcf77a831e4e47b" 524 | integrity sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg== 525 | dependencies: 526 | "@types/estree-jsx" "^1.0.0" 527 | estree-util-is-identifier-name "^2.0.0" 528 | estree-walker "^3.0.0" 529 | 530 | estree-util-is-identifier-name@^2.0.0: 531 | version "2.1.0" 532 | resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.1.0.tgz#fb70a432dcb19045e77b05c8e732f1364b4b49b2" 533 | integrity sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ== 534 | 535 | estree-util-to-js@^1.1.0: 536 | version "1.2.0" 537 | resolved "https://registry.yarnpkg.com/estree-util-to-js/-/estree-util-to-js-1.2.0.tgz#0f80d42443e3b13bd32f7012fffa6f93603f4a36" 538 | integrity sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA== 539 | dependencies: 540 | "@types/estree-jsx" "^1.0.0" 541 | astring "^1.8.0" 542 | source-map "^0.7.0" 543 | 544 | estree-util-value-to-estree@^1.3.0: 545 | version "1.3.0" 546 | resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-1.3.0.tgz#1d3125594b4d6680f666644491e7ac1745a3df49" 547 | integrity sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw== 548 | dependencies: 549 | is-plain-obj "^3.0.0" 550 | 551 | estree-util-visit@^1.0.0: 552 | version "1.2.1" 553 | resolved "https://registry.yarnpkg.com/estree-util-visit/-/estree-util-visit-1.2.1.tgz#8bc2bc09f25b00827294703835aabee1cc9ec69d" 554 | integrity sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw== 555 | dependencies: 556 | "@types/estree-jsx" "^1.0.0" 557 | "@types/unist" "^2.0.0" 558 | 559 | estree-walker@^3.0.0: 560 | version "3.0.3" 561 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" 562 | integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== 563 | dependencies: 564 | "@types/estree" "^1.0.0" 565 | 566 | execa@^0.8.0: 567 | version "0.8.0" 568 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" 569 | integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== 570 | dependencies: 571 | cross-spawn "^5.0.1" 572 | get-stream "^3.0.0" 573 | is-stream "^1.1.0" 574 | npm-run-path "^2.0.0" 575 | p-finally "^1.0.0" 576 | signal-exit "^3.0.0" 577 | strip-eof "^1.0.0" 578 | 579 | extend-shallow@^2.0.1: 580 | version "2.0.1" 581 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 582 | integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== 583 | dependencies: 584 | is-extendable "^0.1.0" 585 | 586 | extend@^3.0.0: 587 | version "3.0.2" 588 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 589 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 590 | 591 | fill-range@^7.0.1: 592 | version "7.0.1" 593 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 594 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 595 | dependencies: 596 | to-regex-range "^5.0.1" 597 | 598 | flexsearch@^0.7.21: 599 | version "0.7.31" 600 | resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.7.31.tgz#065d4110b95083110b9b6c762a71a77cc52e4702" 601 | integrity sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA== 602 | 603 | focus-visible@^5.2.0: 604 | version "5.2.0" 605 | resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" 606 | integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== 607 | 608 | fsevents@~2.3.2: 609 | version "2.3.2" 610 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 611 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 612 | 613 | get-stream@^3.0.0: 614 | version "3.0.0" 615 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 616 | integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== 617 | 618 | git-up@^7.0.0: 619 | version "7.0.0" 620 | resolved "https://registry.yarnpkg.com/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" 621 | integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== 622 | dependencies: 623 | is-ssh "^1.4.0" 624 | parse-url "^8.1.0" 625 | 626 | git-url-parse@^13.1.0: 627 | version "13.1.0" 628 | resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" 629 | integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== 630 | dependencies: 631 | git-up "^7.0.0" 632 | 633 | github-slugger@^2.0.0: 634 | version "2.0.0" 635 | resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-2.0.0.tgz#52cf2f9279a21eb6c59dd385b410f0c0adda8f1a" 636 | integrity sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw== 637 | 638 | glob-parent@~5.1.2: 639 | version "5.1.2" 640 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 641 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 642 | dependencies: 643 | is-glob "^4.0.1" 644 | 645 | graceful-fs@^4.2.10: 646 | version "4.2.11" 647 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 648 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 649 | 650 | gray-matter@^4.0.3: 651 | version "4.0.3" 652 | resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" 653 | integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== 654 | dependencies: 655 | js-yaml "^3.13.1" 656 | kind-of "^6.0.2" 657 | section-matter "^1.0.0" 658 | strip-bom-string "^1.0.0" 659 | 660 | has-flag@^2.0.0: 661 | version "2.0.0" 662 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 663 | integrity sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng== 664 | 665 | hash-obj@^4.0.0: 666 | version "4.0.0" 667 | resolved "https://registry.yarnpkg.com/hash-obj/-/hash-obj-4.0.0.tgz#3fafeb0b5f17994441dbe04efbdee82e26b74c8c" 668 | integrity sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg== 669 | dependencies: 670 | is-obj "^3.0.0" 671 | sort-keys "^5.0.0" 672 | type-fest "^1.0.2" 673 | 674 | hast-util-from-parse5@^7.0.0: 675 | version "7.1.2" 676 | resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" 677 | integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== 678 | dependencies: 679 | "@types/hast" "^2.0.0" 680 | "@types/unist" "^2.0.0" 681 | hastscript "^7.0.0" 682 | property-information "^6.0.0" 683 | vfile "^5.0.0" 684 | vfile-location "^4.0.0" 685 | web-namespaces "^2.0.0" 686 | 687 | hast-util-is-element@^2.0.0: 688 | version "2.1.3" 689 | resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz#cd3279cfefb70da6d45496068f020742256fc471" 690 | integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== 691 | dependencies: 692 | "@types/hast" "^2.0.0" 693 | "@types/unist" "^2.0.0" 694 | 695 | hast-util-parse-selector@^3.0.0: 696 | version "3.1.1" 697 | resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" 698 | integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== 699 | dependencies: 700 | "@types/hast" "^2.0.0" 701 | 702 | hast-util-to-estree@^2.0.0: 703 | version "2.3.2" 704 | resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.3.2.tgz#11ab0cd2e70ecf0305151af56e636b1cdfbba0bf" 705 | integrity sha512-YYDwATNdnvZi3Qi84iatPIl1lWpXba1MeNrNbDfJfVzEBZL8uUmtR7mt7bxKBC8kuAuvb0bkojXYZzsNHyHCLg== 706 | dependencies: 707 | "@types/estree" "^1.0.0" 708 | "@types/estree-jsx" "^1.0.0" 709 | "@types/hast" "^2.0.0" 710 | "@types/unist" "^2.0.0" 711 | comma-separated-tokens "^2.0.0" 712 | estree-util-attach-comments "^2.0.0" 713 | estree-util-is-identifier-name "^2.0.0" 714 | hast-util-whitespace "^2.0.0" 715 | mdast-util-mdx-expression "^1.0.0" 716 | mdast-util-mdxjs-esm "^1.0.0" 717 | property-information "^6.0.0" 718 | space-separated-tokens "^2.0.0" 719 | style-to-object "^0.4.1" 720 | unist-util-position "^4.0.0" 721 | zwitch "^2.0.0" 722 | 723 | hast-util-to-text@^3.1.0: 724 | version "3.1.2" 725 | resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz#ecf30c47141f41e91a5d32d0b1e1859fd2ac04f2" 726 | integrity sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw== 727 | dependencies: 728 | "@types/hast" "^2.0.0" 729 | "@types/unist" "^2.0.0" 730 | hast-util-is-element "^2.0.0" 731 | unist-util-find-after "^4.0.0" 732 | 733 | hast-util-whitespace@^2.0.0: 734 | version "2.0.1" 735 | resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" 736 | integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== 737 | 738 | hastscript@^7.0.0: 739 | version "7.2.0" 740 | resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" 741 | integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== 742 | dependencies: 743 | "@types/hast" "^2.0.0" 744 | comma-separated-tokens "^2.0.0" 745 | hast-util-parse-selector "^3.0.0" 746 | property-information "^6.0.0" 747 | space-separated-tokens "^2.0.0" 748 | 749 | immutable@^4.0.0: 750 | version "4.3.0" 751 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" 752 | integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== 753 | 754 | inline-style-parser@0.1.1: 755 | version "0.1.1" 756 | resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" 757 | integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== 758 | 759 | intersection-observer@^0.12.2: 760 | version "0.12.2" 761 | resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.12.2.tgz#4a45349cc0cd91916682b1f44c28d7ec737dc375" 762 | integrity sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg== 763 | 764 | is-alphabetical@^2.0.0: 765 | version "2.0.1" 766 | resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" 767 | integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== 768 | 769 | is-alphanumerical@^2.0.0: 770 | version "2.0.1" 771 | resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" 772 | integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== 773 | dependencies: 774 | is-alphabetical "^2.0.0" 775 | is-decimal "^2.0.0" 776 | 777 | is-binary-path@~2.1.0: 778 | version "2.1.0" 779 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 780 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 781 | dependencies: 782 | binary-extensions "^2.0.0" 783 | 784 | is-buffer@^2.0.0: 785 | version "2.0.5" 786 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" 787 | integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== 788 | 789 | is-decimal@^2.0.0: 790 | version "2.0.1" 791 | resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" 792 | integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== 793 | 794 | is-extendable@^0.1.0: 795 | version "0.1.1" 796 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 797 | integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== 798 | 799 | is-extglob@^2.1.1: 800 | version "2.1.1" 801 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 802 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 803 | 804 | is-glob@^4.0.1, is-glob@~4.0.1: 805 | version "4.0.3" 806 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 807 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 808 | dependencies: 809 | is-extglob "^2.1.1" 810 | 811 | is-hexadecimal@^2.0.0: 812 | version "2.0.1" 813 | resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" 814 | integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== 815 | 816 | is-number@^7.0.0: 817 | version "7.0.0" 818 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 819 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 820 | 821 | is-obj@^3.0.0: 822 | version "3.0.0" 823 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-3.0.0.tgz#b0889f1f9f8cb87e87df53a8d1230a2250f8b9be" 824 | integrity sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ== 825 | 826 | is-plain-obj@^3.0.0: 827 | version "3.0.0" 828 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" 829 | integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== 830 | 831 | is-plain-obj@^4.0.0: 832 | version "4.1.0" 833 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" 834 | integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== 835 | 836 | is-reference@^3.0.0: 837 | version "3.0.1" 838 | resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.1.tgz#d400f4260f7e55733955e60d361d827eb4d3b831" 839 | integrity sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w== 840 | dependencies: 841 | "@types/estree" "*" 842 | 843 | is-ssh@^1.4.0: 844 | version "1.4.0" 845 | resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" 846 | integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== 847 | dependencies: 848 | protocols "^2.0.1" 849 | 850 | is-stream@^1.1.0: 851 | version "1.1.0" 852 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 853 | integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== 854 | 855 | isexe@^2.0.0: 856 | version "2.0.0" 857 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 858 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 859 | 860 | "js-tokens@^3.0.0 || ^4.0.0": 861 | version "4.0.0" 862 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 863 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 864 | 865 | js-yaml@^3.13.1: 866 | version "3.14.1" 867 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 868 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 869 | dependencies: 870 | argparse "^1.0.7" 871 | esprima "^4.0.0" 872 | 873 | js-yaml@^4.0.0: 874 | version "4.1.0" 875 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 876 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 877 | dependencies: 878 | argparse "^2.0.1" 879 | 880 | jsonc-parser@^3.2.0: 881 | version "3.2.0" 882 | resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" 883 | integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== 884 | 885 | katex@^0.13.0: 886 | version "0.13.24" 887 | resolved "https://registry.yarnpkg.com/katex/-/katex-0.13.24.tgz#fe55455eb455698cb24b911a353d16a3c855d905" 888 | integrity sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w== 889 | dependencies: 890 | commander "^8.0.0" 891 | 892 | katex@^0.15.0: 893 | version "0.15.6" 894 | resolved "https://registry.yarnpkg.com/katex/-/katex-0.15.6.tgz#c4e2f6ced2ac4de1ef6f737fe7c67d3026baa0e5" 895 | integrity sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA== 896 | dependencies: 897 | commander "^8.0.0" 898 | 899 | katex@^0.16.4: 900 | version "0.16.4" 901 | resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.4.tgz#87021bc3bbd80586ef715aeb476794cba6a49ad4" 902 | integrity sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw== 903 | dependencies: 904 | commander "^8.0.0" 905 | 906 | kind-of@^6.0.0, kind-of@^6.0.2: 907 | version "6.0.3" 908 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 909 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 910 | 911 | kleur@^4.0.3: 912 | version "4.1.5" 913 | resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" 914 | integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== 915 | 916 | lodash.get@^4.4.2: 917 | version "4.4.2" 918 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 919 | integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== 920 | 921 | longest-streak@^3.0.0: 922 | version "3.1.0" 923 | resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" 924 | integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== 925 | 926 | loose-envify@^1.1.0: 927 | version "1.4.0" 928 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 929 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 930 | dependencies: 931 | js-tokens "^3.0.0 || ^4.0.0" 932 | 933 | lru-cache@^4.0.1: 934 | version "4.1.5" 935 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 936 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 937 | dependencies: 938 | pseudomap "^1.0.2" 939 | yallist "^2.1.2" 940 | 941 | markdown-extensions@^1.0.0: 942 | version "1.1.1" 943 | resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-1.1.1.tgz#fea03b539faeaee9b4ef02a3769b455b189f7fc3" 944 | integrity sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q== 945 | 946 | markdown-table@^3.0.0: 947 | version "3.0.3" 948 | resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" 949 | integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== 950 | 951 | match-sorter@^6.3.1: 952 | version "6.3.1" 953 | resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda" 954 | integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw== 955 | dependencies: 956 | "@babel/runtime" "^7.12.5" 957 | remove-accents "0.4.2" 958 | 959 | mdast-util-definitions@^5.0.0: 960 | version "5.1.2" 961 | resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" 962 | integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== 963 | dependencies: 964 | "@types/mdast" "^3.0.0" 965 | "@types/unist" "^2.0.0" 966 | unist-util-visit "^4.0.0" 967 | 968 | mdast-util-find-and-replace@^2.0.0: 969 | version "2.2.2" 970 | resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" 971 | integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== 972 | dependencies: 973 | "@types/mdast" "^3.0.0" 974 | escape-string-regexp "^5.0.0" 975 | unist-util-is "^5.0.0" 976 | unist-util-visit-parents "^5.0.0" 977 | 978 | mdast-util-from-markdown@^1.0.0, mdast-util-from-markdown@^1.1.0: 979 | version "1.3.0" 980 | resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz#0214124154f26154a2b3f9d401155509be45e894" 981 | integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g== 982 | dependencies: 983 | "@types/mdast" "^3.0.0" 984 | "@types/unist" "^2.0.0" 985 | decode-named-character-reference "^1.0.0" 986 | mdast-util-to-string "^3.1.0" 987 | micromark "^3.0.0" 988 | micromark-util-decode-numeric-character-reference "^1.0.0" 989 | micromark-util-decode-string "^1.0.0" 990 | micromark-util-normalize-identifier "^1.0.0" 991 | micromark-util-symbol "^1.0.0" 992 | micromark-util-types "^1.0.0" 993 | unist-util-stringify-position "^3.0.0" 994 | uvu "^0.5.0" 995 | 996 | mdast-util-gfm-autolink-literal@^1.0.0: 997 | version "1.0.3" 998 | resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" 999 | integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== 1000 | dependencies: 1001 | "@types/mdast" "^3.0.0" 1002 | ccount "^2.0.0" 1003 | mdast-util-find-and-replace "^2.0.0" 1004 | micromark-util-character "^1.0.0" 1005 | 1006 | mdast-util-gfm-footnote@^1.0.0: 1007 | version "1.0.2" 1008 | resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" 1009 | integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== 1010 | dependencies: 1011 | "@types/mdast" "^3.0.0" 1012 | mdast-util-to-markdown "^1.3.0" 1013 | micromark-util-normalize-identifier "^1.0.0" 1014 | 1015 | mdast-util-gfm-strikethrough@^1.0.0: 1016 | version "1.0.3" 1017 | resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" 1018 | integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== 1019 | dependencies: 1020 | "@types/mdast" "^3.0.0" 1021 | mdast-util-to-markdown "^1.3.0" 1022 | 1023 | mdast-util-gfm-table@^1.0.0: 1024 | version "1.0.7" 1025 | resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" 1026 | integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== 1027 | dependencies: 1028 | "@types/mdast" "^3.0.0" 1029 | markdown-table "^3.0.0" 1030 | mdast-util-from-markdown "^1.0.0" 1031 | mdast-util-to-markdown "^1.3.0" 1032 | 1033 | mdast-util-gfm-task-list-item@^1.0.0: 1034 | version "1.0.2" 1035 | resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" 1036 | integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== 1037 | dependencies: 1038 | "@types/mdast" "^3.0.0" 1039 | mdast-util-to-markdown "^1.3.0" 1040 | 1041 | mdast-util-gfm@^2.0.0: 1042 | version "2.0.2" 1043 | resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" 1044 | integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== 1045 | dependencies: 1046 | mdast-util-from-markdown "^1.0.0" 1047 | mdast-util-gfm-autolink-literal "^1.0.0" 1048 | mdast-util-gfm-footnote "^1.0.0" 1049 | mdast-util-gfm-strikethrough "^1.0.0" 1050 | mdast-util-gfm-table "^1.0.0" 1051 | mdast-util-gfm-task-list-item "^1.0.0" 1052 | mdast-util-to-markdown "^1.0.0" 1053 | 1054 | mdast-util-math@^2.0.0: 1055 | version "2.0.2" 1056 | resolved "https://registry.yarnpkg.com/mdast-util-math/-/mdast-util-math-2.0.2.tgz#19a06a81f31643f48cc805e7c31edb7ce739242c" 1057 | integrity sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ== 1058 | dependencies: 1059 | "@types/mdast" "^3.0.0" 1060 | longest-streak "^3.0.0" 1061 | mdast-util-to-markdown "^1.3.0" 1062 | 1063 | mdast-util-mdx-expression@^1.0.0: 1064 | version "1.3.2" 1065 | resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz#d027789e67524d541d6de543f36d51ae2586f220" 1066 | integrity sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA== 1067 | dependencies: 1068 | "@types/estree-jsx" "^1.0.0" 1069 | "@types/hast" "^2.0.0" 1070 | "@types/mdast" "^3.0.0" 1071 | mdast-util-from-markdown "^1.0.0" 1072 | mdast-util-to-markdown "^1.0.0" 1073 | 1074 | mdast-util-mdx-jsx@^2.0.0: 1075 | version "2.1.2" 1076 | resolved "https://registry.yarnpkg.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-2.1.2.tgz#694a46164db10c0e9d674a3772b8748dfddd0817" 1077 | integrity sha512-o9vBCYQK5ZLGEj3tCGISJGjvafyHRVJlZmfJzSE7xjiogSzIeph/Z4zMY65q4WGRMezQBeAwPlrdymDYYYx0tA== 1078 | dependencies: 1079 | "@types/estree-jsx" "^1.0.0" 1080 | "@types/hast" "^2.0.0" 1081 | "@types/mdast" "^3.0.0" 1082 | "@types/unist" "^2.0.0" 1083 | ccount "^2.0.0" 1084 | mdast-util-from-markdown "^1.1.0" 1085 | mdast-util-to-markdown "^1.3.0" 1086 | parse-entities "^4.0.0" 1087 | stringify-entities "^4.0.0" 1088 | unist-util-remove-position "^4.0.0" 1089 | unist-util-stringify-position "^3.0.0" 1090 | vfile-message "^3.0.0" 1091 | 1092 | mdast-util-mdx@^2.0.0: 1093 | version "2.0.1" 1094 | resolved "https://registry.yarnpkg.com/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz#49b6e70819b99bb615d7223c088d295e53bb810f" 1095 | integrity sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw== 1096 | dependencies: 1097 | mdast-util-from-markdown "^1.0.0" 1098 | mdast-util-mdx-expression "^1.0.0" 1099 | mdast-util-mdx-jsx "^2.0.0" 1100 | mdast-util-mdxjs-esm "^1.0.0" 1101 | mdast-util-to-markdown "^1.0.0" 1102 | 1103 | mdast-util-mdxjs-esm@^1.0.0: 1104 | version "1.3.1" 1105 | resolved "https://registry.yarnpkg.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-1.3.1.tgz#645d02cd607a227b49721d146fd81796b2e2d15b" 1106 | integrity sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w== 1107 | dependencies: 1108 | "@types/estree-jsx" "^1.0.0" 1109 | "@types/hast" "^2.0.0" 1110 | "@types/mdast" "^3.0.0" 1111 | mdast-util-from-markdown "^1.0.0" 1112 | mdast-util-to-markdown "^1.0.0" 1113 | 1114 | mdast-util-phrasing@^3.0.0: 1115 | version "3.0.1" 1116 | resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" 1117 | integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== 1118 | dependencies: 1119 | "@types/mdast" "^3.0.0" 1120 | unist-util-is "^5.0.0" 1121 | 1122 | mdast-util-to-hast@^12.1.0: 1123 | version "12.3.0" 1124 | resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" 1125 | integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== 1126 | dependencies: 1127 | "@types/hast" "^2.0.0" 1128 | "@types/mdast" "^3.0.0" 1129 | mdast-util-definitions "^5.0.0" 1130 | micromark-util-sanitize-uri "^1.1.0" 1131 | trim-lines "^3.0.0" 1132 | unist-util-generated "^2.0.0" 1133 | unist-util-position "^4.0.0" 1134 | unist-util-visit "^4.0.0" 1135 | 1136 | mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: 1137 | version "1.5.0" 1138 | resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" 1139 | integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== 1140 | dependencies: 1141 | "@types/mdast" "^3.0.0" 1142 | "@types/unist" "^2.0.0" 1143 | longest-streak "^3.0.0" 1144 | mdast-util-phrasing "^3.0.0" 1145 | mdast-util-to-string "^3.0.0" 1146 | micromark-util-decode-string "^1.0.0" 1147 | unist-util-visit "^4.0.0" 1148 | zwitch "^2.0.0" 1149 | 1150 | mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: 1151 | version "3.1.1" 1152 | resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz#db859050d79d48cf9896d294de06f3ede7474d16" 1153 | integrity sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA== 1154 | dependencies: 1155 | "@types/mdast" "^3.0.0" 1156 | 1157 | micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: 1158 | version "1.0.6" 1159 | resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" 1160 | integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== 1161 | dependencies: 1162 | decode-named-character-reference "^1.0.0" 1163 | micromark-factory-destination "^1.0.0" 1164 | micromark-factory-label "^1.0.0" 1165 | micromark-factory-space "^1.0.0" 1166 | micromark-factory-title "^1.0.0" 1167 | micromark-factory-whitespace "^1.0.0" 1168 | micromark-util-character "^1.0.0" 1169 | micromark-util-chunked "^1.0.0" 1170 | micromark-util-classify-character "^1.0.0" 1171 | micromark-util-html-tag-name "^1.0.0" 1172 | micromark-util-normalize-identifier "^1.0.0" 1173 | micromark-util-resolve-all "^1.0.0" 1174 | micromark-util-subtokenize "^1.0.0" 1175 | micromark-util-symbol "^1.0.0" 1176 | micromark-util-types "^1.0.1" 1177 | uvu "^0.5.0" 1178 | 1179 | micromark-extension-gfm-autolink-literal@^1.0.0: 1180 | version "1.0.3" 1181 | resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz#dc589f9c37eaff31a175bab49f12290edcf96058" 1182 | integrity sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg== 1183 | dependencies: 1184 | micromark-util-character "^1.0.0" 1185 | micromark-util-sanitize-uri "^1.0.0" 1186 | micromark-util-symbol "^1.0.0" 1187 | micromark-util-types "^1.0.0" 1188 | uvu "^0.5.0" 1189 | 1190 | micromark-extension-gfm-footnote@^1.0.0: 1191 | version "1.0.4" 1192 | resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz#cbfd8873b983e820c494498c6dac0105920818d5" 1193 | integrity sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg== 1194 | dependencies: 1195 | micromark-core-commonmark "^1.0.0" 1196 | micromark-factory-space "^1.0.0" 1197 | micromark-util-character "^1.0.0" 1198 | micromark-util-normalize-identifier "^1.0.0" 1199 | micromark-util-sanitize-uri "^1.0.0" 1200 | micromark-util-symbol "^1.0.0" 1201 | micromark-util-types "^1.0.0" 1202 | uvu "^0.5.0" 1203 | 1204 | micromark-extension-gfm-strikethrough@^1.0.0: 1205 | version "1.0.4" 1206 | resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz#162232c284ffbedd8c74e59c1525bda217295e18" 1207 | integrity sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ== 1208 | dependencies: 1209 | micromark-util-chunked "^1.0.0" 1210 | micromark-util-classify-character "^1.0.0" 1211 | micromark-util-resolve-all "^1.0.0" 1212 | micromark-util-symbol "^1.0.0" 1213 | micromark-util-types "^1.0.0" 1214 | uvu "^0.5.0" 1215 | 1216 | micromark-extension-gfm-table@^1.0.0: 1217 | version "1.0.5" 1218 | resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz#7b708b728f8dc4d95d486b9e7a2262f9cddbcbb4" 1219 | integrity sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg== 1220 | dependencies: 1221 | micromark-factory-space "^1.0.0" 1222 | micromark-util-character "^1.0.0" 1223 | micromark-util-symbol "^1.0.0" 1224 | micromark-util-types "^1.0.0" 1225 | uvu "^0.5.0" 1226 | 1227 | micromark-extension-gfm-tagfilter@^1.0.0: 1228 | version "1.0.1" 1229 | resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz#fb2e303f7daf616db428bb6a26e18fda14a90a4d" 1230 | integrity sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA== 1231 | dependencies: 1232 | micromark-util-types "^1.0.0" 1233 | 1234 | micromark-extension-gfm-task-list-item@^1.0.0: 1235 | version "1.0.3" 1236 | resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz#7683641df5d4a09795f353574d7f7f66e47b7fc4" 1237 | integrity sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q== 1238 | dependencies: 1239 | micromark-factory-space "^1.0.0" 1240 | micromark-util-character "^1.0.0" 1241 | micromark-util-symbol "^1.0.0" 1242 | micromark-util-types "^1.0.0" 1243 | uvu "^0.5.0" 1244 | 1245 | micromark-extension-gfm@^2.0.0: 1246 | version "2.0.1" 1247 | resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz#40f3209216127a96297c54c67f5edc7ef2d1a2a2" 1248 | integrity sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA== 1249 | dependencies: 1250 | micromark-extension-gfm-autolink-literal "^1.0.0" 1251 | micromark-extension-gfm-footnote "^1.0.0" 1252 | micromark-extension-gfm-strikethrough "^1.0.0" 1253 | micromark-extension-gfm-table "^1.0.0" 1254 | micromark-extension-gfm-tagfilter "^1.0.0" 1255 | micromark-extension-gfm-task-list-item "^1.0.0" 1256 | micromark-util-combine-extensions "^1.0.0" 1257 | micromark-util-types "^1.0.0" 1258 | 1259 | micromark-extension-math@^2.0.0: 1260 | version "2.0.2" 1261 | resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-2.0.2.tgz#bb7d28b907b17f1813dd3d0df2a6df6bb1a4d0e1" 1262 | integrity sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA== 1263 | dependencies: 1264 | "@types/katex" "^0.11.0" 1265 | katex "^0.13.0" 1266 | micromark-factory-space "^1.0.0" 1267 | micromark-util-character "^1.0.0" 1268 | micromark-util-symbol "^1.0.0" 1269 | micromark-util-types "^1.0.0" 1270 | uvu "^0.5.0" 1271 | 1272 | micromark-extension-mdx-expression@^1.0.0: 1273 | version "1.0.4" 1274 | resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.4.tgz#33fe2c6ee214738255de175a084281c11894ddda" 1275 | integrity sha512-TCgLxqW6ReQ3AJgtj1P0P+8ZThBTloLbeb7jNaqr6mCOLDpxUiBFE/9STgooMZttEwOQu5iEcCCa3ZSDhY9FGw== 1276 | dependencies: 1277 | micromark-factory-mdx-expression "^1.0.0" 1278 | micromark-factory-space "^1.0.0" 1279 | micromark-util-character "^1.0.0" 1280 | micromark-util-events-to-acorn "^1.0.0" 1281 | micromark-util-symbol "^1.0.0" 1282 | micromark-util-types "^1.0.0" 1283 | uvu "^0.5.0" 1284 | 1285 | micromark-extension-mdx-jsx@^1.0.0: 1286 | version "1.0.3" 1287 | resolved "https://registry.yarnpkg.com/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-1.0.3.tgz#9f196be5f65eb09d2a49b237a7b3398bba2999be" 1288 | integrity sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA== 1289 | dependencies: 1290 | "@types/acorn" "^4.0.0" 1291 | estree-util-is-identifier-name "^2.0.0" 1292 | micromark-factory-mdx-expression "^1.0.0" 1293 | micromark-factory-space "^1.0.0" 1294 | micromark-util-character "^1.0.0" 1295 | micromark-util-symbol "^1.0.0" 1296 | micromark-util-types "^1.0.0" 1297 | uvu "^0.5.0" 1298 | vfile-message "^3.0.0" 1299 | 1300 | micromark-extension-mdx-md@^1.0.0: 1301 | version "1.0.0" 1302 | resolved "https://registry.yarnpkg.com/micromark-extension-mdx-md/-/micromark-extension-mdx-md-1.0.0.tgz#382f5df9ee3706dd120b51782a211f31f4760d22" 1303 | integrity sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw== 1304 | dependencies: 1305 | micromark-util-types "^1.0.0" 1306 | 1307 | micromark-extension-mdxjs-esm@^1.0.0: 1308 | version "1.0.3" 1309 | resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-1.0.3.tgz#630d9dc9db2c2fd470cac8c1e7a824851267404d" 1310 | integrity sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A== 1311 | dependencies: 1312 | micromark-core-commonmark "^1.0.0" 1313 | micromark-util-character "^1.0.0" 1314 | micromark-util-events-to-acorn "^1.0.0" 1315 | micromark-util-symbol "^1.0.0" 1316 | micromark-util-types "^1.0.0" 1317 | unist-util-position-from-estree "^1.1.0" 1318 | uvu "^0.5.0" 1319 | vfile-message "^3.0.0" 1320 | 1321 | micromark-extension-mdxjs@^1.0.0: 1322 | version "1.0.0" 1323 | resolved "https://registry.yarnpkg.com/micromark-extension-mdxjs/-/micromark-extension-mdxjs-1.0.0.tgz#772644e12fc8299a33e50f59c5aa15727f6689dd" 1324 | integrity sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ== 1325 | dependencies: 1326 | acorn "^8.0.0" 1327 | acorn-jsx "^5.0.0" 1328 | micromark-extension-mdx-expression "^1.0.0" 1329 | micromark-extension-mdx-jsx "^1.0.0" 1330 | micromark-extension-mdx-md "^1.0.0" 1331 | micromark-extension-mdxjs-esm "^1.0.0" 1332 | micromark-util-combine-extensions "^1.0.0" 1333 | micromark-util-types "^1.0.0" 1334 | 1335 | micromark-factory-destination@^1.0.0: 1336 | version "1.0.0" 1337 | resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" 1338 | integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== 1339 | dependencies: 1340 | micromark-util-character "^1.0.0" 1341 | micromark-util-symbol "^1.0.0" 1342 | micromark-util-types "^1.0.0" 1343 | 1344 | micromark-factory-label@^1.0.0: 1345 | version "1.0.2" 1346 | resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" 1347 | integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== 1348 | dependencies: 1349 | micromark-util-character "^1.0.0" 1350 | micromark-util-symbol "^1.0.0" 1351 | micromark-util-types "^1.0.0" 1352 | uvu "^0.5.0" 1353 | 1354 | micromark-factory-mdx-expression@^1.0.0: 1355 | version "1.0.7" 1356 | resolved "https://registry.yarnpkg.com/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-1.0.7.tgz#e38298dc1f7eaf6ba1d9f210531ceae17155c00f" 1357 | integrity sha512-QAdFbkQagTZ/eKb8zDGqmjvgevgJH3+aQpvvKrXWxNJp3o8/l2cAbbrBd0E04r0Gx6nssPpqWIjnbHFvZu5qsQ== 1358 | dependencies: 1359 | micromark-factory-space "^1.0.0" 1360 | micromark-util-character "^1.0.0" 1361 | micromark-util-events-to-acorn "^1.0.0" 1362 | micromark-util-symbol "^1.0.0" 1363 | micromark-util-types "^1.0.0" 1364 | unist-util-position-from-estree "^1.0.0" 1365 | uvu "^0.5.0" 1366 | vfile-message "^3.0.0" 1367 | 1368 | micromark-factory-space@^1.0.0: 1369 | version "1.0.0" 1370 | resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" 1371 | integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== 1372 | dependencies: 1373 | micromark-util-character "^1.0.0" 1374 | micromark-util-types "^1.0.0" 1375 | 1376 | micromark-factory-title@^1.0.0: 1377 | version "1.0.2" 1378 | resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" 1379 | integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== 1380 | dependencies: 1381 | micromark-factory-space "^1.0.0" 1382 | micromark-util-character "^1.0.0" 1383 | micromark-util-symbol "^1.0.0" 1384 | micromark-util-types "^1.0.0" 1385 | uvu "^0.5.0" 1386 | 1387 | micromark-factory-whitespace@^1.0.0: 1388 | version "1.0.0" 1389 | resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" 1390 | integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== 1391 | dependencies: 1392 | micromark-factory-space "^1.0.0" 1393 | micromark-util-character "^1.0.0" 1394 | micromark-util-symbol "^1.0.0" 1395 | micromark-util-types "^1.0.0" 1396 | 1397 | micromark-util-character@^1.0.0: 1398 | version "1.1.0" 1399 | resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" 1400 | integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== 1401 | dependencies: 1402 | micromark-util-symbol "^1.0.0" 1403 | micromark-util-types "^1.0.0" 1404 | 1405 | micromark-util-chunked@^1.0.0: 1406 | version "1.0.0" 1407 | resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" 1408 | integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== 1409 | dependencies: 1410 | micromark-util-symbol "^1.0.0" 1411 | 1412 | micromark-util-classify-character@^1.0.0: 1413 | version "1.0.0" 1414 | resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" 1415 | integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== 1416 | dependencies: 1417 | micromark-util-character "^1.0.0" 1418 | micromark-util-symbol "^1.0.0" 1419 | micromark-util-types "^1.0.0" 1420 | 1421 | micromark-util-combine-extensions@^1.0.0: 1422 | version "1.0.0" 1423 | resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" 1424 | integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== 1425 | dependencies: 1426 | micromark-util-chunked "^1.0.0" 1427 | micromark-util-types "^1.0.0" 1428 | 1429 | micromark-util-decode-numeric-character-reference@^1.0.0: 1430 | version "1.0.0" 1431 | resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" 1432 | integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== 1433 | dependencies: 1434 | micromark-util-symbol "^1.0.0" 1435 | 1436 | micromark-util-decode-string@^1.0.0: 1437 | version "1.0.2" 1438 | resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" 1439 | integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== 1440 | dependencies: 1441 | decode-named-character-reference "^1.0.0" 1442 | micromark-util-character "^1.0.0" 1443 | micromark-util-decode-numeric-character-reference "^1.0.0" 1444 | micromark-util-symbol "^1.0.0" 1445 | 1446 | micromark-util-encode@^1.0.0: 1447 | version "1.0.1" 1448 | resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" 1449 | integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== 1450 | 1451 | micromark-util-events-to-acorn@^1.0.0: 1452 | version "1.2.1" 1453 | resolved "https://registry.yarnpkg.com/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-1.2.1.tgz#d5b9dfbc589ece7917de24de0a57b909c0d36583" 1454 | integrity sha512-mkg3BaWlw6ZTkQORrKVBW4o9ICXPxLtGz51vml5mQpKFdo9vqIX68CAx5JhTOdjQyAHH7JFmm4rh8toSPQZUmg== 1455 | dependencies: 1456 | "@types/acorn" "^4.0.0" 1457 | "@types/estree" "^1.0.0" 1458 | estree-util-visit "^1.0.0" 1459 | micromark-util-types "^1.0.0" 1460 | uvu "^0.5.0" 1461 | vfile-location "^4.0.0" 1462 | vfile-message "^3.0.0" 1463 | 1464 | micromark-util-html-tag-name@^1.0.0: 1465 | version "1.1.0" 1466 | resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" 1467 | integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== 1468 | 1469 | micromark-util-normalize-identifier@^1.0.0: 1470 | version "1.0.0" 1471 | resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" 1472 | integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== 1473 | dependencies: 1474 | micromark-util-symbol "^1.0.0" 1475 | 1476 | micromark-util-resolve-all@^1.0.0: 1477 | version "1.0.0" 1478 | resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" 1479 | integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== 1480 | dependencies: 1481 | micromark-util-types "^1.0.0" 1482 | 1483 | micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: 1484 | version "1.1.0" 1485 | resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" 1486 | integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== 1487 | dependencies: 1488 | micromark-util-character "^1.0.0" 1489 | micromark-util-encode "^1.0.0" 1490 | micromark-util-symbol "^1.0.0" 1491 | 1492 | micromark-util-subtokenize@^1.0.0: 1493 | version "1.0.2" 1494 | resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" 1495 | integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== 1496 | dependencies: 1497 | micromark-util-chunked "^1.0.0" 1498 | micromark-util-symbol "^1.0.0" 1499 | micromark-util-types "^1.0.0" 1500 | uvu "^0.5.0" 1501 | 1502 | micromark-util-symbol@^1.0.0: 1503 | version "1.0.1" 1504 | resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" 1505 | integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== 1506 | 1507 | micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: 1508 | version "1.0.2" 1509 | resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" 1510 | integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== 1511 | 1512 | micromark@^3.0.0: 1513 | version "3.1.0" 1514 | resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" 1515 | integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== 1516 | dependencies: 1517 | "@types/debug" "^4.0.0" 1518 | debug "^4.0.0" 1519 | decode-named-character-reference "^1.0.0" 1520 | micromark-core-commonmark "^1.0.1" 1521 | micromark-factory-space "^1.0.0" 1522 | micromark-util-character "^1.0.0" 1523 | micromark-util-chunked "^1.0.0" 1524 | micromark-util-combine-extensions "^1.0.0" 1525 | micromark-util-decode-numeric-character-reference "^1.0.0" 1526 | micromark-util-encode "^1.0.0" 1527 | micromark-util-normalize-identifier "^1.0.0" 1528 | micromark-util-resolve-all "^1.0.0" 1529 | micromark-util-sanitize-uri "^1.0.0" 1530 | micromark-util-subtokenize "^1.0.0" 1531 | micromark-util-symbol "^1.0.0" 1532 | micromark-util-types "^1.0.1" 1533 | uvu "^0.5.0" 1534 | 1535 | mri@^1.1.0: 1536 | version "1.2.0" 1537 | resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" 1538 | integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== 1539 | 1540 | ms@2.1.2: 1541 | version "2.1.2" 1542 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1543 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1544 | 1545 | nanoid@^3.3.4: 1546 | version "3.3.6" 1547 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" 1548 | integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== 1549 | 1550 | next-mdx-remote@^4.2.1: 1551 | version "4.4.1" 1552 | resolved "https://registry.yarnpkg.com/next-mdx-remote/-/next-mdx-remote-4.4.1.tgz#96b16e2adc54dbcd0a7f204a9a3c3fd269d41abf" 1553 | integrity sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ== 1554 | dependencies: 1555 | "@mdx-js/mdx" "^2.2.1" 1556 | "@mdx-js/react" "^2.2.1" 1557 | vfile "^5.3.0" 1558 | vfile-matter "^3.0.1" 1559 | 1560 | next-seo@^5.5.0: 1561 | version "5.15.0" 1562 | resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-5.15.0.tgz#b1a90508599774982909ea44803323c6fb7b50f4" 1563 | integrity sha512-LGbcY91yDKGMb7YI+28n3g+RuChUkt6pXNpa8FkfKkEmNiJkeRDEXTnnjVtwT9FmMhG6NH8qwHTelGrlYm9rgg== 1564 | 1565 | next-themes@^0.2.1: 1566 | version "0.2.1" 1567 | resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.2.1.tgz#0c9f128e847979daf6c67f70b38e6b6567856e45" 1568 | integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A== 1569 | 1570 | next@^13.2.3: 1571 | version "13.2.4" 1572 | resolved "https://registry.yarnpkg.com/next/-/next-13.2.4.tgz#2363330392b0f7da02ab41301f60857ffa7f67d6" 1573 | integrity sha512-g1I30317cThkEpvzfXujf0O4wtaQHtDCLhlivwlTJ885Ld+eOgcz7r3TGQzeU+cSRoNHtD8tsJgzxVdYojFssw== 1574 | dependencies: 1575 | "@next/env" "13.2.4" 1576 | "@swc/helpers" "0.4.14" 1577 | caniuse-lite "^1.0.30001406" 1578 | postcss "8.4.14" 1579 | styled-jsx "5.1.1" 1580 | optionalDependencies: 1581 | "@next/swc-android-arm-eabi" "13.2.4" 1582 | "@next/swc-android-arm64" "13.2.4" 1583 | "@next/swc-darwin-arm64" "13.2.4" 1584 | "@next/swc-darwin-x64" "13.2.4" 1585 | "@next/swc-freebsd-x64" "13.2.4" 1586 | "@next/swc-linux-arm-gnueabihf" "13.2.4" 1587 | "@next/swc-linux-arm64-gnu" "13.2.4" 1588 | "@next/swc-linux-arm64-musl" "13.2.4" 1589 | "@next/swc-linux-x64-gnu" "13.2.4" 1590 | "@next/swc-linux-x64-musl" "13.2.4" 1591 | "@next/swc-win32-arm64-msvc" "13.2.4" 1592 | "@next/swc-win32-ia32-msvc" "13.2.4" 1593 | "@next/swc-win32-x64-msvc" "13.2.4" 1594 | 1595 | nextra-theme-docs@^2.2.17: 1596 | version "2.2.20" 1597 | resolved "https://registry.yarnpkg.com/nextra-theme-docs/-/nextra-theme-docs-2.2.20.tgz#144f8fb4da9ad3ccf80c044447e7da0da13048e4" 1598 | integrity sha512-YbDbpwvLCUnDvq9afP57Zu/fDFbSrsvx5MEZIhKRcrn/eCfo4yIwoMMhdRF0yntB5uTDc4MZ8jqJgb25g2v7QA== 1599 | dependencies: 1600 | "@headlessui/react" "^1.7.10" 1601 | "@popperjs/core" "^2.11.6" 1602 | clsx "^1.2.1" 1603 | flexsearch "^0.7.21" 1604 | focus-visible "^5.2.0" 1605 | git-url-parse "^13.1.0" 1606 | intersection-observer "^0.12.2" 1607 | match-sorter "^6.3.1" 1608 | next-seo "^5.5.0" 1609 | next-themes "^0.2.1" 1610 | scroll-into-view-if-needed "^3.0.0" 1611 | zod "^3.20.2" 1612 | 1613 | nextra@^2.2.17: 1614 | version "2.2.20" 1615 | resolved "https://registry.yarnpkg.com/nextra/-/nextra-2.2.20.tgz#7973c817067779318c989fcc9ad31473a97f50cb" 1616 | integrity sha512-V5P5UHvA7GvISziJSEMVV9jCDBm1aMlez3XqKPzvr/aIrugfnIPBhGrFh2YjpXp5FspldgTS8lbZVf36Alonhg== 1617 | dependencies: 1618 | "@mdx-js/mdx" "^2.3.0" 1619 | "@mdx-js/react" "^2.3.0" 1620 | "@napi-rs/simple-git" "^0.1.8" 1621 | github-slugger "^2.0.0" 1622 | graceful-fs "^4.2.10" 1623 | gray-matter "^4.0.3" 1624 | katex "^0.16.4" 1625 | lodash.get "^4.4.2" 1626 | next-mdx-remote "^4.2.1" 1627 | p-limit "^3.1.0" 1628 | rehype-katex "^6.0.2" 1629 | rehype-pretty-code "0.9.3" 1630 | remark-gfm "^3.0.1" 1631 | remark-math "^5.1.1" 1632 | remark-reading-time "^2.0.1" 1633 | shiki "^0.14.0" 1634 | slash "^3.0.0" 1635 | title "^3.5.3" 1636 | unist-util-remove "^3.1.1" 1637 | unist-util-visit "^4.1.1" 1638 | zod "^3.20.2" 1639 | 1640 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1641 | version "3.0.0" 1642 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1643 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1644 | 1645 | npm-run-path@^2.0.0: 1646 | version "2.0.2" 1647 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1648 | integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== 1649 | dependencies: 1650 | path-key "^2.0.0" 1651 | 1652 | p-finally@^1.0.0: 1653 | version "1.0.0" 1654 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1655 | integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== 1656 | 1657 | p-limit@^3.1.0: 1658 | version "3.1.0" 1659 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1660 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1661 | dependencies: 1662 | yocto-queue "^0.1.0" 1663 | 1664 | parse-entities@^4.0.0: 1665 | version "4.0.1" 1666 | resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.1.tgz#4e2a01111fb1c986549b944af39eeda258fc9e4e" 1667 | integrity sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w== 1668 | dependencies: 1669 | "@types/unist" "^2.0.0" 1670 | character-entities "^2.0.0" 1671 | character-entities-legacy "^3.0.0" 1672 | character-reference-invalid "^2.0.0" 1673 | decode-named-character-reference "^1.0.0" 1674 | is-alphanumerical "^2.0.0" 1675 | is-decimal "^2.0.0" 1676 | is-hexadecimal "^2.0.0" 1677 | 1678 | parse-numeric-range@^1.3.0: 1679 | version "1.3.0" 1680 | resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" 1681 | integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== 1682 | 1683 | parse-path@^7.0.0: 1684 | version "7.0.0" 1685 | resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" 1686 | integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== 1687 | dependencies: 1688 | protocols "^2.0.0" 1689 | 1690 | parse-url@^8.1.0: 1691 | version "8.1.0" 1692 | resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" 1693 | integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== 1694 | dependencies: 1695 | parse-path "^7.0.0" 1696 | 1697 | parse5@^6.0.0: 1698 | version "6.0.1" 1699 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" 1700 | integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== 1701 | 1702 | path-key@^2.0.0: 1703 | version "2.0.1" 1704 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1705 | integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== 1706 | 1707 | periscopic@^3.0.0: 1708 | version "3.1.0" 1709 | resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" 1710 | integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== 1711 | dependencies: 1712 | "@types/estree" "^1.0.0" 1713 | estree-walker "^3.0.0" 1714 | is-reference "^3.0.0" 1715 | 1716 | picocolors@^1.0.0: 1717 | version "1.0.0" 1718 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1719 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1720 | 1721 | picomatch@^2.0.4, picomatch@^2.2.1: 1722 | version "2.3.1" 1723 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1724 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1725 | 1726 | postcss@8.4.14: 1727 | version "8.4.14" 1728 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" 1729 | integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== 1730 | dependencies: 1731 | nanoid "^3.3.4" 1732 | picocolors "^1.0.0" 1733 | source-map-js "^1.0.2" 1734 | 1735 | prism-react-renderer@^1.2.0: 1736 | version "1.3.5" 1737 | resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" 1738 | integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== 1739 | 1740 | prismjs@^1.23.0: 1741 | version "1.29.0" 1742 | resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" 1743 | integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== 1744 | 1745 | property-information@^6.0.0: 1746 | version "6.2.0" 1747 | resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.2.0.tgz#b74f522c31c097b5149e3c3cb8d7f3defd986a1d" 1748 | integrity sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg== 1749 | 1750 | protocols@^2.0.0, protocols@^2.0.1: 1751 | version "2.0.1" 1752 | resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" 1753 | integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== 1754 | 1755 | pseudomap@^1.0.2: 1756 | version "1.0.2" 1757 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1758 | integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== 1759 | 1760 | react-dom@^18.2.0: 1761 | version "18.2.0" 1762 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" 1763 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 1764 | dependencies: 1765 | loose-envify "^1.1.0" 1766 | scheduler "^0.23.0" 1767 | 1768 | react@^18.2.0: 1769 | version "18.2.0" 1770 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" 1771 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 1772 | dependencies: 1773 | loose-envify "^1.1.0" 1774 | 1775 | readdirp@~3.6.0: 1776 | version "3.6.0" 1777 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1778 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1779 | dependencies: 1780 | picomatch "^2.2.1" 1781 | 1782 | reading-time@^1.3.0: 1783 | version "1.5.0" 1784 | resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" 1785 | integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== 1786 | 1787 | regenerator-runtime@^0.13.11: 1788 | version "0.13.11" 1789 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" 1790 | integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== 1791 | 1792 | rehype-katex@^6.0.2: 1793 | version "6.0.2" 1794 | resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-6.0.2.tgz#20197bbc10bdf79f6b999bffa6689d7f17226c35" 1795 | integrity sha512-C4gDAlS1+l0hJqctyiU64f9CvT00S03qV1T6HiMzbSuLBgWUtcqydWHY9OpKrm0SpkK16FNd62CDKyWLwV2ppg== 1796 | dependencies: 1797 | "@types/hast" "^2.0.0" 1798 | "@types/katex" "^0.11.0" 1799 | hast-util-to-text "^3.1.0" 1800 | katex "^0.15.0" 1801 | rehype-parse "^8.0.0" 1802 | unified "^10.0.0" 1803 | unist-util-remove-position "^4.0.0" 1804 | unist-util-visit "^4.0.0" 1805 | 1806 | rehype-parse@^8.0.0: 1807 | version "8.0.4" 1808 | resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.4.tgz#3d17c9ff16ddfef6bbcc8e6a25a99467b482d688" 1809 | integrity sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg== 1810 | dependencies: 1811 | "@types/hast" "^2.0.0" 1812 | hast-util-from-parse5 "^7.0.0" 1813 | parse5 "^6.0.0" 1814 | unified "^10.0.0" 1815 | 1816 | rehype-pretty-code@0.9.3: 1817 | version "0.9.3" 1818 | resolved "https://registry.yarnpkg.com/rehype-pretty-code/-/rehype-pretty-code-0.9.3.tgz#484f3fefea89abde8914afea2f3ce42995755938" 1819 | integrity sha512-57i+ifrttqpeQxub0NZ2pRw0aiUPYeBpr234NLWfZ4BfbEaP+29+iCXB1rUMkzoPi6IBC4w4I93mUPgw36IajQ== 1820 | dependencies: 1821 | hash-obj "^4.0.0" 1822 | parse-numeric-range "^1.3.0" 1823 | 1824 | remark-gfm@^3.0.1: 1825 | version "3.0.1" 1826 | resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" 1827 | integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== 1828 | dependencies: 1829 | "@types/mdast" "^3.0.0" 1830 | mdast-util-gfm "^2.0.0" 1831 | micromark-extension-gfm "^2.0.0" 1832 | unified "^10.0.0" 1833 | 1834 | remark-math@^5.1.1: 1835 | version "5.1.1" 1836 | resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-5.1.1.tgz#459e798d978d4ca032e745af0bac81ddcdf94964" 1837 | integrity sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw== 1838 | dependencies: 1839 | "@types/mdast" "^3.0.0" 1840 | mdast-util-math "^2.0.0" 1841 | micromark-extension-math "^2.0.0" 1842 | unified "^10.0.0" 1843 | 1844 | remark-mdx@^2.0.0: 1845 | version "2.3.0" 1846 | resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-2.3.0.tgz#efe678025a8c2726681bde8bf111af4a93943db4" 1847 | integrity sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g== 1848 | dependencies: 1849 | mdast-util-mdx "^2.0.0" 1850 | micromark-extension-mdxjs "^1.0.0" 1851 | 1852 | remark-parse@^10.0.0: 1853 | version "10.0.1" 1854 | resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" 1855 | integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== 1856 | dependencies: 1857 | "@types/mdast" "^3.0.0" 1858 | mdast-util-from-markdown "^1.0.0" 1859 | unified "^10.0.0" 1860 | 1861 | remark-reading-time@^2.0.1: 1862 | version "2.0.1" 1863 | resolved "https://registry.yarnpkg.com/remark-reading-time/-/remark-reading-time-2.0.1.tgz#fe8bb8e420db7678dc749385167adb4fc99318f7" 1864 | integrity sha512-fy4BKy9SRhtYbEHvp6AItbRTnrhiDGbqLQTSYVbQPGuRCncU1ubSsh9p/W5QZSxtYcUXv8KGL0xBgPLyNJA1xw== 1865 | dependencies: 1866 | estree-util-is-identifier-name "^2.0.0" 1867 | estree-util-value-to-estree "^1.3.0" 1868 | reading-time "^1.3.0" 1869 | unist-util-visit "^3.1.0" 1870 | 1871 | remark-rehype@^10.0.0: 1872 | version "10.1.0" 1873 | resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" 1874 | integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== 1875 | dependencies: 1876 | "@types/hast" "^2.0.0" 1877 | "@types/mdast" "^3.0.0" 1878 | mdast-util-to-hast "^12.1.0" 1879 | unified "^10.0.0" 1880 | 1881 | remove-accents@0.4.2: 1882 | version "0.4.2" 1883 | resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" 1884 | integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA== 1885 | 1886 | sade@^1.7.3: 1887 | version "1.8.1" 1888 | resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" 1889 | integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== 1890 | dependencies: 1891 | mri "^1.1.0" 1892 | 1893 | sass@^1.32.8: 1894 | version "1.60.0" 1895 | resolved "https://registry.yarnpkg.com/sass/-/sass-1.60.0.tgz#657f0c23a302ac494b09a5ba8497b739fb5b5a81" 1896 | integrity sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ== 1897 | dependencies: 1898 | chokidar ">=3.0.0 <4.0.0" 1899 | immutable "^4.0.0" 1900 | source-map-js ">=0.6.2 <2.0.0" 1901 | 1902 | scheduler@^0.23.0: 1903 | version "0.23.0" 1904 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" 1905 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 1906 | dependencies: 1907 | loose-envify "^1.1.0" 1908 | 1909 | scroll-into-view-if-needed@^3.0.0: 1910 | version "3.0.6" 1911 | resolved "https://registry.yarnpkg.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.6.tgz#2c803a509c1036bc4a9c009fecc5c145f87e47cf" 1912 | integrity sha512-x+CW0kOzlFNOnseF0DBr0AJ5m+TgGmSOdEZwyiZW0gV87XBvxQKw5A8DvFFgabznA68XqLgVX+PwPX8OzsFvRA== 1913 | dependencies: 1914 | compute-scroll-into-view "^3.0.0" 1915 | 1916 | section-matter@^1.0.0: 1917 | version "1.0.0" 1918 | resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" 1919 | integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== 1920 | dependencies: 1921 | extend-shallow "^2.0.1" 1922 | kind-of "^6.0.0" 1923 | 1924 | shebang-command@^1.2.0: 1925 | version "1.2.0" 1926 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1927 | integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== 1928 | dependencies: 1929 | shebang-regex "^1.0.0" 1930 | 1931 | shebang-regex@^1.0.0: 1932 | version "1.0.0" 1933 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1934 | integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== 1935 | 1936 | shiki@^0.14.0: 1937 | version "0.14.1" 1938 | resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.1.tgz#9fbe082d0a8aa2ad63df4fbf2ee11ec924aa7ee1" 1939 | integrity sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw== 1940 | dependencies: 1941 | ansi-sequence-parser "^1.1.0" 1942 | jsonc-parser "^3.2.0" 1943 | vscode-oniguruma "^1.7.0" 1944 | vscode-textmate "^8.0.0" 1945 | 1946 | signal-exit@^3.0.0: 1947 | version "3.0.7" 1948 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 1949 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 1950 | 1951 | slash@^3.0.0: 1952 | version "3.0.0" 1953 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1954 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1955 | 1956 | sort-keys@^5.0.0: 1957 | version "5.0.0" 1958 | resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-5.0.0.tgz#5d775f8ae93ecc29bc7312bbf3acac4e36e3c446" 1959 | integrity sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw== 1960 | dependencies: 1961 | is-plain-obj "^4.0.0" 1962 | 1963 | "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: 1964 | version "1.0.2" 1965 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1966 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1967 | 1968 | source-map@^0.7.0: 1969 | version "0.7.4" 1970 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" 1971 | integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== 1972 | 1973 | space-separated-tokens@^2.0.0: 1974 | version "2.0.2" 1975 | resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" 1976 | integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== 1977 | 1978 | sprintf-js@~1.0.2: 1979 | version "1.0.3" 1980 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1981 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 1982 | 1983 | stringify-entities@^4.0.0: 1984 | version "4.0.3" 1985 | resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" 1986 | integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== 1987 | dependencies: 1988 | character-entities-html4 "^2.0.0" 1989 | character-entities-legacy "^3.0.0" 1990 | 1991 | strip-bom-string@^1.0.0: 1992 | version "1.0.0" 1993 | resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" 1994 | integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== 1995 | 1996 | strip-eof@^1.0.0: 1997 | version "1.0.0" 1998 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1999 | integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== 2000 | 2001 | style-to-object@^0.4.1: 2002 | version "0.4.1" 2003 | resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37" 2004 | integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== 2005 | dependencies: 2006 | inline-style-parser "0.1.1" 2007 | 2008 | styled-jsx@5.1.1: 2009 | version "5.1.1" 2010 | resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" 2011 | integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== 2012 | dependencies: 2013 | client-only "0.0.1" 2014 | 2015 | supports-color@^4.0.0: 2016 | version "4.5.0" 2017 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 2018 | integrity sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw== 2019 | dependencies: 2020 | has-flag "^2.0.0" 2021 | 2022 | title@^3.5.3: 2023 | version "3.5.3" 2024 | resolved "https://registry.yarnpkg.com/title/-/title-3.5.3.tgz#b338d701a3d949db6b49b2c86f409f9c2f36cd91" 2025 | integrity sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q== 2026 | dependencies: 2027 | arg "1.0.0" 2028 | chalk "2.3.0" 2029 | clipboardy "1.2.2" 2030 | titleize "1.0.0" 2031 | 2032 | titleize@1.0.0: 2033 | version "1.0.0" 2034 | resolved "https://registry.yarnpkg.com/titleize/-/titleize-1.0.0.tgz#7d350722061830ba6617631e0cfd3ea08398d95a" 2035 | integrity sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw== 2036 | 2037 | to-regex-range@^5.0.1: 2038 | version "5.0.1" 2039 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2040 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2041 | dependencies: 2042 | is-number "^7.0.0" 2043 | 2044 | trim-lines@^3.0.0: 2045 | version "3.0.1" 2046 | resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" 2047 | integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== 2048 | 2049 | trough@^2.0.0: 2050 | version "2.1.0" 2051 | resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" 2052 | integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== 2053 | 2054 | tslib@^2.4.0: 2055 | version "2.5.0" 2056 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" 2057 | integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== 2058 | 2059 | type-fest@^1.0.2: 2060 | version "1.4.0" 2061 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" 2062 | integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== 2063 | 2064 | unified@^10.0.0: 2065 | version "10.1.2" 2066 | resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" 2067 | integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== 2068 | dependencies: 2069 | "@types/unist" "^2.0.0" 2070 | bail "^2.0.0" 2071 | extend "^3.0.0" 2072 | is-buffer "^2.0.0" 2073 | is-plain-obj "^4.0.0" 2074 | trough "^2.0.0" 2075 | vfile "^5.0.0" 2076 | 2077 | unist-util-find-after@^4.0.0: 2078 | version "4.0.1" 2079 | resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz#80c69c92b0504033638ce11973f4135f2c822e2d" 2080 | integrity sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw== 2081 | dependencies: 2082 | "@types/unist" "^2.0.0" 2083 | unist-util-is "^5.0.0" 2084 | 2085 | unist-util-generated@^2.0.0: 2086 | version "2.0.1" 2087 | resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" 2088 | integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== 2089 | 2090 | unist-util-is@^5.0.0: 2091 | version "5.2.1" 2092 | resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" 2093 | integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== 2094 | dependencies: 2095 | "@types/unist" "^2.0.0" 2096 | 2097 | unist-util-position-from-estree@^1.0.0, unist-util-position-from-estree@^1.1.0: 2098 | version "1.1.2" 2099 | resolved "https://registry.yarnpkg.com/unist-util-position-from-estree/-/unist-util-position-from-estree-1.1.2.tgz#8ac2480027229de76512079e377afbcabcfcce22" 2100 | integrity sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww== 2101 | dependencies: 2102 | "@types/unist" "^2.0.0" 2103 | 2104 | unist-util-position@^4.0.0: 2105 | version "4.0.4" 2106 | resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" 2107 | integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== 2108 | dependencies: 2109 | "@types/unist" "^2.0.0" 2110 | 2111 | unist-util-remove-position@^4.0.0: 2112 | version "4.0.2" 2113 | resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz#a89be6ea72e23b1a402350832b02a91f6a9afe51" 2114 | integrity sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ== 2115 | dependencies: 2116 | "@types/unist" "^2.0.0" 2117 | unist-util-visit "^4.0.0" 2118 | 2119 | unist-util-remove@^3.1.1: 2120 | version "3.1.1" 2121 | resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-3.1.1.tgz#8bfa181aff916bd32a4ed30b3ed76d0c21c077df" 2122 | integrity sha512-kfCqZK5YVY5yEa89tvpl7KnBBHu2c6CzMkqHUrlOqaRgGOMp0sMvwWOVrbAtj03KhovQB7i96Gda72v/EFE0vw== 2123 | dependencies: 2124 | "@types/unist" "^2.0.0" 2125 | unist-util-is "^5.0.0" 2126 | unist-util-visit-parents "^5.0.0" 2127 | 2128 | unist-util-stringify-position@^3.0.0: 2129 | version "3.0.3" 2130 | resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" 2131 | integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== 2132 | dependencies: 2133 | "@types/unist" "^2.0.0" 2134 | 2135 | unist-util-visit-parents@^4.0.0: 2136 | version "4.1.1" 2137 | resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz#e83559a4ad7e6048a46b1bdb22614f2f3f4724f2" 2138 | integrity sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw== 2139 | dependencies: 2140 | "@types/unist" "^2.0.0" 2141 | unist-util-is "^5.0.0" 2142 | 2143 | unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: 2144 | version "5.1.3" 2145 | resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" 2146 | integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== 2147 | dependencies: 2148 | "@types/unist" "^2.0.0" 2149 | unist-util-is "^5.0.0" 2150 | 2151 | unist-util-visit@^3.1.0: 2152 | version "3.1.0" 2153 | resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-3.1.0.tgz#9420d285e1aee938c7d9acbafc8e160186dbaf7b" 2154 | integrity sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA== 2155 | dependencies: 2156 | "@types/unist" "^2.0.0" 2157 | unist-util-is "^5.0.0" 2158 | unist-util-visit-parents "^4.0.0" 2159 | 2160 | unist-util-visit@^4.0.0, unist-util-visit@^4.1.1: 2161 | version "4.1.2" 2162 | resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" 2163 | integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== 2164 | dependencies: 2165 | "@types/unist" "^2.0.0" 2166 | unist-util-is "^5.0.0" 2167 | unist-util-visit-parents "^5.1.1" 2168 | 2169 | uvu@^0.5.0: 2170 | version "0.5.6" 2171 | resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" 2172 | integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== 2173 | dependencies: 2174 | dequal "^2.0.0" 2175 | diff "^5.0.0" 2176 | kleur "^4.0.3" 2177 | sade "^1.7.3" 2178 | 2179 | vfile-location@^4.0.0: 2180 | version "4.1.0" 2181 | resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" 2182 | integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== 2183 | dependencies: 2184 | "@types/unist" "^2.0.0" 2185 | vfile "^5.0.0" 2186 | 2187 | vfile-matter@^3.0.1: 2188 | version "3.0.1" 2189 | resolved "https://registry.yarnpkg.com/vfile-matter/-/vfile-matter-3.0.1.tgz#85e26088e43aa85c04d42ffa3693635fa2bc5624" 2190 | integrity sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg== 2191 | dependencies: 2192 | "@types/js-yaml" "^4.0.0" 2193 | is-buffer "^2.0.0" 2194 | js-yaml "^4.0.0" 2195 | 2196 | vfile-message@^3.0.0: 2197 | version "3.1.4" 2198 | resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" 2199 | integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== 2200 | dependencies: 2201 | "@types/unist" "^2.0.0" 2202 | unist-util-stringify-position "^3.0.0" 2203 | 2204 | vfile@^5.0.0, vfile@^5.3.0: 2205 | version "5.3.7" 2206 | resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" 2207 | integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== 2208 | dependencies: 2209 | "@types/unist" "^2.0.0" 2210 | is-buffer "^2.0.0" 2211 | unist-util-stringify-position "^3.0.0" 2212 | vfile-message "^3.0.0" 2213 | 2214 | vscode-oniguruma@^1.7.0: 2215 | version "1.7.0" 2216 | resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" 2217 | integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== 2218 | 2219 | vscode-textmate@^8.0.0: 2220 | version "8.0.0" 2221 | resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" 2222 | integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== 2223 | 2224 | web-namespaces@^2.0.0: 2225 | version "2.0.1" 2226 | resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" 2227 | integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== 2228 | 2229 | which@^1.2.9: 2230 | version "1.3.1" 2231 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 2232 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 2233 | dependencies: 2234 | isexe "^2.0.0" 2235 | 2236 | yallist@^2.1.2: 2237 | version "2.1.2" 2238 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2239 | integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== 2240 | 2241 | yocto-queue@^0.1.0: 2242 | version "0.1.0" 2243 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2244 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2245 | 2246 | zod@^3.20.2: 2247 | version "3.21.4" 2248 | resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" 2249 | integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== 2250 | 2251 | zwitch@^2.0.0: 2252 | version "2.0.4" 2253 | resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" 2254 | integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== 2255 | --------------------------------------------------------------------------------